@tstdl/base 0.85.15 → 0.85.17

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 (42) hide show
  1. package/data-structures/array-list.d.ts +1 -1
  2. package/data-structures/array-list.js +4 -4
  3. package/data-structures/circular-buffer.js +5 -2
  4. package/data-structures/distinct-collection.d.ts +24 -0
  5. package/data-structures/distinct-collection.js +77 -0
  6. package/data-structures/index.d.ts +2 -1
  7. package/data-structures/index.js +2 -1
  8. package/data-structures/list.js +13 -5
  9. package/data-structures/multi-key-map.d.ts +1 -1
  10. package/data-structures/multi-key-map.js +2 -0
  11. package/data-structures/multi-key-set.d.ts +19 -0
  12. package/data-structures/multi-key-set.js +81 -0
  13. package/data-structures/{set.d.ts → set-collection.d.ts} +3 -3
  14. package/data-structures/{set.js → set-collection.js} +7 -7
  15. package/data-structures/sorted-array-list.d.ts +1 -1
  16. package/data-structures/sorted-array-list.js +1 -4
  17. package/data-structures/weak-ref-map.js +4 -1
  18. package/injector/decorators.d.ts +75 -0
  19. package/injector/decorators.js +112 -0
  20. package/injector/inject.d.ts +80 -0
  21. package/injector/inject.js +94 -0
  22. package/injector/injector.d.ts +111 -0
  23. package/injector/injector.js +454 -0
  24. package/injector/interfaces.d.ts +14 -0
  25. package/injector/interfaces.js +26 -0
  26. package/injector/provider.d.ts +44 -0
  27. package/injector/provider.js +64 -0
  28. package/injector/resolve-chain.d.ts +31 -0
  29. package/injector/resolve-chain.js +113 -0
  30. package/injector/resolve.error.d.ts +5 -0
  31. package/injector/resolve.error.js +36 -0
  32. package/injector/symbols.d.ts +2 -0
  33. package/injector/symbols.js +26 -0
  34. package/injector/token.d.ts +18 -0
  35. package/injector/token.js +41 -0
  36. package/injector/type-info.d.ts +18 -0
  37. package/injector/type-info.js +16 -0
  38. package/injector/types.d.ts +43 -0
  39. package/injector/types.js +16 -0
  40. package/package.json +3 -3
  41. package/pool/pool.js +2 -2
  42. package/utils/type-guards.js +2 -2
