@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">100% </span>
26
+ <span class="strong">0% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>3/3</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'>3/3</span>
49
+ <span class='fraction'>0/0</span>
50
50
  </div>
51
51
 
52
52
 
@@ -61,17 +61,20 @@
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
68
  <a name='L3'></a><a href='#L3'>3</a>
69
- <a name='L4'></a><a href='#L4'>4</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
70
- <span class="cline-any cline-yes">1x</span>
71
- <span class="cline-any cline-yes">1x</span>
72
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">export * from './factory.interface.mjs'
73
- export * from './on-service-init.interface.mjs'
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-neutral">&nbsp;</span>
71
+ <span class="cline-any cline-neutral">&nbsp;</span>
72
+ <span class="cline-any cline-neutral">&nbsp;</span>
73
+ <span class="cline-any cline-neutral">&nbsp;</span>
74
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">export * from './container.interface.mjs'
75
+ export * from './factory.interface.mjs'
74
76
  export * from './on-service-destroy.interface.mjs'
77
+ export * from './on-service-init.interface.mjs'
75
78
  &nbsp;</pre></td></tr></table></pre>
76
79
 
77
80
  <div class='push'></div><!-- for sticky footer -->
@@ -79,7 +82,7 @@ export * from './on-service-destroy.interface.mjs'
79
82
  <div class='footer quiet pad2 space-top1 center small'>
80
83
  Code coverage generated by
81
84
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
82
- at 2025-09-21T17:47:07.632Z
85
+ at 2026-01-08T12:15:46.476Z
83
86
  </div>
84
87
  <script src="../../prettify.js"></script>
85
88
  <script>
@@ -79,7 +79,7 @@
79
79
  <div class='footer quiet pad2 space-top1 center small'>
80
80
  Code coverage generated by
81
81
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
82
- at 2025-09-21T17:47:07.632Z
82
+ at 2026-01-08T12:15:46.476Z
83
83
  </div>
84
84
  <script src="../../prettify.js"></script>
85
85
  <script>
@@ -79,7 +79,7 @@
79
79
  <div class='footer quiet pad2 space-top1 center small'>
80
80
  Code coverage generated by
81
81
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
82
- at 2025-09-21T17:47:07.632Z
82
+ at 2026-01-08T12:15:46.476Z
83
83
  </div>
84
84
  <script src="../../prettify.js"></script>
85
85
  <script>
