@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
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Binding } from "#/binding";
|
|
1
|
+
import type { Binding, BindingSlot } from "#/binding";
|
|
2
2
|
import type { ConstraintContext, ResolveOptions } from "#/types";
|
|
3
3
|
/**
|
|
4
4
|
* Select a single candidate from a list of bindings using slot matching + predicates.
|
|
@@ -13,4 +13,11 @@ export declare function selectBinding(bindings: ReadonlyArray<Binding>, options:
|
|
|
13
13
|
* @since 0.3.16-canary.0
|
|
14
14
|
*/
|
|
15
15
|
export declare function selectAllBindings(bindings: ReadonlyArray<Binding>, options: ResolveOptions | undefined, ctx: ConstraintContext): Array<Binding>;
|
|
16
|
+
/**
|
|
17
|
+
* Whether a binding's slot satisfies a request: names must be equal, and every tag the slot
|
|
18
|
+
* declares must be among the tags requested (SPEC §6.9).
|
|
19
|
+
*
|
|
20
|
+
* @since 0.5.0-canary.9
|
|
21
|
+
*/
|
|
22
|
+
export declare function matchesSlot(slot: BindingSlot, options: ResolveOptions | undefined): boolean;
|
|
16
23
|
//# sourceMappingURL=binding-select.d.ts.map
|
|
@@ -1 +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;
|
|
1
|
+
{"version":3,"file":"binding-select.d.ts","sourceRoot":"","sources":["../../src/resolution/binding-select.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAEtD,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;AAwBD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,GAAG,SAAS,GAAG,OAAO,CAmC3F"}
|
|
@@ -40,46 +40,27 @@ export function selectAllBindings(bindings, options, ctx) {
|
|
|
40
40
|
return filterBindings(bindings, options, ctx, "all");
|
|
41
41
|
}
|
|
42
42
|
function filterBindings(bindings, options, ctx, selectionMode = "single") {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
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
|
-
}
|
|
43
|
+
// `resolveAll` with no slot criterion takes every binding; `resolve` always matches the slot,
|
|
44
|
+
// where an absent criterion means "the default slot".
|
|
45
|
+
const requiresSlotMatch = selectionMode === "single" || (options !== undefined && hasSlotCriterion(options));
|
|
62
46
|
const result = [];
|
|
63
47
|
for (const binding of bindings) {
|
|
64
|
-
|
|
65
|
-
if (slotMatched && matchesPredicate(binding, ctx)) {
|
|
48
|
+
if ((!requiresSlotMatch || matchesSlot(binding.slot, options)) && matchesPredicate(binding, ctx)) {
|
|
66
49
|
result.push(binding);
|
|
67
50
|
}
|
|
68
51
|
}
|
|
69
52
|
return result;
|
|
70
53
|
}
|
|
71
|
-
function
|
|
72
|
-
|
|
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);
|
|
54
|
+
function hasSlotCriterion(options) {
|
|
55
|
+
return options.name !== undefined || options.tag !== undefined || (options.tags?.length ?? 0) > 0;
|
|
80
56
|
}
|
|
81
|
-
|
|
82
|
-
|
|
57
|
+
/**
|
|
58
|
+
* Whether a binding's slot satisfies a request: names must be equal, and every tag the slot
|
|
59
|
+
* declares must be among the tags requested (SPEC §6.9).
|
|
60
|
+
*
|
|
61
|
+
* @since 0.5.0-canary.9
|
|
62
|
+
*/
|
|
63
|
+
export function matchesSlot(slot, options) {
|
|
83
64
|
const requestedName = options?.name;
|
|
84
65
|
const requestedTags = options?.tags;
|
|
85
66
|
const singleRequestedTag = options?.tag;
|
|
@@ -109,10 +90,7 @@ function matchesSlot(binding, options) {
|
|
|
109
90
|
}
|
|
110
91
|
}
|
|
111
92
|
else if (hasRequestedTags) {
|
|
112
|
-
//
|
|
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
|
|
93
|
+
// Requested tags require a tagged slot: an untagged binding never matches (SPEC §6.9).
|
|
116
94
|
return false;
|
|
117
95
|
}
|
|
118
96
|
return true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"binding-select.js","sourceRoot":"","sources":["../../src/resolution/binding-select.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAGjD;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAC3B,QAAgC,EAChC,OAAmC,EACnC,GAAsB,EACtB,gBAAwB;IAExB,MAAM,UAAU,GAAG,cAAc,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;IAC1D,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;IACD,2EAA2E;IAC3E,yEAAyE;IACzE,6DAA6D;IAC7D,IAAI,mBAAwC,CAAC;IAC7C,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,SAAS,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACtC,IAAI,mBAAmB,KAAK,SAAS,EAAE,CAAC;gBACtC,mBAAmB,GAAG,SAAS,CAAC;gBAChC,MAAM;YACR,CAAC;YACD,mBAAmB,GAAG,SAAS,CAAC;QAClC,CAAC;IACH,CAAC;IACD,IAAI,mBAAmB,KAAK,SAAS,EAAE,CAAC;QACtC,OAAO,mBAAmB,CAAC;IAC7B,CAAC;IACD,MAAM,IAAI,qBAAqB,CAC7B,gBAAgB,EAChB,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAC5B,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAC/B,QAAgC,EAChC,OAAmC,EACnC,GAAsB;IAEtB,OAAO,cAAc,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,cAAc,CACrB,QAAgC,EAChC,OAAmC,EACnC,GAAsB,EACtB,aAAa,GAAqB,QAAQ;IAE1C,
|
|
1
|
+
{"version":3,"file":"binding-select.js","sourceRoot":"","sources":["../../src/resolution/binding-select.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-class decorator metadata, cached by constructor.
|
|
3
|
+
*
|
|
4
|
+
* @remarks Metadata cannot change once a class is defined, so nothing here needs version stamping.
|
|
5
|
+
*/
|
|
6
|
+
import type { Container } from "#/container/container";
|
|
7
|
+
import type { ConstructorMetadata, MetadataReader } from "#/metadata/metadata-types";
|
|
8
|
+
import type { Constructor } from "#/types";
|
|
9
|
+
/**
|
|
10
|
+
* @since 0.5.0-canary.8
|
|
11
|
+
*/
|
|
12
|
+
export declare class ClassIntrospector {
|
|
13
|
+
#private;
|
|
14
|
+
constructor(reader: MetadataReader, container: Container);
|
|
15
|
+
constructorMetadata(target: Constructor): ConstructorMetadata | undefined;
|
|
16
|
+
/**
|
|
17
|
+
* Whether the class has a `@postConstruct` hook, or `undefined` until {@link discoverPostConstruct}.
|
|
18
|
+
*
|
|
19
|
+
* @remarks Callers treat unknown as "assume it does", so the first activation settles it.
|
|
20
|
+
*/
|
|
21
|
+
knownPostConstruct(target: Constructor): boolean | undefined;
|
|
22
|
+
discoverPostConstruct(target: Constructor): void;
|
|
23
|
+
/** True when the class has accessor injection, which reads the container during construction. */
|
|
24
|
+
needsActiveContainer(target: Constructor): boolean;
|
|
25
|
+
instantiate(target: Constructor, deps: Array<unknown>): unknown;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=class-introspector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"class-introspector.d.ts","sourceRoot":"","sources":["../../src/resolution/class-introspector.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAErF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C;;GAEG;AACH,qBAAa,iBAAiB;;IAS5B,YAAY,MAAM,EAAE,cAAc,EAAE,SAAS,EAAE,SAAS,EAGvD;IAED,mBAAmB,CAAC,MAAM,EAAE,WAAW,GAAG,mBAAmB,GAAG,SAAS,CAQxE;IAED;;;;OAIG;IACH,kBAAkB,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,GAAG,SAAS,CAE3D;IAED,qBAAqB,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAM/C;IAED,iGAAiG;IACjG,oBAAoB,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAOjD;IAED,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,OAAO,CAM9D;CACF"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-class decorator metadata, cached by constructor.
|
|
3
|
+
*
|
|
4
|
+
* @remarks Metadata cannot change once a class is defined, so nothing here needs version stamping.
|
|
5
|
+
*/
|
|
6
|
+
import { runWithContainer } from "#/resolution/environment";
|
|
7
|
+
/**
|
|
8
|
+
* @since 0.5.0-canary.8
|
|
9
|
+
*/
|
|
10
|
+
export class ClassIntrospector {
|
|
11
|
+
// Unallocated until the container resolves its first class binding — a container bound entirely
|
|
12
|
+
// to constants, factories or aliases never introspects one.
|
|
13
|
+
#constructorMetadata;
|
|
14
|
+
#hasPostConstruct;
|
|
15
|
+
#needsActiveContainer;
|
|
16
|
+
#reader;
|
|
17
|
+
#container;
|
|
18
|
+
constructor(reader, container) {
|
|
19
|
+
this.#reader = reader;
|
|
20
|
+
this.#container = container;
|
|
21
|
+
}
|
|
22
|
+
constructorMetadata(target) {
|
|
23
|
+
const cached = this.#constructorMetadata?.get(target);
|
|
24
|
+
if (cached !== undefined) {
|
|
25
|
+
return cached === null ? undefined : cached;
|
|
26
|
+
}
|
|
27
|
+
const metadata = this.#reader.getConstructorMetadata(target);
|
|
28
|
+
(this.#constructorMetadata ??= new WeakMap()).set(target, metadata ?? null);
|
|
29
|
+
return metadata;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Whether the class has a `@postConstruct` hook, or `undefined` until {@link discoverPostConstruct}.
|
|
33
|
+
*
|
|
34
|
+
* @remarks Callers treat unknown as "assume it does", so the first activation settles it.
|
|
35
|
+
*/
|
|
36
|
+
knownPostConstruct(target) {
|
|
37
|
+
return this.#hasPostConstruct?.get(target);
|
|
38
|
+
}
|
|
39
|
+
discoverPostConstruct(target) {
|
|
40
|
+
const lifecycle = this.#reader.getLifecycleMetadata(target);
|
|
41
|
+
(this.#hasPostConstruct ??= new WeakMap()).set(target, lifecycle !== undefined && lifecycle.postConstruct !== undefined && lifecycle.postConstruct.length > 0);
|
|
42
|
+
}
|
|
43
|
+
/** True when the class has accessor injection, which reads the container during construction. */
|
|
44
|
+
needsActiveContainer(target) {
|
|
45
|
+
let needsActiveContainer = this.#needsActiveContainer?.get(target);
|
|
46
|
+
if (needsActiveContainer === undefined) {
|
|
47
|
+
needsActiveContainer = (this.#reader.getAccessorMetadata?.(target)?.length ?? 0) > 0;
|
|
48
|
+
(this.#needsActiveContainer ??= new WeakMap()).set(target, needsActiveContainer);
|
|
49
|
+
}
|
|
50
|
+
return needsActiveContainer;
|
|
51
|
+
}
|
|
52
|
+
instantiate(target, deps) {
|
|
53
|
+
const invokable = target;
|
|
54
|
+
if (!this.needsActiveContainer(target)) {
|
|
55
|
+
return new invokable(...deps);
|
|
56
|
+
}
|
|
57
|
+
return runWithContainer(this.#container, () => new invokable(...deps));
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=class-introspector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"class-introspector.js","sourceRoot":"","sources":["../../src/resolution/class-introspector.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAG5D;;GAEG;AACH,MAAM,OAAO,iBAAiB;IAC5B,gGAAgG;IAChG,4DAA4D;IAC5D,oBAAoB,CAA+D;IACnF,iBAAiB,CAA4C;IAC7D,qBAAqB,CAA4C;IACxD,OAAO,CAAiB;IACxB,UAAU,CAAY;IAE/B,YAAY,MAAsB,EAAE,SAAoB;QACtD,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;IAC9B,CAAC;IAED,mBAAmB,CAAC,MAAmB;QACrC,MAAM,MAAM,GAAG,IAAI,CAAC,oBAAoB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QACtD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,OAAO,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;QAC9C,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC;QAC7D,CAAC,IAAI,CAAC,oBAAoB,KAAK,IAAI,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,IAAI,IAAI,CAAC,CAAC;QAC5E,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;;;OAIG;IACH,kBAAkB,CAAC,MAAmB;QACpC,OAAO,IAAI,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7C,CAAC;IAED,qBAAqB,CAAC,MAAmB;QACvC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;QAC5D,CAAC,IAAI,CAAC,iBAAiB,KAAK,IAAI,OAAO,EAAE,CAAC,CAAC,GAAG,CAC5C,MAAM,EACN,SAAS,KAAK,SAAS,IAAI,SAAS,CAAC,aAAa,KAAK,SAAS,IAAI,SAAS,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CACvG,CAAC;IACJ,CAAC;IAED,iGAAiG;IACjG,oBAAoB,CAAC,MAAmB;QACtC,IAAI,oBAAoB,GAAG,IAAI,CAAC,qBAAqB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QACnE,IAAI,oBAAoB,KAAK,SAAS,EAAE,CAAC;YACvC,oBAAoB,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YACrF,CAAC,IAAI,CAAC,qBAAqB,KAAK,IAAI,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;QACnF,CAAC;QACD,OAAO,oBAAoB,CAAC;IAC9B,CAAC;IAED,WAAW,CAAC,MAAmB,EAAE,IAAoB;QACnD,MAAM,SAAS,GAAG,MAA+B,CAAC;QAClD,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,EAAE,CAAC;YACvC,OAAO,IAAI,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC;QAChC,CAAC;QACD,OAAO,gBAAgB,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IACzE,CAAC;CACF"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal seam letting tests assert that an optimization is *active*, not merely that the result
|
|
3
|
+
* is correct.
|
|
4
|
+
*
|
|
5
|
+
* @remarks Timing belongs in the benchmark, which needs a quiet machine and twenty minutes; these
|
|
6
|
+
* are structural counts, so CI can hold the invariants that make the benchmark fast. Reached
|
|
7
|
+
* through a symbol from a module the package does not publish, so it is not public API.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Key for the diagnostics accessor on a container.
|
|
11
|
+
*
|
|
12
|
+
* @remarks A symbol rather than a method name, so it cannot collide with the public surface or be
|
|
13
|
+
* reached by anyone who has not imported this module.
|
|
14
|
+
*
|
|
15
|
+
* @since 0.5.0-canary.8
|
|
16
|
+
*/
|
|
17
|
+
export declare const RESOLUTION_DIAGNOSTICS: unique symbol;
|
|
18
|
+
/**
|
|
19
|
+
* Structural facts about a container's resolution caches.
|
|
20
|
+
*
|
|
21
|
+
* @since 0.5.0-canary.8
|
|
22
|
+
*/
|
|
23
|
+
export interface ResolutionDiagnostics {
|
|
24
|
+
/** Bindings with a compiled instantiation plan. */
|
|
25
|
+
readonly compiledPlanCount: number;
|
|
26
|
+
/** Contexts held by the depth-indexed sync pool. */
|
|
27
|
+
readonly syncContextPoolSize: number;
|
|
28
|
+
/** Scoped instances currently cached by this container's scope manager. */
|
|
29
|
+
readonly scopedInstanceCount: number;
|
|
30
|
+
/** Deferred collaborators this container has had to build. */
|
|
31
|
+
readonly builtSubsystems: ReadonlyArray<string>;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* A container that can report on its resolution caches.
|
|
35
|
+
*
|
|
36
|
+
* @since 0.5.0-canary.8
|
|
37
|
+
*/
|
|
38
|
+
export interface DiagnosableContainer {
|
|
39
|
+
[RESOLUTION_DIAGNOSTICS](): ResolutionDiagnostics;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=diagnostics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../src/resolution/diagnostics.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;;;GAOG;AACH,eAAO,MAAM,sBAAsB,EAAE,OAAO,MAA4C,CAAC;AAEzF;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC,mDAAmD;IACnD,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,oDAAoD;IACpD,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,2EAA2E;IAC3E,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,8DAA8D;IAC9D,QAAQ,CAAC,eAAe,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CACjD;AAED;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACnC,CAAC,sBAAsB,CAAC,IAAI,qBAAqB,CAAC;CACnD"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal seam letting tests assert that an optimization is *active*, not merely that the result
|
|
3
|
+
* is correct.
|
|
4
|
+
*
|
|
5
|
+
* @remarks Timing belongs in the benchmark, which needs a quiet machine and twenty minutes; these
|
|
6
|
+
* are structural counts, so CI can hold the invariants that make the benchmark fast. Reached
|
|
7
|
+
* through a symbol from a module the package does not publish, so it is not public API.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Key for the diagnostics accessor on a container.
|
|
11
|
+
*
|
|
12
|
+
* @remarks A symbol rather than a method name, so it cannot collide with the public surface or be
|
|
13
|
+
* reached by anyone who has not imported this module.
|
|
14
|
+
*
|
|
15
|
+
* @since 0.5.0-canary.8
|
|
16
|
+
*/
|
|
17
|
+
export const RESOLUTION_DIAGNOSTICS = Symbol("di:resolution-diagnostics");
|
|
18
|
+
//# sourceMappingURL=diagnostics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../src/resolution/diagnostics.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAkB,MAAM,CAAC,2BAA2B,CAAC,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Container } from "#/container/container";
|
|
2
|
+
import type { BranchDepth, OwnedBranchPath, OwnedBranchStack } from "#/resolution/resolution-path";
|
|
2
3
|
import type { Token } from "#/token";
|
|
3
4
|
import type { BindingIdentifier, BindingKind, BindingScope, ConstraintContext, Constructor, ResolutionFrame, ResolutionContext, ResolveOptions } from "#/types";
|
|
4
5
|
/**
|
|
@@ -15,7 +16,9 @@ export declare function getActiveContainer(): Container | undefined;
|
|
|
15
16
|
export interface ResolverCallbacks {
|
|
16
17
|
resolveFromContext<const Value>(token: Token<Value> | Constructor<Value>, resolutionPath: Array<string>, resolutionStack: Array<ResolutionFrame>): Value;
|
|
17
18
|
resolve<const Value>(token: Token<Value> | Constructor<Value>, options: ResolveOptions | undefined, resolutionPath: Array<string>, resolutionStack: Array<ResolutionFrame>): Value;
|
|
18
|
-
resolveAsyncFromContext<const Value>(token: Token<Value> | Constructor<Value>, resolutionPath: Array<string>, resolutionStack: Array<ResolutionFrame
|
|
19
|
+
resolveAsyncFromContext<const Value>(token: Token<Value> | Constructor<Value>, resolutionPath: Array<string>, resolutionStack: Array<ResolutionFrame>, branchDepth: BranchDepth): Promise<Value>;
|
|
20
|
+
/** Not one of the eight `Value`-naming entry points: its caller is, and casts once. */
|
|
21
|
+
resolveAsyncFromCascade(token: Token<unknown> | Constructor): Promise<unknown>;
|
|
19
22
|
resolveAsync<const Value>(token: Token<Value> | Constructor<Value>, options: ResolveOptions | undefined, resolutionPath: Array<string>, resolutionStack: Array<ResolutionFrame>): Promise<Value>;
|
|
20
23
|
resolveOptional<const Value>(token: Token<Value> | Constructor<Value>, options: ResolveOptions | undefined, resolutionPath: Array<string>, resolutionStack: Array<ResolutionFrame>): Value | undefined;
|
|
21
24
|
resolveOptionalAsync<const Value>(token: Token<Value> | Constructor<Value>, options: ResolveOptions | undefined, resolutionPath: Array<string>, resolutionStack: Array<ResolutionFrame>): Promise<Value | undefined>;
|
|
@@ -37,6 +40,50 @@ export declare class DefaultResolutionContext implements ResolutionContext {
|
|
|
37
40
|
resolveAll<const Value>(token: Token<Value> | Constructor<Value>, options?: ResolveOptions): Array<Value>;
|
|
38
41
|
resolveAllAsync<const Value>(token: Token<Value> | Constructor<Value>, options?: ResolveOptions): Promise<Array<Value>>;
|
|
39
42
|
}
|
|
43
|
+
/**
|
|
44
|
+
* One async level's resolution context, which is also its branch of the resolution path.
|
|
45
|
+
*
|
|
46
|
+
* @remarks Separate from {@link DefaultResolutionContext} so the sync lane's pooled context keeps
|
|
47
|
+
* reading its arrays as plain fields: only an async branch has a prefix to take. See
|
|
48
|
+
* `ARCHITECTURE.md` — an async level owns its branch of the path.
|
|
49
|
+
*
|
|
50
|
+
* @since 0.5.0-canary.9
|
|
51
|
+
*/
|
|
52
|
+
export declare class AsyncLevelContext implements ResolutionContext {
|
|
53
|
+
#private;
|
|
54
|
+
/**
|
|
55
|
+
* @param resolutionPath - this level's own branch; the depth is read off it rather than passed,
|
|
56
|
+
* so the two cannot disagree about where this level sits
|
|
57
|
+
*/
|
|
58
|
+
constructor(resolver: ResolverCallbacks, resolutionPath: OwnedBranchPath, resolutionStack: OwnedBranchStack, currentOptions: ResolveOptions | undefined);
|
|
59
|
+
get graph(): ConstraintContext;
|
|
60
|
+
resolve<const Value>(token: Token<Value> | Constructor<Value>, options?: ResolveOptions): Value;
|
|
61
|
+
resolveAsync<const Value>(token: Token<Value> | Constructor<Value>, options?: ResolveOptions): Promise<Value>;
|
|
62
|
+
resolveOptional<const Value>(token: Token<Value> | Constructor<Value>, options?: ResolveOptions): Value | undefined;
|
|
63
|
+
resolveOptionalAsync<const Value>(token: Token<Value> | Constructor<Value>, options?: ResolveOptions): Promise<Value | undefined>;
|
|
64
|
+
resolveAll<const Value>(token: Token<Value> | Constructor<Value>, options?: ResolveOptions): Array<Value>;
|
|
65
|
+
resolveAllAsync<const Value>(token: Token<Value> | Constructor<Value>, options?: ResolveOptions): Promise<Array<Value>>;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* The one context every level of an open synchronous factory cascade shares.
|
|
69
|
+
*
|
|
70
|
+
* @remarks It carries no per-level state at all: while the cascade is open, the resolver's arrays
|
|
71
|
+
* *are* this level's ancestor chain, so nothing has to be allocated per level. See
|
|
72
|
+
* `ARCHITECTURE.md` — the cascade lane.
|
|
73
|
+
*
|
|
74
|
+
* @since 0.5.0-canary.9
|
|
75
|
+
*/
|
|
76
|
+
export declare class AsyncCascadeContext implements ResolutionContext {
|
|
77
|
+
#private;
|
|
78
|
+
constructor(resolver: ResolverCallbacks, cascadePath: Array<string>, cascadeStack: Array<ResolutionFrame>);
|
|
79
|
+
get graph(): ConstraintContext;
|
|
80
|
+
resolve<const Value>(token: Token<Value> | Constructor<Value>, options?: ResolveOptions): Value;
|
|
81
|
+
resolveAsync<const Value>(token: Token<Value> | Constructor<Value>, options?: ResolveOptions): Promise<Value>;
|
|
82
|
+
resolveOptional<const Value>(token: Token<Value> | Constructor<Value>, options?: ResolveOptions): Value | undefined;
|
|
83
|
+
resolveOptionalAsync<const Value>(token: Token<Value> | Constructor<Value>, options?: ResolveOptions): Promise<Value | undefined>;
|
|
84
|
+
resolveAll<const Value>(token: Token<Value> | Constructor<Value>, options?: ResolveOptions): Array<Value>;
|
|
85
|
+
resolveAllAsync<const Value>(token: Token<Value> | Constructor<Value>, options?: ResolveOptions): Promise<Array<Value>>;
|
|
86
|
+
}
|
|
40
87
|
/**
|
|
41
88
|
* @since 0.3.16-canary.0
|
|
42
89
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../../src/resolution/environment.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,KAAK,EACV,iBAAiB,EACjB,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,cAAc,EACf,MAAM,SAAS,CAAC;AAMjB;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,MAAM,GAAG,MAAM,CAQvF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,SAAS,GAAG,SAAS,CAE1D;AAID;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,kBAAkB,CAAC,KAAK,CAAC,KAAK,EAC5B,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,EACxC,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC,EAC7B,eAAe,EAAE,KAAK,CAAC,eAAe,CAAC,GACtC,KAAK,CAAC;IACT,OAAO,CAAC,KAAK,CAAC,KAAK,EACjB,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,EACxC,OAAO,EAAE,cAAc,GAAG,SAAS,EACnC,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC,EAC7B,eAAe,EAAE,KAAK,CAAC,eAAe,CAAC,GACtC,KAAK,CAAC;IACT,uBAAuB,CAAC,KAAK,CAAC,KAAK,EACjC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,EACxC,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC,EAC7B,eAAe,EAAE,KAAK,CAAC,eAAe,CAAC,
|
|
1
|
+
{"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../../src/resolution/environment.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { UNOWNED_BRANCH } from "#/resolution/resolution-path";
|
|
1
2
|
// ── Active container ──────────────────────────────────────────────────────────
|
|
2
3
|
let activeContainer;
|
|
3
4
|
/**
|
|
@@ -41,11 +42,21 @@ export class DefaultResolutionContext {
|
|
|
41
42
|
return this.#graph;
|
|
42
43
|
}
|
|
43
44
|
reset(resolver, resolutionPath, resolutionStack, currentOptions) {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
this.#
|
|
45
|
+
// Compared before storing: a pooled context lives long enough to be in old space, so storing a
|
|
46
|
+
// pointer costs a write barrier, and a sync resolve hands every depth the same two arrays.
|
|
47
|
+
if (this.#resolver !== resolver) {
|
|
48
|
+
this.#resolver = resolver;
|
|
49
|
+
}
|
|
50
|
+
if (this.#resolutionPath !== resolutionPath) {
|
|
51
|
+
this.#resolutionPath = resolutionPath;
|
|
52
|
+
}
|
|
53
|
+
if (this.#resolutionStack !== resolutionStack) {
|
|
54
|
+
this.#resolutionStack = resolutionStack;
|
|
55
|
+
}
|
|
47
56
|
this.#currentOptions = currentOptions;
|
|
48
|
-
this.#graph
|
|
57
|
+
if (this.#graph !== undefined) {
|
|
58
|
+
this.#graph = undefined;
|
|
59
|
+
}
|
|
49
60
|
}
|
|
50
61
|
resolve(token, options) {
|
|
51
62
|
if (options === undefined) {
|
|
@@ -55,7 +66,8 @@ export class DefaultResolutionContext {
|
|
|
55
66
|
}
|
|
56
67
|
resolveAsync(token, options) {
|
|
57
68
|
if (options === undefined) {
|
|
58
|
-
|
|
69
|
+
// UNOWNED_BRANCH: this frame's array is a sync stack it will pop, so the lane must copy it.
|
|
70
|
+
return this.#resolver.resolveAsyncFromContext(token, this.#resolutionPath, this.#resolutionStack, UNOWNED_BRANCH);
|
|
59
71
|
}
|
|
60
72
|
return this.#resolver.resolveAsync(token, options, this.#resolutionPath, this.#resolutionStack);
|
|
61
73
|
}
|
|
@@ -72,6 +84,123 @@ export class DefaultResolutionContext {
|
|
|
72
84
|
return this.#resolver.resolveAllAsync(token, options, this.#resolutionPath, this.#resolutionStack);
|
|
73
85
|
}
|
|
74
86
|
}
|
|
87
|
+
/**
|
|
88
|
+
* One async level's resolution context, which is also its branch of the resolution path.
|
|
89
|
+
*
|
|
90
|
+
* @remarks Separate from {@link DefaultResolutionContext} so the sync lane's pooled context keeps
|
|
91
|
+
* reading its arrays as plain fields: only an async branch has a prefix to take. See
|
|
92
|
+
* `ARCHITECTURE.md` — an async level owns its branch of the path.
|
|
93
|
+
*
|
|
94
|
+
* @since 0.5.0-canary.9
|
|
95
|
+
*/
|
|
96
|
+
export class AsyncLevelContext {
|
|
97
|
+
#resolver;
|
|
98
|
+
#resolutionPath;
|
|
99
|
+
#resolutionStack;
|
|
100
|
+
#currentOptions;
|
|
101
|
+
#branchDepth;
|
|
102
|
+
/**
|
|
103
|
+
* @param resolutionPath - this level's own branch; the depth is read off it rather than passed,
|
|
104
|
+
* so the two cannot disagree about where this level sits
|
|
105
|
+
*/
|
|
106
|
+
constructor(resolver, resolutionPath, resolutionStack, currentOptions) {
|
|
107
|
+
this.#resolver = resolver;
|
|
108
|
+
this.#resolutionPath = resolutionPath;
|
|
109
|
+
this.#resolutionStack = resolutionStack;
|
|
110
|
+
this.#currentOptions = currentOptions;
|
|
111
|
+
this.#branchDepth = resolutionPath.length;
|
|
112
|
+
}
|
|
113
|
+
#graph;
|
|
114
|
+
#exactPathCache;
|
|
115
|
+
#exactStackCache;
|
|
116
|
+
get graph() {
|
|
117
|
+
if (this.#graph === undefined) {
|
|
118
|
+
this.#graph = new DefaultConstraintContext(this.#exactPath(), this.#exactStack(), this.#currentOptions);
|
|
119
|
+
}
|
|
120
|
+
return this.#graph;
|
|
121
|
+
}
|
|
122
|
+
// The path is append-only and a descendant may already have grown it past this level, so every
|
|
123
|
+
// caller but the async lane is handed this branch's prefix. It is fixed for the level's lifetime.
|
|
124
|
+
#exactPath() {
|
|
125
|
+
return (this.#exactPathCache ??= this.#resolutionPath.slice(0, this.#branchDepth));
|
|
126
|
+
}
|
|
127
|
+
#exactStack() {
|
|
128
|
+
return (this.#exactStackCache ??= this.#resolutionStack.slice(0, this.#branchDepth));
|
|
129
|
+
}
|
|
130
|
+
resolve(token, options) {
|
|
131
|
+
if (options === undefined) {
|
|
132
|
+
return this.#resolver.resolveFromContext(token, this.#exactPath(), this.#exactStack());
|
|
133
|
+
}
|
|
134
|
+
return this.#resolver.resolve(token, options, this.#exactPath(), this.#exactStack());
|
|
135
|
+
}
|
|
136
|
+
resolveAsync(token, options) {
|
|
137
|
+
if (options === undefined) {
|
|
138
|
+
// The hot lane: the resolver reads this branch by depth, so nothing is materialized.
|
|
139
|
+
return this.#resolver.resolveAsyncFromContext(token, this.#resolutionPath, this.#resolutionStack, this.#branchDepth);
|
|
140
|
+
}
|
|
141
|
+
return this.#resolver.resolveAsync(token, options, this.#exactPath(), this.#exactStack());
|
|
142
|
+
}
|
|
143
|
+
resolveOptional(token, options) {
|
|
144
|
+
return this.#resolver.resolveOptional(token, options, this.#exactPath(), this.#exactStack());
|
|
145
|
+
}
|
|
146
|
+
resolveOptionalAsync(token, options) {
|
|
147
|
+
return this.#resolver.resolveOptionalAsync(token, options, this.#exactPath(), this.#exactStack());
|
|
148
|
+
}
|
|
149
|
+
resolveAll(token, options) {
|
|
150
|
+
return this.#resolver.resolveAll(token, options, this.#exactPath(), this.#exactStack());
|
|
151
|
+
}
|
|
152
|
+
resolveAllAsync(token, options) {
|
|
153
|
+
return this.#resolver.resolveAllAsync(token, options, this.#exactPath(), this.#exactStack());
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* The one context every level of an open synchronous factory cascade shares.
|
|
158
|
+
*
|
|
159
|
+
* @remarks It carries no per-level state at all: while the cascade is open, the resolver's arrays
|
|
160
|
+
* *are* this level's ancestor chain, so nothing has to be allocated per level. See
|
|
161
|
+
* `ARCHITECTURE.md` — the cascade lane.
|
|
162
|
+
*
|
|
163
|
+
* @since 0.5.0-canary.9
|
|
164
|
+
*/
|
|
165
|
+
export class AsyncCascadeContext {
|
|
166
|
+
#resolver;
|
|
167
|
+
#cascadePath;
|
|
168
|
+
#cascadeStack;
|
|
169
|
+
constructor(resolver, cascadePath, cascadeStack) {
|
|
170
|
+
this.#resolver = resolver;
|
|
171
|
+
this.#cascadePath = cascadePath;
|
|
172
|
+
this.#cascadeStack = cascadeStack;
|
|
173
|
+
}
|
|
174
|
+
get graph() {
|
|
175
|
+
// Not memoized: this context outlives every level, so a cached graph would describe whichever
|
|
176
|
+
// level asked first. The cascade arrays are only this level's ancestors while it is open.
|
|
177
|
+
return new DefaultConstraintContext(this.#cascadePath, this.#cascadeStack, undefined);
|
|
178
|
+
}
|
|
179
|
+
resolve(token, options) {
|
|
180
|
+
if (options === undefined) {
|
|
181
|
+
return this.#resolver.resolveFromContext(token, this.#cascadePath, this.#cascadeStack);
|
|
182
|
+
}
|
|
183
|
+
return this.#resolver.resolve(token, options, this.#cascadePath, this.#cascadeStack);
|
|
184
|
+
}
|
|
185
|
+
resolveAsync(token, options) {
|
|
186
|
+
if (options === undefined) {
|
|
187
|
+
return this.#resolver.resolveAsyncFromCascade(token);
|
|
188
|
+
}
|
|
189
|
+
return this.#resolver.resolveAsync(token, options, [...this.#cascadePath], [...this.#cascadeStack]);
|
|
190
|
+
}
|
|
191
|
+
resolveOptional(token, options) {
|
|
192
|
+
return this.#resolver.resolveOptional(token, options, this.#cascadePath, this.#cascadeStack);
|
|
193
|
+
}
|
|
194
|
+
resolveOptionalAsync(token, options) {
|
|
195
|
+
return this.#resolver.resolveOptionalAsync(token, options, [...this.#cascadePath], [...this.#cascadeStack]);
|
|
196
|
+
}
|
|
197
|
+
resolveAll(token, options) {
|
|
198
|
+
return this.#resolver.resolveAll(token, options, this.#cascadePath, this.#cascadeStack);
|
|
199
|
+
}
|
|
200
|
+
resolveAllAsync(token, options) {
|
|
201
|
+
return this.#resolver.resolveAllAsync(token, options, [...this.#cascadePath], [...this.#cascadeStack]);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
75
204
|
class DefaultConstraintContext {
|
|
76
205
|
resolutionPath;
|
|
77
206
|
resolutionStack;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"environment.js","sourceRoot":"","sources":["../../src/resolution/environment.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"environment.js","sourceRoot":"","sources":["../../src/resolution/environment.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAa9D,iFAAiF;AAEjF,IAAI,eAAsC,CAAC;AAE3C;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAS,SAAoB,EAAE,EAAgB;IAC7E,MAAM,IAAI,GAAG,eAAe,CAAC;IAC7B,eAAe,GAAG,SAAS,CAAC;IAC5B,IAAI,CAAC;QACH,OAAO,EAAE,EAAE,CAAC;IACd,CAAC;YAAS,CAAC;QACT,eAAe,GAAG,IAAI,CAAC;IACzB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO,eAAe,CAAC;AACzB,CAAC;AA2DD;;GAEG;AACH,MAAM,OAAO,wBAAwB;IACnC,SAAS,CAAoB;IAC7B,eAAe,CAAgB;IAC/B,gBAAgB,CAAyB;IACzC,eAAe,CAA6B;IAE5C,YACE,QAA2B,EAC3B,cAA6B,EAC7B,eAAuC,EACvC,cAA0C;QAE1C,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC1B,IAAI,CAAC,eAAe,GAAG,cAAc,CAAC;QACtC,IAAI,CAAC,gBAAgB,GAAG,eAAe,CAAC;QACxC,IAAI,CAAC,eAAe,GAAG,cAAc,CAAC;IACxC,CAAC;IAED,MAAM,CAAgC;IAEtC,IAAI,KAAK;QACP,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC9B,IAAI,CAAC,MAAM,GAAG,IAAI,wBAAwB,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QAChH,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,KAAK,CACH,QAA2B,EAC3B,cAA6B,EAC7B,eAAuC,EACvC,cAA0C;QAE1C,+FAA+F;QAC/F,2FAA2F;QAC3F,IAAI,IAAI,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;YAChC,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC5B,CAAC;QACD,IAAI,IAAI,CAAC,eAAe,KAAK,cAAc,EAAE,CAAC;YAC5C,IAAI,CAAC,eAAe,GAAG,cAAc,CAAC;QACxC,CAAC;QACD,IAAI,IAAI,CAAC,gBAAgB,KAAK,eAAe,EAAE,CAAC;YAC9C,IAAI,CAAC,gBAAgB,GAAG,eAAe,CAAC;QAC1C,CAAC;QACD,IAAI,CAAC,eAAe,GAAG,cAAc,CAAC;QACtC,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC9B,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,OAAO,CAAc,KAAwC,EAAE,OAAwB;QACrF,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC/F,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC7F,CAAC;IAED,YAAY,CAAc,KAAwC,EAAE,OAAwB;QAC1F,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,4FAA4F;YAC5F,OAAO,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAC;QACpH,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAClG,CAAC;IAED,eAAe,CAAc,KAAwC,EAAE,OAAwB;QAC7F,OAAO,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACrG,CAAC;IAED,oBAAoB,CAClB,KAAwC,EACxC,OAAwB;QAExB,OAAO,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC1G,CAAC;IAED,UAAU,CAAc,KAAwC,EAAE,OAAwB;QACxF,OAAO,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAChG,CAAC;IAED,eAAe,CACb,KAAwC,EACxC,OAAwB;QAExB,OAAO,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACrG,CAAC;CACF;AAED;;;;;;;;GAQG;AACH,MAAM,OAAO,iBAAiB;IACnB,SAAS,CAAoB;IAC7B,eAAe,CAAkB;IACjC,gBAAgB,CAAmB;IACnC,eAAe,CAA6B;IAC5C,YAAY,CAAc;IAEnC;;;OAGG;IACH,YACE,QAA2B,EAC3B,cAA+B,EAC/B,eAAiC,EACjC,cAA0C;QAE1C,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC1B,IAAI,CAAC,eAAe,GAAG,cAAc,CAAC;QACtC,IAAI,CAAC,gBAAgB,GAAG,eAAe,CAAC;QACxC,IAAI,CAAC,eAAe,GAAG,cAAc,CAAC;QACtC,IAAI,CAAC,YAAY,GAAG,cAAc,CAAC,MAAqB,CAAC;IAC3D,CAAC;IAED,MAAM,CAAgC;IACtC,eAAe,CAA4B;IAC3C,gBAAgB,CAAqC;IAErD,IAAI,KAAK;QACP,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC9B,IAAI,CAAC,MAAM,GAAG,IAAI,wBAAwB,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QAC1G,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,+FAA+F;IAC/F,kGAAkG;IAClG,UAAU;QACR,OAAO,CAAC,IAAI,CAAC,eAAe,KAAK,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;IACrF,CAAC;IAED,WAAW;QACT,OAAO,CAAC,IAAI,CAAC,gBAAgB,KAAK,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;IACvF,CAAC;IAED,OAAO,CAAc,KAAwC,EAAE,OAAwB;QACrF,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QACzF,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IACvF,CAAC;IAED,YAAY,CAAc,KAAwC,EAAE,OAAwB;QAC1F,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,qFAAqF;YACrF,OAAO,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAC3C,KAAK,EACL,IAAI,CAAC,eAAe,EACpB,IAAI,CAAC,gBAAgB,EACrB,IAAI,CAAC,YAAY,CAClB,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED,eAAe,CAAc,KAAwC,EAAE,OAAwB;QAC7F,OAAO,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IAC/F,CAAC;IAED,oBAAoB,CAClB,KAAwC,EACxC,OAAwB;QAExB,OAAO,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IACpG,CAAC;IAED,UAAU,CAAc,KAAwC,EAAE,OAAwB;QACxF,OAAO,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IAC1F,CAAC;IAED,eAAe,CACb,KAAwC,EACxC,OAAwB;QAExB,OAAO,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IAC/F,CAAC;CACF;AAED;;;;;;;;GAQG;AACH,MAAM,OAAO,mBAAmB;IACrB,SAAS,CAAoB;IAC7B,YAAY,CAAgB;IAC5B,aAAa,CAAyB;IAE/C,YAAY,QAA2B,EAAE,WAA0B,EAAE,YAAoC;QACvG,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC1B,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC;QAChC,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC;IACpC,CAAC;IAED,IAAI,KAAK;QACP,8FAA8F;QAC9F,0FAA0F;QAC1F,OAAO,IAAI,wBAAwB,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IACxF,CAAC;IAED,OAAO,CAAc,KAAwC,EAAE,OAAwB;QACrF,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QACzF,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;IACvF,CAAC;IAED,YAAY,CAAc,KAAwC,EAAE,OAAwB;QAC1F,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC,KAAK,CAAmB,CAAC;QACzE,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;IACtG,CAAC;IAED,eAAe,CAAc,KAAwC,EAAE,OAAwB;QAC7F,OAAO,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;IAC/F,CAAC;IAED,oBAAoB,CAClB,KAAwC,EACxC,OAAwB;QAExB,OAAO,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;IAC9G,CAAC;IAED,UAAU,CAAc,KAAwC,EAAE,OAAwB;QACxF,OAAO,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;IAC1F,CAAC;IAED,eAAe,CACb,KAAwC,EACxC,OAAwB;QAExB,OAAO,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;IACzG,CAAC;CACF;AAED,MAAM,wBAAwB;IACnB,cAAc,CAAwB;IACtC,eAAe,CAAiC;IAChD,MAAM,CAA8B;IACpC,qBAAqB,CAA6B;IAE3D,YACE,cAAqC,EACrC,eAA+C,EAC/C,qBAAiD;QAEjD,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;QACvC,IAAI,CAAC,MAAM,GAAG,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACrC,IAAI,CAAC,qBAAqB,GAAG,qBAAqB,CAAC;IACrD,CAAC;IAED,UAAU,CAA6C;IAEvD,IAAI,SAAS;QACX,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YAClC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7F,CAAC;QACD,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAClC,SAAiB,EACjB,KAAmB,EACnB,SAA4B,EAC5B,IAAiB,EACjB,IAAmF;IAEnF,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACrD,CAAC"}
|
|
@@ -1,20 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
* class or resolved-factory binding whose dependency subgraph is pure static
|
|
4
|
-
* (class/constant/cached-singleton deps, no activation hooks or postConstruct)
|
|
5
|
-
* compiles once into a nested-constructor/factory closure, cycle-checked at
|
|
6
|
-
* compile time.
|
|
2
|
+
* Compiles a transient class or resolved-factory binding into a nested-constructor closure.
|
|
7
3
|
*
|
|
8
|
-
*
|
|
9
|
-
* closures it returns ARE the hot path and touch nothing but their captures.
|
|
10
|
-
* Anything dynamic refuses to compile so the runtime cycle guard stays in
|
|
11
|
-
* charge and error semantics never change.
|
|
4
|
+
* @see `ARCHITECTURE.md` — the escape contract every dependency the compiler cannot inline must honour.
|
|
12
5
|
*/
|
|
13
6
|
import type { Binding } from "#/binding";
|
|
14
7
|
import type { ConstructorMetadata } from "#/metadata/metadata-types";
|
|
15
|
-
import type { ScopeManager } from "#/resolution/scope";
|
|
16
8
|
import type { Token } from "#/token";
|
|
17
|
-
import type { Constructor } from "#/types";
|
|
9
|
+
import type { Constructor, ResolutionFrame, ResolveOptions } from "#/types";
|
|
18
10
|
/**
|
|
19
11
|
* Compilation asked to retry later (class lifecycle metadata not discovered yet).
|
|
20
12
|
*
|
|
@@ -29,13 +21,12 @@ export declare const PLAN_RETRY: unique symbol;
|
|
|
29
21
|
*/
|
|
30
22
|
export type InstantiationPlanCompileResult = (() => unknown) | null | typeof PLAN_RETRY;
|
|
31
23
|
/**
|
|
32
|
-
* A dependency's terminal binding
|
|
24
|
+
* A dependency's terminal binding — all a compiled thunk needs.
|
|
33
25
|
*
|
|
34
26
|
* @since 0.5.0-canary.7
|
|
35
27
|
*/
|
|
36
28
|
export interface InstantiationPlanDependencyEntry {
|
|
37
29
|
readonly binding: Binding;
|
|
38
|
-
readonly ownerScope: ScopeManager;
|
|
39
30
|
}
|
|
40
31
|
/**
|
|
41
32
|
* Everything the compiler needs from its resolver, expressed as behavior so the
|
|
@@ -51,9 +42,18 @@ export interface InstantiationPlanHost {
|
|
|
51
42
|
getConstructorMetadata(target: Constructor): ConstructorMetadata | undefined;
|
|
52
43
|
/** Options-less lookup with alias hops folded; `null` when the fast lane can't answer. */
|
|
53
44
|
lookupDependencyEntry(token: Token<unknown> | Constructor): InstantiationPlanDependencyEntry | null;
|
|
54
|
-
/**
|
|
55
|
-
|
|
45
|
+
/** The frame the interpreted path pushes for this binding, so escapes can replay it. */
|
|
46
|
+
getResolutionFrame(binding: Binding): ResolutionFrame;
|
|
47
|
+
/** Runtime resolve for an escaped dependency, seeded with the ancestors above it. */
|
|
48
|
+
resolveEscaped(token: Token<unknown> | Constructor, options: ResolveOptions | undefined, arity: EscapeArity, resolutionPath: Array<string>, resolutionStack: Array<ResolutionFrame>): unknown;
|
|
56
49
|
}
|
|
50
|
+
/**
|
|
51
|
+
* Which resolve an escaped dependency replays — mirrors how the interpreted path dispatches
|
|
52
|
+
* a constructor param.
|
|
53
|
+
*
|
|
54
|
+
* @since 0.5.0-canary.8
|
|
55
|
+
*/
|
|
56
|
+
export type EscapeArity = "all" | "optional" | "single";
|
|
57
57
|
/**
|
|
58
58
|
* @since 0.3.16-canary.1
|
|
59
59
|
*/
|