UNPKG

8.91 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 ],
88 exports: [entityManagerProvider, connectionProvider],
89 };
90 }
91 onApplicationShutdown() {
92 return __awaiter(this, void 0, void 0, function* () {
93 if (this.options.keepConnectionAlive) {
94 return;
95 }
96 const connection = this.moduleRef.get((0, typeorm_utils_1.getConnectionToken)(this.options));
97 try {
98 connection && (yield connection.close());
99 }
100 catch (e) {
101 this.logger.error(e === null || e === void 0 ? void 0 : e.message);
102 }
103 });
104 }
105 static createAsyncProviders(options) {
106 if (options.useExisting || options.useFactory) {
107 return [this.createAsyncOptionsProvider(options)];
108 }
109 const useClass = options.useClass;
110 return [
111 this.createAsyncOptionsProvider(options),
112 {
113 provide: useClass,
114 useClass,
115 },
116 ];
117 }
118 static createAsyncOptionsProvider(options) {
119 if (options.useFactory) {
120 return {
121 provide: typeorm_constants_1.TYPEORM_MODULE_OPTIONS,
122 useFactory: options.useFactory,
123 inject: options.inject || [],
124 };
125 }
126 // `as Type<TypeOrmOptionsFactory>` is a workaround for microsoft/TypeScript#31603
127 const inject = [
128 (options.useClass || options.useExisting),
129 ];
130 return {
131 provide: typeorm_constants_1.TYPEORM_MODULE_OPTIONS,
132 useFactory: (optionsFactory) => __awaiter(this, void 0, void 0, function* () { return yield optionsFactory.createTypeOrmOptions(options.name); }),
133 inject,
134 };
135 }
136 static createEntityManagerProvider(options) {
137 return {
138 provide: (0, typeorm_utils_1.getEntityManagerToken)(options),
139 useFactory: (connection) => connection.manager,
140 inject: [(0, typeorm_utils_1.getConnectionToken)(options)],
141 };
142 }
143 static createConnectionFactory(options, connectionFactory) {
144 return __awaiter(this, void 0, void 0, function* () {
145 const connectionToken = (0, typeorm_utils_1.getConnectionName)(options);
146 const createTypeormConnection = connectionFactory !== null && connectionFactory !== void 0 ? connectionFactory : typeorm_1.createConnection;
147 return yield (0, rxjs_1.lastValueFrom)((0, rxjs_1.defer)(() => {
148 try {
149 if (options.keepConnectionAlive) {
150 const connectionName = (0, typeorm_utils_1.getConnectionName)(options);
151 const manager = (0, typeorm_1.getConnectionManager)();
152 if (manager.has(connectionName)) {
153 const connection = manager.get(connectionName);
154 if (connection.isConnected) {
155 return (0, rxjs_1.of)(connection);
156 }
157 }
158 }
159 }
160 catch (_a) { }
161 if (!options.type) {
162 return createTypeormConnection();
163 }
164 if (!options.autoLoadEntities) {
165 return createTypeormConnection(options);
166 }
167 let entities = options.entities;
168 if (entities) {
169 entities = entities.concat(entities_metadata_storage_1.EntitiesMetadataStorage.getEntitiesByConnection(connectionToken));
170 }
171 else {
172 entities =
173 entities_metadata_storage_1.EntitiesMetadataStorage.getEntitiesByConnection(connectionToken);
174 }
175 return createTypeormConnection(Object.assign(Object.assign({}, options), { entities }));
176 }).pipe((0, typeorm_utils_1.handleRetry)(options.retryAttempts, options.retryDelay, connectionToken, options.verboseRetryLog, options.toRetry)));
177 });
178 }
179};
180TypeOrmCoreModule = TypeOrmCoreModule_1 = __decorate([
181 (0, common_1.Global)(),
182 (0, common_1.Module)({}),
183 __param(0, (0, common_1.Inject)(typeorm_constants_1.TYPEORM_MODULE_OPTIONS)),
184 __metadata("design:paramtypes", [Object, core_1.ModuleRef])
185], TypeOrmCoreModule);
186exports.TypeOrmCoreModule = TypeOrmCoreModule;