@navios/di 0.8.0 → 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 (264) hide show
  1. package/CHANGELOG.md +87 -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 -1558
  40. package/lib/browser/index.mjs +29 -2749
  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-DAKOvAgr.mjs → container-8-z89TyQ.mjs} +1325 -1462
  138. package/lib/container-8-z89TyQ.mjs.map +1 -0
  139. package/lib/{container-Bp1W-pWJ.d.mts → container-CNiqesCL.d.mts} +598 -617
  140. package/lib/container-CNiqesCL.d.mts.map +1 -0
  141. package/lib/{container-DENMeJ87.cjs → container-CaY2fDuk.cjs} +1369 -1512
  142. package/lib/container-CaY2fDuk.cjs.map +1 -0
  143. package/lib/{container-YPwvmlK2.d.cts → container-D-0Ho3qL.d.cts} +598 -612
  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 +460 -302
  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-resolver.mts +122 -0
  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-Bp1W-pWJ.d.mts.map +0 -1
  239. package/lib/container-DAKOvAgr.mjs.map +0 -1
  240. package/lib/container-DENMeJ87.cjs.map +0 -1
  241. package/lib/container-YPwvmlK2.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 -225
  256. package/src/internal/core/invalidator.mts +0 -437
  257. package/src/internal/core/service-locator.mts +0 -202
  258. package/src/internal/core/token-processor.mts +0 -252
  259. package/src/internal/holder/base-holder-manager.mts +0 -334
  260. package/src/internal/holder/holder-manager.mts +0 -85
  261. package/src/internal/holder/request-storage.mts +0 -127
  262. package/src/internal/holder/singleton-storage.mts +0 -92
  263. package/src/testing/README.md +0 -80
  264. package/src/testing/__tests__/test-container.spec.mts +0 -173
