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