1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | exports.InstanceLoader = void 0;
|
4 | const common_1 = require("@nestjs/common");
|
5 | const messages_1 = require("../helpers/messages");
|
6 | const injector_1 = require("./injector");
|
7 | const internal_core_module_1 = require("./internal-core-module");
|
8 | class InstanceLoader {
|
9 | constructor(container, logger = new common_1.Logger(InstanceLoader.name, {
|
10 | timestamp: true,
|
11 | })) {
|
12 | this.container = container;
|
13 | this.logger = logger;
|
14 | this.injector = new injector_1.Injector();
|
15 | }
|
16 | async createInstancesOfDependencies(modules = this.container.getModules()) {
|
17 | this.createPrototypes(modules);
|
18 | await this.createInstances(modules);
|
19 | }
|
20 | createPrototypes(modules) {
|
21 | modules.forEach(moduleRef => {
|
22 | this.createPrototypesOfProviders(moduleRef);
|
23 | this.createPrototypesOfInjectables(moduleRef);
|
24 | this.createPrototypesOfControllers(moduleRef);
|
25 | });
|
26 | }
|
27 | async createInstances(modules) {
|
28 | await Promise.all([...modules.values()].map(async (moduleRef) => {
|
29 | await this.createInstancesOfProviders(moduleRef);
|
30 | await this.createInstancesOfInjectables(moduleRef);
|
31 | await this.createInstancesOfControllers(moduleRef);
|
32 | const { name } = moduleRef.metatype;
|
33 | this.isModuleWhitelisted(name) &&
|
34 | this.logger.log((0, messages_1.MODULE_INIT_MESSAGE) `${name}`);
|
35 | }));
|
36 | }
|
37 | createPrototypesOfProviders(moduleRef) {
|
38 | const { providers } = moduleRef;
|
39 | providers.forEach(wrapper => this.injector.loadPrototype(wrapper, providers));
|
40 | }
|
41 | async createInstancesOfProviders(moduleRef) {
|
42 | const { providers } = moduleRef;
|
43 | const wrappers = [...providers.values()];
|
44 | await Promise.all(wrappers.map(item => this.injector.loadProvider(item, moduleRef)));
|
45 | }
|
46 | createPrototypesOfControllers(moduleRef) {
|
47 | const { controllers } = moduleRef;
|
48 | controllers.forEach(wrapper => this.injector.loadPrototype(wrapper, controllers));
|
49 | }
|
50 | async createInstancesOfControllers(moduleRef) {
|
51 | const { controllers } = moduleRef;
|
52 | const wrappers = [...controllers.values()];
|
53 | await Promise.all(wrappers.map(item => this.injector.loadController(item, moduleRef)));
|
54 | }
|
55 | createPrototypesOfInjectables(moduleRef) {
|
56 | const { injectables } = moduleRef;
|
57 | injectables.forEach(wrapper => this.injector.loadPrototype(wrapper, injectables));
|
58 | }
|
59 | async createInstancesOfInjectables(moduleRef) {
|
60 | const { injectables } = moduleRef;
|
61 | const wrappers = [...injectables.values()];
|
62 | await Promise.all(wrappers.map(item => this.injector.loadInjectable(item, moduleRef)));
|
63 | }
|
64 | isModuleWhitelisted(name) {
|
65 | return name !== internal_core_module_1.InternalCoreModule.name;
|
66 | }
|
67 | }
|
68 | exports.InstanceLoader = InstanceLoader;
|