UNPKG

@lotto24-angular/imports-orchestrator

Version:

Orchestrate dynamically imported components in Angular applications

34 lines 6.81 kB
import { catchError, filter, from, map, of, race, take, timeout, TimeoutError, } from 'rxjs'; import { ChangeDetectorRef } from '@angular/core'; import { assertPromise, assertSignal } from '@lotto24-angular/util'; import { toObservable } from '@angular/core/rxjs-interop'; export function deferUntilComponentReady$(componentRef, item) { const instance = componentRef.instance; if (!assertImportedComponentReadyEmitter(instance)) { return of(undefined); } item.logger.debug(`deferring until component w/ import=${item.identifier} emits ready`); componentRef.injector.get(ChangeDetectorRef).markForCheck(); // ensure Lifecycle hooks are called return race(resolveReady(instance), item.destroy$).pipe(timeout(item.timeout), catchError((err) => { if (err instanceof TimeoutError) { item.logger.warn(`deferred component w/ import=${item.identifier} timed out after ${item.timeout}ms`); } else { item.logger.error(`deferred component w/ import=${item.identifier} errored: ${err}`); } return of(undefined); })); } export function assertImportedComponentReadyEmitter(type) { return type.importedComponentReady !== undefined; } function resolveReady(instance) { const callback = instance.importedComponentReady.call(instance); if (assertPromise(callback)) { return from(callback); } return (assertSignal(callback) ? toObservable(callback) : callback).pipe(filter((value) => value), map(() => undefined), take(1)); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmZXItdW50aWwtY29tcG9uZW50LXJlYWR5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9pbXBvcnRzLW9yY2hlc3RyYXRvci9zcmMvbGliL3Jlc29sdmUvdXRpbC9kZWZlci11bnRpbC1jb21wb25lbnQtcmVhZHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUNMLFVBQVUsRUFDVixNQUFNLEVBQ04sSUFBSSxFQUNKLEdBQUcsRUFFSCxFQUFFLEVBQ0YsSUFBSSxFQUNKLElBQUksRUFDSixPQUFPLEVBQ1AsWUFBWSxHQUNiLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUFFLGlCQUFpQixFQUF3QixNQUFNLGVBQWUsQ0FBQztBQUd4RSxPQUFPLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUUxRCxNQUFNLFVBQVUseUJBQXlCLENBQ3ZDLFlBQStCLEVBQy9CLElBQWtDO0lBRWxDLE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUM7SUFDdkMsSUFBSSxDQUFDLG1DQUFtQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDbkQsT0FBTyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDdkIsQ0FBQztJQUVELElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUNmLHVDQUF1QyxJQUFJLENBQUMsVUFBVSxjQUFjLENBQ3JFLENBQUM7SUFDRixZQUFZLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsb0NBQW9DO0lBRWpHLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUNyRCxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUNyQixVQUFVLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtRQUNqQixJQUFJLEdBQUcsWUFBWSxZQUFZLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDZCxnQ0FBZ0MsSUFBSSxDQUFDLFVBQVUsb0JBQW9CLElBQUksQ0FBQyxPQUFPLElBQUksQ0FDcEYsQ0FBQztRQUNKLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQ2YsZ0NBQWdDLElBQUksQ0FBQyxVQUFVLGFBQWEsR0FBRyxFQUFFLENBQ2xFLENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDdkIsQ0FBQyxDQUFDLENBQ0gsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLFVBQVUsbUNBQW1DLENBQ2pELElBQVM7SUFFVCxPQUFRLElBQStCLENBQUMsc0JBQXNCLEtBQUssU0FBUyxDQUFDO0FBQy9FLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FBQyxRQUFnQztJQUNwRCxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2hFLElBQUksYUFBYSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDNUIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUVELE9BQU8sQ0FDTCxZQUFZLENBQUMsUUFBUSxDQUFDO1FBQ3BCLENBQUMsQ0FBQyxZQUFZLENBQUMsUUFBc0MsQ0FBQztRQUN0RCxDQUFDLENBQUUsUUFBMkMsQ0FDakQsQ0FBQyxJQUFJLENBQ0osTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFDeEIsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUNwQixJQUFJLENBQUMsQ0FBQyxDQUFDLENBQ1IsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbXBvcnRlZENvbXBvbmVudFJlYWR5IH0gZnJvbSAnLi4vaW1wb3J0ZWQtY29tcG9uZW50LXJlYWR5LmludGVyZmFjZSc7XG5pbXBvcnQge1xuICBjYXRjaEVycm9yLFxuICBmaWx0ZXIsXG4gIGZyb20sXG4gIG1hcCxcbiAgT2JzZXJ2YWJsZSxcbiAgb2YsXG4gIHJhY2UsXG4gIHRha2UsXG4gIHRpbWVvdXQsXG4gIFRpbWVvdXRFcnJvcixcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50UmVmLCBTaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgSW1wb3J0c09yY2hlc3RyYXRvclF1ZXVlSXRlbSB9IGZyb20gJy4uLy4uL3NlcnZpY2UnO1xuaW1wb3J0IHsgYXNzZXJ0UHJvbWlzZSwgYXNzZXJ0U2lnbmFsIH0gZnJvbSAnQGxvdHRvMjQtYW5ndWxhci91dGlsJztcbmltcG9ydCB7IHRvT2JzZXJ2YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcblxuZXhwb3J0IGZ1bmN0aW9uIGRlZmVyVW50aWxDb21wb25lbnRSZWFkeSQ8VD4oXG4gIGNvbXBvbmVudFJlZjogQ29tcG9uZW50UmVmPGFueT4sXG4gIGl0ZW06IEltcG9ydHNPcmNoZXN0cmF0b3JRdWV1ZUl0ZW1cbik6IE9ic2VydmFibGU8dm9pZD4ge1xuICBjb25zdCBpbnN0YW5jZSA9IGNvbXBvbmVudFJlZi5pbnN0YW5jZTtcbiAgaWYgKCFhc3NlcnRJbXBvcnRlZENvbXBvbmVudFJlYWR5RW1pdHRlcihpbnN0YW5jZSkpIHtcbiAgICByZXR1cm4gb2YodW5kZWZpbmVkKTtcbiAgfVxuXG4gIGl0ZW0ubG9nZ2VyLmRlYnVnKFxuICAgIGBkZWZlcnJpbmcgdW50aWwgY29tcG9uZW50IHcvIGltcG9ydD0ke2l0ZW0uaWRlbnRpZmllcn0gZW1pdHMgcmVhZHlgXG4gICk7XG4gIGNvbXBvbmVudFJlZi5pbmplY3Rvci5nZXQoQ2hhbmdlRGV0ZWN0b3JSZWYpLm1hcmtGb3JDaGVjaygpOyAvLyBlbnN1cmUgTGlmZWN5Y2xlIGhvb2tzIGFyZSBjYWxsZWRcblxuICByZXR1cm4gcmFjZShyZXNvbHZlUmVhZHkoaW5zdGFuY2UpLCBpdGVtLmRlc3Ryb3kkKS5waXBlKFxuICAgIHRpbWVvdXQoaXRlbS50aW1lb3V0KSxcbiAgICBjYXRjaEVycm9yKChlcnIpID0+IHtcbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBUaW1lb3V0RXJyb3IpIHtcbiAgICAgICAgaXRlbS5sb2dnZXIud2FybihcbiAgICAgICAgICBgZGVmZXJyZWQgY29tcG9uZW50IHcvIGltcG9ydD0ke2l0ZW0uaWRlbnRpZmllcn0gdGltZWQgb3V0IGFmdGVyICR7aXRlbS50aW1lb3V0fW1zYFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXRlbS5sb2dnZXIuZXJyb3IoXG4gICAgICAgICAgYGRlZmVycmVkIGNvbXBvbmVudCB3LyBpbXBvcnQ9JHtpdGVtLmlkZW50aWZpZXJ9IGVycm9yZWQ6ICR7ZXJyfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvZih1bmRlZmluZWQpO1xuICAgIH0pXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRJbXBvcnRlZENvbXBvbmVudFJlYWR5RW1pdHRlcihcbiAgdHlwZTogYW55XG4pOiB0eXBlIGlzIEltcG9ydGVkQ29tcG9uZW50UmVhZHkge1xuICByZXR1cm4gKHR5cGUgYXMgSW1wb3J0ZWRDb21wb25lbnRSZWFkeSkuaW1wb3J0ZWRDb21wb25lbnRSZWFkeSAhPT0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlUmVhZHkoaW5zdGFuY2U6IEltcG9ydGVkQ29tcG9uZW50UmVhZHkpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgY29uc3QgY2FsbGJhY2sgPSBpbnN0YW5jZS5pbXBvcnRlZENvbXBvbmVudFJlYWR5LmNhbGwoaW5zdGFuY2UpO1xuICBpZiAoYXNzZXJ0UHJvbWlzZShjYWxsYmFjaykpIHtcbiAgICByZXR1cm4gZnJvbShjYWxsYmFjayk7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIGFzc2VydFNpZ25hbChjYWxsYmFjaylcbiAgICAgID8gdG9PYnNlcnZhYmxlKGNhbGxiYWNrIGFzIHVua25vd24gYXMgU2lnbmFsPGJvb2xlYW4+KVxuICAgICAgOiAoY2FsbGJhY2sgYXMgdW5rbm93biBhcyBPYnNlcnZhYmxlPGJvb2xlYW4+KVxuICApLnBpcGUoXG4gICAgZmlsdGVyKCh2YWx1ZSkgPT4gdmFsdWUpLFxuICAgIG1hcCgoKSA9PiB1bmRlZmluZWQpLFxuICAgIHRha2UoMSlcbiAgKTtcbn1cbiJdfQ==