@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.
Files changed (58) hide show
  1. package/dist/advanced.cjs +10 -8
  2. package/dist/advanced.cjs.map +1 -1
  3. package/dist/advanced.d.cts +8 -16
  4. package/dist/advanced.d.ts +8 -16
  5. package/dist/advanced.js +5 -3
  6. package/dist/advanced.js.map +1 -1
  7. package/dist/{chunk-2U6M3LKS.cjs → chunk-ID3WBWNO.cjs} +452 -219
  8. package/dist/chunk-ID3WBWNO.cjs.map +1 -0
  9. package/dist/{chunk-5YTFFAVU.cjs → chunk-L4DIV3RC.cjs} +7 -7
  10. package/dist/{chunk-5YTFFAVU.cjs.map → chunk-L4DIV3RC.cjs.map} +1 -1
  11. package/dist/{chunk-W525IQWC.cjs → chunk-M2TSXZ4C.cjs} +16 -16
  12. package/dist/{chunk-W525IQWC.cjs.map → chunk-M2TSXZ4C.cjs.map} +1 -1
  13. package/dist/{chunk-YVDWXY44.js → chunk-SO6X7G5S.js} +450 -217
  14. package/dist/chunk-SO6X7G5S.js.map +1 -0
  15. package/dist/{chunk-UHXUEGQH.js → chunk-TWELIZRY.js} +2 -2
  16. package/dist/{chunk-3WD7QD5G.js → chunk-XLIZJMMJ.js} +2 -2
  17. package/dist/{context-9gFXOdJl.d.cts → context-B25xyQrJ.d.cts} +36 -2
  18. package/dist/{context-4woHo7-L.d.ts → context-CGdP7_Jb.d.ts} +36 -2
  19. package/dist/{effect-ClARNUCc.d.cts → effect-D6kaLM2-.d.cts} +80 -1
  20. package/dist/{effect-ClARNUCc.d.ts → effect-D6kaLM2-.d.ts} +80 -1
  21. package/dist/index.cjs +40 -38
  22. package/dist/index.cjs.map +1 -1
  23. package/dist/index.d.cts +4 -4
  24. package/dist/index.d.ts +4 -4
  25. package/dist/index.dev.js +322 -145
  26. package/dist/index.dev.js.map +1 -1
  27. package/dist/index.js +4 -2
  28. package/dist/index.js.map +1 -1
  29. package/dist/internal.cjs +39 -35
  30. package/dist/internal.cjs.map +1 -1
  31. package/dist/internal.d.cts +8 -6
  32. package/dist/internal.d.ts +8 -6
  33. package/dist/internal.js +7 -3
  34. package/dist/internal.js.map +1 -1
  35. package/dist/{props-DAyeRPwH.d.ts → props-BEgIVMRx.d.ts} +8 -15
  36. package/dist/{props-CBwuh35e.d.cts → props-BIfromL0.d.cts} +8 -15
  37. package/dist/scope-Cx_3CjIZ.d.cts +18 -0
  38. package/dist/scope-CzNkn587.d.ts +18 -0
  39. package/package.json +3 -3
  40. package/src/advanced.ts +1 -0
  41. package/src/binding.ts +30 -4
  42. package/src/constants.ts +5 -0
  43. package/src/cycle-guard.ts +59 -7
  44. package/src/devtools.ts +22 -2
  45. package/src/dom.ts +84 -10
  46. package/src/hooks.ts +60 -13
  47. package/src/index.ts +3 -1
  48. package/src/internal.ts +2 -2
  49. package/src/lifecycle.ts +13 -5
  50. package/src/memo.ts +3 -4
  51. package/src/props.ts +16 -0
  52. package/src/signal.ts +204 -36
  53. package/dist/chunk-2U6M3LKS.cjs.map +0 -1
  54. package/dist/chunk-YVDWXY44.js.map +0 -1
  55. package/dist/scope-DvgMquEy.d.ts +0 -55
  56. package/dist/scope-xmdo6lVU.d.cts +0 -55
  57. /package/dist/{chunk-UHXUEGQH.js.map → chunk-TWELIZRY.js.map} +0 -0
  58. /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-YVDWXY44.js";
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-UHXUEGQH.js.map
45
+ //# sourceMappingURL=chunk-TWELIZRY.js.map
@@ -10,7 +10,7 @@ import {
10
10
  pushRoot,
11
11
  removeNodes,
12
12
  toNodeArray
13
- } from "./chunk-YVDWXY44.js";
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-3WD7QD5G.js.map
109
+ //# sourceMappingURL=chunk-XLIZJMMJ.js.map
@@ -1,4 +1,38 @@
1
- import { B as BaseProps, F as FictNode } from './effect-ClARNUCc.cjs';
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-ClARNUCc.js';
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 { bindRef as A, type BaseProps as B, type Cleanup as C, type DOMElement as D, type Effect as E, type FictNode as F, insert as G, createConditional as H, spread as I, assign as J, classList as K, delegateEvents as L, clearDelegatedEvents as M, addEventListener as N, type MaybeReactive as O, type PropsWithChildren as P, type BindingHandle as Q, type RefObject as R, type SuspenseToken as S, type CreateElementFn as T, type AttributeSetter as U, createChildBinding as a, createAttributeBinding as b, createTextBinding as c, createStyleBinding as d, createClassBinding as e, createShow as f, createRenderEffect as g, createEffect as h, isReactive as i, createPortal as j, type FictVNode as k, type Component as l, type Ref as m, type RefCallback as n, type StyleProp as o, type ClassProp as p, type EventHandler as q, type ErrorInfo as r, bindText as s, bindAttribute as t, unwrap as u, bindStyle as v, bindClass as w, bindEvent as x, callEventHandler as y, bindProperty as z };
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 { bindRef as A, type BaseProps as B, type Cleanup as C, type DOMElement as D, type Effect as E, type FictNode as F, insert as G, createConditional as H, spread as I, assign as J, classList as K, delegateEvents as L, clearDelegatedEvents as M, addEventListener as N, type MaybeReactive as O, type PropsWithChildren as P, type BindingHandle as Q, type RefObject as R, type SuspenseToken as S, type CreateElementFn as T, type AttributeSetter as U, createChildBinding as a, createAttributeBinding as b, createTextBinding as c, createStyleBinding as d, createClassBinding as e, createShow as f, createRenderEffect as g, createEffect as h, isReactive as i, createPortal as j, type FictVNode as k, type Component as l, type Ref as m, type RefCallback as n, type StyleProp as o, type ClassProp as p, type EventHandler as q, type ErrorInfo as r, bindText as s, bindAttribute as t, unwrap as u, bindStyle as v, bindClass as w, bindEvent as x, callEventHandler as y, bindProperty as z };
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 _chunkW525IQWCcjs = require('./chunk-W525IQWC.cjs');
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
- var _chunk2U6M3LKScjs = require('./chunk-2U6M3LKS.cjs');
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 = _chunk2U6M3LKScjs.getCurrentRoot.call(void 0, );
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
- _chunk2U6M3LKScjs.removeNodes.call(void 0, activeNodes);
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 = _chunk2U6M3LKScjs.createRootContext.call(void 0, hostRoot);
74
- const prev = _chunk2U6M3LKScjs.pushRoot.call(void 0, root);
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 = _chunk2U6M3LKScjs.createElement.call(void 0, value);
78
- nodes = _chunk2U6M3LKScjs.toNodeArray.call(void 0, output);
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
- _chunk2U6M3LKScjs.insertNodesBefore.call(void 0, parentNode, nodes, marker);
82
+ _chunkID3WBWNOcjs.insertNodesBefore.call(void 0, parentNode, nodes, marker);
82
83
  }
