@navios/di 0.7.1 → 0.9.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 (263) hide show
  1. package/CHANGELOG.md +110 -0
  2. package/README.md +117 -17
  3. package/lib/browser/container/abstract-container.d.mts +112 -0
  4. package/lib/browser/container/abstract-container.d.mts.map +1 -0
  5. package/lib/browser/container/abstract-container.mjs +100 -0
  6. package/lib/browser/container/abstract-container.mjs.map +1 -0
  7. package/lib/browser/container/container.d.mts +100 -0
  8. package/lib/browser/container/container.d.mts.map +1 -0
  9. package/lib/browser/container/container.mjs +424 -0
  10. package/lib/browser/container/container.mjs.map +1 -0
  11. package/lib/browser/container/scoped-container.d.mts +93 -0
  12. package/lib/browser/container/scoped-container.d.mts.map +1 -0
  13. package/lib/browser/container/scoped-container.mjs +119 -0
  14. package/lib/browser/container/scoped-container.mjs.map +1 -0
  15. package/lib/browser/decorators/factory.decorator.d.mts +26 -0
  16. package/lib/browser/decorators/factory.decorator.d.mts.map +1 -0
  17. package/lib/browser/decorators/factory.decorator.mjs +20 -0
  18. package/lib/browser/decorators/factory.decorator.mjs.map +1 -0
  19. package/lib/browser/decorators/injectable.decorator.d.mts +38 -0
  20. package/lib/browser/decorators/injectable.decorator.d.mts.map +1 -0
  21. package/lib/browser/decorators/injectable.decorator.mjs +21 -0
  22. package/lib/browser/decorators/injectable.decorator.mjs.map +1 -0
  23. package/lib/browser/enums/injectable-scope.enum.d.mts +18 -0
  24. package/lib/browser/enums/injectable-scope.enum.d.mts.map +1 -0
  25. package/lib/browser/enums/injectable-scope.enum.mjs +20 -0
  26. package/lib/browser/enums/injectable-scope.enum.mjs.map +1 -0
  27. package/lib/browser/enums/injectable-type.enum.d.mts +8 -0
  28. package/lib/browser/enums/injectable-type.enum.d.mts.map +1 -0
  29. package/lib/browser/enums/injectable-type.enum.mjs +10 -0
  30. package/lib/browser/enums/injectable-type.enum.mjs.map +1 -0
  31. package/lib/browser/errors/di-error.d.mts +43 -0
  32. package/lib/browser/errors/di-error.d.mts.map +1 -0
  33. package/lib/browser/errors/di-error.mjs +98 -0
  34. package/lib/browser/errors/di-error.mjs.map +1 -0
  35. package/lib/browser/event-emitter.d.mts +16 -0
  36. package/lib/browser/event-emitter.d.mts.map +1 -0
  37. package/lib/browser/event-emitter.mjs +320 -0
  38. package/lib/browser/event-emitter.mjs.map +1 -0
  39. package/lib/browser/index.d.mts +37 -1508
  40. package/lib/browser/index.mjs +29 -2650
  41. package/lib/browser/interfaces/container.interface.d.mts +59 -0
  42. package/lib/browser/interfaces/container.interface.d.mts.map +1 -0
  43. package/lib/browser/interfaces/factory.interface.d.mts +14 -0
  44. package/lib/browser/interfaces/factory.interface.d.mts.map +1 -0
  45. package/lib/browser/interfaces/on-service-destroy.interface.d.mts +7 -0
  46. package/lib/browser/interfaces/on-service-destroy.interface.d.mts.map +1 -0
  47. package/lib/browser/interfaces/on-service-init.interface.d.mts +7 -0
  48. package/lib/browser/interfaces/on-service-init.interface.d.mts.map +1 -0
  49. package/lib/browser/internal/context/async-local-storage.browser.mjs +20 -0
  50. package/lib/browser/internal/context/async-local-storage.browser.mjs.map +1 -0
  51. package/lib/browser/internal/context/async-local-storage.d.mts +9 -0
  52. package/lib/browser/internal/context/async-local-storage.d.mts.map +1 -0
  53. package/lib/browser/internal/context/async-local-storage.types.d.mts +11 -0
  54. package/lib/browser/internal/context/async-local-storage.types.d.mts.map +1 -0
  55. package/lib/browser/internal/context/factory-context.d.mts +23 -0
  56. package/lib/browser/internal/context/factory-context.d.mts.map +1 -0
  57. package/lib/browser/internal/context/resolution-context.d.mts +43 -0
  58. package/lib/browser/internal/context/resolution-context.d.mts.map +1 -0
  59. package/lib/browser/internal/context/resolution-context.mjs +56 -0
  60. package/lib/browser/internal/context/resolution-context.mjs.map +1 -0
  61. package/lib/browser/internal/context/service-initialization-context.d.mts +48 -0
  62. package/lib/browser/internal/context/service-initialization-context.d.mts.map +1 -0
  63. package/lib/browser/internal/context/sync-local-storage.mjs +53 -0
  64. package/lib/browser/internal/context/sync-local-storage.mjs.map +1 -0
  65. package/lib/browser/internal/core/instance-resolver.d.mts +119 -0
  66. package/lib/browser/internal/core/instance-resolver.d.mts.map +1 -0
  67. package/lib/browser/internal/core/instance-resolver.mjs +306 -0
  68. package/lib/browser/internal/core/instance-resolver.mjs.map +1 -0
  69. package/lib/browser/internal/core/name-resolver.d.mts +52 -0
  70. package/lib/browser/internal/core/name-resolver.d.mts.map +1 -0
  71. package/lib/browser/internal/core/name-resolver.mjs +118 -0
  72. package/lib/browser/internal/core/name-resolver.mjs.map +1 -0
  73. package/lib/browser/internal/core/scope-tracker.d.mts +65 -0
  74. package/lib/browser/internal/core/scope-tracker.d.mts.map +1 -0
  75. package/lib/browser/internal/core/scope-tracker.mjs +120 -0
  76. package/lib/browser/internal/core/scope-tracker.mjs.map +1 -0
  77. package/lib/browser/internal/core/service-initializer.d.mts +44 -0
  78. package/lib/browser/internal/core/service-initializer.d.mts.map +1 -0
  79. package/lib/browser/internal/core/service-initializer.mjs +109 -0
  80. package/lib/browser/internal/core/service-initializer.mjs.map +1 -0
  81. package/lib/browser/internal/core/service-invalidator.d.mts +81 -0
  82. package/lib/browser/internal/core/service-invalidator.d.mts.map +1 -0
  83. package/lib/browser/internal/core/service-invalidator.mjs +142 -0
  84. package/lib/browser/internal/core/service-invalidator.mjs.map +1 -0
  85. package/lib/browser/internal/core/token-resolver.d.mts +54 -0
  86. package/lib/browser/internal/core/token-resolver.d.mts.map +1 -0
  87. package/lib/browser/internal/core/token-resolver.mjs +77 -0
  88. package/lib/browser/internal/core/token-resolver.mjs.map +1 -0
  89. package/lib/browser/internal/holder/holder-storage.interface.d.mts +99 -0
  90. package/lib/browser/internal/holder/holder-storage.interface.d.mts.map +1 -0
  91. package/lib/browser/internal/holder/instance-holder.d.mts +101 -0
  92. package/lib/browser/internal/holder/instance-holder.d.mts.map +1 -0
  93. package/lib/browser/internal/holder/instance-holder.mjs +19 -0
  94. package/lib/browser/internal/holder/instance-holder.mjs.map +1 -0
  95. package/lib/browser/internal/holder/unified-storage.d.mts +53 -0
  96. package/lib/browser/internal/holder/unified-storage.d.mts.map +1 -0
  97. package/lib/browser/internal/holder/unified-storage.mjs +144 -0
  98. package/lib/browser/internal/holder/unified-storage.mjs.map +1 -0
  99. package/lib/browser/internal/lifecycle/circular-detector.d.mts +39 -0
  100. package/lib/browser/internal/lifecycle/circular-detector.d.mts.map +1 -0
  101. package/lib/browser/internal/lifecycle/circular-detector.mjs +55 -0
  102. package/lib/browser/internal/lifecycle/circular-detector.mjs.map +1 -0
  103. package/lib/browser/internal/lifecycle/lifecycle-event-bus.d.mts +18 -0
  104. package/lib/browser/internal/lifecycle/lifecycle-event-bus.d.mts.map +1 -0
  105. package/lib/browser/internal/lifecycle/lifecycle-event-bus.mjs +43 -0
  106. package/lib/browser/internal/lifecycle/lifecycle-event-bus.mjs.map +1 -0
  107. package/lib/browser/internal/stub-factory-class.d.mts +14 -0
  108. package/lib/browser/internal/stub-factory-class.d.mts.map +1 -0
  109. package/lib/browser/internal/stub-factory-class.mjs +18 -0
  110. package/lib/browser/internal/stub-factory-class.mjs.map +1 -0
  111. package/lib/browser/symbols/injectable-token.d.mts +5 -0
  112. package/lib/browser/symbols/injectable-token.d.mts.map +1 -0
  113. package/lib/browser/symbols/injectable-token.mjs +6 -0
  114. package/lib/browser/symbols/injectable-token.mjs.map +1 -0
  115. package/lib/browser/token/injection-token.d.mts +55 -0
  116. package/lib/browser/token/injection-token.d.mts.map +1 -0
  117. package/lib/browser/token/injection-token.mjs +100 -0
  118. package/lib/browser/token/injection-token.mjs.map +1 -0
  119. package/lib/browser/token/registry.d.mts +37 -0
  120. package/lib/browser/token/registry.d.mts.map +1 -0
  121. package/lib/browser/token/registry.mjs +86 -0
  122. package/lib/browser/token/registry.mjs.map +1 -0
  123. package/lib/browser/utils/default-injectors.d.mts +12 -0
  124. package/lib/browser/utils/default-injectors.d.mts.map +1 -0
  125. package/lib/browser/utils/default-injectors.mjs +13 -0
  126. package/lib/browser/utils/default-injectors.mjs.map +1 -0
  127. package/lib/browser/utils/get-injectable-token.d.mts +9 -0
  128. package/lib/browser/utils/get-injectable-token.d.mts.map +1 -0
  129. package/lib/browser/utils/get-injectable-token.mjs +13 -0
  130. package/lib/browser/utils/get-injectable-token.mjs.map +1 -0
  131. package/lib/browser/utils/get-injectors.d.mts +55 -0
  132. package/lib/browser/utils/get-injectors.d.mts.map +1 -0
  133. package/lib/browser/utils/get-injectors.mjs +121 -0
  134. package/lib/browser/utils/get-injectors.mjs.map +1 -0
  135. package/lib/browser/utils/types.d.mts +23 -0
  136. package/lib/browser/utils/types.d.mts.map +1 -0
  137. package/lib/{container-Pb_Y4Z4x.mjs → container-8-z89TyQ.mjs} +1269 -1305
  138. package/lib/container-8-z89TyQ.mjs.map +1 -0
  139. package/lib/{container-BuAutHGg.d.mts → container-CNiqesCL.d.mts} +600 -569
  140. package/lib/container-CNiqesCL.d.mts.map +1 -0
  141. package/lib/{container-DnzgpfBe.cjs → container-CaY2fDuk.cjs} +1287 -1329
  142. package/lib/container-CaY2fDuk.cjs.map +1 -0
  143. package/lib/{container-oGTgX2iX.d.cts → container-D-0Ho3qL.d.cts} +601 -565
  144. package/lib/container-D-0Ho3qL.d.cts.map +1 -0
  145. package/lib/index.cjs +13 -15
  146. package/lib/index.cjs.map +1 -1
  147. package/lib/index.d.cts +58 -223
  148. package/lib/index.d.cts.map +1 -1
  149. package/lib/index.d.mts +62 -222
  150. package/lib/index.d.mts.map +1 -1
  151. package/lib/index.mjs +5 -6
  152. package/lib/index.mjs.map +1 -1
  153. package/lib/testing/index.cjs +569 -311
  154. package/lib/testing/index.cjs.map +1 -1
  155. package/lib/testing/index.d.cts +370 -41
  156. package/lib/testing/index.d.cts.map +1 -1
  157. package/lib/testing/index.d.mts +370 -41
  158. package/lib/testing/index.d.mts.map +1 -1
  159. package/lib/testing/index.mjs +568 -305
  160. package/lib/testing/index.mjs.map +1 -1
  161. package/package.json +2 -1
  162. package/src/__tests__/circular-detector.spec.mts +193 -0
  163. package/src/__tests__/concurrent.spec.mts +368 -0
  164. package/src/__tests__/container.spec.mts +32 -30
  165. package/src/__tests__/di-error.spec.mts +351 -0
  166. package/src/__tests__/e2e.browser.spec.mts +0 -4
  167. package/src/__tests__/e2e.spec.mts +10 -19
  168. package/src/__tests__/event-emitter.spec.mts +232 -109
  169. package/src/__tests__/get-injectors.spec.mts +250 -39
  170. package/src/__tests__/injection-token.spec.mts +293 -349
  171. package/src/__tests__/library-findings.spec.mts +8 -8
  172. package/src/__tests__/registry.spec.mts +358 -210
  173. package/src/__tests__/resolution-context.spec.mts +255 -0
  174. package/src/__tests__/scope-tracker.spec.mts +598 -0
  175. package/src/__tests__/scope-upgrade.spec.mts +808 -0
  176. package/src/__tests__/scoped-container.spec.mts +595 -0
  177. package/src/__tests__/test-container.spec.mts +293 -0
  178. package/src/__tests__/token-resolver.spec.mts +207 -0
  179. package/src/__tests__/unified-storage.spec.mts +535 -0
  180. package/src/__tests__/unit-test-container.spec.mts +405 -0
  181. package/src/__type-tests__/container.spec-d.mts +180 -0
  182. package/src/__type-tests__/factory.spec-d.mts +15 -3
  183. package/src/__type-tests__/inject.spec-d.mts +115 -20
  184. package/src/__type-tests__/injectable.spec-d.mts +69 -52
  185. package/src/__type-tests__/injection-token.spec-d.mts +176 -0
  186. package/src/__type-tests__/scoped-container.spec-d.mts +212 -0
  187. package/src/container/abstract-container.mts +327 -0
  188. package/src/container/container.mts +142 -170
  189. package/src/container/scoped-container.mts +126 -208
  190. package/src/decorators/factory.decorator.mts +16 -11
  191. package/src/decorators/injectable.decorator.mts +20 -16
  192. package/src/enums/index.mts +2 -2
  193. package/src/enums/injectable-scope.enum.mts +1 -0
  194. package/src/enums/injectable-type.enum.mts +1 -0
  195. package/src/errors/di-error.mts +96 -0
  196. package/src/event-emitter.mts +3 -27
  197. package/src/index.mts +6 -153
  198. package/src/interfaces/container.interface.mts +13 -0
  199. package/src/interfaces/factory.interface.mts +1 -1
  200. package/src/interfaces/index.mts +1 -1
  201. package/src/internal/context/async-local-storage.mts +3 -2
  202. package/src/internal/context/async-local-storage.types.mts +1 -0
  203. package/src/internal/context/factory-context.mts +1 -0
  204. package/src/internal/context/index.mts +3 -1
  205. package/src/internal/context/resolution-context.mts +1 -0
  206. package/src/internal/context/service-initialization-context.mts +43 -0
  207. package/src/internal/core/index.mts +5 -4
  208. package/src/internal/core/instance-resolver.mts +461 -292
  209. package/src/internal/core/name-resolver.mts +196 -0
  210. package/src/internal/core/scope-tracker.mts +242 -0
  211. package/src/internal/core/{instantiator.mts → service-initializer.mts} +51 -29
  212. package/src/internal/core/service-invalidator.mts +290 -0
  213. package/src/internal/core/{token-processor.mts → token-resolver.mts} +17 -88
  214. package/src/internal/holder/holder-storage.interface.mts +11 -5
  215. package/src/internal/holder/index.mts +2 -5
  216. package/src/internal/holder/instance-holder.mts +1 -3
  217. package/src/internal/holder/unified-storage.mts +245 -0
  218. package/src/internal/index.mts +2 -1
  219. package/src/internal/lifecycle/circular-detector.mts +1 -0
  220. package/src/internal/lifecycle/index.mts +1 -1
  221. package/src/internal/lifecycle/lifecycle-event-bus.mts +1 -0
  222. package/src/internal/stub-factory-class.mts +16 -0
  223. package/src/symbols/injectable-token.mts +3 -1
  224. package/src/testing/index.mts +2 -0
  225. package/src/testing/test-container.mts +546 -85
  226. package/src/testing/types.mts +117 -0
  227. package/src/testing/unit-test-container.mts +509 -0
  228. package/src/token/injection-token.mts +41 -4
  229. package/src/token/registry.mts +75 -9
  230. package/src/utils/default-injectors.mts +16 -0
  231. package/src/utils/get-injectable-token.mts +2 -3
  232. package/src/utils/get-injectors.mts +26 -15
  233. package/src/utils/index.mts +3 -1
  234. package/src/utils/types.mts +1 -0
  235. package/tsdown.config.mts +11 -1
  236. package/lib/browser/index.d.mts.map +0 -1
  237. package/lib/browser/index.mjs.map +0 -1
  238. package/lib/container-BuAutHGg.d.mts.map +0 -1
  239. package/lib/container-DnzgpfBe.cjs.map +0 -1
  240. package/lib/container-Pb_Y4Z4x.mjs.map +0 -1
  241. package/lib/container-oGTgX2iX.d.cts.map +0 -1
  242. package/src/__tests__/async-local-storage.browser.spec.mts +0 -166
  243. package/src/__tests__/async-local-storage.spec.mts +0 -333
  244. package/src/__tests__/errors.spec.mts +0 -87
  245. package/src/__tests__/factory.spec.mts +0 -137
  246. package/src/__tests__/injectable.spec.mts +0 -246
  247. package/src/__tests__/request-scope.spec.mts +0 -416
  248. package/src/__tests__/service-instantiator.spec.mts +0 -410
  249. package/src/__tests__/service-locator-event-bus.spec.mts +0 -242
  250. package/src/__tests__/service-locator-manager.spec.mts +0 -300
  251. package/src/__tests__/service-locator.spec.mts +0 -966
  252. package/src/__tests__/unified-api.spec.mts +0 -130
  253. package/src/browser.mts +0 -11
  254. package/src/injectors.mts +0 -18
  255. package/src/internal/context/request-context.mts +0 -214
  256. package/src/internal/core/invalidator.mts +0 -437
  257. package/src/internal/core/service-locator.mts +0 -202
  258. package/src/internal/holder/base-holder-manager.mts +0 -238
  259. package/src/internal/holder/holder-manager.mts +0 -85
  260. package/src/internal/holder/request-storage.mts +0 -134
  261. package/src/internal/holder/singleton-storage.mts +0 -105
  262. package/src/testing/README.md +0 -80
  263. package/src/testing/__tests__/test-container.spec.mts +0 -173
