@navios/di 0.9.1 → 1.0.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 (178) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +28 -0
  3. package/coverage/block-navigation.js +1 -1
  4. package/coverage/clover.xml +1463 -3174
  5. package/coverage/coverage-final.json +56 -54
  6. package/coverage/index.html +179 -104
  7. package/coverage/sorter.js +21 -7
  8. package/coverage/src/{request-context-manager.mts.html → __tests__/gc/gc-test-utils.mts.html} +192 -231
  9. package/coverage/{lib → src/__tests__/gc}/index.html +25 -40
  10. package/coverage/src/container/abstract-container.mts.html +1066 -0
  11. package/coverage/src/container/container.mts.html +958 -0
  12. package/coverage/src/container/index.html +161 -0
  13. package/coverage/src/{testing → container}/index.mts.html +12 -9
  14. package/coverage/src/container/scoped-container.mts.html +907 -0
  15. package/coverage/src/decorators/factory.decorator.mts.html +68 -53
  16. package/coverage/src/decorators/index.html +34 -34
  17. package/coverage/src/decorators/index.mts.html +10 -10
  18. package/coverage/src/decorators/injectable.decorator.mts.html +144 -60
  19. package/coverage/src/enums/index.html +21 -21
  20. package/coverage/src/enums/index.mts.html +12 -12
  21. package/coverage/src/enums/injectable-scope.enum.mts.html +11 -8
  22. package/coverage/src/enums/injectable-type.enum.mts.html +10 -7
  23. package/coverage/src/errors/di-error.mts.html +380 -71
  24. package/coverage/src/errors/index.html +22 -127
  25. package/coverage/src/errors/index.mts.html +9 -33
  26. package/coverage/src/event-emitter.mts.html +35 -107
  27. package/coverage/src/index.html +14 -254
  28. package/coverage/src/index.mts.html +23 -50
  29. package/coverage/src/interfaces/container.interface.mts.html +370 -0
  30. package/coverage/src/interfaces/factory.interface.mts.html +12 -12
  31. package/coverage/src/interfaces/index.html +45 -30
  32. package/coverage/src/interfaces/index.mts.html +16 -13
  33. package/coverage/src/interfaces/on-service-destroy.interface.mts.html +1 -1
  34. package/coverage/src/interfaces/on-service-init.interface.mts.html +1 -1
  35. package/coverage/src/internal/context/async-local-storage.browser.mts.html +142 -0
  36. package/coverage/src/internal/context/async-local-storage.mts.html +292 -0
  37. package/coverage/src/{factory-context.mts.html → internal/context/async-local-storage.types.mts.html} +17 -17
  38. package/coverage/src/internal/context/factory-context.mts.html +142 -0
  39. package/coverage/src/internal/context/index.html +221 -0
  40. package/coverage/src/internal/context/index.mts.html +100 -0
  41. package/coverage/src/{service-locator-instance-holder.mts.html → internal/context/resolution-context.mts.html} +114 -78
  42. package/coverage/src/internal/context/service-initialization-context.mts.html +214 -0
  43. package/coverage/src/internal/context/sync-local-storage.mts.html +244 -0
  44. package/coverage/src/internal/core/index.html +206 -0
  45. package/coverage/src/internal/core/index.mts.html +103 -0
  46. package/coverage/src/internal/core/instance-resolver.mts.html +2533 -0
  47. package/coverage/src/{request-context-holder.mts.html → internal/core/name-resolver.mts.html} +245 -260
  48. package/coverage/src/{container.mts.html → internal/core/scope-tracker.mts.html} +352 -310
  49. package/coverage/src/{service-instantiator.mts.html → internal/core/service-initializer.mts.html} +254 -176
  50. package/coverage/src/internal/core/service-invalidator.mts.html +955 -0
  51. package/coverage/src/internal/core/token-resolver.mts.html +451 -0
  52. package/coverage/src/internal/holder/holder-storage.interface.mts.html +451 -0
  53. package/coverage/src/internal/holder/index.html +161 -0
  54. package/coverage/src/internal/holder/index.mts.html +94 -0
  55. package/coverage/src/internal/holder/instance-holder.mts.html +406 -0
  56. package/coverage/src/{service-locator.mts.html → internal/holder/unified-storage.mts.html} +376 -379
  57. package/coverage/{lib/testing → src/internal}/index.html +26 -11
  58. package/coverage/src/internal/index.mts.html +100 -0
  59. package/coverage/src/internal/lifecycle/circular-detector.mts.html +364 -0
  60. package/coverage/src/internal/lifecycle/index.html +146 -0
  61. package/coverage/src/internal/lifecycle/index.mts.html +91 -0
  62. package/coverage/src/{service-locator-event-bus.mts.html → internal/lifecycle/lifecycle-event-bus.mts.html} +104 -80
  63. package/coverage/src/internal/stub-factory-class.mts.html +133 -0
  64. package/coverage/src/symbols/index.html +14 -14
  65. package/coverage/src/symbols/index.mts.html +9 -9
  66. package/coverage/src/symbols/injectable-token.mts.html +9 -3
  67. package/coverage/src/testing/index.html +32 -32
  68. package/coverage/src/testing/test-container.mts.html +1576 -139
  69. package/coverage/src/testing/unit-test-container.mts.html +1888 -0
  70. package/coverage/src/token/index.html +146 -0
  71. package/coverage/{lib/testing/index.d.mts.html → src/token/index.mts.html} +11 -11
  72. package/coverage/src/{injection-token.mts.html → token/injection-token.mts.html} +225 -111
  73. package/coverage/src/{base-instance-holder-manager.mts.html → token/registry.mts.html} +188 -269
  74. package/coverage/src/{injector.mts.html → utils/default-injectors.mts.html} +31 -31
  75. package/coverage/src/utils/get-injectable-token.mts.html +19 -22
  76. package/coverage/src/utils/get-injectors.mts.html +684 -177
  77. package/coverage/src/utils/index.html +36 -36
  78. package/coverage/src/utils/index.mts.html +18 -12
  79. package/coverage/src/utils/types.mts.html +26 -11
  80. package/docs/examples/basic-usage.mts +1 -1
  81. package/docs/examples/factory-pattern.mts +3 -3
  82. package/docs/examples/request-scope-example.mts +1 -1
  83. package/docs/examples/service-lifecycle.mts +1 -1
  84. package/lib/browser/internal/core/instance-resolver.d.mts.map +1 -1
  85. package/lib/browser/internal/core/instance-resolver.mjs.map +1 -1
  86. package/lib/browser/utils/get-injectors.mjs +9 -12
  87. package/lib/browser/utils/get-injectors.mjs.map +1 -1
  88. package/lib/{container-D-0Ho3qL.d.cts → container-D3j3KuD9.d.mts} +5 -289
  89. package/lib/container-D3j3KuD9.d.mts.map +1 -0
  90. package/lib/{container-8-z89TyQ.mjs → container-qgHMgGNG.mjs} +12 -239
  91. package/lib/container-qgHMgGNG.mjs.map +1 -0
  92. package/lib/{container-CNiqesCL.d.mts → container-r1KP4F-n.d.cts} +5 -289
  93. package/lib/container-r1KP4F-n.d.cts.map +1 -0
  94. package/lib/{container-CaY2fDuk.cjs → container-ycYJgTq7.cjs} +50 -331
  95. package/lib/container-ycYJgTq7.cjs.map +1 -0
  96. package/lib/factory.decorator-D4mem6YQ.cjs +21 -0
  97. package/lib/factory.decorator-D4mem6YQ.cjs.map +1 -0
  98. package/lib/factory.decorator-_IPWcwQn.mjs +16 -0
  99. package/lib/factory.decorator-_IPWcwQn.mjs.map +1 -0
  100. package/lib/index.cjs +14 -24
  101. package/lib/index.cjs.map +1 -1
  102. package/lib/index.d.cts +3 -52
  103. package/lib/index.d.cts.map +1 -1
  104. package/lib/index.d.mts +3 -52
  105. package/lib/index.d.mts.map +1 -1
  106. package/lib/index.mjs +3 -13
  107. package/lib/index.mjs.map +1 -1
  108. package/lib/injectable.decorator-BNfWpjr_.d.cts +56 -0
  109. package/lib/injectable.decorator-BNfWpjr_.d.cts.map +1 -0
  110. package/lib/injectable.decorator-Bc05hRQU.d.mts +56 -0
  111. package/lib/injectable.decorator-Bc05hRQU.d.mts.map +1 -0
  112. package/lib/injectable.decorator-CyPrBzBN.mjs +227 -0
  113. package/lib/injectable.decorator-CyPrBzBN.mjs.map +1 -0
  114. package/lib/injectable.decorator-DbpiDrg-.cjs +281 -0
  115. package/lib/injectable.decorator-DbpiDrg-.cjs.map +1 -0
  116. package/lib/legacy-compat/index.cjs +114 -0
  117. package/lib/legacy-compat/index.cjs.map +1 -0
  118. package/lib/legacy-compat/index.d.cts +63 -0
  119. package/lib/legacy-compat/index.d.cts.map +1 -0
  120. package/lib/legacy-compat/index.d.mts +63 -0
  121. package/lib/legacy-compat/index.d.mts.map +1 -0
  122. package/lib/legacy-compat/index.mjs +111 -0
  123. package/lib/legacy-compat/index.mjs.map +1 -0
  124. package/lib/registry-DKbKWFvJ.d.cts +290 -0
  125. package/lib/registry-DKbKWFvJ.d.cts.map +1 -0
  126. package/lib/registry-n8JhJoxm.d.mts +290 -0
  127. package/lib/registry-n8JhJoxm.d.mts.map +1 -0
  128. package/lib/testing/index.cjs +23 -22
  129. package/lib/testing/index.cjs.map +1 -1
  130. package/lib/testing/index.d.cts +2 -1
  131. package/lib/testing/index.d.cts.map +1 -1
  132. package/lib/testing/index.d.mts +2 -1
  133. package/lib/testing/index.d.mts.map +1 -1
  134. package/lib/testing/index.mjs +2 -1
  135. package/lib/testing/index.mjs.map +1 -1
  136. package/package.json +11 -1
  137. package/project.json +8 -0
  138. package/src/__tests__/gc/basic-container.spec.mts +358 -0
  139. package/src/__tests__/gc/circular-dependencies.spec.mts +501 -0
  140. package/src/__tests__/gc/gc-test-utils.mts +136 -0
  141. package/src/__tests__/gc/memory-pressure.spec.mts +542 -0
  142. package/src/__tests__/gc/scoped-container.spec.mts +444 -0
  143. package/src/__tests__/gc/transient-services.spec.mts +326 -0
  144. package/src/__tests__/get-injectors.spec.mts +166 -0
  145. package/src/__tests__/scope-upgrade.spec.mts +0 -18
  146. package/src/internal/core/instance-resolver.mts +0 -1
  147. package/src/legacy-compat/context-compat.mts +95 -0
  148. package/src/legacy-compat/factory.decorator.mts +37 -0
  149. package/src/legacy-compat/index.mts +16 -0
  150. package/src/legacy-compat/injectable.decorator.mts +41 -0
  151. package/src/utils/get-injectors.mts +36 -32
  152. package/tsdown.config.mts +1 -1
  153. package/vitest.config.mts +3 -7
  154. package/coverage/docs/examples/basic-usage.mts.html +0 -376
  155. package/coverage/docs/examples/factory-pattern.mts.html +0 -1039
  156. package/coverage/docs/examples/index.html +0 -176
  157. package/coverage/docs/examples/injection-tokens.mts.html +0 -760
  158. package/coverage/docs/examples/request-scope-example.mts.html +0 -847
  159. package/coverage/docs/examples/service-lifecycle.mts.html +0 -1162
  160. package/coverage/lib/_tsup-dts-rollup.d.mts.html +0 -3445
  161. package/coverage/lib/index.d.mts.html +0 -313
  162. package/coverage/src/errors/errors.enum.mts.html +0 -118
  163. package/coverage/src/errors/factory-not-found.mts.html +0 -118
  164. package/coverage/src/errors/factory-token-not-resolved.mts.html +0 -118
  165. package/coverage/src/errors/instance-destroying.mts.html +0 -118
  166. package/coverage/src/errors/instance-expired.mts.html +0 -118
  167. package/coverage/src/errors/instance-not-found.mts.html +0 -118
  168. package/coverage/src/errors/unknown-error.mts.html +0 -118
  169. package/coverage/src/instance-resolver.mts.html +0 -1762
  170. package/coverage/src/registry.mts.html +0 -247
  171. package/coverage/src/service-invalidator.mts.html +0 -1372
  172. package/coverage/src/service-locator-manager.mts.html +0 -340
  173. package/coverage/src/token-processor.mts.html +0 -607
  174. package/coverage/src/utils/defer.mts.html +0 -118
  175. package/lib/container-8-z89TyQ.mjs.map +0 -1
  176. package/lib/container-CNiqesCL.d.mts.map +0 -1
  177. package/lib/container-CaY2fDuk.cjs.map +0 -1
  178. package/lib/container-D-0Ho3qL.d.cts.map +0 -1
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">86.2% </span>
26
+ <span class="strong">77.77% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>25/29</span>
28
+ <span class='fraction'>7/9</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">75% </span>
33
+ <span class="strong">87.5% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>3/4</span>
35
+ <span class='fraction'>14/16</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
40
  <span class="strong">100% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>1/1</span>
