@codefast/di 0.5.0-canary.8 → 0.5.0

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 (91) hide show
  1. package/CHANGELOG.md +387 -0
  2. package/README.md +3 -1
  3. package/dist/binding.d.ts +41 -22
  4. package/dist/binding.d.ts.map +1 -1
  5. package/dist/binding.js +11 -0
  6. package/dist/binding.js.map +1 -1
  7. package/dist/container/binding-builders.d.ts.map +1 -1
  8. package/dist/container/binding-builders.js +8 -5
  9. package/dist/container/binding-builders.js.map +1 -1
  10. package/dist/container/container.d.ts.map +1 -1
  11. package/dist/container/container.js +67 -110
  12. package/dist/container/container.js.map +1 -1
  13. package/dist/errors.d.ts +10 -0
  14. package/dist/errors.d.ts.map +1 -1
  15. package/dist/errors.js +13 -0
  16. package/dist/errors.js.map +1 -1
  17. package/dist/index.d.ts +1 -2
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +3 -2
  20. package/dist/index.js.map +1 -1
  21. package/dist/introspection/inspector.d.ts +0 -1
  22. package/dist/introspection/inspector.d.ts.map +1 -1
  23. package/dist/introspection/inspector.js +2 -7
  24. package/dist/introspection/inspector.js.map +1 -1
  25. package/dist/registry.d.ts.map +1 -1
  26. package/dist/registry.js +46 -33
  27. package/dist/registry.js.map +1 -1
  28. package/dist/resolution/activation-need.d.ts +4 -2
  29. package/dist/resolution/activation-need.d.ts.map +1 -1
  30. package/dist/resolution/activation-need.js +15 -11
  31. package/dist/resolution/activation-need.js.map +1 -1
  32. package/dist/resolution/binding-lookup-cache.d.ts +1 -1
  33. package/dist/resolution/binding-lookup-cache.d.ts.map +1 -1
  34. package/dist/resolution/binding-lookup-cache.js +18 -2
  35. package/dist/resolution/binding-lookup-cache.js.map +1 -1
  36. package/dist/resolution/binding-scope.d.ts +5 -2
  37. package/dist/resolution/binding-scope.d.ts.map +1 -1
  38. package/dist/resolution/binding-scope.js +6 -17
  39. package/dist/resolution/binding-scope.js.map +1 -1
  40. package/dist/resolution/binding-select.d.ts +8 -1
  41. package/dist/resolution/binding-select.d.ts.map +1 -1
  42. package/dist/resolution/binding-select.js +13 -32
  43. package/dist/resolution/binding-select.js.map +1 -1
  44. package/dist/resolution/diagnostics.d.ts +2 -2
  45. package/dist/resolution/diagnostics.d.ts.map +1 -1
  46. package/dist/resolution/environment.d.ts +47 -21
  47. package/dist/resolution/environment.d.ts.map +1 -1
  48. package/dist/resolution/environment.js +134 -31
  49. package/dist/resolution/environment.js.map +1 -1
  50. package/dist/resolution/instantiation-plan.d.ts.map +1 -1
  51. package/dist/resolution/instantiation-plan.js +1 -1
  52. package/dist/resolution/instantiation-plan.js.map +1 -1
  53. package/dist/resolution/lifecycle.d.ts.map +1 -1
  54. package/dist/resolution/lifecycle.js +46 -53
  55. package/dist/resolution/lifecycle.js.map +1 -1
  56. package/dist/resolution/resolution-path.d.ts +82 -6
  57. package/dist/resolution/resolution-path.d.ts.map +1 -1
  58. package/dist/resolution/resolution-path.js +66 -8
  59. package/dist/resolution/resolution-path.js.map +1 -1
  60. package/dist/resolution/resolve-options.d.ts +41 -4
  61. package/dist/resolution/resolve-options.d.ts.map +1 -1
  62. package/dist/resolution/resolve-options.js +25 -1
  63. package/dist/resolution/resolve-options.js.map +1 -1
  64. package/dist/resolution/resolver.d.ts +29 -11
  65. package/dist/resolution/resolver.d.ts.map +1 -1
  66. package/dist/resolution/resolver.js +417 -564
  67. package/dist/resolution/resolver.js.map +1 -1
  68. package/dist/resolution/scope.d.ts +4 -0
  69. package/dist/resolution/scope.d.ts.map +1 -1
  70. package/dist/resolution/scope.js +8 -0
  71. package/dist/resolution/scope.js.map +1 -1
  72. package/package.json +5 -11
  73. package/src/binding.ts +46 -23
  74. package/src/container/binding-builders.ts +8 -5
  75. package/src/container/container.ts +72 -119
  76. package/src/errors.ts +17 -0
  77. package/src/index.ts +3 -1
  78. package/src/introspection/inspector.ts +2 -8
  79. package/src/registry.ts +52 -35
  80. package/src/resolution/activation-need.ts +18 -14
  81. package/src/resolution/binding-lookup-cache.ts +18 -2
  82. package/src/resolution/binding-scope.ts +6 -17
  83. package/src/resolution/binding-select.ts +14 -35
  84. package/src/resolution/diagnostics.ts +2 -2
  85. package/src/resolution/environment.ts +181 -35
  86. package/src/resolution/instantiation-plan.ts +5 -5
  87. package/src/resolution/lifecycle.ts +55 -53
  88. package/src/resolution/resolution-path.ts +119 -25
  89. package/src/resolution/resolve-options.ts +51 -4
  90. package/src/resolution/resolver.ts +582 -785
  91. package/src/resolution/scope.ts +10 -0
