@tsed/di 6.68.1 → 6.69.0-rc.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. package/lib/index.js +2537 -23
  2. package/lib/index.js.map +1 -1
  3. package/lib/index.modern.js +2474 -0
  4. package/lib/index.modern.js.map +1 -0
  5. package/lib/registries/GlobalProviders.d.ts +1 -1
  6. package/package.json +11 -8
  7. package/lib/constants/index.js +0 -7
  8. package/lib/constants/index.js.map +0 -1
  9. package/lib/decorators/configuration.js +0 -24
  10. package/lib/decorators/configuration.js.map +0 -1
  11. package/lib/decorators/constant.js +0 -55
  12. package/lib/decorators/constant.js.map +0 -1
  13. package/lib/decorators/index.js +0 -17
  14. package/lib/decorators/index.js.map +0 -1
  15. package/lib/decorators/inject.js +0 -60
  16. package/lib/decorators/inject.js.map +0 -1
  17. package/lib/decorators/injectable.js +0 -33
  18. package/lib/decorators/injectable.js.map +0 -1
  19. package/lib/decorators/intercept.js +0 -28
  20. package/lib/decorators/intercept.js.map +0 -1
  21. package/lib/decorators/interceptor.js +0 -21
  22. package/lib/decorators/interceptor.js.map +0 -1
  23. package/lib/decorators/module.js +0 -31
  24. package/lib/decorators/module.js.map +0 -1
  25. package/lib/decorators/opts.js +0 -54
  26. package/lib/decorators/opts.js.map +0 -1
  27. package/lib/decorators/overrideProvider.js +0 -17
  28. package/lib/decorators/overrideProvider.js.map +0 -1
  29. package/lib/decorators/scope.js +0 -16
  30. package/lib/decorators/scope.js.map +0 -1
  31. package/lib/decorators/service.js +0 -18
  32. package/lib/decorators/service.js.map +0 -1
  33. package/lib/decorators/useOpts.js +0 -65
  34. package/lib/decorators/useOpts.js.map +0 -1
  35. package/lib/decorators/value.js +0 -55
  36. package/lib/decorators/value.js.map +0 -1
  37. package/lib/domain/Container.js +0 -69
  38. package/lib/domain/Container.js.map +0 -1
  39. package/lib/domain/ContextLogger.js +0 -92
  40. package/lib/domain/ContextLogger.js.map +0 -1
  41. package/lib/domain/DIContext.js +0 -45
  42. package/lib/domain/DIContext.js.map +0 -1
  43. package/lib/domain/InjectablePropertyType.js +0 -12
  44. package/lib/domain/InjectablePropertyType.js.map +0 -1
  45. package/lib/domain/LocalsContainer.js +0 -55
  46. package/lib/domain/LocalsContainer.js.map +0 -1
  47. package/lib/domain/Provider.js +0 -173
  48. package/lib/domain/Provider.js.map +0 -1
  49. package/lib/domain/ProviderScope.js +0 -10
  50. package/lib/domain/ProviderScope.js.map +0 -1
  51. package/lib/domain/ProviderType.js +0 -15
  52. package/lib/domain/ProviderType.js.map +0 -1
  53. package/lib/domain/index.js +0 -12
  54. package/lib/domain/index.js.map +0 -1
  55. package/lib/errors/InjectionError.js +0 -59
  56. package/lib/errors/InjectionError.js.map +0 -1
  57. package/lib/errors/UndefinedTokenError.js +0 -11
  58. package/lib/errors/UndefinedTokenError.js.map +0 -1
  59. package/lib/interfaces/DIConfigurationOptions.js +0 -3
  60. package/lib/interfaces/DIConfigurationOptions.js.map +0 -1
  61. package/lib/interfaces/DILogger.js +0 -3
  62. package/lib/interfaces/DILogger.js.map +0 -1
  63. package/lib/interfaces/DIResolver.js +0 -3
  64. package/lib/interfaces/DIResolver.js.map +0 -1
  65. package/lib/interfaces/IProvider.js +0 -3
  66. package/lib/interfaces/IProvider.js.map +0 -1
  67. package/lib/interfaces/InjectableProperties.js +0 -3
  68. package/lib/interfaces/InjectableProperties.js.map +0 -1
  69. package/lib/interfaces/InterceptorContext.js +0 -3
  70. package/lib/interfaces/InterceptorContext.js.map +0 -1
  71. package/lib/interfaces/InterceptorMethods.js +0 -3
  72. package/lib/interfaces/InterceptorMethods.js.map +0 -1
  73. package/lib/interfaces/InvokeOptions.js +0 -3
  74. package/lib/interfaces/InvokeOptions.js.map +0 -1
  75. package/lib/interfaces/OnDestroy.js +0 -3
  76. package/lib/interfaces/OnDestroy.js.map +0 -1
  77. package/lib/interfaces/OnInit.js +0 -3
  78. package/lib/interfaces/OnInit.js.map +0 -1
  79. package/lib/interfaces/RegistrySettings.js +0 -3
  80. package/lib/interfaces/RegistrySettings.js.map +0 -1
  81. package/lib/interfaces/TokenProvider.js +0 -3
  82. package/lib/interfaces/TokenProvider.js.map +0 -1
  83. package/lib/interfaces/index.js +0 -17
  84. package/lib/interfaces/index.js.map +0 -1
  85. package/lib/registries/GlobalProviders.js +0 -124
  86. package/lib/registries/GlobalProviders.js.map +0 -1
  87. package/lib/registries/ProviderRegistry.js +0 -181
  88. package/lib/registries/ProviderRegistry.js.map +0 -1
  89. package/lib/services/DIConfiguration.js +0 -129
  90. package/lib/services/DIConfiguration.js.map +0 -1
  91. package/lib/services/DILogger.js +0 -13
  92. package/lib/services/DILogger.js.map +0 -1
  93. package/lib/services/DITest.js +0 -100
  94. package/lib/services/DITest.js.map +0 -1
  95. package/lib/services/InjectorService.js +0 -543
  96. package/lib/services/InjectorService.js.map +0 -1
  97. package/lib/utils/cleanGlobPatterns.js +0 -30
  98. package/lib/utils/cleanGlobPatterns.js.map +0 -1
  99. package/lib/utils/createContainer.js +0 -14
  100. package/lib/utils/createContainer.js.map +0 -1
  101. package/lib/utils/data/Test1.d.ts +0 -3
  102. package/lib/utils/data/Test1.js +0 -8
  103. package/lib/utils/data/Test1.js.map +0 -1
  104. package/lib/utils/data/Test2.d.ts +0 -3
  105. package/lib/utils/data/Test2.js +0 -8
  106. package/lib/utils/data/Test2.js.map +0 -1
  107. package/lib/utils/getConfiguration.js +0 -20
  108. package/lib/utils/getConfiguration.js.map +0 -1
  109. package/lib/utils/importComponents.js +0 -50
  110. package/lib/utils/importComponents.js.map +0 -1
  111. package/lib/utils/importFiles.js +0 -28
  112. package/lib/utils/importFiles.js.map +0 -1
  113. package/lib/utils/importProviders.js +0 -29
  114. package/lib/utils/importProviders.js.map +0 -1
  115. package/lib/utils/setLoggerLevel.js +0 -16
  116. package/lib/utils/setLoggerLevel.js.map +0 -1
