@spartacus/core
Version:
Spartacus - the core framework
53 lines • 8.26 kB
JavaScript
import { Injectable, InjectFlags, } from '@angular/core';
import { filter, map, scan, startWith } from 'rxjs/operators';
import * as i0 from "@angular/core";
import * as i1 from "./lazy-modules.service";
const NOT_FOUND_SYMBOL = {};
/**
* UnifiedInjector provides a way to get instances of tokens not only once, from the root injector,
* but also from lazy loaded module injectors that can be initialized over time.
*/
export class UnifiedInjector {
constructor(rootInjector, lazyModules) {
this.rootInjector = rootInjector;
this.lazyModules = lazyModules;
/**
* Gather all the injectors, with the root injector as a first one
*
*/
this.injectors$ = this.lazyModules.modules$.pipe(map((moduleRef) => moduleRef.injector), startWith(this.rootInjector));
}
/**
* Gen instances for specified tokens.
*
* When notFoundValue is provided, it will consistently emit once per injector,
* even if injector doesn't contain instances for specified token.
* Otherwise, emissions will only involve cases, where new instances will be found.
*
* @param token
* @param notFoundValue
*/
get(token, notFoundValue) {
return this.injectors$.pipe(map((injector, index) => injector.get(token, notFoundValue !== null && notFoundValue !== void 0 ? notFoundValue : NOT_FOUND_SYMBOL,
// we want to get only Self instances from all injectors except the
// first one, which is a root injector
index ? InjectFlags.Self : undefined)), filter((instance) => instance !== NOT_FOUND_SYMBOL));
}
getMulti(token) {
return this.get(token, []).pipe(filter((instances) => {
if (!Array.isArray(instances)) {
throw new Error(`Multi-providers mixed with single providers for ${token.toString()}!`);
}
return instances.length > 0;
}), scan((acc, services) => [...acc, ...services], []));
}
}
UnifiedInjector.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: UnifiedInjector, deps: [{ token: i0.Injector }, { token: i1.LazyModulesService }], target: i0.ɵɵFactoryTarget.Injectable });
UnifiedInjector.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: UnifiedInjector, providedIn: 'root' });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: UnifiedInjector, decorators: [{
type: Injectable,
args: [{
providedIn: 'root',
}]
}], ctorParameters: function () { return [{ type: i0.Injector }, { type: i1.LazyModulesService }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5pZmllZC1pbmplY3Rvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvc3JjL2xhenktbG9hZGluZy91bmlmaWVkLWluamVjdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxVQUFVLEVBQ1YsV0FBVyxHQUlaLE1BQU0sZUFBZSxDQUFDO0FBR3ZCLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7O0FBRTlELE1BQU0sZ0JBQWdCLEdBQVEsRUFBRSxDQUFDO0FBRWpDOzs7R0FHRztBQUlILE1BQU0sT0FBTyxlQUFlO0lBVTFCLFlBQ1ksWUFBc0IsRUFDdEIsV0FBK0I7UUFEL0IsaUJBQVksR0FBWixZQUFZLENBQVU7UUFDdEIsZ0JBQVcsR0FBWCxXQUFXLENBQW9CO1FBWDNDOzs7V0FHRztRQUNNLGVBQVUsR0FBeUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUN4RSxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFDdEMsU0FBUyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FDN0IsQ0FBQztJQUtDLENBQUM7SUFFSjs7Ozs7Ozs7O09BU0c7SUFDSCxHQUFHLENBQ0QsS0FBb0QsRUFDcEQsYUFBaUI7UUFFakIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FDekIsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQ3RCLFFBQVEsQ0FBQyxHQUFHLENBQ1YsS0FBSyxFQUNMLGFBQWEsYUFBYixhQUFhLGNBQWIsYUFBYSxHQUFJLGdCQUFnQjtRQUNqQyxtRUFBbUU7UUFDbkUsc0NBQXNDO1FBQ3RDLEtBQUssQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUNyQyxDQUNGLEVBQ0QsTUFBTSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLEtBQUssZ0JBQWdCLENBQUMsQ0FDcEQsQ0FBQztJQUNKLENBQUM7SUFXRCxRQUFRLENBQ04sS0FBMEQ7UUFFMUQsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQzdCLE1BQU0sQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFO1lBQ25CLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFO2dCQUM3QixNQUFNLElBQUksS0FBSyxDQUNiLG1EQUFtRCxLQUFLLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FDdkUsQ0FBQzthQUNIO1lBQ0QsT0FBTyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUM5QixDQUFDLENBQUMsRUFDRixJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsR0FBRyxFQUFFLEdBQUcsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQ25ELENBQUM7SUFDSixDQUFDOzs0R0FsRVUsZUFBZTtnSEFBZixlQUFlLGNBRmQsTUFBTTsyRkFFUCxlQUFlO2tCQUgzQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFic3RyYWN0VHlwZSxcbiAgSW5qZWN0YWJsZSxcbiAgSW5qZWN0RmxhZ3MsXG4gIEluamVjdGlvblRva2VuLFxuICBJbmplY3RvcixcbiAgVHlwZSxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBMYXp5TW9kdWxlc1NlcnZpY2UgfSBmcm9tICcuL2xhenktbW9kdWxlcy5zZXJ2aWNlJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgbWFwLCBzY2FuLCBzdGFydFdpdGggfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmNvbnN0IE5PVF9GT1VORF9TWU1CT0w6IGFueSA9IHt9O1xuXG4vKipcbiAqIFVuaWZpZWRJbmplY3RvciBwcm92aWRlcyBhIHdheSB0byBnZXQgaW5zdGFuY2VzIG9mIHRva2VucyBub3Qgb25seSBvbmNlLCBmcm9tIHRoZSByb290IGluamVjdG9yLFxuICogYnV0IGFsc28gZnJvbSBsYXp5IGxvYWRlZCBtb2R1bGUgaW5qZWN0b3JzIHRoYXQgY2FuIGJlIGluaXRpYWxpemVkIG92ZXIgdGltZS5cbiAqL1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIFVuaWZpZWRJbmplY3RvciB7XG4gIC8qKlxuICAgKiBHYXRoZXIgYWxsIHRoZSBpbmplY3RvcnMsIHdpdGggdGhlIHJvb3QgaW5qZWN0b3IgYXMgYSBmaXJzdCBvbmVcbiAgICpcbiAgICovXG4gIHJlYWRvbmx5IGluamVjdG9ycyQ6IE9ic2VydmFibGU8SW5qZWN0b3I+ID0gdGhpcy5sYXp5TW9kdWxlcy5tb2R1bGVzJC5waXBlKFxuICAgIG1hcCgobW9kdWxlUmVmKSA9PiBtb2R1bGVSZWYuaW5qZWN0b3IpLFxuICAgIHN0YXJ0V2l0aCh0aGlzLnJvb3RJbmplY3RvcilcbiAgKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgcm9vdEluamVjdG9yOiBJbmplY3RvcixcbiAgICBwcm90ZWN0ZWQgbGF6eU1vZHVsZXM6IExhenlNb2R1bGVzU2VydmljZVxuICApIHt9XG5cbiAgLyoqXG4gICAqIEdlbiBpbnN0YW5jZXMgZm9yIHNwZWNpZmllZCB0b2tlbnMuXG4gICAqXG4gICAqIFdoZW4gbm90Rm91bmRWYWx1ZSBpcyBwcm92aWRlZCwgaXQgd2lsbCBjb25zaXN0ZW50bHkgZW1pdCBvbmNlIHBlciBpbmplY3RvcixcbiAgICogZXZlbiBpZiBpbmplY3RvciBkb2Vzbid0IGNvbnRhaW4gaW5zdGFuY2VzIGZvciBzcGVjaWZpZWQgdG9rZW4uXG4gICAqIE90aGVyd2lzZSwgZW1pc3Npb25zIHdpbGwgb25seSBpbnZvbHZlIGNhc2VzLCB3aGVyZSBuZXcgaW5zdGFuY2VzIHdpbGwgYmUgZm91bmQuXG4gICAqXG4gICAqIEBwYXJhbSB0b2tlblxuICAgKiBAcGFyYW0gbm90Rm91bmRWYWx1ZVxuICAgKi9cbiAgZ2V0PFQ+KFxuICAgIHRva2VuOiBUeXBlPFQ+IHwgSW5qZWN0aW9uVG9rZW48VD4gfCBBYnN0cmFjdFR5cGU8VD4sXG4gICAgbm90Rm91bmRWYWx1ZT86IFRcbiAgKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuaW5qZWN0b3JzJC5waXBlKFxuICAgICAgbWFwKChpbmplY3RvciwgaW5kZXgpID0+XG4gICAgICAgIGluamVjdG9yLmdldDxUPihcbiAgICAgICAgICB0b2tlbixcbiAgICAgICAgICBub3RGb3VuZFZhbHVlID8/IE5PVF9GT1VORF9TWU1CT0wsXG4gICAgICAgICAgLy8gd2Ugd2FudCB0byBnZXQgb25seSBTZWxmIGluc3RhbmNlcyBmcm9tIGFsbCBpbmplY3RvcnMgZXhjZXB0IHRoZVxuICAgICAgICAgIC8vIGZpcnN0IG9uZSwgd2hpY2ggaXMgYSByb290IGluamVjdG9yXG4gICAgICAgICAgaW5kZXggPyBJbmplY3RGbGFncy5TZWxmIDogdW5kZWZpbmVkXG4gICAgICAgIClcbiAgICAgICksXG4gICAgICBmaWx0ZXIoKGluc3RhbmNlKSA9PiBpbnN0YW5jZSAhPT0gTk9UX0ZPVU5EX1NZTUJPTClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBtdWx0aSBwcm92aWRlZCBpbnN0YW5jZXMgZm9yIGEgc3BlY2lmaWVkIHRva2VuXG4gICAqXG4gICAqIEBwYXJhbSB0b2tlblxuICAgKi9cbiAgZ2V0TXVsdGk8VD4oXG4gICAgdG9rZW46IFR5cGU8VD4gfCBJbmplY3Rpb25Ub2tlbjxUPiB8IEFic3RyYWN0VHlwZTxUPlxuICApOiBPYnNlcnZhYmxlPFRbXT47XG4gIGdldE11bHRpPFQ+KHRva2VuOiBhbnkpOiBPYnNlcnZhYmxlPFQ+O1xuICBnZXRNdWx0aTxUPihcbiAgICB0b2tlbjogVHlwZTxUPiB8IEluamVjdGlvblRva2VuPFQ+IHwgQWJzdHJhY3RUeXBlPFQ+IHwgYW55XG4gICk6IE9ic2VydmFibGU8VFtdPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KHRva2VuLCBbXSkucGlwZShcbiAgICAgIGZpbHRlcigoaW5zdGFuY2VzKSA9PiB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShpbnN0YW5jZXMpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYE11bHRpLXByb3ZpZGVycyBtaXhlZCB3aXRoIHNpbmdsZSBwcm92aWRlcnMgZm9yICR7dG9rZW4udG9TdHJpbmcoKX0hYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluc3RhbmNlcy5sZW5ndGggPiAwO1xuICAgICAgfSksXG4gICAgICBzY2FuKChhY2MsIHNlcnZpY2VzKSA9PiBbLi4uYWNjLCAuLi5zZXJ2aWNlc10sIFtdKVxuICAgICk7XG4gIH1cbn1cbiJdfQ==