@codefast/di 1.0.0-canary.6 → 1.0.0-canary.7

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 (175) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/README.md +67 -499
  3. package/dist/binding-scope.d.ts +10 -0
  4. package/dist/binding-scope.d.ts.map +1 -0
  5. package/dist/binding-scope.js +24 -0
  6. package/dist/binding-scope.js.map +1 -0
  7. package/dist/binding-select.d.ts +16 -0
  8. package/dist/binding-select.d.ts.map +1 -0
  9. package/dist/binding-select.js +130 -0
  10. package/dist/binding-select.js.map +1 -0
  11. package/dist/binding.d.ts +194 -0
  12. package/dist/binding.d.ts.map +1 -0
  13. package/dist/binding.js +46 -0
  14. package/dist/binding.js.map +1 -0
  15. package/dist/constraints.d.ts +51 -0
  16. package/dist/constraints.d.ts.map +1 -0
  17. package/dist/constraints.js +88 -0
  18. package/dist/constraints.js.map +1 -0
  19. package/dist/{constructor-type.d.mts → constructor-type.d.ts} +3 -5
  20. package/dist/constructor-type.d.ts.map +1 -0
  21. package/dist/constructor-type.js +2 -0
  22. package/dist/constructor-type.js.map +1 -0
  23. package/dist/container.d.ts +58 -0
  24. package/dist/container.d.ts.map +1 -0
  25. package/dist/container.js +853 -0
  26. package/dist/container.js.map +1 -0
  27. package/dist/decorators/inject.d.ts +46 -0
  28. package/dist/decorators/inject.d.ts.map +1 -0
  29. package/dist/decorators/inject.js +145 -0
  30. package/dist/decorators/inject.js.map +1 -0
  31. package/dist/decorators/injectable.d.ts +29 -0
  32. package/dist/decorators/injectable.d.ts.map +1 -0
  33. package/dist/decorators/injectable.js +53 -0
  34. package/dist/decorators/injectable.js.map +1 -0
  35. package/dist/decorators/lifecycle-decorators.d.ts +9 -0
  36. package/dist/decorators/lifecycle-decorators.d.ts.map +1 -0
  37. package/dist/decorators/lifecycle-decorators.js +40 -0
  38. package/dist/decorators/lifecycle-decorators.js.map +1 -0
  39. package/dist/dependency-graph.d.ts +40 -0
  40. package/dist/dependency-graph.d.ts.map +1 -0
  41. package/dist/dependency-graph.js +66 -0
  42. package/dist/dependency-graph.js.map +1 -0
  43. package/dist/environment.d.ts +51 -0
  44. package/dist/environment.d.ts.map +1 -0
  45. package/dist/environment.js +100 -0
  46. package/dist/environment.js.map +1 -0
  47. package/dist/errors.d.ts +150 -0
  48. package/dist/errors.d.ts.map +1 -0
  49. package/dist/errors.js +197 -0
  50. package/dist/errors.js.map +1 -0
  51. package/dist/graph-adapters/cytoscape.d.ts +33 -0
  52. package/dist/graph-adapters/cytoscape.d.ts.map +1 -0
  53. package/dist/graph-adapters/cytoscape.js +30 -0
  54. package/dist/graph-adapters/cytoscape.js.map +1 -0
  55. package/dist/graph-adapters/dot.d.ts +6 -0
  56. package/dist/graph-adapters/dot.d.ts.map +1 -0
  57. package/dist/graph-adapters/dot.js +18 -0
  58. package/dist/graph-adapters/dot.js.map +1 -0
  59. package/dist/graph-adapters/reactflow.d.ts +38 -0
  60. package/dist/graph-adapters/reactflow.d.ts.map +1 -0
  61. package/dist/graph-adapters/reactflow.js +23 -0
  62. package/dist/graph-adapters/reactflow.js.map +1 -0
  63. package/dist/index.d.ts +25 -0
  64. package/dist/index.d.ts.map +1 -0
  65. package/dist/index.js +21 -0
  66. package/dist/index.js.map +1 -0
  67. package/dist/inspector.d.ts +44 -0
  68. package/dist/inspector.d.ts.map +1 -0
  69. package/dist/inspector.js +82 -0
  70. package/dist/inspector.js.map +1 -0
  71. package/dist/lifecycle.d.ts +21 -0
  72. package/dist/lifecycle.d.ts.map +1 -0
  73. package/dist/lifecycle.js +174 -0
  74. package/dist/lifecycle.js.map +1 -0
  75. package/dist/metadata/{metadata-keys.d.mts → metadata-keys.d.ts} +5 -7
  76. package/dist/metadata/metadata-keys.d.ts.map +1 -0
  77. package/dist/metadata/metadata-keys.js +25 -0
  78. package/dist/metadata/metadata-keys.js.map +1 -0
  79. package/dist/metadata/metadata-reader-token.d.ts +7 -0
  80. package/dist/metadata/metadata-reader-token.d.ts.map +1 -0
  81. package/dist/metadata/metadata-reader-token.js +6 -0
  82. package/dist/metadata/metadata-reader-token.js.map +1 -0
  83. package/dist/metadata/metadata-types.d.ts +48 -0
  84. package/dist/metadata/metadata-types.d.ts.map +1 -0
  85. package/dist/metadata/metadata-types.js +2 -0
  86. package/dist/metadata/metadata-types.js.map +1 -0
  87. package/dist/metadata/symbol-metadata-reader.d.ts +20 -0
  88. package/dist/metadata/symbol-metadata-reader.d.ts.map +1 -0
  89. package/dist/metadata/symbol-metadata-reader.js +34 -0
  90. package/dist/metadata/symbol-metadata-reader.js.map +1 -0
  91. package/dist/module.d.ts +60 -0
  92. package/dist/module.d.ts.map +1 -0
  93. package/dist/module.js +47 -0
  94. package/dist/module.js.map +1 -0
  95. package/dist/registry.d.ts +41 -0
  96. package/dist/registry.d.ts.map +1 -0
  97. package/dist/registry.js +208 -0
  98. package/dist/registry.js.map +1 -0
  99. package/dist/resolve-options.d.ts +19 -0
  100. package/dist/resolve-options.d.ts.map +1 -0
  101. package/dist/resolve-options.js +32 -0
  102. package/dist/resolve-options.js.map +1 -0
  103. package/dist/resolver.d.ts +90 -0
  104. package/dist/resolver.d.ts.map +1 -0
  105. package/dist/resolver.js +1208 -0
  106. package/dist/resolver.js.map +1 -0
  107. package/dist/scope.d.ts +25 -0
  108. package/dist/scope.d.ts.map +1 -0
  109. package/dist/scope.js +61 -0
  110. package/dist/scope.js.map +1 -0
  111. package/dist/token.d.ts +23 -0
  112. package/dist/token.d.ts.map +1 -0
  113. package/dist/token.js +25 -0
  114. package/dist/token.js.map +1 -0
  115. package/dist/types.d.ts +90 -0
  116. package/dist/types.d.ts.map +1 -0
  117. package/dist/types.js +2 -0
  118. package/dist/types.js.map +1 -0
  119. package/package.json +89 -80
  120. package/dist/binding-scope.d.mts +0 -13
  121. package/dist/binding-scope.mjs +0 -21
  122. package/dist/binding-select.d.mts +0 -19
  123. package/dist/binding-select.mjs +0 -72
  124. package/dist/binding.d.mts +0 -191
  125. package/dist/binding.mjs +0 -36
  126. package/dist/constraints.d.mts +0 -55
  127. package/dist/constraints.mjs +0 -87
  128. package/dist/constructor-type.mjs +0 -1
  129. package/dist/container.d.mts +0 -62
  130. package/dist/container.mjs +0 -741
  131. package/dist/decorators/inject.d.mts +0 -49
  132. package/dist/decorators/inject.mjs +0 -136
  133. package/dist/decorators/injectable.d.mts +0 -32
  134. package/dist/decorators/injectable.mjs +0 -57
  135. package/dist/decorators/lifecycle-decorators.d.mts +0 -11
  136. package/dist/decorators/lifecycle-decorators.mjs +0 -38
  137. package/dist/dependency-graph.d.mts +0 -43
  138. package/dist/dependency-graph.mjs +0 -63
  139. package/dist/environment.d.mts +0 -55
  140. package/dist/environment.mjs +0 -98
  141. package/dist/errors.d.mts +0 -153
  142. package/dist/errors.mjs +0 -197
  143. package/dist/graph-adapters/cytoscape.d.mts +0 -36
  144. package/dist/graph-adapters/cytoscape.mjs +0 -26
  145. package/dist/graph-adapters/dot.d.mts +0 -9
  146. package/dist/graph-adapters/dot.mjs +0 -20
  147. package/dist/graph-adapters/reactflow.d.mts +0 -41
  148. package/dist/graph-adapters/reactflow.mjs +0 -29
  149. package/dist/index.d.mts +0 -18
  150. package/dist/index.mjs +0 -12
  151. package/dist/inspector.d.mts +0 -48
  152. package/dist/inspector.mjs +0 -71
  153. package/dist/lifecycle.d.mts +0 -25
  154. package/dist/lifecycle.mjs +0 -118
  155. package/dist/metadata/metadata-keys.mjs +0 -27
  156. package/dist/metadata/metadata-reader-token.d.mts +0 -10
  157. package/dist/metadata/metadata-reader-token.mjs +0 -8
  158. package/dist/metadata/metadata-types.d.mts +0 -51
  159. package/dist/metadata/metadata-types.mjs +0 -1
  160. package/dist/metadata/symbol-metadata-reader.d.mts +0 -23
  161. package/dist/metadata/symbol-metadata-reader.mjs +0 -29
  162. package/dist/module.d.mts +0 -62
  163. package/dist/module.mjs +0 -42
  164. package/dist/registry.d.mts +0 -45
  165. package/dist/registry.mjs +0 -163
  166. package/dist/resolve-options.d.mts +0 -22
  167. package/dist/resolve-options.mjs +0 -28
  168. package/dist/resolver.d.mts +0 -94
  169. package/dist/resolver.mjs +0 -767
  170. package/dist/scope.d.mts +0 -28
  171. package/dist/scope.mjs +0 -58
  172. package/dist/token.d.mts +0 -25
  173. package/dist/token.mjs +0 -22
  174. package/dist/types.d.mts +0 -92
  175. package/dist/types.mjs +0 -1