42
+ <span class='fraction'>2/2</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">86.2% </span>
47
+ <span class="strong">77.77% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>25/29</span>
49
+ <span class='fraction'>7/9</span>
50
50
  </div>
51
51
 
52
52
 
@@ -61,7 +61,7 @@
61
61
  </div>
62
62
  </template>
63
63
  </div>
64
- <div class='status-line high'></div>
64
+ <div class='status-line medium'></div>
65
65
  <pre><table class="coverage">
66
66
  <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
67
  <a name='L2'></a><a href='#L2'>2</a>
@@ -166,7 +166,35 @@
166
166
  <a name='L101'></a><a href='#L101'>101</a>
167
167
  <a name='L102'></a><a href='#L102'>102</a>
168
168
  <a name='L103'></a><a href='#L103'>103</a>
169
- <a name='L104'></a><a href='#L104'>104</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
169
+ <a name='L104'></a><a href='#L104'>104</a>
170
+ <a name='L105'></a><a href='#L105'>105</a>
171
+ <a name='L106'></a><a href='#L106'>106</a>
172
+ <a name='L107'></a><a href='#L107'>107</a>
173
+ <a name='L108'></a><a href='#L108'>108</a>
174
+ <a name='L109'></a><a href='#L109'>109</a>
175
+ <a name='L110'></a><a href='#L110'>110</a>
176
+ <a name='L111'></a><a href='#L111'>111</a>
177
+ <a name='L112'></a><a href='#L112'>112</a>
178
+ <a name='L113'></a><a href='#L113'>113</a>
179
+ <a name='L114'></a><a href='#L114'>114</a>
180
+ <a name='L115'></a><a href='#L115'>115</a>
181
+ <a name='L116'></a><a href='#L116'>116</a>
182
+ <a name='L117'></a><a href='#L117'>117</a>
183
+ <a name='L118'></a><a href='#L118'>118</a>
184
+ <a name='L119'></a><a href='#L119'>119</a>
185
+ <a name='L120'></a><a href='#L120'>120</a>
186
+ <a name='L121'></a><a href='#L121'>121</a>
187
+ <a name='L122'></a><a href='#L122'>122</a>
188
+ <a name='L123'></a><a href='#L123'>123</a>
189
+ <a name='L124'></a><a href='#L124'>124</a>
190
+ <a name='L125'></a><a href='#L125'>125</a>
191
+ <a name='L126'></a><a href='#L126'>126</a>
192
+ <a name='L127'></a><a href='#L127'>127</a>
193
+ <a name='L128'></a><a href='#L128'>128</a>
194
+ <a name='L129'></a><a href='#L129'>129</a>
195
+ <a name='L130'></a><a href='#L130'>130</a>
196
+ <a name='L131'></a><a href='#L131'>131</a>
197
+ <a name='L132'></a><a href='#L132'>132</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
170
198
  <span class="cline-any cline-neutral">&nbsp;</span>
