@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">90.9% </span>
26
+ <span class="strong">93.05% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>100/110</span>
28
+ <span class='fraction'>67/72</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">90.9% </span>
33
+ <span class="strong">82.85% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>20/22</span>
35
+ <span class='fraction'>29/35</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">87.5% </span>
40
+ <span class="strong">94.11% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>7/8</span>
42
+ <span class='fraction'>16/17</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">90.9% </span>
47
+ <span class="strong">93.05% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>100/110</span>
49
+ <span class='fraction'>67/72</span>
50
50
  </div>
51
51
 
52
52
 
@@ -265,7 +265,176 @@
265
265
  <a name='L200'></a><a href='#L200'>200</a>
266
266
  <a name='L201'></a><a href='#L201'>201</a>
267
267
  <a name='L202'></a><a href='#L202'>202</a>
268
- <a name='L203'></a><a href='#L203'>203</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
268
+ <a name='L203'></a><a href='#L203'>203</a>
269
+ <a name='L204'></a><a href='#L204'>204</a>
270
+ <a name='L205'></a><a href='#L205'>205</a>
271
+ <a name='L206'></a><a href='#L206'>206</a>
272
+ <a name='L207'></a><a href='#L207'>207</a>
273
+ <a name='L208'></a><a href='#L208'>208</a>
274
+ <a name='L209'></a><a href='#L209'>209</a>
275
+ <a name='L210'></a><a href='#L210'>210</a>
276
+ <a name='L211'></a><a href='#L211'>211</a>
277
+ <a name='L212'></a><a href='#L212'>212</a>
278
+ <a name='L213'></a><a href='#L213'>213</a>
279
+ <a name='L214'></a><a href='#L214'>214</a>
280
+ <a name='L215'></a><a href='#L215'>215</a>
281
+ <a name='L216'></a><a href='#L216'>216</a>
282
+ <a name='L217'></a><a href='#L217'>217</a>
283
+ <a name='L218'></a><a href='#L218'>218</a>
284
+ <a name='L219'></a><a href='#L219'>219</a>
285
+ <a name='L220'></a><a href='#L220'>220</a>
286
+ <a name='L221'></a><a href='#L221'>221</a>
287
+ <a name='L222'></a><a href='#L222'>222</a>
288
+ <a name='L223'></a><a href='#L223'>223</a>
289
+ <a name='L224'></a><a href='#L224'>224</a>
290
+ <a name='L225'></a><a href='#L225'>225</a>
291
+ <a name='L226'></a><a href='#L226'>226</a>
292
+ <a name='L227'></a><a href='#L227'>227</a>
293
+ <a name='L228'></a><a href='#L228'>228</a>
294
+ <a name='L229'></a><a href='#L229'>229</a>
295
+ <a name='L230'></a><a href='#L230'>230</a>
296
+ <a name='L231'></a><a href='#L231'>231</a>
297
+ <a name='L232'></a><a href='#L232'>232</a>
298
+ <a name='L233'></a><a href='#L233'>233</a>
299
+ <a name='L234'></a><a href='#L234'>234</a>
300
+ <a name='L235'></a><a href='#L235'>235</a>
301
+ <a name='L236'></a><a href='#L236'>236</a>
302
+ <a name='L237'></a><a href='#L237'>237</a>
303
+ <a name='L238'></a><a href='#L238'>238</a>
304
+ <a name='L239'></a><a href='#L239'>239</a>
305
+ <a name='L240'></a><a href='#L240'>240</a>
306
+ <a name='L241'></a><a href='#L241'>241</a>
307
+ <a name='L242'></a><a href='#L242'>242</a>
308
+ <a name='L243'></a><a href='#L243'>243</a>
309
+ <a name='L244'></a><a href='#L244'>244</a>
310
+ <a name='L245'></a><a href='#L245'>245</a>
311
+ <a name='L246'></a><a href='#L246'>246</a>
312
+ <a name='L247'></a><a href='#L247'>247</a>
313
+ <a name='L248'></a><a href='#L248'>248</a>
314
+ <a name='L249'></a><a href='#L249'>249</a>
315
+ <a name='L250'></a><a href='#L250'>250</a>
316
+ <a name='L251'></a><a href='#L251'>251</a>
317
+ <a name='L252'></a><a href='#L252'>252</a>
318
+ <a name='L253'></a><a href='#L253'>253</a>
319
+ <a name='L254'></a><a href='#L254'>254</a>
320
+ <a name='L255'></a><a href='#L255'>255</a>
321
+ <a name='L256'></a><a href='#L256'>256</a>
322
+ <a name='L257'></a><a href='#L257'>257</a>
323
+ <a name='L258'></a><a href='#L258'>258</a>
324
+ <a name='L259'></a><a href='#L259'>259</a>
325
+ <a name='L260'></a><a href='#L260'>260</a>
326
+ <a name='L261'></a><a href='#L261'>261</a>
327
+ <a name='L262'></a><a href='#L262'>262</a>
328
+ <a name='L263'></a><a href='#L263'>263</a>
329
+ <a name='L264'></a><a href='#L264'>264</a>
330
+ <a name='L265'></a><a href='#L265'>265</a>
331
+ <a name='L266'></a><a href='#L266'>266</a>
332
+ <a name='L267'></a><a href='#L267'>267</a>
333
+ <a name='L268'></a><a href='#L268'>268</a>
334
+ <a name='L269'></a><a href='#L269'>269</a>
335
+ <a name='L270'></a><a href='#L270'>270</a>
336
+ <a name='L271'></a><a href='#L271'>271</a>
337
+ <a name='L272'></a><a href='#L272'>272</a>
338
+ <a name='L273'></a><a href='#L273'>273</a>
339
+ <a name='L274'></a><a href='#L274'>274</a>
340
+ <a name='L275'></a><a href='#L275'>275</a>
341
+ <a name='L276'></a><a href='#L276'>276</a>
342
+ <a name='L277'></a><a href='#L277'>277</a>
343
+ <a name='L278'></a><a href='#L278'>278</a>
344
+ <a name='L279'></a><a href='#L279'>279</a>
345
+ <a name='L280'></a><a href='#L280'>280</a>
346
+ <a name='L281'></a><a href='#L281'>281</a>
347
+ <a name='L282'></a><a href='#L282'>282</a>
348
+ <a name='L283'></a><a href='#L283'>283</a>
349
+ <a name='L284'></a><a href='#L284'>284</a>
350
+ <a name='L285'></a><a href='#L285'>285</a>
351
+ <a name='L286'></a><a href='#L286'>286</a>
352
+ <a name='L287'></a><a href='#L287'>287</a>
353
+ <a name='L288'></a><a href='#L288'>288</a>
354
+ <a name='L289'></a><a href='#L289'>289</a>
355
+ <a name='L290'></a><a href='#L290'>290</a>
356
+ <a name='L291'></a><a href='#L291'>291</a>
357
+ <a name='L292'></a><a href='#L292'>292</a>
358
+ <a name='L293'></a><a href='#L293'>293</a>
359
+ <a name='L294'></a><a href='#L294'>294</a>
360
+ <a name='L295'></a><a href='#L295'>295</a>
361
+ <a name='L296'></a><a href='#L296'>296</a>
362
+ <a name='L297'></a><a href='#L297'>297</a>
363
+ <a name='L298'></a><a href='#L298'>298</a>
364
+ <a name='L299'></a><a href='#L299'>299</a>
365
+ <a name='L300'></a><a href='#L300'>300</a>
366
+ <a name='L301'></a><a href='#L301'>301</a>
367
+ <a name='L302'></a><a href='#L302'>302</a>
368
+ <a name='L303'></a><a href='#L303'>303</a>
369
+ <a name='L304'></a><a href='#L304'>304</a>
370
+ <a name='L305'></a><a href='#L305'>305</a>
371
+ <a name='L306'></a><a href='#L306'>306</a>
372
+ <a name='L307'></a><a href='#L307'>307</a>
373
+ <a name='L308'></a><a href='#L308'>308</a>
374
+ <a name='L309'></a><a href='#L309'>309</a>
375
+ <a name='L310'></a><a href='#L310'>310</a>
376
+ <a name='L311'></a><a href='#L311'>311</a>
377
+ <a name='L312'></a><a href='#L312'>312</a>
378
+ <a name='L313'></a><a href='#L313'>313</a>
379
+ <a name='L314'></a><a href='#L314'>314</a>
380
+ <a name='L315'></a><a href='#L315'>315</a>
381
+ <a name='L316'></a><a href='#L316'>316</a>
382
+ <a name='L317'></a><a href='#L317'>317</a>
383
+ <a name='L318'></a><a href='#L318'>318</a>
384
+ <a name='L319'></a><a href='#L319'>319</a>
385
+ <a name='L320'></a><a href='#L320'>320</a>
386
+ <a name='L321'></a><a href='#L321'>321</a>
387
+ <a name='L322'></a><a href='#L322'>322</a>
388
+ <a name='L323'></a><a href='#L323'>323</a>
389
+ <a name='L324'></a><a href='#L324'>324</a>
390
+ <a name='L325'></a><a href='#L325'>325</a>
391
+ <a name='L326'></a><a href='#L326'>326</a>
392
+ <a name='L327'></a><a href='#L327'>327</a>
393
+ <a name='L328'></a><a href='#L328'>328</a>
394
+ <a name='L329'></a><a href='#L329'>329</a>
395
+ <a name='L330'></a><a href='#L330'>330</a>
396
+ <a name='L331'></a><a href='#L331'>331</a>
397
+ <a name='L332'></a><a href='#L332'>332</a>
398
+ <a name='L333'></a><a href='#L333'>333</a>
399
+ <a name='L334'></a><a href='#L334'>334</a>
400
+ <a name='L335'></a><a href='#L335'>335</a>
401
+ <a name='L336'></a><a href='#L336'>336</a>
402
+ <a name='L337'></a><a href='#L337'>337</a>
403
+ <a name='L338'></a><a href='#L338'>338</a>
404
+ <a name='L339'></a><a href='#L339'>339</a>
405
+ <a name='L340'></a><a href='#L340'>340</a>
406
+ <a name='L341'></a><a href='#L341'>341</a>
407
+ <a name='L342'></a><a href='#L342'>342</a>
408
+ <a name='L343'></a><a href='#L343'>343</a>
409
+ <a name='L344'></a><a href='#L344'>344</a>
410
+ <a name='L345'></a><a href='#L345'>345</a>
411
+ <a name='L346'></a><a href='#L346'>346</a>
412
+ <a name='L347'></a><a href='#L347'>347</a>
413
+ <a name='L348'></a><a href='#L348'>348</a>
414
+ <a name='L349'></a><a href='#L349'>349</a>
415
+ <a name='L350'></a><a href='#L350'>350</a>
416
+ <a name='L351'></a><a href='#L351'>351</a>
417
+ <a name='L352'></a><a href='#L352'>352</a>
418
+ <a name='L353'></a><a href='#L353'>353</a>
419
+ <a name='L354'></a><a href='#L354'>354</a>
420
+ <a name='L355'></a><a href='#L355'>355</a>
421
+ <a name='L356'></a><a href='#L356'>356</a>
422
+ <a name='L357'></a><a href='#L357'>357</a>
423
+ <a name='L358'></a><a href='#L358'>358</a>
424
+ <a name='L359'></a><a href='#L359'>359</a>
425
+ <a name='L360'></a><a href='#L360'>360</a>
426
+ <a name='L361'></a><a href='#L361'>361</a>
427
+ <a name='L362'></a><a href='#L362'>362</a>
428
+ <a name='L363'></a><a href='#L363'>363</a>
429
+ <a name='L364'></a><a href='#L364'>364</a>
430
+ <a name='L365'></a><a href='#L365'>365</a>
431
+ <a name='L366'></a><a href='#L366'>366</a>
432
+ <a name='L367'></a><a href='#L367'>367</a>
433
+ <a name='L368'></a><a href='#L368'>368</a>
434
+ <a name='L369'></a><a href='#L369'>369</a>
435
+ <a name='L370'></a><a href='#L370'>370</a>
436
+ <a name='L371'></a><a href='#L371'>371</a>
437
+ <a name='L372'></a><a href='#L372'>372</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
269
438
  <span class="cline-any cline-neutral">&nbsp;</span>
