@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,6 +1,6 @@
1
- import type { BindToBuilder } from "#/binding";
2
- import type { Token } from "#/token";
3
- import type { Constructor } from "#/types";
1
+ import type { BindToBuilder } from "#/core/binding";
2
+ import type { Token } from "#/core/token";
3
+ import type { Constructor } from "#/core/types";
4
4
  declare const SYNC_MODULE_BRAND: unique symbol;
5
5
  declare const ASYNC_MODULE_BRAND: unique symbol;
6
6
  /**
@@ -30,14 +30,14 @@ export interface AsyncModule {
30
30
  * @since 0.3.16-canary.0
31
31
  */
32
32
  export interface ModuleBuilder {
33
- bind<const Value>(token: Token<Value> | Constructor<Value>): BindToBuilder<Value>;
33
+ bind<Value>(token: Token<Value> | Constructor<Value>): BindToBuilder<Value>;
34
34
  import(...modules: Array<SyncModule>): void;
35
35
  }
36
36
  /**
37
37
  * @since 0.3.16-canary.0
38
38
  */
39
39
  export interface AsyncModuleBuilder {
40
- bind<const Value>(token: Token<Value> | Constructor<Value>): BindToBuilder<Value>;
40
+ bind<Value>(token: Token<Value> | Constructor<Value>): BindToBuilder<Value>;
41
41
  import(...modules: Array<SyncModule | AsyncModule>): void;
42
42
  }
43
43
  /**
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../src/core/module.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAIhD,QAAA,MAAM,iBAAiB,EAAE,OAAO,MAAiC,CAAC;AAClE,QAAA,MAAM,kBAAkB,EAAE,OAAO,MAAkC,CAAC;AAEpE;;;;;GAKG;AACH,eAAO,MAAM,YAAY,EAAE,OAAO,MAAkC,CAAC;AAErE;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,CAAC,iBAAiB,CAAC,EAAE,IAAI,CAAC;IACnC,QAAQ,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAC;CAC3D;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,CAAC,kBAAkB,CAAC,EAAE,IAAI,CAAC;IACpC,QAAQ,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,kBAAkB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACzE;AAID;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IAC5E,MAAM,CAAC,GAAG,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC;CAC7C;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IAC5E,MAAM,CAAC,GAAG,OAAO,EAAE,KAAK,CAAC,UAAU,GAAG,WAAW,CAAC,GAAG,IAAI,CAAC;CAC3D;AAID;;GAEG;AACH,eAAO,MAAM,UAAU;IACrB,MAAM,OAAO,MAAM,SAAS,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,GAAG,UAAU;CAO1E,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,WAAW;IACtB,MAAM,OAAO,MAAM,SAAS,CAAC,OAAO,EAAE,kBAAkB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,WAAW;CAOzF,CAAC;AAIF;;GAEG;AACH,eAAO,MAAM,MAAM;IACjB,MAAM,OAAO,MAAM,SAAS,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,GAAG,UAAU;IAGzE,WAAW,OAAO,MAAM,SAAS,CAAC,OAAO,EAAE,kBAAkB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,WAAW;CAG9F,CAAC;AAEF;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,WAAW,GAAG,MAAM,IAAI,UAAU,CAEnF"}
@@ -1,4 +1,4 @@
1
- // ── Branded types (runtime symbols for branding) ─────────────────────────────
1
+ // ── Branded types (runtime symbols for branding) ─────────────────────────────────────────────────────────────────────
2
2
  const SYNC_MODULE_BRAND = Symbol("di:sync-module");
3
3
  const ASYNC_MODULE_BRAND = Symbol("di:async-module");
4
4
  /**
@@ -8,7 +8,7 @@ const ASYNC_MODULE_BRAND = Symbol("di:async-module");
8
8
  * @since 0.5.0-canary.7
9
9
  */
10
10
  export const MODULE_SETUP = Symbol("di:module-setup");
11
- // ── Static factories ──────────────────────────────────────────────────────────
11
+ // ── Static factories ─────────────────────────────────────────────────────────────────────────────────────────────────
12
12
  /**
13
13
  * @since 0.3.16-canary.0
14
14
  */
@@ -33,7 +33,7 @@ export const AsyncModule = {
33
33
  };
34
34
  },
35
35
  };
36
- // ── Module — unified API ──────────────────────────────────────────────────────
36
+ // ── Module — unified API ─────────────────────────────────────────────────────────────────────────────────────────────
37
37
  /**
38
38
  * @since 0.3.16-canary.0
39
39
  */
