fibrae 0.2.3 → 0.3.1
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.
- package/dist/atom-utils.d.ts +52 -0
- package/dist/atom-utils.js +64 -0
- package/dist/atom-utils.js.map +1 -0
- package/dist/cli/build.d.ts +34 -0
- package/dist/cli/build.js +92 -0
- package/dist/cli/build.js.map +1 -0
- package/dist/cli/cli.d.ts +10 -0
- package/dist/cli/cli.js +43 -0
- package/dist/cli/cli.js.map +1 -0
- package/dist/cli/config.d.ts +19 -0
- package/dist/cli/config.js +5 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/html.d.ts +19 -0
- package/dist/cli/html.js +95 -0
- package/dist/cli/html.js.map +1 -0
- package/dist/cli/index.d.ts +6 -0
- package/dist/cli/index.js +4 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/vite-plugin.d.ts +9 -0
- package/dist/cli/vite-plugin.js +143 -0
- package/dist/cli/vite-plugin.js.map +1 -0
- package/dist/components.d.ts +28 -30
- package/dist/components.js +35 -53
- package/dist/components.js.map +1 -1
- package/dist/core.js +7 -10
- package/dist/core.js.map +1 -1
- package/dist/dom.d.ts +25 -6
- package/dist/dom.js +161 -27
- package/dist/dom.js.map +1 -1
- package/dist/fiber-boundary.d.ts +39 -0
- package/dist/fiber-boundary.js +151 -0
- package/dist/fiber-boundary.js.map +1 -0
- package/dist/fiber-commit.d.ts +27 -0
- package/dist/fiber-commit.js +247 -0
- package/dist/fiber-commit.js.map +1 -0
- package/dist/fiber-render.d.ts +9 -9
- package/dist/fiber-render.js +165 -958
- package/dist/fiber-render.js.map +1 -1
- package/dist/fiber-tree.d.ts +77 -0
- package/dist/fiber-tree.js +152 -0
- package/dist/fiber-tree.js.map +1 -0
- package/dist/fiber-update.d.ts +46 -0
- package/dist/fiber-update.js +521 -0
- package/dist/fiber-update.js.map +1 -0
- package/dist/h.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/jsx-runtime/index.d.ts +368 -2
- package/dist/live/atom.d.ts +31 -0
- package/dist/live/atom.js +33 -0
- package/dist/live/atom.js.map +1 -0
- package/dist/live/client.d.ts +50 -0
- package/dist/live/client.js +90 -0
- package/dist/live/client.js.map +1 -0
- package/dist/live/codec.d.ts +39 -0
- package/dist/live/codec.js +41 -0
- package/dist/live/codec.js.map +1 -0
- package/dist/live/config.d.ts +13 -0
- package/dist/live/config.js +11 -0
- package/dist/live/config.js.map +1 -0
- package/dist/live/index.d.ts +25 -0
- package/dist/live/index.js +19 -0
- package/dist/live/index.js.map +1 -0
- package/dist/live/server.d.ts +83 -0
- package/dist/live/server.js +106 -0
- package/dist/live/server.js.map +1 -0
- package/dist/live/sse-stream.d.ts +14 -0
- package/dist/live/sse-stream.js +30 -0
- package/dist/live/sse-stream.js.map +1 -0
- package/dist/live/types.d.ts +40 -0
- package/dist/live/types.js +20 -0
- package/dist/live/types.js.map +1 -0
- package/dist/mdx/index.d.ts +125 -0
- package/dist/mdx/index.js +137 -0
- package/dist/mdx/index.js.map +1 -0
- package/dist/mdx/parse.d.ts +42 -0
- package/dist/mdx/parse.js +147 -0
- package/dist/mdx/parse.js.map +1 -0
- package/dist/mdx/render.d.ts +23 -0
- package/dist/mdx/render.js +263 -0
- package/dist/mdx/render.js.map +1 -0
- package/dist/router/Form.d.ts +90 -0
- package/dist/router/Form.js +166 -0
- package/dist/router/Form.js.map +1 -0
- package/dist/router/History.d.ts +4 -9
- package/dist/router/History.js +0 -8
- package/dist/router/History.js.map +1 -1
- package/dist/router/Link.d.ts +27 -28
- package/dist/router/Link.js +50 -119
- package/dist/router/Link.js.map +1 -1
- package/dist/router/Navigator.d.ts +25 -33
- package/dist/router/Navigator.js +41 -149
- package/dist/router/Navigator.js.map +1 -1
- package/dist/router/Route.d.ts +24 -7
- package/dist/router/Route.js +42 -27
- package/dist/router/Route.js.map +1 -1
- package/dist/router/Router.d.ts +27 -19
- package/dist/router/Router.js +112 -120
- package/dist/router/Router.js.map +1 -1
- package/dist/router/RouterBuilder.d.ts +171 -36
- package/dist/router/RouterBuilder.js +101 -39
- package/dist/router/RouterBuilder.js.map +1 -1
- package/dist/router/RouterOutlet.d.ts +1 -18
- package/dist/router/RouterOutlet.js +60 -48
- package/dist/router/RouterOutlet.js.map +1 -1
- package/dist/router/RouterState.d.ts +1 -1
- package/dist/router/index.d.ts +8 -5
- package/dist/router/index.js +6 -3
- package/dist/router/index.js.map +1 -1
- package/dist/router/register.d.ts +37 -0
- package/dist/router/register.js +18 -0
- package/dist/router/register.js.map +1 -0
- package/dist/router/utils.d.ts +36 -0
- package/dist/router/utils.js +48 -0
- package/dist/router/utils.js.map +1 -0
- package/dist/runtime.d.ts +11 -8
- package/dist/runtime.js +20 -2
- package/dist/runtime.js.map +1 -1
- package/dist/server.d.ts +2 -2
- package/dist/server.js +15 -29
- package/dist/server.js.map +1 -1
- package/dist/shared.d.ts +61 -62
- package/dist/shared.js +51 -13
- package/dist/shared.js.map +1 -1
- package/dist/tracking.d.ts +4 -3
- package/dist/tracking.js +6 -1
- package/dist/tracking.js.map +1 -1
- package/package.json +45 -7
- package/dist/hydration.d.ts +0 -30
- package/dist/hydration.js +0 -355
- package/dist/hydration.js.map +0 -1
- package/dist/render.d.ts +0 -19
- package/dist/render.js +0 -285
- package/dist/render.js.map +0 -1
- package/dist/scope-utils.d.ts +0 -14
- package/dist/scope-utils.js +0 -29
- package/dist/scope-utils.js.map +0 -1
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error boundary and suspense boundary handlers.
|
|
3
|
+
*
|
|
4
|
+
* Functions for converting errors, parking fibers, and signaling recovery
|
|
5
|
+
* in ErrorBoundary and Suspense components.
|
|
6
|
+
*/
|
|
7
|
+
import * as Effect from "effect/Effect";
|
|
8
|
+
import * as Option from "effect/Option";
|
|
9
|
+
import * as Deferred from "effect/Deferred";
|
|
10
|
+
import * as Cause from "effect/Cause";
|
|
11
|
+
import { RenderError, StreamError, EventHandlerError, } from "./shared.js";
|
|
12
|
+
import { FibraeRuntime } from "./runtime.js";
|
|
13
|
+
import { findNearestBoundary, findNearestSuspenseBoundary, queueFiberForRerender, } from "./fiber-tree.js";
|
|
14
|
+
/**
|
|
15
|
+
* Convert a raw cause/error to a ComponentError.
|
|
16
|
+
* If it's already a ComponentError, return as-is.
|
|
17
|
+
* Otherwise, wrap in RenderError as a fallback.
|
|
18
|
+
*/
|
|
19
|
+
export const toComponentError = (cause) => {
|
|
20
|
+
// Check if it's already a ComponentError
|
|
21
|
+
if (cause instanceof RenderError ||
|
|
22
|
+
cause instanceof StreamError ||
|
|
23
|
+
cause instanceof EventHandlerError) {
|
|
24
|
+
return cause;
|
|
25
|
+
}
|
|
26
|
+
// Extract the actual error from Cause if needed
|
|
27
|
+
const actualError = Cause.isCause(cause) ? Cause.squash(cause) : cause;
|
|
28
|
+
if (actualError instanceof RenderError ||
|
|
29
|
+
actualError instanceof StreamError ||
|
|
30
|
+
actualError instanceof EventHandlerError) {
|
|
31
|
+
return actualError;
|
|
32
|
+
}
|
|
33
|
+
// Wrap unknown errors as RenderError
|
|
34
|
+
return new RenderError({ cause: actualError });
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* Handle an error by finding the nearest error boundary and rendering its fallback.
|
|
38
|
+
*
|
|
39
|
+
* Parks the boundary's children (keeps subscriptions alive for recovery)
|
|
40
|
+
* and queues the boundary for re-render with the fallback element.
|
|
41
|
+
* When parked children emit new values (e.g. route change), the boundary resets.
|
|
42
|
+
*/
|
|
43
|
+
export const handleFiberError = (fiber, cause) => Effect.gen(function* () {
|
|
44
|
+
const componentError = toComponentError(cause);
|
|
45
|
+
// Find nearest boundary
|
|
46
|
+
const boundaryOpt = findNearestBoundary(fiber);
|
|
47
|
+
return yield* Option.match(boundaryOpt, {
|
|
48
|
+
onNone: () => Effect.gen(function* () {
|
|
49
|
+
yield* Effect.logError("Unhandled error without any error boundary", componentError);
|
|
50
|
+
return Option.none();
|
|
51
|
+
}),
|
|
52
|
+
onSome: (boundary) => Effect.gen(function* () {
|
|
53
|
+
const cfg = Option.getOrThrow(boundary.boundary);
|
|
54
|
+
cfg.hasError = true;
|
|
55
|
+
cfg.error = Option.some(componentError);
|
|
56
|
+
// Park the boundary's child fiber tree — keep subscriptions alive for recovery.
|
|
57
|
+
// Walk all children and mark them as parked so their scopes aren't closed.
|
|
58
|
+
const parkFiberTree = (f) => {
|
|
59
|
+
f.isParked = true;
|
|
60
|
+
if (Option.isSome(f.child))
|
|
61
|
+
parkFiberTree(f.child.value);
|
|
62
|
+
if (Option.isSome(f.sibling))
|
|
63
|
+
parkFiberTree(f.sibling.value);
|
|
64
|
+
};
|
|
65
|
+
if (Option.isSome(boundary.child)) {
|
|
66
|
+
cfg.parkedFiber = boundary.child;
|
|
67
|
+
parkFiberTree(boundary.child.value);
|
|
68
|
+
}
|
|
69
|
+
// Queue the boundary for re-render — it will show the fallback
|
|
70
|
+
yield* queueFiberForRerender(boundary);
|
|
71
|
+
return Option.none();
|
|
72
|
+
}),
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
/**
|
|
76
|
+
* Called when a stream component's threshold expires before first emission.
|
|
77
|
+
* Parks the fiber and switches the boundary to show fallback.
|
|
78
|
+
*/
|
|
79
|
+
export const handleFiberSuspension = (fiber) => Effect.gen(function* () {
|
|
80
|
+
const boundaryOpt = findNearestSuspenseBoundary(fiber);
|
|
81
|
+
if (Option.isNone(boundaryOpt)) {
|
|
82
|
+
// No Suspense boundary - just continue waiting
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
const boundary = boundaryOpt.value;
|
|
86
|
+
const config = Option.getOrThrow(boundary.suspense);
|
|
87
|
+
if (config.showingFallback) {
|
|
88
|
+
// Already suspended - first suspension wins
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
// Create deferred for parked fiber completion
|
|
92
|
+
const parkedComplete = yield* Deferred.make();
|
|
93
|
+
// Mark fiber as parked - its scope should not be closed on deletion
|
|
94
|
+
fiber.isParked = true;
|
|
95
|
+
// Park the fiber and switch to fallback
|
|
96
|
+
config.showingFallback = true;
|
|
97
|
+
config.parkedFiber = Option.some(fiber);
|
|
98
|
+
config.parkedComplete = Option.some(parkedComplete);
|
|
99
|
+
// Trigger re-render of boundary with fallback
|
|
100
|
+
yield* queueFiberForRerender(boundary);
|
|
101
|
+
});
|
|
102
|
+
/**
|
|
103
|
+
* Called when a parked fiber finally gets its first emission.
|
|
104
|
+
* Signals the boundary to swap back to showing children.
|
|
105
|
+
*/
|
|
106
|
+
export const signalFiberReady = (fiber) => Effect.gen(function* () {
|
|
107
|
+
const boundaryOpt = findNearestSuspenseBoundary(fiber);
|
|
108
|
+
if (Option.isNone(boundaryOpt))
|
|
109
|
+
return;
|
|
110
|
+
const boundary = boundaryOpt.value;
|
|
111
|
+
const config = Option.getOrThrow(boundary.suspense);
|
|
112
|
+
// Unpark the fiber - it's ready now, scope can be closed normally on next deletion
|
|
113
|
+
fiber.isParked = false;
|
|
114
|
+
// Signal that parked fiber is ready
|
|
115
|
+
yield* config.parkedComplete.pipe(Option.map((deferred) => Deferred.succeed(deferred, undefined)), Option.getOrElse(() => Effect.void));
|
|
116
|
+
// Trigger re-render to swap fallback → children
|
|
117
|
+
yield* queueFiberForRerender(boundary);
|
|
118
|
+
});
|
|
119
|
+
/**
|
|
120
|
+
* Called when a parked-under-boundary fiber emits a new value (e.g. route change).
|
|
121
|
+
* Signals the error boundary to reset — unpark children and show new content.
|
|
122
|
+
*/
|
|
123
|
+
export const signalBoundaryRecovery = (fiber) => Effect.gen(function* () {
|
|
124
|
+
// Walk up to find the boundary config (may be on an old/alternate fiber)
|
|
125
|
+
const boundaryOpt = findNearestBoundary(fiber);
|
|
126
|
+
if (Option.isNone(boundaryOpt))
|
|
127
|
+
return;
|
|
128
|
+
const cfg = Option.getOrThrow(boundaryOpt.value.boundary);
|
|
129
|
+
if (!cfg.hasError)
|
|
130
|
+
return;
|
|
131
|
+
// Reset error state
|
|
132
|
+
cfg.hasError = false;
|
|
133
|
+
cfg.error = Option.none();
|
|
134
|
+
// Unpark the entire parked fiber tree
|
|
135
|
+
const unparkFiberTree = (f) => {
|
|
136
|
+
f.isParked = false;
|
|
137
|
+
if (Option.isSome(f.child))
|
|
138
|
+
unparkFiberTree(f.child.value);
|
|
139
|
+
if (Option.isSome(f.sibling))
|
|
140
|
+
unparkFiberTree(f.sibling.value);
|
|
141
|
+
};
|
|
142
|
+
if (Option.isSome(cfg.parkedFiber)) {
|
|
143
|
+
unparkFiberTree(cfg.parkedFiber.value);
|
|
144
|
+
}
|
|
145
|
+
// Use currentFiber ref to queue the ACTIVE boundary fiber (not the stale alternate)
|
|
146
|
+
const currentBoundary = Option.isSome(cfg.currentFiber)
|
|
147
|
+
? cfg.currentFiber.value
|
|
148
|
+
: boundaryOpt.value;
|
|
149
|
+
yield* queueFiberForRerender(currentBoundary);
|
|
150
|
+
});
|
|
151
|
+
//# sourceMappingURL=fiber-boundary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fiber-boundary.js","sourceRoot":"","sources":["../src/fiber-boundary.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
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 type { Fiber } from "./shared.js";
|
|
12
|
+
import { FibraeRuntime } from "./runtime.js";
|
|
13
|
+
export declare const createDom: (fiber: Fiber, runtime: FibraeRuntime) => Effect.Effect<Node, never, never>;
|
|
14
|
+
export declare const isNew: (prev: {
|
|
15
|
+
[key: string]: unknown;
|
|
16
|
+
}, next: {
|
|
17
|
+
[key: string]: unknown;
|
|
18
|
+
}) => (key: string) => boolean;
|
|
19
|
+
export declare const updateDom: (dom: Node, prevProps: {
|
|
20
|
+
[key: string]: unknown;
|
|
21
|
+
}, nextProps: {
|
|
22
|
+
[key: string]: unknown;
|
|
23
|
+
}, ownerFiber: Fiber, runtime: FibraeRuntime) => Effect.Effect<void, never, never>;
|
|
24
|
+
export declare const deleteFiber: (fiber: Fiber) => Effect.Effect<void, never, never>;
|
|
25
|
+
export declare const commitDeletion: (fiber: Fiber, domParent: Node) => Effect.Effect<void, never, never>;
|
|
26
|
+
export declare const commitRoot: (runtime: FibraeRuntime) => Effect.Effect<void, never, FibraeRuntime>;
|
|
27
|
+
export declare const commitWork: (fiber: Fiber, runtime: FibraeRuntime) => Effect.Effect<void, never, FibraeRuntime>;
|
|
@@ -0,0 +1,247 @@
|
|
|
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, SVG_NAMESPACE, SVG_TAGS } 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"
|
|
32
|
+
? document.createTextNode("")
|
|
33
|
+
: SVG_TAGS.has(type)
|
|
34
|
+
? document.createElementNS(SVG_NAMESPACE, type)
|
|
35
|
+
: document.createElement(type);
|
|
36
|
+
return Effect.succeed(node);
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
yield* updateDom(dom, {}, fiber.props, fiber, runtime);
|
|
40
|
+
// Handle ref
|
|
41
|
+
const ref = fiber.props.ref;
|
|
42
|
+
if (ref && typeof ref === "object" && "current" in ref) {
|
|
43
|
+
ref.current = dom;
|
|
44
|
+
}
|
|
45
|
+
return dom;
|
|
46
|
+
});
|
|
47
|
+
// =============================================================================
|
|
48
|
+
// Update DOM
|
|
49
|
+
// =============================================================================
|
|
50
|
+
export const isNew = (prev, next) => (key) => prev[key] !== next[key];
|
|
51
|
+
export const updateDom = (dom, prevProps, nextProps, ownerFiber, runtime) => Effect.gen(function* () {
|
|
52
|
+
const stateRef = runtime.fiberState;
|
|
53
|
+
const element = dom;
|
|
54
|
+
if (element instanceof Text) {
|
|
55
|
+
if (nextProps.nodeValue !== prevProps.nodeValue) {
|
|
56
|
+
const value = nextProps.nodeValue;
|
|
57
|
+
element.nodeValue =
|
|
58
|
+
typeof value === "string" || typeof value === "number" ? String(value) : "";
|
|
59
|
+
}
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
const stateSnapshot = yield* Ref.get(stateRef);
|
|
63
|
+
const el = element;
|
|
64
|
+
const stored = stateSnapshot.listenerStore.get(el) ?? {};
|
|
65
|
+
// Remove old event listeners
|
|
66
|
+
const eventsToRemove = Object.keys(prevProps)
|
|
67
|
+
.filter(isEvent)
|
|
68
|
+
.filter((key) => !(key in nextProps) || isNew(prevProps, nextProps)(key));
|
|
69
|
+
eventsToRemove.forEach((name) => {
|
|
70
|
+
const eventType = name.toLowerCase().substring(2);
|
|
71
|
+
const wrapper = stored[eventType];
|
|
72
|
+
if (wrapper) {
|
|
73
|
+
el.removeEventListener(eventType, wrapper);
|
|
74
|
+
delete stored[eventType];
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
// Remove properties that were in prevProps but not in nextProps
|
|
78
|
+
Object.keys(prevProps)
|
|
79
|
+
.filter(isProperty)
|
|
80
|
+
.filter((key) => !(key in nextProps))
|
|
81
|
+
.forEach((name) => {
|
|
82
|
+
if (el instanceof HTMLElement || el instanceof SVGElement) {
|
|
83
|
+
setDomProperty(el, name, null);
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
// Handle dangerouslySetInnerHTML
|
|
87
|
+
if (nextProps.dangerouslySetInnerHTML != null) {
|
|
88
|
+
if ((el instanceof HTMLElement || el instanceof SVGElement) &&
|
|
89
|
+
nextProps.dangerouslySetInnerHTML !== prevProps.dangerouslySetInnerHTML) {
|
|
90
|
+
el.innerHTML = String(nextProps.dangerouslySetInnerHTML);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// Update changed properties
|
|
94
|
+
Object.keys(nextProps)
|
|
95
|
+
.filter(isProperty)
|
|
96
|
+
.filter(isNew(prevProps, nextProps))
|
|
97
|
+
.forEach((name) => {
|
|
98
|
+
if (el instanceof HTMLElement || el instanceof SVGElement) {
|
|
99
|
+
setDomProperty(el, name, nextProps[name]);
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
// Add new event listeners
|
|
103
|
+
Object.keys(nextProps)
|
|
104
|
+
.filter(isEvent)
|
|
105
|
+
.filter(isNew(prevProps, nextProps))
|
|
106
|
+
.forEach((name) => {
|
|
107
|
+
const eventType = name.toLowerCase().substring(2);
|
|
108
|
+
const handler = nextProps[name];
|
|
109
|
+
const wrapper = createEventWrapper(handler, eventType, runtime, ownerFiber ? (error) => handleFiberError(ownerFiber, error) : undefined);
|
|
110
|
+
const existing = stored[eventType];
|
|
111
|
+
if (existing) {
|
|
112
|
+
el.removeEventListener(eventType, existing);
|
|
113
|
+
}
|
|
114
|
+
el.addEventListener(eventType, wrapper);
|
|
115
|
+
stored[eventType] = wrapper;
|
|
116
|
+
});
|
|
117
|
+
stateSnapshot.listenerStore.set(el, stored);
|
|
118
|
+
});
|
|
119
|
+
// =============================================================================
|
|
120
|
+
// Commit Phase
|
|
121
|
+
// =============================================================================
|
|
122
|
+
export const deleteFiber = (fiber) => Effect.gen(function* () {
|
|
123
|
+
// Close component scope (unless fiber is parked - its scope must stay alive)
|
|
124
|
+
if (!fiber.isParked && Option.isSome(fiber.componentScope)) {
|
|
125
|
+
yield* Scope.close(fiber.componentScope.value, Exit.void);
|
|
126
|
+
}
|
|
127
|
+
// Recursively delete children
|
|
128
|
+
if (Option.isSome(fiber.child)) {
|
|
129
|
+
yield* deleteFiber(fiber.child.value);
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
export const commitDeletion = (fiber, domParent) => Option.match(fiber.dom, {
|
|
133
|
+
onSome: (dom) => Effect.sync(() => {
|
|
134
|
+
domParent.removeChild(dom);
|
|
135
|
+
}),
|
|
136
|
+
onNone: () =>
|
|
137
|
+
// Function component - find DOM children
|
|
138
|
+
Effect.iterate(fiber.child, {
|
|
139
|
+
while: (opt) => Option.isSome(opt),
|
|
140
|
+
body: (childOpt) => Effect.gen(function* () {
|
|
141
|
+
const child = childOpt.value;
|
|
142
|
+
yield* commitDeletion(child, domParent);
|
|
143
|
+
return child.sibling;
|
|
144
|
+
}),
|
|
145
|
+
}),
|
|
146
|
+
});
|
|
147
|
+
export const commitRoot = (runtime) => Effect.gen(function* () {
|
|
148
|
+
const stateRef = runtime.fiberState;
|
|
149
|
+
const currentState = yield* Ref.get(stateRef);
|
|
150
|
+
// Process deletions first
|
|
151
|
+
yield* Effect.forEach(currentState.deletions, (fiber) => Effect.gen(function* () {
|
|
152
|
+
const domParent = findDomParent(fiber);
|
|
153
|
+
if (Option.isSome(domParent)) {
|
|
154
|
+
yield* commitDeletion(fiber, domParent.value);
|
|
155
|
+
}
|
|
156
|
+
yield* deleteFiber(fiber);
|
|
157
|
+
}), { discard: true });
|
|
158
|
+
// Commit work starting from wipRoot.child
|
|
159
|
+
const firstChild = currentState.wipRoot.pipe(Option.flatMap((root) => root.child), Option.getOrUndefined);
|
|
160
|
+
if (firstChild) {
|
|
161
|
+
yield* commitWork(firstChild, runtime);
|
|
162
|
+
}
|
|
163
|
+
// Swap wipRoot to currentRoot
|
|
164
|
+
yield* Ref.update(stateRef, (s) => ({
|
|
165
|
+
...s,
|
|
166
|
+
currentRoot: currentState.wipRoot,
|
|
167
|
+
wipRoot: Option.none(),
|
|
168
|
+
deletions: [],
|
|
169
|
+
}));
|
|
170
|
+
});
|
|
171
|
+
export const commitWork = (fiber, runtime) => Effect.gen(function* () {
|
|
172
|
+
// KEY INSIGHT: If fiber has no DOM (function component), just process children
|
|
173
|
+
if (Option.isNone(fiber.dom)) {
|
|
174
|
+
if (Option.isSome(fiber.child)) {
|
|
175
|
+
yield* commitWork(fiber.child.value, runtime);
|
|
176
|
+
}
|
|
177
|
+
// Signal mounted after subtree commits (for function components)
|
|
178
|
+
yield* Option.match(fiber.mountedDeferred, {
|
|
179
|
+
onNone: () => Effect.void,
|
|
180
|
+
onSome: (deferred) => Effect.gen(function* () {
|
|
181
|
+
const done = yield* Deferred.isDone(deferred);
|
|
182
|
+
if (!done) {
|
|
183
|
+
yield* Deferred.succeed(deferred, undefined);
|
|
184
|
+
}
|
|
185
|
+
}),
|
|
186
|
+
});
|
|
187
|
+
if (Option.isSome(fiber.sibling)) {
|
|
188
|
+
yield* commitWork(fiber.sibling.value, runtime);
|
|
189
|
+
}
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
// Find DOM parent by walking up to nearest fiber with dom
|
|
193
|
+
const domParentOpt = findDomParent(fiber);
|
|
194
|
+
if (Option.isNone(domParentOpt)) {
|
|
195
|
+
// No DOM parent found - continue with children/siblings
|
|
196
|
+
if (Option.isSome(fiber.child)) {
|
|
197
|
+
yield* commitWork(fiber.child.value, runtime);
|
|
198
|
+
}
|
|
199
|
+
if (Option.isSome(fiber.sibling)) {
|
|
200
|
+
yield* commitWork(fiber.sibling.value, runtime);
|
|
201
|
+
}
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
const domParent = domParentOpt.value;
|
|
205
|
+
// Process effect tag
|
|
206
|
+
const tag = fiber.effectTag.pipe(Option.getOrUndefined);
|
|
207
|
+
if (tag === "PLACEMENT") {
|
|
208
|
+
// Append DOM node
|
|
209
|
+
if (Option.isSome(fiber.dom)) {
|
|
210
|
+
domParent.appendChild(fiber.dom.value);
|
|
211
|
+
}
|
|
212
|
+
// Signal first child committed (for Suspense)
|
|
213
|
+
const deferred = fiber.parent.pipe(Option.flatMap((p) => p.childFirstCommitDeferred), Option.getOrUndefined);
|
|
214
|
+
if (deferred) {
|
|
215
|
+
const done = yield* Deferred.isDone(deferred);
|
|
216
|
+
if (!done) {
|
|
217
|
+
yield* Deferred.succeed(deferred, undefined);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
else if (tag === "UPDATE") {
|
|
222
|
+
const prevProps = fiber.alternate.pipe(Option.map((alt) => alt.props), Option.getOrElse(() => ({})));
|
|
223
|
+
if (Option.isSome(fiber.dom)) {
|
|
224
|
+
yield* updateDom(fiber.dom.value, prevProps, fiber.props, fiber, runtime);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
else if (tag === "DELETION") {
|
|
228
|
+
yield* commitDeletion(fiber, domParent);
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
// Continue with children and siblings
|
|
232
|
+
if (Option.isSome(fiber.child)) {
|
|
233
|
+
yield* commitWork(fiber.child.value, runtime);
|
|
234
|
+
}
|
|
235
|
+
// After children are committed, apply deferred properties.
|
|
236
|
+
// <select> value must be set after <option> children exist in the DOM.
|
|
237
|
+
if (Option.isSome(fiber.dom)) {
|
|
238
|
+
const node = fiber.dom.value;
|
|
239
|
+
if (node instanceof HTMLSelectElement && "value" in fiber.props) {
|
|
240
|
+
node.value = String(fiber.props.value);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
if (Option.isSome(fiber.sibling)) {
|
|
244
|
+
yield* commitWork(fiber.sibling.value, runtime);
|
|
245
|
+
}
|
|
246
|
+
});
|
|
247
|
+
//# 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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"}
|
package/dist/fiber-render.d.ts
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Fiber-based rendering
|
|
2
|
+
* Fiber-based rendering — public API and orchestration.
|
|
3
3
|
*
|
|
4
|
-
* This module
|
|
5
|
-
* -
|
|
6
|
-
* -
|
|
7
|
-
* -
|
|
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
|
-
*
|
|
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<
|
|
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<
|
|
35
|
+
export declare const hydrateFiber: (element: VElement, container: HTMLElement) => Effect.Effect<void, never, FibraeRuntime>;
|