@tripsnek/tmf
Version:
TypeScript Modeling Framework - A TypeScript port of the Eclipse Modeling Framework (EMF)
66 lines • 9.44 kB
JavaScript
import { EcoreParser } from '../ecore/ecoreparser.js';
import { TGeneratorMain } from './tgenerator-main.js';
import { Environment, safeDynamicImport } from '../utils/environment.js';
/**
* (1) Parses an ECore file.
* (2) Generates source code into destinationPath/src/lib
* (3) Generates barrel file (index.ts) into destinationPath/src
*
* If not specified, destinationPath will be that of the model file.
*
* @param ecorePath
* @param overwriteImpl
* @param destinationPath
*/
export async function generateFromEcore(ecorePath, overwriteImpl, destinationPath, attemptFormatWithPrettier) {
Environment.requireNodeEnvironment('File-based code generation');
// parse the package
const pkg = await new EcoreParser().parseAsync(ecorePath);
// auto-determine destination path from ecore location, if necessary
let destPath;
if (destinationPath) {
destPath = destinationPath;
}
else {
try {
const path = await safeDynamicImport('path');
destPath = path.dirname(ecorePath);
}
catch (error) {
throw new Error(`Path resolution failed: ${error.message}. This operation requires Node.js environment.`);
}
}
// generate the source
return generateFromEPackage(pkg, destPath, overwriteImpl, attemptFormatWithPrettier);
}
/**
* (1) Generates source code into destinationPath/src/lib
* (2) Generates barrel file (index.ts) into destinationPath/src
*
* @param pkg
* @param destPath
* @param overwriteImpl
*/
export async function generateFromEPackage(pkg, destPath, overwriteImpl, attemptInvokePrettier) {
Environment.requireNodeEnvironment('Code generation');
try {
const path = await safeDynamicImport('path');
const srcPath = path.resolve(destPath + '/src');
console.log('running TGeneratorMain, output to ' + srcPath);
new TGeneratorMain(pkg, path.resolve(destPath + '/src'), overwriteImpl, path.resolve(destPath + '/src')).generate(attemptInvokePrettier);
return srcPath;
}
catch (error) {
throw new Error(`Path resolution failed: ${error.message}. This operation requires Node.js environment.`);
}
}
/**
* Generates TypeScript code from an Ecore file with configurable options.
*
* @param ecorePath Path to the .ecore file
* @param options Optional generation options
*/
export async function genmodel(ecorePath, options) {
return generateFromEcore(ecorePath, options?.overwriteImpl, options?.destinationPath, options?.attemptFormatWithPrettier);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWxnZW51dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvc291cmNlLWdlbmVyYXRvcnMvbW9kZWxnZW51dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFdEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxXQUFXLEVBQXNCLGlCQUFpQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFRN0Y7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsaUJBQWlCLENBQ3JDLFNBQWlCLEVBQ2pCLGFBQXVCLEVBQ3ZCLGVBQXdCLEVBQ3hCLHlCQUFtQztJQUVuQyxXQUFXLENBQUMsc0JBQXNCLENBQUMsNEJBQTRCLENBQUMsQ0FBQztJQUVqRSxvQkFBb0I7SUFDcEIsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLFdBQVcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUUxRCxvRUFBb0U7SUFDcEUsSUFBSSxRQUFnQixDQUFDO0lBQ3JCLElBQUksZUFBZSxFQUFFLENBQUM7UUFDcEIsUUFBUSxHQUFHLGVBQWUsQ0FBQztJQUM3QixDQUFDO1NBQU0sQ0FBQztRQUNOLElBQUksQ0FBQztZQUNILE1BQU0sSUFBSSxHQUFHLE1BQU0saUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDN0MsUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDckMsQ0FBQztRQUFDLE9BQU8sS0FBVSxFQUFFLENBQUM7WUFDcEIsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsS0FBSyxDQUFDLE9BQU8sZ0RBQWdELENBQUMsQ0FBQztRQUM1RyxDQUFDO0lBQ0gsQ0FBQztJQUVELHNCQUFzQjtJQUN0QixPQUFPLG9CQUFvQixDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLHlCQUF5QixDQUFDLENBQUM7QUFDdkYsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLG9CQUFvQixDQUN4QyxHQUFhLEVBQ2IsUUFBZ0IsRUFDaEIsYUFBdUIsRUFDdkIscUJBQStCO0lBRS9CLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBRXRELElBQUksQ0FBQztRQUNILE1BQU0sSUFBSSxHQUFHLE1BQU0saUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0MsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLENBQUM7UUFDaEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQ0FBb0MsR0FBRyxPQUFPLENBQUMsQ0FBQztRQUM1RCxJQUFJLGNBQWMsQ0FDaEIsR0FBRyxFQUNILElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxFQUMvQixhQUFhLEVBQ2IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLENBQ2hDLENBQUMsUUFBUSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDbEMsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUFDLE9BQU8sS0FBVSxFQUFFLENBQUM7UUFDcEIsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsS0FBSyxDQUFDLE9BQU8sZ0RBQWdELENBQUMsQ0FBQztJQUM1RyxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxRQUFRLENBQUMsU0FBaUIsRUFBRSxPQUFvQjtJQUNwRSxPQUFPLGlCQUFpQixDQUN0QixTQUFTLEVBQ1QsT0FBTyxFQUFFLGFBQWEsRUFDdEIsT0FBTyxFQUFFLGVBQWUsRUFDeEIsT0FBTyxFQUFFLHlCQUF5QixDQUNuQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVjb3JlUGFyc2VyIH0gZnJvbSAnLi4vZWNvcmUvZWNvcmVwYXJzZXIuanMnO1xyXG5pbXBvcnQgeyBFUGFja2FnZSB9IGZyb20gJy4uL21ldGFtb2RlbC9hcGkvZXBhY2thZ2UuanMnO1xyXG5pbXBvcnQgeyBUR2VuZXJhdG9yTWFpbiB9IGZyb20gJy4vdGdlbmVyYXRvci1tYWluLmpzJztcclxuaW1wb3J0IHsgRW52aXJvbm1lbnQsIENvbmRpdGlvbmFsSW1wb3J0cywgc2FmZUR5bmFtaWNJbXBvcnQgfSBmcm9tICcuLi91dGlscy9lbnZpcm9ubWVudC5qcyc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEdlbk9wdGlvbnMge1xyXG4gIG92ZXJ3cml0ZUltcGw/OiBib29sZWFuOyAgICAgICAgICAgICAgLy93aGV0aGVyIHRvIG92ZXJ3cml0ZSAqLmltcGwgZmlsZXNcclxuICBkZXN0aW5hdGlvblBhdGg/OiBzdHJpbmc7ICAgICAgICAgICAgIC8vd2hlcmUgdG8gZ2VuZXJhdGUgdGhlIHNyYy8gZGlyZWN0b3J5XHJcbiAgYXR0ZW1wdEZvcm1hdFdpdGhQcmV0dGllcj86IGJvb2xlYW47ICAvL3doZXRoZXIgdG8gYXR0ZW1wdCB0byBpbnZva2UgcHJldHRpZXIgZm9ybWF0dGluZ1xyXG59XHJcblxyXG4vKipcclxuICogKDEpIFBhcnNlcyBhbiBFQ29yZSBmaWxlLlxyXG4gKiAoMikgR2VuZXJhdGVzIHNvdXJjZSBjb2RlIGludG8gZGVzdGluYXRpb25QYXRoL3NyYy9saWJcclxuICogKDMpIEdlbmVyYXRlcyBiYXJyZWwgZmlsZSAoaW5kZXgudHMpIGludG8gZGVzdGluYXRpb25QYXRoL3NyY1xyXG4gKlxyXG4gKiBJZiBub3Qgc3BlY2lmaWVkLCBkZXN0aW5hdGlvblBhdGggd2lsbCBiZSB0aGF0IG9mIHRoZSBtb2RlbCBmaWxlLlxyXG4gKlxyXG4gKiBAcGFyYW0gZWNvcmVQYXRoXHJcbiAqIEBwYXJhbSBvdmVyd3JpdGVJbXBsXHJcbiAqIEBwYXJhbSBkZXN0aW5hdGlvblBhdGhcclxuICovXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUZyb21FY29yZShcclxuICBlY29yZVBhdGg6IHN0cmluZyxcclxuICBvdmVyd3JpdGVJbXBsPzogYm9vbGVhbixcclxuICBkZXN0aW5hdGlvblBhdGg/OiBzdHJpbmcsXHJcbiAgYXR0ZW1wdEZvcm1hdFdpdGhQcmV0dGllcj86IGJvb2xlYW5cclxuKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICBFbnZpcm9ubWVudC5yZXF1aXJlTm9kZUVudmlyb25tZW50KCdGaWxlLWJhc2VkIGNvZGUgZ2VuZXJhdGlvbicpO1xyXG5cclxuICAvLyBwYXJzZSB0aGUgcGFja2FnZVxyXG4gIGNvbnN0IHBrZyA9IGF3YWl0IG5ldyBFY29yZVBhcnNlcigpLnBhcnNlQXN5bmMoZWNvcmVQYXRoKTtcclxuXHJcbiAgLy8gYXV0by1kZXRlcm1pbmUgZGVzdGluYXRpb24gcGF0aCBmcm9tIGVjb3JlIGxvY2F0aW9uLCBpZiBuZWNlc3NhcnlcclxuICBsZXQgZGVzdFBhdGg6IHN0cmluZztcclxuICBpZiAoZGVzdGluYXRpb25QYXRoKSB7XHJcbiAgICBkZXN0UGF0aCA9IGRlc3RpbmF0aW9uUGF0aDtcclxuICB9IGVsc2Uge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcGF0aCA9IGF3YWl0IHNhZmVEeW5hbWljSW1wb3J0KCdwYXRoJyk7XHJcbiAgICAgIGRlc3RQYXRoID0gcGF0aC5kaXJuYW1lKGVjb3JlUGF0aCk7XHJcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUGF0aCByZXNvbHV0aW9uIGZhaWxlZDogJHtlcnJvci5tZXNzYWdlfS4gVGhpcyBvcGVyYXRpb24gcmVxdWlyZXMgTm9kZS5qcyBlbnZpcm9ubWVudC5gKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIGdlbmVyYXRlIHRoZSBzb3VyY2VcclxuICByZXR1cm4gZ2VuZXJhdGVGcm9tRVBhY2thZ2UocGtnLCBkZXN0UGF0aCwgb3ZlcndyaXRlSW1wbCwgYXR0ZW1wdEZvcm1hdFdpdGhQcmV0dGllcik7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiAoMSkgR2VuZXJhdGVzIHNvdXJjZSBjb2RlIGludG8gZGVzdGluYXRpb25QYXRoL3NyYy9saWJcclxuICogKDIpIEdlbmVyYXRlcyBiYXJyZWwgZmlsZSAoaW5kZXgudHMpIGludG8gZGVzdGluYXRpb25QYXRoL3NyY1xyXG4gKlxyXG4gKiBAcGFyYW0gcGtnXHJcbiAqIEBwYXJhbSBkZXN0UGF0aFxyXG4gKiBAcGFyYW0gb3ZlcndyaXRlSW1wbFxyXG4gKi9cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRnJvbUVQYWNrYWdlKFxyXG4gIHBrZzogRVBhY2thZ2UsXHJcbiAgZGVzdFBhdGg6IHN0cmluZyxcclxuICBvdmVyd3JpdGVJbXBsPzogYm9vbGVhbixcclxuICBhdHRlbXB0SW52b2tlUHJldHRpZXI/OiBib29sZWFuXHJcbik6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgRW52aXJvbm1lbnQucmVxdWlyZU5vZGVFbnZpcm9ubWVudCgnQ29kZSBnZW5lcmF0aW9uJyk7XHJcblxyXG4gIHRyeSB7XHJcbiAgICBjb25zdCBwYXRoID0gYXdhaXQgc2FmZUR5bmFtaWNJbXBvcnQoJ3BhdGgnKTtcclxuICAgIGNvbnN0IHNyY1BhdGggPSBwYXRoLnJlc29sdmUoZGVzdFBhdGggKyAnL3NyYycpO1xyXG4gICAgY29uc29sZS5sb2coJ3J1bm5pbmcgVEdlbmVyYXRvck1haW4sIG91dHB1dCB0byAnICsgc3JjUGF0aCk7XHJcbiAgICBuZXcgVEdlbmVyYXRvck1haW4oXHJcbiAgICAgIHBrZyxcclxuICAgICAgcGF0aC5yZXNvbHZlKGRlc3RQYXRoICsgJy9zcmMnKSxcclxuICAgICAgb3ZlcndyaXRlSW1wbCxcclxuICAgICAgcGF0aC5yZXNvbHZlKGRlc3RQYXRoICsgJy9zcmMnKVxyXG4gICAgKS5nZW5lcmF0ZShhdHRlbXB0SW52b2tlUHJldHRpZXIpO1xyXG4gICAgcmV0dXJuIHNyY1BhdGg7XHJcbiAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKGBQYXRoIHJlc29sdXRpb24gZmFpbGVkOiAke2Vycm9yLm1lc3NhZ2V9LiBUaGlzIG9wZXJhdGlvbiByZXF1aXJlcyBOb2RlLmpzIGVudmlyb25tZW50LmApO1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEdlbmVyYXRlcyBUeXBlU2NyaXB0IGNvZGUgZnJvbSBhbiBFY29yZSBmaWxlIHdpdGggY29uZmlndXJhYmxlIG9wdGlvbnMuXHJcbiAqIFxyXG4gKiBAcGFyYW0gZWNvcmVQYXRoIFBhdGggdG8gdGhlIC5lY29yZSBmaWxlXHJcbiAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbmFsIGdlbmVyYXRpb24gb3B0aW9uc1xyXG4gKi9cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbm1vZGVsKGVjb3JlUGF0aDogc3RyaW5nLCBvcHRpb25zPzogR2VuT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgcmV0dXJuIGdlbmVyYXRlRnJvbUVjb3JlKFxyXG4gICAgZWNvcmVQYXRoLFxyXG4gICAgb3B0aW9ucz8ub3ZlcndyaXRlSW1wbCxcclxuICAgIG9wdGlvbnM/LmRlc3RpbmF0aW9uUGF0aCxcclxuICAgIG9wdGlvbnM/LmF0dGVtcHRGb3JtYXRXaXRoUHJldHRpZXJcclxuICApO1xyXG59Il19