1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | exports.TestingModuleBuilder = void 0;
|
4 | const common_1 = require("@nestjs/common");
|
5 | const application_config_1 = require("@nestjs/core/application-config");
|
6 | const container_1 = require("@nestjs/core/injector/container");
|
7 | const graph_inspector_1 = require("@nestjs/core/inspector/graph-inspector");
|
8 | const noop_graph_inspector_1 = require("@nestjs/core/inspector/noop-graph-inspector");
|
9 | const uuid_factory_1 = require("@nestjs/core/inspector/uuid-factory");
|
10 | const scanner_1 = require("@nestjs/core/scanner");
|
11 | const testing_logger_service_1 = require("./services/testing-logger.service");
|
12 | const testing_injector_1 = require("./testing-injector");
|
13 | const testing_instance_loader_1 = require("./testing-instance-loader");
|
14 | const testing_module_1 = require("./testing-module");
|
15 |
|
16 |
|
17 |
|
18 | class 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 | }
|
130 | exports.TestingModuleBuilder = TestingModuleBuilder;
|