import { args, type Args } from '@/args'; import { join } from 'path'; import { watch } from 'fs/promises'; import { generateParser, GRAMMAR_FILE, GENERATED_PARSER } from '@/parser'; import { ConsoleTracingLogger } from '@/utils'; const devMode = async (logger: ConsoleTracingLogger) => { logger.info('Watching for changes in parser...'); const watcher = watch(import.meta.dir, { recursive: true }); for await (const event of watcher) { if (event.filename?.endsWith(GRAMMAR_FILE)) { const grammarFile = join(import.meta.dir, event.filename); const outputFile = join( import.meta.dir, event.filename.replace(GRAMMAR_FILE, GENERATED_PARSER), ); logger.info( `Generating parser at Location=(${grammarFile}) to Source=(${outputFile})...`, ); generateParser(grammarFile, outputFile); } } }; export const main = async (args: Args) => { const logger = new ConsoleTracingLogger('main'); if (args.devMode) { logger.info('Starting in dev mode...'); await devMode(logger.createChild('devMode')); } }; main(args);