{"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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"}