@codefast/di 0.5.0 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +712 -0
- package/README.md +119 -30
- package/dist/ambient/active-container.d.ts +37 -0
- package/dist/ambient/active-container.d.ts.map +1 -0
- package/dist/ambient/active-container.js +41 -0
- package/dist/ambient/active-container.js.map +1 -0
- package/dist/container/binding-builders.d.ts +12 -8
- package/dist/container/binding-builders.d.ts.map +1 -1
- package/dist/container/binding-builders.js +62 -31
- package/dist/container/binding-builders.js.map +1 -1
- package/dist/container/container.d.ts +33 -19
- package/dist/container/container.d.ts.map +1 -1
- package/dist/container/container.js +281 -118
- package/dist/container/container.js.map +1 -1
- package/dist/{resolution → core}/binding-scope.d.ts +2 -2
- package/dist/core/binding-scope.d.ts.map +1 -0
- package/dist/core/binding-scope.js.map +1 -0
- package/dist/{binding.d.ts → core/binding.d.ts} +70 -15
- package/dist/core/binding.d.ts.map +1 -0
- package/dist/{binding.js → core/binding.js} +27 -12
- package/dist/core/binding.js.map +1 -0
- package/dist/core/constraint-requirement.d.ts +53 -0
- package/dist/core/constraint-requirement.d.ts.map +1 -0
- package/dist/core/constraint-requirement.js +62 -0
- package/dist/core/constraint-requirement.js.map +1 -0
- package/dist/{constructor-type.d.ts → core/constructor-type.d.ts} +1 -1
- package/dist/core/constructor-type.d.ts.map +1 -0
- package/dist/core/constructor-type.js.map +1 -0
- package/dist/{module.d.ts → core/module.d.ts} +5 -5
- package/dist/core/module.d.ts.map +1 -0
- package/dist/{module.js → core/module.js} +4 -4
- package/dist/core/module.js.map +1 -0
- package/dist/{registry.d.ts → core/registry.d.ts} +27 -7
- package/dist/core/registry.d.ts.map +1 -0
- package/dist/{registry.js → core/registry.js} +125 -52
- package/dist/core/registry.js.map +1 -0
- package/dist/core/tag.d.ts +80 -0
- package/dist/core/tag.d.ts.map +1 -0
- package/dist/core/tag.js +96 -0
- package/dist/core/tag.js.map +1 -0
- package/dist/{token.d.ts → core/token.d.ts} +2 -6
- package/dist/core/token.d.ts.map +1 -0
- package/dist/core/token.js +13 -0
- package/dist/core/token.js.map +1 -0
- package/dist/{types.d.ts → core/types.d.ts} +27 -21
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js.map +1 -0
- package/dist/decorators/inject.d.ts +5 -49
- package/dist/decorators/inject.d.ts.map +1 -1
- package/dist/decorators/inject.js +34 -104
- package/dist/decorators/inject.js.map +1 -1
- package/dist/decorators/injectable.d.ts +25 -5
- package/dist/decorators/injectable.d.ts.map +1 -1
- package/dist/decorators/injectable.js +2 -3
- package/dist/decorators/injectable.js.map +1 -1
- package/dist/decorators/lifecycle-decorators.d.ts +4 -2
- package/dist/decorators/lifecycle-decorators.d.ts.map +1 -1
- package/dist/decorators/lifecycle-decorators.js +19 -25
- package/dist/decorators/lifecycle-decorators.js.map +1 -1
- package/dist/{resolution → errors}/diagnostics.d.ts +2 -0
- package/dist/errors/diagnostics.d.ts.map +1 -0
- package/dist/errors/diagnostics.js.map +1 -0
- package/dist/{errors.d.ts → errors/errors.d.ts} +89 -4
- package/dist/errors/errors.d.ts.map +1 -0
- package/dist/{errors.js → errors/errors.js} +129 -7
- package/dist/errors/errors.js.map +1 -0
- package/dist/index.d.ts +21 -14
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -7
- package/dist/index.js.map +1 -1
- package/dist/injection/descriptor.d.ts +79 -0
- package/dist/injection/descriptor.d.ts.map +1 -0
- package/dist/injection/descriptor.js +118 -0
- package/dist/injection/descriptor.js.map +1 -0
- package/dist/{resolution → injection}/resolve-options.d.ts +21 -11
- package/dist/injection/resolve-options.d.ts.map +1 -0
- package/dist/injection/resolve-options.js +101 -0
- package/dist/injection/resolve-options.js.map +1 -0
- package/dist/introspection/dependency-graph.d.ts +16 -5
- package/dist/introspection/dependency-graph.d.ts.map +1 -1
- package/dist/introspection/dependency-graph.js +138 -57
- package/dist/introspection/dependency-graph.js.map +1 -1
- package/dist/introspection/graph-adapters/cytoscape.d.ts +6 -3
- package/dist/introspection/graph-adapters/cytoscape.d.ts.map +1 -1
- package/dist/introspection/graph-adapters/cytoscape.js +3 -0
- package/dist/introspection/graph-adapters/cytoscape.js.map +1 -1
- package/dist/introspection/graph-adapters/dot.d.ts.map +1 -1
- package/dist/introspection/graph-adapters/dot.js +12 -5
- package/dist/introspection/graph-adapters/dot.js.map +1 -1
- package/dist/introspection/graph-adapters/mermaid.d.ts +9 -0
- package/dist/introspection/graph-adapters/mermaid.d.ts.map +1 -0
- package/dist/introspection/graph-adapters/mermaid.js +47 -0
- package/dist/introspection/graph-adapters/mermaid.js.map +1 -0
- package/dist/introspection/graph-adapters/reactflow.d.ts +6 -3
- package/dist/introspection/graph-adapters/reactflow.d.ts.map +1 -1
- package/dist/introspection/graph-adapters/reactflow.js +5 -1
- package/dist/introspection/graph-adapters/reactflow.js.map +1 -1
- package/dist/introspection/inspector.d.ts +4 -4
- package/dist/introspection/inspector.d.ts.map +1 -1
- package/dist/introspection/inspector.js +10 -6
- package/dist/introspection/inspector.js.map +1 -1
- package/dist/lifecycle/lifecycle-manager.d.ts +27 -0
- package/dist/lifecycle/lifecycle-manager.d.ts.map +1 -0
- package/dist/{resolution/lifecycle.js → lifecycle/lifecycle-manager.js} +39 -9
- package/dist/lifecycle/lifecycle-manager.js.map +1 -0
- package/dist/lifecycle/scope-manager.d.ts +48 -0
- package/dist/lifecycle/scope-manager.d.ts.map +1 -0
- package/dist/lifecycle/scope-manager.js +135 -0
- package/dist/lifecycle/scope-manager.js.map +1 -0
- package/dist/metadata/metadata-reader-token.d.ts +1 -1
- package/dist/metadata/metadata-reader-token.d.ts.map +1 -1
- package/dist/metadata/metadata-reader-token.js +1 -1
- package/dist/metadata/metadata-reader-token.js.map +1 -1
- package/dist/metadata/metadata-types.d.ts +9 -9
- package/dist/metadata/metadata-types.d.ts.map +1 -1
- package/dist/metadata/symbol-metadata-reader.d.ts +19 -6
- package/dist/metadata/symbol-metadata-reader.d.ts.map +1 -1
- package/dist/metadata/symbol-metadata-reader.js +89 -9
- package/dist/metadata/symbol-metadata-reader.js.map +1 -1
- package/dist/metadata/verifying-metadata-reader.d.ts +16 -0
- package/dist/metadata/verifying-metadata-reader.d.ts.map +1 -0
- package/dist/metadata/verifying-metadata-reader.js +32 -0
- package/dist/metadata/verifying-metadata-reader.js.map +1 -0
- package/dist/resolution/{activation-need.d.ts → cache/activation-need.d.ts} +5 -5
- package/dist/resolution/cache/activation-need.d.ts.map +1 -0
- package/dist/resolution/cache/activation-need.js.map +1 -0
- package/dist/resolution/{binding-lookup-cache.d.ts → cache/binding-lookup-cache.d.ts} +9 -5
- package/dist/resolution/cache/binding-lookup-cache.d.ts.map +1 -0
- package/dist/resolution/{binding-lookup-cache.js → cache/binding-lookup-cache.js} +55 -0
- package/dist/resolution/cache/binding-lookup-cache.js.map +1 -0
- package/dist/resolution/cache/class-introspector.d.ts +66 -0
- package/dist/resolution/cache/class-introspector.d.ts.map +1 -0
- package/dist/resolution/cache/class-introspector.js +194 -0
- package/dist/resolution/cache/class-introspector.js.map +1 -0
- package/dist/resolution/context.d.ts +84 -0
- package/dist/resolution/context.d.ts.map +1 -0
- package/dist/resolution/{environment.js → context.js} +54 -80
- package/dist/resolution/context.js.map +1 -0
- package/dist/resolution/path/resolution-path.d.ts +94 -0
- package/dist/resolution/path/resolution-path.d.ts.map +1 -0
- package/dist/resolution/path/resolution-path.js +117 -0
- package/dist/resolution/path/resolution-path.js.map +1 -0
- package/dist/resolution/{instantiation-plan.d.ts → plan/instantiation-plan.d.ts} +37 -7
- package/dist/resolution/plan/instantiation-plan.d.ts.map +1 -0
- package/dist/resolution/plan/instantiation-plan.js +419 -0
- package/dist/resolution/plan/instantiation-plan.js.map +1 -0
- package/dist/resolution/resolver.d.ts +28 -28
- package/dist/resolution/resolver.d.ts.map +1 -1
- package/dist/resolution/resolver.js +581 -239
- package/dist/resolution/resolver.js.map +1 -1
- package/dist/resolution/select/binding-select.d.ts +34 -0
- package/dist/resolution/select/binding-select.d.ts.map +1 -0
- package/dist/resolution/select/binding-select.js +175 -0
- package/dist/resolution/select/binding-select.js.map +1 -0
- package/dist/resolution/{constraints.d.ts → select/constraints.d.ts} +13 -12
- package/dist/resolution/select/constraints.d.ts.map +1 -0
- package/dist/resolution/{constraints.js → select/constraints.js} +33 -22
- package/dist/resolution/select/constraints.js.map +1 -0
- package/package.json +160 -20
- package/src/ambient/active-container.ts +65 -0
- package/src/container/binding-builders.ts +79 -44
- package/src/container/container.ts +357 -170
- package/src/{resolution → core}/binding-scope.ts +2 -2
- package/src/{binding.ts → core/binding.ts} +101 -39
- package/src/core/constraint-requirement.ts +94 -0
- package/src/{constructor-type.ts → core/constructor-type.ts} +1 -1
- package/src/{module.ts → core/module.ts} +10 -10
- package/src/core/registry.ts +365 -0
- package/src/core/tag.ts +158 -0
- package/src/{token.ts → core/token.ts} +2 -14
- package/src/{types.ts → core/types.ts} +37 -34
- package/src/decorators/inject.ts +39 -175
- package/src/decorators/injectable.ts +40 -10
- package/src/decorators/lifecycle-decorators.ts +22 -34
- package/src/{resolution → errors}/diagnostics.ts +2 -0
- package/src/{errors.ts → errors/errors.ts} +152 -8
- package/src/index.ts +43 -15
- package/src/injection/descriptor.ts +206 -0
- package/src/injection/resolve-options.ts +144 -0
- package/src/introspection/dependency-graph.ts +223 -63
- package/src/introspection/graph-adapters/cytoscape.ts +9 -3
- package/src/introspection/graph-adapters/dot.ts +13 -5
- package/src/introspection/graph-adapters/mermaid.ts +61 -0
- package/src/introspection/graph-adapters/reactflow.ts +11 -4
- package/src/introspection/inspector.ts +16 -12
- package/src/{resolution/lifecycle.ts → lifecycle/lifecycle-manager.ts} +68 -32
- package/src/lifecycle/scope-manager.ts +156 -0
- package/src/metadata/metadata-reader-token.ts +2 -2
- package/src/metadata/metadata-types.ts +9 -9
- package/src/metadata/symbol-metadata-reader.ts +95 -18
- package/src/metadata/verifying-metadata-reader.ts +41 -0
- package/src/resolution/{activation-need.ts → cache/activation-need.ts} +8 -8
- package/src/resolution/{binding-lookup-cache.ts → cache/binding-lookup-cache.ts} +63 -5
- package/src/resolution/cache/class-introspector.ts +251 -0
- package/src/resolution/{environment.ts → context.ts} +84 -145
- package/src/resolution/path/resolution-path.ts +167 -0
- package/src/resolution/plan/instantiation-plan.ts +615 -0
- package/src/resolution/resolver.ts +663 -313
- package/src/resolution/select/binding-select.ts +210 -0
- package/src/resolution/select/constraints.ts +130 -0
- package/dist/binding.d.ts.map +0 -1
- package/dist/binding.js.map +0 -1
- package/dist/constructor-type.d.ts.map +0 -1
- package/dist/constructor-type.js.map +0 -1
- package/dist/errors.d.ts.map +0 -1
- package/dist/errors.js.map +0 -1
- package/dist/module.d.ts.map +0 -1
- package/dist/module.js.map +0 -1
- package/dist/registry.d.ts.map +0 -1
- package/dist/registry.js.map +0 -1
- package/dist/resolution/activation-need.d.ts.map +0 -1
- package/dist/resolution/activation-need.js.map +0 -1
- package/dist/resolution/binding-lookup-cache.d.ts.map +0 -1
- package/dist/resolution/binding-lookup-cache.js.map +0 -1
- package/dist/resolution/binding-scope.d.ts.map +0 -1
- package/dist/resolution/binding-scope.js.map +0 -1
- package/dist/resolution/binding-select.d.ts +0 -23
- package/dist/resolution/binding-select.d.ts.map +0 -1
- package/dist/resolution/binding-select.js +0 -121
- package/dist/resolution/binding-select.js.map +0 -1
- package/dist/resolution/class-introspector.d.ts +0 -27
- package/dist/resolution/class-introspector.d.ts.map +0 -1
- package/dist/resolution/class-introspector.js +0 -60
- package/dist/resolution/class-introspector.js.map +0 -1
- package/dist/resolution/constraints.d.ts.map +0 -1
- package/dist/resolution/constraints.js.map +0 -1
- package/dist/resolution/diagnostics.d.ts.map +0 -1
- package/dist/resolution/diagnostics.js.map +0 -1
- package/dist/resolution/environment.d.ts +0 -94
- package/dist/resolution/environment.d.ts.map +0 -1
- package/dist/resolution/environment.js.map +0 -1
- package/dist/resolution/instantiation-plan.d.ts.map +0 -1
- package/dist/resolution/instantiation-plan.js +0 -183
- package/dist/resolution/instantiation-plan.js.map +0 -1
- package/dist/resolution/lifecycle.d.ts +0 -23
- package/dist/resolution/lifecycle.d.ts.map +0 -1
- package/dist/resolution/lifecycle.js.map +0 -1
- package/dist/resolution/resolution-path.d.ts +0 -98
- package/dist/resolution/resolution-path.d.ts.map +0 -1
- package/dist/resolution/resolution-path.js +0 -98
- package/dist/resolution/resolution-path.js.map +0 -1
- package/dist/resolution/resolve-options.d.ts.map +0 -1
- package/dist/resolution/resolve-options.js +0 -56
- package/dist/resolution/resolve-options.js.map +0 -1
- package/dist/resolution/scope.d.ts +0 -28
- package/dist/resolution/scope.d.ts.map +0 -1
- package/dist/resolution/scope.js +0 -88
- package/dist/resolution/scope.js.map +0 -1
- package/dist/token.d.ts.map +0 -1
- package/dist/token.js +0 -22
- package/dist/token.js.map +0 -1
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js.map +0 -1
- package/src/registry.ts +0 -282
- package/src/resolution/binding-select.ts +0 -154
- package/src/resolution/class-introspector.ts +0 -74
- package/src/resolution/constraints.ts +0 -121
- package/src/resolution/instantiation-plan.ts +0 -292
- package/src/resolution/resolution-path.ts +0 -156
- package/src/resolution/resolve-options.ts +0 -89
- package/src/resolution/scope.ts +0 -105
- /package/dist/{resolution → core}/binding-scope.js +0 -0
- /package/dist/{constructor-type.js → core/constructor-type.js} +0 -0
- /package/dist/{types.js → core/types.js} +0 -0
- /package/dist/{resolution → errors}/diagnostics.js +0 -0
- /package/dist/resolution/{activation-need.js → cache/activation-need.js} +0 -0
|
@@ -0,0 +1,419 @@
|
|
|
1
|
+
import { NO_INSTANCE } from "#/core/binding";
|
|
2
|
+
import { tokenName } from "#/core/token";
|
|
3
|
+
import { AsyncResolutionError } from "#/errors/errors";
|
|
4
|
+
import { injectionSlotToResolveOptions, isNameOnlyOptions } from "#/injection/resolve-options";
|
|
5
|
+
// Past this depth a dependency escapes to the runtime path rather than inlining further —
|
|
6
|
+
// compiled closures nest one JS frame per level, and pathological graphs are the runtime's job.
|
|
7
|
+
const PLAN_DEPTH_LIMIT = 32;
|
|
8
|
+
/**
|
|
9
|
+
* Compilation asked to retry later (class lifecycle metadata not discovered yet).
|
|
10
|
+
*
|
|
11
|
+
* @since 0.5.0-canary.7
|
|
12
|
+
*/
|
|
13
|
+
export const PLAN_RETRY = Symbol("di:plan-retry");
|
|
14
|
+
function allSynchronous(deps) {
|
|
15
|
+
for (let index = 0; index < deps.length; index += 1) {
|
|
16
|
+
if (deps[index].promiseShape !== "never") {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* The promise-aware combinator: run every dep thunk, await them together, then apply.
|
|
24
|
+
*
|
|
25
|
+
* @remarks A dep's sync throw becomes that slot's rejection so its siblings still start — the
|
|
26
|
+
* interpreted path starts every sibling before the first rejection propagates, and so does this.
|
|
27
|
+
*/
|
|
28
|
+
function settleThenApply(deps, apply) {
|
|
29
|
+
return () => {
|
|
30
|
+
const pending = new Array(deps.length);
|
|
31
|
+
for (let index = 0; index < deps.length; index += 1) {
|
|
32
|
+
try {
|
|
33
|
+
pending[index] = deps[index].run();
|
|
34
|
+
}
|
|
35
|
+
catch (dependencyError) {
|
|
36
|
+
pending[index] = Promise.reject(dependencyError);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return Promise.all(pending).then(apply);
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* @since 0.3.16-canary.1
|
|
44
|
+
*/
|
|
45
|
+
export class InstantiationPlanCompiler {
|
|
46
|
+
#host;
|
|
47
|
+
constructor(host) {
|
|
48
|
+
this.#host = host;
|
|
49
|
+
}
|
|
50
|
+
compile(binding) {
|
|
51
|
+
return binding.kind === "class"
|
|
52
|
+
? this.#compileClassPlan(binding, new Set(), 0, [])
|
|
53
|
+
: this.#compileResolvedPlan(binding, new Set(), 0, []);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Re-entry into the runtime resolver for a dependency the plan can't see through.
|
|
57
|
+
*
|
|
58
|
+
* The ancestors are fixed at compile time, so the seed is built once and lent per call — the
|
|
59
|
+
* root-stack rule one level down: every sync lane pops what it pushes, so the owned array still
|
|
60
|
+
* holds exactly the seed when a call returns. A reentrant call finds it claimed and mints its
|
|
61
|
+
* own copy; a return that did not restore the length hands nothing back, so the next call mints.
|
|
62
|
+
*/
|
|
63
|
+
#compileEscapeThunk(token, ancestors, arity = "single", options) {
|
|
64
|
+
const host = this.#host;
|
|
65
|
+
const frames = ancestors.map((ancestor) => host.getResolutionFrame(ancestor));
|
|
66
|
+
const depth = frames.length;
|
|
67
|
+
let owned = [...frames];
|
|
68
|
+
return () => {
|
|
69
|
+
const stack = owned ?? [...frames];
|
|
70
|
+
owned = undefined;
|
|
71
|
+
try {
|
|
72
|
+
return host.resolveEscaped(token, options, arity, stack);
|
|
73
|
+
}
|
|
74
|
+
finally {
|
|
75
|
+
if (stack.length === depth) {
|
|
76
|
+
owned = stack;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
// A resolved binding declares its deps as explicit descriptors — same rules as
|
|
82
|
+
// class params, with the factory call (and its sync-only check) in place of `new`.
|
|
83
|
+
#compileResolvedPlan(binding, compileStack, depth, ancestors) {
|
|
84
|
+
if (binding.onActivation !== undefined || this.#host.hasActivationHandlers(binding)) {
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
const factory = binding.factory;
|
|
88
|
+
const tokenDisplayName = tokenName(binding.token);
|
|
89
|
+
const depThunks = new Array(binding.deps.length);
|
|
90
|
+
const depAncestors = [...ancestors, binding];
|
|
91
|
+
compileStack.add(binding.id);
|
|
92
|
+
try {
|
|
93
|
+
for (let index = 0; index < binding.deps.length; index += 1) {
|
|
94
|
+
const thunk = this.#compileInjectionThunk(binding.deps[index], compileStack, depth, depAncestors);
|
|
95
|
+
if (thunk === PLAN_RETRY) {
|
|
96
|
+
return thunk;
|
|
97
|
+
}
|
|
98
|
+
depThunks[index] = thunk;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
finally {
|
|
102
|
+
compileStack.delete(binding.id);
|
|
103
|
+
}
|
|
104
|
+
return () => {
|
|
105
|
+
const factoryResult = factory(...depThunks.map((thunk) => thunk()));
|
|
106
|
+
if (factoryResult instanceof Promise) {
|
|
107
|
+
throw new AsyncResolutionError(tokenDisplayName);
|
|
108
|
+
}
|
|
109
|
+
return factoryResult;
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* One dependency of a plan node — a constructor param or a `toResolved` descriptor.
|
|
114
|
+
*
|
|
115
|
+
* @remarks Anything but a plain required single dependency escapes to the runtime path.
|
|
116
|
+
*/
|
|
117
|
+
#compileInjectionThunk(descriptor, compileStack, depth, ancestors) {
|
|
118
|
+
const token = descriptor.token;
|
|
119
|
+
const options = injectionSlotToResolveOptions(descriptor);
|
|
120
|
+
if (descriptor.multi) {
|
|
121
|
+
return this.#compileEscapeThunk(token, ancestors, "all", options);
|
|
122
|
+
}
|
|
123
|
+
if (descriptor.optional) {
|
|
124
|
+
return this.#compileEscapeThunk(token, ancestors, "optional", options);
|
|
125
|
+
}
|
|
126
|
+
if (options !== undefined) {
|
|
127
|
+
// A name the registry can settle without reading a path is a dependency like any other: it
|
|
128
|
+
// escapes only because it carries a criterion, not because anything about it is opaque.
|
|
129
|
+
if (isNameOnlyOptions(options)) {
|
|
130
|
+
const named = this.#host.lookupPathIndependentNamedEntry(token, options);
|
|
131
|
+
if (named !== null) {
|
|
132
|
+
return this.#compileDepThunk(named, compileStack, depth, ancestors, options);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
// The host owns the whole single-tag decision, including whether the options qualify.
|
|
137
|
+
const tagged = this.#host.lookupPathIndependentTaggedEntry?.(token, options);
|
|
138
|
+
if (tagged !== null && tagged !== undefined) {
|
|
139
|
+
return this.#compileDepThunk(tagged, compileStack, depth, ancestors, options);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return this.#compileEscapeThunk(token, ancestors, "single", options);
|
|
143
|
+
}
|
|
144
|
+
const entry = this.#host.lookupDependencyEntry(token);
|
|
145
|
+
if (entry === null) {
|
|
146
|
+
return this.#compileEscapeThunk(token, ancestors);
|
|
147
|
+
}
|
|
148
|
+
return this.#compileDepThunk(entry, compileStack, depth, ancestors);
|
|
149
|
+
}
|
|
150
|
+
#compileClassPlan(binding, compileStack, depth, ancestors) {
|
|
151
|
+
if (binding.onActivation !== undefined || this.#host.hasActivationHandlers(binding)) {
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
const target = binding.target;
|
|
155
|
+
const hasPostConstruct = this.#host.knownPostConstruct(target);
|
|
156
|
+
if (hasPostConstruct === undefined) {
|
|
157
|
+
return PLAN_RETRY;
|
|
158
|
+
}
|
|
159
|
+
if (hasPostConstruct || this.#host.needsActiveContainer(target)) {
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
const invokable = target;
|
|
163
|
+
const meta = this.#host.getConstructorMetadata(target);
|
|
164
|
+
if (meta === undefined) {
|
|
165
|
+
// Metadata-less classes with required params throw on the runtime path — keep them there.
|
|
166
|
+
return target.length === 0 ? () => new invokable() : null;
|
|
167
|
+
}
|
|
168
|
+
const params = meta.params;
|
|
169
|
+
if (params.length === 0) {
|
|
170
|
+
return () => new invokable();
|
|
171
|
+
}
|
|
172
|
+
const depThunks = new Array(params.length);
|
|
173
|
+
const depAncestors = [...ancestors, binding];
|
|
174
|
+
compileStack.add(binding.id);
|
|
175
|
+
try {
|
|
176
|
+
for (let index = 0; index < params.length; index += 1) {
|
|
177
|
+
const thunk = this.#compileInjectionThunk(params[index], compileStack, depth, depAncestors);
|
|
178
|
+
if (thunk === PLAN_RETRY) {
|
|
179
|
+
return thunk;
|
|
180
|
+
}
|
|
181
|
+
depThunks[index] = thunk;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
finally {
|
|
185
|
+
compileStack.delete(binding.id);
|
|
186
|
+
}
|
|
187
|
+
switch (depThunks.length) {
|
|
188
|
+
case 1: {
|
|
189
|
+
const dep0 = depThunks[0];
|
|
190
|
+
return () => new invokable(dep0());
|
|
191
|
+
}
|
|
192
|
+
case 2: {
|
|
193
|
+
const dep0 = depThunks[0];
|
|
194
|
+
const dep1 = depThunks[1];
|
|
195
|
+
return () => new invokable(dep0(), dep1());
|
|
196
|
+
}
|
|
197
|
+
case 3: {
|
|
198
|
+
const dep0 = depThunks[0];
|
|
199
|
+
const dep1 = depThunks[1];
|
|
200
|
+
const dep2 = depThunks[2];
|
|
201
|
+
return () => new invokable(dep0(), dep1(), dep2());
|
|
202
|
+
}
|
|
203
|
+
default:
|
|
204
|
+
return () => new invokable(...depThunks.map((thunk) => thunk()));
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
#compileDepThunk(entry, compileStack, depth, ancestors, options) {
|
|
208
|
+
const { binding } = entry;
|
|
209
|
+
if (binding.kind === "constant" && binding.onActivation === undefined) {
|
|
210
|
+
if (!this.#host.hasActivationHandlers(binding)) {
|
|
211
|
+
const value = binding.value;
|
|
212
|
+
return () => value;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
const scope = binding.scope;
|
|
216
|
+
if (scope === "singleton") {
|
|
217
|
+
// Cached-singleton read; the first materialization escapes so it sees the same ancestors
|
|
218
|
+
// (and therefore the same cycle detection) the interpreted path would have built.
|
|
219
|
+
const escape = this.#compileEscapeThunk(binding.token, ancestors, "single", options);
|
|
220
|
+
const singletonBinding = binding;
|
|
221
|
+
return () => {
|
|
222
|
+
const cached = singletonBinding.instance;
|
|
223
|
+
return cached === NO_INSTANCE ? escape() : cached;
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
if (scope === "transient" &&
|
|
227
|
+
binding.kind === "class" &&
|
|
228
|
+
depth < PLAN_DEPTH_LIMIT &&
|
|
229
|
+
!compileStack.has(binding.id)) {
|
|
230
|
+
const inlined = this.#compileClassPlan(binding, compileStack, depth + 1, ancestors);
|
|
231
|
+
if (inlined !== null) {
|
|
232
|
+
return inlined;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
// Anything opaque — a factory, a scoped binding, an activation hook, a class the compiler
|
|
236
|
+
// declined — runs on the runtime path, seeded with this plan's ancestors.
|
|
237
|
+
return this.#compileEscapeThunk(binding.token, ancestors, "single", options);
|
|
238
|
+
}
|
|
239
|
+
// ── The async lane ─────────────────────────────────────────────────────────────────────────────────────────────────
|
|
240
|
+
/**
|
|
241
|
+
* Compiles a transient binding whose graph is statically visible, for the async entry point.
|
|
242
|
+
*
|
|
243
|
+
* @remarks Same gates as the sync lane; the differences are downstream — escapes replay the async
|
|
244
|
+
* dispatch, and a node whose dependencies may yield promises awaits them together, exactly as the
|
|
245
|
+
* interpreted async path does.
|
|
246
|
+
*/
|
|
247
|
+
compileAsync(binding) {
|
|
248
|
+
const node = binding.kind === "class"
|
|
249
|
+
? this.#compileAsyncClassNode(binding, new Set(), 0, [])
|
|
250
|
+
: this.#compileAsyncResolvedNode(binding, new Set(), 0, []);
|
|
251
|
+
if (node === null || node === PLAN_RETRY) {
|
|
252
|
+
return node;
|
|
253
|
+
}
|
|
254
|
+
return node.run;
|
|
255
|
+
}
|
|
256
|
+
#compileAsyncEscapeThunk(token, ancestors, arity = "single", options) {
|
|
257
|
+
const host = this.#host;
|
|
258
|
+
const frames = ancestors.map((ancestor) => host.getResolutionFrame(ancestor));
|
|
259
|
+
return {
|
|
260
|
+
run: () => host.resolveEscapedAsync(token, options, arity, [...frames]),
|
|
261
|
+
promiseShape: "always",
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
#compileAsyncClassNode(binding, compileStack, depth, ancestors) {
|
|
265
|
+
if (binding.onActivation !== undefined || this.#host.hasActivationHandlers(binding)) {
|
|
266
|
+
return null;
|
|
267
|
+
}
|
|
268
|
+
const target = binding.target;
|
|
269
|
+
const hasPostConstruct = this.#host.knownPostConstruct(target);
|
|
270
|
+
if (hasPostConstruct === undefined) {
|
|
271
|
+
return PLAN_RETRY;
|
|
272
|
+
}
|
|
273
|
+
if (hasPostConstruct || this.#host.needsActiveContainer(target)) {
|
|
274
|
+
return null;
|
|
275
|
+
}
|
|
276
|
+
const invokable = target;
|
|
277
|
+
const meta = this.#host.getConstructorMetadata(target);
|
|
278
|
+
if (meta === undefined) {
|
|
279
|
+
// Metadata-less classes with required params throw on the runtime path — keep them there.
|
|
280
|
+
return target.length === 0 ? { run: () => new invokable(), promiseShape: "never" } : null;
|
|
281
|
+
}
|
|
282
|
+
const params = meta.params;
|
|
283
|
+
if (params.length === 0) {
|
|
284
|
+
return { run: () => new invokable(), promiseShape: "never" };
|
|
285
|
+
}
|
|
286
|
+
const depThunks = new Array(params.length);
|
|
287
|
+
const depAncestors = [...ancestors, binding];
|
|
288
|
+
compileStack.add(binding.id);
|
|
289
|
+
try {
|
|
290
|
+
for (let index = 0; index < params.length; index += 1) {
|
|
291
|
+
const thunk = this.#compileAsyncInjectionThunk(params[index], compileStack, depth, depAncestors);
|
|
292
|
+
if (thunk === PLAN_RETRY) {
|
|
293
|
+
return thunk;
|
|
294
|
+
}
|
|
295
|
+
depThunks[index] = thunk;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
finally {
|
|
299
|
+
compileStack.delete(binding.id);
|
|
300
|
+
}
|
|
301
|
+
if (allSynchronous(depThunks)) {
|
|
302
|
+
switch (depThunks.length) {
|
|
303
|
+
case 1: {
|
|
304
|
+
const dep0 = depThunks[0].run;
|
|
305
|
+
return { run: () => new invokable(dep0()), promiseShape: "never" };
|
|
306
|
+
}
|
|
307
|
+
case 2: {
|
|
308
|
+
const dep0 = depThunks[0].run;
|
|
309
|
+
const dep1 = depThunks[1].run;
|
|
310
|
+
return { run: () => new invokable(dep0(), dep1()), promiseShape: "never" };
|
|
311
|
+
}
|
|
312
|
+
default:
|
|
313
|
+
return {
|
|
314
|
+
run: () => new invokable(...depThunks.map((thunk) => thunk.run())),
|
|
315
|
+
promiseShape: "never",
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
return { run: settleThenApply(depThunks, (values) => new invokable(...values)), promiseShape: "always" };
|
|
320
|
+
}
|
|
321
|
+
#compileAsyncResolvedNode(binding, compileStack, depth, ancestors) {
|
|
322
|
+
if (binding.onActivation !== undefined || this.#host.hasActivationHandlers(binding)) {
|
|
323
|
+
return null;
|
|
324
|
+
}
|
|
325
|
+
const factory = binding.factory;
|
|
326
|
+
const depThunks = new Array(binding.deps.length);
|
|
327
|
+
const depAncestors = [...ancestors, binding];
|
|
328
|
+
compileStack.add(binding.id);
|
|
329
|
+
try {
|
|
330
|
+
for (let index = 0; index < binding.deps.length; index += 1) {
|
|
331
|
+
const thunk = this.#compileAsyncInjectionThunk(binding.deps[index], compileStack, depth, depAncestors);
|
|
332
|
+
if (thunk === PLAN_RETRY) {
|
|
333
|
+
return thunk;
|
|
334
|
+
}
|
|
335
|
+
depThunks[index] = thunk;
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
finally {
|
|
339
|
+
compileStack.delete(binding.id);
|
|
340
|
+
}
|
|
341
|
+
// A sync-kind factory may still hand back a promise on this path — the async entry awaits it,
|
|
342
|
+
// so the consumer is told to as well.
|
|
343
|
+
const directShape = binding.kind === "resolved-async" ? "always" : "maybe";
|
|
344
|
+
if (allSynchronous(depThunks)) {
|
|
345
|
+
return { run: () => factory(...depThunks.map((thunk) => thunk.run())), promiseShape: directShape };
|
|
346
|
+
}
|
|
347
|
+
return { run: settleThenApply(depThunks, (values) => factory(...values)), promiseShape: "always" };
|
|
348
|
+
}
|
|
349
|
+
/** Mirrors {@link InstantiationPlanCompiler.#compileInjectionThunk}, escaping through the async dispatch. */
|
|
350
|
+
#compileAsyncInjectionThunk(descriptor, compileStack, depth, ancestors) {
|
|
351
|
+
const token = descriptor.token;
|
|
352
|
+
const options = injectionSlotToResolveOptions(descriptor);
|
|
353
|
+
if (descriptor.multi) {
|
|
354
|
+
return this.#compileAsyncEscapeThunk(token, ancestors, "all", options);
|
|
355
|
+
}
|
|
356
|
+
if (descriptor.optional) {
|
|
357
|
+
return this.#compileAsyncEscapeThunk(token, ancestors, "optional", options);
|
|
358
|
+
}
|
|
359
|
+
if (options !== undefined) {
|
|
360
|
+
if (isNameOnlyOptions(options)) {
|
|
361
|
+
const named = this.#host.lookupPathIndependentNamedEntry(token, options);
|
|
362
|
+
if (named !== null) {
|
|
363
|
+
return this.#compileAsyncDepThunk(named, compileStack, depth, ancestors, options);
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
else {
|
|
367
|
+
// The host owns the whole single-tag decision, including whether the options qualify.
|
|
368
|
+
const tagged = this.#host.lookupPathIndependentTaggedEntry?.(token, options);
|
|
369
|
+
if (tagged !== null && tagged !== undefined) {
|
|
370
|
+
return this.#compileAsyncDepThunk(tagged, compileStack, depth, ancestors, options);
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
return this.#compileAsyncEscapeThunk(token, ancestors, "single", options);
|
|
374
|
+
}
|
|
375
|
+
const entry = this.#host.lookupDependencyEntry(token);
|
|
376
|
+
if (entry === null) {
|
|
377
|
+
return this.#compileAsyncEscapeThunk(token, ancestors);
|
|
378
|
+
}
|
|
379
|
+
return this.#compileAsyncDepThunk(entry, compileStack, depth, ancestors);
|
|
380
|
+
}
|
|
381
|
+
#compileAsyncDepThunk(entry, compileStack, depth, ancestors, options) {
|
|
382
|
+
const { binding } = entry;
|
|
383
|
+
if (binding.kind === "constant" && binding.onActivation === undefined) {
|
|
384
|
+
if (!this.#host.hasActivationHandlers(binding)) {
|
|
385
|
+
const value = binding.value;
|
|
386
|
+
// The interpreted path funnels every dependency through an await, which unwraps a
|
|
387
|
+
// promise-valued constant — so one compiles as needing that same await.
|
|
388
|
+
return { run: () => value, promiseShape: value instanceof Promise ? "always" : "never" };
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
const scope = binding.scope;
|
|
392
|
+
if (scope === "singleton") {
|
|
393
|
+
// Cached-singleton read; the cold materialization escapes with the same criteria.
|
|
394
|
+
const escape = this.#compileAsyncEscapeThunk(binding.token, ancestors, "single", options);
|
|
395
|
+
const singletonBinding = binding;
|
|
396
|
+
return {
|
|
397
|
+
run: () => {
|
|
398
|
+
const cached = singletonBinding.instance;
|
|
399
|
+
return cached === NO_INSTANCE ? escape.run() : cached;
|
|
400
|
+
},
|
|
401
|
+
promiseShape: "maybe",
|
|
402
|
+
};
|
|
403
|
+
}
|
|
404
|
+
if (scope === "transient" && depth < PLAN_DEPTH_LIMIT && !compileStack.has(binding.id)) {
|
|
405
|
+
let inlined = null;
|
|
406
|
+
if (binding.kind === "class") {
|
|
407
|
+
inlined = this.#compileAsyncClassNode(binding, compileStack, depth + 1, ancestors);
|
|
408
|
+
}
|
|
409
|
+
else if (binding.kind === "resolved" || binding.kind === "resolved-async") {
|
|
410
|
+
inlined = this.#compileAsyncResolvedNode(binding, compileStack, depth + 1, ancestors);
|
|
411
|
+
}
|
|
412
|
+
if (inlined !== null) {
|
|
413
|
+
return inlined;
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
return this.#compileAsyncEscapeThunk(binding.token, ancestors, "single", options);
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
//# sourceMappingURL=instantiation-plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instantiation-plan.js","sourceRoot":"","sources":["../../../src/resolution/plan/instantiation-plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,34 +1,34 @@
|
|
|
1
|
-
import type { Binding } from "#/binding";
|
|
2
1
|
import type { Container } from "#/container/container";
|
|
2
|
+
import type { Binding } from "#/core/binding";
|
|
3
|
+
import type { BindingRegistry } from "#/core/registry";
|
|
4
|
+
import type { Token } from "#/core/token";
|
|
5
|
+
import type { Constructor, ResolutionFrame, ResolveOptions } from "#/core/types";
|
|
6
|
+
import type { ResolutionDiagnostics } from "#/errors/diagnostics";
|
|
7
|
+
import type { LifecycleManager } from "#/lifecycle/lifecycle-manager";
|
|
8
|
+
import type { ScopeManager } from "#/lifecycle/scope-manager";
|
|
3
9
|
import type { MetadataReader } from "#/metadata/metadata-types";
|
|
4
|
-
import type {
|
|
5
|
-
import type {
|
|
6
|
-
import type {
|
|
7
|
-
import type { ResolverCallbacks } from "#/resolution/environment";
|
|
8
|
-
import type { LifecycleManager } from "#/resolution/lifecycle";
|
|
9
|
-
import type { BranchDepth } from "#/resolution/resolution-path";
|
|
10
|
-
import type { ScopeManager } from "#/resolution/scope";
|
|
11
|
-
import type { Token } from "#/token";
|
|
12
|
-
import type { Constructor, ResolutionFrame, ResolveOptions } from "#/types";
|
|
10
|
+
import type { DefaultLookupEntry } from "#/resolution/cache/binding-lookup-cache";
|
|
11
|
+
import type { ResolverCallbacks } from "#/resolution/context";
|
|
12
|
+
import type { BranchDepth } from "#/resolution/path/resolution-path";
|
|
13
13
|
/**
|
|
14
14
|
* @since 0.3.16-canary.0
|
|
15
15
|
*/
|
|
16
16
|
export declare class DependencyResolver implements ResolverCallbacks {
|
|
17
17
|
#private;
|
|
18
18
|
/**
|
|
19
|
-
* The
|
|
19
|
+
* The stack a top-level **sync** resolve reuses instead of minting an array per call.
|
|
20
20
|
*
|
|
21
|
-
* @remarks Read directly rather than through an accessor
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
* context skip storing pointers it already holds.
|
|
21
|
+
* @remarks Read directly rather than through an accessor: a shallow resolve is one top-level
|
|
22
|
+
* call, so a call there is not amortised over anything. Every sync lane pops what it pushes, so
|
|
23
|
+
* `rootStack.length === 0` means no resolve holds the stack; async appends without popping and
|
|
24
|
+
* mints its own. Keeping it stable is also what lets a pooled context skip re-storing it.
|
|
26
25
|
*/
|
|
27
|
-
readonly rootPath: Array<string>;
|
|
28
26
|
readonly rootStack: Array<ResolutionFrame>;
|
|
29
27
|
constructor(registry: BindingRegistry, scope: ScopeManager, lifecycle: LifecycleManager, metadataReader: MetadataReader, container: Container, parent: DependencyResolver | undefined);
|
|
30
|
-
/**
|
|
31
|
-
|
|
28
|
+
/** The reader this resolver was built with, which is the one its container answers with. */
|
|
29
|
+
get metadataReader(): MetadataReader;
|
|
30
|
+
/** Structural counts for the {@link ResolutionDiagnostics} a container reports. */
|
|
31
|
+
describeCaches(): Pick<ResolutionDiagnostics, "compiledPlanCount" | "compiledAsyncPlanCount" | "syncContextPoolSize">;
|
|
32
32
|
/**
|
|
33
33
|
* Binding lookup aligned with `resolve` — used by `Container.validate` without instantiating.
|
|
34
34
|
*/
|
|
@@ -37,19 +37,19 @@ export declare class DependencyResolver implements ResolverCallbacks {
|
|
|
37
37
|
* Mirrors {@link DependencyResolver.resolveAll} candidate selection only (no instantiation).
|
|
38
38
|
*/
|
|
39
39
|
peekCandidateBindingsForValidate(token: Token<unknown> | Constructor, options: ResolveOptions | undefined): ReadonlyArray<Binding>;
|
|
40
|
-
resolveFromContext<
|
|
41
|
-
resolve<
|
|
42
|
-
resolveOptional<
|
|
43
|
-
resolveAll<
|
|
44
|
-
resolveAsyncFromContext<
|
|
45
|
-
resolveAsync<
|
|
46
|
-
resolveOptionalAsync<
|
|
47
|
-
resolveAllAsync<
|
|
40
|
+
resolveFromContext<Value>(token: Token<Value> | Constructor<Value>, resolutionStack: Array<ResolutionFrame>): Value;
|
|
41
|
+
resolve<Value>(token: Token<Value> | Constructor<Value>, options: ResolveOptions | undefined, resolutionStack: Array<ResolutionFrame>): Value;
|
|
42
|
+
resolveOptional<Value>(token: Token<Value> | Constructor<Value>, options: ResolveOptions | undefined, resolutionStack: Array<ResolutionFrame>): Value | undefined;
|
|
43
|
+
resolveAll<Value>(token: Token<Value> | Constructor<Value>, options: ResolveOptions | undefined, resolutionStack: Array<ResolutionFrame>): Array<Value>;
|
|
44
|
+
resolveAsyncFromContext<Value>(token: Token<Value> | Constructor<Value>, resolutionStack: Array<ResolutionFrame>, branchDepth: BranchDepth): Promise<Value>;
|
|
45
|
+
resolveAsync<Value>(token: Token<Value> | Constructor<Value>, options: ResolveOptions | undefined, resolutionStack: Array<ResolutionFrame>, branchDepth?: BranchDepth): Promise<Value>;
|
|
46
|
+
resolveOptionalAsync<Value>(token: Token<Value> | Constructor<Value>, options: ResolveOptions | undefined, resolutionStack: Array<ResolutionFrame>, branchDepth?: BranchDepth): Promise<Value | undefined>;
|
|
47
|
+
resolveAllAsync<Value>(token: Token<Value> | Constructor<Value>, options: ResolveOptions | undefined, resolutionStack: Array<ResolutionFrame>, branchDepth?: BranchDepth): Promise<Array<Value>>;
|
|
48
48
|
/**
|
|
49
49
|
* Entry for a request a factory makes from inside an open synchronous cascade.
|
|
50
50
|
*
|
|
51
51
|
* @remarks A request arriving with no cascade open came out of a continuation, so its ancestors
|
|
52
|
-
* are on no call stack — it escapes to the branch lane.
|
|
52
|
+
* are on no call stack — it escapes to the branch lane.
|
|
53
53
|
*/
|
|
54
54
|
resolveAsyncFromCascade(token: Token<unknown> | Constructor): Promise<unknown>;
|
|
55
55
|
/** Entry for a resolve the container starts, which opens the cascade rather than joining one. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/resolution/resolver.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/resolution/resolver.ts"],"names":[],"mappings":"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"}
|