package/dist/resolver.mjs DELETED
@@ -1,767 +0,0 @@
1
- import { AsyncResolutionError, CircularDependencyError, InternalError, MissingMetadataError, MissingScopeContextError, NoMatchingBindingError, TokenNotBoundError } from "./errors.mjs";
2
- import { selectAllBindings, selectBinding } from "./binding-select.mjs";
3
- import { tokenName } from "./token.mjs";
4
- import { DefaultResolutionContext, buildResolutionFrame, runWithContainer } from "./environment.mjs";
5
- import { injectionSlotToResolveOptions } from "./resolve-options.mjs";
6
- //#region src/resolver.ts
7
- const RESOLUTION_SET_KEY = Symbol("di:resolution-set");
8
- const RESOLUTION_SET_THRESHOLD = 32;
9
- const EMPTY_STRING_LIST = [];
10
- const EMPTY_FRAME_LIST = [];
11
- const ROOT_CONSTRAINT_CONTEXT = {
12
- resolutionPath: EMPTY_STRING_LIST,
13
- resolutionStack: EMPTY_FRAME_LIST,
14
- parent: void 0,
15
- ancestors: EMPTY_FRAME_LIST,
16
- currentResolveOptions: void 0
17
- };
18
- /**
19
- * @since 0.3.16-canary.0
20
- */
21
- var DependencyResolver = class {
22
- _registry;
23
- _scope;
24
- _lifecycle;
25
- _metadataReader;
26
- _container;
27
- _parent;
28
- _frameByBindingId = /* @__PURE__ */ new Map();
29
- _syncResolutionContextPool = [];
30
- _deepCycleMarks = /* @__PURE__ */ new Map();
31
- _deepCycleGen = 0;
32
- _deepActiveLevels = 0;
33
- _deepSyncCtx;
34
- _deepSyncCtxPath;
35
- _deepAsyncCtx;
36
- _deepAsyncCtxPath;
37
- _deepAsyncActiveLevels = 0;
38
- _classHasPostConstruct = /* @__PURE__ */ new WeakMap();
39
- _classNeedsActiveContainer = /* @__PURE__ */ new WeakMap();
40
- _classConstructorMetadata = /* @__PURE__ */ new WeakMap();
41
- _activationNeedByBindingId = /* @__PURE__ */ new Map();
42
- _activationCacheVersion = -1;
43
- constructor(_registry, _scope, _lifecycle, _metadataReader, _container, _parent) {
44
- this._registry = _registry;
45
- this._scope = _scope;
46
- this._lifecycle = _lifecycle;
47
- this._metadataReader = _metadataReader;
48
- this._container = _container;
49
- this._parent = _parent;
50
- }
51
- _findBinding(token, options, resolutionPath, resolutionStack) {
52
- if (options === void 0) {
53
- const fastDefaultBinding = this._registry.getFastDefault(token);
54
- if (fastDefaultBinding !== void 0) return {
55
- binding: fastDefaultBinding,
56
- owner: this
57
- };
58
- }
59
- if (options?.name !== void 0 && options.tag === void 0 && (options.tags?.length ?? 0) === 0) {
60
- const namedBinding = this._registry.getSimpleNamed(token, options.name);
61
- if (namedBinding !== void 0 && this._matchesBindingFast(namedBinding, options, resolutionPath, resolutionStack)) return {
62
- binding: namedBinding,
63
- owner: this
64
- };
65
- }
66
- if (options !== void 0 && options.name === void 0 && options.tag === void 0 && (options.tags?.length ?? 0) === 1) {
67
- const [tagKey, tagValue] = options.tags[0];
68
- const tagged = this._registry.getSimpleTagged(token, tagKey, tagValue);
69
- if (tagged !== void 0) return {
70
- binding: tagged,
71
- owner: this
72
- };
73
- }
74
- const bindings = this._registry.getAll(token);
75
- if (bindings.length > 0) {
76
- if (bindings.length === 1) {
77
- const onlyBinding = bindings[0];
78
- const isDefaultSlot = onlyBinding.slot.name === void 0 && onlyBinding.slot.tags.length === 0;
79
- if (options === void 0 && isDefaultSlot && onlyBinding.predicate === void 0) return {
80
- binding: onlyBinding,
81
- owner: this
82
- };
83
- if (this._matchesBindingFast(onlyBinding, options, resolutionPath, resolutionStack)) return {
84
- binding: onlyBinding,
85
- owner: this
86
- };
87
- }
88
- const binding = selectBinding(bindings, options, this._makeConstraintContext(resolutionPath, resolutionStack, options), this._getTokenName(token));
89
- if (binding !== void 0) return {
90
- binding,
91
- owner: this
92
- };
93
- }
94
- if (this._parent !== void 0) return this._parent._findBinding(token, options, resolutionPath, resolutionStack);
95
- }
96
- /**
97
- * Binding lookup aligned with `resolve` — used by `Container.validate` without instantiating.
98
- */
99
- peekBindingForValidate(token, options) {
100
- return this._findBinding(token, options, [], []);
101
- }
102
- /**
103
- * Mirrors {@link DependencyResolver.resolveAll} candidate selection only (no instantiation).
104
- */
105
- peekCandidateBindingsForValidate(token, options) {
106
- if (options?.name !== void 0 && options.tag === void 0 && (options.tags?.length ?? 0) === 0) return this._getSimpleNamedBindingsFromChain(token, options.name);
107
- const allBindings = this._getAllBindingsFromChain(token);
108
- if (allBindings.length === 0) return [];
109
- return selectAllBindings(allBindings, options, this._makeConstraintContext([], [], options));
110
- }
111
- resolveFromContext(token, resolutionPath, resolutionStack) {
112
- const fastBinding = this._registry.getFastDefault(token);
113
- if (fastBinding !== void 0) {
114
- if (fastBinding.kind === "alias") return this.resolveFromContext(fastBinding.target, resolutionPath, resolutionStack);
115
- const scope = fastBinding.scope ?? "transient";
116
- if (scope === "transient" && fastBinding.kind === "dynamic" && fastBinding.onActivation === void 0 && (this._lifecycle.activationVersion === 0 || !this._lifecycle.hasActivationHandlers(fastBinding.token))) return this._resolveTransientDynamicSyncFromContext(fastBinding, resolutionPath, resolutionStack);
117
- if (scope === "singleton" && this._scope.hasSingleton(fastBinding.id)) return this._scope.getSingleton(fastBinding.id);
118
- if (scope === "scoped") {
119
- if (!this._scope.isChild) throw new MissingScopeContextError(this._getTokenName(fastBinding.token));
120
- if (this._scope.hasScoped(fastBinding.id)) return this._scope.getScoped(fastBinding.id);
121
- }
122
- return this._resolveBinding(fastBinding, void 0, resolutionPath, resolutionStack);
123
- }
124
- return this.resolve(token, void 0, resolutionPath, resolutionStack);
125
- }
126
- resolve(token, options, resolutionPath, resolutionStack) {
127
- const found = this._findBinding(token, options, resolutionPath, resolutionStack);
128
- if (found === void 0) {
129
- if (this._registry.getAll(token).length > 0) throw new NoMatchingBindingError(this._getTokenName(token), options ?? {}, this._getAvailableSlots(token));
130
- throw new TokenNotBoundError(this._getTokenName(token));
131
- }
132
- const { binding, owner } = found;
133
- if (binding.kind === "alias") return this.resolve(binding.target, options, resolutionPath, resolutionStack);
134
- if ((binding.scope ?? "transient") === "singleton" && owner !== this) return owner._resolveBinding(binding, options, resolutionPath, resolutionStack);
135
- return this._resolveBinding(binding, options, resolutionPath, resolutionStack);
136
- }
137
- _resolveBinding(binding, options, resolutionPath, resolutionStack) {
138
- if (binding.kind === "constant" && binding.onActivation === void 0 && !this._lifecycle.hasActivationHandlers(binding.token)) return binding.value;
139
- const scope = binding.scope ?? "transient";
140
- if (scope === "singleton") {
141
- if (this._scope.hasSingleton(binding.id)) return this._scope.getSingleton(binding.id);
142
- }
143
- if (scope === "scoped") {
144
- if (!this._scope.isChild) throw new MissingScopeContextError(this._getTokenName(binding.token));
145
- if (this._scope.hasScoped(binding.id)) return this._scope.getScoped(binding.id);
146
- }
147
- const frame = this._getResolutionFrame(binding);
148
- const tokenDisplayName = frame.tokenName;
149
- const pathWithSet = resolutionPath;
150
- let resolutionSet = pathWithSet[RESOLUTION_SET_KEY];
151
- if (resolutionSet === void 0 && resolutionPath.length >= RESOLUTION_SET_THRESHOLD) {
152
- resolutionSet = new Set(resolutionPath);
153
- pathWithSet[RESOLUTION_SET_KEY] = resolutionSet;
154
- }
155
- if (resolutionSet !== void 0 ? resolutionSet.has(tokenDisplayName) : resolutionPath.includes(tokenDisplayName)) throw new CircularDependencyError([...resolutionPath, tokenDisplayName]);
156
- resolutionPath.push(tokenDisplayName);
157
- resolutionSet?.add(tokenDisplayName);
158
- resolutionStack.push(frame);
159
- const needsActivation = this._needsActivation(binding);
160
- if (!needsActivation && scope === "transient" && binding.kind === "dynamic") {
161
- const resolutionCtx = this._acquireSyncResolutionContext(resolutionPath, resolutionStack, options);
162
- try {
163
- const dynamicResult = binding.factory(resolutionCtx);
164
- if (dynamicResult instanceof Promise) throw new AsyncResolutionError(tokenName(binding.token), tokenName(binding.token));
165
- resolutionStack.pop();
166
- resolutionPath.pop();
167
- resolutionSet?.delete(tokenDisplayName);
168
- return dynamicResult;
169
- } catch (error) {
170
- resolutionStack.pop();
171
- resolutionPath.pop();
172
- resolutionSet?.delete(tokenDisplayName);
173
- throw error;
174
- }
175
- }
176
- try {
177
- const resolutionCtx = needsActivation || this._requiresResolutionContext(binding) ? this._acquireSyncResolutionContext(resolutionPath, resolutionStack, options) : void 0;
178
- const instance = this._instantiateSync(binding, resolutionCtx, resolutionPath, resolutionStack);
179
- const activated = this._refreshActivationCacheIfNeeded(binding, needsActivation) ? this._lifecycle.runActivationSync(resolutionCtx, binding, instance, this._metadataReader) : instance;
180
- if (scope === "singleton") this._scope.setSingleton(binding.id, activated);
181
- else if (scope === "scoped") this._scope.setScoped(binding.id, activated);
182
- return activated;
183
- } finally {
184
- resolutionStack.pop();
185
- resolutionPath.pop();
186
- resolutionSet?.delete(tokenDisplayName);
187
- }
188
- }
189
- _instantiateSync(binding, ctx, resolutionPath, resolutionStack) {
190
- switch (binding.kind) {
191
- case "constant": return binding.value;
192
- case "dynamic": {
193
- if (ctx === void 0) throw new InternalError("dynamic binding requires resolution context");
194
- const factoryResult = binding.factory(ctx);
195
- if (factoryResult instanceof Promise) throw new AsyncResolutionError(tokenName(binding.token), tokenName(binding.token));
196
- return factoryResult;
197
- }
198
- case "dynamic-async": throw new AsyncResolutionError(tokenName(binding.token), tokenName(binding.token));
199
- case "class": {
200
- const deps = this._resolveClassDeps(binding.target, resolutionPath, resolutionStack);
201
- return this._instantiateClass(binding.target, deps);
202
- }
203
- case "resolved": {
204
- const deps = this._resolveDescriptorDeps(binding.deps, resolutionPath, resolutionStack);
205
- const factoryResult = binding.factory(...deps);
206
- if (factoryResult instanceof Promise) throw new AsyncResolutionError(tokenName(binding.token), tokenName(binding.token));
207
- return factoryResult;
208
- }
209
- case "resolved-async": throw new AsyncResolutionError(tokenName(binding.token), tokenName(binding.token));
210
- case "alias": throw new InternalError("alias should have been followed before instantiation");
211
- }
212
- }
213
- _resolveClassDeps(target, resolutionPath, resolutionStack) {
214
- const meta = this._getConstructorMetadata(target);
215
- if (meta === void 0) {
216
- if (target.length === 0) return [];
217
- throw new MissingMetadataError(target.name);
218
- }
219
- if (meta.params.length === 0) return [];
220
- if (meta.params.length === 1) {
221
- const param = meta.params[0];
222
- const paramOptions = injectionSlotToResolveOptions(param);
223
- if (param.multi) return [this.resolveAll(param.token, paramOptions, resolutionPath, resolutionStack)];
224
- if (param.optional) return [this.resolveOptional(param.token, paramOptions, resolutionPath, resolutionStack)];
225
- if (paramOptions === void 0) return [this.resolveFromContext(param.token, resolutionPath, resolutionStack)];
226
- return [this.resolve(param.token, paramOptions, resolutionPath, resolutionStack)];
227
- }
228
- const deps = new Array(meta.params.length);
229
- for (let index = 0; index < meta.params.length; index += 1) {
230
- const param = meta.params[index];
231
- const paramOptions = injectionSlotToResolveOptions(param);
232
- if (param.multi) {
233
- deps[index] = this.resolveAll(param.token, paramOptions, resolutionPath, resolutionStack);
234
- continue;
235
- }
236
- if (param.optional) {
237
- deps[index] = this.resolveOptional(param.token, paramOptions, resolutionPath, resolutionStack);
238
- continue;
239
- }
240
- deps[index] = paramOptions === void 0 ? this.resolveFromContext(param.token, resolutionPath, resolutionStack) : this.resolve(param.token, paramOptions, resolutionPath, resolutionStack);
241
- }
242
- return deps;
243
- }
244
- _resolveDescriptorDeps(deps, resolutionPath, resolutionStack) {
245
- const resolved = new Array(deps.length);
246
- for (let index = 0; index < deps.length; index += 1) {
247
- const dep = deps[index];
248
- const depOptions = injectionSlotToResolveOptions(dep);
249
- if (dep.multi) {
250
- resolved[index] = this.resolveAll(dep.token, depOptions, resolutionPath, resolutionStack);
251
- continue;
252
- }
253
- if (dep.optional) {
254
- resolved[index] = this.resolveOptional(dep.token, depOptions, resolutionPath, resolutionStack);
255
- continue;
256
- }
257
- resolved[index] = depOptions === void 0 ? this.resolveFromContext(dep.token, resolutionPath, resolutionStack) : this.resolve(dep.token, depOptions, resolutionPath, resolutionStack);
258
- }
259
- return resolved;
260
- }
261
- resolveOptional(token, options, resolutionPath, resolutionStack) {
262
- if (this._findBinding(token, options, resolutionPath, resolutionStack) === void 0) return;
263
- return this.resolve(token, options, resolutionPath, resolutionStack);
264
- }
265
- resolveAll(token, options, resolutionPath, resolutionStack) {
266
- if (options?.name !== void 0 && options.tag === void 0 && (options.tags?.length ?? 0) === 0) {
267
- const namedCandidates = this._getSimpleNamedBindingsFromChain(token, options.name);
268
- if (namedCandidates.length === 0) return [];
269
- const resolved = new Array(namedCandidates.length);
270
- for (let index = 0; index < namedCandidates.length; index += 1) resolved[index] = this._resolveCandidateSync(namedCandidates[index], options, resolutionPath, resolutionStack);
271
- return resolved;
272
- }
273
- const allBindings = this._getAllBindingsFromChain(token);
274
- if (allBindings.length === 0) return [];
275
- const candidates = selectAllBindings(allBindings, options, this._makeConstraintContext(resolutionPath, resolutionStack, options));
276
- const resolved = new Array(candidates.length);
277
- for (let index = 0; index < candidates.length; index += 1) resolved[index] = this._resolveCandidateSync(candidates[index], options, resolutionPath, resolutionStack);
278
- return resolved;
279
- }
280
- resolveAsyncFromContext(token, resolutionPath, resolutionStack) {
281
- const fastBinding = this._registry.getFastDefault(token);
282
- if (fastBinding !== void 0) {
283
- if (fastBinding.kind === "alias") return this.resolveAsyncFromContext(fastBinding.target, resolutionPath, resolutionStack);
284
- const scope = fastBinding.scope ?? "transient";
285
- if (scope === "transient" && (fastBinding.kind === "dynamic" || fastBinding.kind === "dynamic-async") && fastBinding.onActivation === void 0 && (this._lifecycle.activationVersion === 0 || !this._lifecycle.hasActivationHandlers(fastBinding.token))) return this._resolveTransientDynamicAsyncFromContext(fastBinding, resolutionPath, resolutionStack);
286
- if (scope === "singleton" && this._scope.hasSingleton(fastBinding.id)) return Promise.resolve(this._scope.getSingleton(fastBinding.id));
287
- if (scope === "scoped") {
288
- if (!this._scope.isChild) return Promise.reject(new MissingScopeContextError(this._getTokenName(fastBinding.token)));
289
- if (this._scope.hasScoped(fastBinding.id)) return Promise.resolve(this._scope.getScoped(fastBinding.id));
290
- }
291
- return this._resolveBindingAsync(fastBinding, void 0, resolutionPath, resolutionStack);
292
- }
293
- return this.resolveAsync(token, void 0, resolutionPath, resolutionStack);
294
- }
295
- async resolveAsync(token, options, resolutionPath, resolutionStack) {
296
- const found = this._findBinding(token, options, resolutionPath, resolutionStack);
297
- if (found === void 0) {
298
- if (this._registry.getAll(token).length > 0) throw new NoMatchingBindingError(this._getTokenName(token), options ?? {}, this._getAvailableSlots(token));
299
- throw new TokenNotBoundError(this._getTokenName(token));
300
- }
301
- const { binding, owner } = found;
302
- if (binding.kind === "alias") return this.resolveAsync(binding.target, options, resolutionPath, resolutionStack);
303
- if ((binding.scope ?? "transient") === "singleton" && owner !== this) return owner._resolveBindingAsync(binding, options, resolutionPath, resolutionStack);
304
- return this._resolveBindingAsync(binding, options, resolutionPath, resolutionStack);
305
- }
306
- async _resolveBindingAsync(binding, options, resolutionPath, resolutionStack) {
307
- if (binding.kind === "constant" && binding.onActivation === void 0 && !this._lifecycle.hasActivationHandlers(binding.token)) return binding.value;
308
- const scope = binding.scope ?? "transient";
309
- if (scope === "singleton") {
310
- if (this._scope.hasSingleton(binding.id)) return this._scope.getSingleton(binding.id);
311
- const inflight = this._scope.getInflight(binding.id);
312
- if (inflight !== void 0) return inflight;
313
- }
314
- if (scope === "scoped") {
315
- if (!this._scope.isChild) throw new MissingScopeContextError(this._getTokenName(binding.token));
316
- if (this._scope.hasScoped(binding.id)) return this._scope.getScoped(binding.id);
317
- }
318
- const frame = this._getResolutionFrame(binding);
319
- const frameName = frame.tokenName;
320
- const pathWithSet = resolutionPath;
321
- let resolutionSet = pathWithSet[RESOLUTION_SET_KEY];
322
- if (resolutionSet === void 0 && resolutionPath.length >= RESOLUTION_SET_THRESHOLD) {
323
- resolutionSet = new Set(resolutionPath);
324
- pathWithSet[RESOLUTION_SET_KEY] = resolutionSet;
325
- }
326
- if (resolutionSet !== void 0 ? resolutionSet.has(frameName) : resolutionPath.includes(frameName)) throw new CircularDependencyError([...resolutionPath, frameName]);
327
- resolutionPath.push(frameName);
328
- resolutionSet?.add(frameName);
329
- resolutionStack.push(frame);
330
- const needsActivation = this._needsActivation(binding);
331
- if (!needsActivation && scope === "transient" && (binding.kind === "dynamic" || binding.kind === "dynamic-async")) {
332
- const resolutionCtx = new DefaultResolutionContext(this, resolutionPath, resolutionStack, options);
333
- try {
334
- if (binding.kind === "dynamic-async") return await binding.factory(resolutionCtx);
335
- const dynamicResult = binding.factory(resolutionCtx);
336
- return dynamicResult instanceof Promise ? await dynamicResult : dynamicResult;
337
- } finally {
338
- resolutionStack.pop();
339
- resolutionPath.pop();
340
- resolutionSet?.delete(frameName);
341
- }
342
- }
343
- const resolutionCtx = needsActivation || this._requiresResolutionContext(binding) ? new DefaultResolutionContext(this, resolutionPath, resolutionStack, options) : void 0;
344
- try {
345
- if (scope === "singleton") {
346
- const createSingletonPromise = async () => {
347
- const instance = await this._instantiateAsync(binding, resolutionCtx, resolutionPath, resolutionStack);
348
- const activated = this._refreshActivationCacheIfNeeded(binding, needsActivation) ? await this._lifecycle.runActivation(resolutionCtx, binding, instance, this._metadataReader) : instance;
349
- this._scope.setSingleton(binding.id, activated);
350
- this._scope.clearInflight(binding.id);
351
- return activated;
352
- };
353
- const singletonPromise = createSingletonPromise().catch((err) => {
354
- this._scope.clearInflight(binding.id);
355
- throw err;
356
- });
357
- this._scope.setInflight(binding.id, singletonPromise);
358
- return await singletonPromise;
359
- }
360
- const instance = await this._instantiateAsync(binding, resolutionCtx, resolutionPath, resolutionStack);
361
- const activated = this._refreshActivationCacheIfNeeded(binding, needsActivation) ? await this._lifecycle.runActivation(resolutionCtx, binding, instance, this._metadataReader) : instance;
362
- if (scope === "scoped") this._scope.setScoped(binding.id, activated);
363
- return activated;
364
- } finally {
365
- resolutionStack.pop();
366
- resolutionPath.pop();
367
- resolutionSet?.delete(frameName);
368
- }
369
- }
370
- async _instantiateAsync(binding, ctx, resolutionPath, resolutionStack) {
371
- switch (binding.kind) {
372
- case "constant": return binding.value;
373
- case "dynamic": {
374
- if (ctx === void 0) throw new InternalError("dynamic binding requires resolution context");
375
- const factoryResult = binding.factory(ctx);
376
- return factoryResult instanceof Promise ? factoryResult : Promise.resolve(factoryResult);
377
- }
378
- case "dynamic-async":
379
- if (ctx === void 0) throw new InternalError("dynamic-async binding requires resolution context");
380
- return binding.factory(ctx);
381
- case "class": {
382
- const deps = await this._resolveClassDepsAsync(binding.target, resolutionPath, resolutionStack);
383
- return this._instantiateClass(binding.target, deps);
384
- }
385
- case "resolved": {
386
- if (ctx === void 0) throw new InternalError("resolved binding requires resolution context");
387
- const deps = await this._resolveDescriptorDepsAsync(binding.deps, resolutionPath, resolutionStack);
388
- const factoryResult = binding.factory(...deps);
389
- return factoryResult instanceof Promise ? factoryResult : Promise.resolve(factoryResult);
390
- }
391
- case "resolved-async": {
392
- const deps = await this._resolveDescriptorDepsAsync(binding.deps, resolutionPath, resolutionStack);
393
- return binding.factory(...deps);
394
- }
395
- case "alias": throw new InternalError("alias should have been followed before instantiation");
396
- }
397
- }
398
- async _resolveClassDepsAsync(target, resolutionPath, resolutionStack) {
399
- const meta = this._getConstructorMetadata(target);
400
- if (meta === void 0) {
401
- if (target.length === 0) return [];
402
- throw new MissingMetadataError(target.name);
403
- }
404
- if (meta.params.length === 0) return [];
405
- if (meta.params.length === 1) {
406
- const param = meta.params[0];
407
- const paramOptions = injectionSlotToResolveOptions(param);
408
- if (param.multi) return [await this.resolveAllAsync(param.token, paramOptions, resolutionPath, resolutionStack)];
409
- if (param.optional) return [await this.resolveOptionalAsync(param.token, paramOptions, resolutionPath, resolutionStack)];
410
- if (paramOptions === void 0) return [await this.resolveAsyncFromContext(param.token, resolutionPath, resolutionStack)];
411
- return [await this.resolveAsync(param.token, paramOptions, resolutionPath, resolutionStack)];
412
- }
413
- const pending = new Array(meta.params.length);
414
- const shouldCloneContext = meta.params.length > 1;
415
- for (let index = 0; index < meta.params.length; index += 1) {
416
- const param = meta.params[index];
417
- const paramOptions = injectionSlotToResolveOptions(param);
418
- if (param.multi) pending[index] = this.resolveAllAsync(param.token, paramOptions, shouldCloneContext ? [...resolutionPath] : resolutionPath, shouldCloneContext ? [...resolutionStack] : resolutionStack);
419
- else if (param.optional) pending[index] = this.resolveOptionalAsync(param.token, paramOptions, shouldCloneContext ? [...resolutionPath] : resolutionPath, shouldCloneContext ? [...resolutionStack] : resolutionStack);
420
- else pending[index] = paramOptions === void 0 ? this.resolveAsyncFromContext(param.token, shouldCloneContext ? [...resolutionPath] : resolutionPath, shouldCloneContext ? [...resolutionStack] : resolutionStack) : this.resolveAsync(param.token, paramOptions, shouldCloneContext ? [...resolutionPath] : resolutionPath, shouldCloneContext ? [...resolutionStack] : resolutionStack);
421
- }
422
- return Promise.all(pending);
423
- }
424
- async _resolveDescriptorDepsAsync(deps, resolutionPath, resolutionStack) {
425
- const pending = new Array(deps.length);
426
- const shouldCloneContext = deps.length > 1;
427
- for (let index = 0; index < deps.length; index += 1) {
428
- const dep = deps[index];
429
- const depOptions = injectionSlotToResolveOptions(dep);
430
- if (dep.multi) pending[index] = this.resolveAllAsync(dep.token, depOptions, shouldCloneContext ? [...resolutionPath] : resolutionPath, shouldCloneContext ? [...resolutionStack] : resolutionStack);
431
- else if (dep.optional) pending[index] = this.resolveOptionalAsync(dep.token, depOptions, shouldCloneContext ? [...resolutionPath] : resolutionPath, shouldCloneContext ? [...resolutionStack] : resolutionStack);
432
- else pending[index] = depOptions === void 0 ? this.resolveAsyncFromContext(dep.token, shouldCloneContext ? [...resolutionPath] : resolutionPath, shouldCloneContext ? [...resolutionStack] : resolutionStack) : this.resolveAsync(dep.token, depOptions, shouldCloneContext ? [...resolutionPath] : resolutionPath, shouldCloneContext ? [...resolutionStack] : resolutionStack);
433
- }
434
- return Promise.all(pending);
435
- }
436
- async resolveOptionalAsync(token, options, resolutionPath, resolutionStack) {
437
- if (this._findBinding(token, options, resolutionPath, resolutionStack) === void 0) return;
438
- return this.resolveAsync(token, options, resolutionPath, resolutionStack);
439
- }
440
- async resolveAllAsync(token, options, resolutionPath, resolutionStack) {
441
- if (options?.name !== void 0 && options.tag === void 0 && (options.tags?.length ?? 0) === 0) {
442
- const namedCandidates = this._getSimpleNamedBindingsFromChain(token, options.name);
443
- if (namedCandidates.length === 0) return [];
444
- const pending = new Array(namedCandidates.length);
445
- for (let index = 0; index < namedCandidates.length; index += 1) pending[index] = this._resolveCandidateAsync(namedCandidates[index], options, resolutionPath, resolutionStack);
446
- return Promise.all(pending);
447
- }
448
- const allBindings = this._getAllBindingsFromChain(token);
449
- if (allBindings.length === 0) return [];
450
- const candidates = selectAllBindings(allBindings, options, this._makeConstraintContext(resolutionPath, resolutionStack, options));
451
- const pending = new Array(candidates.length);
452
- for (let index = 0; index < candidates.length; index += 1) pending[index] = this._resolveCandidateAsync(candidates[index], options, resolutionPath, resolutionStack);
453
- return Promise.all(pending);
454
- }
455
- _getAllBindingsFromChain(token) {
456
- const ownBindings = this._registry.getAll(token);
457
- if (this._parent === void 0) return ownBindings;
458
- const result = [...ownBindings];
459
- let current = this._parent;
460
- while (current !== void 0) {
461
- const own = current._registry.getAll(token);
462
- if (own.length > 0) result.push(...own);
463
- current = current._parent;
464
- }
465
- return result;
466
- }
467
- _getSimpleNamedBindingsFromChain(token, name) {
468
- const ownBinding = this._registry.getSimpleNamed(token, name);
469
- if (this._parent === void 0) return ownBinding !== void 0 ? [ownBinding] : [];
470
- const result = [];
471
- if (ownBinding !== void 0) result.push(ownBinding);
472
- let current = this._parent;
473
- while (current !== void 0) {
474
- const binding = current._registry.getSimpleNamed(token, name);
475
- if (binding !== void 0) result.push(binding);
476
- current = current._parent;
477
- }
478
- return result;
479
- }
480
- _getAvailableSlots(token) {
481
- return this._registry.availableSlotStrings(token);
482
- }
483
- _makeConstraintContext(resolutionPath, resolutionStack, options) {
484
- if (options === void 0 && resolutionPath.length === 0 && resolutionStack.length === 0) return ROOT_CONSTRAINT_CONTEXT;
485
- return {
486
- resolutionPath,
487
- resolutionStack,
488
- parent: resolutionStack.at(-1),
489
- ancestors: resolutionStack.length > 1 ? resolutionStack.slice(0, -1) : [],
490
- currentResolveOptions: options
491
- };
492
- }
493
- _matchesBindingFast(binding, options, resolutionPath, resolutionStack) {
494
- if (!this._matchesSlotFast(binding.slot, options)) return false;
495
- if (binding.predicate === void 0) return true;
496
- const ctx = this._makeConstraintContext(resolutionPath, resolutionStack, options);
497
- return binding.predicate(ctx);
498
- }
499
- _matchesSlotFast(slot, options) {
500
- const requestedName = options?.name;
501
- const requestedTags = options?.tags;
502
- const singleRequestedTag = options?.tag;
503
- const hasRequestedTags = (requestedTags?.length ?? 0) > 0 || singleRequestedTag !== void 0;
504
- if (slot.name !== void 0) {
505
- if (requestedName === void 0 || slot.name !== requestedName) return false;
506
- } else if (requestedName !== void 0) return false;
507
- if (slot.tags.length > 0) {
508
- if (!hasRequestedTags) return false;
509
- for (const [tagKey, tagValue] of slot.tags) if (!this._matchesRequestedTag(tagKey, tagValue, requestedTags, singleRequestedTag)) return false;
510
- } else if (hasRequestedTags) return false;
511
- return true;
512
- }
513
- _getTokenName(token) {
514
- return tokenName(token);
515
- }
516
- _getConstructorMetadata(target) {
517
- const cached = this._classConstructorMetadata.get(target);
518
- if (cached !== void 0) return cached === null ? void 0 : cached;
519
- const metadata = this._metadataReader.getConstructorMetadata(target);
520
- this._classConstructorMetadata.set(target, metadata ?? null);
521
- return metadata;
522
- }
523
- _instantiateClass(target, deps) {
524
- let needsActiveContainer = this._classNeedsActiveContainer.get(target);
525
- if (needsActiveContainer === void 0) {
526
- needsActiveContainer = ((this._metadataReader.getAccessorMetadata?.(target))?.length ?? 0) > 0;
527
- this._classNeedsActiveContainer.set(target, needsActiveContainer);
528
- }
529
- const invokable = target;
530
- if (!needsActiveContainer) return new invokable(...deps);
531
- return runWithContainer(this._container, () => new invokable(...deps));
532
- }
533
- _matchesRequestedTag(tagKey, tagValue, requestedTags, singleRequestedTag) {
534
- if (singleRequestedTag !== void 0 && singleRequestedTag[0] === tagKey && Object.is(singleRequestedTag[1], tagValue)) return true;
535
- if (requestedTags === void 0 || requestedTags.length === 0) return false;
536
- for (let index = 0; index < requestedTags.length; index += 1) {
537
- const requestedTag = requestedTags[index];
538
- if (requestedTag[0] === tagKey && Object.is(requestedTag[1], tagValue)) return true;
539
- }
540
- return false;
541
- }
542
- _resolveTransientDynamicSyncFromContext(binding, resolutionPath, resolutionStack) {
543
- if (resolutionPath.length < RESOLUTION_SET_THRESHOLD) {
544
- const frame = this._getResolutionFrame(binding);
545
- const tokenDisplayName = frame.tokenName;
546
- if (resolutionPath.includes(tokenDisplayName)) throw new CircularDependencyError([...resolutionPath, tokenDisplayName]);
547
- resolutionPath.push(tokenDisplayName);
548
- resolutionStack.push(frame);
549
- const resolutionCtx = this._acquireSyncResolutionContext(resolutionPath, resolutionStack, void 0);
550
- try {
551
- const dynamicResult = binding.factory(resolutionCtx);
552
- if (dynamicResult instanceof Promise) throw new AsyncResolutionError(tokenDisplayName, tokenDisplayName);
553
- return dynamicResult;
554
- } finally {
555
- resolutionStack.pop();
556
- resolutionPath.pop();
557
- }
558
- }
559
- if (this._deepActiveLevels > 0 && this._deepSyncCtxPath !== resolutionPath) return this._resolveTransientDynamicSyncSlow(binding, resolutionPath, resolutionStack);
560
- if (this._deepActiveLevels === 0) {
561
- const gen = ++this._deepCycleGen;
562
- for (const stackFrame of resolutionStack) this._deepCycleMarks.set(stackFrame.bindingId, gen);
563
- let ctx = this._deepSyncCtx;
564
- if (ctx === void 0) {
565
- ctx = new DefaultResolutionContext(this, resolutionPath, resolutionStack, void 0);
566
- this._deepSyncCtx = ctx;
567
- } else ctx.reset(this, resolutionPath, resolutionStack, void 0);
568
- this._deepSyncCtxPath = resolutionPath;
569
- }
570
- if (this._deepCycleMarks.get(binding.id) === this._deepCycleGen) throw new CircularDependencyError([...resolutionPath, tokenName(binding.token)]);
571
- this._deepCycleMarks.set(binding.id, this._deepCycleGen);
572
- this._deepActiveLevels++;
573
- try {
574
- const dynamicResult = binding.factory(this._deepSyncCtx);
575
- if (dynamicResult instanceof Promise) throw new AsyncResolutionError(tokenName(binding.token), tokenName(binding.token));
576
- return dynamicResult;
577
- } finally {
578
- if (--this._deepActiveLevels === 0) this._deepSyncCtxPath = void 0;
579
- }
580
- }
581
- _resolveTransientDynamicSyncSlow(binding, resolutionPath, resolutionStack) {
582
- const frame = this._getResolutionFrame(binding);
583
- const tokenDisplayName = frame.tokenName;
584
- const pathWithSet = resolutionPath;
585
- let resolutionSet = pathWithSet[RESOLUTION_SET_KEY];
586
- if (resolutionSet === void 0) {
587
- resolutionSet = new Set(resolutionPath);
588
- pathWithSet[RESOLUTION_SET_KEY] = resolutionSet;
589
- }
590
- if (resolutionSet.has(tokenDisplayName)) throw new CircularDependencyError([...resolutionPath, tokenDisplayName]);
591
- resolutionPath.push(tokenDisplayName);
592
- resolutionSet.add(tokenDisplayName);
593
- resolutionStack.push(frame);
594
- const resolutionCtx = this._acquireSyncResolutionContext(resolutionPath, resolutionStack, void 0);
595
- try {
596
- const dynamicResult = binding.factory(resolutionCtx);
597
- if (dynamicResult instanceof Promise) throw new AsyncResolutionError(tokenDisplayName, tokenDisplayName);
598
- return dynamicResult;
599
- } finally {
600
- resolutionStack.pop();
601
- resolutionPath.pop();
602
- resolutionSet.delete(tokenDisplayName);
603
- }
604
- }
605
- _resolveTransientDynamicAsyncFromContext(binding, resolutionPath, resolutionStack) {
606
- if (resolutionPath.length < RESOLUTION_SET_THRESHOLD) {
607
- const tokenDisplayName = tokenName(binding.token);
608
- if (resolutionPath.includes(tokenDisplayName)) return Promise.reject(new CircularDependencyError([...resolutionPath, tokenDisplayName]));
609
- resolutionPath.push(tokenDisplayName);
610
- let ctx;
611
- let isOwnerLevel;
612
- if (this._deepAsyncCtxPath === resolutionPath) {
613
- ctx = this._deepAsyncCtx;
614
- isOwnerLevel = true;
615
- } else if (this._deepAsyncCtxPath === void 0) {
616
- const existing = this._deepAsyncCtx;
617
- if (existing === void 0) {
618
- ctx = new DefaultResolutionContext(this, resolutionPath, resolutionStack, void 0);
619
- this._deepAsyncCtx = ctx;
620
- } else {
621
- existing.reset(this, resolutionPath, resolutionStack, void 0);
622
- ctx = existing;
623
- }
624
- this._deepAsyncCtxPath = resolutionPath;
625
- isOwnerLevel = true;
626
- } else {
627
- ctx = new DefaultResolutionContext(this, resolutionPath, resolutionStack, void 0);
628
- isOwnerLevel = false;
629
- }
630
- if (isOwnerLevel) this._deepAsyncActiveLevels++;
631
- let factoryPromise;
632
- try {
633
- if (binding.kind === "dynamic-async") factoryPromise = binding.factory(ctx);
634
- else {
635
- const factoryResult = binding.factory(ctx);
636
- factoryPromise = factoryResult instanceof Promise ? factoryResult : Promise.resolve(factoryResult);
637
- }
638
- } catch (err) {
639
- resolutionPath.pop();
640
- if (isOwnerLevel && --this._deepAsyncActiveLevels === 0) this._deepAsyncCtxPath = void 0;
641
- return Promise.reject(err);
642
- }
643
- return factoryPromise.then((value) => {
644
- resolutionPath.pop();
645
- if (isOwnerLevel && --this._deepAsyncActiveLevels === 0) this._deepAsyncCtxPath = void 0;
646
- return value;
647
- }, (err) => {
648
- resolutionPath.pop();
649
- if (isOwnerLevel && --this._deepAsyncActiveLevels === 0) this._deepAsyncCtxPath = void 0;
650
- throw err;
651
- });
652
- }
653
- return this._resolveTransientDynamicAsyncSlow(binding, resolutionPath, resolutionStack);
654
- }
655
- async _resolveTransientDynamicAsyncSlow(binding, resolutionPath, resolutionStack) {
656
- const frame = this._getResolutionFrame(binding);
657
- const tokenDisplayName = frame.tokenName;
658
- const pathWithSet = resolutionPath;
659
- let resolutionSet = pathWithSet[RESOLUTION_SET_KEY];
660
- if (resolutionSet === void 0) {
661
- resolutionSet = new Set(resolutionPath);
662
- pathWithSet[RESOLUTION_SET_KEY] = resolutionSet;
663
- }
664
- if (resolutionSet.has(tokenDisplayName)) throw new CircularDependencyError([...resolutionPath, tokenDisplayName]);
665
- resolutionPath.push(tokenDisplayName);
666
- resolutionSet.add(tokenDisplayName);
667
- resolutionStack.push(frame);
668
- const resolutionCtx = new DefaultResolutionContext(this, resolutionPath, resolutionStack, void 0);
669
- try {
670
- if (binding.kind === "dynamic-async") return await binding.factory(resolutionCtx);
671
- const dynamicResult = binding.factory(resolutionCtx);
672
- return dynamicResult instanceof Promise ? await dynamicResult : dynamicResult;
673
- } finally {
674
- resolutionStack.pop();
675
- resolutionPath.pop();
676
- resolutionSet.delete(tokenDisplayName);
677
- }
678
- }
679
- _resolveCandidateSync(binding, options, resolutionPath, resolutionStack) {
680
- if (binding.kind === "constant" && binding.onActivation === void 0 && !this._lifecycle.hasActivationHandlers(binding.token)) return binding.value;
681
- if (binding.kind === "alias") return this.resolve(binding.target, options, resolutionPath, resolutionStack);
682
- const scope = binding.scope ?? "transient";
683
- if (scope === "singleton" && this._scope.hasSingleton(binding.id)) return this._scope.getSingleton(binding.id);
684
- if (scope === "scoped") {
685
- if (!this._scope.isChild) throw new MissingScopeContextError(this._getTokenName(binding.token));
686
- if (this._scope.hasScoped(binding.id)) return this._scope.getScoped(binding.id);
687
- }
688
- return this._resolveBinding(binding, options, resolutionPath, resolutionStack);
689
- }
690
- _resolveCandidateAsync(binding, options, resolutionPath, resolutionStack) {
691
- if (binding.kind === "constant" && binding.onActivation === void 0 && !this._lifecycle.hasActivationHandlers(binding.token)) return Promise.resolve(binding.value);
692
- const isolatedPath = [...resolutionPath];
693
- const isolatedStack = [...resolutionStack];
694
- if (binding.kind === "alias") return this.resolveAsync(binding.target, options, isolatedPath, isolatedStack);
695
- const scope = binding.scope ?? "transient";
696
- if (scope === "singleton" && this._scope.hasSingleton(binding.id)) return Promise.resolve(this._scope.getSingleton(binding.id));
697
- if (scope === "scoped") {
698
- if (!this._scope.isChild) return Promise.reject(new MissingScopeContextError(this._getTokenName(binding.token)));
699
- if (this._scope.hasScoped(binding.id)) return Promise.resolve(this._scope.getScoped(binding.id));
700
- }
701
- return this._resolveBindingAsync(binding, options, isolatedPath, isolatedStack);
702
- }
703
- _getResolutionFrame(binding) {
704
- const existing = this._frameByBindingId.get(binding.id);
705
- if (existing !== void 0) return existing;
706
- const scope = binding.scope ?? "transient";
707
- const frame = buildResolutionFrame(tokenName(binding.token), scope, binding.id, binding.kind, binding.slot);
708
- this._frameByBindingId.set(binding.id, frame);
709
- return frame;
710
- }
711
- _needsActivation(binding) {
712
- const lifecycleVersion = this._lifecycle.activationVersion;
713
- if (lifecycleVersion === 0 && binding.kind !== "class" && binding.kind !== "alias" && binding.onActivation === void 0) return false;
714
- if (this._activationCacheVersion !== lifecycleVersion) {
715
- this._activationNeedByBindingId.clear();
716
- this._activationCacheVersion = lifecycleVersion;
717
- }
718
- const cached = this._activationNeedByBindingId.get(binding.id);
719
- if (cached !== void 0) return cached;
720
- if (binding.kind === "class") {
721
- let hasActivation = this._lifecycle.hasActivationHandlers(binding.token) || binding.onActivation !== void 0;
722
- const cachedPostConstruct = this._classHasPostConstruct.get(binding.target);
723
- if (cachedPostConstruct === void 0) hasActivation = true;
724
- else if (cachedPostConstruct) hasActivation = true;
725
- this._activationNeedByBindingId.set(binding.id, hasActivation);
726
- return hasActivation;
727
- }
728
- let hasActivation = false;
729
- if (binding.kind !== "alias" && binding.onActivation !== void 0) hasActivation = true;
730
- else if (this._lifecycle.hasActivationHandlers(binding.token)) hasActivation = true;
731
- this._activationNeedByBindingId.set(binding.id, hasActivation);
732
- return hasActivation;
733
- }
734
- _refreshClassPostConstructCache(target) {
735
- const lifecycle = this._metadataReader.getLifecycleMetadata(target);
736
- const hasPostConstruct = lifecycle !== void 0 && lifecycle.postConstruct !== void 0 && lifecycle.postConstruct.length > 0;
737
- this._classHasPostConstruct.set(target, hasPostConstruct);
738
- }
739
- /**
740
- * Refreshes the post-construct cache for class bindings on first instantiation and
741
- * returns the (possibly updated) shouldActivate flag.
742
- */
743
- _refreshActivationCacheIfNeeded(binding, needsActivation) {
744
- if (binding.kind === "class" && this._classHasPostConstruct.get(binding.target) === void 0) {
745
- this._refreshClassPostConstructCache(binding.target);
746
- this._activationNeedByBindingId.delete(binding.id);
747
- return this._needsActivation(binding);
748
- }
749
- return needsActivation;
750
- }
751
- _requiresResolutionContext(binding) {
752
- return binding.kind === "dynamic" || binding.kind === "dynamic-async";
753
- }
754
- _acquireSyncResolutionContext(resolutionPath, resolutionStack, options) {
755
- const depth = resolutionStack.length;
756
- const existing = this._syncResolutionContextPool[depth];
757
- if (existing !== void 0) {
758
- existing.reset(this, resolutionPath, resolutionStack, options);
759
- return existing;
760
- }
761
- const created = new DefaultResolutionContext(this, resolutionPath, resolutionStack, options);
762
- this._syncResolutionContextPool[depth] = created;
763
- return created;
764
- }
765
- };
766
- //#endregion
767
- export { DependencyResolver };