171
199
  <span class="cline-any cline-neutral">&nbsp;</span>
172
200
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -180,10 +208,6 @@
180
208
  <span class="cline-any cline-neutral">&nbsp;</span>
181
209
  <span class="cline-any cline-neutral">&nbsp;</span>
182
210
  <span class="cline-any cline-neutral">&nbsp;</span>
183
- <span class="cline-any cline-yes">1x</span>
184
- <span class="cline-any cline-yes">1x</span>
185
- <span class="cline-any cline-yes">1x</span>
186
- <span class="cline-any cline-yes">1x</span>
187
211
  <span class="cline-any cline-neutral">&nbsp;</span>
188
212
  <span class="cline-any cline-neutral">&nbsp;</span>
189
213
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -241,35 +265,67 @@
241
265
  <span class="cline-any cline-neutral">&nbsp;</span>
242
266
  <span class="cline-any cline-neutral">&nbsp;</span>
243
267
  <span class="cline-any cline-neutral">&nbsp;</span>
244
- <span class="cline-any cline-yes">1x</span>
245
- <span class="cline-any cline-yes">264x</span>
246
- <span class="cline-any cline-yes">264x</span>
247
- <span class="cline-any cline-yes">264x</span>
248
- <span class="cline-any cline-yes">264x</span>
249
- <span class="cline-any cline-yes">264x</span>
250
- <span class="cline-any cline-yes">264x</span>
251
- <span class="cline-any cline-yes">264x</span>
252
- <span class="cline-any cline-yes">264x</span>
253
- <span class="cline-any cline-yes">264x</span>
254
- <span class="cline-any cline-yes">264x</span>
255
- <span class="cline-any cline-yes">264x</span>
256
- <span class="cline-any cline-yes">264x</span>
257
- <span class="cline-any cline-no">&nbsp;</span>
258
- <span class="cline-any cline-no">&nbsp;</span>
268
+ <span class="cline-any cline-neutral">&nbsp;</span>
269
+ <span class="cline-any cline-neutral">&nbsp;</span>
270
+ <span class="cline-any cline-neutral">&nbsp;</span>
271
+ <span class="cline-any cline-neutral">&nbsp;</span>
272
+ <span class="cline-any cline-neutral">&nbsp;</span>
273
+ <span class="cline-any cline-neutral">&nbsp;</span>
274
+ <span class="cline-any cline-neutral">&nbsp;</span>
275
+ <span class="cline-any cline-neutral">&nbsp;</span>
276
+ <span class="cline-any cline-neutral">&nbsp;</span>
277
+ <span class="cline-any cline-neutral">&nbsp;</span>
278
+ <span class="cline-any cline-neutral">&nbsp;</span>
279
+ <span class="cline-any cline-neutral">&nbsp;</span>
280
+ <span class="cline-any cline-neutral">&nbsp;</span>
281
+ <span class="cline-any cline-neutral">&nbsp;</span>
282
+ <span class="cline-any cline-neutral">&nbsp;</span>
283
+ <span class="cline-any cline-neutral">&nbsp;</span>
284
+ <span class="cline-any cline-neutral">&nbsp;</span>
285
+ <span class="cline-any cline-neutral">&nbsp;</span>
286
+ <span class="cline-any cline-neutral">&nbsp;</span>
287
+ <span class="cline-any cline-neutral">&nbsp;</span>
288
+ <span class="cline-any cline-neutral">&nbsp;</span>
289
+ <span class="cline-any cline-neutral">&nbsp;</span>
290
+ <span class="cline-any cline-neutral">&nbsp;</span>
291
+ <span class="cline-any cline-neutral">&nbsp;</span>
292
+ <span class="cline-any cline-neutral">&nbsp;</span>
293
+ <span class="cline-any cline-neutral">&nbsp;</span>
294
+ <span class="cline-any cline-neutral">&nbsp;</span>
295
+ <span class="cline-any cline-neutral">&nbsp;</span>
296
+ <span class="cline-any cline-neutral">&nbsp;</span>
297
+ <span class="cline-any cline-neutral">&nbsp;</span>
298
+ <span class="cline-any cline-neutral">&nbsp;</span>
299
+ <span class="cline-any cline-neutral">&nbsp;</span>
300
+ <span class="cline-any cline-neutral">&nbsp;</span>
301
+ <span class="cline-any cline-neutral">&nbsp;</span>
302
+ <span class="cline-any cline-yes">419x</span>
303
+ <span class="cline-any cline-neutral">&nbsp;</span>
304
+ <span class="cline-any cline-neutral">&nbsp;</span>
305
+ <span class="cline-any cline-neutral">&nbsp;</span>
306
+ <span class="cline-any cline-yes">419x</span>
307
+ <span class="cline-any cline-neutral">&nbsp;</span>
308
+ <span class="cline-any cline-neutral">&nbsp;</span>
309
+ <span class="cline-any cline-neutral">&nbsp;</span>
259
310
  <span class="cline-any cline-no">&nbsp;</span>