@@ -9,17 +9,20 @@ export class LifecycleManager {
9
9
  #activationHooks;
10
10
  #deactivationHooks;
11
11
  #activationVersion = 0;
12
+ // One-entry cache in front of the map: a resolve loop asks about the same token over and over,
13
+ // and registration is the only thing that can change the answer.
14
+ #cachedToken;
15
+ #cachedHooks;
12
16
  registerActivation(token, handler) {
13
17
  this.#activationVersion += 1;
18
+ this.#cachedToken = undefined;
19
+ this.#cachedHooks = undefined;
14
20
  // ✓ TS6.0: Map.getOrInsert (ES2025)
15
21
  const list = (this.#activationHooks ??= new Map()).getOrInsert(token, []);
16
22
  list.push(handler);
17
23
  }
18
24
  hasActivationHandlers(token) {
19
- if (this.#activationHooks === undefined) {
20
- return false;
21
- }
22
- const list = this.#activationHooks.get(token);
25
+ const list = this.activationHandlersFor(token);
23
26
  return list !== undefined && list.length > 0;
24
27
  }
25
28
  get activationVersion() {
@@ -27,7 +30,18 @@ export class LifecycleManager {
27
30
  }
28
31
  /** Container-level activation handlers for a token — hot-path accessor, no copies. */
29
32
  activationHandlersFor(token) {
30
- return this.#activationHooks?.get(token);
33
+ const hooks = this.#activationHooks;
34
+ if (hooks === undefined) {
35
+ return undefined;
36
+ }
37
+ const key = token;
38
+ if (key === this.#cachedToken) {
39
+ return this.#cachedHooks;
40
+ }
41
+ const list = hooks.get(key);
42
+ this.#cachedToken = key;
43
+ this.#cachedHooks = list;
44
+ return list;
31
45
  }
32
46
  registerDeactivation(token, handler) {
33
47
  const list = (this.#deactivationHooks ??= new Map()).getOrInsert(token, []);
@@ -36,18 +50,10 @@ export class LifecycleManager {
36
50
  async runActivation(resolutionContext, binding, instance, metadataReader) {
37
51
  let activatedInstance = instance;
38
52
  // 1. @postConstruct() — after TC39 construction (constructor + accessor addInitializer callbacks)
39
- if (binding.kind === "class") {
40
- const lifecycle = metadataReader.getLifecycleMetadata(binding.target);
41
- if (lifecycle?.postConstruct && lifecycle.postConstruct.length > 0) {
42
- for (const methodName of lifecycle.postConstruct) {
43
- const method = activatedInstance[methodName];
44
- if (typeof method === "function") {
45
- const hookResult = method.call(activatedInstance);
46
- if (hookResult instanceof Promise) {
47
- await hookResult;
48
- }
49
- }
50
- }
53
+ for (const methodName of lifecycleMethods(binding, metadataReader, "postConstruct")) {
54
+ const hookResult = callHook(activatedInstance, methodName);
55
+ if (hookResult instanceof Promise) {
56
+ await hookResult;
51
57
  }
52
58
  }
53
59
  // 2. per-binding onActivation
@@ -68,18 +74,9 @@ export class LifecycleManager {
68
74
  runActivationSync(resolutionContext, binding, instance, metadataReader) {
69
75
  let activatedInstance = instance;
70
76
  // 1. @postConstruct() — must be sync (instance fully constructed per TC39 order)
71
- if (binding.kind === "class") {
72
- const lifecycle = metadataReader.getLifecycleMetadata(binding.target);
73
- if (lifecycle?.postConstruct && lifecycle.postConstruct.length > 0) {
74
- for (const methodName of lifecycle.postConstruct) {
75
- const method = activatedInstance[methodName];
76
- if (typeof method === "function") {
77
- const hookResult = method.call(activatedInstance);
78
- if (hookResult instanceof Promise) {
79
- throw new AsyncActivationError(tokenName(binding.token), "postConstruct", methodName);
80
- }
81
- }
82
- }
77
+ for (const methodName of lifecycleMethods(binding, metadataReader, "postConstruct")) {
78
+ if (callHook(activatedInstance, methodName) instanceof Promise) {
79
+ throw new AsyncActivationError(tokenName(binding.token), "postConstruct", methodName);
83
80
  }
84
81
  }
85
82
  // 2. per-binding onActivation (must be sync)
@@ -124,18 +121,10 @@ export class LifecycleManager {
124
121
  }
125
122
  }
126
123
  // 3. @preDestroy() — all methods in declaration order
127
- if (binding.kind === "class") {
128
- const lifecycle = metadataReader.getLifecycleMetadata(binding.target);
129
- if (lifecycle?.preDestroy && lifecycle.preDestroy.length > 0) {
130
- for (const methodName of lifecycle.preDestroy) {
131
- const method = instance[methodName];
132
- if (typeof method === "function") {
133
- const hookResult = method.call(instance);
134
- if (hookResult instanceof Promise) {
135
- await hookResult;
136
- }
137
- }
138
- }
124
+ for (const methodName of lifecycleMethods(binding, metadataReader, "preDestroy")) {
125
+ const hookResult = callHook(instance, methodName);
126
+ if (hookResult instanceof Promise) {
127
+ await hookResult;
139
128
  }
140
129
  }
141
130
  }
@@ -160,18 +149,9 @@ export class LifecycleManager {
160
149
  }
161
150
  }
162
151
  // 3. @preDestroy()
163
- if (binding.kind === "class") {
164
- const lifecycle = metadataReader.getLifecycleMetadata(binding.target);
165
- if (lifecycle?.preDestroy && lifecycle.preDestroy.length > 0) {
166
- for (const methodName of lifecycle.preDestroy) {
167
- const method = instance[methodName];
168
- if (typeof method === "function") {
169
- const hookResult = method.call(instance);
170
- if (hookResult instanceof Promise) {
171
- throw new AsyncDeactivationError(tokenDisplayName);
172
- }
173
- }
174
- }
152
+ for (const methodName of lifecycleMethods(binding, metadataReader, "preDestroy")) {
153
+ if (callHook(instance, methodName) instanceof Promise) {
154
+ throw new AsyncDeactivationError(tokenDisplayName);
175
155
  }
176
156
  }
177
157
  }
@@ -180,4 +160,17 @@ export class LifecycleManager {
180
160
  return this.#activationHooks !== undefined;
181
161
  }
182
162
  }
163
+ const NO_METHODS = [];
164
+ /** The `@postConstruct` / `@preDestroy` methods a binding declares — only a class can declare any. */
165
+ function lifecycleMethods(binding, metadataReader, phase) {
166
+ if (binding.kind !== "class") {
167
+ return NO_METHODS;
168
+ }
169
+ return metadataReader.getLifecycleMetadata(binding.target)?.[phase] ?? NO_METHODS;
170
+ }
171
+ /** Invokes a hook by name, tolerating a name whose member is not (or no longer) a method. */
172
+ function callHook(instance, methodName) {
173
+ const method = instance[methodName];
174
+ return typeof method === "function" ? method.call(instance) : undefined;
175
+ }
183
176
  //# sourceMappingURL=lifecycle.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/resolution/lifecycle.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAGxE,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAGpC;;GAEG;AACH,MAAM,OAAO,gBAAgB;IAC3B,8FAA8F;IAC9F,6DAA6D;IAC7D,gBAAgB,CAAmF;IACnG,kBAAkB,CAAqF;IACvG,kBAAkB,GAAG,CAAC,CAAC;IAEvB,kBAAkB,CAAc,KAAwC,EAAE,OAAiC;QACzG,IAAI,CAAC,kBAAkB,IAAI,CAAC,CAAC;QAC7B,oCAAoC;QACpC,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,gBAAgB,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC,WAAW,CAAC,KAAqC,EAAE,EAAE,CAAC,CAAC;QAC1G,IAAI,CAAC,IAAI,CAAC,OAAqC,CAAC,CAAC;IACnD,CAAC;IAED,qBAAqB,CAAc,KAAwC;QACzE,IAAI,IAAI,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;YACxC,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAqC,CAAC,CAAC;QAC9E,OAAO,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IAC/C,CAAC;IAED,IAAI,iBAAiB;QACnB,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACjC,CAAC;IAED,sFAAsF;IACtF,qBAAqB,CACnB,KAAwC;QAExC,OAAO,IAAI,CAAC,gBAAgB,EAAE,GAAG,CAAC,KAAqC,CAAC,CAAC;IAC3E,CAAC;IAED,oBAAoB,CAClB,KAAwC,EACxC,OAAmC;QAEnC,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,kBAAkB,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC,WAAW,CAAC,KAAqC,EAAE,EAAE,CAAC,CAAC;QAC5G,IAAI,CAAC,IAAI,CAAC,OAAuC,CAAC,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,aAAa,CACjB,iBAAoC,EACpC,OAAuB,EACvB,QAAe,EACf,cAA8B;QAE9B,IAAI,iBAAiB,GAAU,QAAQ,CAAC;QAExC,kGAAkG;QAClG,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC7B,MAAM,SAAS,GAAG,cAAc,CAAC,oBAAoB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACtE,IAAI,SAAS,EAAE,aAAa,IAAI,SAAS,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACnE,KAAK,MAAM,UAAU,IAAI,SAAS,CAAC,aAAa,EAAE,CAAC;oBACjD,MAAM,MAAM,GAAI,iBAA6C,CAAC,UAAU,CAAC,CAAC;oBAC1E,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE,CAAC;wBACjC,MAAM,UAAU,GAAI,MAAwB,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;wBACrE,IAAI,UAAU,YAAY,OAAO,EAAE,CAAC;4BAClC,MAAM,UAAU,CAAC;wBACnB,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,8BAA8B;QAC9B,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,IAAI,OAAO,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YACnE,MAAM,gBAAgB,GAAG,OAAO,CAAC,YAAY,CAAC,iBAAiB,EAAE,iBAAiB,CAAC,CAAC;YACpF,iBAAiB,GAAG,gBAAgB,YAAY,OAAO,CAAC,CAAC,CAAC,MAAM,gBAAgB,CAAC,CAAC,CAAC,gBAAgB,CAAC;QACtG,CAAC;QAED,kCAAkC;QAClC,MAAM,cAAc,GAAG,IAAI,CAAC,gBAAgB,EAAE,GAAG,CAAC,OAAO,CAAC,KAAqC,CAAC,CAAC;QACjG,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;YACjC,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;gBAClC,MAAM,gBAAgB,GAAG,IAAI,CAAC,iBAAiB,EAAE,iBAAiB,CAAC,CAAC;gBACpE,iBAAiB,GAAG,CAAC,gBAAgB,YAAY,OAAO,CAAC,CAAC,CAAC,MAAM,gBAAgB,CAAC,CAAC,CAAC,gBAAgB,CAAU,CAAC;YACjH,CAAC;QACH,CAAC;QAED,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAED,iBAAiB,CACf,iBAAoC,EACpC,OAAuB,EACvB,QAAe,EACf,cAA8B;QAE9B,IAAI,iBAAiB,GAAU,QAAQ,CAAC;QAExC,iFAAiF;QACjF,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC7B,MAAM,SAAS,GAAG,cAAc,CAAC,oBAAoB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACtE,IAAI,SAAS,EAAE,aAAa,IAAI,SAAS,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACnE,KAAK,MAAM,UAAU,IAAI,SAAS,CAAC,aAAa,EAAE,CAAC;oBACjD,MAAM,MAAM,GAAI,iBAA6C,CAAC,UAAU,CAAC,CAAC;oBAC1E,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE,CAAC;wBACjC,MAAM,UAAU,GAAI,MAAwB,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;wBACrE,IAAI,UAAU,YAAY,OAAO,EAAE,CAAC;4BAClC,MAAM,IAAI,oBAAoB,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,eAAe,EAAE,UAAU,CAAC,CAAC;wBACxF,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,6CAA6C;QAC7C,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,IAAI,OAAO,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YACnE,MAAM,gBAAgB,GAAG,OAAO,CAAC,YAAY,CAAC,iBAAiB,EAAE,iBAAiB,CAAC,CAAC;YACpF,IAAI,gBAAgB,YAAY,OAAO,EAAE,CAAC;gBACxC,MAAM,IAAI,oBAAoB,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,cAAc,CAAC,CAAC;YAC3E,CAAC;YACD,iBAAiB,GAAG,gBAAgB,CAAC;QACvC,CAAC;QAED,iDAAiD;QACjD,MAAM,gBAAgB,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAClD,MAAM,cAAc,GAAG,IAAI,CAAC,gBAAgB,EAAE,GAAG,CAAC,OAAO,CAAC,KAAqC,CAAC,CAAC;QACjG,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;YACjC,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;gBAClC,MAAM,gBAAgB,GAAG,IAAI,CAAC,iBAAiB,EAAE,iBAAiB,CAAC,CAAC;gBACpE,IAAI,gBAAgB,YAAY,OAAO,EAAE,CAAC;oBACxC,MAAM,IAAI,oBAAoB,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAC;gBACnE,CAAC;gBACD,iBAAiB,GAAG,gBAAyB,CAAC;YAChD,CAAC;QACH,CAAC;QAED,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,eAAe,CACnB,OAAuB,EACvB,QAAe,EACf,cAA8B;QAE9B,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAqC,CAAC;QAE/D,oCAAoC;QACpC,MAAM,cAAc,GAAG,IAAI,CAAC,kBAAkB,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC9D,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;YACjC,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;gBAClC,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAClC,IAAI,UAAU,YAAY,OAAO,EAAE,CAAC;oBAClC,MAAM,UAAU,CAAC;gBACnB,CAAC;YACH,CAAC;QACH,CAAC;QAED,gCAAgC;QAChC,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,IAAI,OAAO,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;YACrE,MAAM,UAAU,GAAG,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;YACpD,IAAI,UAAU,YAAY,OAAO,EAAE,CAAC;gBAClC,MAAM,UAAU,CAAC;YACnB,CAAC;QACH,CAAC;QAED,sDAAsD;QACtD,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC7B,MAAM,SAAS,GAAG,cAAc,CAAC,oBAAoB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACtE,IAAI,SAAS,EAAE,UAAU,IAAI,SAAS,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7D,KAAK,MAAM,UAAU,IAAI,SAAS,CAAC,UAAU,EAAE,CAAC;oBAC9C,MAAM,MAAM,GAAI,QAAoC,CAAC,UAAU,CAAC,CAAC;oBACjE,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE,CAAC;wBACjC,MAAM,UAAU,GAAI,MAAwB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;wBAC5D,IAAI,UAAU,YAAY,OAAO,EAAE,CAAC;4BAClC,MAAM,UAAU,CAAC;wBACnB,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,mBAAmB,CAAc,OAAuB,EAAE,QAAe,EAAE,cAA8B;QACvG,MAAM,gBAAgB,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAClD,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAqC,CAAC;QAE/D,oCAAoC;QACpC,MAAM,cAAc,GAAG,IAAI,CAAC,kBAAkB,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC9D,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;YACjC,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;gBAClC,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAClC,IAAI,UAAU,YAAY,OAAO,EAAE,CAAC;oBAClC,MAAM,IAAI,sBAAsB,CAAC,gBAAgB,CAAC,CAAC;gBACrD,CAAC;YACH,CAAC;QACH,CAAC;QAED,gCAAgC;QAChC,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,IAAI,OAAO,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;YACrE,MAAM,UAAU,GAAG,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;YACpD,IAAI,UAAU,YAAY,OAAO,EAAE,CAAC;gBAClC,MAAM,IAAI,sBAAsB,CAAC,gBAAgB,CAAC,CAAC;YACrD,CAAC;QACH,CAAC;QAED,mBAAmB;QACnB,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC7B,MAAM,SAAS,GAAG,cAAc,CAAC,oBAAoB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACtE,IAAI,SAAS,EAAE,UAAU,IAAI,SAAS,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7D,KAAK,MAAM,UAAU,IAAI,SAAS,CAAC,UAAU,EAAE,CAAC;oBAC9C,MAAM,MAAM,GAAI,QAAoC,CAAC,UAAU,CAAC,CAAC;oBACjE,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE,CAAC;wBACjC,MAAM,UAAU,GAAI,MAAwB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;wBAC5D,IAAI,UAAU,YAAY,OAAO,EAAE,CAAC;4BAClC,MAAM,IAAI,sBAAsB,CAAC,gBAAgB,CAAC,CAAC;wBACrD,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD,gFAAgF;IAChF,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,gBAAgB,KAAK,SAAS,CAAC;IAC7C,CAAC;CACF"}
1
+ {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/resolution/lifecycle.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import type { ResolutionFrame } from "#/types";
1
2
  /**
2
3
  * Where the cycle check switches from a linear `Array.includes` scan to an attached Set.
3
4
  *
@@ -9,14 +10,89 @@ export declare const RESOLUTION_SET_THRESHOLD = 32;
9
10
  /**
10
11
  * Marks a token as in-flight on this path, throwing if it is already there.
11
12
  *
12
- * @remarks Unmark with `resolutionPath.pop()` plus `set?.delete(name)`, or {@link exitResolutionPath}.
13
+ * @remarks Unmark with `resolutionPath.pop()` plus `set?.delete(name)`. Sync only — the async lane
14
+ * never removes an entry, so it extends a branch instead; see {@link extendResolutionBranch}.
15
+ *
16
+ * @returns the membership set once the path is deep enough to carry one, else `undefined`.
17
+ *
18
+ * @since 0.5.0-canary.7
13
19
  */
14
- export declare function enterResolutionPath(resolutionPath: Array<string>, tokenDisplayName: string, forceSet: true): Set<string>;
15
- export declare function enterResolutionPath(resolutionPath: Array<string>, tokenDisplayName: string, forceSet: boolean): Set<string> | undefined;
20
+ export declare function enterResolutionPath(resolutionPath: Array<string>, tokenDisplayName: string): Set<string> | undefined;
21
+ declare const BRANCH_BRAND: unique symbol;
16
22
  /**
17
- * Unwinds the innermost {@link enterResolutionPath} entry, for callers that hold only the path.
23
+ * A resolution path one async branch owns, so appending to it cannot disturb another branch.
18
24
  *
19
- * @since 0.5.0-canary.7
25
+ * @remarks Only {@link extendResolutionBranch} mints one. That is what makes "may this lane append
26
+ * to this array" a question the compiler answers instead of a rule in a doc — a sync frame's path,
27
+ * which that frame will pop, is a plain `Array<string>` and cannot reach a level that owns its own.
28
+ *
29
+ * @since 0.5.0-canary.9
30
+ */
31
+ export type OwnedBranchPath = Array<string> & {
32
+ readonly [BRANCH_BRAND]: true;
33
+ };
34
+ /**
35
+ * The stack half of {@link OwnedBranchPath}, minted only by {@link extendResolutionStackBranch}.
36
+ *
37
+ * @since 0.5.0-canary.9
38
+ */
39
+ export type OwnedBranchStack = Array<ResolutionFrame> & {
40
+ readonly [BRANCH_BRAND]: true;
41
+ };
42
+ declare const BRANCH_DEPTH_BRAND: unique symbol;
43
+ /**
44
+ * How many leading entries of a path belong to one async branch.
45
+ *
46
+ * @remarks Branded so a bare number cannot be passed: a depth from anywhere but this branch silently
47
+ * re-parents a level.
48
+ *
49
+ * @since 0.5.0-canary.9
50
+ */
51
+ export type OwnedBranchDepth = number & {
52
+ readonly [BRANCH_DEPTH_BRAND]: true;
53
+ };
54
+ /**
55
+ * A path no async branch owns yet, so its first extension must copy rather than append.
56
+ *
57
+ * @since 0.5.0-canary.9
58
+ */
59
+ export declare const UNOWNED_BRANCH = -1;
60
+ /**
61
+ * How far into a path one extension may reach: this branch's own depth, or nobody's.
62
+ *
63
+ * @remarks A union rather than a sentinel hidden inside the branded number, so the two cases are
64
+ * visible at every signature that takes one and `=== UNOWNED_BRANCH` narrows to the owned case.
65
+ *
66
+ * @since 0.5.0-canary.9
67
+ */
68
+ export type BranchDepth = OwnedBranchDepth | typeof UNOWNED_BRANCH;
69
+ /**
70
+ * The depth a chain's first level extends from, over an array its caller just minted.
71
+ *
72
+ * @since 0.5.0-canary.9
73
+ */
74
+ export declare const ROOT_BRANCH: OwnedBranchDepth;
75
+ /**
76
+ * A branch's own depth: the length its path had when this level took it.
77
+ *
78
+ * @since 0.5.0-canary.9
79
+ */
80
+ export declare function branchDepthOf(branch: OwnedBranchPath): OwnedBranchDepth;
81
+ /**
82
+ * Extends one branch of an append-only path, throwing if the entry is already an ancestor.
83
+ *
84
+ * @remarks Appends in place while this branch still owns the next slot, and copies its own prefix
85
+ * once a sibling has claimed it. Nothing is ever removed, so no async level has to observe its own
86
+ * settlement to unwind — see `ARCHITECTURE.md`.
87
+ *
88
+ * @since 0.5.0-canary.9
89
+ */
90
+ export declare function extendResolutionBranch(resolutionPath: Array<string>, branchDepth: BranchDepth, tokenDisplayName: string): OwnedBranchPath;
91
+ /**
92
+ * The stack half of {@link extendResolutionBranch}; frames carry no cycle to detect.
93
+ *
94
+ * @since 0.5.0-canary.9
20
95
  */
21
- export declare function exitResolutionPath(resolutionPath: Array<string>): void;
96
+ export declare function extendResolutionStackBranch(resolutionStack: Array<ResolutionFrame>, branchDepth: BranchDepth, frame: ResolutionFrame): OwnedBranchStack;
97
+ export {};
22
98
  //# sourceMappingURL=resolution-path.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"resolution-path.d.ts","sourceRoot":"","sources":["../../src/resolution/resolution-path.ts"],"names":[],"mappings":"AAIA;;;;;;GAMG;AACH,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAG3C;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC,EAC7B,gBAAgB,EAAE,MAAM,EACxB,QAAQ,EAAE,IAAI,GACb,GAAG,CAAC,MAAM,CAAC,CAAC;AACf,wBAAgB,mBAAmB,CACjC,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC,EAC7B,gBAAgB,EAAE,MAAM,EACxB,QAAQ,EAAE,OAAO,GAChB,GAAG,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;AAuB3B;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,CAKtE"}
1
+ {"version":3,"file":"resolution-path.d.ts","sourceRoot":"","sources":["../../src/resolution/resolution-path.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAG/C;;;;;;GAMG;AACH,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAG3C;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,gBAAgB,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,SAAS,CAapH;AAED,OAAO,CAAC,MAAM,YAAY,EAAE,OAAO,MAAM,CAAC;AAE1C;;;;;;;;GAQG;AACH,MAAM,MAAM,eAAe,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG;IAAE,QAAQ,CAAC,CAAC,YAAY,CAAC,EAAE,IAAI,CAAA;CAAE,CAAC;AAEhF;;;;GAIG;AACH,MAAM,MAAM,gBAAgB,GAAG,KAAK,CAAC,eAAe,CAAC,GAAG;IAAE,QAAQ,CAAC,CAAC,YAAY,CAAC,EAAE,IAAI,CAAA;CAAE,CAAC;AAE1F,OAAO,CAAC,MAAM,kBAAkB,EAAE,OAAO,MAAM,CAAC;AAEhD;;;;;;;GAOG;AACH,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG;IAAE,QAAQ,CAAC,CAAC,kBAAkB,CAAC,EAAE,IAAI,CAAA;CAAE,CAAC;AAEhF;;;;GAIG;AACH,eAAO,MAAM,cAAc,KAAK,CAAC;AAEjC;;;;;;;GAOG;AACH,MAAM,MAAM,WAAW,GAAG,gBAAgB,GAAG,OAAO,cAAc,CAAC;AAEnE;;;;GAIG;AACH,eAAO,MAAM,WAAW,EAAQ,gBAAgB,CAAC;AAEjD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,eAAe,GAAG,gBAAgB,CAEvE;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CACpC,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC,EAC7B,WAAW,EAAE,WAAW,EACxB,gBAAgB,EAAE,MAAM,GACvB,eAAe,CAkBjB;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CACzC,eAAe,EAAE,KAAK,CAAC,eAAe,CAAC,EACvC,WAAW,EAAE,WAAW,EACxB,KAAK,EAAE,eAAe,GACrB,gBAAgB,CAQlB"}
@@ -10,12 +10,19 @@ const RESOLUTION_SET_KEY = Symbol("di:resolution-set");
10
10
  */
11
11
  export const RESOLUTION_SET_THRESHOLD = 32;
12
12
  /**
13
+ * Marks a token as in-flight on this path, throwing if it is already there.
14
+ *
15
+ * @remarks Unmark with `resolutionPath.pop()` plus `set?.delete(name)`. Sync only — the async lane
16
+ * never removes an entry, so it extends a branch instead; see {@link extendResolutionBranch}.
17
+ *
18
+ * @returns the membership set once the path is deep enough to carry one, else `undefined`.
19
+ *
13
20
  * @since 0.5.0-canary.7
14
21
  */
15
- export function enterResolutionPath(resolutionPath, tokenDisplayName, forceSet) {
22
+ export function enterResolutionPath(resolutionPath, tokenDisplayName) {
16
23
  const pathWithSet = resolutionPath;
17
24
  let resolutionSet = pathWithSet[RESOLUTION_SET_KEY];
18
- if (resolutionSet === undefined && (forceSet || resolutionPath.length >= RESOLUTION_SET_THRESHOLD)) {
25
+ if (resolutionSet === undefined && resolutionPath.length >= RESOLUTION_SET_THRESHOLD) {
19
26
  resolutionSet = new Set(resolutionPath);
20
27
  pathWithSet[RESOLUTION_SET_KEY] = resolutionSet;
21
28
  }
@@ -27,14 +34,65 @@ export function enterResolutionPath(resolutionPath, tokenDisplayName, forceSet)
27
34
  return resolutionSet;
28
35
  }
29
36
  /**
30
- * Unwinds the innermost {@link enterResolutionPath} entry, for callers that hold only the path.
37
+ * A path no async branch owns yet, so its first extension must copy rather than append.
31
38
  *
32
- * @since 0.5.0-canary.7
39
+ * @since 0.5.0-canary.9
40
+ */
41
+ export const UNOWNED_BRANCH = -1;
42
+ /**
43
+ * The depth a chain's first level extends from, over an array its caller just minted.
44
+ *
45
+ * @since 0.5.0-canary.9
46
+ */
47
+ export const ROOT_BRANCH = 0;
48
+ /**
49
+ * A branch's own depth: the length its path had when this level took it.
50
+ *
51
+ * @since 0.5.0-canary.9
52
+ */
53
+ export function branchDepthOf(branch) {
54
+ return branch.length;
55
+ }
56
+ /**
57
+ * Extends one branch of an append-only path, throwing if the entry is already an ancestor.
58
+ *
59
+ * @remarks Appends in place while this branch still owns the next slot, and copies its own prefix
60
+ * once a sibling has claimed it. Nothing is ever removed, so no async level has to observe its own
61
+ * settlement to unwind — see `ARCHITECTURE.md`.
62
+ *
63
+ * @since 0.5.0-canary.9
64
+ */
65
+ export function extendResolutionBranch(resolutionPath, branchDepth, tokenDisplayName) {
66
+ const depth = branchDepth === UNOWNED_BRANCH ? resolutionPath.length : branchDepth;
67
+ for (let index = 0; index < depth; index += 1) {
68
+ if (resolutionPath[index] === tokenDisplayName) {
69
+ throw new CircularDependencyError([...resolutionPath.slice(0, depth), tokenDisplayName]);
70
+ }
71
+ }
72
+ // An unowned array belongs to a sync frame that will pop it, or carries a membership Set this
73
+ // lane cannot keep true; copying is what makes the branch's own appends safe.
74
+ if (branchDepth === resolutionPath.length) {
75
+ // The sole mint: appending in place needs a depth that came from a branch already owned, or
76
+ // ROOT_BRANCH over an array its caller minted for this chain alone.
77
+ resolutionPath.push(tokenDisplayName);
78
+ return resolutionPath;
79
+ }
80
+ const branch = resolutionPath.slice(0, depth);
81
+ branch.push(tokenDisplayName);
82
+ return branch;
83
+ }
84
+ /**
85
+ * The stack half of {@link extendResolutionBranch}; frames carry no cycle to detect.
86
+ *
87
+ * @since 0.5.0-canary.9
33
88
  */
34
- export function exitResolutionPath(resolutionPath) {
35
- const tokenDisplayName = resolutionPath.pop();
36
- if (tokenDisplayName !== undefined) {
37
- resolutionPath[RESOLUTION_SET_KEY]?.delete(tokenDisplayName);
89
+ export function extendResolutionStackBranch(resolutionStack, branchDepth, frame) {
90
+ if (branchDepth === resolutionStack.length) {
91
+ resolutionStack.push(frame);
92
+ return resolutionStack;
38
93
  }
94
+ const branch = resolutionStack.slice(0, branchDepth === UNOWNED_BRANCH ? resolutionStack.length : branchDepth);
95
+ branch.push(frame);
96
+ return branch;
39
97
  }
40
98
  //# sourceMappingURL=resolution-path.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"resolution-path.js","sourceRoot":"","sources":["../../src/resolution/resolution-path.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,OAAO,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC;AAEnD,MAAM,kBAAkB,GAAkB,MAAM,CAAC,mBAAmB,CAAC,CAAC;AACtE;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,CAAC;AAkB3C;;GAEG;AACH,MAAM,UAAU,mBAAmB,CACjC,cAA6B,EAC7B,gBAAwB,EACxB,QAAiB;IAEjB,MAAM,WAAW,GAAG,cAAuC,CAAC;IAC5D,IAAI,aAAa,GAAG,WAAW,CAAC,kBAAkB,CAAC,CAAC;IACpD,IAAI,aAAa,KAAK,SAAS,IAAI,CAAC,QAAQ,IAAI,cAAc,CAAC,MAAM,IAAI,wBAAwB,CAAC,EAAE,CAAC;QACnG,aAAa,GAAG,IAAI,GAAG,CAAS,cAAc,CAAC,CAAC;QAChD,WAAW,CAAC,kBAAkB,CAAC,GAAG,aAAa,CAAC;IAClD,CAAC;IACD,IAAI,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAClH,MAAM,IAAI,uBAAuB,CAAC,CAAC,GAAG,cAAc,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAC3E,CAAC;IACD,cAAc,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACtC,aAAa,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC;IACrC,OAAO,aAAa,CAAC;AACvB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,cAA6B;IAC9D,MAAM,gBAAgB,GAAG,cAAc,CAAC,GAAG,EAAE,CAAC;IAC9C,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;QAClC,cAAwC,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAC1F,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"resolution-path.js","sourceRoot":"","sources":["../../src/resolution/resolution-path.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,35 @@
1
- import type { BindingSlot } from "#/binding";
2
- import type { BindingTag, ResolveOptions } from "#/types";
1
+ import type { Token } from "#/token";
2
+ import type { BindingTag, Constructor, ResolveOptions } from "#/types";
3
+ /**
4
+ * What one resolvable dependency declares.
5
+ *
6
+ * @remarks Both dependency sources — a constructor's `ParamMetadata` and a `toResolved`
7
+ * `InjectionDescriptor` — are this shape, which is why one resolve routine serves both.
8
+ *
9
+ * @since 0.5.0-canary.9
10
+ */
11
+ export interface DependencySlot {
12
+ readonly token: Token<unknown> | Constructor;
13
+ readonly optional: boolean;
14
+ readonly multi: boolean;
15
+ readonly name?: string;
16
+ readonly tags?: ReadonlyArray<BindingTag>;
17
+ }
18
+ /**
19
+ * A request whose only criterion is a name — the shape the registry has a direct index for.
20
+ *
21
+ * @since 0.5.0-canary.9
22
+ */
23
+ export declare function isNameOnlyOptions(options: ResolveOptions): options is ResolveOptions & {
24
+ name: string;
25
+ };
26
+ /**
27
+ * The lone entry of a request whose only criterion is a one-element `tags` list — the shape the
28
+ * registry has a direct tag index for.
29
+ *
30
+ * @since 0.5.0-canary.9
31
+ */
32
+ export declare function singleTagOnlyOf(options: ResolveOptions): BindingTag | undefined;
3
33
  /**
4
34
  * Builds a {@link ResolveOptions} safe for `exactOptionalPropertyTypes`:
5
35
  * omits keys instead of assigning `undefined`.
@@ -11,9 +41,16 @@ export declare function injectionSlotToResolveOptions(injectionSlot: {
11
41
  readonly tags?: ReadonlyArray<BindingTag>;
12
42
  }): ResolveOptions | undefined;
13
43
  /**
14
- * Resolve options derived from a binding {@link BindingSlot} (tags may be empty; omits when nothing to match).
44
+ * Resolve options derived from a binding slot (tags may be empty; omits when nothing to match).
45
+ *
46
+ * @remarks Takes the slot structurally rather than as `BindingSlot`, so the slot on a public
47
+ * `BindingSnapshot` — where `name` is an optional property, not a required one holding `undefined` —
48
+ * is accepted by the same call.
15
49
  *
16
50
  * @since 0.3.16-canary.0
17
51
  */
18
- export declare function bindingSlotToResolveOptions(bindingSlot: BindingSlot): ResolveOptions | undefined;
52
+ export declare function bindingSlotToResolveOptions(bindingSlot: {
53
+ readonly name?: string | undefined;
54
+ readonly tags: ReadonlyArray<BindingTag>;
55
+ }): ResolveOptions | undefined;
19
56
  //# sourceMappingURL=resolve-options.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"resolve-options.d.ts","sourceRoot":"","sources":["../../src/resolution/resolve-options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAoB1D;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,aAAa,EAAE;IAC3D,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;CAC3C,GAAG,cAAc,GAAG,SAAS,CAE7B;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,WAAW,EAAE,WAAW,GAAG,cAAc,GAAG,SAAS,CAEhG"}
1
+ {"version":3,"file":"resolve-options.d.ts","sourceRoot":"","sources":["../../src/resolution/resolve-options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEvE;;;;;;;GAOG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,WAAW,CAAC;IAC7C,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;CAC3C;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,IAAI,cAAc,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAIvG;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,cAAc,GAAG,UAAU,GAAG,SAAS,CAK/E;AAoBD;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,aAAa,EAAE;IAC3D,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;CAC3C,GAAG,cAAc,GAAG,SAAS,CAE7B;AAED;;;;;;;;GAQG;AACH,wBAAgB,2BAA2B,CAAC,WAAW,EAAE;IACvD,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;CAC1C,GAAG,cAAc,GAAG,SAAS,CAE7B"}
@@ -1,3 +1,23 @@
1
+ /**
2
+ * A request whose only criterion is a name — the shape the registry has a direct index for.
3
+ *
4
+ * @since 0.5.0-canary.9
5
+ */
6
+ export function isNameOnlyOptions(options) {
7
+ return (options.name !== undefined && options.tag === undefined && (options.tags === undefined || options.tags.length === 0));
8
+ }
9
+ /**
10
+ * The lone entry of a request whose only criterion is a one-element `tags` list — the shape the
11
+ * registry has a direct tag index for.
12
+ *
13
+ * @since 0.5.0-canary.9
14
+ */
15
+ export function singleTagOnlyOf(options) {
16
+ if (options.name !== undefined || options.tag !== undefined) {
17
+ return undefined;
18
+ }
19
+ return options.tags !== undefined && options.tags.length === 1 ? options.tags[0] : undefined;
20
+ }
1
21
  /** Shared core: build a ResolveOptions from already-normalised name + tags. */
2
22
  function buildOptions(name, tags) {
3
23
  if (name === undefined && tags === undefined) {
@@ -22,7 +42,11 @@ export function injectionSlotToResolveOptions(injectionSlot) {
22
42
  return buildOptions(injectionSlot.name, injectionSlot.tags);
23
43
  }
24
44
  /**
25
- * Resolve options derived from a binding {@link BindingSlot} (tags may be empty; omits when nothing to match).
45
+ * Resolve options derived from a binding slot (tags may be empty; omits when nothing to match).
46
+ *
47
+ * @remarks Takes the slot structurally rather than as `BindingSlot`, so the slot on a public
48
+ * `BindingSnapshot` — where `name` is an optional property, not a required one holding `undefined` —
49
+ * is accepted by the same call.
26
50
  *
27
51
  * @since 0.3.16-canary.0
28
52
  */
@@ -1 +1 @@
1
- {"version":3,"file":"resolve-options.js","sourceRoot":"","sources":["../../src/resolution/resolve-options.ts"],"names":[],"mappings":"AAGA,+EAA+E;AAC/E,SAAS,YAAY,CACnB,IAAwB,EACxB,IAA2C;IAE3C,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QAC7C,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,OAAO,GAAmB,EAAE,CAAC;IACnC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IACtB,CAAC;IACD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IACtB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,6BAA6B,CAAC,aAG7C;IACC,OAAO,YAAY,CAAC,aAAa,CAAC,IAAI,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC;AAC9D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,2BAA2B,CAAC,WAAwB;IAClE,OAAO,YAAY,CAAC,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;AACpG,CAAC"}
1
+ {"version":3,"file":"resolve-options.js","sourceRoot":"","sources":["../../src/resolution/resolve-options.ts"],"names":[],"mappings":"AAmBA;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAuB;IACvD,OAAO,CACL,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,CAAC,GAAG,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CACrH,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,OAAuB;IACrD,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;QAC5D,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC/F,CAAC;AAED,+EAA+E;AAC/E,SAAS,YAAY,CACnB,IAAwB,EACxB,IAA2C;IAE3C,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QAC7C,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,OAAO,GAAmB,EAAE,CAAC;IACnC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IACtB,CAAC;IACD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IACtB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,6BAA6B,CAAC,aAG7C;IACC,OAAO,YAAY,CAAC,aAAa,CAAC,IAAI,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC;AAC9D,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,2BAA2B,CAAC,WAG3C;IACC,OAAO,YAAY,CAAC,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;AACpG,CAAC"}
@@ -2,10 +2,11 @@ import type { Binding } from "#/binding";
2
2
  import type { Container } from "#/container/container";
3
3
  import type { MetadataReader } from "#/metadata/metadata-types";
4
4
  import type { BindingRegistry } from "#/registry";
5
+ import type { DefaultLookupEntry } from "#/resolution/binding-lookup-cache";
5
6
  import type { ResolutionDiagnostics } from "#/resolution/diagnostics";
6
7
  import type { ResolverCallbacks } from "#/resolution/environment";
7
- import { DefaultResolutionContext } from "#/resolution/environment";
8
8
  import type { LifecycleManager } from "#/resolution/lifecycle";
9
+ import type { BranchDepth } from "#/resolution/resolution-path";
9
10
  import type { ScopeManager } from "#/resolution/scope";
10
11
  import type { Token } from "#/token";
11
12
  import type { Constructor, ResolutionFrame, ResolveOptions } from "#/types";
@@ -14,27 +15,44 @@ import type { Constructor, ResolutionFrame, ResolveOptions } from "#/types";
14
15
  */
15
16
  export declare class DependencyResolver implements ResolverCallbacks {
16
17
  #private;
18
+ /**
19
+ * The pair a top-level **sync** resolve reuses instead of minting two arrays per call.
20
+ *
21
+ * @remarks Read directly rather than through an accessor returning both: a shallow resolve is one
22
+ * top-level call, so a call and an object literal there are not amortised over anything. Every sync
23
+ * lane pops what it pushes, so `rootStack.length === 0` means no resolve holds the pair; async
24
+ * appends without popping and mints its own. Keeping the pair stable is also what lets a pooled
25
+ * context skip storing pointers it already holds.
26
+ */
27
+ readonly rootPath: Array<string>;
28
+ readonly rootStack: Array<ResolutionFrame>;
17
29
  constructor(registry: BindingRegistry, scope: ScopeManager, lifecycle: LifecycleManager, metadataReader: MetadataReader, container: Container, parent: DependencyResolver | undefined);
18
30
  /** Structural counts for {@link RESOLUTION_DIAGNOSTICS}; see `resolution/diagnostics.ts`. */
19
- describeCaches(): Pick<ResolutionDiagnostics, "asyncContextPoolSize" | "compiledPlanCount" | "syncContextPoolSize">;
31
+ describeCaches(): Pick<ResolutionDiagnostics, "compiledPlanCount" | "syncContextPoolSize">;
20
32
  /**
21
33
  * Binding lookup aligned with `resolve` — used by `Container.validate` without instantiating.
22
34
  */
23
- peekBindingForValidate(token: Token<unknown> | Constructor, options: ResolveOptions | undefined): {
24
- binding: Binding;
25
- owner: DependencyResolver;
26
- } | undefined;
35
+ peekBindingForValidate(token: Token<unknown> | Constructor, options: ResolveOptions | undefined): DefaultLookupEntry<DependencyResolver> | undefined;
27
36
  /**
28
37
  * Mirrors {@link DependencyResolver.resolveAll} candidate selection only (no instantiation).
29
38
  */
30
- peekCandidateBindingsForValidate(token: Token<unknown> | Constructor, options: ResolveOptions | undefined): Array<Binding>;
39
+ peekCandidateBindingsForValidate(token: Token<unknown> | Constructor, options: ResolveOptions | undefined): ReadonlyArray<Binding>;
31
40
  resolveFromContext<const Value>(token: Token<Value> | Constructor<Value>, resolutionPath: Array<string>, resolutionStack: Array<ResolutionFrame>): Value;
32
41
  resolve<const Value>(token: Token<Value> | Constructor<Value>, options: ResolveOptions | undefined, resolutionPath: Array<string>, resolutionStack: Array<ResolutionFrame>): Value;
33
42
  resolveOptional<const Value>(token: Token<Value> | Constructor<Value>, options: ResolveOptions | undefined, resolutionPath: Array<string>, resolutionStack: Array<ResolutionFrame>): Value | undefined;
34
43
  resolveAll<const Value>(token: Token<Value> | Constructor<Value>, options: ResolveOptions | undefined, resolutionPath: Array<string>, resolutionStack: Array<ResolutionFrame>): Array<Value>;
35
- resolveAsyncFromContext<const Value>(token: Token<Value> | Constructor<Value>, resolutionPath: Array<string>, resolutionStack: Array<ResolutionFrame>, callerContext?: DefaultResolutionContext): Promise<Value>;
36
- resolveAsync<const Value>(token: Token<Value> | Constructor<Value>, options: ResolveOptions | undefined, resolutionPath: Array<string>, resolutionStack: Array<ResolutionFrame>): Promise<Value>;
37
- resolveOptionalAsync<const Value>(token: Token<Value> | Constructor<Value>, options: ResolveOptions | undefined, resolutionPath: Array<string>, resolutionStack: Array<ResolutionFrame>): Promise<Value | undefined>;
38
- resolveAllAsync<const Value>(token: Token<Value> | Constructor<Value>, options: ResolveOptions | undefined, resolutionPath: Array<string>, resolutionStack: Array<ResolutionFrame>): Promise<Array<Value>>;
44
+ resolveAsyncFromContext<const Value>(token: Token<Value> | Constructor<Value>, resolutionPath: Array<string>, resolutionStack: Array<ResolutionFrame>, branchDepth: BranchDepth): Promise<Value>;
45
+ resolveAsync<const Value>(token: Token<Value> | Constructor<Value>, options: ResolveOptions | undefined, resolutionPath: Array<string>, resolutionStack: Array<ResolutionFrame>, branchDepth?: BranchDepth): Promise<Value>;
46
+ resolveOptionalAsync<const Value>(token: Token<Value> | Constructor<Value>, options: ResolveOptions | undefined, resolutionPath: Array<string>, resolutionStack: Array<ResolutionFrame>, branchDepth?: BranchDepth): Promise<Value | undefined>;
47
+ resolveAllAsync<const Value>(token: Token<Value> | Constructor<Value>, options: ResolveOptions | undefined, resolutionPath: Array<string>, resolutionStack: Array<ResolutionFrame>, branchDepth?: BranchDepth): Promise<Array<Value>>;
48
+ /**
49
+ * Entry for a request a factory makes from inside an open synchronous cascade.
50
+ *
51
+ * @remarks A request arriving with no cascade open came out of a continuation, so its ancestors
52
+ * are on no call stack — it escapes to the branch lane. See `ARCHITECTURE.md`.
53
+ */
54
+ resolveAsyncFromCascade(token: Token<unknown> | Constructor): Promise<unknown>;
55
+ /** Entry for a resolve the container starts, which opens the cascade rather than joining one. */
56
+ resolveAsyncFromRoot(token: Token<unknown> | Constructor): Promise<unknown>;
39
57
  }
40
58
  //# sourceMappingURL=resolver.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/resolution/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAe,MAAM,WAAW,CAAC;AAEtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAYvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAMlD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAwB,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AAE1F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAErC,OAAO,KAAK,EAMV,WAAW,EACX,eAAe,EACf,cAAc,EACf,MAAM,SAAS,CAAC;AAajB;;GAEG;AACH,qBAAa,kBAAmB,YAAW,iBAAiB;;IAmB1D,YACE,QAAQ,EAAE,eAAe,EACzB,KAAK,EAAE,YAAY,EACnB,SAAS,EAAE,gBAAgB,EAC3B,cAAc,EAAE,cAAc,EAC9B,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,kBAAkB,GAAG,SAAS,EAcvC;IAED,6FAA6F;IAC7F,cAAc,IAAI,IAAI,CAAC,qBAAqB,EAAE,sBAAsB,GAAG,mBAAmB,GAAG,qBAAqB,CAAC,CAYlH;IAgED;;OAEG;IACH,sBAAsB,CACpB,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,WAAW,EACnC,OAAO,EAAE,cAAc,GAAG,SAAS,GAClC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,kBAAkB,CAAA;KAAE,GAAG,SAAS,CAE7D;IAED;;OAEG;IACH,gCAAgC,CAC9B,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,WAAW,EACnC,OAAO,EAAE,cAAc,GAAG,SAAS,GAClC,KAAK,CAAC,OAAO,CAAC,CAUhB;IAID,kBAAkB,CAAC,KAAK,CAAC,KAAK,EAC5B,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,EACxC,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC,EAC7B,eAAe,EAAE,KAAK,CAAC,eAAe,CAAC,GACtC,KAAK,CAYP;IAwJD,OAAO,CAAC,KAAK,CAAC,KAAK,EACjB,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,EACxC,OAAO,EAAE,cAAc,GAAG,SAAS,EACnC,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC,EAC7B,eAAe,EAAE,KAAK,CAAC,eAAe,CAAC,GACtC,KAAK,CAqEP;IA6ND,eAAe,CAAC,KAAK,CAAC,KAAK,EACzB,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,EACxC,OAAO,EAAE,cAAc,GAAG,SAAS,EACnC,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC,EAC7B,eAAe,EAAE,KAAK,CAAC,eAAe,CAAC,GACtC,KAAK,GAAG,SAAS,CAKnB;IAED,UAAU,CAAC,KAAK,CAAC,KAAK,EACpB,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,EACxC,OAAO,EAAE,cAAc,GAAG,SAAS,EACnC,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC,EAC7B,eAAe,EAAE,KAAK,CAAC,eAAe,CAAC,GACtC,KAAK,CAAC,KAAK,CAAC,CAoCd;IAID,uBAAuB,CAAC,KAAK,CAAC,KAAK,EACjC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,EACxC,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC,EAC7B,eAAe,EAAE,KAAK,CAAC,eAAe,CAAC,EACvC,aAAa,CAAC,EAAE,wBAAwB,GACvC,OAAO,CAAC,KAAK,CAAC,CAgChB;IAgDK,YAAY,CAAC,KAAK,CAAC,KAAK,EAC5B,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,EACxC,OAAO,EAAE,cAAc,GAAG,SAAS,EACnC,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC,EAC7B,eAAe,EAAE,KAAK,CAAC,eAAe,CAAC,GACtC,OAAO,CAAC,KAAK,CAAC,CA4ChB;IAqRK,oBAAoB,CAAC,KAAK,CAAC,KAAK,EACpC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,EACxC,OAAO,EAAE,cAAc,GAAG,SAAS,EACnC,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC,EAC7B,eAAe,EAAE,KAAK,CAAC,eAAe,CAAC,GACtC,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,CAK5B;IAEK,eAAe,CAAC,KAAK,CAAC,KAAK,EAC/B,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,EACxC,OAAO,EAAE,cAAc,GAAG,SAAS,EACnC,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC,EAC7B,eAAe,EAAE,KAAK,CAAC,eAAe,CAAC,GACtC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAoCvB;CAiVF"}
1
+ {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/resolution/resolver.ts"],"names":[],"mappings":"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"}