@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,194 @@
1
+ /**
2
+ * Per-class decorator metadata, cached by constructor.
3
+ *
4
+ * @remarks Metadata cannot change once a class is defined, so nothing here needs version stamping.
5
+ */
6
+ import { runWithAmbientResolution } from "#/ambient/active-container";
7
+ import { InvalidMetadataError } from "#/errors/errors";
8
+ // Verified pairs, not verified classes: two readers may disagree about the same class, and a reader
9
+ // that goes out of scope takes its record with it.
10
+ const verifiedTargets = new WeakMap();
11
+ const verifiedLifecycleTargets = new WeakMap();
12
+ const verifiedAccessorTargets = new WeakMap();
13
+ function isVerified(cache, reader, target) {
14
+ return cache.get(reader)?.has(target) ?? false;
15
+ }
16
+ function markVerified(cache, reader, target) {
17
+ let verified = cache.get(reader);
18
+ if (verified === undefined) {
19
+ verified = new WeakSet();
20
+ cache.set(reader, verified);
21
+ }
22
+ verified.add(target);
23
+ }
24
+ /**
25
+ * A reader's constructor metadata for a class, verified the first time this process asks.
26
+ *
27
+ * @remarks Metadata cannot change once a class is defined, so re-checking per container would charge
28
+ * every fresh container for a fact already established — a per-request child or a cold boot pays
29
+ * that repeatedly.
30
+ *
31
+ * @since 0.6.0
32
+ */
33
+ export function verifyConstructorMetadata(reader, target) {
34
+ const metadata = reader.getConstructorMetadata(target);
35
+ if (metadata === undefined) {
36
+ return undefined;
37
+ }
38
+ if (isVerified(verifiedTargets, reader, target)) {
39
+ return metadata;
40
+ }
41
+ assertConstructorMetadata(metadata, target);
42
+ markVerified(verifiedTargets, reader, target);
43
+ return metadata;
44
+ }
45
+ /**
46
+ * Verifies what a reader claims about a class, since a `MetadataReader` is a public seam.
47
+ *
48
+ * @remarks Every path that reads constructor metadata comes through here, so a reader that answers
49
+ * wrongly is a named error at the class it described rather than a `TypeError` raised later inside a
50
+ * resolve. Only what a consumer dereferences is checked: `params` and each entry's `token`.
51
+ * `optional`/`multi` degrade to falsy without crashing, and `index` is decorative — dependencies are
52
+ * consumed positionally.
53
+ *
54
+ * @since 0.6.0
55
+ */
56
+ export function assertConstructorMetadata(metadata, target) {
57
+ if (metadata === undefined) {
58
+ return undefined;
59
+ }
60
+ if (typeof metadata !== "object" || metadata === null) {
61
+ throw new InvalidMetadataError(target.name, `constructor metadata: expected an object, received ${typeof metadata}`);
62
+ }
63
+ const params = Reflect.get(metadata, "params");
64
+ if (!Array.isArray(params)) {
65
+ throw new InvalidMetadataError(target.name, "constructor metadata: params is not an array");
66
+ }
67
+ for (const [position, param] of params.entries()) {
68
+ if (typeof param !== "object" || param === null) {
69
+ throw new InvalidMetadataError(target.name, `constructor metadata: params[${String(position)}] is not an object`);
70
+ }
71
+ const dependency = Reflect.get(param, "token");
72
+ if (typeof dependency !== "object" && typeof dependency !== "function") {
73
+ throw new InvalidMetadataError(target.name, `constructor metadata: params[${String(position)}].token is not a token or a class`);
74
+ }
75
+ }
76
+ return metadata;
77
+ }
78
+ /**
79
+ * A reader's lifecycle metadata for a class, verified the first time this process asks.
80
+ *
81
+ * @since 0.6.0
82
+ */
83
+ export function verifyLifecycleMetadata(reader, target) {
84
+ const metadata = reader.getLifecycleMetadata(target);
85
+ if (metadata === undefined || isVerified(verifiedLifecycleTargets, reader, target)) {
86
+ return metadata;
87
+ }
88
+ if (typeof metadata !== "object" || metadata === null) {
89
+ throw new InvalidMetadataError(target.name, `lifecycle metadata: expected an object, received ${typeof metadata}`);
90
+ }
91
+ for (const phase of ["postConstruct", "preDestroy"]) {
92
+ const methods = Reflect.get(metadata, phase);
93
+ if (methods === undefined) {
94
+ continue;
95
+ }
96
+ if (!Array.isArray(methods)) {
97
+ throw new InvalidMetadataError(target.name, `lifecycle metadata: ${phase} is not an array`);
98
+ }
99
+ for (const [position, name] of methods.entries()) {
100
+ if (typeof name !== "string") {
101
+ throw new InvalidMetadataError(target.name, `lifecycle metadata: ${phase}[${String(position)}] is not a string`);
102
+ }
103
+ }
104
+ }
105
+ markVerified(verifiedLifecycleTargets, reader, target);
106
+ return metadata;
107
+ }
108
+ /**
109
+ * A reader's accessor metadata for a class, verified the first time this process asks.
110
+ *
111
+ * @since 0.6.0
112
+ */
113
+ export function verifyAccessorMetadata(reader, target) {
114
+ const metadata = reader.getAccessorMetadata?.(target);
115
+ if (metadata === undefined || isVerified(verifiedAccessorTargets, reader, target)) {
116
+ return metadata;
117
+ }
118
+ if (!Array.isArray(metadata)) {
119
+ throw new InvalidMetadataError(target.name, "accessor metadata: expected an array");
120
+ }
121
+ for (const [position, entry] of metadata.entries()) {
122
+ if (typeof entry !== "object" || entry === null) {
123
+ throw new InvalidMetadataError(target.name, `accessor metadata: [${String(position)}] is not an object`);
124
+ }
125
+ const key = Reflect.get(entry, "key");
126
+ if (typeof key !== "string" && typeof key !== "symbol") {
127
+ throw new InvalidMetadataError(target.name, `accessor metadata: [${String(position)}].key is not a string or symbol`);
128
+ }
129
+ const descriptor = Reflect.get(entry, "descriptor");
130
+ if (typeof descriptor !== "object" || descriptor === null) {
131
+ throw new InvalidMetadataError(target.name, `accessor metadata: [${String(position)}].descriptor is not an object`);
132
+ }
133
+ const dependency = Reflect.get(descriptor, "token");
134
+ if (typeof dependency !== "object" && typeof dependency !== "function") {
135
+ throw new InvalidMetadataError(target.name, `accessor metadata: [${String(position)}].descriptor.token is not a token or a class`);
136
+ }
137
+ }
138
+ markVerified(verifiedAccessorTargets, reader, target);
139
+ return metadata;
140
+ }
141
+ /**
142
+ * @since 0.5.0-canary.8
143
+ */
144
+ export class ClassIntrospector {
145
+ // Unallocated until the container resolves its first class binding — a container bound entirely
146
+ // to constants, factories or aliases never introspects one.
147
+ #constructorMetadata;
148
+ #hasPostConstruct;
149
+ #needsActiveContainer;
150
+ #reader;
151
+ #container;
152
+ constructor(reader, container) {
153
+ this.#reader = reader;
154
+ this.#container = container;
155
+ }
156
+ constructorMetadata(target) {
157
+ const cached = this.#constructorMetadata?.get(target);
158
+ if (cached !== undefined) {
159
+ return cached === null ? undefined : cached;
160
+ }
161
+ const metadata = this.#reader.getConstructorMetadata(target);
162
+ (this.#constructorMetadata ??= new WeakMap()).set(target, metadata ?? null);
163
+ return metadata;
164
+ }
165
+ /**
166
+ * Whether the class has a `@postConstruct` hook, or `undefined` until {@link discoverPostConstruct}.
167
+ *
168
+ * @remarks Callers treat unknown as "assume it does", so the first activation settles it.
169
+ */
170
+ knownPostConstruct(target) {
171
+ return this.#hasPostConstruct?.get(target);
172
+ }
173
+ discoverPostConstruct(target) {
174
+ const lifecycle = this.#reader.getLifecycleMetadata(target);
175
+ (this.#hasPostConstruct ??= new WeakMap()).set(target, lifecycle !== undefined && lifecycle.postConstruct !== undefined && lifecycle.postConstruct.length > 0);
176
+ }
177
+ /** True when the class has accessor injection, which reads the container during construction. */
178
+ needsActiveContainer(target) {
179
+ let needsActiveContainer = this.#needsActiveContainer?.get(target);
180
+ if (needsActiveContainer === undefined) {
181
+ needsActiveContainer = (this.#reader.getAccessorMetadata?.(target)?.length ?? 0) > 0;
182
+ (this.#needsActiveContainer ??= new WeakMap()).set(target, needsActiveContainer);
183
+ }
184
+ return needsActiveContainer;
185
+ }
186
+ instantiate(target, deps, resolution) {
187
+ const invokable = target;
188
+ if (!this.needsActiveContainer(target)) {
189
+ return new invokable(...deps);
190
+ }
191
+ return runWithAmbientResolution(this.#container, resolution, () => new invokable(...deps));
192
+ }
193
+ }
194
+ //# sourceMappingURL=class-introspector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"class-introspector.js","sourceRoot":"","sources":["../../../src/resolution/cache/class-introspector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,84 @@
1
+ /** The `ResolutionContext` a factory is handed, and the callbacks the resolver answers it with. */
2
+ import type { Token } from "#/core/token";
3
+ import type { BindingIdentifier, BindingKind, BindingScope, ConstraintContext, Constructor, ResolutionFrame, ResolutionContext, ResolveOptions } from "#/core/types";
4
+ import type { BranchDepth, OwnedBranchStack } from "#/resolution/path/resolution-path";
5
+ /**
6
+ * @since 0.3.16-canary.0
7
+ */
8
+ export interface ResolverCallbacks {
9
+ resolveFromContext<Value>(token: Token<Value> | Constructor<Value>, resolutionStack: Array<ResolutionFrame>): Value;
10
+ resolve<Value>(token: Token<Value> | Constructor<Value>, options: ResolveOptions | undefined, resolutionStack: Array<ResolutionFrame>): Value;
11
+ resolveAsyncFromContext<Value>(token: Token<Value> | Constructor<Value>, resolutionStack: Array<ResolutionFrame>, branchDepth: BranchDepth): Promise<Value>;
12
+ /** Not one of the eight `Value`-naming entry points: its caller is, and casts once. */
13
+ resolveAsyncFromCascade(token: Token<unknown> | Constructor): Promise<unknown>;
14
+ resolveAsync<Value>(token: Token<Value> | Constructor<Value>, options: ResolveOptions | undefined, resolutionStack: Array<ResolutionFrame>): Promise<Value>;
15
+ resolveOptional<Value>(token: Token<Value> | Constructor<Value>, options: ResolveOptions | undefined, resolutionStack: Array<ResolutionFrame>): Value | undefined;
16
+ resolveOptionalAsync<Value>(token: Token<Value> | Constructor<Value>, options: ResolveOptions | undefined, resolutionStack: Array<ResolutionFrame>): Promise<Value | undefined>;
17
+ resolveAll<Value>(token: Token<Value> | Constructor<Value>, options: ResolveOptions | undefined, resolutionStack: Array<ResolutionFrame>): Array<Value>;
18
+ resolveAllAsync<Value>(token: Token<Value> | Constructor<Value>, options: ResolveOptions | undefined, resolutionStack: Array<ResolutionFrame>): Promise<Array<Value>>;
19
+ }
20
+ /**
21
+ * @since 0.3.16-canary.0
22
+ */
23
+ export declare class DefaultResolutionContext implements ResolutionContext {
24
+ #private;
25
+ constructor(resolver: ResolverCallbacks, resolutionStack: Array<ResolutionFrame>, currentOptions: ResolveOptions | undefined);
26
+ get graph(): ConstraintContext;
27
+ reset(resolver: ResolverCallbacks, resolutionStack: Array<ResolutionFrame>, currentOptions: ResolveOptions | undefined): void;
28
+ resolve<Value>(token: Token<Value> | Constructor<Value>, options?: ResolveOptions): Value;
29
+ resolveAsync<Value>(token: Token<Value> | Constructor<Value>, options?: ResolveOptions): Promise<Value>;
30
+ resolveOptional<Value>(token: Token<Value> | Constructor<Value>, options?: ResolveOptions): Value | undefined;
31
+ resolveOptionalAsync<Value>(token: Token<Value> | Constructor<Value>, options?: ResolveOptions): Promise<Value | undefined>;
32
+ resolveAll<Value>(token: Token<Value> | Constructor<Value>, options?: ResolveOptions): Array<Value>;
33
+ resolveAllAsync<Value>(token: Token<Value> | Constructor<Value>, options?: ResolveOptions): Promise<Array<Value>>;
34
+ }
35
+ /**
36
+ * One async level's resolution context, which is also its branch of the resolution stack.
37
+ *
38
+ * @remarks Separate from {@link DefaultResolutionContext} so the sync lane's pooled context keeps
39
+ * reading its stack as a plain field: only an async branch has a prefix to take, because an async
40
+ * level owns its branch of the stack.
41
+ *
42
+ * @since 0.5.0-canary.9
43
+ */
44
+ export declare class AsyncLevelContext implements ResolutionContext {
45
+ #private;
46
+ /**
47
+ * @param resolver - the engine callbacks every request on this level goes through
48
+ * @param resolutionStack - this level's own branch; the depth is read off it rather than passed,
49
+ * so the two cannot disagree about where this level sits
50
+ * @param currentOptions - the options of the request that opened this level, if any
51
+ */
52
+ constructor(resolver: ResolverCallbacks, resolutionStack: OwnedBranchStack, currentOptions: ResolveOptions | undefined);
53
+ get graph(): ConstraintContext;
54
+ resolve<Value>(token: Token<Value> | Constructor<Value>, options?: ResolveOptions): Value;
55
+ resolveAsync<Value>(token: Token<Value> | Constructor<Value>, options?: ResolveOptions): Promise<Value>;
56
+ resolveOptional<Value>(token: Token<Value> | Constructor<Value>, options?: ResolveOptions): Value | undefined;
57
+ resolveOptionalAsync<Value>(token: Token<Value> | Constructor<Value>, options?: ResolveOptions): Promise<Value | undefined>;
58
+ resolveAll<Value>(token: Token<Value> | Constructor<Value>, options?: ResolveOptions): Array<Value>;
59
+ resolveAllAsync<Value>(token: Token<Value> | Constructor<Value>, options?: ResolveOptions): Promise<Array<Value>>;
60
+ }
61
+ /**
62
+ * The one context every level of an open synchronous factory cascade shares.
63
+ *
64
+ * @remarks It carries no per-level state at all: while the cascade is open, the resolver's stack
65
+ * *is* this level's ancestor chain, so nothing has to be allocated per level.
66
+ *
67
+ * @since 0.5.0-canary.9
68
+ */
69
+ export declare class AsyncCascadeContext implements ResolutionContext {
70
+ #private;
71
+ constructor(resolver: ResolverCallbacks, cascadeStack: Array<ResolutionFrame>);
72
+ get graph(): ConstraintContext;
73
+ resolve<Value>(token: Token<Value> | Constructor<Value>, options?: ResolveOptions): Value;
74
+ resolveAsync<Value>(token: Token<Value> | Constructor<Value>, options?: ResolveOptions): Promise<Value>;
75
+ resolveOptional<Value>(token: Token<Value> | Constructor<Value>, options?: ResolveOptions): Value | undefined;
76
+ resolveOptionalAsync<Value>(token: Token<Value> | Constructor<Value>, options?: ResolveOptions): Promise<Value | undefined>;
77
+ resolveAll<Value>(token: Token<Value> | Constructor<Value>, options?: ResolveOptions): Array<Value>;
78
+ resolveAllAsync<Value>(token: Token<Value> | Constructor<Value>, options?: ResolveOptions): Promise<Array<Value>>;
79
+ }
80
+ /**
81
+ * @since 0.3.16-canary.0
82
+ */
83
+ export declare function buildResolutionFrame(tokenName: string, scope: BindingScope, bindingId: BindingIdentifier, kind: BindingKind, slot: ResolutionFrame["slot"]): ResolutionFrame;
84
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/resolution/context.ts"],"names":[],"mappings":"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"}
@@ -1,55 +1,29 @@
1
- import { UNOWNED_BRANCH } from "#/resolution/resolution-path";
2
- // ── Active container ──────────────────────────────────────────────────────────
3
- let activeContainer;
4
- /**
5
- * @since 0.3.16-canary.0
6
- */
7
- export function runWithContainer(container, fn) {
8
- const prev = activeContainer;
9
- activeContainer = container;
10
- try {
11
- return fn();
12
- }
13
- finally {
14
- activeContainer = prev;
15
- }
16
- }
17
- /**
18
- * @since 0.3.16-canary.0
19
- */
20
- export function getActiveContainer() {
21
- return activeContainer;
22
- }
1
+ import { UNOWNED_BRANCH } from "#/resolution/path/resolution-path";
23
2
  /**
24
3
  * @since 0.3.16-canary.0
25
4
  */
26
5
  export class DefaultResolutionContext {
27
6
  #resolver;
28
- #resolutionPath;
29
7
  #resolutionStack;
30
8
  #currentOptions;
31
- constructor(resolver, resolutionPath, resolutionStack, currentOptions) {
9
+ constructor(resolver, resolutionStack, currentOptions) {
32
10
  this.#resolver = resolver;
33
- this.#resolutionPath = resolutionPath;
34
11
  this.#resolutionStack = resolutionStack;
35
12
  this.#currentOptions = currentOptions;
36
13
  }
37
14
  #graph;
38
15
  get graph() {
39
16
  if (this.#graph === undefined) {
40
- this.#graph = new DefaultConstraintContext(this.#resolutionPath, this.#resolutionStack, this.#currentOptions);
17
+ this.#graph = new DefaultConstraintContext(this.#resolutionStack, this.#currentOptions);
41
18
  }
42
19
  return this.#graph;
43
20
  }
44
- reset(resolver, resolutionPath, resolutionStack, currentOptions) {
21
+ reset(resolver, resolutionStack, currentOptions) {
45
22
  // Compared before storing: a pooled context lives long enough to be in old space, so storing a
46
- // pointer costs a write barrier, and a sync resolve hands every depth the same two arrays.
23
+ // pointer costs a write barrier, and a sync resolve hands every depth the same stack.
47
24
  if (this.#resolver !== resolver) {
48
25
  this.#resolver = resolver;
49
26
  }
50
- if (this.#resolutionPath !== resolutionPath) {
51
- this.#resolutionPath = resolutionPath;
52
- }
53
27
  if (this.#resolutionStack !== resolutionStack) {
54
28
  this.#resolutionStack = resolutionStack;
55
29
  }
@@ -60,158 +34,158 @@ export class DefaultResolutionContext {
60
34
  }
61
35
  resolve(token, options) {
62
36
  if (options === undefined) {
63
- return this.#resolver.resolveFromContext(token, this.#resolutionPath, this.#resolutionStack);
37
+ return this.#resolver.resolveFromContext(token, this.#resolutionStack);
64
38
  }
65
- return this.#resolver.resolve(token, options, this.#resolutionPath, this.#resolutionStack);
39
+ return this.#resolver.resolve(token, options, this.#resolutionStack);
66
40
  }
67
41
  resolveAsync(token, options) {
68
42
  if (options === undefined) {
69
43
  // UNOWNED_BRANCH: this frame's array is a sync stack it will pop, so the lane must copy it.
70
- return this.#resolver.resolveAsyncFromContext(token, this.#resolutionPath, this.#resolutionStack, UNOWNED_BRANCH);
44
+ return this.#resolver.resolveAsyncFromContext(token, this.#resolutionStack, UNOWNED_BRANCH);
71
45
  }
72
- return this.#resolver.resolveAsync(token, options, this.#resolutionPath, this.#resolutionStack);
46
+ return this.#resolver.resolveAsync(token, options, this.#resolutionStack);
73
47
  }
74
48
  resolveOptional(token, options) {
75
- return this.#resolver.resolveOptional(token, options, this.#resolutionPath, this.#resolutionStack);
49
+ return this.#resolver.resolveOptional(token, options, this.#resolutionStack);
76
50
  }
77
51
  resolveOptionalAsync(token, options) {
78
- return this.#resolver.resolveOptionalAsync(token, options, this.#resolutionPath, this.#resolutionStack);
52
+ return this.#resolver.resolveOptionalAsync(token, options, this.#resolutionStack);
79
53
  }
80
54
  resolveAll(token, options) {
81
- return this.#resolver.resolveAll(token, options, this.#resolutionPath, this.#resolutionStack);
55
+ return this.#resolver.resolveAll(token, options, this.#resolutionStack);
82
56
  }
83
57
  resolveAllAsync(token, options) {
84
- return this.#resolver.resolveAllAsync(token, options, this.#resolutionPath, this.#resolutionStack);
58
+ return this.#resolver.resolveAllAsync(token, options, this.#resolutionStack);
85
59
  }
86
60
  }
87
61
  /**
88
- * One async level's resolution context, which is also its branch of the resolution path.
62
+ * One async level's resolution context, which is also its branch of the resolution stack.
89
63
  *
90
64
  * @remarks Separate from {@link DefaultResolutionContext} so the sync lane's pooled context keeps
91
- * reading its arrays as plain fields: only an async branch has a prefix to take. See
92
- * `ARCHITECTURE.md` — an async level owns its branch of the path.
65
+ * reading its stack as a plain field: only an async branch has a prefix to take, because an async
66
+ * level owns its branch of the stack.
93
67
  *
94
68
  * @since 0.5.0-canary.9
95
69
  */
96
70
  export class AsyncLevelContext {
97
71
  #resolver;
98
- #resolutionPath;
99
72
  #resolutionStack;
100
73
  #currentOptions;
101
74
  #branchDepth;
102
75
  /**
103
- * @param resolutionPath - this level's own branch; the depth is read off it rather than passed,
76
+ * @param resolver - the engine callbacks every request on this level goes through
77
+ * @param resolutionStack - this level's own branch; the depth is read off it rather than passed,
104
78
  * so the two cannot disagree about where this level sits
79
+ * @param currentOptions - the options of the request that opened this level, if any
105
80
  */
106
- constructor(resolver, resolutionPath, resolutionStack, currentOptions) {
81
+ constructor(resolver, resolutionStack, currentOptions) {
107
82
  this.#resolver = resolver;
108
- this.#resolutionPath = resolutionPath;
109
83
  this.#resolutionStack = resolutionStack;
110
84
  this.#currentOptions = currentOptions;
111
- this.#branchDepth = resolutionPath.length;
85
+ this.#branchDepth = resolutionStack.length;
112
86
  }
113
87
  #graph;
114
- #exactPathCache;
115
88
  #exactStackCache;
116
89
  get graph() {
117
90
  if (this.#graph === undefined) {
118
- this.#graph = new DefaultConstraintContext(this.#exactPath(), this.#exactStack(), this.#currentOptions);
91
+ this.#graph = new DefaultConstraintContext(this.#exactStack(), this.#currentOptions);
119
92
  }
120
93
  return this.#graph;
121
94
  }
122
- // The path is append-only and a descendant may already have grown it past this level, so every
95
+ // The stack is append-only and a descendant may already have grown it past this level, so every
123
96
  // caller but the async lane is handed this branch's prefix. It is fixed for the level's lifetime.
124
- #exactPath() {
125
- return (this.#exactPathCache ??= this.#resolutionPath.slice(0, this.#branchDepth));
126
- }
127
97
  #exactStack() {
128
98
  return (this.#exactStackCache ??= this.#resolutionStack.slice(0, this.#branchDepth));
129
99
  }
130
100
  resolve(token, options) {
131
101
  if (options === undefined) {
132
- return this.#resolver.resolveFromContext(token, this.#exactPath(), this.#exactStack());
102
+ return this.#resolver.resolveFromContext(token, this.#exactStack());
133
103
  }
134
- return this.#resolver.resolve(token, options, this.#exactPath(), this.#exactStack());
104
+ return this.#resolver.resolve(token, options, this.#exactStack());
135
105
  }
136
106
  resolveAsync(token, options) {
137
107
  if (options === undefined) {
138
108
  // The hot lane: the resolver reads this branch by depth, so nothing is materialized.
139
- return this.#resolver.resolveAsyncFromContext(token, this.#resolutionPath, this.#resolutionStack, this.#branchDepth);
109
+ return this.#resolver.resolveAsyncFromContext(token, this.#resolutionStack, this.#branchDepth);
140
110
  }
141
- return this.#resolver.resolveAsync(token, options, this.#exactPath(), this.#exactStack());
111
+ return this.#resolver.resolveAsync(token, options, this.#exactStack());
142
112
  }
143
113
  resolveOptional(token, options) {
144
- return this.#resolver.resolveOptional(token, options, this.#exactPath(), this.#exactStack());
114
+ return this.#resolver.resolveOptional(token, options, this.#exactStack());
145
115
  }
146
116
  resolveOptionalAsync(token, options) {
147
- return this.#resolver.resolveOptionalAsync(token, options, this.#exactPath(), this.#exactStack());
117
+ return this.#resolver.resolveOptionalAsync(token, options, this.#exactStack());
148
118
  }
149
119
  resolveAll(token, options) {
150
- return this.#resolver.resolveAll(token, options, this.#exactPath(), this.#exactStack());
120
+ return this.#resolver.resolveAll(token, options, this.#exactStack());
151
121
  }
152
122
  resolveAllAsync(token, options) {
153
- return this.#resolver.resolveAllAsync(token, options, this.#exactPath(), this.#exactStack());
123
+ return this.#resolver.resolveAllAsync(token, options, this.#exactStack());
154
124
  }
155
125
  }
156
126
  /**
157
127
  * The one context every level of an open synchronous factory cascade shares.
158
128
  *
159
- * @remarks It carries no per-level state at all: while the cascade is open, the resolver's arrays
160
- * *are* this level's ancestor chain, so nothing has to be allocated per level. See
161
- * `ARCHITECTURE.md` — the cascade lane.
129
+ * @remarks It carries no per-level state at all: while the cascade is open, the resolver's stack
130
+ * *is* this level's ancestor chain, so nothing has to be allocated per level.
162
131
  *
163
132
  * @since 0.5.0-canary.9
164
133
  */
165
134
  export class AsyncCascadeContext {
166
135
  #resolver;
167
- #cascadePath;
168
136
  #cascadeStack;
169
- constructor(resolver, cascadePath, cascadeStack) {
137
+ constructor(resolver, cascadeStack) {
170
138
  this.#resolver = resolver;
171
- this.#cascadePath = cascadePath;
172
139
  this.#cascadeStack = cascadeStack;
173
140
  }
174
141
  get graph() {
175
142
  // Not memoized: this context outlives every level, so a cached graph would describe whichever
176
- // level asked first. The cascade arrays are only this level's ancestors while it is open.
177
- return new DefaultConstraintContext(this.#cascadePath, this.#cascadeStack, undefined);
143
+ // level asked first. The cascade stack is only this level's ancestors while it is open.
144
+ return new DefaultConstraintContext(this.#cascadeStack, undefined);
178
145
  }
179
146
  resolve(token, options) {
180
147
  if (options === undefined) {
181
- return this.#resolver.resolveFromContext(token, this.#cascadePath, this.#cascadeStack);
148
+ return this.#resolver.resolveFromContext(token, this.#cascadeStack);
182
149
  }
183
- return this.#resolver.resolve(token, options, this.#cascadePath, this.#cascadeStack);
150
+ return this.#resolver.resolve(token, options, this.#cascadeStack);
184
151
  }
185
152
  resolveAsync(token, options) {
186
153
  if (options === undefined) {
187
154
  return this.#resolver.resolveAsyncFromCascade(token);
188
155
  }
189
- return this.#resolver.resolveAsync(token, options, [...this.#cascadePath], [...this.#cascadeStack]);
156
+ return this.#resolver.resolveAsync(token, options, [...this.#cascadeStack]);
190
157
  }
191
158
  resolveOptional(token, options) {
192
- return this.#resolver.resolveOptional(token, options, this.#cascadePath, this.#cascadeStack);
159
+ return this.#resolver.resolveOptional(token, options, this.#cascadeStack);
193
160
  }
194
161
  resolveOptionalAsync(token, options) {
195
- return this.#resolver.resolveOptionalAsync(token, options, [...this.#cascadePath], [...this.#cascadeStack]);
162
+ return this.#resolver.resolveOptionalAsync(token, options, [...this.#cascadeStack]);
196
163
  }
197
164
  resolveAll(token, options) {
198
- return this.#resolver.resolveAll(token, options, this.#cascadePath, this.#cascadeStack);
165
+ return this.#resolver.resolveAll(token, options, this.#cascadeStack);
199
166
  }
200
167
  resolveAllAsync(token, options) {
201
- return this.#resolver.resolveAllAsync(token, options, [...this.#cascadePath], [...this.#cascadeStack]);
168
+ return this.#resolver.resolveAllAsync(token, options, [...this.#cascadeStack]);
202
169
  }
203
170
  }
204
171
  class DefaultConstraintContext {
205
- resolutionPath;
206
172
  resolutionStack;
207
173
  parent;
208
174
  currentResolveOptions;
209
- constructor(resolutionPath, resolutionStack, currentResolveOptions) {
210
- this.resolutionPath = resolutionPath;
175
+ constructor(resolutionStack, currentResolveOptions) {
211
176
  this.resolutionStack = resolutionStack;
212
177
  this.parent = resolutionStack.at(-1);
213
178
  this.currentResolveOptions = currentResolveOptions;
214
179
  }
180
+ // Derived per read, never cached: the stack this context aliases may be live, and the names must
181
+ // report it as it stands — exactly as the dedicated name array did.
182
+ get resolutionPath() {
183
+ const names = new Array(this.resolutionStack.length);
184
+ for (let index = 0; index < this.resolutionStack.length; index += 1) {
185
+ names[index] = this.resolutionStack[index].tokenName;
186
+ }
187
+ return names;
188
+ }
215
189
  #ancestors;
216
190
  get ancestors() {
217
191
  if (this.#ancestors === undefined) {
@@ -226,4 +200,4 @@ class DefaultConstraintContext {
226
200
  export function buildResolutionFrame(tokenName, scope, bindingId, kind, slot) {
227
201
  return { tokenName, scope, bindingId, kind, slot };
228
202
  }
229
- //# sourceMappingURL=environment.js.map
203
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/resolution/context.ts"],"names":[],"mappings":"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"}