UNPKG

@tripsnek/tmf

Version:

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

94 lines 3.18 kB
import { EcoreStringParser } from "./ecore-string-parser"; import { Environment, safeDynamicImport } from '../utils/environment'; import { parseString, parseStringSync } from "./xml-to-js-parser"; /** * 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=ecoreparser.js.map