@@ -49,6 +49,6 @@ export const Module = {
49
49
  * @since 0.3.16-canary.0
50
50
  */
51
51
  export function isSyncModule(module) {
52
- return module[SYNC_MODULE_BRAND];
52
+ return module[SYNC_MODULE_BRAND] === true;
53
53
  }
54
54
  //# sourceMappingURL=module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module.js","sourceRoot":"","sources":["../../src/core/module.ts"],"names":[],"mappings":"AAIA,wHAAwH;AAExH,MAAM,iBAAiB,GAAkB,MAAM,CAAC,gBAAgB,CAAC,CAAC;AAClE,MAAM,kBAAkB,GAAkB,MAAM,CAAC,iBAAiB,CAAC,CAAC;AAEpE;;;;;GAKG;AACH,MAAM,CAAC,MAAM,YAAY,GAAkB,MAAM,CAAC,iBAAiB,CAAC,CAAC;AAsCrE,wHAAwH;AAExH;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,MAAM,CAAC,IAAY,EAAE,KAAuC;QAC1D,OAAO;YACL,IAAI;YACJ,CAAC,iBAAiB,CAAC,EAAE,IAAa;YAClC,CAAC,YAAY,CAAC,EAAE,KAAK;SACtB,CAAC;IACJ,CAAC;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,MAAM,CAAC,IAAY,EAAE,KAAqD;QACxE,OAAO;YACL,IAAI;YACJ,CAAC,kBAAkB,CAAC,EAAE,IAAa;YACnC,CAAC,YAAY,CAAC,EAAE,KAAK;SACtB,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,wHAAwH;AAExH;;GAEG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,MAAM,CAAC,IAAY,EAAE,KAAuC;QAC1D,OAAO,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACxC,CAAC;IACD,WAAW,CAAC,IAAY,EAAE,KAAqD;QAC7E,OAAO,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACzC,CAAC;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,MAAgC;IAC3D,OAAQ,MAA8B,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;AACrE,CAAC"}
@@ -1,6 +1,7 @@
1
- import type { Binding } from "#/binding";
2
- import type { Token } from "#/token";
3
- import type { BindingIdentifier, Constructor } from "#/types";
1
+ import type { Binding } from "#/core/binding";
2
+ import type { BindingTag } from "#/core/tag";
3
+ import type { Token } from "#/core/token";
4
+ import type { BindingIdentifier, Constructor } from "#/core/types";
4
5
  /**
5
6
  * @since 0.3.16-canary.0
6
7
  */
@@ -8,13 +9,15 @@ export declare class BindingRegistry {
8
9
  #private;
9
10
  /** Monotonic version — increments on every mutation. */
10
11
  get version(): number;
12
+ /** Whether a constant has ever been registered here, and so whether teardown has anything to sweep. */
13
+ get hasHeldConstantBinding(): boolean;
11
14
  /**
12
15
  * Registers a mutation the indexes don't care about (a fluent chain refining scope or an
13
16
  * activation hook in place), so version-stamped resolver caches still invalidate.
14
17
  */
15
18
  touch(): void;
16
19
  /**
17
- * Add or replace binding using slot-aware last-wins. Returns the displaced binding, if any.
20
+ * Adds or replaces a binding using slot-aware last-wins. Returns the displaced binding, if any.
18
21
  *
19
22
  * @remarks The binding is stored by reference — it must come from `createBinding`, which is
20
23
  * what guarantees the single hidden class the resolver's hot reads depend on.
@@ -34,12 +37,29 @@ export declare class BindingRegistry {
34
37
  allBindings(): ReadonlyArray<Binding>;
35
38
  /** Remove all bindings. Returns all removed. */
36
39
  clear(): ReadonlyArray<Binding>;
40
+ /** Whether a slot-based binding currently occupies `binding`'s slot, so adding it would displace. */
41
+ hasSlotOccupant(binding: Binding): boolean;
37
42
  getSimpleNamed(token: Token<unknown> | Constructor, name: string): Binding | undefined;
38
- getSimpleTagged(token: Token<unknown> | Constructor, tagKey: string, tagValue: unknown): Binding | undefined;
43
+ /**
44
+ * The binding indexed under one criterion.
45
+ *
46
+ * @remarks Exact, with no re-check: criteria are interned, so a `Map` keyed by the pair answers by
47
+ * identity — where a value-keyed map answered by SameValueZero and parted from `Object.is` on ±0.
48
+ */
49
+ getSimpleTagged(token: Token<unknown> | Constructor, criterion: BindingTag): Binding | undefined;
50
+ /**
51
+ * The multi-tag bindings whose slot's first criterion is `criterion`.
52
+ *
53
+ * @remarks A prefilter, not an answer: a bucket member's remaining tags still have to be matched
54
+ * against the request — first-criterion bucketing only guarantees each candidate appears once.
55
+ */
56
+ getMultiTagged(token: Token<unknown> | Constructor, criterion: BindingTag): ReadonlyArray<Binding> | undefined;
39
57
  getFastDefault(token: Token<unknown> | Constructor): Binding | undefined;
40
58
  /** Summarize available slot strings for a token (for error messages). */
41
59
  availableSlotStrings(token: Token<unknown> | Constructor): Array<string>;
42
- /** Whether the deferred table behind `#simpleNamed` has had to be built. */
43
- get isBuilt(): boolean;
60
+ /** Whether the deferred named-slot index has had to be built. */
61
+ get isNamedIndexBuilt(): boolean;
62
+ /** Whether the deferred tagged-slot index has had to be built. */
63
+ get isTaggedIndexBuilt(): boolean;
44
64
  }
45
65
  //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/core/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAE9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAiB,MAAM,cAAc,CAAC;AAElF;;GAEG;AACH,qBAAa,eAAe;;IAsB1B,wDAAwD;IACxD,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,uGAAuG;IACvG,IAAI,sBAAsB,IAAI,OAAO,CAEpC;IAED;;;OAGG;IACH,KAAK,IAAI,IAAI,CAEZ;IAED;;;;;OAKG;IACH,GAAG,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS,CAyCzC;IAED,iEAAiE;IACjE,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,CAajE;IAED,iFAAiF;IACjF,UAAU,CAAC,EAAE,EAAE,iBAAiB,GAAG,OAAO,GAAG,SAAS,CA4BrD;IAED,oCAAoC;IACpC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,WAAW,GAAG,aAAa,CAAC,OAAO,CAAC,CAElE;IAED,yBAAyB;IACzB,OAAO,CAAC,EAAE,EAAE,iBAAiB,GAAG,OAAO,GAAG,SAAS,CAElD;IAED,6CAA6C;IAC7C,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,WAAW,GAAG,OAAO,CAIhD;IAED,oCAAoC;IACpC,WAAW,IAAI,aAAa,CAAC,OAAO,CAAC,CAMpC;IAED,gDAAgD;IAChD,KAAK,IAAI,aAAa,CAAC,OAAO,CAAC,CAU9B;IAED,qGAAqG;IACrG,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAWzC;IAED,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAErF;IAED;;;;;OAKG;IACH,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,WAAW,EAAE,SAAS,EAAE,UAAU,GAAG,OAAO,GAAG,SAAS,CAE/F;IAED;;;;;OAKG;IACH,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,WAAW,EAAE,SAAS,EAAE,UAAU,GAAG,aAAa,CAAC,OAAO,CAAC,GAAG,SAAS,CAE7G;IAED,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,WAAW,GAAG,OAAO,GAAG,SAAS,CAEvE;IAED,yEAAyE;IACzE,oBAAoB,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAGvE;IA0FD,iEAAiE;IACjE,IAAI,iBAAiB,IAAI,OAAO,CAE/B;IAED,kEAAkE;IAClE,IAAI,kBAAkB,IAAI,OAAO,CAEhC;CACF"}
@@ -1,4 +1,4 @@
1
- import { bindingSlotEquals, bindingSlotToString } from "#/binding";
1
+ import { bindingSlotEquals, bindingSlotToString } from "#/core/binding";
2
2
  /**
3
3
  * @since 0.3.16-canary.0
4
4
  */
@@ -13,13 +13,23 @@ export class BindingRegistry {
13
13
  #simpleNamed;
14
14
  // Fast path for one default slot binding with no predicate
15
15
  #fastDefault = new Map();
16
- // Fast lookup for slot { name: undefined, tags: [[key, value]] } with no predicate — likewise
17
- // unallocated until a tagged binding is registered.
16
+ // Fast lookup for a slot carrying exactly one tag — keyed by the interned criterion itself, so
17
+ // the (key, value) pair is one hash rather than two. Unallocated until a tagged binding lands.
18
18
  #simpleTagged;
19
+ // Name-less slots with two or more tags, bucketed by their FIRST criterion. A matching slot's
20
+ // every tag is in the request, so walking the request's buckets finds each candidate exactly once.
21
+ #multiTagged;
22
+ // Set on the first constant registered and never cleared. Teardown only needs the negative answer
23
+ // to be exact, and that is what lets a container holding no constant skip its sweep entirely.
24
+ #heldConstantBinding = false;
19
25
  /** Monotonic version — increments on every mutation. */
20
26
  get version() {
21
27
  return this.#version;
22
28
  }
29
+ /** Whether a constant has ever been registered here, and so whether teardown has anything to sweep. */
30
+ get hasHeldConstantBinding() {
31
+ return this.#heldConstantBinding;
32
+ }
23
33
  /**
24
34
  * Registers a mutation the indexes don't care about (a fluent chain refining scope or an
25
35
  * activation hook in place), so version-stamped resolver caches still invalidate.
@@ -28,33 +38,47 @@ export class BindingRegistry {
28
38
  this.#version += 1;
29
39
  }
30
40
  /**
31
- * Add or replace binding using slot-aware last-wins. Returns the displaced binding, if any.
41
+ * Adds or replaces a binding using slot-aware last-wins. Returns the displaced binding, if any.
32
42
  *
33
43
  * @remarks The binding is stored by reference — it must come from `createBinding`, which is
34
44
  * what guarantees the single hidden class the resolver's hot reads depend on.
35
45
  */
36
46
  add(binding) {
37
47
  this.#version += 1;
48
+ if (binding.kind === "constant") {
49
+ this.#heldConstantBinding = true;
50
+ }
38
51
  const key = binding.token;
39
- // Eager, not computed: a bind is usually the token's first, so the fallback is usually the
40
- // one that gets stored — and the computed form would add a call to allocating it anyway.
41
- const bindingsForToken = this.#bindings.getOrInsert(key, []);
52
+ // Copy-on-write: a selection may be walking the current list inside a `when()` predicate, so
53
+ // mutation replaces the array and never splices one that has been handed out.
54
+ const bindingsForToken = this.#bindings.get(key);
42
55
  // Only apply last-wins for slot-based bindings (not predicate-only)
43
56
  let displacedBinding;
44
- if (!isPurePredicateBinding(binding)) {
45
- const existingIndex = bindingsForToken.findIndex((candidate) => !isPurePredicateBinding(candidate) && bindingSlotEquals(candidate.slot, binding.slot));
46
- if (existingIndex !== -1) {
47
- displacedBinding = bindingsForToken[existingIndex];
48
- this.#byId.delete(displacedBinding.id);
49
- bindingsForToken.splice(existingIndex, 1);
50
- this.#deindexSimpleNamedBinding(key, displacedBinding);
51
- this.#deindexSimpleTaggedBinding(key, displacedBinding);
57
+ let nextBindings;
58
+ if (bindingsForToken === undefined) {
59
+ nextBindings = [binding];
60
+ }
61
+ else {
62
+ if (!isPurePredicateBinding(binding)) {
63
+ const existingIndex = bindingsForToken.findIndex((candidate) => !isPurePredicateBinding(candidate) && bindingSlotEquals(candidate.slot, binding.slot));
64
+ if (existingIndex !== -1) {
65
+ displacedBinding = bindingsForToken[existingIndex];
66
+ this.#byId.delete(displacedBinding.id);
67
+ this.#deindexSimpleNamedBinding(key, displacedBinding);
68
+ this.#deindexSimpleTaggedBinding(key, displacedBinding);
69
+ this.#deindexMultiTaggedBinding(key, displacedBinding);
70
+ }
52
71
  }
72
+ nextBindings =
73
+ displacedBinding === undefined
74
+ ? [...bindingsForToken, binding]
75
+ : [...bindingsForToken.filter((candidate) => candidate !== displacedBinding), binding];
53
76
  }
54
- bindingsForToken.push(binding);
77
+ this.#bindings.set(key, nextBindings);
55
78
  this.#byId.set(binding.id, binding);
56
79
  this.#indexSimpleNamedBinding(key, binding);
57
80
  this.#indexSimpleTaggedBinding(key, binding);
81
+ this.#indexMultiTaggedBinding(key, binding);
58
82
  this.#refreshFastDefaultForToken(key);
59
83
  return displacedBinding;
60
84
  }
@@ -66,6 +90,7 @@ export class BindingRegistry {
66
90
  this.#bindings.delete(key);
67
91
  this.#simpleNamed?.delete(key);
68
92
  this.#simpleTagged?.delete(key);
93
+ this.#multiTagged?.delete(key);
69
94
  this.#fastDefault.delete(key);
70
95
  for (const binding of bindingsForToken) {
71
96
  this.#byId.delete(binding.id);
@@ -84,18 +109,20 @@ export class BindingRegistry {
84
109
  const bindingsForToken = this.#bindings.get(key);
85
110
  if (bindingsForToken !== undefined) {
86
111
  const bindingIndex = bindingsForToken.findIndex((candidate) => candidate.id === id);
87
- if (bindingIndex !== -1) {
88
- bindingsForToken.splice(bindingIndex, 1);
89
- }
112
+ // Copy-on-write, like `add`: a walk holding the current array must not lose its place.
113
+ const remaining = bindingIndex === -1 ? bindingsForToken : bindingsForToken.toSpliced(bindingIndex, 1);
90
114
  this.#deindexSimpleNamedBinding(key, binding);
91
115
  this.#deindexSimpleTaggedBinding(key, binding);
92
- if (bindingsForToken.length === 0) {
116
+ this.#deindexMultiTaggedBinding(key, binding);
117
+ if (remaining.length === 0) {
93
118
  this.#bindings.delete(key);
94
119
  this.#simpleNamed?.delete(key);
95
120
  this.#simpleTagged?.delete(key);
121
+ this.#multiTagged?.delete(key);
96
122
  this.#fastDefault.delete(key);
97
123
  }
98
124
  else {
125
+ this.#bindings.set(key, remaining);
99
126
  this.#refreshFastDefaultForToken(key);
100
127
  }
101
128
  }
@@ -131,17 +158,41 @@ export class BindingRegistry {
131
158
  this.#byId.clear();
132
159
  this.#simpleNamed?.clear();
133
160
  this.#simpleTagged?.clear();
161
+ this.#multiTagged?.clear();
134
162
  this.#fastDefault.clear();
135
163
  return all;
136
164
  }
165
+ /** Whether a slot-based binding currently occupies `binding`'s slot, so adding it would displace. */
166
+ hasSlotOccupant(binding) {
167
+ if (isPurePredicateBinding(binding)) {
168
+ return false;
169
+ }
170
+ const candidates = this.#bindings.get(binding.token);
171
+ if (candidates === undefined) {
172
+ return false;
173
+ }
174
+ return candidates.some((candidate) => !isPurePredicateBinding(candidate) && bindingSlotEquals(candidate.slot, binding.slot));
175
+ }
137
176
  getSimpleNamed(token, name) {
138
177
  return this.#simpleNamed?.get(token)?.get(name);
139
178
  }
140
- getSimpleTagged(token, tagKey, tagValue) {
141
- return this.#simpleTagged
142
- ?.get(token)
143
- ?.get(tagKey)
144
- ?.get(tagValue);
179
+ /**
180
+ * The binding indexed under one criterion.
181
+ *
182
+ * @remarks Exact, with no re-check: criteria are interned, so a `Map` keyed by the pair answers by
183
+ * identity — where a value-keyed map answered by SameValueZero and parted from `Object.is` on ±0.
184
+ */
185
+ getSimpleTagged(token, criterion) {
186
+ return this.#simpleTagged?.get(token)?.get(criterion);
187
+ }
188
+ /**
189
+ * The multi-tag bindings whose slot's first criterion is `criterion`.
190
+ *
191
+ * @remarks A prefilter, not an answer: a bucket member's remaining tags still have to be matched
192
+ * against the request — first-criterion bucketing only guarantees each candidate appears once.
193
+ */
194
+ getMultiTagged(token, criterion) {
195
+ return this.#multiTagged?.get(token)?.get(criterion);
145
196
  }
146
197
  getFastDefault(token) {
147
198
  return this.#fastDefault.get(token);
@@ -152,38 +203,51 @@ export class BindingRegistry {
152
203
  return bindingsForToken.map((binding) => bindingSlotToString(binding.slot));
153
204
  }
154
205
  #indexSimpleTaggedBinding(tokenKey, binding) {
155
- const tag = simpleTagOf(binding);
156
- if (tag === undefined) {
206
+ const criterion = simpleTagOf(binding);
207
+ if (criterion === undefined) {
157
208
  return;
158
209
  }
159
- const [tagKey, tagValue] = tag;
160
- const byTagKey = (this.#simpleTagged ??= new Map()).getOrInsert(tokenKey, new Map());
161
- const byTagValue = byTagKey.getOrInsert(tagKey, new Map());
162
- byTagValue.set(tagValue, binding);
210
+ const byCriterion = (this.#simpleTagged ??= new Map()).getOrInsert(tokenKey, new Map());
211
+ byCriterion.set(criterion, binding);
163
212
  }
164
213
  #deindexSimpleTaggedBinding(tokenKey, binding) {
165
- const tag = simpleTagOf(binding);
166
- if (tag === undefined) {
214
+ const criterion = simpleTagOf(binding);
215
+ if (criterion === undefined) {
167
216
  return;
168
217
  }
169
- const [tagKey, tagValue] = tag;
170
- const byTagKey = this.#simpleTagged?.get(tokenKey);
171
- if (byTagKey === undefined) {
218
+ const byCriterion = this.#simpleTagged?.get(tokenKey);
219
+ if (byCriterion === undefined) {
172
220
  return;
173
221
  }
174
- const byTagValue = byTagKey.get(tagKey);
175
- if (byTagValue === undefined) {
222
+ if (byCriterion.get(criterion)?.id === binding.id) {
223
+ byCriterion.delete(criterion);
224
+ if (byCriterion.size === 0) {
225
+ this.#simpleTagged.delete(tokenKey);
226
+ }
227
+ }
228
+ }
229
+ #indexMultiTaggedBinding(tokenKey, binding) {
230
+ const firstCriterion = multiTagFirstOf(binding);
231
+ if (firstCriterion === undefined) {
176
232
  return;
177
233
  }
178
- const current = byTagValue.get(tagValue);
179
- if (current?.id === binding.id) {
180
- byTagValue.delete(tagValue);
181
- if (byTagValue.size === 0) {
182
- byTagKey.delete(tagKey);
183
- if (byTagKey.size === 0) {
184
- this.#simpleTagged.delete(tokenKey);
185
- }
186
- }
234
+ const buckets = (this.#multiTagged ??= new Map()).getOrInsert(tokenKey, new Map());
235
+ buckets.getOrInsert(firstCriterion, []).push(binding);
236
+ }
237
+ #deindexMultiTaggedBinding(tokenKey, binding) {
238
+ const firstCriterion = multiTagFirstOf(binding);
239
+ if (firstCriterion === undefined) {
240
+ return;
241
+ }
242
+ const bucket = this.#multiTagged?.get(tokenKey)?.get(firstCriterion);
243
+ if (bucket === undefined) {
244
+ return;
245
+ }
246
+ const bindingIndex = bucket.findIndex((candidate) => candidate.id === binding.id);
247
+ // Spliced in place: nothing walks a bucket while user code runs — candidates are gathered
248
+ // into their own array before any predicate is evaluated.
249
+ if (bindingIndex !== -1) {
250
+ bucket.splice(bindingIndex, 1);
187
251
  }
188
252
  }
189
253
  #indexSimpleNamedBinding(tokenKey, binding) {
@@ -219,10 +283,14 @@ export class BindingRegistry {
219
283
  }
220
284
  this.#fastDefault.delete(tokenKey);
221
285
  }
222
- /** Whether the deferred table behind `#simpleNamed` has had to be built. */
223
- get isBuilt() {
286
+ /** Whether the deferred named-slot index has had to be built. */
287
+ get isNamedIndexBuilt() {
224
288
  return this.#simpleNamed !== undefined;
225
289
  }
290
+ /** Whether the deferred tagged-slot index has had to be built. */
291
+ get isTaggedIndexBuilt() {
292
+ return this.#simpleTagged !== undefined;
293
+ }
226
294
  }
227
295
  /** The name a binding is indexed under, or `undefined` when its slot is more than a plain name. */
228
296
  function simpleNameOf(binding) {
@@ -232,12 +300,17 @@ function simpleNameOf(binding) {
232
300
  /**
233
301
  * The tag a binding is indexed under, or `undefined` when its slot is more than one plain tag.
234
302
  *
235
- * @remarks A predicate is excluded here — unlike the name index — because the tag index is read
236
- * without a re-check, so an indexed hit must be unconditional.
303
+ * @remarks Carries predicate-bearing bindings too, exactly as the name index does: every lane that
304
+ * reads this index already re-checks what it finds, so an indexed hit was never unconditional.
237
305
  */
238
306
  function simpleTagOf(binding) {
239
307
  const { name, tags } = binding.slot;
240
- return name === undefined && tags.length === 1 && binding.predicate === undefined ? tags[0] : undefined;
308
+ return name === undefined && tags.length === 1 ? tags[0] : undefined;
309
+ }
310
+ /** The first criterion a multi-tag slot is bucketed under, or `undefined` for any other shape. */
311
+ function multiTagFirstOf(binding) {
312
+ const { name, tags } = binding.slot;
313
+ return name === undefined && tags.length >= 2 ? tags[0] : undefined;
241
314
  }
242
315
  /** A binding nothing has to be matched against: the default slot, no predicate. */
243
316
  function isDefaultSlotBinding(binding) {
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/core/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ /** Tag keys and the interned pairs they mint — the one way a slot criterion is built. */
2
+ declare const TAG_KEY_BRAND: unique symbol;
3
+ declare const BINDING_TAG_BRAND: unique symbol;
4
+ /**
5
+ * A slot's or a request's tag key set, as one word.
6
+ *
7
+ * @remarks A slot matches only if the request carries every key the slot declares, which is
8
+ * `(requestMask & slotMask) === slotMask` — the whole subset test, before any value is read. Keys
9
+ * are prefiltered rather than values indexed because a key set fits in a word and a value set does not.
10
+ *
11
+ * @since 0.6.0
12
+ */
13
+ export type TagKeyMask = number & {
14
+ readonly [TAG_KEY_BRAND]: "mask";
15
+ };
16
+ /**
17
+ * The empty key set: what an untagged slot and an untagged request both carry.
18
+ *
19
+ * @since 0.6.0
20
+ */
21
+ export declare const NO_TAG_KEYS: TagKeyMask;
22
+ /**
23
+ * One `[key, value]` criterion, interned so equal criteria are the same object.
24
+ *
25
+ * @remarks Only {@link TagKey.of} mints one, which is what makes identity a sound stand-in for the
26
+ * `Object.is` comparison the slot contract requires. Never build one by hand — the matcher and the
27
+ * registry index both read identity, so a hand-built criterion matches nothing.
28
+ *
29
+ * @since 0.6.0
30
+ */
31
+ export interface BindingTag<Value = unknown> {
32
+ readonly key: TagKey<Value>;
33
+ readonly value: Value;
34
+ /** This pair's key mask, copied off the key so the matcher reads one field. */
35
+ readonly mask: TagKeyMask;
36
+ readonly [BINDING_TAG_BRAND]: true;
37
+ }
38
+ /**
39
+ * A named tag key, and the factory for its criteria.
40
+ *
41
+ * @since 0.6.0
42
+ */
43
+ export interface TagKey<Value = unknown> {
44
+ readonly name: string;
45
+ /** Process-monotonic, so a key set is a mask and the registry can index on a number. */
46
+ readonly id: number;
47
+ readonly mask: TagKeyMask;
48
+ /** The criterion for one value, interned: the same value always yields the same object. */
49
+ of(value: Value): BindingTag<Value>;
50
+ }
51
+ /**
52
+ * Declares a tag key, whose `of()` builds the criteria a `whenTagged` and a resolve both take.
53
+ *
54
+ * @remarks The value type is checked at both ends: a key declared `tag<Region>("region")` refuses a
55
+ * value that is not a `Region`, so a bind site and a resolve site cannot drift apart silently.
56
+ *
57
+ * @example
58
+ * ```ts
59
+ * const Region = tag<"eu" | "us">("region");
60
+ * container.bind(Storage).to(S3).whenTagged(Region.of("eu"));
61
+ * container.resolve(Storage, { tag: Region.of("eu") });
62
+ * ```
63
+ *
64
+ * @since 0.6.0
65
+ */
66
+ export declare function tag<Value = unknown>(name: string): TagKey<Value>;
67
+ /**
68
+ * The key set a list of criteria covers.
69
+ *
70
+ * @since 0.6.0
71
+ */
72
+ export declare function tagKeyMaskOf(tags: ReadonlyArray<BindingTag>): TagKeyMask;
73
+ /**
74
+ * Whether a request carrying `requestMask` covers every key in `slotMask`.
75
+ *
76
+ * @since 0.6.0
77
+ */
78
+ export declare function coversTagKeys(requestMask: TagKeyMask, slotMask: TagKeyMask): boolean;
79
+ export {};
80
+ //# sourceMappingURL=tag.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tag.d.ts","sourceRoot":"","sources":["../../src/core/tag.ts"],"names":[],"mappings":"AAAA,yFAAyF;AAEzF,OAAO,CAAC,MAAM,aAAa,EAAE,OAAO,MAAM,CAAC;AAC3C,OAAO,CAAC,MAAM,iBAAiB,EAAE,OAAO,MAAM,CAAC;AAU/C;;;;;;;;GAQG;AACH,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG;IAAE,QAAQ,CAAC,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvE;;;;GAIG;AACH,eAAO,MAAM,WAAW,EAAQ,UAAU,CAAC;AAE3C;;;;;;;;GAQG;AACH,MAAM,WAAW,UAAU,CAAC,KAAK,GAAG,OAAO;IACzC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,+EAA+E;IAC/E,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,CAAC,iBAAiB,CAAC,EAAE,IAAI,CAAC;CACpC;AAED;;;;GAIG;AACH,MAAM,WAAW,MAAM,CAAC,KAAK,GAAG,OAAO;IACrC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,wFAAwF;IACxF,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,2FAA2F;IAC3F,EAAE,CAAC,KAAK,EAAE,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;CACrC;AAiBD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,GAAG,CAAC,KAAK,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAyChE;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,aAAa,CAAC,UAAU,CAAC,GAAG,UAAU,CAQxE;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,GAAG,OAAO,CAEpF"}
@@ -0,0 +1,96 @@
1
+ /** Tag keys and the interned pairs they mint — the one way a slot criterion is built. */
2
+ /**
3
+ * How many distinct tag keys one mask bit is shared by.
4
+ *
5
+ * @remarks Ids past this wrap, so two keys can share a bit. The mask is a prefilter only — a shared
6
+ * bit costs a false positive that the identity comparison then rejects, never a false negative.
7
+ */
8
+ const MASK_WIDTH = 32;
9
+ /**
10
+ * The empty key set: what an untagged slot and an untagged request both carry.
11
+ *
12
+ * @since 0.6.0
13
+ */
14
+ export const NO_TAG_KEYS = 0;
15
+ let tagKeyCounter = -1;
16
+ /**
17
+ * Distinguishes `-0` from `+0` in the intern cache.
18
+ *
19
+ * @remarks A `Map` key compares by SameValueZero, which holds `+0` and `-0` equal, while tag values
20
+ * compare by `Object.is`, which does not. Interning them to one object would make the
21
+ * two indistinguishable everywhere downstream, so the negative one is cached under this instead.
22
+ */
23
+ const NEGATIVE_ZERO_KEY = Symbol("di:tag-negative-zero");
24
+ function internKeyFor(value) {
25
+ return value === 0 && Object.is(value, -0) ? NEGATIVE_ZERO_KEY : value;
26
+ }
27
+ /**
28
+ * Declares a tag key, whose `of()` builds the criteria a `whenTagged` and a resolve both take.
29
+ *
30
+ * @remarks The value type is checked at both ends: a key declared `tag<Region>("region")` refuses a
31
+ * value that is not a `Region`, so a bind site and a resolve site cannot drift apart silently.
32
+ *
33
+ * @example
34
+ * ```ts
35
+ * const Region = tag<"eu" | "us">("region");
36
+ * container.bind(Storage).to(S3).whenTagged(Region.of("eu"));
37
+ * container.resolve(Storage, { tag: Region.of("eu") });
38
+ * ```
39
+ *
40
+ * @since 0.6.0
41
+ */
42
+ export function tag(name) {
43
+ tagKeyCounter += 1;
44
+ const id = tagKeyCounter;
45
+ const mask = (1 << (id % MASK_WIDTH));
46
+ const interned = new Map();
47
+ // One-entry cache in front of the intern map: an inline `.of()` at a call site usually repeats
48
+ // one value, and `Object.is` is the slot contract's own comparison, so a hit is exact — ±0 stay
49
+ // split and `NaN` hits itself, with no `internKeyFor` detour.
50
+ let lastValue;
51
+ let lastPair;
52
+ const key = {
53
+ name,
54
+ id,
55
+ mask,
56
+ of(value) {
57
+ if (lastPair !== undefined && Object.is(value, lastValue)) {
58
+ return lastPair;
59
+ }
60
+ const cacheKey = internKeyFor(value);
61
+ const existing = interned.get(cacheKey);
62
+ if (existing !== undefined) {
63
+ lastValue = value;
64
+ lastPair = existing;
65
+ return existing;
66
+ }
67
+ const pair = { key, value, mask };
68
+ interned.set(cacheKey, pair);
69
+ lastValue = value;
70
+ lastPair = pair;
71
+ return pair;
72
+ },
73
+ };
74
+ return key;
75
+ }
76
+ /**
77
+ * The key set a list of criteria covers.
78
+ *
79
+ * @since 0.6.0
80
+ */
81
+ export function tagKeyMaskOf(tags) {
82
+ let mask = NO_TAG_KEYS;
83
+ for (let index = 0; index < tags.length; index += 1) {
84
+ mask = (mask | tags[index].mask);
85
+ }
86
+ return mask;
87
+ }
88
+ /**
89
+ * Whether a request carrying `requestMask` covers every key in `slotMask`.
90
+ *
91
+ * @since 0.6.0
92
+ */
93
+ export function coversTagKeys(requestMask, slotMask) {
94
+ return (requestMask & slotMask) === slotMask;
95
+ }
96
+ //# sourceMappingURL=tag.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tag.js","sourceRoot":"","sources":["../../src/core/tag.ts"],"names":[],"mappings":"AAAA,yFAAyF;AAKzF;;;;;GAKG;AACH,MAAM,UAAU,GAAG,EAAE,CAAC;AAatB;;;;GAIG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAe,CAAC;AAiC3C,IAAI,aAAa,GAAG,CAAC,CAAC,CAAC;AAEvB;;;;;;GAMG;AACH,MAAM,iBAAiB,GAAkB,MAAM,CAAC,sBAAsB,CAAC,CAAC;AAExE,SAAS,YAAY,CAAC,KAAc;IAClC,OAAO,KAAK,KAAK,CAAC,IAAI,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC;AACzE,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,GAAG,CAAkB,IAAY;IAC/C,aAAa,IAAI,CAAC,CAAC;IACnB,MAAM,EAAE,GAAG,aAAa,CAAC;IACzB,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,UAAU,CAAC,CAAe,CAAC;IACpD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA8B,CAAC;IACvD,+FAA+F;IAC/F,gGAAgG;IAChG,8DAA8D;IAC9D,IAAI,SAA4B,CAAC;IACjC,IAAI,QAAuC,CAAC;IAE5C,MAAM,GAAG,GAAkB;QACzB,IAAI;QACJ,EAAE;QACF,IAAI;QACJ,EAAE,CAAC,KAAY;YACb,IAAI,QAAQ,KAAK,SAAS,IAAI,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC;gBAC1D,OAAO,QAAQ,CAAC;YAClB,CAAC;YAED,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;YACrC,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAExC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,SAAS,GAAG,KAAK,CAAC;gBAClB,QAAQ,GAAG,QAAQ,CAAC;gBAEpB,OAAO,QAAQ,CAAC;YAClB,CAAC;YAED,MAAM,IAAI,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAuB,CAAC;YAEvD,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAC7B,SAAS,GAAG,KAAK,CAAC;YAClB,QAAQ,GAAG,IAAI,CAAC;YAEhB,OAAO,IAAI,CAAC;QACd,CAAC;KACF,CAAC;IAEF,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,IAA+B;IAC1D,IAAI,IAAI,GAAG,WAAW,CAAC;IAEvB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACpD,IAAI,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAE,CAAC,IAAI,CAAe,CAAC;IAClD,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,WAAuB,EAAE,QAAoB;IACzE,OAAO,CAAC,WAAW,GAAG,QAAQ,CAAC,KAAK,QAAQ,CAAC;AAC/C,CAAC"}