@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.
Files changed (266) hide show
  1. package/CHANGELOG.md +712 -0
  2. package/README.md +119 -30
  3. package/dist/ambient/active-container.d.ts +37 -0
  4. package/dist/ambient/active-container.d.ts.map +1 -0
  5. package/dist/ambient/active-container.js +41 -0
  6. package/dist/ambient/active-container.js.map +1 -0
  7. package/dist/container/binding-builders.d.ts +12 -8
  8. package/dist/container/binding-builders.d.ts.map +1 -1
  9. package/dist/container/binding-builders.js +62 -31
  10. package/dist/container/binding-builders.js.map +1 -1
  11. package/dist/container/container.d.ts +33 -19
  12. package/dist/container/container.d.ts.map +1 -1
  13. package/dist/container/container.js +281 -118
  14. package/dist/container/container.js.map +1 -1
  15. package/dist/{resolution → core}/binding-scope.d.ts +2 -2
  16. package/dist/core/binding-scope.d.ts.map +1 -0
  17. package/dist/core/binding-scope.js.map +1 -0
  18. package/dist/{binding.d.ts → core/binding.d.ts} +70 -15
  19. package/dist/core/binding.d.ts.map +1 -0
  20. package/dist/{binding.js → core/binding.js} +27 -12
  21. package/dist/core/binding.js.map +1 -0
  22. package/dist/core/constraint-requirement.d.ts +53 -0
  23. package/dist/core/constraint-requirement.d.ts.map +1 -0
  24. package/dist/core/constraint-requirement.js +62 -0
  25. package/dist/core/constraint-requirement.js.map +1 -0
  26. package/dist/{constructor-type.d.ts → core/constructor-type.d.ts} +1 -1
  27. package/dist/core/constructor-type.d.ts.map +1 -0
  28. package/dist/core/constructor-type.js.map +1 -0
  29. package/dist/{module.d.ts → core/module.d.ts} +5 -5
  30. package/dist/core/module.d.ts.map +1 -0
  31. package/dist/{module.js → core/module.js} +4 -4
  32. package/dist/core/module.js.map +1 -0
  33. package/dist/{registry.d.ts → core/registry.d.ts} +27 -7
  34. package/dist/core/registry.d.ts.map +1 -0
  35. package/dist/{registry.js → core/registry.js} +125 -52
  36. package/dist/core/registry.js.map +1 -0
  37. package/dist/core/tag.d.ts +80 -0
  38. package/dist/core/tag.d.ts.map +1 -0
  39. package/dist/core/tag.js +96 -0
  40. package/dist/core/tag.js.map +1 -0
  41. package/dist/{token.d.ts → core/token.d.ts} +2 -6
  42. package/dist/core/token.d.ts.map +1 -0
  43. package/dist/core/token.js +13 -0
  44. package/dist/core/token.js.map +1 -0
  45. package/dist/{types.d.ts → core/types.d.ts} +27 -21
  46. package/dist/core/types.d.ts.map +1 -0
  47. package/dist/core/types.js.map +1 -0
  48. package/dist/decorators/inject.d.ts +5 -49
  49. package/dist/decorators/inject.d.ts.map +1 -1
  50. package/dist/decorators/inject.js +34 -104
  51. package/dist/decorators/inject.js.map +1 -1
  52. package/dist/decorators/injectable.d.ts +25 -5
  53. package/dist/decorators/injectable.d.ts.map +1 -1
  54. package/dist/decorators/injectable.js +2 -3
  55. package/dist/decorators/injectable.js.map +1 -1
  56. package/dist/decorators/lifecycle-decorators.d.ts +4 -2
  57. package/dist/decorators/lifecycle-decorators.d.ts.map +1 -1
  58. package/dist/decorators/lifecycle-decorators.js +19 -25
  59. package/dist/decorators/lifecycle-decorators.js.map +1 -1
  60. package/dist/{resolution → errors}/diagnostics.d.ts +2 -0
  61. package/dist/errors/diagnostics.d.ts.map +1 -0
  62. package/dist/errors/diagnostics.js.map +1 -0
  63. package/dist/{errors.d.ts → errors/errors.d.ts} +89 -4
  64. package/dist/errors/errors.d.ts.map +1 -0
  65. package/dist/{errors.js → errors/errors.js} +129 -7
  66. package/dist/errors/errors.js.map +1 -0
  67. package/dist/index.d.ts +21 -14
  68. package/dist/index.d.ts.map +1 -1
  69. package/dist/index.js +15 -7
  70. package/dist/index.js.map +1 -1
  71. package/dist/injection/descriptor.d.ts +79 -0
  72. package/dist/injection/descriptor.d.ts.map +1 -0
  73. package/dist/injection/descriptor.js +118 -0
  74. package/dist/injection/descriptor.js.map +1 -0
  75. package/dist/{resolution → injection}/resolve-options.d.ts +21 -11
  76. package/dist/injection/resolve-options.d.ts.map +1 -0
  77. package/dist/injection/resolve-options.js +101 -0
  78. package/dist/injection/resolve-options.js.map +1 -0
  79. package/dist/introspection/dependency-graph.d.ts +16 -5
  80. package/dist/introspection/dependency-graph.d.ts.map +1 -1
  81. package/dist/introspection/dependency-graph.js +138 -57
  82. package/dist/introspection/dependency-graph.js.map +1 -1
  83. package/dist/introspection/graph-adapters/cytoscape.d.ts +6 -3
  84. package/dist/introspection/graph-adapters/cytoscape.d.ts.map +1 -1
  85. package/dist/introspection/graph-adapters/cytoscape.js +3 -0
  86. package/dist/introspection/graph-adapters/cytoscape.js.map +1 -1
  87. package/dist/introspection/graph-adapters/dot.d.ts.map +1 -1
  88. package/dist/introspection/graph-adapters/dot.js +12 -5
  89. package/dist/introspection/graph-adapters/dot.js.map +1 -1
  90. package/dist/introspection/graph-adapters/mermaid.d.ts +9 -0
  91. package/dist/introspection/graph-adapters/mermaid.d.ts.map +1 -0
  92. package/dist/introspection/graph-adapters/mermaid.js +47 -0
  93. package/dist/introspection/graph-adapters/mermaid.js.map +1 -0
  94. package/dist/introspection/graph-adapters/reactflow.d.ts +6 -3
  95. package/dist/introspection/graph-adapters/reactflow.d.ts.map +1 -1
  96. package/dist/introspection/graph-adapters/reactflow.js +5 -1
  97. package/dist/introspection/graph-adapters/reactflow.js.map +1 -1
  98. package/dist/introspection/inspector.d.ts +4 -4
  99. package/dist/introspection/inspector.d.ts.map +1 -1
  100. package/dist/introspection/inspector.js +10 -6
  101. package/dist/introspection/inspector.js.map +1 -1
  102. package/dist/lifecycle/lifecycle-manager.d.ts +27 -0
  103. package/dist/lifecycle/lifecycle-manager.d.ts.map +1 -0
  104. package/dist/{resolution/lifecycle.js → lifecycle/lifecycle-manager.js} +39 -9
  105. package/dist/lifecycle/lifecycle-manager.js.map +1 -0
  106. package/dist/lifecycle/scope-manager.d.ts +48 -0
  107. package/dist/lifecycle/scope-manager.d.ts.map +1 -0
  108. package/dist/lifecycle/scope-manager.js +135 -0
  109. package/dist/lifecycle/scope-manager.js.map +1 -0
  110. package/dist/metadata/metadata-reader-token.d.ts +1 -1
  111. package/dist/metadata/metadata-reader-token.d.ts.map +1 -1
  112. package/dist/metadata/metadata-reader-token.js +1 -1
  113. package/dist/metadata/metadata-reader-token.js.map +1 -1
  114. package/dist/metadata/metadata-types.d.ts +9 -9
  115. package/dist/metadata/metadata-types.d.ts.map +1 -1
  116. package/dist/metadata/symbol-metadata-reader.d.ts +19 -6
  117. package/dist/metadata/symbol-metadata-reader.d.ts.map +1 -1
  118. package/dist/metadata/symbol-metadata-reader.js +89 -9
  119. package/dist/metadata/symbol-metadata-reader.js.map +1 -1
  120. package/dist/metadata/verifying-metadata-reader.d.ts +16 -0
  121. package/dist/metadata/verifying-metadata-reader.d.ts.map +1 -0
  122. package/dist/metadata/verifying-metadata-reader.js +32 -0
  123. package/dist/metadata/verifying-metadata-reader.js.map +1 -0
  124. package/dist/resolution/{activation-need.d.ts → cache/activation-need.d.ts} +5 -5
  125. package/dist/resolution/cache/activation-need.d.ts.map +1 -0
  126. package/dist/resolution/cache/activation-need.js.map +1 -0
  127. package/dist/resolution/{binding-lookup-cache.d.ts → cache/binding-lookup-cache.d.ts} +9 -5
  128. package/dist/resolution/cache/binding-lookup-cache.d.ts.map +1 -0
  129. package/dist/resolution/{binding-lookup-cache.js → cache/binding-lookup-cache.js} +55 -0
  130. package/dist/resolution/cache/binding-lookup-cache.js.map +1 -0
  131. package/dist/resolution/cache/class-introspector.d.ts +66 -0
  132. package/dist/resolution/cache/class-introspector.d.ts.map +1 -0
  133. package/dist/resolution/cache/class-introspector.js +194 -0
  134. package/dist/resolution/cache/class-introspector.js.map +1 -0
  135. package/dist/resolution/context.d.ts +84 -0
  136. package/dist/resolution/context.d.ts.map +1 -0
  137. package/dist/resolution/{environment.js → context.js} +54 -80
  138. package/dist/resolution/context.js.map +1 -0
  139. package/dist/resolution/path/resolution-path.d.ts +94 -0
  140. package/dist/resolution/path/resolution-path.d.ts.map +1 -0
  141. package/dist/resolution/path/resolution-path.js +117 -0
  142. package/dist/resolution/path/resolution-path.js.map +1 -0
  143. package/dist/resolution/{instantiation-plan.d.ts → plan/instantiation-plan.d.ts} +37 -7
  144. package/dist/resolution/plan/instantiation-plan.d.ts.map +1 -0
  145. package/dist/resolution/plan/instantiation-plan.js +419 -0
  146. package/dist/resolution/plan/instantiation-plan.js.map +1 -0
  147. package/dist/resolution/resolver.d.ts +28 -28
  148. package/dist/resolution/resolver.d.ts.map +1 -1
  149. package/dist/resolution/resolver.js +581 -239
  150. package/dist/resolution/resolver.js.map +1 -1
  151. package/dist/resolution/select/binding-select.d.ts +34 -0
  152. package/dist/resolution/select/binding-select.d.ts.map +1 -0
  153. package/dist/resolution/select/binding-select.js +175 -0
  154. package/dist/resolution/select/binding-select.js.map +1 -0
  155. package/dist/resolution/{constraints.d.ts → select/constraints.d.ts} +13 -12
  156. package/dist/resolution/select/constraints.d.ts.map +1 -0
  157. package/dist/resolution/{constraints.js → select/constraints.js} +33 -22
  158. package/dist/resolution/select/constraints.js.map +1 -0
  159. package/package.json +160 -20
  160. package/src/ambient/active-container.ts +65 -0
  161. package/src/container/binding-builders.ts +79 -44
  162. package/src/container/container.ts +357 -170
  163. package/src/{resolution → core}/binding-scope.ts +2 -2
  164. package/src/{binding.ts → core/binding.ts} +101 -39
  165. package/src/core/constraint-requirement.ts +94 -0
  166. package/src/{constructor-type.ts → core/constructor-type.ts} +1 -1
  167. package/src/{module.ts → core/module.ts} +10 -10
  168. package/src/core/registry.ts +365 -0
  169. package/src/core/tag.ts +158 -0
  170. package/src/{token.ts → core/token.ts} +2 -14
  171. package/src/{types.ts → core/types.ts} +37 -34
  172. package/src/decorators/inject.ts +39 -175
  173. package/src/decorators/injectable.ts +40 -10
  174. package/src/decorators/lifecycle-decorators.ts +22 -34
  175. package/src/{resolution → errors}/diagnostics.ts +2 -0
  176. package/src/{errors.ts → errors/errors.ts} +152 -8
  177. package/src/index.ts +43 -15
  178. package/src/injection/descriptor.ts +206 -0
  179. package/src/injection/resolve-options.ts +144 -0
  180. package/src/introspection/dependency-graph.ts +223 -63
  181. package/src/introspection/graph-adapters/cytoscape.ts +9 -3
  182. package/src/introspection/graph-adapters/dot.ts +13 -5
  183. package/src/introspection/graph-adapters/mermaid.ts +61 -0
  184. package/src/introspection/graph-adapters/reactflow.ts +11 -4
  185. package/src/introspection/inspector.ts +16 -12
  186. package/src/{resolution/lifecycle.ts → lifecycle/lifecycle-manager.ts} +68 -32
  187. package/src/lifecycle/scope-manager.ts +156 -0
  188. package/src/metadata/metadata-reader-token.ts +2 -2
  189. package/src/metadata/metadata-types.ts +9 -9
  190. package/src/metadata/symbol-metadata-reader.ts +95 -18
  191. package/src/metadata/verifying-metadata-reader.ts +41 -0
  192. package/src/resolution/{activation-need.ts → cache/activation-need.ts} +8 -8
  193. package/src/resolution/{binding-lookup-cache.ts → cache/binding-lookup-cache.ts} +63 -5
  194. package/src/resolution/cache/class-introspector.ts +251 -0
  195. package/src/resolution/{environment.ts → context.ts} +84 -145
  196. package/src/resolution/path/resolution-path.ts +167 -0
  197. package/src/resolution/plan/instantiation-plan.ts +615 -0
  198. package/src/resolution/resolver.ts +663 -313
  199. package/src/resolution/select/binding-select.ts +210 -0
  200. package/src/resolution/select/constraints.ts +130 -0
  201. package/dist/binding.d.ts.map +0 -1
  202. package/dist/binding.js.map +0 -1
  203. package/dist/constructor-type.d.ts.map +0 -1
  204. package/dist/constructor-type.js.map +0 -1
  205. package/dist/errors.d.ts.map +0 -1
  206. package/dist/errors.js.map +0 -1
  207. package/dist/module.d.ts.map +0 -1
  208. package/dist/module.js.map +0 -1
  209. package/dist/registry.d.ts.map +0 -1
  210. package/dist/registry.js.map +0 -1
  211. package/dist/resolution/activation-need.d.ts.map +0 -1
  212. package/dist/resolution/activation-need.js.map +0 -1
  213. package/dist/resolution/binding-lookup-cache.d.ts.map +0 -1
  214. package/dist/resolution/binding-lookup-cache.js.map +0 -1
  215. package/dist/resolution/binding-scope.d.ts.map +0 -1
  216. package/dist/resolution/binding-scope.js.map +0 -1
  217. package/dist/resolution/binding-select.d.ts +0 -23
  218. package/dist/resolution/binding-select.d.ts.map +0 -1
  219. package/dist/resolution/binding-select.js +0 -121
  220. package/dist/resolution/binding-select.js.map +0 -1
  221. package/dist/resolution/class-introspector.d.ts +0 -27
  222. package/dist/resolution/class-introspector.d.ts.map +0 -1
  223. package/dist/resolution/class-introspector.js +0 -60
  224. package/dist/resolution/class-introspector.js.map +0 -1
  225. package/dist/resolution/constraints.d.ts.map +0 -1
  226. package/dist/resolution/constraints.js.map +0 -1
  227. package/dist/resolution/diagnostics.d.ts.map +0 -1
  228. package/dist/resolution/diagnostics.js.map +0 -1
  229. package/dist/resolution/environment.d.ts +0 -94
  230. package/dist/resolution/environment.d.ts.map +0 -1
  231. package/dist/resolution/environment.js.map +0 -1
  232. package/dist/resolution/instantiation-plan.d.ts.map +0 -1
  233. package/dist/resolution/instantiation-plan.js +0 -183
  234. package/dist/resolution/instantiation-plan.js.map +0 -1
  235. package/dist/resolution/lifecycle.d.ts +0 -23
  236. package/dist/resolution/lifecycle.d.ts.map +0 -1
  237. package/dist/resolution/lifecycle.js.map +0 -1
  238. package/dist/resolution/resolution-path.d.ts +0 -98
  239. package/dist/resolution/resolution-path.d.ts.map +0 -1
  240. package/dist/resolution/resolution-path.js +0 -98
  241. package/dist/resolution/resolution-path.js.map +0 -1
  242. package/dist/resolution/resolve-options.d.ts.map +0 -1
  243. package/dist/resolution/resolve-options.js +0 -56
  244. package/dist/resolution/resolve-options.js.map +0 -1
  245. package/dist/resolution/scope.d.ts +0 -28
  246. package/dist/resolution/scope.d.ts.map +0 -1
  247. package/dist/resolution/scope.js +0 -88
  248. package/dist/resolution/scope.js.map +0 -1
  249. package/dist/token.d.ts.map +0 -1
  250. package/dist/token.js +0 -22
  251. package/dist/token.js.map +0 -1
  252. package/dist/types.d.ts.map +0 -1
  253. package/dist/types.js.map +0 -1
  254. package/src/registry.ts +0 -282
  255. package/src/resolution/binding-select.ts +0 -154
  256. package/src/resolution/class-introspector.ts +0 -74
  257. package/src/resolution/constraints.ts +0 -121
  258. package/src/resolution/instantiation-plan.ts +0 -292
  259. package/src/resolution/resolution-path.ts +0 -156
  260. package/src/resolution/resolve-options.ts +0 -89
  261. package/src/resolution/scope.ts +0 -105
  262. /package/dist/{resolution → core}/binding-scope.js +0 -0
  263. /package/dist/{constructor-type.js → core/constructor-type.js} +0 -0
  264. /package/dist/{types.js → core/types.js} +0 -0
  265. /package/dist/{resolution → errors}/diagnostics.js +0 -0
  266. /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 { Token } from "#/token";