311
+ <span class="cline-any cline-neutral">&nbsp;</span>
312
+ <span class="cline-any cline-yes">419x</span>
260
313
  <span class="cline-any cline-no">&nbsp;</span>
261
- <span class="cline-any cline-yes">264x</span>
262
- <span class="cline-any cline-yes">264x</span>
263
314
  <span class="cline-any cline-neutral">&nbsp;</span>
264
- <span class="cline-any cline-yes">264x</span>
265
315
  <span class="cline-any cline-neutral">&nbsp;</span>
266
316
  <span class="cline-any cline-neutral">&nbsp;</span>
267
- <span class="cline-any cline-yes">264x</span>
268
317
  <span class="cline-any cline-neutral">&nbsp;</span>
269
- <span class="cline-any cline-yes">264x</span>
270
- <span class="cline-any cline-yes">264x</span>
271
- <span class="cline-any cline-yes">264x</span>
272
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { z } from 'zod/v4'
318
+ <span class="cline-any cline-yes">419x</span>
319
+ <span class="cline-any cline-neutral">&nbsp;</span>
320
+ <span class="cline-any cline-yes">419x</span>
321
+ <span class="cline-any cline-neutral">&nbsp;</span>
322
+ <span class="cline-any cline-neutral">&nbsp;</span>
323
+ <span class="cline-any cline-yes">419x</span>
324
+ <span class="cline-any cline-neutral">&nbsp;</span>
325
+ <span class="cline-any cline-yes">419x</span>
326
+ <span class="cline-any cline-neutral">&nbsp;</span>
327
+ <span class="cline-any cline-neutral">&nbsp;</span>
328
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import type { z } from 'zod/v4'
273
329
  &nbsp;
