UNPKG

@cisstech/nge

Version:

NG Essentials is a collection of libraries for Angular developers.

77 lines 10.7 kB
import { Inject, Injectable, Optional } from '@angular/core'; import { createCustomElement } from '@angular/elements'; import { from } from 'rxjs'; import { NGE_ELEMENTS } from './nge-element'; import * as i0 from "@angular/core"; import * as i1 from "@cisstech/nge/services"; export class NgeElementService { constructor(injector, compiler, elements) { this.injector = injector; this.compiler = compiler; this.registry = new Map(); this.defineds = new Set(); this.promises = new Map(); elements?.forEach((route) => { this.registry.set(route.selector.trim().toLowerCase(), route); }); } listUnloadeds() { return Array.from(this.registry.keys()).filter((s) => !this.defineds.has(s)); } /** * Allows to lazy load a element given it's selector (i.e. tagname). * If the element selector has been registered, it's according module * will be fetched lazily * @param selector selector of the element to load. */ loadElement(selector) { if (this.promises.has(selector)) { return this.promises.get(selector); } const definition = this.registry.get(selector); if (!definition) { throw new Error(`Unrecognized element "${selector}". Make sure it is registered in the registry`); } const promise = new Promise(async (resolve, reject) => { try { const type = definition.module ? await definition.module() : definition.component ? await definition.component() : null; if (!type) { throw new Error(`No module or component found for element "${selector}`); } const { component, injector } = await this.compiler.resolveComponent(type, this.injector); const customElement = createCustomElement(component, { injector }); customElements.define(selector, customElement); await customElements.whenDefined(selector); this.defineds.add(selector); resolve(); } catch (error) { reject(error); } }); this.promises.set(selector, promise); return promise; } loadElements(selectors) { selectors = selectors.map((e) => e.trim().toLowerCase()).filter((s) => this.registry.has(s)); return from(Promise.all(selectors.map((s) => this.loadElement(s)))); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.1", ngImport: i0, type: NgeElementService, deps: [{ token: i0.Injector }, { token: i1.CompilerService }, { token: NGE_ELEMENTS, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.1", ngImport: i0, type: NgeElementService, providedIn: 'root' }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.1", ngImport: i0, type: NgeElementService, decorators: [{ type: Injectable, args: [{ providedIn: 'root', }] }], ctorParameters: () => [{ type: i0.Injector }, { type: i1.CompilerService }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [NGE_ELEMENTS] }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdlLWVsZW1lbnQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nZS9lbGVtZW50cy9zcmMvbmdlLWVsZW1lbnQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBWSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDdEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFFdkQsT0FBTyxFQUFjLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUN2QyxPQUFPLEVBQUUsWUFBWSxFQUFpQixNQUFNLGVBQWUsQ0FBQTs7O0FBSzNELE1BQU0sT0FBTyxpQkFBaUI7SUFLNUIsWUFDbUIsUUFBa0IsRUFDbEIsUUFBeUIsRUFHMUMsUUFBeUI7UUFKUixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ2xCLGFBQVEsR0FBUixRQUFRLENBQWlCO1FBTjNCLGFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBeUIsQ0FBQTtRQUMzQyxhQUFRLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQTtRQUM1QixhQUFRLEdBQUcsSUFBSSxHQUFHLEVBQXlCLENBQUE7UUFTMUQsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQzFCLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUE7UUFDL0QsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsYUFBYTtRQUNYLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDOUUsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsV0FBVyxDQUFDLFFBQWdCO1FBQzFCLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUNoQyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBRSxDQUFBO1FBQ3JDLENBQUM7UUFFRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUM5QyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDaEIsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsUUFBUSwrQ0FBK0MsQ0FBQyxDQUFBO1FBQ25HLENBQUM7UUFFRCxNQUFNLE9BQU8sR0FBRyxJQUFJLE9BQU8sQ0FBTyxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQzFELElBQUksQ0FBQztnQkFDSCxNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsTUFBTTtvQkFDNUIsQ0FBQyxDQUFDLE1BQU0sVUFBVSxDQUFDLE1BQU0sRUFBRTtvQkFDM0IsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTO3dCQUNwQixDQUFDLENBQUMsTUFBTSxVQUFVLENBQUMsU0FBUyxFQUFFO3dCQUM5QixDQUFDLENBQUMsSUFBSSxDQUFBO2dCQUNWLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztvQkFDVixNQUFNLElBQUksS0FBSyxDQUFDLDZDQUE2QyxRQUFRLEVBQUUsQ0FBQyxDQUFBO2dCQUMxRSxDQUFDO2dCQUVELE1BQU0sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7Z0JBRXpGLE1BQU0sYUFBYSxHQUFHLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUE7Z0JBRWxFLGNBQWMsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLGFBQWEsQ0FBQyxDQUFBO2dCQUM5QyxNQUFNLGNBQWMsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUE7Z0JBRTFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFBO2dCQUUzQixPQUFPLEVBQUUsQ0FBQTtZQUNYLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUNmLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQTtRQUVGLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUVwQyxPQUFPLE9BQU8sQ0FBQTtJQUNoQixDQUFDO0lBRUQsWUFBWSxDQUFDLFNBQW1CO1FBQzlCLFNBQVMsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDNUYsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ3JFLENBQUM7OEdBdkVVLGlCQUFpQix5RUFTbEIsWUFBWTtrSEFUWCxpQkFBaUIsY0FGaEIsTUFBTTs7MkZBRVAsaUJBQWlCO2tCQUg3QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7MEJBU0ksUUFBUTs7MEJBQ1IsTUFBTTsyQkFBQyxZQUFZIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBJbmplY3RvciwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xuaW1wb3J0IHsgY3JlYXRlQ3VzdG9tRWxlbWVudCB9IGZyb20gJ0Bhbmd1bGFyL2VsZW1lbnRzJ1xuaW1wb3J0IHsgQ29tcGlsZXJTZXJ2aWNlIH0gZnJvbSAnQGNpc3N0ZWNoL25nZS9zZXJ2aWNlcydcbmltcG9ydCB7IE9ic2VydmFibGUsIGZyb20gfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgTkdFX0VMRU1FTlRTLCBOZ2VFbGVtZW50RGVmIH0gZnJvbSAnLi9uZ2UtZWxlbWVudCdcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIE5nZUVsZW1lbnRTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSByZWdpc3RyeSA9IG5ldyBNYXA8c3RyaW5nLCBOZ2VFbGVtZW50RGVmPigpXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVmaW5lZHMgPSBuZXcgU2V0PHN0cmluZz4oKVxuICBwcml2YXRlIHJlYWRvbmx5IHByb21pc2VzID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8dm9pZD4+KClcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGluamVjdG9yOiBJbmplY3RvcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbXBpbGVyOiBDb21waWxlclNlcnZpY2UsXG4gICAgQE9wdGlvbmFsKClcbiAgICBASW5qZWN0KE5HRV9FTEVNRU5UUylcbiAgICBlbGVtZW50czogTmdlRWxlbWVudERlZltdXG4gICkge1xuICAgIGVsZW1lbnRzPy5mb3JFYWNoKChyb3V0ZSkgPT4ge1xuICAgICAgdGhpcy5yZWdpc3RyeS5zZXQocm91dGUuc2VsZWN0b3IudHJpbSgpLnRvTG93ZXJDYXNlKCksIHJvdXRlKVxuICAgIH0pXG4gIH1cblxuICBsaXN0VW5sb2FkZWRzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLnJlZ2lzdHJ5LmtleXMoKSkuZmlsdGVyKChzKSA9PiAhdGhpcy5kZWZpbmVkcy5oYXMocykpXG4gIH1cblxuICAvKipcbiAgICogQWxsb3dzIHRvIGxhenkgbG9hZCBhIGVsZW1lbnQgZ2l2ZW4gaXQncyBzZWxlY3RvciAoaS5lLiB0YWduYW1lKS5cbiAgICogSWYgdGhlIGVsZW1lbnQgc2VsZWN0b3IgaGFzIGJlZW4gcmVnaXN0ZXJlZCwgaXQncyBhY2NvcmRpbmcgbW9kdWxlXG4gICAqIHdpbGwgYmUgZmV0Y2hlZCBsYXppbHlcbiAgICogQHBhcmFtIHNlbGVjdG9yIHNlbGVjdG9yIG9mIHRoZSBlbGVtZW50IHRvIGxvYWQuXG4gICAqL1xuICBsb2FkRWxlbWVudChzZWxlY3Rvcjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMucHJvbWlzZXMuaGFzKHNlbGVjdG9yKSkge1xuICAgICAgcmV0dXJuIHRoaXMucHJvbWlzZXMuZ2V0KHNlbGVjdG9yKSFcbiAgICB9XG5cbiAgICBjb25zdCBkZWZpbml0aW9uID0gdGhpcy5yZWdpc3RyeS5nZXQoc2VsZWN0b3IpXG4gICAgaWYgKCFkZWZpbml0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVucmVjb2duaXplZCBlbGVtZW50IFwiJHtzZWxlY3Rvcn1cIi4gTWFrZSBzdXJlIGl0IGlzIHJlZ2lzdGVyZWQgaW4gdGhlIHJlZ2lzdHJ5YClcbiAgICB9XG5cbiAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2U8dm9pZD4oYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdHlwZSA9IGRlZmluaXRpb24ubW9kdWxlXG4gICAgICAgICAgPyBhd2FpdCBkZWZpbml0aW9uLm1vZHVsZSgpXG4gICAgICAgICAgOiBkZWZpbml0aW9uLmNvbXBvbmVudFxuICAgICAgICAgICAgPyBhd2FpdCBkZWZpbml0aW9uLmNvbXBvbmVudCgpXG4gICAgICAgICAgICA6IG51bGxcbiAgICAgICAgaWYgKCF0eXBlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBtb2R1bGUgb3IgY29tcG9uZW50IGZvdW5kIGZvciBlbGVtZW50IFwiJHtzZWxlY3Rvcn1gKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyBjb21wb25lbnQsIGluamVjdG9yIH0gPSBhd2FpdCB0aGlzLmNvbXBpbGVyLnJlc29sdmVDb21wb25lbnQodHlwZSwgdGhpcy5pbmplY3RvcilcblxuICAgICAgICBjb25zdCBjdXN0b21FbGVtZW50ID0gY3JlYXRlQ3VzdG9tRWxlbWVudChjb21wb25lbnQsIHsgaW5qZWN0b3IgfSlcblxuICAgICAgICBjdXN0b21FbGVtZW50cy5kZWZpbmUoc2VsZWN0b3IsIGN1c3RvbUVsZW1lbnQpXG4gICAgICAgIGF3YWl0IGN1c3RvbUVsZW1lbnRzLndoZW5EZWZpbmVkKHNlbGVjdG9yKVxuXG4gICAgICAgIHRoaXMuZGVmaW5lZHMuYWRkKHNlbGVjdG9yKVxuXG4gICAgICAgIHJlc29sdmUoKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICB0aGlzLnByb21pc2VzLnNldChzZWxlY3RvciwgcHJvbWlzZSlcblxuICAgIHJldHVybiBwcm9taXNlXG4gIH1cblxuICBsb2FkRWxlbWVudHMoc2VsZWN0b3JzOiBzdHJpbmdbXSk6IE9ic2VydmFibGU8dm9pZFtdPiB7XG4gICAgc2VsZWN0b3JzID0gc2VsZWN0b3JzLm1hcCgoZSkgPT4gZS50cmltKCkudG9Mb3dlckNhc2UoKSkuZmlsdGVyKChzKSA9PiB0aGlzLnJlZ2lzdHJ5LmhhcyhzKSlcbiAgICByZXR1cm4gZnJvbShQcm9taXNlLmFsbChzZWxlY3RvcnMubWFwKChzKSA9PiB0aGlzLmxvYWRFbGVtZW50KHMpKSkpXG4gIH1cbn1cbiJdfQ==