fibrae 0.2.2 → 0.3.0

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 (119) hide show
  1. package/dist/cli/build.d.ts +34 -0
  2. package/dist/cli/build.js +92 -0
  3. package/dist/cli/build.js.map +1 -0
  4. package/dist/cli/cli.d.ts +10 -0
  5. package/dist/cli/cli.js +43 -0
  6. package/dist/cli/cli.js.map +1 -0
  7. package/dist/cli/config.d.ts +19 -0
  8. package/dist/cli/config.js +5 -0
  9. package/dist/cli/config.js.map +1 -0
  10. package/dist/cli/html.d.ts +13 -0
  11. package/dist/cli/html.js +101 -0
  12. package/dist/cli/html.js.map +1 -0
  13. package/dist/cli/index.d.ts +6 -0
  14. package/dist/cli/index.js +4 -0
  15. package/dist/cli/index.js.map +1 -0
  16. package/dist/cli/vite-plugin.d.ts +9 -0
  17. package/dist/cli/vite-plugin.js +143 -0
  18. package/dist/cli/vite-plugin.js.map +1 -0
  19. package/dist/components.d.ts +27 -29
  20. package/dist/components.js +32 -52
  21. package/dist/components.js.map +1 -1
  22. package/dist/core.js +7 -10
  23. package/dist/core.js.map +1 -1
  24. package/dist/dom.d.ts +13 -4
  25. package/dist/dom.js +91 -26
  26. package/dist/dom.js.map +1 -1
  27. package/dist/fiber-boundary.d.ts +39 -0
  28. package/dist/fiber-boundary.js +151 -0
  29. package/dist/fiber-boundary.js.map +1 -0
  30. package/dist/fiber-commit.d.ts +27 -0
  31. package/dist/fiber-commit.js +243 -0
  32. package/dist/fiber-commit.js.map +1 -0
  33. package/dist/fiber-render.d.ts +9 -9
  34. package/dist/fiber-render.js +165 -958
  35. package/dist/fiber-render.js.map +1 -1
  36. package/dist/fiber-tree.d.ts +77 -0
  37. package/dist/fiber-tree.js +152 -0
  38. package/dist/fiber-tree.js.map +1 -0
  39. package/dist/fiber-update.d.ts +46 -0
  40. package/dist/fiber-update.js +515 -0
  41. package/dist/fiber-update.js.map +1 -0
  42. package/dist/h.js.map +1 -1
  43. package/dist/index.d.ts +1 -1
  44. package/dist/index.js +1 -1
  45. package/dist/index.js.map +1 -1
  46. package/dist/jsx-runtime/index.d.ts +253 -2
  47. package/dist/live/atom.d.ts +31 -0
  48. package/dist/live/atom.js +33 -0
  49. package/dist/live/atom.js.map +1 -0
  50. package/dist/live/client.d.ts +50 -0
  51. package/dist/live/client.js +90 -0
  52. package/dist/live/client.js.map +1 -0
  53. package/dist/live/codec.d.ts +39 -0
  54. package/dist/live/codec.js +41 -0
  55. package/dist/live/codec.js.map +1 -0
  56. package/dist/live/config.d.ts +13 -0
  57. package/dist/live/config.js +11 -0
  58. package/dist/live/config.js.map +1 -0
  59. package/dist/live/index.d.ts +25 -0
  60. package/dist/live/index.js +19 -0
  61. package/dist/live/index.js.map +1 -0
  62. package/dist/live/server.d.ts +83 -0
  63. package/dist/live/server.js +106 -0
  64. package/dist/live/server.js.map +1 -0
  65. package/dist/live/sse-stream.d.ts +14 -0
  66. package/dist/live/sse-stream.js +30 -0
  67. package/dist/live/sse-stream.js.map +1 -0
  68. package/dist/live/types.d.ts +40 -0
  69. package/dist/live/types.js +20 -0
  70. package/dist/live/types.js.map +1 -0
  71. package/dist/router/History.d.ts +2 -2
  72. package/dist/router/History.js.map +1 -1
  73. package/dist/router/Link.d.ts +8 -4
  74. package/dist/router/Link.js +13 -34
  75. package/dist/router/Link.js.map +1 -1
  76. package/dist/router/Navigator.d.ts +12 -1
  77. package/dist/router/Navigator.js +31 -68
  78. package/dist/router/Navigator.js.map +1 -1
  79. package/dist/router/Route.d.ts +16 -3
  80. package/dist/router/Route.js +32 -25
  81. package/dist/router/Route.js.map +1 -1
  82. package/dist/router/Router.d.ts +27 -19
  83. package/dist/router/Router.js +78 -101
  84. package/dist/router/Router.js.map +1 -1
  85. package/dist/router/RouterBuilder.d.ts +106 -34
  86. package/dist/router/RouterBuilder.js +78 -39
  87. package/dist/router/RouterBuilder.js.map +1 -1
  88. package/dist/router/RouterOutlet.d.ts +1 -18
  89. package/dist/router/RouterOutlet.js +25 -8
  90. package/dist/router/RouterOutlet.js.map +1 -1
  91. package/dist/router/RouterState.d.ts +1 -1
  92. package/dist/router/index.d.ts +4 -4
  93. package/dist/router/index.js +4 -2
  94. package/dist/router/index.js.map +1 -1
  95. package/dist/router/utils.d.ts +36 -0
  96. package/dist/router/utils.js +48 -0
  97. package/dist/router/utils.js.map +1 -0
  98. package/dist/runtime.d.ts +10 -7
  99. package/dist/runtime.js +20 -2
  100. package/dist/runtime.js.map +1 -1
  101. package/dist/server.d.ts +2 -2
  102. package/dist/server.js +15 -29
  103. package/dist/server.js.map +1 -1
  104. package/dist/shared.d.ts +58 -59
  105. package/dist/shared.js +51 -13
  106. package/dist/shared.js.map +1 -1
  107. package/dist/tracking.d.ts +4 -3
  108. package/dist/tracking.js +6 -1
  109. package/dist/tracking.js.map +1 -1
  110. package/package.json +32 -7
  111. package/dist/hydration.d.ts +0 -30
  112. package/dist/hydration.js +0 -355
  113. package/dist/hydration.js.map +0 -1
  114. package/dist/render.d.ts +0 -19
  115. package/dist/render.js +0 -285
  116. package/dist/render.js.map +0 -1
  117. package/dist/scope-utils.d.ts +0 -14
  118. package/dist/scope-utils.js +0 -29
  119. package/dist/scope-utils.js.map +0 -1
