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
@@ -0,0 +1,353 @@
1
+ import {
2
+ consumeHydrationControl,
3
+ initializeHydrationControlCapture,
4
+ snapshotHydrationControl
5
+ } from "../hydration/control-capture.js";
6
+ import {
7
+ hasHydrationControlSignalWriter,
8
+ registerHydrationControlSignalWriter
9
+ } from "./early-values.js";
10
+ import { isSignalHandle, isWritableSignal } from "./handle-protocol.js";
11
+ import { captureSignalOwner, currentSignalOwner } from "./owner-context.js";
12
+ import {
13
+ forwardNativeTransitionConsumer,
14
+ NATIVE_TRANSITION_CONSUMER
15
+ } from "./read-protocol.js";
16
+ import { SIGNAL_BINDING_READ, SIGNAL_BINDING_SUBSCRIBE } from "./types.js";
17
+ import { withoutSignalCandidate } from "./transition-state.js";
18
+ const CONTROL_BINDINGS = /* @__PURE__ */ new WeakMap();
19
+ const RADIO_WRITERS = /* @__PURE__ */ new WeakMap();
20
+ function controlString(value) {
21
+ return typeof value === "string" ? value : typeof value === "function" || typeof value === "symbol" ? "" : String(value);
22
+ }
23
+ function publishRadioInput(input) {
24
+ const root = input.getRootNode();
25
+ const group = input.form !== null ? input.form.elements : root.nodeType === 9 ? root.getElementsByName(input.name) : root.querySelectorAll('input[type="radio"]');
26
+ const edits = [];
27
+ for (let index = 0; index < group.length; index++) {
28
+ const other = group[index];
29
+ if (other.localName !== "input" || other.type !== "radio" || other.name !== input.name || other.form !== input.form || other.getRootNode() !== root)
30
+ continue;
31
+ const write = RADIO_WRITERS.get(other);
32
+ if (write) edits.push([write, other.checked]);
33
+ }
34
+ for (const [write, checked] of edits) if (!checked) write(false);
35
+ for (const [write, checked] of edits) if (checked) write(true);
36
+ }
37
+ function __createBindingControls() {
38
+ const owner = currentSignalOwner();
39
+ const run = owner === null ? (callback) => callback() : captureSignalOwner(owner);
40
+ return {
41
+ claim(element, channel, notify) {
42
+ const control = element;
43
+ if (control?.nodeType !== 1 || channel !== "value" && channel !== "checked" || !["input", "textarea", "select"].includes(control.localName) || channel === "checked" && (control.localName !== "input" || !["checkbox", "radio"].includes(control.type)) || channel === "value" && control.localName === "input" && control.type === "file")
44
+ throw new TypeError(
45
+ "A signal control requires a native value/checked property and a signal."
46
+ );
47
+ if (CONTROL_BINDINGS.get(control)?.has(channel) || hasHydrationControlSignalWriter(control, channel))
48
+ throw new Error(
49
+ "This control property already has a signal binding. Dispose it before rebinding."
50
+ );
51
+ let channels = CONTROL_BINDINGS.get(control);
52
+ if (!channels) CONTROL_BINDINGS.set(control, channels = /* @__PURE__ */ new Set());
53
+ channels.add(channel);
54
+ let disposed = false;
55
+ let initialized = false;
56
+ let composing = false;
57
+ let raw;
58
+ let handle;
59
+ let active;
60
+ let unsubscribe;
61
+ let stopWriter;
62
+ let generation = 0;
63
+ let revision = 0;
64
+ const read = (value) => run(() => value[SIGNAL_BINDING_READ]());
65
+ const write = (value) => {
66
+ if (disposed || !isWritableSignal(active)) return;
67
+ const writable = active;
68
+ withoutSignalCandidate(
69
+ () => run(() => {
70
+ const previous = read(writable);
71
+ if (Object.is(previous, value) || Array.isArray(previous) && Array.isArray(value) && previous.length === value.length && previous.every((item, index) => item === value[index]))
72
+ return;
73
+ writable.set(value);
74
+ })
75
+ );
76
+ };
77
+ const nativeValue = () => {
78
+ const snapshot = snapshotHydrationControl(control);
79
+ return channel === "checked" ? snapshot.checked : snapshot.selectedValues ?? snapshot.value;
80
+ };
81
+ const input = () => {
82
+ if (disposed) return;
83
+ if (channel === "checked" && control.type === "radio" && control.name !== "")
84
+ publishRadioInput(control);
85
+ else write(nativeValue());
86
+ };
87
+ const compositionStart = () => {
88
+ composing = true;
89
+ };
90
+ const compositionEnd = () => {
91
+ if (disposed) return;
92
+ composing = false;
93
+ input();
94
+ if (!disposed) notify();
95
+ };
96
+ const dispose = () => {
97
+ if (disposed) return;
98
+ disposed = true;
99
+ generation++;
100
+ raw = void 0;
101
+ active = handle = void 0;
102
+ if (channel === "checked") RADIO_WRITERS.delete(control);
103
+ let failed = false;
104
+ let failure;
105
+ const attempt = (stop2) => {
106
+ try {
107
+ stop2?.();
108
+ } catch (error) {
109
+ if (!failed) {
110
+ failed = true;
111
+ failure = error;
112
+ }
113
+ }
114
+ };
115
+ const stop = unsubscribe;
116
+ unsubscribe = void 0;
117
+ attempt(stop);
118
+ attempt(stopWriter);
119
+ stopWriter = void 0;
120
+ control.removeEventListener("input", input);
121
+ control.removeEventListener("compositionstart", compositionStart);
122
+ control.removeEventListener("compositionend", compositionEnd);
123
+ channels.delete(channel);
124
+ if (channels.size === 0) CONTROL_BINDINGS.delete(control);
125
+ if (failed) throw failure;
126
+ };
127
+ const prepare = (next, preview = false) => {
128
+ if (disposed) return { validate: () => false, discard() {
129
+ }, publish() {
130
+ }, commit() {
131
+ } };
132
+ if (isSignalHandle(next) && (typeof next[SIGNAL_BINDING_READ] !== "function" || typeof next[SIGNAL_BINDING_SUBSCRIBE] !== "function"))
133
+ throw new TypeError(
134
+ "A signal control requires a native value/checked property and a signal."
135
+ );
136
+ if (!preview && raw !== next) {
137
+ const ticket2 = ++generation;
138
+ const stop = unsubscribe;
139
+ unsubscribe = void 0;
140
+ handle = void 0;
141
+ stop?.();
142
+ if (disposed) return { validate: () => false, discard() {
143
+ }, publish() {
144
+ }, commit() {
145
+ } };
146
+ raw = next;
147
+ handle = isSignalHandle(next) ? next : void 0;
148
+ if (handle) {
149
+ const candidate2 = handle;
150
+ const stopNext = run(
151
+ () => candidate2[SIGNAL_BINDING_SUBSCRIBE](
152
+ forwardNativeTransitionConsumer(notify, () => {
153
+ if (!disposed && generation === ticket2) {
154
+ revision++;
155
+ notify();
156
+ }
157
+ }),
158
+ () => {
159
+ if (!disposed && generation === ticket2) dispose();
160
+ }
161
+ )
162
+ );
163
+ if (typeof stopNext !== "function")
164
+ throw new TypeError("A signal control subscription must return cleanup.");
165
+ if (disposed || generation !== ticket2) stopNext();
166
+ else unsubscribe = stopNext;
167
+ }
168
+ }
169
+ if (disposed) return { validate: () => false, discard() {
170
+ }, publish() {
171
+ }, commit() {
172
+ } };
173
+ const candidate = preview ? isSignalHandle(next) ? next : void 0 : handle;
174
+ const value = candidate ? read(candidate) : next;
175
+ if (disposed) return { validate: () => false, discard() {
176
+ }, publish() {
177
+ }, commit() {
178
+ } };
179
+ const multiple = control.localName === "select" && control.multiple;
180
+ if (candidate && (channel === "checked" ? typeof value !== "boolean" : multiple ? !Array.isArray(value) : typeof value !== "string"))
181
+ throw new TypeError(
182
+ channel === "checked" ? "A checked signal must contain a boolean." : multiple ? "A multiple select signal must contain an array." : "A value signal must contain a string."
183
+ );
184
+ let selected;
185
+ if (multiple && Array.isArray(value)) {
186
+ selected = /* @__PURE__ */ new Set();
187
+ for (const item of value) selected.add(candidate ? item : controlString(item));
188
+ }
189
+ const normalized = channel === "checked" ? !!value : value == null || multiple ? "" : controlString(value);
190
+ let ticket = generation;
191
+ const version = revision;
192
+ let accepted = !preview;
193
+ let retired = false;
194
+ let invalid = false;
195
+ let staged = preview && candidate && candidate !== handle ? run(
196
+ () => candidate[SIGNAL_BINDING_SUBSCRIBE](
197
+ forwardNativeTransitionConsumer(notify, () => {
198
+ if (retired || disposed) return;
199
+ if (!accepted) invalid = true;
200
+ else if (generation === ticket) {
201
+ revision++;
202
+ notify();
203
+ }
204
+ }),
205
+ () => {
206
+ if (!accepted) invalid = true;
207
+ else if (!disposed && generation === ticket) dispose();
208
+ }
209
+ )
210
+ ) : void 0;
211
+ const prepared = {
212
+ publish() {
213
+ if (retired || disposed || ticket !== generation) return;
214
+ if (!accepted) {
215
+ accepted = true;
216
+ if (raw !== next) {
217
+ const stop = unsubscribe;
218
+ ticket = ++generation;
219
+ raw = next;
220
+ handle = candidate;
221
+ unsubscribe = staged;
222
+ staged = void 0;
223
+ stop?.();
224
+ }
225
+ }
226
+ active = candidate;
227
+ if (isWritableSignal(active)) {
228
+ stopWriter ??= registerHydrationControlSignalWriter(
229
+ control,
230
+ channel,
231
+ channel === "checked" && control.type === "radio" ? input : write
232
+ );
233
+ if (channel === "checked" && control.type === "radio")
234
+ RADIO_WRITERS.set(control, write);
235
+ } else {
236
+ stopWriter?.();
237
+ stopWriter = void 0;
238
+ if (channel === "checked") RADIO_WRITERS.delete(control);
239
+ }
240
+ if (initialized) return;
241
+ initializeHydrationControlCapture(control.ownerDocument);
242
+ control.addEventListener("input", input);
243
+ control.addEventListener("compositionstart", compositionStart);
244
+ control.addEventListener("compositionend", compositionEnd);
245
+ initialized = true;
246
+ if (!isWritableSignal(active)) return;
247
+ let snapshot;
248
+ do {
249
+ snapshot = snapshotHydrationControl(control);
250
+ if (snapshot.editRevision > 0 && isWritableSignal(active)) write(nativeValue());
251
+ if (disposed) return;
252
+ } while (!consumeHydrationControl(control, snapshot.revision));
253
+ },
254
+ commit() {
255
+ if (retired || disposed || value == null || multiple && selected === void 0 || ticket !== generation || version !== revision || active !== candidate || composing || snapshotHydrationControl(control).composing)
256
+ return;
257
+ if (channel === "checked") {
258
+ if (control.checked !== normalized)
259
+ control.checked = normalized;
260
+ } else if (selected) {
261
+ for (const option of control.options) {
262
+ if (disposed) return;
263
+ const next2 = selected.has(option.value);
264
+ if (option.selected !== next2) option.selected = next2;
265
+ }
266
+ } else if (!candidate && control.localName === "input" && control.type === "number" ? (
267
+ // Preserve a user's "1.0" for sampled numeric 1, but show zero over an empty edit.
268
+ value === 0 && control.value === "" || control.value != value
269
+ ) : control.value !== normalized)
270
+ control.value = normalized;
271
+ }
272
+ };
273
+ return preview ? Object.assign(prepared, {
274
+ validate: () => !retired && !invalid && !disposed && ticket === generation && version === revision,
275
+ discard() {
276
+ if (accepted || retired) return;
277
+ retired = true;
278
+ staged?.();
279
+ staged = void 0;
280
+ }
281
+ }) : prepared;
282
+ };
283
+ return {
284
+ prepare,
285
+ preview: (value) => prepare(value, true),
286
+ prepareCurrent: () => prepare(raw),
287
+ dispose
288
+ };
289
+ }
290
+ };
291
+ }
292
+ function bindSignalControl(control, channel, handle$) {
293
+ if (!isSignalHandle(handle$))
294
+ throw new TypeError("A signal control requires a native value/checked property and a signal.");
295
+ let busy = false;
296
+ let dirty = false;
297
+ let disposed = false;
298
+ let lease;
299
+ const dispose = () => {
300
+ disposed = true;
301
+ lease.dispose();
302
+ };
303
+ const refresh = () => {
304
+ if (disposed) return;
305
+ dirty = true;
306
+ if (busy) return;
307
+ busy = true;
308
+ try {
309
+ while (dirty && !disposed) {
310
+ dirty = false;
311
+ const prepared = lease.prepare(handle$);
312
+ prepared.publish();
313
+ if (!dirty && !disposed) prepared.commit();
314
+ }
315
+ } catch (error) {
316
+ try {
317
+ dispose();
318
+ } catch {
319
+ }
320
+ throw error;
321
+ } finally {
322
+ busy = false;
323
+ }
324
+ };
325
+ refresh[NATIVE_TRANSITION_CONSUMER] = {
326
+ active: () => !disposed,
327
+ prepare: () => {
328
+ const prepared = lease.preview(handle$);
329
+ return {
330
+ validate: () => !disposed && !busy && prepared.validate(),
331
+ discard: prepared.discard,
332
+ commit() {
333
+ if (!disposed) {
334
+ busy = true;
335
+ try {
336
+ prepared.publish();
337
+ prepared.commit();
338
+ } finally {
339
+ busy = false;
340
+ }
341
+ }
342
+ }
343
+ };
344
+ }
345
+ };
346
+ lease = __createBindingControls().claim(control, channel, refresh);
347
+ refresh();
348
+ return dispose;
349
+ }
350
+ export {
351
+ __createBindingControls,
352
+ bindSignalControl
353
+ };
@@ -0,0 +1,3 @@
1
+ import type { DerivedCompute, DerivedOptions, DerivedSignal, SignalOptions } from './types.js';
2
+ export declare function __derivedAt<T>(site: string | undefined, compute: DerivedCompute<T>, options?: DerivedOptions & SignalOptions): DerivedSignal<T>;
3
+ export declare function derived$<T>(compute: DerivedCompute<T>, options?: DerivedOptions & SignalOptions): DerivedSignal<T>;
@@ -0,0 +1,25 @@
1
+ import { createDeclaredDerivedCell } from "./computations.js";
2
+ import { DerivedDescriptor, descriptorKey, signalOptionsKey } from "./facade.js";
3
+ import { runWithSignalOwner } from "./owner-context.js";
4
+ function __derivedAt(site, compute, options) {
5
+ if (typeof compute !== "function") throw new TypeError("derived$ requires a function.");
6
+ const explicit = signalOptionsKey(options);
7
+ site ??= explicit;
8
+ const key = descriptorKey(site, explicit);
9
+ return new DerivedDescriptor(
10
+ key,
11
+ "derived",
12
+ (owner) => {
13
+ const wrapped = compute.length ? (context) => runWithSignalOwner(owner, () => compute(context)) : () => runWithSignalOwner(owner, () => compute());
14
+ return createDeclaredDerivedCell(owner, key, wrapped, options);
15
+ },
16
+ site
17
+ );
18
+ }
19
+ function derived$(compute, options) {
20
+ return __derivedAt(void 0, compute, options);
21
+ }
22
+ export {
23
+ __derivedAt,
24
+ derived$
25
+ };
@@ -0,0 +1,10 @@
1
+ import type { SignalOwner, SignalOwnerIdentity } from './types.js';
2
+ /** @internal Actual document capability, shared with an optional renderer. */
3
+ export declare let signalDocumentEnabled: boolean;
4
+ export declare let streamedSignalOwnerActivator: ((owner: SignalOwner) => void) | undefined;
5
+ /** @internal Shared document identity for state-only and component consumers. */
6
+ export declare function documentSignalOwner(container: Node): SignalOwnerIdentity;
7
+ /** @internal Compiler capability for global signals without a rendering engine. */
8
+ export declare function enableSignalDocument(abi?: number): void;
9
+ /** @internal Instance activation is optional; global results need no component root. */
10
+ export declare function installStreamedSignalOwnerActivator(activate: (owner: SignalOwner) => void): () => void;
@@ -0,0 +1,43 @@
1
+ import { formatClientError } from "../error-codes.client.generated.js";
2
+ import { registerSignalOwnerDocument } from "./early-values.js";
3
+ import { installDefaultSignalOwner } from "./owner-context.js";
4
+ const documentOwners = /* @__PURE__ */ new WeakMap();
5
+ let defaultInstalled = false;
6
+ let signalDocumentEnabled = false;
7
+ let streamedSignalOwnerActivator;
8
+ function documentSignalOwner(container) {
9
+ const ownerDocument = container.nodeType === 9 ? container : container.ownerDocument;
10
+ if (ownerDocument === null) throw new TypeError("A signal document owner requires a document.");
11
+ let owner = documentOwners.get(ownerDocument);
12
+ if (owner === void 0) {
13
+ owner = Object.freeze({ scopeKey: "octane:document" });
14
+ documentOwners.set(ownerDocument, owner);
15
+ }
16
+ registerSignalOwnerDocument(owner, ownerDocument);
17
+ return owner;
18
+ }
19
+ function enableSignalDocument(abi = 1) {
20
+ if (abi !== 1) throw new TypeError(formatClientError(74));
21
+ signalDocumentEnabled = true;
22
+ if (defaultInstalled) return;
23
+ defaultInstalled = true;
24
+ installDefaultSignalOwner(
25
+ () => typeof document === "undefined" ? null : documentSignalOwner(document)
26
+ );
27
+ }
28
+ function installStreamedSignalOwnerActivator(activate) {
29
+ if (streamedSignalOwnerActivator !== void 0) {
30
+ throw new Error("A streamed signal hydration owner is already installed.");
31
+ }
32
+ streamedSignalOwnerActivator = activate;
33
+ return () => {
34
+ if (streamedSignalOwnerActivator === activate) streamedSignalOwnerActivator = void 0;
35
+ };
36
+ }
37
+ export {
38
+ documentSignalOwner,
39
+ enableSignalDocument,
40
+ installStreamedSignalOwnerActivator,
41
+ signalDocumentEnabled,
42
+ streamedSignalOwnerActivator
43
+ };
@@ -0,0 +1,24 @@
1
+ import type { SignalBindingIdentity, SignalOwner } from './types.js';
2
+ type ControlChannel = 'value' | 'checked';
3
+ type EarlyValue = {
4
+ revision: number;
5
+ value: unknown;
6
+ };
7
+ type ControlWriter = (value: unknown) => void;
8
+ /** @internal Associate an engine-free signal owner with its browser document. */
9
+ export declare function registerSignalOwnerDocument(owner: SignalOwner, ownerDocument: Document): void;
10
+ /** @internal Read the last pre-activation edit before creating a writable cell. */
11
+ export declare function readEarlySignalValue(owner: SignalOwner, binding: SignalBindingIdentity): EarlyValue | undefined;
12
+ /** @internal Publish a native edit into both the pre-module buffer and any live binding. */
13
+ export declare function publishHydrationControlSignalValues(control: Element, revision: number): void;
14
+ /** @internal Let candidate application update the already-live writable cell directly. */
15
+ export declare function registerHydrationControlSignalWriter(control: Element, channel: ControlChannel, write: ControlWriter): () => void;
16
+ /** @internal A writable binding already provides this control's native input handler. */
17
+ export declare function hasHydrationControlSignalWriter(control: Element, channel: ControlChannel): boolean;
18
+ /** @internal Carry edit authority across module handoff, even after editing back to SSR. */
19
+ export declare function readEarlyHydrationControlRevision(control: Element): number;
20
+ /** @internal Retire the imported revision only after exact control-state adoption. */
21
+ export declare function clearEarlyHydrationControlRevision(control: Element): void;
22
+ /** @internal Module capture replaces the inline writer for this document. */
23
+ export declare function claimEarlyHydrationControlCapture(ownerDocument: Document): void;
24
+ export {};
@@ -0,0 +1,124 @@
1
+ import { SIGNAL_CONTROL_ATTR } from "../hydration-markers.js";
2
+ const OWNER_DOCUMENTS = /* @__PURE__ */ new WeakMap();
3
+ const DOCUMENT_VALUES = /* @__PURE__ */ new WeakMap();
4
+ const CONTROL_WRITERS = /* @__PURE__ */ new WeakMap();
5
+ const EARLY_CONTROL_REVISIONS = /* @__PURE__ */ new WeakMap();
6
+ const CLAIMED_CONTROL_DOCUMENTS = /* @__PURE__ */ new WeakSet();
7
+ function rendererOwner(owner) {
8
+ return typeof owner === "object" && owner !== null && "documentOwner" in owner;
9
+ }
10
+ function ownerObject(owner) {
11
+ return rendererOwner(owner) ? owner.instanceOwner : owner;
12
+ }
13
+ function valueKey(ownerKey, instanceKey, nodeKey) {
14
+ return JSON.stringify([ownerKey, instanceKey, nodeKey]);
15
+ }
16
+ function registerSignalOwnerDocument(owner, ownerDocument) {
17
+ OWNER_DOCUMENTS.set(ownerObject(owner), ownerDocument);
18
+ if (rendererOwner(owner)) OWNER_DOCUMENTS.set(owner.documentOwner, ownerDocument);
19
+ }
20
+ function documentForOwner(owner) {
21
+ return OWNER_DOCUMENTS.get(ownerObject(owner));
22
+ }
23
+ function bindingKey(owner, binding) {
24
+ const ownerKey = rendererOwner(owner) ? owner.documentOwner.scopeKey : owner.scopeKey;
25
+ const instanceKey = binding.scope === "instance" && rendererOwner(owner) ? owner.instanceKey : "";
26
+ return valueKey(ownerKey, instanceKey, binding.nodeKey);
27
+ }
28
+ function readEarlySignalValue(owner, binding) {
29
+ const ownerDocument = documentForOwner(owner);
30
+ return ownerDocument === void 0 ? void 0 : DOCUMENT_VALUES.get(ownerDocument)?.get(bindingKey(owner, binding));
31
+ }
32
+ function parseControlBindings(control) {
33
+ const raw = control.getAttribute(SIGNAL_CONTROL_ATTR);
34
+ if (raw === null) return null;
35
+ try {
36
+ const parsed = JSON.parse(raw);
37
+ if (!Array.isArray(parsed) || parsed.length !== 3 || parsed[0] !== 1) return null;
38
+ if (typeof parsed[1] !== "string" || !Array.isArray(parsed[2])) return null;
39
+ const bindings = [];
40
+ for (const entry of parsed[2]) {
41
+ if (!Array.isArray(entry) || entry.length !== 3 || typeof entry[0] !== "string" || typeof entry[1] !== "string" || entry[2] !== "value" && entry[2] !== "checked") {
42
+ return null;
43
+ }
44
+ bindings.push(entry);
45
+ }
46
+ return { ownerKey: parsed[1], bindings };
47
+ } catch {
48
+ return null;
49
+ }
50
+ }
51
+ function controlValue(control, channel) {
52
+ if (channel === "checked") return control.checked;
53
+ if (control.localName === "select" && control.multiple) {
54
+ return Array.from(control.selectedOptions, (option) => option.value);
55
+ }
56
+ return control.value;
57
+ }
58
+ function publishHydrationControlSignalValues(control, revision) {
59
+ const metadata = parseControlBindings(control);
60
+ if (metadata !== null) {
61
+ let values = DOCUMENT_VALUES.get(control.ownerDocument);
62
+ if (values === void 0) DOCUMENT_VALUES.set(control.ownerDocument, values = /* @__PURE__ */ new Map());
63
+ for (const [instanceKey, nodeKey, channel] of metadata.bindings) {
64
+ const key = valueKey(metadata.ownerKey, instanceKey, nodeKey);
65
+ const previous = values.get(key);
66
+ if (CLAIMED_CONTROL_DOCUMENTS.has(control.ownerDocument) || previous === void 0 || revision >= previous.revision) {
67
+ values.set(key, { revision, value: controlValue(control, channel) });
68
+ }
69
+ }
70
+ }
71
+ const writers = CONTROL_WRITERS.get(control);
72
+ if (writers !== void 0) {
73
+ for (const [channel, write] of writers) write(controlValue(control, channel));
74
+ }
75
+ }
76
+ function registerHydrationControlSignalWriter(control, channel, write) {
77
+ let writers = CONTROL_WRITERS.get(control);
78
+ if (writers === void 0) CONTROL_WRITERS.set(control, writers = /* @__PURE__ */ new Map());
79
+ writers.set(channel, write);
80
+ return () => {
81
+ if (writers.get(channel) !== write) return;
82
+ writers.delete(channel);
83
+ if (writers.size === 0) CONTROL_WRITERS.delete(control);
84
+ };
85
+ }
86
+ function hasHydrationControlSignalWriter(control, channel) {
87
+ return CONTROL_WRITERS.get(control)?.has(channel) ?? false;
88
+ }
89
+ function readEarlyHydrationControlRevision(control) {
90
+ return EARLY_CONTROL_REVISIONS.get(control) ?? 0;
91
+ }
92
+ function clearEarlyHydrationControlRevision(control) {
93
+ EARLY_CONTROL_REVISIONS.delete(control);
94
+ }
95
+ function claimEarlyHydrationControlCapture(ownerDocument) {
96
+ CLAIMED_CONTROL_DOCUMENTS.add(ownerDocument);
97
+ }
98
+ function publishEarlyHydrationControlSignalValues(control, revision) {
99
+ if (CLAIMED_CONTROL_DOCUMENTS.has(control.ownerDocument)) return;
100
+ EARLY_CONTROL_REVISIONS.set(control, revision);
101
+ publishHydrationControlSignalValues(control, revision);
102
+ }
103
+ if (typeof globalThis !== "undefined") {
104
+ const host = globalThis;
105
+ host.__octanePublishSignalControl = publishEarlyHydrationControlSignalValues;
106
+ const mailbox = host.__octaneEarlySignalControls;
107
+ if (mailbox !== void 0) {
108
+ mailbox.p = publishEarlyHydrationControlSignalValues;
109
+ const queued = mailbox.q.splice(0);
110
+ for (const [control, revision] of queued) {
111
+ publishEarlyHydrationControlSignalValues(control, revision);
112
+ }
113
+ }
114
+ }
115
+ export {
116
+ claimEarlyHydrationControlCapture,
117
+ clearEarlyHydrationControlRevision,
118
+ hasHydrationControlSignalWriter,
119
+ publishHydrationControlSignalValues,
120
+ readEarlyHydrationControlRevision,
121
+ readEarlySignalValue,
122
+ registerHydrationControlSignalWriter,
123
+ registerSignalOwnerDocument
124
+ };
@@ -1,3 +1 @@
1
- import type { EncodedSignalValue } from './types.js';
2
- export declare function encodeSignalValue(value: unknown, ancestors?: Set<object>): EncodedSignalValue;
3
- export declare function decodeSignalValue(encoded: EncodedSignalValue): unknown;
1
+ export { decodeSignalValue, encodeSignalValue, snapshotSignalValue } from '../data-encoding.js';