UNPKG

@lotto24-angular/imports-orchestrator

Version:

Orchestrate dynamically imported components in Angular applications

72 lines 9.5 kB
import { Directive, inject, Injector, Input, NgModuleRef, ViewContainerRef, } from '@angular/core'; import { Subject } from 'rxjs'; import { ImportsOrchestratorIODirective } from './import-io.directive'; import { ImportsOrchestratorLifecycleDirective } from './import-lifecycle.directive'; import { ImportService, } from '../service'; import * as i0 from "@angular/core"; export class ImportsOrchestratorQueueDirective { constructor() { this.io = inject(ImportsOrchestratorIODirective, { self: true, }); this.lifecycle = inject(ImportsOrchestratorLifecycleDirective, { self: true, }); this.destroyComponents$ = new Subject(); this.viewContainerRef = inject(ViewContainerRef); this.moduleRef = inject(NgModuleRef); this.importService = inject(ImportService); this.item = null; } ngOnChanges(changes) { const importInput = changes['import']; if (importInput !== undefined && importInput.currentValue !== importInput.previousValue) { this.createAndAddItemToQueue(); } } createAndAddItemToQueue() { this.removeItemFromQueue(); this.destroyComponents$.next(); // destroy a previously mounted component(s) const injector = Injector.create({ providers: [ ...(this.providers ?? []), { provide: ViewContainerRef, useValue: this.viewContainerRef }, ], parent: this.moduleRef.injector, }); this.item = this.importService.createQueueItem(this.import, this.destroyComponents$, { ...this, injector, lifecycle: this.lifecycle, }); this.importService.addItemToQueue(this.item); } removeItemFromQueue() { if (this.item) { this.importService.removeItemFromQueue(this.item); this.item = null; } } ngOnDestroy() { this.removeItemFromQueue(); this.destroyComponents$.next(); this.destroyComponents$.complete(); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ImportsOrchestratorQueueDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.0.6", type: ImportsOrchestratorQueueDirective, isStandalone: true, selector: "[importQueue]", inputs: { import: "import", providers: "providers", timeout: "timeout" }, usesOnChanges: true, ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ImportsOrchestratorQueueDirective, decorators: [{ type: Directive, args: [{ selector: '[importQueue]', standalone: true, }] }], propDecorators: { import: [{ type: Input }], providers: [{ type: Input }], timeout: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wb3J0LXF1ZXVlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvaW1wb3J0cy1vcmNoZXN0cmF0b3Ivc3JjL2xpYi9ob3N0LWRpcmVjdGl2ZS9pbXBvcnQtcXVldWUuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsTUFBTSxFQUNOLFFBQVEsRUFDUixLQUFLLEVBQ0wsV0FBVyxFQUtYLGdCQUFnQixHQUNqQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxxQ0FBcUMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3JGLE9BQU8sRUFDTCxhQUFhLEdBR2QsTUFBTSxZQUFZLENBQUM7O0FBV3BCLE1BQU0sT0FBTyxpQ0FBaUM7SUFKOUM7UUFTa0IsT0FBRSxHQUFHLE1BQU0sQ0FBQyw4QkFBOEIsRUFBRTtZQUMxRCxJQUFJLEVBQUUsSUFBSTtTQUNYLENBQUMsQ0FBQztRQUNhLGNBQVMsR0FBRyxNQUFNLENBQUMscUNBQXFDLEVBQUU7WUFDeEUsSUFBSSxFQUFFLElBQUk7U0FDWCxDQUFDLENBQUM7UUFFYSx1QkFBa0IsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBQ2xELHFCQUFnQixHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBRWxDLGNBQVMsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFaEMsa0JBQWEsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFL0MsU0FBSSxHQUF3QyxJQUFJLENBQUM7S0FpRDFEO0lBL0NRLFdBQVcsQ0FBQyxPQUFzQjtRQUN2QyxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdEMsSUFDRSxXQUFXLEtBQUssU0FBUztZQUN6QixXQUFXLENBQUMsWUFBWSxLQUFLLFdBQVcsQ0FBQyxhQUFhLEVBQ3RELENBQUM7WUFDRCxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUNqQyxDQUFDO0lBQ0gsQ0FBQztJQUVNLHVCQUF1QjtRQUM1QixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyw0Q0FBNEM7UUFFNUUsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztZQUMvQixTQUFTLEVBQUU7Z0JBQ1QsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDO2dCQUN6QixFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixFQUFFO2FBQy9EO1lBQ0QsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUTtTQUNoQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUM1QyxJQUFJLENBQUMsTUFBTSxFQUNYLElBQUksQ0FBQyxrQkFBa0IsRUFDdkI7WUFDRSxHQUFJLElBQWlEO1lBQ3JELFFBQVE7WUFDUixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7U0FDMUIsQ0FDRixDQUFDO1FBRUYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFTyxtQkFBbUI7UUFDekIsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDZCxJQUFJLENBQUMsYUFBYSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNsRCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNuQixDQUFDO0lBQ0gsQ0FBQztJQUVNLFdBQVc7UUFDaEIsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNyQyxDQUFDOzhHQW5FVSxpQ0FBaUM7a0dBQWpDLGlDQUFpQzs7MkZBQWpDLGlDQUFpQztrQkFKN0MsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsZUFBZTtvQkFDekIsVUFBVSxFQUFFLElBQUk7aUJBQ2pCOzhCQUVpQixNQUFNO3NCQUFyQixLQUFLO2dCQUNVLFNBQVM7c0JBQXhCLEtBQUs7Z0JBQ1UsT0FBTztzQkFBdEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIERpcmVjdGl2ZSxcbiAgaW5qZWN0LFxuICBJbmplY3RvcixcbiAgSW5wdXQsXG4gIE5nTW9kdWxlUmVmLFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgU3RhdGljUHJvdmlkZXIsXG4gIFZpZXdDb250YWluZXJSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgSW1wb3J0c09yY2hlc3RyYXRvcklPRGlyZWN0aXZlIH0gZnJvbSAnLi9pbXBvcnQtaW8uZGlyZWN0aXZlJztcbmltcG9ydCB7IEltcG9ydHNPcmNoZXN0cmF0b3JMaWZlY3ljbGVEaXJlY3RpdmUgfSBmcm9tICcuL2ltcG9ydC1saWZlY3ljbGUuZGlyZWN0aXZlJztcbmltcG9ydCB7XG4gIEltcG9ydFNlcnZpY2UsXG4gIEltcG9ydFNlcnZpY2VPcHRpb25zLFxuICBJbXBvcnRzT3JjaGVzdHJhdG9yUXVldWVJdGVtLFxufSBmcm9tICcuLi9zZXJ2aWNlJztcblxudHlwZSBJbXBvcnRzT3JjaGVzdHJhdG9yUXVldWVEaXJlY3RpdmVFeHBvc2VkID0gUGljazxcbiAgSW1wb3J0U2VydmljZU9wdGlvbnMsXG4gICdpbycgfCAnbGlmZWN5Y2xlJ1xuPjtcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2ltcG9ydFF1ZXVlXScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG59KVxuZXhwb3J0IGNsYXNzIEltcG9ydHNPcmNoZXN0cmF0b3JRdWV1ZURpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcbiAgQElucHV0KCkgcHVibGljIGltcG9ydCE6IHN0cmluZztcbiAgQElucHV0KCkgcHVibGljIHByb3ZpZGVycyE6IFN0YXRpY1Byb3ZpZGVyW107XG4gIEBJbnB1dCgpIHB1YmxpYyB0aW1lb3V0ITogbnVtYmVyO1xuXG4gIHB1YmxpYyByZWFkb25seSBpbyA9IGluamVjdChJbXBvcnRzT3JjaGVzdHJhdG9ySU9EaXJlY3RpdmUsIHtcbiAgICBzZWxmOiB0cnVlLFxuICB9KTtcbiAgcHVibGljIHJlYWRvbmx5IGxpZmVjeWNsZSA9IGluamVjdChJbXBvcnRzT3JjaGVzdHJhdG9yTGlmZWN5Y2xlRGlyZWN0aXZlLCB7XG4gICAgc2VsZjogdHJ1ZSxcbiAgfSk7XG5cbiAgcHVibGljIHJlYWRvbmx5IGRlc3Ryb3lDb21wb25lbnRzJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHB1YmxpYyB2aWV3Q29udGFpbmVyUmVmID0gaW5qZWN0KFZpZXdDb250YWluZXJSZWYpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgbW9kdWxlUmVmID0gaW5qZWN0KE5nTW9kdWxlUmVmKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGltcG9ydFNlcnZpY2UgPSBpbmplY3QoSW1wb3J0U2VydmljZSk7XG5cbiAgcHJpdmF0ZSBpdGVtOiBJbXBvcnRzT3JjaGVzdHJhdG9yUXVldWVJdGVtIHwgbnVsbCA9IG51bGw7XG5cbiAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBjb25zdCBpbXBvcnRJbnB1dCA9IGNoYW5nZXNbJ2ltcG9ydCddO1xuICAgIGlmIChcbiAgICAgIGltcG9ydElucHV0ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIGltcG9ydElucHV0LmN1cnJlbnRWYWx1ZSAhPT0gaW1wb3J0SW5wdXQucHJldmlvdXNWYWx1ZVxuICAgICkge1xuICAgICAgdGhpcy5jcmVhdGVBbmRBZGRJdGVtVG9RdWV1ZSgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGVBbmRBZGRJdGVtVG9RdWV1ZSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlbW92ZUl0ZW1Gcm9tUXVldWUoKTtcbiAgICB0aGlzLmRlc3Ryb3lDb21wb25lbnRzJC5uZXh0KCk7IC8vIGRlc3Ryb3kgYSBwcmV2aW91c2x5IG1vdW50ZWQgY29tcG9uZW50KHMpXG5cbiAgICBjb25zdCBpbmplY3RvciA9IEluamVjdG9yLmNyZWF0ZSh7XG4gICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgLi4uKHRoaXMucHJvdmlkZXJzID8/IFtdKSxcbiAgICAgICAgeyBwcm92aWRlOiBWaWV3Q29udGFpbmVyUmVmLCB1c2VWYWx1ZTogdGhpcy52aWV3Q29udGFpbmVyUmVmIH0sXG4gICAgICBdLFxuICAgICAgcGFyZW50OiB0aGlzLm1vZHVsZVJlZi5pbmplY3RvcixcbiAgICB9KTtcblxuICAgIHRoaXMuaXRlbSA9IHRoaXMuaW1wb3J0U2VydmljZS5jcmVhdGVRdWV1ZUl0ZW0oXG4gICAgICB0aGlzLmltcG9ydCxcbiAgICAgIHRoaXMuZGVzdHJveUNvbXBvbmVudHMkLFxuICAgICAge1xuICAgICAgICAuLi4odGhpcyBhcyBJbXBvcnRzT3JjaGVzdHJhdG9yUXVldWVEaXJlY3RpdmVFeHBvc2VkKSxcbiAgICAgICAgaW5qZWN0b3IsXG4gICAgICAgIGxpZmVjeWNsZTogdGhpcy5saWZlY3ljbGUsXG4gICAgICB9XG4gICAgKTtcblxuICAgIHRoaXMuaW1wb3J0U2VydmljZS5hZGRJdGVtVG9RdWV1ZSh0aGlzLml0ZW0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVJdGVtRnJvbVF1ZXVlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLml0ZW0pIHtcbiAgICAgIHRoaXMuaW1wb3J0U2VydmljZS5yZW1vdmVJdGVtRnJvbVF1ZXVlKHRoaXMuaXRlbSk7XG4gICAgICB0aGlzLml0ZW0gPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlbW92ZUl0ZW1Gcm9tUXVldWUoKTtcbiAgICB0aGlzLmRlc3Ryb3lDb21wb25lbnRzJC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95Q29tcG9uZW50cyQuY29tcGxldGUoKTtcbiAgfVxufVxuIl19