@navios/di 0.5.1 → 0.6.0

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 (123) hide show
  1. package/CHANGELOG.md +146 -0
  2. package/README.md +196 -219
  3. package/docs/README.md +69 -11
  4. package/docs/api-reference.md +281 -117
  5. package/docs/container.md +220 -56
  6. package/docs/examples/request-scope-example.mts +2 -2
  7. package/docs/factory.md +3 -8
  8. package/docs/getting-started.md +37 -8
  9. package/docs/migration.md +318 -37
  10. package/docs/request-contexts.md +263 -175
  11. package/docs/scopes.md +79 -42
  12. package/lib/browser/index.d.mts +1577 -0
  13. package/lib/browser/index.d.mts.map +1 -0
  14. package/lib/browser/index.mjs +3012 -0
  15. package/lib/browser/index.mjs.map +1 -0
  16. package/lib/index-S_qX2VLI.d.mts +1211 -0
  17. package/lib/index-S_qX2VLI.d.mts.map +1 -0
  18. package/lib/index-fKPuT65j.d.cts +1206 -0
  19. package/lib/index-fKPuT65j.d.cts.map +1 -0
  20. package/lib/index.cjs +389 -0
  21. package/lib/index.cjs.map +1 -0
  22. package/lib/index.d.cts +376 -0
  23. package/lib/index.d.cts.map +1 -0
  24. package/lib/index.d.mts +371 -78
  25. package/lib/index.d.mts.map +1 -0
  26. package/lib/index.mjs +325 -63
  27. package/lib/index.mjs.map +1 -1
  28. package/lib/testing/index.cjs +9 -0
  29. package/lib/testing/index.d.cts +2 -0
  30. package/lib/testing/index.d.mts +2 -2
  31. package/lib/testing/index.mjs +2 -72
  32. package/lib/testing-BMGmmxH7.cjs +2895 -0
  33. package/lib/testing-BMGmmxH7.cjs.map +1 -0
  34. package/lib/testing-DCXz8AJD.mjs +2655 -0
  35. package/lib/testing-DCXz8AJD.mjs.map +1 -0
  36. package/package.json +23 -1
  37. package/project.json +2 -2
  38. package/src/__tests__/async-local-storage.browser.spec.mts +240 -0
  39. package/src/__tests__/async-local-storage.spec.mts +333 -0
  40. package/src/__tests__/container.spec.mts +30 -25
  41. package/src/__tests__/e2e.browser.spec.mts +790 -0
  42. package/src/__tests__/e2e.spec.mts +1222 -0
  43. package/src/__tests__/errors.spec.mts +6 -6
  44. package/src/__tests__/factory.spec.mts +1 -1
  45. package/src/__tests__/get-injectors.spec.mts +1 -1
  46. package/src/__tests__/injectable.spec.mts +1 -1
  47. package/src/__tests__/injection-token.spec.mts +1 -1
  48. package/src/__tests__/library-findings.spec.mts +563 -0
  49. package/src/__tests__/registry.spec.mts +2 -2
  50. package/src/__tests__/request-scope.spec.mts +266 -274
  51. package/src/__tests__/service-instantiator.spec.mts +18 -17
  52. package/src/__tests__/service-locator-event-bus.spec.mts +9 -9
  53. package/src/__tests__/service-locator-manager.spec.mts +15 -15
  54. package/src/__tests__/service-locator.spec.mts +167 -244
  55. package/src/__tests__/unified-api.spec.mts +27 -27
  56. package/src/__type-tests__/factory.spec-d.mts +2 -2
  57. package/src/__type-tests__/inject.spec-d.mts +2 -2
  58. package/src/__type-tests__/injectable.spec-d.mts +1 -1
  59. package/src/browser.mts +16 -0
  60. package/src/container/container.mts +319 -0
  61. package/src/container/index.mts +2 -0
  62. package/src/container/scoped-container.mts +350 -0
  63. package/src/decorators/factory.decorator.mts +4 -4
  64. package/src/decorators/injectable.decorator.mts +5 -5
  65. package/src/errors/di-error.mts +13 -7
  66. package/src/errors/index.mts +0 -8
  67. package/src/index.mts +156 -15
  68. package/src/interfaces/container.interface.mts +82 -0
  69. package/src/interfaces/factory.interface.mts +2 -2
  70. package/src/interfaces/index.mts +1 -0
  71. package/src/internal/context/async-local-storage.mts +120 -0
  72. package/src/internal/context/factory-context.mts +18 -0
  73. package/src/internal/context/index.mts +3 -0
  74. package/src/{request-context-holder.mts → internal/context/request-context.mts} +40 -27
  75. package/src/internal/context/resolution-context.mts +63 -0
  76. package/src/internal/context/sync-local-storage.mts +51 -0
  77. package/src/internal/core/index.mts +5 -0
  78. package/src/internal/core/instance-resolver.mts +641 -0
  79. package/src/{service-instantiator.mts → internal/core/instantiator.mts} +31 -27
  80. package/src/internal/core/invalidator.mts +437 -0
  81. package/src/internal/core/service-locator.mts +202 -0
  82. package/src/{token-processor.mts → internal/core/token-processor.mts} +79 -60
  83. package/src/{base-instance-holder-manager.mts → internal/holder/base-holder-manager.mts} +91 -21
  84. package/src/internal/holder/holder-manager.mts +85 -0
  85. package/src/internal/holder/holder-storage.interface.mts +116 -0
  86. package/src/internal/holder/index.mts +6 -0
  87. package/src/internal/holder/instance-holder.mts +109 -0
  88. package/src/internal/holder/request-storage.mts +134 -0
  89. package/src/internal/holder/singleton-storage.mts +105 -0
  90. package/src/internal/index.mts +4 -0
  91. package/src/internal/lifecycle/circular-detector.mts +77 -0
  92. package/src/internal/lifecycle/index.mts +2 -0
  93. package/src/{service-locator-event-bus.mts → internal/lifecycle/lifecycle-event-bus.mts} +11 -4
  94. package/src/testing/__tests__/test-container.spec.mts +2 -2
  95. package/src/testing/test-container.mts +4 -4
  96. package/src/token/index.mts +2 -0
  97. package/src/{injection-token.mts → token/injection-token.mts} +1 -1
  98. package/src/{registry.mts → token/registry.mts} +1 -1
  99. package/src/utils/get-injectable-token.mts +1 -1
  100. package/src/utils/get-injectors.mts +32 -15
  101. package/src/utils/types.mts +1 -1
  102. package/tsdown.config.mts +67 -0
  103. package/lib/_tsup-dts-rollup.d.mts +0 -1283
  104. package/lib/_tsup-dts-rollup.d.ts +0 -1283
  105. package/lib/chunk-2M576LCC.mjs +0 -2043
  106. package/lib/chunk-2M576LCC.mjs.map +0 -1
  107. package/lib/index.d.ts +0 -78
  108. package/lib/index.js +0 -2127
  109. package/lib/index.js.map +0 -1
  110. package/lib/testing/index.d.ts +0 -2
  111. package/lib/testing/index.js +0 -2060
  112. package/lib/testing/index.js.map +0 -1
  113. package/lib/testing/index.mjs.map +0 -1
  114. package/src/container.mts +0 -227
  115. package/src/factory-context.mts +0 -8
  116. package/src/instance-resolver.mts +0 -559
  117. package/src/request-context-manager.mts +0 -149
  118. package/src/service-invalidator.mts +0 -429
  119. package/src/service-locator-instance-holder.mts +0 -70
  120. package/src/service-locator-manager.mts +0 -85
  121. package/src/service-locator.mts +0 -246
  122. package/tsup.config.mts +0 -12
  123. /package/src/{injector.mts → injectors.mts} +0 -0
