@tripsnek/tmf
Version:
TypeScript Modeling Framework - A TypeScript port of the Eclipse Modeling Framework (EMF)
94 lines • 11 kB
JavaScript
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