mirror of
https://github.com/nestjs/nest.git
synced 2026-02-21 23:11:44 +00:00
96 lines
3.0 KiB
TypeScript
96 lines
3.0 KiB
TypeScript
import { Logger } from '@nestjs/common';
|
|
import { Controller } from '@nestjs/common/interfaces/controllers/controller.interface';
|
|
import { Injectable } from '@nestjs/common/interfaces/injectable.interface';
|
|
import { MODULE_INIT_MESSAGE } from '../helpers/messages';
|
|
import { NestContainer } from './container';
|
|
import { Injector } from './injector';
|
|
import { InternalCoreModule } from './internal-core-module';
|
|
import { Module } from './module';
|
|
|
|
export class InstanceLoader {
|
|
private readonly injector = new Injector();
|
|
private readonly logger = new Logger(InstanceLoader.name, {
|
|
timestamp: true,
|
|
});
|
|
|
|
constructor(private readonly container: NestContainer) {}
|
|
|
|
public async createInstancesOfDependencies() {
|
|
const modules = this.container.getModules();
|
|
|
|
this.createPrototypes(modules);
|
|
await this.createInstances(modules);
|
|
}
|
|
|
|
private createPrototypes(modules: Map<string, Module>) {
|
|
modules.forEach(moduleRef => {
|
|
this.createPrototypesOfProviders(moduleRef);
|
|
this.createPrototypesOfInjectables(moduleRef);
|
|
this.createPrototypesOfControllers(moduleRef);
|
|
});
|
|
}
|
|
|
|
private async createInstances(modules: Map<string, Module>) {
|
|
await Promise.all(
|
|
[...modules.values()].map(async moduleRef => {
|
|
await this.createInstancesOfProviders(moduleRef);
|
|
await this.createInstancesOfInjectables(moduleRef);
|
|
await this.createInstancesOfControllers(moduleRef);
|
|
|
|
const { name } = moduleRef.metatype;
|
|
this.isModuleWhitelisted(name) &&
|
|
this.logger.log(MODULE_INIT_MESSAGE`${name}`);
|
|
}),
|
|
);
|
|
}
|
|
|
|
private createPrototypesOfProviders(moduleRef: Module) {
|
|
const { providers } = moduleRef;
|
|
providers.forEach(wrapper =>
|
|
this.injector.loadPrototype<Injectable>(wrapper, providers),
|
|
);
|
|
}
|
|
|
|
private async createInstancesOfProviders(moduleRef: Module) {
|
|
const { providers } = moduleRef;
|
|
const wrappers = [...providers.values()];
|
|
await Promise.all(
|
|
wrappers.map(item => this.injector.loadProvider(item, moduleRef)),
|
|
);
|
|
}
|
|
|
|
private createPrototypesOfControllers(moduleRef: Module) {
|
|
const { controllers } = moduleRef;
|
|
controllers.forEach(wrapper =>
|
|
this.injector.loadPrototype<Controller>(wrapper, controllers),
|
|
);
|
|
}
|
|
|
|
private async createInstancesOfControllers(moduleRef: Module) {
|
|
const { controllers } = moduleRef;
|
|
const wrappers = [...controllers.values()];
|
|
await Promise.all(
|
|
wrappers.map(item => this.injector.loadController(item, moduleRef)),
|
|
);
|
|
}
|
|
|
|
private createPrototypesOfInjectables(moduleRef: Module) {
|
|
const { injectables } = moduleRef;
|
|
injectables.forEach(wrapper =>
|
|
this.injector.loadPrototype(wrapper, injectables),
|
|
);
|
|
}
|
|
|
|
private async createInstancesOfInjectables(moduleRef: Module) {
|
|
const { injectables } = moduleRef;
|
|
const wrappers = [...injectables.values()];
|
|
await Promise.all(
|
|
wrappers.map(item => this.injector.loadInjectable(item, moduleRef)),
|
|
);
|
|
}
|
|
|
|
private isModuleWhitelisted(name: string): boolean {
|
|
return name !== InternalCoreModule.name;
|
|
}
|
|
}
|