@tripsnek/tmf
Version:
TypeScript Modeling Framework - A TypeScript port of the Eclipse Modeling Framework (EMF)
111 lines • 13.1 kB
JavaScript
import { EcoreStringWriter } from './ecore-string-writer.js';
import { Environment, safeDynamicImport } from '../utils/environment.js';
/**
* Writes an EPackage metamodel to an XML Ecore file.
*/
export class EcoreWriter {
stringWriter = new EcoreStringWriter();
/**
* Converts an EPackage to Ecore XML string format.
* @param ePackage The root package to serialize
* @returns The XML string representation
*/
writeToString(ePackage) {
return this.stringWriter.writeToString(ePackage);
}
/**
* Writes an EPackage to an Ecore XML file.
* @param ePackage The root package to serialize
* @param filePath The path where the .ecore file will be written
* @deprecated Use writeToFileAsync instead for bundle-safe operation
*/
async writeToFile(ePackage, filePath) {
return this.writeToFileAsync(ePackage, filePath);
}
/**
* Async version of writeToFile for better error handling
*/
async writeToFileAsync(ePackage, filePath) {
Environment.requireNodeEnvironment('File writing');
const xmlContent = this.writeToString(ePackage);
try {
const fs = await safeDynamicImport('fs');
const path = await safeDynamicImport('path');
fs.writeFileSync(path.resolve(filePath), xmlContent, 'utf8');
}
catch (error) {
throw new Error(`File system access failed: ${error.message}. This operation requires Node.js environment.`);
}
}
/**
* Browser-compatible file saving via download
* @param ePackage The root package to serialize
* @param filename The filename for download
*/
saveAsDownload(ePackage, filename) {
if (!Environment.isBrowser) {
throw new Error('Download functionality only available in browser environment');
}
// try {
// const xmlContent = this.writeToString(ePackage);
// const blob = new Blob([xmlContent], { type: 'application/xml' });
// const url = URL.createObjectURL(blob);
// // Create temporary download link
// const a = document.createElement('a');
// a.href = url;
// a.download = filename.endsWith('.ecore') ? filename : `${filename}.ecore`;
// document.body.appendChild(a);
// a.click();
// document.body.removeChild(a);
// URL.revokeObjectURL(url);
// } catch (error) {
// throw new Error(`Browser download failed: ${(error as Error).message}`);
// }
}
/**
* Universal save method - chooses appropriate strategy based on environment
*/
async save(ePackage, pathOrFilename) {
if (Environment.isNode) {
await this.writeToFileAsync(ePackage, pathOrFilename);
}
else if (Environment.isBrowser) {
this.saveAsDownload(ePackage, pathOrFilename);
}
else {
throw new Error('File saving not supported in this environment');
}
}
/**
* Universal async save method
*/
async saveAsync(ePackage, pathOrFilename) {
return this.save(ePackage, pathOrFilename);
}
/**
* Check if file writing is supported in current environment
*/
static isFileWritingSupported() {
return Environment.isNode;
}
/**
* Check if download saving is supported in current environment
*/
static isDownloadSupported() {
return Environment.isBrowser;
}
/**
* Get supported operations in current environment
*/
static getSupportedOperations() {
const operations = ['writeToString'];
if (this.isFileWritingSupported()) {
operations.push('writeToFile', 'writeToFileAsync', 'save', 'saveAsync');
}
if (this.isDownloadSupported()) {
operations.push('saveAsDownload', 'save', 'saveAsync');
}
return operations;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNvcmV3cml0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2Vjb3JlL2Vjb3Jld3JpdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzdELE9BQU8sRUFBRSxXQUFXLEVBQXNCLGlCQUFpQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFN0Y7O0dBRUc7QUFDSCxNQUFNLE9BQU8sV0FBVztJQUNkLFlBQVksR0FBRyxJQUFJLGlCQUFpQixFQUFFLENBQUM7SUFFL0M7Ozs7T0FJRztJQUNJLGFBQWEsQ0FBQyxRQUFrQjtRQUNyQyxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLEtBQUssQ0FBQyxXQUFXLENBQUMsUUFBa0IsRUFBRSxRQUFnQjtRQUMzRCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLGdCQUFnQixDQUFDLFFBQWtCLEVBQUUsUUFBZ0I7UUFDaEUsV0FBVyxDQUFDLHNCQUFzQixDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRW5ELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFaEQsSUFBSSxDQUFDO1lBQ0gsTUFBTSxFQUFFLEdBQUcsTUFBTSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN6QyxNQUFNLElBQUksR0FBRyxNQUFNLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRTdDLEVBQUUsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDL0QsQ0FBQztRQUFDLE9BQU8sS0FBVSxFQUFFLENBQUM7WUFDcEIsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsS0FBSyxDQUFDLE9BQU8sZ0RBQWdELENBQUMsQ0FBQztRQUMvRyxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxjQUFjLENBQUMsUUFBa0IsRUFBRSxRQUFnQjtRQUN4RCxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzNCLE1BQU0sSUFBSSxLQUFLLENBQUMsOERBQThELENBQUMsQ0FBQztRQUNsRixDQUFDO1FBRUQsUUFBUTtRQUNSLHFEQUFxRDtRQUNyRCxzRUFBc0U7UUFDdEUsMkNBQTJDO1FBRTNDLHNDQUFzQztRQUN0QywyQ0FBMkM7UUFDM0Msa0JBQWtCO1FBQ2xCLCtFQUErRTtRQUMvRSxrQ0FBa0M7UUFDbEMsZUFBZTtRQUNmLGtDQUFrQztRQUNsQyw4QkFBOEI7UUFDOUIsb0JBQW9CO1FBQ3BCLDZFQUE2RTtRQUM3RSxJQUFJO0lBQ04sQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFrQixFQUFFLGNBQXNCO1FBQzFELElBQUksV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxjQUFjLENBQUMsQ0FBQztRQUN4RCxDQUFDO2FBQU0sSUFBSSxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDakMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDaEQsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLElBQUksS0FBSyxDQUFDLCtDQUErQyxDQUFDLENBQUM7UUFDbkUsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxTQUFTLENBQUMsUUFBa0IsRUFBRSxjQUFzQjtRQUMvRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRDs7T0FFRztJQUNJLE1BQU0sQ0FBQyxzQkFBc0I7UUFDbEMsT0FBTyxXQUFXLENBQUMsTUFBTSxDQUFDO0lBQzVCLENBQUM7SUFFRDs7T0FFRztJQUNJLE1BQU0sQ0FBQyxtQkFBbUI7UUFDL0IsT0FBTyxXQUFXLENBQUMsU0FBUyxDQUFDO0lBQy9CLENBQUM7SUFFRDs7T0FFRztJQUNJLE1BQU0sQ0FBQyxzQkFBc0I7UUFDbEMsTUFBTSxVQUFVLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUVyQyxJQUFJLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxFQUFFLENBQUM7WUFDbEMsVUFBVSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQzFFLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxFQUFFLENBQUM7WUFDL0IsVUFBVSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDekQsQ0FBQztRQUVELE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIGVjb3Jld3JpdGVyLXNhZmUudHNcclxuaW1wb3J0IHsgRVBhY2thZ2UgfSBmcm9tICcuLi9tZXRhbW9kZWwvYXBpL2VwYWNrYWdlLmpzJztcclxuaW1wb3J0IHsgRWNvcmVTdHJpbmdXcml0ZXIgfSBmcm9tICcuL2Vjb3JlLXN0cmluZy13cml0ZXIuanMnO1xyXG5pbXBvcnQgeyBFbnZpcm9ubWVudCwgQ29uZGl0aW9uYWxJbXBvcnRzLCBzYWZlRHluYW1pY0ltcG9ydCB9IGZyb20gJy4uL3V0aWxzL2Vudmlyb25tZW50LmpzJztcclxuXHJcbi8qKlxyXG4gKiBXcml0ZXMgYW4gRVBhY2thZ2UgbWV0YW1vZGVsIHRvIGFuIFhNTCBFY29yZSBmaWxlLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEVjb3JlV3JpdGVyIHtcclxuICBwcml2YXRlIHN0cmluZ1dyaXRlciA9IG5ldyBFY29yZVN0cmluZ1dyaXRlcigpO1xyXG4gIFxyXG4gIC8qKlxyXG4gICAqIENvbnZlcnRzIGFuIEVQYWNrYWdlIHRvIEVjb3JlIFhNTCBzdHJpbmcgZm9ybWF0LlxyXG4gICAqIEBwYXJhbSBlUGFja2FnZSBUaGUgcm9vdCBwYWNrYWdlIHRvIHNlcmlhbGl6ZVxyXG4gICAqIEByZXR1cm5zIFRoZSBYTUwgc3RyaW5nIHJlcHJlc2VudGF0aW9uXHJcbiAgICovXHJcbiAgcHVibGljIHdyaXRlVG9TdHJpbmcoZVBhY2thZ2U6IEVQYWNrYWdlKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLnN0cmluZ1dyaXRlci53cml0ZVRvU3RyaW5nKGVQYWNrYWdlKTtcclxuICB9XHJcbiAgXHJcbiAgLyoqXHJcbiAgICogV3JpdGVzIGFuIEVQYWNrYWdlIHRvIGFuIEVjb3JlIFhNTCBmaWxlLlxyXG4gICAqIEBwYXJhbSBlUGFja2FnZSBUaGUgcm9vdCBwYWNrYWdlIHRvIHNlcmlhbGl6ZVxyXG4gICAqIEBwYXJhbSBmaWxlUGF0aCBUaGUgcGF0aCB3aGVyZSB0aGUgLmVjb3JlIGZpbGUgd2lsbCBiZSB3cml0dGVuXHJcbiAgICogQGRlcHJlY2F0ZWQgVXNlIHdyaXRlVG9GaWxlQXN5bmMgaW5zdGVhZCBmb3IgYnVuZGxlLXNhZmUgb3BlcmF0aW9uXHJcbiAgICovXHJcbiAgcHVibGljIGFzeW5jIHdyaXRlVG9GaWxlKGVQYWNrYWdlOiBFUGFja2FnZSwgZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIHRoaXMud3JpdGVUb0ZpbGVBc3luYyhlUGFja2FnZSwgZmlsZVBhdGgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQXN5bmMgdmVyc2lvbiBvZiB3cml0ZVRvRmlsZSBmb3IgYmV0dGVyIGVycm9yIGhhbmRsaW5nXHJcbiAgICovXHJcbiAgcHVibGljIGFzeW5jIHdyaXRlVG9GaWxlQXN5bmMoZVBhY2thZ2U6IEVQYWNrYWdlLCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBFbnZpcm9ubWVudC5yZXF1aXJlTm9kZUVudmlyb25tZW50KCdGaWxlIHdyaXRpbmcnKTtcclxuICAgIFxyXG4gICAgY29uc3QgeG1sQ29udGVudCA9IHRoaXMud3JpdGVUb1N0cmluZyhlUGFja2FnZSk7XHJcbiAgICBcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGZzID0gYXdhaXQgc2FmZUR5bmFtaWNJbXBvcnQoJ2ZzJyk7XHJcbiAgICAgIGNvbnN0IHBhdGggPSBhd2FpdCBzYWZlRHluYW1pY0ltcG9ydCgncGF0aCcpO1xyXG4gICAgICBcclxuICAgICAgZnMud3JpdGVGaWxlU3luYyhwYXRoLnJlc29sdmUoZmlsZVBhdGgpLCB4bWxDb250ZW50LCAndXRmOCcpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgc3lzdGVtIGFjY2VzcyBmYWlsZWQ6ICR7ZXJyb3IubWVzc2FnZX0uIFRoaXMgb3BlcmF0aW9uIHJlcXVpcmVzIE5vZGUuanMgZW52aXJvbm1lbnQuYCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBCcm93c2VyLWNvbXBhdGlibGUgZmlsZSBzYXZpbmcgdmlhIGRvd25sb2FkXHJcbiAgICogQHBhcmFtIGVQYWNrYWdlIFRoZSByb290IHBhY2thZ2UgdG8gc2VyaWFsaXplICBcclxuICAgKiBAcGFyYW0gZmlsZW5hbWUgVGhlIGZpbGVuYW1lIGZvciBkb3dubG9hZFxyXG4gICAqL1xyXG4gIHB1YmxpYyBzYXZlQXNEb3dubG9hZChlUGFja2FnZTogRVBhY2thZ2UsIGZpbGVuYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICghRW52aXJvbm1lbnQuaXNCcm93c2VyKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignRG93bmxvYWQgZnVuY3Rpb25hbGl0eSBvbmx5IGF2YWlsYWJsZSBpbiBicm93c2VyIGVudmlyb25tZW50Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gdHJ5IHtcclxuICAgIC8vICAgY29uc3QgeG1sQ29udGVudCA9IHRoaXMud3JpdGVUb1N0cmluZyhlUGFja2FnZSk7XHJcbiAgICAvLyAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbeG1sQ29udGVudF0sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL3htbCcgfSk7XHJcbiAgICAvLyAgIGNvbnN0IHVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XHJcbiAgICAgIFxyXG4gICAgLy8gICAvLyBDcmVhdGUgdGVtcG9yYXJ5IGRvd25sb2FkIGxpbmtcclxuICAgIC8vICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgIC8vICAgYS5ocmVmID0gdXJsO1xyXG4gICAgLy8gICBhLmRvd25sb2FkID0gZmlsZW5hbWUuZW5kc1dpdGgoJy5lY29yZScpID8gZmlsZW5hbWUgOiBgJHtmaWxlbmFtZX0uZWNvcmVgO1xyXG4gICAgLy8gICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpO1xyXG4gICAgLy8gICBhLmNsaWNrKCk7XHJcbiAgICAvLyAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYSk7XHJcbiAgICAvLyAgIFVSTC5yZXZva2VPYmplY3RVUkwodXJsKTtcclxuICAgIC8vIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAvLyAgIHRocm93IG5ldyBFcnJvcihgQnJvd3NlciBkb3dubG9hZCBmYWlsZWQ6ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWApO1xyXG4gICAgLy8gfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVW5pdmVyc2FsIHNhdmUgbWV0aG9kIC0gY2hvb3NlcyBhcHByb3ByaWF0ZSBzdHJhdGVneSBiYXNlZCBvbiBlbnZpcm9ubWVudFxyXG4gICAqL1xyXG4gIHB1YmxpYyBhc3luYyBzYXZlKGVQYWNrYWdlOiBFUGFja2FnZSwgcGF0aE9yRmlsZW5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKEVudmlyb25tZW50LmlzTm9kZSkge1xyXG4gICAgICBhd2FpdCB0aGlzLndyaXRlVG9GaWxlQXN5bmMoZVBhY2thZ2UsIHBhdGhPckZpbGVuYW1lKTtcclxuICAgIH0gZWxzZSBpZiAoRW52aXJvbm1lbnQuaXNCcm93c2VyKSB7XHJcbiAgICAgIHRoaXMuc2F2ZUFzRG93bmxvYWQoZVBhY2thZ2UsIHBhdGhPckZpbGVuYW1lKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmlsZSBzYXZpbmcgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGVudmlyb25tZW50Jyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVbml2ZXJzYWwgYXN5bmMgc2F2ZSBtZXRob2RcclxuICAgKi9cclxuICBwdWJsaWMgYXN5bmMgc2F2ZUFzeW5jKGVQYWNrYWdlOiBFUGFja2FnZSwgcGF0aE9yRmlsZW5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuc2F2ZShlUGFja2FnZSwgcGF0aE9yRmlsZW5hbWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2hlY2sgaWYgZmlsZSB3cml0aW5nIGlzIHN1cHBvcnRlZCBpbiBjdXJyZW50IGVudmlyb25tZW50XHJcbiAgICovXHJcbiAgcHVibGljIHN0YXRpYyBpc0ZpbGVXcml0aW5nU3VwcG9ydGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIEVudmlyb25tZW50LmlzTm9kZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrIGlmIGRvd25sb2FkIHNhdmluZyBpcyBzdXBwb3J0ZWQgaW4gY3VycmVudCBlbnZpcm9ubWVudFxyXG4gICAqL1xyXG4gIHB1YmxpYyBzdGF0aWMgaXNEb3dubG9hZFN1cHBvcnRlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBFbnZpcm9ubWVudC5pc0Jyb3dzZXI7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgc3VwcG9ydGVkIG9wZXJhdGlvbnMgaW4gY3VycmVudCBlbnZpcm9ubWVudFxyXG4gICAqL1xyXG4gIHB1YmxpYyBzdGF0aWMgZ2V0U3VwcG9ydGVkT3BlcmF0aW9ucygpOiBzdHJpbmdbXSB7XHJcbiAgICBjb25zdCBvcGVyYXRpb25zID0gWyd3cml0ZVRvU3RyaW5nJ107XHJcbiAgICBcclxuICAgIGlmICh0aGlzLmlzRmlsZVdyaXRpbmdTdXBwb3J0ZWQoKSkge1xyXG4gICAgICBvcGVyYXRpb25zLnB1c2goJ3dyaXRlVG9GaWxlJywgJ3dyaXRlVG9GaWxlQXN5bmMnLCAnc2F2ZScsICdzYXZlQXN5bmMnKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgaWYgKHRoaXMuaXNEb3dubG9hZFN1cHBvcnRlZCgpKSB7XHJcbiAgICAgIG9wZXJhdGlvbnMucHVzaCgnc2F2ZUFzRG93bmxvYWQnLCAnc2F2ZScsICdzYXZlQXN5bmMnKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgcmV0dXJuIG9wZXJhdGlvbnM7XHJcbiAgfVxyXG59Il19