@@ -0,0 +1,142 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for src/internal/context/async-local-storage.browser.mts</title>
7
+ <meta charset="utf-8" />
8
+ <link rel="stylesheet" href="../../../prettify.css" />
9
+ <link rel="stylesheet" href="../../../base.css" />
10
+ <link rel="shortcut icon" type="image/x-icon" href="../../../favicon.png" />
11
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
12
+ <style type='text/css'>
13
+ .coverage-summary .sorter {
14
+ background-image: url(../../../sort-arrow-sprite.png);
15
+ }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <div class='wrapper'>
21
+ <div class='pad1'>
22
+ <h1><a href="../../../index.html">All files</a> / <a href="index.html">src/internal/context</a> async-local-storage.browser.mts</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">100% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>2/2</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">100% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>0/0</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">100% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>2/2</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">100% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>2/2</span>
50
+ </div>
51
+
52
+
53
+ </div>
54
+ <p class="quiet">
55
+ Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
+ </p>
57
+ <template id="filterTemplate">
58
+ <div class="quiet">
59
+ Filter:
60
+ <input type="search" id="fileSearch">
61
+ </div>
62
+ </template>
63
+ </div>
64
+ <div class='status-line high'></div>
65
+ <pre><table class="coverage">
66
+ <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
+ <a name='L2'></a><a href='#L2'>2</a>
68
+ <a name='L3'></a><a href='#L3'>3</a>
69
+ <a name='L4'></a><a href='#L4'>4</a>
70
+ <a name='L5'></a><a href='#L5'>5</a>
71
+ <a name='L6'></a><a href='#L6'>6</a>
72
+ <a name='L7'></a><a href='#L7'>7</a>
73
+ <a name='L8'></a><a href='#L8'>8</a>
74
+ <a name='L9'></a><a href='#L9'>9</a>
75
+ <a name='L10'></a><a href='#L10'>10</a>
76
+ <a name='L11'></a><a href='#L11'>11</a>
77
+ <a name='L12'></a><a href='#L12'>12</a>
78
+ <a name='L13'></a><a href='#L13'>13</a>
79
+ <a name='L14'></a><a href='#L14'>14</a>
80
+ <a name='L15'></a><a href='#L15'>15</a>
81
+ <a name='L16'></a><a href='#L16'>16</a>
82
+ <a name='L17'></a><a href='#L17'>17</a>
83
+ <a name='L18'></a><a href='#L18'>18</a>
84
+ <a name='L19'></a><a href='#L19'>19</a>
85
+ <a name='L20'></a><a href='#L20'>20</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
86
+ <span class="cline-any cline-neutral">&nbsp;</span>
87
+ <span class="cline-any cline-neutral">&nbsp;</span>
88
+ <span class="cline-any cline-neutral">&nbsp;</span>
89
+ <span class="cline-any cline-neutral">&nbsp;</span>
90
+ <span class="cline-any cline-neutral">&nbsp;</span>
91
+ <span class="cline-any cline-neutral">&nbsp;</span>
92
+ <span class="cline-any cline-neutral">&nbsp;</span>
93
+ <span class="cline-any cline-neutral">&nbsp;</span>
94
+ <span class="cline-any cline-neutral">&nbsp;</span>
95
+ <span class="cline-any cline-neutral">&nbsp;</span>
96
+ <span class="cline-any cline-neutral">&nbsp;</span>
97
+ <span class="cline-any cline-neutral">&nbsp;</span>
98
+ <span class="cline-any cline-yes">1x</span>
99
+ <span class="cline-any cline-neutral">&nbsp;</span>
100
+ <span class="cline-any cline-neutral">&nbsp;</span>
101
+ <span class="cline-any cline-neutral">&nbsp;</span>
102
+ <span class="cline-any cline-yes">1x</span>
103
+ <span class="cline-any cline-neutral">&nbsp;</span>
104
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">/**
105
+ * Browser implementation using SyncLocalStorage.
106
+ *
107
+ * This module is used in browser environments where async_hooks is not available.
108
+ * It provides synchronous-only context tracking which is sufficient for
109
+ * browser-based DI resolution.
110
+ */
111
+ &nbsp;
112
+ import { SyncLocalStorage } from './sync-local-storage.mjs'
113
+ &nbsp;
114
+ export type { IAsyncLocalStorage } from './async-local-storage.types.mjs'
115
+ &nbsp;
116
+ export function createAsyncLocalStorage&lt;T&gt;() {
117
+ return new SyncLocalStorage&lt;T&gt;()
118
+ }
119
+ &nbsp;
120
+ export function isUsingNativeAsyncLocalStorage(): boolean {
121
+ return false
122
+ }
123
+ &nbsp;</pre></td></tr></table></pre>
124
+
125
+ <div class='push'></div><!-- for sticky footer -->
126
+ </div><!-- /wrapper -->
127
+ <div class='footer quiet pad2 space-top1 center small'>
128
+ Code coverage generated by
129
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
130
+ at 2026-01-08T12:15:46.476Z
131
+ </div>
132
+ <script src="../../../prettify.js"></script>
133
+ <script>
134
+ window.onload = function () {
135
+ prettyPrint();
136
+ };
137
+ </script>
138
+ <script src="../../../sorter.js"></script>
139
+ <script src="../../../block-navigation.js"></script>
140
+ </body>
141
+ </html>
142
+
@@ -0,0 +1,292 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for src/internal/context/async-local-storage.mts</title>
7
+ <meta charset="utf-8" />
8
+ <link rel="stylesheet" href="../../../prettify.css" />
9
+ <link rel="stylesheet" href="../../../base.css" />
10
+ <link rel="shortcut icon" type="image/x-icon" href="../../../favicon.png" />
11
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
12
+ <style type='text/css'>
13
+ .coverage-summary .sorter {
14
+ background-image: url(../../../sort-arrow-sprite.png);
15
+ }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <div class='wrapper'>
21
+ <div class='pad1'>
22
+ <h1><a href="../../../index.html">All files</a> / <a href="index.html">src/internal/context</a> async-local-storage.mts</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">50% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>8/16</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">50% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>2/4</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">33.33% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>3/9</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">50% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>8/16</span>
50
+ </div>
51
+
52
+
53
+ </div>
54
+ <p class="quiet">
55
+ Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
+ </p>
57
+ <template id="filterTemplate">
58
+ <div class="quiet">
59
+ Filter:
60
+ <input type="search" id="fileSearch">
61
+ </div>
62
+ </template>
63
+ </div>
64
+ <div class='status-line medium'></div>
65
+ <pre><table class="coverage">
66
+ <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
+ <a name='L2'></a><a href='#L2'>2</a>
68
+ <a name='L3'></a><a href='#L3'>3</a>
69
+ <a name='L4'></a><a href='#L4'>4</a>
70
+ <a name='L5'></a><a href='#L5'>5</a>
71
+ <a name='L6'></a><a href='#L6'>6</a>
72
+ <a name='L7'></a><a href='#L7'>7</a>
73
+ <a name='L8'></a><a href='#L8'>8</a>
74
+ <a name='L9'></a><a href='#L9'>9</a>
75
+ <a name='L10'></a><a href='#L10'>10</a>
76
+ <a name='L11'></a><a href='#L11'>11</a>
77
+ <a name='L12'></a><a href='#L12'>12</a>
78
+ <a name='L13'></a><a href='#L13'>13</a>
79
+ <a name='L14'></a><a href='#L14'>14</a>
80
+ <a name='L15'></a><a href='#L15'>15</a>
81
+ <a name='L16'></a><a href='#L16'>16</a>
82
+ <a name='L17'></a><a href='#L17'>17</a>
83
+ <a name='L18'></a><a href='#L18'>18</a>
84
+ <a name='L19'></a><a href='#L19'>19</a>
85
+ <a name='L20'></a><a href='#L20'>20</a>
86
+ <a name='L21'></a><a href='#L21'>21</a>
87
+ <a name='L22'></a><a href='#L22'>22</a>
88
+ <a name='L23'></a><a href='#L23'>23</a>
89
+ <a name='L24'></a><a href='#L24'>24</a>
90
+ <a name='L25'></a><a href='#L25'>25</a>
91
+ <a name='L26'></a><a href='#L26'>26</a>
92
+ <a name='L27'></a><a href='#L27'>27</a>
93
+ <a name='L28'></a><a href='#L28'>28</a>
94
+ <a name='L29'></a><a href='#L29'>29</a>
95
+ <a name='L30'></a><a href='#L30'>30</a>
96
+ <a name='L31'></a><a href='#L31'>31</a>
97
+ <a name='L32'></a><a href='#L32'>32</a>
98
+ <a name='L33'></a><a href='#L33'>33</a>
99
+ <a name='L34'></a><a href='#L34'>34</a>
100
+ <a name='L35'></a><a href='#L35'>35</a>
101
+ <a name='L36'></a><a href='#L36'>36</a>
102
+ <a name='L37'></a><a href='#L37'>37</a>
103
+ <a name='L38'></a><a href='#L38'>38</a>
104
+ <a name='L39'></a><a href='#L39'>39</a>
105
+ <a name='L40'></a><a href='#L40'>40</a>
106
+ <a name='L41'></a><a href='#L41'>41</a>
107
+ <a name='L42'></a><a href='#L42'>42</a>
108
+ <a name='L43'></a><a href='#L43'>43</a>
109
+ <a name='L44'></a><a href='#L44'>44</a>
110
+ <a name='L45'></a><a href='#L45'>45</a>
111
+ <a name='L46'></a><a href='#L46'>46</a>
112
+ <a name='L47'></a><a href='#L47'>47</a>
113
+ <a name='L48'></a><a href='#L48'>48</a>
114
+ <a name='L49'></a><a href='#L49'>49</a>
115
+ <a name='L50'></a><a href='#L50'>50</a>
116
+ <a name='L51'></a><a href='#L51'>51</a>
117
+ <a name='L52'></a><a href='#L52'>52</a>
118
+ <a name='L53'></a><a href='#L53'>53</a>
119
+ <a name='L54'></a><a href='#L54'>54</a>
120
+ <a name='L55'></a><a href='#L55'>55</a>
121
+ <a name='L56'></a><a href='#L56'>56</a>
122
+ <a name='L57'></a><a href='#L57'>57</a>
123
+ <a name='L58'></a><a href='#L58'>58</a>
124
+ <a name='L59'></a><a href='#L59'>59</a>
125
+ <a name='L60'></a><a href='#L60'>60</a>
126
+ <a name='L61'></a><a href='#L61'>61</a>
127
+ <a name='L62'></a><a href='#L62'>62</a>
128
+ <a name='L63'></a><a href='#L63'>63</a>
129
+ <a name='L64'></a><a href='#L64'>64</a>
130
+ <a name='L65'></a><a href='#L65'>65</a>
131
+ <a name='L66'></a><a href='#L66'>66</a>
132
+ <a name='L67'></a><a href='#L67'>67</a>
133
+ <a name='L68'></a><a href='#L68'>68</a>
134
+ <a name='L69'></a><a href='#L69'>69</a>
135
+ <a name='L70'></a><a href='#L70'>70</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
136
+ <span class="cline-any cline-neutral">&nbsp;</span>
137
+ <span class="cline-any cline-neutral">&nbsp;</span>
138
+ <span class="cline-any cline-neutral">&nbsp;</span>
139
+ <span class="cline-any cline-neutral">&nbsp;</span>
140
+ <span class="cline-any cline-neutral">&nbsp;</span>
141
+ <span class="cline-any cline-neutral">&nbsp;</span>
142
+ <span class="cline-any cline-neutral">&nbsp;</span>
143
+ <span class="cline-any cline-neutral">&nbsp;</span>
144
+ <span class="cline-any cline-neutral">&nbsp;</span>
145
+ <span class="cline-any cline-neutral">&nbsp;</span>
146
+ <span class="cline-any cline-neutral">&nbsp;</span>
147
+ <span class="cline-any cline-neutral">&nbsp;</span>
148
+ <span class="cline-any cline-neutral">&nbsp;</span>
149
+ <span class="cline-any cline-neutral">&nbsp;</span>
150
+ <span class="cline-any cline-neutral">&nbsp;</span>
151
+ <span class="cline-any cline-neutral">&nbsp;</span>
152
+ <span class="cline-any cline-neutral">&nbsp;</span>
153
+ <span class="cline-any cline-neutral">&nbsp;</span>
154
+ <span class="cline-any cline-neutral">&nbsp;</span>
155
+ <span class="cline-any cline-yes">17x</span>
156
+ <span class="cline-any cline-neutral">&nbsp;</span>
157
+ <span class="cline-any cline-neutral">&nbsp;</span>
158
+ <span class="cline-any cline-neutral">&nbsp;</span>
159
+ <span class="cline-any cline-neutral">&nbsp;</span>
160
+ <span class="cline-any cline-neutral">&nbsp;</span>
161
+ <span class="cline-any cline-yes">17x</span>
162
+ <span class="cline-any cline-neutral">&nbsp;</span>
163
+ <span class="cline-any cline-neutral">&nbsp;</span>
164
+ <span class="cline-any cline-yes">10x</span>
165
+ <span class="cline-any cline-no">&nbsp;</span>
166
+ <span class="cline-any cline-neutral">&nbsp;</span>
167
+ <span class="cline-any cline-neutral">&nbsp;</span>
168
+ <span class="cline-any cline-yes">10x</span>
169
+ <span class="cline-any cline-neutral">&nbsp;</span>
170
+ <span class="cline-any cline-neutral">&nbsp;</span>
171
+ <span class="cline-any cline-neutral">&nbsp;</span>
172
+ <span class="cline-any cline-neutral">&nbsp;</span>
173
+ <span class="cline-any cline-no">&nbsp;</span>
174
+ <span class="cline-any cline-neutral">&nbsp;</span>
175
+ <span class="cline-any cline-neutral">&nbsp;</span>
176
+ <span class="cline-any cline-no">&nbsp;</span>
177
+ <span class="cline-any cline-neutral">&nbsp;</span>
178
+ <span class="cline-any cline-neutral">&nbsp;</span>
179
+ <span class="cline-any cline-neutral">&nbsp;</span>
180
+ <span class="cline-any cline-no">&nbsp;</span>
181
+ <span class="cline-any cline-no">&nbsp;</span>
182
+ <span class="cline-any cline-no">&nbsp;</span>
183
+ <span class="cline-any cline-neutral">&nbsp;</span>
184
+ <span class="cline-any cline-neutral">&nbsp;</span>
185
+ <span class="cline-any cline-neutral">&nbsp;</span>
186
+ <span class="cline-any cline-neutral">&nbsp;</span>
187
+ <span class="cline-any cline-yes">10x</span>
188
+ <span class="cline-any cline-yes">10x</span>
189
+ <span class="cline-any cline-no">&nbsp;</span>
190
+ <span class="cline-any cline-neutral">&nbsp;</span>
191
+ <span class="cline-any cline-neutral">&nbsp;</span>
192
+ <span class="cline-any cline-neutral">&nbsp;</span>
193
+ <span class="cline-any cline-yes">10x</span>
194
+ <span class="cline-any cline-neutral">&nbsp;</span>
195
+ <span class="cline-any cline-neutral">&nbsp;</span>
196
+ <span class="cline-any cline-neutral">&nbsp;</span>
197
+ <span class="cline-any cline-yes">10x</span>
198
+ <span class="cline-any cline-neutral">&nbsp;</span>
199
+ <span class="cline-any cline-neutral">&nbsp;</span>
200
+ <span class="cline-any cline-neutral">&nbsp;</span>
201
+ <span class="cline-any cline-no">&nbsp;</span>
202
+ <span class="cline-any cline-neutral">&nbsp;</span>
203
+ <span class="cline-any cline-neutral">&nbsp;</span>
204
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import type { IAsyncLocalStorage } from './async-local-storage.types.mjs'
205
+ &nbsp;
206
+ import { AsyncLocalStorage } from 'node:async_hooks'
207
+ &nbsp;
208
+ /**
209
+ * Cross-platform AsyncLocalStorage switcher.
210
+ *
211
+ * Provides the appropriate implementation based on environment:
212
+ * - Production: No-op implementation (circular detection disabled)
213
+ * - Development: Native AsyncLocalStorage from node:async_hooks
214
+ *
215
+ * Browser environments use a separate entry point via package.json exports
216
+ * that directly uses SyncLocalStorage.
217
+ *
218
+ * Uses lazy initialization to avoid import overhead until first use,
219
+ * and works with both ESM and CJS builds.
220
+ */
221
+ &nbsp;
222
+ export type { IAsyncLocalStorage }
223
+ &nbsp;
224
+ const isProduction = process.env.NODE_ENV === 'production'
225
+ &nbsp;
226
+ // Lazy-loaded module cache
227
+ let loadedModule: {
228
+ createAsyncLocalStorage: &lt;T&gt;() =&gt; IAsyncLocalStorage&lt;T&gt;
229
+ isUsingNativeAsyncLocalStorage: () =&gt; boolean
230
+ } | null = null
231
+ &nbsp;
232
+ function getModule() {
233
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (loadedModule) {
234
+ <span class="cstat-no" title="statement not covered" > return loadedModule</span>
235
+ }
236
+ &nbsp;
237
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (isProduction) {
238
+ // In production, use the noop implementation
239
+ // Inline to avoid any import overhead
240
+ class NoopLocalStorage&lt;T&gt; implements IAsyncLocalStorage&lt;T&gt; {
241
+ <span class="fstat-no" title="function not covered" > run&lt;R&gt;(_</span>store: T, fn: () =&gt; R): R {
242
+ <span class="cstat-no" title="statement not covered" > return fn()</span>
243
+ }
244
+ <span class="fstat-no" title="function not covered" > getStore(): T | undefined {</span>
245
+ <span class="cstat-no" title="statement not covered" > return undefined</span>
246
+ }
247
+ }
248
+ &nbsp;
249
+ <span class="cstat-no" title="statement not covered" > loadedModule = {</span>
250
+ createAsyncLocalStorage: <span class="fstat-no" title="function not covered" >&lt;T,&gt;() =&gt; <span class="cstat-no" title="statement not covered" >n</span>ew NoopLocalStorage&lt;T&gt;(),</span>
251
+ isUsingNativeAsyncLocalStorage: <span class="fstat-no" title="function not covered" >() =&gt; <span class="cstat-no" title="statement not covered" >f</span>alse,</span>
252
+ }
253
+ } else {
254
+ // In development, use native AsyncLocalStorage
255
+ &nbsp;
256
+ loadedModule = {
257
+ createAsyncLocalStorage: &lt;T,&gt;() =&gt; new AsyncLocalStorage&lt;T&gt;(),
258
+ isUsingNativeAsyncLocalStorage: <span class="fstat-no" title="function not covered" >() =&gt; <span class="cstat-no" title="statement not covered" >t</span>rue,</span>
259
+ }
260
+ }
261
+ &nbsp;
262
+ return loadedModule
263
+ }
264
+ &nbsp;
265
+ export function createAsyncLocalStorage&lt;T&gt;(): IAsyncLocalStorage&lt;T&gt; {
266
+ return getModule().createAsyncLocalStorage&lt;T&gt;()
267
+ }
268
+ &nbsp;
269
+ export function <span class="fstat-no" title="function not covered" >isUsingNativeAsyncLocalStorage(): boolean {</span>
270
+ <span class="cstat-no" title="statement not covered" > return getModule().isUsingNativeAsyncLocalStorage()</span>
271
+ }
272
+ &nbsp;
273
+ &nbsp;</pre></td></tr></table></pre>
274
+
275
+ <div class='push'></div><!-- for sticky footer -->
276
+ </div><!-- /wrapper -->
277
+ <div class='footer quiet pad2 space-top1 center small'>
278
+ Code coverage generated by
279
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
280
+ at 2026-01-08T12:15:46.476Z
281
+ </div>
282
+ <script src="../../../prettify.js"></script>
283
+ <script>
284
+ window.onload = function () {
285
+ prettyPrint();
286
+ };
287
+ </script>
288
+ <script src="../../../sorter.js"></script>
289
+ <script src="../../../block-navigation.js"></script>
290
+ </body>
291
+ </html>
292
+
@@ -3,15 +3,15 @@
3
3
  <html lang="en">
