fibrae 0.3.0 → 0.3.2

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 (97) hide show
  1. package/dist/atom-utils.d.ts +52 -0
  2. package/dist/atom-utils.js +64 -0
  3. package/dist/atom-utils.js.map +1 -0
  4. package/dist/cli/build.js +2 -2
  5. package/dist/cli/build.js.map +1 -1
  6. package/dist/cli/html.d.ts +6 -0
  7. package/dist/cli/html.js +20 -26
  8. package/dist/cli/html.js.map +1 -1
  9. package/dist/cli/vite-plugin.js +41 -2
  10. package/dist/cli/vite-plugin.js.map +1 -1
  11. package/dist/components.d.ts +3 -3
  12. package/dist/components.js +3 -1
  13. package/dist/components.js.map +1 -1
  14. package/dist/core.js +37 -10
  15. package/dist/core.js.map +1 -1
  16. package/dist/dom.d.ts +22 -3
  17. package/dist/dom.js +100 -5
  18. package/dist/dom.js.map +1 -1
  19. package/dist/fiber-commit.d.ts +2 -0
  20. package/dist/fiber-commit.js +179 -40
  21. package/dist/fiber-commit.js.map +1 -1
  22. package/dist/fiber-render.js +13 -27
  23. package/dist/fiber-render.js.map +1 -1
  24. package/dist/fiber-update.d.ts +1 -1
  25. package/dist/fiber-update.js +33 -12
  26. package/dist/fiber-update.js.map +1 -1
  27. package/dist/h.d.ts +65 -10
  28. package/dist/h.js +98 -22
  29. package/dist/h.js.map +1 -1
  30. package/dist/head.d.ts +64 -0
  31. package/dist/head.js +257 -0
  32. package/dist/head.js.map +1 -0
  33. package/dist/hydration-dev.d.ts +24 -0
  34. package/dist/hydration-dev.js +138 -0
  35. package/dist/hydration-dev.js.map +1 -0
  36. package/dist/index.d.ts +6 -2
  37. package/dist/index.js +5 -2
  38. package/dist/index.js.map +1 -1
  39. package/dist/jsx-runtime/index.d.ts +288 -8
  40. package/dist/jsx-runtime/index.js +2 -0
  41. package/dist/jsx-runtime/index.js.map +1 -1
  42. package/dist/live/client.js +4 -4
  43. package/dist/live/client.js.map +1 -1
  44. package/dist/live/server.js.map +1 -1
  45. package/dist/live/sse-stream.js +2 -2
  46. package/dist/live/sse-stream.js.map +1 -1
  47. package/dist/mdx/index.d.ts +125 -0
  48. package/dist/mdx/index.js +137 -0
  49. package/dist/mdx/index.js.map +1 -0
  50. package/dist/mdx/parse.d.ts +42 -0
  51. package/dist/mdx/parse.js +147 -0
  52. package/dist/mdx/parse.js.map +1 -0
  53. package/dist/mdx/render.d.ts +24 -0
  54. package/dist/mdx/render.js +261 -0
  55. package/dist/mdx/render.js.map +1 -0
  56. package/dist/router/Form.d.ts +90 -0
  57. package/dist/router/Form.js +166 -0
  58. package/dist/router/Form.js.map +1 -0
  59. package/dist/router/History.d.ts +2 -2
  60. package/dist/router/History.js.map +1 -1
  61. package/dist/router/Link.d.ts +27 -32
  62. package/dist/router/Link.js +56 -98
  63. package/dist/router/Link.js.map +1 -1
  64. package/dist/router/Navigator.d.ts +49 -44
  65. package/dist/router/Navigator.js +57 -104
  66. package/dist/router/Navigator.js.map +1 -1
  67. package/dist/router/Route.d.ts +8 -4
  68. package/dist/router/Route.js +10 -2
  69. package/dist/router/Route.js.map +1 -1
  70. package/dist/router/Router.d.ts +10 -10
  71. package/dist/router/Router.js +38 -23
  72. package/dist/router/Router.js.map +1 -1
  73. package/dist/router/RouterBuilder.d.ts +69 -6
  74. package/dist/router/RouterBuilder.js +23 -0
  75. package/dist/router/RouterBuilder.js.map +1 -1
  76. package/dist/router/RouterOutlet.js +63 -45
  77. package/dist/router/RouterOutlet.js.map +1 -1
  78. package/dist/router/index.d.ts +10 -3
  79. package/dist/router/index.js +5 -2
  80. package/dist/router/index.js.map +1 -1
  81. package/dist/router/register.d.ts +37 -0
  82. package/dist/router/register.js +18 -0
  83. package/dist/router/register.js.map +1 -0
  84. package/dist/router/utils.d.ts +2 -2
  85. package/dist/runtime.d.ts +1 -1
  86. package/dist/server.js +7 -3
  87. package/dist/server.js.map +1 -1
  88. package/dist/shared.d.ts +36 -6
  89. package/dist/shared.js +12 -2
  90. package/dist/shared.js.map +1 -1
  91. package/dist/tracking.d.ts +3 -2
  92. package/dist/tracking.js +4 -1
  93. package/dist/tracking.js.map +1 -1
  94. package/dist/transition.d.ts +51 -0
  95. package/dist/transition.js +46 -0
  96. package/dist/transition.js.map +1 -0
  97. package/package.json +16 -3
