@tripsnek/tmf
Version:
TypeScript Modeling Framework - A TypeScript port of the Eclipse Modeling Framework (EMF)
85 lines • 9.93 kB
JavaScript
/**
* Enables enviromental checks for conditional imports, ensuring
* that Node functionality in bundle that is not used does not cause
* issues in browsers or WebView
*/
export class Environment {
static _isNode = null;
static _isBrowser = null;
static get isNode() {
if (this._isNode === null) {
try {
this._isNode = typeof process !== 'undefined' &&
process.versions != null &&
process.versions.node != null;
}
catch {
this._isNode = false;
}
}
return this._isNode;
}
static get isBrowser() {
if (this._isBrowser === null) {
try {
this._isBrowser = typeof window !== 'undefined' &&
typeof document !== 'undefined';
}
catch {
this._isBrowser = false;
}
}
return this._isBrowser;
}
static get hasDOMParser() {
try {
return typeof DOMParser !== 'undefined';
}
catch {
return false;
}
}
static requireNodeEnvironment(operation) {
if (!this.isNode) {
throw new Error(`${operation} is only available in Node.js environment`);
}
}
}
// Conditional imports helper - now redundant but kept for backward compatibility
export class ConditionalImports {
static nodeModules = new Map();
/**
* This method is kept for backward compatibility but direct imports are preferred
*/
static async getNodeModule(moduleName) {
Environment.requireNodeEnvironment(`Loading ${moduleName}`);
if (!this.nodeModules.has(moduleName)) {
try {
const module = await safeDynamicImport(moduleName);
this.nodeModules.set(moduleName, module);
return module;
}
catch (error) {
throw new Error(`Failed to load Node.js module '${moduleName}': ${error.message}`);
}
}
return this.nodeModules.get(moduleName);
}
/**
* Helper method for safe dynamic imports with better error messages
*/
static async safeImport(moduleName, operation) {
Environment.requireNodeEnvironment(operation);
try {
return await safeDynamicImport(moduleName);
}
catch (error) {
throw new Error(`${operation} failed: Cannot load '${moduleName}' module. This operation requires Node.js environment. ${error.message}`);
}
}
}
// Or use Function constructor (more robust):
export function safeDynamicImport(moduleName) {
return new Function('moduleName', 'return import(moduleName)')(moduleName);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52aXJvbm1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzL2Vudmlyb25tZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU1BOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8sV0FBVztJQUNkLE1BQU0sQ0FBQyxPQUFPLEdBQW1CLElBQUksQ0FBQztJQUN0QyxNQUFNLENBQUMsVUFBVSxHQUFtQixJQUFJLENBQUM7SUFFakQsTUFBTSxLQUFLLE1BQU07UUFDZixJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDO2dCQUNILElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxPQUFPLEtBQUssV0FBVztvQkFDOUIsT0FBTyxDQUFDLFFBQVEsSUFBSSxJQUFJO29CQUN4QixPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUM7WUFDL0MsQ0FBQztZQUFDLE1BQU0sQ0FBQztnQkFDUCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUN2QixDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBRUQsTUFBTSxLQUFLLFNBQVM7UUFDbEIsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLElBQUksRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQztnQkFDSCxJQUFJLENBQUMsVUFBVSxHQUFHLE9BQU8sTUFBTSxLQUFLLFdBQVc7b0JBQzdCLE9BQU8sUUFBUSxLQUFLLFdBQVcsQ0FBQztZQUNwRCxDQUFDO1lBQUMsTUFBTSxDQUFDO2dCQUNQLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1lBQzFCLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxNQUFNLEtBQUssWUFBWTtRQUNyQixJQUFJLENBQUM7WUFDSCxPQUFPLE9BQU8sU0FBUyxLQUFLLFdBQVcsQ0FBQztRQUMxQyxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO0lBQ0gsQ0FBQztJQUVELE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxTQUFpQjtRQUM3QyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxTQUFTLDJDQUEyQyxDQUFDLENBQUM7UUFDM0UsQ0FBQztJQUNILENBQUM7O0FBR0gsaUZBQWlGO0FBQ2pGLE1BQU0sT0FBTyxrQkFBa0I7SUFDckIsTUFBTSxDQUFDLFdBQVcsR0FBcUIsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUV6RDs7T0FFRztJQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLFVBQWtCO1FBQzNDLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFFNUQsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDdEMsSUFBSSxDQUFDO2dCQUNILE1BQU0sTUFBTSxHQUFHLE1BQU0saUJBQWlCLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ25ELElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDekMsT0FBTyxNQUFNLENBQUM7WUFDaEIsQ0FBQztZQUFDLE9BQU8sS0FBVSxFQUFFLENBQUM7Z0JBQ3BCLE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLFVBQVUsTUFBTSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUNyRixDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsVUFBa0IsRUFBRSxTQUFpQjtRQUMzRCxXQUFXLENBQUMsc0JBQXNCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFOUMsSUFBSSxDQUFDO1lBQ0gsT0FBTyxNQUFNLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFBQyxPQUFPLEtBQVUsRUFBRSxDQUFDO1lBQ3BCLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxTQUFTLHlCQUF5QixVQUFVLDBEQUEwRCxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUM1SSxDQUFDO0lBQ0gsQ0FBQzs7QUFHSCw2Q0FBNkM7QUFDN0MsTUFBTSxVQUFVLGlCQUFpQixDQUFDLFVBQWtCO0lBQ2xELE9BQU8sSUFBSSxRQUFRLENBQUMsWUFBWSxFQUFFLDJCQUEyQixDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDN0UsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIFR5cGUtc2FmZSBnbG9iYWwgY2hlY2tzXHJcbmRlY2xhcmUgY29uc3Qgd2luZG93OiBhbnk7XHJcbmRlY2xhcmUgY29uc3QgZG9jdW1lbnQ6IGFueTtcclxuZGVjbGFyZSBjb25zdCBwcm9jZXNzOiBhbnk7XHJcbmRlY2xhcmUgY29uc3QgRE9NUGFyc2VyOiBhbnk7XHJcblxyXG4vKipcclxuICogRW5hYmxlcyBlbnZpcm9tZW50YWwgY2hlY2tzIGZvciBjb25kaXRpb25hbCBpbXBvcnRzLCBlbnN1cmluZ1xyXG4gKiB0aGF0IE5vZGUgZnVuY3Rpb25hbGl0eSBpbiBidW5kbGUgdGhhdCBpcyBub3QgdXNlZCBkb2VzIG5vdCBjYXVzZVxyXG4gKiBpc3N1ZXMgaW4gYnJvd3NlcnMgb3IgV2ViVmlld1xyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEVudmlyb25tZW50IHtcclxuICBwcml2YXRlIHN0YXRpYyBfaXNOb2RlOiBib29sZWFuIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgX2lzQnJvd3NlcjogYm9vbGVhbiB8IG51bGwgPSBudWxsO1xyXG5cclxuICBzdGF0aWMgZ2V0IGlzTm9kZSgpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLl9pc05vZGUgPT09IG51bGwpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICB0aGlzLl9pc05vZGUgPSB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy52ZXJzaW9ucyAhPSBudWxsICYmIFxyXG4gICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MudmVyc2lvbnMubm9kZSAhPSBudWxsO1xyXG4gICAgICB9IGNhdGNoIHtcclxuICAgICAgICB0aGlzLl9pc05vZGUgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuX2lzTm9kZTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBnZXQgaXNCcm93c2VyKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuX2lzQnJvd3NlciA9PT0gbnVsbCkge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIHRoaXMuX2lzQnJvd3NlciA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCc7XHJcbiAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgIHRoaXMuX2lzQnJvd3NlciA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5faXNCcm93c2VyO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGdldCBoYXNET01QYXJzZXIoKTogYm9vbGVhbiB7XHJcbiAgICB0cnkge1xyXG4gICAgICByZXR1cm4gdHlwZW9mIERPTVBhcnNlciAhPT0gJ3VuZGVmaW5lZCc7XHJcbiAgICB9IGNhdGNoIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhdGljIHJlcXVpcmVOb2RlRW52aXJvbm1lbnQob3BlcmF0aW9uOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5pc05vZGUpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke29wZXJhdGlvbn0gaXMgb25seSBhdmFpbGFibGUgaW4gTm9kZS5qcyBlbnZpcm9ubWVudGApO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuLy8gQ29uZGl0aW9uYWwgaW1wb3J0cyBoZWxwZXIgLSBub3cgcmVkdW5kYW50IGJ1dCBrZXB0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XHJcbmV4cG9ydCBjbGFzcyBDb25kaXRpb25hbEltcG9ydHMge1xyXG4gIHByaXZhdGUgc3RhdGljIG5vZGVNb2R1bGVzOiBNYXA8c3RyaW5nLCBhbnk+ID0gbmV3IE1hcCgpO1xyXG5cclxuICAvKipcclxuICAgKiBUaGlzIG1ldGhvZCBpcyBrZXB0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGJ1dCBkaXJlY3QgaW1wb3J0cyBhcmUgcHJlZmVycmVkXHJcbiAgICovXHJcbiAgc3RhdGljIGFzeW5jIGdldE5vZGVNb2R1bGUobW9kdWxlTmFtZTogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIEVudmlyb25tZW50LnJlcXVpcmVOb2RlRW52aXJvbm1lbnQoYExvYWRpbmcgJHttb2R1bGVOYW1lfWApO1xyXG4gICAgXHJcbiAgICBpZiAoIXRoaXMubm9kZU1vZHVsZXMuaGFzKG1vZHVsZU5hbWUpKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgbW9kdWxlID0gYXdhaXQgc2FmZUR5bmFtaWNJbXBvcnQobW9kdWxlTmFtZSk7XHJcbiAgICAgICAgdGhpcy5ub2RlTW9kdWxlcy5zZXQobW9kdWxlTmFtZSwgbW9kdWxlKTtcclxuICAgICAgICByZXR1cm4gbW9kdWxlO1xyXG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gbG9hZCBOb2RlLmpzIG1vZHVsZSAnJHttb2R1bGVOYW1lfSc6ICR7ZXJyb3IubWVzc2FnZX1gKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICByZXR1cm4gdGhpcy5ub2RlTW9kdWxlcy5nZXQobW9kdWxlTmFtZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIZWxwZXIgbWV0aG9kIGZvciBzYWZlIGR5bmFtaWMgaW1wb3J0cyB3aXRoIGJldHRlciBlcnJvciBtZXNzYWdlc1xyXG4gICAqL1xyXG4gIHN0YXRpYyBhc3luYyBzYWZlSW1wb3J0KG1vZHVsZU5hbWU6IHN0cmluZywgb3BlcmF0aW9uOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgRW52aXJvbm1lbnQucmVxdWlyZU5vZGVFbnZpcm9ubWVudChvcGVyYXRpb24pO1xyXG4gICAgXHJcbiAgICB0cnkge1xyXG4gICAgICByZXR1cm4gYXdhaXQgc2FmZUR5bmFtaWNJbXBvcnQobW9kdWxlTmFtZSk7XHJcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtvcGVyYXRpb259IGZhaWxlZDogQ2Fubm90IGxvYWQgJyR7bW9kdWxlTmFtZX0nIG1vZHVsZS4gVGhpcyBvcGVyYXRpb24gcmVxdWlyZXMgTm9kZS5qcyBlbnZpcm9ubWVudC4gJHtlcnJvci5tZXNzYWdlfWApO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuLy8gT3IgdXNlIEZ1bmN0aW9uIGNvbnN0cnVjdG9yIChtb3JlIHJvYnVzdCk6XHJcbmV4cG9ydCBmdW5jdGlvbiBzYWZlRHluYW1pY0ltcG9ydChtb2R1bGVOYW1lOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xyXG4gIHJldHVybiBuZXcgRnVuY3Rpb24oJ21vZHVsZU5hbWUnLCAncmV0dXJuIGltcG9ydChtb2R1bGVOYW1lKScpKG1vZHVsZU5hbWUpO1xyXG59Il19