274
330
  import type {
275
331
  BaseInjectionTokenSchemaType,
@@ -279,56 +335,79 @@ import type {
279
335
  ClassTypeWithInstanceAndArgument,
280
336
  ClassTypeWithInstanceAndOptionalArgument,
281
337
  ClassTypeWithOptionalArgument,
338
+ ClassTypeWithoutArguments,
339
+ InjectionTokenSchemaType,
282
340
  OptionalInjectionTokenSchemaType,
283
- } from '../injection-token.mjs'
284
- import type { Registry } from '../registry.mjs'
341
+ } from '../token/injection-token.mjs'
342
+ import type { Registry } from '../token/registry.mjs'
285
343
  &nbsp;
286
344
  import { InjectableScope, InjectableType } from '../enums/index.mjs'
287
- import { InjectionToken } from '../injection-token.mjs'
288
- import { globalRegistry } from '../registry.mjs'
289
345
  import { InjectableTokenMeta } from '../symbols/index.mjs'
346
+ import { InjectionToken } from '../token/injection-token.mjs'
347
+ import { globalRegistry } from '../token/registry.mjs'
290
348
  &nbsp;
291
349
  export interface InjectableOptions {
292
350
  scope?: InjectableScope
293
351
  token?: InjectionToken&lt;any, any&gt;
352
+ schema?: InjectionTokenSchemaType
294
353
  registry?: Registry
354
+ priority?: number
295
355
  }
356
+ &nbsp;
296
357
  // #1 Simple constructorless class
297
- export function Injectable(): &lt;T extends ClassType&gt;(
358
+ export function Injectable(): &lt;T extends ClassTypeWithoutArguments&gt;(
298
359
  target: T,
299
360
  context?: ClassDecoratorContext,
300
361
  ) =&gt; T
301
362
  export function Injectable(options: {
302
363
  scope?: InjectableScope
303
364
  registry: Registry
304
- }): &lt;T extends ClassType&gt;(target: T, context?: ClassDecoratorContext) =&gt; T
365
+ priority?: number
366
+ }): &lt;T extends ClassTypeWithoutArguments&gt;(
367
+ target: T,
368
+ context?: ClassDecoratorContext,
369
+ ) =&gt; T
305
370
  export function Injectable(options: {
306
371
  scope: InjectableScope
307
- }): &lt;T extends ClassType&gt;(target: T, context?: ClassDecoratorContext) =&gt; T
372
+ priority?: number
373
+ }): &lt;T extends ClassTypeWithoutArguments&gt;(
374
+ target: T,
375
+ context?: ClassDecoratorContext,
376
+ ) =&gt; T
377
+ // #2 Class with schema
378
+ export function Injectable&lt;Schema extends InjectionTokenSchemaType&gt;(options: {
379
+ scope?: InjectableScope
380
+ schema: Schema
381
+ registry?: Registry
382
+ priority?: number
383
+ }): &lt;T extends ClassTypeWithArgument&lt;z.output&lt;Schema&gt;&gt;&gt;(
384
+ target: T,
385
+ context?: ClassDecoratorContext,
386
+ ) =&gt; T
308
387
  &nbsp;
309
388
  // #3 Class with typeless token and schema
310
389
  export function Injectable&lt;Type, Schema&gt;(options: {
311
390
  scope?: InjectableScope
312
391
  token: InjectionToken&lt;Type, Schema&gt;
313
392
  registry?: Registry
314
- }): Schema extends BaseInjectionTokenSchemaType // #3.1 Check that schema is an object or a record
393
+ priority?: number
394
+ }): Schema extends BaseInjectionTokenSchemaType
315
395
  ? Type extends undefined