@@ -0,0 +1,245 @@
1
+ import type { OnServiceDestroy } from '../../interfaces/index.mjs'
2
+ import type {
3
+ HolderGetResult,
4
+ IHolderStorage,
5
+ } from './holder-storage.interface.mjs'
6
+ import type { InstanceHolder } from './instance-holder.mjs'
7
+
8
+ import { InjectableScope, InjectableType } from '../../enums/index.mjs'
9
+ import { DIError } from '../../errors/index.mjs'
10
+ import { InstanceStatus } from './instance-holder.mjs'
11
+
12
+ /**
13
+ * Unified storage implementation that works the same way regardless of scope.
14
+ * Replaces RequestContext, HolderManager, SingletonStorage, RequestStorage.
15
+ *
16
+ * Scope is just metadata - storage operations are identical for all scopes.
17
+ * Different storage instances are just isolated storage spaces.
18
+ */
19
+ export class UnifiedStorage implements IHolderStorage {
20
+ readonly scope: InjectableScope
21
+
22
+ private readonly holders = new Map<string, InstanceHolder>()
23
+ /**
24
+ * Reverse dependency index: maps a dependency name to the set of holder names that depend on it.
25
+ * This allows O(1) lookup of dependents instead of O(n) iteration.
26
+ */
27
+ private readonly dependents = new Map<string, Set<string>>()
28
+
29
+ constructor(scope: InjectableScope = InjectableScope.Singleton) {
30
+ this.scope = scope
31
+ }
32
+
33
+ get<T = unknown>(instanceName: string): HolderGetResult<T> {
34
+ const holder = this.holders.get(instanceName)
35
+
36
+ if (!holder) {
37
+ return null
38
+ }
39
+
40
+ // Check holder status for error states
41
+ switch (holder.status) {
42
+ case InstanceStatus.Destroying:
43
+ return [
44
+ DIError.instanceDestroying(instanceName),
45
+ holder as InstanceHolder<T>,
46
+ ]
47
+
48
+ case InstanceStatus.Error:
49
+ return [
50
+ holder.instance as unknown as DIError,
51
+ holder as InstanceHolder<T>,
52
+ ]
53
+
54
+ case InstanceStatus.Creating:
55
+ case InstanceStatus.Created:
56
+ return [undefined, holder as InstanceHolder<T>]
57
+
58
+ default:
59
+ return null
60
+ }
61
+ }
62
+
63
+ set(instanceName: string, holder: InstanceHolder): void {
64
+ this.holders.set(instanceName, holder)
65
+ // Register dependencies in reverse index
66
+ if (holder.deps.size > 0) {
67
+ this.registerDependencies(instanceName, holder.deps)
68
+ }
69
+ }
70
+
71
+ delete(instanceName: string): boolean {
72
+ const holder = this.holders.get(instanceName)
73
+ if (holder) {
74
+ // Remove this holder from the reverse index for all its dependencies
75
+ this.removeFromDependentsIndex(instanceName, holder.deps)
76
+ }
77
+ return this.holders.delete(instanceName)
78
+ }
79
+
80
+ createHolder<T>(
81
+ instanceName: string,
82
+ type: InjectableType,
83
+ deps: Set<string>,
84
+ ): [
85
+ ReturnType<typeof Promise.withResolvers<[undefined, T]>>,
86
+ InstanceHolder<T>,
87
+ ] {
88
+ const deferred = Promise.withResolvers<[undefined, T]>()
89
+
90
+ const holder: InstanceHolder<T> = {
91
+ status: InstanceStatus.Creating,
92
+ name: instanceName,
93
+ instance: null,
94
+ creationPromise: deferred.promise,
95
+ destroyPromise: null,
96
+ type,
97
+ scope: this.scope,
98
+ deps,
99
+ destroyListeners: [],
100
+ createdAt: Date.now(),
101
+ waitingFor: new Set(),
102
+ }
103
+
104
+ return [deferred, holder]
105
+ }
106
+
107
+ storeInstance(instanceName: string, instance: unknown): void {
108
+ const holder = this.holders.get(instanceName)
109
+ if (holder) {
110
+ throw DIError.storageError(
111
+ 'Instance already stored',
112
+ 'storeInstance',
113
+ instanceName,
114
+ )
115
+ }
116
+ this.set(instanceName, {
117
+ status: InstanceStatus.Created,
118
+ name: instanceName,
119
+ instance,
120
+ creationPromise: null,
121
+ destroyPromise: null,
122
+ type: InjectableType.Class,
123
+ scope: this.scope,
124
+ deps: new Set(),
125
+ destroyListeners:
126
+ typeof instance === 'object' &&
127
+ instance !== null &&
128
+ 'onServiceDestroy' in instance
129
+ ? [(instance as OnServiceDestroy).onServiceDestroy]
130
+ : [],
131
+ createdAt: Date.now(),
132
+ waitingFor: new Set(),
133
+ })
134
+ }
135
+
136
+ handles(scope: InjectableScope): boolean {
137
+ return scope === this.scope
138
+ }
139
+
140
+ // ============================================================================
141
+ // ITERATION AND QUERY
142
+ // ============================================================================
143
+
144
+ getAllNames(): string[] {
145
+ return Array.from(this.holders.keys())
146
+ }
147
+
148
+ forEach(callback: (name: string, holder: InstanceHolder) => void): void {
149
+ for (const [name, holder] of this.holders) {
150
+ callback(name, holder)
151
+ }
152
+ }
153
+
154
+ findByInstance(instance: unknown): InstanceHolder | null {
155
+ for (const holder of this.holders.values()) {
156
+ if (holder.instance === instance) {
157
+ return holder
158
+ }
159
+ }
160
+ return null
161
+ }
162
+
163
+ findDependents(instanceName: string): string[] {
164
+ const dependents = this.dependents.get(instanceName)
165
+ return dependents ? Array.from(dependents) : []
166
+ }
167
+
168
+ /**
169
+ * Updates dependency references when instance names change.
170
+ * Used during scope upgrades when instance names are regenerated with requestId.
171
+ *
172
+ * @param oldName The old instance name
173
+ * @param newName The new instance name
174
+ */
175
+ updateDependencyReference(oldName: string, newName: string): void {
176
+ // Update all holders that reference oldName in their deps Set
177
+ for (const holder of this.holders.values()) {
178
+ if (holder.deps.has(oldName)) {
179
+ holder.deps.delete(oldName)
180
+ holder.deps.add(newName)
181
+ }
182
+ }
183
+
184
+ // Update reverse dependency index
185
+ const oldDependents = this.dependents.get(oldName)
186
+ if (oldDependents) {
187
+ // Move dependents from old name to new name
188
+ const newDependents = this.dependents.get(newName) || new Set<string>()
189
+ for (const dependent of oldDependents) {
190
+ newDependents.add(dependent)
191
+ }
192
+ this.dependents.set(newName, newDependents)
193
+ this.dependents.delete(oldName)
194
+ }
195
+
196
+ // Update reverse index entries - if oldName was a dependency, update all holders that depend on it
197
+ for (const [depName, dependents] of this.dependents.entries()) {
198
+ if (depName === oldName) {
199
+ // This shouldn't happen, but handle it just in case
200
+ const newDependents = this.dependents.get(newName) || new Set<string>()
201
+ for (const dependent of dependents) {
202
+ newDependents.add(dependent)
203
+ }
204
+ this.dependents.set(newName, newDependents)
205
+ this.dependents.delete(oldName)
206
+ }
207
+ }
208
+ }
209
+
210
+ // ============================================================================
211
+ // INTERNAL HELPERS
212
+ // ============================================================================
213
+
214
+ /**
215
+ * Registers a holder's dependencies in the reverse index.
216
+ */
217
+ private registerDependencies(holderName: string, deps: Set<string>): void {
218
+ for (const dep of deps) {
219
+ let dependents = this.dependents.get(dep)
220
+ if (!dependents) {
221
+ dependents = new Set()
222
+ this.dependents.set(dep, dependents)
223
+ }
224
+ dependents.add(holderName)
225
+ }
226
+ }
227
+
228
+ /**
229
+ * Removes a holder from the reverse dependency index.
230
+ */
231
+ private removeFromDependentsIndex(
232
+ holderName: string,
233
+ deps: Set<string>,
234
+ ): void {
235
+ for (const dep of deps) {
236
+ const dependents = this.dependents.get(dep)
237
+ if (dependents) {
238
+ dependents.delete(holderName)
239
+ if (dependents.size === 0) {
240
+ this.dependents.delete(dep)
241
+ }
242
+ }
243
+ }
244
+ }
245
+ }
@@ -1,4 +1,5 @@
1
+ export * from './context/index.mjs'
1
2
  export * from './core/index.mjs'
