UNPKG

8.96 kBJavaScriptView Raw
1"use strict";
2var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3 var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4 if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5 else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6 return c > 3 && r && Object.defineProperty(target, key, r), r;
7};
8var __metadata = (this && this.__metadata) || function (k, v) {
9 if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10};
11var __param = (this && this.__param) || function (paramIndex, decorator) {
12 return function (target, key) { decorator(target, key, paramIndex); }
13};
14var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
15 function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
16 return new (P || (P = Promise))(function (resolve, reject) {
17 function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
18 function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
19 function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
20 step((generator = generator.apply(thisArg, _arguments || [])).next());
21 });
22};
23var TypeOrmCoreModule_1;
24Object.defineProperty(exports, "__esModule", { value: true });
25exports.TypeOrmCoreModule = void 0;
26const common_1 = require("@nestjs/common");
27const core_1 = require("@nestjs/core");
28const rxjs_1 = require("rxjs");
29const typeorm_1 = require("typeorm");
30const typeorm_utils_1 = require("./common/typeorm.utils");
31const entities_metadata_storage_1 = require("./entities-metadata.storage");
32const typeorm_constants_1 = require("./typeorm.constants");
33let TypeOrmCoreModule = TypeOrmCoreModule_1 = class TypeOrmCoreModule {
34 constructor(options, moduleRef) {
35 this.options = options;
36 this.moduleRef = moduleRef;
37 this.logger = new common_1.Logger('TypeOrmModule');
38 }
39 static forRoot(options = {}) {
40 const typeOrmModuleOptions = {
41 provide: typeorm_constants_1.TYPEORM_MODULE_OPTIONS,
42 useValue: options,
43 };
44 const connectionProvider = {
45 provide: (0, typeorm_utils_1.getConnectionToken)(options),
46 useFactory: () => __awaiter(this, void 0, void 0, function* () { return yield this.createConnectionFactory(options); }),
47 };
48 const entityManagerProvider = this.createEntityManagerProvider(options);
49 return {
50 module: TypeOrmCoreModule_1,
51 providers: [
52 entityManagerProvider,
53 connectionProvider,
54 typeOrmModuleOptions,
55 ],
56 exports: [entityManagerProvider, connectionProvider],
57 };
58 }
59 static forRootAsync(options) {
60 const connectionProvider = {
61 provide: (0, typeorm_utils_1.getConnectionToken)(options),
62 useFactory: (typeOrmOptions) => __awaiter(this, void 0, void 0, function* () {
63 if (options.name) {
64 return yield this.createConnectionFactory(Object.assign(Object.assign({}, typeOrmOptions), { name: options.name }), options.connectionFactory);
65 }
66 return yield this.createConnectionFactory(typeOrmOptions, options.connectionFactory);
67 }),
68 inject: [typeorm_constants_1.TYPEORM_MODULE_OPTIONS],
69 };
70 const entityManagerProvider = {
71 provide: (0, typeorm_utils_1.getEntityManagerToken)(options),
72 useFactory: (connection) => connection.manager,
73 inject: [(0, typeorm_utils_1.getConnectionToken)(options)],
74 };
75 const asyncProviders = this.createAsyncProviders(options);
76 return {
77 module: TypeOrmCoreModule_1,
78 imports: options.imports,
79 providers: [
80 ...asyncProviders,
81 entityManagerProvider,
82 connectionProvider,
83 {
84 provide: typeorm_constants_1.TYPEORM_MODULE_ID,
85 useValue: (0, typeorm_utils_1.generateString)(),
86 },
87 ...(options.extraProviders || []),
88 ],
89 exports: [entityManagerProvider, connectionProvider],
90 };
91 }
92 onApplicationShutdown() {
93 return __awaiter(this, void 0, void 0, function* () {
94 if (this.options.keepConnectionAlive) {
95 return;
96 }
97 const connection = this.moduleRef.get((0, typeorm_utils_1.getConnectionToken)(this.options));
98 try {
99 connection && (yield connection.close());
100 }
101 catch (e) {
102 this.logger.error(e === null || e === void 0 ? void 0 : e.message);
103 }
104 });
105 }
106 static createAsyncProviders(options) {
107 if (options.useExisting || options.useFactory) {
108 return [this.createAsyncOptionsProvider(options)];
109 }
110 const useClass = options.useClass;
111 return [
112 this.createAsyncOptionsProvider(options),
113 {
114 provide: useClass,
115 useClass,
116 },
117 ];
118 }
119 static createAsyncOptionsProvider(options) {
120 if (options.useFactory) {
121 return {
122 provide: typeorm_constants_1.TYPEORM_MODULE_OPTIONS,
123 useFactory: options.useFactory,
124 inject: options.inject || [],
125 };
126 }
127 // `as Type<TypeOrmOptionsFactory>` is a workaround for microsoft/TypeScript#31603
128 const inject = [
129 (options.useClass || options.useExisting),
130 ];
131 return {
132 provide: typeorm_constants_1.TYPEORM_MODULE_OPTIONS,
133 useFactory: (optionsFactory) => __awaiter(this, void 0, void 0, function* () { return yield optionsFactory.createTypeOrmOptions(options.name); }),
134 inject,
135 };
136 }
137 static createEntityManagerProvider(options) {
138 return {
139 provide: (0, typeorm_utils_1.getEntityManagerToken)(options),
140 useFactory: (connection) => connection.manager,
141 inject: [(0, typeorm_utils_1.getConnectionToken)(options)],
142 };
143 }
144 static createConnectionFactory(options, connectionFactory) {
145 return __awaiter(this, void 0, void 0, function* () {
146 const connectionToken = (0, typeorm_utils_1.getConnectionName)(options);
147 const createTypeormConnection = connectionFactory !== null && connectionFactory !== void 0 ? connectionFactory : typeorm_1.createConnection;
148 return yield (0, rxjs_1.lastValueFrom)((0, rxjs_1.defer)(() => {
149 try {
150 if (options.keepConnectionAlive) {
151 const connectionName = (0, typeorm_utils_1.getConnectionName)(options);
152 const manager = (0, typeorm_1.getConnectionManager)();
153 if (manager.has(connectionName)) {
154 const connection = manager.get(connectionName);
155 if (connection.isConnected) {
156 return (0, rxjs_1.of)(connection);
157 }
158 }
159 }
160 }
161 catch (_a) { }
162 if (!options.type) {
163 return createTypeormConnection();
164 }
165 if (!options.autoLoadEntities) {
166 return createTypeormConnection(options);
167 }
168 let entities = options.entities;
169 if (entities) {
170 entities = entities.concat(entities_metadata_storage_1.EntitiesMetadataStorage.getEntitiesByConnection(connectionToken));
171 }
172 else {
173 entities =
174 entities_metadata_storage_1.EntitiesMetadataStorage.getEntitiesByConnection(connectionToken);
175 }
176 return createTypeormConnection(Object.assign(Object.assign({}, options), { entities }));
177 }).pipe((0, typeorm_utils_1.handleRetry)(options.retryAttempts, options.retryDelay, connectionToken, options.verboseRetryLog, options.toRetry)));
178 });
179 }
180};
181TypeOrmCoreModule = TypeOrmCoreModule_1 = __decorate([
182 (0, common_1.Global)(),
183 (0, common_1.Module)({}),
184 __param(0, (0, common_1.Inject)(typeorm_constants_1.TYPEORM_MODULE_OPTIONS)),
185 __metadata("design:paramtypes", [Object, core_1.ModuleRef])
186], TypeOrmCoreModule);
187exports.TypeOrmCoreModule = TypeOrmCoreModule;