316
- ? &lt;T extends ClassTypeWithArgument&lt;z.output&lt;Schema&gt;&gt;&gt;( // #3.1.1 Typeless token
396
+ ? &lt;T extends ClassTypeWithArgument&lt;z.output&lt;Schema&gt;&gt;&gt;(
317
397
  target: T,
318
398
  context?: ClassDecoratorContext,
319
399
  ) =&gt; T
320
- : &lt;T extends ClassTypeWithInstanceAndArgument&lt;Type, z.output&lt;Schema&gt;&gt;&gt;( // #3.1.2 Typed token
400
+ : &lt;T extends ClassTypeWithInstanceAndArgument&lt;Type, z.output&lt;Schema&gt;&gt;&gt;(
321
401
  target: T,
322
402
  context?: ClassDecoratorContext,
323
403
  ) =&gt; T
324
- : Schema extends OptionalInjectionTokenSchemaType // #3.2 Check that schema is an optional object or a record
404
+ : Schema extends OptionalInjectionTokenSchemaType
325
405
  ? Type extends undefined
326
- ? &lt;T extends ClassTypeWithOptionalArgument&lt;z.output&lt;Schema&gt;&gt;&gt;( // #3.2.1 Typeless token
406
+ ? &lt;T extends ClassTypeWithOptionalArgument&lt;z.output&lt;Schema&gt;&gt;&gt;(
327
407
  target: T,
328
408
  context?: ClassDecoratorContext,
329
409
  ) =&gt; T
330
410
  : &lt;
331
- // #3.2.2 Typed token
332
411
  T extends ClassTypeWithInstanceAndOptionalArgument&lt;
333
412
  Type,
334
413
  z.output&lt;Schema&gt;
@@ -337,34 +416,39 @@ export function Injectable&lt;Type, Schema&gt;(options: {
337
416
  target: T,
338
417
  context?: ClassDecoratorContext,
339
418
  ) =&gt; T
340
- : Schema extends undefined // #3.3 Check that schema is undefined
341
- ? &lt;R extends ClassTypeWithInstance&lt;Type&gt;&gt;( // #3.3.1 Token must have a type
419
+ : Schema extends undefined
420
+ ? &lt;R extends ClassTypeWithInstance&lt;Type&gt;&gt;(
342
421
  target: R,
343
422
  context?: ClassDecoratorContext,
344
423
  ) =&gt; R
345
- : never // #3.4 Cannot use a token without a type and schema
424
+ : never
346
425
  &nbsp;
347
426
  export function Injectable({
348
427
  scope = InjectableScope.Singleton,
349
428
  token,
429
+ schema,
350
430
  registry = globalRegistry,
431
+ priority = 0,
351
432
  }: InjectableOptions = {}) {
352
433
  return &lt;T extends ClassType&gt;(
353
434
  target: T,
354
435
  context?: ClassDecoratorContext,
355
436
  ): T =&gt; {
356
- if (
437
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (
357
438
  (context &amp;&amp; context.kind !== 'class') ||
358
439
  (target instanceof Function &amp;&amp; !context)
359
- ) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
440
+ ) {
441
+ <span class="cstat-no" title="statement not covered" > throw new Error('[DI] @Injectable decorator can only be used on classes.')</span>
442
+ }
443
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (schema &amp;&amp; token) {
360
444
  <span class="cstat-no" title="statement not covered" > throw new Error(</span>
361
- <span class="cstat-no" title="statement not covered" > '[ServiceLocator] @Injectable decorator can only be used on classes.',</span>
362
- <span class="cstat-no" title="statement not covered" > )</span>
363
- <span class="cstat-no" title="statement not covered" > }</span>
445
+ '[DI] @Injectable decorator cannot have both a token and a schema',
446
+ )
447
+ }
364
448
  let injectableToken: InjectionToken&lt;any, any&gt; =
365
- token ?? InjectionToken.create(target)
449
+ token ?? InjectionToken.create(target, schema as InjectionTokenSchemaType)
366
450
  &nbsp;
367
- registry.set(injectableToken, scope, target, InjectableType.Class)
451
+ registry.set(injectableToken, scope, target, InjectableType.Class, priority)
368
452
  &nbsp;
369
453
  // @ts-expect-error
370
454
  target[InjectableTokenMeta] = injectableToken
@@ -379,7 +463,7 @@ export function Injectable({
379
463
  <div class='footer quiet pad2 space-top1 center small'>
380
464
  Code coverage generated by
381
465
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
382
- at 2025-09-21T17:47:07.632Z
466
+ at 2026-01-08T12:15:46.476Z
383
467
  </div>
384
468
  <script src="../../prettify.js"></script>
385
469
  <script>
@@ -32,21 +32,21 @@
32
32
  <div class='fl pad1y space-right2'>
33
33
  <span class="strong">100% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>2/2</span>
35
+ <span class='fraction'>4/4</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
40
  <span class="strong">100% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>0/0</span>
42
+ <span class='fraction'>2/2</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
47
  <span class="strong">100% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>9/9</span>
49
+ <span class='fraction'>7/7</span>
50
50
  </div>
51
51
 
52
52
 
@@ -79,18 +79,18 @@
79
79
  </tr>
80
80
  </thead>
81
81
  <tbody><tr>
82
- <td class="file high" data-value="index.mts"><a href="index.mts.html">index.mts</a></td>
83
- <td data-value="100" class="pic high">
84
- <div class="chart"><div class="cover-fill cover-full" style="width: 100%"></div><div class="cover-empty" style="width: 0%"></div></div>
82
+ <td class="file empty" data-value="index.mts"><a href="index.mts.html">index.mts</a></td>
83
+ <td data-value="0" class="pic empty">
84
+ <div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
85
85
  </td>
86
- <td data-value="100" class="pct high">100%</td>
87
- <td data-value="2" class="abs high">2/2</td>
88
- <td data-value="100" class="pct high">100%</td>
89
- <td data-value="0" class="abs high">0/0</td>
90
- <td data-value="100" class="pct high">100%</td>
91
- <td data-value="0" class="abs high">0/0</td>
92
- <td data-value="100" class="pct high">100%</td>
93
- <td data-value="2" class="abs high">2/2</td>
86
+ <td data-value="0" class="pct empty">0%</td>
87
+ <td data-value="0" class="abs empty">0/0</td>
88
+ <td data-value="0" class="pct empty">0%</td>
89
+ <td data-value="0" class="abs empty">0/0</td>
90
+ <td data-value="0" class="pct empty">0%</td>
91
+ <td data-value="0" class="abs empty">0/0</td>
92
+ <td data-value="0" class="pct empty">0%</td>
93
+ <td data-value="0" class="abs empty">0/0</td>
94
94
  </tr>
95
95
 
96
96
  <tr>
@@ -99,11 +99,11 @@
99
99
  <div class="chart"><div class="cover-fill cover-full" style="width: 100%"></div><div class="cover-empty" style="width: 0%"></div></div>
100
100
  </td>
101
101
  <td data-value="100" class="pct high">100%</td>
102
- <td data-value="4" class="abs high">4/4</td>
102
+ <td data-value="5" class="abs high">5/5</td>
103
103
  <td data-value="100" class="pct high">100%</td>
104
- <td data-value="1" class="abs high">1/1</td>
104
+ <td data-value="2" class="abs high">2/2</td>
105
105
  <td data-value="100" class="pct high">100%</td>
106
- <td data-value="0" class="abs high">0/0</td>
106
+ <td data-value="1" class="abs high">1/1</td>
107
107
  <td data-value="100" class="pct high">100%</td>
108
108
  <td data-value="4" class="abs high">4/4</td>
109
109
  </tr>
@@ -114,11 +114,11 @@
114
114
  <div class="chart"><div class="cover-fill cover-full" style="width: 100%"></div><div class="cover-empty" style="width: 0%"></div></div>
115
115
  </td>
116
116
  <td data-value="100" class="pct high">100%</td>
117
- <td data-value="3" class="abs high">3/3</td>
117
+ <td data-value="4" class="abs high">4/4</td>
118
118
  <td data-value="100" class="pct high">100%</td>
119
- <td data-value="1" class="abs high">1/1</td>
119
+ <td data-value="2" class="abs high">2/2</td>
120
120
  <td data-value="100" class="pct high">100%</td>
121
- <td data-value="0" class="abs high">0/0</td>
121
+ <td data-value="1" class="abs high">1/1</td>
122
122
  <td data-value="100" class="pct high">100%</td>
123
123
  <td data-value="3" class="abs high">3/3</td>
124
124
  </tr>
@@ -131,7 +131,7 @@
131
131
  <div class='footer quiet pad2 space-top1 center small'>
132
132
  Code coverage generated by
133
133
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
134
- at 2025-09-21T17:47:07.632Z
134
+ at 2026-01-08T12:15:46.476Z
135
135
  </div>
136
136
  <script src="../../prettify.js"></script>
137
137
  <script>
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">100% </span>
26
+ <span class="strong">0% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>2/2</span>
28
+ <span class='fraction'>0/0</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">100% </span>
33
+ <span class="strong">0% </span>
34
34
  <span class="quiet">Branches</span>
35
35
  <span class='fraction'>0/0</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">100% </span>
40
+ <span class="strong">0% </span>
41
41
  <span class="quiet">Functions</span>
42
42
  <span class='fraction'>0/0</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">100% </span>
47
+ <span class="strong">0% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>2/2</span>
49
+ <span class='fraction'>0/0</span>
50
50
  </div>
51
51
 
52
52
 
@@ -61,14 +61,14 @@
61
61
  </div>
62
62
  </template>
63
63
  </div>
64
- <div class='status-line high'></div>
64
+ <div class='status-line low'></div>
65
65
  <pre><table class="coverage">
66
66
  <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
67
  <a name='L2'></a><a href='#L2'>2</a>
68
- <a name='L3'></a><a href='#L3'>3</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
69
- <span class="cline-any cline-yes">1x</span>
70
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">export * from './injectable-scope.enum.mjs'
71
- export * from './injectable-type.enum.mjs'
68
+ <a name='L3'></a><a href='#L3'>3</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
69
+ <span class="cline-any cline-neutral">&nbsp;</span>
70
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">export { InjectableScope } from './injectable-scope.enum.mjs'
71
+ export { InjectableType } from './injectable-type.enum.mjs'
72
72
  &nbsp;</pre></td></tr></table></pre>
73
73
 
74
74
  <div class='push'></div><!-- for sticky footer -->
@@ -76,7 +76,7 @@ export * from './injectable-type.enum.mjs'
76
76
  <div class='footer quiet pad2 space-top1 center small'>
77
77
  Code coverage generated by
78
78
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
79
- at 2025-09-21T17:47:07.632Z
79
+ at 2026-01-08T12:15:46.476Z
80
80
  </div>
81
81
  <script src="../../prettify.js"></script>
82
82
  <script>
@@ -25,21 +25,21 @@
25
25
  <div class='fl pad1y space-right2'>
26
26
  <span class="strong">100% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>4/4</span>
28
+ <span class='fraction'>5/5</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
33
  <span class="strong">100% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>1/1</span>
35
+ <span class='fraction'>2/2</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
40
  <span class="strong">100% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>0/0</span>
42
+ <span class='fraction'>1/1</span>
43
43
  </div>
44
44
 
45
45
 
@@ -77,19 +77,21 @@
77
77
  <a name='L12'></a><a href='#L12'>12</a>
78
78
  <a name='L13'></a><a href='#L13'>13</a>
79
79
  <a name='L14'></a><a href='#L14'>14</a>
80
- <a name='L15'></a><a href='#L15'>15</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
80
+ <a name='L15'></a><a href='#L15'>15</a>
81
+ <a name='L16'></a><a href='#L16'>16</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">23x</span>
82
+ <span class="cline-any cline-neutral">&nbsp;</span>
81
83
  <span class="cline-any cline-neutral">&nbsp;</span>
82
84
  <span class="cline-any cline-neutral">&nbsp;</span>
85
+ <span class="cline-any cline-yes">23x</span>
83
86
  <span class="cline-any cline-neutral">&nbsp;</span>
84
- <span class="cline-any cline-yes">1x</span>
85
87
  <span class="cline-any cline-neutral">&nbsp;</span>
86
88
  <span class="cline-any cline-neutral">&nbsp;</span>
89
+ <span class="cline-any cline-yes">23x</span>
87
90
  <span class="cline-any cline-neutral">&nbsp;</span>
88
- <span class="cline-any cline-yes">1x</span>
89
91
  <span class="cline-any cline-neutral">&nbsp;</span>
90
92
  <span class="cline-any cline-neutral">&nbsp;</span>
93
+ <span class="cline-any cline-yes">23x</span>
91
94
  <span class="cline-any cline-neutral">&nbsp;</span>
92
- <span class="cline-any cline-yes">1x</span>
93
95
  <span class="cline-any cline-neutral">&nbsp;</span>
94
96
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">export enum InjectableScope {
95
97
  /**
@@ -105,6 +107,7 @@
105
107
  */
106
108
  Request = 'Request',
107
109
  }
110
+ &nbsp;
108
111
  &nbsp;</pre></td></tr></table></pre>
109
112
 
110
113
  <div class='push'></div><!-- for sticky footer -->
@@ -112,7 +115,7 @@
112
115
  <div class='footer quiet pad2 space-top1 center small'>
113
116
  Code coverage generated by
114
117
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
115
- at 2025-09-21T17:47:07.632Z
118
+ at 2026-01-08T12:15:46.476Z
116
119
  </div>
117
120
  <script src="../../prettify.js"></script>
118
121
  <script>
@@ -25,21 +25,21 @@
25
25
  <div class='fl pad1y space-right2'>
26
26
  <span class="strong">100% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>3/3</span>
28
+ <span class='fraction'>4/4</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
33
  <span class="strong">100% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>1/1</span>
35
+ <span class='fraction'>2/2</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
40
  <span class="strong">100% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>0/0</span>
42
+ <span class='fraction'>1/1</span>
43
43
  </div>
44
44
 
45
45
 
@@ -67,14 +67,17 @@
67
67
  <a name='L2'></a><a href='#L2'>2</a>
68
68
  <a name='L3'></a><a href='#L3'>3</a>
69
69
  <a name='L4'></a><a href='#L4'>4</a>
70
- <a name='L5'></a><a href='#L5'>5</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
71
- <span class="cline-any cline-yes">1x</span>
72
- <span class="cline-any cline-yes">1x</span>
70
+ <a name='L5'></a><a href='#L5'>5</a>
71
+ <a name='L6'></a><a href='#L6'>6</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">23x</span>
72
+ <span class="cline-any cline-yes">23x</span>
73
+ <span class="cline-any cline-yes">23x</span>
74
+ <span class="cline-any cline-neutral">&nbsp;</span>
73
75
  <span class="cline-any cline-neutral">&nbsp;</span>
74
76
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">export enum InjectableType {
75
77
  Class = 'Class',
76
78
  Factory = 'Factory',
77
79
  }
80
+ &nbsp;
78
81
  &nbsp;</pre></td></tr></table></pre>
79
82
 
80
83
  <div class='push'></div><!-- for sticky footer -->
@@ -82,7 +85,7 @@
82
85
  <div class='footer quiet pad2 space-top1 center small'>
83
86
  Code coverage generated by
84
87
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
85
- at 2025-09-21T17:47:07.632Z
88
+ at 2026-01-08T12:15:46.476Z
86
89
  </div>
87
90
  <script src="../../prettify.js"></script>
88
91
  <script>