83
84
  } catch (err) {
84
- _chunk2U6M3LKScjs.popRoot.call(void 0, prev);
85
- _chunk2U6M3LKScjs.destroyRoot.call(void 0, root);
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
- _chunk2U6M3LKScjs.popRoot.call(void 0, prev);
101
- _chunk2U6M3LKScjs.flushOnMount.call(void 0, root);
101
+ _chunkID3WBWNOcjs.popRoot.call(void 0, prev);
102
+ _chunkID3WBWNOcjs.flushOnMount.call(void 0, root);
102
103
  cleanup = () => {
103
- _chunk2U6M3LKScjs.destroyRoot.call(void 0, root);
104
- _chunk2U6M3LKScjs.removeNodes.call(void 0, nodes);
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
- _chunk2U6M3LKScjs.registerErrorHandler.call(void 0, (err) => {
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
- _chunk2U6M3LKScjs.createEffect.call(void 0, () => {
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 = _chunk2U6M3LKScjs.signal.call(void 0, 0);
152
+ const pending = _chunkID3WBWNOcjs.signal.call(void 0, 0);
152
153
  let resolvedOnce = false;
153
154
  let epoch = 0;
154
- const hostRoot = _chunk2U6M3LKScjs.getCurrentRoot.call(void 0, );
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
- _chunk2U6M3LKScjs.removeNodes.call(void 0, activeNodes);
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 = _chunk2U6M3LKScjs.createRootContext.call(void 0, hostRoot);
169
- const prev = _chunk2U6M3LKScjs.pushRoot.call(void 0, root);
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 = _chunk2U6M3LKScjs.createElement.call(void 0, view);
173
- nodes = _chunk2U6M3LKScjs.toNodeArray.call(void 0, output);
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
- _chunk2U6M3LKScjs.popRoot.call(void 0, prev);
177
- _chunk2U6M3LKScjs.destroyRoot.call(void 0, root);
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
- _chunk2U6M3LKScjs.insertNodesBefore.call(void 0, parentNode, nodes, marker);
183
+ _chunkID3WBWNOcjs.insertNodesBefore.call(void 0, parentNode, nodes, marker);
183
184
  }
184
185
  } catch (err) {
185
- _chunk2U6M3LKScjs.popRoot.call(void 0, prev);
186
- _chunk2U6M3LKScjs.destroyRoot.call(void 0, root);
187
- if (!_chunk2U6M3LKScjs.handleError.call(void 0, err, { source: "render" }, hostRoot)) {
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
- _chunk2U6M3LKScjs.popRoot.call(void 0, prev);
193
- _chunk2U6M3LKScjs.flushOnMount.call(void 0, root);
193
+ _chunkID3WBWNOcjs.popRoot.call(void 0, prev);
194
+ _chunkID3WBWNOcjs.flushOnMount.call(void 0, root);
194
195
  cleanup = () => {
195
- _chunk2U6M3LKScjs.destroyRoot.call(void 0, root);
196
- _chunk2U6M3LKScjs.removeNodes.call(void 0, nodes);
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
- _chunk2U6M3LKScjs.registerSuspenseHandler.call(void 0, (token) => {
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 (!_chunk2U6M3LKScjs.handleError.call(void 0, err, { source: "render" }, hostRoot)) {
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
- _chunk2U6M3LKScjs.createEffect.call(void 0, () => {
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
- exports.ErrorBoundary = ErrorBoundary; exports.Fragment = _chunk2U6M3LKScjs.Fragment; exports.Suspense = Suspense; exports.batch = _chunk2U6M3LKScjs.batch2; exports.createContext = _chunkW525IQWCcjs.createContext; exports.createEffect = _chunk2U6M3LKScjs.createEffect; exports.createElement = _chunk2U6M3LKScjs.createElement; exports.createMemo = _chunk2U6M3LKScjs.createMemo; exports.createPortal = _chunk2U6M3LKScjs.createPortal; exports.createRef = createRef; exports.createRoot = _chunk2U6M3LKScjs.createRoot; exports.createSuspenseToken = createSuspenseToken; exports.hasContext = _chunkW525IQWCcjs.hasContext; exports.mergeProps = _chunk2U6M3LKScjs.mergeProps; exports.onCleanup = _chunk2U6M3LKScjs.onCleanup; exports.onDestroy = _chunk2U6M3LKScjs.onDestroy; exports.onMount = _chunk2U6M3LKScjs.onMount; exports.prop = _chunk2U6M3LKScjs.prop; exports.render = _chunk2U6M3LKScjs.render; exports.startTransition = _chunk2U6M3LKScjs.startTransition; exports.untrack = _chunk2U6M3LKScjs.untrack2; exports.useContext = _chunkW525IQWCcjs.useContext; exports.useDeferredValue = _chunk2U6M3LKScjs.useDeferredValue; exports.useTransition = _chunk2U6M3LKScjs.useTransition;
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
@@ -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, e as createElement, c as createMemo, d as createRoot, m as mergeProps, b as onCleanup, a as onDestroy, o as onMount, p as prop, r as render } from './props-CBwuh35e.cjs';
2
- import { R as RefObject, B as BaseProps, F as FictNode, S as SuspenseToken } from './effect-ClARNUCc.cjs';
3
- export { p as ClassProp, C as Cleanup, l as Component, D as DOMElement, E as Effect, r as ErrorInfo, q as EventHandler, k as FictVNode, P as PropsWithChildren, m as Ref, n as RefCallback, o as StyleProp, h as createEffect, j as createPortal } from './effect-ClARNUCc.cjs';
4
- export { C as Context, P as ProviderProps, c as createContext, h as hasContext, u as useContext } from './context-9gFXOdJl.cjs';
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, e as createElement, c as createMemo, d as createRoot, m as mergeProps, b as onCleanup, a as onDestroy, o as onMount, p as prop, r as render } from './props-DAyeRPwH.js';
2
- import { R as RefObject, B as BaseProps, F as FictNode, S as SuspenseToken } from './effect-ClARNUCc.js';
3
- export { p as ClassProp, C as Cleanup, l as Component, D as DOMElement, E as Effect, r as ErrorInfo, q as EventHandler, k as FictVNode, P as PropsWithChildren, m as Ref, n as RefCallback, o as StyleProp, h as createEffect, j as createPortal } from './effect-ClARNUCc.js';
4
- export { C as Context, P as ProviderProps, c as createContext, h as hasContext, u as useContext } from './context-4woHo7-L.js';
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.