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
@@ -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,18 +359,49 @@ 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 };
380
+ }
381
+ [import_read_protocol.NATIVE_DOM_VALUE]() {
382
+ return this.get();
328
383
  }
329
384
  set(value) {
330
385
  assertAlive(this.owner);
331
386
  assertWritable();
332
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
+ }
333
393
  signalBatch(() => {
334
- const previous = strictValue(refreshNode(this));
394
+ const previous = strictValue(refreshNode(this), this.key);
335
395
  const next = typeof value === "function" ? untrack(() => pure(() => value(previous))) : value;
336
- if (Object.is(previous, next)) return;
337
- publishNode(this, readyState(next));
338
- 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
+ }
339
405
  });
340
406
  }
341
407
  latest(fallback) {
@@ -385,8 +451,21 @@ function inspectNativeNode(node, read) {
385
451
  dependencies
386
452
  };
387
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
+ }
388
465
  function readNode(node, read = "value") {
389
466
  assertAlive(node.owner);
467
+ const candidate = import_transition_state.activeCandidate;
468
+ if (candidate) node = candidate.resolve(node);
390
469
  const historical = historicalReader?.(node, read);
391
470
  if (historical) return historical;
392
471
  if (!historicalReader && node.owner.seedable) {
@@ -398,27 +477,35 @@ function readNode(node, read = "value") {
398
477
  if (activeNode) graph.link(node, activeNode, trackingCycle);
399
478
  if ((0, import_read_protocol.getNativeReadObserver)()) {
400
479
  const field = read === "value" ? "nativeSource" : read === "latest" ? "nativeLatestSource" : "nativeSnapshotSource";
401
- const source = node[field] ??= {
402
- getVersion: () => node.revision,
403
- subscribe: (notify) => {
404
- assertAlive(node.owner);
405
- return attachObserver(node, notify, true);
406
- },
407
- serialize: (revision) => node.revision === revision ? node.owner.serializeRead(node, read) : void 0,
408
- inspect: () => inspectNativeNode(node, read)
409
- };
410
- (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
+ );
411
485
  }
412
486
  if (observed.owners) for (const owner of observed.owners) assertAlive(owner);
413
487
  if (activeNode) recordOwners(node, observed);
414
488
  return observed;
415
489
  }
416
- function strictValue(state) {
490
+ function strictValue(state, key = "idle") {
417
491
  const snapshot = state.snapshot;
418
492
  if (snapshot.status === "ready") return snapshot.value;
419
493
  if (snapshot.status === "error") throw snapshot.error;
494
+ if (snapshot.status === "idle") throw new import_errors.SignalIdleError(key);
420
495
  throw state.waiting;
421
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
+ }
422
509
  function refreshNode(node) {
423
510
  assertAlive(node.owner);
424
511
  if (node.evaluating) throw new import_errors.SignalCycleError(node.key);
@@ -461,7 +548,7 @@ function evaluate(node) {
461
548
  let next;
462
549
  let owners;
463
550
  try {
464
- next = node.compute();
551
+ next = node.compute(node);
465
552
  } catch (error) {
466
553
  if (isThenable(error)) {
467
554
  const wakeup = node.wakeup ??= createWakeup();
@@ -530,9 +617,17 @@ function invalidateNode(node) {
530
617
  function derivedState(node, read) {
531
618
  const value = pure(read);
532
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) {
533
623
  let refreshing = false;
534
624
  let complete = true;
535
625
  let connection = "none";
626
+ if (activity) {
627
+ refreshing = activity.refreshing;
628
+ complete = activity.complete;
629
+ connection = activity.connection;
630
+ }
536
631
  for (let link = node.deps; link && node.depsTail; link = link.nextDep) {
537
632
  const dependency = link.dep.state?.snapshot;
538
633
  if (dependency) {
@@ -545,6 +640,18 @@ function derivedState(node, read) {
545
640
  }
546
641
  if (link === node.depsTail) break;
547
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
+ }
548
655
  return readyState(value, { refreshing, complete, connection });
549
656
  }
550
657
  class SignalObserver {
@@ -568,6 +675,10 @@ function attachObserver(node, notify, native, state) {
568
675
  node.owner.observers.add(observer);
569
676
  return () => stopObserver(observer);
570
677
  }
678
+ function subscribeNode(node, notify) {
679
+ const state = untrack(() => refreshNode(node));
680
+ return attachObserver(node, notify, true, state);
681
+ }
571
682
  function runObserver(observer) {
572
683
  const node = observer.node;
573
684
  if (!node || !observer.flags) return;
@@ -607,6 +718,7 @@ function retireGraph(owner, nodes) {
607
718
  node.state = errorState(retirementError);
608
719
  releaseRetention(node);
609
720
  node.compute = void 0;
721
+ node.invalidateAttempt = void 0;
610
722
  if (node.kind === "async") node.retry = ScopedNode.prototype.retry;
611
723
  if (node.subs) {
612
724
  graph.propagate(node.subs, executionDepth !== 0);
@@ -620,15 +732,46 @@ function retireGraph(owner, nodes) {
620
732
  retirementError = previousError;
621
733
  }
622
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
+ });
623
762
  // Annotate the CommonJS export names for ESM import in node:
624
763
  0 && (module.exports = {
764
+ CandidateUnsupportedError,
625
765
  ScopedNode,
626
766
  SignalObserver,
627
767
  assertAlive,
628
768
  assertWritable,
769
+ attachObserver,
629
770
  derivedState,
771
+ derivedValueState,
630
772
  endSignalBatch,
631
773
  errorState,
774
+ idleState,
632
775
  inspectNativeNode,
633
776
  invalidateNode,
634
777
  isThenable,
@@ -636,6 +779,7 @@ function retireGraph(owner, nodes) {
636
779
  publishNode,
637
780
  pure,
638
781
  readNode,
782
+ readSignalBinding,
639
783
  readyState,
640
784
  refreshNode,
641
785
  releaseRetention,
@@ -646,5 +790,7 @@ function retireGraph(owner, nodes) {
646
790
  startSignalBatch,
647
791
  stopObserver,
648
792
  strictValue,
649
- untrack
793
+ subscribeNode,
794
+ untrack,
795
+ untrackCommitted
650
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
+ });