@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,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 0.3.16-canary.0
|
|
3
|
+
*/
|
|
4
|
+
export function isInjectionDescriptor(value) {
|
|
5
|
+
if (value === null || value === undefined) {
|
|
6
|
+
return false;
|
|
7
|
+
}
|
|
8
|
+
const type = typeof value;
|
|
9
|
+
// inject() returns a function (dual-role), so must check both object and function
|
|
10
|
+
if (type !== "object" && type !== "function") {
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
return ("token" in value &&
|
|
14
|
+
"optional" in value &&
|
|
15
|
+
"multi" in value &&
|
|
16
|
+
typeof value.optional === "boolean" &&
|
|
17
|
+
typeof value.multi === "boolean");
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* @since 0.3.16-canary.0
|
|
21
|
+
*/
|
|
22
|
+
export function normalizeToDescriptor(dependency) {
|
|
23
|
+
if (isInjectionDescriptor(dependency)) {
|
|
24
|
+
return materializeInjectionDescriptor(dependency);
|
|
25
|
+
}
|
|
26
|
+
return { token: dependency, optional: false, multi: false };
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Dual-role `inject()` values are functions: [[Function]].name must not be treated as a DI slot name.
|
|
30
|
+
* Only enumerable own `name` / `tags` from `Object.defineProperties` are real injection options.
|
|
31
|
+
*/
|
|
32
|
+
function materializeInjectionDescriptor(dependency) {
|
|
33
|
+
if (typeof dependency !== "function") {
|
|
34
|
+
return dependency;
|
|
35
|
+
}
|
|
36
|
+
const dualRole = dependency;
|
|
37
|
+
const base = {
|
|
38
|
+
token: dualRole.token,
|
|
39
|
+
optional: dualRole.optional,
|
|
40
|
+
multi: dualRole.multi,
|
|
41
|
+
};
|
|
42
|
+
const nameDesc = Object.getOwnPropertyDescriptor(dualRole, "name");
|
|
43
|
+
const tagsDesc = Object.getOwnPropertyDescriptor(dualRole, "tags");
|
|
44
|
+
const explicitName = nameDesc?.enumerable === true && typeof nameDesc.value === "string" ? nameDesc.value : undefined;
|
|
45
|
+
// Annotated because `PropertyDescriptor.value` is `any`, and an `any` reaching the cast below
|
|
46
|
+
// would make it look checked when nothing checked it.
|
|
47
|
+
const explicitTags = tagsDesc?.enumerable === true ? tagsDesc.value : undefined;
|
|
48
|
+
if (explicitName !== undefined && explicitTags !== undefined) {
|
|
49
|
+
return {
|
|
50
|
+
...base,
|
|
51
|
+
name: explicitName,
|
|
52
|
+
tags: explicitTags,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
if (explicitName !== undefined) {
|
|
56
|
+
return { ...base, name: explicitName };
|
|
57
|
+
}
|
|
58
|
+
if (explicitTags !== undefined) {
|
|
59
|
+
return { ...base, tags: explicitTags };
|
|
60
|
+
}
|
|
61
|
+
return base;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* The one tag list a request carries, with the single-tag shorthand folded in.
|
|
65
|
+
*
|
|
66
|
+
* @remarks Folding here is what keeps `tag` from reaching `InjectionDescriptor` and everything
|
|
67
|
+
* derived from it, so one request never has two spellings past this point.
|
|
68
|
+
*/
|
|
69
|
+
function requestedTagsOf(options) {
|
|
70
|
+
const shorthand = options?.tag;
|
|
71
|
+
const listed = options?.tags;
|
|
72
|
+
if (shorthand === undefined) {
|
|
73
|
+
return listed;
|
|
74
|
+
}
|
|
75
|
+
return listed === undefined || listed.length === 0 ? [shorthand] : [shorthand, ...listed];
|
|
76
|
+
}
|
|
77
|
+
function withOptions(base, options) {
|
|
78
|
+
const tags = requestedTagsOf(options);
|
|
79
|
+
if (options?.name !== undefined && tags !== undefined) {
|
|
80
|
+
return { ...base, name: options.name, tags };
|
|
81
|
+
}
|
|
82
|
+
if (options?.name !== undefined) {
|
|
83
|
+
return { ...base, name: options.name };
|
|
84
|
+
}
|
|
85
|
+
if (tags !== undefined) {
|
|
86
|
+
return { ...base, tags };
|
|
87
|
+
}
|
|
88
|
+
return base;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* The descriptor half of `inject()`, shared with the accessor decorator that wraps it.
|
|
92
|
+
*
|
|
93
|
+
* @since 0.6.0
|
|
94
|
+
*/
|
|
95
|
+
export function buildInjectionDescriptor(token, options) {
|
|
96
|
+
return withOptions({ token, optional: false, multi: false }, options);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* @since 0.3.16-canary.0
|
|
100
|
+
*/
|
|
101
|
+
export function optional(token, options) {
|
|
102
|
+
return withOptions({
|
|
103
|
+
token: token,
|
|
104
|
+
optional: true,
|
|
105
|
+
multi: false,
|
|
106
|
+
}, options);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* @since 0.3.16-canary.0
|
|
110
|
+
*/
|
|
111
|
+
export function injectAll(token, options) {
|
|
112
|
+
return withOptions({
|
|
113
|
+
token: token,
|
|
114
|
+
optional: false,
|
|
115
|
+
multi: true,
|
|
116
|
+
}, options);
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=descriptor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"descriptor.js","sourceRoot":"","sources":["../../src/injection/descriptor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type {
|
|
1
|
+
import type { BindingTag } from "#/core/tag";
|
|
2
|
+
import type { Token } from "#/core/token";
|
|
3
|
+
import type { Constructor, ResolveOptions } from "#/core/types";
|
|
3
4
|
/**
|
|
4
5
|
* What one resolvable dependency declares.
|
|
5
6
|
*
|
|
@@ -12,8 +13,8 @@ export interface DependencySlot {
|
|
|
12
13
|
readonly token: Token<unknown> | Constructor;
|
|
13
14
|
readonly optional: boolean;
|
|
14
15
|
readonly multi: boolean;
|
|
15
|
-
readonly name?: string;
|
|
16
|
-
readonly tags?: ReadonlyArray<BindingTag
|
|
16
|
+
readonly name?: string | undefined;
|
|
17
|
+
readonly tags?: ReadonlyArray<BindingTag> | undefined;
|
|
17
18
|
}
|
|
18
19
|
/**
|
|
19
20
|
* A request whose only criterion is a name — the shape the registry has a direct index for.
|
|
@@ -24,8 +25,10 @@ export declare function isNameOnlyOptions(options: ResolveOptions): options is R
|
|
|
24
25
|
name: string;
|
|
25
26
|
};
|
|
26
27
|
/**
|
|
27
|
-
* The lone
|
|
28
|
-
*
|
|
28
|
+
* The lone tag of a request that asks for exactly one, written either way — the shape the registry
|
|
29
|
+
* has a direct tag index for.
|
|
30
|
+
*
|
|
31
|
+
* @remarks Both spellings answer here, so the index is not something one of them silently misses.
|
|
29
32
|
*
|
|
30
33
|
* @since 0.5.0-canary.9
|
|
31
34
|
*/
|
|
@@ -36,10 +39,17 @@ export declare function singleTagOnlyOf(options: ResolveOptions): BindingTag | u
|
|
|
36
39
|
*
|
|
37
40
|
* @since 0.3.16-canary.0
|
|
38
41
|
*/
|
|
39
|
-
export declare function injectionSlotToResolveOptions(injectionSlot:
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
42
|
+
export declare function injectionSlotToResolveOptions(injectionSlot: Pick<DependencySlot, "name" | "tags">): ResolveOptions | undefined;
|
|
43
|
+
/**
|
|
44
|
+
* The options a dependency resolves with — one object per slot, since a slot's criteria are fixed
|
|
45
|
+
* when it is declared.
|
|
46
|
+
*
|
|
47
|
+
* @remarks A slot carrying no criterion answers from its two fields, so the common shape never
|
|
48
|
+
* reaches the memo.
|
|
49
|
+
*
|
|
50
|
+
* @since 0.6.0
|
|
51
|
+
*/
|
|
52
|
+
export declare function resolveOptionsForSlot(injectionSlot: DependencySlot): ResolveOptions | undefined;
|
|
43
53
|
/**
|
|
44
54
|
* Resolve options derived from a binding slot (tags may be empty; omits when nothing to match).
|
|
45
55
|
*
|
|
@@ -51,6 +61,6 @@ export declare function injectionSlotToResolveOptions(injectionSlot: {
|
|
|
51
61
|
*/
|
|
52
62
|
export declare function bindingSlotToResolveOptions(bindingSlot: {
|
|
53
63
|
readonly name?: string | undefined;
|
|
54
|
-
readonly tags
|
|
64
|
+
readonly tags?: ReadonlyArray<BindingTag> | undefined;
|
|
55
65
|
}): ResolveOptions | undefined;
|
|
56
66
|
//# sourceMappingURL=resolve-options.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-options.d.ts","sourceRoot":"","sources":["../../src/injection/resolve-options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEhE;;;;;;;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,GAAG,SAAS,CAAC;IACnC,QAAQ,CAAC,IAAI,CAAC,EAAE,aAAa,CAAC,UAAU,CAAC,GAAG,SAAS,CAAC;CACvD;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,IAAI,cAAc,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAIvG;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,cAAc,GAAG,UAAU,GAAG,SAAS,CAW/E;AAoBD;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAC3C,aAAa,EAAE,IAAI,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAAC,GACnD,cAAc,GAAG,SAAS,CAE5B;AASD;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,aAAa,EAAE,cAAc,GAAG,cAAc,GAAG,SAAS,CAQ/F;AAsBD;;;;;;;;GAQG;AACH,wBAAgB,2BAA2B,CAAC,WAAW,EAAE;IACvD,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,QAAQ,CAAC,IAAI,CAAC,EAAE,aAAa,CAAC,UAAU,CAAC,GAAG,SAAS,CAAC;CACvD,GAAG,cAAc,GAAG,SAAS,CAG7B"}
|
|
@@ -0,0 +1,101 @@
|
|
|
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 tag of a request that asks for exactly one, written either way — the shape the registry
|
|
11
|
+
* has a direct tag index for.
|
|
12
|
+
*
|
|
13
|
+
* @remarks Both spellings answer here, so the index is not something one of them silently misses.
|
|
14
|
+
*
|
|
15
|
+
* @since 0.5.0-canary.9
|
|
16
|
+
*/
|
|
17
|
+
export function singleTagOnlyOf(options) {
|
|
18
|
+
if (options.name !== undefined) {
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
const listed = options.tags;
|
|
22
|
+
const shorthand = options.tag;
|
|
23
|
+
if (shorthand !== undefined) {
|
|
24
|
+
// Both sources present means the request carries two tags, which no single-tag index can answer.
|
|
25
|
+
return listed === undefined || listed.length === 0 ? shorthand : undefined;
|
|
26
|
+
}
|
|
27
|
+
return listed !== undefined && listed.length === 1 ? listed[0] : undefined;
|
|
28
|
+
}
|
|
29
|
+
/** Shared core: build a ResolveOptions from already-normalised name + tags. */
|
|
30
|
+
function buildOptions(name, tags) {
|
|
31
|
+
if (name === undefined && tags === undefined) {
|
|
32
|
+
return undefined;
|
|
33
|
+
}
|
|
34
|
+
const options = {};
|
|
35
|
+
if (name !== undefined) {
|
|
36
|
+
options.name = name;
|
|
37
|
+
}
|
|
38
|
+
if (tags !== undefined) {
|
|
39
|
+
options.tags = tags;
|
|
40
|
+
}
|
|
41
|
+
return options;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Builds a {@link ResolveOptions} safe for `exactOptionalPropertyTypes`:
|
|
45
|
+
* omits keys instead of assigning `undefined`.
|
|
46
|
+
*
|
|
47
|
+
* @since 0.3.16-canary.0
|
|
48
|
+
*/
|
|
49
|
+
export function injectionSlotToResolveOptions(injectionSlot) {
|
|
50
|
+
return buildOptions(injectionSlot.name, injectionSlot.tags);
|
|
51
|
+
}
|
|
52
|
+
/** Where a slot's derived options are memoized, so the same object is handed out every resolve. */
|
|
53
|
+
const MEMOIZED_RESOLVE_OPTIONS = Symbol("di:resolve-options");
|
|
54
|
+
/**
|
|
55
|
+
* The options a dependency resolves with — one object per slot, since a slot's criteria are fixed
|
|
56
|
+
* when it is declared.
|
|
57
|
+
*
|
|
58
|
+
* @remarks A slot carrying no criterion answers from its two fields, so the common shape never
|
|
59
|
+
* reaches the memo.
|
|
60
|
+
*
|
|
61
|
+
* @since 0.6.0
|
|
62
|
+
*/
|
|
63
|
+
export function resolveOptionsForSlot(injectionSlot) {
|
|
64
|
+
const { name, tags } = injectionSlot;
|
|
65
|
+
if (name === undefined && tags === undefined) {
|
|
66
|
+
return undefined;
|
|
67
|
+
}
|
|
68
|
+
const slot = injectionSlot;
|
|
69
|
+
const memoized = slot[MEMOIZED_RESOLVE_OPTIONS];
|
|
70
|
+
return memoized ?? memoizeResolveOptions(slot, name, tags);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Builds, freezes and stores a slot's options on first use.
|
|
74
|
+
*
|
|
75
|
+
* @remarks Frozen because one object answers every resolve of the slot and a constraint predicate is
|
|
76
|
+
* handed it. Split out for the `try`: in the caller it would cost the early return its inlining.
|
|
77
|
+
*/
|
|
78
|
+
function memoizeResolveOptions(slot, name, tags) {
|
|
79
|
+
const built = Object.freeze(buildOptions(name, tags));
|
|
80
|
+
try {
|
|
81
|
+
slot[MEMOIZED_RESOLVE_OPTIONS] = built;
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
// A frozen slot rebuilds on every hop rather than throwing.
|
|
85
|
+
}
|
|
86
|
+
return built;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Resolve options derived from a binding slot (tags may be empty; omits when nothing to match).
|
|
90
|
+
*
|
|
91
|
+
* @remarks Takes the slot structurally rather than as `BindingSlot`, so the slot on a public
|
|
92
|
+
* `BindingSnapshot` — where `name` is an optional property, not a required one holding `undefined` —
|
|
93
|
+
* is accepted by the same call.
|
|
94
|
+
*
|
|
95
|
+
* @since 0.3.16-canary.0
|
|
96
|
+
*/
|
|
97
|
+
export function bindingSlotToResolveOptions(bindingSlot) {
|
|
98
|
+
const tags = bindingSlot.tags;
|
|
99
|
+
return buildOptions(bindingSlot.name, tags !== undefined && tags.length > 0 ? tags : undefined);
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=resolve-options.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-options.js","sourceRoot":"","sources":["../../src/injection/resolve-options.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,23 +1,34 @@
|
|
|
1
|
+
import type { BindingRegistry } from "#/core/registry";
|
|
2
|
+
import type { BindingKind, BindingScope } from "#/core/types";
|
|
1
3
|
import type { MetadataReader } from "#/metadata/metadata-types";
|
|
2
|
-
import type { BindingRegistry } from "#/registry";
|
|
3
|
-
import type { BindingScope } from "#/types";
|
|
4
4
|
/**
|
|
5
|
+
* @remarks `kind`/`scope` are `"unbound"` for the placeholder node an optional, currently
|
|
6
|
+
* unsatisfied dependency points at.
|
|
7
|
+
*
|
|
5
8
|
* @since 0.3.16-canary.0
|
|
6
9
|
*/
|
|
7
10
|
export interface GraphNode {
|
|
8
11
|
readonly id: string;
|
|
9
12
|
readonly tokenName: string;
|
|
10
|
-
|
|
11
|
-
readonly
|
|
13
|
+
/** Identifies the token itself, so bindings that share a display name stay distinguishable. */
|
|
14
|
+
readonly tokenKey: string;
|
|
15
|
+
readonly kind: BindingKind | "unbound";
|
|
16
|
+
readonly scope: BindingScope | "unbound";
|
|
12
17
|
readonly fromParent: boolean;
|
|
13
18
|
}
|
|
14
19
|
/**
|
|
20
|
+
* @remarks `label` is presentation, assembled for the adapters; read `optional` and `slotName`
|
|
21
|
+
* rather than parsing it.
|
|
22
|
+
*
|
|
15
23
|
* @since 0.3.16-canary.0
|
|
16
24
|
*/
|
|
17
25
|
export interface GraphEdge {
|
|
18
26
|
readonly from: string;
|
|
19
27
|
readonly to: string;
|
|
20
28
|
readonly label?: string;
|
|
29
|
+
readonly optional: boolean;
|
|
30
|
+
/** The named slot this edge resolves to, when the binding declares one. */
|
|
31
|
+
readonly slotName?: string;
|
|
21
32
|
}
|
|
22
33
|
/**
|
|
23
34
|
* @since 0.3.16-canary.0
|
|
@@ -31,7 +42,7 @@ export interface ContainerGraphJson {
|
|
|
31
42
|
* @since 0.3.16-canary.0
|
|
32
43
|
*/
|
|
33
44
|
export interface GraphOptions {
|
|
34
|
-
readonly includeParent?: boolean;
|
|
45
|
+
readonly includeParent?: boolean | undefined;
|
|
35
46
|
}
|
|
36
47
|
/**
|
|
37
48
|
* @since 0.3.16-canary.0
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dependency-graph.d.ts","sourceRoot":"","sources":["../../src/introspection/dependency-graph.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dependency-graph.d.ts","sourceRoot":"","sources":["../../src/introspection/dependency-graph.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAGvD,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAe,MAAM,cAAc,CAAC;AAG3E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAKhE;;;;;GAKG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,+FAA+F;IAC/F,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,WAAW,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,KAAK,EAAE,YAAY,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAC9B;AAED;;;;;GAKG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,2EAA2E;IAC3E,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;IACzC,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;IACzC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC9C;AAsMD;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,eAAe,EACzB,cAAc,EAAE,cAAc,EAC9B,OAAO,EAAE,YAAY,GAAG,SAAS,EACjC,cAAc,CAAC,EAAE,eAAe,GAC/B,kBAAkB,CAWpB"}
|
|
@@ -1,66 +1,147 @@
|
|
|
1
|
-
import { effectiveBindingScope } from "#/
|
|
2
|
-
import { tokenName } from "#/token";
|
|
3
|
-
|
|
1
|
+
import { effectiveBindingScope } from "#/core/binding-scope";
|
|
2
|
+
import { tokenName } from "#/core/token";
|
|
3
|
+
import { bindingSlotToResolveOptions } from "#/injection/resolve-options";
|
|
4
|
+
import { matchesSlot } from "#/resolution/select/binding-select";
|
|
5
|
+
// ── Builder ──────────────────────────────────────────────────────────────────────────────────────────────────────────
|
|
6
|
+
// Tokens are compared by object identity, and a name is free to repeat, so the graph mints its
|
|
7
|
+
// own per-process key. Weakly held: a discarded token takes its key with it.
|
|
8
|
+
const tokenKeys = new WeakMap();
|
|
9
|
+
let tokenKeySequence = 0;
|
|
10
|
+
function tokenKeyOf(dependency) {
|
|
11
|
+
const existing = tokenKeys.get(dependency);
|
|
12
|
+
if (existing !== undefined) {
|
|
13
|
+
return existing;
|
|
14
|
+
}
|
|
15
|
+
tokenKeySequence += 1;
|
|
16
|
+
const key = `${tokenName(dependency)}@${String(tokenKeySequence)}`;
|
|
17
|
+
tokenKeys.set(dependency, key);
|
|
18
|
+
return key;
|
|
19
|
+
}
|
|
20
|
+
// Mirrors filterBindings' slot semantics; predicates need a live resolution context, so the graph
|
|
21
|
+
// keeps every predicate-carrying candidate.
|
|
22
|
+
function matchingTargets(candidates, ref) {
|
|
23
|
+
const criterion = bindingSlotToResolveOptions(ref);
|
|
24
|
+
if (ref.multi && criterion === undefined) {
|
|
25
|
+
return candidates;
|
|
26
|
+
}
|
|
27
|
+
return candidates.filter((candidate) => matchesSlot(candidate.slot, criterion));
|
|
28
|
+
}
|
|
29
|
+
function edgeLabel(ref, index) {
|
|
30
|
+
const criterion = ref.name !== undefined
|
|
31
|
+
? `name:${ref.name}`
|
|
32
|
+
: ref.tags !== undefined && ref.tags.length > 0
|
|
33
|
+
? `tag:${ref.tags[0]?.key.name}=${String(ref.tags[0]?.value)}`
|
|
34
|
+
: `[${index}]`;
|
|
35
|
+
return ref.optional ? `${criterion} optional` : criterion;
|
|
36
|
+
}
|
|
37
|
+
function bindingLookup(sourceRegistry, fallbackRegistry) {
|
|
38
|
+
return (token) => {
|
|
39
|
+
const own = sourceRegistry.getAll(token);
|
|
40
|
+
if (own.length > 0 || fallbackRegistry === undefined) {
|
|
41
|
+
return own;
|
|
42
|
+
}
|
|
43
|
+
return fallbackRegistry.getAll(token);
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
/** The placeholder node an optional-but-unbound dependency points at, minted once per token. */
|
|
47
|
+
function unboundNodeIdFor(accumulator, dependency) {
|
|
48
|
+
const key = tokenKeyOf(dependency);
|
|
49
|
+
const existing = accumulator.unboundNodeIds.get(key);
|
|
50
|
+
if (existing !== undefined) {
|
|
51
|
+
return existing;
|
|
52
|
+
}
|
|
53
|
+
const id = `unbound:${key}`;
|
|
54
|
+
accumulator.unboundNodeIds.set(key, id);
|
|
55
|
+
accumulator.nodes.push({
|
|
56
|
+
id,
|
|
57
|
+
tokenName: tokenName(dependency),
|
|
58
|
+
tokenKey: key,
|
|
59
|
+
kind: "unbound",
|
|
60
|
+
scope: "unbound",
|
|
61
|
+
fromParent: false,
|
|
62
|
+
});
|
|
63
|
+
return id;
|
|
64
|
+
}
|
|
65
|
+
function addDependencyEdges(accumulator, from, ref, index, lookup) {
|
|
66
|
+
const targets = matchingTargets(lookup(ref.token), ref);
|
|
67
|
+
const label = edgeLabel(ref, index);
|
|
68
|
+
if (targets.length === 0) {
|
|
69
|
+
// A required-but-unbound dependency is validate()'s story, not the graph's.
|
|
70
|
+
if (!ref.optional) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
accumulator.edges.push({
|
|
74
|
+
from,
|
|
75
|
+
to: unboundNodeIdFor(accumulator, ref.token),
|
|
76
|
+
label,
|
|
77
|
+
optional: true,
|
|
78
|
+
...(ref.name !== undefined ? { slotName: ref.name } : {}),
|
|
79
|
+
});
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
for (const target of targets) {
|
|
83
|
+
// A multi dep with no criterion of its own fans out — each edge names the slot it hits.
|
|
84
|
+
const slotName = target.slot.name ?? ref.name;
|
|
85
|
+
const perTargetLabel = ref.multi && ref.name === undefined && slotName !== undefined
|
|
86
|
+
? edgeLabel({ ...ref, name: slotName }, index)
|
|
87
|
+
: label;
|
|
88
|
+
accumulator.edges.push({
|
|
89
|
+
from,
|
|
90
|
+
to: target.id,
|
|
91
|
+
label: perTargetLabel,
|
|
92
|
+
optional: ref.optional,
|
|
93
|
+
...(slotName !== undefined ? { slotName } : {}),
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/** What one binding declares up front — a class's params, a factory's descriptors, an alias's target. */
|
|
98
|
+
function addBindingEdges(accumulator, binding, metadataReader, lookup) {
|
|
99
|
+
if (binding.kind === "class") {
|
|
100
|
+
const meta = metadataReader.getConstructorMetadata(binding.target);
|
|
101
|
+
if (meta !== undefined) {
|
|
102
|
+
for (const [index, param] of meta.params.entries()) {
|
|
103
|
+
addDependencyEdges(accumulator, binding.id, param, index, lookup);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
if (binding.kind === "resolved" || binding.kind === "resolved-async") {
|
|
109
|
+
for (const [index, dependency] of binding.deps.entries()) {
|
|
110
|
+
addDependencyEdges(accumulator, binding.id, dependency, index, lookup);
|
|
111
|
+
}
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
if (binding.kind === "alias") {
|
|
115
|
+
const aliasRef = { token: binding.target, optional: false, multi: false };
|
|
116
|
+
for (const target of matchingTargets(lookup(binding.target), aliasRef)) {
|
|
117
|
+
accumulator.edges.push({ from: binding.id, to: target.id, label: "alias", optional: false });
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
function addRegistryBindings(accumulator, sourceRegistry, metadataReader, fromParent, fallbackRegistry) {
|
|
122
|
+
const lookup = bindingLookup(sourceRegistry, fallbackRegistry);
|
|
123
|
+
for (const binding of sourceRegistry.allBindings()) {
|
|
124
|
+
accumulator.nodes.push({
|
|
125
|
+
id: binding.id,
|
|
126
|
+
tokenName: tokenName(binding.token),
|
|
127
|
+
tokenKey: tokenKeyOf(binding.token),
|
|
128
|
+
kind: binding.kind,
|
|
129
|
+
scope: effectiveBindingScope(binding),
|
|
130
|
+
fromParent,
|
|
131
|
+
});
|
|
132
|
+
addBindingEdges(accumulator, binding, metadataReader, lookup);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
4
135
|
/**
|
|
5
136
|
* @since 0.3.16-canary.0
|
|
6
137
|
*/
|
|
7
138
|
export function buildDependencyGraph(registry, metadataReader, options, parentRegistry) {
|
|
8
|
-
const
|
|
9
|
-
const edges = [];
|
|
139
|
+
const accumulator = { nodes: [], edges: [], unboundNodeIds: new Map() };
|
|
10
140
|
const includesParent = options?.includeParent === true;
|
|
11
|
-
|
|
12
|
-
for (const binding of sourceRegistry.allBindings()) {
|
|
13
|
-
const scope = effectiveBindingScope(binding);
|
|
14
|
-
nodes.push({
|
|
15
|
-
id: binding.id,
|
|
16
|
-
tokenName: tokenName(binding.token),
|
|
17
|
-
kind: binding.kind,
|
|
18
|
-
scope,
|
|
19
|
-
fromParent,
|
|
20
|
-
});
|
|
21
|
-
// Build edges
|
|
22
|
-
if (binding.kind === "class") {
|
|
23
|
-
const meta = metadataReader.getConstructorMetadata(binding.target);
|
|
24
|
-
if (meta !== undefined) {
|
|
25
|
-
for (let index = 0; index < meta.params.length; index += 1) {
|
|
26
|
-
const param = meta.params[index];
|
|
27
|
-
const dependencyBinding = sourceRegistry.getAll(param.token)[0];
|
|
28
|
-
if (dependencyBinding !== undefined) {
|
|
29
|
-
edges.push({
|
|
30
|
-
from: binding.id,
|
|
31
|
-
to: dependencyBinding.id,
|
|
32
|
-
label: `[${index}]`,
|
|
33
|
-
});
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
else if (binding.kind === "resolved" || binding.kind === "resolved-async") {
|
|
39
|
-
for (let index = 0; index < binding.deps.length; index += 1) {
|
|
40
|
-
const dependency = binding.deps[index];
|
|
41
|
-
const dependencyBindings = sourceRegistry.getAll(dependency.token);
|
|
42
|
-
if (dependencyBindings.length > 0 && dependencyBindings[0] !== undefined) {
|
|
43
|
-
const label = dependency.name !== undefined
|
|
44
|
-
? `name:${dependency.name}`
|
|
45
|
-
: dependency.tags !== undefined && dependency.tags.length > 0
|
|
46
|
-
? `tag:${dependency.tags[0]?.[0]}=${String(dependency.tags[0]?.[1])}`
|
|
47
|
-
: `[${index}]`;
|
|
48
|
-
edges.push({ from: binding.id, to: dependencyBindings[0].id, label });
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
else if (binding.kind === "alias") {
|
|
53
|
-
const targetBindings = sourceRegistry.getAll(binding.target);
|
|
54
|
-
if (targetBindings.length > 0 && targetBindings[0] !== undefined) {
|
|
55
|
-
edges.push({ from: binding.id, to: targetBindings[0].id, label: "alias" });
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
};
|
|
60
|
-
addBindings(registry, false);
|
|
141
|
+
addRegistryBindings(accumulator, registry, metadataReader, false, includesParent ? parentRegistry : undefined);
|
|
61
142
|
if (includesParent && parentRegistry !== undefined) {
|
|
62
|
-
|
|
143
|
+
addRegistryBindings(accumulator, parentRegistry, metadataReader, true);
|
|
63
144
|
}
|
|
64
|
-
return { nodes, edges, includesParent };
|
|
145
|
+
return { nodes: accumulator.nodes, edges: accumulator.edges, includesParent };
|
|
65
146
|
}
|
|
66
147
|
//# sourceMappingURL=dependency-graph.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dependency-graph.js","sourceRoot":"","sources":["../../src/introspection/dependency-graph.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dependency-graph.js","sourceRoot":"","sources":["../../src/introspection/dependency-graph.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ContainerGraphJson } from "#/introspection/dependency-graph";
|
|
1
|
+
import type { ContainerGraphJson, GraphNode } from "#/introspection/dependency-graph";
|
|
2
2
|
/**
|
|
3
3
|
* @since 0.3.16-canary.0
|
|
4
4
|
*/
|
|
@@ -6,8 +6,9 @@ export interface CytoscapeNode {
|
|
|
6
6
|
readonly data: {
|
|
7
7
|
readonly id: string;
|
|
8
8
|
readonly label: string;
|
|
9
|
-
readonly
|
|
10
|
-
readonly
|
|
9
|
+
readonly tokenKey: string;
|
|
10
|
+
readonly kind: GraphNode["kind"];
|
|
11
|
+
readonly scope: GraphNode["scope"];
|
|
11
12
|
readonly fromParent: boolean;
|
|
12
13
|
};
|
|
13
14
|
}
|
|
@@ -20,6 +21,8 @@ export interface CytoscapeEdge {
|
|
|
20
21
|
readonly source: string;
|
|
21
22
|
readonly target: string;
|
|
22
23
|
readonly label?: string;
|
|
24
|
+
readonly optional: boolean;
|
|
25
|
+
readonly slotName?: string;
|
|
23
26
|
};
|
|
24
27
|
}
|
|
25
28
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cytoscape.d.ts","sourceRoot":"","sources":["../../../src/introspection/graph-adapters/cytoscape.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"cytoscape.d.ts","sourceRoot":"","sources":["../../../src/introspection/graph-adapters/cytoscape.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAEtF;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE;QACb,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;QACjC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;QACnC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;KAC9B,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE;QACb,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;QAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;KAC5B,CAAC;CACH;AAED;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,aAAa,CAAC,aAAa,GAAG,aAAa,CAAC,CAAC;AAE7E;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,kBAAkB,GAAG,iBAAiB,CA+B7E"}
|
|
@@ -8,6 +8,7 @@ export function toCytoscapeGraph(graph) {
|
|
|
8
8
|
data: {
|
|
9
9
|
id: node.id,
|
|
10
10
|
label: node.tokenName,
|
|
11
|
+
tokenKey: node.tokenKey,
|
|
11
12
|
kind: node.kind,
|
|
12
13
|
scope: node.scope,
|
|
13
14
|
fromParent: node.fromParent,
|
|
@@ -22,6 +23,8 @@ export function toCytoscapeGraph(graph) {
|
|
|
22
23
|
source: edge.from,
|
|
23
24
|
target: edge.to,
|
|
24
25
|
...(edge.label !== undefined ? { label: edge.label } : {}),
|
|
26
|
+
optional: edge.optional,
|
|
27
|
+
...(edge.slotName !== undefined ? { slotName: edge.slotName } : {}),
|
|
25
28
|
},
|
|
26
29
|
});
|
|
27
30
|
}
|