1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | const interfaces_1 = require("@nestjs/common/interfaces");
|
4 | const shared_utils_1 = require("@nestjs/common/utils/shared.utils");
|
5 | const invalid_class_scope_exception_1 = require("../errors/exceptions/invalid-class-scope.exception");
|
6 | const unknown_element_exception_1 = require("../errors/exceptions/unknown-element.exception");
|
7 | class 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 | }
|
73 | exports.ContainerScanner = ContainerScanner;
|