4
4
 
5
5
  <head>
6
- <title>Code coverage report for src/factory-context.mts</title>
6
+ <title>Code coverage report for src/internal/context/async-local-storage.types.mts</title>
7
7
  <meta charset="utf-8" />
8
- <link rel="stylesheet" href="../prettify.css" />
9
- <link rel="stylesheet" href="../base.css" />
10
- <link rel="shortcut icon" type="image/x-icon" href="../favicon.png" />
8
+ <link rel="stylesheet" href="../../../prettify.css" />
9
+ <link rel="stylesheet" href="../../../base.css" />
10
+ <link rel="shortcut icon" type="image/x-icon" href="../../../favicon.png" />
11
11
  <meta name="viewport" content="width=device-width, initial-scale=1" />
12
12
  <style type='text/css'>
13
13
  .coverage-summary .sorter {
14
- background-image: url(../sort-arrow-sprite.png);
14
+ background-image: url(../../../sort-arrow-sprite.png);
15
15
  }
16
16
  </style>
17
17
  </head>
@@ -19,7 +19,7 @@
19
19
  <body>
20
20
  <div class='wrapper'>
21
21
  <div class='pad1'>
22
- <h1><a href="../index.html">All files</a> / <a href="index.html">src</a> factory-context.mts</h1>
22
+ <h1><a href="../../../index.html">All files</a> / <a href="index.html">src/internal/context</a> async-local-storage.types.mts</h1>
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
@@ -79,14 +79,14 @@
79
79
  <span class="cline-any cline-neutral">&nbsp;</span>
