@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,119 @@
1
+ import { InjectableScope } from "../enums/injectable-scope.enum.mjs";
2
+ import { UnifiedStorage } from "../internal/holder/unified-storage.mjs";
3
+ import { AbstractContainer } from "./abstract-container.mjs";
4
+
5
+ //#region src/container/scoped-container.mts
6
+ /**
7
+ * Request-scoped dependency injection container.
8
+ *
9
+ * Wraps a parent Container and provides isolated request-scoped instances
10
+ * while delegating singleton and transient resolution to the parent.
11
+ * This design eliminates race conditions that can occur with async operations
12
+ * when multiple requests are processed concurrently.
13
+ */ var ScopedContainer = class extends AbstractContainer {
14
+ parent;
15
+ registry;
16
+ requestId;
17
+ defaultScope = InjectableScope.Request;
18
+ storage;
19
+ disposed = false;
20
+ metadata;
21
+ constructor(parent, registry, requestId, metadata) {
22
+ super(), this.parent = parent, this.registry = registry, this.requestId = requestId;
23
+ this.storage = new UnifiedStorage(InjectableScope.Request);
24
+ this.metadata = metadata || {};
25
+ }
26
+ getStorage() {
27
+ return this.storage;
28
+ }
29
+ getRegistry() {
30
+ return this.registry;
31
+ }
32
+ getTokenResolver() {
33
+ return this.parent.getTokenResolver();
34
+ }
35
+ getNameResolver() {
36
+ return this.parent.getNameResolver();
37
+ }
38
+ getServiceInvalidator() {
39
+ return this.parent.getServiceInvalidator();
40
+ }
41
+ /**
42
+ * Gets the request ID for this scoped container.
43
+ */ getRequestId() {
44
+ return this.requestId;
45
+ }
46
+ /**
47
+ * Gets the parent container.
48
+ */ getParent() {
49
+ return this.parent;
50
+ }
51
+ /**
52
+ * Gets metadata from the request context.
53
+ */ getMetadata(key) {
54
+ return this.metadata[key];
55
+ }
56
+ /**
57
+ * Sets metadata on the request context.
58
+ */ setMetadata(key, value) {
59
+ this.metadata[key] = value;
60
+ }
61
+ async get(token, args) {
62
+ if (this.disposed) throw new Error("ScopedContainer has been disposed");
63
+ const realToken = this.getTokenResolver().getRegistryToken(token);
64
+ if (this.registry.has(realToken)) {
65
+ if (this.registry.get(realToken).scope === InjectableScope.Request) {
66
+ const [error$1, instance$1] = await this.parent.getInstanceResolver().resolveRequestScopedInstance(token, args, this);
67
+ if (error$1) throw error$1;
68
+ return instance$1;
69
+ }
70
+ }
71
+ const [error, instance] = await this.parent.getInstanceResolver().resolveInstance(token, args, this, this.storage, this.requestId);
72
+ if (error) throw error;
73
+ return instance;
74
+ }
75
+ /**
76
+ * Invalidates a service and its dependencies.
77
+ */ async invalidate(service) {
78
+ const holder = this.storage.findByInstance(service);
79
+ if (!holder) return this.parent.invalidate(service);
80
+ await this.getServiceInvalidator().invalidateWithStorage(holder.name, this.storage);
81
+ }
82
+ /**
83
+ * Disposes the container and cleans up all resources.
84
+ * Alias for endRequest().
85
+ */ async dispose() {
86
+ return this.endRequest();
87
+ }
88
+ /**
89
+ * @internal
90
+ * Attempts to get an instance synchronously if it already exists.
91
+ * Checks request storage first, then delegates to parent.
92
+ */ tryGetSync(token, args) {
93
+ const realToken = this.getTokenResolver().getRegistryToken(token);
94
+ if ((this.registry.has(realToken) ? this.registry.get(realToken).scope : InjectableScope.Singleton) === InjectableScope.Request) {
95
+ const result = this.tryGetSyncFromStorage(token, args, this.storage, this.requestId);
96
+ if (result !== null) return result;
97
+ }
98
+ return this.parent.tryGetSync(token, args, this.requestId);
99
+ }
100
+ /**
101
+ * Adds an instance to the container.
102
+ * Overrides base class to check disposed state.
103
+ */ addInstance(token, instance) {
104
+ if (this.disposed) throw new Error("ScopedContainer has been disposed");
105
+ super.addInstance(token, instance);
106
+ }
107
+ /**
108
+ * Ends the request and cleans up all request-scoped services.
109
+ */ async endRequest() {
110
+ if (this.disposed) return;
111
+ this.disposed = true;
112
+ await this.getServiceInvalidator().clearAllWithStorage(this.storage);
113
+ this.parent.removeRequestId(this.requestId);
114
+ }
115
+ };
116
+
117
+ //#endregion
118
+ export { ScopedContainer };
119
+ //# sourceMappingURL=scoped-container.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scoped-container.mjs","names":["InjectableScope","UnifiedStorage","AbstractContainer","ScopedContainer","defaultScope","Request","storage","disposed","metadata","parent","registry","requestId","getStorage","getRegistry","getTokenResolver","getNameResolver","getServiceInvalidator","getRequestId","getParent","getMetadata","key","setMetadata","value","get","token","args","Error","tokenResolver","realToken","getRegistryToken","has","record","scope","error","instance","getInstanceResolver","resolveRequestScopedInstance","resolveInstance","invalidate","service","holder","findByInstance","invalidateWithStorage","name","dispose","endRequest","tryGetSync","Singleton","result","tryGetSyncFromStorage","addInstance","clearAllWithStorage","removeRequestId"],"sources":["../../../src/container/scoped-container.mts"],"sourcesContent":["import type { z, ZodType } from 'zod/v4'\n\nimport type { Factorable } from '../interfaces/factory.interface.mjs'\nimport type {\n ClassType,\n ClassTypeWithArgument,\n FactoryInjectionToken,\n InjectionTokenSchemaType,\n} from '../token/injection-token.mjs'\nimport type { Registry } from '../token/registry.mjs'\nimport type { Join, UnionToArray } from '../utils/types.mjs'\nimport type { NameResolver } from '../internal/core/name-resolver.mjs'\nimport type { ServiceInvalidator } from '../internal/core/service-invalidator.mjs'\nimport type { TokenResolver } from '../internal/core/token-resolver.mjs'\n\nimport { InjectableScope } from '../enums/index.mjs'\nimport { UnifiedStorage } from '../internal/holder/unified-storage.mjs'\nimport {\n BoundInjectionToken,\n InjectionToken,\n} from '../token/injection-token.mjs'\nimport { AbstractContainer } from './abstract-container.mjs'\nimport { Container } from './container.mjs'\n\n/**\n * Request-scoped dependency injection container.\n *\n * Wraps a parent Container and provides isolated request-scoped instances\n * while delegating singleton and transient resolution to the parent.\n * This design eliminates race conditions that can occur with async operations\n * when multiple requests are processed concurrently.\n */\nexport class ScopedContainer extends AbstractContainer {\n protected readonly defaultScope = InjectableScope.Request\n\n private readonly storage: UnifiedStorage\n private disposed = false\n private readonly metadata: Record<string, any>\n\n constructor(\n private readonly parent: Container,\n private readonly registry: Registry,\n public readonly requestId: string,\n metadata?: Record<string, any>,\n ) {\n super()\n // Create own unified storage for request-scoped services\n this.storage = new UnifiedStorage(InjectableScope.Request)\n this.metadata = metadata || {}\n }\n\n // ============================================================================\n // ABSTRACT METHOD IMPLEMENTATIONS - Delegate to parent\n // ============================================================================\n\n getStorage(): UnifiedStorage {\n return this.storage\n }\n\n protected getRegistry(): Registry {\n return this.registry\n }\n\n protected getTokenResolver(): TokenResolver {\n return this.parent.getTokenResolver()\n }\n\n protected getNameResolver(): NameResolver {\n return this.parent.getNameResolver()\n }\n\n protected getServiceInvalidator(): ServiceInvalidator {\n return this.parent.getServiceInvalidator()\n }\n\n // ============================================================================\n // SCOPED CONTAINER SPECIFIC METHODS\n // ============================================================================\n\n /**\n * Gets the request ID for this scoped container.\n */\n getRequestId(): string {\n return this.requestId\n }\n\n /**\n * Gets the parent container.\n */\n getParent(): Container {\n return this.parent\n }\n\n /**\n * Gets metadata from the request context.\n */\n getMetadata(key: string): any | undefined {\n return this.metadata[key]\n }\n\n /**\n * Sets metadata on the request context.\n */\n setMetadata(key: string, value: any): void {\n this.metadata[key] = value\n }\n\n /**\n * Gets an instance from the container.\n * Request-scoped services are resolved from this container's storage.\n * All other services are delegated to the parent container.\n */\n // #1 Simple class\n get<T extends ClassType>(\n token: T,\n ): InstanceType<T> extends Factorable<infer R>\n ? Promise<R>\n : Promise<InstanceType<T>>\n // #1.1 Simple class with args\n get<T extends ClassTypeWithArgument<R>, R>(\n token: T,\n args: R,\n ): Promise<InstanceType<T>>\n // #2 Token with required Schema\n get<T, S extends InjectionTokenSchemaType>(\n token: InjectionToken<T, S>,\n args: z.input<S>,\n ): Promise<T>\n // #3 Token with optional Schema\n get<T, S extends InjectionTokenSchemaType, R extends boolean>(\n token: InjectionToken<T, S, R>,\n ): R extends false\n ? Promise<T>\n : S extends ZodType<infer Type>\n ? `Error: Your token requires args: ${Join<\n UnionToArray<keyof Type>,\n ', '\n >}`\n : 'Error: Your token requires args'\n // #4 Token with no Schema\n get<T>(token: InjectionToken<T, undefined>): Promise<T>\n get<T>(token: BoundInjectionToken<T, any>): Promise<T>\n get<T>(token: FactoryInjectionToken<T, any>): Promise<T>\n\n async get(\n token:\n | ClassType\n | InjectionToken<any>\n | BoundInjectionToken<any, any>\n | FactoryInjectionToken<any, any>,\n args?: unknown,\n ) {\n if (this.disposed) {\n throw new Error('ScopedContainer has been disposed')\n }\n\n // Check if this is a request-scoped service\n const tokenResolver = this.getTokenResolver()\n const realToken = tokenResolver.getRegistryToken(token)\n\n if (this.registry.has(realToken)) {\n const record = this.registry.get(realToken)\n if (record.scope === InjectableScope.Request) {\n // Resolve request-scoped service from this container\n const [error, instance] = await this.parent\n .getInstanceResolver()\n .resolveRequestScopedInstance(token, args, this)\n\n if (error) {\n throw error\n }\n\n return instance\n }\n }\n\n // Delegate singleton/transient services to parent\n const [error, instance] = await this.parent\n .getInstanceResolver()\n .resolveInstance(token, args, this, this.storage, this.requestId)\n\n if (error) {\n throw error\n }\n\n return instance\n }\n\n /**\n * Invalidates a service and its dependencies.\n */\n async invalidate(service: unknown): Promise<void> {\n // Find the service by instance in request storage\n const holder = this.storage.findByInstance(service)\n if (!holder) {\n // Try parent storage\n return this.parent.invalidate(service)\n }\n\n await this.getServiceInvalidator().invalidateWithStorage(\n holder.name,\n this.storage,\n )\n }\n\n /**\n * Disposes the container and cleans up all resources.\n * Alias for endRequest().\n */\n async dispose(): Promise<void> {\n return this.endRequest()\n }\n\n /**\n * @internal\n * Attempts to get an instance synchronously if it already exists.\n * Checks request storage first, then delegates to parent.\n */\n override tryGetSync<T>(token: any, args?: any): T | null {\n // Check request storage first for request-scoped services\n const tokenResolver = this.getTokenResolver()\n const realToken = tokenResolver.getRegistryToken(token)\n const scope = this.registry.has(realToken)\n ? this.registry.get(realToken).scope\n : InjectableScope.Singleton\n\n if (scope === InjectableScope.Request) {\n const result = this.tryGetSyncFromStorage<T>(\n token,\n args,\n this.storage,\n this.requestId,\n )\n if (result !== null) {\n return result\n }\n }\n\n // Delegate to parent for singleton/transient\n return this.parent.tryGetSync<T>(token, args, this.requestId)\n }\n\n /**\n * Adds an instance to the container.\n * Overrides base class to check disposed state.\n */\n override addInstance<T>(\n token: ClassType | InjectionToken<T, any> | BoundInjectionToken<T, any>,\n instance: T,\n ): void {\n if (this.disposed) {\n throw new Error('ScopedContainer has been disposed')\n }\n\n super.addInstance(token, instance)\n }\n\n /**\n * Ends the request and cleans up all request-scoped services.\n */\n async endRequest(): Promise<void> {\n if (this.disposed) {\n return\n }\n\n this.disposed = true\n\n // Clear all request-scoped services\n await this.getServiceInvalidator().clearAllWithStorage(this.storage)\n\n // Remove request ID from parent\n this.parent.removeRequestId(this.requestId)\n }\n}\n"],"mappings":";;;;;;;;;;;;GAgCA,IAAaG,kBAAb,cAAqCD,kBAAAA;;;;CAChBE,eAAeJ,gBAAgBK;CAEjCC;CACTC,WAAW;CACFC;CAEjB,YACE,QACA,UACA,WACAA,UACA;AACA,SAAK,EAAA,KALYC,SAAAA,QAAAA,KACAC,WAAAA,UAAAA,KACDC,YAAAA;AAKhB,OAAKL,UAAU,IAAIL,eAAeD,gBAAgBK,QAAO;AACzD,OAAKG,WAAWA,YAAY,EAAC;;CAO/BI,aAA6B;AAC3B,SAAO,KAAKN;;CAGJO,cAAwB;AAChC,SAAO,KAAKH;;CAGJI,mBAAkC;AAC1C,SAAO,KAAKL,OAAOK,kBAAgB;;CAG3BC,kBAAgC;AACxC,SAAO,KAAKN,OAAOM,iBAAe;;CAG1BC,wBAA4C;AACpD,SAAO,KAAKP,OAAOO,uBAAqB;;;;IAU1CC,eAAuB;AACrB,SAAO,KAAKN;;;;IAMdO,YAAuB;AACrB,SAAO,KAAKT;;;;IAMdU,YAAYC,KAA8B;AACxC,SAAO,KAAKZ,SAASY;;;;IAMvBC,YAAYD,KAAaE,OAAkB;AACzC,OAAKd,SAASY,OAAOE;;CAwCvB,MAAMC,IACJC,OAKAC,MACA;AACA,MAAI,KAAKlB,SACP,OAAM,IAAImB,MAAM,oCAAA;EAKlB,MAAME,YADgB,KAAKd,kBAAgB,CACXe,iBAAiBL,MAAAA;AAEjD,MAAI,KAAKd,SAASoB,IAAIF,UAAAA,EAEpB;OADe,KAAKlB,SAASa,IAAIK,UAAAA,CACtBI,UAAUhC,gBAAgBK,SAAS;IAE5C,MAAM,CAAC4B,SAAOC,cAAY,MAAM,KAAKzB,OAClC0B,qBAAmB,CACnBC,6BAA6BZ,OAAOC,MAAM,KAAI;AAEjD,QAAIQ,QACF,OAAMA;AAGR,WAAOC;;;EAKX,MAAM,CAACD,OAAOC,YAAY,MAAM,KAAKzB,OAClC0B,qBAAmB,CACnBE,gBAAgBb,OAAOC,MAAM,MAAM,KAAKnB,SAAS,KAAKK,UAAS;AAElE,MAAIsB,MACF,OAAMA;AAGR,SAAOC;;;;IAMT,MAAMI,WAAWC,SAAiC;EAEhD,MAAMC,SAAS,KAAKlC,QAAQmC,eAAeF,QAAAA;AAC3C,MAAI,CAACC,OAEH,QAAO,KAAK/B,OAAO6B,WAAWC,QAAAA;AAGhC,QAAM,KAAKvB,uBAAqB,CAAG0B,sBACjCF,OAAOG,MACP,KAAKrC,QAAO;;;;;IAQhB,MAAMsC,UAAyB;AAC7B,SAAO,KAAKC,YAAU;;;;;;IAQxB,WAAuBrB,OAAYC,MAAsB;EAGvD,MAAMG,YADgB,KAAKd,kBAAgB,CACXe,iBAAiBL,MAAAA;AAKjD,OAJc,KAAKd,SAASoB,IAAIF,UAAAA,GAC5B,KAAKlB,SAASa,IAAIK,UAAAA,CAAWI,QAC7BhC,gBAAgB+C,eAEN/C,gBAAgBK,SAAS;GACrC,MAAM2C,SAAS,KAAKC,sBAClBzB,OACAC,MACA,KAAKnB,SACL,KAAKK,UAAS;AAEhB,OAAIqC,WAAW,KACb,QAAOA;;AAKX,SAAO,KAAKvC,OAAOqC,WAActB,OAAOC,MAAM,KAAKd,UAAS;;;;;IAO9D,YACEa,OACAU,UACM;AACN,MAAI,KAAK3B,SACP,OAAM,IAAImB,MAAM,oCAAA;AAGlB,QAAMwB,YAAY1B,OAAOU,SAAAA;;;;IAM3B,MAAMW,aAA4B;AAChC,MAAI,KAAKtC,SACP;AAGF,OAAKA,WAAW;AAGhB,QAAM,KAAKS,uBAAqB,CAAGmC,oBAAoB,KAAK7C,QAAO;AAGnE,OAAKG,OAAO2C,gBAAgB,KAAKzC,UAAS"}
@@ -0,0 +1,26 @@
1
+ import { ClassTypeWithInstance, InjectionToken, InjectionTokenSchemaType } from "../token/injection-token.mjs";
2
+ import { InjectableScope } from "../enums/injectable-scope.enum.mjs";
3
+ import { Factorable, FactorableWithArgs } from "../interfaces/factory.interface.mjs";
4
+ import { Registry } from "../token/registry.mjs";
5
+
6
+ //#region src/decorators/factory.decorator.d.mts
7
+ interface FactoryOptions {
8
+ scope?: InjectableScope;
9
+ token?: InjectionToken<any, any>;
10
+ registry?: Registry;
11
+ priority?: number;
12
+ }
13
+ declare function Factory<R>(options?: {
14
+ scope?: InjectableScope;
15
+ registry?: Registry;
16
+ priority?: number;
17
+ }): <T extends ClassTypeWithInstance<Factorable<R>>>(target: T, context?: ClassDecoratorContext) => T;
18
+ declare function Factory<R, S>(options: {
19
+ scope?: InjectableScope;
20
+ token: InjectionToken<R, S>;
21
+ registry?: Registry;
22
+ priority?: number;
23
+ }): R extends undefined ? never : S extends InjectionTokenSchemaType ? <T extends ClassTypeWithInstance<FactorableWithArgs<R, S>>>(target: T, context?: ClassDecoratorContext) => T : S extends undefined ? <T extends ClassTypeWithInstance<Factorable<R>>>(target: T, context?: ClassDecoratorContext) => T : never;
24
+ //#endregion
25
+ export { Factory, FactoryOptions };
26
+ //# sourceMappingURL=factory.decorator.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.decorator.d.mts","names":[],"sources":["../../../src/decorators/factory.decorator.mts"],"sourcesContent":[],"mappings":";;;;;;UAYiB,cAAA;EAAA,KAAA,CAAA,EACP,eADqB;EACrB,KAAA,CAAA,EACA,cADA,CAAA,GAAA,EAAA,GAAA,CAAA;EACA,QAAA,CAAA,EACG,QADH;EACG,QAAA,CAAA,EAAA,MAAA;;AAKG,iBAAA,OAAO,CAAA,CAAA,CAAA,CAAA,OAIc,CAJd,EAAA;EACb,KAAA,CAAA,EAAA,eAAA;EACG,QAAA,CAAA,EAAA,QAAA;EAEmC,QAAA,CAAA,EAAA,MAAA;CAAX,CAAA,EAAA,CAAA,UAAtB,qBAAsB,CAAA,UAAA,CAAW,CAAX,CAAA,CAAA,CAAA,CAAA,MAAA,EAC3B,CAD2B,EAAA,OAAA,CAAA,EAEzB,qBAFyB,EAAA,GAGhC,CAHgC;AAAtB,iBAMC,OAND,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,OAAA,EAAA;EACL,KAAA,CAAA,EAMA,eANA;EACE,KAAA,EAMH,cANG,CAMY,CANZ,EAMe,CANf,CAAA;EACP,QAAA,CAAA,EAMQ,QANR;EAAC,QAAA,CAAA,EAAA,MAAA;AAGN,CAAA,CAAA,EAKI,CALY,SAAO,SAAA,GAAA,KAAA,GAOnB,CAPmB,SAOT,wBAPS,GAAA,CAAA,UAQN,qBARM,CAQgB,kBARhB,CAQmC,CARnC,EAQsC,CARtC,CAAA,CAAA,CAAA,CAAA,MAAA,EASP,CATO,EAAA,OAAA,CAAA,EAUL,qBAVK,EAAA,GAWZ,CAXY,GAYjB,CAZiB,SAAA,SAAA,GAAA,CAAA,UAaJ,qBAbI,CAakB,UAblB,CAa6B,CAb7B,CAAA,CAAA,CAAA,CAAA,MAAA,EAcL,CAdK,EAAA,OAAA,CAAA,EAeH,qBAfG,EAAA,GAgBV,CAhBU,GAAA,KAAA"}
@@ -0,0 +1,20 @@
1
+ import { InjectableScope } from "../enums/injectable-scope.enum.mjs";
2
+ import { InjectableType } from "../enums/injectable-type.enum.mjs";
3
+ import { InjectableTokenMeta } from "../symbols/injectable-token.mjs";
4
+ import { InjectionToken } from "../token/injection-token.mjs";
5
+ import { globalRegistry } from "../token/registry.mjs";
6
+
7
+ //#region src/decorators/factory.decorator.mts
8
+ function Factory({ scope = InjectableScope.Singleton, token, registry = globalRegistry, priority = 0 } = {}) {
9
+ return (target, context) => {
10
+ if (context && context.kind !== "class" || target instanceof Function && !context) throw new Error("[DI] @Factory decorator can only be used on classes.");
11
+ let injectableToken = token ?? InjectionToken.create(target);
12
+ registry.set(injectableToken, scope, target, InjectableType.Factory, priority);
13
+ target[InjectableTokenMeta] = injectableToken;
14
+ return target;
15
+ };
16
+ }
17
+
18
+ //#endregion
19
+ export { Factory };
20
+ //# sourceMappingURL=factory.decorator.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.decorator.mjs","names":["InjectableScope","InjectableType","InjectableTokenMeta","InjectionToken","globalRegistry","Factory","scope","Singleton","token","registry","priority","target","context","kind","Function","Error","injectableToken","create","set"],"sources":["../../../src/decorators/factory.decorator.mts"],"sourcesContent":["import type { Factorable, FactorableWithArgs } from '../interfaces/index.mjs'\nimport type {\n ClassTypeWithInstance,\n InjectionTokenSchemaType,\n} from '../token/injection-token.mjs'\nimport type { Registry } from '../token/registry.mjs'\n\nimport { InjectableScope, InjectableType } from '../enums/index.mjs'\nimport { InjectableTokenMeta } from '../symbols/index.mjs'\nimport { InjectionToken } from '../token/injection-token.mjs'\nimport { globalRegistry } from '../token/registry.mjs'\n\nexport interface FactoryOptions {\n scope?: InjectableScope\n token?: InjectionToken<any, any>\n registry?: Registry\n priority?: number\n}\n\n// #1 Factory without arguments\nexport function Factory<R>(options?: {\n scope?: InjectableScope\n registry?: Registry\n priority?: number\n}): <T extends ClassTypeWithInstance<Factorable<R>>>(\n target: T,\n context?: ClassDecoratorContext,\n) => T\n\n// #2 Factory with typed token\nexport function Factory<R, S>(options: {\n scope?: InjectableScope\n token: InjectionToken<R, S>\n registry?: Registry\n priority?: number\n}): R extends undefined\n ? never\n : S extends InjectionTokenSchemaType\n ? <T extends ClassTypeWithInstance<FactorableWithArgs<R, S>>>(\n target: T,\n context?: ClassDecoratorContext,\n ) => T\n : S extends undefined\n ? <T extends ClassTypeWithInstance<Factorable<R>>>(\n target: T,\n context?: ClassDecoratorContext,\n ) => T\n : never\n\nexport function Factory({\n scope = InjectableScope.Singleton,\n token,\n registry = globalRegistry,\n priority = 0,\n}: FactoryOptions = {}) {\n return <\n T extends ClassTypeWithInstance<\n Factorable<any> | FactorableWithArgs<any, any>\n >,\n >(\n target: T,\n context?: ClassDecoratorContext,\n ): T => {\n if (\n (context && context.kind !== 'class') ||\n (target instanceof Function && !context)\n ) {\n throw new Error(\n '[DI] @Factory decorator can only be used on classes.',\n )\n }\n\n let injectableToken: InjectionToken<any, any> =\n token ?? InjectionToken.create(target)\n\n registry.set(injectableToken, scope, target, InjectableType.Factory, priority)\n\n // @ts-expect-error\n target[InjectableTokenMeta] = injectableToken\n\n return target\n }\n}\n\n"],"mappings":";;;;;;;AAiDA,SAAgBK,QAAQ,EACtBC,QAAQN,gBAAgBO,WACxBC,OACAC,WAAWL,gBACXM,WAAW,MACO,EAAE,EAAA;AACpB,SAKEC,QACAC,YAAAA;AAEA,MACE,WAAYA,QAAQC,SAAS,WAC5BF,kBAAkBG,YAAY,CAACF,QAEhC,OAAM,IAAIG,MACR,uDAAA;EAIJ,IAAIC,kBACFR,SAASL,eAAec,OAAON,OAAAA;AAEjCF,WAASS,IAAIF,iBAAiBV,OAAOK,QAAQV,eAAeI,SAASK,SAAAA;AAGrEC,SAAOT,uBAAuBc;AAE9B,SAAOL"}
@@ -0,0 +1,38 @@
1
+ import { BaseInjectionTokenSchemaType, ClassTypeWithArgument, ClassTypeWithInstance, ClassTypeWithInstanceAndArgument, ClassTypeWithInstanceAndOptionalArgument, ClassTypeWithOptionalArgument, ClassTypeWithoutArguments, InjectionToken, InjectionTokenSchemaType, OptionalInjectionTokenSchemaType } from "../token/injection-token.mjs";
2
+ import { InjectableScope } from "../enums/injectable-scope.enum.mjs";
3
+ import { Registry } from "../token/registry.mjs";
4
+ import { z } from "zod/v4";
5
+
6
+ //#region src/decorators/injectable.decorator.d.mts
7
+ interface InjectableOptions {
8
+ scope?: InjectableScope;
9
+ token?: InjectionToken<any, any>;
10
+ schema?: InjectionTokenSchemaType;
11
+ registry?: Registry;
12
+ priority?: number;
13
+ }
14
+ declare function Injectable(): <T extends ClassTypeWithoutArguments>(target: T, context?: ClassDecoratorContext) => T;
15
+ declare function Injectable(options: {
16
+ scope?: InjectableScope;
17
+ registry: Registry;
18
+ priority?: number;
19
+ }): <T extends ClassTypeWithoutArguments>(target: T, context?: ClassDecoratorContext) => T;
20
+ declare function Injectable(options: {
21
+ scope: InjectableScope;
22
+ priority?: number;
23
+ }): <T extends ClassTypeWithoutArguments>(target: T, context?: ClassDecoratorContext) => T;
24
+ declare function Injectable<Schema extends InjectionTokenSchemaType>(options: {
25
+ scope?: InjectableScope;
26
+ schema: Schema;
27
+ registry?: Registry;
28
+ priority?: number;
29
+ }): <T extends ClassTypeWithArgument<z.output<Schema>>>(target: T, context?: ClassDecoratorContext) => T;
30
+ declare function Injectable<Type, Schema>(options: {
31
+ scope?: InjectableScope;
32
+ token: InjectionToken<Type, Schema>;
33
+ registry?: Registry;
34
+ priority?: number;
35
+ }): Schema extends BaseInjectionTokenSchemaType ? Type extends undefined ? <T extends ClassTypeWithArgument<z.output<Schema>>>(target: T, context?: ClassDecoratorContext) => T : <T extends ClassTypeWithInstanceAndArgument<Type, z.output<Schema>>>(target: T, context?: ClassDecoratorContext) => T : Schema extends OptionalInjectionTokenSchemaType ? Type extends undefined ? <T extends ClassTypeWithOptionalArgument<z.output<Schema>>>(target: T, context?: ClassDecoratorContext) => T : <T extends ClassTypeWithInstanceAndOptionalArgument<Type, z.output<Schema>>>(target: T, context?: ClassDecoratorContext) => T : Schema extends undefined ? <R extends ClassTypeWithInstance<Type>>(target: R, context?: ClassDecoratorContext) => R : never;
36
+ //#endregion
37
+ export { Injectable, InjectableOptions };
38
+ //# sourceMappingURL=injectable.decorator.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"injectable.decorator.d.mts","names":[],"sources":["../../../src/decorators/injectable.decorator.mts"],"sourcesContent":[],"mappings":";;;;;;UAqBiB,iBAAA;EAAA,KAAA,CAAA,EACP,eADwB;EACxB,KAAA,CAAA,EACA,cADA,CAAA,GAAA,EAAA,GAAA,CAAA;EACA,MAAA,CAAA,EACC,wBADD;EACC,QAAA,CAAA,EACE,QADF;EACE,QAAA,CAAA,EAAA,MAAA;;AAKG,iBAAA,UAAA,CAAA,CAAU,EAAA,CAAA,UAAe,yBAAf,CAAA,CAAA,MAAA,EAChB,CADgB,EAAA,OAAA,CAAA,EAEd,qBAFc,EAAA,GAGrB,CAHqB;AAAe,iBAIzB,UAAA,CAJyB,OAAA,EAAA;EAC/B,KAAA,CAAA,EAIA,eAJA;EACE,QAAA,EAIA,QAJA;EACP,QAAA,CAAA,EAAA,MAAA;CAAC,CAAA,EAAA,CAAA,UAKS,yBALT,CAAA,CAAA,MAAA,EAMI,CANJ,EAAA,OAAA,CAAA,EAOM,qBAPN,EAAA,GAQD,CARC;AACU,iBAQA,UAAA,CARU,OAAA,EAAA;EAChB,KAAA,EAQD,eARC;EACE,QAAA,CAAA,EAAA,MAAA;CAEG,CAAA,EAAA,CAAA,UAOA,yBAPA,CAAA,CAAA,MAAA,EAQL,CARK,EAAA,OAAA,CAAA,EASH,qBATG,EAAA,GAUV,CAVU;AACL,iBAWM,UAXN,CAAA,eAWgC,wBAXhC,CAAA,CAAA,OAAA,EAAA;EACE,KAAA,CAAA,EAWF,eAXE;EACP,MAAA,EAWK,MAXL;EAAC,QAAA,CAAA,EAYO,QAZP;EACU,QAAA,CAAA,EAAA,MAAU;CACjB,CAAA,EAAA,CAAA,UAYM,qBAZN,CAY4B,CAAA,CAAE,MAZ9B,CAYqC,MAZrC,CAAA,CAAA,CAAA,CAAA,MAAA,EAaC,CAbD,EAAA,OAAA,CAAA,EAcG,qBAdH,EAAA,GAeJ,CAfI;AAEM,iBAgBC,UAhBD,CAAA,IAAA,EAAA,MAAA,CAAA,CAAA,OAAA,EAAA;EACL,KAAA,CAAA,EAgBA,eAhBA;EACE,KAAA,EAgBH,cAhBG,CAgBY,IAhBZ,EAgBkB,MAhBlB,CAAA;EACP,QAAA,CAAA,EAgBQ,QAhBR;EAAC,QAAA,CAAA,EAAA,MAAA;AAEN,CAAA,CAAA,EAgBI,MAhBY,SAgBG,4BAhBO,GAiBtB,IAjBsB,SAAA,SAAA,GAAA,CAAA,UAkBT,qBAlBS,CAkBa,CAAA,CAAE,MAlBf,CAkBsB,MAlBtB,CAAA,CAAA,CAAA,CAAA,MAAA,EAmBV,CAnBU,EAAA,OAAA,CAAA,EAoBR,qBApBQ,EAAA,GAqBf,CArBe,GAAA,CAAA,UAsBT,gCAtBS,CAsBwB,IAtBxB,EAsB8B,CAAA,CAAE,MAtBhC,CAsBuC,MAtBvC,CAAA,CAAA,CAAA,CAAA,MAAA,EAuBV,CAvBU,EAAA,OAAA,CAAA,EAwBR,qBAxBQ,EAAA,GAyBf,CAzBe,GA0BtB,MA1BsB,SA0BP,gCA1BO,GA2BpB,IA3BoB,SAAA,SAAA,GAAA,CAAA,UA4BP,6BA5BO,CA4BuB,CAAA,CAAE,MA5BzB,CA4BgC,MA5BhC,CAAA,CAAA,CAAA,CAAA,MAAA,EA6BR,CA7BQ,EAAA,OAAA,CAAA,EA8BN,qBA9BM,EAAA,GA+Bb,CA/Ba,GAAA,CAAA,UAiCN,wCAjCM,CAkCd,IAlCc,EAmCd,CAAA,CAAE,MAnCY,CAmCL,MAnCK,CAAA,CAAA,CAAA,CAAA,MAAA,EAsCR,CAtCQ,EAAA,OAAA,CAAA,EAuCN,qBAvCM,EAAA,GAwCb,CAxCa,GAyCpB,MAzCoB,SAAA,SAAA,GAAA,CAAA,UA0CP,qBA1CO,CA0Ce,IA1Cf,CAAA,CAAA,CAAA,MAAA,EA2CR,CA3CQ,EAAA,OAAA,CAAA,EA4CN,qBA5CM,EAAA,GA6Cb,CA7Ca,GAAA,KAAA"}
@@ -0,0 +1,21 @@
1
+ import { InjectableScope } from "../enums/injectable-scope.enum.mjs";
2
+ import { InjectableType } from "../enums/injectable-type.enum.mjs";
3
+ import { InjectableTokenMeta } from "../symbols/injectable-token.mjs";
4
+ import { InjectionToken } from "../token/injection-token.mjs";
5
+ import { globalRegistry } from "../token/registry.mjs";
6
+
7
+ //#region src/decorators/injectable.decorator.mts
8
+ function Injectable({ scope = InjectableScope.Singleton, token, schema, registry = globalRegistry, priority = 0 } = {}) {
9
+ return (target, context) => {
10
+ if (context && context.kind !== "class" || target instanceof Function && !context) throw new Error("[DI] @Injectable decorator can only be used on classes.");
11
+ if (schema && token) throw new Error("[DI] @Injectable decorator cannot have both a token and a schema");
12
+ let injectableToken = token ?? InjectionToken.create(target, schema);
13
+ registry.set(injectableToken, scope, target, InjectableType.Class, priority);
14
+ target[InjectableTokenMeta] = injectableToken;
15
+ return target;
16
+ };
17
+ }
18
+
19
+ //#endregion
20
+ export { Injectable };
21
+ //# sourceMappingURL=injectable.decorator.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"injectable.decorator.mjs","names":["InjectableScope","InjectableType","InjectableTokenMeta","InjectionToken","globalRegistry","Injectable","scope","Singleton","token","schema","registry","priority","target","context","kind","Function","Error","injectableToken","create","set","Class"],"sources":["../../../src/decorators/injectable.decorator.mts"],"sourcesContent":["import type { z } from 'zod/v4'\n\nimport type {\n BaseInjectionTokenSchemaType,\n ClassType,\n ClassTypeWithArgument,\n ClassTypeWithInstance,\n ClassTypeWithInstanceAndArgument,\n ClassTypeWithInstanceAndOptionalArgument,\n ClassTypeWithOptionalArgument,\n ClassTypeWithoutArguments,\n InjectionTokenSchemaType,\n OptionalInjectionTokenSchemaType,\n} from '../token/injection-token.mjs'\nimport type { Registry } from '../token/registry.mjs'\n\nimport { InjectableScope, InjectableType } from '../enums/index.mjs'\nimport { InjectableTokenMeta } from '../symbols/index.mjs'\nimport { InjectionToken } from '../token/injection-token.mjs'\nimport { globalRegistry } from '../token/registry.mjs'\n\nexport interface InjectableOptions {\n scope?: InjectableScope\n token?: InjectionToken<any, any>\n schema?: InjectionTokenSchemaType\n registry?: Registry\n priority?: number\n}\n\n// #1 Simple constructorless class\nexport function Injectable(): <T extends ClassTypeWithoutArguments>(\n target: T,\n context?: ClassDecoratorContext,\n) => T\nexport function Injectable(options: {\n scope?: InjectableScope\n registry: Registry\n priority?: number\n}): <T extends ClassTypeWithoutArguments>(\n target: T,\n context?: ClassDecoratorContext,\n) => T\nexport function Injectable(options: {\n scope: InjectableScope\n priority?: number\n}): <T extends ClassTypeWithoutArguments>(\n target: T,\n context?: ClassDecoratorContext,\n) => T\n// #2 Class with schema\nexport function Injectable<Schema extends InjectionTokenSchemaType>(options: {\n scope?: InjectableScope\n schema: Schema\n registry?: Registry\n priority?: number\n}): <T extends ClassTypeWithArgument<z.output<Schema>>>(\n target: T,\n context?: ClassDecoratorContext,\n) => T\n\n// #3 Class with typeless token and schema\nexport function Injectable<Type, Schema>(options: {\n scope?: InjectableScope\n token: InjectionToken<Type, Schema>\n registry?: Registry\n priority?: number\n}): Schema extends BaseInjectionTokenSchemaType\n ? Type extends undefined\n ? <T extends ClassTypeWithArgument<z.output<Schema>>>(\n target: T,\n context?: ClassDecoratorContext,\n ) => T\n : <T extends ClassTypeWithInstanceAndArgument<Type, z.output<Schema>>>(\n target: T,\n context?: ClassDecoratorContext,\n ) => T\n : Schema extends OptionalInjectionTokenSchemaType\n ? Type extends undefined\n ? <T extends ClassTypeWithOptionalArgument<z.output<Schema>>>(\n target: T,\n context?: ClassDecoratorContext,\n ) => T\n : <\n T extends ClassTypeWithInstanceAndOptionalArgument<\n Type,\n z.output<Schema>\n >,\n >(\n target: T,\n context?: ClassDecoratorContext,\n ) => T\n : Schema extends undefined\n ? <R extends ClassTypeWithInstance<Type>>(\n target: R,\n context?: ClassDecoratorContext,\n ) => R\n : never\n\nexport function Injectable({\n scope = InjectableScope.Singleton,\n token,\n schema,\n registry = globalRegistry,\n priority = 0,\n}: InjectableOptions = {}) {\n return <T extends ClassType>(\n target: T,\n context?: ClassDecoratorContext,\n ): T => {\n if (\n (context && context.kind !== 'class') ||\n (target instanceof Function && !context)\n ) {\n throw new Error('[DI] @Injectable decorator can only be used on classes.')\n }\n if (schema && token) {\n throw new Error(\n '[DI] @Injectable decorator cannot have both a token and a schema',\n )\n }\n let injectableToken: InjectionToken<any, any> =\n token ?? InjectionToken.create(target, schema as InjectionTokenSchemaType)\n\n registry.set(injectableToken, scope, target, InjectableType.Class, priority)\n\n // @ts-expect-error\n target[InjectableTokenMeta] = injectableToken\n\n return target\n }\n}\n"],"mappings":";;;;;;;AAkGA,SAAgBK,WAAW,EACzBC,QAAQN,gBAAgBO,WACxBC,OACAC,QACAC,WAAWN,gBACXO,WAAW,MACU,EAAE,EAAA;AACvB,SACEC,QACAC,YAAAA;AAEA,MACE,WAAYA,QAAQC,SAAS,WAC5BF,kBAAkBG,YAAY,CAACF,QAEhC,OAAM,IAAIG,MAAM,0DAAA;AAElB,MAAIP,UAAUD,MACZ,OAAM,IAAIQ,MACR,mEAAA;EAGJ,IAAIC,kBACFT,SAASL,eAAee,OAAON,QAAQH,OAAAA;AAEzCC,WAASS,IAAIF,iBAAiBX,OAAOM,QAAQX,eAAemB,OAAOT,SAAAA;AAGnEC,SAAOV,uBAAuBe;AAE9B,SAAOL"}
@@ -0,0 +1,18 @@
1
+ //#region src/enums/injectable-scope.enum.d.mts
2
+ declare enum InjectableScope {
3
+ /**
4
+ * Singleton scope: The instance is created once and shared across the application.
5
+ */
6
+ Singleton = "Singleton",
7
+ /**
8
+ * Instance scope: A new instance is created for each injection.
9
+ */
10
+ Transient = "Transient",
11
+ /**
12
+ * Request scope: The instance is created once per request and shared within that request context.
13
+ */
14
+ Request = "Request",
15
+ }
16
+ //#endregion
17
+ export { InjectableScope };
18
+ //# sourceMappingURL=injectable-scope.enum.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"injectable-scope.enum.d.mts","names":[],"sources":["../../../src/enums/injectable-scope.enum.mts"],"sourcesContent":[],"mappings":";aAAY,eAAA;EAAA"}
@@ -0,0 +1,20 @@
1
+ //#region src/enums/injectable-scope.enum.mts
2
+ let InjectableScope = /* @__PURE__ */ function(InjectableScope$1) {
3
+ /**
4
+ * Singleton scope: The instance is created once and shared across the application.
5
+ */
6
+ InjectableScope$1["Singleton"] = "Singleton";
7
+ /**
8
+ * Instance scope: A new instance is created for each injection.
9
+ */
10
+ InjectableScope$1["Transient"] = "Transient";
11
+ /**
12
+ * Request scope: The instance is created once per request and shared within that request context.
13
+ */
14
+ InjectableScope$1["Request"] = "Request";
15
+ return InjectableScope$1;
16
+ }({});
17
+
18
+ //#endregion
19
+ export { InjectableScope };
20
+ //# sourceMappingURL=injectable-scope.enum.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"injectable-scope.enum.mjs","names":[],"sources":["../../../src/enums/injectable-scope.enum.mts"],"sourcesContent":["export enum InjectableScope {\n /**\n * Singleton scope: The instance is created once and shared across the application.\n */\n Singleton = 'Singleton',\n /**\n * Instance scope: A new instance is created for each injection.\n */\n Transient = 'Transient',\n /**\n * Request scope: The instance is created once per request and shared within that request context.\n */\n Request = 'Request',\n}\n\n"],"mappings":";AAAA,IAAY,8DAAL;;;;AAIL;;;;AAIA;;;;AAIA"}
@@ -0,0 +1,8 @@
1
+ //#region src/enums/injectable-type.enum.d.mts
2
+ declare enum InjectableType {
3
+ Class = "Class",
4
+ Factory = "Factory",
5
+ }
6
+ //#endregion
7
+ export { InjectableType };
8
+ //# sourceMappingURL=injectable-type.enum.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"injectable-type.enum.d.mts","names":[],"sources":["../../../src/enums/injectable-type.enum.mts"],"sourcesContent":[],"mappings":";aAAY,cAAA;EAAA,KAAA,GAAA,OAAA"}
@@ -0,0 +1,10 @@
1
+ //#region src/enums/injectable-type.enum.mts
2
+ let InjectableType = /* @__PURE__ */ function(InjectableType$1) {
3
+ InjectableType$1["Class"] = "Class";
4
+ InjectableType$1["Factory"] = "Factory";
5
+ return InjectableType$1;
6
+ }({});
7
+
8
+ //#endregion
9
+ export { InjectableType };
10
+ //# sourceMappingURL=injectable-type.enum.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"injectable-type.enum.mjs","names":[],"sources":["../../../src/enums/injectable-type.enum.mts"],"sourcesContent":["export enum InjectableType {\n Class = 'Class',\n Factory = 'Factory',\n}\n\n"],"mappings":";AAAA,IAAY,4DAAL;AACL;AACA"}
@@ -0,0 +1,43 @@
1
+ import { InjectionTokenSchemaType } from "../token/injection-token.mjs";
2
+ import { FactoryRecord } from "../token/registry.mjs";
3
+
4
+ //#region src/errors/di-error.d.mts
5
+ declare enum DIErrorCode {
6
+ FactoryNotFound = "FactoryNotFound",
7
+ FactoryTokenNotResolved = "FactoryTokenNotResolved",
8
+ InstanceNotFound = "InstanceNotFound",
9
+ InstanceDestroying = "InstanceDestroying",
10
+ CircularDependency = "CircularDependency",
11
+ TokenValidationError = "TokenValidationError",
12
+ TokenSchemaRequiredError = "TokenSchemaRequiredError",
13
+ ClassNotInjectable = "ClassNotInjectable",
14
+ ScopeMismatchError = "ScopeMismatchError",
15
+ PriorityConflictError = "PriorityConflictError",
16
+ StorageError = "StorageError",
17
+ InitializationError = "InitializationError",
18
+ DependencyResolutionError = "DependencyResolutionError",
19
+ UnknownError = "UnknownError",
20
+ }
21
+ declare class DIError extends Error {
22
+ readonly code: DIErrorCode;
23
+ readonly message: string;
24
+ readonly context?: Record<string, unknown>;
25
+ constructor(code: DIErrorCode, message: string, context?: Record<string, unknown>);
26
+ static factoryNotFound(name: string): DIError;
27
+ static factoryTokenNotResolved(token: string | symbol | unknown): DIError;
28
+ static instanceNotFound(name: string): DIError;
29
+ static instanceDestroying(name: string): DIError;
30
+ static unknown(message: string | Error, context?: Record<string, unknown>): DIError;
31
+ static circularDependency(cycle: string[]): DIError;
32
+ static tokenValidationError(message: string, schema: InjectionTokenSchemaType | undefined, value: unknown): DIError;
33
+ static tokenSchemaRequiredError(token: string | symbol | unknown): DIError;
34
+ static classNotInjectable(className: string): DIError;
35
+ static scopeMismatchError(token: string | symbol | unknown, expectedScope: string, actualScope: string): DIError;
36
+ static priorityConflictError(token: string | symbol | unknown, records: FactoryRecord[]): DIError;
37
+ static storageError(message: string, operation: string, instanceName?: string): DIError;
38
+ static initializationError(serviceName: string, error: Error | string): DIError;
39
+ static dependencyResolutionError(serviceName: string, dependencyName: string, error: Error | string): DIError;
40
+ }
41
+ //#endregion
42
+ export { DIError, DIErrorCode };
43
+ //# sourceMappingURL=di-error.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"di-error.d.mts","names":[],"sources":["../../../src/errors/di-error.mts"],"sourcesContent":[],"mappings":";;;;aAGY,WAAA;;EAAA,uBAAW,GAAA,yBAAA;EAiBV,gBAAQ,GAAA,kBAAA;EAIK,kBAAA,GAAA,oBAAA;EAHE,kBAAA,GAAA,oBAAA;EAGF,oBAAA,GAAA,sBAAA;EAEZ,wBAAA,GAAA,0BAAA;EAQ0B,kBAAA,GAAA,oBAAA;EAQ4B,kBAAA,GAAA,oBAAA;EAQ3B,qBAAA,GAAA,uBAAA;EAQE,YAAA,GAAA,cAAA;EASrB,mBAAA,GAAA,qBAAA;EACR,yBAAA,GAAA,2BAAA;EACT,YAAA,GAAA,cAAA;;AAqBO,cAtEC,OAAA,SAAgB,KAAA,CAsEjB;EAEP,SAAA,IAAA,EApEqB,WAoErB;EAOgE,SAAA,OAAA,EAAA,MAAA;EAQrB,SAAA,OAAA,CAAA,EAtFpB,MAsFoB,CAAA,MAAA,EAAA,OAAA,CAAA;EAY3C,WAAA,CAAA,IAAA,EA/FqB,WA+FrB,EAAA,OAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EA7FS,MA6FT,CAAA,MAAA,EAAA,OAAA,CAAA;EAUQ,OAAA,eAAA,CAAA,IAAA,EAAA,MAAA,CAAA,EA/F2B,OA+F3B;EACR,OAAA,uBAAA,CAAA,KAAA,EAAA,MAAA,GAAA,MAAA,GAAA,OAAA,CAAA,EAxF+D,OAwF/D;EAYA,OAAA,gBAAA,CAAA,IAAA,EAAA,MAAA,CAAA,EA5FoC,OA4FpC;EASM,OAAA,kBAAA,CAAA,IAAA,EAAA,MAAA,CAAA,EA7FgC,OA6FhC;EACN,OAAA,OAAA,CAAA,OAAA,EAAA,MAAA,GArFiB,KAqFjB,EAAA,OAAA,CAAA,EApFS,MAoFT,CAAA,MAAA,EAAA,OAAA,CAAA,CAAA,EAnFA,OAmFA;EAWM,OAAA,kBAAA,CAAA,KAAA,EAAA,MAAA,EAAA,CAAA,EApFmC,OAoFnC;EACN,OAAA,oBAAA,CAAA,OAAA,EAAA,MAAA,EAAA,MAAA,EA1EO,wBA0EP,GAAA,SAAA,EAAA,KAAA,EAAA,OAAA,CAAA,EAxEA,OAwEA;EAhJwB,OAAA,wBAAA,CAAA,KAAA,EAAA,MAAA,GAAA,MAAA,GAAA,OAAA,CAAA,EA+EwC,OA/ExC;EAAK,OAAA,kBAAA,CAAA,SAAA,EAAA,MAAA,CAAA,EAuFc,OAvFd;2GAmG7B;0EAUQ,kBACR;kFAYA;yDASM,iBACN;uFAWM,iBACN"}
@@ -0,0 +1,98 @@
1
+ //#region src/errors/di-error.mts
2
+ var DIErrorCode = /* @__PURE__ */ function(DIErrorCode$1) {
3
+ DIErrorCode$1["FactoryNotFound"] = "FactoryNotFound";
4
+ DIErrorCode$1["FactoryTokenNotResolved"] = "FactoryTokenNotResolved";
5
+ DIErrorCode$1["InstanceNotFound"] = "InstanceNotFound";
6
+ DIErrorCode$1["InstanceDestroying"] = "InstanceDestroying";
7
+ DIErrorCode$1["CircularDependency"] = "CircularDependency";
8
+ DIErrorCode$1["TokenValidationError"] = "TokenValidationError";
9
+ DIErrorCode$1["TokenSchemaRequiredError"] = "TokenSchemaRequiredError";
10
+ DIErrorCode$1["ClassNotInjectable"] = "ClassNotInjectable";
11
+ DIErrorCode$1["ScopeMismatchError"] = "ScopeMismatchError";
12
+ DIErrorCode$1["PriorityConflictError"] = "PriorityConflictError";
13
+ DIErrorCode$1["StorageError"] = "StorageError";
14
+ DIErrorCode$1["InitializationError"] = "InitializationError";
15
+ DIErrorCode$1["DependencyResolutionError"] = "DependencyResolutionError";
16
+ DIErrorCode$1["UnknownError"] = "UnknownError";
17
+ return DIErrorCode$1;
18
+ }({});
19
+ var DIError = class DIError extends Error {
20
+ code;
21
+ message;
22
+ context;
23
+ constructor(code, message, context) {
24
+ super(message), this.code = code, this.message = message;
25
+ this.context = context;
26
+ this.name = "DIError";
27
+ }
28
+ static factoryNotFound(name) {
29
+ return new DIError("FactoryNotFound", `Factory ${name} not found`, { name });
30
+ }
31
+ static factoryTokenNotResolved(token) {
32
+ return new DIError("FactoryTokenNotResolved", `Factory token not resolved: ${token?.toString() ?? "unknown"}`, { token });
33
+ }
34
+ static instanceNotFound(name) {
35
+ return new DIError("InstanceNotFound", `Instance ${name} not found`, { name });
36
+ }
37
+ static instanceDestroying(name) {
38
+ return new DIError("InstanceDestroying", `Instance ${name} destroying`, { name });
39
+ }
40
+ static unknown(message, context) {
41
+ if (message instanceof Error) return new DIError("UnknownError", message.message, {
42
+ ...context,
43
+ parent: message
44
+ });
45
+ return new DIError("UnknownError", message, context);
46
+ }
47
+ static circularDependency(cycle) {
48
+ return new DIError("CircularDependency", `Circular dependency detected: ${cycle.join(" -> ")}`, { cycle });
49
+ }
50
+ static tokenValidationError(message, schema, value) {
51
+ return new DIError("TokenValidationError", message, {
52
+ schema,
53
+ value
54
+ });
55
+ }
56
+ static tokenSchemaRequiredError(token) {
57
+ return new DIError("TokenSchemaRequiredError", `Token ${token?.toString() ?? "unknown"} requires schema arguments and cannot be used with addInstance. Use BoundInjectionToken or provide arguments when resolving.`, { token });
58
+ }
59
+ static classNotInjectable(className) {
60
+ return new DIError("ClassNotInjectable", `Class ${className} is not decorated with @Injectable.`, { className });
61
+ }
62
+ static scopeMismatchError(token, expectedScope, actualScope) {
63
+ return new DIError("ScopeMismatchError", `Scope mismatch for ${token?.toString() ?? "unknown"}: expected ${expectedScope}, got ${actualScope}`, {
64
+ token,
65
+ expectedScope,
66
+ actualScope
67
+ });
68
+ }
69
+ static priorityConflictError(token, records) {
70
+ return new DIError("PriorityConflictError", `Priority conflict for ${token?.toString() ?? "unknown"}: multiple bindings with same priority`, {
71
+ token,
72
+ records
73
+ });
74
+ }
75
+ static storageError(message, operation, instanceName) {
76
+ return new DIError("StorageError", `Storage error: ${message}`, {
77
+ operation,
78
+ instanceName
79
+ });
80
+ }
81
+ static initializationError(serviceName, error) {
82
+ return new DIError("InitializationError", `Service ${serviceName} initialization failed: ${error instanceof Error ? error.message : error}`, {
83
+ serviceName,
84
+ error
85
+ });
86
+ }
87
+ static dependencyResolutionError(serviceName, dependencyName, error) {
88
+ return new DIError("DependencyResolutionError", `Failed to resolve dependency ${dependencyName} for service ${serviceName}: ${error instanceof Error ? error.message : error}`, {
89
+ serviceName,
90
+ dependencyName,
91
+ error
92
+ });
93
+ }
94
+ };
95
+
96
+ //#endregion
97
+ export { DIError, DIErrorCode };
98
+ //# sourceMappingURL=di-error.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"di-error.mjs","names":["DIErrorCode","DIError","Error","context","code","message","name","factoryNotFound","factoryTokenNotResolved","token","toString","instanceNotFound","instanceDestroying","unknown","parent","circularDependency","cycle","cycleStr","join","tokenValidationError","schema","value","tokenSchemaRequiredError","classNotInjectable","className","scopeMismatchError","expectedScope","actualScope","priorityConflictError","records","storageError","operation","instanceName","initializationError","serviceName","error","dependencyResolutionError","dependencyName"],"sources":["../../../src/errors/di-error.mts"],"sourcesContent":["import type { InjectionTokenSchemaType } from '../token/injection-token.mjs'\nimport type { FactoryRecord } from '../token/registry.mjs'\n\nexport enum DIErrorCode {\n FactoryNotFound = 'FactoryNotFound',\n FactoryTokenNotResolved = 'FactoryTokenNotResolved',\n InstanceNotFound = 'InstanceNotFound',\n InstanceDestroying = 'InstanceDestroying',\n CircularDependency = 'CircularDependency',\n TokenValidationError = 'TokenValidationError',\n TokenSchemaRequiredError = 'TokenSchemaRequiredError',\n ClassNotInjectable = 'ClassNotInjectable',\n ScopeMismatchError = 'ScopeMismatchError',\n PriorityConflictError = 'PriorityConflictError',\n StorageError = 'StorageError',\n InitializationError = 'InitializationError',\n DependencyResolutionError = 'DependencyResolutionError',\n UnknownError = 'UnknownError',\n}\n\nexport class DIError extends Error {\n public readonly context?: Record<string, unknown>\n\n constructor(\n public readonly code: DIErrorCode,\n public readonly message: string,\n context?: Record<string, unknown>,\n ) {\n super(message)\n this.context = context\n this.name = 'DIError'\n }\n\n // Static factory methods for common error types\n static factoryNotFound(name: string): DIError {\n return new DIError(\n DIErrorCode.FactoryNotFound,\n `Factory ${name} not found`,\n { name },\n )\n }\n\n static factoryTokenNotResolved(token: string | symbol | unknown): DIError {\n return new DIError(\n DIErrorCode.FactoryTokenNotResolved,\n `Factory token not resolved: ${token?.toString() ?? 'unknown'}`,\n { token },\n )\n }\n\n static instanceNotFound(name: string): DIError {\n return new DIError(\n DIErrorCode.InstanceNotFound,\n `Instance ${name} not found`,\n { name },\n )\n }\n\n static instanceDestroying(name: string): DIError {\n return new DIError(\n DIErrorCode.InstanceDestroying,\n `Instance ${name} destroying`,\n { name },\n )\n }\n\n static unknown(\n message: string | Error,\n context?: Record<string, unknown>,\n ): DIError {\n if (message instanceof Error) {\n return new DIError(DIErrorCode.UnknownError, message.message, {\n ...context,\n parent: message,\n })\n }\n return new DIError(DIErrorCode.UnknownError, message, context)\n }\n\n static circularDependency(cycle: string[]): DIError {\n const cycleStr = cycle.join(' -> ')\n return new DIError(\n DIErrorCode.CircularDependency,\n `Circular dependency detected: ${cycleStr}`,\n { cycle },\n )\n }\n\n static tokenValidationError(\n message: string,\n schema: InjectionTokenSchemaType | undefined,\n value: unknown,\n ): DIError {\n return new DIError(DIErrorCode.TokenValidationError, message, {\n schema,\n value,\n })\n }\n\n static tokenSchemaRequiredError(token: string | symbol | unknown): DIError {\n return new DIError(\n DIErrorCode.TokenSchemaRequiredError,\n `Token ${token?.toString() ?? 'unknown'} requires schema arguments and cannot be used with addInstance. Use BoundInjectionToken or provide arguments when resolving.`,\n { token },\n )\n }\n\n static classNotInjectable(className: string): DIError {\n return new DIError(\n DIErrorCode.ClassNotInjectable,\n `Class ${className} is not decorated with @Injectable.`,\n { className },\n )\n }\n\n static scopeMismatchError(\n token: string | symbol | unknown,\n expectedScope: string,\n actualScope: string,\n ): DIError {\n return new DIError(\n DIErrorCode.ScopeMismatchError,\n `Scope mismatch for ${token?.toString() ?? 'unknown'}: expected ${expectedScope}, got ${actualScope}`,\n { token, expectedScope, actualScope },\n )\n }\n\n static priorityConflictError(\n token: string | symbol | unknown,\n records: FactoryRecord[],\n ): DIError {\n return new DIError(\n DIErrorCode.PriorityConflictError,\n `Priority conflict for ${token?.toString() ?? 'unknown'}: multiple bindings with same priority`,\n { token, records },\n )\n }\n\n static storageError(\n message: string,\n operation: string,\n instanceName?: string,\n ): DIError {\n return new DIError(DIErrorCode.StorageError, `Storage error: ${message}`, {\n operation,\n instanceName,\n })\n }\n\n static initializationError(\n serviceName: string,\n error: Error | string,\n ): DIError {\n return new DIError(\n DIErrorCode.InitializationError,\n `Service ${serviceName} initialization failed: ${error instanceof Error ? error.message : error}`,\n { serviceName, error },\n )\n }\n\n static dependencyResolutionError(\n serviceName: string,\n dependencyName: string,\n error: Error | string,\n ): DIError {\n return new DIError(\n DIErrorCode.DependencyResolutionError,\n `Failed to resolve dependency ${dependencyName} for service ${serviceName}: ${error instanceof Error ? error.message : error}`,\n { serviceName, dependencyName, error },\n )\n }\n}\n"],"mappings":";AAGA,IAAO,cAAKA,yBAAAA,eAAAA;;;;;;;;;;;;;;;QAAAA;;AAiBZ,IAAaC,UAAb,MAAaA,gBAAgBC,MAAAA;;;CACXC;CAEhB,YACE,MACA,SACAA,SACA;AACA,QAAME,QAAAA,EAAAA,KAJUD,OAAAA,MAAAA,KACAC,UAAAA;AAIhB,OAAKF,UAAUA;AACf,OAAKG,OAAO;;CAId,OAAOC,gBAAgBD,MAAuB;AAC5C,SAAO,IAAIL,QAAAA,mBAET,WAAWK,KAAK,aAChB,EAAEA,MAAK,CAAA;;CAIX,OAAOE,wBAAwBC,OAA2C;AACxE,SAAO,IAAIR,QAAAA,2BAET,+BAA+BQ,OAAOC,UAAAA,IAAc,aACpD,EAAED,OAAM,CAAA;;CAIZ,OAAOE,iBAAiBL,MAAuB;AAC7C,SAAO,IAAIL,QAAAA,oBAET,YAAYK,KAAK,aACjB,EAAEA,MAAK,CAAA;;CAIX,OAAOM,mBAAmBN,MAAuB;AAC/C,SAAO,IAAIL,QAAAA,sBAET,YAAYK,KAAK,cACjB,EAAEA,MAAK,CAAA;;CAIX,OAAOO,QACLR,SACAF,SACS;AACT,MAAIE,mBAAmBH,MACrB,QAAO,IAAID,QAAAA,gBAAkCI,QAAQA,SAAS;GAC5D,GAAGF;GACHW,QAAQT;GACV,CAAA;AAEF,SAAO,IAAIJ,QAAAA,gBAAkCI,SAASF,QAAAA;;CAGxD,OAAOY,mBAAmBC,OAA0B;AAElD,SAAO,IAAIf,QAAAA,sBAET,iCAHee,MAAME,KAAK,OAAA,IAI1B,EAAEF,OAAM,CAAA;;CAIZ,OAAOG,qBACLd,SACAe,QACAC,OACS;AACT,SAAO,IAAIpB,QAAAA,wBAA0CI,SAAS;GAC5De;GACAC;GACF,CAAA;;CAGF,OAAOC,yBAAyBb,OAA2C;AACzE,SAAO,IAAIR,QAAAA,4BAET,SAASQ,OAAOC,UAAAA,IAAc,UAAU,+HACxC,EAAED,OAAM,CAAA;;CAIZ,OAAOc,mBAAmBC,WAA4B;AACpD,SAAO,IAAIvB,QAAAA,sBAET,SAASuB,UAAU,sCACnB,EAAEA,WAAU,CAAA;;CAIhB,OAAOC,mBACLhB,OACAiB,eACAC,aACS;AACT,SAAO,IAAI1B,QAAAA,sBAET,sBAAsBQ,OAAOC,UAAAA,IAAc,UAAU,aAAagB,cAAc,QAAQC,eACxF;GAAElB;GAAOiB;GAAeC;GAAY,CAAA;;CAIxC,OAAOC,sBACLnB,OACAoB,SACS;AACT,SAAO,IAAI5B,QAAAA,yBAET,yBAAyBQ,OAAOC,UAAAA,IAAc,UAAU,yCACxD;GAAED;GAAOoB;GAAQ,CAAA;;CAIrB,OAAOC,aACLzB,SACA0B,WACAC,cACS;AACT,SAAO,IAAI/B,QAAAA,gBAAkC,kBAAkBI,WAAW;GACxE0B;GACAC;GACF,CAAA;;CAGF,OAAOC,oBACLC,aACAC,OACS;AACT,SAAO,IAAIlC,QAAAA,uBAET,WAAWiC,YAAY,0BAA0BC,iBAAiBjC,QAAQiC,MAAM9B,UAAU8B,SAC1F;GAAED;GAAaC;GAAM,CAAA;;CAIzB,OAAOC,0BACLF,aACAG,gBACAF,OACS;AACT,SAAO,IAAIlC,QAAAA,6BAET,gCAAgCoC,eAAe,eAAeH,YAAY,IAAIC,iBAAiBjC,QAAQiC,MAAM9B,UAAU8B,SACvH;GAAED;GAAaG;GAAgBF;GAAM,CAAA"}
@@ -0,0 +1,16 @@
1
+ //#region src/event-emitter.d.mts
2
+ type EventsConfig = {
3
+ [event: string]: any[];
4
+ };
5
+ type EventsNames<Events extends EventsConfig> = Exclude<keyof Events, symbol | number>;
6
+ type EventsArgs<Events extends EventsConfig, Name extends EventsNames<Events>> = Events[Name] extends any[] ? Events[Name] : [];
7
+ declare class EventEmitter<Events extends EventsConfig = {}> {
8
+ private listeners;
9
+ on<E extends EventsNames<Events>, Args extends EventsArgs<Events, E>>(event: E, listener: (...args: Args) => void | Promise<void>): () => void;
10
+ off<E extends EventsNames<Events>, Args extends EventsArgs<Events, E>>(event: E, listener: (...args: Args) => void | Promise<void>): void;
11
+ once<E extends EventsNames<Events>, Args extends EventsArgs<Events, E>>(event: E, listener: (...args: Args) => void | Promise<void>): () => void;
12
+ emit<E extends EventsNames<Events>, Args extends EventsArgs<Events, E>>(event: E, ...args: Args): Promise<any>;
13
+ }
14
+ //#endregion
15
+ export { EventEmitter, EventsArgs, EventsConfig, EventsNames };
16
+ //# sourceMappingURL=event-emitter.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-emitter.d.mts","names":[],"sources":["../../src/event-emitter.mts"],"sourcesContent":[],"mappings":";KAQY,YAAA;EAAA,CAAA,KAAA,EAAA,MAAA,CAAY,EAAA,GAAA,EAAA;AAGxB,CAAA;AAAuC,KAA3B,WAA2B,CAAA,eAAA,YAAA,CAAA,GAAgB,OAAhB,CAAA,MAC/B,MAD+B,EAAA,MAAA,GAAA,MAAA,CAAA;AAC/B,KAGI,UAHJ,CAAA,eAIS,YAJT,EAAA,aAKO,WALP,CAKmB,MALnB,CAAA,CAAA,GAMJ,MANI,CAMG,IANH,CAAA,SAAA,GAAA,EAAA,GAMyB,MANzB,CAMgC,IANhC,CAAA,GAAA,EAAA;AAD+C,cAU1C,YAV0C,CAAA,eAUd,YAVc,GAAA,CAAA,CAAA,CAAA,CAAA;EAAO,QAAA,SAAA;EAIlD,EAAA,CAAA,UASG,WATO,CASK,MATL,CAAA,EAAA,aAS2B,UAT3B,CASsC,MATtC,EAS8C,CAT9C,CAAA,CAAA,CAAA,KAAA,EAUX,CAVW,EAAA,QAAA,EAAA,CAAA,GAAA,IAAA,EAWE,IAXF,EAAA,GAAA,IAAA,GAWkB,OAXlB,CAAA,IAAA,CAAA,CAAA,EAAA,GAAA,GAAA,IAAA;EACL,GAAA,CAAA,UAuBD,WAvBC,CAuBW,MAvBX,CAAA,EAAA,aAuBiC,UAvBjC,CAuB4C,MAvB5C,EAuBoD,CAvBpD,CAAA,CAAA,CAAA,KAAA,EAwBN,CAxBM,EAAA,QAAA,EAAA,CAAA,GAAA,IAAA,EAyBO,IAzBP,EAAA,GAAA,IAAA,GAyBuB,OAzBvB,CAAA,IAAA,CAAA,CAAA,EAAA,IAAA;EACU,IAAA,CAAA,UAoCV,WApCU,CAoCE,MApCF,CAAA,EAAA,aAoCwB,UApCxB,CAoCmC,MApCnC,EAoC2C,CApC3C,CAAA,CAAA,CAAA,KAAA,EAqChB,CArCgB,EAAA,QAAA,EAAA,CAAA,GAAA,IAAA,EAsCH,IAtCG,EAAA,GAAA,IAAA,GAsCa,OAtCb,CAAA,IAAA,CAAA,CAAA,EAAA,GAAA,GAAA,IAAA;EAAZ,IAAA,CAAA,UAiDQ,WAjDR,CAiDoB,MAjDpB,CAAA,EAAA,aAiD0C,UAjD1C,CAiDqD,MAjDrD,EAiD6D,CAjD7D,CAAA,CAAA,CAAA,KAAA,EAkDJ,CAlDI,EAAA,GAAA,IAAA,EAmDF,IAnDE,CAAA,EAoDV,OApDU,CAAA,GAAA,CAAA"}