@fictjs/runtime 0.2.3 → 0.4.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/advanced.cjs +10 -8
- package/dist/advanced.cjs.map +1 -1
- package/dist/advanced.d.cts +8 -16
- package/dist/advanced.d.ts +8 -16
- package/dist/advanced.js +5 -3
- package/dist/advanced.js.map +1 -1
- package/dist/{chunk-2U6M3LKS.cjs → chunk-ID3WBWNO.cjs} +452 -219
- package/dist/chunk-ID3WBWNO.cjs.map +1 -0
- package/dist/{chunk-5YTFFAVU.cjs → chunk-L4DIV3RC.cjs} +7 -7
- package/dist/{chunk-5YTFFAVU.cjs.map → chunk-L4DIV3RC.cjs.map} +1 -1
- package/dist/{chunk-W525IQWC.cjs → chunk-M2TSXZ4C.cjs} +16 -16
- package/dist/{chunk-W525IQWC.cjs.map → chunk-M2TSXZ4C.cjs.map} +1 -1
- package/dist/{chunk-YVDWXY44.js → chunk-SO6X7G5S.js} +450 -217
- package/dist/chunk-SO6X7G5S.js.map +1 -0
- package/dist/{chunk-UHXUEGQH.js → chunk-TWELIZRY.js} +2 -2
- package/dist/{chunk-3WD7QD5G.js → chunk-XLIZJMMJ.js} +2 -2
- package/dist/{context-9gFXOdJl.d.cts → context-B25xyQrJ.d.cts} +36 -2
- package/dist/{context-4woHo7-L.d.ts → context-CGdP7_Jb.d.ts} +36 -2
- package/dist/{effect-ClARNUCc.d.cts → effect-D6kaLM2-.d.cts} +80 -1
- package/dist/{effect-ClARNUCc.d.ts → effect-D6kaLM2-.d.ts} +80 -1
- package/dist/index.cjs +40 -38
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.dev.js +322 -145
- package/dist/index.dev.js.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/internal.cjs +39 -35
- package/dist/internal.cjs.map +1 -1
- package/dist/internal.d.cts +8 -6
- package/dist/internal.d.ts +8 -6
- package/dist/internal.js +7 -3
- package/dist/internal.js.map +1 -1
- package/dist/{props-DAyeRPwH.d.ts → props-BEgIVMRx.d.ts} +8 -15
- package/dist/{props-CBwuh35e.d.cts → props-BIfromL0.d.cts} +8 -15
- package/dist/scope-Cx_3CjIZ.d.cts +18 -0
- package/dist/scope-CzNkn587.d.ts +18 -0
- package/package.json +3 -3
- package/src/advanced.ts +1 -0
- package/src/binding.ts +30 -4
- package/src/constants.ts +5 -0
- package/src/cycle-guard.ts +59 -7
- package/src/devtools.ts +22 -2
- package/src/dom.ts +84 -10
- package/src/hooks.ts +60 -13
- package/src/index.ts +3 -1
- package/src/internal.ts +2 -2
- package/src/lifecycle.ts +13 -5
- package/src/memo.ts +3 -4
- package/src/props.ts +16 -0
- package/src/signal.ts +204 -36
- package/dist/chunk-2U6M3LKS.cjs.map +0 -1
- package/dist/chunk-YVDWXY44.js.map +0 -1
- package/dist/scope-DvgMquEy.d.ts +0 -55
- package/dist/scope-xmdo6lVU.d.cts +0 -55
- /package/dist/{chunk-UHXUEGQH.js.map → chunk-TWELIZRY.js.map} +0 -0
- /package/dist/{chunk-3WD7QD5G.js.map → chunk-XLIZJMMJ.js.map} +0 -0
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
isReactive,
|
|
5
5
|
onCleanup,
|
|
6
6
|
registerRootCleanup
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-SO6X7G5S.js";
|
|
8
8
|
|
|
9
9
|
// src/scope.ts
|
|
10
10
|
function createScope() {
|
|
@@ -42,4 +42,4 @@ export {
|
|
|
42
42
|
createScope,
|
|
43
43
|
runInScope
|
|
44
44
|
};
|
|
45
|
-
//# sourceMappingURL=chunk-
|
|
45
|
+
//# sourceMappingURL=chunk-TWELIZRY.js.map
|
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
pushRoot,
|
|
11
11
|
removeNodes,
|
|
12
12
|
toNodeArray
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-SO6X7G5S.js";
|
|
14
14
|
|
|
15
15
|
// src/context.ts
|
|
16
16
|
var contextStorage = /* @__PURE__ */ new WeakMap();
|
|
@@ -106,4 +106,4 @@ export {
|
|
|
106
106
|
useContext,
|
|
107
107
|
hasContext
|
|
108
108
|
};
|
|
109
|
-
//# sourceMappingURL=chunk-
|
|
109
|
+
//# sourceMappingURL=chunk-XLIZJMMJ.js.map
|
|
@@ -1,4 +1,38 @@
|
|
|
1
|
-
import { B as BaseProps, F as FictNode } from './effect-
|
|
1
|
+
import { B as BaseProps, F as FictNode } from './effect-D6kaLM2-.cjs';
|
|
2
|
+
|
|
3
|
+
interface FictDevtoolsHook {
|
|
4
|
+
registerSignal: (id: number, value: unknown, options?: {
|
|
5
|
+
name?: string;
|
|
6
|
+
source?: string;
|
|
7
|
+
ownerId?: number;
|
|
8
|
+
}) => void;
|
|
9
|
+
updateSignal: (id: number, value: unknown) => void;
|
|
10
|
+
registerComputed: (id: number, value: unknown, options?: {
|
|
11
|
+
name?: string;
|
|
12
|
+
source?: string;
|
|
13
|
+
ownerId?: number;
|
|
14
|
+
hasValue?: boolean;
|
|
15
|
+
}) => void;
|
|
16
|
+
updateComputed: (id: number, value: unknown) => void;
|
|
17
|
+
registerEffect: (id: number, options?: {
|
|
18
|
+
ownerId?: number;
|
|
19
|
+
source?: string;
|
|
20
|
+
}) => void;
|
|
21
|
+
effectRun: (id: number) => void;
|
|
22
|
+
/** Track a dependency relationship between subscriber and dependency */
|
|
23
|
+
trackDependency?: (subscriberId: number, dependencyId: number) => void;
|
|
24
|
+
/** Remove a dependency relationship when unlinked */
|
|
25
|
+
untrackDependency?: (subscriberId: number, dependencyId: number) => void;
|
|
26
|
+
cycleDetected?: (payload: {
|
|
27
|
+
reason: string;
|
|
28
|
+
detail?: Record<string, unknown>;
|
|
29
|
+
}) => void;
|
|
30
|
+
registerComponent?: (id: number, name: string, parentId?: number, source?: any) => void;
|
|
31
|
+
componentMount?: (id: number, elements?: HTMLElement[]) => void;
|
|
32
|
+
componentUnmount?: (id: number) => void;
|
|
33
|
+
componentRender?: (id: number) => void;
|
|
34
|
+
}
|
|
35
|
+
declare function getDevtoolsHook(): FictDevtoolsHook | undefined;
|
|
2
36
|
|
|
3
37
|
/**
|
|
4
38
|
* @fileoverview Context API for Fict
|
|
@@ -150,4 +184,4 @@ declare function useContext<T>(context: Context<T>): T;
|
|
|
150
184
|
*/
|
|
151
185
|
declare function hasContext<T>(context: Context<T>): boolean;
|
|
152
186
|
|
|
153
|
-
export { type Context as C, type ProviderProps as P, createContext as c, hasContext as h, useContext as u };
|
|
187
|
+
export { type Context as C, type FictDevtoolsHook as F, type ProviderProps as P, createContext as c, getDevtoolsHook as g, hasContext as h, useContext as u };
|
|
@@ -1,4 +1,38 @@
|
|
|
1
|
-
import { B as BaseProps, F as FictNode } from './effect-
|
|
1
|
+
import { B as BaseProps, F as FictNode } from './effect-D6kaLM2-.js';
|
|
2
|
+
|
|
3
|
+
interface FictDevtoolsHook {
|
|
4
|
+
registerSignal: (id: number, value: unknown, options?: {
|
|
5
|
+
name?: string;
|
|
6
|
+
source?: string;
|
|
7
|
+
ownerId?: number;
|
|
8
|
+
}) => void;
|
|
9
|
+
updateSignal: (id: number, value: unknown) => void;
|
|
10
|
+
registerComputed: (id: number, value: unknown, options?: {
|
|
11
|
+
name?: string;
|
|
12
|
+
source?: string;
|
|
13
|
+
ownerId?: number;
|
|
14
|
+
hasValue?: boolean;
|
|
15
|
+
}) => void;
|
|
16
|
+
updateComputed: (id: number, value: unknown) => void;
|
|
17
|
+
registerEffect: (id: number, options?: {
|
|
18
|
+
ownerId?: number;
|
|
19
|
+
source?: string;
|
|
20
|
+
}) => void;
|
|
21
|
+
effectRun: (id: number) => void;
|
|
22
|
+
/** Track a dependency relationship between subscriber and dependency */
|
|
23
|
+
trackDependency?: (subscriberId: number, dependencyId: number) => void;
|
|
24
|
+
/** Remove a dependency relationship when unlinked */
|
|
25
|
+
untrackDependency?: (subscriberId: number, dependencyId: number) => void;
|
|
26
|
+
cycleDetected?: (payload: {
|
|
27
|
+
reason: string;
|
|
28
|
+
detail?: Record<string, unknown>;
|
|
29
|
+
}) => void;
|
|
30
|
+
registerComponent?: (id: number, name: string, parentId?: number, source?: any) => void;
|
|
31
|
+
componentMount?: (id: number, elements?: HTMLElement[]) => void;
|
|
32
|
+
componentUnmount?: (id: number) => void;
|
|
33
|
+
componentRender?: (id: number) => void;
|
|
34
|
+
}
|
|
35
|
+
declare function getDevtoolsHook(): FictDevtoolsHook | undefined;
|
|
2
36
|
|
|
3
37
|
/**
|
|
4
38
|
* @fileoverview Context API for Fict
|
|
@@ -150,4 +184,4 @@ declare function useContext<T>(context: Context<T>): T;
|
|
|
150
184
|
*/
|
|
151
185
|
declare function hasContext<T>(context: Context<T>): boolean;
|
|
152
186
|
|
|
153
|
-
export { type Context as C, type ProviderProps as P, createContext as c, hasContext as h, useContext as u };
|
|
187
|
+
export { type Context as C, type FictDevtoolsHook as F, type ProviderProps as P, createContext as c, getDevtoolsHook as g, hasContext as h, useContext as u };
|
|
@@ -360,6 +360,85 @@ declare function createShow(el: Element & {
|
|
|
360
360
|
*/
|
|
361
361
|
declare function createPortal(container: ParentNode & Node, render: () => FictNode, createElementFn: CreateElementFn): BindingHandle;
|
|
362
362
|
|
|
363
|
+
type LifecycleFn = () => void | Cleanup;
|
|
364
|
+
interface CreateRootOptions {
|
|
365
|
+
inherit?: boolean;
|
|
366
|
+
}
|
|
367
|
+
type ErrorHandler = (err: unknown, info?: ErrorInfo) => boolean | void;
|
|
368
|
+
declare function onMount(fn: LifecycleFn): void;
|
|
369
|
+
declare function onDestroy(fn: LifecycleFn): void;
|
|
370
|
+
declare function onCleanup(fn: Cleanup): void;
|
|
371
|
+
declare function createRoot<T>(fn: () => T, options?: CreateRootOptions): {
|
|
372
|
+
dispose: () => void;
|
|
373
|
+
value: T;
|
|
374
|
+
};
|
|
375
|
+
declare function registerErrorHandler(fn: ErrorHandler): void;
|
|
376
|
+
|
|
377
|
+
/**
|
|
378
|
+
* Options for creating a signal
|
|
379
|
+
*/
|
|
380
|
+
interface SignalOptions<T> {
|
|
381
|
+
/** Custom equality check */
|
|
382
|
+
equals?: false | ((prev: T, next: T) => boolean);
|
|
383
|
+
/** Debug name */
|
|
384
|
+
name?: string;
|
|
385
|
+
/** Source location */
|
|
386
|
+
devToolsSource?: string;
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* Options for creating a memo
|
|
390
|
+
*/
|
|
391
|
+
interface MemoOptions<T> {
|
|
392
|
+
/** Custom equality check */
|
|
393
|
+
equals?: false | ((prev: T, next: T) => boolean);
|
|
394
|
+
/** Debug name */
|
|
395
|
+
name?: string;
|
|
396
|
+
/** Source location */
|
|
397
|
+
devToolsSource?: string;
|
|
398
|
+
}
|
|
399
|
+
/**
|
|
400
|
+
* Signal accessor - function to get/set signal value
|
|
401
|
+
*/
|
|
402
|
+
interface SignalAccessor<T> {
|
|
403
|
+
(): T;
|
|
404
|
+
(value: T): void;
|
|
405
|
+
}
|
|
406
|
+
/**
|
|
407
|
+
* Computed accessor - function to get computed value
|
|
408
|
+
*/
|
|
409
|
+
type ComputedAccessor<T> = () => T;
|
|
410
|
+
/**
|
|
411
|
+
* Effect scope disposer - function to dispose an effect scope
|
|
412
|
+
*/
|
|
413
|
+
type EffectScopeDisposer = () => void;
|
|
414
|
+
/**
|
|
415
|
+
* Create a reactive signal
|
|
416
|
+
* @param initialValue - The initial value
|
|
417
|
+
* @returns A signal accessor function
|
|
418
|
+
*/
|
|
419
|
+
declare function signal<T>(initialValue: T, options?: SignalOptions<T>): SignalAccessor<T>;
|
|
420
|
+
/**
|
|
421
|
+
* Create a reactive effect scope
|
|
422
|
+
* @param fn - The scope function
|
|
423
|
+
* @returns An effect scope disposer function
|
|
424
|
+
*/
|
|
425
|
+
declare function effectScope(fn: () => void): EffectScopeDisposer;
|
|
426
|
+
/**
|
|
427
|
+
* Reset all global reactive state for test isolation.
|
|
428
|
+
* ONLY use this in test setup/teardown - never in production code.
|
|
429
|
+
* This clears effect queues, resets batch depth, and clears pending flushes.
|
|
430
|
+
*/
|
|
431
|
+
declare function __resetReactiveState(): void;
|
|
432
|
+
/**
|
|
433
|
+
* Create a selector signal that efficiently updates only when the selected key matches.
|
|
434
|
+
* Useful for large lists where only one item is selected.
|
|
435
|
+
*
|
|
436
|
+
* @param source - The source signal returning the current key
|
|
437
|
+
* @param equalityFn - Optional equality function
|
|
438
|
+
* @returns A selector function that takes a key and returns a boolean signal accessor
|
|
439
|
+
*/
|
|
440
|
+
declare function createSelector<T>(source: () => T, equalityFn?: (a: T, b: T) => boolean): (key: T) => boolean;
|
|
441
|
+
|
|
363
442
|
/**
|
|
364
443
|
* Effect callback run synchronously; async callbacks are not tracked after the first await.
|
|
365
444
|
* TypeScript will reject `async () => {}` here—split async work or read signals before awaiting.
|
|
@@ -368,4 +447,4 @@ type Effect = () => void | Cleanup;
|
|
|
368
447
|
declare function createEffect(fn: Effect): () => void;
|
|
369
448
|
declare function createRenderEffect(fn: Effect): () => void;
|
|
370
449
|
|
|
371
|
-
export {
|
|
450
|
+
export { delegateEvents as $, type EventHandler as A, type BaseProps as B, type Cleanup as C, type DOMElement as D, type Effect as E, type FictNode as F, type ErrorInfo as G, type SignalOptions as H, type ComputedAccessor as I, bindText as J, bindAttribute as K, bindStyle as L, type MemoOptions as M, bindClass as N, bindEvent as O, type PropsWithChildren as P, callEventHandler as Q, type RefObject as R, type SignalAccessor as S, bindProperty as T, bindRef as U, insert as V, createConditional as W, spread as X, assign as Y, classList as Z, __resetReactiveState as _, createTextBinding as a, clearDelegatedEvents as a0, addEventListener as a1, type MaybeReactive as a2, type BindingHandle as a3, type CreateElementFn as a4, type AttributeSetter as a5, createChildBinding as b, createSelector as c, createAttributeBinding as d, effectScope as e, createStyleBinding as f, createClassBinding as g, createShow as h, isReactive as i, createRenderEffect as j, type SuspenseToken as k, createEffect as l, onDestroy as m, onCleanup as n, onMount as o, createRoot as p, createPortal as q, registerErrorHandler as r, signal as s, type FictVNode as t, unwrap as u, type Component as v, type Ref as w, type RefCallback as x, type StyleProp as y, type ClassProp as z };
|
|
@@ -360,6 +360,85 @@ declare function createShow(el: Element & {
|
|
|
360
360
|
*/
|
|
361
361
|
declare function createPortal(container: ParentNode & Node, render: () => FictNode, createElementFn: CreateElementFn): BindingHandle;
|
|
362
362
|
|
|
363
|
+
type LifecycleFn = () => void | Cleanup;
|
|
364
|
+
interface CreateRootOptions {
|
|
365
|
+
inherit?: boolean;
|
|
366
|
+
}
|
|
367
|
+
type ErrorHandler = (err: unknown, info?: ErrorInfo) => boolean | void;
|
|
368
|
+
declare function onMount(fn: LifecycleFn): void;
|
|
369
|
+
declare function onDestroy(fn: LifecycleFn): void;
|
|
370
|
+
declare function onCleanup(fn: Cleanup): void;
|
|
371
|
+
declare function createRoot<T>(fn: () => T, options?: CreateRootOptions): {
|
|
372
|
+
dispose: () => void;
|
|
373
|
+
value: T;
|
|
374
|
+
};
|
|
375
|
+
declare function registerErrorHandler(fn: ErrorHandler): void;
|
|
376
|
+
|
|
377
|
+
/**
|
|
378
|
+
* Options for creating a signal
|
|
379
|
+
*/
|
|
380
|
+
interface SignalOptions<T> {
|
|
381
|
+
/** Custom equality check */
|
|
382
|
+
equals?: false | ((prev: T, next: T) => boolean);
|
|
383
|
+
/** Debug name */
|
|
384
|
+
name?: string;
|
|
385
|
+
/** Source location */
|
|
386
|
+
devToolsSource?: string;
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* Options for creating a memo
|
|
390
|
+
*/
|
|
391
|
+
interface MemoOptions<T> {
|
|
392
|
+
/** Custom equality check */
|
|
393
|
+
equals?: false | ((prev: T, next: T) => boolean);
|
|
394
|
+
/** Debug name */
|
|
395
|
+
name?: string;
|
|
396
|
+
/** Source location */
|
|
397
|
+
devToolsSource?: string;
|
|
398
|
+
}
|
|
399
|
+
/**
|
|
400
|
+
* Signal accessor - function to get/set signal value
|
|
401
|
+
*/
|
|
402
|
+
interface SignalAccessor<T> {
|
|
403
|
+
(): T;
|
|
404
|
+
(value: T): void;
|
|
405
|
+
}
|
|
406
|
+
/**
|
|
407
|
+
* Computed accessor - function to get computed value
|
|
408
|
+
*/
|
|
409
|
+
type ComputedAccessor<T> = () => T;
|
|
410
|
+
/**
|
|
411
|
+
* Effect scope disposer - function to dispose an effect scope
|
|
412
|
+
*/
|
|
413
|
+
type EffectScopeDisposer = () => void;
|
|
414
|
+
/**
|
|
415
|
+
* Create a reactive signal
|
|
416
|
+
* @param initialValue - The initial value
|
|
417
|
+
* @returns A signal accessor function
|
|
418
|
+
*/
|
|
419
|
+
declare function signal<T>(initialValue: T, options?: SignalOptions<T>): SignalAccessor<T>;
|
|
420
|
+
/**
|
|
421
|
+
* Create a reactive effect scope
|
|
422
|
+
* @param fn - The scope function
|
|
423
|
+
* @returns An effect scope disposer function
|
|
424
|
+
*/
|
|
425
|
+
declare function effectScope(fn: () => void): EffectScopeDisposer;
|
|
426
|
+
/**
|
|
427
|
+
* Reset all global reactive state for test isolation.
|
|
428
|
+
* ONLY use this in test setup/teardown - never in production code.
|
|
429
|
+
* This clears effect queues, resets batch depth, and clears pending flushes.
|
|
430
|
+
*/
|
|
431
|
+
declare function __resetReactiveState(): void;
|
|
432
|
+
/**
|
|
433
|
+
* Create a selector signal that efficiently updates only when the selected key matches.
|
|
434
|
+
* Useful for large lists where only one item is selected.
|
|
435
|
+
*
|
|
436
|
+
* @param source - The source signal returning the current key
|
|
437
|
+
* @param equalityFn - Optional equality function
|
|
438
|
+
* @returns A selector function that takes a key and returns a boolean signal accessor
|
|
439
|
+
*/
|
|
440
|
+
declare function createSelector<T>(source: () => T, equalityFn?: (a: T, b: T) => boolean): (key: T) => boolean;
|
|
441
|
+
|
|
363
442
|
/**
|
|
364
443
|
* Effect callback run synchronously; async callbacks are not tracked after the first await.
|
|
365
444
|
* TypeScript will reject `async () => {}` here—split async work or read signals before awaiting.
|
|
@@ -368,4 +447,4 @@ type Effect = () => void | Cleanup;
|
|
|
368
447
|
declare function createEffect(fn: Effect): () => void;
|
|
369
448
|
declare function createRenderEffect(fn: Effect): () => void;
|
|
370
449
|
|
|
371
|
-
export {
|
|
450
|
+
export { delegateEvents as $, type EventHandler as A, type BaseProps as B, type Cleanup as C, type DOMElement as D, type Effect as E, type FictNode as F, type ErrorInfo as G, type SignalOptions as H, type ComputedAccessor as I, bindText as J, bindAttribute as K, bindStyle as L, type MemoOptions as M, bindClass as N, bindEvent as O, type PropsWithChildren as P, callEventHandler as Q, type RefObject as R, type SignalAccessor as S, bindProperty as T, bindRef as U, insert as V, createConditional as W, spread as X, assign as Y, classList as Z, __resetReactiveState as _, createTextBinding as a, clearDelegatedEvents as a0, addEventListener as a1, type MaybeReactive as a2, type BindingHandle as a3, type CreateElementFn as a4, type AttributeSetter as a5, createChildBinding as b, createSelector as c, createAttributeBinding as d, effectScope as e, createStyleBinding as f, createClassBinding as g, createShow as h, isReactive as i, createRenderEffect as j, type SuspenseToken as k, createEffect as l, onDestroy as m, onCleanup as n, onMount as o, createRoot as p, createPortal as q, registerErrorHandler as r, signal as s, type FictVNode as t, unwrap as u, type Component as v, type Ref as w, type RefCallback as x, type StyleProp as y, type ClassProp as z };
|
package/dist/index.cjs
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
|
|
4
4
|
|
|
5
|
-
var
|
|
5
|
+
var _chunkM2TSXZ4Ccjs = require('./chunk-M2TSXZ4C.cjs');
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
|
|
@@ -34,7 +34,8 @@ var _chunkW525IQWCcjs = require('./chunk-W525IQWC.cjs');
|
|
|
34
34
|
|
|
35
35
|
|
|
36
36
|
|
|
37
|
-
|
|
37
|
+
|
|
38
|
+
var _chunkID3WBWNOcjs = require('./chunk-ID3WBWNO.cjs');
|
|
38
39
|
|
|
39
40
|
// src/ref.ts
|
|
40
41
|
function createRef() {
|
|
@@ -46,7 +47,7 @@ function ErrorBoundary(props) {
|
|
|
46
47
|
const fragment = document.createDocumentFragment();
|
|
47
48
|
const marker = document.createComment("fict:error-boundary");
|
|
48
49
|
fragment.appendChild(marker);
|
|
49
|
-
const hostRoot =
|
|
50
|
+
const hostRoot = _chunkID3WBWNOcjs.getCurrentRoot.call(void 0, );
|
|
50
51
|
let cleanup;
|
|
51
52
|
let activeNodes = [];
|
|
52
53
|
let renderingFallback = false;
|
|
@@ -64,25 +65,25 @@ function ErrorBoundary(props) {
|
|
|
64
65
|
cleanup = void 0;
|
|
65
66
|
}
|
|
66
67
|
if (activeNodes.length) {
|
|
67
|
-
|
|
68
|
+
_chunkID3WBWNOcjs.removeNodes.call(void 0, activeNodes);
|
|
68
69
|
activeNodes = [];
|
|
69
70
|
}
|
|
70
71
|
if (value == null || value === false) {
|
|
71
72
|
return;
|
|
72
73
|
}
|
|
73
|
-
const root =
|
|
74
|
-
const prev =
|
|
74
|
+
const root = _chunkID3WBWNOcjs.createRootContext.call(void 0, hostRoot);
|
|
75
|
+
const prev = _chunkID3WBWNOcjs.pushRoot.call(void 0, root);
|
|
75
76
|
let nodes = [];
|
|
76
77
|
try {
|
|
77
|
-
const output =
|
|
78
|
-
nodes =
|
|
78
|
+
const output = _chunkID3WBWNOcjs.createElement.call(void 0, value);
|
|
79
|
+
nodes = _chunkID3WBWNOcjs.toNodeArray.call(void 0, output);
|
|
79
80
|
const parentNode = marker.parentNode;
|
|
80
81
|
if (parentNode) {
|
|
81
|
-
|
|
82
|
+
_chunkID3WBWNOcjs.insertNodesBefore.call(void 0, parentNode, nodes, marker);
|
|
82
83
|
}
|
|
83
84
|
} catch (err) {
|
|
84
|
-
|
|
85
|
-
|
|
85
|
+
_chunkID3WBWNOcjs.popRoot.call(void 0, prev);
|
|
86
|
+
_chunkID3WBWNOcjs.destroyRoot.call(void 0, root);
|
|
86
87
|
if (renderingFallback) {
|
|
87
88
|
throw err;
|
|
88
89
|
}
|
|
@@ -97,11 +98,11 @@ function ErrorBoundary(props) {
|
|
|
97
98
|
}
|
|
98
99
|
return;
|
|
99
100
|
}
|
|
100
|
-
|
|
101
|
-
|
|
101
|
+
_chunkID3WBWNOcjs.popRoot.call(void 0, prev);
|
|
102
|
+
_chunkID3WBWNOcjs.flushOnMount.call(void 0, root);
|
|
102
103
|
cleanup = () => {
|
|
103
|
-
|
|
104
|
-
|
|
104
|
+
_chunkID3WBWNOcjs.destroyRoot.call(void 0, root);
|
|
105
|
+
_chunkID3WBWNOcjs.removeNodes.call(void 0, nodes);
|
|
105
106
|
};
|
|
106
107
|
activeNodes = nodes;
|
|
107
108
|
};
|
|
@@ -110,7 +111,7 @@ function ErrorBoundary(props) {
|
|
|
110
111
|
renderValue(toView(null));
|
|
111
112
|
};
|
|
112
113
|
renderValue(_nullishCoalesce(props.children, () => ( null)));
|
|
113
|
-
|
|
114
|
+
_chunkID3WBWNOcjs.registerErrorHandler.call(void 0, (err) => {
|
|
114
115
|
renderValue(toView(err));
|
|
115
116
|
_optionalChain([props, 'access', _5 => _5.onError, 'optionalCall', _6 => _6(err)]);
|
|
116
117
|
return true;
|
|
@@ -119,7 +120,7 @@ function ErrorBoundary(props) {
|
|
|
119
120
|
const isGetter = typeof props.resetKeys === "function" && props.resetKeys.length === 0;
|
|
120
121
|
const getter = isGetter ? props.resetKeys : void 0;
|
|
121
122
|
let prev = isGetter ? getter() : props.resetKeys;
|
|
122
|
-
|
|
123
|
+
_chunkID3WBWNOcjs.createEffect.call(void 0, () => {
|
|
123
124
|
const next = getter ? getter() : props.resetKeys;
|
|
124
125
|
if (prev !== next) {
|
|
125
126
|
prev = next;
|
|
@@ -148,10 +149,10 @@ function createSuspenseToken() {
|
|
|
148
149
|
}
|
|
149
150
|
var isThenable = (value) => typeof value === "object" && value !== null && typeof value.then === "function";
|
|
150
151
|
function Suspense(props) {
|
|
151
|
-
const pending =
|
|
152
|
+
const pending = _chunkID3WBWNOcjs.signal.call(void 0, 0);
|
|
152
153
|
let resolvedOnce = false;
|
|
153
154
|
let epoch = 0;
|
|
154
|
-
const hostRoot =
|
|
155
|
+
const hostRoot = _chunkID3WBWNOcjs.getCurrentRoot.call(void 0, );
|
|
155
156
|
const toFallback = (err) => typeof props.fallback === "function" ? props.fallback(err) : props.fallback;
|
|
156
157
|
const renderView = (view) => {
|
|
157
158
|
if (cleanup) {
|
|
@@ -159,41 +160,41 @@ function Suspense(props) {
|
|
|
159
160
|
cleanup = void 0;
|
|
160
161
|
}
|
|
161
162
|
if (activeNodes.length) {
|
|
162
|
-
|
|
163
|
+
_chunkID3WBWNOcjs.removeNodes.call(void 0, activeNodes);
|
|
163
164
|
activeNodes = [];
|
|
164
165
|
}
|
|
165
166
|
if (view == null || view === false) {
|
|
166
167
|
return;
|
|
167
168
|
}
|
|
168
|
-
const root =
|
|
169
|
-
const prev =
|
|
169
|
+
const root = _chunkID3WBWNOcjs.createRootContext.call(void 0, hostRoot);
|
|
170
|
+
const prev = _chunkID3WBWNOcjs.pushRoot.call(void 0, root);
|
|
170
171
|
let nodes = [];
|
|
171
172
|
try {
|
|
172
|
-
const output =
|
|
173
|
-
nodes =
|
|
173
|
+
const output = _chunkID3WBWNOcjs.createElement.call(void 0, view);
|
|
174
|
+
nodes = _chunkID3WBWNOcjs.toNodeArray.call(void 0, output);
|
|
174
175
|
const suspendedAttempt = root.suspended || nodes.length > 0 && nodes.every((node) => node instanceof Comment && node.data === "fict:suspend");
|
|
175
176
|
if (suspendedAttempt) {
|
|
176
|
-
|
|
177
|
-
|
|
177
|
+
_chunkID3WBWNOcjs.popRoot.call(void 0, prev);
|
|
178
|
+
_chunkID3WBWNOcjs.destroyRoot.call(void 0, root);
|
|
178
179
|
return;
|
|
179
180
|
}
|
|
180
181
|
const parentNode = marker.parentNode;
|
|
181
182
|
if (parentNode) {
|
|
182
|
-
|
|
183
|
+
_chunkID3WBWNOcjs.insertNodesBefore.call(void 0, parentNode, nodes, marker);
|
|
183
184
|
}
|
|
184
185
|
} catch (err) {
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
if (!
|
|
186
|
+
_chunkID3WBWNOcjs.popRoot.call(void 0, prev);
|
|
187
|
+
_chunkID3WBWNOcjs.destroyRoot.call(void 0, root);
|
|
188
|
+
if (!_chunkID3WBWNOcjs.handleError.call(void 0, err, { source: "render" }, hostRoot)) {
|
|
188
189
|
throw err;
|
|
189
190
|
}
|
|
190
191
|
return;
|
|
191
192
|
}
|
|
192
|
-
|
|
193
|
-
|
|
193
|
+
_chunkID3WBWNOcjs.popRoot.call(void 0, prev);
|
|
194
|
+
_chunkID3WBWNOcjs.flushOnMount.call(void 0, root);
|
|
194
195
|
cleanup = () => {
|
|
195
|
-
|
|
196
|
-
|
|
196
|
+
_chunkID3WBWNOcjs.destroyRoot.call(void 0, root);
|
|
197
|
+
_chunkID3WBWNOcjs.removeNodes.call(void 0, nodes);
|
|
197
198
|
};
|
|
198
199
|
activeNodes = nodes;
|
|
199
200
|
};
|
|
@@ -208,7 +209,7 @@ function Suspense(props) {
|
|
|
208
209
|
_optionalChain([props, 'access', _7 => _7.onResolve, 'optionalCall', _8 => _8()]);
|
|
209
210
|
}
|
|
210
211
|
};
|
|
211
|
-
|
|
212
|
+
_chunkID3WBWNOcjs.registerSuspenseHandler.call(void 0, (token) => {
|
|
212
213
|
const tokenEpoch = epoch;
|
|
213
214
|
pending(pending() + 1);
|
|
214
215
|
renderView(toFallback());
|
|
@@ -233,7 +234,7 @@ function Suspense(props) {
|
|
|
233
234
|
const newPending = Math.max(0, pending() - 1);
|
|
234
235
|
pending(newPending);
|
|
235
236
|
_optionalChain([props, 'access', _9 => _9.onReject, 'optionalCall', _10 => _10(err)]);
|
|
236
|
-
if (!
|
|
237
|
+
if (!_chunkID3WBWNOcjs.handleError.call(void 0, err, { source: "render" }, hostRoot)) {
|
|
237
238
|
throw err;
|
|
238
239
|
}
|
|
239
240
|
}
|
|
@@ -247,7 +248,7 @@ function Suspense(props) {
|
|
|
247
248
|
const isGetter = typeof props.resetKeys === "function" && props.resetKeys.length === 0;
|
|
248
249
|
const getter = isGetter ? props.resetKeys : void 0;
|
|
249
250
|
let prev = isGetter ? getter() : props.resetKeys;
|
|
250
|
-
|
|
251
|
+
_chunkID3WBWNOcjs.createEffect.call(void 0, () => {
|
|
251
252
|
const next = getter ? getter() : props.resetKeys;
|
|
252
253
|
if (prev !== next) {
|
|
253
254
|
prev = next;
|
|
@@ -284,5 +285,6 @@ function Suspense(props) {
|
|
|
284
285
|
|
|
285
286
|
|
|
286
287
|
|
|
287
|
-
|
|
288
|
+
|
|
289
|
+
exports.ErrorBoundary = ErrorBoundary; exports.Fragment = _chunkID3WBWNOcjs.Fragment; exports.Suspense = Suspense; exports.batch = _chunkID3WBWNOcjs.batch2; exports.createContext = _chunkM2TSXZ4Ccjs.createContext; exports.createEffect = _chunkID3WBWNOcjs.createEffect; exports.createElement = _chunkID3WBWNOcjs.createElement; exports.createMemo = _chunkID3WBWNOcjs.createMemo; exports.createPortal = _chunkID3WBWNOcjs.createPortal; exports.createRef = createRef; exports.createRoot = _chunkID3WBWNOcjs.createRoot; exports.createSuspenseToken = createSuspenseToken; exports.hasContext = _chunkM2TSXZ4Ccjs.hasContext; exports.keyed = _chunkID3WBWNOcjs.keyed; exports.mergeProps = _chunkID3WBWNOcjs.mergeProps; exports.onCleanup = _chunkID3WBWNOcjs.onCleanup; exports.onDestroy = _chunkID3WBWNOcjs.onDestroy; exports.onMount = _chunkID3WBWNOcjs.onMount; exports.prop = _chunkID3WBWNOcjs.prop; exports.render = _chunkID3WBWNOcjs.render; exports.startTransition = _chunkID3WBWNOcjs.startTransition; exports.untrack = _chunkID3WBWNOcjs.untrack2; exports.useContext = _chunkM2TSXZ4Ccjs.useContext; exports.useDeferredValue = _chunkID3WBWNOcjs.useDeferredValue; exports.useTransition = _chunkID3WBWNOcjs.useTransition;
|
|
288
290
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/fict/fict/packages/runtime/dist/index.cjs","../src/ref.ts","../src/error-boundary.ts","../src/suspense.ts"],"names":[],"mappings":"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","file":"/home/runner/work/fict/fict/packages/runtime/dist/index.cjs","sourcesContent":[null,"import type { RefObject } from './types'\n\n/**\n * Create a ref object for DOM element references.\n *\n * @returns A ref object with a `current` property initialized to `null`\n *\n * @example\n * ```tsx\n * import { createRef } from 'fict'\n *\n * function Component() {\n * const inputRef = createRef<HTMLInputElement>()\n *\n * $effect(() => {\n * inputRef.current?.focus()\n * })\n *\n * return <input ref={inputRef} />\n * }\n * ```\n */\nexport function createRef<T extends Element = HTMLElement>(): RefObject<T> {\n return { current: null }\n}\n","import { createElement } from './dom'\nimport { createEffect } from './effect'\nimport {\n createRootContext,\n destroyRoot,\n flushOnMount,\n getCurrentRoot,\n pushRoot,\n popRoot,\n registerErrorHandler,\n} from './lifecycle'\nimport { insertNodesBefore, removeNodes, toNodeArray } from './node-ops'\nimport type { BaseProps, FictNode } from './types'\n\ninterface ErrorBoundaryProps extends BaseProps {\n fallback: FictNode | ((err: unknown, reset?: () => void) => FictNode)\n onError?: (err: unknown) => void\n resetKeys?: unknown | (() => unknown)\n}\n\nexport function ErrorBoundary(props: ErrorBoundaryProps): FictNode {\n const fragment = document.createDocumentFragment()\n const marker = document.createComment('fict:error-boundary')\n fragment.appendChild(marker)\n\n const hostRoot = getCurrentRoot()\n\n let cleanup: (() => void) | undefined\n let activeNodes: Node[] = []\n let renderingFallback = false\n\n let reset = () => {}\n const toView = (err: unknown | null): FictNode | null => {\n if (err != null) {\n return typeof props.fallback === 'function'\n ? (props.fallback as (e: unknown, reset?: () => void) => FictNode)(err, reset)\n : props.fallback\n }\n return props.children ?? null\n }\n\n const renderValue = (value: FictNode | null) => {\n if (cleanup) {\n cleanup()\n cleanup = undefined\n }\n if (activeNodes.length) {\n removeNodes(activeNodes)\n activeNodes = []\n }\n\n if (value == null || value === false) {\n return\n }\n\n const root = createRootContext(hostRoot)\n const prev = pushRoot(root)\n let nodes: Node[] = []\n try {\n const output = createElement(value)\n nodes = toNodeArray(output)\n const parentNode = marker.parentNode as (ParentNode & Node) | null\n if (parentNode) {\n insertNodesBefore(parentNode, nodes, marker)\n }\n } catch (err) {\n popRoot(prev)\n destroyRoot(root)\n // Fall back immediately on render errors, avoid infinite recursion\n if (renderingFallback) {\n throw err\n }\n // nested errors. If fallback rendering also throws, we should NOT reset\n // the flag until we're sure no more recursion is happening.\n renderingFallback = true\n try {\n renderValue(toView(err))\n // Only reset if successful - if renderValue threw, we want to keep\n // renderingFallback = true to prevent infinite recursion\n renderingFallback = false\n props.onError?.(err)\n } catch (fallbackErr) {\n // Fallback rendering failed - keep renderingFallback = true\n // to prevent further attempts, then rethrow\n // If fallback fails, report both errors\n props.onError?.(err)\n throw fallbackErr\n }\n return\n }\n popRoot(prev)\n flushOnMount(root)\n\n cleanup = () => {\n destroyRoot(root)\n removeNodes(nodes)\n }\n activeNodes = nodes\n }\n\n reset = () => {\n renderingFallback = false\n renderValue(toView(null))\n }\n\n renderValue(props.children ?? null)\n\n registerErrorHandler(err => {\n renderValue(toView(err))\n props.onError?.(err)\n return true\n })\n\n if (props.resetKeys !== undefined) {\n const isGetter =\n typeof props.resetKeys === 'function' && (props.resetKeys as () => unknown).length === 0\n const getter = isGetter ? (props.resetKeys as () => unknown) : undefined\n let prev = isGetter ? getter!() : props.resetKeys\n createEffect(() => {\n const next = getter ? getter() : props.resetKeys\n if (prev !== next) {\n prev = next\n renderValue(toView(null))\n }\n })\n }\n\n return fragment\n}\n","import { createElement } from './dom'\nimport { createEffect } from './effect'\nimport {\n createRootContext,\n destroyRoot,\n flushOnMount,\n getCurrentRoot,\n handleError,\n pushRoot,\n popRoot,\n registerSuspenseHandler,\n} from './lifecycle'\nimport { insertNodesBefore, removeNodes, toNodeArray } from './node-ops'\nimport { createSignal } from './signal'\nimport type { BaseProps, FictNode, SuspenseToken } from './types'\n\nexport interface SuspenseProps extends BaseProps {\n fallback: FictNode | ((err?: unknown) => FictNode)\n onResolve?: () => void\n onReject?: (err: unknown) => void\n resetKeys?: unknown | (() => unknown)\n}\n\nexport interface SuspenseHandle {\n token: SuspenseToken\n resolve: () => void\n reject: (err: unknown) => void\n}\n\nexport function createSuspenseToken(): SuspenseHandle {\n let resolve!: () => void\n let reject!: (err: unknown) => void\n const promise = new Promise<void>((res, rej) => {\n resolve = res\n reject = rej\n })\n return {\n token: {\n then: promise.then.bind(promise),\n },\n resolve,\n reject,\n }\n}\n\nconst isThenable = (value: unknown): value is PromiseLike<unknown> =>\n typeof value === 'object' &&\n value !== null &&\n typeof (value as PromiseLike<unknown>).then === 'function'\n\nexport function Suspense(props: SuspenseProps): FictNode {\n const pending = createSignal(0)\n let resolvedOnce = false\n let epoch = 0\n const hostRoot = getCurrentRoot()\n\n const toFallback = (err?: unknown) =>\n typeof props.fallback === 'function'\n ? (props.fallback as (e?: unknown) => FictNode)(err)\n : props.fallback\n\n const renderView = (view: FictNode | null) => {\n if (cleanup) {\n cleanup()\n cleanup = undefined\n }\n if (activeNodes.length) {\n removeNodes(activeNodes)\n activeNodes = []\n }\n\n if (view == null || view === false) {\n return\n }\n\n const root = createRootContext(hostRoot)\n const prev = pushRoot(root)\n let nodes: Node[] = []\n try {\n const output = createElement(view)\n nodes = toNodeArray(output)\n // Suspended view: child threw a suspense token and was handled upstream.\n // Avoid replacing existing fallback content; tear down this attempt.\n const suspendedAttempt =\n root.suspended ||\n (nodes.length > 0 &&\n nodes.every(node => node instanceof Comment && (node as Comment).data === 'fict:suspend'))\n if (suspendedAttempt) {\n popRoot(prev)\n destroyRoot(root)\n return\n }\n const parentNode = marker.parentNode as (ParentNode & Node) | null\n if (parentNode) {\n insertNodesBefore(parentNode, nodes, marker)\n }\n } catch (err) {\n popRoot(prev)\n destroyRoot(root)\n if (!handleError(err, { source: 'render' }, hostRoot)) {\n throw err\n }\n return\n }\n popRoot(prev)\n flushOnMount(root)\n\n cleanup = () => {\n destroyRoot(root)\n removeNodes(nodes)\n }\n activeNodes = nodes\n }\n\n const fragment = document.createDocumentFragment()\n const marker = document.createComment('fict:suspense')\n fragment.appendChild(marker)\n let cleanup: (() => void) | undefined\n let activeNodes: Node[] = []\n\n const onResolveMaybe = () => {\n if (!resolvedOnce) {\n resolvedOnce = true\n props.onResolve?.()\n }\n }\n\n registerSuspenseHandler(token => {\n const tokenEpoch = epoch\n pending(pending() + 1)\n // Directly render fallback instead of using switchView to avoid\n // triggering the effect which would cause duplicate renders\n renderView(toFallback())\n\n const thenable = (token as SuspenseToken).then\n ? (token as SuspenseToken)\n : isThenable(token)\n ? token\n : null\n\n if (thenable) {\n thenable.then(\n () => {\n // This prevents stale token resolutions from affecting state after\n // a reset. The order is important: check epoch first, then update state.\n if (epoch !== tokenEpoch) {\n // Token is stale (from before a reset), ignore it completely\n return\n }\n // Use Math.max as a defensive measure - pending should never go below 0,\n // but this protects against edge cases where a token might resolve twice\n // or after the component has been reset.\n const newPending = Math.max(0, pending() - 1)\n pending(newPending)\n if (newPending === 0) {\n // Directly render children instead of using switchView\n renderView(props.children ?? null)\n onResolveMaybe()\n }\n },\n err => {\n // Same epoch check - ignore stale tokens\n if (epoch !== tokenEpoch) {\n return\n }\n const newPending = Math.max(0, pending() - 1)\n pending(newPending)\n props.onReject?.(err)\n if (!handleError(err, { source: 'render' }, hostRoot)) {\n throw err\n }\n },\n )\n return true\n }\n\n return false\n })\n\n // Initial render - render children directly\n // Note: This will be called synchronously during component creation.\n // If children suspend, the handler above will be called and switch to fallback.\n renderView(props.children ?? null)\n\n if (props.resetKeys !== undefined) {\n const isGetter =\n typeof props.resetKeys === 'function' && (props.resetKeys as () => unknown).length === 0\n const getter = isGetter ? (props.resetKeys as () => unknown) : undefined\n let prev = isGetter ? getter!() : props.resetKeys\n createEffect(() => {\n const next = getter ? getter() : props.resetKeys\n if (prev !== next) {\n prev = next\n epoch++\n pending(0)\n // Directly render children instead of using switchView\n renderView(props.children ?? null)\n }\n })\n }\n\n return fragment\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/fict/fict/packages/runtime/dist/index.cjs","../src/ref.ts","../src/error-boundary.ts","../src/suspense.ts"],"names":[],"mappings":"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","file":"/home/runner/work/fict/fict/packages/runtime/dist/index.cjs","sourcesContent":[null,"import type { RefObject } from './types'\n\n/**\n * Create a ref object for DOM element references.\n *\n * @returns A ref object with a `current` property initialized to `null`\n *\n * @example\n * ```tsx\n * import { createRef } from 'fict'\n *\n * function Component() {\n * const inputRef = createRef<HTMLInputElement>()\n *\n * $effect(() => {\n * inputRef.current?.focus()\n * })\n *\n * return <input ref={inputRef} />\n * }\n * ```\n */\nexport function createRef<T extends Element = HTMLElement>(): RefObject<T> {\n return { current: null }\n}\n","import { createElement } from './dom'\nimport { createEffect } from './effect'\nimport {\n createRootContext,\n destroyRoot,\n flushOnMount,\n getCurrentRoot,\n pushRoot,\n popRoot,\n registerErrorHandler,\n} from './lifecycle'\nimport { insertNodesBefore, removeNodes, toNodeArray } from './node-ops'\nimport type { BaseProps, FictNode } from './types'\n\ninterface ErrorBoundaryProps extends BaseProps {\n fallback: FictNode | ((err: unknown, reset?: () => void) => FictNode)\n onError?: (err: unknown) => void\n resetKeys?: unknown | (() => unknown)\n}\n\nexport function ErrorBoundary(props: ErrorBoundaryProps): FictNode {\n const fragment = document.createDocumentFragment()\n const marker = document.createComment('fict:error-boundary')\n fragment.appendChild(marker)\n\n const hostRoot = getCurrentRoot()\n\n let cleanup: (() => void) | undefined\n let activeNodes: Node[] = []\n let renderingFallback = false\n\n let reset = () => {}\n const toView = (err: unknown | null): FictNode | null => {\n if (err != null) {\n return typeof props.fallback === 'function'\n ? (props.fallback as (e: unknown, reset?: () => void) => FictNode)(err, reset)\n : props.fallback\n }\n return props.children ?? null\n }\n\n const renderValue = (value: FictNode | null) => {\n if (cleanup) {\n cleanup()\n cleanup = undefined\n }\n if (activeNodes.length) {\n removeNodes(activeNodes)\n activeNodes = []\n }\n\n if (value == null || value === false) {\n return\n }\n\n const root = createRootContext(hostRoot)\n const prev = pushRoot(root)\n let nodes: Node[] = []\n try {\n const output = createElement(value)\n nodes = toNodeArray(output)\n const parentNode = marker.parentNode as (ParentNode & Node) | null\n if (parentNode) {\n insertNodesBefore(parentNode, nodes, marker)\n }\n } catch (err) {\n popRoot(prev)\n destroyRoot(root)\n // Fall back immediately on render errors, avoid infinite recursion\n if (renderingFallback) {\n throw err\n }\n // nested errors. If fallback rendering also throws, we should NOT reset\n // the flag until we're sure no more recursion is happening.\n renderingFallback = true\n try {\n renderValue(toView(err))\n // Only reset if successful - if renderValue threw, we want to keep\n // renderingFallback = true to prevent infinite recursion\n renderingFallback = false\n props.onError?.(err)\n } catch (fallbackErr) {\n // Fallback rendering failed - keep renderingFallback = true\n // to prevent further attempts, then rethrow\n // If fallback fails, report both errors\n props.onError?.(err)\n throw fallbackErr\n }\n return\n }\n popRoot(prev)\n flushOnMount(root)\n\n cleanup = () => {\n destroyRoot(root)\n removeNodes(nodes)\n }\n activeNodes = nodes\n }\n\n reset = () => {\n renderingFallback = false\n renderValue(toView(null))\n }\n\n renderValue(props.children ?? null)\n\n registerErrorHandler(err => {\n renderValue(toView(err))\n props.onError?.(err)\n return true\n })\n\n if (props.resetKeys !== undefined) {\n const isGetter =\n typeof props.resetKeys === 'function' && (props.resetKeys as () => unknown).length === 0\n const getter = isGetter ? (props.resetKeys as () => unknown) : undefined\n let prev = isGetter ? getter!() : props.resetKeys\n createEffect(() => {\n const next = getter ? getter() : props.resetKeys\n if (prev !== next) {\n prev = next\n renderValue(toView(null))\n }\n })\n }\n\n return fragment\n}\n","import { createElement } from './dom'\nimport { createEffect } from './effect'\nimport {\n createRootContext,\n destroyRoot,\n flushOnMount,\n getCurrentRoot,\n handleError,\n pushRoot,\n popRoot,\n registerSuspenseHandler,\n} from './lifecycle'\nimport { insertNodesBefore, removeNodes, toNodeArray } from './node-ops'\nimport { createSignal } from './signal'\nimport type { BaseProps, FictNode, SuspenseToken } from './types'\n\nexport interface SuspenseProps extends BaseProps {\n fallback: FictNode | ((err?: unknown) => FictNode)\n onResolve?: () => void\n onReject?: (err: unknown) => void\n resetKeys?: unknown | (() => unknown)\n}\n\nexport interface SuspenseHandle {\n token: SuspenseToken\n resolve: () => void\n reject: (err: unknown) => void\n}\n\nexport function createSuspenseToken(): SuspenseHandle {\n let resolve!: () => void\n let reject!: (err: unknown) => void\n const promise = new Promise<void>((res, rej) => {\n resolve = res\n reject = rej\n })\n return {\n token: {\n then: promise.then.bind(promise),\n },\n resolve,\n reject,\n }\n}\n\nconst isThenable = (value: unknown): value is PromiseLike<unknown> =>\n typeof value === 'object' &&\n value !== null &&\n typeof (value as PromiseLike<unknown>).then === 'function'\n\nexport function Suspense(props: SuspenseProps): FictNode {\n const pending = createSignal(0)\n let resolvedOnce = false\n let epoch = 0\n const hostRoot = getCurrentRoot()\n\n const toFallback = (err?: unknown) =>\n typeof props.fallback === 'function'\n ? (props.fallback as (e?: unknown) => FictNode)(err)\n : props.fallback\n\n const renderView = (view: FictNode | null) => {\n if (cleanup) {\n cleanup()\n cleanup = undefined\n }\n if (activeNodes.length) {\n removeNodes(activeNodes)\n activeNodes = []\n }\n\n if (view == null || view === false) {\n return\n }\n\n const root = createRootContext(hostRoot)\n const prev = pushRoot(root)\n let nodes: Node[] = []\n try {\n const output = createElement(view)\n nodes = toNodeArray(output)\n // Suspended view: child threw a suspense token and was handled upstream.\n // Avoid replacing existing fallback content; tear down this attempt.\n const suspendedAttempt =\n root.suspended ||\n (nodes.length > 0 &&\n nodes.every(node => node instanceof Comment && (node as Comment).data === 'fict:suspend'))\n if (suspendedAttempt) {\n popRoot(prev)\n destroyRoot(root)\n return\n }\n const parentNode = marker.parentNode as (ParentNode & Node) | null\n if (parentNode) {\n insertNodesBefore(parentNode, nodes, marker)\n }\n } catch (err) {\n popRoot(prev)\n destroyRoot(root)\n if (!handleError(err, { source: 'render' }, hostRoot)) {\n throw err\n }\n return\n }\n popRoot(prev)\n flushOnMount(root)\n\n cleanup = () => {\n destroyRoot(root)\n removeNodes(nodes)\n }\n activeNodes = nodes\n }\n\n const fragment = document.createDocumentFragment()\n const marker = document.createComment('fict:suspense')\n fragment.appendChild(marker)\n let cleanup: (() => void) | undefined\n let activeNodes: Node[] = []\n\n const onResolveMaybe = () => {\n if (!resolvedOnce) {\n resolvedOnce = true\n props.onResolve?.()\n }\n }\n\n registerSuspenseHandler(token => {\n const tokenEpoch = epoch\n pending(pending() + 1)\n // Directly render fallback instead of using switchView to avoid\n // triggering the effect which would cause duplicate renders\n renderView(toFallback())\n\n const thenable = (token as SuspenseToken).then\n ? (token as SuspenseToken)\n : isThenable(token)\n ? token\n : null\n\n if (thenable) {\n thenable.then(\n () => {\n // This prevents stale token resolutions from affecting state after\n // a reset. The order is important: check epoch first, then update state.\n if (epoch !== tokenEpoch) {\n // Token is stale (from before a reset), ignore it completely\n return\n }\n // Use Math.max as a defensive measure - pending should never go below 0,\n // but this protects against edge cases where a token might resolve twice\n // or after the component has been reset.\n const newPending = Math.max(0, pending() - 1)\n pending(newPending)\n if (newPending === 0) {\n // Directly render children instead of using switchView\n renderView(props.children ?? null)\n onResolveMaybe()\n }\n },\n err => {\n // Same epoch check - ignore stale tokens\n if (epoch !== tokenEpoch) {\n return\n }\n const newPending = Math.max(0, pending() - 1)\n pending(newPending)\n props.onReject?.(err)\n if (!handleError(err, { source: 'render' }, hostRoot)) {\n throw err\n }\n },\n )\n return true\n }\n\n return false\n })\n\n // Initial render - render children directly\n // Note: This will be called synchronously during component creation.\n // If children suspend, the handler above will be called and switch to fallback.\n renderView(props.children ?? null)\n\n if (props.resetKeys !== undefined) {\n const isGetter =\n typeof props.resetKeys === 'function' && (props.resetKeys as () => unknown).length === 0\n const getter = isGetter ? (props.resetKeys as () => unknown) : undefined\n let prev = isGetter ? getter!() : props.resetKeys\n createEffect(() => {\n const next = getter ? getter() : props.resetKeys\n if (prev !== next) {\n prev = next\n epoch++\n pending(0)\n // Directly render children instead of using switchView\n renderView(props.children ?? null)\n }\n })\n }\n\n return fragment\n}\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export { F as Fragment, J as JSX, M as Memo,
|
|
2
|
-
import { R as RefObject, B as BaseProps, F as FictNode,
|
|
3
|
-
export {
|
|
4
|
-
export { C as Context, P as ProviderProps, c as createContext, h as hasContext, u as useContext } from './context-
|
|
1
|
+
export { F as Fragment, J as JSX, M as Memo, a as createElement, c as createMemo, k as keyed, m as mergeProps, p as prop, r as render } from './props-BIfromL0.cjs';
|
|
2
|
+
import { R as RefObject, B as BaseProps, F as FictNode, k as SuspenseToken } from './effect-D6kaLM2-.cjs';
|
|
3
|
+
export { z as ClassProp, C as Cleanup, v as Component, D as DOMElement, E as Effect, G as ErrorInfo, A as EventHandler, t as FictVNode, P as PropsWithChildren, w as Ref, x as RefCallback, y as StyleProp, l as createEffect, q as createPortal, p as createRoot, n as onCleanup, m as onDestroy, o as onMount } from './effect-D6kaLM2-.cjs';
|
|
4
|
+
export { C as Context, F as FictDevtoolsHook, P as ProviderProps, c as createContext, h as hasContext, u as useContext } from './context-B25xyQrJ.cjs';
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* Create a ref object for DOM element references.
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export { F as Fragment, J as JSX, M as Memo,
|
|
2
|
-
import { R as RefObject, B as BaseProps, F as FictNode,
|
|
3
|
-
export {
|
|
4
|
-
export { C as Context, P as ProviderProps, c as createContext, h as hasContext, u as useContext } from './context-
|
|
1
|
+
export { F as Fragment, J as JSX, M as Memo, a as createElement, c as createMemo, k as keyed, m as mergeProps, p as prop, r as render } from './props-BEgIVMRx.js';
|
|
2
|
+
import { R as RefObject, B as BaseProps, F as FictNode, k as SuspenseToken } from './effect-D6kaLM2-.js';
|
|
3
|
+
export { z as ClassProp, C as Cleanup, v as Component, D as DOMElement, E as Effect, G as ErrorInfo, A as EventHandler, t as FictVNode, P as PropsWithChildren, w as Ref, x as RefCallback, y as StyleProp, l as createEffect, q as createPortal, p as createRoot, n as onCleanup, m as onDestroy, o as onMount } from './effect-D6kaLM2-.js';
|
|
4
|
+
export { C as Context, F as FictDevtoolsHook, P as ProviderProps, c as createContext, h as hasContext, u as useContext } from './context-CGdP7_Jb.js';
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* Create a ref object for DOM element references.
|