270
439
  <span class="cline-any cline-neutral">&nbsp;</span>
271
440
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -278,7 +447,6 @@
278
447
  <span class="cline-any cline-neutral">&nbsp;</span>
279
448
  <span class="cline-any cline-neutral">&nbsp;</span>
280
449
  <span class="cline-any cline-neutral">&nbsp;</span>
281
- <span class="cline-any cline-yes">1x</span>
282
450
  <span class="cline-any cline-neutral">&nbsp;</span>
283
451
  <span class="cline-any cline-neutral">&nbsp;</span>
284
452
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -337,158 +505,352 @@
337
505
  <span class="cline-any cline-neutral">&nbsp;</span>
338
506
  <span class="cline-any cline-neutral">&nbsp;</span>
339
507
  <span class="cline-any cline-neutral">&nbsp;</span>
340
- <span class="cline-any cline-yes">1x</span>
341
- <span class="cline-any cline-yes">15x</span>
342
- <span class="cline-any cline-neutral">&nbsp;</span>
343
- <span class="cline-any cline-yes">15x</span>
344
- <span class="cline-any cline-yes">665x</span>
345
- <span class="cline-any cline-yes">665x</span>
346
- <span class="cline-any cline-yes">665x</span>
347
- <span class="cline-any cline-yes">665x</span>
348
- <span class="cline-any cline-yes">665x</span>
349
- <span class="cline-any cline-yes">665x</span>
350
- <span class="cline-any cline-yes">15x</span>
351
- <span class="cline-any cline-yes">154x</span>
352
- <span class="cline-any cline-yes">1x</span>
353
- <span class="cline-any cline-yes">1x</span>
354
- <span class="cline-any cline-yes">1x</span>
355
- <span class="cline-any cline-yes">1x</span>
356
- <span class="cline-any cline-yes">153x</span>
357
- <span class="cline-any cline-yes">154x</span>
358
508
  <span class="cline-any cline-neutral">&nbsp;</span>
359
- <span class="cline-any cline-yes">15x</span>
360
- <span class="cline-any cline-yes">15x</span>
361
509
  <span class="cline-any cline-neutral">&nbsp;</span>
