@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 @@
1
+ {"version":3,"file":"get-injectable-token.d.mts","names":[],"sources":["../../../src/utils/get-injectable-token.mts"],"sourcesContent":[],"mappings":";;;iBAKgB,8BACN,YACP;;AAFH,CAAA,GAGI,cAHY,CAGG,CAHH,CAAA,GAIZ,cAJ8B,CAIf,CAJe,CAAA"}
@@ -0,0 +1,13 @@
1
+ import { InjectableTokenMeta } from "../symbols/injectable-token.mjs";
2
+ import { DIError } from "../errors/di-error.mjs";
3
+
4
+ //#region src/utils/get-injectable-token.mts
5
+ function getInjectableToken(target) {
6
+ const token = target[InjectableTokenMeta];
7
+ if (!token) throw DIError.classNotInjectable(target.name);
8
+ return token;
9
+ }
10
+
11
+ //#endregion
12
+ export { getInjectableToken };
13
+ //# sourceMappingURL=get-injectable-token.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-injectable-token.mjs","names":["DIError","InjectableTokenMeta","getInjectableToken","target","token","classNotInjectable","name"],"sources":["../../../src/utils/get-injectable-token.mts"],"sourcesContent":["import type { ClassType, InjectionToken } from '../token/injection-token.mjs'\n\nimport { DIError } from '../errors/di-error.mjs'\nimport { InjectableTokenMeta } from '../symbols/index.mjs'\n\nexport function getInjectableToken<R>(\n target: ClassType,\n): R extends { create(...args: any[]): infer V }\n ? InjectionToken<V>\n : InjectionToken<R> {\n // @ts-expect-error We inject the token into the class itself\n const token = target[InjectableTokenMeta] as InjectionToken<any, any>\n if (!token) {\n throw DIError.classNotInjectable(target.name)\n }\n // @ts-expect-error We detect factory or class\n return token\n}\n"],"mappings":";;;;AAKA,SAAgBE,mBACdC,QAAiB;CAKjB,MAAMC,QAAQD,OAAOF;AACrB,KAAI,CAACG,MACH,OAAMJ,QAAQK,mBAAmBF,OAAOG,KAAI;AAG9C,QAAOF"}
@@ -0,0 +1,55 @@
1
+ import { BoundInjectionToken, ClassType, ClassTypeWithArgument, ClassTypeWithoutArguments, FactoryInjectionToken, InjectionToken, InjectionTokenSchemaType } from "../token/injection-token.mjs";
2
+ import { InjectState, Join, UnionToArray } from "./types.mjs";
3
+ import { ServiceInitializationContext } from "../internal/context/service-initialization-context.mjs";
4
+ import { Factorable, FactorableWithArgs } from "../interfaces/factory.interface.mjs";
5
+ import { ZodType, z } from "zod/v4";
6
+
7
+ //#region src/utils/get-injectors.d.mts
8
+ interface Injectors {
9
+ asyncInject<T extends ClassTypeWithoutArguments>(token: T): InstanceType<T> extends Factorable<infer R> ? Promise<R> : Promise<InstanceType<T>>;
10
+ asyncInject<Args, T extends ClassTypeWithArgument<Args>>(token: T, args: Args): Promise<InstanceType<T>>;
11
+ asyncInject<Schema extends InjectionTokenSchemaType, R, T extends FactorableWithArgs<R, Schema>>(token: T, args: z.input<Schema>): Promise<R>;
12
+ asyncInject<T, S extends InjectionTokenSchemaType>(token: InjectionToken<T, S>, args: z.input<S>): Promise<T>;
13
+ asyncInject<T, S extends InjectionTokenSchemaType, R extends boolean>(token: InjectionToken<T, S, R>): R extends false ? Promise<T> : S extends ZodType<infer Type> ? `Error: Your token requires args: ${Join<UnionToArray<keyof Type>, ', '>}` : 'Error: Your token requires args';
14
+ asyncInject<T>(token: InjectionToken<T, undefined>): Promise<T>;
15
+ asyncInject<T>(token: BoundInjectionToken<T, any>): Promise<T>;
16
+ asyncInject<T>(token: FactoryInjectionToken<T, any>): Promise<T>;
17
+ inject<T extends ClassTypeWithoutArguments>(token: T): InstanceType<T> extends Factorable<infer R> ? R : InstanceType<T>;
18
+ inject<Args, T extends ClassTypeWithArgument<Args>>(token: T, args: Args): InstanceType<T>;
19
+ inject<Schema extends InjectionTokenSchemaType, R, T extends FactorableWithArgs<R, Schema>>(token: T, args: z.input<Schema>): R;
20
+ inject<T, S extends InjectionTokenSchemaType>(token: InjectionToken<T, S>, args: z.input<S>): T;
21
+ inject<T, S extends InjectionTokenSchemaType, R extends boolean>(token: InjectionToken<T, S, R>): R extends false ? T : S extends ZodType<infer Type> ? `Error: Your token requires args: ${Join<UnionToArray<keyof Type>, ', '>}` : 'Error: Your token requires args';
22
+ inject<T>(token: InjectionToken<T, undefined>): T;
23
+ inject<T>(token: BoundInjectionToken<T, any>): T;
24
+ inject<T>(token: FactoryInjectionToken<T, any>): T;
25
+ /**
26
+ * Optional injection that returns null if the service fails to initialize
27
+ * or is not available. This is useful when you want to inject a service
28
+ * that may not be configured or may fail gracefully.
29
+ *
30
+ * @example
31
+ * ```ts
32
+ * class MyService {
33
+ * constructor() {
34
+ * const optionalService = optional(OptionalServiceToken)
35
+ * // optionalService will be null if initialization fails
36
+ * if (optionalService) {
37
+ * optionalService.doSomething()
38
+ * }
39
+ * }
40
+ * }
41
+ * ```
42
+ */
43
+ optional<T extends ClassType>(token: T): (InstanceType<T> extends Factorable<infer R> ? R : InstanceType<T>) | null;
44
+ optional<T, S extends InjectionTokenSchemaType>(token: InjectionToken<T, S>, args: z.input<S>): T | null;
45
+ optional<T, S extends InjectionTokenSchemaType, R extends boolean>(token: InjectionToken<T, S, R>): R extends false ? T | null : S extends ZodType<infer Type> ? `Error: Your token requires args: ${Join<UnionToArray<keyof Type>, ', '>}` : 'Error: Your token requires args';
46
+ optional<T>(token: InjectionToken<T, undefined>): T | null;
47
+ optional<T>(token: BoundInjectionToken<T, any>): T | null;
48
+ optional<T>(token: FactoryInjectionToken<T, any>): T | null;
49
+ wrapSyncInit(cb: () => any): (injectState?: InjectState) => [any, Promise<any>[], InjectState];
50
+ provideFactoryContext(context: ServiceInitializationContext | null): ServiceInitializationContext | null;
51
+ }
52
+ declare function getInjectors(): Injectors;
53
+ //#endregion
54
+ export { Injectors, getInjectors };
55
+ //# sourceMappingURL=get-injectors.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-injectors.d.mts","names":[],"sources":["../../../src/utils/get-injectors.mts"],"sourcesContent":[],"mappings":"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"}
@@ -0,0 +1,121 @@
1
+ import { InjectableTokenMeta } from "../symbols/injectable-token.mjs";
2
+ import { withoutResolutionContext } from "../internal/context/resolution-context.mjs";
3
+
4
+ //#region src/utils/get-injectors.mts
5
+ function getInjectors() {
6
+ let currentFactoryContext = null;
7
+ function provideFactoryContext(context) {
8
+ const original = currentFactoryContext;
9
+ currentFactoryContext = context;
10
+ return original;
11
+ }
12
+ function getFactoryContext() {
13
+ if (!currentFactoryContext) throw new Error("[Injector] Trying to access injection context outside of a injectable context");
14
+ return currentFactoryContext;
15
+ }
16
+ let promiseCollector = null;
17
+ let injectState = null;
18
+ function getRequest(token, args, skipCycleTracking = false) {
19
+ if (!injectState) throw new Error("[Injector] Trying to make a request outside of a injectable context");
20
+ if (injectState.isFrozen) {
21
+ const idx = injectState.currentIndex++;
22
+ const request$1 = injectState.requests[idx];
23
+ if (request$1.token !== token) throw new Error(`[Injector] Wrong token order. Expected ${request$1.token.toString()} but got ${token.toString()}`);
24
+ return request$1;
25
+ }
26
+ let result = null;
27
+ let error = null;
28
+ const doInject = () => getFactoryContext().inject(token, args).then((r) => {
29
+ result = r;
30
+ return r;
31
+ }).catch((e) => {
32
+ error = e;
33
+ });
34
+ const request = {
35
+ token,
36
+ promise: skipCycleTracking ? withoutResolutionContext(doInject) : doInject(),
37
+ get result() {
38
+ return result;
39
+ },
40
+ get error() {
41
+ return error;
42
+ }
43
+ };
44
+ injectState.requests.push(request);
45
+ injectState.currentIndex++;
46
+ return request;
47
+ }
48
+ function asyncInject(token, args) {
49
+ if (!injectState) throw new Error("[Injector] Trying to access inject outside of a injectable context");
50
+ const request = getRequest(token[InjectableTokenMeta] ?? token, args, true);
51
+ return request.promise.then((result) => {
52
+ if (request.error) throw request.error;
53
+ return result;
54
+ });
55
+ }
56
+ function wrapSyncInit(cb) {
57
+ return (previousState) => {
58
+ const promises = [];
59
+ const originalPromiseCollector = promiseCollector;
60
+ const originalInjectState = injectState;
61
+ injectState = previousState ? {
62
+ ...previousState,
63
+ currentIndex: 0
64
+ } : {
65
+ currentIndex: 0,
66
+ isFrozen: false,
67
+ requests: []
68
+ };
69
+ promiseCollector = (promise) => {
70
+ promises.push(promise);
71
+ };
72
+ const result = cb();
73
+ promiseCollector = originalPromiseCollector;
74
+ const newInjectState = {
75
+ ...injectState,
76
+ isFrozen: true
77
+ };
78
+ injectState = originalInjectState;
79
+ return [
80
+ result,
81
+ promises,
82
+ newInjectState
83
+ ];
84
+ };
85
+ }
86
+ function inject(token, args) {
87
+ const realToken = token[InjectableTokenMeta] ?? token;
88
+ if (!injectState) throw new Error("[Injector] Trying to access inject outside of a injectable context");
89
+ const ctx = getFactoryContext();
90
+ const instance = ctx.container.tryGetSync(realToken, args);
91
+ if (!instance) {
92
+ const request = getRequest(realToken, args);
93
+ if (request.error) throw request.error;
94
+ else if (request.result) return request.result;
95
+ if (promiseCollector) promiseCollector(request.promise);
96
+ return new Proxy({}, { get() {
97
+ throw new Error(`[Injector] Trying to access ${realToken.toString()} before it's initialized, please move the code to a onServiceInit method`);
98
+ } });
99
+ }
100
+ ctx.inject(realToken, args).catch(() => {});
101
+ return instance;
102
+ }
103
+ function optional(token, args) {
104
+ try {
105
+ return inject(token, args);
106
+ } catch {
107
+ return null;
108
+ }
109
+ }
110
+ return {
111
+ asyncInject,
112
+ inject,
113
+ optional,
114
+ wrapSyncInit,
115
+ provideFactoryContext
116
+ };
117
+ }
118
+
119
+ //#endregion
120
+ export { getInjectors };
121
+ //# sourceMappingURL=get-injectors.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-injectors.mjs","names":["withoutResolutionContext","InjectableTokenMeta","getInjectors","currentFactoryContext","provideFactoryContext","context","original","getFactoryContext","Error","promiseCollector","injectState","getRequest","token","args","skipCycleTracking","isFrozen","idx","currentIndex","request","requests","toString","result","error","doInject","inject","then","r","catch","e","promise","push","asyncInject","realToken","wrapSyncInit","cb","previousState","promises","originalPromiseCollector","originalInjectState","newInjectState","ctx","instance","container","tryGetSync","Proxy","get","optional","injectors"],"sources":["../../../src/utils/get-injectors.mts"],"sourcesContent":["import type { z, ZodObject, ZodType } from 'zod/v4'\n\nimport type {\n Factorable,\n FactorableWithArgs,\n} from '../interfaces/factory.interface.mjs'\nimport type { ServiceInitializationContext } from '../internal/context/service-initialization-context.mjs'\nimport type {\n BoundInjectionToken,\n ClassType,\n ClassTypeWithArgument,\n ClassTypeWithoutArguments,\n FactoryInjectionToken,\n InjectionToken,\n InjectionTokenSchemaType,\n} from '../token/injection-token.mjs'\nimport type {\n InjectRequest,\n InjectState,\n Join,\n UnionToArray,\n} from './types.mjs'\n\nimport { withoutResolutionContext } from '../internal/context/resolution-context.mjs'\nimport { InjectableTokenMeta } from '../symbols/index.mjs'\n\nexport interface Injectors {\n // #1 Simple class\n asyncInject<T extends ClassTypeWithoutArguments>(\n token: T,\n ): InstanceType<T> extends Factorable<infer R>\n ? Promise<R>\n : Promise<InstanceType<T>>\n asyncInject<Args, T extends ClassTypeWithArgument<Args>>(\n token: T,\n args: Args,\n ): Promise<InstanceType<T>>\n asyncInject<\n Schema extends InjectionTokenSchemaType,\n R,\n T extends FactorableWithArgs<R, Schema>,\n >(\n token: T,\n args: z.input<Schema>,\n ): Promise<R>\n\n // #2 Token with required Schema\n asyncInject<T, S extends InjectionTokenSchemaType>(\n token: InjectionToken<T, S>,\n args: z.input<S>,\n ): Promise<T>\n // #3 Token with optional Schema\n asyncInject<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 asyncInject<T>(token: InjectionToken<T, undefined>): Promise<T>\n asyncInject<T>(token: BoundInjectionToken<T, any>): Promise<T>\n asyncInject<T>(token: FactoryInjectionToken<T, any>): Promise<T>\n\n inject<T extends ClassTypeWithoutArguments>(\n token: T,\n ): InstanceType<T> extends Factorable<infer R> ? R : InstanceType<T>\n inject<Args, T extends ClassTypeWithArgument<Args>>(\n token: T,\n args: Args,\n ): InstanceType<T>\n inject<\n Schema extends InjectionTokenSchemaType,\n R,\n T extends FactorableWithArgs<R, Schema>,\n >(\n token: T,\n args: z.input<Schema>,\n ): R\n\n inject<T, S extends InjectionTokenSchemaType>(\n token: InjectionToken<T, S>,\n args: z.input<S>,\n ): T\n // #3 Token with optional Schema\n inject<T, S extends InjectionTokenSchemaType, R extends boolean>(\n token: InjectionToken<T, S, R>,\n ): R extends false\n ? 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 inject<T>(token: InjectionToken<T, undefined>): T\n inject<T>(token: BoundInjectionToken<T, any>): T\n inject<T>(token: FactoryInjectionToken<T, any>): T\n\n /**\n * Optional injection that returns null if the service fails to initialize\n * or is not available. This is useful when you want to inject a service\n * that may not be configured or may fail gracefully.\n *\n * @example\n * ```ts\n * class MyService {\n * constructor() {\n * const optionalService = optional(OptionalServiceToken)\n * // optionalService will be null if initialization fails\n * if (optionalService) {\n * optionalService.doSomething()\n * }\n * }\n * }\n * ```\n */\n optional<T extends ClassType>(\n token: T,\n ): (InstanceType<T> extends Factorable<infer R> ? R : InstanceType<T>) | null\n optional<T, S extends InjectionTokenSchemaType>(\n token: InjectionToken<T, S>,\n args: z.input<S>,\n ): T | null\n optional<T, S extends InjectionTokenSchemaType, R extends boolean>(\n token: InjectionToken<T, S, R>,\n ): R extends false\n ? T | null\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 optional<T>(token: InjectionToken<T, undefined>): T | null\n optional<T>(token: BoundInjectionToken<T, any>): T | null\n optional<T>(token: FactoryInjectionToken<T, any>): T | null\n\n wrapSyncInit(\n cb: () => any,\n ): (injectState?: InjectState) => [any, Promise<any>[], InjectState]\n\n provideFactoryContext(\n context: ServiceInitializationContext | null,\n ): ServiceInitializationContext | null\n}\n\nexport function getInjectors() {\n let currentFactoryContext: ServiceInitializationContext | null = null\n\n function provideFactoryContext(\n context: ServiceInitializationContext | null,\n ): ServiceInitializationContext | null {\n const original = currentFactoryContext\n currentFactoryContext = context\n return original\n }\n function getFactoryContext(): ServiceInitializationContext {\n if (!currentFactoryContext) {\n throw new Error(\n '[Injector] Trying to access injection context outside of a injectable context',\n )\n }\n return currentFactoryContext\n }\n\n let promiseCollector: null | ((promise: Promise<any>) => void) = null\n let injectState: InjectState | null = null\n\n function getRequest(\n token: InjectionToken<any>,\n args?: unknown,\n skipCycleTracking = false,\n ) {\n if (!injectState) {\n throw new Error(\n '[Injector] Trying to make a request outside of a injectable context',\n )\n }\n if (injectState.isFrozen) {\n const idx = injectState.currentIndex++\n const request = injectState.requests[idx]\n if (request.token !== token) {\n throw new Error(\n `[Injector] Wrong token order. Expected ${request.token.toString()} but got ${token.toString()}`,\n )\n }\n return request\n }\n let result: any = null\n let error: Error | null = null\n\n // For async inject, we run outside the resolution context to skip cycle tracking.\n // This is because asyncInject returns a promise that doesn't block the constructor,\n // so it cannot cause a deadlock even with circular dependencies.\n const doInject = () =>\n getFactoryContext()\n .inject(token as any, args as any)\n .then((r) => {\n result = r\n return r\n })\n .catch((e) => {\n // We don't throw here because we have a mechanism to handle errors\n error = e\n })\n\n const promise = skipCycleTracking\n ? withoutResolutionContext(doInject)\n : doInject()\n\n const request: InjectRequest = {\n token,\n promise,\n get result() {\n return result\n },\n get error() {\n return error\n },\n }\n injectState.requests.push(request)\n injectState.currentIndex++\n\n return request\n }\n\n function asyncInject(\n token:\n | ClassType\n | InjectionToken<any>\n | BoundInjectionToken<any, any>\n | FactoryInjectionToken<any, any>,\n args?: unknown,\n ) {\n if (!injectState) {\n throw new Error(\n '[Injector] Trying to access inject outside of a injectable context',\n )\n }\n // @ts-expect-error In case we have a class\n const realToken = token[InjectableTokenMeta] ?? token\n // Pass skipCycleTracking=true because asyncInject returns a promise that doesn't\n // block the constructor, so it cannot cause a deadlock even with circular dependencies.\n const request = getRequest(realToken, args, true)\n return request.promise.then((result) => {\n if (request.error) {\n // We throw here because we want to fail the asyncInject call if the dependency fails to initialize\n throw request.error\n }\n return result\n })\n }\n\n function wrapSyncInit(cb: () => any) {\n return (previousState?: InjectState) => {\n const promises: Promise<any>[] = []\n const originalPromiseCollector = promiseCollector\n const originalInjectState = injectState\n injectState = previousState\n ? {\n ...previousState,\n currentIndex: 0,\n }\n : {\n currentIndex: 0,\n isFrozen: false,\n requests: [],\n }\n promiseCollector = (promise) => {\n promises.push(promise)\n }\n const result = cb()\n promiseCollector = originalPromiseCollector\n const newInjectState = {\n ...injectState,\n isFrozen: true,\n }\n injectState = originalInjectState\n return [result, promises, newInjectState]\n }\n }\n\n function inject<\n T,\n Token extends\n | InjectionToken<T>\n | BoundInjectionToken<T, any>\n | FactoryInjectionToken<T, any>,\n S extends ZodObject | unknown = Token['schema'],\n >(token: Token, args?: S extends ZodObject ? z.input<S> : never): T {\n // @ts-expect-error In case we have a class\n const realToken = token[InjectableTokenMeta] ?? token\n\n if (!injectState) {\n throw new Error(\n '[Injector] Trying to access inject outside of a injectable context',\n )\n }\n\n const ctx = getFactoryContext()\n const instance = ctx.container.tryGetSync(realToken, args)\n if (!instance) {\n const request = getRequest(realToken, args)\n if (request.error) {\n throw request.error\n } else if (request.result) {\n return request.result\n }\n if (promiseCollector) {\n promiseCollector(request.promise)\n }\n // Return a dynamic proxy that looks up the instance when accessed\n return new Proxy(\n {},\n {\n get() {\n throw new Error(\n `[Injector] Trying to access ${realToken.toString()} before it's initialized, please move the code to a onServiceInit method`,\n )\n },\n },\n ) as unknown as T\n }\n\n // Even when tryGetSync returns an existing instance, we still need to\n // track the dependency for scope upgrade. This ensures that if a Singleton\n // service depends on an already-created Request-scoped service, the\n // Singleton will be properly upgraded to Request scope.\n // The ctx.inject call handles dependency tracking and scope upgrades.\n // We fire-and-forget this since we already have the instance.\n ctx.inject(realToken, args).catch(() => {\n // Ignore errors - we already have the instance\n })\n\n return instance as unknown as T\n }\n\n function optional<\n T,\n Token extends\n | InjectionToken<T>\n | BoundInjectionToken<T, any>\n | FactoryInjectionToken<T, any>,\n S extends ZodObject | unknown = Token['schema'],\n >(token: Token, args?: S extends ZodObject ? z.input<S> : never): T | null {\n try {\n return inject(token, args)\n } catch {\n // If injection fails, return null instead of throwing\n return null\n }\n }\n\n const injectors: Injectors = {\n asyncInject,\n inject,\n optional,\n wrapSyncInit,\n provideFactoryContext,\n } as Injectors\n\n return injectors\n}\n"],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { BoundInjectionToken, ClassType, FactoryInjectionToken, InjectionToken } from "../token/injection-token.mjs";
2
+
3
+ //#region src/utils/types.d.mts
4
+ type Join<TElements, TSeparator extends string> = TElements extends Readonly<[infer First, ...infer Rest]> ? Rest extends ReadonlyArray<string> ? First extends string ? `${First}${Rest extends [] ? '' : TSeparator}${Join<Rest, TSeparator>}` : never : never : '';
5
+ type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends ((k: infer I) => void) ? I : never;
6
+ type UnionToOvlds<U> = UnionToIntersection<U extends any ? (f: U) => void : never>;
7
+ type PopUnion<U> = UnionToOvlds<U> extends ((a: infer A) => void) ? A : never;
8
+ type IsUnion<T> = [T] extends [UnionToIntersection<T>] ? false : true;
9
+ type UnionToArray<T, A extends unknown[] = []> = IsUnion<T> extends true ? UnionToArray<Exclude<T, PopUnion<T>>, [PopUnion<T>, ...A]> : [T, ...A];
10
+ type InjectRequest = {
11
+ token: InjectionToken<any> | BoundInjectionToken<any, any> | FactoryInjectionToken<any, any> | ClassType;
12
+ promise: Promise<any>;
13
+ readonly result: any;
14
+ readonly error: Error | null;
15
+ };
16
+ interface InjectState {
17
+ currentIndex: number;
18
+ isFrozen: boolean;
19
+ requests: InjectRequest[];
20
+ }
21
+ //#endregion
22
+ export { InjectRequest, InjectState, IsUnion, Join, PopUnion, UnionToArray, UnionToIntersection, UnionToOvlds };
23
+ //# sourceMappingURL=types.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.mts","names":[],"sources":["../../../src/utils/types.mts"],"sourcesContent":[],"mappings":";;;KAQY,6CACV,kBAAkB,sDACD,kDAEN,+BAA+B,aAAa,KAAK,MAAM;KAMxD,0BACV,oBAAoB;AAXV,KAiBA,YAjBI,CAAA,CAAA,CAAA,GAiBc,mBAjBd,CAkBd,CAlBc,SAAA,GAAA,GAAA,CAAA,CAAA,EAkBM,CAlBN,EAAA,GAAA,IAAA,GAAA,KAAA,CAAA;AACd,KAoBU,QApBV,CAAA,CAAA,CAAA,GAqBA,YArBA,CAqBa,CArBb,CAAA,UAAA,CAAA,CAAA,EAAA,KAAA,EAAA,EAAA,GAAA,IAAA,IAAA,CAAA,GAAA,KAAA;AAAkB,KAuBR,OAvBQ,CAAA,CAAA,CAAA,GAAA,CAuBM,CAvBN,CAAA,SAAA,CAuBkB,mBAvBlB,CAuBsC,CAvBtC,CAAA,CAAA,GAAA,KAAA,GAAA,IAAA;AACD,KAwBP,YAxBO,CAAA,CAAA,EAAA,UAAA,OAAA,EAAA,GAAA,EAAA,CAAA,GAyBjB,OAzBiB,CAyBT,CAzBS,CAAA,SAAA,IAAA,GA0Bb,YA1Ba,CA0BA,OA1BA,CA0BQ,CA1BR,EA0BW,QA1BX,CA0BoB,CA1BpB,CAAA,CAAA,EAAA,CA0B0B,QA1B1B,CA0BmC,CA1BnC,CAAA,EAAA,GA0B0C,CA1B1C,CAAA,CAAA,GAAA,CA2BZ,CA3BY,EAAA,GA2BN,CA3BM,CAAA;AAEN,KA2BD,aAAA,GA3BC;EAA+B,KAAA,EA6BtC,cA7BsC,CAAA,GAAA,CAAA,GA8BtC,mBA9BsC,CAAA,GAAA,EAAA,GAAA,CAAA,GA+BtC,qBA/BsC,CAAA,GAAA,EAAA,GAAA,CAAA,GAgCtC,SAhCsC;EAAkB,OAAA,EAiCnD,OAjCmD,CAAA,GAAA,CAAA;EAAM,SAAA,MAAA,EAAA,GAAA;EAAX,SAAA,KAAA,EAmCvC,KAnCuC,GAAA,IAAA;CAAI;AAMjD,UAiCK,WAAA,CAjCc;EAOnB,YAAA,EAAA,MAAY;EACtB,QAAA,EAAA,OAAA;EAAoB,QAAA,EA4BV,aA5BU,EAAA"}