1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | const logger_service_1 = require("@nestjs/common/services/logger.service");
|
4 | const load_package_util_1 = require("@nestjs/common/utils/load-package.util");
|
5 | const shared_utils_1 = require("@nestjs/common/utils/shared.utils");
|
6 | const application_config_1 = require("./application-config");
|
7 | const constants_1 = require("./constants");
|
8 | const exceptions_zone_1 = require("./errors/exceptions-zone");
|
9 | const load_adapter_1 = require("./helpers/load-adapter");
|
10 | const container_1 = require("./injector/container");
|
11 | const instance_loader_1 = require("./injector/instance-loader");
|
12 | const metadata_scanner_1 = require("./metadata-scanner");
|
13 | const nest_application_1 = require("./nest-application");
|
14 | const nest_application_context_1 = require("./nest-application-context");
|
15 | const scanner_1 = require("./scanner");
|
16 |
|
17 |
|
18 |
|
19 | class NestFactoryStatic {
|
20 | constructor() {
|
21 | this.logger = new logger_service_1.Logger('NestFactory', true);
|
22 | }
|
23 | async create(module, serverOrOptions, options) {
|
24 | const [httpServer, appOptions] = this.isHttpServer(serverOrOptions)
|
25 | ? [serverOrOptions, options]
|
26 | : [this.createHttpAdapter(), serverOrOptions];
|
27 | const applicationConfig = new application_config_1.ApplicationConfig();
|
28 | const container = new container_1.NestContainer(applicationConfig);
|
29 | this.applyLogger(appOptions);
|
30 | await this.initialize(module, container, applicationConfig, httpServer);
|
31 | const instance = new nest_application_1.NestApplication(container, httpServer, applicationConfig, appOptions);
|
32 | const target = this.createNestInstance(instance);
|
33 | return this.createAdapterProxy(target, httpServer);
|
34 | }
|
35 | |
36 |
|
37 |
|
38 |
|
39 |
|
40 |
|
41 |
|
42 |
|
43 |
|
44 | async createMicroservice(module, options) {
|
45 | const { NestMicroservice } = load_package_util_1.loadPackage('@nestjs/microservices', 'NestFactory', () => require('@nestjs/microservices'));
|
46 | const applicationConfig = new application_config_1.ApplicationConfig();
|
47 | const container = new container_1.NestContainer(applicationConfig);
|
48 | this.applyLogger(options);
|
49 | await this.initialize(module, container, applicationConfig);
|
50 | return this.createNestInstance(new NestMicroservice(container, options, applicationConfig));
|
51 | }
|
52 | |
53 |
|
54 |
|
55 |
|
56 |
|
57 |
|
58 |
|
59 |
|
60 |
|
61 | async createApplicationContext(module, options) {
|
62 | const container = new container_1.NestContainer();
|
63 | this.applyLogger(options);
|
64 | await this.initialize(module, container);
|
65 | const modules = container.getModules().values();
|
66 | const root = modules.next().value;
|
67 | const context = this.createNestInstance(new nest_application_context_1.NestApplicationContext(container, [], root));
|
68 | return context.init();
|
69 | }
|
70 | createNestInstance(instance) {
|
71 | return this.createProxy(instance);
|
72 | }
|
73 | async initialize(module, container, config = new application_config_1.ApplicationConfig(), httpServer = null) {
|
74 | const instanceLoader = new instance_loader_1.InstanceLoader(container);
|
75 | const dependenciesScanner = new scanner_1.DependenciesScanner(container, new metadata_scanner_1.MetadataScanner(), config);
|
76 | container.setHttpAdapter(httpServer);
|
77 | try {
|
78 | this.logger.log(constants_1.MESSAGES.APPLICATION_START);
|
79 | await exceptions_zone_1.ExceptionsZone.asyncRun(async () => {
|
80 | await dependenciesScanner.scan(module);
|
81 | await instanceLoader.createInstancesOfDependencies();
|
82 | dependenciesScanner.applyApplicationProviders();
|
83 | });
|
84 | }
|
85 | catch (e) {
|
86 | process.abort();
|
87 | }
|
88 | }
|
89 | createProxy(target) {
|
90 | const proxy = this.createExceptionProxy();
|
91 | return new Proxy(target, {
|
92 | get: proxy,
|
93 | set: proxy,
|
94 | });
|
95 | }
|
96 | createExceptionProxy() {
|
97 | return (receiver, prop) => {
|
98 | if (!(prop in receiver)) {
|
99 | return;
|
100 | }
|
101 | if (shared_utils_1.isFunction(receiver[prop])) {
|
102 | return this.createExceptionZone(receiver, prop);
|
103 | }
|
104 | return receiver[prop];
|
105 | };
|
106 | }
|
107 | createExceptionZone(receiver, prop) {
|
108 | return (...args) => {
|
109 | let result;
|
110 | exceptions_zone_1.ExceptionsZone.run(() => {
|
111 | result = receiver[prop](...args);
|
112 | });
|
113 | return result;
|
114 | };
|
115 | }
|
116 | applyLogger(options) {
|
117 | if (!options) {
|
118 | return;
|
119 | }
|
120 | !shared_utils_1.isNil(options.logger) && logger_service_1.Logger.overrideLogger(options.logger);
|
121 | }
|
122 | createHttpAdapter(httpServer) {
|
123 | const { ExpressAdapter } = load_adapter_1.loadAdapter('@nestjs/platform-express', 'HTTP', () => require('@nestjs/platform-express'));
|
124 | return new ExpressAdapter(httpServer);
|
125 | }
|
126 | isHttpServer(serverOrOptions) {
|
127 | return !!(serverOrOptions && serverOrOptions.patch);
|
128 | }
|
129 | createAdapterProxy(app, adapter) {
|
130 | return new Proxy(app, {
|
131 | get: (receiver, prop) => {
|
132 | if (!(prop in receiver) && prop in adapter) {
|
133 | return this.createExceptionZone(adapter, prop);
|
134 | }
|
135 | return receiver[prop];
|
136 | },
|
137 | });
|
138 | }
|
139 | }
|
140 | exports.NestFactoryStatic = NestFactoryStatic;
|
141 |
|
142 |
|
143 |
|
144 |
|
145 |
|
146 |
|
147 |
|
148 |
|
149 |
|
150 |
|
151 |
|
152 |
|
153 |
|
154 | exports.NestFactory = new NestFactoryStatic();
|