362
- <span class="cline-any cline-yes">15x</span>
363
- <span class="cline-any cline-yes">13x</span>
364
510
  <span class="cline-any cline-neutral">&nbsp;</span>
365
511
  <span class="cline-any cline-neutral">&nbsp;</span>
366
512
  <span class="cline-any cline-neutral">&nbsp;</span>
367
513
  <span class="cline-any cline-neutral">&nbsp;</span>
368
- <span class="cline-any cline-yes">13x</span>
369
- <span class="cline-any cline-yes">13x</span>
370
- <span class="cline-any cline-yes">13x</span>
371
- <span class="cline-any cline-yes">1x</span>
372
- <span class="cline-any cline-yes">1x</span>
373
- <span class="cline-any cline-yes">1x</span>
374
- <span class="cline-any cline-yes">1x</span>
375
- <span class="cline-any cline-yes">12x</span>
376
- <span class="cline-any cline-yes">1x</span>
377
- <span class="cline-any cline-yes">1x</span>
378
- <span class="cline-any cline-yes">1x</span>
379
- <span class="cline-any cline-no">&nbsp;</span>
514
+ <span class="cline-any cline-neutral">&nbsp;</span>
515
+ <span class="cline-any cline-neutral">&nbsp;</span>
516
+ <span class="cline-any cline-neutral">&nbsp;</span>
517
+ <span class="cline-any cline-neutral">&nbsp;</span>
518
+ <span class="cline-any cline-neutral">&nbsp;</span>
519
+ <span class="cline-any cline-neutral">&nbsp;</span>
520
+ <span class="cline-any cline-neutral">&nbsp;</span>
521
+ <span class="cline-any cline-neutral">&nbsp;</span>
522
+ <span class="cline-any cline-neutral">&nbsp;</span>
523
+ <span class="cline-any cline-neutral">&nbsp;</span>
524
+ <span class="cline-any cline-neutral">&nbsp;</span>
525
+ <span class="cline-any cline-neutral">&nbsp;</span>
526
+ <span class="cline-any cline-neutral">&nbsp;</span>
527
+ <span class="cline-any cline-neutral">&nbsp;</span>
528
+ <span class="cline-any cline-neutral">&nbsp;</span>
529
+ <span class="cline-any cline-neutral">&nbsp;</span>
530
+ <span class="cline-any cline-neutral">&nbsp;</span>
531
+ <span class="cline-any cline-neutral">&nbsp;</span>
532
+ <span class="cline-any cline-neutral">&nbsp;</span>
533
+ <span class="cline-any cline-neutral">&nbsp;</span>
534
+ <span class="cline-any cline-neutral">&nbsp;</span>
535
+ <span class="cline-any cline-neutral">&nbsp;</span>
536
+ <span class="cline-any cline-neutral">&nbsp;</span>
537
+ <span class="cline-any cline-neutral">&nbsp;</span>
538
+ <span class="cline-any cline-neutral">&nbsp;</span>
539
+ <span class="cline-any cline-neutral">&nbsp;</span>
540
+ <span class="cline-any cline-neutral">&nbsp;</span>
541
+ <span class="cline-any cline-neutral">&nbsp;</span>
542
+ <span class="cline-any cline-neutral">&nbsp;</span>
543
+ <span class="cline-any cline-neutral">&nbsp;</span>
544
+ <span class="cline-any cline-neutral">&nbsp;</span>
545
+ <span class="cline-any cline-neutral">&nbsp;</span>
546
+ <span class="cline-any cline-neutral">&nbsp;</span>
547
+ <span class="cline-any cline-neutral">&nbsp;</span>
548
+ <span class="cline-any cline-neutral">&nbsp;</span>
549
+ <span class="cline-any cline-neutral">&nbsp;</span>
550
+ <span class="cline-any cline-neutral">&nbsp;</span>
551
+ <span class="cline-any cline-neutral">&nbsp;</span>
552
+ <span class="cline-any cline-neutral">&nbsp;</span>
553
+ <span class="cline-any cline-neutral">&nbsp;</span>
554
+ <span class="cline-any cline-neutral">&nbsp;</span>
555
+ <span class="cline-any cline-neutral">&nbsp;</span>
556
+ <span class="cline-any cline-neutral">&nbsp;</span>
557
+ <span class="cline-any cline-neutral">&nbsp;</span>
558
+ <span class="cline-any cline-neutral">&nbsp;</span>
559
+ <span class="cline-any cline-neutral">&nbsp;</span>
560
+ <span class="cline-any cline-neutral">&nbsp;</span>
561
+ <span class="cline-any cline-neutral">&nbsp;</span>
562
+ <span class="cline-any cline-neutral">&nbsp;</span>
563
+ <span class="cline-any cline-neutral">&nbsp;</span>
564
+ <span class="cline-any cline-neutral">&nbsp;</span>
565
+ <span class="cline-any cline-neutral">&nbsp;</span>
566
+ <span class="cline-any cline-neutral">&nbsp;</span>
567
+ <span class="cline-any cline-neutral">&nbsp;</span>
568
+ <span class="cline-any cline-neutral">&nbsp;</span>
569
+ <span class="cline-any cline-neutral">&nbsp;</span>
570
+ <span class="cline-any cline-neutral">&nbsp;</span>
571
+ <span class="cline-any cline-neutral">&nbsp;</span>
572
+ <span class="cline-any cline-neutral">&nbsp;</span>
573
+ <span class="cline-any cline-neutral">&nbsp;</span>
574
+ <span class="cline-any cline-neutral">&nbsp;</span>
575
+ <span class="cline-any cline-neutral">&nbsp;</span>
576
+ <span class="cline-any cline-neutral">&nbsp;</span>
577
+ <span class="cline-any cline-neutral">&nbsp;</span>
578
+ <span class="cline-any cline-neutral">&nbsp;</span>
579
+ <span class="cline-any cline-neutral">&nbsp;</span>
580
+ <span class="cline-any cline-neutral">&nbsp;</span>
581
+ <span class="cline-any cline-neutral">&nbsp;</span>
582
+ <span class="cline-any cline-neutral">&nbsp;</span>
583
+ <span class="cline-any cline-neutral">&nbsp;</span>
584
+ <span class="cline-any cline-neutral">&nbsp;</span>
585
+ <span class="cline-any cline-neutral">&nbsp;</span>
586
+ <span class="cline-any cline-neutral">&nbsp;</span>
587
+ <span class="cline-any cline-neutral">&nbsp;</span>
588
+ <span class="cline-any cline-yes">143x</span>
589
+ <span class="cline-any cline-neutral">&nbsp;</span>
590
+ <span class="cline-any cline-neutral">&nbsp;</span>
591
+ <span class="cline-any cline-neutral">&nbsp;</span>
592
+ <span class="cline-any cline-neutral">&nbsp;</span>
593
+ <span class="cline-any cline-yes">1349x</span>
594
+ <span class="cline-any cline-yes">1349x</span>
595
+ <span class="cline-any cline-yes">1349x</span>
596
+ <span class="cline-any cline-neutral">&nbsp;</span>
597
+ <span class="cline-any cline-neutral">&nbsp;</span>
598
+ <span class="cline-any cline-yes">467x</span>
380
599
  <span class="cline-any cline-no">&nbsp;</span>