@@ -1,41 +1,57 @@
1
1
  import type { z, ZodType } from 'zod/v4'
2
2
 
3
+ import type { Factorable } from '../interfaces/factory.interface.mjs'
3
4
  import type {
4
5
  ClassType,
5
6
  ClassTypeWithArgument,
6
- InjectionToken,
7
7
  InjectionTokenSchemaType,
8
8
  } from '../token/injection-token.mjs'
9
- import type { IContainer } from '../interfaces/container.interface.mjs'
10
- import type { Factorable } from '../interfaces/factory.interface.mjs'
11
9
  import type { Registry } from '../token/registry.mjs'
12
- import type { InstanceHolder } from '../internal/holder/instance-holder.mjs'
13
- import type { Injectors } from '../utils/index.mjs'
10
+ import type { Injectors } from '../utils/get-injectors.mjs'
14
11
  import type { Join, UnionToArray } from '../utils/types.mjs'
15
12
 
16
13
  import { Injectable } from '../decorators/injectable.decorator.mjs'
17
14
  import { InjectableScope, InjectableType } from '../enums/index.mjs'
18
15
  import { DIError } from '../errors/index.mjs'
16
+ import { InstanceResolver } from '../internal/core/instance-resolver.mjs'
17
+ import { NameResolver } from '../internal/core/name-resolver.mjs'
18
+ import { ScopeTracker } from '../internal/core/scope-tracker.mjs'
19
+ import { ServiceInitializer } from '../internal/core/service-initializer.mjs'
20
+ import { ServiceInvalidator } from '../internal/core/service-invalidator.mjs'
21
+ import { TokenResolver } from '../internal/core/token-resolver.mjs'
22
+ import { UnifiedStorage } from '../internal/holder/unified-storage.mjs'
23
+ import { LifecycleEventBus } from '../internal/lifecycle/lifecycle-event-bus.mjs'
19
24
  import {
20
25
  BoundInjectionToken,
21
26
  FactoryInjectionToken,
27
+ InjectionToken,
22
28
  } from '../token/injection-token.mjs'
