@ngstack/code-editor
Version:
Code editor component for Angular applications.
120 lines • 16.1 kB
JavaScript
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==