600
+ <span class="cline-any cline-neutral">&nbsp;</span>
601
+ <span class="cline-any cline-neutral">&nbsp;</span>
602
+ <span class="cline-any cline-neutral">&nbsp;</span>
603
+ <span class="cline-any cline-yes">467x</span>
604
+ <span class="cline-any cline-neutral">&nbsp;</span>
605
+ <span class="cline-any cline-neutral">&nbsp;</span>
606
+ <span class="cline-any cline-yes">143x</span>
607
+ <span class="cline-any cline-yes">143x</span>
608
+ <span class="cline-any cline-neutral">&nbsp;</span>
609
+ <span class="cline-any cline-neutral">&nbsp;</span>
610
+ <span class="cline-any cline-neutral">&nbsp;</span>
611
+ <span class="cline-any cline-neutral">&nbsp;</span>
612
+ <span class="cline-any cline-neutral">&nbsp;</span>
613
+ <span class="cline-any cline-neutral">&nbsp;</span>
614
+ <span class="cline-any cline-yes">310x</span>
381
615
  <span class="cline-any cline-no">&nbsp;</span>
616
+ <span class="cline-any cline-neutral">&nbsp;</span>
617
+ <span class="cline-any cline-neutral">&nbsp;</span>
618
+ <span class="cline-any cline-neutral">&nbsp;</span>
619
+ <span class="cline-any cline-yes">310x</span>
620
+ <span class="cline-any cline-yes">143x</span>
621
+ <span class="cline-any cline-yes">143x</span>
622
+ <span class="cline-any cline-yes">143x</span>
382
623
  <span class="cline-any cline-no">&nbsp;</span>
383
- <span class="cline-any cline-yes">1x</span>
624
+ <span class="cline-any cline-neutral">&nbsp;</span>
625
+ <span class="cline-any cline-neutral">&nbsp;</span>
626
+ <span class="cline-any cline-neutral">&nbsp;</span>
627
+ <span class="cline-any cline-yes">143x</span>
628
+ <span class="cline-any cline-neutral">&nbsp;</span>
629
+ <span class="cline-any cline-yes">167x</span>
630
+ <span class="cline-any cline-yes">167x</span>
631
+ <span class="cline-any cline-neutral">&nbsp;</span>
632
+ <span class="cline-any cline-neutral">&nbsp;</span>
633
+ <span class="cline-any cline-neutral">&nbsp;</span>
634
+ <span class="cline-any cline-neutral">&nbsp;</span>
635
+ <span class="cline-any cline-yes">167x</span>
636
+ <span class="cline-any cline-yes">167x</span>
637
+ <span class="cline-any cline-neutral">&nbsp;</span>
638
+ <span class="cline-any cline-neutral">&nbsp;</span>
639
+ <span class="cline-any cline-yes">160x</span>
640
+ <span class="cline-any cline-yes">160x</span>
641
+ <span class="cline-any cline-neutral">&nbsp;</span>
642
+ <span class="cline-any cline-neutral">&nbsp;</span>
643
+ <span class="cline-any cline-neutral">&nbsp;</span>
644
+ <span class="cline-any cline-yes">7x</span>
645
+ <span class="cline-any cline-neutral">&nbsp;</span>
646
+ <span class="cline-any cline-neutral">&nbsp;</span>
647
+ <span class="cline-any cline-yes">167x</span>
648
+ <span class="cline-any cline-neutral">&nbsp;</span>
649
+ <span class="cline-any cline-neutral">&nbsp;</span>
650
+ <span class="cline-any cline-neutral">&nbsp;</span>
651
+ <span class="cline-any cline-yes">310x</span>
652
+ <span class="cline-any cline-neutral">&nbsp;</span>
653
+ <span class="cline-any cline-neutral">&nbsp;</span>
654
+ <span class="cline-any cline-neutral">&nbsp;</span>
655
+ <span class="cline-any cline-yes">410x</span>
656
+ <span class="cline-any cline-neutral">&nbsp;</span>
657
+ <span class="cline-any cline-neutral">&nbsp;</span>
658
+ <span class="cline-any cline-yes">300x</span>
659
+ <span class="cline-any cline-neutral">&nbsp;</span>
660
+ <span class="cline-any cline-neutral">&nbsp;</span>
661
+ <span class="cline-any cline-yes">310x</span>
662
+ <span class="cline-any cline-yes">310x</span>
663
+ <span class="cline-any cline-neutral">&nbsp;</span>
664
+ <span class="cline-any cline-yes">310x</span>
665
+ <span class="cline-any cline-neutral">&nbsp;</span>
666
+ <span class="cline-any cline-neutral">&nbsp;</span>
667
+ <span class="cline-any cline-neutral">&nbsp;</span>
668
+ <span class="cline-any cline-neutral">&nbsp;</span>
669
+ <span class="cline-any cline-neutral">&nbsp;</span>
670
+ <span class="cline-any cline-neutral">&nbsp;</span>
671
+ <span class="cline-any cline-neutral">&nbsp;</span>
672
+ <span class="cline-any cline-neutral">&nbsp;</span>
673
+ <span class="cline-any cline-neutral">&nbsp;</span>
674
+ <span class="cline-any cline-neutral">&nbsp;</span>
675
+ <span class="cline-any cline-yes">12x</span>
384
676
  <span class="cline-any cline-yes">1x</span>
385
677
  <span class="cline-any cline-neutral">&nbsp;</span>
678
+ <span class="cline-any cline-neutral">&nbsp;</span>
679
+ <span class="cline-any cline-neutral">&nbsp;</span>
680
+ <span class="cline-any cline-neutral">&nbsp;</span>
386
681
  <span class="cline-any cline-yes">11x</span>
387
- <span class="cline-any cline-yes">11x</span>
388
- <span class="cline-any cline-yes">11x</span>
389
- <span class="cline-any cline-yes">11x</span>
390
- <span class="cline-any cline-yes">11x</span>
391
- <span class="cline-any cline-yes">11x</span>
392
682
  <span class="cline-any cline-neutral">&nbsp;</span>
683
+ <span class="cline-any cline-neutral">&nbsp;</span>
684
+ <span class="cline-any cline-yes">12x</span>
685
+ <span class="cline-any cline-yes">12x</span>
393
686
  <span class="cline-any cline-yes">11x</span>