@@ -0,0 +1,454 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var injector_exports = {};
20
+ __export(injector_exports, {
21
+ Injector: () => Injector
22
+ });
23
+ module.exports = __toCommonJS(injector_exports);
24
+ var import_circular_buffer = require("../data-structures/circular-buffer.js");
25
+ var import_multi_key_map = require("../data-structures/multi-key-map.js");
26
+ var import_deferred_promise = require("../promise/deferred-promise.js");
27
+ var import_registry = require("../reflection/registry.js");
28
+ var import_array = require("../utils/array/array.js");
29
+ var import_forward_ref = require("../utils/object/forward-ref.js");
30
+ var import_object = require("../utils/object/object.js");
31
+ var import_type_guards = require("../utils/type-guards.js");
32
+ var import_inject = require("./inject.js");
33
+ var import_interfaces = require("./interfaces.js");
34
+ var import_provider = require("./provider.js");
35
+ var import_resolve_chain = require("./resolve-chain.js");
36
+ var import_resolve_error = require("./resolve.error.js");
37
+ var import_symbols = require("./symbols.js");
38
+ var import_token = require("./token.js");
39
+ class Injector {
40
+ static #globalRegistrations = /* @__PURE__ */ new Map();
41
+ #parent;
42
+ #registrations = /* @__PURE__ */ new Map();
43
+ #injectorScopedResolutions = new import_multi_key_map.MultiKeyMap();
44
+ name;
45
+ constructor(name, parent = null) {
46
+ this.name = name;
47
+ this.#parent = parent;
48
+ this.register(Injector, { useValue: this });
49
+ }
50
+ /**
51
+ * Globally register a provider for a token
52
+ * @param token token to register
53
+ * @param provider provider used to resolve the token
54
+ * @param options registration options
55
+ */
56
+ static register(token, provider, options = {}) {
57
+ const registration = {
58
+ token,
59
+ provider,
60
+ options
61
+ };
62
+ addRegistration(Injector.#globalRegistrations, registration);
63
+ }
64
+ /**
65
+ * Globally register a provider for a token as a singleton. Alias for {@link register} with `singleton` lifecycle
66
+ * @param token token to register
67
+ * @param provider provider used to resolve the token
68
+ * @param options registration options
69
+ */
70
+ static registerSingleton(token, provider, options) {
71
+ Injector.register(token, provider, { ...options, lifecycle: "singleton" });
72
+ }
73
+ fork(name) {
74
+ return new Injector(name, this);
75
+ }
76
+ /**
77
+ * Register a provider for a token
78
+ * @param token token to register
79
+ * @param provider provider used to resolve the token
80
+ * @param options registration options
81
+ */
82
+ register(token, provider, options = {}) {
83
+ const registration = {
84
+ token,
85
+ provider,
86
+ options,
87
+ resolutions: /* @__PURE__ */ new Map()
88
+ };
89
+ addRegistration(this.#registrations, registration);
90
+ }
91
+ /**
92
+ * Register a provider for a token as a singleton. Alias for {@link register} with `singleton` lifecycle
93
+ * @param token token to register
94
+ * @param provider provider used to resolve the token
95
+ * @param options registration options
96
+ */
97
+ registerSingleton(token, provider, options) {
98
+ this.register(token, provider, { ...options, lifecycle: "singleton" });
99
+ }
100
+ /**
101
+ * Check if token has a registered provider
102
+ * @param token token check
103
+ */
104
+ hasRegistration(token, options) {
105
+ const registration = this.tryGetRegistration(token, options);
106
+ return (0, import_type_guards.isDefined)(registration);
107
+ }
108
+ /**
109
+ * Try to get registration
110
+ * @param token token to get registration for
111
+ */
112
+ tryGetRegistration(token, options) {
113
+ if ((0, import_type_guards.isNull)(this.#parent) && !this.#registrations.has(token) && Injector.#globalRegistrations.has(token)) {
114
+ const globalRegistrations = (0, import_array.toArray)(Injector.#globalRegistrations.get(token));
115
+ for (const globalRegistration of globalRegistrations) {
116
+ this.register(globalRegistration.token, globalRegistration.provider, globalRegistration.options);
117
+ }
118
+ }
119
+ const ownRegistration = options?.skipSelf != true ? this.#registrations.get(token) : void 0;
120
+ if ((0, import_type_guards.isDefined)(ownRegistration)) {
121
+ return ownRegistration;
122
+ }
123
+ if (options?.onlySelf == true) {
124
+ return void 0;
125
+ }
126
+ return this.#parent?.tryGetRegistration(token);
127
+ }
128
+ /**
129
+ * Get registration
130
+ * @param token token to get registration for
131
+ */
132
+ getRegistration(token, options) {
133
+ const registration = this.tryGetRegistration(token, options);
134
+ if ((0, import_type_guards.isUndefined)(registration)) {
135
+ const tokenName = (0, import_token.getTokenName)(token);
136
+ throw new Error(`No provider for ${tokenName} registered.`);
137
+ }
138
+ return registration;
139
+ }
140
+ resolve(token, argument, options = {}) {
141
+ const context = newInternalResolveContext();
142
+ const value = this._resolve(token, argument, options, context, import_resolve_chain.ResolveChain.startWith(token));
143
+ postProcess(context);
144
+ context.$done.resolve();
145
+ return value;
146
+ }
147
+ resolveAll(token, argument, options = {}) {
148
+ const context = newInternalResolveContext();
149
+ const values = this._resolveAll(token, argument, options, context, import_resolve_chain.ResolveChain.startWith(token));
150
+ postProcess(context);
151
+ context.$done.resolve();
152
+ return values;
153
+ }
154
+ async resolveAsync(token, argument, options = {}) {
155
+ const context = newInternalResolveContext();
156
+ const value = this._resolve(token, argument, options, context, import_resolve_chain.ResolveChain.startWith(token));
157
+ await postProcessAsync(context);
158
+ context.$done.resolve();
159
+ return value;
160
+ }
161
+ async resolveAllAsync(token, argument, options = {}) {
162
+ const context = newInternalResolveContext();
163
+ const values = this._resolveAll(token, argument, options, context, import_resolve_chain.ResolveChain.startWith(token));
164
+ await postProcessAsync(context);
165
+ context.$done.resolve();
166
+ return values;
167
+ }
168
+ _resolve(token, argument, options, context, chain) {
169
+ if ((0, import_type_guards.isUndefined)(token)) {
170
+ throw new import_resolve_error.ResolveError("Token is undefined - this might be because of circular dependencies, use alias or forwardRef in this case.", chain);
171
+ }
172
+ const registration = options.skipSelf == true ? void 0 : this.tryGetRegistration(token);
173
+ if ((0, import_type_guards.isUndefined)(registration)) {
174
+ if ((0, import_type_guards.isNotNull)(this.#parent) && options.onlySelf != true) {
175
+ return this.#parent._resolve(token, argument, { ...options, skipSelf: false }, context, chain);
176
+ }
177
+ if (options.optional == true) {
178
+ return void 0;
179
+ }
180
+ throw new import_resolve_error.ResolveError(`No provider for ${(0, import_token.getTokenName)(token)} registered.`, chain);
181
+ }
182
+ const singleRegistration = (0, import_type_guards.isArray)(registration) ? registration[0] : registration;
183
+ return this._resolveRegistration(singleRegistration, argument, options, context, chain);
184
+ }
185
+ _resolveAll(token, argument, options, context, chain) {
186
+ if ((0, import_type_guards.isUndefined)(token)) {
187
+ throw new import_resolve_error.ResolveError("Token is undefined - this might be because of circular dependencies, use alias or forwardRef in this case.", chain);
188
+ }
189
+ const registration = options.skipSelf == true ? void 0 : this.tryGetRegistration(token);
190
+ if ((0, import_type_guards.isUndefined)(registration)) {
191
+ if ((0, import_type_guards.isNotNull)(this.#parent) && options.onlySelf != true) {
192
+ return this.#parent._resolveAll(token, argument, { ...options, skipSelf: false }, context, chain);
193
+ }
194
+ if (options.optional == true) {
195
+ return [];
196
+ }
197
+ throw new import_resolve_error.ResolveError(`No provider for ${(0, import_token.getTokenName)(token)} registered.`, chain);
198
+ }
199
+ const registrations = (0, import_type_guards.isArray)(registration) ? registration : [registration];
200
+ return registrations.map((reg) => this._resolveRegistration(reg, argument, options, context, chain));
201
+ }
202
+ _resolveRegistration(registration, argument, options, context, chain) {
203
+ checkOverflow(chain, context);
204
+ const injectionContext = this.getInjectionContext(context, argument, chain);
205
+ const previousInjectionContext = (0, import_inject.setCurrentInjectionContext)(injectionContext);
206
+ try {
207
+ const token = registration.token;
208
+ const resolutionScoped = registration.options.lifecycle == "resolution";
209
+ const injectorScoped = registration.options.lifecycle == "injector";
210
+ const singletonScoped = registration.options.lifecycle == "singleton";
211
+ const resolveArgument = argument ?? registration.options.defaultArgument ?? registration.options.defaultArgumentProvider?.(this.getResolveContext(context, chain));
212
+ const argumentIdentity = resolveArgumentIdentity(registration, resolveArgument);
213
+ if (resolutionScoped && context.resolutionScopedResolutions.hasFlat(token, argumentIdentity)) {
214
+ return context.resolutionScopedResolutions.getFlat(token, argumentIdentity).value;
215
+ } else if (injectorScoped && this.#injectorScopedResolutions.hasFlat(token, argumentIdentity)) {
216
+ return this.#injectorScopedResolutions.getFlat(token, argumentIdentity).value;
217
+ } else if (singletonScoped && registration.resolutions.has(argumentIdentity)) {
218
+ return registration.resolutions.get(argumentIdentity);
219
+ }
220
+ const value = this._resolveProvider(registration, resolveArgument, options, context, chain);
221
+ const resolution = { registration, value, argument, chain };
222
+ context.resolutions.push(resolution);
223
+ if (resolutionScoped) {
224
+ context.resolutionScopedResolutions.setFlat(token, argumentIdentity, resolution);
225
+ }
226
+ if (injectorScoped) {
227
+ this.#injectorScopedResolutions.setFlat(token, argumentIdentity, resolution);
228
+ }
229
+ if (singletonScoped) {
230
+ registration.resolutions.set(argumentIdentity, value);
231
+ }
232
+ return value;
233
+ } finally {
234
+ (0, import_inject.setCurrentInjectionContext)(previousInjectionContext);
235
+ }
236
+ }
237
+ _resolveProvider(registration, resolveArgument, options, context, chain) {
238
+ try {
239
+ setResolving(registration.token, context, chain);
240
+ const provider = registration.provider;
241
+ if ((0, import_provider.isClassProvider)(provider)) {
242
+ const typeMetadata = import_registry.reflectionRegistry.getMetadata(provider.useClass);
243
+ const arg = resolveArgument ?? provider.defaultArgument ?? provider.defaultArgumentProvider?.();
244
+ if (provider.useClass.length > 0 && ((0, import_type_guards.isUndefined)(typeMetadata) || !typeMetadata.data.has(import_symbols.injectMetadataSymbol))) {
245
+ throw new import_resolve_error.ResolveError(`${provider.useClass.name} has constructor parameters but is not injectable.`, chain);
246
+ }
247
+ const parameters = (typeMetadata?.parameters ?? []).map((metadata) => this.resolveClassInjection(context, provider.useClass, metadata, arg, chain));
248
+ return new provider.useClass(...parameters);
249
+ }
250
+ if ((0, import_provider.isValueProvider)(provider)) {
251
+ return provider.useValue;
252
+ }
253
+ if ((0, import_provider.isTokenProvider)(provider)) {
254
+ const innerToken = provider.useToken ?? provider.useTokenProvider();
255
+ const arg = resolveArgument ?? provider.defaultArgument ?? provider.defaultArgumentProvider?.();
256
+ return this._resolve(innerToken, arg, options, context, chain.addToken(innerToken));
257
+ }
258
+ if ((0, import_provider.isFactoryProvider)(provider)) {
259
+ try {
260
+ return provider.useFactory(resolveArgument, this.getResolveContext(context, chain));
261
+ } catch (error) {
262
+ throw new import_resolve_error.ResolveError("Error in factory.", chain, error);
263
+ }
264
+ }
265
+ throw new Error("Unsupported provider.");
266
+ } finally {
267
+ deleteResolving(registration.token, context);
268
+ }
269
+ }
270
+ resolveClassInjection(context, constructor, metadata, resolveArgument, chain) {
271
+ const getChain = (injectToken2) => chain.addParameter(constructor, metadata.index, injectToken2).addToken(injectToken2);
272
+ const injectMetadata = metadata.data.tryGet(import_symbols.injectMetadataSymbol) ?? {};
273
+ const injectToken = injectMetadata.injectToken ?? metadata.type;
274
+ if ((0, import_type_guards.isDefined)(injectMetadata.injectArgumentMapper) && (!this.hasRegistration(injectToken) || (0, import_type_guards.isDefined)(resolveArgument) || (0, import_type_guards.isUndefined)(injectToken))) {
275
+ return injectMetadata.injectArgumentMapper(resolveArgument);
276
+ }
277
+ const parameterResolveArgument = injectMetadata.forwardArgumentMapper?.(resolveArgument) ?? injectMetadata.resolveArgumentProvider?.(this.getResolveContext(context, getChain(injectToken)));
278
+ if ((0, import_type_guards.isDefined)(injectMetadata.forwardRefToken)) {
279
+ const forwardRef = import_forward_ref.ForwardRef.create();
280
+ const forwardRefToken = injectMetadata.forwardRefToken;
281
+ context.forwardRefQueue.add(() => {
282
+ const forwardToken = (0, import_type_guards.isFunction)(forwardRefToken) ? forwardRefToken() : forwardRefToken;
283
+ if ((0, import_type_guards.isDefined)(injectMetadata.mapper)) {
284
+ throw new import_resolve_error.ResolveError("Cannot use inject mapper with forwardRef.", getChain(forwardToken));
285
+ }
286
+ const resolved2 = this._resolve(forwardToken, parameterResolveArgument, { optional: injectMetadata.optional }, context, getChain(forwardToken));
287
+ import_forward_ref.ForwardRef.setRef(forwardRef, resolved2);
288
+ });
289
+ context.forwardRefs.add(forwardRef);
290
+ return forwardRef;
291
+ }
292
+ const resolved = this._resolve(injectToken, parameterResolveArgument, { optional: injectMetadata.optional }, context, getChain(injectToken));
293
+ return (0, import_type_guards.isDefined)(injectMetadata.mapper) ? injectMetadata.mapper(resolved) : resolved;
294
+ }
295
+ resolveInjection(token, argument, options, context, chain) {
296
+ if ((0, import_type_guards.isDefined)(options.forwardRef)) {
297
+ const forwardRef = import_forward_ref.ForwardRef.create();
298
+ context.forwardRefQueue.add(() => {
299
+ const resolved = this._resolve(token, argument, options, context, chain.addToken(token));
300
+ import_forward_ref.ForwardRef.setRef(forwardRef, resolved);
301
+ });
302
+ context.forwardRefs.add(forwardRef);
303
+ return forwardRef;
304
+ }
305
+ return this._resolve(token, argument, options, context, chain.addToken(token));
306
+ }
307
+ async resolveInjectionAsync(token, argument, options, context, chain) {
308
+ const value = this.resolveInjection(token, argument, options, context, chain);
309
+ await context.$done;
310
+ return value;
311
+ }
312
+ resolveInjectionAll(token, argument, options, context, chain) {
313
+ if ((0, import_type_guards.isDefined)(options.forwardRef)) {
314
+ const forwardRef = import_forward_ref.ForwardRef.create();
315
+ context.forwardRefQueue.add(() => {
316
+ const resolved = this._resolveAll(token, argument, options, context, chain.addToken(token));
317
+ import_forward_ref.ForwardRef.setRef(forwardRef, resolved);
318
+ });
319
+ context.forwardRefs.add(forwardRef);
320
+ return forwardRef;
321
+ }
322
+ return this._resolveAll(token, argument, options, context, chain.addToken(token));
323
+ }
324
+ async resolveInjectionAllAsync(token, argument, options, context, chain) {
325
+ const values = this.resolveInjectionAll(token, argument, options, context, chain);
326
+ await context.$done;
327
+ return values;
328
+ }
329
+ getResolveContext(resolveContext, chain) {
330
+ const context = {
331
+ resolve: (token, argument, options) => this._resolve(token, argument, options ?? {}, resolveContext, chain.addToken(token)),
332
+ resolveAll: (token, argument, options) => this._resolveAll(token, argument, options ?? {}, resolveContext, chain.addToken(token))
333
+ };
334
+ return context;
335
+ }
336
+ getInjectionContext(resolveContext, resolveArgument, chain) {
337
+ const context = {
338
+ argument: resolveArgument,
339
+ inject: (token, argument, options) => this.resolveInjection(token, argument, options ?? {}, resolveContext, chain),
340
+ injectAll: (token, argument, options) => this.resolveInjectionAll(token, argument, options ?? {}, resolveContext, chain),
341
+ injectAsync: async (token, argument, options) => this.resolveInjectionAsync(token, argument, options ?? {}, resolveContext, chain),
342
+ injectAllAsync: async (token, argument, options) => this.resolveInjectionAllAsync(token, argument, options ?? {}, resolveContext, chain)
343
+ };
344
+ return context;
345
+ }
346
+ }
347
+ function addRegistration(registrations, registration) {
348
+ if ((0, import_provider.isClassProvider)(registration.provider)) {
349
+ const injectable = import_registry.reflectionRegistry.getMetadata(registration.provider.useClass)?.data.has(import_symbols.injectableMetadataSymbol) ?? false;
350
+ if (!injectable) {
351
+ throw new Error(`${registration.provider.useClass.name} is not injectable.`);
352
+ }
353
+ }
354
+ const multi = registration.options.multi ?? false;
355
+ const existingRegistration = registrations.get(registration.token);
356
+ const hasExistingRegistration = (0, import_type_guards.isDefined)(existingRegistration);
357
+ const existingIsMulti = hasExistingRegistration && (0, import_type_guards.isArray)(existingRegistration);
358
+ if (hasExistingRegistration && existingIsMulti != multi) {
359
+ throw new Error("Cannot mix multi and non-multi registrations.");
360
+ }
361
+ if (multi && existingIsMulti) {
362
+ existingRegistration.push(registration);
363
+ } else {
364
+ registrations.set(registration.token, multi ? [registration] : registration);
365
+ }
366
+ }
367
+ function newInternalResolveContext() {
368
+ return {
369
+ resolves: 0,
370
+ resolving: /* @__PURE__ */ new Set(),
371
+ resolutionScopedResolutions: new import_multi_key_map.MultiKeyMap(),
372
+ resolutions: [],
373
+ forwardRefQueue: new import_circular_buffer.CircularBuffer(),
374
+ forwardRefs: /* @__PURE__ */ new Set(),
375
+ $done: new import_deferred_promise.DeferredPromise()
376
+ };
377
+ }
378
+ function postProcess(context) {
379
+ for (const fn of context.forwardRefQueue.consume()) {
380
+ fn();
381
+ }
382
+ derefForwardRefs(context);
383
+ for (let i = context.resolutions.length - 1; i >= 0; i--) {
384
+ const resolution = context.resolutions[i];
385
+ if ((0, import_type_guards.isFunction)(resolution.value?.[import_interfaces.afterResolve])) {
386
+ const returnValue = resolution.value[import_interfaces.afterResolve](resolution.argument);
387
+ throwOnPromise(returnValue, "[afterResolve]", resolution.chain);
388
+ }
389
+ if ((0, import_provider.isProviderWithInitializer)(resolution.registration.provider)) {
390
+ const returnValue = resolution.registration.provider.afterResolve?.(resolution.value, resolution.argument);
391
+ throwOnPromise(returnValue, "provider afterResolve handler", resolution.chain);
392
+ }
393
+ if ((0, import_type_guards.isDefined)(resolution.registration.options.afterResolve)) {
394
+ const returnValue = resolution.registration.options.afterResolve(resolution.value, resolution.argument);
395
+ throwOnPromise(returnValue, "registration afterResolve handler", resolution.chain);
396
+ }
397
+ }
398
+ }
399
+ async function postProcessAsync(context) {
400
+ for (const fn of context.forwardRefQueue.consume()) {
401
+ fn();
402
+ }
403
+ derefForwardRefs(context);
404
+ for (let i = context.resolutions.length - 1; i >= 0; i--) {
405
+ const resolution = context.resolutions[i];
406
+ if ((0, import_type_guards.isFunction)(resolution.value?.[import_interfaces.afterResolve])) {
407
+ await resolution.value[import_interfaces.afterResolve](resolution.argument);
408
+ }
409
+ if ((0, import_provider.isProviderWithInitializer)(resolution.registration.provider)) {
410
+ await resolution.registration.provider.afterResolve?.(resolution.value, resolution.argument);
411
+ }
412
+ if ((0, import_type_guards.isDefined)(resolution.registration.options.afterResolve)) {
413
+ await resolution.registration.options.afterResolve(resolution.value, resolution.argument);
414
+ }
415
+ }
416
+ }
417
+ function resolveArgumentIdentity(registration, resolveArgument) {
418
+ if ((0, import_type_guards.isDefined)(registration.options.argumentIdentityProvider) && (registration.options.lifecycle == "resolution" || registration.options.lifecycle == "singleton")) {
419
+ return registration.options.argumentIdentityProvider(resolveArgument);
420
+ }
421
+ return resolveArgument;
422
+ }
423
+ function setResolving(token, context, chain) {
424
+ if (context.resolving.has(token)) {
425
+ throw new import_resolve_error.ResolveError("Circular dependency to itself detected. Please check your registrations and providers. ForwardRef might be a solution.", chain);
426
+ }
427
+ context.resolving.add(token);
428
+ }
429
+ function deleteResolving(token, context) {
430
+ context.resolving.delete(token);
431
+ }
432
+ function throwOnPromise(value, type, chain) {
433
+ if ((0, import_type_guards.isPromise)(value)) {
434
+ throw new import_resolve_error.ResolveError(`Cannot evaluate async ${type} in synchronous resolve, use resolveAsync() instead.`, chain);
435
+ }
436
+ }
437
+ function checkOverflow(chain, context) {
438
+ if (chain.length > 750 || ++context.resolves > 750) {
439
+ throw new import_resolve_error.ResolveError("Resolve stack overflow. This can happen on circular dependencies with transient lifecycles and self reference. Use scoped or singleton lifecycle or forwardRef instead.", chain);
440
+ }
441
+ }
442
+ function derefForwardRefs(context) {
443
+ for (const resolution of context.resolutions.values()) {
444
+ if (!(typeof resolution.value == "object")) {
445
+ continue;
446
+ }
447
+ for (const [key, value] of (0, import_object.objectEntries)(resolution.value)) {
448
+ if (!context.forwardRefs.has(value)) {
449
+ continue;
450
+ }
451
+ resolution.value[key] = import_forward_ref.ForwardRef.deref(value);
452
+ }
453
+ }
454
+ }
@@ -0,0 +1,14 @@
1
+ import type { Type } from '../types.js';
2
+ import type { InjectionToken } from './token.js';
3
+ export declare const resolveArgumentType: unique symbol;
4
+ export declare const afterResolve: unique symbol;
5
+ export type ResolveArgumentType = typeof resolveArgumentType;
6
+ export type ResolveArgument<T, Fallback = undefined> = (T extends Resolvable<infer U> ? U : T extends Type<Resolvable<infer U>> ? U : T extends InjectionToken<infer U, infer A> ? ResolveArgument<U, A> : Fallback) | undefined;
7
+ export interface Resolvable<A = unknown> {
8
+ /**
9
+ * type of resolve argument
10
+ * @deprecated only used for type inference
11
+ */
12
+ readonly [resolveArgumentType]: A;
13
+ [afterResolve]?(argument: A): void | Promise<void>;
14
+ }
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var interfaces_exports = {};
20
+ __export(interfaces_exports, {
21
+ afterResolve: () => afterResolve,
22
+ resolveArgumentType: () => resolveArgumentType
23
+ });
24
+ module.exports = __toCommonJS(interfaces_exports);
25
+ const resolveArgumentType = Symbol("resolveArgumentType");
26
+ const afterResolve = Symbol("after resolve");
@@ -0,0 +1,44 @@
1
+ import type { Constructor, TypedOmit } from '../types.js';
2
+ import type { ResolveArgument } from './interfaces.js';
3
+ import type { InjectionToken } from './token.js';
4
+ import type { ResolveContext } from './types.js';
5
+ export type Factory<T, A = any> = (argument: ResolveArgument<T, A>, context: ResolveContext) => T;
6
+ export type ProviderWithArgument<T, A> = {
7
+ defaultArgument?: ResolveArgument<T, A>;
8
+ defaultArgumentProvider?: () => ResolveArgument<T, A>;
9
+ };
10
+ export type ProviderWithInitializer<T, A> = {
11
+ afterResolve?: (value: T, argument: A) => void | Promise<void>;
12
+ };
13
+ export type Provider<T = any, A = any> = ClassProvider<T> | ValueProvider<T> | TokenProvider<T, A> | FactoryProvider<T, A>;
14
+ export type ClassProvider<T = any, A = any> = ProviderWithArgument<T, A> & ProviderWithInitializer<T, A> & {
15
+ useClass: Constructor<T>;
16
+ };
17
+ export type ValueProvider<T = any> = {
18
+ useValue: T;
19
+ };
20
+ export type TokenProvider<T = any, A = any> = ProviderWithArgument<T, A> & ProviderWithInitializer<T, A> & ({
21
+ useToken: InjectionToken<T, A>;
22
+ useTokenProvider?: undefined;
23
+ } | {
24
+ useToken?: undefined;
25
+ useTokenProvider: () => InjectionToken<T, A>;
26
+ });
27
+ export type FactoryProvider<T = any, A = unknown> = {
28
+ useFactory: Factory<T, A>;
29
+ };
30
+ export declare function classProvider<T, A>(constructor: Constructor<T>, options?: TypedOmit<ClassProvider<T, A>, 'useClass'>): ClassProvider<T, A>;
31
+ export declare function valueProvider<T>(value: T, options?: TypedOmit<ValueProvider<T>, 'useValue'>): ValueProvider<T>;
32
+ export declare function tokenProvider<T, A>(token: InjectionToken<T, A>, options?: TypedOmit<TokenProvider<T>, 'useToken' | 'useTokenProvider'>): TokenProvider<T>;
33
+ export declare function factoryProvider<T, A>(factory: Factory<T, A>, options?: TypedOmit<FactoryProvider<T, A>, 'useFactory'>): FactoryProvider<T, A>;
34
+ export declare function isClassProvider<T, A>(value: Provider<T, A>): value is ClassProvider<T, A>;
35
+ export declare function isClassProvider<T, A>(value: unknown): value is ClassProvider<T, A>;
36
+ export declare function isValueProvider<T>(value: Provider<T>): value is ValueProvider<T>;
37
+ export declare function isValueProvider<T>(value: unknown): value is ValueProvider<T>;
38
+ export declare function isTokenProvider<T, A>(value: Provider<T, A>): value is TokenProvider<T, A>;
39
+ export declare function isTokenProvider<T, A>(value: unknown): value is TokenProvider<T, A>;
40
+ export declare function isFactoryProvider<T, A>(value: Provider<T, A>): value is FactoryProvider<T, A>;
41
+ export declare function isFactoryProvider<T, A>(value: unknown): value is FactoryProvider<T, A>;
42
+ export declare function isProvider<T, A>(value: Provider<T, A>): value is Provider<T, A>;
43
+ export declare function isProvider<T, A>(value: unknown): value is Provider<T, A>;
44
+ export declare function isProviderWithInitializer<T, A>(value: Provider<T, A>): value is Extract<Provider<T, A>, ProviderWithInitializer<T, A>>;
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var provider_exports = {};
20
+ __export(provider_exports, {
21
+ classProvider: () => classProvider,
22
+ factoryProvider: () => factoryProvider,
23
+ isClassProvider: () => isClassProvider,
24
+ isFactoryProvider: () => isFactoryProvider,
25
+ isProvider: () => isProvider,
26
+ isProviderWithInitializer: () => isProviderWithInitializer,
27
+ isTokenProvider: () => isTokenProvider,
28
+ isValueProvider: () => isValueProvider,
29
+ tokenProvider: () => tokenProvider,
30
+ valueProvider: () => valueProvider
31
+ });
32
+ module.exports = __toCommonJS(provider_exports);
33
+ var import_object = require("../utils/object/object.js");
34
+ var import_type_guards = require("../utils/type-guards.js");
35
+ function classProvider(constructor, options) {
36
+ return { useClass: constructor, ...options };
37
+ }
38
+ function valueProvider(value, options) {
39
+ return { useValue: value, ...options };
40
+ }
41
+ function tokenProvider(token, options) {
42
+ return { useToken: token, ...options };
43
+ }
44
+ function factoryProvider(factory, options) {
45
+ return { useFactory: factory, ...options };
46
+ }
47
+ function isClassProvider(value) {
48
+ return (0, import_type_guards.isObject)(value) && (0, import_object.hasOwnProperty)(value, "useClass");
49
+ }
50
+ function isValueProvider(value) {
51
+ return (0, import_type_guards.isObject)(value) && (0, import_object.hasOwnProperty)(value, "useValue");
52
+ }
53
+ function isTokenProvider(value) {
54
+ return (0, import_type_guards.isObject)(value) && ((0, import_object.hasOwnProperty)(value, "useToken") || (0, import_object.hasOwnProperty)(value, "useTokenProvider"));
55
+ }
56
+ function isFactoryProvider(value) {
57
+ return (0, import_type_guards.isObject)(value) && (0, import_object.hasOwnProperty)(value, "useFactory");
58
+ }
59
+ function isProvider(value) {
60
+ return isClassProvider(value) || isValueProvider(value) || isTokenProvider(value) || isFactoryProvider(value);
61
+ }
62
+ function isProviderWithInitializer(value) {
63
+ return (0, import_type_guards.isFunction)(value.afterResolve);
64
+ }
@@ -0,0 +1,31 @@
1
+ import type { AbstractConstructor } from '../types.js';
2
+ import type { InjectionToken } from './token.js';
3
+ export type ResolveChainNodeBase<Type extends string> = {
4
+ type: Type;
5
+ };
6
+ export type ResolveChainNode = ResolveChainNodeBase<'token'> & {
7
+ token: InjectionToken;
8
+ } | ResolveChainNodeBase<'inject'> & {
9
+ token: InjectionToken;
10
+ index: number;
11
+ } | ResolveChainNodeBase<'parameter'> & {
12
+ constructor: AbstractConstructor;
13
+ index: number;
14
+ token: InjectionToken;
15
+ } | ResolveChainNodeBase<'property'> & {
16
+ constructor: AbstractConstructor;
17
+ property: PropertyKey;
18
+ token: InjectionToken;
19
+ };
20
+ export declare class ResolveChain {
21
+ readonly nodes: readonly ResolveChainNode[];
22
+ get length(): number;
23
+ constructor(nodes?: ResolveChainNode[]);
24
+ static startWith(token: InjectionToken): ResolveChain;
25
+ addToken(token: InjectionToken): ResolveChain;
26
+ addInject(token: InjectionToken, index: number): ResolveChain;
27
+ addParameter(constructor: AbstractConstructor, index: number, token: InjectionToken): ResolveChain;
28
+ addProperty(constructor: AbstractConstructor, property: PropertyKey, token: InjectionToken): ResolveChain;
29
+ format(truncate?: number): string;
30
+ truncate(tokenCount: number): ResolveChain;
31
+ }