octane 0.2.12 → 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 (243) 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/css.cjs +6 -27
  8. package/dist/cjs/data-encoding.cjs +160 -0
  9. package/dist/cjs/dom-binding-handoff.cjs +93 -0
  10. package/dist/cjs/dom-binding-protocol.cjs +115 -0
  11. package/dist/cjs/dom-binding-styles.cjs +292 -0
  12. package/dist/cjs/dom-bindings.cjs +700 -0
  13. package/dist/cjs/dom-focused-move.cjs +66 -0
  14. package/dist/cjs/dom-tables.cjs +4 -94
  15. package/dist/cjs/error-codes.client.generated.cjs +33 -0
  16. package/dist/cjs/error-codes.server.generated.cjs +19 -0
  17. package/dist/cjs/hydration/control-capture.cjs +244 -0
  18. package/dist/cjs/hydration/event-capture.cjs +125 -43
  19. package/dist/cjs/hydration/interaction-config.cjs +50 -2
  20. package/dist/cjs/hydration-markers.cjs +37 -0
  21. package/dist/cjs/independent-hydration-protocol.cjs +106 -0
  22. package/dist/cjs/index.cjs +6 -0
  23. package/dist/cjs/runtime.cjs +2791 -215
  24. package/dist/cjs/runtime.server.cjs +716 -76
  25. package/dist/cjs/server/early-signals.cjs +45 -0
  26. package/dist/cjs/server/index.cjs +44 -0
  27. package/dist/cjs/server/rpc-batch.cjs +149 -0
  28. package/dist/cjs/server/rpc-stream.cjs +146 -0
  29. package/dist/cjs/server/rpc.cjs +34 -15
  30. package/dist/cjs/server/signal-query-observation.cjs +158 -0
  31. package/dist/cjs/server/streamed-region.cjs +52 -0
  32. package/dist/cjs/server/streamed-signals.cjs +512 -0
  33. package/dist/cjs/server-call.cjs +103 -0
  34. package/dist/cjs/server-rpc-batch-client.cjs +141 -0
  35. package/dist/cjs/server-rpc-client.cjs +94 -27
  36. package/dist/cjs/server-rpc-protocol.cjs +141 -0
  37. package/dist/cjs/server-rpc-stream-client.cjs +118 -0
  38. package/dist/cjs/signals/actions.cjs +474 -0
  39. package/dist/cjs/signals/client.cjs +4 -1
  40. package/dist/cjs/signals/computations.cjs +460 -0
  41. package/dist/cjs/signals/control-binding.cjs +368 -0
  42. package/dist/cjs/signals/derived-facade.cjs +50 -0
  43. package/dist/cjs/signals/document-owner.cjs +71 -0
  44. package/dist/cjs/signals/early-values.cjs +155 -0
  45. package/dist/cjs/signals/encoding.cjs +6 -95
  46. package/dist/cjs/signals/engine.cjs +276 -12
  47. package/dist/cjs/signals/errors.cjs +18 -0
  48. package/dist/cjs/signals/facade.cjs +477 -0
  49. package/dist/cjs/signals/graph.cjs +163 -20
  50. package/dist/cjs/signals/handle-protocol.cjs +36 -0
  51. package/dist/cjs/signals/index.cjs +81 -2
  52. package/dist/cjs/signals/native-read-client.cjs +10 -0
  53. package/dist/cjs/signals/owner-context.cjs +112 -0
  54. package/dist/cjs/signals/query-attempt-observer.cjs +68 -0
  55. package/dist/cjs/signals/query-facade.cjs +72 -0
  56. package/dist/cjs/signals/read-protocol.cjs +32 -0
  57. package/dist/cjs/signals/requests.cjs +287 -14
  58. package/dist/cjs/signals/scalar-computations.cjs +76 -0
  59. package/dist/cjs/signals/server.cjs +4 -1
  60. package/dist/cjs/signals/transition-candidate.cjs +567 -0
  61. package/dist/cjs/signals/transition-state.cjs +106 -0
  62. package/dist/cjs/signals/types.cjs +50 -0
  63. package/dist/cjs/stream-protocol.cjs +3 -0
  64. package/dist/cjs/streamed-signals-protocol.cjs +159 -0
  65. package/dist/cjs/style-values.cjs +122 -0
  66. package/dist/cjs/version.cjs +1 -1
  67. package/dist/class-names.d.ts +5 -0
  68. package/dist/class-names.js +25 -0
  69. package/dist/compiler/bundler.js +34 -6
  70. package/dist/compiler/compile.js +2234 -559
  71. package/dist/compiler/dom-binding-program.js +935 -0
  72. package/dist/compiler/dom-binding-request.js +57 -0
  73. package/dist/compiler/dom-bindings.js +2245 -0
  74. package/dist/compiler/hook-deps.js +26 -0
  75. package/dist/compiler/hydrate-boundaries.js +358 -15
  76. package/dist/compiler/index.d.ts +38 -1
  77. package/dist/compiler/index.js +1 -0
  78. package/dist/compiler/native-attribute-reads.js +127 -0
  79. package/dist/compiler/native-read-diagnostics.js +48 -9
  80. package/dist/compiler/native-read-types.js +55 -32
  81. package/dist/compiler/server-context.js +118 -0
  82. package/dist/compiler/signal-attempt-reads.js +479 -0
  83. package/dist/compiler/signal-declarations.js +557 -0
  84. package/dist/compiler/signal-start-reads.js +413 -0
  85. package/dist/compiler/slot-hooks.js +57 -10
  86. package/dist/compiler/template-ir.js +200 -0
  87. package/dist/compiler/typescript.d.ts +2 -0
  88. package/dist/compiler/typescript.js +2 -0
  89. package/dist/compiler/vite.d.ts +3 -1
  90. package/dist/compiler/vite.js +122 -4
  91. package/dist/compiler/volar.d.ts +6 -1
  92. package/dist/compiler/volar.js +674 -143
  93. package/dist/constants.d.ts +1 -0
  94. package/dist/constants.js +10 -0
  95. package/dist/css.d.ts +2 -5
  96. package/dist/css.js +2 -23
  97. package/dist/data-encoding.d.ts +9 -0
  98. package/dist/data-encoding.js +134 -0
  99. package/dist/dom-binding-classes.d.ts +15 -0
  100. package/dist/dom-binding-classes.js +129 -0
  101. package/dist/dom-binding-controls.d.ts +2 -0
  102. package/dist/dom-binding-controls.js +6 -0
  103. package/dist/dom-binding-handoff.d.ts +55 -0
  104. package/dist/dom-binding-handoff.js +62 -0
  105. package/dist/dom-binding-program.d.ts +300 -0
  106. package/dist/dom-binding-program.js +1625 -0
  107. package/dist/dom-binding-projections.d.ts +15 -0
  108. package/dist/dom-binding-projections.js +187 -0
  109. package/dist/dom-binding-protocol.d.ts +13 -0
  110. package/dist/dom-binding-protocol.js +88 -0
  111. package/dist/dom-binding-signals.d.ts +21 -0
  112. package/dist/dom-binding-signals.js +109 -0
  113. package/dist/dom-binding-styles.d.ts +17 -0
  114. package/dist/dom-binding-styles.js +272 -0
  115. package/dist/dom-bindings.d.ts +89 -0
  116. package/dist/dom-bindings.js +670 -0
  117. package/dist/dom-focused-move.d.ts +6 -0
  118. package/dist/dom-focused-move.js +42 -0
  119. package/dist/dom-tables.d.ts +1 -3
  120. package/dist/dom-tables.js +1 -91
  121. package/dist/error-codes.client.generated.d.ts +9 -0
  122. package/dist/error-codes.client.generated.js +33 -0
  123. package/dist/error-codes.server.generated.d.ts +5 -0
  124. package/dist/error-codes.server.generated.js +19 -0
  125. package/dist/hydration/control-capture.d.ts +62 -0
  126. package/dist/hydration/control-capture.js +223 -0
  127. package/dist/hydration/document-lifecycle.d.ts +23 -0
  128. package/dist/hydration/document-lifecycle.js +80 -0
  129. package/dist/hydration/event-capture.d.ts +20 -1
  130. package/dist/hydration/event-capture.js +128 -42
  131. package/dist/hydration/independent-island.d.ts +45 -0
  132. package/dist/hydration/independent-island.js +233 -0
  133. package/dist/hydration/index.d.ts +8 -1
  134. package/dist/hydration/index.js +55 -1
  135. package/dist/hydration/interaction-config.d.ts +5 -0
  136. package/dist/hydration/interaction-config.js +44 -1
  137. package/dist/hydration/stream-delivery.d.ts +32 -0
  138. package/dist/hydration/stream-delivery.js +333 -0
  139. package/dist/hydration/stream-receiver.d.ts +26 -0
  140. package/dist/hydration/stream-receiver.js +204 -0
  141. package/dist/hydration/stream-result-receiver.d.ts +70 -0
  142. package/dist/hydration/stream-result-receiver.js +246 -0
  143. package/dist/hydration/streamed-signals.d.ts +44 -0
  144. package/dist/hydration/streamed-signals.js +186 -0
  145. package/dist/hydration/types.d.ts +6 -0
  146. package/dist/hydration-markers.d.ts +7 -0
  147. package/dist/hydration-markers.js +10 -0
  148. package/dist/independent-hydration-protocol.d.ts +31 -0
  149. package/dist/independent-hydration-protocol.js +80 -0
  150. package/dist/index.d.ts +2 -0
  151. package/dist/index.js +4 -0
  152. package/dist/internal/signal-read.d.ts +1 -0
  153. package/dist/internal/signal-read.js +4 -0
  154. package/dist/jsx-runtime.d.ts +45 -6
  155. package/dist/public-types.d.ts +15 -1
  156. package/dist/runtime.d.ts +259 -21
  157. package/dist/runtime.js +2812 -220
  158. package/dist/runtime.server.d.ts +86 -6
  159. package/dist/runtime.server.js +712 -76
  160. package/dist/server/early-signals.d.ts +14 -0
  161. package/dist/server/early-signals.js +34 -0
  162. package/dist/server/index.d.ts +10 -2
  163. package/dist/server/index.js +48 -1
  164. package/dist/server/rpc-batch.d.ts +17 -0
  165. package/dist/server/rpc-batch.js +129 -0
  166. package/dist/server/rpc-stream.d.ts +9 -0
  167. package/dist/server/rpc-stream.js +125 -0
  168. package/dist/server/rpc.d.ts +5 -1
  169. package/dist/server/rpc.js +37 -13
  170. package/dist/server/signal-query-observation.d.ts +3 -0
  171. package/dist/server/signal-query-observation.js +134 -0
  172. package/dist/server/streamed-region.d.ts +15 -0
  173. package/dist/server/streamed-region.js +30 -0
  174. package/dist/server/streamed-signals.d.ts +45 -0
  175. package/dist/server/streamed-signals.js +488 -0
  176. package/dist/server-call.d.ts +41 -0
  177. package/dist/server-call.js +75 -0
  178. package/dist/server-rpc-batch-client.d.ts +7 -0
  179. package/dist/server-rpc-batch-client.js +119 -0
  180. package/dist/server-rpc-client.d.ts +3 -1
  181. package/dist/server-rpc-client.js +99 -27
  182. package/dist/server-rpc-protocol.d.ts +47 -0
  183. package/dist/server-rpc-protocol.js +109 -0
  184. package/dist/server-rpc-stream-client.d.ts +5 -0
  185. package/dist/server-rpc-stream-client.js +98 -0
  186. package/dist/signals/actions.d.ts +12 -0
  187. package/dist/signals/actions.js +466 -0
  188. package/dist/signals/client.d.ts +2 -0
  189. package/dist/signals/client.js +1 -0
  190. package/dist/signals/computations.d.ts +37 -0
  191. package/dist/signals/computations.js +455 -0
  192. package/dist/signals/control-binding.d.ts +31 -0
  193. package/dist/signals/control-binding.js +353 -0
  194. package/dist/signals/derived-facade.d.ts +3 -0
  195. package/dist/signals/derived-facade.js +25 -0
  196. package/dist/signals/document-owner.d.ts +10 -0
  197. package/dist/signals/document-owner.js +43 -0
  198. package/dist/signals/early-values.d.ts +24 -0
  199. package/dist/signals/early-values.js +124 -0
  200. package/dist/signals/encoding.d.ts +1 -3
  201. package/dist/signals/encoding.js +3 -93
  202. package/dist/signals/engine.d.ts +53 -4
  203. package/dist/signals/engine.js +275 -16
  204. package/dist/signals/errors.d.ts +7 -0
  205. package/dist/signals/errors.js +16 -0
  206. package/dist/signals/facade.d.ts +74 -0
  207. package/dist/signals/facade.js +452 -0
  208. package/dist/signals/graph.d.ts +50 -5
  209. package/dist/signals/graph.js +170 -19
  210. package/dist/signals/handle-protocol.d.ts +4 -0
  211. package/dist/signals/handle-protocol.js +11 -0
  212. package/dist/signals/index.d.ts +12 -3
  213. package/dist/signals/index.js +71 -2
  214. package/dist/signals/native-read-client.d.ts +3 -0
  215. package/dist/signals/native-read-client.js +10 -0
  216. package/dist/signals/owner-context.d.ts +22 -0
  217. package/dist/signals/owner-context.js +77 -0
  218. package/dist/signals/query-attempt-observer.d.ts +49 -0
  219. package/dist/signals/query-attempt-observer.js +41 -0
  220. package/dist/signals/query-facade.d.ts +3 -0
  221. package/dist/signals/query-facade.js +49 -0
  222. package/dist/signals/read-protocol.d.ts +32 -3
  223. package/dist/signals/read-protocol.js +26 -0
  224. package/dist/signals/requests.d.ts +38 -5
  225. package/dist/signals/requests.js +298 -15
  226. package/dist/signals/scalar-computations.d.ts +2 -0
  227. package/dist/signals/scalar-computations.js +60 -0
  228. package/dist/signals/server.d.ts +2 -0
  229. package/dist/signals/server.js +1 -0
  230. package/dist/signals/transition-candidate.d.ts +71 -0
  231. package/dist/signals/transition-candidate.js +557 -0
  232. package/dist/signals/transition-state.d.ts +51 -0
  233. package/dist/signals/transition-state.js +70 -0
  234. package/dist/signals/types.d.ts +95 -5
  235. package/dist/signals/types.js +20 -0
  236. package/dist/stream-protocol.d.ts +0 -5
  237. package/dist/stream-protocol.js +3 -0
  238. package/dist/streamed-signals-protocol.d.ts +60 -0
  239. package/dist/streamed-signals-protocol.js +130 -0
  240. package/dist/style-values.d.ts +3 -0
  241. package/dist/style-values.js +96 -0
  242. package/dist/version.js +1 -1
  243. package/package.json +37 -1
