@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.
- package/CHANGELOG.md +65 -0
- package/README.md +73 -496
- package/dist/binding.d.ts +211 -0
- package/dist/binding.d.ts.map +1 -0
- package/dist/binding.js +46 -0
- package/dist/binding.js.map +1 -0
- package/dist/{constructor-type.d.mts → constructor-type.d.ts} +3 -5
- package/dist/constructor-type.d.ts.map +1 -0
- package/dist/constructor-type.js +2 -0
- package/dist/constructor-type.js.map +1 -0
- package/dist/container/binding-builders.d.ts +35 -0
- package/dist/container/binding-builders.d.ts.map +1 -0
- package/dist/container/binding-builders.js +247 -0
- package/dist/container/binding-builders.js.map +1 -0
- package/dist/container/container.d.ts +58 -0
- package/dist/container/container.d.ts.map +1 -0
- package/dist/container/container.js +641 -0
- package/dist/container/container.js.map +1 -0
- package/dist/decorators/inject.d.ts +57 -0
- package/dist/decorators/inject.d.ts.map +1 -0
- package/dist/decorators/inject.js +145 -0
- package/dist/decorators/inject.js.map +1 -0
- package/dist/decorators/injectable.d.ts +29 -0
- package/dist/decorators/injectable.d.ts.map +1 -0
- package/dist/decorators/injectable.js +53 -0
- package/dist/decorators/injectable.js.map +1 -0
- package/dist/decorators/lifecycle-decorators.d.ts +9 -0
- package/dist/decorators/lifecycle-decorators.d.ts.map +1 -0
- package/dist/decorators/lifecycle-decorators.js +40 -0
- package/dist/decorators/lifecycle-decorators.js.map +1 -0
- package/dist/errors.d.ts +150 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +197 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/introspection/dependency-graph.d.ts +40 -0
- package/dist/introspection/dependency-graph.d.ts.map +1 -0
- package/dist/introspection/dependency-graph.js +66 -0
- package/dist/introspection/dependency-graph.js.map +1 -0
- package/dist/introspection/graph-adapters/cytoscape.d.ts +33 -0
- package/dist/introspection/graph-adapters/cytoscape.d.ts.map +1 -0
- package/dist/introspection/graph-adapters/cytoscape.js +30 -0
- package/dist/introspection/graph-adapters/cytoscape.js.map +1 -0
- package/dist/introspection/graph-adapters/dot.d.ts +6 -0
- package/dist/introspection/graph-adapters/dot.d.ts.map +1 -0
- package/dist/introspection/graph-adapters/dot.js +18 -0
- package/dist/introspection/graph-adapters/dot.js.map +1 -0
- package/dist/introspection/graph-adapters/reactflow.d.ts +38 -0
- package/dist/introspection/graph-adapters/reactflow.d.ts.map +1 -0
- package/dist/introspection/graph-adapters/reactflow.js +33 -0
- package/dist/introspection/graph-adapters/reactflow.js.map +1 -0
- package/dist/introspection/inspector.d.ts +39 -0
- package/dist/introspection/inspector.d.ts.map +1 -0
- package/dist/introspection/inspector.js +82 -0
- package/dist/introspection/inspector.js.map +1 -0
- package/dist/metadata/{metadata-keys.d.mts → metadata-keys.d.ts} +5 -7
- package/dist/metadata/metadata-keys.d.ts.map +1 -0
- package/dist/metadata/metadata-keys.js +25 -0
- package/dist/metadata/metadata-keys.js.map +1 -0
- package/dist/metadata/metadata-reader-token.d.ts +7 -0
- package/dist/metadata/metadata-reader-token.d.ts.map +1 -0
- package/dist/metadata/metadata-reader-token.js +6 -0
- package/dist/metadata/metadata-reader-token.js.map +1 -0
- package/dist/metadata/metadata-types.d.ts +48 -0
- package/dist/metadata/metadata-types.d.ts.map +1 -0
- package/dist/metadata/metadata-types.js +2 -0
- package/dist/metadata/metadata-types.js.map +1 -0
- package/dist/metadata/symbol-metadata-reader.d.ts +20 -0
- package/dist/metadata/symbol-metadata-reader.d.ts.map +1 -0
- package/dist/metadata/symbol-metadata-reader.js +34 -0
- package/dist/metadata/symbol-metadata-reader.js.map +1 -0
- package/dist/module.d.ts +67 -0
- package/dist/module.d.ts.map +1 -0
- package/dist/module.js +54 -0
- package/dist/module.js.map +1 -0
- package/dist/registry.d.ts +33 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +249 -0
- package/dist/registry.js.map +1 -0
- package/dist/resolution/binding-scope.d.ts +10 -0
- package/dist/resolution/binding-scope.d.ts.map +1 -0
- package/dist/resolution/binding-scope.js +24 -0
- package/dist/resolution/binding-scope.js.map +1 -0
- package/dist/resolution/binding-select.d.ts +16 -0
- package/dist/resolution/binding-select.d.ts.map +1 -0
- package/dist/resolution/binding-select.js +143 -0
- package/dist/resolution/binding-select.js.map +1 -0
- package/dist/resolution/constraints.d.ts +51 -0
- package/dist/resolution/constraints.d.ts.map +1 -0
- package/dist/resolution/constraints.js +88 -0
- package/dist/resolution/constraints.js.map +1 -0
- package/dist/resolution/environment.d.ts +47 -0
- package/dist/resolution/environment.d.ts.map +1 -0
- package/dist/resolution/environment.js +100 -0
- package/dist/resolution/environment.js.map +1 -0
- package/dist/resolution/instantiation-plan.d.ts +67 -0
- package/dist/resolution/instantiation-plan.d.ts.map +1 -0
- package/dist/resolution/instantiation-plan.js +163 -0
- package/dist/resolution/instantiation-plan.js.map +1 -0
- package/dist/resolution/lifecycle.d.ts +21 -0
- package/dist/resolution/lifecycle.d.ts.map +1 -0
- package/dist/resolution/lifecycle.js +178 -0
- package/dist/resolution/lifecycle.js.map +1 -0
- package/dist/resolution/resolution-path.d.ts +31 -0
- package/dist/resolution/resolution-path.d.ts.map +1 -0
- package/dist/resolution/resolution-path.js +53 -0
- package/dist/resolution/resolution-path.js.map +1 -0
- package/dist/resolution/resolve-options.d.ts +19 -0
- package/dist/resolution/resolve-options.d.ts.map +1 -0
- package/dist/resolution/resolve-options.js +32 -0
- package/dist/resolution/resolve-options.js.map +1 -0
- package/dist/resolution/resolver.d.ts +35 -0
- package/dist/resolution/resolver.d.ts.map +1 -0
- package/dist/resolution/resolver.js +1320 -0
- package/dist/resolution/resolver.js.map +1 -0
- package/dist/resolution/scope.d.ts +32 -0
- package/dist/resolution/scope.d.ts.map +1 -0
- package/dist/resolution/scope.js +76 -0
- package/dist/resolution/scope.js.map +1 -0
- package/dist/token.d.ts +23 -0
- package/dist/token.d.ts.map +1 -0
- package/dist/token.js +22 -0
- package/dist/token.js.map +1 -0
- package/dist/types.d.ts +90 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +143 -120
- package/src/binding.ts +38 -22
- package/src/container/binding-builders.ts +397 -0
- package/src/container/container.ts +838 -0
- package/src/decorators/inject.ts +16 -3
- package/src/decorators/injectable.ts +3 -3
- package/src/index.ts +14 -7
- package/src/{dependency-graph.ts → introspection/dependency-graph.ts} +1 -1
- package/src/{graph-adapters → introspection/graph-adapters}/cytoscape.ts +1 -1
- package/src/{graph-adapters → introspection/graph-adapters}/dot.ts +1 -1
- package/src/{graph-adapters → introspection/graph-adapters}/reactflow.ts +13 -2
- package/src/{inspector.ts → introspection/inspector.ts} +26 -21
- package/src/metadata/symbol-metadata-reader.ts +4 -4
- package/src/module.ts +14 -6
- package/src/registry.ts +115 -61
- package/src/{binding-select.ts → resolution/binding-select.ts} +16 -3
- package/src/{environment.ts → resolution/environment.ts} +35 -35
- package/src/resolution/instantiation-plan.ts +240 -0
- package/src/{lifecycle.ts → resolution/lifecycle.ts} +20 -13
- package/src/resolution/resolution-path.ts +77 -0
- package/src/resolution/resolver.ts +1755 -0
- package/src/{scope.ts → resolution/scope.ts} +35 -18
- package/src/token.ts +0 -3
- package/dist/binding-scope.d.mts +0 -13
- package/dist/binding-scope.mjs +0 -21
- package/dist/binding-select.d.mts +0 -19
- package/dist/binding-select.mjs +0 -72
- package/dist/binding.d.mts +0 -191
- package/dist/binding.mjs +0 -36
- package/dist/constraints.d.mts +0 -55
- package/dist/constraints.mjs +0 -87
- package/dist/constructor-type.mjs +0 -1
- package/dist/container.d.mts +0 -62
- package/dist/container.mjs +0 -741
- package/dist/decorators/inject.d.mts +0 -49
- package/dist/decorators/inject.mjs +0 -136
- package/dist/decorators/injectable.d.mts +0 -32
- package/dist/decorators/injectable.mjs +0 -57
- package/dist/decorators/lifecycle-decorators.d.mts +0 -11
- package/dist/decorators/lifecycle-decorators.mjs +0 -38
- package/dist/dependency-graph.d.mts +0 -43
- package/dist/dependency-graph.mjs +0 -63
- package/dist/environment.d.mts +0 -55
- package/dist/environment.mjs +0 -98
- package/dist/errors.d.mts +0 -153
- package/dist/errors.mjs +0 -197
- package/dist/graph-adapters/cytoscape.d.mts +0 -36
- package/dist/graph-adapters/cytoscape.mjs +0 -26
- package/dist/graph-adapters/dot.d.mts +0 -9
- package/dist/graph-adapters/dot.mjs +0 -20
- package/dist/graph-adapters/reactflow.d.mts +0 -41
- package/dist/graph-adapters/reactflow.mjs +0 -29
- package/dist/index.d.mts +0 -18
- package/dist/index.mjs +0 -12
- package/dist/inspector.d.mts +0 -48
- package/dist/inspector.mjs +0 -71
- package/dist/lifecycle.d.mts +0 -25
- package/dist/lifecycle.mjs +0 -118
- package/dist/metadata/metadata-keys.mjs +0 -27
- package/dist/metadata/metadata-reader-token.d.mts +0 -10
- package/dist/metadata/metadata-reader-token.mjs +0 -8
- package/dist/metadata/metadata-types.d.mts +0 -51
- package/dist/metadata/metadata-types.mjs +0 -1
- package/dist/metadata/symbol-metadata-reader.d.mts +0 -23
- package/dist/metadata/symbol-metadata-reader.mjs +0 -29
- package/dist/module.d.mts +0 -62
- package/dist/module.mjs +0 -42
- package/dist/registry.d.mts +0 -45
- package/dist/registry.mjs +0 -163
- package/dist/resolve-options.d.mts +0 -22
- package/dist/resolve-options.mjs +0 -28
- package/dist/resolver.d.mts +0 -94
- package/dist/resolver.mjs +0 -767
- package/dist/scope.d.mts +0 -28
- package/dist/scope.mjs +0 -58
- package/dist/token.d.mts +0 -25
- package/dist/token.mjs +0 -22
- package/dist/types.d.mts +0 -92
- package/dist/types.mjs +0 -1
- package/src/container.ts +0 -1141
- package/src/resolver.ts +0 -1626
- /package/src/{binding-scope.ts → resolution/binding-scope.ts} +0 -0
- /package/src/{constraints.ts → resolution/constraints.ts} +0 -0
- /package/src/{resolve-options.ts → resolution/resolve-options.ts} +0 -0
package/dist/registry.js
ADDED
|
@@ -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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"}
|