@tripsnek/tmf
Version:
TypeScript Modeling Framework - A TypeScript port of the Eclipse Modeling Framework (EMF)
98 lines • 3.43 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.EcoreParser = void 0;
const ecore_string_parser_1 = require("./ecore-string-parser");
const environment_1 = require("../utils/environment");
const xml_to_js_parser_1 = require("./xml-to-js-parser");
/**
* Parses an XML Ecore file into a TMF metamodel.
*/
class EcoreParser {
stringParser = new ecore_string_parser_1.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_1.Environment.requireNodeEnvironment('File parsing');
try {
const fs = await (0, environment_1.safeDynamicImport)('fs');
const path = await (0, environment_1.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 (0, xml_to_js_parser_1.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 (0, xml_to_js_parser_1.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_1.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;
}
}
exports.EcoreParser = EcoreParser;
//# sourceMappingURL=ecoreparser.js.map