UNPKG

3.03 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3const interfaces_1 = require("@nestjs/common/interfaces");
4const shared_utils_1 = require("@nestjs/common/utils/shared.utils");
5const invalid_class_scope_exception_1 = require("../errors/exceptions/invalid-class-scope.exception");
6const unknown_element_exception_1 = require("../errors/exceptions/unknown-element.exception");
7class ContainerScanner {
8 constructor(container) {
9 this.container = container;
10 }
11 find(typeOrToken) {
12 this.initFlatContainer();
13 return this.findInstanceByToken(typeOrToken, this.flatContainer);
14 }
15 getWrapperCollectionPair(typeOrToken) {
16 this.initFlatContainer();
17 return this.getWrapperCollectionPairByHost(typeOrToken, this.flatContainer);
18 }
19 findInstanceByToken(metatypeOrToken, contextModule) {
20 const [instanceWrapper] = this.getWrapperCollectionPairByHost(metatypeOrToken, contextModule);
21 if (instanceWrapper.scope === interfaces_1.Scope.REQUEST ||
22 instanceWrapper.scope === interfaces_1.Scope.TRANSIENT) {
23 throw new invalid_class_scope_exception_1.InvalidClassScopeException(metatypeOrToken);
24 }
25 return instanceWrapper.instance;
26 }
27 getWrapperCollectionPairByHost(metatypeOrToken, contextModule) {
28 const name = shared_utils_1.isFunction(metatypeOrToken)
29 ? metatypeOrToken.name
30 : metatypeOrToken;
31 const collectionName = this.getHostCollection(name, contextModule);
32 const instanceWrapper = contextModule[collectionName].get(name);
33 if (!instanceWrapper) {
34 throw new unknown_element_exception_1.UnknownElementException(name && name.toString());
35 }
36 return [
37 instanceWrapper,
38 contextModule[collectionName],
39 ];
40 }
41 initFlatContainer() {
42 if (this.flatContainer) {
43 return;
44 }
45 const modules = this.container.getModules();
46 const initialValue = {
47 providers: [],
48 controllers: [],
49 injectables: [],
50 };
51 const merge = (initial, arr) => [...initial, ...arr];
52 const partialModule = [...modules.values()].reduce((current, next) => ({
53 providers: merge(current.providers, next.providers),
54 controllers: merge(current.controllers, next.controllers),
55 injectables: merge(current.injectables, next.injectables),
56 }), initialValue);
57 this.flatContainer = {
58 providers: new Map(partialModule.providers),
59 controllers: new Map(partialModule.controllers),
60 injectables: new Map(partialModule.injectables),
61 };
62 }
63 getHostCollection(token, { providers, controllers }) {
64 if (providers.has(token)) {
65 return 'providers';
66 }
67 if (controllers.has(token)) {
68 return 'controllers';
69 }
70 return 'injectables';
71 }
72}
73exports.ContainerScanner = ContainerScanner;