@codefast/di 0.5.0 → 0.6.1

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 (266) hide show
  1. package/CHANGELOG.md +712 -0
  2. package/README.md +119 -30
  3. package/dist/ambient/active-container.d.ts +37 -0
  4. package/dist/ambient/active-container.d.ts.map +1 -0
  5. package/dist/ambient/active-container.js +41 -0
  6. package/dist/ambient/active-container.js.map +1 -0
  7. package/dist/container/binding-builders.d.ts +12 -8
  8. package/dist/container/binding-builders.d.ts.map +1 -1
  9. package/dist/container/binding-builders.js +62 -31
  10. package/dist/container/binding-builders.js.map +1 -1
  11. package/dist/container/container.d.ts +33 -19
  12. package/dist/container/container.d.ts.map +1 -1
  13. package/dist/container/container.js +281 -118
  14. package/dist/container/container.js.map +1 -1
  15. package/dist/{resolution → core}/binding-scope.d.ts +2 -2
  16. package/dist/core/binding-scope.d.ts.map +1 -0
  17. package/dist/core/binding-scope.js.map +1 -0
  18. package/dist/{binding.d.ts → core/binding.d.ts} +70 -15
  19. package/dist/core/binding.d.ts.map +1 -0
  20. package/dist/{binding.js → core/binding.js} +27 -12
  21. package/dist/core/binding.js.map +1 -0
  22. package/dist/core/constraint-requirement.d.ts +53 -0
  23. package/dist/core/constraint-requirement.d.ts.map +1 -0
  24. package/dist/core/constraint-requirement.js +62 -0
  25. package/dist/core/constraint-requirement.js.map +1 -0
  26. package/dist/{constructor-type.d.ts → core/constructor-type.d.ts} +1 -1
  27. package/dist/core/constructor-type.d.ts.map +1 -0
  28. package/dist/core/constructor-type.js.map +1 -0
  29. package/dist/{module.d.ts → core/module.d.ts} +5 -5
  30. package/dist/core/module.d.ts.map +1 -0
  31. package/dist/{module.js → core/module.js} +4 -4
  32. package/dist/core/module.js.map +1 -0
  33. package/dist/{registry.d.ts → core/registry.d.ts} +27 -7
  34. package/dist/core/registry.d.ts.map +1 -0
  35. package/dist/{registry.js → core/registry.js} +125 -52
  36. package/dist/core/registry.js.map +1 -0
  37. package/dist/core/tag.d.ts +80 -0
  38. package/dist/core/tag.d.ts.map +1 -0
  39. package/dist/core/tag.js +96 -0
  40. package/dist/core/tag.js.map +1 -0
  41. package/dist/{token.d.ts → core/token.d.ts} +2 -6
  42. package/dist/core/token.d.ts.map +1 -0
  43. package/dist/core/token.js +13 -0
  44. package/dist/core/token.js.map +1 -0
  45. package/dist/{types.d.ts → core/types.d.ts} +27 -21
  46. package/dist/core/types.d.ts.map +1 -0
  47. package/dist/core/types.js.map +1 -0
  48. package/dist/decorators/inject.d.ts +5 -49
  49. package/dist/decorators/inject.d.ts.map +1 -1
  50. package/dist/decorators/inject.js +34 -104
  51. package/dist/decorators/inject.js.map +1 -1
  52. package/dist/decorators/injectable.d.ts +25 -5
  53. package/dist/decorators/injectable.d.ts.map +1 -1
  54. package/dist/decorators/injectable.js +2 -3
  55. package/dist/decorators/injectable.js.map +1 -1
  56. package/dist/decorators/lifecycle-decorators.d.ts +4 -2
  57. package/dist/decorators/lifecycle-decorators.d.ts.map +1 -1
  58. package/dist/decorators/lifecycle-decorators.js +19 -25
  59. package/dist/decorators/lifecycle-decorators.js.map +1 -1
  60. package/dist/{resolution → errors}/diagnostics.d.ts +2 -0
  61. package/dist/errors/diagnostics.d.ts.map +1 -0
  62. package/dist/errors/diagnostics.js.map +1 -0
  63. package/dist/{errors.d.ts → errors/errors.d.ts} +89 -4
  64. package/dist/errors/errors.d.ts.map +1 -0
  65. package/dist/{errors.js → errors/errors.js} +129 -7
  66. package/dist/errors/errors.js.map +1 -0
  67. package/dist/index.d.ts +21 -14
  68. package/dist/index.d.ts.map +1 -1
  69. package/dist/index.js +15 -7
  70. package/dist/index.js.map +1 -1
  71. package/dist/injection/descriptor.d.ts +79 -0
  72. package/dist/injection/descriptor.d.ts.map +1 -0
  73. package/dist/injection/descriptor.js +118 -0
  74. package/dist/injection/descriptor.js.map +1 -0
  75. package/dist/{resolution → injection}/resolve-options.d.ts +21 -11
  76. package/dist/injection/resolve-options.d.ts.map +1 -0
  77. package/dist/injection/resolve-options.js +101 -0
  78. package/dist/injection/resolve-options.js.map +1 -0
  79. package/dist/introspection/dependency-graph.d.ts +16 -5
  80. package/dist/introspection/dependency-graph.d.ts.map +1 -1
  81. package/dist/introspection/dependency-graph.js +138 -57
  82. package/dist/introspection/dependency-graph.js.map +1 -1
  83. package/dist/introspection/graph-adapters/cytoscape.d.ts +6 -3
  84. package/dist/introspection/graph-adapters/cytoscape.d.ts.map +1 -1
  85. package/dist/introspection/graph-adapters/cytoscape.js +3 -0
  86. package/dist/introspection/graph-adapters/cytoscape.js.map +1 -1
  87. package/dist/introspection/graph-adapters/dot.d.ts.map +1 -1
  88. package/dist/introspection/graph-adapters/dot.js +12 -5
  89. package/dist/introspection/graph-adapters/dot.js.map +1 -1
  90. package/dist/introspection/graph-adapters/mermaid.d.ts +9 -0
  91. package/dist/introspection/graph-adapters/mermaid.d.ts.map +1 -0
  92. package/dist/introspection/graph-adapters/mermaid.js +47 -0
  93. package/dist/introspection/graph-adapters/mermaid.js.map +1 -0
  94. package/dist/introspection/graph-adapters/reactflow.d.ts +6 -3
  95. package/dist/introspection/graph-adapters/reactflow.d.ts.map +1 -1
  96. package/dist/introspection/graph-adapters/reactflow.js +5 -1
  97. package/dist/introspection/graph-adapters/reactflow.js.map +1 -1
  98. package/dist/introspection/inspector.d.ts +4 -4
  99. package/dist/introspection/inspector.d.ts.map +1 -1
  100. package/dist/introspection/inspector.js +10 -6
  101. package/dist/introspection/inspector.js.map +1 -1
  102. package/dist/lifecycle/lifecycle-manager.d.ts +27 -0
  103. package/dist/lifecycle/lifecycle-manager.d.ts.map +1 -0
  104. package/dist/{resolution/lifecycle.js → lifecycle/lifecycle-manager.js} +39 -9
  105. package/dist/lifecycle/lifecycle-manager.js.map +1 -0
  106. package/dist/lifecycle/scope-manager.d.ts +48 -0
  107. package/dist/lifecycle/scope-manager.d.ts.map +1 -0
  108. package/dist/lifecycle/scope-manager.js +135 -0
  109. package/dist/lifecycle/scope-manager.js.map +1 -0
  110. package/dist/metadata/metadata-reader-token.d.ts +1 -1
  111. package/dist/metadata/metadata-reader-token.d.ts.map +1 -1
  112. package/dist/metadata/metadata-reader-token.js +1 -1
  113. package/dist/metadata/metadata-reader-token.js.map +1 -1
  114. package/dist/metadata/metadata-types.d.ts +9 -9
  115. package/dist/metadata/metadata-types.d.ts.map +1 -1
  116. package/dist/metadata/symbol-metadata-reader.d.ts +19 -6
  117. package/dist/metadata/symbol-metadata-reader.d.ts.map +1 -1
  118. package/dist/metadata/symbol-metadata-reader.js +89 -9
  119. package/dist/metadata/symbol-metadata-reader.js.map +1 -1
  120. package/dist/metadata/verifying-metadata-reader.d.ts +16 -0
  121. package/dist/metadata/verifying-metadata-reader.d.ts.map +1 -0
  122. package/dist/metadata/verifying-metadata-reader.js +32 -0
  123. package/dist/metadata/verifying-metadata-reader.js.map +1 -0
  124. package/dist/resolution/{activation-need.d.ts → cache/activation-need.d.ts} +5 -5
  125. package/dist/resolution/cache/activation-need.d.ts.map +1 -0
  126. package/dist/resolution/cache/activation-need.js.map +1 -0
  127. package/dist/resolution/{binding-lookup-cache.d.ts → cache/binding-lookup-cache.d.ts} +9 -5
  128. package/dist/resolution/cache/binding-lookup-cache.d.ts.map +1 -0
  129. package/dist/resolution/{binding-lookup-cache.js → cache/binding-lookup-cache.js} +55 -0
  130. package/dist/resolution/cache/binding-lookup-cache.js.map +1 -0
  131. package/dist/resolution/cache/class-introspector.d.ts +66 -0
  132. package/dist/resolution/cache/class-introspector.d.ts.map +1 -0
  133. package/dist/resolution/cache/class-introspector.js +194 -0
  134. package/dist/resolution/cache/class-introspector.js.map +1 -0
  135. package/dist/resolution/context.d.ts +84 -0
  136. package/dist/resolution/context.d.ts.map +1 -0
  137. package/dist/resolution/{environment.js → context.js} +54 -80
  138. package/dist/resolution/context.js.map +1 -0
  139. package/dist/resolution/path/resolution-path.d.ts +94 -0
  140. package/dist/resolution/path/resolution-path.d.ts.map +1 -0
  141. package/dist/resolution/path/resolution-path.js +117 -0
  142. package/dist/resolution/path/resolution-path.js.map +1 -0
  143. package/dist/resolution/{instantiation-plan.d.ts → plan/instantiation-plan.d.ts} +37 -7
  144. package/dist/resolution/plan/instantiation-plan.d.ts.map +1 -0
  145. package/dist/resolution/plan/instantiation-plan.js +419 -0
  146. package/dist/resolution/plan/instantiation-plan.js.map +1 -0
  147. package/dist/resolution/resolver.d.ts +28 -28
  148. package/dist/resolution/resolver.d.ts.map +1 -1
  149. package/dist/resolution/resolver.js +581 -239
  150. package/dist/resolution/resolver.js.map +1 -1
  151. package/dist/resolution/select/binding-select.d.ts +34 -0
  152. package/dist/resolution/select/binding-select.d.ts.map +1 -0
  153. package/dist/resolution/select/binding-select.js +175 -0
  154. package/dist/resolution/select/binding-select.js.map +1 -0
  155. package/dist/resolution/{constraints.d.ts → select/constraints.d.ts} +13 -12
  156. package/dist/resolution/select/constraints.d.ts.map +1 -0
  157. package/dist/resolution/{constraints.js → select/constraints.js} +33 -22
  158. package/dist/resolution/select/constraints.js.map +1 -0
  159. package/package.json +160 -20
  160. package/src/ambient/active-container.ts +65 -0
  161. package/src/container/binding-builders.ts +79 -44
  162. package/src/container/container.ts +357 -170
  163. package/src/{resolution → core}/binding-scope.ts +2 -2
  164. package/src/{binding.ts → core/binding.ts} +101 -39
  165. package/src/core/constraint-requirement.ts +94 -0
  166. package/src/{constructor-type.ts → core/constructor-type.ts} +1 -1
  167. package/src/{module.ts → core/module.ts} +10 -10
  168. package/src/core/registry.ts +365 -0
  169. package/src/core/tag.ts +158 -0
  170. package/src/{token.ts → core/token.ts} +2 -14
  171. package/src/{types.ts → core/types.ts} +37 -34
  172. package/src/decorators/inject.ts +39 -175
  173. package/src/decorators/injectable.ts +40 -10
  174. package/src/decorators/lifecycle-decorators.ts +22 -34
  175. package/src/{resolution → errors}/diagnostics.ts +2 -0
  176. package/src/{errors.ts → errors/errors.ts} +152 -8
  177. package/src/index.ts +43 -15
  178. package/src/injection/descriptor.ts +206 -0
  179. package/src/injection/resolve-options.ts +144 -0
  180. package/src/introspection/dependency-graph.ts +223 -63
  181. package/src/introspection/graph-adapters/cytoscape.ts +9 -3
  182. package/src/introspection/graph-adapters/dot.ts +13 -5
  183. package/src/introspection/graph-adapters/mermaid.ts +61 -0
  184. package/src/introspection/graph-adapters/reactflow.ts +11 -4
  185. package/src/introspection/inspector.ts +16 -12
  186. package/src/{resolution/lifecycle.ts → lifecycle/lifecycle-manager.ts} +68 -32
  187. package/src/lifecycle/scope-manager.ts +156 -0
  188. package/src/metadata/metadata-reader-token.ts +2 -2
  189. package/src/metadata/metadata-types.ts +9 -9
  190. package/src/metadata/symbol-metadata-reader.ts +95 -18
  191. package/src/metadata/verifying-metadata-reader.ts +41 -0
  192. package/src/resolution/{activation-need.ts → cache/activation-need.ts} +8 -8
  193. package/src/resolution/{binding-lookup-cache.ts → cache/binding-lookup-cache.ts} +63 -5
  194. package/src/resolution/cache/class-introspector.ts +251 -0
  195. package/src/resolution/{environment.ts → context.ts} +84 -145
  196. package/src/resolution/path/resolution-path.ts +167 -0
  197. package/src/resolution/plan/instantiation-plan.ts +615 -0
  198. package/src/resolution/resolver.ts +663 -313
  199. package/src/resolution/select/binding-select.ts +210 -0
  200. package/src/resolution/select/constraints.ts +130 -0
  201. package/dist/binding.d.ts.map +0 -1
  202. package/dist/binding.js.map +0 -1
  203. package/dist/constructor-type.d.ts.map +0 -1
  204. package/dist/constructor-type.js.map +0 -1
  205. package/dist/errors.d.ts.map +0 -1
  206. package/dist/errors.js.map +0 -1
  207. package/dist/module.d.ts.map +0 -1
  208. package/dist/module.js.map +0 -1
  209. package/dist/registry.d.ts.map +0 -1
  210. package/dist/registry.js.map +0 -1
  211. package/dist/resolution/activation-need.d.ts.map +0 -1
  212. package/dist/resolution/activation-need.js.map +0 -1
  213. package/dist/resolution/binding-lookup-cache.d.ts.map +0 -1
  214. package/dist/resolution/binding-lookup-cache.js.map +0 -1
  215. package/dist/resolution/binding-scope.d.ts.map +0 -1
  216. package/dist/resolution/binding-scope.js.map +0 -1
  217. package/dist/resolution/binding-select.d.ts +0 -23
  218. package/dist/resolution/binding-select.d.ts.map +0 -1
  219. package/dist/resolution/binding-select.js +0 -121
  220. package/dist/resolution/binding-select.js.map +0 -1
  221. package/dist/resolution/class-introspector.d.ts +0 -27
  222. package/dist/resolution/class-introspector.d.ts.map +0 -1
  223. package/dist/resolution/class-introspector.js +0 -60
  224. package/dist/resolution/class-introspector.js.map +0 -1
  225. package/dist/resolution/constraints.d.ts.map +0 -1
  226. package/dist/resolution/constraints.js.map +0 -1
  227. package/dist/resolution/diagnostics.d.ts.map +0 -1
  228. package/dist/resolution/diagnostics.js.map +0 -1
  229. package/dist/resolution/environment.d.ts +0 -94
  230. package/dist/resolution/environment.d.ts.map +0 -1
  231. package/dist/resolution/environment.js.map +0 -1
  232. package/dist/resolution/instantiation-plan.d.ts.map +0 -1
  233. package/dist/resolution/instantiation-plan.js +0 -183
  234. package/dist/resolution/instantiation-plan.js.map +0 -1
  235. package/dist/resolution/lifecycle.d.ts +0 -23
  236. package/dist/resolution/lifecycle.d.ts.map +0 -1
  237. package/dist/resolution/lifecycle.js.map +0 -1
  238. package/dist/resolution/resolution-path.d.ts +0 -98
  239. package/dist/resolution/resolution-path.d.ts.map +0 -1
  240. package/dist/resolution/resolution-path.js +0 -98
  241. package/dist/resolution/resolution-path.js.map +0 -1
  242. package/dist/resolution/resolve-options.d.ts.map +0 -1
  243. package/dist/resolution/resolve-options.js +0 -56
  244. package/dist/resolution/resolve-options.js.map +0 -1
  245. package/dist/resolution/scope.d.ts +0 -28
  246. package/dist/resolution/scope.d.ts.map +0 -1
  247. package/dist/resolution/scope.js +0 -88
  248. package/dist/resolution/scope.js.map +0 -1
  249. package/dist/token.d.ts.map +0 -1
  250. package/dist/token.js +0 -22
  251. package/dist/token.js.map +0 -1
  252. package/dist/types.d.ts.map +0 -1
  253. package/dist/types.js.map +0 -1
  254. package/src/registry.ts +0 -282
  255. package/src/resolution/binding-select.ts +0 -154
  256. package/src/resolution/class-introspector.ts +0 -74
  257. package/src/resolution/constraints.ts +0 -121
  258. package/src/resolution/instantiation-plan.ts +0 -292
  259. package/src/resolution/resolution-path.ts +0 -156
  260. package/src/resolution/resolve-options.ts +0 -89
  261. package/src/resolution/scope.ts +0 -105
  262. /package/dist/{resolution → core}/binding-scope.js +0 -0
  263. /package/dist/{constructor-type.js → core/constructor-type.js} +0 -0
  264. /package/dist/{types.js → core/types.js} +0 -0
  265. /package/dist/{resolution → errors}/diagnostics.js +0 -0
  266. /package/dist/resolution/{activation-need.js → cache/activation-need.js} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"cytoscape.js","sourceRoot":"","sources":["../../../src/introspection/graph-adapters/cytoscape.ts"],"names":[],"mappings":"AAgCA;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAyB;IACxD,MAAM,QAAQ,GAAyC,EAAE,CAAC;IAE1D,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAC/B,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE;gBACJ,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,KAAK,EAAE,IAAI,CAAC,SAAS;gBACrB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,UAAU,EAAE,IAAI,CAAC,UAAU;aAC5B;SACF,CAAC,CAAC;IACL,CAAC;IAED,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QACrD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAE,CAAC;QAC/B,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE;gBACJ,EAAE,EAAE,QAAQ,GAAG,EAAE;gBACjB,MAAM,EAAE,IAAI,CAAC,IAAI;gBACjB,MAAM,EAAE,IAAI,CAAC,EAAE;gBACf,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC3D;SACF,CAAC,CAAC;IACL,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"cytoscape.js","sourceRoot":"","sources":["../../../src/introspection/graph-adapters/cytoscape.ts"],"names":[],"mappings":"AAmCA;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAyB;IACxD,MAAM,QAAQ,GAAyC,EAAE,CAAC;IAE1D,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAC/B,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE;gBACJ,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,KAAK,EAAE,IAAI,CAAC,SAAS;gBACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,UAAU,EAAE,IAAI,CAAC,UAAU;aAC5B;SACF,CAAC,CAAC;IACL,CAAC;IAED,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QACrD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAE,CAAC;QAC/B,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE;gBACJ,EAAE,EAAE,QAAQ,GAAG,EAAE;gBACjB,MAAM,EAAE,IAAI,CAAC,IAAI;gBACjB,MAAM,EAAE,IAAI,CAAC,EAAE;gBACf,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC1D,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,GAAG,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACpE;SACF,CAAC,CAAC;IACL,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"dot.d.ts","sourceRoot":"","sources":["../../../src/introspection/graph-adapters/dot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAE3E;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,CAgB5D"}
