UNPKG

@specs-feup/lara

Version:

A js port of the popular framework for building source-to-source compilers

128 lines (110 loc) 3.31 kB
#!/usr/bin/env node import fs from "fs"; import yargs from "yargs"; import { hideBin } from "yargs/helpers"; import { convertSpecification } from "./convert-joinpoint-specification.js"; import { generateJoinpoints, generateEnums } from "./generate-ts-joinpoints.js"; async function buildInterfaces( inputFileName, laraJoinPointSpecificationImportPath, outputFileName ) { console.log("Hello from build-interfaces.js"); console.log("inputFile:", inputFileName); console.log( "LaraJoinPointSpecificationFile: ", laraJoinPointSpecificationImportPath ); console.log("outputFile:", outputFileName); const { default: laraJsonSpecification } = await import( laraJoinPointSpecificationImportPath, { assert: { type: "json", }, } ); const jsonSpecification = fs.readFileSync(inputFileName, "utf8"); const laraSpecification = convertSpecification( laraJsonSpecification, undefined ); const specification = convertSpecification( JSON.parse(jsonSpecification), laraSpecification ); // Create output file if it doesn't exist const outputFile = fs.openSync(outputFileName, "w"); fs.writeSync( outputFile, `/////////////////////////////////////////////////// // This file is generated by build-interfaces.js // /////////////////////////////////////////////////// import { LaraJoinPoint, registerJoinpointMapper, wrapJoinPoint, unwrapJoinPoint, } from "@specs-feup/lara/api/LaraJoinPoint.js";\n\n` ); generateDefaultAttributeMappers(specification.joinpoints, outputFile); generateJoinpoints(specification.joinpoints, outputFile); generateEnums(specification.enums, outputFile); generateJoinpointMappers( specification.joinpoints, specification.enums, outputFile ); fs.closeSync(outputFile); } function generateJoinpointMappers(joinpoints, enums, outputFile) { fs.writeSync(outputFile, `const JoinpointMapper = {\n`); for (const jp of joinpoints) { fs.writeSync(outputFile, ` ${jp.originalName}: ${jp.name},\n`); } fs.writeSync(outputFile, `};\n`); fs.writeSync( outputFile, `\nlet registered = false; if (!registered) { registerJoinpointMapper(JoinpointMapper); registered = true; }\n\n` ); } function generateDefaultAttributeMappers(joinpoints, outputFile) { fs.writeSync(outputFile, `type PrivateMapper = {\n`); for (const jp of joinpoints) { fs.writeSync(outputFile, ` "${jp.name}": typeof ${jp.name},\n`); } fs.writeSync(outputFile, `};\n\n`); fs.writeSync(outputFile, `type DefaultAttributeMap = {\n`); for (const jp of joinpoints) { if (jp.defaultAttribute) { fs.writeSync(outputFile, ` ${jp.name}: "${jp.defaultAttribute}",\n`); } } fs.writeSync(outputFile, `}\n\n`); } const args = yargs(hideBin(process.argv)) .scriptName("lara-build-interfaces") .option("i", { alias: "input", describe: "Path to JSON config file", type: "string", }) .option("l", { alias: "lara", describe: "Path to JSON config file that describes LaraJoinPoint", type: "string", }) .option("o", { alias: "output", describe: "Path to the output file", type: "string", }) .help() .showHelpOnFail(true) .strict() .parse(); await buildInterfaces(args.input, args.lara, args.output);