@@ -0,0 +1,376 @@
1
+ import { $ as FactorableWithArgs, A as globalRegistry, B as ClassTypeWithInstanceAndOptionalArgument, C as InstanceHolderDestroying, D as DIErrorCode, E as DIError, F as BoundInjectionToken, G as InjectionTokenSchemaType, H as ClassTypeWithoutArguments, I as ClassType, J as FactoryContext, K as InjectionTokenType, L as ClassTypeWithArgument, M as InjectableScope, N as AnyInjectableType, O as FactoryRecord, P as BaseInjectionTokenSchemaType, Q as Factorable, R as ClassTypeWithInstance, S as InstanceHolderCreating, T as InstanceStatus, U as FactoryInjectionToken, V as ClassTypeWithOptionalArgument, W as InjectionToken, X as getInjectors, Y as Injectors, Z as IContainer, _ as IHolderStorage, a as TokenProcessor, at as UnionToArray, b as InstanceHolder, c as LifecycleEventBus, d as RequestContext, et as InjectRequest, f as RequestContextHolder, g as HolderGetResult, h as HolderReadyResult, i as ServiceLocator, it as PopUnion, j as InjectableType, k as Registry, l as ScopedContainer, m as BaseHolderManager, n as TestContainer, nt as IsUnion, o as Invalidator, ot as UnionToIntersection, p as createRequestContext, q as OptionalInjectionTokenSchemaType, r as Container, rt as Join, s as HolderManager, st as UnionToOvlds, t as TestBindingBuilder, tt as InjectState, u as DefaultRequestContext, v as InstanceDestroyListener, w as InstanceHolderError, x as InstanceHolderCreated, y as InstanceEffect, z as ClassTypeWithInstanceAndArgument } from "./index-fKPuT65j.cjs";
2
+ import { ZodObject, ZodOptional, z } from "zod/v4";
3
+
4
+ //#region src/utils/get-injectable-token.d.mts
5
+ declare function getInjectableToken<R>(target: ClassType): R extends {
6
+ create(...args: any[]): infer V;
7
+ } ? InjectionToken<V> : InjectionToken<R>;
8
+ //#endregion
9
+ //#region src/interfaces/on-service-init.interface.d.mts
10
+ interface OnServiceInit {
11
+ onServiceInit(): Promise<void> | void;
12
+ }
13
+ //#endregion
14
+ //#region src/interfaces/on-service-destroy.interface.d.mts
15
+ interface OnServiceDestroy {
16
+ onServiceDestroy(): Promise<void> | void;
17
+ }
18
+ //#endregion
19
+ //#region src/decorators/factory.decorator.d.mts
20
+ interface FactoryOptions {
21
+ scope?: InjectableScope;
22
+ token?: InjectionToken<any, any>;
23
+ registry?: Registry;
24
+ }
25
+ declare function Factory<R>(options?: {
26
+ scope?: InjectableScope;
27
+ registry?: Registry;
28
+ }): <T extends ClassTypeWithInstance<Factorable<R>>>(target: T, context?: ClassDecoratorContext) => T;
29
+ declare function Factory<R, S>(options: {
30
+ scope?: InjectableScope;
31
+ token: InjectionToken<R, S>;
32
+ registry?: Registry;
33
+ }): R extends undefined ? never : S extends InjectionTokenSchemaType ? <T extends ClassTypeWithInstance<FactorableWithArgs<R, S>>>(
34
+ // #2.2.1 Token have a schema
35
+ target: T, context?: ClassDecoratorContext) => T : S extends undefined ? <T extends ClassTypeWithInstance<Factorable<R>>>(
36
+ // #2.3.1 Token without a schema
37
+ target: T, context?: ClassDecoratorContext) => T : never;
38
+ //#endregion
39
+ //#region src/decorators/injectable.decorator.d.mts
40
+ interface InjectableOptions {
41
+ scope?: InjectableScope;
42
+ token?: InjectionToken<any, any>;
43
+ schema?: InjectionTokenSchemaType;
44
+ registry?: Registry;
45
+ }
46
+ declare function Injectable(): <T extends ClassTypeWithoutArguments>(target: T, context?: ClassDecoratorContext) => T;
47
+ declare function Injectable(options: {
48
+ scope?: InjectableScope;
49
+ registry: Registry;
50
+ }): <T extends ClassTypeWithoutArguments>(target: T, context?: ClassDecoratorContext) => T;
51
+ declare function Injectable(options: {
52
+ scope: InjectableScope;
53
+ }): <T extends ClassTypeWithoutArguments>(target: T, context?: ClassDecoratorContext) => T;
54
+ declare function Injectable<Schema extends InjectionTokenSchemaType>(options: {
55
+ scope?: InjectableScope;
56
+ schema: Schema;
57
+ registry?: Registry;
58
+ }): <T extends ClassTypeWithArgument<z.output<Schema>>>(target: T, context?: ClassDecoratorContext) => T;
59
+ declare function Injectable<Type, Schema>(options: {
60
+ scope?: InjectableScope;
61
+ token: InjectionToken<Type, Schema>;
62
+ registry?: Registry;
63
+ }): Schema extends BaseInjectionTokenSchemaType ? Type extends undefined ? <T extends ClassTypeWithArgument<z.output<Schema>>>(
64
+ // #3.1.1 Typeless token
65
+ target: T, context?: ClassDecoratorContext) => T : <T extends ClassTypeWithInstanceAndArgument<Type, z.output<Schema>>>(
66
+ // #3.1.2 Typed token
67
+ target: T, context?: ClassDecoratorContext) => T : Schema extends OptionalInjectionTokenSchemaType ? Type extends undefined ? <T extends ClassTypeWithOptionalArgument<z.output<Schema>>>(
68
+ // #3.2.1 Typeless token
69
+ target: T, context?: ClassDecoratorContext) => T : <T extends ClassTypeWithInstanceAndOptionalArgument<Type, z.output<Schema>>>(target: T, context?: ClassDecoratorContext) => T : Schema extends undefined ? <R extends ClassTypeWithInstance<Type>>(
70
+ // #3.3.1 Token must have a type
71
+ target: R, context?: ClassDecoratorContext) => R : never;
72
+ //#endregion
73
+ //#region src/symbols/injectable-token.d.mts
74
+ declare const InjectableTokenMeta: unique symbol;
75
+ //#endregion
76
+ //#region src/event-emitter.d.mts
77
+ type EventsConfig = {
78
+ [event: string]: any[];
79
+ };
80
+ type EventsNames<Events extends EventsConfig> = Exclude<keyof Events, symbol | number>;
81
+ type EventsArgs<Events extends EventsConfig, Name extends EventsNames<Events>> = Events[Name] extends any[] ? Events[Name] : [];
82
+ interface EventEmitterInterface<Events extends EventsConfig> {
83
+ on<E extends EventsNames<Events>, Args extends EventsArgs<Events, E>>(event: E, listener: (...args: Args) => void | Promise<void>): () => void;
84
+ emit<E extends EventsNames<Events>, Args extends EventsArgs<Events, E>>(event: E, ...args: Args): void | Promise<void>;
85
+ }
86
+ declare class EventEmitter<Events extends EventsConfig = {}> implements EventEmitterInterface<Events> {
87
+ private listeners;
88
+ on<E extends EventsNames<Events>, Args extends EventsArgs<Events, E>>(event: E, listener: (...args: Args) => void | Promise<void>): () => void;
89
+ off<E extends EventsNames<Events>, Args extends EventsArgs<Events, E>>(event: E, listener: (...args: Args) => void | Promise<void>): void;
90
+ once<E extends EventsNames<Events>, Args extends EventsArgs<Events, E>>(event: E, listener: (...args: Args) => void | Promise<void>): () => void;
91
+ emit<E extends EventsNames<Events>, Args extends EventsArgs<Events, E>>(event: E, ...args: Args): Promise<any>;
92
+ }
93
+ //#endregion
94
+ //#region src/injectors.d.mts
95
+ declare const defaultInjectors: Injectors;
96
+ declare const asyncInject: Injectors['asyncInject'];
97
+ declare const inject: Injectors['inject'];
98
+ declare const optional: Injectors['optional'];
99
+ declare const wrapSyncInit: Injectors['wrapSyncInit'];
100
+ declare const provideFactoryContext: Injectors['provideFactoryContext'];
101
+ //#endregion
102
+ //#region src/internal/context/async-local-storage.d.mts
103
+ /**
104
+ * Cross-platform AsyncLocalStorage wrapper.
105
+ *
106
+ * Provides AsyncLocalStorage on Node.js/Bun and falls back to
107
+ * a synchronous-only polyfill in browser environments.
108
+ */
109
+ /**
110
+ * Interface matching the subset of AsyncLocalStorage API we use.
111
+ */
112
+ interface IAsyncLocalStorage<T> {
113
+ run<R>(store: T, fn: () => R): R;
114
+ getStore(): T | undefined;
115
+ }
116
+ //#endregion
117
+ //#region src/internal/context/resolution-context.d.mts
118
+ /**
119
+ * Data stored in the resolution context during service instantiation.
120
+ */
121
+ interface ResolutionContextData {
122
+ /** The holder that is currently being instantiated */
123
+ waiterHolder: InstanceHolder;
124
+ /** Function to get a holder by name (for cycle detection) */
125
+ getHolder: (name: string) => InstanceHolder | undefined;
126
+ }
127
+ /**
128
+ * AsyncLocalStorage for tracking the current resolution context.
129
+ *
130
+ * This allows tracking which service is being instantiated even across
131
+ * async boundaries (like when inject() is called inside a constructor).
132
+ * Essential for circular dependency detection.
133
+ */
134
+ declare const resolutionContext: IAsyncLocalStorage<ResolutionContextData>;
135
+ /**
136
+ * Runs a function within a resolution context.
137
+ *
138
+ * The context tracks which holder is currently being instantiated,
139
+ * allowing circular dependency detection to work correctly.
140
+ *
141
+ * @param waiterHolder The holder being instantiated
142
+ * @param getHolder Function to retrieve holders by name
143
+ * @param fn The function to run within the context
144
+ */
145
+ declare function withResolutionContext<T>(waiterHolder: InstanceHolder, getHolder: (name: string) => InstanceHolder | undefined, fn: () => T): T;
146
+ /**
147
+ * Gets the current resolution context, if any.
148
+ *
149
+ * Returns undefined if we're not inside a resolution context
150
+ * (e.g., when resolving a top-level service that has no parent).
151
+ */
152
+ declare function getCurrentResolutionContext(): ResolutionContextData | undefined;
153
+ /**
154
+ * Runs a function outside any resolution context.
155
+ *
156
+ * This is useful for async injections that should not participate
157
+ * in circular dependency detection since they don't block.
158
+ *
159
+ * @param fn The function to run without resolution context
160
+ */
161
+ declare function withoutResolutionContext<T>(fn: () => T): T;
162
+ //#endregion
163
+ //#region src/internal/holder/singleton-storage.d.mts
164
+ /**
165
+ * Storage implementation for Singleton-scoped services.
166
+ *
167
+ * Wraps a HolderManager instance and provides the IHolderStorage interface.
168
+ * This allows the InstanceResolver to work with singleton storage
169
+ * using the same interface as request-scoped storage.
170
+ */
171
+ declare class SingletonStorage implements IHolderStorage {
172
+ private readonly manager;
173
+ readonly scope = InjectableScope.Singleton;
174
+ constructor(manager: HolderManager);
175
+ get<T = unknown>(instanceName: string): HolderGetResult<T>;
176
+ set(instanceName: string, holder: InstanceHolder): void;
177
+ delete(instanceName: string): boolean;
178
+ createHolder<T>(instanceName: string, type: InjectableType, deps: Set<string>): [ReturnType<typeof Promise.withResolvers<[undefined, T]>>, InstanceHolder<T>];
179
+ handles(scope: InjectableScope): boolean;
180
+ getAllNames(): string[];
181
+ forEach(callback: (name: string, holder: InstanceHolder) => void): void;
182
+ findByInstance(instance: unknown): InstanceHolder | null;
183
+ findDependents(instanceName: string): string[];
184
+ }
185
+ //#endregion
186
+ //#region src/internal/holder/request-storage.d.mts
187
+ /**
188
+ * Storage implementation for Request-scoped services.
189
+ *
190
+ * Wraps a RequestContext instance from a ScopedContainer and provides
191
+ * the IHolderStorage interface. This allows the InstanceResolver to work
192
+ * with request-scoped storage using the same interface as singleton storage.
193
+ */
194
+ declare class RequestStorage implements IHolderStorage {
195
+ private readonly contextHolder;
196
+ private readonly holderManager;
197
+ readonly scope = InjectableScope.Request;
198
+ constructor(contextHolder: RequestContext, holderManager: BaseHolderManager);
199
+ get<T = unknown>(instanceName: string): HolderGetResult<T>;
200
+ set(instanceName: string, holder: InstanceHolder): void;
201
+ delete(instanceName: string): boolean;
202
+ createHolder<T>(instanceName: string, type: InjectableType, deps: Set<string>): [ReturnType<typeof Promise.withResolvers<[undefined, T]>>, InstanceHolder<T>];
203
+ handles(scope: InjectableScope): boolean;
204
+ getAllNames(): string[];
205
+ forEach(callback: (name: string, holder: InstanceHolder) => void): void;
206
+ findByInstance(instance: unknown): InstanceHolder | null;
207
+ findDependents(instanceName: string): string[];
208
+ }
209
+ //#endregion
210
+ //#region src/internal/lifecycle/circular-detector.d.mts
211
+ /**
212
+ * Detects circular dependencies by analyzing the waitingFor relationships
213
+ * between service holders.
214
+ *
215
+ * Uses BFS to traverse the waitingFor graph starting from a target holder
216
+ * and checks if following the chain leads back to the waiter, indicating a circular dependency.
217
+ */
218
+ declare class CircularDetector {
219
+ /**
220
+ * Detects if waiting for `targetName` from `waiterName` would create a cycle.
221
+ *
222
+ * This works by checking if `targetName` (or any holder in its waitingFor chain)
223
+ * is currently waiting for `waiterName`. If so, waiting would create a deadlock.
224
+ *
225
+ * @param waiterName The name of the holder that wants to wait
226
+ * @param targetName The name of the holder being waited on
227
+ * @param getHolder Function to retrieve a holder by name
228
+ * @returns The cycle path if a cycle is detected, null otherwise
229
+ */
230
+ static detectCycle(waiterName: string, targetName: string, getHolder: (name: string) => InstanceHolder | undefined): string[] | null;
231
+ /**
232
+ * Formats a cycle path into a human-readable string.
233
+ *
234
+ * @param cycle The cycle path (array of service names)
235
+ * @returns Formatted string like "ServiceA -> ServiceB -> ServiceA"
236
+ */
237
+ static formatCycle(cycle: string[]): string;
238
+ }
239
+ //#endregion
240
+ //#region src/internal/core/instantiator.d.mts
241
+ /**
242
+ * Creates service instances from registry records.
243
+ *
244
+ * Handles both class-based (@Injectable) and factory-based (@Factory) services,
245
+ * managing the instantiation lifecycle including sync initialization retries
246
+ * and lifecycle hook invocation (onServiceInit, onServiceDestroy).
247
+ */
248
+ declare class Instantiator {
249
+ private readonly injectors;
250
+ constructor(injectors: Injectors);
251
+ /**
252
+ * Instantiates a service based on its registry record.
253
+ * @param ctx The factory context for dependency injection
254
+ * @param record The factory record from the registry
255
+ * @param args Optional arguments for the service
256
+ * @returns Promise resolving to [undefined, instance] or [error]
257
+ */
258
+ instantiateService<T>(ctx: FactoryContext, record: FactoryRecord<T, any>, args?: any): Promise<[undefined, T] | [DIError]>;
259
+ /**
260
+ * Instantiates a class-based service (Injectable decorator).
261
+ * @param ctx The factory context for dependency injection
262
+ * @param record The factory record from the registry
263
+ * @param args Optional arguments for the service constructor
264
+ * @returns Promise resolving to [undefined, instance] or [error]
265
+ */
266
+ private instantiateClass;
267
+ /**
268
+ * Instantiates a factory-based service (Factory decorator).
269
+ * @param ctx The factory context for dependency injection
270
+ * @param record The factory record from the registry
271
+ * @param args Optional arguments for the factory
272
+ * @returns Promise resolving to [undefined, instance] or [error]
273
+ */
274
+ private instantiateFactory;
275
+ }
276
+ //#endregion
277
+ //#region src/internal/core/instance-resolver.d.mts
278
+ /**
279
+ * Resolves instances from tokens, handling caching, creation, and scope rules.
280
+ *
281
+ * Uses the Storage Strategy pattern for unified singleton/request-scoped handling.
282
+ * Coordinates with Instantiator for actual service creation.
283
+ */
284
+ declare class InstanceResolver {
285
+ private readonly registry;
286
+ private readonly manager;
287
+ private readonly instantiator;
288
+ private readonly tokenProcessor;
289
+ private readonly logger;
290
+ private readonly serviceLocator;
291
+ private readonly singletonStorage;
292
+ constructor(registry: Registry, manager: HolderManager, instantiator: Instantiator, tokenProcessor: TokenProcessor, logger: (Console | null) | undefined, serviceLocator: ServiceLocator);
293
+ /**
294
+ * Resolves an instance for the given token and arguments.
295
+ * This method is used for singleton and transient services.
296
+ *
297
+ * @param token The injection token
298
+ * @param args Optional arguments
299
+ * @param contextContainer The container to use for creating FactoryContext
300
+ */
301
+ resolveInstance(token: AnyInjectableType, args: any, contextContainer: IContainer): Promise<[undefined, any] | [DIError]>;
302
+ /**
303
+ * Resolves a request-scoped instance for a ScopedContainer.
304
+ * The service will be stored in the ScopedContainer's request context.
305
+ *
306
+ * @param token The injection token
307
+ * @param args Optional arguments
308
+ * @param scopedContainer The ScopedContainer that owns the request context
309
+ */
310
+ resolveRequestScopedInstance(token: AnyInjectableType, args: any, scopedContainer: ScopedContainer): Promise<[undefined, any] | [DIError]>;
311
+ /**
312
+ * Unified resolution method that works with any IHolderStorage.
313
+ * This eliminates duplication between singleton and request-scoped resolution.
314
+ *
315
+ * IMPORTANT: The check-and-store logic is carefully designed to avoid race conditions.
316
+ * The storage check and holder creation must happen synchronously (no awaits between).
317
+ *
318
+ * @param token The injection token
319
+ * @param args Optional arguments
320
+ * @param contextContainer The container for FactoryContext
321
+ * @param storage The storage strategy to use
322
+ * @param scopedContainer Optional scoped container for request-scoped services
323
+ */
324
+ private resolveWithStorage;
325
+ /**
326
+ * Handles storage error states (destroying, error, etc.).
327
+ * Returns a result if handled, null if should proceed with creation.
328
+ */
329
+ private handleStorageError;
330
+ /**
331
+ * Creates a new instance and stores it using the provided storage strategy.
332
+ * This unified method replaces instantiateServiceFromRegistry and createRequestScopedInstance.
333
+ *
334
+ * For transient services, the instance is created but not stored (no caching).
335
+ */
336
+ private createAndStoreInstance;
337
+ /**
338
+ * Creates a transient instance without storage or locking.
339
+ * Each call creates a new instance.
340
+ */
341
+ private createTransientInstance;
342
+ /**
343
+ * Gets a synchronous instance (for sync operations).
344
+ */
345
+ getSyncInstance<Instance, Schema extends InjectionTokenSchemaType | undefined>(token: AnyInjectableType, args: Schema extends ZodObject ? z.input<Schema> : Schema extends ZodOptional<ZodObject> ? z.input<Schema> | undefined : undefined, contextContainer: IContainer): Instance | null;
346
+ /**
347
+ * Internal method to resolve token args and create instance name.
348
+ * Handles factory token resolution and validation.
349
+ */
350
+ private resolveTokenAndPrepareInstanceName;
351
+ /**
352
+ * Waits for an instance holder to be ready and returns the appropriate result.
353
+ * Uses the shared utility from BaseHolderManager.
354
+ * Passes the current resolution context for circular dependency detection.
355
+ */
356
+ private waitForInstanceReady;
357
+ /**
358
+ * Handles the result of service instantiation.
359
+ */
360
+ private handleInstantiationResult;
361
+ /**
362
+ * Handles successful service instantiation.
363
+ */
364
+ private handleInstantiationSuccess;
365
+ /**
366
+ * Handles service instantiation errors.
367
+ */
368
+ private handleInstantiationError;
369
+ /**
370
+ * Creates a factory context for dependency injection during service instantiation.
371
+ */
372
+ private createFactoryContext;
373
+ }
374
+ //#endregion
375
+ export { type AnyInjectableType, BaseHolderManager, BoundInjectionToken, CircularDetector, type ClassType, type ClassTypeWithArgument, type ClassTypeWithInstance, type ClassTypeWithInstanceAndArgument, type ClassTypeWithInstanceAndOptionalArgument, type ClassTypeWithOptionalArgument, type ClassTypeWithoutArguments, Container, DIError, DIErrorCode, DefaultRequestContext, EventEmitter, Factorable, FactorableWithArgs, Factory, type FactoryContext, FactoryInjectionToken, FactoryOptions, type FactoryRecord, type HolderGetResult, HolderManager, type HolderReadyResult, IContainer, type IHolderStorage, InjectRequest, InjectState, Injectable, InjectableOptions, InjectableScope, InjectableTokenMeta, InjectableType, InjectionToken, type InjectionTokenSchemaType, type InjectionTokenType, Injectors, type InstanceDestroyListener, type InstanceEffect, type InstanceHolder, type InstanceHolderCreated, type InstanceHolderCreating, type InstanceHolderDestroying, type InstanceHolderError, InstanceResolver, InstanceStatus, Instantiator, Invalidator, IsUnion, Join, LifecycleEventBus, OnServiceDestroy, OnServiceInit, PopUnion, Registry, type RequestContext, type RequestContextHolder, RequestStorage, type ResolutionContextData, ScopedContainer, ServiceLocator, SingletonStorage, TestBindingBuilder, TestContainer, TokenProcessor, UnionToArray, UnionToIntersection, UnionToOvlds, asyncInject, createRequestContext, defaultInjectors, getCurrentResolutionContext, getInjectableToken, getInjectors, globalRegistry, inject, optional, provideFactoryContext, resolutionContext, withResolutionContext, withoutResolutionContext, wrapSyncInit };
376
+ //# sourceMappingURL=index.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../src/utils/get-injectable-token.mts","../src/interfaces/on-service-init.interface.mts","../src/interfaces/on-service-destroy.interface.mts","../src/decorators/factory.decorator.mts","../src/decorators/injectable.decorator.mts","../src/symbols/injectable-token.mts","../src/event-emitter.mts","../src/injectors.mts","../src/internal/context/async-local-storage.mts","../src/internal/context/resolution-context.mts","../src/internal/holder/singleton-storage.mts","../src/internal/holder/request-storage.mts","../src/internal/lifecycle/circular-detector.mts","../src/internal/core/instantiator.mts","../src/internal/core/instance-resolver.mts"],"sourcesContent":[],"mappings":"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"}