@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
|
@@ -1,98 +0,0 @@
|
|
|
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
|
-
* Marks a token as in-flight on this path, throwing if it is already there.
|
|
14
|
-
*
|
|
15
|
-
* @remarks Unmark with `resolutionPath.pop()` plus `set?.delete(name)`. Sync only — the async lane
|
|
16
|
-
* never removes an entry, so it extends a branch instead; see {@link extendResolutionBranch}.
|
|
17
|
-
*
|
|
18
|
-
* @returns the membership set once the path is deep enough to carry one, else `undefined`.
|
|
19
|
-
*
|
|
20
|
-
* @since 0.5.0-canary.7
|
|
21
|
-
*/
|
|
22
|
-
export function enterResolutionPath(resolutionPath, tokenDisplayName) {
|
|
23
|
-
const pathWithSet = resolutionPath;
|
|
24
|
-
let resolutionSet = pathWithSet[RESOLUTION_SET_KEY];
|
|
25
|
-
if (resolutionSet === undefined && resolutionPath.length >= RESOLUTION_SET_THRESHOLD) {
|
|
26
|
-
resolutionSet = new Set(resolutionPath);
|
|
27
|
-
pathWithSet[RESOLUTION_SET_KEY] = resolutionSet;
|
|
28
|
-
}
|
|
29
|
-
if (resolutionSet === undefined ? resolutionPath.includes(tokenDisplayName) : resolutionSet.has(tokenDisplayName)) {
|
|
30
|
-
throw new CircularDependencyError([...resolutionPath, tokenDisplayName]);
|
|
31
|
-
}
|
|
32
|
-
resolutionPath.push(tokenDisplayName);
|
|
33
|
-
resolutionSet?.add(tokenDisplayName);
|
|
34
|
-
return resolutionSet;
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* A path no async branch owns yet, so its first extension must copy rather than append.
|
|
38
|
-
*
|
|
39
|
-
* @since 0.5.0-canary.9
|
|
40
|
-
*/
|
|
41
|
-
export const UNOWNED_BRANCH = -1;
|
|
42
|
-
/**
|
|
43
|
-
* The depth a chain's first level extends from, over an array its caller just minted.
|
|
44
|
-
*
|
|
45
|
-
* @since 0.5.0-canary.9
|
|
46
|
-
*/
|
|
47
|
-
export const ROOT_BRANCH = 0;
|
|
48
|
-
/**
|
|
49
|
-
* A branch's own depth: the length its path had when this level took it.
|
|
50
|
-
*
|
|
51
|
-
* @since 0.5.0-canary.9
|
|
52
|
-
*/
|
|
53
|
-
export function branchDepthOf(branch) {
|
|
54
|
-
return branch.length;
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* Extends one branch of an append-only path, throwing if the entry is already an ancestor.
|
|
58
|
-
*
|
|
59
|
-
* @remarks Appends in place while this branch still owns the next slot, and copies its own prefix
|
|
60
|
-
* once a sibling has claimed it. Nothing is ever removed, so no async level has to observe its own
|
|
61
|
-
* settlement to unwind — see `ARCHITECTURE.md`.
|
|
62
|
-
*
|
|
63
|
-
* @since 0.5.0-canary.9
|
|
64
|
-
*/
|
|
65
|
-
export function extendResolutionBranch(resolutionPath, branchDepth, tokenDisplayName) {
|
|
66
|
-
const depth = branchDepth === UNOWNED_BRANCH ? resolutionPath.length : branchDepth;
|
|
67
|
-
for (let index = 0; index < depth; index += 1) {
|
|
68
|
-
if (resolutionPath[index] === tokenDisplayName) {
|
|
69
|
-
throw new CircularDependencyError([...resolutionPath.slice(0, depth), tokenDisplayName]);
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
// An unowned array belongs to a sync frame that will pop it, or carries a membership Set this
|
|
73
|
-
// lane cannot keep true; copying is what makes the branch's own appends safe.
|
|
74
|
-
if (branchDepth === resolutionPath.length) {
|
|
75
|
-
// The sole mint: appending in place needs a depth that came from a branch already owned, or
|
|
76
|
-
// ROOT_BRANCH over an array its caller minted for this chain alone.
|
|
77
|
-
resolutionPath.push(tokenDisplayName);
|
|
78
|
-
return resolutionPath;
|
|
79
|
-
}
|
|
80
|
-
const branch = resolutionPath.slice(0, depth);
|
|
81
|
-
branch.push(tokenDisplayName);
|
|
82
|
-
return branch;
|
|
83
|
-
}
|
|
84
|
-
/**
|
|
85
|
-
* The stack half of {@link extendResolutionBranch}; frames carry no cycle to detect.
|
|
86
|
-
*
|
|
87
|
-
* @since 0.5.0-canary.9
|
|
88
|
-
*/
|
|
89
|
-
export function extendResolutionStackBranch(resolutionStack, branchDepth, frame) {
|
|
90
|
-
if (branchDepth === resolutionStack.length) {
|
|
91
|
-
resolutionStack.push(frame);
|
|
92
|
-
return resolutionStack;
|
|
93
|
-
}
|
|
94
|
-
const branch = resolutionStack.slice(0, branchDepth === UNOWNED_BRANCH ? resolutionStack.length : branchDepth);
|
|
95
|
-
branch.push(frame);
|
|
96
|
-
return branch;
|
|
97
|
-
}
|
|
98
|
-
//# sourceMappingURL=resolution-path.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"resolution-path.js","sourceRoot":"","sources":["../../src/resolution/resolution-path.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"resolve-options.d.ts","sourceRoot":"","sources":["../../src/resolution/resolve-options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEvE;;;;;;;GAOG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,WAAW,CAAC;IAC7C,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;CAC3C;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,IAAI,cAAc,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAIvG;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,cAAc,GAAG,UAAU,GAAG,SAAS,CAK/E;AAoBD;;;;;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;;;;;;;;GAQG;AACH,wBAAgB,2BAA2B,CAAC,WAAW,EAAE;IACvD,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;CAC1C,GAAG,cAAc,GAAG,SAAS,CAE7B"}
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* A request whose only criterion is a name — the shape the registry has a direct index for.
|
|
3
|
-
*
|
|
4
|
-
* @since 0.5.0-canary.9
|
|
5
|
-
*/
|
|
6
|
-
export function isNameOnlyOptions(options) {
|
|
7
|
-
return (options.name !== undefined && options.tag === undefined && (options.tags === undefined || options.tags.length === 0));
|
|
8
|
-
}
|
|
9
|
-
/**
|
|
10
|
-
* The lone entry of a request whose only criterion is a one-element `tags` list — the shape the
|
|
11
|
-
* registry has a direct tag index for.
|
|
12
|
-
*
|
|
13
|
-
* @since 0.5.0-canary.9
|
|
14
|
-
*/
|
|
15
|
-
export function singleTagOnlyOf(options) {
|
|
16
|
-
if (options.name !== undefined || options.tag !== undefined) {
|
|
17
|
-
return undefined;
|
|
18
|
-
}
|
|
19
|
-
return options.tags !== undefined && options.tags.length === 1 ? options.tags[0] : undefined;
|
|
20
|
-
}
|
|
21
|
-
/** Shared core: build a ResolveOptions from already-normalised name + tags. */
|
|
22
|
-
function buildOptions(name, tags) {
|
|
23
|
-
if (name === undefined && tags === undefined) {
|
|
24
|
-
return undefined;
|
|
25
|
-
}
|
|
26
|
-
const options = {};
|
|
27
|
-
if (name !== undefined) {
|
|
28
|
-
options.name = name;
|
|
29
|
-
}
|
|
30
|
-
if (tags !== undefined) {
|
|
31
|
-
options.tags = tags;
|
|
32
|
-
}
|
|
33
|
-
return options;
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* Builds a {@link ResolveOptions} safe for `exactOptionalPropertyTypes`:
|
|
37
|
-
* omits keys instead of assigning `undefined`.
|
|
38
|
-
*
|
|
39
|
-
* @since 0.3.16-canary.0
|
|
40
|
-
*/
|
|
41
|
-
export function injectionSlotToResolveOptions(injectionSlot) {
|
|
42
|
-
return buildOptions(injectionSlot.name, injectionSlot.tags);
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* Resolve options derived from a binding slot (tags may be empty; omits when nothing to match).
|
|
46
|
-
*
|
|
47
|
-
* @remarks Takes the slot structurally rather than as `BindingSlot`, so the slot on a public
|
|
48
|
-
* `BindingSnapshot` — where `name` is an optional property, not a required one holding `undefined` —
|
|
49
|
-
* is accepted by the same call.
|
|
50
|
-
*
|
|
51
|
-
* @since 0.3.16-canary.0
|
|
52
|
-
*/
|
|
53
|
-
export function bindingSlotToResolveOptions(bindingSlot) {
|
|
54
|
-
return buildOptions(bindingSlot.name, bindingSlot.tags.length > 0 ? bindingSlot.tags : undefined);
|
|
55
|
-
}
|
|
56
|
-
//# sourceMappingURL=resolve-options.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"resolve-options.js","sourceRoot":"","sources":["../../src/resolution/resolve-options.ts"],"names":[],"mappings":"AAmBA;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAuB;IACvD,OAAO,CACL,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,CAAC,GAAG,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CACrH,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,OAAuB;IACrD,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;QAC5D,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC/F,CAAC;AAED,+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;;;;;;;;GAQG;AACH,MAAM,UAAU,2BAA2B,CAAC,WAG3C;IACC,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"}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import type { Binding } from "#/binding";
|
|
2
|
-
import type { BindingIdentifier } from "#/types";
|
|
3
|
-
/**
|
|
4
|
-
* @since 0.3.16-canary.0
|
|
5
|
-
*/
|
|
6
|
-
export declare class ScopeManager {
|
|
7
|
-
#private;
|
|
8
|
-
readonly isChild: boolean;
|
|
9
|
-
constructor(isChild?: boolean);
|
|
10
|
-
setSingleton<const Value>(binding: Binding<Value>, instance: unknown): void;
|
|
11
|
-
/** Every binding in this container holding a cached singleton. */
|
|
12
|
-
cachedSingletons(): ReadonlyArray<Binding<unknown>>;
|
|
13
|
-
deleteSingleton<const Value>(binding: Binding<Value>): boolean;
|
|
14
|
-
getInflight(id: BindingIdentifier): Promise<unknown> | undefined;
|
|
15
|
-
setInflight(id: BindingIdentifier, p: Promise<unknown>): void;
|
|
16
|
-
clearInflight(id: BindingIdentifier): void;
|
|
17
|
-
hasScoped(id: BindingIdentifier): boolean;
|
|
18
|
-
getScoped<Value>(id: BindingIdentifier): Value;
|
|
19
|
-
setScoped(id: BindingIdentifier, instance: unknown): void;
|
|
20
|
-
/** Releases a removed binding's scoped instance — no deactivation, per SPEC §5.2. */
|
|
21
|
-
deleteScoped(id: BindingIdentifier): void;
|
|
22
|
-
/** Scoped instances currently cached — a structural count for diagnostics. */
|
|
23
|
-
get scopedCount(): number;
|
|
24
|
-
clearAll(): void;
|
|
25
|
-
/** Whether the deferred table behind `#scoped` has had to be built. */
|
|
26
|
-
get isBuilt(): boolean;
|
|
27
|
-
}
|
|
28
|
-
//# sourceMappingURL=scope.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../../src/resolution/scope.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGzC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAEjD;;GAEG;AACH,qBAAa,YAAY;;IASvB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAE1B,YAAY,OAAO,UAAQ,EAE1B;IAED,YAAY,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI,CAK1E;IAED,kEAAkE;IAClE,gBAAgB,IAAI,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAElD;IAED,eAAe,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,OAAO,CAa7D;IAED,WAAW,CAAC,EAAE,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,SAAS,CAE/D;IAED,WAAW,CAAC,EAAE,EAAE,iBAAiB,EAAE,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAE5D;IAED,aAAa,CAAC,EAAE,EAAE,iBAAiB,GAAG,IAAI,CAEzC;IAED,SAAS,CAAC,EAAE,EAAE,iBAAiB,GAAG,OAAO,CAExC;IAED,SAAS,CAAC,KAAK,EAAE,EAAE,EAAE,iBAAiB,GAAG,KAAK,CAE7C;IAED,SAAS,CAAC,EAAE,EAAE,iBAAiB,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI,CAKxD;IAED,qFAAqF;IACrF,YAAY,CAAC,EAAE,EAAE,iBAAiB,GAAG,IAAI,CAExC;IAED,8EAA8E;IAC9E,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,QAAQ,IAAI,IAAI,CAUf;IACD,uEAAuE;IACvE,IAAI,OAAO,IAAI,OAAO,CAErB;CACF"}
|
package/dist/resolution/scope.js
DELETED
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
import { NO_INSTANCE } from "#/binding";
|
|
2
|
-
import { MissingScopeContextError } from "#/errors";
|
|
3
|
-
/**
|
|
4
|
-
* @since 0.3.16-canary.0
|
|
5
|
-
*/
|
|
6
|
-
export class ScopeManager {
|
|
7
|
-
// Instances live on their binding (see ARCHITECTURE.md); this list only lets disposal and
|
|
8
|
-
// `inspect()` enumerate them.
|
|
9
|
-
#singletonBindings;
|
|
10
|
-
// In-flight promises for async singleton creation — only an async resolve ever needs it.
|
|
11
|
-
#inflight;
|
|
12
|
-
// Scoped cache — only a child container resolving a `scoped` binding ever needs it.
|
|
13
|
-
#scoped;
|
|
14
|
-
isChild;
|
|
15
|
-
constructor(isChild = false) {
|
|
16
|
-
this.isChild = isChild;
|
|
17
|
-
}
|
|
18
|
-
setSingleton(binding, instance) {
|
|
19
|
-
if (binding.instance === NO_INSTANCE) {
|
|
20
|
-
(this.#singletonBindings ??= []).push(binding);
|
|
21
|
-
}
|
|
22
|
-
binding.instance = instance;
|
|
23
|
-
}
|
|
24
|
-
/** Every binding in this container holding a cached singleton. */
|
|
25
|
-
cachedSingletons() {
|
|
26
|
-
return this.#singletonBindings ?? EMPTY_BINDINGS;
|
|
27
|
-
}
|
|
28
|
-
deleteSingleton(binding) {
|
|
29
|
-
if (binding.instance === NO_INSTANCE) {
|
|
30
|
-
return false;
|
|
31
|
-
}
|
|
32
|
-
binding.instance = NO_INSTANCE;
|
|
33
|
-
const tracked = this.#singletonBindings;
|
|
34
|
-
if (tracked !== undefined) {
|
|
35
|
-
const index = tracked.indexOf(binding);
|
|
36
|
-
if (index !== -1) {
|
|
37
|
-
tracked.splice(index, 1);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
return true;
|
|
41
|
-
}
|
|
42
|
-
getInflight(id) {
|
|
43
|
-
return this.#inflight?.get(id);
|
|
44
|
-
}
|
|
45
|
-
setInflight(id, p) {
|
|
46
|
-
(this.#inflight ??= new Map()).set(id, p);
|
|
47
|
-
}
|
|
48
|
-
clearInflight(id) {
|
|
49
|
-
this.#inflight?.delete(id);
|
|
50
|
-
}
|
|
51
|
-
hasScoped(id) {
|
|
52
|
-
return this.#scoped !== undefined && this.#scoped.has(id);
|
|
53
|
-
}
|
|
54
|
-
getScoped(id) {
|
|
55
|
-
return this.#scoped?.get(id);
|
|
56
|
-
}
|
|
57
|
-
setScoped(id, instance) {
|
|
58
|
-
if (!this.isChild) {
|
|
59
|
-
throw new MissingScopeContextError("(unknown)");
|
|
60
|
-
}
|
|
61
|
-
(this.#scoped ??= new Map()).set(id, instance);
|
|
62
|
-
}
|
|
63
|
-
/** Releases a removed binding's scoped instance — no deactivation, per SPEC §5.2. */
|
|
64
|
-
deleteScoped(id) {
|
|
65
|
-
this.#scoped?.delete(id);
|
|
66
|
-
}
|
|
67
|
-
/** Scoped instances currently cached — a structural count for diagnostics. */
|
|
68
|
-
get scopedCount() {
|
|
69
|
-
return this.#scoped?.size ?? 0;
|
|
70
|
-
}
|
|
71
|
-
clearAll() {
|
|
72
|
-
const tracked = this.#singletonBindings;
|
|
73
|
-
if (tracked !== undefined) {
|
|
74
|
-
for (const binding of tracked) {
|
|
75
|
-
binding.instance = NO_INSTANCE;
|
|
76
|
-
}
|
|
77
|
-
tracked.length = 0;
|
|
78
|
-
}
|
|
79
|
-
this.#inflight?.clear();
|
|
80
|
-
this.#scoped?.clear();
|
|
81
|
-
}
|
|
82
|
-
/** Whether the deferred table behind `#scoped` has had to be built. */
|
|
83
|
-
get isBuilt() {
|
|
84
|
-
return this.#scoped !== undefined;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
const EMPTY_BINDINGS = [];
|
|
88
|
-
//# sourceMappingURL=scope.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scope.js","sourceRoot":"","sources":["../../src/resolution/scope.ts"],"names":[],"mappings":"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"}
|
package/dist/token.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../src/token.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,CAAC,MAAM,WAAW,EAAE,OAAO,MAAM,CAAC;AAEzC;;GAEG;AACH,MAAM,WAAW,KAAK,CAAC,KAAK;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,CAAC,WAAW,CAAC,EAAE,KAAK,CAAC;CAC/B;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,CAEvD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,WAAW,GAAG,MAAM,CAE1E;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,CAO/D"}
|
package/dist/token.js
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @since 0.3.16-canary.0
|
|
3
|
-
*/
|
|
4
|
-
export function token(name) {
|
|
5
|
-
return { name };
|
|
6
|
-
}
|
|
7
|
-
/**
|
|
8
|
-
* @since 0.3.16-canary.0
|
|
9
|
-
*/
|
|
10
|
-
export function tokenName(dependency) {
|
|
11
|
-
return dependency.name;
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* @since 0.3.16-canary.0
|
|
15
|
-
*/
|
|
16
|
-
export function isToken(value) {
|
|
17
|
-
return (typeof value === "object" &&
|
|
18
|
-
value !== null &&
|
|
19
|
-
"name" in value &&
|
|
20
|
-
typeof value["name"] === "string");
|
|
21
|
-
}
|
|
22
|
-
//# sourceMappingURL=token.js.map
|
package/dist/token.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"token.js","sourceRoot":"","sources":["../src/token.ts"],"names":[],"mappings":"AAYA;;GAEG;AACH,MAAM,UAAU,KAAK,CAAQ,IAAY;IACvC,OAAO,EAAE,IAAI,EAAkB,CAAC;AAClC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,UAAwC;IAChE,OAAO,UAAU,CAAC,IAAI,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,KAAc;IACpC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,MAAM,IAAI,KAAK;QACf,OAAQ,KAAiC,CAAC,MAAM,CAAC,KAAK,QAAQ,CAC/D,CAAC;AACJ,CAAC"}
|
package/dist/types.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/src/registry.ts
DELETED
|
@@ -1,282 +0,0 @@
|
|
|
1
|
-
import type { Binding } from "#/binding";
|
|
2
|
-
import { bindingSlotEquals, bindingSlotToString } from "#/binding";
|
|
3
|
-
import type { Token } from "#/token";
|
|
4
|
-
import type { BindingIdentifier, BindingTag, Constructor, DependencyKey } from "#/types";
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* @since 0.3.16-canary.0
|
|
8
|
-
*/
|
|
9
|
-
export class BindingRegistry {
|
|
10
|
-
// Monotonic mutation counter — lets resolvers version-stamp lookup caches across a container chain.
|
|
11
|
-
#version = 0;
|
|
12
|
-
// Map from token key -> array of bindings (order matters for last-wins)
|
|
13
|
-
readonly #bindings = new Map<DependencyKey, Array<Binding>>();
|
|
14
|
-
// Fast lookup by binding ID
|
|
15
|
-
readonly #byId = new Map<BindingIdentifier, Binding>();
|
|
16
|
-
// Fast lookup for slot { name, tags: [] } — unallocated until a named binding is registered.
|
|
17
|
-
#simpleNamed: Map<DependencyKey, Map<string, Binding>> | undefined;
|
|
18
|
-
// Fast path for one default slot binding with no predicate
|
|
19
|
-
readonly #fastDefault = new Map<DependencyKey, Binding>();
|
|
20
|
-
// Fast lookup for slot { name: undefined, tags: [[key, value]] } with no predicate — likewise
|
|
21
|
-
// unallocated until a tagged binding is registered.
|
|
22
|
-
#simpleTagged: Map<DependencyKey, Map<string, Map<unknown, Binding>>> | undefined;
|
|
23
|
-
|
|
24
|
-
/** Monotonic version — increments on every mutation. */
|
|
25
|
-
get version(): number {
|
|
26
|
-
return this.#version;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Registers a mutation the indexes don't care about (a fluent chain refining scope or an
|
|
31
|
-
* activation hook in place), so version-stamped resolver caches still invalidate.
|
|
32
|
-
*/
|
|
33
|
-
touch(): void {
|
|
34
|
-
this.#version += 1;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* Add or replace binding using slot-aware last-wins. Returns the displaced binding, if any.
|
|
39
|
-
*
|
|
40
|
-
* @remarks The binding is stored by reference — it must come from `createBinding`, which is
|
|
41
|
-
* what guarantees the single hidden class the resolver's hot reads depend on.
|
|
42
|
-
*/
|
|
43
|
-
add(binding: Binding): Binding | undefined {
|
|
44
|
-
this.#version += 1;
|
|
45
|
-
const key = binding.token as DependencyKey;
|
|
46
|
-
// Eager, not computed: a bind is usually the token's first, so the fallback is usually the
|
|
47
|
-
// one that gets stored — and the computed form would add a call to allocating it anyway.
|
|
48
|
-
const bindingsForToken = this.#bindings.getOrInsert(key, []);
|
|
49
|
-
|
|
50
|
-
// Only apply last-wins for slot-based bindings (not predicate-only)
|
|
51
|
-
let displacedBinding: Binding | undefined;
|
|
52
|
-
if (!isPurePredicateBinding(binding)) {
|
|
53
|
-
const existingIndex = bindingsForToken.findIndex(
|
|
54
|
-
(candidate) => !isPurePredicateBinding(candidate) && bindingSlotEquals(candidate.slot, binding.slot),
|
|
55
|
-
);
|
|
56
|
-
if (existingIndex !== -1) {
|
|
57
|
-
displacedBinding = bindingsForToken[existingIndex]!;
|
|
58
|
-
this.#byId.delete(displacedBinding.id);
|
|
59
|
-
bindingsForToken.splice(existingIndex, 1);
|
|
60
|
-
this.#deindexSimpleNamedBinding(key, displacedBinding);
|
|
61
|
-
this.#deindexSimpleTaggedBinding(key, displacedBinding);
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
bindingsForToken.push(binding);
|
|
66
|
-
this.#byId.set(binding.id, binding);
|
|
67
|
-
this.#indexSimpleNamedBinding(key, binding);
|
|
68
|
-
this.#indexSimpleTaggedBinding(key, binding);
|
|
69
|
-
this.#refreshFastDefaultForToken(key);
|
|
70
|
-
return displacedBinding;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
/** Remove all bindings for a token. Returns removed bindings. */
|
|
74
|
-
removeByToken(token: Token<unknown> | Constructor): Array<Binding> {
|
|
75
|
-
this.#version += 1;
|
|
76
|
-
const key = token as DependencyKey;
|
|
77
|
-
const bindingsForToken = this.#bindings.get(key) ?? [];
|
|
78
|
-
this.#bindings.delete(key);
|
|
79
|
-
this.#simpleNamed?.delete(key);
|
|
80
|
-
this.#simpleTagged?.delete(key);
|
|
81
|
-
this.#fastDefault.delete(key);
|
|
82
|
-
for (const binding of bindingsForToken) {
|
|
83
|
-
this.#byId.delete(binding.id);
|
|
84
|
-
}
|
|
85
|
-
return bindingsForToken;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
/** Remove a specific binding by ID. Returns the removed binding or undefined. */
|
|
89
|
-
removeById(id: BindingIdentifier): Binding | undefined {
|
|
90
|
-
const binding = this.#byId.get(id);
|
|
91
|
-
if (binding === undefined) {
|
|
92
|
-
return undefined;
|
|
93
|
-
}
|
|
94
|
-
this.#version += 1;
|
|
95
|
-
this.#byId.delete(id);
|
|
96
|
-
const key = binding.token as DependencyKey;
|
|
97
|
-
const bindingsForToken = this.#bindings.get(key);
|
|
98
|
-
if (bindingsForToken !== undefined) {
|
|
99
|
-
const bindingIndex = bindingsForToken.findIndex((candidate) => candidate.id === id);
|
|
100
|
-
if (bindingIndex !== -1) {
|
|
101
|
-
bindingsForToken.splice(bindingIndex, 1);
|
|
102
|
-
}
|
|
103
|
-
this.#deindexSimpleNamedBinding(key, binding);
|
|
104
|
-
this.#deindexSimpleTaggedBinding(key, binding);
|
|
105
|
-
if (bindingsForToken.length === 0) {
|
|
106
|
-
this.#bindings.delete(key);
|
|
107
|
-
this.#simpleNamed?.delete(key);
|
|
108
|
-
this.#simpleTagged?.delete(key);
|
|
109
|
-
this.#fastDefault.delete(key);
|
|
110
|
-
} else {
|
|
111
|
-
this.#refreshFastDefaultForToken(key);
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
return binding;
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
/** Get all bindings for a token. */
|
|
118
|
-
getAll(token: Token<unknown> | Constructor): ReadonlyArray<Binding> {
|
|
119
|
-
return this.#bindings.get(token as DependencyKey) ?? [];
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
/** Get binding by ID. */
|
|
123
|
-
getById(id: BindingIdentifier): Binding | undefined {
|
|
124
|
-
return this.#byId.get(id);
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
/** Check if any binding exists for token. */
|
|
128
|
-
has(token: Token<unknown> | Constructor): boolean {
|
|
129
|
-
const key = token as DependencyKey;
|
|
130
|
-
const list = this.#bindings.get(key);
|
|
131
|
-
return list !== undefined && list.length > 0;
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
/** All bindings in the registry. */
|
|
135
|
-
allBindings(): ReadonlyArray<Binding> {
|
|
136
|
-
const allBindings: Array<Binding> = [];
|
|
137
|
-
for (const bindingsForToken of this.#bindings.values()) {
|
|
138
|
-
allBindings.push(...bindingsForToken);
|
|
139
|
-
}
|
|
140
|
-
return allBindings;
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
/** Remove all bindings. Returns all removed. */
|
|
144
|
-
clear(): ReadonlyArray<Binding> {
|
|
145
|
-
this.#version += 1;
|
|
146
|
-
const all = this.allBindings();
|
|
147
|
-
this.#bindings.clear();
|
|
148
|
-
this.#byId.clear();
|
|
149
|
-
this.#simpleNamed?.clear();
|
|
150
|
-
this.#simpleTagged?.clear();
|
|
151
|
-
this.#fastDefault.clear();
|
|
152
|
-
return all;
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
getSimpleNamed(token: Token<unknown> | Constructor, name: string): Binding | undefined {
|
|
156
|
-
return this.#simpleNamed?.get(token as DependencyKey)?.get(name);
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
getSimpleTagged(token: Token<unknown> | Constructor, tagKey: string, tagValue: unknown): Binding | undefined {
|
|
160
|
-
return this.#simpleTagged
|
|
161
|
-
?.get(token as DependencyKey)
|
|
162
|
-
?.get(tagKey)
|
|
163
|
-
?.get(tagValue);
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
getFastDefault(token: Token<unknown> | Constructor): Binding | undefined {
|
|
167
|
-
return this.#fastDefault.get(token as DependencyKey);
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
/** Summarize available slot strings for a token (for error messages). */
|
|
171
|
-
availableSlotStrings(token: Token<unknown> | Constructor): Array<string> {
|
|
172
|
-
const bindingsForToken = this.#bindings.get(token as DependencyKey) ?? [];
|
|
173
|
-
return bindingsForToken.map((binding) => bindingSlotToString(binding.slot));
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
#indexSimpleTaggedBinding(tokenKey: DependencyKey, binding: Binding): void {
|
|
177
|
-
const tag = simpleTagOf(binding);
|
|
178
|
-
if (tag === undefined) {
|
|
179
|
-
return;
|
|
180
|
-
}
|
|
181
|
-
const [tagKey, tagValue] = tag;
|
|
182
|
-
const byTagKey = (this.#simpleTagged ??= new Map()).getOrInsert(tokenKey, new Map<string, Map<unknown, Binding>>());
|
|
183
|
-
const byTagValue = byTagKey.getOrInsert(tagKey, new Map<unknown, Binding>());
|
|
184
|
-
byTagValue.set(tagValue, binding);
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
#deindexSimpleTaggedBinding(tokenKey: DependencyKey, binding: Binding): void {
|
|
188
|
-
const tag = simpleTagOf(binding);
|
|
189
|
-
if (tag === undefined) {
|
|
190
|
-
return;
|
|
191
|
-
}
|
|
192
|
-
const [tagKey, tagValue] = tag;
|
|
193
|
-
const byTagKey = this.#simpleTagged?.get(tokenKey);
|
|
194
|
-
if (byTagKey === undefined) {
|
|
195
|
-
return;
|
|
196
|
-
}
|
|
197
|
-
const byTagValue = byTagKey.get(tagKey);
|
|
198
|
-
if (byTagValue === undefined) {
|
|
199
|
-
return;
|
|
200
|
-
}
|
|
201
|
-
const current = byTagValue.get(tagValue);
|
|
202
|
-
if (current?.id === binding.id) {
|
|
203
|
-
byTagValue.delete(tagValue);
|
|
204
|
-
if (byTagValue.size === 0) {
|
|
205
|
-
byTagKey.delete(tagKey);
|
|
206
|
-
if (byTagKey.size === 0) {
|
|
207
|
-
this.#simpleTagged!.delete(tokenKey);
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
#indexSimpleNamedBinding(tokenKey: DependencyKey, binding: Binding): void {
|
|
214
|
-
const name = simpleNameOf(binding);
|
|
215
|
-
if (name === undefined) {
|
|
216
|
-
return;
|
|
217
|
-
}
|
|
218
|
-
const bindingsByName = (this.#simpleNamed ??= new Map()).getOrInsert(tokenKey, new Map<string, Binding>());
|
|
219
|
-
bindingsByName.set(name, binding);
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
#deindexSimpleNamedBinding(tokenKey: DependencyKey, binding: Binding): void {
|
|
223
|
-
const name = simpleNameOf(binding);
|
|
224
|
-
if (name === undefined) {
|
|
225
|
-
return;
|
|
226
|
-
}
|
|
227
|
-
const bindingsByName = this.#simpleNamed?.get(tokenKey);
|
|
228
|
-
if (bindingsByName === undefined) {
|
|
229
|
-
return;
|
|
230
|
-
}
|
|
231
|
-
if (bindingsByName.get(name)?.id === binding.id) {
|
|
232
|
-
bindingsByName.delete(name);
|
|
233
|
-
if (bindingsByName.size === 0) {
|
|
234
|
-
this.#simpleNamed!.delete(tokenKey);
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
#refreshFastDefaultForToken(tokenKey: DependencyKey): void {
|
|
240
|
-
const bindingsForToken = this.#bindings.get(tokenKey);
|
|
241
|
-
const onlyBinding = bindingsForToken?.length === 1 ? bindingsForToken[0]! : undefined;
|
|
242
|
-
if (onlyBinding !== undefined && isDefaultSlotBinding(onlyBinding)) {
|
|
243
|
-
this.#fastDefault.set(tokenKey, onlyBinding);
|
|
244
|
-
return;
|
|
245
|
-
}
|
|
246
|
-
this.#fastDefault.delete(tokenKey);
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
/** Whether the deferred table behind `#simpleNamed` has had to be built. */
|
|
250
|
-
get isBuilt(): boolean {
|
|
251
|
-
return this.#simpleNamed !== undefined;
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
/** The name a binding is indexed under, or `undefined` when its slot is more than a plain name. */
|
|
256
|
-
function simpleNameOf(binding: Binding): string | undefined {
|
|
257
|
-
const { name, tags } = binding.slot;
|
|
258
|
-
return name !== undefined && tags.length === 0 ? name : undefined;
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
/**
|
|
262
|
-
* The tag a binding is indexed under, or `undefined` when its slot is more than one plain tag.
|
|
263
|
-
*
|
|
264
|
-
* @remarks A predicate is excluded here — unlike the name index — because the tag index is read
|
|
265
|
-
* without a re-check, so an indexed hit must be unconditional.
|
|
266
|
-
*/
|
|
267
|
-
function simpleTagOf(binding: Binding): BindingTag | undefined {
|
|
268
|
-
const { name, tags } = binding.slot;
|
|
269
|
-
return name === undefined && tags.length === 1 && binding.predicate === undefined ? tags[0] : undefined;
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
/** A binding nothing has to be matched against: the default slot, no predicate. */
|
|
273
|
-
function isDefaultSlotBinding(binding: Binding): boolean {
|
|
274
|
-
const { name, tags } = binding.slot;
|
|
275
|
-
return name === undefined && tags.length === 0 && binding.predicate === undefined;
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
/** A predicate with no slot constraint: last-wins does not apply to it. */
|
|
279
|
-
function isPurePredicateBinding(binding: Binding): boolean {
|
|
280
|
-
const { name, tags } = binding.slot;
|
|
281
|
-
return binding.predicate !== undefined && name === undefined && tags.length === 0;
|
|
282
|
-
}
|