mirror of
https://github.com/nestjs/nest.git
synced 2026-02-21 23:11:44 +00:00
refactor: introduce noop inspector
This commit is contained in:
@@ -37,4 +37,11 @@ export class NestApplicationContextOptions {
|
||||
* @default false
|
||||
*/
|
||||
preview?: boolean;
|
||||
|
||||
/**
|
||||
* Whether to generate a serialized graph snapshot.
|
||||
*
|
||||
* @default false
|
||||
*/
|
||||
snapshot?: boolean;
|
||||
}
|
||||
|
||||
5
packages/core/inspector/noop-graph-inspector.ts
Normal file
5
packages/core/inspector/noop-graph-inspector.ts
Normal file
@@ -0,0 +1,5 @@
|
||||
import { GraphInspector } from './graph-inspector';
|
||||
|
||||
export const NoopGraphInspector: GraphInspector = Object.create(
|
||||
GraphInspector.prototype,
|
||||
);
|
||||
@@ -20,6 +20,7 @@ import { NestContainer } from './injector/container';
|
||||
import { Injector } from './injector/injector';
|
||||
import { InstanceLoader } from './injector/instance-loader';
|
||||
import { GraphInspector } from './inspector/graph-inspector';
|
||||
import { NoopGraphInspector } from './inspector/noop-graph-inspector';
|
||||
import { MetadataScanner } from './metadata-scanner';
|
||||
import { NestApplication } from './nest-application';
|
||||
import { NestApplicationContext } from './nest-application-context';
|
||||
@@ -75,7 +76,7 @@ export class NestFactoryStatic {
|
||||
|
||||
const applicationConfig = new ApplicationConfig();
|
||||
const container = new NestContainer(applicationConfig);
|
||||
const graphInspector = new GraphInspector(container);
|
||||
const graphInspector = this.createGraphInspector(appOptions, container);
|
||||
|
||||
this.setAbortOnError(serverOrOptions, options);
|
||||
this.registerLoggerConfiguration(appOptions);
|
||||
@@ -120,7 +121,7 @@ export class NestFactoryStatic {
|
||||
);
|
||||
const applicationConfig = new ApplicationConfig();
|
||||
const container = new NestContainer(applicationConfig);
|
||||
const graphInspector = new GraphInspector(container);
|
||||
const graphInspector = this.createGraphInspector(options, container);
|
||||
|
||||
this.setAbortOnError(options);
|
||||
this.registerLoggerConfiguration(options);
|
||||
@@ -156,7 +157,7 @@ export class NestFactoryStatic {
|
||||
options?: NestApplicationContextOptions,
|
||||
): Promise<INestApplicationContext> {
|
||||
const container = new NestContainer();
|
||||
const graphInspector = new GraphInspector(container);
|
||||
const graphInspector = this.createGraphInspector(options, container);
|
||||
|
||||
this.setAbortOnError(options);
|
||||
this.registerLoggerConfiguration(options);
|
||||
@@ -341,6 +342,15 @@ export class NestFactoryStatic {
|
||||
});
|
||||
return proxy as unknown as T;
|
||||
}
|
||||
|
||||
private createGraphInspector(
|
||||
appOptions: NestApplicationContextOptions,
|
||||
container: NestContainer,
|
||||
) {
|
||||
return appOptions?.snapshot
|
||||
? new GraphInspector(container)
|
||||
: NoopGraphInspector;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -2,9 +2,11 @@ import { Logger, LoggerService, Module } from '@nestjs/common';
|
||||
import { ModuleMetadata } from '@nestjs/common/interfaces';
|
||||
import { ApplicationConfig } from '@nestjs/core/application-config';
|
||||
import { NestContainer } from '@nestjs/core/injector/container';
|
||||
import { GraphInspector } from '@nestjs/core/inspector/graph-inspector';
|
||||
import { MetadataScanner } from '@nestjs/core/metadata-scanner';
|
||||
import { DependenciesScanner } from '@nestjs/core/scanner';
|
||||
import { NestApplicationContextOptions } from '../common/interfaces/nest-application-context-options.interface';
|
||||
import { GraphInspector } from '../core/inspector/graph-inspector';
|
||||
import { NoopGraphInspector } from '../core/inspector/noop-graph-inspector';
|
||||
import {
|
||||
MockFactory,
|
||||
OverrideBy,
|
||||
@@ -18,26 +20,16 @@ import { TestingModule } from './testing-module';
|
||||
export class TestingModuleBuilder {
|
||||
private readonly applicationConfig = new ApplicationConfig();
|
||||
private readonly container = new NestContainer(this.applicationConfig);
|
||||
private readonly graphInspector = new GraphInspector(this.container);
|
||||
private readonly injector = new TestingInjector();
|
||||
private readonly overloadsMap = new Map();
|
||||
private readonly instanceLoader = new TestingInstanceLoader(
|
||||
this.container,
|
||||
this.injector,
|
||||
this.graphInspector,
|
||||
);
|
||||
private readonly scanner: DependenciesScanner;
|
||||
private readonly module: any;
|
||||
private testingLogger: LoggerService;
|
||||
private mocker?: MockFactory;
|
||||
|
||||
constructor(metadataScanner: MetadataScanner, metadata: ModuleMetadata) {
|
||||
this.scanner = new DependenciesScanner(
|
||||
this.container,
|
||||
metadataScanner,
|
||||
this.graphInspector,
|
||||
this.applicationConfig,
|
||||
);
|
||||
constructor(
|
||||
private readonly metadataScanner: MetadataScanner,
|
||||
metadata: ModuleMetadata,
|
||||
) {
|
||||
this.module = this.createModule(metadata);
|
||||
}
|
||||
|
||||
@@ -71,19 +63,44 @@ export class TestingModuleBuilder {
|
||||
return this.override(typeOrToken, true);
|
||||
}
|
||||
|
||||
public async compile(): Promise<TestingModule> {
|
||||
public async compile(
|
||||
options: Pick<NestApplicationContextOptions, 'snapshot'> = {},
|
||||
): Promise<TestingModule> {
|
||||
this.applyLogger();
|
||||
await this.scanner.scan(this.module);
|
||||
|
||||
const graphInspector = options?.snapshot
|
||||
? NoopGraphInspector
|
||||
: new GraphInspector(this.container);
|
||||
|
||||
const scanner = new DependenciesScanner(
|
||||
this.container,
|
||||
this.metadataScanner,
|
||||
graphInspector,
|
||||
this.applicationConfig,
|
||||
);
|
||||
await scanner.scan(this.module);
|
||||
|
||||
this.applyOverloadsMap();
|
||||
await this.instanceLoader.createInstancesOfDependencies(
|
||||
|
||||
const instanceLoader = new TestingInstanceLoader(
|
||||
this.container,
|
||||
this.injector,
|
||||
graphInspector,
|
||||
);
|
||||
await instanceLoader.createInstancesOfDependencies(
|
||||
this.container.getModules(),
|
||||
this.mocker,
|
||||
);
|
||||
this.scanner.applyApplicationProviders();
|
||||
|
||||
scanner.applyApplicationProviders();
|
||||
|
||||
const root = this.getRootModule();
|
||||
return new TestingModule(this.container, [], root, this.applicationConfig);
|
||||
return new TestingModule(
|
||||
this.container,
|
||||
graphInspector,
|
||||
root,
|
||||
this.applicationConfig,
|
||||
);
|
||||
}
|
||||
|
||||
private override<T = any>(typeOrToken: T, isProvider: boolean): OverrideBy {
|
||||
|
||||
@@ -21,16 +21,19 @@ import { Module } from '@nestjs/core/injector/module';
|
||||
import { GraphInspector } from '@nestjs/core/inspector/graph-inspector';
|
||||
|
||||
export class TestingModule extends NestApplicationContext {
|
||||
protected readonly graphInspector = new GraphInspector(this.container);
|
||||
protected readonly graphInspector: GraphInspector;
|
||||
|
||||
constructor(
|
||||
container: NestContainer,
|
||||
scope: Type<any>[],
|
||||
graphInspector: GraphInspector,
|
||||
contextModule: Module,
|
||||
private readonly applicationConfig: ApplicationConfig,
|
||||
scope: Type<any>[] = [],
|
||||
) {
|
||||
const options = {};
|
||||
super(container, options, contextModule, scope);
|
||||
|
||||
this.graphInspector = graphInspector;
|
||||
}
|
||||
|
||||
private isHttpServer(
|
||||
|
||||
Reference in New Issue
Block a user