octane 0.2.11 → 0.2.13

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 (264) hide show
  1. package/README.md +5 -0
  2. package/dist/behavior-root.d.ts +13 -3
  3. package/dist/behavior-root.js +28 -5
  4. package/dist/cjs/behavior-root.cjs +32 -6
  5. package/dist/cjs/class-names.cjs +49 -0
  6. package/dist/cjs/constants.cjs +9 -0
  7. package/dist/cjs/context-epoch.cjs +38 -0
  8. package/dist/cjs/css.cjs +6 -27
  9. package/dist/cjs/data-encoding.cjs +160 -0
  10. package/dist/cjs/dom-binding-handoff.cjs +93 -0
  11. package/dist/cjs/dom-binding-protocol.cjs +115 -0
  12. package/dist/cjs/dom-binding-styles.cjs +292 -0
  13. package/dist/cjs/dom-bindings.cjs +700 -0
  14. package/dist/cjs/dom-focused-move.cjs +66 -0
  15. package/dist/cjs/dom-stage.cjs +896 -0
  16. package/dist/cjs/dom-tables.cjs +4 -94
  17. package/dist/cjs/error-codes.client.generated.cjs +33 -0
  18. package/dist/cjs/error-codes.server.generated.cjs +24 -0
  19. package/dist/cjs/hydration/control-capture.cjs +244 -0
  20. package/dist/cjs/hydration/event-capture.cjs +125 -43
  21. package/dist/cjs/hydration/interaction-config.cjs +50 -2
  22. package/dist/cjs/hydration-markers.cjs +37 -0
  23. package/dist/cjs/independent-hydration-protocol.cjs +106 -0
  24. package/dist/cjs/index.cjs +9 -0
  25. package/dist/cjs/runtime.cjs +6397 -1683
  26. package/dist/cjs/runtime.server.cjs +1465 -213
  27. package/dist/cjs/server/early-signals.cjs +45 -0
  28. package/dist/cjs/server/index.cjs +47 -0
  29. package/dist/cjs/server/rpc-batch.cjs +149 -0
  30. package/dist/cjs/server/rpc-stream.cjs +146 -0
  31. package/dist/cjs/server/rpc.cjs +34 -15
  32. package/dist/cjs/server/signal-query-observation.cjs +158 -0
  33. package/dist/cjs/server/streamed-region.cjs +52 -0
  34. package/dist/cjs/server/streamed-signals.cjs +512 -0
  35. package/dist/cjs/server-call.cjs +103 -0
  36. package/dist/cjs/server-rpc-batch-client.cjs +141 -0
  37. package/dist/cjs/server-rpc-client.cjs +94 -27
  38. package/dist/cjs/server-rpc-protocol.cjs +141 -0
  39. package/dist/cjs/server-rpc-stream-client.cjs +118 -0
  40. package/dist/cjs/signals/actions.cjs +474 -0
  41. package/dist/cjs/signals/client.cjs +4 -1
  42. package/dist/cjs/signals/computations.cjs +460 -0
  43. package/dist/cjs/signals/control-binding.cjs +368 -0
  44. package/dist/cjs/signals/derived-facade.cjs +50 -0
  45. package/dist/cjs/signals/document-owner.cjs +71 -0
  46. package/dist/cjs/signals/early-values.cjs +155 -0
  47. package/dist/cjs/signals/encoding.cjs +6 -95
  48. package/dist/cjs/signals/engine.cjs +276 -12
  49. package/dist/cjs/signals/errors.cjs +18 -0
  50. package/dist/cjs/signals/facade.cjs +477 -0
  51. package/dist/cjs/signals/graph.cjs +166 -20
  52. package/dist/cjs/signals/handle-protocol.cjs +36 -0
  53. package/dist/cjs/signals/index.cjs +81 -2
  54. package/dist/cjs/signals/native-read-client.cjs +10 -0
  55. package/dist/cjs/signals/owner-context.cjs +112 -0
  56. package/dist/cjs/signals/query-attempt-observer.cjs +68 -0
  57. package/dist/cjs/signals/query-facade.cjs +72 -0
  58. package/dist/cjs/signals/read-protocol.cjs +54 -0
  59. package/dist/cjs/signals/requests.cjs +287 -14
  60. package/dist/cjs/signals/scalar-computations.cjs +76 -0
  61. package/dist/cjs/signals/server.cjs +4 -1
  62. package/dist/cjs/signals/transition-candidate.cjs +567 -0
  63. package/dist/cjs/signals/transition-state.cjs +106 -0
  64. package/dist/cjs/signals/types.cjs +50 -0
  65. package/dist/cjs/stream-protocol.cjs +3 -0
  66. package/dist/cjs/streamed-signals-protocol.cjs +159 -0
  67. package/dist/cjs/style-values.cjs +122 -0
  68. package/dist/cjs/trusted-html.cjs +30 -0
  69. package/dist/cjs/version.cjs +1 -1
  70. package/dist/class-names.d.ts +5 -0
  71. package/dist/class-names.js +25 -0
  72. package/dist/compiler/bundler.js +51 -22
  73. package/dist/compiler/compile.js +2534 -581
  74. package/dist/compiler/dom-binding-program.js +935 -0
  75. package/dist/compiler/dom-binding-request.js +57 -0
  76. package/dist/compiler/dom-bindings.js +2245 -0
  77. package/dist/compiler/hook-deps.js +759 -10
  78. package/dist/compiler/hydrate-boundaries.js +358 -15
  79. package/dist/compiler/index.d.ts +39 -2
  80. package/dist/compiler/index.js +1 -0
  81. package/dist/compiler/native-attribute-reads.js +127 -0
  82. package/dist/compiler/native-change-diagnostics.js +32 -38
  83. package/dist/compiler/native-read-diagnostics.js +69 -8
  84. package/dist/compiler/native-read-types.js +80 -34
  85. package/dist/compiler/parser.node.js +1 -1
  86. package/dist/compiler/renderer-boundaries.js +40 -0
  87. package/dist/compiler/server-context.js +118 -0
  88. package/dist/compiler/signal-attempt-reads.js +479 -0
  89. package/dist/compiler/signal-declarations.js +557 -0
  90. package/dist/compiler/signal-start-reads.js +413 -0
  91. package/dist/compiler/slot-hooks.d.ts +3 -1
  92. package/dist/compiler/slot-hooks.js +168 -34
  93. package/dist/compiler/strong-auto-memo.js +90 -0
  94. package/dist/compiler/strong-html.js +143 -0
  95. package/dist/compiler/strong-mode.js +764 -66
  96. package/dist/compiler/strong-template-policy.js +307 -0
  97. package/dist/compiler/template-ir.js +200 -0
  98. package/dist/compiler/typescript.d.ts +2 -0
  99. package/dist/compiler/typescript.js +2 -0
  100. package/dist/compiler/vite.d.ts +3 -1
  101. package/dist/compiler/vite.js +122 -4
  102. package/dist/compiler/volar.LICENSES.txt +1 -1
  103. package/dist/compiler/volar.d.ts +6 -1
  104. package/dist/compiler/volar.js +750 -1433
  105. package/dist/constants.d.ts +1 -0
  106. package/dist/constants.js +10 -0
  107. package/dist/context-epoch.d.ts +2 -0
  108. package/dist/context-epoch.js +13 -0
  109. package/dist/css.d.ts +2 -5
  110. package/dist/css.js +2 -23
  111. package/dist/data-encoding.d.ts +9 -0
  112. package/dist/data-encoding.js +134 -0
  113. package/dist/dom-binding-classes.d.ts +15 -0
  114. package/dist/dom-binding-classes.js +129 -0
  115. package/dist/dom-binding-controls.d.ts +2 -0
  116. package/dist/dom-binding-controls.js +6 -0
  117. package/dist/dom-binding-handoff.d.ts +55 -0
  118. package/dist/dom-binding-handoff.js +62 -0
  119. package/dist/dom-binding-program.d.ts +300 -0
  120. package/dist/dom-binding-program.js +1625 -0
  121. package/dist/dom-binding-projections.d.ts +15 -0
  122. package/dist/dom-binding-projections.js +187 -0
  123. package/dist/dom-binding-protocol.d.ts +13 -0
  124. package/dist/dom-binding-protocol.js +88 -0
  125. package/dist/dom-binding-signals.d.ts +21 -0
  126. package/dist/dom-binding-signals.js +109 -0
  127. package/dist/dom-binding-styles.d.ts +17 -0
  128. package/dist/dom-binding-styles.js +272 -0
  129. package/dist/dom-bindings.d.ts +89 -0
  130. package/dist/dom-bindings.js +670 -0
  131. package/dist/dom-focused-move.d.ts +6 -0
  132. package/dist/dom-focused-move.js +42 -0
  133. package/dist/dom-stage.d.ts +52 -0
  134. package/dist/dom-stage.js +872 -0
  135. package/dist/dom-tables.d.ts +1 -3
  136. package/dist/dom-tables.js +1 -91
  137. package/dist/error-codes.client.generated.d.ts +9 -0
  138. package/dist/error-codes.client.generated.js +33 -0
  139. package/dist/error-codes.server.generated.d.ts +6 -0
  140. package/dist/error-codes.server.generated.js +24 -0
  141. package/dist/hydration/control-capture.d.ts +62 -0
  142. package/dist/hydration/control-capture.js +223 -0
  143. package/dist/hydration/document-lifecycle.d.ts +23 -0
  144. package/dist/hydration/document-lifecycle.js +80 -0
  145. package/dist/hydration/event-capture.d.ts +20 -1
  146. package/dist/hydration/event-capture.js +128 -42
  147. package/dist/hydration/independent-island.d.ts +45 -0
  148. package/dist/hydration/independent-island.js +233 -0
  149. package/dist/hydration/index.d.ts +8 -1
  150. package/dist/hydration/index.js +55 -1
  151. package/dist/hydration/interaction-config.d.ts +5 -0
  152. package/dist/hydration/interaction-config.js +44 -1
  153. package/dist/hydration/stream-delivery.d.ts +32 -0
  154. package/dist/hydration/stream-delivery.js +333 -0
  155. package/dist/hydration/stream-receiver.d.ts +26 -0
  156. package/dist/hydration/stream-receiver.js +204 -0
  157. package/dist/hydration/stream-result-receiver.d.ts +70 -0
  158. package/dist/hydration/stream-result-receiver.js +246 -0
  159. package/dist/hydration/streamed-signals.d.ts +44 -0
  160. package/dist/hydration/streamed-signals.js +186 -0
  161. package/dist/hydration/types.d.ts +6 -0
  162. package/dist/hydration-markers.d.ts +7 -0
  163. package/dist/hydration-markers.js +10 -0
  164. package/dist/independent-hydration-protocol.d.ts +31 -0
  165. package/dist/independent-hydration-protocol.js +80 -0
  166. package/dist/index.d.ts +3 -0
  167. package/dist/index.js +6 -0
  168. package/dist/internal/signal-read.d.ts +1 -0
  169. package/dist/internal/signal-read.js +4 -0
  170. package/dist/jsx-runtime-strong.d.ts +33 -0
  171. package/dist/jsx-runtime.d.ts +58 -2
  172. package/dist/public-types.d.ts +15 -1
  173. package/dist/runtime.d.ts +297 -23
  174. package/dist/runtime.js +6405 -1679
  175. package/dist/runtime.server.d.ts +110 -27
  176. package/dist/runtime.server.js +1458 -213
  177. package/dist/server/early-signals.d.ts +14 -0
  178. package/dist/server/early-signals.js +34 -0
  179. package/dist/server/index.d.ts +11 -2
  180. package/dist/server/index.js +50 -1
  181. package/dist/server/rpc-batch.d.ts +17 -0
  182. package/dist/server/rpc-batch.js +129 -0
  183. package/dist/server/rpc-stream.d.ts +9 -0
  184. package/dist/server/rpc-stream.js +125 -0
  185. package/dist/server/rpc.d.ts +5 -1
  186. package/dist/server/rpc.js +37 -13
  187. package/dist/server/signal-query-observation.d.ts +3 -0
  188. package/dist/server/signal-query-observation.js +134 -0
  189. package/dist/server/streamed-region.d.ts +15 -0
  190. package/dist/server/streamed-region.js +30 -0
  191. package/dist/server/streamed-signals.d.ts +45 -0
  192. package/dist/server/streamed-signals.js +488 -0
  193. package/dist/server-call.d.ts +41 -0
  194. package/dist/server-call.js +75 -0
  195. package/dist/server-rpc-batch-client.d.ts +7 -0
  196. package/dist/server-rpc-batch-client.js +119 -0
  197. package/dist/server-rpc-client.d.ts +3 -1
  198. package/dist/server-rpc-client.js +99 -27
  199. package/dist/server-rpc-protocol.d.ts +47 -0
  200. package/dist/server-rpc-protocol.js +109 -0
  201. package/dist/server-rpc-stream-client.d.ts +5 -0
  202. package/dist/server-rpc-stream-client.js +98 -0
  203. package/dist/signals/actions.d.ts +12 -0
  204. package/dist/signals/actions.js +466 -0
  205. package/dist/signals/client.d.ts +2 -0
  206. package/dist/signals/client.js +1 -0
  207. package/dist/signals/computations.d.ts +37 -0
  208. package/dist/signals/computations.js +455 -0
  209. package/dist/signals/control-binding.d.ts +31 -0
  210. package/dist/signals/control-binding.js +353 -0
  211. package/dist/signals/derived-facade.d.ts +3 -0
  212. package/dist/signals/derived-facade.js +25 -0
  213. package/dist/signals/document-owner.d.ts +10 -0
  214. package/dist/signals/document-owner.js +43 -0
  215. package/dist/signals/early-values.d.ts +24 -0
  216. package/dist/signals/early-values.js +124 -0
  217. package/dist/signals/encoding.d.ts +1 -3
  218. package/dist/signals/encoding.js +3 -93
  219. package/dist/signals/engine.d.ts +53 -4
  220. package/dist/signals/engine.js +275 -16
  221. package/dist/signals/errors.d.ts +7 -0
  222. package/dist/signals/errors.js +16 -0
  223. package/dist/signals/facade.d.ts +74 -0
  224. package/dist/signals/facade.js +452 -0
  225. package/dist/signals/graph.d.ts +52 -6
  226. package/dist/signals/graph.js +174 -19
  227. package/dist/signals/handle-protocol.d.ts +4 -0
  228. package/dist/signals/handle-protocol.js +11 -0
  229. package/dist/signals/index.d.ts +12 -3
  230. package/dist/signals/index.js +71 -2
  231. package/dist/signals/native-read-client.d.ts +3 -0
  232. package/dist/signals/native-read-client.js +10 -0
  233. package/dist/signals/owner-context.d.ts +22 -0
  234. package/dist/signals/owner-context.js +77 -0
  235. package/dist/signals/query-attempt-observer.d.ts +49 -0
  236. package/dist/signals/query-attempt-observer.js +41 -0
  237. package/dist/signals/query-facade.d.ts +3 -0
  238. package/dist/signals/query-facade.js +49 -0
  239. package/dist/signals/read-protocol.d.ts +37 -2
  240. package/dist/signals/read-protocol.js +44 -0
  241. package/dist/signals/requests.d.ts +38 -5
  242. package/dist/signals/requests.js +298 -15
  243. package/dist/signals/scalar-computations.d.ts +2 -0
  244. package/dist/signals/scalar-computations.js +60 -0
  245. package/dist/signals/server.d.ts +2 -0
  246. package/dist/signals/server.js +1 -0
  247. package/dist/signals/transition-candidate.d.ts +71 -0
  248. package/dist/signals/transition-candidate.js +557 -0
  249. package/dist/signals/transition-state.d.ts +51 -0
  250. package/dist/signals/transition-state.js +70 -0
  251. package/dist/signals/types.d.ts +95 -5
  252. package/dist/signals/types.js +20 -0
  253. package/dist/stream-protocol.d.ts +0 -5
  254. package/dist/stream-protocol.js +3 -0
  255. package/dist/streamed-signals-protocol.d.ts +60 -0
  256. package/dist/streamed-signals-protocol.js +130 -0
  257. package/dist/style-values.d.ts +3 -0
  258. package/dist/style-values.js +96 -0
  259. package/dist/trusted-html.d.ts +17 -0
  260. package/dist/trusted-html.js +6 -0
  261. package/dist/universal-core.d.ts +6 -0
  262. package/dist/universal-core.js +214 -202
  263. package/dist/version.js +1 -1
  264. package/package.json +48 -5
