JSTQL-JS-Transform/JSTQL/src/cli/main.ts

42 lines
1.8 KiB
TypeScript

import type { Model } from '../language/generated/ast.js';
import chalk from 'chalk';
import { Command } from 'commander';
import { JstqlLanguageMetaData } from '../language/generated/module.js';
import { createJstqlServices } from '../language/jstql-module.js';
import { extractAstNode } from './cli-util.js';
import { generateJavaScript } from './generator.js';
import { NodeFileSystem } from 'langium/node';
import * as url from 'node:url';
import * as fs from 'node:fs/promises';
import * as path from 'node:path';
const __dirname = url.fileURLToPath(new URL('.', import.meta.url));
const packagePath = path.resolve(__dirname, '..', '..', 'package.json');
const packageContent = await fs.readFile(packagePath, 'utf-8');
export const generateAction = async (fileName: string, opts: GenerateOptions): Promise<void> => {
const services = createJstqlServices(NodeFileSystem).Jstql;
const model = await extractAstNode<Model>(fileName, services);
const generatedFilePath = generateJavaScript(model, fileName, opts.destination);
console.log(chalk.green(`JavaScript code generated successfully: ${generatedFilePath}`));
};
export type GenerateOptions = {
destination?: string;
}
export default function(): void {
const program = new Command();
program.version(JSON.parse(packageContent).version);
const fileExtensions = JstqlLanguageMetaData.fileExtensions.join(', ');
program
.command('generate')
.argument('<file>', `source file (possible file extensions: ${fileExtensions})`)
.option('-d, --destination <dir>', 'destination directory of generating')
.description('generates JavaScript code that prints "Hello, {name}!" for each greeting in a source file')
.action(generateAction);
program.parse(process.argv);
}