UNPKG

@tripsnek/tmf

Version:

TypeScript Modeling Framework - A TypeScript port of the Eclipse Modeling Framework (EMF)

94 lines 11 kB
import { EcoreStringParser } from "./ecore-string-parser.js"; import { Environment, safeDynamicImport } from '../utils/environment.js'; import { parseString, parseStringSync } from "./xml-to-js-parser.js"; /** * Parses an XML Ecore file into a TMF metamodel. */ export class EcoreParser { stringParser = new EcoreStringParser(); /** * Async version of parse for better error handling */ async parseAsync(ecoreFilePath) { const ecoreXml = await this.fileToXmlStringAsync(ecoreFilePath); return this.parseFromXmlStringAsync(ecoreXml); } async fileToXmlStringAsync(ecoreFilePath) { Environment.requireNodeEnvironment('File parsing'); try { const fs = await safeDynamicImport('fs'); const path = await safeDynamicImport('path'); const message = "Parsing " + ecoreFilePath + " from filesystem"; // console.log(message); return fs.readFileSync(path.resolve(ecoreFilePath), "utf8"); } catch (error) { throw new Error(`File system access failed: ${error.message}. This operation requires Node.js environment.`); } } /** * Parses an Ecore XML string into a TMF metamodel. * @param ecoreXml The XML string to parse * @returns The root EPackage containing the parsed metamodel */ parseFromXmlString(ecoreXml) { const ecoreJs = this.xmlToJs(ecoreXml); return this.stringParser.parseFromJs(ecoreJs); } /** * Async version of parseFromXmlString */ async parseFromXmlStringAsync(ecoreXml) { const ecoreJs = await this.xmlToJsAsync(ecoreXml); return this.stringParser.parseFromJs(ecoreJs); } xmlToJs(ecoreXml) { // Use our new synchronous parser for both Node.js and browser try { return parseStringSync(ecoreXml); } catch (error) { console.log("ERROR ON PARSE"); console.log(error); throw error; } } async xmlToJsAsync(ecoreXml) { // Use our new asynchronous parser for both Node.js and browser try { return await parseString(ecoreXml); } catch (error) { console.log("ERROR ON PARSE"); console.log(error); throw error; } } /** * Check if file-based parsing is supported */ static isFileParsingSupported() { return Environment.isNode; } /** * Check if XML string parsing is supported */ static isXmlParsingSupported() { // Our parser works in both Node.js and browser environments return true; } /** * Get supported operations in current environment */ static getSupportedOperations() { const operations = []; if (this.isXmlParsingSupported()) { operations.push('parseFromXmlString', 'parseFromXmlStringAsync'); } if (this.isFileParsingSupported()) { operations.push('parse', 'parseAsync', 'fileToXmlString', 'fileToXmlStringAsync'); } return operations; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNvcmVwYXJzZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2Vjb3JlL2Vjb3JlcGFyc2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzdELE9BQU8sRUFBRSxXQUFXLEVBQXNCLGlCQUFpQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDN0YsT0FBTyxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVyRTs7R0FFRztBQUNILE1BQU0sT0FBTyxXQUFXO0lBQ2QsWUFBWSxHQUFHLElBQUksaUJBQWlCLEVBQUUsQ0FBQztJQUUvQzs7T0FFRztJQUNJLEtBQUssQ0FBQyxVQUFVLENBQUMsYUFBcUI7UUFDM0MsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDaEUsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVNLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxhQUFxQjtRQUNyRCxXQUFXLENBQUMsc0JBQXNCLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFbkQsSUFBSSxDQUFDO1lBQ0gsTUFBTSxFQUFFLEdBQUcsTUFBTSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN6QyxNQUFNLElBQUksR0FBRyxNQUFNLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRTdDLE1BQU0sT0FBTyxHQUFHLFVBQVUsR0FBRyxhQUFhLEdBQUcsa0JBQWtCLENBQUM7WUFDaEUsd0JBQXdCO1lBQ3hCLE9BQU8sRUFBRSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzlELENBQUM7UUFBQyxPQUFPLEtBQVUsRUFBRSxDQUFDO1lBQ3BCLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLEtBQUssQ0FBQyxPQUFPLGdEQUFnRCxDQUFDLENBQUM7UUFDL0csQ0FBQztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksa0JBQWtCLENBQUMsUUFBZ0I7UUFDeEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN2QyxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxRQUFnQjtRQUNuRCxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbEQsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRU0sT0FBTyxDQUFDLFFBQWdCO1FBQzdCLDhEQUE4RDtRQUM5RCxJQUFJLENBQUM7WUFDSCxPQUFPLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNuQyxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUM5QixPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ25CLE1BQU0sS0FBSyxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFFTSxLQUFLLENBQUMsWUFBWSxDQUFDLFFBQWdCO1FBQ3hDLCtEQUErRDtRQUMvRCxJQUFJLENBQUM7WUFDSCxPQUFPLE1BQU0sV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3JDLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQzlCLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbkIsTUFBTSxLQUFLLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ksTUFBTSxDQUFDLHNCQUFzQjtRQUNsQyxPQUFPLFdBQVcsQ0FBQyxNQUFNLENBQUM7SUFDNUIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksTUFBTSxDQUFDLHFCQUFxQjtRQUNqQyw0REFBNEQ7UUFDNUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxNQUFNLENBQUMsc0JBQXNCO1FBQ2xDLE1BQU0sVUFBVSxHQUFhLEVBQUUsQ0FBQztRQUVoQyxJQUFJLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxFQUFFLENBQUM7WUFDakMsVUFBVSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSx5QkFBeUIsQ0FBQyxDQUFDO1FBQ25FLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxFQUFFLENBQUM7WUFDbEMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFLGlCQUFpQixFQUFFLHNCQUFzQixDQUFDLENBQUM7UUFDcEYsQ0FBQztRQUVELE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIGVjb3JlcGFyc2VyLXNhZmUudHNcclxuaW1wb3J0IHsgRVBhY2thZ2UgfSBmcm9tIFwiLi4vbWV0YW1vZGVsL2FwaS9lcGFja2FnZVwiO1xyXG5pbXBvcnQgeyBFY29yZVN0cmluZ1BhcnNlciB9IGZyb20gXCIuL2Vjb3JlLXN0cmluZy1wYXJzZXIuanNcIjtcclxuaW1wb3J0IHsgRW52aXJvbm1lbnQsIENvbmRpdGlvbmFsSW1wb3J0cywgc2FmZUR5bmFtaWNJbXBvcnQgfSBmcm9tICcuLi91dGlscy9lbnZpcm9ubWVudC5qcyc7XHJcbmltcG9ydCB7IHBhcnNlU3RyaW5nLCBwYXJzZVN0cmluZ1N5bmMgfSBmcm9tIFwiLi94bWwtdG8tanMtcGFyc2VyLmpzXCI7XHJcblxyXG4vKipcclxuICogUGFyc2VzIGFuIFhNTCBFY29yZSBmaWxlIGludG8gYSBUTUYgbWV0YW1vZGVsLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEVjb3JlUGFyc2VyIHtcclxuICBwcml2YXRlIHN0cmluZ1BhcnNlciA9IG5ldyBFY29yZVN0cmluZ1BhcnNlcigpO1xyXG5cclxuICAvKipcclxuICAgKiBBc3luYyB2ZXJzaW9uIG9mIHBhcnNlIGZvciBiZXR0ZXIgZXJyb3IgaGFuZGxpbmdcclxuICAgKi9cclxuICBwdWJsaWMgYXN5bmMgcGFyc2VBc3luYyhlY29yZUZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPEVQYWNrYWdlPiB7XHJcbiAgICBjb25zdCBlY29yZVhtbCA9IGF3YWl0IHRoaXMuZmlsZVRvWG1sU3RyaW5nQXN5bmMoZWNvcmVGaWxlUGF0aCk7XHJcbiAgICByZXR1cm4gdGhpcy5wYXJzZUZyb21YbWxTdHJpbmdBc3luYyhlY29yZVhtbCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZmlsZVRvWG1sU3RyaW5nQXN5bmMoZWNvcmVGaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIEVudmlyb25tZW50LnJlcXVpcmVOb2RlRW52aXJvbm1lbnQoJ0ZpbGUgcGFyc2luZycpO1xyXG4gICAgXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBmcyA9IGF3YWl0IHNhZmVEeW5hbWljSW1wb3J0KCdmcycpO1xyXG4gICAgICBjb25zdCBwYXRoID0gYXdhaXQgc2FmZUR5bmFtaWNJbXBvcnQoJ3BhdGgnKTtcclxuICAgICAgXHJcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBcIlBhcnNpbmcgXCIgKyBlY29yZUZpbGVQYXRoICsgXCIgZnJvbSBmaWxlc3lzdGVtXCI7XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKG1lc3NhZ2UpO1xyXG4gICAgICByZXR1cm4gZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShlY29yZUZpbGVQYXRoKSwgXCJ1dGY4XCIpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgc3lzdGVtIGFjY2VzcyBmYWlsZWQ6ICR7ZXJyb3IubWVzc2FnZX0uIFRoaXMgb3BlcmF0aW9uIHJlcXVpcmVzIE5vZGUuanMgZW52aXJvbm1lbnQuYCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQYXJzZXMgYW4gRWNvcmUgWE1MIHN0cmluZyBpbnRvIGEgVE1GIG1ldGFtb2RlbC5cclxuICAgKiBAcGFyYW0gZWNvcmVYbWwgVGhlIFhNTCBzdHJpbmcgdG8gcGFyc2VcclxuICAgKiBAcmV0dXJucyBUaGUgcm9vdCBFUGFja2FnZSBjb250YWluaW5nIHRoZSBwYXJzZWQgbWV0YW1vZGVsXHJcbiAgICovXHJcbiAgcHVibGljIHBhcnNlRnJvbVhtbFN0cmluZyhlY29yZVhtbDogc3RyaW5nKTogRVBhY2thZ2Uge1xyXG4gICAgY29uc3QgZWNvcmVKcyA9IHRoaXMueG1sVG9KcyhlY29yZVhtbCk7XHJcbiAgICByZXR1cm4gdGhpcy5zdHJpbmdQYXJzZXIucGFyc2VGcm9tSnMoZWNvcmVKcyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBc3luYyB2ZXJzaW9uIG9mIHBhcnNlRnJvbVhtbFN0cmluZ1xyXG4gICAqL1xyXG4gIHB1YmxpYyBhc3luYyBwYXJzZUZyb21YbWxTdHJpbmdBc3luYyhlY29yZVhtbDogc3RyaW5nKTogUHJvbWlzZTxFUGFja2FnZT4ge1xyXG4gICAgY29uc3QgZWNvcmVKcyA9IGF3YWl0IHRoaXMueG1sVG9Kc0FzeW5jKGVjb3JlWG1sKTtcclxuICAgIHJldHVybiB0aGlzLnN0cmluZ1BhcnNlci5wYXJzZUZyb21KcyhlY29yZUpzKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB4bWxUb0pzKGVjb3JlWG1sOiBzdHJpbmcpOiBhbnkge1xyXG4gICAgLy8gVXNlIG91ciBuZXcgc3luY2hyb25vdXMgcGFyc2VyIGZvciBib3RoIE5vZGUuanMgYW5kIGJyb3dzZXJcclxuICAgIHRyeSB7XHJcbiAgICAgIHJldHVybiBwYXJzZVN0cmluZ1N5bmMoZWNvcmVYbWwpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5sb2coXCJFUlJPUiBPTiBQQVJTRVwiKTtcclxuICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICB0aHJvdyBlcnJvcjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyB4bWxUb0pzQXN5bmMoZWNvcmVYbWw6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XHJcbiAgICAvLyBVc2Ugb3VyIG5ldyBhc3luY2hyb25vdXMgcGFyc2VyIGZvciBib3RoIE5vZGUuanMgYW5kIGJyb3dzZXJcclxuICAgIHRyeSB7XHJcbiAgICAgIHJldHVybiBhd2FpdCBwYXJzZVN0cmluZyhlY29yZVhtbCk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmxvZyhcIkVSUk9SIE9OIFBBUlNFXCIpO1xyXG4gICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgIHRocm93IGVycm9yO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2hlY2sgaWYgZmlsZS1iYXNlZCBwYXJzaW5nIGlzIHN1cHBvcnRlZFxyXG4gICAqL1xyXG4gIHB1YmxpYyBzdGF0aWMgaXNGaWxlUGFyc2luZ1N1cHBvcnRlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBFbnZpcm9ubWVudC5pc05vZGU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDaGVjayBpZiBYTUwgc3RyaW5nIHBhcnNpbmcgaXMgc3VwcG9ydGVkXHJcbiAgICovXHJcbiAgcHVibGljIHN0YXRpYyBpc1htbFBhcnNpbmdTdXBwb3J0ZWQoKTogYm9vbGVhbiB7XHJcbiAgICAvLyBPdXIgcGFyc2VyIHdvcmtzIGluIGJvdGggTm9kZS5qcyBhbmQgYnJvd3NlciBlbnZpcm9ubWVudHNcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHN1cHBvcnRlZCBvcGVyYXRpb25zIGluIGN1cnJlbnQgZW52aXJvbm1lbnRcclxuICAgKi9cclxuICBwdWJsaWMgc3RhdGljIGdldFN1cHBvcnRlZE9wZXJhdGlvbnMoKTogc3RyaW5nW10ge1xyXG4gICAgY29uc3Qgb3BlcmF0aW9uczogc3RyaW5nW10gPSBbXTtcclxuICAgIFxyXG4gICAgaWYgKHRoaXMuaXNYbWxQYXJzaW5nU3VwcG9ydGVkKCkpIHtcclxuICAgICAgb3BlcmF0aW9ucy5wdXNoKCdwYXJzZUZyb21YbWxTdHJpbmcnLCAncGFyc2VGcm9tWG1sU3RyaW5nQXN5bmMnKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgaWYgKHRoaXMuaXNGaWxlUGFyc2luZ1N1cHBvcnRlZCgpKSB7XHJcbiAgICAgIG9wZXJhdGlvbnMucHVzaCgncGFyc2UnLCAncGFyc2VBc3luYycsICdmaWxlVG9YbWxTdHJpbmcnLCAnZmlsZVRvWG1sU3RyaW5nQXN5bmMnKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgcmV0dXJuIG9wZXJhdGlvbnM7XHJcbiAgfVxyXG59Il19