@decorators/di
Version:
node decorators - decorators for dependency injection
146 lines • 20 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Container = void 0;
const errors_1 = require("./errors");
const constants_1 = require("./constants");
const helpers_1 = require("./helpers");
const injection_token_1 = require("./injection-token");
class Container {
constructor() {
this.providers = new Map();
}
setParent(container) {
this.parentContainer = container;
}
/**
* Registers new or replaces providers
*/
provide(providers) {
this.registerSingleProviders(providers.filter(provider => !provider.multi));
this.registerMultiProviders(providers.filter(provider => provider.multi));
}
/**
* Gets or instantiates an injectable
*/
async get(injectable) {
return this.resolve(injectable);
}
/**
* Verifies that injectable is provided within the scope
*/
has(injectable) {
var _a;
return this.providers.has(injectable) || ((_a = this.parentContainer) === null || _a === void 0 ? void 0 : _a.has(injectable));
}
/**
* Resolves the provider, following deps are resolved recursively
*/
async resolve(injectable, optional = false, sequenceDeps = []) {
var _a, _b, _c, _d, _e;
let provider = this.providers.get(injectable);
if (!provider && ((_a = this.parentContainer) === null || _a === void 0 ? void 0 : _a.has(injectable))) {
return this.parentContainer.get(injectable);
}
if (!provider && !optional) {
throw new errors_1.MissingProviderError(injectable);
}
provider = provider !== null && provider !== void 0 ? provider : {};
if (provider.value) {
return provider.value;
}
const resolvedDeps = [];
for (const [index, dep] of provider.deps.entries()) {
if (!dep.id) {
throw new errors_1.InvalidDependencyError((_b = provider.type) !== null && _b !== void 0 ? _b : injectable, provider.deps, index);
}
if (sequenceDeps.find(seqDep => seqDep === dep)) {
throw new errors_1.RecursiveDependencyError((_c = provider.type) !== null && _c !== void 0 ? _c : injectable, provider.deps, index);
}
const depProvider = this.providers.get(dep.id);
if (depProvider) {
resolvedDeps.push(await this.resolve(dep.id, dep.optional, [...sequenceDeps, ...provider.deps]));
continue;
}
if ((_d = this.parentContainer) === null || _d === void 0 ? void 0 : _d.has(dep.id)) {
resolvedDeps.push(await this.parentContainer.get(dep.id));
continue;
}
if (!dep.optional) {
throw new errors_1.MissingDependencyError((_e = provider.type) !== null && _e !== void 0 ? _e : injectable, provider.deps, index);
}
resolvedDeps.push(undefined);
}
let value;
if (provider.factory) {
value = await provider.factory(...resolvedDeps);
}
if (provider.type) {
value = new provider.type(...resolvedDeps);
}
this.providers.set(injectable, Object.assign(Object.assign({}, provider), { value }));
return value;
}
registerMultiProviders(providers) {
providers.forEach(provider => {
const injectableId = new injection_token_1.InjectionToken((0, helpers_1.injectableToString)(provider.provide));
// creates dependency provider for the main provider
this.registerSingleProviders([Object.assign(Object.assign({}, provider), { provide: injectableId })]);
const containerProvider = this.providers.get(provider.provide);
if (containerProvider) {
return containerProvider.deps.push({ id: injectableId });
}
// creates main provider that will hold all other providers as deps
this.registerSingleProviders([{
provide: provider.provide,
useFactory: (...deps) => deps,
deps: [injectableId],
}]);
});
}
registerSingleProviders(providers) {
providers.forEach(provider => {
if (provider.useClass) {
return this.registerClassProvider(provider);
}
if (provider.useFactory) {
return this.registerFactoryProvider(provider);
}
if (provider.useValue) {
return this.registerValueProvider(provider);
}
if (provider.useExisting) {
return this.registerExistingProvider(provider);
}
});
}
registerClassProvider(provider) {
var _a, _b;
const ids = (_a = Reflect.getMetadata(constants_1.DEP_IDS_METADATA, provider.useClass)) !== null && _a !== void 0 ? _a : [];
const optionals = (_b = Reflect.getMetadata(constants_1.OPTIONAL_DEPS_METADATA, provider.useClass)) !== null && _b !== void 0 ? _b : [];
this.providers.set(provider.provide, {
type: provider.useClass,
deps: ids.map((id, index) => ({ id, optional: optionals[index] })),
});
}
registerFactoryProvider(provider) {
var _a, _b;
this.providers.set(provider.provide, {
deps: (_b = (_a = provider.deps) === null || _a === void 0 ? void 0 : _a.map(id => ({ id }))) !== null && _b !== void 0 ? _b : [],
factory: provider.useFactory,
});
}
registerValueProvider(provider) {
this.providers.set(provider.provide, {
value: provider.useValue,
});
}
registerExistingProvider(provider) {
this.registerFactoryProvider({
provide: provider.provide,
deps: [provider.useExisting],
useFactory: (existing) => existing,
});
}
}
exports.Container = Container;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGFpbmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbnRhaW5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFVQSxxQ0FBMEg7QUFDMUgsMkNBQXVFO0FBQ3ZFLHVDQUErQztBQUMvQyx1REFBbUQ7QUFFbkQsTUFBYSxTQUFTO0lBQXRCO1FBRUUsY0FBUyxHQUFHLElBQUksR0FBRyxFQUFpQyxDQUFDO0lBa0x2RCxDQUFDO0lBaExDLFNBQVMsQ0FBQyxTQUFvQjtRQUM1QixJQUFJLENBQUMsZUFBZSxHQUFHLFNBQVMsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxPQUFPLENBQUMsU0FBcUI7UUFDM0IsSUFBSSxDQUFDLHVCQUF1QixDQUMxQixTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQzlDLENBQUM7UUFFRixJQUFJLENBQUMsc0JBQXNCLENBQ3pCLFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQzdDLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsR0FBRyxDQUFJLFVBQXNCO1FBQ2pDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxHQUFHLENBQUMsVUFBc0I7O1FBQ3hCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEtBQUksTUFBQSxJQUFJLENBQUMsZUFBZSwwQ0FBRSxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUEsQ0FBQztJQUNqRixDQUFDO0lBRUQ7O09BRUc7SUFDSyxLQUFLLENBQUMsT0FBTyxDQUNuQixVQUFzQixFQUN0QixRQUFRLEdBQUcsS0FBSyxFQUNoQixlQUE2QixFQUFFOztRQUUvQixJQUFJLFFB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LFFBQXVCO1FBQ25ELElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUU7WUFDbkMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxRQUFRO1NBQ3pCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyx3QkFBd0IsQ0FBQyxRQUEwQjtRQUN6RCxJQUFJLENBQUMsdUJBQXVCLENBQUM7WUFDM0IsT0FBTyxFQUFFLFFBQVEsQ0FBQyxPQUFPO1lBQ3pCLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUM7WUFDNUIsVUFBVSxFQUFFLENBQUMsUUFBaUIsRUFBRSxFQUFFLENBQUMsUUFBUTtTQUM1QyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUFwTEQsOEJBb0xDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgUHJvdmlkZXIsXG4gIENvbnRhaW5lclByb3ZpZGVyLFxuICBDbGFzc1Byb3ZpZGVyLFxuICBGYWN0b3J5UHJvdmlkZXIsXG4gIFZhbHVlUHJvdmlkZXIsXG4gIERlcGVuZGVuY3ksXG4gIEluamVjdGFibGUsXG4gIEV4aXN0aW5nUHJvdmlkZXIsXG59IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgSW52YWxpZERlcGVuZGVuY3lFcnJvciwgTWlzc2luZ0RlcGVuZGVuY3lFcnJvciwgTWlzc2luZ1Byb3ZpZGVyRXJyb3IsIFJlY3Vyc2l2ZURlcGVuZGVuY3lFcnJvciB9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7IERFUF9JRFNfTUVUQURBVEEsIE9QVElPTkFMX0RFUFNfTUVUQURBVEEgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBpbmplY3RhYmxlVG9TdHJpbmcgfSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICcuL2luamVjdGlvbi10b2tlbic7XG5cbmV4cG9ydCBjbGFzcyBDb250YWluZXIge1xuICBwYXJlbnRDb250YWluZXI/OiBDb250YWluZXI7XG4gIHByb3ZpZGVycyA9IG5ldyBNYXA8SW5qZWN0YWJsZSwgQ29udGFpbmVyUHJvdmlkZXI+KCk7XG5cbiAgc2V0UGFyZW50KGNvbnRhaW5lcjogQ29udGFpbmVyKSB7XG4gICAgdGhpcy5wYXJlbnRDb250YWluZXIgPSBjb250YWluZXI7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIG5ldyBvciByZXBsYWNlcyBwcm92aWRlcnNcbiAgICovXG4gIHByb3ZpZGUocHJvdmlkZXJzOiBQcm92aWRlcltdKSB7XG4gICAgdGhpcy5yZWdpc3RlclNpbmdsZVByb3ZpZGVycyhcbiAgICAgIHByb3ZpZGVycy5maWx0ZXIocHJvdmlkZXIgPT4gIXByb3ZpZGVyLm11bHRpKSxcbiAgICApO1xuXG4gICAgdGhpcy5yZWdpc3Rlck11bHRpUHJvdmlkZXJzKFxuICAgICAgcHJvdmlkZXJzLmZpbHRlcihwcm92aWRlciA9PiBwcm92aWRlci5tdWx0aSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIG9yIGluc3RhbnRpYXRlcyBhbiBpbmplY3RhYmxlXG4gICAqL1xuICBhc3luYyBnZXQ8VD4oaW5qZWN0YWJsZTogSW5qZWN0YWJsZSk6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiB0aGlzLnJlc29sdmUoaW5qZWN0YWJsZSk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhhdCBpbmplY3RhYmxlIGlzIHByb3ZpZGVkIHdpdGhpbiB0aGUgc2NvcGVcbiAgICovXG4gIGhhcyhpbmplY3RhYmxlOiBJbmplY3RhYmxlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucHJvdmlkZXJzLmhhcyhpbmplY3RhYmxlKSB8fCB0aGlzLnBhcmVudENvbnRhaW5lcj8uaGFzKGluamVjdGFibGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBwcm92aWRlciwgZm9sbG93aW5nIGRlcHMgYXJlIHJlc29sdmVkIHJlY3Vyc2l2ZWx5XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlc29sdmUoXG4gICAgaW5qZWN0YWJsZTogSW5qZWN0YWJsZSxcbiAgICBvcHRpb25hbCA9IGZhbHNlLFxuICAgIHNlcXVlbmNlRGVwczogRGVwZW5kZW5jeVtdID0gW10sXG4gICkge1xuICAgIGxldCBwcm92aWRlciA9IHRoaXMucHJvdmlkZXJzLmdldChpbmplY3RhYmxlKTtcblxuICAgIGlmICghcHJvdmlkZXIgJiYgdGhpcy5wYXJlbnRDb250YWluZXI/LmhhcyhpbmplY3RhYmxlKSkge1xuICAgICAgcmV0dXJuIHRoaXMucGFyZW50Q29udGFpbmVyLmdldChpbmplY3RhYmxlKTtcbiAgICB9XG5cbiAgICBpZiAoIXByb3ZpZGVyICYmICFvcHRpb25hbCkge1xuICAgICAgdGhyb3cgbmV3IE1pc3NpbmdQcm92aWRlckVycm9yKGluamVjdGFibGUpO1xuICAgIH1cblxuICAgIHByb3ZpZGVyID0gcHJvdmlkZXIgPz8ge307XG5cbiAgICBpZiAocHJvdmlkZXIudmFsdWUpIHtcbiAgICAgIHJldHVybiBwcm92aWRlci52YWx1ZTtcbiAgICB9XG5cbiAgICBjb25zdCByZXNvbHZlZERlcHMgPSBbXSBhcyB1bmtub3duW107XG5cbiAgICBmb3IgKGNvbnN0IFtpbmRleCwgZGVwXSBvZiBwcm92aWRlci5kZXBzLmVudHJpZXMoKSkge1xuICAgICAgaWYgKCFkZXAuaWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWREZXBlbmRlbmN5RXJyb3IocHJvdmlkZXIudHlwZSA/PyBpbmplY3RhYmxlLCBwcm92aWRlci5kZXBzLCBpbmRleCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzZXF1ZW5jZURlcHMuZmluZChzZXFEZXAgPT4gc2VxRGVwID09PSBkZXApKSB7XG4gICAgICAgIHRocm93IG5ldyBSZWN1cnNpdmVEZXBlbmRlbmN5RXJyb3IocHJvdmlkZXIudHlwZSA/PyBpbmplY3RhYmxlLCBwcm92aWRlci5kZXBzLCBpbmRleCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRlcFByb3ZpZGVyID0gdGhpcy5wcm92aWRlcnMuZ2V0KGRlcC5pZCk7XG5cbiAgICAgIGlmIChkZXBQcm92aWRlcikge1xuICAgICAgICByZXNvbHZlZERlcHMucHVzaChhd2FpdCB0aGlzLnJlc29sdmUoZGVwLmlkLCBkZXAub3B0aW9uYWwsIFsuLi5zZXF1ZW5jZURlcHMsIC4uLnByb3ZpZGVyLmRlcHNdKSk7XG5cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnBhcmVudENvbnRhaW5lcj8uaGFzKGRlcC5pZCkpIHtcbiAgICAgICAgcmVzb2x2ZWREZXBzLnB1c2goYXdhaXQgdGhpcy5wYXJlbnRDb250YWluZXIuZ2V0KGRlcC5pZCkpO1xuXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWRlcC5vcHRpb25hbCkge1xuICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ0RlcGVuZGVuY3lFcnJvcihwcm92aWRlci50eXBlID8/IGluamVjdGFibGUsIHByb3ZpZGVyLmRlcHMsIGluZGV4KTtcbiAgICAgIH1cblxuICAgICAgcmVzb2x2ZWREZXBzLnB1c2godW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICBsZXQgdmFsdWU6IHVua25vd247XG5cbiAgICBpZiAocHJvdmlkZXIuZmFjdG9yeSkge1xuICAgICAgdmFsdWUgPSBhd2FpdCBwcm92aWRlci5mYWN0b3J5KC4uLnJlc29sdmVkRGVwcyk7XG4gICAgfVxuXG4gICAgaWYgKHByb3ZpZGVyLnR5cGUpIHtcbiAgICAgIHZhbHVlID0gbmV3IHByb3ZpZGVyLnR5cGUoLi4ucmVzb2x2ZWREZXBzKTtcbiAgICB9XG5cbiAgICB0aGlzLnByb3ZpZGVycy5zZXQoaW5qZWN0YWJsZSwgeyAuLi5wcm92aWRlciwgdmFsdWUgfSk7XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBwcml2YXRlIHJlZ2lzdGVyTXVsdGlQcm92aWRlcnMocHJvdmlkZXJzOiBQcm92aWRlcltdKSB7XG4gICAgcHJvdmlkZXJzLmZvckVhY2gocHJvdmlkZXIgPT4ge1xuICAgICAgY29uc3QgaW5qZWN0YWJsZUlkID0gbmV3IEluamVjdGlvblRva2VuKGluamVjdGFibGVUb1N0cmluZyhwcm92aWRlci5wcm92aWRlKSk7XG5cbiAgICAgIC8vIGNyZWF0ZXMgZGVwZW5kZW5jeSBwcm92aWRlciBmb3IgdGhlIG1haW4gcHJvdmlkZXJcbiAgICAgIHRoaXMucmVnaXN0ZXJTaW5nbGVQcm92aWRlcnMoW3sgLi4ucHJvdmlkZXIsIHByb3ZpZGU6IGluamVjdGFibGVJZCB9XSk7XG5cbiAgICAgIGNvbnN0IGNvbnRhaW5lclByb3ZpZGVyID0gdGhpcy5wcm92aWRlcnMuZ2V0KHByb3ZpZGVyLnByb3ZpZGUpO1xuXG4gICAgICBpZiAoY29udGFpbmVyUHJvdmlkZXIpIHtcbiAgICAgICAgcmV0dXJuIGNvbnRhaW5lclByb3ZpZGVyLmRlcHMucHVzaCh7IGlkOiBpbmplY3RhYmxlSWQgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIGNyZWF0ZXMgbWFpbiBwcm92aWRlciB0aGF0IHdpbGwgaG9sZCBhbGwgb3RoZXIgcHJvdmlkZXJzIGFzIGRlcHNcbiAgICAgIHRoaXMucmVnaXN0ZXJTaW5nbGVQcm92aWRlcnMoW3tcbiAgICAgICAgcHJvdmlkZTogcHJvdmlkZXIucHJvdmlkZSxcbiAgICAgICAgdXNlRmFjdG9yeTogKC4uLmRlcHMpID0+IGRlcHMsXG4gICAgICAgIGRlcHM6IFtpbmplY3RhYmxlSWRdLFxuICAgICAgfV0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3RlclNpbmdsZVByb3ZpZGVycyhwcm92aWRlcnM6IFByb3ZpZGVyW10pIHtcbiAgICBwcm92aWRlcnMuZm9yRWFjaChwcm92aWRlciA9PiB7XG4gICAgICBpZiAoKHByb3ZpZGVyIGFzIENsYXNzUHJvdmlkZXIpLnVzZUNsYXNzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlZ2lzdGVyQ2xhc3NQcm92aWRlcihwcm92aWRlciBhcyBDbGFzc1Byb3ZpZGVyKTtcbiAgICAgIH1cblxuICAgICAgaWYgKChwcm92aWRlciBhcyBGYWN0b3J5UHJvdmlkZXIpLnVzZUZhY3RvcnkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVnaXN0ZXJGYWN0b3J5UHJvdmlkZXIocHJvdmlkZXIgYXMgRmFjdG9yeVByb3ZpZGVyKTtcbiAgICAgIH1cblxuICAgICAgaWYgKChwcm92aWRlciBhcyBWYWx1ZVByb3ZpZGVyKS51c2VWYWx1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWdpc3RlclZhbHVlUHJvdmlkZXIocHJvdmlkZXIgYXMgVmFsdWVQcm92aWRlcik7XG4gICAgICB9XG5cbiAgICAgIGlmICgocHJvdmlkZXIgYXMgRXhpc3RpbmdQcm92aWRlcikudXNlRXhpc3RpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVnaXN0ZXJFeGlzdGluZ1Byb3ZpZGVyKHByb3ZpZGVyIGFzIEV4aXN0aW5nUHJvdmlkZXIpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3RlckNsYXNzUHJvdmlkZXIocHJvdmlkZXI6IENsYXNzUHJvdmlkZXIpIHtcbiAgICBjb25zdCBpZHMgPSBSZWZsZWN0LmdldE1ldGFkYXRhKERFUF9JRFNfTUVUQURBVEEsIHByb3ZpZGVyLnVzZUNsYXNzKSA/PyBbXTtcbiAgICBjb25zdCBvcHRpb25hbHMgPSBSZWZsZWN0LmdldE1ldGFkYXRhKE9QVElPTkFMX0RFUFNfTUVUQURBVEEsIHByb3ZpZGVyLnVzZUNsYXNzKSA/PyBbXTtcblxuICAgIHRoaXMucHJvdmlkZXJzLnNldChwcm92aWRlci5wcm92aWRlLCB7XG4gICAgICB0eXBlOiBwcm92aWRlci51c2VDbGFzcyxcbiAgICAgIGRlcHM6IGlkcy5tYXAoKGlkOiBJbmplY3RhYmxlLCBpbmRleDogbnVtYmVyKSA9PlxuICAgICAgICAoeyBpZCwgb3B0aW9uYWw6IG9wdGlvbmFsc1tpbmRleF0gfSksXG4gICAgICApLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3RlckZhY3RvcnlQcm92aWRlcihwcm92aWRlcjogRmFjdG9yeVByb3ZpZGVyKSB7XG4gICAgdGhpcy5wcm92aWRlcnMuc2V0KHByb3ZpZGVyLnByb3ZpZGUsIHtcbiAgICAgIGRlcHM6IHByb3ZpZGVyLmRlcHM/Lm1hcChpZCA9PiAoeyBpZCB9KSkgPz8gW10sXG4gICAgICBmYWN0b3J5OiBwcm92aWRlci51c2VGYWN0b3J5LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3RlclZhbHVlUHJvdmlkZXIocHJvdmlkZXI6IFZhbHVlUHJvdmlkZXIpIHtcbiAgICB0aGlzLnByb3ZpZGVycy5zZXQocHJvdmlkZXIucHJvdmlkZSwge1xuICAgICAgdmFsdWU6IHByb3ZpZGVyLnVzZVZhbHVlLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3RlckV4aXN0aW5nUHJvdmlkZXIocHJvdmlkZXI6IEV4aXN0aW5nUHJvdmlkZXIpIHtcbiAgICB0aGlzLnJlZ2lzdGVyRmFjdG9yeVByb3ZpZGVyKHtcbiAgICAgIHByb3ZpZGU6IHByb3ZpZGVyLnByb3ZpZGUsXG4gICAgICBkZXBzOiBbcHJvdmlkZXIudXNlRXhpc3RpbmddLFxuICAgICAgdXNlRmFjdG9yeTogKGV4aXN0aW5nOiB1bmtub3duKSA9PiBleGlzdGluZyxcbiAgICB9KTtcbiAgfVxufVxuIl19