@specs-feup/lara
Version:
A js port of the popular framework for building source-to-source compilers
128 lines (110 loc) • 3.31 kB
JavaScript
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);