UNPKG

@lotto24-angular/imports-orchestrator

Version:

Orchestrate dynamically imported components in Angular applications

32 lines 7.45 kB
import { createNgModule, ViewContainerRef } from '@angular/core'; import { isNgModuleDef, mountComponent, resolveConstructorsFromESModule, } from './util'; import { resolvePromiseWithRetries } from '@lotto24-angular/util'; export function importNgModule(promise) { return async (item) => { const resolvedImport = (await resolvePromiseWithRetries(promise)); const ngModuleConstructors = resolveConstructorsFromESModule(resolvedImport)?.filter((type) => isNgModuleDef(type)); if (ngModuleConstructors?.length > 1) { item.logger.warn(`ES module should return a single NgModule definition, found ${ngModuleConstructors?.length}. Please append \`.then(m => m.{DesiredModule})\` to your dynamic import.`); } const ngModuleConstructor = ngModuleConstructors?.shift(); if (!ngModuleConstructor) { throw new Error('no ngModuleRef constructor found'); } const ngModuleRef = createNgModule(ngModuleConstructor, item.injector); const componentConstructors = ngModuleRef._bootstrapComponents; if (!componentConstructors?.length) { item.logger.debug('no bootstrap components found in ngModuleRef'); item.lifecycle?.importFinished?.emit(undefined); return; } const viewContainerRef = ngModuleRef.injector.get(ViewContainerRef); const mountComponentPromises = componentConstructors.map((componentConstructor) => { const componentRef = viewContainerRef.createComponent(componentConstructor, { injector: ngModuleRef.injector, ngModuleRef }); return mountComponent(componentRef, item).then(() => componentRef); }); const componentRefs = await Promise.all(mountComponentPromises); componentRefs.forEach((componentRef) => item.lifecycle?.importComponent?.emit(componentRef)); return componentRefs; }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wb3J0LW5nLW1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvaW1wb3J0cy1vcmNoZXN0cmF0b3Ivc3JjL2xpYi9yZXNvbHZlL2ltcG9ydC1uZy1tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUE0QixjQUFjLEVBQVEsZ0JBQWdCLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDaEcsT0FBTyxFQUdMLGFBQWEsRUFDYixjQUFjLEVBQ2QsK0JBQStCLEdBQ2hDLE1BQU0sUUFBUSxDQUFDO0FBR2hCLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRWxFLE1BQU0sVUFBVSxjQUFjLENBQzVCLE9BQStCO0lBRS9CLE9BQU8sS0FBSyxFQUFFLElBQWtDLEVBQUUsRUFBRTtRQUNsRCxNQUFNLGNBQWMsR0FBRyxDQUFDLE1BQU0seUJBQXlCLENBQUMsT0FBTyxDQUFDLENBRXBELENBQUM7UUFDYixNQUFNLG9CQUFvQixHQUFHLCtCQUErQixDQUMxRCxjQUFjLENBQ2YsRUFBRSxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBRXpDLElBQUksb0JBQW9CLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUNkLCtEQUErRCxvQkFBb0IsRUFBRSxNQUFNLDJFQUEyRSxDQUN2SyxDQUFDO1FBQ0osQ0FBQztRQUVELE1BQU0sbUJBQW1CLEdBQUcsb0JBQW9CLEVBQUUsS0FBSyxFQUFFLENBQUM7UUFFMUQsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDekIsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO1FBQ3RELENBQUM7UUFHRCxNQUFNLFdBQVcsR0FBRyxjQUFjLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRXZFLE1BQU0scUJBQXFCLEdBQ3pCLFdBR0QsQ0FBQyxvQkFBb0IsQ0FBQztRQUV2QixJQUFJLENBQUMscUJBQXFCLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDbkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsOENBQThDLENBQUMsQ0FBQztZQUNsRSxJQUFJLENBQUMsU0FBUyxFQUFFLGNBQWMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDaEQsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLGdCQUFnQixHQUFHLFdBQVcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFFcEUsTUFBTSxzQkFBc0IsR0FBRyxxQkFBcUIsQ0FBQyxHQUFHLENBQ3RELENBQUMsb0JBQW9CLEVBQUUsRUFBRTtZQUN2QixNQUFNLFlBQVksR0FBRyxnQkFBZ0IsQ0FBQyxlQUFlLENBQ25ELG9CQUFvQixFQUNwQixFQUFFLFFBQVEsRUFBRSxXQUFXLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxDQUNoRCxDQUFDO1lBRUYsT0FBTyxjQUFjLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNyRSxDQUFDLENBQ0YsQ0FBQztRQUVGLE1BQU0sYUFBYSxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ2hFLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUNyQyxJQUFJLENBQUMsU0FBUyxFQUFFLGVBQWUsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQ3BELENBQUM7UUFDRixPQUFPLGFBQWEsQ0FBQztJQUN2QixDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtjcmVhdGVFbnZpcm9ubWVudEluamVjdG9yLCBjcmVhdGVOZ01vZHVsZSwgVHlwZSwgVmlld0NvbnRhaW5lclJlZn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBDb25zdHJ1Y3RvcixcbiAgRVNNb2R1bGUsXG4gIGlzTmdNb2R1bGVEZWYsXG4gIG1vdW50Q29tcG9uZW50LFxuICByZXNvbHZlQ29uc3RydWN0b3JzRnJvbUVTTW9kdWxlLFxufSBmcm9tICcuL3V0aWwnO1xuaW1wb3J0IHsgSW1wb3J0c09yY2hlc3RyYXRvclF1ZXVlSXRlbSB9IGZyb20gJy4uL3NlcnZpY2UnO1xuaW1wb3J0IHsgSW1wb3J0UmVzb2x2ZUZuIH0gZnJvbSAnLi9pbXBvcnQtcmVzb2x2ZS1mbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgcmVzb2x2ZVByb21pc2VXaXRoUmV0cmllcyB9IGZyb20gJ0Bsb3R0bzI0LWFuZ3VsYXIvdXRpbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBpbXBvcnROZ01vZHVsZShcbiAgcHJvbWlzZTogKCkgPT4gUHJvbWlzZTx1bmtub3duPlxuKTogSW1wb3J0UmVzb2x2ZUZuIHtcbiAgcmV0dXJuIGFzeW5jIChpdGVtOiBJbXBvcnRzT3JjaGVzdHJhdG9yUXVldWVJdGVtKSA9PiB7XG4gICAgY29uc3QgcmVzb2x2ZWRJbXBvcnQgPSAoYXdhaXQgcmVzb2x2ZVByb21pc2VXaXRoUmV0cmllcyhwcm9taXNlKSkgYXNcbiAgICAgIHwgQ29uc3RydWN0b3JcbiAgICAgIHwgRVNNb2R1bGU7XG4gICAgY29uc3QgbmdNb2R1bGVDb25zdHJ1Y3RvcnMgPSByZXNvbHZlQ29uc3RydWN0b3JzRnJvbUVTTW9kdWxlKFxuICAgICAgcmVzb2x2ZWRJbXBvcnRcbiAgICApPy5maWx0ZXIoKHR5cGUpID0+IGlzTmdNb2R1bGVEZWYodHlwZSkpO1xuXG4gICAgaWYgKG5nTW9kdWxlQ29uc3RydWN0b3JzPy5sZW5ndGggPiAxKSB7XG4gICAgICBpdGVtLmxvZ2dlci53YXJuKFxuICAgICAgICBgRVMgbW9kdWxlIHNob3VsZCByZXR1cm4gYSBzaW5nbGUgTmdNb2R1bGUgZGVmaW5pdGlvbiwgZm91bmQgJHtuZ01vZHVsZUNvbnN0cnVjdG9ycz8ubGVuZ3RofS4gUGxlYXNlIGFwcGVuZCBcXGAudGhlbihtID0+IG0ue0Rlc2lyZWRNb2R1bGV9KVxcYCB0byB5b3VyIGR5bmFtaWMgaW1wb3J0LmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgbmdNb2R1bGVDb25zdHJ1Y3RvciA9IG5nTW9kdWxlQ29uc3RydWN0b3JzPy5zaGlmdCgpO1xuXG4gICAgaWYgKCFuZ01vZHVsZUNvbnN0cnVjdG9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vIG5nTW9kdWxlUmVmIGNvbnN0cnVjdG9yIGZvdW5kJyk7XG4gICAgfVxuXG5cbiAgICBjb25zdCBuZ01vZHVsZVJlZiA9IGNyZWF0ZU5nTW9kdWxlKG5nTW9kdWxlQ29uc3RydWN0b3IsIGl0ZW0uaW5qZWN0b3IpO1xuXG4gICAgY29uc3QgY29tcG9uZW50Q29uc3RydWN0b3JzID0gKFxuICAgICAgbmdNb2R1bGVSZWYgYXMgdW5rbm93biBhcyB7XG4gICAgICAgIF9ib290c3RyYXBDb21wb25lbnRzOiBBcnJheTxUeXBlPHVua25vd24+PiB8IG51bGw7XG4gICAgICB9XG4gICAgKS5fYm9vdHN0cmFwQ29tcG9uZW50cztcblxuICAgIGlmICghY29tcG9uZW50Q29uc3RydWN0b3JzPy5sZW5ndGgpIHtcbiAgICAgIGl0ZW0ubG9nZ2VyLmRlYnVnKCdubyBib290c3RyYXAgY29tcG9uZW50cyBmb3VuZCBpbiBuZ01vZHVsZVJlZicpO1xuICAgICAgaXRlbS5saWZlY3ljbGU/LmltcG9ydEZpbmlzaGVkPy5lbWl0KHVuZGVmaW5lZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgdmlld0NvbnRhaW5lclJlZiA9IG5nTW9kdWxlUmVmLmluamVjdG9yLmdldChWaWV3Q29udGFpbmVyUmVmKTtcblxuICAgIGNvbnN0IG1vdW50Q29tcG9uZW50UHJvbWlzZXMgPSBjb21wb25lbnRDb25zdHJ1Y3RvcnMubWFwKFxuICAgICAgKGNvbXBvbmVudENvbnN0cnVjdG9yKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IHZpZXdDb250YWluZXJSZWYuY3JlYXRlQ29tcG9uZW50KFxuICAgICAgICAgIGNvbXBvbmVudENvbnN0cnVjdG9yLFxuICAgICAgICAgIHsgaW5qZWN0b3I6IG5nTW9kdWxlUmVmLmluamVjdG9yLCBuZ01vZHVsZVJlZiB9XG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIG1vdW50Q29tcG9uZW50KGNvbXBvbmVudFJlZiwgaXRlbSkudGhlbigoKSA9PiBjb21wb25lbnRSZWYpO1xuICAgICAgfVxuICAgICk7XG5cbiAgICBjb25zdCBjb21wb25lbnRSZWZzID0gYXdhaXQgUHJvbWlzZS5hbGwobW91bnRDb21wb25lbnRQcm9taXNlcyk7XG4gICAgY29tcG9uZW50UmVmcy5mb3JFYWNoKChjb21wb25lbnRSZWYpID0+XG4gICAgICBpdGVtLmxpZmVjeWNsZT8uaW1wb3J0Q29tcG9uZW50Py5lbWl0KGNvbXBvbmVudFJlZilcbiAgICApO1xuICAgIHJldHVybiBjb21wb25lbnRSZWZzO1xuICB9O1xufVxuIl19