394
- <span class="cline-any cline-yes">13x</span>
395
- <span class="cline-any cline-neutral">&nbsp;</span>
396
- <span class="cline-any cline-yes">15x</span>
397
- <span class="cline-any cline-yes">294x</span>
398
- <span class="cline-any cline-yes">334x</span>
399
- <span class="cline-any cline-yes">334x</span>
400
- <span class="cline-any cline-yes">334x</span>
401
- <span class="cline-any cline-yes">334x</span>
402
- <span class="cline-any cline-yes">40x</span>
403
- <span class="cline-any cline-yes">40x</span>
404
- <span class="cline-any cline-yes">40x</span>
405
- <span class="cline-any cline-yes">40x</span>
406
- <span class="cline-any cline-yes">294x</span>
407
- <span class="cline-any cline-yes">294x</span>
408
- <span class="cline-any cline-yes">294x</span>
409
- <span class="cline-any cline-yes">294x</span>
410
- <span class="cline-any cline-yes">294x</span>
411
- <span class="cline-any cline-yes">334x</span>
412
- <span class="cline-any cline-yes">43x</span>
413
- <span class="cline-any cline-yes">43x</span>
414
- <span class="cline-any cline-yes">334x</span>
415
- <span class="cline-any cline-yes">334x</span>
416
- <span class="cline-any cline-yes">334x</span>
417
- <span class="cline-any cline-yes">334x</span>
418
- <span class="cline-any cline-yes">334x</span>
419
- <span class="cline-any cline-yes">334x</span>
420
- <span class="cline-any cline-yes">334x</span>
421
- <span class="cline-any cline-yes">334x</span>
422
- <span class="cline-any cline-yes">334x</span>
423
- <span class="cline-any cline-yes">294x</span>
424
- <span class="cline-any cline-neutral">&nbsp;</span>
425
- <span class="cline-any cline-yes">15x</span>
426
- <span class="cline-any cline-neutral">&nbsp;</span>
427
- <span class="cline-any cline-neutral">&nbsp;</span>
428
- <span class="cline-any cline-neutral">&nbsp;</span>
429
- <span class="cline-any cline-neutral">&nbsp;</span>
430
- <span class="cline-any cline-neutral">&nbsp;</span>
431
- <span class="cline-any cline-neutral">&nbsp;</span>
432
- <span class="cline-any cline-yes">100x</span>
433
- <span class="cline-any cline-neutral">&nbsp;</span>
434
- <span class="cline-any cline-yes">100x</span>
435
- <span class="cline-any cline-neutral">&nbsp;</span>
436
- <span class="cline-any cline-yes">100x</span>
437
- <span class="cline-any cline-yes">100x</span>
438
- <span class="cline-any cline-yes">100x</span>
439
- <span class="cline-any cline-yes">100x</span>
440
- <span class="cline-any cline-yes">100x</span>
441
- <span class="cline-any cline-yes">43x</span>
442
- <span class="cline-any cline-yes">43x</span>
443
- <span class="cline-any cline-yes">43x</span>
444
- <span class="cline-any cline-yes">43x</span>
445
- <span class="cline-any cline-no">&nbsp;</span>
446
- <span class="cline-any cline-no">&nbsp;</span>
447
- <span class="cline-any cline-yes">43x</span>
448
- <span class="cline-any cline-yes">43x</span>
449
- <span class="cline-any cline-yes">43x</span>
450
- <span class="cline-any cline-yes">43x</span>
451
- <span class="cline-any cline-no">&nbsp;</span>
452
- <span class="cline-any cline-no">&nbsp;</span>
687
+ <span class="cline-any cline-neutral">&nbsp;</span>
453
688
  <span class="cline-any cline-no">&nbsp;</span>
689
+ <span class="cline-any cline-neutral">&nbsp;</span>
690
+ <span class="cline-any cline-yes">11x</span>
691
+ <span class="cline-any cline-neutral">&nbsp;</span>
692
+ <span class="cline-any cline-neutral">&nbsp;</span>
693
+ <span class="cline-any cline-neutral">&nbsp;</span>
694
+ <span class="cline-any cline-neutral">&nbsp;</span>
695
+ <span class="cline-any cline-yes">542x</span>
696
+ <span class="cline-any cline-yes">681x</span>
697
+ <span class="cline-any cline-yes">681x</span>
698
+ <span class="cline-any cline-yes">681x</span>
699
+ <span class="cline-any cline-yes">681x</span>
700
+ <span class="cline-any cline-neutral">&nbsp;</span>
701
+ <span class="cline-any cline-neutral">&nbsp;</span>
702
+ <span class="cline-any cline-neutral">&nbsp;</span>
703
+ <span class="cline-any cline-neutral">&nbsp;</span>
704
+ <span class="cline-any cline-neutral">&nbsp;</span>
705
+ <span class="cline-any cline-neutral">&nbsp;</span>
706
+ <span class="cline-any cline-neutral">&nbsp;</span>
707
+ <span class="cline-any cline-neutral">&nbsp;</span>
708
+ <span class="cline-any cline-neutral">&nbsp;</span>
709
+ <span class="cline-any cline-yes">681x</span>
710
+ <span class="cline-any cline-yes">140x</span>
711
+ <span class="cline-any cline-neutral">&nbsp;</span>
712
+ <span class="cline-any cline-yes">681x</span>
713
+ <span class="cline-any cline-yes">681x</span>
714
+ <span class="cline-any cline-yes">681x</span>
715
+ <span class="cline-any cline-neutral">&nbsp;</span>
716
+ <span class="cline-any cline-neutral">&nbsp;</span>
717
+ <span class="cline-any cline-neutral">&nbsp;</span>
718
+ <span class="cline-any cline-yes">681x</span>
719
+ <span class="cline-any cline-yes">681x</span>
720
+ <span class="cline-any cline-neutral">&nbsp;</span>
721
+ <span class="cline-any cline-neutral">&nbsp;</span>
722
+ <span class="cline-any cline-neutral">&nbsp;</span>
723
+ <span class="cline-any cline-neutral">&nbsp;</span>
724
+ <span class="cline-any cline-neutral">&nbsp;</span>
725
+ <span class="cline-any cline-neutral">&nbsp;</span>
726
+ <span class="cline-any cline-neutral">&nbsp;</span>
727
+ <span class="cline-any cline-neutral">&nbsp;</span>
728
+ <span class="cline-any cline-neutral">&nbsp;</span>
729
+ <span class="cline-any cline-neutral">&nbsp;</span>
730
+ <span class="cline-any cline-neutral">&nbsp;</span>
731
+ <span class="cline-any cline-neutral">&nbsp;</span>
732
+ <span class="cline-any cline-yes">301x</span>
733
+ <span class="cline-any cline-neutral">&nbsp;</span>
734
+ <span class="cline-any cline-yes">301x</span>
735
+ <span class="cline-any cline-yes">1x</span>
736
+ <span class="cline-any cline-neutral">&nbsp;</span>
737
+ <span class="cline-any cline-neutral">&nbsp;</span>
738
+ <span class="cline-any cline-neutral">&nbsp;</span>
739
+ <span class="cline-any cline-neutral">&nbsp;</span>
740
+ <span class="cline-any cline-neutral">&nbsp;</span>
741
+ <span class="cline-any cline-yes">300x</span>
742
+ <span class="cline-any cline-yes">300x</span>
743
+ <span class="cline-any cline-neutral">&nbsp;</span>
744
+ <span class="cline-any cline-neutral">&nbsp;</span>
745
+ <span class="cline-any cline-neutral">&nbsp;</span>
746
+ <span class="cline-any cline-neutral">&nbsp;</span>
747
+ <span class="cline-any cline-neutral">&nbsp;</span>
748
+ <span class="cline-any cline-neutral">&nbsp;</span>
749
+ <span class="cline-any cline-yes">301x</span>
750
+ <span class="cline-any cline-neutral">&nbsp;</span>
751
+ <span class="cline-any cline-neutral">&nbsp;</span>
752
+ <span class="cline-any cline-yes">301x</span>
753
+ <span class="cline-any cline-yes">17x</span>
754
+ <span class="cline-any cline-neutral">&nbsp;</span>
755
+ <span class="cline-any cline-neutral">&nbsp;</span>
756
+ <span class="cline-any cline-neutral">&nbsp;</span>
757
+ <span class="cline-any cline-yes">282x</span>
758
+ <span class="cline-any cline-yes">7x</span>
759
+ <span class="cline-any cline-neutral">&nbsp;</span>
760
+ <span class="cline-any cline-yes">275x</span>
761
+ <span class="cline-any cline-yes">135x</span>
762
+ <span class="cline-any cline-neutral">&nbsp;</span>
763
+ <span class="cline-any cline-neutral">&nbsp;</span>
764
+ <span class="cline-any cline-neutral">&nbsp;</span>
765
+ <span class="cline-any cline-yes">140x</span>
766
+ <span class="cline-any cline-yes">140x</span>
767
+ <span class="cline-any cline-neutral">&nbsp;</span>
768
+ <span class="cline-any cline-neutral">&nbsp;</span>
769
+ <span class="cline-any cline-neutral">&nbsp;</span>
770
+ <span class="cline-any cline-yes">140x</span>
771
+ <span class="cline-any cline-neutral">&nbsp;</span>
772
+ <span class="cline-any cline-neutral">&nbsp;</span>
773
+ <span class="cline-any cline-neutral">&nbsp;</span>
454
774
  <span class="cline-any cline-no">&nbsp;</span>