2
- import type { BindingTag, Constructor, ResolveOptions } from "#/types";
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 entry of a request whose only criterion is a one-element `tags` list — the shape the
28
- * registry has a direct tag index for.
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
- readonly name?: string;
41
- readonly tags?: ReadonlyArray<BindingTag>;
42
- }): ResolveOptions | undefined;
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: ReadonlyArray<BindingTag>;
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
- readonly kind: string;
11
- readonly scope: BindingScope;
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":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGlD,OAAO,KAAK,EAAE,YAAY,EAAe,MAAM,SAAS,CAAC;AAIzD;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAC9B;AAED;;GAEG;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;CACzB;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,CAAC;CAClC;AAID;;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,CA6DpB"}
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 "#/resolution/binding-scope";
2
- import { tokenName } from "#/token";
3
- // ── Builder ───────────────────────────────────────────────────────────────────
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 nodes = [];
9
- const edges = [];
139
+ const accumulator = { nodes: [], edges: [], unboundNodeIds: new Map() };
10
140
  const includesParent = options?.includeParent === true;
11
- const addBindings = (sourceRegistry, fromParent) => {
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
- addBindings(parentRegistry, true);
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":"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"}
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 kind: string;
10
- readonly scope: string;
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;AAE3E;;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,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,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;KACzB,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,CA4B7E"}
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
  }