@codefast/di 0.5.0-canary.6 → 0.5.0-canary.8
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 +123 -0
- package/README.md +15 -4
- package/dist/binding.d.ts +78 -19
- package/dist/binding.d.ts.map +1 -1
- package/dist/binding.js +46 -2
- 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 +56 -0
- package/dist/container/binding-builders.d.ts.map +1 -0
- package/dist/container/binding-builders.js +196 -0
- package/dist/container/binding-builders.js.map +1 -0
- package/dist/{container.d.ts → container/container.d.ts} +2 -2
- package/dist/container/container.d.ts.map +1 -0
- package/dist/container/container.js +624 -0
- package/dist/container/container.js.map +1 -0
- package/dist/decorators/inject.d.ts +10 -1
- package/dist/decorators/inject.d.ts.map +1 -1
- package/dist/decorators/inject.js +2 -2
- package/dist/decorators/inject.js.map +1 -1
- package/dist/decorators/injectable.js +3 -3
- package/dist/decorators/injectable.js.map +1 -1
- package/dist/errors.d.ts +14 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +17 -0
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +13 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -5
- package/dist/index.js.map +1 -1
- package/dist/introspection/dependency-graph.d.ts.map +1 -0
- package/dist/{dependency-graph.js → introspection/dependency-graph.js} +1 -1
- package/dist/introspection/dependency-graph.js.map +1 -0
- package/dist/{graph-adapters → introspection/graph-adapters}/cytoscape.d.ts +1 -1
- package/dist/introspection/graph-adapters/cytoscape.d.ts.map +1 -0
- package/dist/introspection/graph-adapters/cytoscape.js.map +1 -0
- package/dist/introspection/graph-adapters/dot.d.ts +6 -0
- package/dist/introspection/graph-adapters/dot.d.ts.map +1 -0
- package/dist/introspection/graph-adapters/dot.js.map +1 -0
- package/dist/{graph-adapters → introspection/graph-adapters}/reactflow.d.ts +2 -2
- package/dist/introspection/graph-adapters/reactflow.d.ts.map +1 -0
- package/dist/{graph-adapters → introspection/graph-adapters}/reactflow.js +11 -1
- package/dist/introspection/graph-adapters/reactflow.js.map +1 -0
- package/dist/{inspector.d.ts → introspection/inspector.d.ts} +3 -8
- package/dist/introspection/inspector.d.ts.map +1 -0
- package/dist/{inspector.js → introspection/inspector.js} +23 -23
- package/dist/introspection/inspector.js.map +1 -0
- 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/metadata/symbol-metadata-reader.d.ts +1 -1
- package/dist/metadata/symbol-metadata-reader.d.ts.map +1 -1
- package/dist/metadata/symbol-metadata-reader.js +4 -4
- package/dist/metadata/symbol-metadata-reader.js.map +1 -1
- package/dist/module.d.ts +9 -2
- package/dist/module.d.ts.map +1 -1
- package/dist/module.js +9 -2
- package/dist/module.js.map +1 -1
- package/dist/registry.d.ts +17 -13
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +94 -63
- package/dist/registry.js.map +1 -1
- package/dist/resolution/activation-need.d.ts +25 -0
- package/dist/resolution/activation-need.d.ts.map +1 -0
- package/dist/resolution/activation-need.js +64 -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 +102 -0
- package/dist/resolution/binding-lookup-cache.js.map +1 -0
- package/dist/resolution/binding-scope.d.ts.map +1 -0
- package/dist/resolution/binding-scope.js.map +1 -0
- package/dist/resolution/binding-select.d.ts.map +1 -0
- package/dist/{binding-select.js → resolution/binding-select.js} +17 -7
- package/dist/resolution/binding-select.js.map +1 -0
- 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/constraints.d.ts.map +1 -0
- package/dist/resolution/constraints.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/{environment.d.ts → resolution/environment.d.ts} +24 -7
- package/dist/resolution/environment.d.ts.map +1 -0
- package/dist/resolution/environment.js +126 -0
- package/dist/resolution/environment.js.map +1 -0
- package/dist/resolution/instantiation-plan.d.ts +67 -0
- package/dist/resolution/instantiation-plan.d.ts.map +1 -0
- package/dist/resolution/instantiation-plan.js +183 -0
- package/dist/resolution/instantiation-plan.js.map +1 -0
- package/dist/{lifecycle.d.ts → resolution/lifecycle.d.ts} +5 -3
- package/dist/resolution/lifecycle.d.ts.map +1 -0
- package/dist/{lifecycle.js → resolution/lifecycle.js} +23 -14
- package/dist/resolution/lifecycle.js.map +1 -0
- package/dist/resolution/resolution-path.d.ts +22 -0
- package/dist/resolution/resolution-path.d.ts.map +1 -0
- package/dist/resolution/resolution-path.js +40 -0
- package/dist/resolution/resolution-path.js.map +1 -0
- package/dist/resolution/resolve-options.d.ts.map +1 -0
- package/dist/resolution/resolve-options.js.map +1 -0
- package/dist/resolution/resolver.d.ts +40 -0
- package/dist/resolution/resolver.d.ts.map +1 -0
- package/dist/resolution/resolver.js +1108 -0
- package/dist/resolution/resolver.js.map +1 -0
- package/dist/{scope.d.ts → resolution/scope.d.ts} +8 -9
- package/dist/resolution/scope.d.ts.map +1 -0
- package/dist/resolution/scope.js +80 -0
- package/dist/resolution/scope.js.map +1 -0
- package/dist/token.d.ts.map +1 -1
- package/dist/token.js +0 -3
- package/dist/token.js.map +1 -1
- package/package.json +19 -94
- package/src/binding.ts +137 -22
- package/src/constructor-type.ts +4 -5
- package/src/container/binding-builders.ts +294 -0
- package/src/container/container.ts +825 -0
- package/src/decorators/inject.ts +15 -4
- package/src/decorators/injectable.ts +3 -3
- package/src/errors.ts +21 -0
- package/src/index.ts +15 -7
- package/src/{dependency-graph.ts → introspection/dependency-graph.ts} +1 -1
- package/src/{graph-adapters → introspection/graph-adapters}/cytoscape.ts +1 -1
- package/src/{graph-adapters → introspection/graph-adapters}/dot.ts +1 -1
- package/src/{graph-adapters → introspection/graph-adapters}/reactflow.ts +13 -2
- package/src/{inspector.ts → introspection/inspector.ts} +26 -21
- package/src/metadata/metadata-keys.ts +3 -6
- package/src/metadata/symbol-metadata-reader.ts +4 -4
- package/src/module.ts +14 -6
- package/src/registry.ts +97 -64
- package/src/resolution/activation-need.ts +81 -0
- package/src/resolution/binding-lookup-cache.ts +132 -0
- package/src/{binding-select.ts → resolution/binding-select.ts} +17 -7
- package/src/resolution/class-introspector.ts +74 -0
- package/src/resolution/diagnostics.ts +43 -0
- package/src/{environment.ts → resolution/environment.ts} +65 -35
- package/src/resolution/instantiation-plan.ts +292 -0
- package/src/{lifecycle.ts → resolution/lifecycle.ts} +26 -14
- package/src/resolution/resolution-path.ts +62 -0
- package/src/resolution/resolver.ts +1526 -0
- package/src/resolution/scope.ts +95 -0
- package/src/token.ts +0 -3
- package/dist/binding-scope.d.ts.map +0 -1
- package/dist/binding-scope.js.map +0 -1
- package/dist/binding-select.d.ts.map +0 -1
- package/dist/binding-select.js.map +0 -1
- package/dist/constraints.d.ts.map +0 -1
- package/dist/constraints.js.map +0 -1
- package/dist/container.d.ts.map +0 -1
- package/dist/container.js +0 -853
- package/dist/container.js.map +0 -1
- package/dist/dependency-graph.d.ts.map +0 -1
- package/dist/dependency-graph.js.map +0 -1
- package/dist/environment.d.ts.map +0 -1
- package/dist/environment.js +0 -100
- package/dist/environment.js.map +0 -1
- package/dist/graph-adapters/cytoscape.d.ts.map +0 -1
- package/dist/graph-adapters/cytoscape.js.map +0 -1
- package/dist/graph-adapters/dot.d.ts +0 -6
- package/dist/graph-adapters/dot.d.ts.map +0 -1
- package/dist/graph-adapters/dot.js.map +0 -1
- package/dist/graph-adapters/reactflow.d.ts.map +0 -1
- package/dist/graph-adapters/reactflow.js.map +0 -1
- package/dist/inspector.d.ts.map +0 -1
- package/dist/inspector.js.map +0 -1
- package/dist/lifecycle.d.ts.map +0 -1
- package/dist/lifecycle.js.map +0 -1
- package/dist/resolve-options.d.ts.map +0 -1
- package/dist/resolve-options.js.map +0 -1
- package/dist/resolver.d.ts +0 -90
- package/dist/resolver.d.ts.map +0 -1
- package/dist/resolver.js +0 -1208
- package/dist/resolver.js.map +0 -1
- package/dist/scope.d.ts.map +0 -1
- package/dist/scope.js +0 -61
- package/dist/scope.js.map +0 -1
- package/src/container.ts +0 -1141
- package/src/resolver.ts +0 -1626
- package/src/scope.ts +0 -77
- /package/dist/{dependency-graph.d.ts → introspection/dependency-graph.d.ts} +0 -0
- /package/dist/{graph-adapters → introspection/graph-adapters}/cytoscape.js +0 -0
- /package/dist/{graph-adapters → introspection/graph-adapters}/dot.js +0 -0
- /package/dist/{binding-scope.d.ts → resolution/binding-scope.d.ts} +0 -0
- /package/dist/{binding-scope.js → resolution/binding-scope.js} +0 -0
- /package/dist/{binding-select.d.ts → resolution/binding-select.d.ts} +0 -0
- /package/dist/{constraints.d.ts → resolution/constraints.d.ts} +0 -0
- /package/dist/{constraints.js → resolution/constraints.js} +0 -0
- /package/dist/{resolve-options.d.ts → resolution/resolve-options.d.ts} +0 -0
- /package/dist/{resolve-options.js → resolution/resolve-options.js} +0 -0
- /package/src/{binding-scope.ts → resolution/binding-scope.ts} +0 -0
- /package/src/{constraints.ts → resolution/constraints.ts} +0 -0
- /package/src/{resolve-options.ts → resolution/resolve-options.ts} +0 -0
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compiles a transient class or resolved-factory binding into a nested-constructor closure.
|
|
3
|
+
*
|
|
4
|
+
* @see `ARCHITECTURE.md` — the escape contract every dependency the compiler cannot inline must honour.
|
|
5
|
+
*/
|
|
6
|
+
import type { Binding } from "#/binding";
|
|
7
|
+
import type { ConstructorMetadata } from "#/metadata/metadata-types";
|
|
8
|
+
import type { Token } from "#/token";
|
|
9
|
+
import type { Constructor, ResolutionFrame, ResolveOptions } from "#/types";
|
|
10
|
+
/**
|
|
11
|
+
* Compilation asked to retry later (class lifecycle metadata not discovered yet).
|
|
12
|
+
*
|
|
13
|
+
* @since 0.5.0-canary.7
|
|
14
|
+
*/
|
|
15
|
+
export declare const PLAN_RETRY: unique symbol;
|
|
16
|
+
/**
|
|
17
|
+
* A compiled plan, `null` for "not plannable under the current cache versions",
|
|
18
|
+
* or {@link PLAN_RETRY} when a first runtime resolve must discover metadata first.
|
|
19
|
+
*
|
|
20
|
+
* @since 0.5.0-canary.7
|
|
21
|
+
*/
|
|
22
|
+
export type InstantiationPlanCompileResult = (() => unknown) | null | typeof PLAN_RETRY;
|
|
23
|
+
/**
|
|
24
|
+
* A dependency's terminal binding — all a compiled thunk needs.
|
|
25
|
+
*
|
|
26
|
+
* @since 0.5.0-canary.7
|
|
27
|
+
*/
|
|
28
|
+
export interface InstantiationPlanDependencyEntry {
|
|
29
|
+
readonly binding: Binding;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Everything the compiler needs from its resolver, expressed as behavior so the
|
|
33
|
+
* compiler stays independently testable and free of resolver internals.
|
|
34
|
+
*
|
|
35
|
+
* @since 0.5.0-canary.7
|
|
36
|
+
*/
|
|
37
|
+
export interface InstantiationPlanHost {
|
|
38
|
+
hasActivationHandlers(token: Token<unknown> | Constructor): boolean;
|
|
39
|
+
/** Cached postConstruct presence — `undefined` until a runtime resolve discovers it. */
|
|
40
|
+
knownPostConstruct(target: Constructor): boolean | undefined;
|
|
41
|
+
needsActiveContainer(target: Constructor): boolean;
|
|
42
|
+
getConstructorMetadata(target: Constructor): ConstructorMetadata | undefined;
|
|
43
|
+
/** Options-less lookup with alias hops folded; `null` when the fast lane can't answer. */
|
|
44
|
+
lookupDependencyEntry(token: Token<unknown> | Constructor): InstantiationPlanDependencyEntry | null;
|
|
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;
|
|
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
|
+
/**
|
|
58
|
+
* @since 0.3.16-canary.1
|
|
59
|
+
*/
|
|
60
|
+
export declare class InstantiationPlanCompiler {
|
|
61
|
+
#private;
|
|
62
|
+
constructor(host: InstantiationPlanHost);
|
|
63
|
+
compile(binding: Binding & {
|
|
64
|
+
kind: "class" | "resolved";
|
|
65
|
+
}): InstantiationPlanCompileResult;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=instantiation-plan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instantiation-plan.d.ts","sourceRoot":"","sources":["../../src/resolution/instantiation-plan.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAErE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAErC,OAAO,KAAK,EAAgB,WAAW,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAM1F;;;;GAIG;AACH,eAAO,MAAM,UAAU,EAAE,OAAO,MAAgC,CAAC;AAEjE;;;;;GAKG;AACH,MAAM,MAAM,8BAA8B,GAAG,CAAC,MAAM,OAAO,CAAC,GAAG,IAAI,GAAG,OAAO,UAAU,CAAC;AAUxF;;;;GAIG;AACH,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED;;;;;GAKG;AACH,MAAM,WAAW,qBAAqB;IACpC,qBAAqB,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,WAAW,GAAG,OAAO,CAAC;IACpE,wFAAwF;IACxF,kBAAkB,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,GAAG,SAAS,CAAC;IAC7D,oBAAoB,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC;IACnD,sBAAsB,CAAC,MAAM,EAAE,WAAW,GAAG,mBAAmB,GAAG,SAAS,CAAC;IAC7E,0FAA0F;IAC1F,qBAAqB,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,WAAW,GAAG,gCAAgC,GAAG,IAAI,CAAC;IACpG,wFAAwF;IACxF,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,eAAe,CAAC;IACtD,qFAAqF;IACrF,cAAc,CACZ,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,WAAW,EACnC,OAAO,EAAE,cAAc,GAAG,SAAS,EACnC,KAAK,EAAE,WAAW,EAClB,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC,EAC7B,eAAe,EAAE,KAAK,CAAC,eAAe,CAAC,GACtC,OAAO,CAAC;CACZ;AAED;;;;;GAKG;AACH,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,UAAU,GAAG,QAAQ,CAAC;AAExD;;GAEG;AACH,qBAAa,yBAAyB;;IAGpC,YAAY,IAAI,EAAE,qBAAqB,EAEtC;IAED,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG;QAAE,IAAI,EAAE,OAAO,GAAG,UAAU,CAAA;KAAE,GAAG,8BAA8B,CAIzF;CA+LF"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { NO_INSTANCE } from "#/binding";
|
|
2
|
+
import { AsyncResolutionError } from "#/errors";
|
|
3
|
+
import { injectionSlotToResolveOptions } from "#/resolution/resolve-options";
|
|
4
|
+
import { tokenName } from "#/token";
|
|
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
|
+
/**
|
|
15
|
+
* @since 0.3.16-canary.1
|
|
16
|
+
*/
|
|
17
|
+
export class InstantiationPlanCompiler {
|
|
18
|
+
#host;
|
|
19
|
+
constructor(host) {
|
|
20
|
+
this.#host = host;
|
|
21
|
+
}
|
|
22
|
+
compile(binding) {
|
|
23
|
+
return binding.kind === "class"
|
|
24
|
+
? this.#compileClassPlan(binding, new Set(), 0, [])
|
|
25
|
+
: this.#compileResolvedPlan(binding, new Set(), 0, []);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Re-entry into the runtime resolver for a dependency the plan can't see through.
|
|
29
|
+
*
|
|
30
|
+
* The ancestors are fixed at compile time, so the seeds are built once; each call copies
|
|
31
|
+
* them because the resolver pushes and pops on the arrays it is given.
|
|
32
|
+
*/
|
|
33
|
+
#compileEscapeThunk(token, ancestors, arity = "single", options) {
|
|
34
|
+
const host = this.#host;
|
|
35
|
+
const frames = ancestors.map((ancestor) => host.getResolutionFrame(ancestor));
|
|
36
|
+
const names = frames.map((frame) => frame.tokenName);
|
|
37
|
+
return () => host.resolveEscaped(token, options, arity, [...names], [...frames]);
|
|
38
|
+
}
|
|
39
|
+
// A resolved binding declares its deps as explicit descriptors — same rules as
|
|
40
|
+
// class params, with the factory call (and its sync-only check) in place of `new`.
|
|
41
|
+
#compileResolvedPlan(binding, compileStack, depth, ancestors) {
|
|
42
|
+
if (binding.onActivation !== undefined || this.#host.hasActivationHandlers(binding.token)) {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
const factory = binding.factory;
|
|
46
|
+
const tokenDisplayName = tokenName(binding.token);
|
|
47
|
+
const depThunks = new Array(binding.deps.length);
|
|
48
|
+
const depAncestors = [...ancestors, binding];
|
|
49
|
+
compileStack.add(binding.id);
|
|
50
|
+
try {
|
|
51
|
+
for (let index = 0; index < binding.deps.length; index += 1) {
|
|
52
|
+
const thunk = this.#compileInjectionThunk(binding.deps[index], compileStack, depth, depAncestors);
|
|
53
|
+
if (thunk === PLAN_RETRY) {
|
|
54
|
+
return thunk;
|
|
55
|
+
}
|
|
56
|
+
depThunks[index] = thunk;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
finally {
|
|
60
|
+
compileStack.delete(binding.id);
|
|
61
|
+
}
|
|
62
|
+
return () => {
|
|
63
|
+
const factoryResult = factory(...depThunks.map((thunk) => thunk()));
|
|
64
|
+
if (factoryResult instanceof Promise) {
|
|
65
|
+
throw new AsyncResolutionError(tokenDisplayName, tokenDisplayName);
|
|
66
|
+
}
|
|
67
|
+
return factoryResult;
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* One dependency of a plan node — a constructor param or a `toResolved` descriptor.
|
|
72
|
+
*
|
|
73
|
+
* @remarks Anything but a plain required single dependency escapes to the runtime path.
|
|
74
|
+
*/
|
|
75
|
+
#compileInjectionThunk(descriptor, compileStack, depth, ancestors) {
|
|
76
|
+
const token = descriptor.token;
|
|
77
|
+
const options = injectionSlotToResolveOptions(descriptor);
|
|
78
|
+
if (descriptor.multi) {
|
|
79
|
+
return this.#compileEscapeThunk(token, ancestors, "all", options);
|
|
80
|
+
}
|
|
81
|
+
if (descriptor.optional) {
|
|
82
|
+
return this.#compileEscapeThunk(token, ancestors, "optional", options);
|
|
83
|
+
}
|
|
84
|
+
if (options !== undefined) {
|
|
85
|
+
return this.#compileEscapeThunk(token, ancestors, "single", options);
|
|
86
|
+
}
|
|
87
|
+
const entry = this.#host.lookupDependencyEntry(token);
|
|
88
|
+
if (entry === null) {
|
|
89
|
+
return this.#compileEscapeThunk(token, ancestors);
|
|
90
|
+
}
|
|
91
|
+
return this.#compileDepThunk(entry, compileStack, depth, ancestors);
|
|
92
|
+
}
|
|
93
|
+
#compileClassPlan(binding, compileStack, depth, ancestors) {
|
|
94
|
+
if (binding.onActivation !== undefined || this.#host.hasActivationHandlers(binding.token)) {
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
const target = binding.target;
|
|
98
|
+
const hasPostConstruct = this.#host.knownPostConstruct(target);
|
|
99
|
+
if (hasPostConstruct === undefined) {
|
|
100
|
+
return PLAN_RETRY;
|
|
101
|
+
}
|
|
102
|
+
if (hasPostConstruct || this.#host.needsActiveContainer(target)) {
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
const invokable = target;
|
|
106
|
+
const meta = this.#host.getConstructorMetadata(target);
|
|
107
|
+
if (meta === undefined) {
|
|
108
|
+
// Metadata-less classes with required params throw on the runtime path — keep them there.
|
|
109
|
+
return target.length === 0 ? () => new invokable() : null;
|
|
110
|
+
}
|
|
111
|
+
const params = meta.params;
|
|
112
|
+
if (params.length === 0) {
|
|
113
|
+
return () => new invokable();
|
|
114
|
+
}
|
|
115
|
+
const depThunks = new Array(params.length);
|
|
116
|
+
const depAncestors = [...ancestors, binding];
|
|
117
|
+
compileStack.add(binding.id);
|
|
118
|
+
try {
|
|
119
|
+
for (let index = 0; index < params.length; index += 1) {
|
|
120
|
+
const thunk = this.#compileInjectionThunk(params[index], compileStack, depth, depAncestors);
|
|
121
|
+
if (thunk === PLAN_RETRY) {
|
|
122
|
+
return thunk;
|
|
123
|
+
}
|
|
124
|
+
depThunks[index] = thunk;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
finally {
|
|
128
|
+
compileStack.delete(binding.id);
|
|
129
|
+
}
|
|
130
|
+
switch (depThunks.length) {
|
|
131
|
+
case 1: {
|
|
132
|
+
const dep0 = depThunks[0];
|
|
133
|
+
return () => new invokable(dep0());
|
|
134
|
+
}
|
|
135
|
+
case 2: {
|
|
136
|
+
const dep0 = depThunks[0];
|
|
137
|
+
const dep1 = depThunks[1];
|
|
138
|
+
return () => new invokable(dep0(), dep1());
|
|
139
|
+
}
|
|
140
|
+
case 3: {
|
|
141
|
+
const dep0 = depThunks[0];
|
|
142
|
+
const dep1 = depThunks[1];
|
|
143
|
+
const dep2 = depThunks[2];
|
|
144
|
+
return () => new invokable(dep0(), dep1(), dep2());
|
|
145
|
+
}
|
|
146
|
+
default:
|
|
147
|
+
return () => new invokable(...depThunks.map((thunk) => thunk()));
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
#compileDepThunk(entry, compileStack, depth, ancestors) {
|
|
151
|
+
const { binding } = entry;
|
|
152
|
+
if (binding.kind === "constant" && binding.onActivation === undefined) {
|
|
153
|
+
if (!this.#host.hasActivationHandlers(binding.token)) {
|
|
154
|
+
const value = binding.value;
|
|
155
|
+
return () => value;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
const scope = binding.scope ?? "transient";
|
|
159
|
+
if (scope === "singleton") {
|
|
160
|
+
// Cached-singleton read; the first materialization escapes so it sees the same ancestors
|
|
161
|
+
// (and therefore the same cycle detection) the interpreted path would have built.
|
|
162
|
+
const escape = this.#compileEscapeThunk(binding.token, ancestors);
|
|
163
|
+
const singletonBinding = binding;
|
|
164
|
+
return () => {
|
|
165
|
+
const cached = singletonBinding.instance;
|
|
166
|
+
return cached === NO_INSTANCE ? escape() : cached;
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
if (scope === "transient" &&
|
|
170
|
+
binding.kind === "class" &&
|
|
171
|
+
depth < PLAN_DEPTH_LIMIT &&
|
|
172
|
+
!compileStack.has(binding.id)) {
|
|
173
|
+
const inlined = this.#compileClassPlan(binding, compileStack, depth + 1, ancestors);
|
|
174
|
+
if (inlined !== null) {
|
|
175
|
+
return inlined;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
// Anything opaque — a factory, a scoped binding, an activation hook, a class the compiler
|
|
179
|
+
// declined — runs on the runtime path, seeded with this plan's ancestors.
|
|
180
|
+
return this.#compileEscapeThunk(binding.token, ancestors);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=instantiation-plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instantiation-plan.js","sourceRoot":"","sources":["../../src/resolution/instantiation-plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,16 +6,18 @@ import type { ActivationHandler, Constructor, DeactivationHandler, ResolutionCon
|
|
|
6
6
|
* @since 0.3.16-canary.0
|
|
7
7
|
*/
|
|
8
8
|
export declare class LifecycleManager {
|
|
9
|
-
private
|
|
10
|
-
private readonly _deactivationHooks;
|
|
11
|
-
private _activationVersion;
|
|
9
|
+
#private;
|
|
12
10
|
registerActivation<const Value>(token: Token<Value> | Constructor<Value>, handler: ActivationHandler<Value>): void;
|
|
13
11
|
hasActivationHandlers<const Value>(token: Token<Value> | Constructor<Value>): boolean;
|
|
14
12
|
get activationVersion(): number;
|
|
13
|
+
/** Container-level activation handlers for a token — hot-path accessor, no copies. */
|
|
14
|
+
activationHandlersFor<const Value>(token: Token<Value> | Constructor<Value>): ReadonlyArray<ActivationHandler<unknown>> | undefined;
|
|
15
15
|
registerDeactivation<const Value>(token: Token<Value> | Constructor<Value>, handler: DeactivationHandler<Value>): void;
|
|
16
16
|
runActivation<const Value>(resolutionContext: ResolutionContext, binding: Binding<Value>, instance: Value, metadataReader: MetadataReader): Promise<Value>;
|
|
17
17
|
runActivationSync<const Value>(resolutionContext: ResolutionContext, binding: Binding<Value>, instance: Value, metadataReader: MetadataReader): Value;
|
|
18
18
|
runDeactivation<const Value>(binding: Binding<Value>, instance: Value, metadataReader: MetadataReader): Promise<void>;
|
|
19
19
|
runDeactivationSync<const Value>(binding: Binding<Value>, instance: Value, metadataReader: MetadataReader): void;
|
|
20
|
+
/** Whether the deferred table behind `#activationHooks` has had to be built. */
|
|
21
|
+
get isBuilt(): boolean;
|
|
20
22
|
}
|
|
21
23
|
//# sourceMappingURL=lifecycle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../src/resolution/lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAErC,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAEtG;;GAEG;AACH,qBAAa,gBAAgB;;IAO3B,kBAAkB,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,iBAAiB,CAAC,KAAK,CAAC,GAAG,IAAI,CAKjH;IAED,qBAAqB,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,OAAO,CAMpF;IAED,IAAI,iBAAiB,IAAI,MAAM,CAE9B;IAED,sFAAsF;IACtF,qBAAqB,CAAC,KAAK,CAAC,KAAK,EAC/B,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,GACvC,aAAa,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,GAAG,SAAS,CAEvD;IAED,oBAAoB,CAAC,KAAK,CAAC,KAAK,EAC9B,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,EACxC,OAAO,EAAE,mBAAmB,CAAC,KAAK,CAAC,GAClC,IAAI,CAGN;IAEK,aAAa,CAAC,KAAK,CAAC,KAAK,EAC7B,iBAAiB,EAAE,iBAAiB,EACpC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,EACvB,QAAQ,EAAE,KAAK,EACf,cAAc,EAAE,cAAc,GAC7B,OAAO,CAAC,KAAK,CAAC,CAmChB;IAED,iBAAiB,CAAC,KAAK,CAAC,KAAK,EAC3B,iBAAiB,EAAE,iBAAiB,EACpC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,EACvB,QAAQ,EAAE,KAAK,EACf,cAAc,EAAE,cAAc,GAC7B,KAAK,CA0CP;IAEK,eAAe,CAAC,KAAK,CAAC,KAAK,EAC/B,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,EACvB,QAAQ,EAAE,KAAK,EACf,cAAc,EAAE,cAAc,GAC7B,OAAO,CAAC,IAAI,CAAC,CAqCf;IAED,mBAAmB,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,cAAc,EAAE,cAAc,GAAG,IAAI,CAsC/G;IACD,gFAAgF;IAChF,IAAI,OAAO,IAAI,OAAO,CAErB;CACF"}
|
|
@@ -4,28 +4,33 @@ import { tokenName } from "#/token";
|
|
|
4
4
|
* @since 0.3.16-canary.0
|
|
5
5
|
*/
|
|
6
6
|
export class LifecycleManager {
|
|
7
|
-
// Container-level activation/deactivation hooks per token
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
7
|
+
// Container-level activation/deactivation hooks per token — most containers register none, so
|
|
8
|
+
// both tables stay unallocated until the first hook arrives.
|
|
9
|
+
#activationHooks;
|
|
10
|
+
#deactivationHooks;
|
|
11
|
+
#activationVersion = 0;
|
|
11
12
|
registerActivation(token, handler) {
|
|
12
|
-
this
|
|
13
|
+
this.#activationVersion += 1;
|
|
13
14
|
// ✓ TS6.0: Map.getOrInsert (ES2025)
|
|
14
|
-
const list = this.
|
|
15
|
+
const list = (this.#activationHooks ??= new Map()).getOrInsert(token, []);
|
|
15
16
|
list.push(handler);
|
|
16
17
|
}
|
|
17
18
|
hasActivationHandlers(token) {
|
|
18
|
-
if (this
|
|
19
|
+
if (this.#activationHooks === undefined) {
|
|
19
20
|
return false;
|
|
20
21
|
}
|
|
21
|
-
const list = this.
|
|
22
|
+
const list = this.#activationHooks.get(token);
|
|
22
23
|
return list !== undefined && list.length > 0;
|
|
23
24
|
}
|
|
24
25
|
get activationVersion() {
|
|
25
|
-
return this
|
|
26
|
+
return this.#activationVersion;
|
|
27
|
+
}
|
|
28
|
+
/** Container-level activation handlers for a token — hot-path accessor, no copies. */
|
|
29
|
+
activationHandlersFor(token) {
|
|
30
|
+
return this.#activationHooks?.get(token);
|
|
26
31
|
}
|
|
27
32
|
registerDeactivation(token, handler) {
|
|
28
|
-
const list = this.
|
|
33
|
+
const list = (this.#deactivationHooks ??= new Map()).getOrInsert(token, []);
|
|
29
34
|
list.push(handler);
|
|
30
35
|
}
|
|
31
36
|
async runActivation(resolutionContext, binding, instance, metadataReader) {
|
|
@@ -51,7 +56,7 @@ export class LifecycleManager {
|
|
|
51
56
|
activatedInstance = activationResult instanceof Promise ? await activationResult : activationResult;
|
|
52
57
|
}
|
|
53
58
|
// 3. container-level onActivation
|
|
54
|
-
const containerHooks = this
|
|
59
|
+
const containerHooks = this.#activationHooks?.get(binding.token);
|
|
55
60
|
if (containerHooks !== undefined) {
|
|
56
61
|
for (const hook of containerHooks) {
|
|
57
62
|
const activationResult = hook(resolutionContext, activatedInstance);
|
|
@@ -87,7 +92,7 @@ export class LifecycleManager {
|
|
|
87
92
|
}
|
|
88
93
|
// 3. container-level onActivation (must be sync)
|
|
89
94
|
const tokenDisplayName = tokenName(binding.token);
|
|
90
|
-
const containerHooks = this
|
|
95
|
+
const containerHooks = this.#activationHooks?.get(binding.token);
|
|
91
96
|
if (containerHooks !== undefined) {
|
|
92
97
|
for (const hook of containerHooks) {
|
|
93
98
|
const activationResult = hook(resolutionContext, activatedInstance);
|
|
@@ -102,7 +107,7 @@ export class LifecycleManager {
|
|
|
102
107
|
async runDeactivation(binding, instance, metadataReader) {
|
|
103
108
|
const tokenKey = binding.token;
|
|
104
109
|
// 1. container-level onDeactivation
|
|
105
|
-
const containerHooks = this
|
|
110
|
+
const containerHooks = this.#deactivationHooks?.get(tokenKey);
|
|
106
111
|
if (containerHooks !== undefined) {
|
|
107
112
|
for (const hook of containerHooks) {
|
|
108
113
|
const hookResult = hook(instance);
|
|
@@ -138,7 +143,7 @@ export class LifecycleManager {
|
|
|
138
143
|
const tokenDisplayName = tokenName(binding.token);
|
|
139
144
|
const tokenKey = binding.token;
|
|
140
145
|
// 1. container-level onDeactivation
|
|
141
|
-
const containerHooks = this
|
|
146
|
+
const containerHooks = this.#deactivationHooks?.get(tokenKey);
|
|
142
147
|
if (containerHooks !== undefined) {
|
|
143
148
|
for (const hook of containerHooks) {
|
|
144
149
|
const hookResult = hook(instance);
|
|
@@ -170,5 +175,9 @@ export class LifecycleManager {
|
|
|
170
175
|
}
|
|
171
176
|
}
|
|
172
177
|
}
|
|
178
|
+
/** Whether the deferred table behind `#activationHooks` has had to be built. */
|
|
179
|
+
get isBuilt() {
|
|
180
|
+
return this.#activationHooks !== undefined;
|
|
181
|
+
}
|
|
173
182
|
}
|
|
174
183
|
//# sourceMappingURL=lifecycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/resolution/lifecycle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where the cycle check switches from a linear `Array.includes` scan to an attached Set.
|
|
3
|
+
*
|
|
4
|
+
* @see `ARCHITECTURE.md` — the depth sweep this value comes from.
|
|
5
|
+
*
|
|
6
|
+
* @since 0.5.0-canary.7
|
|
7
|
+
*/
|
|
8
|
+
export declare const RESOLUTION_SET_THRESHOLD = 32;
|
|
9
|
+
/**
|
|
10
|
+
* Marks a token as in-flight on this path, throwing if it is already there.
|
|
11
|
+
*
|
|
12
|
+
* @remarks Unmark with `resolutionPath.pop()` plus `set?.delete(name)`, or {@link exitResolutionPath}.
|
|
13
|
+
*/
|
|
14
|
+
export declare function enterResolutionPath(resolutionPath: Array<string>, tokenDisplayName: string, forceSet: true): Set<string>;
|
|
15
|
+
export declare function enterResolutionPath(resolutionPath: Array<string>, tokenDisplayName: string, forceSet: boolean): Set<string> | undefined;
|
|
16
|
+
/**
|
|
17
|
+
* Unwinds the innermost {@link enterResolutionPath} entry, for callers that hold only the path.
|
|
18
|
+
*
|
|
19
|
+
* @since 0.5.0-canary.7
|
|
20
|
+
*/
|
|
21
|
+
export declare function exitResolutionPath(resolutionPath: Array<string>): void;
|
|
22
|
+
//# sourceMappingURL=resolution-path.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolution-path.d.ts","sourceRoot":"","sources":["../../src/resolution/resolution-path.ts"],"names":[],"mappings":"AAIA;;;;;;GAMG;AACH,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAG3C;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC,EAC7B,gBAAgB,EAAE,MAAM,EACxB,QAAQ,EAAE,IAAI,GACb,GAAG,CAAC,MAAM,CAAC,CAAC;AACf,wBAAgB,mBAAmB,CACjC,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC,EAC7B,gBAAgB,EAAE,MAAM,EACxB,QAAQ,EAAE,OAAO,GAChB,GAAG,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;AAuB3B;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,CAKtE"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/** Cycle-detection bookkeeping carried on the resolution path itself. */
|
|
2
|
+
import { CircularDependencyError } from "#/errors";
|
|
3
|
+
const RESOLUTION_SET_KEY = Symbol("di:resolution-set");
|
|
4
|
+
/**
|
|
5
|
+
* Where the cycle check switches from a linear `Array.includes` scan to an attached Set.
|
|
6
|
+
*
|
|
7
|
+
* @see `ARCHITECTURE.md` — the depth sweep this value comes from.
|
|
8
|
+
*
|
|
9
|
+
* @since 0.5.0-canary.7
|
|
10
|
+
*/
|
|
11
|
+
export const RESOLUTION_SET_THRESHOLD = 32;
|
|
12
|
+
/**
|
|
13
|
+
* @since 0.5.0-canary.7
|
|
14
|
+
*/
|
|
15
|
+
export function enterResolutionPath(resolutionPath, tokenDisplayName, forceSet) {
|
|
16
|
+
const pathWithSet = resolutionPath;
|
|
17
|
+
let resolutionSet = pathWithSet[RESOLUTION_SET_KEY];
|
|
18
|
+
if (resolutionSet === undefined && (forceSet || resolutionPath.length >= RESOLUTION_SET_THRESHOLD)) {
|
|
19
|
+
resolutionSet = new Set(resolutionPath);
|
|
20
|
+
pathWithSet[RESOLUTION_SET_KEY] = resolutionSet;
|
|
21
|
+
}
|
|
22
|
+
if (resolutionSet === undefined ? resolutionPath.includes(tokenDisplayName) : resolutionSet.has(tokenDisplayName)) {
|
|
23
|
+
throw new CircularDependencyError([...resolutionPath, tokenDisplayName]);
|
|
24
|
+
}
|
|
25
|
+
resolutionPath.push(tokenDisplayName);
|
|
26
|
+
resolutionSet?.add(tokenDisplayName);
|
|
27
|
+
return resolutionSet;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Unwinds the innermost {@link enterResolutionPath} entry, for callers that hold only the path.
|
|
31
|
+
*
|
|
32
|
+
* @since 0.5.0-canary.7
|
|
33
|
+
*/
|
|
34
|
+
export function exitResolutionPath(resolutionPath) {
|
|
35
|
+
const tokenDisplayName = resolutionPath.pop();
|
|
36
|
+
if (tokenDisplayName !== undefined) {
|
|
37
|
+
resolutionPath[RESOLUTION_SET_KEY]?.delete(tokenDisplayName);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=resolution-path.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolution-path.js","sourceRoot":"","sources":["../../src/resolution/resolution-path.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,OAAO,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC;AAEnD,MAAM,kBAAkB,GAAkB,MAAM,CAAC,mBAAmB,CAAC,CAAC;AACtE;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,CAAC;AAkB3C;;GAEG;AACH,MAAM,UAAU,mBAAmB,CACjC,cAA6B,EAC7B,gBAAwB,EACxB,QAAiB;IAEjB,MAAM,WAAW,GAAG,cAAuC,CAAC;IAC5D,IAAI,aAAa,GAAG,WAAW,CAAC,kBAAkB,CAAC,CAAC;IACpD,IAAI,aAAa,KAAK,SAAS,IAAI,CAAC,QAAQ,IAAI,cAAc,CAAC,MAAM,IAAI,wBAAwB,CAAC,EAAE,CAAC;QACnG,aAAa,GAAG,IAAI,GAAG,CAAS,cAAc,CAAC,CAAC;QAChD,WAAW,CAAC,kBAAkB,CAAC,GAAG,aAAa,CAAC;IAClD,CAAC;IACD,IAAI,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAClH,MAAM,IAAI,uBAAuB,CAAC,CAAC,GAAG,cAAc,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAC3E,CAAC;IACD,cAAc,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACtC,aAAa,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC;IACrC,OAAO,aAAa,CAAC;AACvB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,cAA6B;IAC9D,MAAM,gBAAgB,GAAG,cAAc,CAAC,GAAG,EAAE,CAAC;IAC9C,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;QAClC,cAAwC,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAC1F,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-options.d.ts","sourceRoot":"","sources":["../../src/resolution/resolve-options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAoB1D;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,aAAa,EAAE;IAC3D,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;CAC3C,GAAG,cAAc,GAAG,SAAS,CAE7B;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,WAAW,EAAE,WAAW,GAAG,cAAc,GAAG,SAAS,CAEhG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-options.js","sourceRoot":"","sources":["../../src/resolution/resolve-options.ts"],"names":[],"mappings":"AAGA,+EAA+E;AAC/E,SAAS,YAAY,CACnB,IAAwB,EACxB,IAA2C;IAE3C,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QAC7C,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,OAAO,GAAmB,EAAE,CAAC;IACnC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IACtB,CAAC;IACD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IACtB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,6BAA6B,CAAC,aAG7C;IACC,OAAO,YAAY,CAAC,aAAa,CAAC,IAAI,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC;AAC9D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,2BAA2B,CAAC,WAAwB;IAClE,OAAO,YAAY,CAAC,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;AACpG,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { Binding } from "#/binding";
|
|
2
|
+
import type { Container } from "#/container/container";
|
|
3
|
+
import type { MetadataReader } from "#/metadata/metadata-types";
|
|
4
|
+
import type { BindingRegistry } from "#/registry";
|
|
5
|
+
import type { ResolutionDiagnostics } from "#/resolution/diagnostics";
|
|
6
|
+
import type { ResolverCallbacks } from "#/resolution/environment";
|
|
7
|
+
import { DefaultResolutionContext } from "#/resolution/environment";
|
|
8
|
+
import type { LifecycleManager } from "#/resolution/lifecycle";
|
|
9
|
+
import type { ScopeManager } from "#/resolution/scope";
|
|
10
|
+
import type { Token } from "#/token";
|
|
11
|
+
import type { Constructor, ResolutionFrame, ResolveOptions } from "#/types";
|
|
12
|
+
/**
|
|
13
|
+
* @since 0.3.16-canary.0
|
|
14
|
+
*/
|
|
15
|
+
export declare class DependencyResolver implements ResolverCallbacks {
|
|
16
|
+
#private;
|
|
17
|
+
constructor(registry: BindingRegistry, scope: ScopeManager, lifecycle: LifecycleManager, metadataReader: MetadataReader, container: Container, parent: DependencyResolver | undefined);
|
|
18
|
+
/** Structural counts for {@link RESOLUTION_DIAGNOSTICS}; see `resolution/diagnostics.ts`. */
|
|
19
|
+
describeCaches(): Pick<ResolutionDiagnostics, "asyncContextPoolSize" | "compiledPlanCount" | "syncContextPoolSize">;
|
|
20
|
+
/**
|
|
21
|
+
* Binding lookup aligned with `resolve` — used by `Container.validate` without instantiating.
|
|
22
|
+
*/
|
|
23
|
+
peekBindingForValidate(token: Token<unknown> | Constructor, options: ResolveOptions | undefined): {
|
|
24
|
+
binding: Binding;
|
|
25
|
+
owner: DependencyResolver;
|
|
26
|
+
} | undefined;
|
|
27
|
+
/**
|
|
28
|
+
* Mirrors {@link DependencyResolver.resolveAll} candidate selection only (no instantiation).
|
|
29
|
+
*/
|
|
30
|
+
peekCandidateBindingsForValidate(token: Token<unknown> | Constructor, options: ResolveOptions | undefined): Array<Binding>;
|
|
31
|
+
resolveFromContext<const Value>(token: Token<Value> | Constructor<Value>, resolutionPath: Array<string>, resolutionStack: Array<ResolutionFrame>): Value;
|
|
32
|
+
resolve<const Value>(token: Token<Value> | Constructor<Value>, options: ResolveOptions | undefined, resolutionPath: Array<string>, resolutionStack: Array<ResolutionFrame>): Value;
|
|
33
|
+
resolveOptional<const Value>(token: Token<Value> | Constructor<Value>, options: ResolveOptions | undefined, resolutionPath: Array<string>, resolutionStack: Array<ResolutionFrame>): Value | undefined;
|
|
34
|
+
resolveAll<const Value>(token: Token<Value> | Constructor<Value>, options: ResolveOptions | undefined, resolutionPath: Array<string>, resolutionStack: Array<ResolutionFrame>): Array<Value>;
|
|
35
|
+
resolveAsyncFromContext<const Value>(token: Token<Value> | Constructor<Value>, resolutionPath: Array<string>, resolutionStack: Array<ResolutionFrame>, callerContext?: DefaultResolutionContext): Promise<Value>;
|
|
36
|
+
resolveAsync<const Value>(token: Token<Value> | Constructor<Value>, options: ResolveOptions | undefined, resolutionPath: Array<string>, resolutionStack: Array<ResolutionFrame>): Promise<Value>;
|
|
37
|
+
resolveOptionalAsync<const Value>(token: Token<Value> | Constructor<Value>, options: ResolveOptions | undefined, resolutionPath: Array<string>, resolutionStack: Array<ResolutionFrame>): Promise<Value | undefined>;
|
|
38
|
+
resolveAllAsync<const Value>(token: Token<Value> | Constructor<Value>, options: ResolveOptions | undefined, resolutionPath: Array<string>, resolutionStack: Array<ResolutionFrame>): Promise<Array<Value>>;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/resolution/resolver.ts"],"names":[],"mappings":"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"}
|