23
- import { defaultInjectors } from '../injectors.mjs'
24
29
  import { globalRegistry } from '../token/registry.mjs'
30
+ import { defaultInjectors } from '../utils/default-injectors.mjs'
31
+ import { getInjectableToken } from '../utils/index.mjs'
32
+ import { AbstractContainer } from './abstract-container.mjs'
25
33
  import { ScopedContainer } from './scoped-container.mjs'
26
- import { ServiceLocator } from '../internal/core/service-locator.mjs'
27
- import { getInjectableToken } from '../utils/get-injectable-token.mjs'
28
34
 
29
35
  /**
30
36
  * Main dependency injection container.
31
37
  *
32
- * Provides a simplified public API for dependency injection, wrapping
33
- * a ServiceLocator instance. Handles singleton and transient services directly,
38
+ * Provides a simplified public API for dependency injection.
39
+ * Handles singleton and transient services directly,
34
40
  * while request-scoped services require using beginRequest() to create a ScopedContainer.
35
41
  */
36
42
  @Injectable()
37
- export class Container implements IContainer {
38
- private readonly serviceLocator: ServiceLocator
43
+ export class Container extends AbstractContainer {
44
+ protected readonly defaultScope = InjectableScope.Singleton
45
+ protected readonly requestId = undefined
46
+
47
+ private readonly storage: UnifiedStorage
48
+ private readonly serviceInitializer: ServiceInitializer
49
+ private readonly serviceInvalidator: ServiceInvalidator
50
+ private readonly tokenResolver: TokenResolver
51
+ private readonly nameResolver: NameResolver
52
+ private readonly scopeTracker: ScopeTracker
53
+ private readonly eventBus: LifecycleEventBus
54
+ private readonly instanceResolver: InstanceResolver
39
55
  private readonly activeRequestIds = new Set<string>()
40
56
 
41
57
  constructor(
@@ -43,27 +59,48 @@ export class Container implements IContainer {
43
59
  protected readonly logger: Console | null = null,
44
60
  protected readonly injectors: Injectors = defaultInjectors,
45
61
  ) {
46
- this.serviceLocator = new ServiceLocator(registry, logger, injectors)
62
+ super()
63
+ // Initialize components
64
+ this.storage = new UnifiedStorage(InjectableScope.Singleton)
65
+ this.eventBus = new LifecycleEventBus(logger)
66
+ this.nameResolver = new NameResolver(logger)
67
+ this.tokenResolver = new TokenResolver(logger)
68
+ this.scopeTracker = new ScopeTracker(registry, this.nameResolver, logger)
69
+ this.serviceInitializer = new ServiceInitializer(injectors)
70
+ this.serviceInvalidator = new ServiceInvalidator(this.eventBus, logger)
71
+ this.instanceResolver = new InstanceResolver(
72
+ registry,
73
+ this.storage,
74
+ this.serviceInitializer,
75
+ this.tokenResolver,
76
+ this.nameResolver,
77
+ this.scopeTracker,
78
+ this.serviceInvalidator,
79
+ this.eventBus,
80
+ logger,
81
+ )
47
82
  this.registerSelf()
48
83
  }
49
84
 
50
85
  private registerSelf() {
51
86
  const token = getInjectableToken(Container)
52
- const instanceName = this.serviceLocator.getInstanceIdentifier(token)
53
- this.serviceLocator
54
- .getManager()
55
- .storeCreatedHolder(
56
- instanceName,
57
- this,
58
- InjectableType.Class,
59
- InjectableScope.Singleton,
60
- )
87
+ this.registry.set(
88
+ token,
89
+ InjectableScope.Singleton,
90
+ Container,
91
+ InjectableType.Class,
92
+ )
93
+ const instanceName = this.nameResolver.generateInstanceName(
94
+ token,
95
+ undefined,
96
+ undefined,
97
+ InjectableScope.Singleton,
98
+ )
99
+ this.storage.storeInstance(instanceName, this)
61
100
  }
62
101
 
63
102
  /**
64
103
  * Gets an instance from the container.
65
- * This method has the same type signature as the inject method from get-injectors.mts
66
- *
67
104
  * NOTE: Request-scoped services cannot be resolved directly from Container.
68
105
  * Use beginRequest() to create a ScopedContainer for request-scoped services.
69
106
  */
@@ -78,7 +115,6 @@ export class Container implements IContainer {
78
115
  token: T,
79
116
  args: R,
80
117
  ): Promise<InstanceType<T>>
81
-
82
118
  // #2 Token with required Schema
83
119
  get<T, S extends InjectionTokenSchemaType>(
84
120
  token: InjectionToken<T, S>,
@@ -109,211 +145,147 @@ export class Container implements IContainer {
109
145
  args?: unknown,
110
146
  ) {
111
147
  // Check if this is a request-scoped service
112
- // Use TokenProcessor for consistent token normalization
113
- const tokenProcessor = this.serviceLocator.getTokenProcessor()
114
- const realToken = tokenProcessor.getRegistryToken(token)
148
+ const realToken = this.tokenResolver.getRegistryToken(token)
115
149
 
116
150
  if (this.registry.has(realToken)) {
117
151
  const record = this.registry.get(realToken)
118
152
  if (record.scope === InjectableScope.Request) {
119
- throw DIError.unknown(
120
- `Cannot resolve request-scoped service "${String(realToken.name)}" from Container. ` +
121
- `Use beginRequest() to create a ScopedContainer for request-scoped services.`,
153
+ throw DIError.scopeMismatchError(
154
+ realToken.name,
155
+ 'ScopedContainer',
156
+ 'Container',
122
157
  )
123
158
  }
124
159
  }
125
160
 
126
- return this.serviceLocator.getOrThrowInstance(token, args as any, this)
127
- }
128
-
129
- /**
130
- * Gets an instance with a specific container context.
131
- * Used by ScopedContainer to delegate singleton/transient resolution
132
- * while maintaining the correct container context for nested inject() calls.
133
- *
134
- * @internal
135
- */
136
- async getWithContext(
137
- token:
138
- | ClassType
139
- | InjectionToken<any>
140
- | BoundInjectionToken<any, any>
141
- | FactoryInjectionToken<any, any>,
142
- args: unknown,
143
- contextContainer: IContainer,
144
- ): Promise<any> {
145
- return this.serviceLocator.getOrThrowInstance(
161
+ const [error, instance] = await this.instanceResolver.resolveInstance(
146
162
  token,
147
- args as any,
148
- contextContainer,
149
- )
150
- }
151
-
152
- /**
153
- * Resolves a request-scoped service for a ScopedContainer.
154
- * The service will be stored in the ScopedContainer's request context.
155
- *
156
- * @internal
157
- */
158
- async resolveForRequest(
159
- token:
160
- | ClassType
161
- | InjectionToken<any>
162
- | BoundInjectionToken<any, any>
163
- | FactoryInjectionToken<any, any>,
164
- args: unknown,
165
- scopedContainer: ScopedContainer,
166
- ): Promise<any> {
167
- return this.serviceLocator.resolveRequestScoped(
168
- token,
169
- args as any,
170
- scopedContainer,
163
+ args,
164
+ this,
171
165
  )
172
- }
173
166
 
174
- /**
175
- * Gets the underlying ServiceLocator instance for advanced usage
176
- */
177
- getServiceLocator(): ServiceLocator {
178
- return this.serviceLocator
179
- }
167
+ if (error) {
168
+ throw error
169
+ }
180
170
 
181
- /**
182
- * Gets the registry
183
- */
184
- getRegistry(): Registry {
185
- return this.registry
171
+ return instance
186
172
  }
187
173
 
188
174
  /**
189
- * Invalidates a service and its dependencies
175
+ * Invalidates a service and its dependencies.
190
176
  */
191
177
  async invalidate(service: unknown): Promise<void> {
192
- const holder = this.getHolderByInstance(service)
193
- if (holder) {
194
- await this.serviceLocator.invalidate(holder.name)
178
+ // Find the service by instance
179
+ const holder = this.storage.findByInstance(service)
180
+ if (!holder) {
181
+ this.logger?.warn(
182
+ `[Container] Service instance not found for invalidation`,
183
+ )
184
+ return
195
185
  }
196
- }
197
186
 
198
- /**
199
- * Gets a service holder by instance (reverse lookup)
200
- */
201
- private getHolderByInstance(
202
- instance: unknown,
203
- ): InstanceHolder | null {
204
- const holderMap = Array.from(
205
- this.serviceLocator
206
- .getManager()
207
- .filter((holder) => holder.instance === instance)
208
- .values(),
187
+ await this.serviceInvalidator.invalidateWithStorage(
188
+ holder.name,
189
+ this.storage,
209
190
  )
210
-
211
- return holderMap.length > 0 ? holderMap[0] : null
212
191
  }
213
192
 
214
193
  /**
215
- * Checks if a service is registered in the container
216
- */
217
- isRegistered(token: any): boolean {
218
- try {
219
- return this.serviceLocator.getInstanceIdentifier(token) !== null
220
- } catch {
221
- return false
222
- }
223
- }
224
-
225
- /**
226
- * Disposes the container and cleans up all resources
194
+ * Disposes the container and cleans up all resources.
227
195
  */
228
196
  async dispose(): Promise<void> {
229
- await this.serviceLocator.clearAll()
230
- }
231
-
232
- /**
233
- * Waits for all pending operations to complete
234
- */
235
- async ready(): Promise<void> {
236
- await this.serviceLocator.ready()
197
+ await this.serviceInvalidator.clearAllWithStorage(this.storage)
237
198
  }
238
199
 
239
200
  /**
240
201
  * @internal
241
202
  * Attempts to get an instance synchronously if it already exists.
242
- * Returns null if the instance doesn't exist or is not ready.
203
+ * Overrides base class to support requestId parameter for ScopedContainer compatibility.
243
204
  */
244
- tryGetSync<T>(token: any, args?: any): T | null {
245
- return this.serviceLocator.getSyncInstance(token, args, this)
205
+ override tryGetSync<T>(token: any, args?: any, requestId?: string): T | null {
206
+ return this.tryGetSyncFromStorage(
207
+ token,
208
+ args,
209
+ this.storage,
210
+ requestId ?? this.requestId,
211
+ )
246
212
  }
247
213
 
248
- // ============================================================================
249
- // REQUEST CONTEXT MANAGEMENT
250
- // ============================================================================
251
-
252
214
  /**
253
215
  * Begins a new request context and returns a ScopedContainer.
254
- *
255
- * The ScopedContainer provides isolated request-scoped service resolution
256
- * while delegating singleton and transient services to this Container.
257
- *
258
- * @param requestId Unique identifier for this request
259
- * @param metadata Optional metadata for the request
260
- * @param priority Priority for resolution (higher = more priority)
261
- * @returns A ScopedContainer for this request
262
216
  */
263
217
  beginRequest(
264
218
  requestId: string,
265
219
  metadata?: Record<string, any>,
266
- priority: number = 100,
267
220
  ): ScopedContainer {
268
221
  if (this.activeRequestIds.has(requestId)) {
269
- throw DIError.unknown(
270
- `Request context "${requestId}" already exists. Use a unique request ID.`,
271
- )
222
+ throw new Error(`Request with ID ${requestId} already exists`)
272
223
  }
273
224
 
274
225
  this.activeRequestIds.add(requestId)
275
226
 
276
- this.logger?.log(`[Container] Started request context: ${requestId}`)
277
-
278
- return new ScopedContainer(
279
- this,
280
- this.registry,
281
- requestId,
282
- metadata,
283
- priority,
284
- )
285
- }
286
-
287
- /**
288
- * Removes a request ID from the active set.
289
- * Called by ScopedContainer when the request ends.
290
- *
291
- * @internal
292
- */
293
- removeActiveRequest(requestId: string): void {
294
- this.activeRequestIds.delete(requestId)
295
- this.logger?.log(`[Container] Ended request context: ${requestId}`)
227
+ return new ScopedContainer(this, this.registry, requestId, metadata)
296
228
  }
297
229
 
298
230
  /**
299
- * Gets the set of active request IDs.
231
+ * Gets all active request IDs.
300
232
  */
301
233
  getActiveRequestIds(): ReadonlySet<string> {
302
234
  return this.activeRequestIds
303
235
  }
304
236
 
305
237
  /**
306
- * Checks if a request ID is currently active.
238
+ * Checks if a request is active.
307
239
  */
308
240
  hasActiveRequest(requestId: string): boolean {
309
241
  return this.activeRequestIds.has(requestId)
310
242
  }
311
243
 
312
244
  /**
313
- * Clears all instances and bindings from the container.
314
- * This is useful for testing or resetting the container state.
245
+ * Removes a request ID from active requests.
246
+ * Called by ScopedContainer when request ends.
315
247
  */
316
- clear(): Promise<void> {
317
- return this.serviceLocator.clearAll()
248
+ removeRequestId(requestId: string): void {
249
+ this.activeRequestIds.delete(requestId)
250
+ }
251
+
252
+ // ============================================================================
253
+ // INTERNAL METHODS FOR COMPONENT ACCESS
254
+ // ============================================================================
255
+
256
+ getStorage(): UnifiedStorage {
257
+ return this.storage
258
+ }
259
+
260
+ getServiceInitializer(): ServiceInitializer {
261
+ return this.serviceInitializer
262
+ }
263
+
264
+ getServiceInvalidator(): ServiceInvalidator {
265
+ return this.serviceInvalidator
266
+ }
267
+
268
+ getTokenResolver(): TokenResolver {
269
+ return this.tokenResolver
270
+ }
271
+
272
+ getNameResolver(): NameResolver {
273
+ return this.nameResolver
274
+ }
275
+
276
+ getScopeTracker(): ScopeTracker {
277
+ return this.scopeTracker
278
+ }
279
+
280
+ getEventBus(): LifecycleEventBus {
281
+ return this.eventBus
282
+ }
283
+
284
+ getRegistry(): Registry {
285
+ return this.registry
286
+ }
287
+
288
+ getInstanceResolver(): InstanceResolver {
289
+ return this.instanceResolver
318
290
  }
319
291
  }