UNPKG

@cisstech/nge

Version:

NG Essentials is a collection of libraries for Angular developers.

138 lines 18.1 kB
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