refactor: introduce noop inspector

This commit is contained in:
Kamil Myśliwiec
2023-01-11 19:28:06 +01:00
parent 38f55a1cff
commit 70473fe81a
5 changed files with 67 additions and 25 deletions

View File

@@ -37,4 +37,11 @@ export class NestApplicationContextOptions {
* @default false
*/
preview?: boolean;
/**
* Whether to generate a serialized graph snapshot.
*
* @default false
*/
snapshot?: boolean;
}

View File

@@ -0,0 +1,5 @@
import { GraphInspector } from './graph-inspector';
export const NoopGraphInspector: GraphInspector = Object.create(
GraphInspector.prototype,
);

View File

@@ -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;
}
}
/**

View File

@@ -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 {

View File

@@ -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(