@@ -0,0 +1,243 @@
1
+ /**
2
+ * Fiber commit phase — DOM mutations.
3
+ *
4
+ * This module contains the commit phase of the fiber reconciler: creating and
5
+ * updating real DOM nodes, processing deletions, and walking the fiber tree
6
+ * to apply placement/update/deletion effect tags to the DOM.
7
+ *
8
+ * Extracted from fiber-render.ts.
9
+ */
10
+ import * as Effect from "effect/Effect";
11
+ import * as Option from "effect/Option";
12
+ import * as Scope from "effect/Scope";
13
+ import * as Ref from "effect/Ref";
14
+ import * as Exit from "effect/Exit";
15
+ import * as Deferred from "effect/Deferred";
16
+ import { isEvent, isProperty } from "./shared.js";
17
+ import { FibraeRuntime } from "./runtime.js";
18
+ import { setDomProperty, createEventWrapper } from "./dom.js";
19
+ import { findDomParent } from "./fiber-tree.js";
20
+ import { handleFiberError } from "./fiber-boundary.js";
21
+ // =============================================================================
22
+ // Create DOM
23
+ // =============================================================================
24
+ export const createDom = (fiber, runtime) => Effect.gen(function* () {
25
+ const dom = yield* Option.match(fiber.type, {
26
+ onNone: () => Effect.die("createDom called with no type"),
27
+ onSome: (type) => {
28
+ if (typeof type !== "string") {
29
+ return Effect.die("createDom called on function component");
30
+ }
31
+ const node = type === "TEXT_ELEMENT" ? document.createTextNode("") : document.createElement(type);
32
+ return Effect.succeed(node);
33
+ },
34
+ });
35
+ 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
+ }
41
+ return dom;
42
+ });
43
+ // =============================================================================
44
+ // Update DOM
45
+ // =============================================================================
46
+ export const isNew = (prev, next) => (key) => prev[key] !== next[key];
47
+ export const updateDom = (dom, prevProps, nextProps, ownerFiber, runtime) => Effect.gen(function* () {
48
+ const stateRef = runtime.fiberState;
49
+ const element = dom;
50
+ if (element instanceof Text) {
51
+ if (nextProps.nodeValue !== prevProps.nodeValue) {
52
+ const value = nextProps.nodeValue;
53
+ element.nodeValue =
54
+ typeof value === "string" || typeof value === "number" ? String(value) : "";
55
+ }
56
+ return;
57
+ }
58
+ const stateSnapshot = yield* Ref.get(stateRef);
59
+ const el = element;
60
+ 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];
71
+ }
72
+ });
73
+ // Remove properties that were in prevProps but not in nextProps
74
+ Object.keys(prevProps)
75
+ .filter(isProperty)
76
+ .filter((key) => !(key in nextProps))
77
+ .forEach((name) => {
78
+ if (el instanceof HTMLElement) {
79
+ setDomProperty(el, name, null);
80
+ }
81
+ });
82
+ // Handle dangerouslySetInnerHTML
83
+ if (nextProps.dangerouslySetInnerHTML != null) {
84
+ if (el instanceof HTMLElement &&
85
+ nextProps.dangerouslySetInnerHTML !== prevProps.dangerouslySetInnerHTML) {
86
+ el.innerHTML = String(nextProps.dangerouslySetInnerHTML);
87
+ }
88
+ }
89
+ // Update changed properties
90
+ Object.keys(nextProps)
91
+ .filter(isProperty)
92
+ .filter(isNew(prevProps, nextProps))
93
+ .forEach((name) => {
94
+ if (el instanceof HTMLElement) {
95
+ setDomProperty(el, name, nextProps[name]);
96
+ }
97
+ });
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
+ });
113
+ stateSnapshot.listenerStore.set(el, stored);
114
+ });
115
+ // =============================================================================
116
+ // Commit Phase
117
+ // =============================================================================
118
+ export const deleteFiber = (fiber) => Effect.gen(function* () {
119
+ // Close component scope (unless fiber is parked - its scope must stay alive)
120
+ if (!fiber.isParked && Option.isSome(fiber.componentScope)) {
121
+ yield* Scope.close(fiber.componentScope.value, Exit.void);
122
+ }
123
+ // Recursively delete children
124
+ if (Option.isSome(fiber.child)) {
125
+ yield* deleteFiber(fiber.child.value);
126
+ }
127
+ });
128
+ export const commitDeletion = (fiber, domParent) => Option.match(fiber.dom, {
129
+ onSome: (dom) => Effect.sync(() => {
130
+ domParent.removeChild(dom);
131
+ }),
132
+ onNone: () =>
133
+ // Function component - find DOM children
134
+ Effect.iterate(fiber.child, {
135
+ while: (opt) => Option.isSome(opt),
136
+ body: (childOpt) => Effect.gen(function* () {
137
+ const child = childOpt.value;
138
+ yield* commitDeletion(child, domParent);
139
+ return child.sibling;
140
+ }),
141
+ }),
142
+ });
143
+ export const commitRoot = (runtime) => Effect.gen(function* () {
144
+ const stateRef = runtime.fiberState;
145
+ const currentState = yield* Ref.get(stateRef);
146
+ // Process deletions first
147
+ yield* Effect.forEach(currentState.deletions, (fiber) => Effect.gen(function* () {
148
+ const domParent = findDomParent(fiber);
149
+ if (Option.isSome(domParent)) {
150
+ yield* commitDeletion(fiber, domParent.value);
151
+ }
152
+ yield* deleteFiber(fiber);
153
+ }), { discard: true });
154
+ // Commit work starting from wipRoot.child
155
+ const firstChild = currentState.wipRoot.pipe(Option.flatMap((root) => root.child), Option.getOrUndefined);
156
+ if (firstChild) {
157
+ yield* commitWork(firstChild, runtime);
158
+ }
159
+ // Swap wipRoot to currentRoot
160
+ yield* Ref.update(stateRef, (s) => ({
161
+ ...s,
162
+ currentRoot: currentState.wipRoot,
163
+ wipRoot: Option.none(),
164
+ deletions: [],
165
+ }));
166
+ });
167
+ export const commitWork = (fiber, runtime) => Effect.gen(function* () {
168
+ // KEY INSIGHT: If fiber has no DOM (function component), just process children
169
+ if (Option.isNone(fiber.dom)) {
170
+ if (Option.isSome(fiber.child)) {
171
+ yield* commitWork(fiber.child.value, runtime);
172
+ }
173
+ // Signal mounted after subtree commits (for function components)
174
+ yield* Option.match(fiber.mountedDeferred, {
175
+ onNone: () => Effect.void,
176
+ onSome: (deferred) => Effect.gen(function* () {
177
+ const done = yield* Deferred.isDone(deferred);
178
+ if (!done) {
179
+ yield* Deferred.succeed(deferred, undefined);
180
+ }
181
+ }),
182
+ });
183
+ if (Option.isSome(fiber.sibling)) {
184
+ yield* commitWork(fiber.sibling.value, runtime);
185
+ }
186
+ return;
187
+ }
188
+ // Find DOM parent by walking up to nearest fiber with dom
189
+ const domParentOpt = findDomParent(fiber);
190
+ if (Option.isNone(domParentOpt)) {
191
+ // No DOM parent found - continue with children/siblings
192
+ if (Option.isSome(fiber.child)) {
193
+ yield* commitWork(fiber.child.value, runtime);
194
+ }
195
+ if (Option.isSome(fiber.sibling)) {
196
+ yield* commitWork(fiber.sibling.value, runtime);
197
+ }
198
+ return;
199
+ }
200
+ const domParent = domParentOpt.value;
201
+ // Process effect tag
202
+ const tag = fiber.effectTag.pipe(Option.getOrUndefined);
203
+ if (tag === "PLACEMENT") {
204
+ // Append DOM node
205
+ if (Option.isSome(fiber.dom)) {
206
+ domParent.appendChild(fiber.dom.value);
207
+ }
208
+ // Signal first child committed (for Suspense)
209
+ const deferred = fiber.parent.pipe(Option.flatMap((p) => p.childFirstCommitDeferred), Option.getOrUndefined);
210
+ if (deferred) {
211
+ const done = yield* Deferred.isDone(deferred);
212
+ if (!done) {
213
+ yield* Deferred.succeed(deferred, undefined);
214
+ }
215
+ }
216
+ }
217
+ else if (tag === "UPDATE") {
218
+ const prevProps = fiber.alternate.pipe(Option.map((alt) => alt.props), Option.getOrElse(() => ({})));
219
+ if (Option.isSome(fiber.dom)) {
220
+ yield* updateDom(fiber.dom.value, prevProps, fiber.props, fiber, runtime);
221
+ }
222
+ }
223
+ else if (tag === "DELETION") {
224
+ yield* commitDeletion(fiber, domParent);
225
+ return;
226
+ }
227
+ // Continue with children and siblings
228
+ if (Option.isSome(fiber.child)) {
229
+ yield* commitWork(fiber.child.value, runtime);
230
+ }
231
+ // After children are committed, apply deferred properties.
232
+ // <select> value must be set after <option> children exist in the DOM.
233
+ if (Option.isSome(fiber.dom)) {
234
+ const node = fiber.dom.value;
235
+ if (node instanceof HTMLSelectElement && "value" in fiber.props) {
236
+ node.value = String(fiber.props.value);
237
+ }
238
+ }
239
+ if (Option.isSome(fiber.sibling)) {
240
+ yield* commitWork(fiber.sibling.value, runtime);
241
+ }
242
+ });
243
+ //# sourceMappingURL=fiber-commit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fiber-commit.js","sourceRoot":"","sources":["../src/fiber-commit.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,13 @@
1
1
  /**
2
- * Fiber-based rendering implementation.
2
+ * Fiber-based rendering — public API and orchestration.
3
3
  *
4
- * This module implements a proper fiber reconciliation system that:
5
- * - Uses a fiber tree for incremental rendering
6
- * - Supports key-based diffing for efficient list updates
7
- * - Two-phase rendering: render phase builds fiber tree, commit phase touches DOM
8
- * - Function components have `dom: Option.none()` - no wrapper spans!
4
+ * This module provides:
5
+ * - `renderFiber` — mount a VElement tree to the DOM
6
+ * - `hydrateFiber` hydrate an existing SSR DOM tree
7
+ * - `renderMailboxConsumer` batched re-render work loop
9
8
  *
10
- * This fixes SSR hydration by producing identical DOM structure on server and client.
9
+ * The actual reconciliation, commit, boundary, and tree logic
10
+ * are split across fiber-tree, fiber-update, fiber-commit, and fiber-boundary.
11
11
  */
