@lotto24-angular/imports-orchestrator
Version:
Orchestrate dynamically imported components in Angular applications
72 lines • 9.5 kB
JavaScript
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