package/lib/index.js CHANGED
@@ -1,23 +1,2537 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const tslib_1 = require("tslib");
4
- tslib_1.__exportStar(require("./constants/index"), exports);
5
- tslib_1.__exportStar(require("./domain"), exports);
6
- tslib_1.__exportStar(require("./interfaces"), exports);
7
- tslib_1.__exportStar(require("./decorators"), exports);
8
- tslib_1.__exportStar(require("./registries/ProviderRegistry"), exports);
9
- tslib_1.__exportStar(require("./registries/GlobalProviders"), exports);
10
- tslib_1.__exportStar(require("./services/InjectorService"), exports);
11
- tslib_1.__exportStar(require("./services/DILogger"), exports);
12
- tslib_1.__exportStar(require("./services/DIConfiguration"), exports);
13
- tslib_1.__exportStar(require("./services/DITest"), exports);
14
- tslib_1.__exportStar(require("./errors/InjectionError"), exports);
15
- tslib_1.__exportStar(require("./errors/UndefinedTokenError"), exports);
16
- tslib_1.__exportStar(require("./utils/createContainer"), exports);
17
- tslib_1.__exportStar(require("./utils/importFiles"), exports);
18
- tslib_1.__exportStar(require("./utils/importComponents"), exports);
19
- tslib_1.__exportStar(require("./utils/getConfiguration"), exports);
20
- tslib_1.__exportStar(require("./utils/getConfiguration"), exports);
21
- tslib_1.__exportStar(require("./utils/importProviders"), exports);
22
- tslib_1.__exportStar(require("./utils/setLoggerLevel"), exports);
23
- //# sourceMappingURL=index.js.map
1
+ var core = require('@tsed/core');
2
+ var tslib = require('tslib');
3
+ var logger = require('@tsed/logger');
4
+ var chalk = require('chalk');
5
+ var globby = require('globby');
6
+ var path = require('path');
7
+
8
+ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
9
+
10
+ function _interopNamespace(e) {
11
+ if (e && e.__esModule) return e;
12
+ var n = Object.create(null);
13
+ if (e) {
14
+ Object.keys(e).forEach(function (k) {
15
+ if (k !== 'default') {
16
+ var d = Object.getOwnPropertyDescriptor(e, k);
17
+ Object.defineProperty(n, k, d.get ? d : {
18
+ enumerable: true,
19
+ get: function () {
20
+ return e[k];
21
+ }
22
+ });
23
+ }
24
+ });
25
+ }
26
+ n['default'] = e;
27
+ return n;
28
+ }
29
+
30
+ var chalk__default = /*#__PURE__*/_interopDefaultLegacy(chalk);
31
+ var globby__default = /*#__PURE__*/_interopDefaultLegacy(globby);
32
+
33
+ const INJECTABLE_PROP = "DI:INJECTABLE_PROP";
34
+ const DI_PARAMS = "DI:PARAMS";
35
+ const DI_PARAM_OPTIONS = "DI:PARAM:OPTIONS";
36
+
37
+ function _extends() {
38
+ _extends = Object.assign || function (target) {
39
+ for (var i = 1; i < arguments.length; i++) {
40
+ var source = arguments[i];
41
+
42
+ for (var key in source) {
43
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
44
+ target[key] = source[key];
45
+ }
46
+ }
47
+ }
48
+
49
+ return target;
50
+ };
51
+
52
+ return _extends.apply(this, arguments);
53
+ }
54
+
55
+ function _objectWithoutPropertiesLoose(source, excluded) {
56
+ if (source == null) return {};
57
+ var target = {};
58
+ var sourceKeys = Object.keys(source);
59
+ var key, i;
60
+
61
+ for (i = 0; i < sourceKeys.length; i++) {
62
+ key = sourceKeys[i];
63
+ if (excluded.indexOf(key) >= 0) continue;
64
+ target[key] = source[key];
65
+ }
66
+
67
+ return target;
68
+ }
69
+
70
+ var id = 0;
71
+
72
+ function _classPrivateFieldLooseKey(name) {
73
+ return "__private_" + id++ + "_" + name;
74
+ }
75
+
76
+ function _classPrivateFieldLooseBase(receiver, privateKey) {
77
+ if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) {
78
+ throw new TypeError("attempted to use private field on non-instance");
79
+ }
80
+
81
+ return receiver;
82
+ }
83
+
84
+ exports.ProviderScope = void 0;
85
+
86
+ (function (ProviderScope) {
87
+ ProviderScope["SINGLETON"] = "singleton";
88
+ ProviderScope["REQUEST"] = "request";
89
+ ProviderScope["INSTANCE"] = "instance";
90
+ })(exports.ProviderScope || (exports.ProviderScope = {}));
91
+
92
+ exports.ProviderType = void 0;
93
+
94
+ (function (ProviderType) {
95
+ ProviderType["VALUE"] = "value";
96
+ ProviderType["FACTORY"] = "factory";
97
+ ProviderType["SERVICE"] = "service";
98
+ ProviderType["PROVIDER"] = "provider";
99
+ ProviderType["MODULE"] = "module";
100
+ ProviderType["CONTROLLER"] = "controller";
101
+ ProviderType["INTERCEPTOR"] = "interceptor";
102
+ ProviderType["MIDDLEWARE"] = "middleware";
103
+ })(exports.ProviderType || (exports.ProviderType = {}));
104
+
105
+ class Provider {
106
+ constructor(token) {
107
+ this.type = exports.ProviderType.PROVIDER;
108
+ this.injectable = true;
109
+ this.provide = token;
110
+ this.useClass = token;
111
+ }
112
+
113
+ get token() {
114
+ return this._provide;
115
+ }
116
+
117
+ get provide() {
118
+ return this._provide;
119
+ }
120
+
121
+ set provide(value) {
122
+ if (value) {
123
+ this._provide = core.isClass(value) ? core.classOf(value) : value;
124
+ this._tokenStore = this._store = core.Store.from(value);
125
+ }
126
+ }
127
+
128
+ get useClass() {
129
+ return this._useClass;
130
+ }
131
+ /**
132
+ * Create a new store if the given value is a class. Otherwise the value is ignored.
133
+ * @param value
134
+ */
135
+
136
+
137
+ set useClass(value) {
138
+ if (core.isClass(value)) {
139
+ this._useClass = core.classOf(value);
140
+ this._store = core.Store.from(value);
141
+ }
142
+ }
143
+
144
+ get className() {
145
+ return this.name;
146
+ }
147
+
148
+ get name() {
149
+ return core.nameOf(this.provide);
150
+ }
151
+
152
+ get store() {
153
+ return this._store;
154
+ }
155
+ /**
156
+ * Get the scope of the provider.
157
+ *
158
+ * ::: tip Note
159
+ * Async provider is always a SINGLETON
160
+ * :::
161
+ *
162
+ * @returns {boolean}
163
+ */
164
+
165
+
166
+ get scope() {
167
+ if (this.isAsync()) {
168
+ return exports.ProviderScope.SINGLETON;
169
+ }
170
+
171
+ return this.get("scope");
172
+ }
173
+ /**
174
+ * Change the scope value of the provider.
175
+ * @param scope
176
+ */
177
+
178
+
179
+ set scope(scope) {
180
+ this.store.set("scope", scope);
181
+ }
182
+
183
+ get configuration() {
184
+ return this.get("configuration");
185
+ }
186
+
187
+ set configuration(configuration) {
188
+ this.store.set("configuration", configuration);
189
+ }
190
+
191
+ get(key) {
192
+ return this.store.get(key) || this._tokenStore.get(key);
193
+ }
194
+
195
+ isAsync() {
196
+ return !!this.useAsyncFactory;
197
+ }
198
+
199
+ clone() {
200
+ const provider = new (core.classOf(this))(this.token);
201
+ core.getEnumerableKeys(this).forEach(key => {
202
+ if (this[key] !== undefined) {
203
+ provider[key] = this[key];
204
+ }
205
+ });
206
+ return provider;
207
+ }
208
+
209
+ toString() {
210
+ return ["Token", this.name, this.useClass && core.nameOf(this.useClass), this.useFactory && "Factory", this.useValue && "Value", this.useAsyncFactory && "AsyncFactory"].filter(Boolean).join(":");
211
+ }
212
+
213
+ }
214
+
215
+ tslib.__decorate([core.Enumerable(), tslib.__metadata("design:type", Object)], Provider.prototype, "type", void 0);
216
+
217
+ tslib.__decorate([core.Enumerable(), tslib.__metadata("design:type", Boolean)], Provider.prototype, "injectable", void 0);
218
+
219
+ tslib.__decorate([core.Enumerable(), tslib.__metadata("design:type", Object)], Provider.prototype, "instance", void 0);
220
+
221
+ tslib.__decorate([core.Enumerable(), tslib.__metadata("design:type", Array)], Provider.prototype, "deps", void 0);
222
+
223
+ tslib.__decorate([core.Enumerable(), tslib.__metadata("design:type", Array)], Provider.prototype, "imports", void 0);
224
+
225
+ tslib.__decorate([core.Enumerable(), tslib.__metadata("design:type", Function)], Provider.prototype, "useFactory", void 0);
226
+
227
+ tslib.__decorate([core.Enumerable(), tslib.__metadata("design:type", Function)], Provider.prototype, "useAsyncFactory", void 0);
228
+
229
+ tslib.__decorate([core.Enumerable(), tslib.__metadata("design:type", Object)], Provider.prototype, "useValue", void 0);
230
+
231
+ tslib.__decorate([core.NotEnumerable(), tslib.__metadata("design:type", Object)], Provider.prototype, "_provide", void 0);
232
+
233
+ tslib.__decorate([core.NotEnumerable(), tslib.__metadata("design:type", core.Type)], Provider.prototype, "_useClass", void 0);
234
+
235
+ tslib.__decorate([core.NotEnumerable(), tslib.__metadata("design:type", Object)], Provider.prototype, "_instance", void 0);
236
+
237
+ tslib.__decorate([core.NotEnumerable(), tslib.__metadata("design:type", core.Store)], Provider.prototype, "_store", void 0);
238
+
239
+ tslib.__decorate([core.NotEnumerable(), tslib.__metadata("design:type", core.Store)], Provider.prototype, "_tokenStore", void 0);
240
+
241
+ tslib.__decorate([core.Enumerable(), tslib.__metadata("design:type", core.Type), tslib.__metadata("design:paramtypes", [core.Type])], Provider.prototype, "useClass", null);
242
+
243
+ tslib.__decorate([core.Enumerable(), tslib.__metadata("design:type", String), tslib.__metadata("design:paramtypes", [String])], Provider.prototype, "scope", null);
244
+
245
+ tslib.__decorate([core.Enumerable(), tslib.__metadata("design:type", Object), tslib.__metadata("design:paramtypes", [Object])], Provider.prototype, "configuration", null);
246
+
247
+ var _settings = /*#__PURE__*/_classPrivateFieldLooseKey("settings");
248
+
249
+ class GlobalProviderRegistry extends Map {
250
+ constructor() {
251
+ super(...arguments);
252
+ Object.defineProperty(this, _settings, {
253
+ writable: true,
254
+ value: void 0
255
+ });
256
+ _classPrivateFieldLooseBase(this, _settings)[_settings] = new Map();
257
+ }
258
+
259
+ /**
260
+ * The get() method returns a specified element from a Map object.
261
+ * @param key Required. The key of the element to return from the Map object.
262
+ * @returns {T} Returns the element associated with the specified key or undefined if the key can't be found in the Map object.
263
+ */
264
+ get(key) {
265
+ return super.get(core.getClassOrSymbol(key));
266
+ }
267
+ /**
268
+ * The has() method returns a boolean indicating whether an element with the specified key exists or not.
269
+ * @param key
270
+ * @returns {boolean}
271
+ */
272
+
273
+
274
+ has(key) {
275
+ return super.has(core.getClassOrSymbol(key));
276
+ }
277
+ /**
278
+ * The set() method adds or updates an element with a specified key and value to a Map object.
279
+ * @param key Required. The key of the element to add to the Map object.
280
+ * @param metadata Required. The value of the element to add to the Map object.
281
+ */
282
+
283
+
284
+ set(key, metadata) {
285
+ super.set(core.getClassOrSymbol(key), metadata);
286
+ return this;
287
+ }
288
+ /**
289
+ *
290
+ * @param target
291
+ * @param options
292
+ */
293
+
294
+
295
+ merge(target, options) {
296
+ const meta = this.createIfNotExists(target, options);
297
+ Object.keys(options).forEach(key => {
298
+ meta[key] = options[key];
299
+ });
300
+ this.set(target, meta);
301
+ }
302
+ /**
303
+ * The delete() method removes the specified element from a Map object.
304
+ * @param key Required. The key of the element to remove from the Map object.
305
+ * @returns {boolean} Returns true if an element in the Map object existed and has been removed, or false if the element does not exist.
306
+ */
307
+
308
+
309
+ delete(key) {
310
+ return super.delete(core.getClassOrSymbol(key));
311
+ }
312
+
313
+ createRegistry(type, model, options = {
314
+ injectable: true
315
+ }) {
316
+ const defaultOptions = this.getRegistrySettings(type);
317
+ options = Object.assign(defaultOptions, _extends({}, options, {
318
+ model
319
+ }));
320
+
321
+ _classPrivateFieldLooseBase(this, _settings)[_settings].set(type, options);
322
+
323
+ return this;
324
+ }
325
+
326
+ getRegistrySettings(target) {
327
+ let type = "provider";
328
+
329
+ if (typeof target === "string") {
330
+ type = target;
331
+ } else {
332
+ const provider = this.get(target);
333
+
334
+ if (provider) {
335
+ type = provider.type;
336
+ }
337
+ }
338
+
339
+ return _classPrivateFieldLooseBase(this, _settings)[_settings].get(type) || {
340
+ model: Provider,
341
+ injectable: true
342
+ };
343
+ }
344
+
345
+ createRegisterFn(type) {
346
+ return (provider, instance) => {
347
+ if (!provider.provide) {
348
+ provider = {
349
+ provide: provider
350
+ };
351
+ }
352
+
353
+ provider = Object.assign({
354
+ instance
355
+ }, provider, {
356
+ type
357
+ });
358
+ this.merge(provider.provide, provider);
359
+ };
360
+ }
361
+ /**
362
+ * @deprecated
363
+ */
364
+ // istanbul ignore next
365
+
366
+
367
+ getRegistry(target) {
368
+ return this;
369
+ }
370
+ /**
371
+ *
372
+ * @param key
373
+ * @param options
374
+ */
375
+
376
+
377
+ createIfNotExists(key, options) {
378
+ const type = options.type || exports.ProviderType.PROVIDER;
379
+
380
+ if (!this.has(key)) {
381
+ const {
382
+ model = Provider
383
+ } = _classPrivateFieldLooseBase(this, _settings)[_settings].get(type) || {};
384
+ const item = new model(key);
385
+ this.set(key, item);
386
+ }
387
+
388
+ return this.get(key);
389
+ }
390
+
391
+ }
392
+ /**
393
+ *
394
+ * @type {GlobalProviders}
395
+ */
396
+ // tslint:disable-next-line: variable-name
397
+
398
+ const GlobalProviders = new GlobalProviderRegistry();
399
+
400
+ class LocalsContainer extends Map {
401
+ /**
402
+ * Emit an event to all service. See service [lifecycle hooks](/docs/services.md#lifecycle-hooks).
403
+ * @param eventName The event name to emit at all services.
404
+ * @param args List of the parameters to give to each services.
405
+ * @returns {Promise<any[]>} A list of promises.
406
+ */
407
+ async emit(eventName, ...args) {
408
+ for (const handler of this.getListeners(eventName)) {
409
+ await handler(...args);
410
+ }
411
+ }
412
+ /**
413
+ * @param eventName
414
+ * @param value
415
+ * @param args
416
+ */
417
+
418
+
419
+ alter(eventName, value, ...args) {
420
+ for (const handler of this.getListeners(eventName)) {
421
+ value = handler(value, ...args);
422
+ }
423
+
424
+ return value;
425
+ }
426
+ /**
427
+ * @param eventName
428
+ * @param value
429
+ * @param args
430
+ */
431
+
432
+
433
+ async alterAsync(eventName, value, ...args) {
434
+ for (const handler of this.getListeners(eventName)) {
435
+ value = handler(value, ...args);
436
+ }
437
+
438
+ return value;
439
+ }
440
+
441
+ toArray() {
442
+ return [...this.values()];
443
+ }
444
+
445
+ async destroy() {
446
+ await this.emit("$onDestroy");
447
+ this.clear();
448
+ }
449
+
450
+ getListeners(event) {
451
+ return this.toArray().reduce((listeners, instance) => {
452
+ if (typeof instance === "object" && instance && event in instance) {
453
+ return listeners.concat(instance[event].bind(instance));
454
+ }
455
+
456
+ return listeners;
457
+ }, []);
458
+ }
459
+
460
+ }
461
+
462
+ class Container extends LocalsContainer {
463
+ /**
464
+ *
465
+ * @param token
466
+ * @param settings
467
+ */
468
+ add(token, settings = {}) {
469
+ const provider = GlobalProviders.has(token) ? GlobalProviders.get(token).clone() : new Provider(token);
470
+ Object.assign(provider, settings);
471
+ return super.set(token, provider);
472
+ }
473
+ /**
474
+ * Add a provider to the
475
+ * @param token
476
+ * @param settings
477
+ */
478
+
479
+
480
+ addProvider(token, settings = {}) {
481
+ return this.add(token, settings);
482
+ }
483
+ /**
484
+ *
485
+ * @param token
486
+ */
487
+
488
+
489
+ hasProvider(token) {
490
+ return super.has(token);
491
+ }
492
+ /**
493
+ * Add a provider to the
494
+ * @param token
495
+ * @param provider
496
+ */
497
+
498
+
499
+ setProvider(token, provider) {
500
+ return super.set(token, provider);
501
+ }
502
+ /**
503
+ * The getProvider() method returns a specified element from a Map object.
504
+ * @returns {T} Returns the element associated with the specified key or undefined if the key can't be found in the Map object.
505
+ * @param token
506
+ */
507
+
508
+
509
+ getProvider(token) {
510
+ return super.get(token);
511
+ }
512
+ /**
513
+ * Get all providers registered in the injector container.
514
+ *
515
+ * @param {ProviderType} type Filter the list by the given ProviderType.
516
+ * @returns {[TokenProvider , Provider<any>][]}
517
+ */
518
+
519
+
520
+ getProviders(type) {
521
+ return Array.from(this).filter(([_, provider]) => type ? provider.type === type : true).map(([_, provider]) => provider);
522
+ }
523
+
524
+ addProviders(container) {
525
+ container.forEach(provider => {
526
+ if (!this.hasProvider(provider.provide)) {
527
+ this.setProvider(provider.provide, provider.clone());
528
+ }
529
+ });
530
+ }
531
+
532
+ }
533
+
534
+ exports.InjectablePropertyType = void 0;
535
+
536
+ (function (InjectablePropertyType) {
537
+ InjectablePropertyType["METHOD"] = "method";
538
+ InjectablePropertyType["PROPERTY"] = "property";
539
+ InjectablePropertyType["CONSTANT"] = "constant";
540
+ InjectablePropertyType["VALUE"] = "value";
541
+ InjectablePropertyType["INTERCEPTOR"] = "interceptor";
542
+ })(exports.InjectablePropertyType || (exports.InjectablePropertyType = {}));
543
+
544
+ var _additionalProps = /*#__PURE__*/_classPrivateFieldLooseKey("additionalProps");
545
+
546
+ var _dateStart = /*#__PURE__*/_classPrivateFieldLooseKey("dateStart");
547
+
548
+ var _ignoreLog = /*#__PURE__*/_classPrivateFieldLooseKey("ignoreLog");
549
+
550
+ var _stack = /*#__PURE__*/_classPrivateFieldLooseKey("stack");
551
+
552
+ var _level = /*#__PURE__*/_classPrivateFieldLooseKey("level");
553
+
554
+ class ContextLogger {
555
+ constructor(logger$1, {
556
+ id,
557
+ url = "",
558
+ dateStart = new Date(),
559
+ ignoreUrlPatterns = [],
560
+ minimalRequestPicker,
561
+ completeRequestPicker,
562
+ level = "all",
563
+ maxStackSize = 30,
564
+ ignoreLog,
565
+ additionalProps
566
+ }) {
567
+ Object.defineProperty(this, _additionalProps, {
568
+ writable: true,
569
+ value: void 0
570
+ });
571
+ Object.defineProperty(this, _dateStart, {
572
+ writable: true,
573
+ value: void 0
574
+ });
575
+ Object.defineProperty(this, _ignoreLog, {
576
+ writable: true,
577
+ value: void 0
578
+ });
579
+ Object.defineProperty(this, _stack, {
580
+ writable: true,
581
+ value: void 0
582
+ });
583
+ Object.defineProperty(this, _level, {
584
+ writable: true,
585
+ value: void 0
586
+ });
587
+ this.logger = logger$1;
588
+ _classPrivateFieldLooseBase(this, _stack)[_stack] = [];
589
+ this.id = id;
590
+ this.url = url;
591
+ _classPrivateFieldLooseBase(this, _additionalProps)[_additionalProps] = additionalProps || {};
592
+ _classPrivateFieldLooseBase(this, _dateStart)[_dateStart] = dateStart;
593
+
594
+ _classPrivateFieldLooseBase(this, _ignoreLog)[_ignoreLog] = ignoreLog || (() => false);
595
+
596
+ this.minimalRequestPicker = minimalRequestPicker || (l => l);
597
+
598
+ this.completeRequestPicker = completeRequestPicker || (l => l); // @ts-ignore
599
+
600
+
601
+ _classPrivateFieldLooseBase(this, _level)[_level] = logger.levels()[level.toUpperCase()] || logger.levels().ALL;
602
+ this.maxStackSize = maxStackSize;
603
+ }
604
+
605
+ info(obj) {
606
+ this.run(logger.levels().INFO, obj, obj => this.minimalRequestPicker(this.getData(obj)));
607
+ return this;
608
+ }
609
+
610
+ debug(obj, withRequest = true) {
611
+ this.run(logger.levels().DEBUG, obj, obj => {
612
+ obj = this.getData(obj);
613
+ return withRequest ? this.completeRequestPicker(obj) : obj;
614
+ });
615
+ return this;
616
+ }
617
+
618
+ warn(obj) {
619
+ this.run(logger.levels().WARN, obj, obj => this.completeRequestPicker(this.getData(obj)));
620
+ return this;
621
+ }
622
+
623
+ error(obj) {
624
+ this.run(logger.levels().ERROR, obj, obj => this.completeRequestPicker(this.getData(obj)));
625
+ return this;
626
+ }
627
+
628
+ trace(obj) {
629
+ this.run(logger.levels().TRACE, obj, obj => this.completeRequestPicker(this.getData(obj)));
630
+ return this;
631
+ }
632
+
633
+ flush() {
634
+ if (_classPrivateFieldLooseBase(this, _stack)[_stack].length) {
635
+ _classPrivateFieldLooseBase(this, _stack)[_stack].forEach(({
636
+ level,
637
+ data
638
+ }) => {
639
+ this.logger[level](data);
640
+ });
641
+
642
+ _classPrivateFieldLooseBase(this, _stack)[_stack] = [];
643
+ }
644
+ }
645
+
646
+ isLevelEnabled(otherLevel) {
647
+ return _classPrivateFieldLooseBase(this, _level)[_level].isLessThanOrEqualTo(otherLevel);
648
+ }
649
+
650
+ destroy() {
651
+ this.flush();
652
+ this.logger = undefined;
653
+ _classPrivateFieldLooseBase(this, _stack)[_stack] = undefined;
654
+ }
655
+ /**
656
+ * Return the duration between the time when LogIncomingRequest has handle the request and now.
657
+ * @returns {number}
658
+ */
659
+
660
+
661
+ getDuration() {
662
+ return new Date().getTime() - _classPrivateFieldLooseBase(this, _dateStart)[_dateStart].getTime();
663
+ }
664
+
665
+ getData(obj) {
666
+ if (typeof obj === "string") {
667
+ obj = {
668
+ message: obj
669
+ };
670
+ }
671
+
672
+ return _extends({}, _classPrivateFieldLooseBase(this, _additionalProps)[_additionalProps], {
673
+ reqId: this.id,
674
+ time: new Date(),
675
+ duration: this.getDuration()
676
+ }, obj);
677
+ }
678
+
679
+ run(level, obj, mapper) {
680
+ if (!this.isLevelEnabled(level)) {
681
+ return;
682
+ }
683
+
684
+ if (!_classPrivateFieldLooseBase(this, _ignoreLog)[_ignoreLog](obj)) {
685
+ _classPrivateFieldLooseBase(this, _stack)[_stack].push({
686
+ level: level.levelStr.toLowerCase(),
687
+ data: mapper(obj)
688
+ });
689
+ }
690
+
691
+ if (this.maxStackSize < _classPrivateFieldLooseBase(this, _stack)[_stack].length) {
692
+ this.flush();
693
+ }
694
+ }
695
+
696
+ }
697
+
698
+ const _excluded$1 = ["id", "injector", "logger", "ignoreLog"];
699
+ class DIContext extends Map {
700
+ constructor(_ref) {
701
+ let {
702
+ id,
703
+ injector,
704
+ logger,
705
+ ignoreLog
706
+ } = _ref,
707
+ options = _objectWithoutPropertiesLoose(_ref, _excluded$1);
708
+
709
+ super();
710
+ /**
711
+ * Date when request have been handled by the server. @@RequestLogger@@ use this date to log request duration.
712
+ */
713
+
714
+ this.dateStart = new Date();
715
+ /**
716
+ * The request container used by the Ts.ED DI. It contain all services annotated with `@Scope(ProviderScope.REQUEST)`
717
+ */
718
+
719
+ this.container = new LocalsContainer();
720
+ this.id = id;
721
+ injector && (this.injector = injector);
722
+ this.logger = new ContextLogger(logger, _extends({}, options, {
723
+ dateStart: this.dateStart,
724
+ id,
725
+ ignoreLog
726
+ }));
727
+ }
728
+
729
+ get env() {
730
+ return this.injector.settings.env;
731
+ }
732
+
733
+ async destroy() {
734
+ await this.container.destroy();
735
+ this.logger.destroy(); // @ts-ignore
736
+
737
+ delete this.container; // @ts-ignore
738
+
739
+ delete this.logger; // @ts-ignore
740
+
741
+ delete this.injector;
742
+ }
743
+
744
+ async emit(eventName, ...args) {
745
+ var _this$injector;
746
+
747
+ return (_this$injector = this.injector) == null ? void 0 : _this$injector.emit(eventName, ...args);
748
+ }
749
+
750
+ }
751
+
752
+ /**
753
+ *
754
+ * @param {"request" | "singleton" | ProviderScope} scope
755
+ * @returns {Function}
756
+ * @constructor
757
+ */
758
+
759
+ function Scope(scope = exports.ProviderScope.REQUEST) {
760
+ return core.StoreSet("scope", scope);
761
+ }
762
+
763
+ /**
764
+ *
765
+ */
766
+
767
+ GlobalProviders.createRegistry(exports.ProviderType.CONTROLLER, Provider, {
768
+ injectable: false
769
+ });
770
+ /**
771
+ * Register a provider configuration.
772
+ * @param {IProvider<any>} provider
773
+ */
774
+
775
+ function registerProvider(provider) {
776
+ if (!provider.provide) {
777
+ throw new Error("Provider.provide is required");
778
+ }
779
+
780
+ GlobalProviders.merge(provider.provide, provider);
781
+ }
782
+ /**
783
+ * Add a new factory in the `ProviderRegistry`.
784
+ *
785
+ * #### Example with symbol definition
786
+ *
787
+ *
788
+ * ```typescript
789
+ * import {registerFactory, InjectorService} from "@tsed/di";
790
+ *
791
+ * export interface IMyFooFactory {
792
+ * getFoo(): string;
793
+ * }
794
+ *
795
+ * export type MyFooFactory = IMyFooFactory;
796
+ * export const MyFooFactory = Symbol("MyFooFactory");
797
+ *
798
+ * registerFactory(MyFooFactory, {
799
+ * getFoo: () => "test"
800
+ * });
801
+ *
802
+ * // or
803
+ *
804
+ * registerFactory({provide: MyFooFactory, instance: {
805
+ * getFoo: () => "test"
806
+ * }});
807
+ *
808
+ * @Service()
809
+ * export class OtherService {
810
+ * constructor(@Inject(MyFooFactory) myFooFactory: MyFooFactory){
811
+ * console.log(myFooFactory.getFoo()); /// "test"
812
+ * }
813
+ * }
814
+ * ```
815
+ *
816
+ * > Note: When you use the factory method with Symbol definition, you must use the `@Inject()`
817
+ * decorator to retrieve your factory in another Service. Advice: By convention all factory class name will be prefixed by
818
+ * `Factory`.
819
+ *
820
+ * #### Example with class
821
+ *
822
+ * ```typescript
823
+ * import {InjectorService, registerFactory} from "@tsed/di";
824
+ *
825
+ * export class MyFooService {
826
+ * constructor(){}
827
+ * getFoo() {
828
+ * return "test";
829
+ * }
830
+ * }
831
+ *
832
+ * registerFactory(MyFooService, new MyFooService());
833
+ * // or
834
+ * registerFactory({provider: MyFooService, instance: new MyFooService()});
835
+ *
836
+ * @Service()
837
+ * export class OtherService {
838
+ * constructor(myFooService: MyFooService){
839
+ * console.log(myFooFactory.getFoo()); /// "test"
840
+ * }
841
+ * }
842
+ * ```
843
+ * @deprecated Since 2021-05-15. Use registerProvider instead.
844
+ */
845
+
846
+ const registerFactory = registerProvider;
847
+ /**
848
+ * Add a new value in the `ProviderRegistry`.
849
+ *
850
+ * #### Example with symbol definition
851
+ *
852
+ *
853
+ * ```typescript
854
+ * import {registerValue, InjectorService} from "@tsed/di";
855
+ *
856
+ * const MyValue = Symbol.from("MyValue")
857
+ *
858
+ * registerValue({token: MyValue, useValue: "myValue"});
859
+ *
860
+ * @Service()
861
+ * export class OtherService {
862
+ * constructor(@Inject(MyValue) myValue: string){
863
+ * console.log(myValue); /// "myValue"
864
+ * }
865
+ * }
866
+ * ```
867
+ */
868
+
869
+ const registerValue = (provider, value) => {
870
+ if (!provider.provide) {
871
+ provider = {
872
+ provide: provider
873
+ };
874
+ }
875
+
876
+ provider = Object.assign({
877
+ scope: exports.ProviderScope.SINGLETON,
878
+ useValue: value
879
+ }, provider, {
880
+ type: exports.ProviderType.VALUE
881
+ });
882
+ GlobalProviders.merge(provider.provide, provider);
883
+ };
884
+ /**
885
+ * Add a new service in the `ProviderRegistry`. This service will be built when `InjectorService` will be loaded.
886
+ *
887
+ * #### Example
888
+ *
889
+ * ```typescript
890
+ * import {registerService, InjectorService} from "@tsed/di";
891
+ *
892
+ * export default class MyFooService {
893
+ * constructor(){}
894
+ * getFoo() {
895
+ * return "test";
896
+ * }
897
+ * }
898
+ *
899
+ * registerService({provide: MyFooService});
900
+ * // or
901
+ * registerService(MyFooService);
902
+ *
903
+ * const injector = new InjectorService();
904
+ * injector.load();
905
+ *
906
+ * const myFooService = injector.get<MyFooService>(MyFooService);
907
+ * myFooService.getFoo(); // test
908
+ * ```
909
+ *
910
+ * @param provider Provider configuration.
911
+ * @deprecated Since 2021-05-15. Use registerProvider instead.
912
+ */
913
+
914
+ const registerService = GlobalProviders.createRegisterFn(exports.ProviderType.SERVICE);
915
+ /**
916
+ * Add a new controller in the `ProviderRegistry`. This controller will be built when `InjectorService` will be loaded.
917
+ *
918
+ * #### Example
919
+ *
920
+ * ```typescript
921
+ * import {registerController, InjectorService} from "@tsed/di";
922
+ *
923
+ * export default class MyController {
924
+ * constructor(){}
925
+ * transform() {
926
+ * return "test";
927
+ * }
928
+ * }
929
+ *
930
+ * registerController({provide: MyController});
931
+ * // or
932
+ * registerController(MyController);
933
+ *
934
+ * const injector = new InjectorService();
935
+ * injector.load();
936
+ *
937
+ * const myController = injector.get<MyController>(MyController);
938
+ * myController.getFoo(); // test
939
+ * ```
940
+ *
941
+ * @param provider Provider configuration.
942
+ */
943
+
944
+ const registerController = GlobalProviders.createRegisterFn(exports.ProviderType.CONTROLLER);
945
+
946
+ /**
947
+ * The decorators `@Injectable()` declare a new service can be injected in other service, controller, interceptor, etc.. on there `constructor`.
948
+ * All classes annotated with `@Injectable()` are built one time, excepted if you change the default provider configuration.
949
+ *
950
+ * <<< @/docs/snippets/providers/getting-started-injectable.ts
951
+ *
952
+ * ::: tip
953
+ * `@Injectable()` use the `reflect-metadata` to collect and inject the built provided to other services.
954
+ * :::
955
+ *
956
+ * ### Options
957
+ *
958
+ * - type (@@ProviderType@@ or `string`): Kind of provider. (Default: `ProviderType.PROVIDER`)
959
+ * - scope (@@ProviderScope@): Kind of provider. (Default: `ProviderScope.SINGLETON`)
960
+ * - deps (`Type<any>`): List of class or provider which will be injected to the constructor (Note: This options override default metadata generated by Typescript).
961
+ *
962
+ * @returns {Function}
963
+ * @decorator
964
+ */
965
+
966
+ function Injectable(options = {}) {
967
+ return provide => {
968
+ registerProvider(_extends({}, options, {
969
+ provide
970
+ }));
971
+ };
972
+ }
973
+
974
+ /**
975
+ * The decorators `@Service()` declare a new service can be injected in other service or controller on there `constructor`.
976
+ * All services annotated with `@Service()` are constructed one time.
977
+ *
978
+ * > `@Service()` use the `reflect-metadata` to collect and inject service on controllers or other services.
979
+ *
980
+ * @returns {Function}
981
+ * @decorator
982
+ */
983
+
984
+ function Service() {
985
+ return Injectable();
986
+ }
987
+
988
+ /**
989
+ * Override a provider which is already registered in ProviderRegistry.
990
+ * @returns {Function}
991
+ * @decorators
992
+ * @param originalProvider
993
+ */
994
+
995
+ function OverrideProvider(originalProvider) {
996
+ return target => {
997
+ GlobalProviders.get(originalProvider).useClass = target;
998
+ };
999
+ }
1000
+
1001
+ /**
1002
+ * Inject a provider to another provider.
1003
+ *
1004
+ * Use this decorator to inject a custom provider on constructor parameter or property.
1005
+ *
1006
+ * ```typescript
1007
+ * @Injectable()
1008
+ * export class MyService {
1009
+ * @Inject(CONNECTION)
1010
+ * connection: CONNECTION;
1011
+ * }
1012
+ * ```
1013
+ *
1014
+ * @param symbol
1015
+ * @param onGet Use the given name method to inject
1016
+ * @returns {Function}
1017
+ * @decorator
1018
+ */
1019
+
1020
+ function Inject(symbol, onGet) {
1021
+ return (target, propertyKey, descriptor) => {
1022
+ const bindingType = core.decoratorTypeOf([target, propertyKey, descriptor]);
1023
+
1024
+ switch (bindingType) {
1025
+ case core.DecoratorTypes.PARAM:
1026
+ case core.DecoratorTypes.PARAM_CTOR:
1027
+ if (symbol) {
1028
+ const paramTypes = core.Metadata.getParamTypes(target, propertyKey);
1029
+ paramTypes[descriptor] = symbol;
1030
+ core.Metadata.setParamTypes(target, propertyKey, paramTypes);
1031
+ }
1032
+
1033
+ break;
1034
+
1035
+ case core.DecoratorTypes.PROP:
1036
+ core.Store.from(target).merge(INJECTABLE_PROP, {
1037
+ [propertyKey]: {
1038
+ bindingType,
1039
+ propertyKey,
1040
+ onGet,
1041
+ useType: symbol || core.Metadata.getType(target, propertyKey)
1042
+ }
1043
+ });
1044
+ break;
1045
+
1046
+ case core.DecoratorTypes.METHOD:
1047
+ core.Store.from(target).merge(INJECTABLE_PROP, {
1048
+ [propertyKey]: {
1049
+ bindingType,
1050
+ propertyKey
1051
+ }
1052
+ });
1053
+ return descriptor;
1054
+
1055
+ default:
1056
+ throw new core.UnsupportedDecoratorType(Inject, [target, propertyKey, descriptor]);
1057
+ }
1058
+ };
1059
+ }
1060
+
1061
+ /**
1062
+ * Return value from Configuration.
1063
+ *
1064
+ * ## Example
1065
+ *
1066
+ * ```typescript
1067
+ * import {Env} from "@tsed/core";
1068
+ * import {Constant, Value} from "@tsed/di";
1069
+ *
1070
+ * export class MyClass {
1071
+ *
1072
+ * @Constant("env")
1073
+ * env: Env;
1074
+ *
1075
+ * @Value("swagger.path")
1076
+ * swaggerPath: string;
1077
+ *
1078
+ * @Value("swagger.path", "defaultValue")
1079
+ * swaggerPath: string;
1080
+ *
1081
+ * constructor() {
1082
+ * console.log(this.swaggerPath) // undefined. Not available on constructor
1083
+ * }
1084
+ *
1085
+ * $onInit() {
1086
+ * console.log(this.swaggerPath) // something
1087
+ * }
1088
+ * }
1089
+ * ```
1090
+ *
1091
+ * @param {string} expression
1092
+ * @param defaultValue
1093
+ * @returns {(targetClass: any, attributeName: string) => any}
1094
+ * @decorator
1095
+ */
1096
+
1097
+ function Constant(expression, defaultValue) {
1098
+ return (target, propertyKey) => {
1099
+ core.Store.from(target).merge(INJECTABLE_PROP, {
1100
+ [propertyKey]: {
1101
+ bindingType: exports.InjectablePropertyType.CONSTANT,
1102
+ propertyKey,
1103
+ expression,
1104
+ defaultValue
1105
+ }
1106
+ });
1107
+ };
1108
+ }
1109
+
1110
+ /**
1111
+ * Return value from Configuration.
1112
+ *
1113
+ * ## Example
1114
+ *
1115
+ * ```typescript
1116
+ * import {Env} from "@tsed/core";
1117
+ * import {Constant, Value} from "@tsed/di";
1118
+ *
1119
+ * export class MyClass {
1120
+ *
1121
+ * @Constant("env")
1122
+ * env: Env;
1123
+ *
1124
+ * @Value("swagger.path")
1125
+ * swaggerPath: string;
1126
+ *
1127
+ * @Value("swagger.path", "defaultValue")
1128
+ * swaggerPath: string;
1129
+ *
1130
+ * constructor() {
1131
+ * console.log(this.swaggerPath) // undefined. Not available on constructor
1132
+ * }
1133
+ *
1134
+ * $onInit() {
1135
+ * console.log(this.swaggerPath) // something
1136
+ * }
1137
+ * }
1138
+ * ```
1139
+ *
1140
+ * @param expression
1141
+ * @param defaultValue
1142
+ * @returns {(targetClass: any, attributeName: string) => any}
1143
+ * @decorator
1144
+ */
1145
+
1146
+ function Value(expression, defaultValue) {
1147
+ return (target, propertyKey) => {
1148
+ core.Store.from(target).merge(INJECTABLE_PROP, {
1149
+ [propertyKey]: {
1150
+ bindingType: exports.InjectablePropertyType.VALUE,
1151
+ propertyKey,
1152
+ expression,
1153
+ defaultValue
1154
+ }
1155
+ });
1156
+ };
1157
+ }
1158
+
1159
+ /**
1160
+ * Attaches interceptor to method call and executes the before and after methods
1161
+ *
1162
+ * @param interceptor
1163
+ * @param options
1164
+ * @decorator
1165
+ */
1166
+
1167
+ function Intercept(interceptor, options) {
1168
+ return (target, propertyKey, descriptor) => {
1169
+ core.Store.from(target).merge(INJECTABLE_PROP, {
1170
+ [propertyKey]: {
1171
+ bindingType: exports.InjectablePropertyType.INTERCEPTOR,
1172
+ propertyKey,
1173
+ useType: interceptor,
1174
+ options
1175
+ }
1176
+ });
1177
+ return descriptor;
1178
+ };
1179
+ }
1180
+
1181
+ /**
1182
+ * The decorators `@Service()` declare a new service can be injected in other service or controller on there `constructor`.
1183
+ * All services annotated with `@Service()` are constructed one time.
1184
+ *
1185
+ * > `@Service()` use the `reflect-metadata` to collect and inject service on controllers or other services.
1186
+ *
1187
+ * @returns {Function}
1188
+ * @decorator
1189
+ */
1190
+
1191
+ function Interceptor() {
1192
+ return Injectable({
1193
+ type: exports.ProviderType.INTERCEPTOR
1194
+ });
1195
+ }
1196
+
1197
+ /**
1198
+ * Get or set Configuration on a class.
1199
+ *
1200
+ * @decorator
1201
+ */
1202
+
1203
+ function Configuration(configuration = {}) {
1204
+ return (...args) => {
1205
+ switch (core.decoratorTypeOf(args)) {
1206
+ case core.DecoratorTypes.CLASS:
1207
+ core.StoreSet("configuration", configuration)(args[0]);
1208
+ break;
1209
+
1210
+ default:
1211
+ case core.DecoratorTypes.PARAM_CTOR:
1212
+ return Inject(Configuration)(args[0], args[1], args[2]);
1213
+ }
1214
+ };
1215
+ }
1216
+
1217
+ const _excluded = ["scopes", "imports", "resolvers", "deps", "scope"];
1218
+ /**
1219
+ * Declare a new Ts.ED module
1220
+ *
1221
+ * ## Options
1222
+ * - imports: List of Provider which must be built by injector before invoking the module
1223
+ * - resolvers: List of external DI must be used to resolve unknown provider
1224
+ * - deps: List of provider must be injected to the module constructor (explicit declaration)
1225
+ *
1226
+ * @param options
1227
+ * @decorator
1228
+ */
1229
+
1230
+ function Module(options = {}) {
1231
+ const {
1232
+ imports,
1233
+ resolvers,
1234
+ deps
1235
+ } = options,
1236
+ configuration = _objectWithoutPropertiesLoose(options, _excluded);
1237
+
1238
+ return core.useDecorators(Configuration(configuration), Injectable({
1239
+ type: exports.ProviderType.MODULE,
1240
+ scope: exports.ProviderScope.SINGLETON,
1241
+ imports,
1242
+ deps,
1243
+ injectable: false,
1244
+ resolvers
1245
+ }));
1246
+ }
1247
+
1248
+ /**
1249
+ * Get instance options. This options depending on his invocation context.
1250
+ *
1251
+ * ```typescript
1252
+ * import {Injectable, Opts, UseOpts} from "@tsed/di";
1253
+ *
1254
+ * @Injectable()
1255
+ * class MyConfigurableService {
1256
+ * source: string;
1257
+ * constructor(@Opts options: any = {}) {
1258
+ * console.log("Hello ", options.source); // log: Hello Service1 then Hello Service2
1259
+ *
1260
+ * this.source = options.source;
1261
+ * }
1262
+ * }
1263
+ *
1264
+ * @Injectable()
1265
+ * class MyService1 {
1266
+ * constructor(@UseOpts({source: 'Service1'}) service: MyConfigurableService) {
1267
+ * console.log(service.source) // log: Service1
1268
+ * }
1269
+ * }
1270
+ *
1271
+ * @Injectable()
1272
+ * class MyService2 {
1273
+ * constructor(@UseOpts({source: 'Service2'}) service: MyConfigurableService) {
1274
+ * console.log(service.source) // log: Service2
1275
+ * }
1276
+ * }
1277
+ * ```
1278
+ *
1279
+ * ::: warning
1280
+ * Using @@Opts@@ decorator on a constructor parameter change the Scope of the provider to `ProviderScope.INSTANCE`.
1281
+ * :::
1282
+ *
1283
+ * @param target
1284
+ * @param propertyKey
1285
+ * @param index
1286
+ * @decorator
1287
+ */
1288
+
1289
+ function Opts(target, propertyKey, index) {
1290
+ Scope(exports.ProviderScope.INSTANCE)(core.classOf(target));
1291
+ Inject(DI_PARAM_OPTIONS)(target, propertyKey, index);
1292
+ }
1293
+
1294
+ /**
1295
+ * Add options to invoke the Service.
1296
+ *
1297
+ * ```typescript
1298
+ * import {Injectable, Opts, UseOpts} from "@tsed/di";
1299
+ *
1300
+ * @Injectable()
1301
+ * class MyConfigurableService {
1302
+ * source: string;
1303
+ * constructor(@Opts options: any = {}) {
1304
+ * console.log("Hello ", options.source); // log: Hello Service1 then Hello Service2
1305
+ *
1306
+ * this.source = options.source;
1307
+ * }
1308
+ * }
1309
+ *
1310
+ * @Injectable()
1311
+ * class MyService1 {
1312
+ * constructor(@UseOpts({source: 'Service1'}) service: MyConfigurableService) {
1313
+ * console.log(service.source) // log: Service1
1314
+ * }
1315
+ * }
1316
+ *
1317
+ * @Injectable()
1318
+ * class MyService2 {
1319
+ * constructor(@UseOpts({source: 'Service2'}) service: MyConfigurableService) {
1320
+ * console.log(service.source) // log: Service2
1321
+ * }
1322
+ * }
1323
+ * ```
1324
+ *
1325
+ * ::: warning
1326
+ * Using @@Opts@@ decorator on a constructor parameter change the Scope of the provider to `ProviderScope.INSTANCE`.
1327
+ * :::
1328
+ *
1329
+ * @returns {Function}
1330
+ * @decorator
1331
+ * @param options
1332
+ */
1333
+
1334
+ function UseOpts(options) {
1335
+ return (target, propertyKey, index) => {
1336
+ const bindingType = core.decoratorTypeOf([target, propertyKey, index]);
1337
+
1338
+ switch (bindingType) {
1339
+ case core.DecoratorTypes.PARAM_CTOR:
1340
+ core.Store.from(target).merge(`${DI_PARAM_OPTIONS}:${index}`, options);
1341
+ break;
1342
+
1343
+ case core.DecoratorTypes.PROP:
1344
+ core.Store.from(target).merge(INJECTABLE_PROP, {
1345
+ [propertyKey]: {
1346
+ options
1347
+ }
1348
+ });
1349
+ break;
1350
+
1351
+ default:
1352
+ throw new core.UnsupportedDecoratorType(UseOpts, [target, propertyKey, index]);
1353
+ }
1354
+ };
1355
+ }
1356
+
1357
+ class InjectionError extends Error {
1358
+ constructor(token, origin) {
1359
+ super(core.isString(origin) ? origin : "");
1360
+ this.name = "INJECTION_ERROR";
1361
+ this.tokens = [];
1362
+ this.tokens = [token];
1363
+
1364
+ if (origin) {
1365
+ if (core.isString(origin)) {
1366
+ this.origin = {
1367
+ message: origin,
1368
+ stack: this.stack
1369
+ };
1370
+ } else {
1371
+ if (origin.tokens) {
1372
+ this.tokens = this.tokens.concat(origin.tokens);
1373
+ this.origin = origin.origin;
1374
+ } else {
1375
+ this.origin = origin;
1376
+ this.stack = origin.stack;
1377
+ }
1378
+ }
1379
+ }
1380
+
1381
+ const originMessage = this.origin ? "\nOrigin: " + this.origin.message : "";
1382
+ const tokensMessage = this.tokens.map(token => core.nameOf(token)).join(" > ");
1383
+ this.message = `Injection failed on ${tokensMessage}${originMessage}`;
1384
+ }
1385
+
1386
+ static throwInjectorError(token, currentDependency, error) {
1387
+ if (currentDependency && core.isClass(token)) {
1388
+ error.message = printDependencyInjectionError(token, _extends({}, currentDependency, {
1389
+ message: error.message
1390
+ }));
1391
+ }
1392
+
1393
+ throw new InjectionError(token, error);
1394
+ }
1395
+
1396
+ }
1397
+
1398
+ function printDependencyInjectionError(token, options) {
1399
+ let erroredArg = "";
1400
+ const args = core.getConstructorArgNames(token).map((arg, index) => {
1401
+ if (options.index === index) {
1402
+ erroredArg = arg;
1403
+ arg = chalk__default['default'].red(arg);
1404
+ }
1405
+
1406
+ return `${arg}: ${core.nameOf(options.deps[index])}`;
1407
+ }).join(", ");
1408
+ const signature = core.nameOf(token) + "->constructor(" + args + ")";
1409
+ const indexOf = signature.indexOf(erroredArg) - 5;
1410
+
1411
+ const drawline = indexOf => " ".repeat(indexOf) + chalk__default['default'].red("^" + "‾".repeat(erroredArg.length - 1));
1412
+
1413
+ return "Unable to inject dependency. " + options.message + "\n\n" + signature + "\n" + (indexOf > -1 ? drawline(indexOf) : "");
1414
+ }
1415
+
1416
+ class UndefinedTokenError extends Error {
1417
+ constructor() {
1418
+ super("Given token is undefined. Have you enabled emitDecoratorMetadata in your tsconfig.json or decorated your class with @Injectable, @Service, ... decorator ?");
1419
+ this.name = "UNDEFINED_TOKEN_ERROR";
1420
+ }
1421
+
1422
+ }
1423
+
1424
+ function createContainer(rootModule) {
1425
+ const container = new Container(GlobalProviders.entries());
1426
+
1427
+ if (rootModule) {
1428
+ container.delete(rootModule);
1429
+ }
1430
+
1431
+ return container;
1432
+ }
1433
+
1434
+ class DIConfiguration {
1435
+ constructor(initialProps = {}) {
1436
+ this.default = new Map();
1437
+ this.map = new Map();
1438
+ Object.entries(_extends({
1439
+ scopes: {},
1440
+ resolvers: [],
1441
+ imports: []
1442
+ }, initialProps)).forEach(([key, value]) => {
1443
+ this.default.set(key, value);
1444
+ });
1445
+ return core.proxyDelegation(this, {
1446
+ ownKeys(target) {
1447
+ return [...target.default.keys(), ...target.map.keys()];
1448
+ }
1449
+
1450
+ });
1451
+ }
1452
+
1453
+ get scopes() {
1454
+ return this.getRaw("scopes");
1455
+ }
1456
+
1457
+ set scopes(value) {
1458
+ this.setRaw("scopes", value);
1459
+ }
1460
+
1461
+ get resolvers() {
1462
+ return this.getRaw("resolvers");
1463
+ }
1464
+
1465
+ set resolvers(resolvers) {
1466
+ this.setRaw("resolvers", resolvers);
1467
+ }
1468
+
1469
+ get imports() {
1470
+ return this.getRaw("imports");
1471
+ }
1472
+
1473
+ set imports(imports) {
1474
+ this.setRaw("imports", imports);
1475
+ }
1476
+ /**
1477
+ *
1478
+ * @param callbackfn
1479
+ * @param thisArg
1480
+ */
1481
+
1482
+
1483
+ forEach(callbackfn, thisArg) {
1484
+ return new Set([...Array.from(this.default.keys()), ...Array.from(this.map.keys())]).forEach(key => {
1485
+ callbackfn(this.getRaw(key), key, this.map);
1486
+ }, thisArg);
1487
+ }
1488
+ /**
1489
+ *
1490
+ * @param propertyKey
1491
+ * @param value
1492
+ */
1493
+
1494
+
1495
+ set(propertyKey, value) {
1496
+ if (typeof propertyKey === "string") {
1497
+ this.setRaw(propertyKey, value);
1498
+ } else {
1499
+ Object.entries(propertyKey).forEach(([key, value]) => {
1500
+ this[key] = value;
1501
+ });
1502
+ }
1503
+
1504
+ return this;
1505
+ }
1506
+
1507
+ setRaw(propertyKey, value) {
1508
+ core.setValue(this.map, propertyKey, value);
1509
+ return this;
1510
+ }
1511
+ /**
1512
+ *
1513
+ * @param propertyKey
1514
+ * @param defaultValue
1515
+ * @returns {undefined|any}
1516
+ */
1517
+
1518
+
1519
+ get(propertyKey, defaultValue) {
1520
+ return this.resolve(this.getRaw(propertyKey, defaultValue));
1521
+ }
1522
+
1523
+ getRaw(propertyKey, defaultValue) {
1524
+ const value = core.getValue(this.map, propertyKey);
1525
+
1526
+ if (value !== undefined) {
1527
+ return value;
1528
+ }
1529
+
1530
+ return core.getValue(this.default, propertyKey, defaultValue);
1531
+ }
1532
+
1533
+ merge(obj) {
1534
+ Object.entries(obj).forEach(([key, value]) => {
1535
+ const descriptor = Object.getOwnPropertyDescriptor(DIConfiguration.prototype, key);
1536
+ const originalValue = this.get(key);
1537
+ value = core.deepMerge(value, originalValue);
1538
+
1539
+ if (descriptor && !["default", "set", "map", "get"].includes(key)) {
1540
+ this[key] = value;
1541
+ }
1542
+ });
1543
+ }
1544
+ /**
1545
+ *
1546
+ * @param value
1547
+ * @returns {any}
1548
+ */
1549
+
1550
+
1551
+ resolve(value) {
1552
+ if (typeof value === "object" && value !== null) {
1553
+ if (![Array, Object].includes(core.classOf(value))) {
1554
+ return value;
1555
+ }
1556
+
1557
+ return Object.entries(value).reduce((o, [k, v]) => {
1558
+ // @ts-ignore
1559
+ o[k] = this.resolve(v);
1560
+ return o;
1561
+ }, Array.isArray(value) ? [] : {});
1562
+ }
1563
+
1564
+ if (typeof value === "string") {
1565
+ const replacer = (match, key) => core.getValue(this.map, key);
1566
+
1567
+ return value.replace(/\${([\w.]+)}/gi, replacer).replace(/<([\w.]+)>/gi, replacer).replace(/{{([\w.]+)}}/gi, replacer);
1568
+ }
1569
+
1570
+ return value;
1571
+ }
1572
+
1573
+ build() {
1574
+ this.forEach((value, key) => this.map.set(key, this.resolve(value)));
1575
+ this.set = this.setRaw;
1576
+
1577
+ this.get = this.getRaw = (propertyKey, defaultValue) => core.getValue(this.map, propertyKey, defaultValue);
1578
+ }
1579
+
1580
+ }
1581
+
1582
+ var InjectorService_1;
1583
+ /**
1584
+ * This service contain all services collected by `@Service` or services declared manually with `InjectorService.factory()` or `InjectorService.service()`.
1585
+ *
1586
+ * ### Example:
1587
+ *
1588
+ * ```typescript
1589
+ * import {InjectorService} from "@tsed/di";
1590
+ *
1591
+ * // Import the services (all services are decorated with @Service()";
1592
+ * import MyService1 from "./services/service1";
1593
+ * import MyService2 from "./services/service2";
1594
+ * import MyService3 from "./services/service3";
1595
+ *
1596
+ * // When all services is imported you can load InjectorService.
1597
+ * const injector = new InjectorService()
1598
+ *
1599
+ * await injector.load();
1600
+ *
1601
+ * const myService1 = injector.get<MyService1>(MyServcice1);
1602
+ * ```
1603
+ */
1604
+
1605
+ exports.InjectorService = InjectorService_1 = class InjectorService extends Container {
1606
+ constructor() {
1607
+ super();
1608
+ this.settings = new DIConfiguration();
1609
+ this.logger = console;
1610
+ this.resolvedConfiguration = false;
1611
+ const provider = this.addProvider(InjectorService_1).getProvider(InjectorService_1);
1612
+ provider.instance = this;
1613
+ }
1614
+
1615
+ get resolvers() {
1616
+ return this.settings.resolvers;
1617
+ }
1618
+
1619
+ get scopes() {
1620
+ return this.settings.scopes || {};
1621
+ }
1622
+ /**
1623
+ * Retrieve default scope for a given provider.
1624
+ * @param provider
1625
+ */
1626
+
1627
+
1628
+ scopeOf(provider) {
1629
+ return provider.scope || this.scopes[provider.type] || exports.ProviderScope.SINGLETON;
1630
+ }
1631
+ /**
1632
+ * Clone a provider from GlobalProviders and the given token. forkProvider method build automatically the provider if the instance parameter ins't given.
1633
+ * @param token
1634
+ * @param settings
1635
+ */
1636
+
1637
+
1638
+ forkProvider(token, settings = {}) {
1639
+ if (!this.hasProvider(token)) {
1640
+ this.addProvider(token);
1641
+ }
1642
+
1643
+ const provider = this.getProvider(token);
1644
+ Object.assign(provider, settings);
1645
+ provider.instance = this.invoke(token);
1646
+ return provider;
1647
+ }
1648
+ /**
1649
+ * Return a list of instance build by the injector.
1650
+ */
1651
+
1652
+
1653
+ toArray() {
1654
+ return super.toArray().map(provider => provider.instance);
1655
+ }
1656
+ /**
1657
+ * Get a service or factory already constructed from his symbol or class.
1658
+ *
1659
+ * #### Example
1660
+ *
1661
+ * ```typescript
1662
+ * import {InjectorService} from "@tsed/di";
1663
+ * import MyService from "./services";
1664
+ *
1665
+ * class OtherService {
1666
+ * constructor(injectorService: InjectorService) {
1667
+ * const myService = injectorService.get<MyService>(MyService);
1668
+ * }
1669
+ * }
1670
+ * ```
1671
+ *
1672
+ * @param token The class or symbol registered in InjectorService.
1673
+ * @param options
1674
+ * @returns {boolean}
1675
+ */
1676
+
1677
+
1678
+ get(token, options = {}) {
1679
+ var _super$get;
1680
+
1681
+ const instance = (_super$get = super.get(core.getClassOrSymbol(token))) == null ? void 0 : _super$get.instance;
1682
+
1683
+ if (instance !== undefined) {
1684
+ return instance;
1685
+ }
1686
+
1687
+ if (!this.hasProvider(token)) {
1688
+ for (const resolver of this.resolvers) {
1689
+ const result = resolver.get(token, options);
1690
+
1691
+ if (result !== undefined) {
1692
+ return result;
1693
+ }
1694
+ }
1695
+ }
1696
+ }
1697
+ /**
1698
+ * The has() method returns a boolean indicating whether an element with the specified key exists or not.
1699
+ * @returns {boolean}
1700
+ * @param token
1701
+ */
1702
+
1703
+
1704
+ has(token) {
1705
+ return super.has(core.getClassOrSymbol(token)) && this.get(token) !== undefined;
1706
+ }
1707
+ /**
1708
+ * Invoke the class and inject all services that required by the class constructor.
1709
+ *
1710
+ * #### Example
1711
+ *
1712
+ * ```typescript
1713
+ * import {InjectorService} from "@tsed/di";
1714
+ * import MyService from "./services";
1715
+ *
1716
+ * class OtherService {
1717
+ * constructor(injectorService: InjectorService) {
1718
+ * const myService = injectorService.invoke<MyService>(MyService);
1719
+ * }
1720
+ * }
1721
+ * ```
1722
+ *
1723
+ * @param token The injectable class to invoke. Class parameters are injected according constructor signature.
1724
+ * @param locals Optional object. If preset then any argument Class are read from this object first, before the `InjectorService` is consulted.
1725
+ * @param options
1726
+ * @returns {T} The class constructed.
1727
+ */
1728
+
1729
+
1730
+ invoke(token, locals = new LocalsContainer(), options = {}) {
1731
+ const provider = this.ensureProvider(token);
1732
+ let instance;
1733
+ !locals.has(Configuration) && locals.set(Configuration, this.settings);
1734
+
1735
+ if (locals.has(token)) {
1736
+ return locals.get(token);
1737
+ }
1738
+
1739
+ if (token === DI_PARAM_OPTIONS) {
1740
+ return {};
1741
+ }
1742
+
1743
+ if (!provider || options.rebuild) {
1744
+ instance = this.resolve(token, locals, options);
1745
+ this.hasProvider(token) && (this.getProvider(token).instance = instance);
1746
+ return instance;
1747
+ }
1748
+
1749
+ switch (this.scopeOf(provider)) {
1750
+ case exports.ProviderScope.SINGLETON:
1751
+ if (!this.has(token)) {
1752
+ provider.instance = this.resolve(token, locals, options);
1753
+
1754
+ if (provider.isAsync()) {
1755
+ provider.instance.then(instance => {
1756
+ provider.instance = instance;
1757
+ });
1758
+ }
1759
+ }
1760
+
1761
+ instance = this.get(token);
1762
+ break;
1763
+
1764
+ case exports.ProviderScope.REQUEST:
1765
+ instance = this.resolve(token, locals, options);
1766
+ locals.set(token, instance);
1767
+ break;
1768
+
1769
+ case exports.ProviderScope.INSTANCE:
1770
+ instance = this.resolve(provider.provide, locals, options);
1771
+ break;
1772
+ }
1773
+
1774
+ return instance;
1775
+ }
1776
+ /**
1777
+ * Build only providers which are asynchronous.
1778
+ */
1779
+
1780
+
1781
+ async loadAsync(locals = new LocalsContainer()) {
1782
+ for (const [, provider] of this) {
1783
+ if (!locals.has(provider.token)) {
1784
+ if (provider.isAsync()) {
1785
+ await this.invoke(provider.token, locals);
1786
+ }
1787
+
1788
+ if (provider.instance) {
1789
+ locals.set(provider.token, provider.instance);
1790
+ }
1791
+ }
1792
+ }
1793
+
1794
+ return locals;
1795
+ }
1796
+
1797
+ loadSync(locals = new LocalsContainer()) {
1798
+ for (const [, provider] of this) {
1799
+ if (!locals.has(provider.token) && this.scopeOf(provider) === exports.ProviderScope.SINGLETON) {
1800
+ this.invoke(provider.token, locals);
1801
+ }
1802
+
1803
+ if (provider.instance !== undefined) {
1804
+ locals.set(provider.token, provider.instance);
1805
+ }
1806
+ }
1807
+
1808
+ return locals;
1809
+ }
1810
+ /**
1811
+ * Boostrap injector from container and resolve configuration.
1812
+ *
1813
+ * @param container
1814
+ */
1815
+
1816
+
1817
+ bootstrap(container = createContainer()) {
1818
+ // Clone all providers in the container
1819
+ this.addProviders(container); // Resolve all configuration
1820
+
1821
+ this.resolveConfiguration();
1822
+ return this;
1823
+ }
1824
+ /**
1825
+ * Build all providers from given container (or GlobalProviders) and emit `$onInit` event.
1826
+ *
1827
+ * @param container
1828
+ * @param rootModule
1829
+ */
1830
+
1831
+
1832
+ async load(container = createContainer(), rootModule) {
1833
+ this.bootstrap(container); // build async and sync provider
1834
+
1835
+ let locals = await this.loadAsync();
1836
+
1837
+ if (rootModule) {
1838
+ await this.invoke(rootModule);
1839
+ } // load sync provider
1840
+
1841
+
1842
+ locals = this.loadSync(locals);
1843
+ await locals.emit("$onInit");
1844
+ return locals;
1845
+ }
1846
+ /**
1847
+ * Load all configurations registered on providers
1848
+ */
1849
+
1850
+
1851
+ resolveConfiguration() {
1852
+ if (this.resolvedConfiguration) {
1853
+ return;
1854
+ }
1855
+
1856
+ const mergedConfiguration = new Map();
1857
+ super.forEach(provider => {
1858
+ if (provider.configuration) {
1859
+ Object.entries(provider.configuration).forEach(([key, value]) => {
1860
+ value = mergedConfiguration.has(key) ? core.deepMerge(mergedConfiguration.get(key), value) : core.deepClone(value);
1861
+ mergedConfiguration.set(key, value);
1862
+ });
1863
+ }
1864
+
1865
+ if (provider.resolvers) {
1866
+ this.resolvers.push(...provider.resolvers);
1867
+ }
1868
+ });
1869
+ mergedConfiguration.forEach((value, key) => {
1870
+ this.settings[key] = core.deepMerge(value, this.settings[key]);
1871
+ });
1872
+ this.settings.build();
1873
+ this.resolvedConfiguration = true;
1874
+ }
1875
+ /**
1876
+ *
1877
+ * @param instance
1878
+ * @param locals
1879
+ * @param options
1880
+ */
1881
+
1882
+
1883
+ bindInjectableProperties(instance, locals, options) {
1884
+ const properties = core.ancestorsOf(core.classOf(instance)).reduce((properties, target) => {
1885
+ const store = core.Store.from(target);
1886
+ return _extends({}, properties, store.get(INJECTABLE_PROP) || {});
1887
+ }, {});
1888
+ Object.values(properties).forEach(definition => {
1889
+ switch (definition.bindingType) {
1890
+ case exports.InjectablePropertyType.METHOD:
1891
+ this.bindMethod(instance, definition);
1892
+ break;
1893
+
1894
+ case exports.InjectablePropertyType.PROPERTY:
1895
+ this.bindProperty(instance, definition, locals, options);
1896
+ break;
1897
+
1898
+ case exports.InjectablePropertyType.CONSTANT:
1899
+ this.bindConstant(instance, definition);
1900
+ break;
1901
+
1902
+ case exports.InjectablePropertyType.VALUE:
1903
+ this.bindValue(instance, definition);
1904
+ break;
1905
+
1906
+ case exports.InjectablePropertyType.INTERCEPTOR:
1907
+ this.bindInterceptor(instance, definition);
1908
+ break;
1909
+ }
1910
+ });
1911
+ }
1912
+ /**
1913
+ *
1914
+ * @param instance
1915
+ * @param {string} propertyKey
1916
+ */
1917
+
1918
+
1919
+ bindMethod(instance, {
1920
+ propertyKey
1921
+ }) {
1922
+ const target = core.classOf(instance);
1923
+ const originalMethod = instance[propertyKey];
1924
+ const deps = core.Metadata.getParamTypes(core.prototypeOf(target), propertyKey);
1925
+
1926
+ instance[propertyKey] = () => {
1927
+ const services = deps.map(dependency => this.get(dependency));
1928
+ return originalMethod.call(instance, ...services);
1929
+ };
1930
+ }
1931
+ /**
1932
+ * Create an injectable property.
1933
+ *
1934
+ * @param instance
1935
+ * @param {string} propertyKey
1936
+ * @param {any} useType
1937
+ * @param onGet
1938
+ * @param options
1939
+ * @param locals
1940
+ * @param invokeOptions
1941
+ */
1942
+
1943
+
1944
+ bindProperty(instance, {
1945
+ propertyKey,
1946
+ useType,
1947
+ onGet = f => f,
1948
+ options
1949
+ }, locals, invokeOptions) {
1950
+ invokeOptions = _extends({}, invokeOptions);
1951
+ locals.set(DI_PARAM_OPTIONS, _extends({}, options));
1952
+ let bean = this.invoke(useType, locals, invokeOptions);
1953
+ locals.delete(DI_PARAM_OPTIONS);
1954
+
1955
+ if (core.isPromise(bean)) {
1956
+ bean.then(result => {
1957
+ bean = result;
1958
+ });
1959
+ }
1960
+
1961
+ Object.defineProperty(instance, propertyKey, {
1962
+ get: () => onGet(bean)
1963
+ });
1964
+ }
1965
+ /**
1966
+ *
1967
+ * @param instance
1968
+ * @param {string} propertyKey
1969
+ * @param {any} useType
1970
+ */
1971
+
1972
+
1973
+ bindValue(instance, {
1974
+ propertyKey,
1975
+ expression,
1976
+ defaultValue
1977
+ }) {
1978
+ const descriptor = {
1979
+ get: () => this.settings.get(expression) || defaultValue,
1980
+ set: value => this.settings.set(expression, value),
1981
+ enumerable: true,
1982
+ configurable: true
1983
+ };
1984
+ Object.defineProperty(instance, propertyKey, descriptor);
1985
+ }
1986
+ /**
1987
+ *
1988
+ * @param instance
1989
+ * @param {string} propertyKey
1990
+ * @param {any} useType
1991
+ */
1992
+
1993
+
1994
+ bindConstant(instance, {
1995
+ propertyKey,
1996
+ expression,
1997
+ defaultValue
1998
+ }) {
1999
+ const clone = o => {
2000
+ if (o) {
2001
+ return Object.freeze(core.deepClone(o));
2002
+ }
2003
+
2004
+ return defaultValue;
2005
+ };
2006
+
2007
+ const descriptor = {
2008
+ get: () => clone(this.settings.get(expression)),
2009
+ enumerable: true,
2010
+ configurable: true
2011
+ };
2012
+ Object.defineProperty(instance, propertyKey, descriptor);
2013
+ return descriptor;
2014
+ }
2015
+ /**
2016
+ *
2017
+ * @param instance
2018
+ * @param propertyKey
2019
+ * @param useType
2020
+ * @param options
2021
+ */
2022
+
2023
+
2024
+ bindInterceptor(instance, {
2025
+ propertyKey,
2026
+ useType,
2027
+ options
2028
+ }) {
2029
+ const target = core.classOf(instance);
2030
+ const originalMethod = instance[propertyKey];
2031
+
2032
+ instance[propertyKey] = (...args) => {
2033
+ const next = err => {
2034
+ if (!err) {
2035
+ return originalMethod.apply(instance, args);
2036
+ }
2037
+
2038
+ throw err;
2039
+ };
2040
+
2041
+ const context = {
2042
+ target,
2043
+ propertyKey,
2044
+ args,
2045
+ options,
2046
+ next
2047
+ };
2048
+ const interceptor = this.get(useType);
2049
+ return interceptor.intercept(_extends({}, context, {
2050
+ options
2051
+ }), next);
2052
+ };
2053
+ }
2054
+ /**
2055
+ * Allow handler hack for AsyncHookContext plugin.
2056
+ * @param ctx
2057
+ * @param cb
2058
+ * @protected
2059
+ */
2060
+
2061
+
2062
+ runInContext(ctx, cb) {
2063
+ return cb();
2064
+ }
2065
+
2066
+ ensureProvider(token) {
2067
+ if (!this.hasProvider(token) && GlobalProviders.has(token)) {
2068
+ this.addProvider(token);
2069
+ }
2070
+
2071
+ return this.getProvider(token);
2072
+ }
2073
+ /**
2074
+ * Invoke a class method and inject service.
2075
+ *
2076
+ * #### IInjectableMethod options
2077
+ *
2078
+ * * **target**: Optional. The class instance.
2079
+ * * **methodName**: `string` Optional. The method name.
2080
+ * * **designParamTypes**: `any[]` Optional. List of injectable types.
2081
+ * * **locals**: `Map<Function, any>` Optional. If preset then any argument Class are read from this object first, before the `InjectorService` is consulted.
2082
+ *
2083
+ * #### Example
2084
+ *
2085
+ * @param target
2086
+ * @param locals
2087
+ * @param options
2088
+ * @private
2089
+ */
2090
+
2091
+
2092
+ resolve(target, locals, options = {}) {
2093
+ const {
2094
+ token,
2095
+ deps,
2096
+ construct,
2097
+ isBindable,
2098
+ imports,
2099
+ provider
2100
+ } = this.mapInvokeOptions(target, locals, options);
2101
+
2102
+ if (provider) {
2103
+ if (!provider.injectable && options.parent) {
2104
+ throw new InjectionError(token, `${core.nameOf(token)} ${provider.type} is not injectable to another provider`);
2105
+ }
2106
+
2107
+ const {
2108
+ onInvoke
2109
+ } = GlobalProviders.getRegistrySettings(target);
2110
+
2111
+ if (onInvoke) {
2112
+ onInvoke(provider, locals, deps);
2113
+ }
2114
+ }
2115
+
2116
+ let instance;
2117
+ let currentDependency = false;
2118
+
2119
+ try {
2120
+ const invokeDependency = parent => (token, index) => {
2121
+ currentDependency = {
2122
+ token,
2123
+ index,
2124
+ deps
2125
+ };
2126
+
2127
+ if (token !== DI_PARAM_OPTIONS) {
2128
+ var _provider$store;
2129
+
2130
+ const options = provider == null ? void 0 : (_provider$store = provider.store) == null ? void 0 : _provider$store.get(`${DI_PARAM_OPTIONS}:${index}`);
2131
+ locals.set(DI_PARAM_OPTIONS, options || {});
2132
+ }
2133
+
2134
+ return core.isInheritedFrom(token, Provider, 1) ? provider : this.invoke(token, locals, {
2135
+ parent
2136
+ });
2137
+ }; // Invoke manually imported providers
2138
+
2139
+
2140
+ imports.forEach(invokeDependency()); // Inject dependencies
2141
+
2142
+ const services = deps.map(invokeDependency(token));
2143
+ currentDependency = false;
2144
+ instance = construct(services);
2145
+ } catch (error) {
2146
+ InjectionError.throwInjectorError(token, currentDependency, error);
2147
+ }
2148
+
2149
+ if (instance === undefined) {
2150
+ throw new InjectionError(token, `Unable to create new instance from undefined value. Check your provider declaration for ${core.nameOf(token)}`);
2151
+ }
2152
+
2153
+ if (instance && isBindable) {
2154
+ this.bindInjectableProperties(instance, locals, options);
2155
+ }
2156
+
2157
+ return instance;
2158
+ }
2159
+ /**
2160
+ * Create options to invoke a provider or class.
2161
+ * @param token
2162
+ * @param locals
2163
+ * @param options
2164
+ */
2165
+
2166
+
2167
+ mapInvokeOptions(token, locals, options) {
2168
+ let imports = options.imports;
2169
+ let deps = options.deps;
2170
+ let scope = options.scope;
2171
+ let construct;
2172
+ let isBindable = false;
2173
+
2174
+ if (!token) {
2175
+ throw new UndefinedTokenError();
2176
+ }
2177
+
2178
+ let provider;
2179
+
2180
+ if (!this.hasProvider(token)) {
2181
+ provider = new Provider(token);
2182
+ this.resolvers.forEach(resolver => {
2183
+ const result = resolver.get(token, locals.get(DI_PARAM_OPTIONS));
2184
+
2185
+ if (result !== undefined) {
2186
+ provider.useFactory = () => result;
2187
+ }
2188
+ });
2189
+ } else {
2190
+ provider = this.getProvider(token);
2191
+ }
2192
+
2193
+ scope = scope || this.scopeOf(provider);
2194
+ deps = deps || provider.deps;
2195
+ imports = imports || provider.imports;
2196
+
2197
+ if (provider.useValue !== undefined) {
2198
+ construct = () => core.isFunction(provider.useValue) ? provider.useValue() : provider.useValue;
2199
+ } else if (provider.useFactory) {
2200
+ construct = deps => provider.useFactory(...deps);
2201
+ } else if (provider.useAsyncFactory) {
2202
+ construct = deps => provider.useAsyncFactory(...deps);
2203
+ } else {
2204
+ // useClass
2205
+ isBindable = true;
2206
+ deps = deps || core.Metadata.getParamTypes(provider.useClass);
2207
+
2208
+ construct = deps => new provider.useClass(...deps);
2209
+ }
2210
+
2211
+ return {
2212
+ token,
2213
+ scope: scope || core.Store.from(token).get("scope") || exports.ProviderScope.SINGLETON,
2214
+ deps: deps || [],
2215
+ imports: imports || [],
2216
+ isBindable,
2217
+ construct,
2218
+ provider
2219
+ };
2220
+ }
2221
+
2222
+ };
2223
+ exports.InjectorService = InjectorService_1 = tslib.__decorate([Injectable({
2224
+ scope: exports.ProviderScope.SINGLETON,
2225
+ global: true
2226
+ }), tslib.__metadata("design:paramtypes", [])], exports.InjectorService);
2227
+
2228
+ registerProvider({
2229
+ provide: logger.Logger,
2230
+ deps: [exports.InjectorService],
2231
+
2232
+ useFactory(injector) {
2233
+ return injector.logger;
2234
+ }
2235
+
2236
+ });
2237
+
2238
+ /**
2239
+ * @ignore
2240
+ * @param injector
2241
+ */
2242
+ function setLoggerLevel(injector) {
2243
+ var _injector$settings$lo;
2244
+
2245
+ const level = (_injector$settings$lo = injector.settings.logger) == null ? void 0 : _injector$settings$lo.level;
2246
+
2247
+ if (level) {
2248
+ injector.logger.level = level;
2249
+ }
2250
+ }
2251
+
2252
+ /**
2253
+ * Tool to run test with lightweight DI sandbox.
2254
+ */
2255
+
2256
+ class DITest {
2257
+ static get injector() {
2258
+ if (DITest._injector) {
2259
+ return DITest._injector;
2260
+ }
2261
+ /* istanbul ignore next */
2262
+
2263
+
2264
+ throw new Error("PlatformTest.injector is not initialized. Use PlatformTest.create(): Promise before PlatformTest.invoke() or PlatformTest.injector.\n" + "Example:\n" + "before(async () => {\n" + " await PlatformTest.create()\n" + " await PlatformTest.invoke(MyService, [])\n" + "})");
2265
+ }
2266
+
2267
+ static set injector(injector) {
2268
+ DITest._injector = injector;
2269
+ }
2270
+
2271
+ static hasInjector() {
2272
+ return !!DITest._injector;
2273
+ }
2274
+
2275
+ static async create(settings = {}) {
2276
+ DITest.injector = DITest.createInjector(settings);
2277
+ const container = new Container();
2278
+ DITest.injector.bootstrap(container);
2279
+ await DITest.injector.load(container);
2280
+ }
2281
+ /**
2282
+ * Create a new injector with the right default services
2283
+ */
2284
+
2285
+
2286
+ static createInjector(settings = {}) {
2287
+ const injector = new exports.InjectorService();
2288
+ injector.logger = logger.$log; // @ts-ignore
2289
+
2290
+ injector.settings.set(DITest.configure(settings));
2291
+ setLoggerLevel(injector);
2292
+ return injector;
2293
+ }
2294
+ /**
2295
+ * Resets the test injector of the test context, so it won't pollute your next test. Call this in your `tearDown` logic.
2296
+ */
2297
+
2298
+
2299
+ static async reset() {
2300
+ if (DITest.hasInjector()) {
2301
+ await DITest.injector.destroy();
2302
+ DITest._injector = null;
2303
+ }
2304
+ }
2305
+ /**
2306
+ * Invoke a provider and return a fresh instance
2307
+ * @param target
2308
+ * @param providers
2309
+ */
2310
+
2311
+
2312
+ static invoke(target, providers = []) {
2313
+ const locals = new LocalsContainer();
2314
+ providers.forEach(p => {
2315
+ locals.set(p.token, p.use);
2316
+ });
2317
+ locals.set(exports.InjectorService, DITest.injector);
2318
+ const instance = DITest.injector.invoke(target, locals, {
2319
+ rebuild: true
2320
+ });
2321
+
2322
+ if (instance && instance.$onInit) {
2323
+ // await instance.$onInit();
2324
+ const result = instance.$onInit();
2325
+
2326
+ if (result instanceof Promise) {
2327
+ return result.then(() => instance);
2328
+ }
2329
+ }
2330
+
2331
+ return instance;
2332
+ }
2333
+ /**
2334
+ * Return the instance from injector registry
2335
+ * @param target
2336
+ * @param options
2337
+ */
2338
+
2339
+
2340
+ static get(target, options = {}) {
2341
+ return DITest.injector.get(target, options);
2342
+ }
2343
+
2344
+ static configure(settings = {}) {
2345
+ return _extends({}, settings, {
2346
+ env: core.getValue(settings, "env", core.Env.TEST),
2347
+ logger: _extends({}, core.getValue(settings, "logger", {}), {
2348
+ level: core.getValue(settings, "logger.level", "off")
2349
+ })
2350
+ });
2351
+ }
2352
+
2353
+ }
2354
+ DITest._injector = null;
2355
+
2356
+ function isTsEnv() {
2357
+ return require && require.extensions && require.extensions[".ts"] || process.env["TS_TEST"] || process.env.JEST_WORKER_ID !== undefined || process.env.NODE_ENV === "test";
2358
+ }
2359
+
2360
+ function mapExcludes(excludes) {
2361
+ return excludes.map(s => `!${s.replace(/!/gi, "")}`);
2362
+ }
2363
+
2364
+ function mapExtensions(file) {
2365
+ if (!isTsEnv()) {
2366
+ file = file.replace(/\.ts$/i, ".js").replace(/{\.ts,\.js}$/i, ".js");
2367
+ }
2368
+
2369
+ return file;
2370
+ }
2371
+
2372
+ function cleanGlobPatterns(files, excludes) {
2373
+ return [].concat(files).map(s => path.resolve(s)).concat(mapExcludes(excludes)).map(mapExtensions).map(s => core.normalizePath(s));
2374
+ }
2375
+
2376
+ async function importFiles(patterns, exclude) {
2377
+ const files = await globby__default['default'](cleanGlobPatterns(patterns, exclude));
2378
+ const symbols = [];
2379
+
2380
+ for (const file of files) {
2381
+ if (!file.endsWith(".d.ts")) {
2382
+ // prevent .d.ts import if the global pattern isn't correctly configured
2383
+ try {
2384
+ const exports = await Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespace(require(file)); });
2385
+ Object.keys(exports).forEach(key => symbols.push(exports[key]));
2386
+ } catch (er) {
2387
+ // istanbul ignore next
2388
+ console.error(er); // istanbul ignore next
2389
+
2390
+ process.exit(1);
2391
+ }
2392
+ }
2393
+ }
2394
+
2395
+ return symbols;
2396
+ }
2397
+
2398
+ async function resolveSymbols(item, excludes) {
2399
+ if (core.isClass(item)) {
2400
+ return [item];
2401
+ }
2402
+ /* istanbul ignore else */
2403
+
2404
+
2405
+ if (!process.env.WEBPACK) {
2406
+ return importFiles(item, excludes);
2407
+ }
2408
+ /* istanbul ignore next */
2409
+
2410
+
2411
+ return [];
2412
+ }
2413
+
2414
+ function mapConfiguration(config) {
2415
+ if (core.isArray(config)) {
2416
+ return config.map(value => {
2417
+ return {
2418
+ values: [].concat(value)
2419
+ };
2420
+ });
2421
+ }
2422
+
2423
+ return Object.keys(config).reduce((list, key) => {
2424
+ list.push({
2425
+ endpoint: key,
2426
+ values: [].concat(config[key])
2427
+ });
2428
+ return list;
2429
+ }, []);
2430
+ }
2431
+ async function importComponents(config, excludes) {
2432
+ if (!config) {
2433
+ return [];
2434
+ }
2435
+
2436
+ config = mapConfiguration(config);
2437
+ const promises = [];
2438
+
2439
+ for (const option of config) {
2440
+ promises.push(...option.values.map(async value => {
2441
+ const symbols = await resolveSymbols(value, excludes);
2442
+ return symbols.filter(core.isClass).map(symbol => ({
2443
+ token: symbol,
2444
+ route: option.endpoint
2445
+ }));
2446
+ }));
2447
+ }
2448
+
2449
+ const result = await Promise.all(promises);
2450
+ return result.flat();
2451
+ }
2452
+
2453
+ function getConfiguration(module, configuration = {}) {
2454
+ const store = core.Store.from(module).get("configuration") || {};
2455
+
2456
+ const config = _extends({}, store, configuration);
2457
+
2458
+ if (store.mount && configuration.mount) {
2459
+ config.mount = core.deepMerge(store.mount, configuration.mount);
2460
+ }
2461
+
2462
+ if (store.componentsScan && configuration.componentsScan) {
2463
+ config.componentsScan = [...store.componentsScan, ...configuration.componentsScan];
2464
+ }
2465
+
2466
+ return config;
2467
+ }
2468
+
2469
+ async function recursiveImports(providers, settings, properties) {
2470
+ const {
2471
+ exclude = []
2472
+ } = settings;
2473
+ const promises = providers.map(({
2474
+ token
2475
+ }) => GlobalProviders.get(token)).filter(provider => (provider == null ? void 0 : provider.type) === exports.ProviderType.MODULE && provider.configuration).map(provider => importProviders(_extends({
2476
+ exclude
2477
+ }, provider.configuration), properties));
2478
+ return (await Promise.all(promises)).flat();
2479
+ }
2480
+ /**
2481
+ * Import providers from given patterns.
2482
+ *
2483
+ * @param settings
2484
+ * @param properties
2485
+ */
2486
+
2487
+
2488
+ async function importProviders(settings, properties = ["imports"]) {
2489
+ const {
2490
+ exclude = []
2491
+ } = settings;
2492
+ const promises = properties.map(key => importComponents(settings[key], exclude));
2493
+ const providers = (await Promise.all(promises)).flat();
2494
+ const children = await recursiveImports(providers, settings, properties);
2495
+ return [...children, ...providers];
2496
+ }
2497
+
2498
+ exports.Configuration = Configuration;
2499
+ exports.Constant = Constant;
2500
+ exports.Container = Container;
2501
+ exports.ContextLogger = ContextLogger;
2502
+ exports.DIConfiguration = DIConfiguration;
2503
+ exports.DIContext = DIContext;
2504
+ exports.DITest = DITest;
2505
+ exports.DI_PARAMS = DI_PARAMS;
2506
+ exports.DI_PARAM_OPTIONS = DI_PARAM_OPTIONS;
2507
+ exports.GlobalProviderRegistry = GlobalProviderRegistry;
2508
+ exports.GlobalProviders = GlobalProviders;
2509
+ exports.INJECTABLE_PROP = INJECTABLE_PROP;
2510
+ exports.Inject = Inject;
2511
+ exports.Injectable = Injectable;
2512
+ exports.InjectionError = InjectionError;
2513
+ exports.Intercept = Intercept;
2514
+ exports.Interceptor = Interceptor;
2515
+ exports.LocalsContainer = LocalsContainer;
2516
+ exports.Module = Module;
2517
+ exports.Opts = Opts;
2518
+ exports.OverrideProvider = OverrideProvider;
2519
+ exports.Provider = Provider;
2520
+ exports.Scope = Scope;
2521
+ exports.Service = Service;
2522
+ exports.UndefinedTokenError = UndefinedTokenError;
2523
+ exports.UseOpts = UseOpts;
2524
+ exports.Value = Value;
2525
+ exports.createContainer = createContainer;
2526
+ exports.getConfiguration = getConfiguration;
2527
+ exports.importComponents = importComponents;
2528
+ exports.importFiles = importFiles;
2529
+ exports.importProviders = importProviders;
2530
+ exports.mapConfiguration = mapConfiguration;
2531
+ exports.registerController = registerController;
2532
+ exports.registerFactory = registerFactory;
2533
+ exports.registerProvider = registerProvider;
2534
+ exports.registerService = registerService;
2535
+ exports.registerValue = registerValue;
2536
+ exports.setLoggerLevel = setLoggerLevel;
2537
+ //# sourceMappingURL=index.js.map