80
80
  <span class="cline-any cline-neutral">&nbsp;</span>
81
81
  <span class="cline-any cline-neutral">&nbsp;</span>
82
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import type { ServiceLocator } from './service-locator.mjs'
83
- import type { Injectors } from './utils/index.mjs'
84
- &nbsp;
85
- export interface FactoryContext {
86
- inject: Injectors['asyncInject']
87
- locator: ServiceLocator
88
- addDestroyListener: (listener: () =&gt; void) =&gt; void
82
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">/**
83
+ * Interface matching the subset of AsyncLocalStorage API we use.
84
+ */
85
+ export interface IAsyncLocalStorage&lt;T&gt; {
86
+ run&lt;R&gt;(store: T, fn: () =&gt; R): R
87
+ getStore(): T | undefined
89
88
  }
89
+ &nbsp;
90
90
  &nbsp;</pre></td></tr></table></pre>
91
91
 
92
92
  <div class='push'></div><!-- for sticky footer -->
@@ -94,16 +94,16 @@ export interface FactoryContext {
94
94
  <div class='footer quiet pad2 space-top1 center small'>
95
95
  Code coverage generated by
96
96
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
97
- at 2025-09-21T17:47:07.632Z
97
+ at 2026-01-08T12:15:46.476Z
98
98
  </div>
99
- <script src="../prettify.js"></script>
99
+ <script src="../../../prettify.js"></script>
100
100
  <script>
101
101
  window.onload = function () {
102
102
  prettyPrint();
103
103
  };
104
104
  </script>
105
- <script src="../sorter.js"></script>
106
- <script src="../block-navigation.js"></script>
105
+ <script src="../../../sorter.js"></script>
106
+ <script src="../../../block-navigation.js"></script>
107
107
  </body>
108
108
  </html>
109
109