@@ -18,13 +18,17 @@ var __copyProps = (to, from, except, desc) => {
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
19
  var graph_exports = {};
20
20
  __export(graph_exports, {
21
+ CandidateUnsupportedError: () => import_transition_state2.CandidateUnsupportedError,
21
22
  ScopedNode: () => ScopedNode,
22
23
  SignalObserver: () => SignalObserver,
23
24
  assertAlive: () => assertAlive,
24
25
  assertWritable: () => assertWritable,
26
+ attachObserver: () => attachObserver,
25
27
  derivedState: () => derivedState,
28
+ derivedValueState: () => derivedValueState,
26
29
  endSignalBatch: () => endSignalBatch,
27
30
  errorState: () => errorState,
31
+ idleState: () => idleState,
28
32
  inspectNativeNode: () => inspectNativeNode,
29
33
  invalidateNode: () => invalidateNode,
30
34
  isThenable: () => isThenable,
@@ -32,6 +36,7 @@ __export(graph_exports, {
32
36
  publishNode: () => publishNode,
33
37
  pure: () => pure,
34
38
  readNode: () => readNode,
39
+ readSignalBinding: () => readSignalBinding,
35
40
  readyState: () => readyState,
36
41
  refreshNode: () => refreshNode,
37
42
  releaseRetention: () => releaseRetention,
@@ -42,12 +47,17 @@ __export(graph_exports, {
42
47
  startSignalBatch: () => startSignalBatch,
43
48
  stopObserver: () => stopObserver,
44
49
  strictValue: () => strictValue,
45
- untrack: () => untrack
50
+ subscribeNode: () => subscribeNode,
51
+ untrack: () => untrack,
52
+ untrackCommitted: () => untrackCommitted
46
53
  });
47
54
  module.exports = __toCommonJS(graph_exports);
55
+ var import_transition_state = require("./transition-state.cjs");
48
56
  var import_system = require("alien-signals/system");
49
57
  var import_errors = require("./errors.cjs");
50
58
  var import_read_protocol = require("./read-protocol.cjs");
59
+ var import_types = require("./types.cjs");
60
+ var import_transition_state2 = require("./transition-state.cjs");
51
61
  const ReactiveFlags = {
52
62
  None: 0,
53
63
  Mutable: 1,
@@ -86,7 +96,15 @@ const graph = (0, import_system.createReactiveSystem)({
86
96
  node.flags |= ReactiveFlags.Dirty;
87
97
  }
88
98
  node.owner.trace("invalidate", node);
89
- if (node.kind === "async") queued.add(node);
99
+ if (node.invalidateAttempt) {
100
+ if (import_transition_state.deferCandidateInvalidation) {
101
+ const invalidate = node.invalidateAttempt;
102
+ queued.add(() => {
103
+ if (node.invalidateAttempt === invalidate) invalidate();
104
+ });
105
+ } else node.invalidateAttempt();
106
+ queued.add(node);
107
+ } else if (node.kind === "async") queued.add(node);
90
108
  } else {
91
109
  queued.add(node);
92
110
  }
@@ -127,6 +145,9 @@ function untrack(run) {
127
145
  (0, import_read_protocol.setNativeReadObserver)(previousObserver);
128
146
  }
129
147
  }
148
+ function untrackCommitted(run) {
149
+ return (0, import_transition_state.withoutSignalCandidate)(() => untrack(run));
150
+ }
130
151
  function startSignalBatch() {
131
152
  batchDepth++;
132
153
  }
@@ -204,6 +225,16 @@ function pendingState(waiting, connection = "none", requestKey, resolveWaiting)
204
225
  ...resolveWaiting ? { resolveWaiting } : {}
205
226
  };
206
227
  }
228
+ function idleState() {
229
+ return {
230
+ snapshot: {
231
+ status: "idle",
232
+ refreshing: false,
233
+ connection: "none",
234
+ complete: false
235
+ }
236
+ };
237
+ }
207
238
  function sameOwners(a, b) {
208
239
  if (a.owners === b.owners) return true;
209
240
  if ((a.owners?.size ?? 0) !== (b.owners?.size ?? 0)) return false;
@@ -303,6 +334,9 @@ class ScopedNode {
303
334
  owner;
304
335
  key;
305
336
  kind;
337
+ get [import_types.SIGNAL_HANDLE]() {
338
+ return true;
339
+ }
306
340
  deps;
307
341
  depsTail;
308
342
  subs;
@@ -311,6 +345,7 @@ class ScopedNode {
311
345
  revision = 0;
312
346
  state;
313
347
  compute;
348
+ invalidateAttempt;
314
349
  last;
315
350
  lastState;
316
351
  hasLast = false;
@@ -324,7 +359,24 @@ class ScopedNode {
324
359
  throw new TypeError("Only an async signal can be retried.");
325
360
  }
326
361
  get() {
327
- return strictValue(readNode(this));
362
+ return strictValue(readNode(this), this.key);
363
+ }
364
+ [import_types.SIGNAL_BINDING_READ]() {
365
+ return readSignalBinding(this);
366
+ }
367
+ [import_types.SIGNAL_BINDING_SUBSCRIBE](notify, onRetire) {
368
+ assertAlive(this.owner);
369
+ return attachObserver(
370
+ this,
371
+ onRetire === void 0 ? notify : (0, import_read_protocol.forwardNativeTransitionConsumer)(
372
+ notify,
373
+ () => this.owner.retired ? onRetire() : notify()
374
+ ),
375
+ true
376
+ );
377
+ }
378
+ [import_types.SIGNAL_BINDING_IDENTITY]() {
379
+ return { scope: "instance", nodeKey: this.key };
328
380
  }
329
381
  [import_read_protocol.NATIVE_DOM_VALUE]() {
330
382
  return this.get();
@@ -333,12 +385,23 @@ class ScopedNode {
333
385
  assertAlive(this.owner);
334
386
  assertWritable();
335
387
  if (this.kind !== "signal") throw new TypeError("Only a writable signal accepts set().");
388
+ const candidate = import_transition_state.activeCandidate ?? (0, import_read_protocol.getNativeCandidate)();
389
+ if (candidate) {
390
+ candidate.run(() => candidate.write(this, value));
391
+ return;
392
+ }
336
393
  signalBatch(() => {
337
- const previous = strictValue(refreshNode(this));
394
+ const previous = strictValue(refreshNode(this), this.key);
338
395
  const next = typeof value === "function" ? untrack(() => pure(() => value(previous))) : value;
339
- if (Object.is(previous, next)) return;
340
- publishNode(this, readyState(next));
341
- this.owner.trace("write", this);
396
+ const releases = import_transition_state.candidateWriteCount ? (0, import_transition_state.recordCandidateUrgentWrite)(this, value) : void 0;
397
+ try {
398
+ if (!Object.is(previous, next)) {
399
+ publishNode(this, readyState(next));
400
+ this.owner.trace("write", this);
401
+ }
402
+ } finally {
403
+ if (releases) for (const release of releases) release();
404
+ }
342
405
  });
343
406
  }
344
407
  latest(fallback) {
@@ -388,8 +451,21 @@ function inspectNativeNode(node, read) {
388
451
  dependencies
389
452
  };
390
453
  }
454
+ function createNativeSource(node, read) {
455
+ return {
456
+ getVersion: () => import_transition_state.activeCandidate && !import_transition_state.activeCandidate.observes(node) ? NaN : node.revision,
457
+ subscribe: (notify) => {
458
+ assertAlive(node.owner);
459
+ return attachObserver(node, notify, true);
460
+ },
461
+ serialize: (revision) => node.revision === revision ? node.owner.serializeRead(node, read) : void 0,
462
+ inspect: () => inspectNativeNode(node, read)
463
+ };
464
+ }
391
465
  function readNode(node, read = "value") {
392
466
  assertAlive(node.owner);
467
+ const candidate = import_transition_state.activeCandidate;
468
+ if (candidate) node = candidate.resolve(node);
393
469
  const historical = historicalReader?.(node, read);
394
470
  if (historical) return historical;
395
471
  if (!historicalReader && node.owner.seedable) {
@@ -401,27 +477,35 @@ function readNode(node, read = "value") {
401
477
  if (activeNode) graph.link(node, activeNode, trackingCycle);
402
478
  if ((0, import_read_protocol.getNativeReadObserver)()) {
403
479
  const field = read === "value" ? "nativeSource" : read === "latest" ? "nativeLatestSource" : "nativeSnapshotSource";
404
- const source = node[field] ??= {
405
- getVersion: () => node.revision,
406
- subscribe: (notify) => {
407
- assertAlive(node.owner);
408
- return attachObserver(node, notify, true);
409
- },
410
- serialize: (revision) => node.revision === revision ? node.owner.serializeRead(node, read) : void 0,
411
- inspect: () => inspectNativeNode(node, read)
412
- };
413
- (0, import_read_protocol.reportNativeRead)(source, node.revision);
480
+ const source = node[field] ??= createNativeSource(node, read);
481
+ (0, import_read_protocol.reportNativeRead)(
482
+ candidate ? candidate.nativeSource(node, read, source) : source,
483
+ node.revision
484
+ );
414
485
  }
415
486
  if (observed.owners) for (const owner of observed.owners) assertAlive(owner);
416
487
  if (activeNode) recordOwners(node, observed);
417
488
  return observed;
418
489
  }
419
- function strictValue(state) {
490
+ function strictValue(state, key = "idle") {
420
491
  const snapshot = state.snapshot;
421
492
  if (snapshot.status === "ready") return snapshot.value;
422
493
  if (snapshot.status === "error") throw snapshot.error;
494
+ if (snapshot.status === "idle") throw new import_errors.SignalIdleError(key);
423
495
  throw state.waiting;
424
496
  }
497
+ function readSignalBinding(handle$) {
498
+ const resolveAdoption = (0, import_read_protocol.getNativeAdoptionResolver)();
499
+ if ((historicalReader || resolveAdoption) && handle$ instanceof ScopedNode && handle$.owner.seedable && (historicalReader || resolveAdoption?.(handle$.owner))) {
500
+ return handle$.get();
501
+ }
502
+ const observer = (0, import_read_protocol.setNativeReadObserver)(null);
503
+ try {
504
+ return handle$.get();
505
+ } finally {
506
+ (0, import_read_protocol.setNativeReadObserver)(observer);
507
+ }
508
+ }
425
509
  function refreshNode(node) {
426
510
  assertAlive(node.owner);
427
511
  if (node.evaluating) throw new import_errors.SignalCycleError(node.key);
@@ -464,7 +548,7 @@ function evaluate(node) {
464
548
  let next;
465
549
  let owners;
466
550
  try {
467
- next = node.compute();
551
+ next = node.compute(node);
468
552
  } catch (error) {
469
553
  if (isThenable(error)) {
470
554
  const wakeup = node.wakeup ??= createWakeup();
@@ -533,9 +617,17 @@ function invalidateNode(node) {
533
617
  function derivedState(node, read) {
534
618
  const value = pure(read);
535
619
  if (isThenable(value)) throw new TypeError("derived$ requires a synchronous computation.");
620
+ return derivedValueState(node, value);
621
+ }
622
+ function derivedValueState(node, value, activity, additionalDependencies) {
536
623
  let refreshing = false;
537
624
  let complete = true;
538
625
  let connection = "none";
626
+ if (activity) {
627
+ refreshing = activity.refreshing;
628
+ complete = activity.complete;
629
+ connection = activity.connection;
630
+ }
539
631
  for (let link = node.deps; link && node.depsTail; link = link.nextDep) {
540
632
  const dependency = link.dep.state?.snapshot;
541
633
  if (dependency) {
@@ -548,6 +640,18 @@ function derivedState(node, read) {
548
640
  }
549
641
  if (link === node.depsTail) break;
550
642
  }
643
+ if (additionalDependencies) {
644
+ for (const node2 of additionalDependencies) {
645
+ const dependency = node2.state?.snapshot;
646
+ if (!dependency) continue;
647
+ refreshing ||= dependency.refreshing;
648
+ complete &&= dependency.complete;
649
+ if (dependency.connection === "open") connection = "open";
650
+ else if (connection !== "open" && dependency.connection === "connecting")
651
+ connection = "connecting";
652
+ else if (connection === "none" && dependency.connection === "closed") connection = "closed";
653
+ }
654
+ }
551
655
  return readyState(value, { refreshing, complete, connection });
552
656
  }
553
657
  class SignalObserver {
@@ -571,6 +675,10 @@ function attachObserver(node, notify, native, state) {
571
675
  node.owner.observers.add(observer);
572
676
  return () => stopObserver(observer);
573
677
  }
678
+ function subscribeNode(node, notify) {
679
+ const state = untrack(() => refreshNode(node));
680
+ return attachObserver(node, notify, true, state);
681
+ }
574
682
  function runObserver(observer) {
575
683
  const node = observer.node;
576
684
  if (!node || !observer.flags) return;
@@ -610,6 +718,7 @@ function retireGraph(owner, nodes) {
610
718
  node.state = errorState(retirementError);
611
719
  releaseRetention(node);
612
720
  node.compute = void 0;
721
+ node.invalidateAttempt = void 0;
613
722
  if (node.kind === "async") node.retry = ScopedNode.prototype.retry;
614
723
  if (node.subs) {
615
724
  graph.propagate(node.subs, executionDepth !== 0);
@@ -623,15 +732,46 @@ function retireGraph(owner, nodes) {
623
732
  retirementError = previousError;
624
733
  }
625
734
  }
735
+ (0, import_transition_state.registerCandidateGraph)({
736
+ ScopedNode,
737
+ graph,
738
+ flags: ReactiveFlags,
739
+ historical: () => historicalReader !== void 0,
740
+ link: (from, to) => {
741
+ graph.link(from, to, ++trackingCycle);
742
+ },
743
+ removeQueued: (node) => {
744
+ queued.delete(node);
745
+ },
746
+ assertAlive,
747
+ strictValue,
748
+ refreshNode,
749
+ pure,
750
+ untrack,
751
+ signalBatch,
752
+ publishNode,
753
+ readyState,
754
+ commitState,
755
+ sameState,
756
+ releaseRetainedOwners,
757
+ retainOwners,
758
+ releaseRetention,
759
+ createNativeSource,
760
+ attachObserver
761
+ });
626
762
  // Annotate the CommonJS export names for ESM import in node:
627
763
  0 && (module.exports = {
764
+ CandidateUnsupportedError,
628
765
  ScopedNode,
629
766
  SignalObserver,
630
767
  assertAlive,
631
768
  assertWritable,
769
+ attachObserver,
632
770
  derivedState,
771
+ derivedValueState,
633
772
  endSignalBatch,
634
773
  errorState,
774
+ idleState,
635
775
  inspectNativeNode,
636
776
  invalidateNode,
637
777
  isThenable,
@@ -639,6 +779,7 @@ function retireGraph(owner, nodes) {
639
779
  publishNode,
640
780
  pure,
641
781
  readNode,
782
+ readSignalBinding,
642
783
  readyState,
643
784
  refreshNode,
644
785
  releaseRetention,
@@ -649,5 +790,7 @@ function retireGraph(owner, nodes) {
649
790
  startSignalBatch,
650
791
  stopObserver,
651
792
  strictValue,
652
- untrack
793
+ subscribeNode,
794
+ untrack,
795
+ untrackCommitted
653
796
  });
@@ -0,0 +1,36 @@
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 handle_protocol_exports = {};
20
+ __export(handle_protocol_exports, {
21
+ isSignalHandle: () => isSignalHandle,
22
+ isWritableSignal: () => isWritableSignal
23
+ });
24
+ module.exports = __toCommonJS(handle_protocol_exports);
25
+ var import_types = require("./types.cjs");
26
+ function isSignalHandle(value) {
27
+ return (typeof value === "object" || typeof value === "function") && value !== null && value[import_types.SIGNAL_HANDLE] === true;
28
+ }
29
+ function isWritableSignal(value) {
30
+ return isSignalHandle(value) && value.kind === "signal" && typeof value.set === "function";
31
+ }
32
+ // Annotate the CommonJS export names for ESM import in node:
33
+ 0 && (module.exports = {
34
+ isSignalHandle,
35
+ isWritableSignal
36
+ });
@@ -18,25 +18,104 @@ var __copyProps = (to, from, except, desc) => {
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
19
  var signals_exports = {};
20
20
  __export(signals_exports, {
21
+ ActionUncertainError: () => import_actions.ActionUncertainError,
22
+ QUERY_REQUEST: () => import_types.QUERY_REQUEST,
23
+ SIGNAL_BINDING_IDENTITY: () => import_types.SIGNAL_BINDING_IDENTITY,
24
+ SIGNAL_BINDING_READ: () => import_types.SIGNAL_BINDING_READ,
25
+ SIGNAL_BINDING_SUBSCRIBE: () => import_types.SIGNAL_BINDING_SUBSCRIBE,
26
+ SIGNAL_HANDLE: () => import_types.SIGNAL_HANDLE,
21
27
  ScopeDisposedError: () => import_errors.ScopeDisposedError,
22
28
  SignalCycleError: () => import_errors.SignalCycleError,
23
29
  SignalFrameError: () => import_errors.SignalFrameError,
30
+ SignalIdleError: () => import_errors.SignalIdleError,
24
31
  SignalSerializationError: () => import_errors.SignalSerializationError,
32
+ SignalStreamError: () => import_errors.SignalStreamError,
25
33
  SignalWriteError: () => import_errors.SignalWriteError,
34
+ __derivedAt: () => import_derived_facade.__derivedAt,
35
+ __derivedScalarAt: () => import_facade.__derivedScalarAt,
36
+ __enableSignalDocument: () => import_document_owner.enableSignalDocument,
37
+ __queryAt: () => import_query_facade.__queryAt,
38
+ __signalAt: () => import_facade.__signalAt,
39
+ __startSignalReads: () => import_facade.__startSignalReads,
40
+ acceptStreamedSignalResult: () => import_facade.acceptStreamedSignalResult,
41
+ action$: () => import_actions.action$,
42
+ attachStreamedSignalResult: () => import_facade.attachStreamedSignalResult,
43
+ bindSignalControl: () => import_control_binding.bindSignalControl,
44
+ bindStreamedSignalSelection: () => import_facade.bindStreamedSignalSelection,
45
+ captureSignalOwner: () => import_owner_context.captureSignalOwner,
46
+ createResource: () => import_requests.createResource,
26
47
  createScope: () => import_engine.createScope,
27
- query: () => import_requests.query
48
+ currentSignalOwner: () => import_owner_context.currentSignalOwner,
49
+ derived$: () => import_derived_facade.derived$,
50
+ failStreamedSignalResult: () => import_facade.failStreamedSignalResult,
51
+ installSignalOwnerEnvironment: () => import_owner_context.installSignalOwnerEnvironment,
52
+ isActionUncertain: () => import_actions.isActionUncertain,
53
+ isSignalHandle: () => import_handle_protocol.isSignalHandle,
54
+ isWritableSignal: () => import_handle_protocol.isWritableSignal,
55
+ optimistic$: () => import_actions.optimistic$,
56
+ query: () => import_requests.query,
57
+ query$: () => import_query_facade.query$,
58
+ readSignalBinding: () => import_facade.readSignalBinding,
59
+ retireSignalOwnerIdentity: () => import_owner_context.retireSignalOwnerIdentity,
60
+ runWithSignalOwner: () => import_owner_context.runWithSignalOwner,
61
+ signal$: () => import_facade.signal$,
62
+ skip: () => import_types.skip
28
63
  });
29
64
  module.exports = __toCommonJS(signals_exports);
30
65
  var import_engine = require("./engine.cjs");
66
+ var import_control_binding = require("./control-binding.cjs");
67
+ var import_document_owner = require("./document-owner.cjs");
31
68
  var import_requests = require("./requests.cjs");
69
+ var import_actions = require("./actions.cjs");
70
+ var import_derived_facade = require("./derived-facade.cjs");
71
+ var import_query_facade = require("./query-facade.cjs");
72
+ var import_handle_protocol = require("./handle-protocol.cjs");
73
+ var import_facade = require("./facade.cjs");
74
+ var import_owner_context = require("./owner-context.cjs");
32
75
  var import_errors = require("./errors.cjs");
76
+ var import_types = require("./types.cjs");
33
77
  // Annotate the CommonJS export names for ESM import in node:
34
78
  0 && (module.exports = {
79
+ ActionUncertainError,
80
+ QUERY_REQUEST,
81
+ SIGNAL_BINDING_IDENTITY,
82
+ SIGNAL_BINDING_READ,
83
+ SIGNAL_BINDING_SUBSCRIBE,
84
+ SIGNAL_HANDLE,
35
85
  ScopeDisposedError,
36
86
  SignalCycleError,
37
87
  SignalFrameError,
88
+ SignalIdleError,
38
89
  SignalSerializationError,
90
+ SignalStreamError,
39
91
  SignalWriteError,
92
+ __derivedAt,
93
+ __derivedScalarAt,
94
+ __enableSignalDocument,
95
+ __queryAt,
96
+ __signalAt,
97
+ __startSignalReads,
98
+ acceptStreamedSignalResult,
99
+ action$,
100
+ attachStreamedSignalResult,
101
+ bindSignalControl,
102
+ bindStreamedSignalSelection,
103
+ captureSignalOwner,
104
+ createResource,
40
105
  createScope,
41
- query
106
+ currentSignalOwner,
107
+ derived$,
108
+ failStreamedSignalResult,
109
+ installSignalOwnerEnvironment,
110
+ isActionUncertain,
111
+ isSignalHandle,
112
+ isWritableSignal,
113
+ optimistic$,
114
+ query,
115
+ query$,
116
+ readSignalBinding,
117
+ retireSignalOwnerIdentity,
118
+ runWithSignalOwner,
119
+ signal$,
120
+ skip
42
121
  });
@@ -22,6 +22,7 @@ __export(native_read_client_exports, {
22
22
  });
23
23
  module.exports = __toCommonJS(native_read_client_exports);
24
24
  var import_native_read_collector = require("./native-read-collector.cjs");
25
+ var import_read_protocol = require("./read-protocol.cjs");
25
26
  var import_native_read_inspection = require("./native-read-inspection.cjs");
26
27
  function createNativeReadDriver(host) {
27
28
  const consumers = /* @__PURE__ */ new WeakMap();
@@ -57,6 +58,7 @@ function createNativeReadDriver(host) {
57
58
  function disposeConsumer(consumer) {
58
59
  if (consumer.disposed) return;
59
60
  consumer.disposed = true;
61
+ host.retire?.(consumer.block);
60
62
  if (consumer.committed !== null) release(consumer.committed);
61
63
  consumer.committed = null;
62
64
  for (const candidate of consumer.pending) release(candidate);
@@ -79,6 +81,14 @@ function createNativeReadDriver(host) {
79
81
  };
80
82
  consumers.set(scope, consumer);
81
83
  const owned = consumer;
84
+ if (host.prepare !== void 0) {
85
+ Object.assign(owned.notify, {
86
+ [import_read_protocol.NATIVE_TRANSITION_CONSUMER]: {
87
+ active: () => !owned.disposed && !owned.block.disposed,
88
+ prepare: () => host.prepare(owned.block)
89
+ }
90
+ });
91
+ }
82
92
  host.cleanup(scope, () => disposeConsumer(owned));
83
93
  }
84
94
  return consumer;
@@ -0,0 +1,112 @@
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 owner_context_exports = {};
20
+ __export(owner_context_exports, {
21
+ activeSignalOwnerEnvironment: () => installedEnvironment,
22
+ activeSynchronousSignalOwner: () => synchronousOwner,
23
+ captureSignalOwner: () => captureSignalOwner,
24
+ currentExplicitSignalOwner: () => currentExplicitSignalOwner,
25
+ currentSignalOwner: () => currentSignalOwner,
26
+ enterSynchronousSignalOwner: () => enterSynchronousSignalOwner,
27
+ installDefaultSignalOwner: () => installDefaultSignalOwner,
28
+ installSignalOwnerEnvironment: () => installSignalOwnerEnvironment,
29
+ installSignalOwnerRetirement: () => installSignalOwnerRetirement,
30
+ restoreSynchronousSignalOwner: () => restoreSynchronousSignalOwner,
31
+ retireSignalOwnerIdentity: () => retireSignalOwnerIdentity,
32
+ runWithSignalOwner: () => runWithSignalOwner
33
+ });
34
+ module.exports = __toCommonJS(owner_context_exports);
35
+ let installedEnvironment;
36
+ let synchronousOwner = null;
37
+ let defaultOwner;
38
+ let retireOwner;
39
+ function installSignalOwnerEnvironment(environment) {
40
+ if (!environment || typeof environment.current !== "function" || typeof environment.run !== "function" || typeof environment.capture !== "function") {
41
+ throw new TypeError("A signal owner environment requires current, run, and capture.");
42
+ }
43
+ const previous = installedEnvironment;
44
+ installedEnvironment = environment;
45
+ return () => {
46
+ if (installedEnvironment === environment) installedEnvironment = previous;
47
+ };
48
+ }
49
+ function currentSignalOwner() {
50
+ if (installedEnvironment !== void 0) return installedEnvironment.current() ?? synchronousOwner;
51
+ return synchronousOwner ?? defaultOwner?.() ?? null;
52
+ }
53
+ function currentExplicitSignalOwner() {
54
+ return installedEnvironment?.current() ?? synchronousOwner;
55
+ }
56
+ function installDefaultSignalOwner(current) {
57
+ if (typeof current !== "function")
58
+ throw new TypeError("A default signal owner requires a provider.");
59
+ const previous = defaultOwner;
60
+ defaultOwner = current;
61
+ return () => {
62
+ if (defaultOwner === current) defaultOwner = previous;
63
+ };
64
+ }
65
+ function runWithSignalOwner(owner, callback) {
66
+ if (typeof callback !== "function") throw new TypeError("A signal owner callback is required.");
67
+ if (installedEnvironment) return installedEnvironment.run(owner, callback);
68
+ const previous = synchronousOwner;
69
+ synchronousOwner = owner;
70
+ try {
71
+ return callback();
72
+ } finally {
73
+ synchronousOwner = previous;
74
+ }
75
+ }
76
+ function enterSynchronousSignalOwner(owner) {
77
+ if (installedEnvironment !== void 0) return void 0;
78
+ const previous = synchronousOwner;
79
+ synchronousOwner = owner;
80
+ return previous;
81
+ }
82
+ function restoreSynchronousSignalOwner(previous) {
83
+ synchronousOwner = previous;
84
+ }
85
+ function captureSignalOwner(owner) {
86
+ return installedEnvironment?.capture(owner) ?? ((callback) => runWithSignalOwner(owner, callback));
87
+ }
88
+ function retireSignalOwnerIdentity(owner) {
89
+ retireOwner?.(owner);
90
+ }
91
+ function installSignalOwnerRetirement(retire) {
92
+ const previous = retireOwner;
93
+ retireOwner = retire;
94
+ return () => {
95
+ if (retireOwner === retire) retireOwner = previous;
96
+ };
97
+ }
98
+ // Annotate the CommonJS export names for ESM import in node:
99
+ 0 && (module.exports = {
100
+ activeSignalOwnerEnvironment,
101
+ activeSynchronousSignalOwner,
102
+ captureSignalOwner,
103
+ currentExplicitSignalOwner,
104
+ currentSignalOwner,
105
+ enterSynchronousSignalOwner,
106
+ installDefaultSignalOwner,
107
+ installSignalOwnerEnvironment,
108
+ installSignalOwnerRetirement,
109
+ restoreSynchronousSignalOwner,
110
+ retireSignalOwnerIdentity,
111
+ runWithSignalOwner
112
+ });