@codefast/di 0.5.0-canary.5 → 0.5.0-canary.7

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 (214) hide show
  1. package/CHANGELOG.md +65 -0
  2. package/README.md +73 -496
  3. package/dist/binding.d.ts +211 -0
  4. package/dist/binding.d.ts.map +1 -0
  5. package/dist/binding.js +46 -0
  6. package/dist/binding.js.map +1 -0
  7. package/dist/{constructor-type.d.mts → constructor-type.d.ts} +3 -5
  8. package/dist/constructor-type.d.ts.map +1 -0
  9. package/dist/constructor-type.js +2 -0
  10. package/dist/constructor-type.js.map +1 -0
  11. package/dist/container/binding-builders.d.ts +35 -0
  12. package/dist/container/binding-builders.d.ts.map +1 -0
  13. package/dist/container/binding-builders.js +247 -0
  14. package/dist/container/binding-builders.js.map +1 -0
  15. package/dist/container/container.d.ts +58 -0
  16. package/dist/container/container.d.ts.map +1 -0
  17. package/dist/container/container.js +641 -0
  18. package/dist/container/container.js.map +1 -0
  19. package/dist/decorators/inject.d.ts +57 -0
  20. package/dist/decorators/inject.d.ts.map +1 -0
  21. package/dist/decorators/inject.js +145 -0
  22. package/dist/decorators/inject.js.map +1 -0
  23. package/dist/decorators/injectable.d.ts +29 -0
  24. package/dist/decorators/injectable.d.ts.map +1 -0
  25. package/dist/decorators/injectable.js +53 -0
  26. package/dist/decorators/injectable.js.map +1 -0
  27. package/dist/decorators/lifecycle-decorators.d.ts +9 -0
  28. package/dist/decorators/lifecycle-decorators.d.ts.map +1 -0
  29. package/dist/decorators/lifecycle-decorators.js +40 -0
  30. package/dist/decorators/lifecycle-decorators.js.map +1 -0
  31. package/dist/errors.d.ts +150 -0
  32. package/dist/errors.d.ts.map +1 -0
  33. package/dist/errors.js +197 -0
  34. package/dist/errors.js.map +1 -0
  35. package/dist/index.d.ts +30 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +25 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/introspection/dependency-graph.d.ts +40 -0
  40. package/dist/introspection/dependency-graph.d.ts.map +1 -0
  41. package/dist/introspection/dependency-graph.js +66 -0
  42. package/dist/introspection/dependency-graph.js.map +1 -0
  43. package/dist/introspection/graph-adapters/cytoscape.d.ts +33 -0
  44. package/dist/introspection/graph-adapters/cytoscape.d.ts.map +1 -0
  45. package/dist/introspection/graph-adapters/cytoscape.js +30 -0
  46. package/dist/introspection/graph-adapters/cytoscape.js.map +1 -0
  47. package/dist/introspection/graph-adapters/dot.d.ts +6 -0
  48. package/dist/introspection/graph-adapters/dot.d.ts.map +1 -0
  49. package/dist/introspection/graph-adapters/dot.js +18 -0
  50. package/dist/introspection/graph-adapters/dot.js.map +1 -0
  51. package/dist/introspection/graph-adapters/reactflow.d.ts +38 -0
  52. package/dist/introspection/graph-adapters/reactflow.d.ts.map +1 -0
  53. package/dist/introspection/graph-adapters/reactflow.js +33 -0
  54. package/dist/introspection/graph-adapters/reactflow.js.map +1 -0
  55. package/dist/introspection/inspector.d.ts +39 -0
  56. package/dist/introspection/inspector.d.ts.map +1 -0
  57. package/dist/introspection/inspector.js +82 -0
  58. package/dist/introspection/inspector.js.map +1 -0
  59. package/dist/metadata/{metadata-keys.d.mts → metadata-keys.d.ts} +5 -7
  60. package/dist/metadata/metadata-keys.d.ts.map +1 -0
  61. package/dist/metadata/metadata-keys.js +25 -0
  62. package/dist/metadata/metadata-keys.js.map +1 -0
  63. package/dist/metadata/metadata-reader-token.d.ts +7 -0
  64. package/dist/metadata/metadata-reader-token.d.ts.map +1 -0
  65. package/dist/metadata/metadata-reader-token.js +6 -0
  66. package/dist/metadata/metadata-reader-token.js.map +1 -0
  67. package/dist/metadata/metadata-types.d.ts +48 -0
  68. package/dist/metadata/metadata-types.d.ts.map +1 -0
  69. package/dist/metadata/metadata-types.js +2 -0
  70. package/dist/metadata/metadata-types.js.map +1 -0
  71. package/dist/metadata/symbol-metadata-reader.d.ts +20 -0
  72. package/dist/metadata/symbol-metadata-reader.d.ts.map +1 -0
  73. package/dist/metadata/symbol-metadata-reader.js +34 -0
  74. package/dist/metadata/symbol-metadata-reader.js.map +1 -0
  75. package/dist/module.d.ts +67 -0
  76. package/dist/module.d.ts.map +1 -0
  77. package/dist/module.js +54 -0
  78. package/dist/module.js.map +1 -0
  79. package/dist/registry.d.ts +33 -0
  80. package/dist/registry.d.ts.map +1 -0
  81. package/dist/registry.js +249 -0
  82. package/dist/registry.js.map +1 -0
  83. package/dist/resolution/binding-scope.d.ts +10 -0
  84. package/dist/resolution/binding-scope.d.ts.map +1 -0
  85. package/dist/resolution/binding-scope.js +24 -0
  86. package/dist/resolution/binding-scope.js.map +1 -0
  87. package/dist/resolution/binding-select.d.ts +16 -0
  88. package/dist/resolution/binding-select.d.ts.map +1 -0
  89. package/dist/resolution/binding-select.js +143 -0
  90. package/dist/resolution/binding-select.js.map +1 -0
  91. package/dist/resolution/constraints.d.ts +51 -0
  92. package/dist/resolution/constraints.d.ts.map +1 -0
  93. package/dist/resolution/constraints.js +88 -0
  94. package/dist/resolution/constraints.js.map +1 -0
  95. package/dist/resolution/environment.d.ts +47 -0
  96. package/dist/resolution/environment.d.ts.map +1 -0
  97. package/dist/resolution/environment.js +100 -0
  98. package/dist/resolution/environment.js.map +1 -0
  99. package/dist/resolution/instantiation-plan.d.ts +67 -0
  100. package/dist/resolution/instantiation-plan.d.ts.map +1 -0
  101. package/dist/resolution/instantiation-plan.js +163 -0
  102. package/dist/resolution/instantiation-plan.js.map +1 -0
  103. package/dist/resolution/lifecycle.d.ts +21 -0
  104. package/dist/resolution/lifecycle.d.ts.map +1 -0
  105. package/dist/resolution/lifecycle.js +178 -0
  106. package/dist/resolution/lifecycle.js.map +1 -0
  107. package/dist/resolution/resolution-path.d.ts +31 -0
  108. package/dist/resolution/resolution-path.d.ts.map +1 -0
  109. package/dist/resolution/resolution-path.js +53 -0
  110. package/dist/resolution/resolution-path.js.map +1 -0
  111. package/dist/resolution/resolve-options.d.ts +19 -0
  112. package/dist/resolution/resolve-options.d.ts.map +1 -0
  113. package/dist/resolution/resolve-options.js +32 -0
  114. package/dist/resolution/resolve-options.js.map +1 -0
  115. package/dist/resolution/resolver.d.ts +35 -0
  116. package/dist/resolution/resolver.d.ts.map +1 -0
  117. package/dist/resolution/resolver.js +1320 -0
  118. package/dist/resolution/resolver.js.map +1 -0
  119. package/dist/resolution/scope.d.ts +32 -0
  120. package/dist/resolution/scope.d.ts.map +1 -0
  121. package/dist/resolution/scope.js +76 -0
  122. package/dist/resolution/scope.js.map +1 -0
  123. package/dist/token.d.ts +23 -0
  124. package/dist/token.d.ts.map +1 -0
  125. package/dist/token.js +22 -0
  126. package/dist/token.js.map +1 -0
  127. package/dist/types.d.ts +90 -0
  128. package/dist/types.d.ts.map +1 -0
  129. package/dist/types.js +2 -0
  130. package/dist/types.js.map +1 -0
  131. package/package.json +143 -120
  132. package/src/binding.ts +38 -22
  133. package/src/container/binding-builders.ts +397 -0
  134. package/src/container/container.ts +838 -0
  135. package/src/decorators/inject.ts +16 -3
  136. package/src/decorators/injectable.ts +3 -3
  137. package/src/index.ts +14 -7
  138. package/src/{dependency-graph.ts → introspection/dependency-graph.ts} +1 -1
  139. package/src/{graph-adapters → introspection/graph-adapters}/cytoscape.ts +1 -1
  140. package/src/{graph-adapters → introspection/graph-adapters}/dot.ts +1 -1
  141. package/src/{graph-adapters → introspection/graph-adapters}/reactflow.ts +13 -2
  142. package/src/{inspector.ts → introspection/inspector.ts} +26 -21
  143. package/src/metadata/symbol-metadata-reader.ts +4 -4
  144. package/src/module.ts +14 -6
  145. package/src/registry.ts +115 -61
  146. package/src/{binding-select.ts → resolution/binding-select.ts} +16 -3
  147. package/src/{environment.ts → resolution/environment.ts} +35 -35
  148. package/src/resolution/instantiation-plan.ts +240 -0
  149. package/src/{lifecycle.ts → resolution/lifecycle.ts} +20 -13
  150. package/src/resolution/resolution-path.ts +77 -0
  151. package/src/resolution/resolver.ts +1755 -0
  152. package/src/{scope.ts → resolution/scope.ts} +35 -18
  153. package/src/token.ts +0 -3
  154. package/dist/binding-scope.d.mts +0 -13
  155. package/dist/binding-scope.mjs +0 -21
  156. package/dist/binding-select.d.mts +0 -19
  157. package/dist/binding-select.mjs +0 -72
  158. package/dist/binding.d.mts +0 -191
  159. package/dist/binding.mjs +0 -36
  160. package/dist/constraints.d.mts +0 -55
  161. package/dist/constraints.mjs +0 -87
  162. package/dist/constructor-type.mjs +0 -1
  163. package/dist/container.d.mts +0 -62
  164. package/dist/container.mjs +0 -741
  165. package/dist/decorators/inject.d.mts +0 -49
  166. package/dist/decorators/inject.mjs +0 -136
  167. package/dist/decorators/injectable.d.mts +0 -32
  168. package/dist/decorators/injectable.mjs +0 -57
  169. package/dist/decorators/lifecycle-decorators.d.mts +0 -11
  170. package/dist/decorators/lifecycle-decorators.mjs +0 -38
  171. package/dist/dependency-graph.d.mts +0 -43
  172. package/dist/dependency-graph.mjs +0 -63
  173. package/dist/environment.d.mts +0 -55
  174. package/dist/environment.mjs +0 -98
  175. package/dist/errors.d.mts +0 -153
  176. package/dist/errors.mjs +0 -197
  177. package/dist/graph-adapters/cytoscape.d.mts +0 -36
  178. package/dist/graph-adapters/cytoscape.mjs +0 -26
  179. package/dist/graph-adapters/dot.d.mts +0 -9
  180. package/dist/graph-adapters/dot.mjs +0 -20
  181. package/dist/graph-adapters/reactflow.d.mts +0 -41
  182. package/dist/graph-adapters/reactflow.mjs +0 -29
  183. package/dist/index.d.mts +0 -18
  184. package/dist/index.mjs +0 -12
  185. package/dist/inspector.d.mts +0 -48
  186. package/dist/inspector.mjs +0 -71
  187. package/dist/lifecycle.d.mts +0 -25
  188. package/dist/lifecycle.mjs +0 -118
  189. package/dist/metadata/metadata-keys.mjs +0 -27
  190. package/dist/metadata/metadata-reader-token.d.mts +0 -10
  191. package/dist/metadata/metadata-reader-token.mjs +0 -8
  192. package/dist/metadata/metadata-types.d.mts +0 -51
  193. package/dist/metadata/metadata-types.mjs +0 -1
  194. package/dist/metadata/symbol-metadata-reader.d.mts +0 -23
  195. package/dist/metadata/symbol-metadata-reader.mjs +0 -29
  196. package/dist/module.d.mts +0 -62
  197. package/dist/module.mjs +0 -42
  198. package/dist/registry.d.mts +0 -45
  199. package/dist/registry.mjs +0 -163
  200. package/dist/resolve-options.d.mts +0 -22
  201. package/dist/resolve-options.mjs +0 -28
  202. package/dist/resolver.d.mts +0 -94
  203. package/dist/resolver.mjs +0 -767
  204. package/dist/scope.d.mts +0 -28
  205. package/dist/scope.mjs +0 -58
  206. package/dist/token.d.mts +0 -25
  207. package/dist/token.mjs +0 -22
  208. package/dist/types.d.mts +0 -92
  209. package/dist/types.mjs +0 -1
  210. package/src/container.ts +0 -1141
  211. package/src/resolver.ts +0 -1626
  212. /package/src/{binding-scope.ts → resolution/binding-scope.ts} +0 -0
  213. /package/src/{constraints.ts → resolution/constraints.ts} +0 -0
  214. /package/src/{resolve-options.ts → resolution/resolve-options.ts} +0 -0