455
- <span class="cline-any cline-yes">43x</span>
456
- <span class="cline-any cline-yes">43x</span>
457
- <span class="cline-any cline-yes">43x</span>
458
- <span class="cline-any cline-yes">55x</span>
459
- <span class="cline-any cline-yes">100x</span>
460
- <span class="cline-any cline-neutral">&nbsp;</span>
461
- <span class="cline-any cline-yes">15x</span>
462
- <span class="cline-any cline-yes">15x</span>
463
- <span class="cline-any cline-yes">15x</span>
464
- <span class="cline-any cline-yes">15x</span>
465
- <span class="cline-any cline-yes">15x</span>
466
- <span class="cline-any cline-yes">15x</span>
467
- <span class="cline-any cline-neutral">&nbsp;</span>
468
- <span class="cline-any cline-yes">15x</span>
469
- <span class="cline-any cline-yes">15x</span>
775
+ <span class="cline-any cline-neutral">&nbsp;</span>
776
+ <span class="cline-any cline-neutral">&nbsp;</span>
777
+ <span class="cline-any cline-neutral">&nbsp;</span>
778
+ <span class="cline-any cline-neutral">&nbsp;</span>
779
+ <span class="cline-any cline-neutral">&nbsp;</span>
780
+ <span class="cline-any cline-neutral">&nbsp;</span>
781
+ <span class="cline-any cline-neutral">&nbsp;</span>
782
+ <span class="cline-any cline-neutral">&nbsp;</span>
783
+ <span class="cline-any cline-neutral">&nbsp;</span>
784
+ <span class="cline-any cline-neutral">&nbsp;</span>
785
+ <span class="cline-any cline-neutral">&nbsp;</span>
786
+ <span class="cline-any cline-neutral">&nbsp;</span>
787
+ <span class="cline-any cline-neutral">&nbsp;</span>
788
+ <span class="cline-any cline-neutral">&nbsp;</span>
789
+ <span class="cline-any cline-neutral">&nbsp;</span>
790
+ <span class="cline-any cline-yes">4x</span>
791
+ <span class="cline-any cline-yes">4x</span>
792
+ <span class="cline-any cline-neutral">&nbsp;</span>
793
+ <span class="cline-any cline-neutral">&nbsp;</span>
794
+ <span class="cline-any cline-yes">1x</span>
795
+ <span class="cline-any cline-neutral">&nbsp;</span>
796
+ <span class="cline-any cline-neutral">&nbsp;</span>
797
+ <span class="cline-any cline-neutral">&nbsp;</span>
798
+ <span class="cline-any cline-yes">143x</span>
799
+ <span class="cline-any cline-neutral">&nbsp;</span>
800
+ <span class="cline-any cline-neutral">&nbsp;</span>
801
+ <span class="cline-any cline-neutral">&nbsp;</span>
802
+ <span class="cline-any cline-neutral">&nbsp;</span>
803
+ <span class="cline-any cline-neutral">&nbsp;</span>
804
+ <span class="cline-any cline-neutral">&nbsp;</span>
805
+ <span class="cline-any cline-neutral">&nbsp;</span>
806
+ <span class="cline-any cline-yes">143x</span>
807
+ <span class="cline-any cline-neutral">&nbsp;</span>
470
808
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import type { z, ZodObject, ZodType } from 'zod/v4'
471
809
  &nbsp;
472
- import type { FactoryContext } from '../factory-context.mjs'
810
+ import type {
811
+ Factorable,
812
+ FactorableWithArgs,
813
+ } from '../interfaces/factory.interface.mjs'
814
+ import type { ServiceInitializationContext } from '../internal/context/service-initialization-context.mjs'
473
815
  import type {
474
816
  BoundInjectionToken,
475
817
  ClassType,
818
+ ClassTypeWithArgument,
819
+ ClassTypeWithoutArguments,
476
820
  FactoryInjectionToken,
477
821
  InjectionToken,
478
822
  InjectionTokenSchemaType,
479
- } from '../injection-token.mjs'
480
- import type { Factorable } from '../interfaces/factory.interface.mjs'
481
- import type { InjectState, Join, UnionToArray } from './types.mjs'
823
+ } from '../token/injection-token.mjs'
824
+ import type {
825
+ InjectRequest,
826
+ InjectState,
827
+ Join,
828
+ UnionToArray,
829
+ } from './types.mjs'
482
830
  &nbsp;
831
+ import { withoutResolutionContext } from '../internal/context/resolution-context.mjs'
483
832
  import { InjectableTokenMeta } from '../symbols/index.mjs'
484
833
  &nbsp;
