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/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 | setLogger(logger) {
|
17 | this.logger = logger;
|
18 | }
|
19 | async createInstancesOfDependencies(modules = this.container.getModules()) {
|
20 | this.createPrototypes(modules);
|
21 | await this.createInstances(modules);
|
22 | }
|
23 | createPrototypes(modules) {
|
24 | modules.forEach(moduleRef => {
|
25 | this.createPrototypesOfProviders(moduleRef);
|
26 | this.createPrototypesOfInjectables(moduleRef);
|
27 | this.createPrototypesOfControllers(moduleRef);
|
28 | });
|
29 | }
|
30 | async createInstances(modules) {
|
31 | await Promise.all([...modules.values()].map(async (moduleRef) => {
|
32 | await this.createInstancesOfProviders(moduleRef);
|
33 | await this.createInstancesOfInjectables(moduleRef);
|
34 | await this.createInstancesOfControllers(moduleRef);
|
35 | const { name } = moduleRef.metatype;
|
36 | this.isModuleWhitelisted(name) &&
|
37 | this.logger.log((0, messages_1.MODULE_INIT_MESSAGE) `${name}`);
|
38 | }));
|
39 | }
|
40 | createPrototypesOfProviders(moduleRef) {
|
41 | const { providers } = moduleRef;
|
42 | providers.forEach(wrapper => this.injector.loadPrototype(wrapper, providers));
|
43 | }
|
44 | async createInstancesOfProviders(moduleRef) {
|
45 | const { providers } = moduleRef;
|
46 | const wrappers = [...providers.values()];
|
47 | await Promise.all(wrappers.map(item => this.injector.loadProvider(item, moduleRef)));
|
48 | }
|
49 | createPrototypesOfControllers(moduleRef) {
|
50 | const { controllers } = moduleRef;
|
51 | controllers.forEach(wrapper => this.injector.loadPrototype(wrapper, controllers));
|
52 | }
|
53 | async createInstancesOfControllers(moduleRef) {
|
54 | const { controllers } = moduleRef;
|
55 | const wrappers = [...controllers.values()];
|
56 | await Promise.all(wrappers.map(item => this.injector.loadController(item, moduleRef)));
|
57 | }
|
58 | createPrototypesOfInjectables(moduleRef) {
|
59 | const { injectables } = moduleRef;
|
60 | injectables.forEach(wrapper => this.injector.loadPrototype(wrapper, injectables));
|
61 | }
|
62 | async createInstancesOfInjectables(moduleRef) {
|
63 | const { injectables } = moduleRef;
|
64 | const wrappers = [...injectables.values()];
|
65 | await Promise.all(wrappers.map(item => this.injector.loadInjectable(item, moduleRef)));
|
66 | }
|
67 | isModuleWhitelisted(name) {
|
68 | return name !== internal_core_module_1.InternalCoreModule.name;
|
69 | }
|
70 | }
|
71 | exports.InstanceLoader = InstanceLoader;
|