2
3
  export * from './holder/index.mjs'
3
- export * from './context/index.mjs'
4
4
  export * from './lifecycle/index.mjs'
5
+ export * from './stub-factory-class.mjs'
@@ -90,3 +90,4 @@ export class CircularDetector {
90
90
  return cycle.join(' -> ')
91
91
  }
92
92
  }
93
+
@@ -1,2 +1,2 @@
1
- export * from './lifecycle-event-bus.mjs'
2
1
  export * from './circular-detector.mjs'
2
+ export * from './lifecycle-event-bus.mjs'
@@ -73,3 +73,4 @@ export class LifecycleEventBus {
73
73
  return res
74
74
  }
75
75
  }
76
+
@@ -0,0 +1,16 @@
1
+ import { DIError } from '../errors/di-error.mjs'
2
+
3
+ /**
4
+ * Stub factory class used when registering InjectionTokens without a real class implementation.
5
+ * This is used in ScopedContainer.addInstance() to allow registering tokens that don't have
6
+ * a corresponding class, while preventing accidental instantiation.
7
+ *
8
+ * @internal
9
+ */
10
+ export class StubFactoryClass {
11
+ constructor() {
12
+ throw DIError.factoryNotFound(
13
+ 'Trying to get instance of factory without real implementation',
14
+ )
15
+ }
16
+ }
@@ -1 +1,3 @@
1
- export const InjectableTokenMeta = Symbol.for('InjectableTokenMeta')
1
+ export const InjectableTokenMeta = /* #__PURE__ */ Symbol.for(
2
+ 'InjectableTokenMeta',
3
+ )
@@ -1 +1,3 @@
1
1
  export * from './test-container.mjs'
2
+ export * from './types.mjs'
3
+ export * from './unit-test-container.mjs'