485
834
  export interface Injectors {
486
835
  // #1 Simple class
487
- asyncInject&lt;T extends ClassType&gt;(
836
+ asyncInject&lt;T extends ClassTypeWithoutArguments&gt;(
488
837
  token: T,
489
838
  ): InstanceType&lt;T&gt; extends Factorable&lt;infer R&gt;
490
839
  ? Promise&lt;R&gt;
491
840
  : Promise&lt;InstanceType&lt;T&gt;&gt;
841
+ asyncInject&lt;Args, T extends ClassTypeWithArgument&lt;Args&gt;&gt;(
842
+ token: T,
843
+ args: Args,
844
+ ): Promise&lt;InstanceType&lt;T&gt;&gt;
845
+ asyncInject&lt;
846
+ Schema extends InjectionTokenSchemaType,
847
+ R,
848
+ T extends FactorableWithArgs&lt;R, Schema&gt;,
849
+ &gt;(
850
+ token: T,
851
+ args: z.input&lt;Schema&gt;,
852
+ ): Promise&lt;R&gt;
853
+ &nbsp;
492
854
  // #2 Token with required Schema
493
855
  asyncInject&lt;T, S extends InjectionTokenSchemaType&gt;(
494
856
  token: InjectionToken&lt;T, S&gt;,
@@ -510,9 +872,22 @@ export interface Injectors {
510
872
  asyncInject&lt;T&gt;(token: BoundInjectionToken&lt;T, any&gt;): Promise&lt;T&gt;
511
873
  asyncInject&lt;T&gt;(token: FactoryInjectionToken&lt;T, any&gt;): Promise&lt;T&gt;
512
874
  &nbsp;
513
- inject&lt;T extends ClassType&gt;(
875
+ inject&lt;T extends ClassTypeWithoutArguments&gt;(
514
876
  token: T,
515
877
  ): InstanceType&lt;T&gt; extends Factorable&lt;infer R&gt; ? R : InstanceType&lt;T&gt;
878
+ inject&lt;Args, T extends ClassTypeWithArgument&lt;Args&gt;&gt;(
879
+ token: T,
880
+ args: Args,
881
+ ): InstanceType&lt;T&gt;
882
+ inject&lt;
883
+ Schema extends InjectionTokenSchemaType,
884
+ R,
885
+ T extends FactorableWithArgs&lt;R, Schema&gt;,
886
+ &gt;(
887
+ token: T,
888
+ args: z.input&lt;Schema&gt;,
889
+ ): R
890
+ &nbsp;
516
891
  inject&lt;T, S extends InjectionTokenSchemaType&gt;(
517
892
  token: InjectionToken&lt;T, S&gt;,
518
893
  args: z.input&lt;S&gt;,
@@ -531,27 +906,68 @@ export interface Injectors {
531
906
  inject&lt;T&gt;(token: InjectionToken&lt;T, undefined&gt;): T
532
907
  inject&lt;T&gt;(token: BoundInjectionToken&lt;T, any&gt;): T
533
908
  inject&lt;T&gt;(token: FactoryInjectionToken&lt;T, any&gt;): T
909
+ &nbsp;
910
+ /**
911
+ * Optional injection that returns null if the service fails to initialize
912
+ * or is not available. This is useful when you want to inject a service
913
+ * that may not be configured or may fail gracefully.
914
+ *
915
+ * @example
916
+ * ```ts
917
+ * class MyService {
918
+ * constructor() {
919
+ * const optionalService = optional(OptionalServiceToken)
920
+ * // optionalService will be null if initialization fails
921
+ * if (optionalService) {
922
+ * optionalService.doSomething()
923
+ * }
924
+ * }
925
+ * }
926
+ * ```
927
+ */
928
+ optional&lt;T extends ClassType&gt;(
929
+ token: T,
930
+ ): (InstanceType&lt;T&gt; extends Factorable&lt;infer R&gt; ? R : InstanceType&lt;T&gt;) | null
931
+ optional&lt;T, S extends InjectionTokenSchemaType&gt;(
932
+ token: InjectionToken&lt;T, S&gt;,
933
+ args: z.input&lt;S&gt;,
934
+ ): T | null
935
+ optional&lt;T, S extends InjectionTokenSchemaType, R extends boolean&gt;(
936
+ token: InjectionToken&lt;T, S, R&gt;,
937
+ ): R extends false
938
+ ? T | null
939
+ : S extends ZodType&lt;infer Type&gt;
940
+ ? `Error: Your token requires args: ${Join&lt;
941
+ UnionToArray&lt;keyof Type&gt;,
942
+ ', '
943
+ &gt;}`
944
+ : 'Error: Your token requires args'
945
+ optional&lt;T&gt;(token: InjectionToken&lt;T, undefined&gt;): T | null
946
+ optional&lt;T&gt;(token: BoundInjectionToken&lt;T, any&gt;): T | null
947
+ optional&lt;T&gt;(token: FactoryInjectionToken&lt;T, any&gt;): T | null
534
948
  &nbsp;
535
949
  wrapSyncInit(
536
950
  cb: () =&gt; any,
537
951
  ): (injectState?: InjectState) =&gt; [any, Promise&lt;any&gt;[], InjectState]
538
952
  &nbsp;
539
- provideFactoryContext(context: FactoryContext | null): FactoryContext | null
953
+ provideFactoryContext(
954
+ context: ServiceInitializationContext | null,
955
+ ): ServiceInitializationContext | null
540
956
  }
541
957
  &nbsp;
542
958
  export function getInjectors() {
543
- let currentFactoryContext: FactoryContext | null = null
959
+ let currentFactoryContext: ServiceInitializationContext | null = null
544
960
  &nbsp;
545
961
  function provideFactoryContext(
546
- context: FactoryContext,
547
- ): FactoryContext | null {
962
+ context: ServiceInitializationContext | null,
963
+ ): ServiceInitializationContext | null {
548
964
  const original = currentFactoryContext
549
965
  currentFactoryContext = context
550
966
  return original
551
967
  }
552
- function getFactoryContext(): FactoryContext {
553
- if (!currentFactoryContext) {
554
- throw new Error(
968
+ function getFactoryContext(): ServiceInitializationContext {
969
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!currentFactoryContext) {
970
+ <span class="cstat-no" title="statement not covered" > throw new Error(</span>
555
971
  '[Injector] Trying to access injection context outside of a injectable context',
556
972
  )
557
973
  }
@@ -561,38 +977,89 @@ export function getInjectors() {
561
977
  let promiseCollector: null | ((promise: Promise&lt;any&gt;) =&gt; void) = null
562
978
  let injectState: InjectState | null = null
563
979
  &nbsp;
564
- function asyncInject(
565
- token:
566
- | ClassType
567
- | InjectionToken&lt;any&gt;
568
- | BoundInjectionToken&lt;any, any&gt;
569
- | FactoryInjectionToken&lt;any, any&gt;,
980
+ function getRequest(
981
+ token: InjectionToken&lt;any&gt;,
570
982
  args?: unknown,
983
+ skipCycleTracking = false,
571
984
  ) {
572
- if (!injectState) {
573
- throw new Error(
574
- '[Injector] Trying to access inject outside of a injectable context',
985
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!injectState) {
986
+ <span class="cstat-no" title="statement not covered" > throw new Error(</span>
987
+ '[Injector] Trying to make a request outside of a injectable context',
575
988
  )
576
989
  }
577
990
  if (injectState.isFrozen) {
578
991
  const idx = injectState.currentIndex++
579
992
  const request = injectState.requests[idx]
580
- if (request.token !== token) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
993
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (request.token !== token) {
581
994
  <span class="cstat-no" title="statement not covered" > throw new Error(</span>
582
- <span class="cstat-no" title="statement not covered" > `[Injector] Wrong token order. Expected ${request.token.toString()} but got ${token.toString()}`,</span>
583
- <span class="cstat-no" title="statement not covered" > )</span>
584
- <span class="cstat-no" title="statement not covered" > }</span>
585
- return request.promise
995
+ `[Injector] Wrong token order. Expected ${request.token.toString()} but got ${token.toString()}`,
996
+ )
997
+ }
998
+ return request
586
999
  }
1000
+ let result: any = null
1001
+ let error: Error | null = null
587
1002
  &nbsp;
588
- const promise = getFactoryContext().inject(token as any, args as any)
589
- injectState.requests.push({
1003
+ // For async inject, we run outside the resolution context to skip cycle tracking.
1004
+ // This is because asyncInject returns a promise that doesn't block the constructor,
1005
+ // so it cannot cause a deadlock even with circular dependencies.
1006
+ const doInject = () =&gt;
1007
+ getFactoryContext()
1008
+ .inject(token as any, args as any)
1009
+ .then((r) =&gt; {
1010
+ result = r
1011
+ return r
1012
+ })
1013
+ .catch((e) =&gt; {
1014
+ // We don't throw here because we have a mechanism to handle errors
1015
+ error = e
1016
+ })
1017
+ &nbsp;
1018
+ const promise = skipCycleTracking
1019
+ ? withoutResolutionContext(doInject)
1020
+ : doInject()
1021
+ &nbsp;
1022
+ const request: InjectRequest = {
590
1023
  token,
591
1024
  promise,
592
- })
1025
+ get result() {
1026
+ return result
1027
+ },
1028
+ get error() {
1029
+ return error
1030
+ },
1031
+ }
1032
+ injectState.requests.push(request)
593
1033
  injectState.currentIndex++
594
1034
  &nbsp;
595
- return promise
1035
+ return request
1036
+ }
1037
+ &nbsp;
1038
+ function asyncInject(
1039
+ token:
1040
+ | ClassType
1041
+ | InjectionToken&lt;any&gt;
1042
+ | BoundInjectionToken&lt;any, any&gt;
1043
+ | FactoryInjectionToken&lt;any, any&gt;,
1044
+ args?: unknown,
1045
+ ) {
1046
+ if (!injectState) {
1047
+ throw new Error(
1048
+ '[Injector] Trying to access inject outside of a injectable context',
1049
+ )
1050
+ }
1051
+ // @ts-expect-error In case we have a class
1052
+ const realToken = token[InjectableTokenMeta] ?? <span class="branch-1 cbranch-no" title="branch not covered" >token</span>
1053
+ // Pass skipCycleTracking=true because asyncInject returns a promise that doesn't
1054
+ // block the constructor, so it cannot cause a deadlock even with circular dependencies.
1055
+ const request = getRequest(realToken, args, true)
1056
+ return request.promise.then((result) =&gt; {
1057
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (request.error) {
1058
+ // We throw here because we want to fail the asyncInject call if the dependency fails to initialize
1059
+ <span class="cstat-no" title="statement not covered" > throw request.error</span>
1060
+ }
1061
+ return result
1062
+ })
596
1063
  }
597
1064
  &nbsp;
598
1065
  function wrapSyncInit(cb: () =&gt; any) {
@@ -635,34 +1102,74 @@ export function getInjectors() {
635
1102
  // @ts-expect-error In case we have a class
636
1103
  const realToken = token[InjectableTokenMeta] ?? token
637
1104
  &nbsp;
638
- const instance = getFactoryContext().locator.getSyncInstance(
639
- realToken,
640
- args,
641
- )
642
- if (!instance) {
643
- if (promiseCollector) {
644
- const promise = getFactoryContext().inject(realToken, args)
645
- promiseCollector(promise)
646
- <span class="branch-0 cbranch-no" title="branch not covered" > } else {</span>
647
- <span class="cstat-no" title="statement not covered" > throw new Error(`[Injector] Cannot initiate ${realToken.toString()}`)</span>
648
- <span class="cstat-no" title="statement not covered" > }</span>
649
- return new Proxy(
650
- {},
651
- {
652
- <span class="fstat-no" title="function not covered" > get() {</span>
653
- <span class="cstat-no" title="statement not covered" > throw new Error(</span>
654
- <span class="cstat-no" title="statement not covered" > `[Injector] Trying to access ${realToken.toString()} before it's initialized, please use asyncInject() instead of inject() or do not use the value outside of class methods`,</span>
655
- <span class="cstat-no" title="statement not covered" > )</span>
656
- <span class="cstat-no" title="statement not covered" > },</span>
1105
+ if (!injectState) {
1106
+ throw new Error(
1107
+ '[Injector] Trying to access inject outside of a injectable context',
1108
+ )
1109
+ }
1110
+ &nbsp;
1111
+ // Try to get cached instance synchronously (only on first run, not frozen replay)
1112
+ const ctx = getFactoryContext()
1113
+ const cachedInstance = !injectState.isFrozen
1114
+ ? ctx.container.tryGetSync(realToken, args)
1115
+ : null
1116
+ &nbsp;
1117
+ // getRequest handles both frozen replay and first run:
1118
+ // - Frozen: validates token order and returns cached request
1119
+ // - First run: creates new request with ctx.inject promise
1120
+ const request = getRequest(realToken, args)
1121
+ &nbsp;
1122
+ // If we have a cached instance, return it directly
1123
+ if (cachedInstance) {
1124
+ return cachedInstance as unknown as T
1125
+ }
1126
+ &nbsp;
1127
+ // Check for errors or already-resolved results
1128
+ if (request.error) {
1129
+ throw request.error
1130
+ }
1131
+ if (request.result) {
1132
+ return request.result as T
1133
+ }
1134
+ &nbsp;
1135
+ // Collect promise for awaiting (first run only, frozen state already has results)
1136
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (promiseCollector &amp;&amp; !injectState.isFrozen) {
1137
+ promiseCollector(request.promise)
1138
+ }
1139
+ &nbsp;
1140
+ // Return a proxy that throws if accessed before initialization
1141
+ return new Proxy(
1142
+ {},
1143
+ {
1144
+ <span class="fstat-no" title="function not covered" > get() {</span>
1145
+ <span class="cstat-no" title="statement not covered" > throw new Error(</span>
1146
+ `[Injector] Trying to access ${realToken.toString()} before it's initialized, please move the code to a onServiceInit method`,
1147
+ )
657
1148
  },
658
- ) as unknown as T
1149
+ },
1150
+ ) as unknown as T
1151
+ }
1152
+ &nbsp;
1153
+ function optional&lt;
1154
+ T,
1155
+ Token extends
1156
+ | InjectionToken&lt;T&gt;
1157
+ | BoundInjectionToken&lt;T, any&gt;
1158
+ | FactoryInjectionToken&lt;T, any&gt;,
1159
+ S extends ZodObject | unknown = Token['schema'],
1160
+ &gt;(token: Token, args?: S extends ZodObject ? z.input&lt;S&gt; : never): T | null {
1161
+ try {
1162
+ return inject(token, args)
1163
+ } catch {
1164
+ // If injection fails, return null instead of throwing
1165
+ return null
659
1166
  }
660
- return instance as unknown as T
661
1167
  }
662
1168
  &nbsp;
663
1169
  const injectors: Injectors = {
664
1170
  asyncInject,
665
1171
  inject,
1172
+ optional,
666
1173
  wrapSyncInit,
667
1174
  provideFactoryContext,
668
1175
  } as Injectors
@@ -676,7 +1183,7 @@ export function getInjectors() {
676
1183
  <div class='footer quiet pad2 space-top1 center small'>
677
1184
  Code coverage generated by
678
1185
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
679
- at 2025-09-21T17:47:07.632Z
1186
+ at 2026-01-08T12:15:46.476Z
680
1187
  </div>
681
1188
  <script src="../../prettify.js"></script>
682
1189
  <script>