@@ -0,0 +1,567 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var transition_candidate_exports = {};
20
+ __export(transition_candidate_exports, {
21
+ SignalCandidateFrame: () => SignalCandidateFrame
22
+ });
23
+ module.exports = __toCommonJS(transition_candidate_exports);
24
+ var import_errors = require("./errors.cjs");
25
+ var import_read_protocol = require("./read-protocol.cjs");
26
+ var import_transition_state = require("./transition-state.cjs");
27
+ function isThenable(value) {
28
+ return value !== null && (typeof value === "object" || typeof value === "function") && typeof value.then === "function";
29
+ }
30
+ function clearPreparationWake(watch) {
31
+ watch.notify = void 0;
32
+ watch.validate = void 0;
33
+ watch.token = void 0;
34
+ }
35
+ function queuePreparationWake(watch, invalid = false) {
36
+ if (!watch.notify) return;
37
+ watch.invalid ||= invalid;
38
+ if (watch.queued) return;
39
+ watch.queued = true;
40
+ queueMicrotask(() => {
41
+ const notify = watch.notify;
42
+ if (!notify) return;
43
+ const token = watch.token;
44
+ const kind = watch.invalid || !watch.validate?.() ? "invalid" : "retry";
45
+ clearPreparationWake(watch);
46
+ notify({ kind, token });
47
+ });
48
+ }
49
+ function settlePreparationWake(watch) {
50
+ queuePreparationWake(watch);
51
+ }
52
+ function createNativeReadCandidateSource(candidate) {
53
+ let target = candidate;
54
+ let accepted = false;
55
+ let acceptedVersion = NaN;
56
+ let canonicalVersion = NaN;
57
+ const subscriptions = /* @__PURE__ */ new Set();
58
+ const source = {
59
+ getVersion: () => target === void 0 ? NaN : !accepted ? target.getVersion() : target.getVersion() === canonicalVersion ? acceptedVersion : NaN,
60
+ subscribe(notify) {
61
+ if (target === void 0) throw new TypeError("The native read candidate has retired.");
62
+ const subscription = { notify, dispose: target.subscribe(notify) };
63
+ subscriptions.add(subscription);
64
+ return () => {
65
+ if (subscriptions.delete(subscription)) subscription.dispose();
66
+ };
67
+ },
68
+ serialize(version) {
69
+ return source.getVersion() === version ? target?.serialize?.(accepted ? canonicalVersion : version) : void 0;
70
+ }
71
+ };
72
+ if (candidate.inspect) source.inspect = () => target.inspect();
73
+ return {
74
+ source,
75
+ accept(canonical, observedVersion) {
76
+ if (accepted || target === void 0 || target.getVersion() !== observedVersion) return false;
77
+ const version = canonical.getVersion();
78
+ const acquired = /* @__PURE__ */ new Map();
79
+ try {
80
+ for (const subscription of subscriptions)
81
+ acquired.set(subscription, canonical.subscribe(subscription.notify));
82
+ } catch (error) {
83
+ for (const dispose of acquired.values()) dispose();
84
+ throw error;
85
+ }
86
+ acceptedVersion = observedVersion;
87
+ canonicalVersion = version;
88
+ target = canonical;
89
+ accepted = true;
90
+ if (!canonical.inspect) delete source.inspect;
91
+ for (const [subscription, dispose] of acquired) {
92
+ subscription.dispose();
93
+ subscription.dispose = dispose;
94
+ }
95
+ return true;
96
+ },
97
+ discard() {
98
+ if (accepted || target === void 0) return;
99
+ target = void 0;
100
+ delete source.inspect;
101
+ for (const subscription of subscriptions) subscription.dispose();
102
+ subscriptions.clear();
103
+ }
104
+ };
105
+ }
106
+ class SignalCandidateFrame {
107
+ entries;
108
+ originals;
109
+ generation = 0;
110
+ active = true;
111
+ preparationToken;
112
+ preparationWatch;
113
+ demand;
114
+ run(callback) {
115
+ if (!this.active) throw new TypeError("The signal candidate has retired.");
116
+ if (import_transition_state.activeCandidate && import_transition_state.activeCandidate !== this) {
117
+ throw new import_transition_state.CandidateUnsupportedError("Nested signal candidates are not supported.");
118
+ }
119
+ const previous = (0, import_transition_state.swapActiveSignalCandidate)(this);
120
+ try {
121
+ return callback();
122
+ } finally {
123
+ (0, import_transition_state.swapActiveSignalCandidate)(previous);
124
+ }
125
+ }
126
+ resolve(node) {
127
+ if (!this.active) throw new TypeError("The signal candidate has retired.");
128
+ const original = this.originals?.get(node);
129
+ if (original) {
130
+ this.demand?.add(original);
131
+ return node;
132
+ }
133
+ this.demand?.add(node);
134
+ const existing = this.entries?.get(node);
135
+ if (existing) return existing.target;
136
+ if (import_transition_state.candidateGraph.historical() || node.owner.readBarrier || !node.owner.forkCandidate) {
137
+ throw new import_transition_state.CandidateUnsupportedError("Only live candidate-capable owners are supported.");
138
+ }
139
+ import_transition_state.candidateGraph.assertAlive(node.owner);
140
+ this.invalidatePreparation();
141
+ const target = new import_transition_state.candidateGraph.ScopedNode(node.owner, node.key, node.kind);
142
+ target.state = node.state;
143
+ target.last = node.last;
144
+ target.lastState = node.lastState;
145
+ target.hasLast = node.hasLast;
146
+ const entry = {
147
+ node,
148
+ target,
149
+ revision: node.revision,
150
+ epoch: node.owner.epoch,
151
+ stop: import_transition_state.candidateGraph.attachObserver(
152
+ node,
153
+ () => {
154
+ if (node.owner.retired) this.discard();
155
+ else this.invalidatePreparation();
156
+ },
157
+ true
158
+ )
159
+ };
160
+ (this.entries ??= /* @__PURE__ */ new Map()).set(node, entry);
161
+ (this.originals ??= /* @__PURE__ */ new Map()).set(target, node);
162
+ try {
163
+ entry.producer = node.owner.forkCandidate(node, target, this);
164
+ const compute = target.compute;
165
+ if (compute) target.compute = () => this.run(() => compute(target));
166
+ } catch (error) {
167
+ this.discard();
168
+ throw error;
169
+ }
170
+ return target;
171
+ }
172
+ write(node, value) {
173
+ if (!this.validate()) throw new TypeError("Rebase the signal candidate before writing.");
174
+ const target = this.resolve(node);
175
+ const current = import_transition_state.candidateGraph.strictValue(import_transition_state.candidateGraph.refreshNode(target), node.key);
176
+ let previous = current;
177
+ const writers = import_transition_state.candidateWriters?.get(node);
178
+ if (typeof value === "function")
179
+ for (const writer of writers ?? []) {
180
+ if (writer === this) continue;
181
+ const pending = writer.entries.get(node);
182
+ previous = import_transition_state.candidateGraph.strictValue(import_transition_state.candidateGraph.refreshNode(pending.target), node.key);
183
+ for (const operation of pending.urgentOperations ?? [])
184
+ previous = import_transition_state.candidateGraph.untrack(() => import_transition_state.candidateGraph.pure(() => operation(previous)));
185
+ }
186
+ const next = typeof value === "function" ? import_transition_state.candidateGraph.untrack(() => import_transition_state.candidateGraph.pure(() => value(previous))) : value;
187
+ let releases;
188
+ for (const writer of writers ?? []) {
189
+ if (writer === this) continue;
190
+ const release = writer.replaceWrite(node);
191
+ if (release) (releases ??= []).push(release);
192
+ }
193
+ try {
194
+ if (Object.is(current, next)) return;
195
+ const entry = this.entries.get(node);
196
+ if (!entry.written) {
197
+ (0, import_transition_state.addCandidateWriter)(node, this);
198
+ entry.written = true;
199
+ }
200
+ this.generation++;
201
+ this.invalidatePreparation();
202
+ import_transition_state.candidateGraph.signalBatch(() => import_transition_state.candidateGraph.publishNode(target, import_transition_state.candidateGraph.readyState(next)));
203
+ } finally {
204
+ if (releases)
205
+ this.committed(() => {
206
+ for (const release of releases) release();
207
+ });
208
+ }
209
+ }
210
+ /** Only observed candidates allocate forwarding sources; ordinary reads keep their identity. */
211
+ nativeSource(target, read, source) {
212
+ const entry = this.entries.get(this.originals.get(target));
213
+ const sources = entry.sources ??= {};
214
+ return (sources[read] ??= createNativeReadCandidateSource(source)).source;
215
+ }
216
+ validate() {
217
+ if (!this.active) return false;
218
+ for (const entry of this.entries?.values() ?? []) {
219
+ if (entry.withdrawn || entry.urgentOperations !== void 0 || entry.node.owner.retired || entry.epoch !== entry.node.owner.epoch || entry.node.owner.readBarrier || entry.node.kind !== "derived" && entry.revision !== entry.node.revision)
220
+ return false;
221
+ }
222
+ return true;
223
+ }
224
+ hasWrites() {
225
+ for (const entry of this.entries?.values() ?? []) if (entry.written) return true;
226
+ return false;
227
+ }
228
+ /** Follow existing graph edges, never the document or a global consumer registry. */
229
+ consumers() {
230
+ const consumers = /* @__PURE__ */ new Set();
231
+ const visited = /* @__PURE__ */ new Set();
232
+ for (const entry of this.entries?.values() ?? []) if (entry.written) visited.add(entry.node);
233
+ for (const node of visited) {
234
+ for (let link = node.subs; link; link = link.nextSub) {
235
+ const subscriber = link.sub;
236
+ if (subscriber instanceof import_transition_state.candidateGraph.ScopedNode) visited.add(subscriber);
237
+ else {
238
+ const notify = subscriber.notify;
239
+ const dependent = notify?.[import_read_protocol.SIGNAL_DEPENDENT_NODE];
240
+ if (dependent) visited.add(dependent);
241
+ const consumer = notify?.[import_read_protocol.NATIVE_TRANSITION_CONSUMER];
242
+ if (consumer?.active()) consumers.add(consumer);
243
+ }
244
+ }
245
+ }
246
+ return [...consumers];
247
+ }
248
+ /** Canonical memo witnesses cannot justify skipping a private forward read. */
249
+ observes(node) {
250
+ return this.originals?.has(node) ?? false;
251
+ }
252
+ canonical(node) {
253
+ return this.originals?.get(node) ?? node;
254
+ }
255
+ /** Record intent without evaluating the forward graph in an urgent setter. */
256
+ recordUrgentWrite(node, value) {
257
+ if (typeof value !== "function") return this.replaceWrite(node);
258
+ const entry = this.entries?.get(node);
259
+ if (!this.active || !entry?.written) return;
260
+ this.generation++;
261
+ this.invalidatePreparation();
262
+ (entry.urgentOperations ??= []).push(value);
263
+ }
264
+ replaceWrite(node) {
265
+ const entry = this.entries?.get(node);
266
+ if (!this.active || !entry?.written) return;
267
+ this.generation++;
268
+ this.invalidatePreparation();
269
+ entry.withdrawn = true;
270
+ entry.urgentOperations = void 0;
271
+ this.forgetWrite(entry);
272
+ if (this.hasWrites()) return;
273
+ this.active = false;
274
+ return () => this.release();
275
+ }
276
+ forgetWrite(entry) {
277
+ if (!entry.written) return;
278
+ entry.written = false;
279
+ (0, import_transition_state.removeCandidateWriter)(entry.node, this);
280
+ }
281
+ /** Urgent writes win their own cells without restarting unaffected producer leases. */
282
+ rebase() {
283
+ if (!this.active) throw new TypeError("The signal candidate has retired.");
284
+ const hadWrites = this.hasWrites();
285
+ this.generation++;
286
+ this.invalidatePreparation();
287
+ import_transition_state.candidateGraph.signalBatch(() => {
288
+ for (const entry of this.entries?.values() ?? []) {
289
+ import_transition_state.candidateGraph.assertAlive(entry.node.owner);
290
+ if (entry.epoch !== entry.node.owner.epoch || entry.node.owner.readBarrier) {
291
+ throw new TypeError("The candidate owner changed lifetime.");
292
+ }
293
+ const operations = entry.urgentOperations;
294
+ if (!entry.withdrawn && !operations && entry.revision === entry.node.revision) continue;
295
+ entry.revision = entry.node.revision;
296
+ if (entry.node.kind === "signal") {
297
+ let state = entry.node.state;
298
+ if (operations) {
299
+ let value = import_transition_state.candidateGraph.strictValue(import_transition_state.candidateGraph.refreshNode(entry.target), entry.node.key);
300
+ for (const operation of operations)
301
+ value = this.run(() => import_transition_state.candidateGraph.untrack(() => import_transition_state.candidateGraph.pure(() => operation(value))));
302
+ if (!Object.is(value, import_transition_state.candidateGraph.strictValue(state, entry.node.key)))
303
+ state = import_transition_state.candidateGraph.readyState(value);
304
+ else this.forgetWrite(entry);
305
+ } else this.forgetWrite(entry);
306
+ entry.withdrawn = false;
307
+ entry.urgentOperations = void 0;
308
+ import_transition_state.candidateGraph.publishNode(entry.target, state);
309
+ }
310
+ }
311
+ });
312
+ if (hadWrites && !this.hasWrites()) this.discard();
313
+ }
314
+ prepare(reads = []) {
315
+ if (this.preparationWatch) clearPreparationWake(this.preparationWatch);
316
+ this.preparationWatch = void 0;
317
+ this.preparationToken = void 0;
318
+ const token = {};
319
+ if (!this.validate()) return { status: "invalid", token, reason: "stale" };
320
+ const generation = this.generation;
321
+ let waiting;
322
+ let failed = false;
323
+ let failure;
324
+ let invalid;
325
+ const observeFailure = (error, handled = false) => {
326
+ if (error instanceof import_transition_state.CandidateUnsupportedError) invalid = "unsupported";
327
+ else if (error instanceof import_errors.ScopeDisposedError || error instanceof import_errors.SignalFrameError || error instanceof import_read_protocol.NativeAdoptionMiss)
328
+ invalid ??= "stale";
329
+ else if (!handled) {
330
+ try {
331
+ if (isThenable(error)) {
332
+ (waiting ??= /* @__PURE__ */ new Set()).add(error);
333
+ return;
334
+ }
335
+ } catch (inspectionError) {
336
+ error = inspectionError;
337
+ }
338
+ if (!failed) failure = error;
339
+ failed = true;
340
+ }
341
+ };
342
+ const demand = reads.length ? /* @__PURE__ */ new Set() : void 0;
343
+ this.demand = demand;
344
+ for (const read of reads) {
345
+ try {
346
+ this.run(() => import_transition_state.candidateGraph.pure(read));
347
+ } catch (error) {
348
+ observeFailure(error);
349
+ }
350
+ }
351
+ this.demand = void 0;
352
+ if (demand) this.pruneDemand(demand);
353
+ const prepared = [];
354
+ for (const entry of this.entries?.values() ?? []) {
355
+ let state;
356
+ let producer;
357
+ try {
358
+ state = this.run(() => import_transition_state.candidateGraph.refreshNode(entry.target));
359
+ const outcome = entry.producer?.prepare();
360
+ if (outcome?.status === "pending") (waiting ??= /* @__PURE__ */ new Set()).add(outcome.waiting);
361
+ else if (outcome?.status === "error") observeFailure(outcome.error);
362
+ else if (outcome?.status === "invalid") invalid ??= "unsupported";
363
+ else if (outcome?.status === "ready") producer = outcome.receipt;
364
+ } catch (error) {
365
+ observeFailure(error);
366
+ continue;
367
+ }
368
+ if (state.snapshot.status === "pending" && state.waiting)
369
+ (waiting ??= /* @__PURE__ */ new Set()).add(state.waiting);
370
+ else if (state.snapshot.status === "error")
371
+ observeFailure(state.snapshot.error, reads.length > 0 || producer !== void 0);
372
+ else if (state.snapshot.status === "idle" && !producer) invalid ??= "unsupported";
373
+ prepared.push({
374
+ entry,
375
+ state,
376
+ last: entry.target.last,
377
+ lastState: entry.target.lastState,
378
+ hasLast: entry.target.hasLast,
379
+ revision: entry.target.revision,
380
+ producer
381
+ });
382
+ }
383
+ if (invalid) return { status: "invalid", token, reason: invalid };
384
+ if (!this.validate() || generation !== this.generation)
385
+ return { status: "invalid", token, reason: "stale" };
386
+ this.preparationToken = token;
387
+ if (failed) return { status: "error", token, error: failure };
388
+ if (waiting?.size) return { status: "pending", token, wakeables: [...waiting] };
389
+ return {
390
+ status: "ready",
391
+ token,
392
+ receipt: {
393
+ publish: (accepted) => {
394
+ if (!this.validate() || token !== this.preparationToken || generation !== this.generation || prepared.some(({ entry, state, last, lastState, hasLast, revision, producer }) => {
395
+ if (entry.target.revision !== revision || !Object.is(entry.target.last, last) || entry.target.lastState !== lastState || entry.target.hasLast !== hasLast)
396
+ return true;
397
+ if (state.owners) {
398
+ for (const owner of state.owners) if (owner.retired) return true;
399
+ }
400
+ if (lastState?.owners && lastState.owners !== state.owners) {
401
+ for (const owner of lastState.owners) if (owner.retired) return true;
402
+ }
403
+ return producer !== void 0 && !producer.validate();
404
+ }))
405
+ return false;
406
+ const releases = [];
407
+ const changed = [];
408
+ this.committed(
409
+ () => import_transition_state.candidateGraph.signalBatch(() => {
410
+ for (const { entry } of prepared) entry.node.flags |= import_transition_state.candidateGraph.flags.Dirty;
411
+ for (const { entry, state, last, lastState, hasLast, producer } of prepared) {
412
+ const { node, target } = entry;
413
+ if (producer) releases.push(producer.publish());
414
+ while (node.deps) import_transition_state.candidateGraph.graph.unlink(node.deps, node);
415
+ for (let link = target.deps; link; link = link.nextDep) {
416
+ const original = this.originals.get(link.dep);
417
+ if (!original) throw new TypeError("Candidate dependency escaped its frame.");
418
+ import_transition_state.candidateGraph.link(original, node);
419
+ }
420
+ const currentChanged = node.state?.snapshot !== state.snapshot || !import_transition_state.candidateGraph.sameState(node.state, state);
421
+ const retainedChanged = node.hasLast !== hasLast || !Object.is(node.last, last) || (lastState ? !import_transition_state.candidateGraph.sameState(node.lastState, lastState) : node.lastState !== void 0);
422
+ if (currentChanged) import_transition_state.candidateGraph.commitState(node, state);
423
+ if (node.lastState?.owners !== lastState?.owners)
424
+ import_transition_state.candidateGraph.releaseRetainedOwners(node);
425
+ node.last = last;
426
+ node.lastState = lastState;
427
+ node.hasLast = hasLast;
428
+ if (state.snapshot.status !== "ready") import_transition_state.candidateGraph.retainOwners(node);
429
+ if (!currentChanged && retainedChanged) node.revision++;
430
+ if (currentChanged || retainedChanged) changed.push(node);
431
+ }
432
+ this.active = false;
433
+ const previous = (0, import_transition_state.swapCandidateInvalidation)(true);
434
+ try {
435
+ for (const node of changed) {
436
+ if (node.subs) {
437
+ import_transition_state.candidateGraph.graph.propagate(node.subs, false);
438
+ import_transition_state.candidateGraph.graph.shallowPropagate(node.subs);
439
+ }
440
+ }
441
+ } finally {
442
+ (0, import_transition_state.swapCandidateInvalidation)(previous);
443
+ }
444
+ for (const { entry } of prepared) {
445
+ entry.node.flags = import_transition_state.candidateGraph.flags.Mutable | import_transition_state.candidateGraph.flags.Watching;
446
+ }
447
+ try {
448
+ for (const { producer } of prepared) producer?.accept?.();
449
+ for (const { entry, revision } of prepared) {
450
+ if (!entry.sources) continue;
451
+ for (const read of ["value", "latest", "snapshot"]) {
452
+ const source = entry.sources[read];
453
+ if (!source) continue;
454
+ const field = read === "value" ? "nativeSource" : read === "latest" ? "nativeLatestSource" : "nativeSnapshotSource";
455
+ source.accept(
456
+ entry.node[field] ??= import_transition_state.candidateGraph.createNativeSource(entry.node, read),
457
+ revision
458
+ );
459
+ }
460
+ }
461
+ accepted?.();
462
+ } finally {
463
+ this.release();
464
+ for (const release of releases) release();
465
+ }
466
+ })
467
+ );
468
+ return true;
469
+ }
470
+ }
471
+ };
472
+ }
473
+ watchPreparation(outcome, notify) {
474
+ if (this.preparationWatch) clearPreparationWake(this.preparationWatch);
475
+ this.preparationWatch = void 0;
476
+ if (outcome.status !== "pending") return () => {
477
+ };
478
+ const token = outcome.token;
479
+ const watch = {
480
+ notify,
481
+ token,
482
+ queued: false,
483
+ invalid: false,
484
+ validate: () => token === this.preparationToken && this.validate()
485
+ };
486
+ this.preparationWatch = watch;
487
+ if (!watch.validate()) queuePreparationWake(watch, true);
488
+ else
489
+ for (const waiting of outcome.wakeables) {
490
+ const settled = settlePreparationWake.bind(null, watch);
491
+ Promise.resolve(waiting).then(settled, settled);
492
+ }
493
+ return () => clearPreparationWake(watch);
494
+ }
495
+ invalidatePreparation() {
496
+ this.preparationToken = void 0;
497
+ const watch = this.preparationWatch;
498
+ this.preparationWatch = void 0;
499
+ if (watch) {
500
+ watch.validate = void 0;
501
+ queuePreparationWake(watch, true);
502
+ }
503
+ }
504
+ pruneDemand(demand) {
505
+ for (const entry of this.entries?.values() ?? []) if (entry.written) demand.add(entry.node);
506
+ for (const node of demand) {
507
+ const entry = this.entries?.get(node);
508
+ for (let link = entry?.target.deps; link; link = link.nextDep) {
509
+ const original = this.originals?.get(link.dep);
510
+ if (original) demand.add(original);
511
+ }
512
+ for (const dependency of entry?.producer?.dependencies?.() ?? []) {
513
+ demand.add(this.canonical(dependency));
514
+ }
515
+ }
516
+ let removed;
517
+ for (const entry of this.entries?.values() ?? []) {
518
+ if (demand.has(entry.node)) continue;
519
+ this.entries.delete(entry.node);
520
+ this.originals.delete(entry.target);
521
+ this.releaseEntry(entry);
522
+ (removed ??= []).push(entry);
523
+ }
524
+ if (removed)
525
+ this.committed(() => {
526
+ for (const entry of removed) entry.producer?.dispose();
527
+ });
528
+ }
529
+ discard() {
530
+ if (!this.active) return;
531
+ this.active = false;
532
+ this.generation++;
533
+ this.invalidatePreparation();
534
+ this.release();
535
+ }
536
+ release() {
537
+ if (this.preparationWatch) clearPreparationWake(this.preparationWatch);
538
+ this.preparationWatch = void 0;
539
+ this.preparationToken = void 0;
540
+ const entries = this.entries;
541
+ this.entries = void 0;
542
+ this.originals = void 0;
543
+ this.demand = void 0;
544
+ for (const entry of entries?.values() ?? []) this.releaseEntry(entry);
545
+ this.committed(() => {
546
+ for (const entry of entries?.values() ?? []) entry.producer?.dispose();
547
+ });
548
+ }
549
+ releaseEntry(entry) {
550
+ if (entry.sources) for (const source of Object.values(entry.sources)) source.discard();
551
+ this.forgetWrite(entry);
552
+ entry.urgentOperations = void 0;
553
+ entry.stop();
554
+ import_transition_state.candidateGraph.removeQueued(entry.target);
555
+ while (entry.target.deps) import_transition_state.candidateGraph.graph.unlink(entry.target.deps, entry.target);
556
+ while (entry.target.subs) import_transition_state.candidateGraph.graph.unlink(entry.target.subs);
557
+ import_transition_state.candidateGraph.releaseRetention(entry.target);
558
+ entry.target.compute = void 0;
559
+ }
560
+ committed(callback) {
561
+ return (0, import_transition_state.withoutSignalCandidate)(callback);
562
+ }
563
+ }
564
+ // Annotate the CommonJS export names for ESM import in node:
565
+ 0 && (module.exports = {
566
+ SignalCandidateFrame
567
+ });
@@ -0,0 +1,106 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var transition_state_exports = {};
20
+ __export(transition_state_exports, {
21
+ CandidateUnsupportedError: () => CandidateUnsupportedError,
22
+ activeCandidate: () => activeCandidate,
23
+ addCandidateWriter: () => addCandidateWriter,
24
+ candidateGraph: () => candidateGraph,
25
+ candidateWriteCount: () => candidateWriteCount,
26
+ candidateWriters: () => candidateWriters,
27
+ deferCandidateInvalidation: () => deferCandidateInvalidation,
28
+ recordCandidateUrgentWrite: () => recordCandidateUrgentWrite,
29
+ registerCandidateGraph: () => registerCandidateGraph,
30
+ removeCandidateWriter: () => removeCandidateWriter,
31
+ swapActiveSignalCandidate: () => swapActiveSignalCandidate,
32
+ swapCandidateInvalidation: () => swapCandidateInvalidation,
33
+ withoutSignalCandidate: () => withoutSignalCandidate
34
+ });
35
+ module.exports = __toCommonJS(transition_state_exports);
36
+ var import_read_protocol = require("./read-protocol.cjs");
37
+ let candidateGraph;
38
+ function registerCandidateGraph(graph) {
39
+ candidateGraph = graph;
40
+ }
41
+ function withoutSignalCandidate(callback) {
42
+ const previous = activeCandidate;
43
+ const resolver = (0, import_read_protocol.setNativeCandidateResolver)(null);
44
+ activeCandidate = void 0;
45
+ try {
46
+ return callback();
47
+ } finally {
48
+ activeCandidate = previous;
49
+ (0, import_read_protocol.setNativeCandidateResolver)(resolver);
50
+ }
51
+ }
52
+ class CandidateUnsupportedError extends TypeError {
53
+ }
54
+ let activeCandidate;
55
+ function swapActiveSignalCandidate(frame) {
56
+ const previous = activeCandidate;
57
+ activeCandidate = frame;
58
+ return previous;
59
+ }
60
+ let deferCandidateInvalidation = false;
61
+ function swapCandidateInvalidation(defer) {
62
+ const previous = deferCandidateInvalidation;
63
+ deferCandidateInvalidation = defer;
64
+ return previous;
65
+ }
66
+ let candidateWriteCount = 0;
67
+ let candidateWriters;
68
+ function addCandidateWriter(node, frame) {
69
+ candidateWriteCount++;
70
+ candidateWriters ??= /* @__PURE__ */ new WeakMap();
71
+ let writers = candidateWriters.get(node);
72
+ if (!writers) candidateWriters.set(node, writers = /* @__PURE__ */ new Set());
73
+ writers.add(frame);
74
+ }
75
+ function removeCandidateWriter(node, frame) {
76
+ const writers = candidateWriters.get(node);
77
+ writers.delete(frame);
78
+ if (writers.size === 0) candidateWriters.delete(node);
79
+ if (--candidateWriteCount === 0) candidateWriters = void 0;
80
+ }
81
+ function recordCandidateUrgentWrite(node, value) {
82
+ let releases;
83
+ const writers = candidateWriters?.get(node);
84
+ if (writers)
85
+ for (const frame of writers) {
86
+ const release = frame.recordUrgentWrite(node, value);
87
+ if (release) (releases ??= []).push(release);
88
+ }
89
+ return releases;
90
+ }
91
+ // Annotate the CommonJS export names for ESM import in node:
92
+ 0 && (module.exports = {
93
+ CandidateUnsupportedError,
94
+ activeCandidate,
95
+ addCandidateWriter,
96
+ candidateGraph,
97
+ candidateWriteCount,
98
+ candidateWriters,
99
+ deferCandidateInvalidation,
100
+ recordCandidateUrgentWrite,
101
+ registerCandidateGraph,
102
+ removeCandidateWriter,
103
+ swapActiveSignalCandidate,
104
+ swapCandidateInvalidation,
105
+ withoutSignalCandidate
106
+ });