@codefast/di 0.5.0-canary.7 → 0.5.0-canary.9
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 +205 -0
- package/README.md +6 -2
- package/dist/binding.d.ts +85 -24
- package/dist/binding.d.ts.map +1 -1
- package/dist/binding.js +55 -0
- package/dist/binding.js.map +1 -1
- package/dist/constructor-type.d.ts +4 -5
- package/dist/constructor-type.d.ts.map +1 -1
- package/dist/container/binding-builders.d.ts +32 -11
- package/dist/container/binding-builders.d.ts.map +1 -1
- package/dist/container/binding-builders.js +144 -192
- package/dist/container/binding-builders.js.map +1 -1
- package/dist/container/container.d.ts.map +1 -1
- package/dist/container/container.js +141 -201
- package/dist/container/container.js.map +1 -1
- package/dist/decorators/inject.d.ts +2 -4
- package/dist/decorators/inject.d.ts.map +1 -1
- package/dist/decorators/inject.js.map +1 -1
- package/dist/errors.d.ts +24 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +30 -0
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +1 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/introspection/inspector.d.ts +0 -1
- package/dist/introspection/inspector.d.ts.map +1 -1
- package/dist/introspection/inspector.js +3 -8
- package/dist/introspection/inspector.js.map +1 -1
- package/dist/metadata/metadata-keys.d.ts +3 -6
- package/dist/metadata/metadata-keys.d.ts.map +1 -1
- package/dist/metadata/metadata-keys.js +3 -6
- package/dist/metadata/metadata-keys.js.map +1 -1
- package/dist/registry.d.ts +14 -2
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +81 -78
- package/dist/registry.js.map +1 -1
- package/dist/resolution/activation-need.d.ts +27 -0
- package/dist/resolution/activation-need.d.ts.map +1 -0
- package/dist/resolution/activation-need.js +68 -0
- package/dist/resolution/activation-need.js.map +1 -0
- package/dist/resolution/binding-lookup-cache.d.ts +41 -0
- package/dist/resolution/binding-lookup-cache.d.ts.map +1 -0
- package/dist/resolution/binding-lookup-cache.js +118 -0
- package/dist/resolution/binding-lookup-cache.js.map +1 -0
- package/dist/resolution/binding-scope.d.ts +5 -2
- package/dist/resolution/binding-scope.d.ts.map +1 -1
- package/dist/resolution/binding-scope.js +6 -17
- package/dist/resolution/binding-scope.js.map +1 -1
- package/dist/resolution/binding-select.d.ts +8 -1
- package/dist/resolution/binding-select.d.ts.map +1 -1
- package/dist/resolution/binding-select.js +14 -36
- package/dist/resolution/binding-select.js.map +1 -1
- package/dist/resolution/class-introspector.d.ts +27 -0
- package/dist/resolution/class-introspector.d.ts.map +1 -0
- package/dist/resolution/class-introspector.js +60 -0
- package/dist/resolution/class-introspector.js.map +1 -0
- package/dist/resolution/diagnostics.d.ts +41 -0
- package/dist/resolution/diagnostics.d.ts.map +1 -0
- package/dist/resolution/diagnostics.js +18 -0
- package/dist/resolution/diagnostics.js.map +1 -0
- package/dist/resolution/environment.d.ts +48 -1
- package/dist/resolution/environment.d.ts.map +1 -1
- package/dist/resolution/environment.js +134 -5
- package/dist/resolution/environment.js.map +1 -1
- package/dist/resolution/instantiation-plan.d.ts +15 -15
- package/dist/resolution/instantiation-plan.d.ts.map +1 -1
- package/dist/resolution/instantiation-plan.js +69 -49
- package/dist/resolution/instantiation-plan.js.map +1 -1
- package/dist/resolution/lifecycle.d.ts +2 -0
- package/dist/resolution/lifecycle.d.ts.map +1 -1
- package/dist/resolution/lifecycle.js +60 -62
- package/dist/resolution/lifecycle.js.map +1 -1
- package/dist/resolution/resolution-path.d.ts +84 -17
- package/dist/resolution/resolution-path.d.ts.map +1 -1
- package/dist/resolution/resolution-path.js +68 -23
- package/dist/resolution/resolution-path.js.map +1 -1
- package/dist/resolution/resolve-options.d.ts +41 -4
- package/dist/resolution/resolve-options.d.ts.map +1 -1
- package/dist/resolution/resolve-options.js +25 -1
- package/dist/resolution/resolve-options.js.map +1 -1
- package/dist/resolution/resolver.d.ts +33 -10
- package/dist/resolution/resolver.d.ts.map +1 -1
- package/dist/resolution/resolver.js +471 -830
- package/dist/resolution/resolver.js.map +1 -1
- package/dist/resolution/scope.d.ts +11 -15
- package/dist/resolution/scope.d.ts.map +1 -1
- package/dist/resolution/scope.js +55 -43
- package/dist/resolution/scope.js.map +1 -1
- package/package.json +10 -106
- package/src/binding.ts +146 -24
- package/src/constructor-type.ts +4 -5
- package/src/container/binding-builders.ts +184 -284
- package/src/container/container.ts +161 -221
- package/src/decorators/inject.ts +3 -5
- package/src/errors.ts +38 -0
- package/src/index.ts +4 -1
- package/src/introspection/inspector.ts +3 -9
- package/src/metadata/metadata-keys.ts +3 -6
- package/src/registry.ts +90 -94
- package/src/resolution/activation-need.ts +85 -0
- package/src/resolution/binding-lookup-cache.ts +148 -0
- package/src/resolution/binding-scope.ts +6 -17
- package/src/resolution/binding-select.ts +15 -39
- package/src/resolution/class-introspector.ts +74 -0
- package/src/resolution/diagnostics.ts +43 -0
- package/src/resolution/environment.ts +181 -5
- package/src/resolution/instantiation-plan.ts +116 -64
- package/src/resolution/lifecycle.ts +69 -62
- package/src/resolution/resolution-path.ts +122 -43
- package/src/resolution/resolve-options.ts +51 -4
- package/src/resolution/resolver.ts +649 -1081
- package/src/resolution/scope.ts +58 -47
package/dist/registry.js
CHANGED
|
@@ -1,30 +1,4 @@
|
|
|
1
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
2
|
/**
|
|
29
3
|
* @since 0.3.16-canary.0
|
|
30
4
|
*/
|
|
@@ -35,27 +9,40 @@ export class BindingRegistry {
|
|
|
35
9
|
#bindings = new Map();
|
|
36
10
|
// Fast lookup by binding ID
|
|
37
11
|
#byId = new Map();
|
|
38
|
-
// Fast lookup for slot { name, tags: [] }
|
|
39
|
-
#simpleNamed
|
|
12
|
+
// Fast lookup for slot { name, tags: [] } — unallocated until a named binding is registered.
|
|
13
|
+
#simpleNamed;
|
|
40
14
|
// Fast path for one default slot binding with no predicate
|
|
41
15
|
#fastDefault = new Map();
|
|
42
|
-
// Fast lookup for slot { name: undefined, tags: [[key, value]] } with no predicate
|
|
43
|
-
|
|
16
|
+
// Fast lookup for slot { name: undefined, tags: [[key, value]] } with no predicate — likewise
|
|
17
|
+
// unallocated until a tagged binding is registered.
|
|
18
|
+
#simpleTagged;
|
|
44
19
|
/** Monotonic version — increments on every mutation. */
|
|
45
20
|
get version() {
|
|
46
21
|
return this.#version;
|
|
47
22
|
}
|
|
48
|
-
/**
|
|
49
|
-
|
|
23
|
+
/**
|
|
24
|
+
* Registers a mutation the indexes don't care about (a fluent chain refining scope or an
|
|
25
|
+
* activation hook in place), so version-stamped resolver caches still invalidate.
|
|
26
|
+
*/
|
|
27
|
+
touch() {
|
|
28
|
+
this.#version += 1;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Add or replace binding using slot-aware last-wins. Returns the displaced binding, if any.
|
|
32
|
+
*
|
|
33
|
+
* @remarks The binding is stored by reference — it must come from `createBinding`, which is
|
|
34
|
+
* what guarantees the single hidden class the resolver's hot reads depend on.
|
|
35
|
+
*/
|
|
36
|
+
add(binding) {
|
|
50
37
|
this.#version += 1;
|
|
51
|
-
const binding = normalizeBindingShape(uncommittedBinding);
|
|
52
38
|
const key = binding.token;
|
|
53
|
-
//
|
|
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.
|
|
54
41
|
const bindingsForToken = this.#bindings.getOrInsert(key, []);
|
|
55
42
|
// Only apply last-wins for slot-based bindings (not predicate-only)
|
|
56
43
|
let displacedBinding;
|
|
57
|
-
if (!
|
|
58
|
-
const existingIndex = bindingsForToken.findIndex((candidate) => !
|
|
44
|
+
if (!isPurePredicateBinding(binding)) {
|
|
45
|
+
const existingIndex = bindingsForToken.findIndex((candidate) => !isPurePredicateBinding(candidate) && bindingSlotEquals(candidate.slot, binding.slot));
|
|
59
46
|
if (existingIndex !== -1) {
|
|
60
47
|
displacedBinding = bindingsForToken[existingIndex];
|
|
61
48
|
this.#byId.delete(displacedBinding.id);
|
|
@@ -77,8 +64,8 @@ export class BindingRegistry {
|
|
|
77
64
|
const key = token;
|
|
78
65
|
const bindingsForToken = this.#bindings.get(key) ?? [];
|
|
79
66
|
this.#bindings.delete(key);
|
|
80
|
-
this.#simpleNamed
|
|
81
|
-
this.#simpleTagged
|
|
67
|
+
this.#simpleNamed?.delete(key);
|
|
68
|
+
this.#simpleTagged?.delete(key);
|
|
82
69
|
this.#fastDefault.delete(key);
|
|
83
70
|
for (const binding of bindingsForToken) {
|
|
84
71
|
this.#byId.delete(binding.id);
|
|
@@ -104,8 +91,8 @@ export class BindingRegistry {
|
|
|
104
91
|
this.#deindexSimpleTaggedBinding(key, binding);
|
|
105
92
|
if (bindingsForToken.length === 0) {
|
|
106
93
|
this.#bindings.delete(key);
|
|
107
|
-
this.#simpleNamed
|
|
108
|
-
this.#simpleTagged
|
|
94
|
+
this.#simpleNamed?.delete(key);
|
|
95
|
+
this.#simpleTagged?.delete(key);
|
|
109
96
|
this.#fastDefault.delete(key);
|
|
110
97
|
}
|
|
111
98
|
else {
|
|
@@ -142,17 +129,17 @@ export class BindingRegistry {
|
|
|
142
129
|
const all = this.allBindings();
|
|
143
130
|
this.#bindings.clear();
|
|
144
131
|
this.#byId.clear();
|
|
145
|
-
this.#simpleNamed
|
|
146
|
-
this.#simpleTagged
|
|
132
|
+
this.#simpleNamed?.clear();
|
|
133
|
+
this.#simpleTagged?.clear();
|
|
147
134
|
this.#fastDefault.clear();
|
|
148
135
|
return all;
|
|
149
136
|
}
|
|
150
137
|
getSimpleNamed(token, name) {
|
|
151
|
-
return this.#simpleNamed
|
|
138
|
+
return this.#simpleNamed?.get(token)?.get(name);
|
|
152
139
|
}
|
|
153
140
|
getSimpleTagged(token, tagKey, tagValue) {
|
|
154
141
|
return this.#simpleTagged
|
|
155
|
-
|
|
142
|
+
?.get(token)
|
|
156
143
|
?.get(tagKey)
|
|
157
144
|
?.get(tagValue);
|
|
158
145
|
}
|
|
@@ -165,22 +152,22 @@ export class BindingRegistry {
|
|
|
165
152
|
return bindingsForToken.map((binding) => bindingSlotToString(binding.slot));
|
|
166
153
|
}
|
|
167
154
|
#indexSimpleTaggedBinding(tokenKey, binding) {
|
|
168
|
-
const
|
|
169
|
-
if (
|
|
155
|
+
const tag = simpleTagOf(binding);
|
|
156
|
+
if (tag === undefined) {
|
|
170
157
|
return;
|
|
171
158
|
}
|
|
172
|
-
const [tagKey, tagValue] =
|
|
173
|
-
const byTagKey = this.#simpleTagged.getOrInsert(tokenKey, new Map());
|
|
159
|
+
const [tagKey, tagValue] = tag;
|
|
160
|
+
const byTagKey = (this.#simpleTagged ??= new Map()).getOrInsert(tokenKey, new Map());
|
|
174
161
|
const byTagValue = byTagKey.getOrInsert(tagKey, new Map());
|
|
175
162
|
byTagValue.set(tagValue, binding);
|
|
176
163
|
}
|
|
177
164
|
#deindexSimpleTaggedBinding(tokenKey, binding) {
|
|
178
|
-
const
|
|
179
|
-
if (
|
|
165
|
+
const tag = simpleTagOf(binding);
|
|
166
|
+
if (tag === undefined) {
|
|
180
167
|
return;
|
|
181
168
|
}
|
|
182
|
-
const [tagKey, tagValue] =
|
|
183
|
-
const byTagKey = this.#simpleTagged
|
|
169
|
+
const [tagKey, tagValue] = tag;
|
|
170
|
+
const byTagKey = this.#simpleTagged?.get(tokenKey);
|
|
184
171
|
if (byTagKey === undefined) {
|
|
185
172
|
return;
|
|
186
173
|
}
|
|
@@ -199,33 +186,25 @@ export class BindingRegistry {
|
|
|
199
186
|
}
|
|
200
187
|
}
|
|
201
188
|
}
|
|
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
189
|
#indexSimpleNamedBinding(tokenKey, binding) {
|
|
210
|
-
const
|
|
211
|
-
if (
|
|
190
|
+
const name = simpleNameOf(binding);
|
|
191
|
+
if (name === undefined) {
|
|
212
192
|
return;
|
|
213
193
|
}
|
|
214
|
-
const bindingsByName = this.#simpleNamed.getOrInsert(tokenKey, new Map());
|
|
215
|
-
bindingsByName.set(
|
|
194
|
+
const bindingsByName = (this.#simpleNamed ??= new Map()).getOrInsert(tokenKey, new Map());
|
|
195
|
+
bindingsByName.set(name, binding);
|
|
216
196
|
}
|
|
217
197
|
#deindexSimpleNamedBinding(tokenKey, binding) {
|
|
218
|
-
const
|
|
219
|
-
if (
|
|
198
|
+
const name = simpleNameOf(binding);
|
|
199
|
+
if (name === undefined) {
|
|
220
200
|
return;
|
|
221
201
|
}
|
|
222
|
-
const bindingsByName = this.#simpleNamed
|
|
202
|
+
const bindingsByName = this.#simpleNamed?.get(tokenKey);
|
|
223
203
|
if (bindingsByName === undefined) {
|
|
224
204
|
return;
|
|
225
205
|
}
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
bindingsByName.delete(slot.name);
|
|
206
|
+
if (bindingsByName.get(name)?.id === binding.id) {
|
|
207
|
+
bindingsByName.delete(name);
|
|
229
208
|
if (bindingsByName.size === 0) {
|
|
230
209
|
this.#simpleNamed.delete(tokenKey);
|
|
231
210
|
}
|
|
@@ -233,17 +212,41 @@ export class BindingRegistry {
|
|
|
233
212
|
}
|
|
234
213
|
#refreshFastDefaultForToken(tokenKey) {
|
|
235
214
|
const bindingsForToken = this.#bindings.get(tokenKey);
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
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);
|
|
215
|
+
const onlyBinding = bindingsForToken?.length === 1 ? bindingsForToken[0] : undefined;
|
|
216
|
+
if (onlyBinding !== undefined && isDefaultSlotBinding(onlyBinding)) {
|
|
217
|
+
this.#fastDefault.set(tokenKey, onlyBinding);
|
|
244
218
|
return;
|
|
245
219
|
}
|
|
246
|
-
this.#fastDefault.
|
|
220
|
+
this.#fastDefault.delete(tokenKey);
|
|
247
221
|
}
|
|
222
|
+
/** Whether the deferred table behind `#simpleNamed` has had to be built. */
|
|
223
|
+
get isBuilt() {
|
|
224
|
+
return this.#simpleNamed !== undefined;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
/** The name a binding is indexed under, or `undefined` when its slot is more than a plain name. */
|
|
228
|
+
function simpleNameOf(binding) {
|
|
229
|
+
const { name, tags } = binding.slot;
|
|
230
|
+
return name !== undefined && tags.length === 0 ? name : undefined;
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* The tag a binding is indexed under, or `undefined` when its slot is more than one plain tag.
|
|
234
|
+
*
|
|
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.
|
|
237
|
+
*/
|
|
238
|
+
function simpleTagOf(binding) {
|
|
239
|
+
const { name, tags } = binding.slot;
|
|
240
|
+
return name === undefined && tags.length === 1 && binding.predicate === undefined ? tags[0] : undefined;
|
|
241
|
+
}
|
|
242
|
+
/** A binding nothing has to be matched against: the default slot, no predicate. */
|
|
243
|
+
function isDefaultSlotBinding(binding) {
|
|
244
|
+
const { name, tags } = binding.slot;
|
|
245
|
+
return name === undefined && tags.length === 0 && binding.predicate === undefined;
|
|
246
|
+
}
|
|
247
|
+
/** A predicate with no slot constraint: last-wins does not apply to it. */
|
|
248
|
+
function isPurePredicateBinding(binding) {
|
|
249
|
+
const { name, tags } = binding.slot;
|
|
250
|
+
return binding.predicate !== undefined && name === undefined && tags.length === 0;
|
|
248
251
|
}
|
|
249
252
|
//# sourceMappingURL=registry.js.map
|
package/dist/registry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAInE;;GAEG;AACH,MAAM,OAAO,eAAe;IAC1B,oGAAoG;IACpG,QAAQ,GAAG,CAAC,CAAC;IACb,wEAAwE;IAC/D,SAAS,GAAG,IAAI,GAAG,EAAiC,CAAC;IAC9D,4BAA4B;IACnB,KAAK,GAAG,IAAI,GAAG,EAA8B,CAAC;IACvD,6FAA6F;IAC7F,YAAY,CAAuD;IACnE,2DAA2D;IAClD,YAAY,GAAG,IAAI,GAAG,EAA0B,CAAC;IAC1D,8FAA8F;IAC9F,oDAAoD;IACpD,aAAa,CAAqE;IAElF,wDAAwD;IACxD,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED;;;OAGG;IACH,KAAK;QACH,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC;IACrB,CAAC;IAED;;;;;OAKG;IACH,GAAG,CAAC,OAAgB;QAClB,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC;QACnB,MAAM,GAAG,GAAG,OAAO,CAAC,KAAsB,CAAC;QAC3C,2FAA2F;QAC3F,yFAAyF;QACzF,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAE7D,oEAAoE;QACpE,IAAI,gBAAqC,CAAC;QAC1C,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,EAAE,CAAC;YACrC,MAAM,aAAa,GAAG,gBAAgB,CAAC,SAAS,CAC9C,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,sBAAsB,CAAC,SAAS,CAAC,IAAI,iBAAiB,CAAC,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CACrG,CAAC;YACF,IAAI,aAAa,KAAK,CAAC,CAAC,EAAE,CAAC;gBACzB,gBAAgB,GAAG,gBAAgB,CAAC,aAAa,CAAE,CAAC;gBACpD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;gBACvC,gBAAgB,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;gBAC1C,IAAI,CAAC,0BAA0B,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;gBACvD,IAAI,CAAC,2BAA2B,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC;QAED,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC/B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QACpC,IAAI,CAAC,wBAAwB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAC5C,IAAI,CAAC,yBAAyB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAC7C,IAAI,CAAC,2BAA2B,CAAC,GAAG,CAAC,CAAC;QACtC,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAED,iEAAiE;IACjE,aAAa,CAAC,KAAmC;QAC/C,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC;QACnB,MAAM,GAAG,GAAG,KAAsB,CAAC;QACnC,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QACvD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC3B,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC9B,KAAK,MAAM,OAAO,IAAI,gBAAgB,EAAE,CAAC;YACvC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAChC,CAAC;QACD,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAED,iFAAiF;IACjF,UAAU,CAAC,EAAqB;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACnC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC;QACnB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACtB,MAAM,GAAG,GAAG,OAAO,CAAC,KAAsB,CAAC;QAC3C,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACjD,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;YACnC,MAAM,YAAY,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;YACpF,IAAI,YAAY,KAAK,CAAC,CAAC,EAAE,CAAC;gBACxB,gBAAgB,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;YAC3C,CAAC;YACD,IAAI,CAAC,0BAA0B,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAC9C,IAAI,CAAC,2BAA2B,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAC/C,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAClC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC3B,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC/B,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;gBAChC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAChC,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,2BAA2B,CAAC,GAAG,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,oCAAoC;IACpC,MAAM,CAAC,KAAmC;QACxC,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAsB,CAAC,IAAI,EAAE,CAAC;IAC1D,CAAC;IAED,yBAAyB;IACzB,OAAO,CAAC,EAAqB;QAC3B,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC5B,CAAC;IAED,6CAA6C;IAC7C,GAAG,CAAC,KAAmC;QACrC,MAAM,GAAG,GAAG,KAAsB,CAAC;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACrC,OAAO,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IAC/C,CAAC;IAED,oCAAoC;IACpC,WAAW;QACT,MAAM,WAAW,GAAmB,EAAE,CAAC;QACvC,KAAK,MAAM,gBAAgB,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC;YACvD,WAAW,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,CAAC;QACxC,CAAC;QACD,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,gDAAgD;IAChD,KAAK;QACH,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC;QACnB,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAC/B,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACvB,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACnB,IAAI,CAAC,YAAY,EAAE,KAAK,EAAE,CAAC;QAC3B,IAAI,CAAC,aAAa,EAAE,KAAK,EAAE,CAAC;QAC5B,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;QAC1B,OAAO,GAAG,CAAC;IACb,CAAC;IAED,cAAc,CAAC,KAAmC,EAAE,IAAY;QAC9D,OAAO,IAAI,CAAC,YAAY,EAAE,GAAG,CAAC,KAAsB,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;IACnE,CAAC;IAED,eAAe,CAAC,KAAmC,EAAE,MAAc,EAAE,QAAiB;QACpF,OAAO,IAAI,CAAC,aAAa;YACvB,EAAE,GAAG,CAAC,KAAsB,CAAC;YAC7B,EAAE,GAAG,CAAC,MAAM,CAAC;YACb,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;IACpB,CAAC;IAED,cAAc,CAAC,KAAmC;QAChD,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAsB,CAAC,CAAC;IACvD,CAAC;IAED,yEAAyE;IACzE,oBAAoB,CAAC,KAAmC;QACtD,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAsB,CAAC,IAAI,EAAE,CAAC;QAC1E,OAAO,gBAAgB,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,mBAAmB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9E,CAAC;IAED,yBAAyB,CAAC,QAAuB,EAAE,OAAgB;QACjE,MAAM,GAAG,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;QACjC,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,OAAO;QACT,CAAC;QACD,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,GAAG,CAAC;QAC/B,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,aAAa,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,GAAG,EAAiC,CAAC,CAAC;QACpH,MAAM,UAAU,GAAG,QAAQ,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,GAAG,EAAoB,CAAC,CAAC;QAC7E,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACpC,CAAC;IAED,2BAA2B,CAAC,QAAuB,EAAE,OAAgB;QACnE,MAAM,GAAG,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;QACjC,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,OAAO;QACT,CAAC;QACD,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,GAAG,CAAC;QAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;QACnD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,OAAO;QACT,CAAC;QACD,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,OAAO;QACT,CAAC;QACD,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACzC,IAAI,OAAO,EAAE,EAAE,KAAK,OAAO,CAAC,EAAE,EAAE,CAAC;YAC/B,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC5B,IAAI,UAAU,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBAC1B,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBACxB,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;oBACxB,IAAI,CAAC,aAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACvC,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,wBAAwB,CAAC,QAAuB,EAAE,OAAgB;QAChE,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QACnC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QACD,MAAM,cAAc,GAAG,CAAC,IAAI,CAAC,YAAY,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,GAAG,EAAmB,CAAC,CAAC;QAC3G,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACpC,CAAC;IAED,0BAA0B,CAAC,QAAuB,EAAE,OAAgB;QAClE,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QACnC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QACD,MAAM,cAAc,GAAG,IAAI,CAAC,YAAY,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;QACxD,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;YACjC,OAAO;QACT,CAAC;QACD,IAAI,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,OAAO,CAAC,EAAE,EAAE,CAAC;YAChD,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC5B,IAAI,cAAc,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBAC9B,IAAI,CAAC,YAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;IACH,CAAC;IAED,2BAA2B,CAAC,QAAuB;QACjD,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACtD,MAAM,WAAW,GAAG,gBAAgB,EAAE,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QACtF,IAAI,WAAW,KAAK,SAAS,IAAI,oBAAoB,CAAC,WAAW,CAAC,EAAE,CAAC;YACnE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;YAC7C,OAAO;QACT,CAAC;QACD,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACrC,CAAC;IAED,4EAA4E;IAC5E,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,YAAY,KAAK,SAAS,CAAC;IACzC,CAAC;CACF;AAED,mGAAmG;AACnG,SAAS,YAAY,CAAC,OAAgB;IACpC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IACpC,OAAO,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AACpE,CAAC;AAED;;;;;GAKG;AACH,SAAS,WAAW,CAAC,OAAgB;IACnC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IACpC,OAAO,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC1G,CAAC;AAED,mFAAmF;AACnF,SAAS,oBAAoB,CAAC,OAAgB;IAC5C,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IACpC,OAAO,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC;AACpF,CAAC;AAED,2EAA2E;AAC3E,SAAS,sBAAsB,CAAC,OAAgB;IAC9C,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IACpC,OAAO,OAAO,CAAC,SAAS,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC;AACpF,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per binding: does resolving it have to go through the activation pipeline?
|
|
3
|
+
*
|
|
4
|
+
* @remarks Versioned on the lifecycle manager plus the own registry, since `onActivation` can be
|
|
5
|
+
* registered at any time and a rebind mints binding ids the memo must not keep forever.
|
|
6
|
+
*/
|
|
7
|
+
import type { Binding } from "#/binding";
|
|
8
|
+
import type { BindingRegistry } from "#/registry";
|
|
9
|
+
import type { ClassIntrospector } from "#/resolution/class-introspector";
|
|
10
|
+
import type { LifecycleManager } from "#/resolution/lifecycle";
|
|
11
|
+
/**
|
|
12
|
+
* @since 0.5.0-canary.8
|
|
13
|
+
*/
|
|
14
|
+
export declare class ActivationNeedCache {
|
|
15
|
+
#private;
|
|
16
|
+
constructor(lifecycle: LifecycleManager, classes: ClassIntrospector, registry: BindingRegistry);
|
|
17
|
+
needsActivation<const Value>(binding: Binding<Value>): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Settles a class binding's answer once its lifecycle metadata has actually been read, which
|
|
20
|
+
* only happens on the first instantiation.
|
|
21
|
+
*
|
|
22
|
+
* @returns the answer to use for this resolve — possibly now `false` where it was a
|
|
23
|
+
* conservative `true`.
|
|
24
|
+
*/
|
|
25
|
+
refreshAfterFirstInstantiation<Value>(binding: Binding<Value>, needsActivation: boolean): boolean;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=activation-need.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activation-need.d.ts","sourceRoot":"","sources":["../../src/resolution/activation-need.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG/D;;GAEG;AACH,qBAAa,mBAAmB;;IAO9B,YAAY,SAAS,EAAE,gBAAgB,EAAE,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,eAAe,EAI7F;IAED,eAAe,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,OAAO,CA0B7D;IAED;;;;;;OAMG;IACH,8BAA8B,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,eAAe,EAAE,OAAO,GAAG,OAAO,CAOhG;CAcF"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 0.5.0-canary.8
|
|
3
|
+
*/
|
|
4
|
+
export class ActivationNeedCache {
|
|
5
|
+
#needByBindingId = new Map();
|
|
6
|
+
#version = -1;
|
|
7
|
+
#lifecycle;
|
|
8
|
+
#classes;
|
|
9
|
+
#registry;
|
|
10
|
+
constructor(lifecycle, classes, registry) {
|
|
11
|
+
this.#lifecycle = lifecycle;
|
|
12
|
+
this.#classes = classes;
|
|
13
|
+
this.#registry = registry;
|
|
14
|
+
}
|
|
15
|
+
needsActivation(binding) {
|
|
16
|
+
// The chain writes a binding's own hook in place with no version anything here can see, so it
|
|
17
|
+
// is read fresh on every call; the memo covers only container hooks and lifecycle metadata.
|
|
18
|
+
if (binding.kind !== "alias" && binding.onActivation !== undefined) {
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
const lifecycleVersion = this.#lifecycle.activationVersion;
|
|
22
|
+
// No hooks registered anywhere and none on the binding: only classes can still surprise us,
|
|
23
|
+
// via a @postConstruct we have not looked for yet.
|
|
24
|
+
if (lifecycleVersion === 0 && binding.kind !== "class" && binding.kind !== "alias") {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
// The registry version evicts entries for binding ids a rebind has retired.
|
|
28
|
+
const version = lifecycleVersion + this.#registry.version;
|
|
29
|
+
if (this.#version !== version) {
|
|
30
|
+
this.#needByBindingId.clear();
|
|
31
|
+
this.#version = version;
|
|
32
|
+
}
|
|
33
|
+
const cached = this.#needByBindingId.get(binding.id);
|
|
34
|
+
if (cached !== undefined) {
|
|
35
|
+
return cached;
|
|
36
|
+
}
|
|
37
|
+
const needsActivation = binding.kind === "class" ? this.#classNeedsActivation(binding) : this.#nonClassNeedsActivation(binding);
|
|
38
|
+
this.#needByBindingId.set(binding.id, needsActivation);
|
|
39
|
+
return needsActivation;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Settles a class binding's answer once its lifecycle metadata has actually been read, which
|
|
43
|
+
* only happens on the first instantiation.
|
|
44
|
+
*
|
|
45
|
+
* @returns the answer to use for this resolve — possibly now `false` where it was a
|
|
46
|
+
* conservative `true`.
|
|
47
|
+
*/
|
|
48
|
+
refreshAfterFirstInstantiation(binding, needsActivation) {
|
|
49
|
+
if (binding.kind !== "class" || this.#classes.knownPostConstruct(binding.target) !== undefined) {
|
|
50
|
+
return needsActivation;
|
|
51
|
+
}
|
|
52
|
+
this.#classes.discoverPostConstruct(binding.target);
|
|
53
|
+
this.#needByBindingId.delete(binding.id);
|
|
54
|
+
return this.needsActivation(binding);
|
|
55
|
+
}
|
|
56
|
+
// Own hooks are answered before the memo, so both computations cover the memoizable rest only.
|
|
57
|
+
#classNeedsActivation(binding) {
|
|
58
|
+
if (this.#lifecycle.hasActivationHandlers(binding.token)) {
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
// Unknown lifecycle metadata: activate once so the first instantiation can settle it.
|
|
62
|
+
return this.#classes.knownPostConstruct(binding.target) !== false;
|
|
63
|
+
}
|
|
64
|
+
#nonClassNeedsActivation(binding) {
|
|
65
|
+
return this.#lifecycle.hasActivationHandlers(binding.token);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=activation-need.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activation-need.js","sourceRoot":"","sources":["../../src/resolution/activation-need.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Options-less token → terminal binding, memoized per container chain.
|
|
3
|
+
*
|
|
4
|
+
* @see `ARCHITECTURE.md` — why these caches form their own parent chain.
|
|
5
|
+
*/
|
|
6
|
+
import type { Binding } from "#/binding";
|
|
7
|
+
import type { BindingRegistry } from "#/registry";
|
|
8
|
+
import type { Token } from "#/token";
|
|
9
|
+
import type { Constructor } from "#/types";
|
|
10
|
+
/**
|
|
11
|
+
* A token's terminal binding with alias hops already folded, plus the container that owns it.
|
|
12
|
+
*
|
|
13
|
+
* @typeParam Owner - the resolver type, kept generic so this module stays free of resolver internals
|
|
14
|
+
*
|
|
15
|
+
* @since 0.5.0-canary.8
|
|
16
|
+
*/
|
|
17
|
+
export interface DefaultLookupEntry<Owner> {
|
|
18
|
+
readonly binding: Binding;
|
|
19
|
+
readonly owner: Owner;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Alias folding gives up past this many hops and defers to the full resolve loop, whose
|
|
23
|
+
* Set-based traversal detects genuine cycles exactly rather than by an arbitrary cap.
|
|
24
|
+
*
|
|
25
|
+
* @since 0.5.0-canary.8
|
|
26
|
+
*/
|
|
27
|
+
export declare const ALIAS_HOP_LIMIT = 32;
|
|
28
|
+
/**
|
|
29
|
+
* @since 0.5.0-canary.9
|
|
30
|
+
*/
|
|
31
|
+
export declare class BindingLookupCache<Owner> {
|
|
32
|
+
#private;
|
|
33
|
+
constructor(registry: BindingRegistry, owner: Owner, parent: BindingLookupCache<Owner> | undefined);
|
|
34
|
+
/** Summed registry versions of this cache's whole chain — the memo stamp. */
|
|
35
|
+
chainVersion(): number;
|
|
36
|
+
/** `null` when the token's shape needs the full selection path. */
|
|
37
|
+
defaultEntry(token: Token<unknown> | Constructor): DefaultLookupEntry<Owner> | null;
|
|
38
|
+
/** `null` when the name's shape needs the full selection path. */
|
|
39
|
+
namedEntry(token: Token<unknown> | Constructor, name: string): DefaultLookupEntry<Owner> | null;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=binding-lookup-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"binding-lookup-cache.d.ts","sourceRoot":"","sources":["../../src/resolution/binding-lookup-cache.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C;;;;;;GAMG;AACH,MAAM,WAAW,kBAAkB,CAAC,KAAK;IACvC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;CACvB;AAED;;;;;GAKG;AACH,eAAO,MAAM,eAAe,KAAK,CAAC;AAOlC;;GAEG;AACH,qBAAa,kBAAkB,CAAC,KAAK;;IAenC,YAAY,QAAQ,EAAE,eAAe,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,kBAAkB,CAAC,KAAK,CAAC,GAAG,SAAS,EAIjG;IAED,6EAA6E;IAC7E,YAAY,IAAI,MAAM,CAMrB;IAED,mEAAmE;IACnE,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,WAAW,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,IAAI,CAiBlF;IAED,kEAAkE;IAClE,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,IAAI,CAe9F;CA2CF"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Alias folding gives up past this many hops and defers to the full resolve loop, whose
|
|
3
|
+
* Set-based traversal detects genuine cycles exactly rather than by an arbitrary cap.
|
|
4
|
+
*
|
|
5
|
+
* @since 0.5.0-canary.8
|
|
6
|
+
*/
|
|
7
|
+
export const ALIAS_HOP_LIMIT = 32;
|
|
8
|
+
/**
|
|
9
|
+
* @since 0.5.0-canary.8
|
|
10
|
+
*/
|
|
11
|
+
const newNameToEntryMap = () => new Map();
|
|
12
|
+
/**
|
|
13
|
+
* @since 0.5.0-canary.9
|
|
14
|
+
*/
|
|
15
|
+
export class BindingLookupCache {
|
|
16
|
+
#byToken = new Map();
|
|
17
|
+
#version = -1;
|
|
18
|
+
// One entry in front of the map: the two shapes that reach here — an alias, and a token owned by
|
|
19
|
+
// a parent — are both resolved in a loop over the same token. `null` is a real answer, so absence
|
|
20
|
+
// is tracked by the token slot rather than by the entry.
|
|
21
|
+
#lastToken;
|
|
22
|
+
#lastEntry = null;
|
|
23
|
+
#byTokenAndName = new Map();
|
|
24
|
+
#namedVersion = -1;
|
|
25
|
+
#registry;
|
|
26
|
+
#owner;
|
|
27
|
+
#parent;
|
|
28
|
+
constructor(registry, owner, parent) {
|
|
29
|
+
this.#registry = registry;
|
|
30
|
+
this.#owner = owner;
|
|
31
|
+
this.#parent = parent;
|
|
32
|
+
}
|
|
33
|
+
/** Summed registry versions of this cache's whole chain — the memo stamp. */
|
|
34
|
+
chainVersion() {
|
|
35
|
+
let version = this.#registry.version;
|
|
36
|
+
for (let cache = this.#parent; cache !== undefined; cache = cache.#parent) {
|
|
37
|
+
version += cache.#registry.version;
|
|
38
|
+
}
|
|
39
|
+
return version;
|
|
40
|
+
}
|
|
41
|
+
/** `null` when the token's shape needs the full selection path. */
|
|
42
|
+
defaultEntry(token) {
|
|
43
|
+
const version = this.chainVersion();
|
|
44
|
+
if (version !== this.#version) {
|
|
45
|
+
this.#byToken.clear();
|
|
46
|
+
this.#version = version;
|
|
47
|
+
this.#lastToken = undefined;
|
|
48
|
+
}
|
|
49
|
+
else if (token === this.#lastToken) {
|
|
50
|
+
return this.#lastEntry;
|
|
51
|
+
}
|
|
52
|
+
let entry = this.#byToken.get(token);
|
|
53
|
+
if (entry === undefined) {
|
|
54
|
+
entry = this.#foldAliases(token);
|
|
55
|
+
this.#byToken.set(token, entry);
|
|
56
|
+
}
|
|
57
|
+
this.#lastToken = token;
|
|
58
|
+
this.#lastEntry = entry;
|
|
59
|
+
return entry;
|
|
60
|
+
}
|
|
61
|
+
/** `null` when the name's shape needs the full selection path. */
|
|
62
|
+
namedEntry(token, name) {
|
|
63
|
+
const version = this.chainVersion();
|
|
64
|
+
if (version !== this.#namedVersion) {
|
|
65
|
+
this.#byTokenAndName.clear();
|
|
66
|
+
this.#namedVersion = version;
|
|
67
|
+
}
|
|
68
|
+
// Computed, not eager: this runs on every named resolve, and `getOrInsert(token, new Map())`
|
|
69
|
+
// would allocate a Map per call only to discard it on the hit that follows.
|
|
70
|
+
const byName = this.#byTokenAndName.getOrInsertComputed(token, newNameToEntryMap);
|
|
71
|
+
let entry = byName.get(name);
|
|
72
|
+
if (entry === undefined) {
|
|
73
|
+
entry = this.#findNamedInChain(token, name);
|
|
74
|
+
byName.set(name, entry);
|
|
75
|
+
}
|
|
76
|
+
return entry;
|
|
77
|
+
}
|
|
78
|
+
#foldAliases(token) {
|
|
79
|
+
let current = token;
|
|
80
|
+
for (let hop = 0; hop < ALIAS_HOP_LIMIT; hop += 1) {
|
|
81
|
+
const entry = this.#findDefaultInChain(current);
|
|
82
|
+
if (entry === null) {
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
if (entry.binding.kind !== "alias") {
|
|
86
|
+
return entry;
|
|
87
|
+
}
|
|
88
|
+
current = entry.binding.target;
|
|
89
|
+
}
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
#findDefaultInChain(token) {
|
|
93
|
+
const fast = this.#registry.getFastDefault(token);
|
|
94
|
+
if (fast !== undefined) {
|
|
95
|
+
return { binding: fast, owner: this.#owner };
|
|
96
|
+
}
|
|
97
|
+
// A level with non-fast bindings (multi-slot / predicate) needs full selection — bail.
|
|
98
|
+
if (this.#registry.has(token)) {
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
return this.#parent === undefined ? null : this.#parent.#findDefaultInChain(token);
|
|
102
|
+
}
|
|
103
|
+
#findNamedInChain(token, name) {
|
|
104
|
+
const named = this.#registry.getSimpleNamed(token, name);
|
|
105
|
+
if (named !== undefined) {
|
|
106
|
+
// Predicates need a live context; aliases carry options through the full path.
|
|
107
|
+
if (named.predicate !== undefined || named.kind === "alias") {
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
return { binding: named, owner: this.#owner };
|
|
111
|
+
}
|
|
112
|
+
if (this.#registry.has(token)) {
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
return this.#parent === undefined ? null : this.#parent.#findNamedInChain(token, name);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=binding-lookup-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"binding-lookup-cache.js","sourceRoot":"","sources":["../../src/resolution/binding-lookup-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import type { Binding } from "#/binding";
|
|
2
2
|
import type { BindingScope } from "#/types";
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* The scope a binding resolves under.
|
|
5
|
+
*
|
|
6
|
+
* @remarks Every kind declares one — an alias declares `transient`, since it defers scoping to the
|
|
7
|
+
* binding it points at — so this is a field read, kept as a named function because it is the
|
|
8
|
+
* vocabulary validation and introspection speak.
|
|
6
9
|
*
|
|
7
10
|
* @since 0.3.16-canary.0
|
|
8
11
|
*/
|
|
@@ -1 +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
|
|
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;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,YAAY,CAEpE"}
|
|
@@ -1,24 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
2
|
+
* The scope a binding resolves under.
|
|
3
|
+
*
|
|
4
|
+
* @remarks Every kind declares one — an alias declares `transient`, since it defers scoping to the
|
|
5
|
+
* binding it points at — so this is a field read, kept as a named function because it is the
|
|
6
|
+
* vocabulary validation and introspection speak.
|
|
4
7
|
*
|
|
5
8
|
* @since 0.3.16-canary.0
|
|
6
9
|
*/
|
|
7
10
|
export function effectiveBindingScope(binding) {
|
|
8
|
-
|
|
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
|
-
}
|
|
11
|
+
return binding.scope;
|
|
23
12
|
}
|
|
24
13
|
//# sourceMappingURL=binding-scope.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"binding-scope.js","sourceRoot":"","sources":["../../src/resolution/binding-scope.ts"],"names":[],"mappings":"AAGA
|
|
1
|
+
{"version":3,"file":"binding-scope.js","sourceRoot":"","sources":["../../src/resolution/binding-scope.ts"],"names":[],"mappings":"AAGA;;;;;;;;GAQG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,OAAO,OAAO,CAAC,KAAK,CAAC;AACvB,CAAC"}
|