@spartacus/core
Version:
Spartacus - the core framework
49 lines • 6.47 kB
JavaScript
import { InjectFlags, } from '@angular/core';
const NOT_FOUND_SYMBOL = {};
/**
* CombinedInjector is able to combine more than one injector together.
*
* Can be used to instantiate lazy loaded modules with dependency modules,
* so lazy loaded module can use instances provided in all dependency modules.
*
* Injector tries to resolve token in all Injector, taking into account the order
* in which they were provided in complementaryInjectors and fallbacks to the
* mainInjector.
*/
export class CombinedInjector {
/**
* @param mainInjector Component hierarchical injector
* @param complementaryInjectors Additional injector that will be taken into an account when resolving dependencies
*/
constructor(mainInjector, complementaryInjectors) {
this.mainInjector = mainInjector;
this.complementaryInjectors = complementaryInjectors;
}
get(token, notFoundValue, flags) {
// eslint-disable-next-line no-bitwise
if (flags & InjectFlags.Self) {
if (notFoundValue !== undefined) {
return notFoundValue;
}
throw new Error("CombinedInjector should be used as a parent injector / doesn't support self dependencies");
}
for (const injector of this.complementaryInjectors) {
// First we are resolving providers provided at Self level
// in all complementary injectors...
const service = injector.get(token, NOT_FOUND_SYMBOL, InjectFlags.Self);
if (service !== NOT_FOUND_SYMBOL) {
return service;
}
}
for (const injector of this.complementaryInjectors) {
// next we try to resolve tokens from all levels
const service = injector.get(token, NOT_FOUND_SYMBOL);
if (service !== NOT_FOUND_SYMBOL) {
return service;
}
}
// ...and then fallback to main injector
return this.mainInjector.get(token, notFoundValue);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tYmluZWQtaW5qZWN0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JlL3NyYy91dGlsL2NvbWJpbmVkLWluamVjdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxXQUFXLEdBSVosTUFBTSxlQUFlLENBQUM7QUFFdkIsTUFBTSxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7QUFFNUI7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxPQUFPLGdCQUFnQjtJQUMzQjs7O09BR0c7SUFDSCxZQUNVLFlBQXNCLEVBQ3RCLHNCQUFrQztRQURsQyxpQkFBWSxHQUFaLFlBQVksQ0FBVTtRQUN0QiwyQkFBc0IsR0FBdEIsc0JBQXNCLENBQVk7SUFDekMsQ0FBQztJQVFKLEdBQUcsQ0FBQyxLQUFLLEVBQUUsYUFBbUIsRUFBRSxLQUFtQjtRQUNqRCxzQ0FBc0M7UUFDdEMsSUFBSSxLQUFLLEdBQUcsV0FBVyxDQUFDLElBQUksRUFBRTtZQUM1QixJQUFJLGFBQWEsS0FBSyxTQUFTLEVBQUU7Z0JBQy9CLE9BQU8sYUFBYSxDQUFDO2FBQ3RCO1lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FDYiwwRkFBMEYsQ0FDM0YsQ0FBQztTQUNIO1FBRUQsS0FBSyxNQUFNLFFBQVEsSUFBSSxJQUFJLENBQUMsc0JBQXNCLEVBQUU7WUFDbEQsMERBQTBEO1lBQzFELG9DQUFvQztZQUNwQyxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDeEUsSUFBSSxPQUFPLEtBQUssZ0JBQWdCLEVBQUU7Z0JBQ2hDLE9BQU8sT0FBTyxDQUFDO2FBQ2hCO1NBQ0Y7UUFFRCxLQUFLLE1BQU0sUUFBUSxJQUFJLElBQUksQ0FBQyxzQkFBc0IsRUFBRTtZQUNsRCxnREFBZ0Q7WUFDaEQsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztZQUN0RCxJQUFJLE9BQU8sS0FBSyxnQkFBZ0IsRUFBRTtnQkFDaEMsT0FBTyxPQUFPLENBQUM7YUFDaEI7U0FDRjtRQUNELHdDQUF3QztRQUN4QyxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxhQUFhLENBQUMsQ0FBQztJQUNyRCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBYnN0cmFjdFR5cGUsXG4gIEluamVjdEZsYWdzLFxuICBJbmplY3Rpb25Ub2tlbixcbiAgSW5qZWN0b3IsXG4gIFR5cGUsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5jb25zdCBOT1RfRk9VTkRfU1lNQk9MID0ge307XG5cbi8qKlxuICogQ29tYmluZWRJbmplY3RvciBpcyBhYmxlIHRvIGNvbWJpbmUgbW9yZSB0aGFuIG9uZSBpbmplY3RvciB0b2dldGhlci5cbiAqXG4gKiBDYW4gYmUgdXNlZCB0byBpbnN0YW50aWF0ZSBsYXp5IGxvYWRlZCBtb2R1bGVzIHdpdGggZGVwZW5kZW5jeSBtb2R1bGVzLFxuICogc28gbGF6eSBsb2FkZWQgbW9kdWxlIGNhbiB1c2UgaW5zdGFuY2VzIHByb3ZpZGVkIGluIGFsbCBkZXBlbmRlbmN5IG1vZHVsZXMuXG4gKlxuICogSW5qZWN0b3IgdHJpZXMgdG8gcmVzb2x2ZSB0b2tlbiBpbiBhbGwgSW5qZWN0b3IsIHRha2luZyBpbnRvIGFjY291bnQgdGhlIG9yZGVyXG4gKiBpbiB3aGljaCB0aGV5IHdlcmUgcHJvdmlkZWQgaW4gY29tcGxlbWVudGFyeUluamVjdG9ycyBhbmQgZmFsbGJhY2tzIHRvIHRoZVxuICogbWFpbkluamVjdG9yLlxuICovXG5leHBvcnQgY2xhc3MgQ29tYmluZWRJbmplY3RvciBpbXBsZW1lbnRzIEluamVjdG9yIHtcbiAgLyoqXG4gICAqIEBwYXJhbSBtYWluSW5qZWN0b3IgQ29tcG9uZW50IGhpZXJhcmNoaWNhbCBpbmplY3RvclxuICAgKiBAcGFyYW0gY29tcGxlbWVudGFyeUluamVjdG9ycyBBZGRpdGlvbmFsIGluamVjdG9yIHRoYXQgd2lsbCBiZSB0YWtlbiBpbnRvIGFuIGFjY291bnQgd2hlbiByZXNvbHZpbmcgZGVwZW5kZW5jaWVzXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIG1haW5JbmplY3RvcjogSW5qZWN0b3IsXG4gICAgcHJpdmF0ZSBjb21wbGVtZW50YXJ5SW5qZWN0b3JzOiBJbmplY3RvcltdXG4gICkge31cblxuICBnZXQ8VD4oXG4gICAgdG9rZW46IFR5cGU8VD4gfCBJbmplY3Rpb25Ub2tlbjxUPiB8IEFic3RyYWN0VHlwZTxUPixcbiAgICBub3RGb3VuZFZhbHVlPzogVCxcbiAgICBmbGFncz86IEluamVjdEZsYWdzXG4gICk6IFQ7XG4gIGdldCh0b2tlbjogYW55LCBub3RGb3VuZFZhbHVlPzogYW55KTogYW55O1xuICBnZXQodG9rZW4sIG5vdEZvdW5kVmFsdWU/OiBhbnksIGZsYWdzPzogSW5qZWN0RmxhZ3MpOiBhbnkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1iaXR3aXNlXG4gICAgaWYgKGZsYWdzICYgSW5qZWN0RmxhZ3MuU2VsZikge1xuICAgICAgaWYgKG5vdEZvdW5kVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gbm90Rm91bmRWYWx1ZTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJDb21iaW5lZEluamVjdG9yIHNob3VsZCBiZSB1c2VkIGFzIGEgcGFyZW50IGluamVjdG9yIC8gZG9lc24ndCBzdXBwb3J0IHNlbGYgZGVwZW5kZW5jaWVzXCJcbiAgICAgICk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBpbmplY3RvciBvZiB0aGlzLmNvbXBsZW1lbnRhcnlJbmplY3RvcnMpIHtcbiAgICAgIC8vIEZpcnN0IHdlIGFyZSByZXNvbHZpbmcgcHJvdmlkZXJzIHByb3ZpZGVkIGF0IFNlbGYgbGV2ZWxcbiAgICAgIC8vIGluIGFsbCBjb21wbGVtZW50YXJ5IGluamVjdG9ycy4uLlxuICAgICAgY29uc3Qgc2VydmljZSA9IGluamVjdG9yLmdldCh0b2tlbiwgTk9UX0ZPVU5EX1NZTUJPTCwgSW5qZWN0RmxhZ3MuU2VsZik7XG4gICAgICBpZiAoc2VydmljZSAhPT0gTk9UX0ZPVU5EX1NZTUJPTCkge1xuICAgICAgICByZXR1cm4gc2VydmljZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGluamVjdG9yIG9mIHRoaXMuY29tcGxlbWVudGFyeUluamVjdG9ycykge1xuICAgICAgLy8gbmV4dCB3ZSB0cnkgdG8gcmVzb2x2ZSB0b2tlbnMgZnJvbSBhbGwgbGV2ZWxzXG4gICAgICBjb25zdCBzZXJ2aWNlID0gaW5qZWN0b3IuZ2V0KHRva2VuLCBOT1RfRk9VTkRfU1lNQk9MKTtcbiAgICAgIGlmIChzZXJ2aWNlICE9PSBOT1RfRk9VTkRfU1lNQk9MKSB7XG4gICAgICAgIHJldHVybiBzZXJ2aWNlO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyAuLi5hbmQgdGhlbiBmYWxsYmFjayB0byBtYWluIGluamVjdG9yXG4gICAgcmV0dXJuIHRoaXMubWFpbkluamVjdG9yLmdldCh0b2tlbiwgbm90Rm91bmRWYWx1ZSk7XG4gIH1cbn1cbiJdfQ==