@@ -0,0 +1,249 @@
1
+ import { bindingSlotEquals, bindingSlotToString } from "#/binding";
2
+ /**
3
+ * Rebuilds a binding with every kind's fields in one fixed key order, so all stored
4
+ * bindings share a single V8 hidden class. Mixed binding kinds otherwise turn the
5
+ * resolver's hot property reads (kind/scope/factory/...) megamorphic, which costs
6
+ * ~30% throughput in processes that exercise many kinds. The value-erasing cast is
7
+ * safe: every declared field is copied verbatim and `kind` stays the discriminant.
8
+ */
9
+ function normalizeBindingShape(binding) {
10
+ const source = binding;
11
+ return {
12
+ kind: source.kind,
13
+ id: source.id,
14
+ inFlight: false,
15
+ frame: undefined,
16
+ token: source.token,
17
+ slot: source.slot,
18
+ predicate: source.predicate,
19
+ scope: source.scope,
20
+ target: source.target,
21
+ factory: source.factory,
22
+ deps: source.deps,
23
+ value: source.value,
24
+ onActivation: source.onActivation,
25
+ onDeactivation: source.onDeactivation,
26
+ };
27
+ }
28
+ /**
29
+ * @since 0.3.16-canary.0
30
+ */
31
+ export class BindingRegistry {
32
+ // Monotonic mutation counter — lets resolvers version-stamp lookup caches across a container chain.
33
+ #version = 0;
34
+ // Map from token key -> array of bindings (order matters for last-wins)
35
+ #bindings = new Map();
36
+ // Fast lookup by binding ID
37
+ #byId = new Map();
38
+ // Fast lookup for slot { name, tags: [] }
39
+ #simpleNamed = new Map();
40
+ // Fast path for one default slot binding with no predicate
41
+ #fastDefault = new Map();
42
+ // Fast lookup for slot { name: undefined, tags: [[key, value]] } with no predicate
43
+ #simpleTagged = new Map();
44
+ /** Monotonic version — increments on every mutation. */
45
+ get version() {
46
+ return this.#version;
47
+ }
48
+ /** Add or replace binding using slot-aware last-wins. Returns the displaced binding, if any. */
49
+ add(uncommittedBinding) {
50
+ this.#version += 1;
51
+ const binding = normalizeBindingShape(uncommittedBinding);
52
+ const key = binding.token;
53
+ // ✓ TS6.0: Map.getOrInsert (ES2025) replaces the manual get+check+set upsert
54
+ const bindingsForToken = this.#bindings.getOrInsert(key, []);
55
+ // Only apply last-wins for slot-based bindings (not predicate-only)
56
+ let displacedBinding;
57
+ if (!this.#isPurePredicateBinding(binding)) {
58
+ const existingIndex = bindingsForToken.findIndex((candidate) => !this.#isPurePredicateBinding(candidate) && bindingSlotEquals(candidate.slot, binding.slot));
59
+ if (existingIndex !== -1) {
60
+ displacedBinding = bindingsForToken[existingIndex];
61
+ this.#byId.delete(displacedBinding.id);
62
+ bindingsForToken.splice(existingIndex, 1);
63
+ this.#deindexSimpleNamedBinding(key, displacedBinding);
64
+ this.#deindexSimpleTaggedBinding(key, displacedBinding);
65
+ }
66
+ }
67
+ bindingsForToken.push(binding);
68
+ this.#byId.set(binding.id, binding);
69
+ this.#indexSimpleNamedBinding(key, binding);
70
+ this.#indexSimpleTaggedBinding(key, binding);
71
+ this.#refreshFastDefaultForToken(key);
72
+ return displacedBinding;
73
+ }
74
+ /** Remove all bindings for a token. Returns removed bindings. */
75
+ removeByToken(token) {
76
+ this.#version += 1;
77
+ const key = token;
78
+ const bindingsForToken = this.#bindings.get(key) ?? [];
79
+ this.#bindings.delete(key);
80
+ this.#simpleNamed.delete(key);
81
+ this.#simpleTagged.delete(key);
82
+ this.#fastDefault.delete(key);
83
+ for (const binding of bindingsForToken) {
84
+ this.#byId.delete(binding.id);
85
+ }
86
+ return bindingsForToken;
87
+ }
88
+ /** Remove a specific binding by ID. Returns the removed binding or undefined. */
89
+ removeById(id) {
90
+ const binding = this.#byId.get(id);
91
+ if (binding === undefined) {
92
+ return undefined;
93
+ }
94
+ this.#version += 1;
95
+ this.#byId.delete(id);
96
+ const key = binding.token;
97
+ const bindingsForToken = this.#bindings.get(key);
98
+ if (bindingsForToken !== undefined) {
99
+ const bindingIndex = bindingsForToken.findIndex((candidate) => candidate.id === id);
100
+ if (bindingIndex !== -1) {
101
+ bindingsForToken.splice(bindingIndex, 1);
102
+ }
103
+ this.#deindexSimpleNamedBinding(key, binding);
104
+ this.#deindexSimpleTaggedBinding(key, binding);
105
+ if (bindingsForToken.length === 0) {
106
+ this.#bindings.delete(key);
107
+ this.#simpleNamed.delete(key);
108
+ this.#simpleTagged.delete(key);
109
+ this.#fastDefault.delete(key);
110
+ }
111
+ else {
112
+ this.#refreshFastDefaultForToken(key);
113
+ }
114
+ }
115
+ return binding;
116
+ }
117
+ /** Get all bindings for a token. */
118
+ getAll(token) {
119
+ return this.#bindings.get(token) ?? [];
120
+ }
121
+ /** Get binding by ID. */
122
+ getById(id) {
123
+ return this.#byId.get(id);
124
+ }
125
+ /** Check if any binding exists for token. */
126
+ has(token) {
127
+ const key = token;
128
+ const list = this.#bindings.get(key);
129
+ return list !== undefined && list.length > 0;
130
+ }
131
+ /** All bindings in the registry. */
132
+ allBindings() {
133
+ const allBindings = [];
134
+ for (const bindingsForToken of this.#bindings.values()) {
135
+ allBindings.push(...bindingsForToken);
136
+ }
137
+ return allBindings;
138
+ }
139
+ /** Remove all bindings. Returns all removed. */
140
+ clear() {
141
+ this.#version += 1;
142
+ const all = this.allBindings();
143
+ this.#bindings.clear();
144
+ this.#byId.clear();
145
+ this.#simpleNamed.clear();
146
+ this.#simpleTagged.clear();
147
+ this.#fastDefault.clear();
148
+ return all;
149
+ }
150
+ getSimpleNamed(token, name) {
151
+ return this.#simpleNamed.get(token)?.get(name);
152
+ }
153
+ getSimpleTagged(token, tagKey, tagValue) {
154
+ return this.#simpleTagged
155
+ .get(token)
156
+ ?.get(tagKey)
157
+ ?.get(tagValue);
158
+ }
159
+ getFastDefault(token) {
160
+ return this.#fastDefault.get(token);
161
+ }
162
+ /** Summarize available slot strings for a token (for error messages). */
163
+ availableSlotStrings(token) {
164
+ const bindingsForToken = this.#bindings.get(token) ?? [];
165
+ return bindingsForToken.map((binding) => bindingSlotToString(binding.slot));
166
+ }
167
+ #indexSimpleTaggedBinding(tokenKey, binding) {
168
+ const slot = binding.slot;
169
+ if (slot.name !== undefined || slot.tags.length !== 1 || binding.predicate !== undefined) {
170
+ return;
171
+ }
172
+ const [tagKey, tagValue] = slot.tags[0];
173
+ const byTagKey = this.#simpleTagged.getOrInsert(tokenKey, new Map());
174
+ const byTagValue = byTagKey.getOrInsert(tagKey, new Map());
175
+ byTagValue.set(tagValue, binding);
176
+ }
177
+ #deindexSimpleTaggedBinding(tokenKey, binding) {
178
+ const slot = binding.slot;
179
+ if (slot.name !== undefined || slot.tags.length !== 1 || binding.predicate !== undefined) {
180
+ return;
181
+ }
182
+ const [tagKey, tagValue] = slot.tags[0];
183
+ const byTagKey = this.#simpleTagged.get(tokenKey);
184
+ if (byTagKey === undefined) {
185
+ return;
186
+ }
187
+ const byTagValue = byTagKey.get(tagKey);
188
+ if (byTagValue === undefined) {
189
+ return;
190
+ }
191
+ const current = byTagValue.get(tagValue);
192
+ if (current?.id === binding.id) {
193
+ byTagValue.delete(tagValue);
194
+ if (byTagValue.size === 0) {
195
+ byTagKey.delete(tagKey);
196
+ if (byTagKey.size === 0) {
197
+ this.#simpleTagged.delete(tokenKey);
198
+ }
199
+ }
200
+ }
201
+ }
202
+ #isPurePredicateBinding(binding) {
203
+ const slot = binding.slot;
204
+ const hasPredicate = binding.predicate !== undefined;
205
+ const hasConstraint = slot.name !== undefined || slot.tags.length > 0;
206
+ // Pure predicate = has predicate but no slot constraint (name/tags)
207
+ return hasPredicate && !hasConstraint;
208
+ }
209
+ #indexSimpleNamedBinding(tokenKey, binding) {
210
+ const slot = binding.slot;
211
+ if (slot.name === undefined || slot.tags.length > 0) {
212
+ return;
213
+ }
214
+ const bindingsByName = this.#simpleNamed.getOrInsert(tokenKey, new Map());
215
+ bindingsByName.set(slot.name, binding);
216
+ }
217
+ #deindexSimpleNamedBinding(tokenKey, binding) {
218
+ const slot = binding.slot;
219
+ if (slot.name === undefined || slot.tags.length > 0) {
220
+ return;
221
+ }
222
+ const bindingsByName = this.#simpleNamed.get(tokenKey);
223
+ if (bindingsByName === undefined) {
224
+ return;
225
+ }
226
+ const currentBinding = bindingsByName.get(slot.name);
227
+ if (currentBinding?.id === binding.id) {
228
+ bindingsByName.delete(slot.name);
229
+ if (bindingsByName.size === 0) {
230
+ this.#simpleNamed.delete(tokenKey);
231
+ }
232
+ }
233
+ }
234
+ #refreshFastDefaultForToken(tokenKey) {
235
+ const bindingsForToken = this.#bindings.get(tokenKey);
236
+ if (bindingsForToken === undefined || bindingsForToken.length !== 1) {
237
+ this.#fastDefault.delete(tokenKey);
238
+ return;
239
+ }
240
+ const onlyBinding = bindingsForToken[0];
241
+ const isDefaultSlot = onlyBinding.slot.name === undefined && onlyBinding.slot.tags.length === 0;
242
+ if (!isDefaultSlot || onlyBinding.predicate !== undefined) {
243
+ this.#fastDefault.delete(tokenKey);
244
+ return;
245
+ }
246
+ this.#fastDefault.set(tokenKey, onlyBinding);
247
+ }
248
+ }
249
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { Binding } from "#/binding";
2
+ import type { BindingScope } from "#/types";
3
+ /**
4
+ * Runtime scope used for validation and introspection. Alias bindings are treated as transient
5
+ * because they defer scope to the aliased target at resolve time.
6
+ *
7
+ * @since 0.3.16-canary.0
8
+ */
9
+ export declare function effectiveBindingScope(binding: Binding): BindingScope;
10
+ //# sourceMappingURL=binding-scope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binding-scope.d.ts","sourceRoot":"","sources":["../../src/resolution/binding-scope.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,YAAY,CAgBpE"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Runtime scope used for validation and introspection. Alias bindings are treated as transient
3
+ * because they defer scope to the aliased target at resolve time.
4
+ *
5
+ * @since 0.3.16-canary.0
6
+ */
7
+ export function effectiveBindingScope(binding) {
8
+ switch (binding.kind) {
9
+ case "alias":
10
+ return "transient";
11
+ case "class":
12
+ case "constant":
13
+ case "dynamic":
14
+ case "dynamic-async":
15
+ case "resolved":
16
+ case "resolved-async":
17
+ return binding.scope;
18
+ default: {
19
+ const exhaustive = binding;
20
+ return exhaustive;
21
+ }
22
+ }
23
+ }
24
+ //# sourceMappingURL=binding-scope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binding-scope.js","sourceRoot":"","sources":["../../src/resolution/binding-scope.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;QACrB,KAAK,OAAO;YACV,OAAO,WAAW,CAAC;QACrB,KAAK,OAAO,CAAC;QACb,KAAK,UAAU,CAAC;QAChB,KAAK,SAAS,CAAC;QACf,KAAK,eAAe,CAAC;QACrB,KAAK,UAAU,CAAC;QAChB,KAAK,gBAAgB;YACnB,OAAO,OAAO,CAAC,KAAK,CAAC;QACvB,SAAS,CAAC;YACR,MAAM,UAAU,GAAU,OAAO,CAAC;YAClC,OAAO,UAAU,CAAC;QACpB,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { Binding } from "#/binding";
2
+ import type { ConstraintContext, ResolveOptions } from "#/types";
3
+ /**
4
+ * Select a single candidate from a list of bindings using slot matching + predicates.
5
+ * Returns undefined if no match, throws AmbiguousBindingError if multiple match.
6
+ *
7
+ * @since 0.3.16-canary.0
8
+ */
9
+ export declare function selectBinding(bindings: ReadonlyArray<Binding>, options: ResolveOptions | undefined, ctx: ConstraintContext, tokenDisplayName: string): Binding | undefined;
10
+ /**
11
+ * Select all candidates matching options + predicates.
12
+ *
13
+ * @since 0.3.16-canary.0
14
+ */
15
+ export declare function selectAllBindings(bindings: ReadonlyArray<Binding>, options: ResolveOptions | undefined, ctx: ConstraintContext): Array<Binding>;
16
+ //# sourceMappingURL=binding-select.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binding-select.d.ts","sourceRoot":"","sources":["../../src/resolution/binding-select.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAc,iBAAiB,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE7E;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,aAAa,CAAC,OAAO,CAAC,EAChC,OAAO,EAAE,cAAc,GAAG,SAAS,EACnC,GAAG,EAAE,iBAAiB,EACtB,gBAAgB,EAAE,MAAM,GACvB,OAAO,GAAG,SAAS,CA4BrB;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,aAAa,CAAC,OAAO,CAAC,EAChC,OAAO,EAAE,cAAc,GAAG,SAAS,EACnC,GAAG,EAAE,iBAAiB,GACrB,KAAK,CAAC,OAAO,CAAC,CAEhB"}
@@ -0,0 +1,143 @@
1
+ import { AmbiguousBindingError } from "#/errors";
2
+ /**
3
+ * Select a single candidate from a list of bindings using slot matching + predicates.
4
+ * Returns undefined if no match, throws AmbiguousBindingError if multiple match.
5
+ *
6
+ * @since 0.3.16-canary.0
7
+ */
8
+ export function selectBinding(bindings, options, ctx, tokenDisplayName) {
9
+ const candidates = filterBindings(bindings, options, ctx);
10
+ if (candidates.length === 0) {
11
+ return undefined;
12
+ }
13
+ if (candidates.length === 1) {
14
+ return candidates[0];
15
+ }
16
+ // Most specific wins: a single matching predicate-carrying candidate beats
17
+ // predicate-less ones (a predicate is a deliberate specialization of the
18
+ // default). Two matching predicates are genuinely ambiguous.
19
+ let predicatedCandidate;
20
+ for (const candidate of candidates) {
21
+ if (candidate.predicate !== undefined) {
22
+ if (predicatedCandidate !== undefined) {
23
+ predicatedCandidate = undefined;
24
+ break;
25
+ }
26
+ predicatedCandidate = candidate;
27
+ }
28
+ }
29
+ if (predicatedCandidate !== undefined) {
30
+ return predicatedCandidate;
31
+ }
32
+ throw new AmbiguousBindingError(tokenDisplayName, candidates.map((c) => c.id));
33
+ }
34
+ /**
35
+ * Select all candidates matching options + predicates.
36
+ *
37
+ * @since 0.3.16-canary.0
38
+ */
39
+ export function selectAllBindings(bindings, options, ctx) {
40
+ return filterBindings(bindings, options, ctx, "all");
41
+ }
42
+ function filterBindings(bindings, options, ctx, selectionMode = "single") {
43
+ if (options === undefined) {
44
+ const resultWithoutOptions = [];
45
+ if (selectionMode === "all") {
46
+ for (const binding of bindings) {
47
+ if (matchesPredicate(binding, ctx)) {
48
+ resultWithoutOptions.push(binding);
49
+ }
50
+ }
51
+ }
52
+ else {
53
+ for (const binding of bindings) {
54
+ const slot = binding.slot;
55
+ if (slot.name === undefined && slot.tags.length === 0 && matchesPredicate(binding, ctx)) {
56
+ resultWithoutOptions.push(binding);
57
+ }
58
+ }
59
+ }
60
+ return resultWithoutOptions;
61
+ }
62
+ const result = [];
63
+ for (const binding of bindings) {
64
+ const slotMatched = selectionMode === "all" ? matchesSlotForResolveAll(binding, options) : matchesSlot(binding, options);
65
+ if (slotMatched && matchesPredicate(binding, ctx)) {
66
+ result.push(binding);
67
+ }
68
+ }
69
+ return result;
70
+ }
71
+ function matchesSlotForResolveAll(binding, options) {
72
+ const hasExplicitSlotFilter = options !== undefined &&
73
+ (options.name !== undefined ||
74
+ (options.tags !== undefined && options.tags.length > 0) ||
75
+ options.tag !== undefined);
76
+ if (!hasExplicitSlotFilter) {
77
+ return true;
78
+ }
79
+ return matchesSlot(binding, options);
80
+ }
81
+ function matchesSlot(binding, options) {
82
+ const slot = binding.slot;
83
+ const requestedName = options?.name;
84
+ const requestedTags = options?.tags;
85
+ const singleRequestedTag = options?.tag;
86
+ const hasRequestedTags = (requestedTags?.length ?? 0) > 0 || singleRequestedTag !== undefined;
87
+ // Match by name
88
+ if (slot.name !== undefined) {
89
+ if (requestedName === undefined) {
90
+ return false;
91
+ }
92
+ if (slot.name !== requestedName) {
93
+ return false;
94
+ }
95
+ }
96
+ else if (requestedName !== undefined) {
97
+ // Binding has no name but options requests a specific name — no match
98
+ return false;
99
+ }
100
+ // Match by tags — binding's tags must all be present in options
101
+ if (slot.tags.length > 0) {
102
+ if (!hasRequestedTags) {
103
+ return false;
104
+ }
105
+ for (const [tagKey, tagValue] of slot.tags) {
106
+ if (!matchesRequestedTag(tagKey, tagValue, requestedTags, singleRequestedTag)) {
107
+ return false;
108
+ }
109
+ }
110
+ }
111
+ else if (hasRequestedTags) {
112
+ // Binding has no tags but options requires tags — no match for tagged slots
113
+ // But: default slot (no tags, no name) can match when options has tags if there are no tag-slotted bindings
114
+ // Actually per spec: resolveAll with tags only returns bindings that have those tags
115
+ // and resolve with tags requires exact match
116
+ return false;
117
+ }
118
+ return true;
119
+ }
120
+ function matchesRequestedTag(tagKey, tagValue, requestedTags, singleRequestedTag) {
121
+ if (singleRequestedTag !== undefined &&
122
+ singleRequestedTag[0] === tagKey &&
123
+ Object.is(singleRequestedTag[1], tagValue)) {
124
+ return true;
125
+ }
126
+ if (requestedTags === undefined || requestedTags.length === 0) {
127
+ return false;
128
+ }
129
+ for (let index = 0; index < requestedTags.length; index += 1) {
130
+ const requestedTag = requestedTags[index];
131
+ if (requestedTag[0] === tagKey && Object.is(requestedTag[1], tagValue)) {
132
+ return true;
133
+ }
134
+ }
135
+ return false;
136
+ }
137
+ function matchesPredicate(binding, ctx) {
138
+ if (binding.predicate === undefined) {
139
+ return true;
140
+ }
141
+ return binding.predicate(ctx);
142
+ }
143
+ //# sourceMappingURL=binding-select.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binding-select.js","sourceRoot":"","sources":["../../src/resolution/binding-select.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ import type { Token } from "#/token";
2
+ import type { BindingTag, ConstraintContext, Constructor } from "#/types";
3
+ /**
4
+ * @since 0.3.16-canary.0
5
+ */
6
+ export declare function whenParentIs(token: Token<unknown> | Constructor): (constraintContext: ConstraintContext) => boolean;
7
+ /**
8
+ * @since 0.3.16-canary.0
9
+ */
10
+ export declare function whenNoParentIs(token: Token<unknown> | Constructor): (constraintContext: ConstraintContext) => boolean;
11
+ /**
12
+ * @since 0.3.16-canary.0
13
+ */
14
+ export declare function whenAnyAncestorIs(token: Token<unknown> | Constructor): (constraintContext: ConstraintContext) => boolean;
15
+ /**
16
+ * @since 0.3.16-canary.0
17
+ */
18
+ export declare function whenNoAncestorIs(token: Token<unknown> | Constructor): (constraintContext: ConstraintContext) => boolean;
19
+ /**
20
+ * @since 0.3.16-canary.0
21
+ */
22
+ export declare function whenParentNamed(name: string): (constraintContext: ConstraintContext) => boolean;
23
+ /**
24
+ * @since 0.3.16-canary.0
25
+ */
26
+ export declare function whenAnyAncestorNamed(name: string): (constraintContext: ConstraintContext) => boolean;
27
+ /**
28
+ * @since 0.3.16-canary.0
29
+ */
30
+ export declare function whenParentTagged(tag: string, value: unknown): (constraintContext: ConstraintContext) => boolean;
31
+ /**
32
+ * @since 0.3.16-canary.0
33
+ */
34
+ export declare function whenAnyAncestorTagged(tag: string, value: unknown): (constraintContext: ConstraintContext) => boolean;
35
+ /**
36
+ * Matches when the direct parent slot carries **all** of the given tag pairs.
37
+ * Equivalent to AND-composing multiple `whenParentTagged` calls but evaluates
38
+ * in a single predicate invocation — no intermediate closure allocations.
39
+ *
40
+ * @since 0.3.16-canary.1
41
+ */
42
+ export declare function whenParentTaggedAll(tags: ReadonlyArray<BindingTag>): (constraintContext: ConstraintContext) => boolean;
43
+ /**
44
+ * Matches when at least one ancestor slot carries **all** of the given tag pairs.
45
+ * Equivalent to AND-composing multiple `whenAnyAncestorTagged` calls but evaluates
46
+ * in a single predicate invocation — no intermediate closure allocations.
47
+ *
48
+ * @since 0.3.16-canary.1
49
+ */
50
+ export declare function whenAnyAncestorTaggedAll(tags: ReadonlyArray<BindingTag>): (constraintContext: ConstraintContext) => boolean;
51
+ //# sourceMappingURL=constraints.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constraints.d.ts","sourceRoot":"","sources":["../../src/resolution/constraints.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAErC,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAM1E;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,WAAW,GAAG,CAAC,iBAAiB,EAAE,iBAAiB,KAAK,OAAO,CAInH;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,WAAW,GAAG,CAAC,iBAAiB,EAAE,iBAAiB,KAAK,OAAO,CAIrH;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,WAAW,GAClC,CAAC,iBAAiB,EAAE,iBAAiB,KAAK,OAAO,CAInD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,WAAW,GAClC,CAAC,iBAAiB,EAAE,iBAAiB,KAAK,OAAO,CAInD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,iBAAiB,EAAE,iBAAiB,KAAK,OAAO,CAE/F;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,iBAAiB,EAAE,iBAAiB,KAAK,OAAO,CAEpG;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,CAAC,iBAAiB,EAAE,iBAAiB,KAAK,OAAO,CAI/G;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,CAAC,iBAAiB,EAAE,iBAAiB,KAAK,OAAO,CAKpH;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,aAAa,CAAC,UAAU,CAAC,GAC9B,CAAC,iBAAiB,EAAE,iBAAiB,KAAK,OAAO,CAWnD;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,aAAa,CAAC,UAAU,CAAC,GAC9B,CAAC,iBAAiB,EAAE,iBAAiB,KAAK,OAAO,CAQnD"}
@@ -0,0 +1,88 @@
1
+ import { tokenName } from "#/token";
2
+ function tokenNameOf(token) {
3
+ return tokenName(token);
4
+ }
5
+ /**
6
+ * @since 0.3.16-canary.0
7
+ */
8
+ export function whenParentIs(token) {
9
+ const tokenDisplayName = tokenNameOf(token);
10
+ return (constraintContext) => constraintContext.parent !== undefined && constraintContext.parent.tokenName === tokenDisplayName;
11
+ }
12
+ /**
13
+ * @since 0.3.16-canary.0
14
+ */
15
+ export function whenNoParentIs(token) {
16
+ const tokenDisplayName = tokenNameOf(token);
17
+ return (constraintContext) => constraintContext.parent === undefined || constraintContext.parent.tokenName !== tokenDisplayName;
18
+ }
19
+ /**
20
+ * @since 0.3.16-canary.0
21
+ */
22
+ export function whenAnyAncestorIs(token) {
23
+ const tokenDisplayName = tokenNameOf(token);
24
+ return (constraintContext) => constraintContext.ancestors.some((ancestorFrame) => ancestorFrame.tokenName === tokenDisplayName);
25
+ }
26
+ /**
27
+ * @since 0.3.16-canary.0
28
+ */
29
+ export function whenNoAncestorIs(token) {
30
+ const tokenDisplayName = tokenNameOf(token);
31
+ return (constraintContext) => constraintContext.ancestors.every((ancestorFrame) => ancestorFrame.tokenName !== tokenDisplayName);
32
+ }
33
+ /**
34
+ * @since 0.3.16-canary.0
35
+ */
36
+ export function whenParentNamed(name) {
37
+ return (constraintContext) => constraintContext.parent !== undefined && constraintContext.parent.slot.name === name;
38
+ }
39
+ /**
40
+ * @since 0.3.16-canary.0
41
+ */
42
+ export function whenAnyAncestorNamed(name) {
43
+ return (constraintContext) => constraintContext.ancestors.some((ancestorFrame) => ancestorFrame.slot.name === name);
44
+ }
45
+ /**
46
+ * @since 0.3.16-canary.0
47
+ */
48
+ export function whenParentTagged(tag, value) {
49
+ return (constraintContext) => constraintContext.parent !== undefined &&
50
+ constraintContext.parent.slot.tags.some(([tagKey, tagValue]) => tagKey === tag && Object.is(tagValue, value));
51
+ }
52
+ /**
53
+ * @since 0.3.16-canary.0
54
+ */
55
+ export function whenAnyAncestorTagged(tag, value) {
56
+ return (constraintContext) => constraintContext.ancestors.some((ancestorFrame) => ancestorFrame.slot.tags.some(([tagKey, tagValue]) => tagKey === tag && Object.is(tagValue, value)));
57
+ }
58
+ /**
59
+ * Matches when the direct parent slot carries **all** of the given tag pairs.
60
+ * Equivalent to AND-composing multiple `whenParentTagged` calls but evaluates
61
+ * in a single predicate invocation — no intermediate closure allocations.
62
+ *
63
+ * @since 0.3.16-canary.1
64
+ */
65
+ export function whenParentTaggedAll(tags) {
66
+ return (constraintContext) => {
67
+ const { parent } = constraintContext;
68
+ if (parent === undefined) {
69
+ return false;
70
+ }
71
+ const { tags: parentTags } = parent.slot;
72
+ return tags.every(([tagKey, tagValue]) => parentTags.some(([otherKey, otherValue]) => otherKey === tagKey && Object.is(otherValue, tagValue)));
73
+ };
74
+ }
75
+ /**
76
+ * Matches when at least one ancestor slot carries **all** of the given tag pairs.
77
+ * Equivalent to AND-composing multiple `whenAnyAncestorTagged` calls but evaluates
78
+ * in a single predicate invocation — no intermediate closure allocations.
79
+ *
80
+ * @since 0.3.16-canary.1
81
+ */
82
+ export function whenAnyAncestorTaggedAll(tags) {
83
+ return (constraintContext) => constraintContext.ancestors.some((frame) => {
84
+ const { tags: frameTags } = frame.slot;
85
+ return tags.every(([tagKey, tagValue]) => frameTags.some(([otherKey, otherValue]) => otherKey === tagKey && Object.is(otherValue, tagValue)));
86
+ });
87
+ }
88
+ //# sourceMappingURL=constraints.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constraints.js","sourceRoot":"","sources":["../../src/resolution/constraints.ts"],"names":[],"mappings":"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"}