@cisstech/nge
Version:
NG Essentials is a collection of libraries for Angular developers.
138 lines • 18.1 kB
JavaScript
import { Inject, Injectable, Optional } from '@angular/core';
import { lastValueFrom, of, Subject } from 'rxjs';
import { NGE_MONACO_CONTRIBUTION } from '../contributions/monaco-contribution';
import { NGE_MONACO_CONFIG } from '../monaco-config';
import * as i0 from "@angular/core";
import * as i1 from "@cisstech/nge/services";
/** monaco editor cdn url hosted at cdnjs. */
export const MONACO_CDNJS_URL = 'https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.52.0';
/** monaco editor cdn url hosted at jsdeliver. */
export const MONACO_JS_DELIVER_URL = 'https://cdn.jsdelivr.net/npm/monaco-editor@0.52.0';
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const WINDOW = window;
/**
* Loads monaco editor using AMD loader.
*/
export class NgeMonacoLoaderService {
constructor(config, contributions, resourceLoader) {
this.config = config;
this.contributions = contributions;
this.resourceLoader = resourceLoader;
this.monaco$ = new Subject();
this.baseUrl = MONACO_CDNJS_URL;
this.contributions = contributions || [];
}
async ngOnDestroy() {
await this.deactivateContributions();
}
/**
* Call the given `observer` function to extend monaco editor functionalities
* once it will be available in `window.monaco`.
*
* The function will be called immediately if monaco api is already loaded.
* @param observer observer object.
* @returns A subscription object that should be unsubscribed later.
*/
onLoadMonaco(observer) {
if (typeof WINDOW.monaco === 'undefined') {
return this.monaco$.asObservable().subscribe(observer);
}
return of(WINDOW.monaco).subscribe(observer);
}
/**
* Loads monaco editor if it is not loaded.
*/
loadAsync() {
return (this.loadPromise ??
(this.loadPromise = new Promise((resolve) => {
(async () => {
// Try to fix the issues described here by loading monaco editor
// after all the other scripts.
// https://stackoverflow.com/a/33635881
// https://github.com/microsoft/monaco-editor/issues/662
// https://github.com/microsoft/monaco-editor/issues/1249
const interval = setInterval(() => {
if (document.readyState !== 'complete')
return;
clearInterval(interval);
setTimeout(async () => {
await this.resourceLoader.waitForPendings();
this.baseUrl = this.config?.assets || MONACO_CDNJS_URL;
if (this.baseUrl.endsWith('/')) {
this.baseUrl = this.baseUrl.slice(0, this.baseUrl.length - 1);
}
this.addWorkersIfCrossDomain();
if (!WINDOW.require) {
lastValueFrom(this.resourceLoader.loadAllAsync([['script', `${this.baseUrl}/min/vs/loader.js`]])).then(() => this.onLoad(resolve));
}
else {
this.onLoad(resolve);
}
}, 300);
});
})();
})));
}
onLoad(resolve) {
WINDOW.require.config({
paths: { vs: this.baseUrl + '/min/vs' },
});
const locale = this.config?.locale || '';
if (locale !== 'en') {
WINDOW.require.config({
'vs/nls': {
availableLanguages: { '*': locale },
},
});
}
WINDOW.require(['vs/editor/editor.main'], async () => {
await this.activateContributions();
this.monaco$.next(monaco);
resolve(monaco);
});
}
addWorkersIfCrossDomain() {
// https://github.com/microsoft/monaco-editor/blob/master/docs/integrate-amd-cross.md
if (this.baseUrl.startsWith('http')) {
const proxy = URL.createObjectURL(new Blob([
`
self.MonacoEnvironment = { baseUrl: '${this.baseUrl}/min' };
importScripts('${this.baseUrl}/min/vs/base/worker/workerMain.js');
`,
], { type: 'text/javascript' }));
WINDOW.MonacoEnvironment = {
baseUrl: this.baseUrl + '/min',
getWorkerUrl: () => proxy,
globalAPI: true,
};
}
}
async activateContributions() {
await Promise.all(this.contributions.map((e) => e.activate()));
}
async deactivateContributions() {
await Promise.all(this.contributions.map((e) => {
if (e.deactivate) {
return e.deactivate();
}
return Promise.resolve();
}));
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.1", ngImport: i0, type: NgeMonacoLoaderService, deps: [{ token: NGE_MONACO_CONFIG, optional: true }, { token: NGE_MONACO_CONTRIBUTION, optional: true }, { token: i1.ResourceLoaderService }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.1", ngImport: i0, type: NgeMonacoLoaderService, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.1", ngImport: i0, type: NgeMonacoLoaderService, decorators: [{
type: Injectable,
args: [{ providedIn: 'root' }]
}], ctorParameters: () => [{ type: undefined, decorators: [{
type: Optional
}, {
type: Inject,
args: [NGE_MONACO_CONFIG]
}] }, { type: undefined, decorators: [{
type: Optional
}, {
type: Inject,
args: [NGE_MONACO_CONTRIBUTION]
}] }, { type: i1.ResourceLoaderService }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9uYWNvLWxvYWRlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmdlL21vbmFjby9zcmMvc2VydmljZXMvbW9uYWNvLWxvYWRlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFhLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUV2RSxPQUFPLEVBQUUsYUFBYSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUE7QUFDakQsT0FBTyxFQUFFLHVCQUF1QixFQUF5QixNQUFNLHNDQUFzQyxDQUFBO0FBQ3JHLE9BQU8sRUFBRSxpQkFBaUIsRUFBbUIsTUFBTSxrQkFBa0IsQ0FBQTs7O0FBRXJFLDZDQUE2QztBQUM3QyxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyw2REFBNkQsQ0FBQTtBQUU3RixpREFBaUQ7QUFDakQsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsbURBQW1ELENBQUE7QUFFeEYsOERBQThEO0FBQzlELE1BQU0sTUFBTSxHQUFHLE1BQWEsQ0FBQTtBQUU1Qjs7R0FFRztBQUVILE1BQU0sT0FBTyxzQkFBc0I7SUFNakMsWUFHbUIsTUFBdUIsRUFHdkIsYUFBc0MsRUFDdEMsY0FBcUM7UUFKckMsV0FBTSxHQUFOLE1BQU0sQ0FBaUI7UUFHdkIsa0JBQWEsR0FBYixhQUFhLENBQXlCO1FBQ3RDLG1CQUFjLEdBQWQsY0FBYyxDQUF1QjtRQVp2QyxZQUFPLEdBQUcsSUFBSSxPQUFPLEVBQWlCLENBQUE7UUFFL0MsWUFBTyxHQUFHLGdCQUFnQixDQUFBO1FBWWhDLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxJQUFJLEVBQUUsQ0FBQTtJQUMxQyxDQUFDO0lBRUQsS0FBSyxDQUFDLFdBQVc7UUFDZixNQUFNLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFBO0lBQ3RDLENBQUM7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Q0QsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUE7UUFDMUIsQ0FBQyxDQUFDLENBQ0gsQ0FBQTtJQUNILENBQUM7OEdBdklVLHNCQUFzQixrQkFRdkIsaUJBQWlCLDZCQUdqQix1QkFBdUI7a0hBWHRCLHNCQUFzQixjQURULE1BQU07OzJGQUNuQixzQkFBc0I7a0JBRGxDLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFOzswQkFRN0IsUUFBUTs7MEJBQ1IsTUFBTTsyQkFBQyxpQkFBaUI7OzBCQUV4QixRQUFROzswQkFDUixNQUFNOzJCQUFDLHVCQUF1QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgT25EZXN0cm95LCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5pbXBvcnQgeyBSZXNvdXJjZUxvYWRlclNlcnZpY2UgfSBmcm9tICdAY2lzc3RlY2gvbmdlL3NlcnZpY2VzJ1xuaW1wb3J0IHsgbGFzdFZhbHVlRnJvbSwgb2YsIFN1YmplY3QgfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgTkdFX01PTkFDT19DT05UUklCVVRJT04sIE5nZU1vbmFjb0NvbnRyaWJ1dGlvbiB9IGZyb20gJy4uL2NvbnRyaWJ1dGlvbnMvbW9uYWNvLWNvbnRyaWJ1dGlvbidcbmltcG9ydCB7IE5HRV9NT05BQ09fQ09ORklHLCBOZ2VNb25hY29Db25maWcgfSBmcm9tICcuLi9tb25hY28tY29uZmlnJ1xuXG4vKiogbW9uYWNvIGVkaXRvciBjZG4gdXJsIGhvc3RlZCBhdCBjZG5qcy4gKi9cbmV4cG9ydCBjb25zdCBNT05BQ09fQ0ROSlNfVVJMID0gJ2h0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL21vbmFjby1lZGl0b3IvMC41Mi4wJ1xuXG4vKiogbW9uYWNvIGVkaXRvciBjZG4gdXJsIGhvc3RlZCBhdCBqc2RlbGl2ZXIuICovXG5leHBvcnQgY29uc3QgTU9OQUNPX0pTX0RFTElWRVJfVVJMID0gJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbW9uYWNvLWVkaXRvckAwLjUyLjAnXG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5jb25zdCBXSU5ET1cgPSB3aW5kb3cgYXMgYW55XG5cbi8qKlxuICogTG9hZHMgbW9uYWNvIGVkaXRvciB1c2luZyBBTUQgbG9hZGVyLlxuICovXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIE5nZU1vbmFjb0xvYWRlclNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBwcml2YXRlIHJlYWRvbmx5IG1vbmFjbyQgPSBuZXcgU3ViamVjdDx0eXBlb2YgbW9uYWNvPigpXG5cbiAgcHJpdmF0ZSBiYXNlVXJsID0gTU9OQUNPX0NETkpTX1VSTFxuICBwcml2YXRlIGxvYWRQcm9taXNlPzogUHJvbWlzZTx0eXBlb2YgbW9uYWNvPlxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBPcHRpb25hbCgpXG4gICAgQEluamVjdChOR0VfTU9OQUNPX0NPTkZJRylcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogTmdlTW9uYWNvQ29uZmlnLFxuICAgIEBPcHRpb25hbCgpXG4gICAgQEluamVjdChOR0VfTU9OQUNPX0NPTlRSSUJVVElPTilcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbnRyaWJ1dGlvbnM6IE5nZU1vbmFjb0NvbnRyaWJ1dGlvbltdLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVzb3VyY2VMb2FkZXI6IFJlc291cmNlTG9hZGVyU2VydmljZVxuICApIHtcbiAgICB0aGlzLmNvbnRyaWJ1dGlvbnMgPSBjb250cmlidXRpb25zIHx8IFtdXG4gIH1cblxuICBhc3luYyBuZ09uRGVzdHJveSgpIHtcbiAgICBhd2FpdCB0aGlzLmRlYWN0aXZhdGVDb250cmlidXRpb25zKClcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsIHRoZSBnaXZlbiBgb2JzZXJ2ZXJgIGZ1bmN0aW9uIHRvIGV4dGVuZCBtb25hY28gZWRpdG9yIGZ1bmN0aW9uYWxpdGllc1xuICAgKiBvbmNlIGl0IHdpbGwgYmUgYXZhaWxhYmxlIGluIGB3aW5kb3cubW9uYWNvYC5cbiAgICpcbiAgICogVGhlIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGltbWVkaWF0ZWx5IGlmIG1vbmFjbyBhcGkgaXMgYWxyZWFkeSBsb2FkZWQuXG4gICAqIEBwYXJhbSBvYnNlcnZlciBvYnNlcnZlciBvYmplY3QuXG4gICAqIEByZXR1cm5zIEEgc3Vic2NyaXB0aW9uIG9iamVjdCB0aGF0IHNob3VsZCBiZSB1bnN1YnNjcmliZWQgbGF0ZXIuXG4gICAqL1xuICBvbkxvYWRNb25hY28ob2JzZXJ2ZXI6IChhcmc6IHR5cGVvZiBtb25hY28pID0+IHZvaWQpIHtcbiAgICBpZiAodHlwZW9mIFdJTkRPVy5tb25hY28gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gdGhpcy5tb25hY28kLmFzT2JzZXJ2YWJsZSgpLnN1YnNjcmliZShvYnNlcnZlcilcbiAgICB9XG4gICAgcmV0dXJuIG9mKFdJTkRPVy5tb25hY28gYXMgdHlwZW9mIG1vbmFjbykuc3Vic2NyaWJlKG9ic2VydmVyKVxuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIG1vbmFjbyBlZGl0b3IgaWYgaXQgaXMgbm90IGxvYWRlZC5cbiAgICovXG4gIGxvYWRBc3luYygpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5sb2FkUHJvbWlzZSA/P1xuICAgICAgKHRoaXMubG9hZFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIC8vIFRyeSB0byBmaXggdGhlIGlzc3VlcyBkZXNjcmliZWQgaGVyZSBieSBsb2FkaW5nIG1vbmFjbyBlZGl0b3JcbiAgICAgICAgICAvLyBhZnRlciBhbGwgdGhlIG90aGVyIHNjcmlwdHMuXG4gICAgICAgICAgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzMzNjM1ODgxXG4gICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9tb25hY28tZWRpdG9yL2lzc3Vlcy82NjJcbiAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L21vbmFjby1lZGl0b3IvaXNzdWVzLzEyNDlcbiAgICAgICAgICBjb25zdCBpbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlICE9PSAnY29tcGxldGUnKSByZXR1cm5cbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpXG5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlc291cmNlTG9hZGVyLndhaXRGb3JQZW5kaW5ncygpXG5cbiAgICAgICAgICAgICAgdGhpcy5iYXNlVXJsID0gdGhpcy5jb25maWc/LmFzc2V0cyB8fCBNT05BQ09fQ0ROSlNfVVJMXG4gICAgICAgICAgICAgIGlmICh0aGlzLmJhc2VVcmwuZW5kc1dpdGgoJy8nKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYmFzZVVybCA9IHRoaXMuYmFzZVVybC5zbGljZSgwLCB0aGlzLmJhc2VVcmwubGVuZ3RoIC0gMSlcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHRoaXMuYWRkV29ya2Vyc0lmQ3Jvc3NEb21haW4oKVxuXG4gICAgICAgICAgICAgIGlmICghV0lORE9XLnJlcXVpcmUpIHtcbiAgICAgICAgICAgICAgICBsYXN0VmFsdWVGcm9tKHRoaXMucmVzb3VyY2VMb2FkZXIubG9hZEFsbEFzeW5jKFtbJ3NjcmlwdCcsIGAke3RoaXMuYmFzZVVybH0vbWluL3ZzL2xvYWRlci5qc2BdXSkpLnRoZW4oXG4gICAgICAgICAgICAgICAgICAoKSA9PiB0aGlzLm9uTG9hZChyZXNvbHZlKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uTG9hZChyZXNvbHZlKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCAzMDApXG4gICAgICAgICAgfSlcbiAgICAgICAgfSkoKVxuICAgICAgfSkpXG4gICAgKVxuICB9XG5cbiAgcHJpdmF0ZSBvbkxvYWQocmVzb2x2ZTogKGU6IHR5cGVvZiBtb25hY28pID0+IHZvaWQpOiB2b2lkIHtcbiAgICBXSU5ET1cucmVxdWlyZS5jb25maWcoe1xuICAgICAgcGF0aHM6IHsgdnM6IHRoaXMuYmFzZVVybCArICcvbWluL3ZzJyB9LFxuICAgIH0pXG5cbiAgICBjb25zdCBsb2NhbGUgPSB0aGlzLmNvbmZpZz8ubG9jYWxlIHx8ICcnXG4gICAgaWYgKGxvY2FsZSAhPT0gJ2VuJykge1xuICAgICAgV0lORE9XLnJlcXVpcmUuY29uZmlnKHtcbiAgICAgICAgJ3ZzL25scyc6IHtcbiAgICAgICAgICBhdmFpbGFibGVMYW5ndWFnZXM6IHsgJyonOiBsb2NhbGUgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgV0lORE9XLnJlcXVpcmUoWyd2cy9lZGl0b3IvZWRpdG9yLm1haW4nXSwgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5hY3RpdmF0ZUNvbnRyaWJ1dGlvbnMoKVxuICAgICAgdGhpcy5tb25hY28kLm5leHQobW9uYWNvKVxuICAgICAgcmVzb2x2ZShtb25hY28pXG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgYWRkV29ya2Vyc0lmQ3Jvc3NEb21haW4oKSB7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9tb25hY28tZWRpdG9yL2Jsb2IvbWFzdGVyL2RvY3MvaW50ZWdyYXRlLWFtZC1jcm9zcy5tZFxuICAgIGlmICh0aGlzLmJhc2VVcmwuc3RhcnRzV2l0aCgnaHR0cCcpKSB7XG4gICAgICBjb25zdCBwcm94eSA9IFVSTC5jcmVhdGVPYmplY3RVUkwoXG4gICAgICAgIG5ldyBCbG9iKFxuICAgICAgICAgIFtcbiAgICAgICAgICAgIGBcbiAgICAgICAgICAgICAgICBzZWxmLk1vbmFjb0Vudmlyb25tZW50ID0geyBiYXNlVXJsOiAnJHt0aGlzLmJhc2VVcmx9L21pbicgfTtcbiAgICAgICAgICAgICAgICBpbXBvcnRTY3JpcHRzKCcke3RoaXMuYmFzZVVybH0vbWluL3ZzL2Jhc2Uvd29ya2VyL3dvcmtlck1haW4uanMnKTtcbiAgICAgICAgICAgIGAsXG4gICAgICAgICAgXSxcbiAgICAgICAgICB7IHR5cGU6ICd0ZXh0L2phdmFzY3JpcHQnIH1cbiAgICAgICAgKVxuICAgICAgKVxuXG4gICAgICBXSU5ET1cuTW9uYWNvRW52aXJvbm1lbnQgPSB7XG4gICAgICAgIGJhc2VVcmw6IHRoaXMuYmFzZVVybCArICcvbWluJyxcbiAgICAgICAgZ2V0V29ya2VyVXJsOiAoKSA9PiBwcm94eSxcbiAgICAgICAgZ2xvYmFsQVBJOiB0cnVlLFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYWN0aXZhdGVDb250cmlidXRpb25zKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKHRoaXMuY29udHJpYnV0aW9ucy5tYXAoKGUpID0+IGUuYWN0aXZhdGUoKSkpXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGRlYWN0aXZhdGVDb250cmlidXRpb25zKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgdGhpcy5jb250cmlidXRpb25zLm1hcCgoZSkgPT4ge1xuICAgICAgICBpZiAoZS5kZWFjdGl2YXRlKSB7XG4gICAgICAgICAgcmV0dXJuIGUuZGVhY3RpdmF0ZSgpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgICB9KVxuICAgIClcbiAgfVxufVxuIl19