UNPKG

5.12 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3exports.TestingModuleBuilder = void 0;
4const common_1 = require("@nestjs/common");
5const application_config_1 = require("@nestjs/core/application-config");
6const container_1 = require("@nestjs/core/injector/container");
7const graph_inspector_1 = require("@nestjs/core/inspector/graph-inspector");
8const noop_graph_inspector_1 = require("@nestjs/core/inspector/noop-graph-inspector");
9const uuid_factory_1 = require("@nestjs/core/inspector/uuid-factory");
10const scanner_1 = require("@nestjs/core/scanner");
11const testing_logger_service_1 = require("./services/testing-logger.service");
12const testing_injector_1 = require("./testing-injector");
13const testing_instance_loader_1 = require("./testing-instance-loader");
14const testing_module_1 = require("./testing-module");
15/**
16 * @publicApi
17 */
18class TestingModuleBuilder {
19 constructor(metadataScanner, metadata) {
20 this.metadataScanner = metadataScanner;
21 this.applicationConfig = new application_config_1.ApplicationConfig();
22 this.container = new container_1.NestContainer(this.applicationConfig);
23 this.overloadsMap = new Map();
24 this.moduleOverloadsMap = new Map();
25 this.module = this.createModule(metadata);
26 }
27 setLogger(testingLogger) {
28 this.testingLogger = testingLogger;
29 return this;
30 }
31 overridePipe(typeOrToken) {
32 return this.override(typeOrToken, false);
33 }
34 useMocker(mocker) {
35 this.mocker = mocker;
36 return this;
37 }
38 overrideFilter(typeOrToken) {
39 return this.override(typeOrToken, false);
40 }
41 overrideGuard(typeOrToken) {
42 return this.override(typeOrToken, false);
43 }
44 overrideInterceptor(typeOrToken) {
45 return this.override(typeOrToken, false);
46 }
47 overrideProvider(typeOrToken) {
48 return this.override(typeOrToken, true);
49 }
50 overrideModule(moduleToOverride) {
51 return {
52 useModule: newModule => {
53 this.moduleOverloadsMap.set(moduleToOverride, newModule);
54 return this;
55 },
56 };
57 }
58 async compile(options = {}) {
59 this.applyLogger();
60 let graphInspector;
61 if (options?.snapshot) {
62 graphInspector = new graph_inspector_1.GraphInspector(this.container);
63 uuid_factory_1.UuidFactory.mode = uuid_factory_1.UuidFactoryMode.Deterministic;
64 }
65 else {
66 graphInspector = noop_graph_inspector_1.NoopGraphInspector;
67 uuid_factory_1.UuidFactory.mode = uuid_factory_1.UuidFactoryMode.Random;
68 }
69 const scanner = new scanner_1.DependenciesScanner(this.container, this.metadataScanner, graphInspector, this.applicationConfig);
70 await scanner.scan(this.module, {
71 overrides: this.getModuleOverloads(),
72 });
73 this.applyOverloadsMap();
74 await this.createInstancesOfDependencies(graphInspector, options);
75 scanner.applyApplicationProviders();
76 const root = this.getRootModule();
77 return new testing_module_1.TestingModule(this.container, graphInspector, root, this.applicationConfig);
78 }
79 override(typeOrToken, isProvider) {
80 const addOverload = (options) => {
81 this.overloadsMap.set(typeOrToken, {
82 ...options,
83 isProvider,
84 });
85 return this;
86 };
87 return this.createOverrideByBuilder(addOverload);
88 }
89 createOverrideByBuilder(add) {
90 return {
91 useValue: value => add({ useValue: value }),
92 useFactory: (options) => add({ ...options, useFactory: options.factory }),
93 useClass: metatype => add({ useClass: metatype }),
94 };
95 }
96 applyOverloadsMap() {
97 const overloads = [...this.overloadsMap.entries()];
98 overloads.forEach(([item, options]) => {
99 this.container.replace(item, options);
100 });
101 }
102 getModuleOverloads() {
103 const overloads = [...this.moduleOverloadsMap.entries()];
104 return overloads.map(([moduleToReplace, newModule]) => ({
105 moduleToReplace,
106 newModule,
107 }));
108 }
109 getRootModule() {
110 const modules = this.container.getModules().values();
111 return modules.next().value;
112 }
113 async createInstancesOfDependencies(graphInspector, options) {
114 const injector = new testing_injector_1.TestingInjector({
115 preview: options?.preview ?? false,
116 });
117 const instanceLoader = new testing_instance_loader_1.TestingInstanceLoader(this.container, injector, graphInspector);
118 await instanceLoader.createInstancesOfDependencies(this.container.getModules(), this.mocker);
119 }
120 createModule(metadata) {
121 class RootTestModule {
122 }
123 (0, common_1.Module)(metadata)(RootTestModule);
124 return RootTestModule;
125 }
126 applyLogger() {
127 common_1.Logger.overrideLogger(this.testingLogger || new testing_logger_service_1.TestingLogger());
128 }
129}
130exports.TestingModuleBuilder = TestingModuleBuilder;