12
12
  import * as Effect from "effect/Effect";
13
13
  import { type VElement } from "./shared.js";
@@ -23,7 +23,7 @@ import { FibraeRuntime } from "./runtime.js";
23
23
  * @param element - VElement to render
24
24
  * @param container - DOM container to render into
25
25
  */
26
- export declare const renderFiber: (element: VElement, container: HTMLElement) => Effect.Effect<never, never, FibraeRuntime>;
26
+ export declare const renderFiber: (element: VElement, container: HTMLElement) => Effect.Effect<void, never, FibraeRuntime>;
27
27
  /**
28
28
  * Hydrate an existing DOM tree by building a fiber tree that references
29
29
  * the existing DOM nodes. This enables event handlers and reactivity
@@ -32,4 +32,4 @@ export declare const renderFiber: (element: VElement, container: HTMLElement) =>
32
32
  * Uses cursor-based DOM walking (like React) to match VElement tree
33
33
  * against existing DOM, skipping whitespace-only text nodes and comments.
34
34
  */
35
- export declare const hydrateFiber: (element: VElement, container: HTMLElement) => Effect.Effect<never, unknown, FibraeRuntime>;
35
+ export declare const hydrateFiber: (element: VElement, container: HTMLElement) => Effect.Effect<void, never, FibraeRuntime>;