UNPKG

@ngstack/code-editor

Version:

Code editor component for Angular applications.

120 lines 16.1 kB
import { Injectable, InjectionToken, Optional, Inject } from '@angular/core'; import { Subject, BehaviorSubject } from 'rxjs'; import * as i0 from "@angular/core"; export const EDITOR_SETTINGS = new InjectionToken('EDITOR_SETTINGS'); export class CodeEditorService { /** * Returns the global `monaco` instance */ get monaco() { return this._monaco; } constructor(settings) { this.typingsLoaded = new Subject(); this.loaded = new BehaviorSubject({ monaco: null }); this.loadingTypings = new BehaviorSubject(false); const editorVersion = settings?.editorVersion || 'latest'; this.baseUrl = settings?.baseUrl || `https://cdn.jsdelivr.net/npm/monaco-editor@${editorVersion}/min`; this.typingsWorkerUrl = settings?.typingsWorkerUrl || ``; } loadTypingsWorker() { if (!this.typingsWorker && window.Worker) { if (this.typingsWorkerUrl.startsWith('http')) { const proxyScript = `importScripts('${this.typingsWorkerUrl}');`; const proxy = URL.createObjectURL(new Blob([proxyScript], { type: 'text/javascript' })); this.typingsWorker = new Worker(proxy); } else { this.typingsWorker = new Worker(this.typingsWorkerUrl); } this.typingsWorker.addEventListener('message', (e) => { this.loadingTypings.next(false); this.typingsLoaded.next(e.data); }); } return this.typingsWorker; } loadTypings(dependencies) { if (dependencies && dependencies.length > 0) { const worker = this.loadTypingsWorker(); if (worker) { this.loadingTypings.next(true); worker.postMessage({ dependencies }); } } } loadEditor() { return new Promise((resolve) => { const onGotAmdLoader = () => { window.require.config({ paths: { vs: `${this.baseUrl}/vs` } }); if (this.baseUrl.startsWith('http')) { const proxyScript = ` self.MonacoEnvironment = { baseUrl: "${this.baseUrl}" }; importScripts('${this.baseUrl}/vs/base/worker/workerMain.js'); `; const proxy = URL.createObjectURL(new Blob([proxyScript], { type: 'text/javascript' })); window['MonacoEnvironment'] = { getWorkerUrl: function () { return proxy; } }; } window.require(['vs/editor/editor.main'], () => { this._monaco = window['monaco']; this.loaded.next({ monaco: this._monaco }); resolve(); }); }; if (!window.require) { const loaderScript = document.createElement('script'); loaderScript.type = 'text/javascript'; loaderScript.src = `${this.baseUrl}/vs/loader.js`; loaderScript.addEventListener('load', onGotAmdLoader); document.body.appendChild(loaderScript); } else { onGotAmdLoader(); } }); } /** * Switches to a theme. * @param themeName name of the theme */ setTheme(themeName) { this.monaco.editor.setTheme(themeName); } createEditor(containerElement, options) { return this.monaco.editor.create(containerElement, options); } createModel(value, language, uri) { return this.monaco.editor.createModel(value, language, this.monaco.Uri.file(uri)); } setModelLanguage(model, mimeTypeOrLanguageId) { if (this.monaco && model) { this.monaco.editor.setModelLanguage(model, mimeTypeOrLanguageId); } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.10", ngImport: i0, type: CodeEditorService, deps: [{ token: EDITOR_SETTINGS, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.10", ngImport: i0, type: CodeEditorService, providedIn: 'root' }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.10", ngImport: i0, type: CodeEditorService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: () => [{ type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [EDITOR_SETTINGS] }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZS1lZGl0b3Iuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvZGUtZWRpdG9yL3NyYy9saWIvc2VydmljZXMvY29kZS1lZGl0b3Iuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdFLE9BQU8sRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQUloRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsSUFBSSxjQUFjLENBQy9DLGlCQUFpQixDQUNsQixDQUFDO0FBZUYsTUFBTSxPQUFPLGlCQUFpQjtJQWE1Qjs7T0FFRztJQUNILElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBRUQsWUFHRSxRQUE0QjtRQW5COUIsa0JBQWEsR0FBRyxJQUFJLE9BQU8sRUFBZSxDQUFDO1FBQzNDLFdBQU0sR0FBRyxJQUFJLGVBQWUsQ0FBeUIsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUV2RSxtQkFBYyxHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBa0JuRCxNQUFNLGFBQWEsR0FBRyxRQUFRLEVBQUUsYUFBYSxJQUFJLFFBQVEsQ0FBQztRQUUxRCxJQUFJLENBQUMsT0FBTztZQUNWLFFBQVEsRUFBRSxPQUFPO2dCQUNqQiw4Q0FBOEMsYUFBYSxNQUFNLENBQUM7UUFDcEUsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFFBQVEsRUFBRSxnQkFBZ0IsSUFBSSxFQUFFLENBQUM7SUFDM0QsQ0FBQztJQUVPLGlCQUFpQjtRQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsSUFBVSxNQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDaEQsSUFBSSxJ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QztJQUNILENBQUM7K0dBN0lVLGlCQUFpQixrQkFzQmxCLGVBQWU7bUhBdEJkLGlCQUFpQixjQUZoQixNQUFNOzs0RkFFUCxpQkFBaUI7a0JBSDdCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzswQkFzQkksUUFBUTs7MEJBQ1IsTUFBTTsyQkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0aW9uVG9rZW4sIE9wdGlvbmFsLCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YmplY3QsIEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQ29kZUVkaXRvclNldHRpbmdzIH0gZnJvbSAnLi4vZWRpdG9yLXNldHRpbmdzJztcbmltcG9ydCB7IGVkaXRvciB9IGZyb20gJ21vbmFjby1lZGl0b3InO1xuXG5leHBvcnQgY29uc3QgRURJVE9SX1NFVFRJTkdTID0gbmV3IEluamVjdGlvblRva2VuPENvZGVFZGl0b3JTZXR0aW5ncz4oXG4gICdFRElUT1JfU0VUVElOR1MnXG4pO1xuXG5leHBvcnQgaW50ZXJmYWNlIFR5cGluZ3NJbmZvIHtcbiAgZW50cnlQb2ludHM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG4gIGZpbGVzOiBBcnJheTx7XG4gICAgY29udGVudDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICB1cmw6IHN0cmluZztcbiAgICBwYXRoOiBzdHJpbmc7XG4gIH0+O1xufVxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBDb2RlRWRpdG9yU2VydmljZSB7XG4gIHJlYWRvbmx5IGJhc2VVcmw6IHN0cmluZztcbiAgcmVhZG9ubHkgdHlwaW5nc1dvcmtlclVybDogc3RyaW5nO1xuXG4gIHR5cGluZ3NMb2FkZWQgPSBuZXcgU3ViamVjdDxUeXBpbmdzSW5mbz4oKTtcbiAgbG9hZGVkID0gbmV3IEJlaGF2aW9yU3ViamVjdDx7IG1vbmFjbzogYW55IH0gfCBudWxsPih7IG1vbmFjbzogbnVsbCB9KTtcblxuICBsb2FkaW5nVHlwaW5ncyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIHByaXZhdGUgdHlwaW5nc1dvcmtlcjogV29ya2VyO1xuXG4gIHByaXZhdGUgX21vbmFjbzogYW55O1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBnbG9iYWwgYG1vbmFjb2AgaW5zdGFuY2VcbiAgICovXG4gIGdldCBtb25hY28oKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5fbW9uYWNvO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQE9wdGlvbmFsKClcbiAgICBASW5qZWN0KEVESVRPUl9TRVRUSU5HUylcbiAgICBzZXR0aW5nczogQ29kZUVkaXRvclNldHRpbmdzXG4gICkge1xuICAgIGNvbnN0IGVkaXRvclZlcnNpb24gPSBzZXR0aW5ncz8uZWRpdG9yVmVyc2lvbiB8fCAnbGF0ZXN0JztcblxuICAgIHRoaXMuYmFzZVVybCA9XG4gICAgICBzZXR0aW5ncz8uYmFzZVVybCB8fFxuICAgICAgYGh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbW9uYWNvLWVkaXRvckAke2VkaXRvclZlcnNpb259L21pbmA7XG4gICAgdGhpcy50eXBpbmdzV29ya2VyVXJsID0gc2V0dGluZ3M/LnR5cGluZ3NXb3JrZXJVcmwgfHwgYGA7XG4gIH1cblxuICBwcml2YXRlIGxvYWRUeXBpbmdzV29ya2VyKCk6IFdvcmtlciB7XG4gICAgaWYgKCF0aGlzLnR5cGluZ3NXb3JrZXIgJiYgKDxhbnk+d2luZG93KS5Xb3JrZXIpIHtcbiAgICAgIGlmICh0aGlzLnR5cGluZ3NXb3JrZXJVcmwuc3RhcnRzV2l0aCgnaHR0cCcpKSB7XG4gICAgICAgIGNvbnN0IHByb3h5U2NyaXB0ID0gYGltcG9ydFNjcmlwdHMoJyR7dGhpcy50eXBpbmdzV29ya2VyVXJsfScpO2A7XG4gICAgICAgIGNvbnN0IHByb3h5ID0gVVJMLmNyZWF0ZU9iamVjdFVSTChcbiAgICAgICAgICBuZXcgQmxvYihbcHJveHlTY3JpcHRdLCB7IHR5cGU6ICd0ZXh0L2phdmFzY3JpcHQnIH0pXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMudHlwaW5nc1dvcmtlciA9IG5ldyBXb3JrZXIocHJveHkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy50eXBpbmdzV29ya2VyID0gbmV3IFdvcmtlcih0aGlzLnR5cGluZ3NXb3JrZXJVcmwpO1xuICAgICAgfVxuICAgICAgdGhpcy50eXBpbmdzV29ya2VyLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCAoZSkgPT4ge1xuICAgICAgICB0aGlzLmxvYWRpbmdUeXBpbmdzLm5leHQoZmFsc2UpO1xuICAgICAgICB0aGlzLnR5cGluZ3NMb2FkZWQubmV4dChlLmRhdGEpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnR5cGluZ3NXb3JrZXI7XG4gIH1cblxuICBsb2FkVHlwaW5ncyhkZXBlbmRlbmNpZXM6IHN0cmluZ1tdKSB7XG4gICAgaWYgKGRlcGVuZGVuY2llcyAmJiBkZXBlbmRlbmNpZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgd29ya2VyID0gdGhpcy5sb2FkVHlwaW5nc1dvcmtlcigpO1xuICAgICAgaWYgKHdvcmtlcikge1xuICAgICAgICB0aGlzLmxvYWRpbmdUeXBpbmdzLm5leHQodHJ1ZSk7XG4gICAgICAgIHdvcmtlci5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgZGVwZW5kZW5jaWVzXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGxvYWRFZGl0b3IoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBjb25zdCBvbkdvdEFtZExvYWRlciA9ICgpID0+IHtcbiAgICAgICAgKDxhbnk+d2luZG93KS5yZXF1aXJlLmNvbmZpZyh7XG4gICAgICAgICAgcGF0aHM6IHsgdnM6IGAke3RoaXMuYmFzZVVybH0vdnNgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMuYmFzZVVybC5zdGFydHNXaXRoKCdodHRwJykpIHtcbiAgICAgICAgICBjb25zdCBwcm94eVNjcmlwdCA9IGBcbiAgICAgICAgICAgIHNlbGYuTW9uYWNvRW52aXJvbm1lbnQgPSB7XG4gICAgICAgICAgICAgIGJhc2VVcmw6IFwiJHt0aGlzLmJhc2VVcmx9XCJcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpbXBvcnRTY3JpcHRzKCcke3RoaXMuYmFzZVVybH0vdnMvYmFzZS93b3JrZXIvd29ya2VyTWFpbi5qcycpO1xuICAgICAgICAgIGA7XG4gICAgICAgICAgY29uc3QgcHJveHkgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKFxuICAgICAgICAgICAgbmV3IEJsb2IoW3Byb3h5U2NyaXB0XSwgeyB0eXBlOiAndGV4dC9qYXZhc2NyaXB0JyB9KVxuICAgICAgICAgICk7XG4gICAgICAgICAgd2luZG93WydNb25hY29FbnZpcm9ubWVudCddID0ge1xuICAgICAgICAgICAgZ2V0V29ya2VyVXJsOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHJldHVybiBwcm94eTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgKDxhbnk+d2luZG93KS5yZXF1aXJlKFsndnMvZWRpdG9yL2VkaXRvci5tYWluJ10sICgpID0+IHtcbiAgICAgICAgICB0aGlzLl9tb25hY28gPSB3aW5kb3dbJ21vbmFjbyddO1xuICAgICAgICAgIHRoaXMubG9hZGVkLm5leHQoeyBtb25hY286IHRoaXMuX21vbmFjbyB9KTtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgaWYgKCEoPGFueT53aW5kb3cpLnJlcXVpcmUpIHtcbiAgICAgICAgY29uc3QgbG9hZGVyU2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICAgIGxvYWRlclNjcmlwdC50eXBlID0gJ3RleHQvamF2YXNjcmlwdCc7XG4gICAgICAgIGxvYWRlclNjcmlwdC5zcmMgPSBgJHt0aGlzLmJhc2VVcmx9L3ZzL2xvYWRlci5qc2A7XG4gICAgICAgIGxvYWRlclNjcmlwdC5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgb25Hb3RBbWRMb2FkZXIpO1xuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGxvYWRlclNjcmlwdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvbkdvdEFtZExvYWRlcigpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN3aXRjaGVzIHRvIGEgdGhlbWUuXG4gICAqIEBwYXJhbSB0aGVtZU5hbWUgbmFtZSBvZiB0aGUgdGhlbWVcbiAgICovXG4gIHNldFRoZW1lKHRoZW1lTmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5tb25hY28uZWRpdG9yLnNldFRoZW1lKHRoZW1lTmFtZSk7XG4gIH1cblxuICBjcmVhdGVFZGl0b3IoXG4gICAgY29udGFpbmVyRWxlbWVudDogSFRNTEVsZW1lbnQsXG4gICAgb3B0aW9ucz86IGVkaXRvci5JRWRpdG9yQ29uc3RydWN0aW9uT3B0aW9uc1xuICApOiBlZGl0b3IuSUNvZGVFZGl0b3Ige1xuICAgIHJldHVybiB0aGlzLm1vbmFjby5lZGl0b3IuY3JlYXRlKGNvbnRhaW5lckVsZW1lbnQsIG9wdGlvbnMpO1xuICB9XG5cbiAgY3JlYXRlTW9kZWwoXG4gICAgdmFsdWU6IHN0cmluZyxcbiAgICBsYW5ndWFnZT86IHN0cmluZyxcbiAgICB1cmk/OiBzdHJpbmdcbiAgKTogZWRpdG9yLklUZXh0TW9kZWwge1xuICAgIHJldHVybiB0aGlzLm1vbmFjby5lZGl0b3IuY3JlYXRlTW9kZWwoXG4gICAgICB2YWx1ZSxcbiAgICAgIGxhbmd1YWdlLFxuICAgICAgdGhpcy5tb25hY28uVXJpLmZpbGUodXJpKVxuICAgICk7XG4gIH1cblxuICBzZXRNb2RlbExhbmd1YWdlKFxuICAgIG1vZGVsOiBlZGl0b3IuSVRleHRNb2RlbCxcbiAgICBtaW1lVHlwZU9yTGFuZ3VhZ2VJZDogc3RyaW5nXG4gICk6IHZvaWQge1xuICAgIGlmICh0aGlzLm1vbmFjbyAmJiBtb2RlbCkge1xuICAgICAgdGhpcy5tb25hY28uZWRpdG9yLnNldE1vZGVsTGFuZ3VhZ2UobW9kZWwsIG1pbWVUeXBlT3JMYW5ndWFnZUlkKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==