package/dist/dom.js CHANGED
@@ -51,6 +51,34 @@ export const isProperty = (key) => key !== "children" &&
51
51
  key !== "key" &&
52
52
  key !== "dangerouslySetInnerHTML" &&
53
53
  !isEvent(key);
54
+ /**
55
+ * Check whether an event prop name is camelCase (e.g. "onClick" vs "onclick").
56
+ * Any uppercase letter after "on" signals camelCase.
57
+ */
58
+ const isCamelCaseEvent = (key) => /^on[A-Z]/.test(key);
59
+ /**
60
+ * Deduplicate event props that map to the same DOM event type.
61
+ *
62
+ * Both `onclick` and `onClick` lower-case to event type `click`. If both
63
+ * are present, the camelCase variant wins (more idiomatic in JSX).
64
+ * Returns an array of [propName, handler] pairs with at most one entry per
65
+ * event type.
66
+ */
67
+ export const normalizeEventProps = (props) => {
68
+ // eventType -> [propName, handler] — camelCase entries overwrite lowercase
69
+ const byType = new Map();
70
+ for (const key of Object.keys(props)) {
71
+ if (!isEvent(key) || typeof props[key] !== "function")
72
+ continue;
73
+ const eventType = key.toLowerCase().substring(2);
74
+ const existing = byType.get(eventType);
75
+ // If no existing entry, or new entry is camelCase (preferred), set it
76
+ if (!existing || isCamelCaseEvent(key)) {
77
+ byType.set(eventType, [key, props[key]]);
78
+ }
79
+ }
80
+ return Array.from(byType.values());
81
+ };
54
82
  const unitlessProperties = new Set([
55
83
  "animationIterationCount",
56
84
  "boxFlex",
@@ -78,7 +106,76 @@ const unitlessProperties = new Set([
78
106
  "zoom",
79
107
  ]);
80
108
  /**
81
- * Set a DOM property using the appropriate method
109
+ * SVG namespace URI for createElementNS
110
+ */
111
+ export const SVG_NAMESPACE = "http://www.w3.org/2000/svg";
112
+ /**
113
+ * Tags that must be created with SVG namespace.
114
+ * Derived from SVGElementTagNameMap minus tags that overlap with HTMLElementTagNameMap.
115
+ */
116
+ export const SVG_TAGS = new Set([
117
+ "svg",
118
+ "animate",
119
+ "animateMotion",
120
+ "animateTransform",
121
+ "circle",
122
+ "clipPath",
123
+ "defs",
124
+ "desc",
125
+ "ellipse",
126
+ "feBlend",
127
+ "feColorMatrix",
128
+ "feComponentTransfer",
129
+ "feComposite",
130
+ "feConvolveMatrix",
131
+ "feDiffuseLighting",
132
+ "feDisplacementMap",
133
+ "feDistantLight",
134
+ "feDropShadow",
135
+ "feFlood",
136
+ "feFuncA",
137
+ "feFuncB",
138
+ "feFuncG",
139
+ "feFuncR",
140
+ "feGaussianBlur",
141
+ "feImage",
142
+ "feMerge",
143
+ "feMergeNode",
144
+ "feMorphology",
145
+ "feOffset",
146
+ "fePointLight",
147
+ "feSpecularLighting",
148
+ "feSpotLight",
149
+ "feTile",
150
+ "feTurbulence",
151
+ "filter",
152
+ "foreignObject",
153
+ "g",
154
+ "image",
155
+ "line",
156
+ "linearGradient",
157
+ "marker",
158
+ "mask",
159
+ "metadata",
160
+ "mpath",
161
+ "path",
162
+ "pattern",
163
+ "polygon",
164
+ "polyline",
165
+ "radialGradient",
166
+ "rect",
167
+ "set",
168
+ "stop",
169
+ "symbol",
170
+ "text",
171
+ "textPath",
172
+ "tspan",
173
+ "use",
174
+ "view",
175
+ ]);
176
+ /**
177
+ * Set a DOM property using the appropriate method.
178
+ * Works for both HTML and SVG elements.
82
179
  */
83
180
  export const setDomProperty = (el, name, value) => {
84
181
  if (name === "style") {
@@ -173,14 +270,12 @@ export const createEventWrapper = (handler, eventType, runtime, onError) => (eve
173
270
  export const attachEventListeners = (el, props, runtime, onError, listenerStore) => {
174
271
  const store = listenerStore;
175
272
  const stored = store?.get(el) ?? {};
176
- Object.entries(props)
177
- .filter(([key, handler]) => isEvent(key) && typeof handler === "function")
178
- .forEach(([key, handler]) => {
273
+ for (const [key, handler] of normalizeEventProps(props)) {
179
274
  const eventType = key.toLowerCase().substring(2);
180
275
  const wrapper = createEventWrapper(handler, eventType, runtime, onError);
181
276
  el.addEventListener(eventType, wrapper);
182
277
  stored[eventType] = wrapper;
183
- });
278
+ }
184
279
  store?.set(el, stored);
185
280
  };
186
281
  //# sourceMappingURL=dom.js.map
package/dist/dom.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"dom.js","sourceRoot":"","sources":["../src/dom.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dom.js","sourceRoot":"","sources":["../src/dom.ts"],"names":[],"mappings":"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"}
@@ -10,6 +10,8 @@
10
10
  import * as Effect from "effect/Effect";
11
11
  import type { Fiber } from "./shared.js";
12
12
  import { FibraeRuntime } from "./runtime.js";
13
+ /** Set a ref (object or function) to a DOM node, or null on cleanup. */
14
+ export declare const setRef: (ref: unknown, value: Node | null) => void;
13
15
  export declare const createDom: (fiber: Fiber, runtime: FibraeRuntime) => Effect.Effect<Node, never, never>;
14
16
  export declare const isNew: (prev: {
15
17
  [key: string]: unknown;
@@ -13,12 +13,132 @@ import * as Scope from "effect/Scope";
13
13
  import * as Ref from "effect/Ref";
14
14
  import * as Exit from "effect/Exit";
15
15
  import * as Deferred from "effect/Deferred";
16
- import { isEvent, isProperty } from "./shared.js";
16
+ import { isProperty } from "./shared.js";
17
17
  import { FibraeRuntime } from "./runtime.js";
18
- import { setDomProperty, createEventWrapper } from "./dom.js";
18
+ import { setDomProperty, createEventWrapper, normalizeEventProps, SVG_NAMESPACE, SVG_TAGS, } from "./dom.js";
19
19
  import { findDomParent } from "./fiber-tree.js";
20
20
  import { handleFiberError } from "./fiber-boundary.js";
21
21
  // =============================================================================
22
+ // DOM Positioning
23
+ // =============================================================================
24
+ /**
25
+ * Get the first DOM node from a fiber, descending into children for
26
+ * function components that don't have their own DOM node.
27
+ */
28
+ const getFirstDomNode = (fiber) => {
29
+ if (Option.isSome(fiber.dom))
30
+ return fiber.dom.value;
31
+ let child = fiber.child;
32
+ while (Option.isSome(child)) {
33
+ const dom = getFirstDomNode(child.value);
34
+ if (dom)
35
+ return dom;
36
+ child = child.value.sibling;
37
+ }
38
+ return null;
39
+ };
40
+ /**
41
+ * Collect all direct DOM descendants of a fiber in tree order.
42
+ * Descends through non-DOM fibers (function components, fragments)
43
+ * but stops at DOM nodes (those are children of that DOM node, not ours).
44
+ */
45
+ const collectChildDomNodes = (fiber) => {
46
+ const result = [];
47
+ const walk = (f) => {
48
+ if (Option.isSome(f.dom)) {
49
+ result.push(f.dom.value);
50
+ return; // Don't descend — nested DOM nodes belong to this element
51
+ }
52
+ let child = f.child;
53
+ while (Option.isSome(child)) {
54
+ walk(child.value);
55
+ child = child.value.sibling;
56
+ }
57
+ };
58
+ // Walk all children of the given fiber
59
+ let child = fiber.child;
60
+ while (Option.isSome(child)) {
61
+ walk(child.value);
62
+ child = child.value.sibling;
63
+ }
64
+ return result;
65
+ };
66
+ /**
67
+ * Find the first DOM node that should come after this fiber in the DOM.
68
+ *
69
+ * Walks the sibling chain looking for a fiber with a DOM node. If no sibling
70
+ * has one, walks up to the parent (only through non-DOM fibers like function
71
+ * components and fragments) and continues from the parent's siblings. Stops
72
+ * when hitting a fiber that owns a DOM node (that's a different DOM parent).
73
+ *
74
+ * Returns null when no subsequent sibling has a DOM node (insertBefore with
75
+ * null ref is equivalent to appendChild).
76
+ */
77
+ const findNextSiblingDom = (fiber) => {
78
+ let current = fiber;
79
+ while (current) {
80
+ let sibling = current.sibling;
81
+ while (Option.isSome(sibling)) {
82
+ const dom = getFirstDomNode(sibling.value);
83
+ if (dom)
84
+ return dom;
85
+ sibling = sibling.value.sibling;
86
+ }
87
+ // Walk up through non-DOM parents (function components, fragments)
88
+ // Stop at fibers with DOM nodes — those are different DOM parents
89
+ const parent = Option.getOrUndefined(current.parent);
90
+ if (!parent || Option.isSome(parent.dom))
91
+ break;
92
+ current = parent;
93
+ }
94
+ return null;
95
+ };
96
+ /**
97
+ * Check whether any child fiber in the sibling chain has a key prop.
98
+ */
99
+ const hasKeyedChildren = (fiber) => {
100
+ let child = fiber.child;
101
+ while (Option.isSome(child)) {
102
+ if (child.value.props.key != null)
103
+ return true;
104
+ child = child.value.sibling;
105
+ }
106
+ return false;
107
+ };
108
+ /**
109
+ * Reorder DOM children to match fiber order.
110
+ *
111
+ * After all child subtrees are committed (props updated, new nodes inserted,
112
+ * deletions processed), the DOM children may be out of order when keyed
113
+ * elements have been rearranged. This function walks the child fiber chain
114
+ * and ensures the DOM children match the expected order.
115
+ *
116
+ * Only performs actual DOM mutations for out-of-order nodes.
117
+ */
118
+ const reorderChildren = (domParent, parentFiber) => {
119
+ const expectedDoms = collectChildDomNodes(parentFiber);
120
+ const childNodes = domParent.childNodes;
121
+ for (let i = 0; i < expectedDoms.length; i++) {
122
+ const expected = expectedDoms[i];
123
+ if (childNodes[i] !== expected) {
124
+ // Insert before the node currently at this position, or append
125
+ domParent.insertBefore(expected, childNodes[i] || null);
126
+ }
127
+ }
128
+ };
129
+ // =============================================================================
130
+ // Ref Handling
131
+ // =============================================================================
132
+ /** Set a ref (object or function) to a DOM node, or null on cleanup. */
133
+ export const setRef = (ref, value) => {
134
+ if (typeof ref === "function") {
135
+ ref(value);
136
+ }
137
+ else if (ref && typeof ref === "object" && "current" in ref) {
138
+ ref.current = value;
139
+ }
140
+ };
141
+ // =============================================================================
22
142
  // Create DOM
23
143
  // =============================================================================
24
144
  export const createDom = (fiber, runtime) => Effect.gen(function* () {
@@ -28,16 +148,17 @@ export const createDom = (fiber, runtime) => Effect.gen(function* () {
28
148
  if (typeof type !== "string") {
29
149
  return Effect.die("createDom called on function component");
30
150
  }
31
- const node = type === "TEXT_ELEMENT" ? document.createTextNode("") : document.createElement(type);
151
+ const node = type === "TEXT_ELEMENT"
152
+ ? document.createTextNode("")
153
+ : SVG_TAGS.has(type)
154
+ ? document.createElementNS(SVG_NAMESPACE, type)
155
+ : document.createElement(type);
32
156
  return Effect.succeed(node);
33
157
  },
34
158
  });
35
159
  yield* updateDom(dom, {}, fiber.props, fiber, runtime);
36
- // Handle ref
37
- const ref = fiber.props.ref;
38
- if (ref && typeof ref === "object" && "current" in ref) {
39
- ref.current = dom;
40
- }
160
+ // Handle ref (object or function)
161
+ setRef(fiber.props.ref, dom);
41
162
  return dom;
42
163
  });
43
164
  // =============================================================================
@@ -58,30 +179,32 @@ export const updateDom = (dom, prevProps, nextProps, ownerFiber, runtime) => Eff
58
179
  const stateSnapshot = yield* Ref.get(stateRef);
59
180
  const el = element;
60
181
  const stored = stateSnapshot.listenerStore.get(el) ?? {};
61
- // Remove old event listeners
62
- const eventsToRemove = Object.keys(prevProps)
63
- .filter(isEvent)
64
- .filter((key) => !(key in nextProps) || isNew(prevProps, nextProps)(key));
65
- eventsToRemove.forEach((name) => {
66
- const eventType = name.toLowerCase().substring(2);
67
- const wrapper = stored[eventType];
68
- if (wrapper) {
69
- el.removeEventListener(eventType, wrapper);
70
- delete stored[eventType];
182
+ // Normalize event props so onClick and onclick don't create duplicate
183
+ // listeners for the same DOM event type. CamelCase wins when both exist.
184
+ const prevEvents = new Map(normalizeEventProps(prevProps).map(([k, v]) => [k.toLowerCase().substring(2), v]));
185
+ const nextEvents = new Map(normalizeEventProps(nextProps).map(([k, v]) => [k.toLowerCase().substring(2), v]));
186
+ // Remove old event listeners (removed or changed)
187
+ for (const [eventType, handler] of prevEvents) {
188
+ if (!nextEvents.has(eventType) || nextEvents.get(eventType) !== handler) {
189
+ const wrapper = stored[eventType];
190
+ if (wrapper) {
191
+ el.removeEventListener(eventType, wrapper);
192
+ delete stored[eventType];
193
+ }
71
194
  }
72
- });
195
+ }
73
196
  // Remove properties that were in prevProps but not in nextProps
74
197
  Object.keys(prevProps)
75
198
  .filter(isProperty)
76
199
  .filter((key) => !(key in nextProps))
77
200
  .forEach((name) => {
78
- if (el instanceof HTMLElement) {
201
+ if (el instanceof HTMLElement || el instanceof SVGElement) {
79
202
  setDomProperty(el, name, null);
80
203
  }
81
204
  });
82
205
  // Handle dangerouslySetInnerHTML
83
206
  if (nextProps.dangerouslySetInnerHTML != null) {
84
- if (el instanceof HTMLElement &&
207
+ if ((el instanceof HTMLElement || el instanceof SVGElement) &&
85
208
  nextProps.dangerouslySetInnerHTML !== prevProps.dangerouslySetInnerHTML) {
86
209
  el.innerHTML = String(nextProps.dangerouslySetInnerHTML);
87
210
  }
@@ -91,25 +214,22 @@ export const updateDom = (dom, prevProps, nextProps, ownerFiber, runtime) => Eff
91
214
  .filter(isProperty)
92
215
  .filter(isNew(prevProps, nextProps))
93
216
  .forEach((name) => {
94
- if (el instanceof HTMLElement) {
217
+ if (el instanceof HTMLElement || el instanceof SVGElement) {
95
218
  setDomProperty(el, name, nextProps[name]);
96
219
  }
97
220
  });
98
- // Add new event listeners
99
- Object.keys(nextProps)
100
- .filter(isEvent)
101
- .filter(isNew(prevProps, nextProps))
102
- .forEach((name) => {
103
- const eventType = name.toLowerCase().substring(2);
104
- const handler = nextProps[name];
105
- const wrapper = createEventWrapper(handler, eventType, runtime, ownerFiber ? (error) => handleFiberError(ownerFiber, error) : undefined);
106
- const existing = stored[eventType];
107
- if (existing) {
108
- el.removeEventListener(eventType, existing);
109
- }
110
- el.addEventListener(eventType, wrapper);
111
- stored[eventType] = wrapper;
112
- });
221
+ // Add new event listeners (new or changed)
222
+ for (const [eventType, handler] of nextEvents) {
223
+ if (!prevEvents.has(eventType) || prevEvents.get(eventType) !== handler) {
224
+ const wrapper = createEventWrapper(handler, eventType, runtime, ownerFiber ? (error) => handleFiberError(ownerFiber, error) : undefined);
225
+ const existing = stored[eventType];
226
+ if (existing) {
227
+ el.removeEventListener(eventType, existing);
228
+ }
229
+ el.addEventListener(eventType, wrapper);
230
+ stored[eventType] = wrapper;
231
+ }
232
+ }
113
233
  stateSnapshot.listenerStore.set(el, stored);
114
234
  });
115
235
  // =============================================================================
@@ -127,6 +247,7 @@ export const deleteFiber = (fiber) => Effect.gen(function* () {
127
247
  });
128
248
  export const commitDeletion = (fiber, domParent) => Option.match(fiber.dom, {
129
249
  onSome: (dom) => Effect.sync(() => {
250
+ setRef(fiber.props.ref, null);
130
251
  domParent.removeChild(dom);
131
252
  }),
132
253
  onNone: () =>
@@ -165,7 +286,7 @@ export const commitRoot = (runtime) => Effect.gen(function* () {
165
286
  }));
166
287
  });
167
288
  export const commitWork = (fiber, runtime) => Effect.gen(function* () {
168
- // KEY INSIGHT: If fiber has no DOM (function component), just process children
289
+ // Function component / fragment no DOM node of its own.
169
290
  if (Option.isNone(fiber.dom)) {
170
291
  if (Option.isSome(fiber.child)) {
171
292
  yield* commitWork(fiber.child.value, runtime);
@@ -201,9 +322,11 @@ export const commitWork = (fiber, runtime) => Effect.gen(function* () {
201
322
  // Process effect tag
202
323
  const tag = fiber.effectTag.pipe(Option.getOrUndefined);
203
324
  if (tag === "PLACEMENT") {
204
- // Append DOM node
325
+ // Insert DOM node at the correct position
205
326
  if (Option.isSome(fiber.dom)) {
206
- domParent.appendChild(fiber.dom.value);
327
+ const refNode = findNextSiblingDom(fiber);
328
+ // refNode must be a direct child of domParent for insertBefore
329
+ domParent.insertBefore(fiber.dom.value, refNode && refNode.parentNode === domParent ? refNode : null);
207
330
  }
208
331
  // Signal first child committed (for Suspense)
209
332
  const deferred = fiber.parent.pipe(Option.flatMap((p) => p.childFirstCommitDeferred), Option.getOrUndefined);
@@ -218,6 +341,15 @@ export const commitWork = (fiber, runtime) => Effect.gen(function* () {
218
341
  const prevProps = fiber.alternate.pipe(Option.map((alt) => alt.props), Option.getOrElse(() => ({})));
219
342
  if (Option.isSome(fiber.dom)) {
220
343
  yield* updateDom(fiber.dom.value, prevProps, fiber.props, fiber, runtime);
344
+ // Handle ref changes: clean up old ref, apply new ref
345
+ const prevRef = prevProps.ref;
346
+ const nextRef = fiber.props.ref;
347
+ if (prevRef !== nextRef) {
348
+ if (prevRef)
349
+ setRef(prevRef, null);
350
+ if (nextRef)
351
+ setRef(nextRef, fiber.dom.value);
352
+ }
221
353
  }
222
354
  }
223
355
  else if (tag === "DELETION") {
@@ -228,6 +360,13 @@ export const commitWork = (fiber, runtime) => Effect.gen(function* () {
228
360
  if (Option.isSome(fiber.child)) {
229
361
  yield* commitWork(fiber.child.value, runtime);
230
362
  }
363
+ // After all children are committed, reorder DOM children if this fiber
364
+ // has keyed children. This batch approach is correct because it runs
365
+ // after all child insertions/deletions/updates, avoiding the cascading
366
+ // DOM mutation issue of per-fiber sequential insertBefore.
367
+ if (Option.isSome(fiber.dom) && hasKeyedChildren(fiber)) {
368
+ reorderChildren(fiber.dom.value, fiber);
369
+ }
231
370
  // After children are committed, apply deferred properties.
232
371
  // <select> value must be set after <option> children exist in the DOM.
233
372
  if (Option.isSome(fiber.dom)) {
@@ -1 +1 @@
1
- {"version":3,"file":"fiber-commit.js","sourceRoot":"","sources":["../src/fiber-commit.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fiber-commit.js","sourceRoot":"","sources":["../src/fiber-commit.ts"],"names":[],"mappings":"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"}
@@ -25,7 +25,8 @@ import {} from "./live/atom.js";
25
25
  import { createFiber, getComponentScopeService, linkFibersAsSiblings } from "./fiber-tree.js";
26
26
  import { handleFiberError } from "./fiber-boundary.js";
27
27
  import { performUnitOfWork, resubscribeFiber, subscribeComponentStream, subscribeFiberAtoms, activateLiveAtoms, reconcileChildren, } from "./fiber-update.js";
28
- import { commitRoot } from "./fiber-commit.js";
28
+ import { commitRoot, setRef } from "./fiber-commit.js";
29
+ import { checkTagMismatch, checkTextMismatch, checkAttributeMismatches } from "./hydration-dev.js";
29
30
  // =============================================================================
30
31
  // Work Loop
31
32
  // =============================================================================
@@ -222,25 +223,8 @@ const hydrateChildren = (parentFiber, vElements, startCursor, runtime) => Effect
222
223
  * Returns the created fiber and the next DOM cursor position.
223
224
  */
224
225
  const hydrateElement = (parentFiber, vElement, domNode, runtime) => Effect.gen(function* () {
225
- // Detect hydration mismatch: VElement type vs DOM node tag
226
- if (typeof vElement.type === "string" &&
227
- vElement.type !== "TEXT_ELEMENT" &&
228
- vElement.type !== "FRAGMENT" &&
229
- vElement.type !== "SUSPENSE" &&
230
- vElement.type !== "BOUNDARY") {
231
- if (domNode.nodeType === Node.ELEMENT_NODE) {
232
- const expected = vElement.type.toUpperCase();
233
- const actual = domNode.tagName;
234
- if (expected !== actual) {
235
- yield* Effect.logError(`Hydration mismatch: expected <${vElement.type}> but found <${actual.toLowerCase()}>. ` +
236
- `SSR and client component trees differ.`);
237
- }
238
- }
239
- else if (domNode.nodeType === Node.TEXT_NODE) {
240
- yield* Effect.logError(`Hydration mismatch: expected <${vElement.type}> but found text node "${domNode.textContent?.substring(0, 30)}". ` +
241
- `SSR and client component trees differ.`);
242
- }
243
- }
226
+ // Dev-only: detect hydration mismatches (tag name, text, attributes)
227
+ yield* checkTagMismatch(vElement, domNode);
244
228
  const fiber = createFiber(Option.some(vElement.type), vElement.props, Option.some(parentFiber), Option.none(), Option.none());
245
229
  let nextCursor;
246
230
  if (typeof vElement.type === "function") {
@@ -249,6 +233,7 @@ const hydrateElement = (parentFiber, vElement, domNode, runtime) => Effect.gen(f
249
233
  }
250
234
  else if (vElement.type === "TEXT_ELEMENT") {
251
235
  // Text node - adopt the DOM text node
236
+ yield* checkTextMismatch(vElement, domNode);
252
237
  fiber.dom = Option.some(domNode);
253
238
  nextCursor = getNextHydratableSibling(domNode);
254
239
  }
@@ -326,6 +311,7 @@ const hydrateElement = (parentFiber, vElement, domNode, runtime) => Effect.gen(f
326
311
  }
327
312
  else {
328
313
  // Host element - adopt DOM node and hydrate children
314
+ yield* checkAttributeMismatches(vElement, domNode);
329
315
  const el = domNode;
330
316
  fiber.dom = Option.some(el);
331
317
  // Inherit renderContext from parent fiber (function components capture it during render)
@@ -335,11 +321,8 @@ const hydrateElement = (parentFiber, vElement, domNode, runtime) => Effect.gen(f
335
321
  // Attach event listeners with listenerStore tracking for proper cleanup on re-render
336
322
  const stateSnapshot = yield* Ref.get(runtime.fiberState);
337
323
  attachEventListeners(el, vElement.props, runtime, (cause) => handleFiberError(fiber, cause), stateSnapshot.listenerStore);
338
- // Handle ref
339
- const ref = vElement.props.ref;
340
- if (ref && typeof ref === "object" && "current" in ref) {
341
- ref.current = el;
342
- }
324
+ // Handle ref (object or function)
325
+ setRef(vElement.props.ref, el);
343
326
  // Hydrate children using cursor-based walking
344
327
  const firstChildCursor = getFirstHydratableChild(el);
345
328
  yield* hydrateChildren(fiber, vElement.props.children || [], firstChildCursor, runtime);
@@ -379,10 +362,13 @@ const hydrateFunctionComponent = (fiber, vElement, domNode, runtime) => Effect.g
379
362
  const firstValueDeferred = yield* subscribeComponentStream(stream, fiberRef, componentScopeService.scope);
380
363
  // Wait for first value
381
364
  const childVElement = yield* Deferred.await(firstValueDeferred);
382
- fiber.latestStreamValue = Option.some(childVElement);
365
+ fiber.latestStreamValue = childVElement === null ? Option.none() : Option.some(childVElement);
383
366
  // Hydrate the child VElement against DOM node
384
367
  // Function components render output directly to DOM (no wrapper)
385
- const nextCursor = yield* hydrateChildren(fiber, [childVElement], Option.some(domNode), runtime);
368
+ // null = render nothing skip hydration of children
369
+ const nextCursor = childVElement === null
370
+ ? Option.some(domNode)
371
+ : yield* hydrateChildren(fiber, [childVElement], Option.some(domNode), runtime);
386
372
  // Signal mounted after subtree hydrates
387
373
  yield* Deferred.succeed(componentScopeService.mounted, undefined);
388
374
  // Subscribe to atom changes