@cisstech/nge
Version:
NG Essentials is a collection of libraries for Angular developers.
1 lines • 12.7 kB
Source Map (JSON)
{"version":3,"file":"cisstech-nge-elements.mjs","sources":["../../../projects/nge/elements/src/nge-element.ts","../../../projects/nge/elements/src/nge-element.service.ts","../../../projects/nge/elements/src/nge-element-detector.directive.ts","../../../projects/nge/elements/src/nge-element.module.ts","../../../projects/nge/elements/cisstech-nge-elements.ts"],"sourcesContent":["import { InjectionToken, Type } from '@angular/core'\nimport { IDynamicModule } from '@cisstech/nge/services'\n\n/**\n * A NgeElementDef is a definition of a custom element\n */\nexport interface NgeElementDef {\n /**\n * The selector of the element\n */\n selector: string\n /**\n * Reference to the module that defines the element's component.\n * The module must implements {@link IDynamicModule} and define a public \"component\" field.\n */\n module?: () => Type<IDynamicModule> | Promise<Type<IDynamicModule>>\n\n /**\n * A component ref instead of a module ref can be provided.\n */\n component?: () => Type<any> | Promise<Type<any>>\n}\n\nexport const NGE_ELEMENTS = new InjectionToken<NgeElementDef[]>('NGE_ELEMENTS')\n","import { Inject, Injectable, Injector, Optional } from '@angular/core'\nimport { createCustomElement } from '@angular/elements'\nimport { CompilerService } from '@cisstech/nge/services'\nimport { Observable, from } from 'rxjs'\nimport { NGE_ELEMENTS, NgeElementDef } from './nge-element'\n\n@Injectable({\n providedIn: 'root',\n})\nexport class NgeElementService {\n private readonly registry = new Map<string, NgeElementDef>()\n private readonly defineds = new Set<string>()\n private readonly promises = new Map<string, Promise<void>>()\n\n constructor(\n private readonly injector: Injector,\n private readonly compiler: CompilerService,\n @Optional()\n @Inject(NGE_ELEMENTS)\n elements: NgeElementDef[]\n ) {\n elements?.forEach((route) => {\n this.registry.set(route.selector.trim().toLowerCase(), route)\n })\n }\n\n listUnloadeds(): string[] {\n return Array.from(this.registry.keys()).filter((s) => !this.defineds.has(s))\n }\n\n /**\n * Allows to lazy load a element given it's selector (i.e. tagname).\n * If the element selector has been registered, it's according module\n * will be fetched lazily\n * @param selector selector of the element to load.\n */\n loadElement(selector: string): Promise<void> {\n if (this.promises.has(selector)) {\n return this.promises.get(selector)!\n }\n\n const definition = this.registry.get(selector)\n if (!definition) {\n throw new Error(`Unrecognized element \"${selector}\". Make sure it is registered in the registry`)\n }\n\n const promise = new Promise<void>(async (resolve, reject) => {\n try {\n const type = definition.module\n ? await definition.module()\n : definition.component\n ? await definition.component()\n : null\n if (!type) {\n throw new Error(`No module or component found for element \"${selector}`)\n }\n\n const { component, injector } = await this.compiler.resolveComponent(type, this.injector)\n\n const customElement = createCustomElement(component, { injector })\n\n customElements.define(selector, customElement)\n await customElements.whenDefined(selector)\n\n this.defineds.add(selector)\n\n resolve()\n } catch (error) {\n reject(error)\n }\n })\n\n this.promises.set(selector, promise)\n\n return promise\n }\n\n loadElements(selectors: string[]): Observable<void[]> {\n selectors = selectors.map((e) => e.trim().toLowerCase()).filter((s) => this.registry.has(s))\n return from(Promise.all(selectors.map((s) => this.loadElement(s))))\n }\n}\n","import { AfterViewInit, Directive, OnDestroy } from '@angular/core'\nimport { NgeElementService } from './nge-element.service'\n\n// TODO make angular universal compatible using Renderer2\n\n@Directive({\n // tslint:disable-next-line: directive-selector\n selector: 'nge-element-detector, [nge-element-detector]',\n})\nexport class NgeElementDetectorDirective implements AfterViewInit, OnDestroy {\n private observer?: MutationObserver\n private listener?: () => void\n\n constructor(private readonly elementService: NgeElementService) {}\n\n async ngAfterViewInit(): Promise<void> {\n let selectors = this.elementService.listUnloadeds()\n for (const selector of selectors) {\n const tags = document.getElementsByTagName(selector)\n if (tags?.length) {\n await this.elementService.loadElement(selector)\n selectors = selectors.filter((e) => e !== selector)\n }\n }\n\n this.addMutationObserver()\n }\n\n ngOnDestroy(): void {\n this.observer?.disconnect()\n if (this.listener) {\n this.listener()\n }\n }\n\n private addMutationObserver(): void {\n const target = document.body\n let unloadedTags = this.elementService.listUnloadeds()\n this.observer = new MutationObserver((mutations) => {\n mutations.forEach((mutation) => {\n mutation.addedNodes.forEach((node) => {\n if (node instanceof HTMLElement) {\n unloadedTags = this.checkElementsInNode(node, unloadedTags)\n }\n })\n })\n })\n this.observer.observe(target, {\n subtree: true,\n childList: true,\n })\n }\n\n private checkElementsInNode(node: HTMLElement, unloadedTags: string[]) {\n if (!unloadedTags.length) {\n return unloadedTags\n }\n\n const tagName = node.tagName.toLowerCase()\n if (unloadedTags.includes(tagName)) {\n unloadedTags = unloadedTags.filter((e) => e !== tagName)\n this.elementService.loadElement(tagName).catch(console.error)\n }\n\n for (const child of Array.from(node.childNodes)) {\n if (child instanceof HTMLElement) {\n unloadedTags = this.checkElementsInNode(child, unloadedTags)\n }\n }\n return unloadedTags\n }\n}\n","import { CommonModule } from '@angular/common'\nimport { ModuleWithProviders, NgModule } from '@angular/core'\nimport { NgeElementDetectorDirective } from './nge-element-detector.directive'\nimport { NGE_ELEMENTS, NgeElementDef } from './nge-element'\n\n@NgModule({\n imports: [CommonModule],\n declarations: [NgeElementDetectorDirective],\n exports: [NgeElementDetectorDirective],\n})\nexport class NgeElementModule {\n static forRoot(elements: NgeElementDef[]): ModuleWithProviders<NgeElementModule> {\n return {\n ngModule: NgeElementModule,\n providers: [\n {\n provide: NGE_ELEMENTS,\n useValue: elements,\n },\n ],\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.NgeElementService"],"mappings":"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"}