1
+ {"version":3,"file":"dot.d.ts","sourceRoot":"","sources":["../../../src/introspection/graph-adapters/dot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAQ3E;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,CAkB5D"}
@@ -1,16 +1,23 @@
1
+ // Token names are caller-supplied and land inside DOT quoted strings — ids included, since an
2
+ // unbound placeholder id embeds the name it was minted from.
3
+ function escapeDotString(value) {
4
+ return value.replaceAll("\\", "\\\\").replaceAll('"', '\\"');
5
+ }
1
6
  /**
2
7
  * @since 0.3.16-canary.0
3
8
  */
4
9
  export function toDotGraph(graph) {
5
10
  const lines = ["digraph DI {", " rankdir=TB;"];
6
11
  for (const node of graph.nodes) {
7
- const label = `${node.tokenName}\\n[${node.kind}/${node.scope}]`;
8
- const style = node.fromParent ? ' style="dashed"' : "";
9
- lines.push(` "${node.id}" [label="${label}"${style}];`);
12
+ const label = `${escapeDotString(node.tokenName)}\\n[${node.kind}/${node.scope}]`;
13
+ // Dashed for anything that is not a live binding of this container: the parent chain
14
+ // and unbound-optional placeholders.
15
+ const style = node.fromParent || node.kind === "unbound" ? ' style="dashed"' : "";
16
+ lines.push(` "${escapeDotString(node.id)}" [label="${label}"${style}];`);
10
17
  }
11
18
  for (const edge of graph.edges) {
12
- const label = edge.label !== undefined ? ` [label="${edge.label}"]` : "";
13
- lines.push(` "${edge.from}" -> "${edge.to}"${label};`);
19
+ const label = edge.label === undefined ? "" : ` [label="${escapeDotString(edge.label)}"]`;
20
+ lines.push(` "${escapeDotString(edge.from)}" -> "${escapeDotString(edge.to)}"${label};`);
14
21
  }
15
22
  lines.push("}");
16
23
  return lines.join("\n");
@@ -1 +1 @@
1
- {"version":3,"file":"dot.js","sourceRoot":"","sources":["../../../src/introspection/graph-adapters/dot.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,KAAyB;IAClD,MAAM,KAAK,GAAkB,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC;IAE/D,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,GAAG,IAAI,CAAC,SAAS,OAAO,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC;QACjE,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC;QACvD,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,aAAa,KAAK,IAAI,KAAK,IAAI,CAAC,CAAC;IAC3D,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QACzE,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,SAAS,IAAI,CAAC,EAAE,IAAI,KAAK,GAAG,CAAC,CAAC;IAC1D,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
1
+ {"version":3,"file":"dot.js","sourceRoot":"","sources":["../../../src/introspection/graph-adapters/dot.ts"],"names":[],"mappings":"AAEA,8FAA8F;AAC9F,6DAA6D;AAC7D,SAAS,eAAe,CAAC,KAAa;IACpC,OAAO,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AAC/D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,KAAyB;IAClD,MAAM,KAAK,GAAkB,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC;IAE/D,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,GAAG,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC;QAClF,qFAAqF;QACrF,qCAAqC;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC;QAClF,KAAK,CAAC,IAAI,CAAC,MAAM,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,KAAK,IAAI,KAAK,IAAI,CAAC,CAAC;IAC5E,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;QAC1F,KAAK,CAAC,IAAI,CAAC,MAAM,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC;IAC5F,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { ContainerGraphJson } from "#/introspection/dependency-graph";
2
+ /**
3
+ * Mermaid `flowchart TD` source for a container graph — renders anywhere Mermaid does
4
+ * (GitHub markdown, docs tooling, mermaid.live) with no extra library.
5
+ *
6
+ * @since 0.6.0
7
+ */
8
+ export declare function toMermaidGraph(graph: ContainerGraphJson): string;
9
+ //# sourceMappingURL=mermaid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mermaid.d.ts","sourceRoot":"","sources":["../../../src/introspection/graph-adapters/mermaid.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAQ3E;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,CA8ChE"}
@@ -0,0 +1,47 @@
1
+ // Token names are caller-supplied and Mermaid labels are HTML-bearing quoted strings, so quotes
2
+ // and markup are neutralized with Mermaid's decimal entity codes before they reach a renderer.
3
+ function escapeMermaidLabel(value) {
4
+ return value.replaceAll("&", "#38;").replaceAll('"', "#34;").replaceAll("<", "#60;").replaceAll(">", "#62;");
5
+ }
6
+ /**
7
+ * Mermaid `flowchart TD` source for a container graph — renders anywhere Mermaid does
8
+ * (GitHub markdown, docs tooling, mermaid.live) with no extra library.
9
+ *
10
+ * @since 0.6.0
11
+ */
12
+ export function toMermaidGraph(graph) {
13
+ // Mermaid identifiers must stay word-safe; labels carry the real token names.
14
+ const idByNode = new Map();
15
+ const lines = ["flowchart TD"];
16
+ const parentIds = [];
17
+ const unboundIds = [];
18
+ graph.nodes.forEach((node, index) => {
19
+ const id = `n${String(index)}`;
20
+ idByNode.set(node.id, id);
21
+ lines.push(` ${id}["${escapeMermaidLabel(node.tokenName)}<br/>${node.kind} · ${node.scope}"]`);
22
+ if (node.fromParent) {
23
+ parentIds.push(id);
24
+ }
25
+ if (node.kind === "unbound") {
26
+ unboundIds.push(id);
27
+ }
28
+ });
29
+ for (const edge of graph.edges) {
30
+ const from = idByNode.get(edge.from);
31
+ const to = idByNode.get(edge.to);
32
+ if (from === undefined || to === undefined) {
33
+ continue;
34
+ }
35
+ lines.push(edge.label === undefined ? ` ${from} --> ${to}` : ` ${from} -->|"${escapeMermaidLabel(edge.label)}"| ${to}`);
36
+ }
37
+ if (parentIds.length > 0) {
38
+ lines.push(" classDef fromParent stroke-dasharray: 4 4;");
39
+ lines.push(` class ${parentIds.join(",")} fromParent;`);
40
+ }
41
+ if (unboundIds.length > 0) {
42
+ lines.push(" classDef unbound stroke-dasharray: 4 4,opacity:0.6;");
43
+ lines.push(` class ${unboundIds.join(",")} unbound;`);
44
+ }
45
+ return lines.join("\n");
46
+ }
47
+ //# sourceMappingURL=mermaid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mermaid.js","sourceRoot":"","sources":["../../../src/introspection/graph-adapters/mermaid.ts"],"names":[],"mappings":"AAEA,gGAAgG;AAChG,+FAA+F;AAC/F,SAAS,kBAAkB,CAAC,KAAa;IACvC,OAAO,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AAC/G,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,KAAyB;IACtD,8EAA8E;IAC9E,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC3C,MAAM,KAAK,GAAkB,CAAC,cAAc,CAAC,CAAC;IAC9C,MAAM,SAAS,GAAkB,EAAE,CAAC;IACpC,MAAM,UAAU,GAAkB,EAAE,CAAC;IAErC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QAClC,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAE/B,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC1B,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;QAEhG,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrB,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC5B,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACtB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEjC,IAAI,IAAI,KAAK,SAAS,IAAI,EAAE,KAAK,SAAS,EAAE,CAAC;YAC3C,SAAS;QACX,CAAC;QAED,KAAK,CAAC,IAAI,CACR,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,SAAS,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAC9G,CAAC;IACJ,CAAC;IAED,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;QAC3D,KAAK,CAAC,IAAI,CAAC,WAAW,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC3D,CAAC;IAED,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,KAAK,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;QACpE,KAAK,CAAC,IAAI,CAAC,WAAW,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACzD,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -1,4 +1,4 @@
1
- import type { ContainerGraphJson } from "#/introspection/dependency-graph";
1
+ import type { ContainerGraphJson, GraphNode } from "#/introspection/dependency-graph";
2
2
  /**
3
3
  * @since 0.3.16-canary.0
4
4
  */
@@ -6,8 +6,9 @@ export interface ReactFlowNode {
6
6
  readonly id: string;
7
7
  readonly data: {
8
8
  readonly label: string;
9
- readonly kind: string;
10
- readonly scope: string;
9
+ readonly tokenKey: string;
10
+ readonly kind: GraphNode["kind"];
11
+ readonly scope: GraphNode["scope"];
11
12
  readonly fromParent: boolean;
12
13
  };
13
14
  readonly position: {
@@ -23,6 +24,8 @@ export interface ReactFlowEdge {
23
24
  readonly source: string;
24
25
  readonly target: string;
25
26
  readonly label?: string;
27
+ readonly optional: boolean;
28
+ readonly slotName?: string;
26
29
  }
27
30
  /**
28
31
  * @since 0.3.16-canary.0
@@ -1 +1 @@
1
- {"version":3,"file":"reactflow.d.ts","sourceRoot":"","sources":["../../../src/introspection/graph-adapters/reactflow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAE3E;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE;QACb,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;KAC9B,CAAC;IACF,QAAQ,CAAC,QAAQ,EAAE;QAAE,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/D;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC;IAC7C,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC;CAC9C;AAUD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,kBAAkB,GAAG,cAAc,CAuB1E"}
1
+ {"version":3,"file":"reactflow.d.ts","sourceRoot":"","sources":["../../../src/introspection/graph-adapters/reactflow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAEtF;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE;QACb,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;QACjC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;QACnC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;KAC9B,CAAC;IACF,QAAQ,CAAC,QAAQ,EAAE;QAAE,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/D;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC;IAC7C,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC;CAC9C;AAWD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,kBAAkB,GAAG,cAAc,CA0B1E"}
@@ -1,7 +1,8 @@
1
1
  /**
2
+ * Initial grid layout: React Flow expects concrete positions; viewers re-layout anyway.
3
+ *
2
4
  * @since 0.3.16-canary.0
3
5
  */
4
- // Initial grid layout: React Flow expects concrete positions; viewers re-layout anyway.
5
6
  const GRID_COLUMN_COUNT = 5;
6
7
  const GRID_CELL_WIDTH_PX = 200;
7
8
  const GRID_CELL_HEIGHT_PX = 100;
@@ -13,6 +14,7 @@ export function toReactFlowGraph(graph) {
13
14
  id: node.id,
14
15
  data: {
15
16
  label: node.tokenName,
17
+ tokenKey: node.tokenKey,
16
18
  kind: node.kind,
17
19
  scope: node.scope,
18
20
  fromParent: node.fromParent,
@@ -27,6 +29,8 @@ export function toReactFlowGraph(graph) {
27
29
  source: edge.from,
28
30
  target: edge.to,
29
31
  ...(edge.label !== undefined ? { label: edge.label } : {}),
32
+ optional: edge.optional,
33
+ ...(edge.slotName !== undefined ? { slotName: edge.slotName } : {}),
30
34
  }));
31
35
  return { nodes, edges };
32
36
  }
@@ -1 +1 @@
1
- {"version":3,"file":"reactflow.js","sourceRoot":"","sources":["../../../src/introspection/graph-adapters/reactflow.ts"],"names":[],"mappings":"AAkCA;;GAEG;AACH,wFAAwF;AACxF,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAC5B,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAC/B,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAEhC;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAyB;IACxD,MAAM,KAAK,GAAyB,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;QAClE,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,IAAI,EAAE;YACJ,KAAK,EAAE,IAAI,CAAC,SAAS;YACrB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,UAAU,EAAE,IAAI,CAAC,UAAU;SAC5B;QACD,QAAQ,EAAE;YACR,CAAC,EAAE,CAAC,GAAG,GAAG,iBAAiB,CAAC,GAAG,kBAAkB;YACjD,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,iBAAiB,CAAC,GAAG,mBAAmB;SAC7D;KACF,CAAC,CAAC,CAAC;IAEJ,MAAM,KAAK,GAAyB,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;QAClE,EAAE,EAAE,QAAQ,GAAG,EAAE;QACjB,MAAM,EAAE,IAAI,CAAC,IAAI;QACjB,MAAM,EAAE,IAAI,CAAC,EAAE;QACf,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC3D,CAAC,CAAC,CAAC;IAEJ,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAC1B,CAAC"}
1
+ {"version":3,"file":"reactflow.js","sourceRoot":"","sources":["../../../src/introspection/graph-adapters/reactflow.ts"],"names":[],"mappings":"AAqCA;;;;GAIG;AACH,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAC5B,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAC/B,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAEhC;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAyB;IACxD,MAAM,KAAK,GAAyB,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;QAClE,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,IAAI,EAAE;YACJ,KAAK,EAAE,IAAI,CAAC,SAAS;YACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,UAAU,EAAE,IAAI,CAAC,UAAU;SAC5B;QACD,QAAQ,EAAE;YACR,CAAC,EAAE,CAAC,GAAG,GAAG,iBAAiB,CAAC,GAAG,kBAAkB;YACjD,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,iBAAiB,CAAC,GAAG,mBAAmB;SAC7D;KACF,CAAC,CAAC,CAAC;IAEJ,MAAM,KAAK,GAAyB,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;QAClE,EAAE,EAAE,QAAQ,GAAG,EAAE;QACjB,MAAM,EAAE,IAAI,CAAC,IAAI;QACjB,MAAM,EAAE,IAAI,CAAC,EAAE;QACf,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1D,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,GAAG,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACpE,CAAC,CAAC,CAAC;IAEJ,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAC1B,CAAC"}
@@ -1,7 +1,7 @@
1
- import type { BindingRegistry } from "#/registry";
2
- import type { ScopeManager } from "#/resolution/scope";
3
- import type { Token } from "#/token";
4
- import type { BindingIdentifier, BindingKind, BindingScope, BindingTag, Constructor, ResolveOptions } from "#/types";
1
+ import type { BindingRegistry } from "#/core/registry";
2
+ import type { Token } from "#/core/token";
3
+ import type { BindingIdentifier, BindingKind, BindingScope, BindingTag, Constructor, ResolveOptions } from "#/core/types";
4
+ import type { ScopeManager } from "#/lifecycle/scope-manager";
5
5
  /**
6
6
  * @since 0.3.16-canary.0
7
7
  */
@@ -1 +1 @@
1
- {"version":3,"file":"inspector.d.ts","sourceRoot":"","sources":["../../src/introspection/inspector.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGlD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAErC,OAAO,KAAK,EACV,iBAAiB,EACjB,WAAW,EACX,YAAY,EACZ,UAAU,EAEV,WAAW,EACX,cAAc,EACf,MAAM,SAAS,CAAC;AAIjB;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE;QACb,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;KAC1C,CAAC;IACF,QAAQ,CAAC,EAAE,EAAE,iBAAiB,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,WAAW,EAAE,aAAa,CAAC,eAAe,CAAC,CAAC;IACrD,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAC9B;AAID;;GAEG;AACH,qBAAa,SAAS;;IAMpB,YAAY,QAAQ,EAAE,eAAe,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,EAKxG;IAED,OAAO,IAAI,iBAAiB,CAO3B;IAED,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,aAAa,CAAC,eAAe,CAAC,CAG9F;IAED,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,WAAW,EAAE,OAAO,CAAC,EAAE,cAAc,EAAE,SAAS,CAAC,EAAE,MAAM,OAAO,GAAG,OAAO,CAYrG;IAED,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,WAAW,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAS7E;CAyBF"}
1
+ {"version":3,"file":"inspector.d.ts","sourceRoot":"","sources":["../../src/introspection/inspector.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,KAAK,EACV,iBAAiB,EACjB,WAAW,EACX,YAAY,EACZ,UAAU,EAEV,WAAW,EACX,cAAc,EACf,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAK9D;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE;QACb,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;KAC1C,CAAC;IACF,QAAQ,CAAC,EAAE,EAAE,iBAAiB,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,WAAW,EAAE,aAAa,CAAC,eAAe,CAAC,CAAC;IACrD,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAC9B;AAID;;GAEG;AACH,qBAAa,SAAS;;IAMpB,YAAY,QAAQ,EAAE,eAAe,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,EAKxG;IAED,OAAO,IAAI,iBAAiB,CAO3B;IAED,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,aAAa,CAAC,eAAe,CAAC,CAG9F;IAED,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,WAAW,EAAE,OAAO,CAAC,EAAE,cAAc,EAAE,SAAS,CAAC,EAAE,MAAM,OAAO,GAAG,OAAO,CAcrG;IAED,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,WAAW,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAS7E;CA2BF"}
@@ -1,7 +1,7 @@
1
- import { effectiveBindingScope } from "#/resolution/binding-scope";
2
- import { selectBinding } from "#/resolution/binding-select";
3
- import { tokenName } from "#/token";
4
- // ── Inspector ─────────────────────────────────────────────────────────────────
1
+ import { effectiveBindingScope } from "#/core/binding-scope";
2
+ import { tokenName } from "#/core/token";
3
+ import { selectAllBindings } from "#/resolution/select/binding-select";
4
+ // ── Inspector ────────────────────────────────────────────────────────────────────────────────────────────────────────
5
5
  /**
6
6
  * @since 0.3.16-canary.0
7
7
  */
@@ -31,8 +31,10 @@ export class Inspector {
31
31
  has(token, options, parentHas) {
32
32
  const bindings = this.#registry.getAll(token);
33
33
  if (bindings.length > 0) {
34
+ // An existence probe answers ambiguity with `true` — several matches still exist; only
35
+ // resolution has to pick one.
34
36
  if (options !== undefined) {
35
- if (selectBinding(bindings, options, this.#makeConstraintContext(options), tokenName(token)) !== undefined) {
37
+ if (selectAllBindings(bindings, options, this.#makeConstraintContext(options)).length > 0) {
36
38
  return true;
37
39
  }
38
40
  }
@@ -48,7 +50,7 @@ export class Inspector {
48
50
  return false;
49
51
  }
50
52
  if (options !== undefined) {
51
- return selectBinding(bindings, options, this.#makeConstraintContext(options), tokenName(token)) !== undefined;
53
+ return selectAllBindings(bindings, options, this.#makeConstraintContext(options)).length > 0;
52
54
  }
53
55
  return true;
54
56
  }
@@ -62,6 +64,8 @@ export class Inspector {
62
64
  };
63
65
  }
64
66
  #toSnapshot(binding) {
67
+ // Aliased, not copied: slot tags are frozen where they are built, so a caller's write throws
68
+ // instead of corrupting the registry — and the snapshot skips an allocation per binding.
65
69
  const slot = binding.slot.name !== undefined
66
70
  ? { name: binding.slot.name, tags: binding.slot.tags }
67
71
  : { tags: binding.slot.tags };
@@ -1 +1 @@
1
- {"version":3,"file":"inspector.js","sourceRoot":"","sources":["../../src/introspection/inspector.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"inspector.js","sourceRoot":"","sources":["../../src/introspection/inspector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { Binding } from "#/core/binding";
2
+ import type { Token } from "#/core/token";
3
+ import type { ActivationHandler, Constructor, DeactivationHandler, DependencyKey, ResolutionContext } from "#/core/types";
4
+ import type { MetadataReader } from "#/metadata/metadata-types";
5
+ /**
6
+ * @since 0.3.16-canary.0
7
+ */
8
+ export declare class LifecycleManager {
9
+ #private;
10
+ registerActivation<Value>(token: Token<Value> | Constructor<Value>, handler: ActivationHandler<Value>): void;
11
+ hasActivationHandlers<Value>(token: Token<Value> | Constructor<Value>): boolean;
12
+ get activationVersion(): number;
13
+ /** Container-level activation handlers for a token — hot-path accessor, no copies. */
14
+ activationHandlersFor<Value>(token: Token<Value> | Constructor<Value>): ReadonlyArray<ActivationHandler<unknown>> | undefined;
15
+ registerDeactivation<Value>(token: Token<Value> | Constructor<Value>, handler: DeactivationHandler<Value>): void;
16
+ /** Asked only while tearing down, so it reads the map directly rather than caching like activation. */
17
+ hasDeactivationHandlers<Value>(token: Token<Value> | Constructor<Value>): boolean;
18
+ /** Every token carrying a container-level hook, paired with the phase that registered it. */
19
+ hookedTokens(): Array<[DependencyKey, "onActivation" | "onDeactivation"]>;
20
+ runActivation<Value>(resolutionContext: ResolutionContext, binding: Binding<Value>, instance: Value, metadataReader: MetadataReader): Promise<Value>;
21
+ runActivationSync<Value>(resolutionContext: ResolutionContext, binding: Binding<Value>, instance: Value, metadataReader: MetadataReader): Value;
22
+ runDeactivation<Value>(binding: Binding<Value>, instance: Value, metadataReader: MetadataReader): Promise<void>;
23
+ runDeactivationSync<Value>(binding: Binding<Value>, instance: Value, metadataReader: MetadataReader): void;
24
+ /** Whether the deferred activation-hook table has had to be built. */
25
+ get isActivationTableBuilt(): boolean;
26
+ }
27
+ //# sourceMappingURL=lifecycle-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle-manager.d.ts","sourceRoot":"","sources":["../../src/lifecycle/lifecycle-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,KAAK,EACV,iBAAiB,EACjB,WAAW,EACX,mBAAmB,EACnB,aAAa,EACb,iBAAiB,EAClB,MAAM,cAAc,CAAC;AAEtB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAEhE;;GAEG;AACH,qBAAa,gBAAgB;;IAY3B,kBAAkB,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,iBAAiB,CAAC,KAAK,CAAC,GAAG,IAAI,CAM3G;IAED,qBAAqB,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,OAAO,CAG9E;IAED,IAAI,iBAAiB,IAAI,MAAM,CAE9B;IAED,sFAAsF;IACtF,qBAAqB,CAAC,KAAK,EACzB,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,GACvC,aAAa,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,GAAG,SAAS,CAavD;IAED,oBAAoB,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,mBAAmB,CAAC,KAAK,CAAC,GAAG,IAAI,CAG/G;IAED,uGAAuG;IACvG,uBAAuB,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,OAAO,CAGhF;IAED,6FAA6F;IAC7F,YAAY,IAAI,KAAK,CAAC,CAAC,aAAa,EAAE,cAAc,GAAG,gBAAgB,CAAC,CAAC,CASxE;IAEK,aAAa,CAAC,KAAK,EACvB,iBAAiB,EAAE,iBAAiB,EACpC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,EACvB,QAAQ,EAAE,KAAK,EACf,cAAc,EAAE,cAAc,GAC7B,OAAO,CAAC,KAAK,CAAC,CA2BhB;IAED,iBAAiB,CAAC,KAAK,EACrB,iBAAiB,EAAE,iBAAiB,EACpC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,EACvB,QAAQ,EAAE,KAAK,EACf,cAAc,EAAE,cAAc,GAC7B,KAAK,CAiCP;IAEK,eAAe,CAAC,KAAK,EACzB,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,EACvB,QAAQ,EAAE,KAAK,EACf,cAAc,EAAE,cAAc,GAC7B,OAAO,CAAC,IAAI,CAAC,CA6Bf;IAED,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,cAAc,EAAE,cAAc,GAAG,IAAI,CA6BzG;IAED,sEAAsE;IACtE,IAAI,sBAAsB,IAAI,OAAO,CAEpC;CACF"}
@@ -1,5 +1,5 @@
1
- import { AsyncActivationError, AsyncDeactivationError } from "#/errors";
2
- import { tokenName } from "#/token";
1
+ import { tokenName } from "#/core/token";
2
+ import { AsyncActivationError, AsyncDeactivationError, InvalidMetadataError } from "#/errors/errors";
3
3
  /**
4
4
  * @since 0.3.16-canary.0
5
5
  */
@@ -17,7 +17,6 @@ export class LifecycleManager {
17
17
  this.#activationVersion += 1;
18
18
  this.#cachedToken = undefined;
19
19
  this.#cachedHooks = undefined;
20
- // ✓ TS6.0: Map.getOrInsert (ES2025)
21
20
  const list = (this.#activationHooks ??= new Map()).getOrInsert(token, []);
22
21
  list.push(handler);
23
22
  }
@@ -47,6 +46,22 @@ export class LifecycleManager {
47
46
  const list = (this.#deactivationHooks ??= new Map()).getOrInsert(token, []);
48
47
  list.push(handler);
49
48
  }
49
+ /** Asked only while tearing down, so it reads the map directly rather than caching like activation. */
50
+ hasDeactivationHandlers(token) {
51
+ const list = this.#deactivationHooks?.get(token);
52
+ return list !== undefined && list.length > 0;
53
+ }
54
+ /** Every token carrying a container-level hook, paired with the phase that registered it. */
55
+ hookedTokens() {
56
+ const hooked = [];
57
+ for (const key of this.#activationHooks?.keys() ?? []) {
58
+ hooked.push([key, "onActivation"]);
59
+ }
60
+ for (const key of this.#deactivationHooks?.keys() ?? []) {
61
+ hooked.push([key, "onDeactivation"]);
62
+ }
63
+ return hooked;
64
+ }
50
65
  async runActivation(resolutionContext, binding, instance, metadataReader) {
51
66
  let activatedInstance = instance;
52
67
  // 1. @postConstruct() — after TC39 construction (constructor + accessor addInitializer callbacks)
@@ -155,8 +170,8 @@ export class LifecycleManager {
155
170
  }
156
171
  }
157
172
  }
158
- /** Whether the deferred table behind `#activationHooks` has had to be built. */
159
- get isBuilt() {
173
+ /** Whether the deferred activation-hook table has had to be built. */
174
+ get isActivationTableBuilt() {
160
175
  return this.#activationHooks !== undefined;
161
176
  }
162
177
  }
@@ -168,9 +183,24 @@ function lifecycleMethods(binding, metadataReader, phase) {
168
183
  }
169
184
  return metadataReader.getLifecycleMetadata(binding.target)?.[phase] ?? NO_METHODS;
170
185
  }
171
- /** Invokes a hook by name, tolerating a name whose member is not (or no longer) a method. */
186
+ /**
187
+ * Invokes a lifecycle hook by name.
188
+ *
189
+ * @remarks A name that is not a method can only come from a {@link MetadataReader} that answered
190
+ * wrongly, so it is reported rather than skipped — a hook that never runs is the failure a caller
191
+ * cannot see. A non-object instance has no hooks to run and is not an error.
192
+ */
172
193
  function callHook(instance, methodName) {
173
- const method = instance[methodName];
174
- return typeof method === "function" ? method.call(instance) : undefined;
194
+ if (typeof instance !== "object" || instance === null) {
195
+ return undefined;
196
+ }
197
+ const method = Reflect.get(instance, methodName);
198
+ if (typeof method !== "function") {
199
+ // The class is derived here rather than passed in, so the happy path carries no extra argument.
200
+ const constructor = Reflect.get(instance, "constructor");
201
+ const className = typeof constructor === "function" && constructor.name !== "" ? constructor.name : "(anonymous)";
202
+ throw new InvalidMetadataError(className, `lifecycle method '${methodName}' is not a method on the instance`);
203
+ }
204
+ return method.call(instance);
175
205
  }
176
- //# sourceMappingURL=lifecycle.js.map
206
+ //# sourceMappingURL=lifecycle-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle-manager.js","sourceRoot":"","sources":["../../src/lifecycle/lifecycle-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ import type { Binding } from "#/core/binding";
2
+ import type { BindingIdentifier } from "#/core/types";
3
+ /**
4
+ * @since 0.3.16-canary.0
5
+ */
6
+ export declare class ScopeManager {
7
+ #private;
8
+ readonly isChild: boolean;
9
+ constructor(isChild?: boolean);
10
+ get isClosed(): boolean;
11
+ markClosed(): void;
12
+ /** Awaits every in-flight async materialization, so teardown deactivates what they produce. */
13
+ settleInflight(): Promise<void>;
14
+ setSingleton<Value>(binding: Binding<Value>, instance: unknown): void;
15
+ /** Every binding in this container holding a cached singleton. */
16
+ cachedSingletons(): ReadonlyArray<Binding<unknown>>;
17
+ deleteSingleton<Value>(binding: Binding<Value>): boolean;
18
+ /** Swaps a re-slotted binding's tracked entry, so teardown pairs the instance with the live object. */
19
+ replaceSingleton(previous: Binding, next: Binding): void;
20
+ getInflight(id: BindingIdentifier): Promise<unknown> | undefined;
21
+ setInflight(id: BindingIdentifier, promise: Promise<unknown>): void;
22
+ clearInflight(id: BindingIdentifier): void;
23
+ /**
24
+ * The cached scoped instance, or {@link SCOPED_MISS}.
25
+ *
26
+ * @remarks One map read answers both existence and value; a cached `undefined` is the only
27
+ * shape that pays for a second, and it is the rare one.
28
+ */
29
+ readScoped(id: BindingIdentifier): unknown;
30
+ /** Takes the binding rather than its id, so a failure here can name the token — as `setSingleton` does. */
31
+ setScoped(binding: Binding, instance: unknown): void;
32
+ /** Releases a removed binding's scoped instance. A scoped instance has no deactivation. */
33
+ deleteScoped(id: BindingIdentifier): void;
34
+ /** Scoped instances currently cached — a structural count for diagnostics. */
35
+ get scopedCount(): number;
36
+ clearAll(): void;
37
+ /** Whether the deferred scoped-instance cache has had to be built. */
38
+ get isScopedCacheBuilt(): boolean;
39
+ }
40
+ /**
41
+ * Absent scoped entry — distinguishes it from a cached `undefined`.
42
+ *
43
+ * @remarks A `unique symbol`, so no value a caller could cache can ever equal it.
44
+ *
45
+ * @since 0.6.0
46
+ */
47
+ export declare const SCOPED_MISS: unique symbol;
48
+ //# sourceMappingURL=scope-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope-manager.d.ts","sourceRoot":"","sources":["../../src/lifecycle/scope-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAG9C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAGtD;;GAEG;AACH,qBAAa,YAAY;;IAUvB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAE1B,YAAY,OAAO,UAAQ,EAE1B;IAED,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,UAAU,IAAI,IAAI,CAEjB;IAED,+FAA+F;IACzF,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAMpC;IAED,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI,CAKpE;IAED,kEAAkE;IAClE,gBAAgB,IAAI,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAElD;IAED,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,OAAO,CAavD;IAED,uGAAuG;IACvG,gBAAgB,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CASvD;IAED,WAAW,CAAC,EAAE,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,SAAS,CAE/D;IAED,WAAW,CAAC,EAAE,EAAE,iBAAiB,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAElE;IAED,aAAa,CAAC,EAAE,EAAE,iBAAiB,GAAG,IAAI,CAEzC;IAED;;;;;OAKG;IACH,UAAU,CAAC,EAAE,EAAE,iBAAiB,GAAG,OAAO,CAUzC;IAED,2GAA2G;IAC3G,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI,CAKnD;IAED,2FAA2F;IAC3F,YAAY,CAAC,EAAE,EAAE,iBAAiB,GAAG,IAAI,CAExC;IAED,8EAA8E;IAC9E,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,QAAQ,IAAI,IAAI,CAUf;IACD,sEAAsE;IACtE,IAAI,kBAAkB,IAAI,OAAO,CAEhC;CACF;AAID;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,EAAE,OAAO,MAAiC,CAAC"}
@@ -0,0 +1,135 @@
1
+ import { NO_INSTANCE } from "#/core/binding";
2
+ import { tokenName } from "#/core/token";
3
+ import { MissingScopeContextError } from "#/errors/errors";
4
+ /**
5
+ * @since 0.3.16-canary.0
6
+ */
7
+ export class ScopeManager {
8
+ // Instances live on their binding; this list only lets disposal and `inspect()` enumerate them.
9
+ #singletonBindings;
10
+ // In-flight promises for async singleton creation — only an async resolve ever needs it.
11
+ #inflight;
12
+ // Scoped cache — only a child container resolving a `scoped` binding ever needs it.
13
+ #scoped;
14
+ // Set once by the owning container's dispose — refuses new materializations into torn-down state.
15
+ #closed = false;
16
+ isChild;
17
+ constructor(isChild = false) {
18
+ this.isChild = isChild;
19
+ }
20
+ get isClosed() {
21
+ return this.#closed;
22
+ }
23
+ markClosed() {
24
+ this.#closed = true;
25
+ }
26
+ /** Awaits every in-flight async materialization, so teardown deactivates what they produce. */
27
+ async settleInflight() {
28
+ let previousSize = -1;
29
+ while (this.#inflight !== undefined && this.#inflight.size > 0 && this.#inflight.size !== previousSize) {
30
+ previousSize = this.#inflight.size;
31
+ await Promise.allSettled(this.#inflight.values());
32
+ }
33
+ }
34
+ setSingleton(binding, instance) {
35
+ if (binding.instance === NO_INSTANCE) {
36
+ (this.#singletonBindings ??= []).push(binding);
37
+ }
38
+ binding.instance = instance;
39
+ }
40
+ /** Every binding in this container holding a cached singleton. */
41
+ cachedSingletons() {
42
+ return this.#singletonBindings ?? EMPTY_BINDINGS;
43
+ }
44
+ deleteSingleton(binding) {
45
+ if (binding.instance === NO_INSTANCE) {
46
+ return false;
47
+ }
48
+ binding.instance = NO_INSTANCE;
49
+ const tracked = this.#singletonBindings;
50
+ if (tracked !== undefined) {
51
+ const index = tracked.indexOf(binding);
52
+ if (index !== -1) {
53
+ tracked.splice(index, 1);
54
+ }
55
+ }
56
+ return true;
57
+ }
58
+ /** Swaps a re-slotted binding's tracked entry, so teardown pairs the instance with the live object. */
59
+ replaceSingleton(previous, next) {
60
+ const tracked = this.#singletonBindings;
61
+ if (tracked === undefined) {
62
+ return;
63
+ }
64
+ const index = tracked.indexOf(previous);
65
+ if (index !== -1) {
66
+ tracked[index] = next;
67
+ }
68
+ }
69
+ getInflight(id) {
70
+ return this.#inflight?.get(id);
71
+ }
72
+ setInflight(id, promise) {
73
+ (this.#inflight ??= new Map()).set(id, promise);
74
+ }
75
+ clearInflight(id) {
76
+ this.#inflight?.delete(id);
77
+ }
78
+ /**
79
+ * The cached scoped instance, or {@link SCOPED_MISS}.
80
+ *
81
+ * @remarks One map read answers both existence and value; a cached `undefined` is the only
82
+ * shape that pays for a second, and it is the rare one.
83
+ */
84
+ readScoped(id) {
85
+ const scoped = this.#scoped;
86
+ if (scoped === undefined) {
87
+ return SCOPED_MISS;
88
+ }
89
+ const cached = scoped.get(id);
90
+ if (cached !== undefined) {
91
+ return cached;
92
+ }
93
+ return scoped.has(id) ? undefined : SCOPED_MISS;
94
+ }
95
+ /** Takes the binding rather than its id, so a failure here can name the token — as `setSingleton` does. */
96
+ setScoped(binding, instance) {
97
+ if (!this.isChild) {
98
+ throw new MissingScopeContextError(tokenName(binding.token));
99
+ }
100
+ (this.#scoped ??= new Map()).set(binding.id, instance);
101
+ }
102
+ /** Releases a removed binding's scoped instance. A scoped instance has no deactivation. */
103
+ deleteScoped(id) {
104
+ this.#scoped?.delete(id);
105
+ }
106
+ /** Scoped instances currently cached — a structural count for diagnostics. */
107
+ get scopedCount() {
108
+ return this.#scoped?.size ?? 0;
109
+ }
110
+ clearAll() {
111
+ const tracked = this.#singletonBindings;
112
+ if (tracked !== undefined) {
113
+ for (const binding of tracked) {
114
+ binding.instance = NO_INSTANCE;
115
+ }
116
+ tracked.length = 0;
117
+ }
118
+ this.#inflight?.clear();
119
+ this.#scoped?.clear();
120
+ }
121
+ /** Whether the deferred scoped-instance cache has had to be built. */
122
+ get isScopedCacheBuilt() {
123
+ return this.#scoped !== undefined;
124
+ }
125
+ }
126
+ const EMPTY_BINDINGS = [];
127
+ /**
128
+ * Absent scoped entry — distinguishes it from a cached `undefined`.
129
+ *
130
+ * @remarks A `unique symbol`, so no value a caller could cache can ever equal it.
131
+ *
132
+ * @since 0.6.0
133
+ */
134
+ export const SCOPED_MISS = Symbol("di:scoped-miss");
135
+ //# sourceMappingURL=scope-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope-manager.js","sourceRoot":"","sources":["../../src/lifecycle/scope-manager.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
+ import type { Token } from "#/core/token";
1
2
  import type { MetadataReader } from "#/metadata/metadata-types";
2
- import type { Token } from "#/token";
3
3
  /**
4
4
  * @since 0.3.16-canary.0
5
5
  */
@@ -1 +1 @@
1
- {"version":3,"file":"metadata-reader-token.d.ts","sourceRoot":"","sources":["../../src/metadata/metadata-reader-token.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAEhE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAErC;;GAEG;AACH,eAAO,MAAM,mBAAmB,EAAE,KAAK,CAAC,cAAc,CAA2C,CAAC"}
1
+ {"version":3,"file":"metadata-reader-token.d.ts","sourceRoot":"","sources":["../../src/metadata/metadata-reader-token.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAEhE;;GAEG;AACH,eAAO,MAAM,mBAAmB,EAAE,KAAK,CAAC,cAAc,CAA2C,CAAC"}
@@ -1,4 +1,4 @@
1
- import { token } from "#/token";
1
+ import { token } from "#/core/token";
2
2
  /**
3
3
  * @since 0.3.16-canary.0
4
4
  */