fibrae 0.2.3 → 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.
- 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 +13 -0
- package/dist/cli/html.js +101 -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 +27 -29
- package/dist/components.js +32 -52
- 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 +13 -4
- package/dist/dom.js +91 -26
- 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 +243 -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 +515 -0
- package/dist/fiber-update.js.map +1 -0
- package/dist/h.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/jsx-runtime/index.d.ts +253 -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/router/History.d.ts +2 -7
- package/dist/router/History.js +0 -8
- package/dist/router/History.js.map +1 -1
- package/dist/router/Link.d.ts +8 -4
- package/dist/router/Link.js +13 -34
- package/dist/router/Link.js.map +1 -1
- package/dist/router/Navigator.d.ts +12 -1
- package/dist/router/Navigator.js +31 -68
- package/dist/router/Navigator.js.map +1 -1
- package/dist/router/Route.d.ts +16 -3
- package/dist/router/Route.js +32 -25
- package/dist/router/Route.js.map +1 -1
- package/dist/router/Router.d.ts +27 -19
- package/dist/router/Router.js +78 -101
- package/dist/router/Router.js.map +1 -1
- package/dist/router/RouterBuilder.d.ts +106 -34
- package/dist/router/RouterBuilder.js +78 -39
- package/dist/router/RouterBuilder.js.map +1 -1
- package/dist/router/RouterOutlet.d.ts +1 -18
- package/dist/router/RouterOutlet.js +25 -8
- package/dist/router/RouterOutlet.js.map +1 -1
- package/dist/router/RouterState.d.ts +1 -1
- package/dist/router/index.d.ts +5 -5
- package/dist/router/index.js +5 -3
- package/dist/router/index.js.map +1 -1
- 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 +10 -7
- 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 +58 -59
- 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 +32 -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,515 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fiber update and reconciliation functions.
|
|
3
|
+
*
|
|
4
|
+
* Contains the core update logic for function components and host components,
|
|
5
|
+
* the work-loop's performUnitOfWork dispatcher, fiber scope management
|
|
6
|
+
* (resubscribeFiber), atom/live-atom subscription wiring, and key-based
|
|
7
|
+
* child reconciliation. Extracted from fiber-render.ts.
|
|
8
|
+
*/
|
|
9
|
+
import * as Effect from "effect/Effect";
|
|
10
|
+
import * as Stream from "effect/Stream";
|
|
11
|
+
import * as Scope from "effect/Scope";
|
|
12
|
+
import * as Ref from "effect/Ref";
|
|
13
|
+
import * as Exit from "effect/Exit";
|
|
14
|
+
import * as Option from "effect/Option";
|
|
15
|
+
import * as Deferred from "effect/Deferred";
|
|
16
|
+
import * as Context from "effect/Context";
|
|
17
|
+
import * as FiberRef from "effect/FiberRef";
|
|
18
|
+
import * as Cause from "effect/Cause";
|
|
19
|
+
import * as Schema from "effect/Schema";
|
|
20
|
+
import * as RcMap from "effect/RcMap";
|
|
21
|
+
import { Atom, Registry as AtomRegistry, Result } from "@effect-atom/atom";
|
|
22
|
+
import { ComponentScope, StreamError, isStream, } from "./shared.js";
|
|
23
|
+
import { FibraeRuntime } from "./runtime.js";
|
|
24
|
+
import { normalizeToStream, makeTrackingRegistry } from "./tracking.js";
|
|
25
|
+
import {} from "./live/atom.js";
|
|
26
|
+
import { LiveConfig } from "./live/config.js";
|
|
27
|
+
import { createFiber, fiberTypeIs, fiberTypeIsFunction, fiberIsVirtualElement, getComponentScopeOrDie, getComponentScopeService, linkFibersAsSiblings, findNextSibling, getSuspenseThreshold, queueFiberForRerender, } from "./fiber-tree.js";
|
|
28
|
+
import { handleFiberError, handleFiberSuspension, signalFiberReady, signalBoundaryRecovery, } from "./fiber-boundary.js";
|
|
29
|
+
import { createDom } from "./fiber-commit.js";
|
|
30
|
+
// =============================================================================
|
|
31
|
+
// Stream Subscription Helper
|
|
32
|
+
// =============================================================================
|
|
33
|
+
/**
|
|
34
|
+
* Subscribe to a component's output stream, handling first value and subsequent emissions.
|
|
35
|
+
*
|
|
36
|
+
* Returns a deferred that will be completed with the first emitted value.
|
|
37
|
+
* Subsequent emissions update latestStreamValue and queue re-renders.
|
|
38
|
+
* Errors are forwarded to handleFiberError.
|
|
39
|
+
*
|
|
40
|
+
* @param stream - The component's output stream
|
|
41
|
+
* @param fiberRef - Mutable reference to the current fiber (for re-renders after reconciliation)
|
|
42
|
+
* @param scope - Scope to fork the subscription into
|
|
43
|
+
*
|
|
44
|
+
* @typeParam E - Error type for the deferred (use `never` for die mode, stream error type for fail mode)
|
|
45
|
+
*/
|
|
46
|
+
export const subscribeComponentStream = (stream, fiberRef, scope) => Effect.gen(function* () {
|
|
47
|
+
const firstValueDeferred = yield* Deferred.make();
|
|
48
|
+
const subscription = Stream.runForEach(stream, (vElement) => Effect.gen(function* () {
|
|
49
|
+
const done = yield* Deferred.isDone(firstValueDeferred);
|
|
50
|
+
const currentFiber = fiberRef.current;
|
|
51
|
+
if (!done) {
|
|
52
|
+
yield* Deferred.succeed(firstValueDeferred, vElement);
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
// Subsequent emissions - queue re-render
|
|
56
|
+
currentFiber.latestStreamValue = Option.some(vElement);
|
|
57
|
+
if (currentFiber.isParked) {
|
|
58
|
+
// Parked under an error boundary — signal recovery
|
|
59
|
+
yield* signalBoundaryRecovery(currentFiber);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
yield* queueFiberForRerender(currentFiber);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
})).pipe(Effect.catchAllCause((cause) => Effect.gen(function* () {
|
|
66
|
+
const done = yield* Deferred.isDone(firstValueDeferred);
|
|
67
|
+
const streamError = new StreamError({
|
|
68
|
+
cause: Cause.squash(cause),
|
|
69
|
+
phase: done ? "after-first-emission" : "before-first-emission",
|
|
70
|
+
});
|
|
71
|
+
if (!done) {
|
|
72
|
+
// Fail the deferred with StreamError so awaiting code gets the typed error
|
|
73
|
+
yield* Deferred.fail(firstValueDeferred, streamError);
|
|
74
|
+
}
|
|
75
|
+
const currentFiber = fiberRef.current;
|
|
76
|
+
yield* handleFiberError(currentFiber, streamError);
|
|
77
|
+
})));
|
|
78
|
+
yield* Effect.forkIn(subscription, scope);
|
|
79
|
+
return firstValueDeferred;
|
|
80
|
+
});
|
|
81
|
+
// =============================================================================
|
|
82
|
+
// Update Function Component
|
|
83
|
+
// =============================================================================
|
|
84
|
+
export const updateFunctionComponent = (fiber, runtime) => Effect.gen(function* () {
|
|
85
|
+
// Initialize deferred for child first commit signaling
|
|
86
|
+
if (Option.isNone(fiber.childFirstCommitDeferred)) {
|
|
87
|
+
fiber.childFirstCommitDeferred = Option.some(yield* Deferred.make());
|
|
88
|
+
}
|
|
89
|
+
// Capture current context during render phase for event handlers in commit phase
|
|
90
|
+
// This includes services like Navigator, RouterHandlers, etc.
|
|
91
|
+
const currentContext = yield* FiberRef.get(FiberRef.currentContext);
|
|
92
|
+
fiber.renderContext = Option.some(currentContext);
|
|
93
|
+
// Check if we can reuse cached stream value from alternate
|
|
94
|
+
const hasAlternate = Option.isSome(fiber.alternate);
|
|
95
|
+
const hasCachedValue = fiber.alternate.pipe(Option.map((alt) => Option.isSome(alt.latestStreamValue) && alt.isMultiEmissionStream), Option.getOrElse(() => false));
|
|
96
|
+
if (hasAlternate && hasCachedValue) {
|
|
97
|
+
// Reuse cached value from alternate (stream component that emitted multiple values)
|
|
98
|
+
const alt = Option.getOrThrow(fiber.alternate);
|
|
99
|
+
const vElement = Option.getOrThrow(alt.latestStreamValue);
|
|
100
|
+
fiber.latestStreamValue = alt.latestStreamValue;
|
|
101
|
+
fiber.accessedAtoms = alt.accessedAtoms;
|
|
102
|
+
fiber.componentScope = alt.componentScope;
|
|
103
|
+
alt.componentScope = Option.none(); // Transfer ownership
|
|
104
|
+
fiber.fiberRef = alt.fiberRef;
|
|
105
|
+
fiber.fiberRef.pipe(Option.map((ref) => {
|
|
106
|
+
ref.current = fiber;
|
|
107
|
+
}));
|
|
108
|
+
fiber.isMultiEmissionStream = alt.isMultiEmissionStream;
|
|
109
|
+
yield* reconcileChildren(fiber, [vElement]);
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
// Check if this fiber is being restored from parked (suspended) state
|
|
113
|
+
// If so, skip re-execution and use the cached latestStreamValue
|
|
114
|
+
if (fiber.isUnparking && Option.isSome(fiber.latestStreamValue)) {
|
|
115
|
+
fiber.isUnparking = false; // Clear flag
|
|
116
|
+
const vElement = Option.getOrThrow(fiber.latestStreamValue);
|
|
117
|
+
yield* reconcileChildren(fiber, [vElement]);
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
// Create scope for this component FIRST so it's available in context
|
|
121
|
+
yield* resubscribeFiber(fiber);
|
|
122
|
+
const componentScopeService = yield* getComponentScopeService(fiber, "Expected componentScope to be created by resubscribeFiber");
|
|
123
|
+
// Set up atom tracking
|
|
124
|
+
const accessedAtoms = new Set();
|
|
125
|
+
const accessedLiveAtoms = new Set();
|
|
126
|
+
const trackingRegistry = makeTrackingRegistry(runtime.registry, accessedAtoms, accessedLiveAtoms);
|
|
127
|
+
fiber.accessedAtoms = Option.some(accessedAtoms);
|
|
128
|
+
// Build context with tracking registry AND ComponentScope
|
|
129
|
+
// This allows Effect components to yield* ComponentScope for cleanup registration
|
|
130
|
+
const contextWithTracking = Context.add(Context.add(currentContext, ComponentScope, componentScopeService), AtomRegistry.AtomRegistry, trackingRegistry);
|
|
131
|
+
// Invoke the component
|
|
132
|
+
const output = yield* Option.match(fiber.type, {
|
|
133
|
+
onNone: () => Effect.die("updateFunctionComponent called with no type"),
|
|
134
|
+
onSome: (type) => {
|
|
135
|
+
if (typeof type !== "function") {
|
|
136
|
+
return Effect.die("updateFunctionComponent called with non-function type");
|
|
137
|
+
}
|
|
138
|
+
const component = type;
|
|
139
|
+
return Effect.sync(() => component(fiber.props));
|
|
140
|
+
},
|
|
141
|
+
});
|
|
142
|
+
// Fast path: if component returns a plain VElement (not Effect/Stream),
|
|
143
|
+
// and it's a special element type, just reconcile directly without stream machinery.
|
|
144
|
+
// This handles wrapper components like Suspense and ErrorBoundary efficiently.
|
|
145
|
+
if (!Effect.isEffect(output) && !isStream(output)) {
|
|
146
|
+
const vElement = output;
|
|
147
|
+
if (typeof vElement === "object" && vElement !== null && "type" in vElement) {
|
|
148
|
+
const elementType = vElement.type;
|
|
149
|
+
if (elementType === "SUSPENSE" || elementType === "FRAGMENT") {
|
|
150
|
+
// Simple wrapper component - just reconcile with the VElement directly
|
|
151
|
+
yield* reconcileChildren(fiber, [vElement]);
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
// Check if it's a multi-emission stream
|
|
157
|
+
fiber.isMultiEmissionStream = isStream(output);
|
|
158
|
+
// Normalize to stream and provide context
|
|
159
|
+
const stream = normalizeToStream(output).pipe(Stream.provideContext(contextWithTracking));
|
|
160
|
+
// Set up fiber ref for stream subscriptions
|
|
161
|
+
const fiberRef = fiber.fiberRef.pipe(Option.getOrElse(() => ({ current: fiber })));
|
|
162
|
+
fiber.fiberRef = Option.some(fiberRef);
|
|
163
|
+
// Subscribe to component stream - errors become defects via "die" mode
|
|
164
|
+
const firstValueDeferred = yield* subscribeComponentStream(stream, fiberRef, componentScopeService.scope);
|
|
165
|
+
// Get threshold from nearest Suspense boundary
|
|
166
|
+
const threshold = getSuspenseThreshold(fiber);
|
|
167
|
+
if (threshold > 0) {
|
|
168
|
+
// Race first value vs threshold
|
|
169
|
+
const result = yield* Effect.race(Deferred.await(firstValueDeferred).pipe(Effect.map((v) => ({ _tag: "value", value: v }))), Effect.sleep(`${threshold} millis`).pipe(Effect.map(() => ({ _tag: "timeout" }))));
|
|
170
|
+
if (result._tag === "timeout") {
|
|
171
|
+
// Threshold expired - signal suspension to boundary
|
|
172
|
+
yield* handleFiberSuspension(fiber);
|
|
173
|
+
// Fork background work: wait for value, then signal ready
|
|
174
|
+
// This allows the render loop to continue and show fallback
|
|
175
|
+
yield* Effect.forkIn(Effect.gen(function* () {
|
|
176
|
+
const value = yield* Deferred.await(firstValueDeferred);
|
|
177
|
+
const currentFiber = fiberRef.current;
|
|
178
|
+
currentFiber.latestStreamValue = Option.some(value);
|
|
179
|
+
yield* signalFiberReady(currentFiber);
|
|
180
|
+
}), componentScopeService.scope);
|
|
181
|
+
// Return early - don't reconcile children yet
|
|
182
|
+
// The Suspense boundary will show fallback via queued re-render
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
// Value arrived before threshold - no suspension
|
|
187
|
+
fiber.latestStreamValue = Option.some(result.value);
|
|
188
|
+
yield* reconcileChildren(fiber, [result.value]);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
// No threshold (0) - wait indefinitely, no suspension possible
|
|
193
|
+
const firstVElement = yield* Deferred.await(firstValueDeferred);
|
|
194
|
+
fiber.latestStreamValue = Option.some(firstVElement);
|
|
195
|
+
yield* reconcileChildren(fiber, [firstVElement]);
|
|
196
|
+
}
|
|
197
|
+
// Subscribe to atom changes
|
|
198
|
+
yield* subscribeFiberAtoms(fiber, accessedAtoms, runtime);
|
|
199
|
+
// Activate SSE connections for any live atoms
|
|
200
|
+
if (accessedLiveAtoms.size > 0) {
|
|
201
|
+
yield* activateLiveAtoms(accessedLiveAtoms, currentContext, runtime, componentScopeService.scope);
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
// =============================================================================
|
|
205
|
+
// Perform Unit of Work
|
|
206
|
+
// =============================================================================
|
|
207
|
+
export const performUnitOfWork = (fiber, runtime) => Effect.gen(function* () {
|
|
208
|
+
const isFunctionComponent = fiberTypeIsFunction(fiber);
|
|
209
|
+
const eff = isFunctionComponent
|
|
210
|
+
? updateFunctionComponent(fiber, runtime)
|
|
211
|
+
: updateHostComponent(fiber, runtime);
|
|
212
|
+
const exited = yield* Effect.exit(eff);
|
|
213
|
+
if (Exit.isFailure(exited)) {
|
|
214
|
+
// handleFiberError returns the next fiber to process (if recovery happened)
|
|
215
|
+
return yield* handleFiberError(fiber, exited.cause);
|
|
216
|
+
}
|
|
217
|
+
// Return next unit of work: child → sibling → uncle (walk up to find sibling)
|
|
218
|
+
return fiber.child.pipe(Option.orElse(() => findNextSibling(fiber)));
|
|
219
|
+
});
|
|
220
|
+
// =============================================================================
|
|
221
|
+
// Atom Subscription
|
|
222
|
+
// =============================================================================
|
|
223
|
+
export const resubscribeFiber = (fiber) => Effect.gen(function* () {
|
|
224
|
+
// Close old scope if exists
|
|
225
|
+
yield* Option.match(fiber.componentScope, {
|
|
226
|
+
onNone: () => Effect.void,
|
|
227
|
+
onSome: (scope) => Scope.close(scope, Exit.void),
|
|
228
|
+
});
|
|
229
|
+
// Create new scope and mounted deferred
|
|
230
|
+
const newScope = yield* Scope.make();
|
|
231
|
+
const newMounted = yield* Deferred.make();
|
|
232
|
+
fiber.componentScope = Option.some(newScope);
|
|
233
|
+
fiber.mountedDeferred = Option.some(newMounted);
|
|
234
|
+
});
|
|
235
|
+
export const subscribeFiberAtoms = (fiber, accessedAtoms, runtime) => Effect.gen(function* () {
|
|
236
|
+
const scope = yield* getComponentScopeOrDie(fiber, "subscribeFiberAtoms requires an existing componentScope");
|
|
237
|
+
// Use registry.subscribe directly — simpler and more efficient than
|
|
238
|
+
// toStream + drop(1) + runForEach. Cleanup via scope finalizers.
|
|
239
|
+
// unsafeOffer is synchronous, no need for runForkWithRuntime.
|
|
240
|
+
yield* Effect.forEach(accessedAtoms, (atom) => Effect.gen(function* () {
|
|
241
|
+
const unsubscribe = runtime.registry.subscribe(atom, () => {
|
|
242
|
+
runtime.renderMailbox.unsafeOffer(fiber);
|
|
243
|
+
});
|
|
244
|
+
yield* Scope.addFinalizer(scope, Effect.sync(unsubscribe));
|
|
245
|
+
}), { discard: true });
|
|
246
|
+
});
|
|
247
|
+
// =============================================================================
|
|
248
|
+
// Live Atom SSE Activation
|
|
249
|
+
// =============================================================================
|
|
250
|
+
/**
|
|
251
|
+
* Activate SSE connections for live atoms using the runtime's RcMap.
|
|
252
|
+
*
|
|
253
|
+
* EventSources are shared by URL via RcMap — ref-counted and automatically
|
|
254
|
+
* closed when the last consumer's scope closes. Each atom adds its own
|
|
255
|
+
* listener to the shared EventSource.
|
|
256
|
+
*/
|
|
257
|
+
export const activateLiveAtoms = (liveAtoms, currentContext, runtime, scope) => {
|
|
258
|
+
// Skip on server
|
|
259
|
+
if (typeof window === "undefined")
|
|
260
|
+
return Effect.void;
|
|
261
|
+
// Try to get LiveConfig from context
|
|
262
|
+
const configOption = Context.getOption(currentContext, LiveConfig);
|
|
263
|
+
if (Option.isNone(configOption))
|
|
264
|
+
return Effect.void;
|
|
265
|
+
const config = configOption.value;
|
|
266
|
+
return Effect.gen(function* () {
|
|
267
|
+
// Ensure withCredentials is set before any RcMap lookups create EventSources
|
|
268
|
+
yield* Ref.set(runtime.sseWithCredentials, config.withCredentials ?? false);
|
|
269
|
+
yield* Effect.forEach(liveAtoms, (atom) => Effect.gen(function* () {
|
|
270
|
+
const url = LiveConfig.resolve(config, atom._live.event);
|
|
271
|
+
const decode = Schema.decodeUnknownSync(Schema.parseJson(atom._live.schema));
|
|
272
|
+
// Get shared EventSource for this URL (ref-counted via RcMap).
|
|
273
|
+
// Scope.extend binds the reference to the component scope —
|
|
274
|
+
// when the component unmounts, the ref count decrements.
|
|
275
|
+
const es = yield* RcMap.get(runtime.sseConnections, url).pipe(Scope.extend(scope));
|
|
276
|
+
const handler = (e) => {
|
|
277
|
+
try {
|
|
278
|
+
runtime.registry.set(atom, Result.success(decode(e.data)));
|
|
279
|
+
}
|
|
280
|
+
catch {
|
|
281
|
+
// Decode errors silently skipped
|
|
282
|
+
}
|
|
283
|
+
};
|
|
284
|
+
es.addEventListener(atom._live.event, handler);
|
|
285
|
+
// Clean up this atom's listener when the component unmounts
|
|
286
|
+
yield* Scope.addFinalizer(scope, Effect.sync(() => es.removeEventListener(atom._live.event, handler)));
|
|
287
|
+
}), { discard: true });
|
|
288
|
+
});
|
|
289
|
+
};
|
|
290
|
+
// =============================================================================
|
|
291
|
+
// Update Host Component
|
|
292
|
+
// =============================================================================
|
|
293
|
+
export const updateHostComponent = (fiber, runtime) => Effect.gen(function* () {
|
|
294
|
+
// Inherit renderContext from parent fiber (function components capture it during render)
|
|
295
|
+
// This propagates Navigator, RouterHandlers, etc. down to host elements for event handlers
|
|
296
|
+
if (Option.isNone(fiber.renderContext) && Option.isSome(fiber.parent)) {
|
|
297
|
+
fiber.renderContext = fiber.parent.value.renderContext;
|
|
298
|
+
}
|
|
299
|
+
// Handle BOUNDARY specially (Effect-native error boundary API)
|
|
300
|
+
const isBoundary = fiberTypeIs(fiber, "BOUNDARY");
|
|
301
|
+
if (isBoundary) {
|
|
302
|
+
const boundaryId = fiber.props.boundaryId;
|
|
303
|
+
const fallbackFn = fiber.props.fallback;
|
|
304
|
+
// Inherit boundary state from alternate (previous render) if present
|
|
305
|
+
// This preserves hasError state across re-renders
|
|
306
|
+
if (Option.isNone(fiber.boundary) && Option.isSome(fiber.alternate)) {
|
|
307
|
+
const alt = fiber.alternate.value;
|
|
308
|
+
if (Option.isSome(alt.boundary)) {
|
|
309
|
+
fiber.boundary = alt.boundary;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
// Initialize boundary config if not already set
|
|
313
|
+
if (Option.isNone(fiber.boundary)) {
|
|
314
|
+
fiber.boundary = Option.some({
|
|
315
|
+
boundaryId,
|
|
316
|
+
fallback: fallbackFn,
|
|
317
|
+
hasError: false,
|
|
318
|
+
error: Option.none(),
|
|
319
|
+
parkedFiber: Option.none(),
|
|
320
|
+
currentFiber: Option.none(),
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
const cfg = Option.getOrThrow(fiber.boundary);
|
|
324
|
+
// Always update the current fiber reference (survives alternate swaps)
|
|
325
|
+
cfg.currentFiber = Option.some(fiber);
|
|
326
|
+
if (cfg.hasError && Option.isSome(cfg.error)) {
|
|
327
|
+
// Error state — render fallback, children are parked
|
|
328
|
+
const fallbackElement = cfg.fallback(cfg.error.value);
|
|
329
|
+
yield* reconcileChildren(fiber, [fallbackElement]);
|
|
330
|
+
}
|
|
331
|
+
else if (Option.isSome(cfg.parkedFiber)) {
|
|
332
|
+
// Recovering from error — close parked scopes and re-create children fresh.
|
|
333
|
+
// The parked tree served only to keep the stream subscription alive long enough
|
|
334
|
+
// to detect the next emission (route change). Now we rebuild from scratch.
|
|
335
|
+
const closeParkedTree = (f) => Effect.gen(function* () {
|
|
336
|
+
f.isParked = false;
|
|
337
|
+
if (Option.isSome(f.componentScope)) {
|
|
338
|
+
yield* Scope.close(f.componentScope.value, Exit.void);
|
|
339
|
+
}
|
|
340
|
+
if (Option.isSome(f.child))
|
|
341
|
+
yield* closeParkedTree(f.child.value);
|
|
342
|
+
if (Option.isSome(f.sibling))
|
|
343
|
+
yield* closeParkedTree(f.sibling.value);
|
|
344
|
+
});
|
|
345
|
+
yield* closeParkedTree(cfg.parkedFiber.value);
|
|
346
|
+
cfg.parkedFiber = Option.none();
|
|
347
|
+
// Re-create children from the original props
|
|
348
|
+
const children = fiber.props.children;
|
|
349
|
+
yield* reconcileChildren(fiber, children || []);
|
|
350
|
+
}
|
|
351
|
+
else {
|
|
352
|
+
// Normal rendering — show children
|
|
353
|
+
const children = fiber.props.children;
|
|
354
|
+
yield* reconcileChildren(fiber, children || []);
|
|
355
|
+
}
|
|
356
|
+
return;
|
|
357
|
+
}
|
|
358
|
+
// Handle SUSPENSE specially
|
|
359
|
+
const isSuspense = fiberTypeIs(fiber, "SUSPENSE");
|
|
360
|
+
if (isSuspense) {
|
|
361
|
+
const fallback = fiber.props.fallback;
|
|
362
|
+
const threshold = fiber.props.threshold ?? 100;
|
|
363
|
+
const children = fiber.props.children;
|
|
364
|
+
// Initialize suspense config if not already set
|
|
365
|
+
if (Option.isNone(fiber.suspense)) {
|
|
366
|
+
fiber.suspense = Option.some({
|
|
367
|
+
fallback,
|
|
368
|
+
threshold,
|
|
369
|
+
showingFallback: false,
|
|
370
|
+
parkedFiber: Option.none(),
|
|
371
|
+
parkedComplete: Option.none(),
|
|
372
|
+
});
|
|
373
|
+
}
|
|
374
|
+
const config = Option.getOrThrow(fiber.suspense);
|
|
375
|
+
// Check if parked fiber has completed (signaled via signalFiberReady)
|
|
376
|
+
const parkedDone = yield* config.parkedComplete.pipe(Option.map((d) => Deferred.isDone(d)), Option.getOrElse(() => Effect.succeed(false)));
|
|
377
|
+
if (parkedDone && config.showingFallback) {
|
|
378
|
+
// Parked fiber is ready - switch back to showing its content
|
|
379
|
+
config.showingFallback = false;
|
|
380
|
+
// Mark the fallback child from alternate (previous render) for deletion
|
|
381
|
+
// The fallback fiber is in the alternate's child, not the current fiber's child
|
|
382
|
+
yield* Option.match(fiber.alternate, {
|
|
383
|
+
onNone: () => Effect.void,
|
|
384
|
+
onSome: (alt) => Option.match(alt.child, {
|
|
385
|
+
onNone: () => Effect.void,
|
|
386
|
+
onSome: (fallbackChild) => Effect.gen(function* () {
|
|
387
|
+
fallbackChild.effectTag = Option.some("DELETION");
|
|
388
|
+
yield* Ref.update(runtime.fiberState, (s) => ({
|
|
389
|
+
...s,
|
|
390
|
+
deletions: [...s.deletions, fallbackChild],
|
|
391
|
+
}));
|
|
392
|
+
}),
|
|
393
|
+
}),
|
|
394
|
+
});
|
|
395
|
+
// Reuse the parked fiber directly - it already has latestStreamValue
|
|
396
|
+
const parkedFiber = Option.getOrThrow(config.parkedFiber);
|
|
397
|
+
// Re-parent the parked fiber under this suspense boundary
|
|
398
|
+
parkedFiber.parent = Option.some(fiber);
|
|
399
|
+
parkedFiber.sibling = Option.none();
|
|
400
|
+
parkedFiber.effectTag = Option.some("PLACEMENT");
|
|
401
|
+
// Mark as unparking - this tells updateFunctionComponent to skip re-execution
|
|
402
|
+
parkedFiber.isUnparking = true;
|
|
403
|
+
// Set as child of this boundary
|
|
404
|
+
fiber.child = Option.some(parkedFiber);
|
|
405
|
+
// Clear parked state
|
|
406
|
+
config.parkedFiber = Option.none();
|
|
407
|
+
config.parkedComplete = Option.none();
|
|
408
|
+
// Don't reconcile here - let performUnitOfWork handle it
|
|
409
|
+
// The work loop will process parkedFiber next, and updateFunctionComponent
|
|
410
|
+
// will see isUnparking=true and use the cached latestStreamValue
|
|
411
|
+
return;
|
|
412
|
+
}
|
|
413
|
+
if (config.showingFallback) {
|
|
414
|
+
// Show fallback while children are suspended
|
|
415
|
+
yield* reconcileChildren(fiber, [fallback]);
|
|
416
|
+
}
|
|
417
|
+
else {
|
|
418
|
+
// Show children normally (they'll race against threshold in updateFunctionComponent)
|
|
419
|
+
yield* reconcileChildren(fiber, children || []);
|
|
420
|
+
}
|
|
421
|
+
return;
|
|
422
|
+
}
|
|
423
|
+
// Virtual element types don't create DOM - just reconcile children
|
|
424
|
+
const isVirtualElement = fiberIsVirtualElement(fiber);
|
|
425
|
+
if (!isVirtualElement && Option.isNone(fiber.dom)) {
|
|
426
|
+
fiber.dom = Option.some(yield* createDom(fiber, runtime));
|
|
427
|
+
}
|
|
428
|
+
const children = fiber.props.children;
|
|
429
|
+
yield* reconcileChildren(fiber, children || []);
|
|
430
|
+
});
|
|
431
|
+
// =============================================================================
|
|
432
|
+
// Reconcile Children (key-based diffing)
|
|
433
|
+
// =============================================================================
|
|
434
|
+
export const reconcileChildren = (wipFiber, elements) => Effect.gen(function* () {
|
|
435
|
+
const runtime = yield* FibraeRuntime;
|
|
436
|
+
const stateRef = runtime.fiberState;
|
|
437
|
+
// Collect old children from alternate by walking the sibling chain
|
|
438
|
+
const collectSiblings = (start) => {
|
|
439
|
+
const result = [];
|
|
440
|
+
let current = start;
|
|
441
|
+
while (Option.isSome(current)) {
|
|
442
|
+
result.push(current.value);
|
|
443
|
+
current = current.value.sibling;
|
|
444
|
+
}
|
|
445
|
+
return result;
|
|
446
|
+
};
|
|
447
|
+
const oldChildren = wipFiber.alternate.pipe(Option.map((alt) => collectSiblings(alt.child)), Option.getOrElse(() => []));
|
|
448
|
+
const getKey = (props) => Option.fromNullable(props?.key);
|
|
449
|
+
// Build maps for keyed and unkeyed old fibers
|
|
450
|
+
const { keyed: oldByKey, unkeyed: oldUnkeyed } = oldChildren.reduce((acc, f) => {
|
|
451
|
+
Option.match(getKey(f.props), {
|
|
452
|
+
onNone: () => acc.unkeyed.push(f),
|
|
453
|
+
onSome: (key) => acc.keyed.set(key, f),
|
|
454
|
+
});
|
|
455
|
+
return acc;
|
|
456
|
+
}, { keyed: new Map(), unkeyed: [] });
|
|
457
|
+
// Match each element against old fibers by key, then by type
|
|
458
|
+
const matchOldFiber = (element) => {
|
|
459
|
+
// Try keyed match first
|
|
460
|
+
const keyMatch = getKey(element.props).pipe(Option.flatMap((key) => {
|
|
461
|
+
const found = Option.fromNullable(oldByKey.get(key));
|
|
462
|
+
found.pipe(Option.map(() => oldByKey.delete(key)));
|
|
463
|
+
return found;
|
|
464
|
+
}));
|
|
465
|
+
if (Option.isSome(keyMatch))
|
|
466
|
+
return keyMatch;
|
|
467
|
+
// Fall back to type matching for unkeyed elements
|
|
468
|
+
const idx = oldUnkeyed.findIndex((f) => f.type.pipe(Option.map((fType) => fType === element.type), Option.getOrElse(() => false)));
|
|
469
|
+
if (idx >= 0) {
|
|
470
|
+
const matched = oldUnkeyed[idx];
|
|
471
|
+
oldUnkeyed.splice(idx, 1);
|
|
472
|
+
return Option.some(matched);
|
|
473
|
+
}
|
|
474
|
+
return Option.none();
|
|
475
|
+
};
|
|
476
|
+
// Reconcile each element against its matched old fiber
|
|
477
|
+
const newFibers = yield* Effect.forEach(elements, (element) => {
|
|
478
|
+
const matchedOldOpt = matchOldFiber(element);
|
|
479
|
+
return matchedOldOpt.pipe(Option.match({
|
|
480
|
+
onNone: () => Effect.succeed(createFiber(Option.some(element.type), element.props, Option.some(wipFiber), Option.none(), Option.some("PLACEMENT"))),
|
|
481
|
+
onSome: (matched) => Effect.gen(function* () {
|
|
482
|
+
const typeMatches = matched.type.pipe(Option.map((mType) => mType === element.type), Option.getOrElse(() => false));
|
|
483
|
+
if (typeMatches) {
|
|
484
|
+
// UPDATE - reuse DOM, update props
|
|
485
|
+
const fiber = createFiber(matched.type, element.props, Option.some(wipFiber), matchedOldOpt, Option.some("UPDATE"));
|
|
486
|
+
fiber.dom = matched.dom;
|
|
487
|
+
fiber.boundary = matched.boundary;
|
|
488
|
+
fiber.suspense = matched.suspense;
|
|
489
|
+
return fiber;
|
|
490
|
+
}
|
|
491
|
+
else {
|
|
492
|
+
// Type changed - delete old, create new
|
|
493
|
+
matched.effectTag = Option.some("DELETION");
|
|
494
|
+
yield* Ref.update(stateRef, (s) => ({
|
|
495
|
+
...s,
|
|
496
|
+
deletions: [...s.deletions, matched],
|
|
497
|
+
}));
|
|
498
|
+
return createFiber(Option.some(element.type), element.props, Option.some(wipFiber), Option.none(), Option.some("PLACEMENT"));
|
|
499
|
+
}
|
|
500
|
+
}),
|
|
501
|
+
}));
|
|
502
|
+
});
|
|
503
|
+
// Mark leftover old fibers for deletion
|
|
504
|
+
const leftovers = [...oldByKey.values(), ...oldUnkeyed];
|
|
505
|
+
yield* Effect.forEach(leftovers, (leftover) => Effect.gen(function* () {
|
|
506
|
+
leftover.effectTag = Option.some("DELETION");
|
|
507
|
+
yield* Ref.update(stateRef, (s) => ({
|
|
508
|
+
...s,
|
|
509
|
+
deletions: [...s.deletions, leftover],
|
|
510
|
+
}));
|
|
511
|
+
}), { discard: true });
|
|
512
|
+
// Link new fibers as child/sibling chain
|
|
513
|
+
linkFibersAsSiblings(newFibers, wipFiber);
|
|
514
|
+
});
|
|
515
|
+
//# sourceMappingURL=fiber-update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fiber-update.js","sourceRoot":"","sources":["../src/fiber-update.ts"],"names":[],"mappings":"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"}
|
package/dist/h.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"h.js","sourceRoot":"","sources":["../src/h.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"h.js","sourceRoot":"","sources":["../src/h.ts"],"names":[],"mappings":"AAAA,OAAO,EAMN,MAAM,aAAa,CAAC;AAErB,gFAAgF;AAChF,mBAAmB;AACnB,gFAAgF;AAEhF;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,IAAY,EAAY,EAAE,CAAC,CAAC;IAC5D,IAAI,EAAE,cAAc;IACpB,KAAK,EAAE;QACL,SAAS,EAAE,IAAI;QACf,QAAQ,EAAE,EAAE;KACb;CACF,CAAC,CAAC;AAeH,MAAM,UAAU,CAAC,CACf,IAAoB,EACpB,KAAK,GAA+B,EAAE,EACtC,QAAQ,GAAa,EAAE;IAEvB,OAAO;QACL,IAAI,EAAE,IAAmB;QACzB,KAAK,EAAE;YACL,GAAG,KAAK;YACR,QAAQ,EAAE,QAAQ;iBACf,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,CAAC;iBAC3E,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;gBACb,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;oBACvD,OAAO,KAAiB,CAAC;gBAC3B,CAAC;gBACD,gEAAgE;gBAChE,OAAO,iBAAiB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAC1C,CAAC,CAAC;SACL;KACF,CAAC;AACJ,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ export { Suspense, ErrorBoundary } from "./components.js";
|
|
|
4
4
|
export { h, createTextElement } from "./h.js";
|
|
5
5
|
export type { VElement, ElementType, Primitive } from "./shared.js";
|
|
6
6
|
export type { VElement as VNode } from "./shared.js";
|
|
7
|
-
export { RenderError, StreamError, EventHandlerError, type ComponentError
|
|
7
|
+
export { RenderError, StreamError, EventHandlerError, type ComponentError } from "./shared.js";
|
|
8
8
|
export { ComponentScope } from "./shared.js";
|
|
9
9
|
export { HydrationState, HydrationStateLive, HydrationStateEmpty } from "./hydration-state.js";
|
|
10
10
|
export { Atom, Registry as AtomRegistry, Result } from "@effect-atom/atom";
|
package/dist/index.js
CHANGED
|
@@ -10,7 +10,7 @@ export { Suspense, ErrorBoundary } from "./components.js";
|
|
|
10
10
|
// Element creation (JSX factory)
|
|
11
11
|
export { h, createTextElement } from "./h.js";
|
|
12
12
|
// Error types
|
|
13
|
-
export { RenderError, StreamError, EventHandlerError
|
|
13
|
+
export { RenderError, StreamError, EventHandlerError } from "./shared.js";
|
|
14
14
|
// Component lifecycle
|
|
15
15
|
export { ComponentScope } from "./shared.js";
|
|
16
16
|
// Hydration state service
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,aAAa;AACb,gFAAgF;AAEhF,uBAAuB;AACvB,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAEnC,UAAU;AACV,OAAO,EAAE,aAAa,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAEtE,sBAAsB;AACtB,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAE1D,iCAAiC;AACjC,OAAO,EAAE,CAAC,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAM9C,cAAc;AACd,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,aAAa;AACb,gFAAgF;AAEhF,uBAAuB;AACvB,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAEnC,UAAU;AACV,OAAO,EAAE,aAAa,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAEtE,sBAAsB;AACtB,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAE1D,iCAAiC;AACjC,OAAO,EAAE,CAAC,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAM9C,cAAc;AACd,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,iBAAiB,EAAuB,MAAM,aAAa,CAAC;AAE/F,sBAAsB;AACtB,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,0BAA0B;AAC1B,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE/F,oDAAoD;AACpD,OAAO,EAAE,IAAI,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3E,8CAA8C"}
|