@fictjs/runtime 0.2.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/dist/advanced.cjs +10 -8
  2. package/dist/advanced.cjs.map +1 -1
  3. package/dist/advanced.d.cts +10 -16
  4. package/dist/advanced.d.ts +10 -16
  5. package/dist/advanced.js +5 -3
  6. package/dist/advanced.js.map +1 -1
  7. package/dist/{chunk-3U7EBKEU.cjs → chunk-ID3WBWNO.cjs} +559 -319
  8. package/dist/chunk-ID3WBWNO.cjs.map +1 -0
  9. package/dist/{chunk-3A4VW6AK.cjs → chunk-L4DIV3RC.cjs} +7 -7
  10. package/dist/{chunk-3A4VW6AK.cjs.map → chunk-L4DIV3RC.cjs.map} +1 -1
  11. package/dist/{chunk-URDFDRHR.cjs → chunk-M2TSXZ4C.cjs} +16 -16
  12. package/dist/{chunk-URDFDRHR.cjs.map → chunk-M2TSXZ4C.cjs.map} +1 -1
  13. package/dist/{chunk-YVS4WJ2W.js → chunk-SO6X7G5S.js} +558 -318
  14. package/dist/chunk-SO6X7G5S.js.map +1 -0
  15. package/dist/{chunk-LU2LD2WJ.js → chunk-TWELIZRY.js} +2 -2
  16. package/dist/{chunk-TEYUDPTA.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 +430 -246
  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 +1 -1
  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 +164 -103
  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-3U7EBKEU.cjs.map +0 -1
  54. package/dist/chunk-YVS4WJ2W.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-LU2LD2WJ.js.map → chunk-TWELIZRY.js.map} +0 -0
  58. /package/dist/{chunk-TEYUDPTA.js.map → chunk-XLIZJMMJ.js.map} +0 -0
package/dist/index.js CHANGED
@@ -2,7 +2,7 @@ import {
2
2
  createContext,
3
3
  hasContext,
4
4
  useContext
5
- } from "./chunk-TEYUDPTA.js";
5
+ } from "./chunk-XLIZJMMJ.js";
6
6
  import {
7
7
  Fragment,
8
8
  batch2 as batch,
@@ -17,6 +17,7 @@ import {
17
17
  getCurrentRoot,
18
18
  handleError,
19
19
  insertNodesBefore,
20
+ keyed,
20
21
  mergeProps,
21
22
  onCleanup,
22
23
  onDestroy,
@@ -34,7 +35,7 @@ import {
34
35
  untrack2 as untrack,
35
36
  useDeferredValue,
36
37
  useTransition
37
- } from "./chunk-YVS4WJ2W.js";
38
+ } from "./chunk-SO6X7G5S.js";
38
39
 
39
40
  // src/ref.ts
40
41
  function createRef() {
@@ -273,6 +274,7 @@ export {
273
274
  createRoot,
274
275
  createSuspenseToken,
275
276
  hasContext,
277
+ keyed,
276
278
  mergeProps,
277
279
  onCleanup,
278
280
  onDestroy,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ref.ts","../src/error-boundary.ts","../src/suspense.ts"],"sourcesContent":["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"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/ref.ts","../src/error-boundary.ts","../src/suspense.ts"],"sourcesContent":["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"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsBO,SAAS,YAA2D;AACzE,SAAO,EAAE,SAAS,KAAK;AACzB;;;ACJO,SAAS,cAAc,OAAqC;AACjE,QAAM,WAAW,SAAS,uBAAuB;AACjD,QAAM,SAAS,SAAS,cAAc,qBAAqB;AAC3D,WAAS,YAAY,MAAM;AAE3B,QAAM,WAAW,eAAe;AAEhC,MAAI;AACJ,MAAI,cAAsB,CAAC;AAC3B,MAAI,oBAAoB;AAExB,MAAI,QAAQ,MAAM;AAAA,EAAC;AACnB,QAAM,SAAS,CAAC,QAAyC;AACvD,QAAI,OAAO,MAAM;AACf,aAAO,OAAO,MAAM,aAAa,aAC5B,MAAM,SAA0D,KAAK,KAAK,IAC3E,MAAM;AAAA,IACZ;AACA,WAAO,MAAM,YAAY;AAAA,EAC3B;AAEA,QAAM,cAAc,CAAC,UAA2B;AAC9C,QAAI,SAAS;AACX,cAAQ;AACR,gBAAU;AAAA,IACZ;AACA,QAAI,YAAY,QAAQ;AACtB,kBAAY,WAAW;AACvB,oBAAc,CAAC;AAAA,IACjB;AAEA,QAAI,SAAS,QAAQ,UAAU,OAAO;AACpC;AAAA,IACF;AAEA,UAAM,OAAO,kBAAkB,QAAQ;AACvC,UAAM,OAAO,SAAS,IAAI;AAC1B,QAAI,QAAgB,CAAC;AACrB,QAAI;AACF,YAAM,SAAS,cAAc,KAAK;AAClC,cAAQ,YAAY,MAAM;AAC1B,YAAM,aAAa,OAAO;AAC1B,UAAI,YAAY;AACd,0BAAkB,YAAY,OAAO,MAAM;AAAA,MAC7C;AAAA,IACF,SAAS,KAAK;AACZ,cAAQ,IAAI;AACZ,kBAAY,IAAI;AAEhB,UAAI,mBAAmB;AACrB,cAAM;AAAA,MACR;AAGA,0BAAoB;AACpB,UAAI;AACF,oBAAY,OAAO,GAAG,CAAC;AAGvB,4BAAoB;AACpB,cAAM,UAAU,GAAG;AAAA,MACrB,SAAS,aAAa;AAIpB,cAAM,UAAU,GAAG;AACnB,cAAM;AAAA,MACR;AACA;AAAA,IACF;AACA,YAAQ,IAAI;AACZ,iBAAa,IAAI;AAEjB,cAAU,MAAM;AACd,kBAAY,IAAI;AAChB,kBAAY,KAAK;AAAA,IACnB;AACA,kBAAc;AAAA,EAChB;AAEA,UAAQ,MAAM;AACZ,wBAAoB;AACpB,gBAAY,OAAO,IAAI,CAAC;AAAA,EAC1B;AAEA,cAAY,MAAM,YAAY,IAAI;AAElC,uBAAqB,SAAO;AAC1B,gBAAY,OAAO,GAAG,CAAC;AACvB,UAAM,UAAU,GAAG;AACnB,WAAO;AAAA,EACT,CAAC;AAED,MAAI,MAAM,cAAc,QAAW;AACjC,UAAM,WACJ,OAAO,MAAM,cAAc,cAAe,MAAM,UAA4B,WAAW;AACzF,UAAM,SAAS,WAAY,MAAM,YAA8B;AAC/D,QAAI,OAAO,WAAW,OAAQ,IAAI,MAAM;AACxC,iBAAa,MAAM;AACjB,YAAM,OAAO,SAAS,OAAO,IAAI,MAAM;AACvC,UAAI,SAAS,MAAM;AACjB,eAAO;AACP,oBAAY,OAAO,IAAI,CAAC;AAAA,MAC1B;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AACT;;;ACnGO,SAAS,sBAAsC;AACpD,MAAI;AACJ,MAAI;AACJ,QAAM,UAAU,IAAI,QAAc,CAAC,KAAK,QAAQ;AAC9C,cAAU;AACV,aAAS;AAAA,EACX,CAAC;AACD,SAAO;AAAA,IACL,OAAO;AAAA,MACL,MAAM,QAAQ,KAAK,KAAK,OAAO;AAAA,IACjC;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,IAAM,aAAa,CAAC,UAClB,OAAO,UAAU,YACjB,UAAU,QACV,OAAQ,MAA+B,SAAS;AAE3C,SAAS,SAAS,OAAgC;AACvD,QAAM,UAAU,OAAa,CAAC;AAC9B,MAAI,eAAe;AACnB,MAAI,QAAQ;AACZ,QAAM,WAAW,eAAe;AAEhC,QAAM,aAAa,CAAC,QAClB,OAAO,MAAM,aAAa,aACrB,MAAM,SAAuC,GAAG,IACjD,MAAM;AAEZ,QAAM,aAAa,CAAC,SAA0B;AAC5C,QAAI,SAAS;AACX,cAAQ;AACR,gBAAU;AAAA,IACZ;AACA,QAAI,YAAY,QAAQ;AACtB,kBAAY,WAAW;AACvB,oBAAc,CAAC;AAAA,IACjB;AAEA,QAAI,QAAQ,QAAQ,SAAS,OAAO;AAClC;AAAA,IACF;AAEA,UAAM,OAAO,kBAAkB,QAAQ;AACvC,UAAM,OAAO,SAAS,IAAI;AAC1B,QAAI,QAAgB,CAAC;AACrB,QAAI;AACF,YAAM,SAAS,cAAc,IAAI;AACjC,cAAQ,YAAY,MAAM;AAG1B,YAAM,mBACJ,KAAK,aACJ,MAAM,SAAS,KACd,MAAM,MAAM,UAAQ,gBAAgB,WAAY,KAAiB,SAAS,cAAc;AAC5F,UAAI,kBAAkB;AACpB,gBAAQ,IAAI;AACZ,oBAAY,IAAI;AAChB;AAAA,MACF;AACA,YAAM,aAAa,OAAO;AAC1B,UAAI,YAAY;AACd,0BAAkB,YAAY,OAAO,MAAM;AAAA,MAC7C;AAAA,IACF,SAAS,KAAK;AACZ,cAAQ,IAAI;AACZ,kBAAY,IAAI;AAChB,UAAI,CAAC,YAAY,KAAK,EAAE,QAAQ,SAAS,GAAG,QAAQ,GAAG;AACrD,cAAM;AAAA,MACR;AACA;AAAA,IACF;AACA,YAAQ,IAAI;AACZ,iBAAa,IAAI;AAEjB,cAAU,MAAM;AACd,kBAAY,IAAI;AAChB,kBAAY,KAAK;AAAA,IACnB;AACA,kBAAc;AAAA,EAChB;AAEA,QAAM,WAAW,SAAS,uBAAuB;AACjD,QAAM,SAAS,SAAS,cAAc,eAAe;AACrD,WAAS,YAAY,MAAM;AAC3B,MAAI;AACJ,MAAI,cAAsB,CAAC;AAE3B,QAAM,iBAAiB,MAAM;AAC3B,QAAI,CAAC,cAAc;AACjB,qBAAe;AACf,YAAM,YAAY;AAAA,IACpB;AAAA,EACF;AAEA,0BAAwB,WAAS;AAC/B,UAAM,aAAa;AACnB,YAAQ,QAAQ,IAAI,CAAC;AAGrB,eAAW,WAAW,CAAC;AAEvB,UAAM,WAAY,MAAwB,OACrC,QACD,WAAW,KAAK,IACd,QACA;AAEN,QAAI,UAAU;AACZ,eAAS;AAAA,QACP,MAAM;AAGJ,cAAI,UAAU,YAAY;AAExB;AAAA,UACF;AAIA,gBAAM,aAAa,KAAK,IAAI,GAAG,QAAQ,IAAI,CAAC;AAC5C,kBAAQ,UAAU;AAClB,cAAI,eAAe,GAAG;AAEpB,uBAAW,MAAM,YAAY,IAAI;AACjC,2BAAe;AAAA,UACjB;AAAA,QACF;AAAA,QACA,SAAO;AAEL,cAAI,UAAU,YAAY;AACxB;AAAA,UACF;AACA,gBAAM,aAAa,KAAK,IAAI,GAAG,QAAQ,IAAI,CAAC;AAC5C,kBAAQ,UAAU;AAClB,gBAAM,WAAW,GAAG;AACpB,cAAI,CAAC,YAAY,KAAK,EAAE,QAAQ,SAAS,GAAG,QAAQ,GAAG;AACrD,kBAAM;AAAA,UACR;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT,CAAC;AAKD,aAAW,MAAM,YAAY,IAAI;AAEjC,MAAI,MAAM,cAAc,QAAW;AACjC,UAAM,WACJ,OAAO,MAAM,cAAc,cAAe,MAAM,UAA4B,WAAW;AACzF,UAAM,SAAS,WAAY,MAAM,YAA8B;AAC/D,QAAI,OAAO,WAAW,OAAQ,IAAI,MAAM;AACxC,iBAAa,MAAM;AACjB,YAAM,OAAO,SAAS,OAAO,IAAI,MAAM;AACvC,UAAI,SAAS,MAAM;AACjB,eAAO;AACP;AACA,gBAAQ,CAAC;AAET,mBAAW,MAAM,YAAY,IAAI;AAAA,MACnC;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AACT;","names":[]}
package/dist/internal.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
2
2
 
3
- var _chunk3A4VW6AKcjs = require('./chunk-3A4VW6AK.cjs');
3
+ var _chunkL4DIV3RCcjs = require('./chunk-L4DIV3RC.cjs');
4
4
 
5
5
 
6
6
 
@@ -66,7 +66,9 @@ var _chunk3A4VW6AKcjs = require('./chunk-3A4VW6AK.cjs');
66
66
 
67
67
 
68
68
 
69
- var _chunk3U7EBKEUcjs = require('./chunk-3U7EBKEU.cjs');
69
+
70
+
71
+ var _chunkID3WBWNOcjs = require('./chunk-ID3WBWNO.cjs');
70
72
 
71
73
  // src/store.ts
72
74
  var PROXY = Symbol("fict:store-proxy");
@@ -76,7 +78,7 @@ function createStore(initialValue) {
76
78
  const unwrapped = unwrap2(initialValue);
77
79
  const wrapped = wrap(unwrapped);
78
80
  function setStore(fn) {
79
- _chunk3U7EBKEUcjs.batch.call(void 0, () => {
81
+ _chunkID3WBWNOcjs.batch.call(void 0, () => {
80
82
  const result = fn(wrapped);
81
83
  if (result !== void 0) {
82
84
  reconcile(wrapped, result);
@@ -176,7 +178,7 @@ function track(target, prop2) {
176
178
  let s = signals.get(prop2);
177
179
  if (!s) {
178
180
  const initial = prop2 === ITERATE_KEY ? Reflect.ownKeys(target).length : getLastValue(target, prop2);
179
- s = _chunk3U7EBKEUcjs.signal.call(void 0, initial);
181
+ s = _chunkID3WBWNOcjs.signal.call(void 0, initial);
180
182
  signals.set(prop2, s);
181
183
  }
182
184
  s();
@@ -311,7 +313,7 @@ function reconcileArrays(parentNode, a, b) {
311
313
  }
312
314
 
313
315
  // src/list-helpers.ts
314
- var isDev = true ? false : typeof process === "undefined" || _optionalChain([process, 'access', _7 => _7.env, 'optionalAccess', _8 => _8.NODE_ENV]) !== "production";
316
+ var isDev = typeof __DEV__ !== "undefined" ? __DEV__ : typeof process === "undefined" || _optionalChain([process, 'access', _7 => _7.env, 'optionalAccess', _8 => _8.NODE_ENV]) !== "production";
315
317
  function moveNodesBefore(parent, nodes, anchor) {
316
318
  for (let i = nodes.length - 1; i >= 0; i--) {
317
319
  const node = nodes[i];
@@ -351,7 +353,7 @@ var MAX_SAFE_VERSION = 9007199254740991;
351
353
  function createVersionedSignalAccessor(initialValue) {
352
354
  let current = initialValue;
353
355
  let version = 0;
354
- const track2 = _chunk3U7EBKEUcjs.signal.call(void 0, version);
356
+ const track2 = _chunkID3WBWNOcjs.signal.call(void 0, version);
355
357
  function accessor(value) {
356
358
  if (arguments.length === 0) {
357
359
  track2();
@@ -368,7 +370,7 @@ function createKeyedListContainer() {
368
370
  const endMarker = document.createComment("fict:list:end");
369
371
  const dispose = () => {
370
372
  for (const block of container.blocks.values()) {
371
- _chunk3U7EBKEUcjs.destroyRoot.call(void 0, block.root);
373
+ _chunkID3WBWNOcjs.destroyRoot.call(void 0, block.root);
372
374
  }
373
375
  container.blocks.clear();
374
376
  container.nextBlocks.clear();
@@ -407,32 +409,32 @@ function createKeyedListContainer() {
407
409
  }
408
410
  function createKeyedBlock(key, item, index, render, needsIndex = true, hostRoot) {
409
411
  const itemSig = createVersionedSignalAccessor(item);
410
- const indexSig = needsIndex ? _chunk3U7EBKEUcjs.signal.call(void 0, index) : ((next) => {
412
+ const indexSig = needsIndex ? _chunkID3WBWNOcjs.signal.call(void 0, index) : ((next) => {
411
413
  if (arguments.length === 0) return index;
412
414
  index = next;
413
415
  return index;
414
416
  });
415
- const root = _chunk3U7EBKEUcjs.createRootContext.call(void 0, hostRoot);
416
- const prevRoot = _chunk3U7EBKEUcjs.pushRoot.call(void 0, root);
417
+ const root = _chunkID3WBWNOcjs.createRootContext.call(void 0, hostRoot);
418
+ const prevRoot = _chunkID3WBWNOcjs.pushRoot.call(void 0, root);
417
419
  let nodes = [];
418
420
  let scopeDispose;
419
- const prevSub = _chunk3U7EBKEUcjs.setActiveSub.call(void 0, void 0);
421
+ const prevSub = _chunkID3WBWNOcjs.setActiveSub.call(void 0, void 0);
420
422
  try {
421
- scopeDispose = _chunk3U7EBKEUcjs.effectScope.call(void 0, () => {
423
+ scopeDispose = _chunkID3WBWNOcjs.effectScope.call(void 0, () => {
422
424
  const rendered = render(itemSig, indexSig, key);
423
425
  if (rendered instanceof Node || Array.isArray(rendered) && rendered.every((n) => n instanceof Node)) {
424
- nodes = _chunk3U7EBKEUcjs.toNodeArray.call(void 0, rendered);
426
+ nodes = _chunkID3WBWNOcjs.toNodeArray.call(void 0, rendered);
425
427
  } else {
426
- const element = _chunk3U7EBKEUcjs.createElement.call(void 0, rendered);
427
- nodes = _chunk3U7EBKEUcjs.toNodeArray.call(void 0, element);
428
+ const element = _chunkID3WBWNOcjs.createElement.call(void 0, rendered);
429
+ nodes = _chunkID3WBWNOcjs.toNodeArray.call(void 0, element);
428
430
  }
429
431
  });
430
432
  if (scopeDispose) {
431
433
  root.cleanups.push(scopeDispose);
432
434
  }
433
435
  } finally {
434
- _chunk3U7EBKEUcjs.setActiveSub.call(void 0, prevSub);
435
- _chunk3U7EBKEUcjs.popRoot.call(void 0, prevRoot);
436
+ _chunkID3WBWNOcjs.setActiveSub.call(void 0, prevSub);
437
+ _chunkID3WBWNOcjs.popRoot.call(void 0, prevRoot);
436
438
  }
437
439
  return {
438
440
  key,
@@ -538,7 +540,7 @@ function createKeyedList(getItems, keyFn, renderItem, needsIndex) {
538
540
  }
539
541
  function createFineGrainedKeyedList(getItems, keyFn, renderItem, needsIndex) {
540
542
  const container = createKeyedListContainer();
541
- const hostRoot = _chunk3U7EBKEUcjs.getCurrentRoot.call(void 0, );
543
+ const hostRoot = _chunkID3WBWNOcjs.getCurrentRoot.call(void 0, );
542
544
  const fragment = document.createDocumentFragment();
543
545
  fragment.append(container.startMarker, container.endMarker);
544
546
  let disposed = false;
@@ -560,7 +562,7 @@ function createFineGrainedKeyedList(getItems, keyFn, renderItem, needsIndex) {
560
562
  if (disposed) return;
561
563
  const parent = getConnectedParent();
562
564
  if (!parent) return;
563
- _chunk3U7EBKEUcjs.batch2.call(void 0, () => {
565
+ _chunkID3WBWNOcjs.batch2.call(void 0, () => {
564
566
  const oldBlocks = container.blocks;
565
567
  const newBlocks = container.nextBlocks;
566
568
  const prevOrderedBlocks = container.orderedBlocks;
@@ -570,7 +572,7 @@ function createFineGrainedKeyedList(getItems, keyFn, renderItem, needsIndex) {
570
572
  if (newItems.length === 0) {
571
573
  if (oldBlocks.size > 0) {
572
574
  for (const block of oldBlocks.values()) {
573
- _chunk3U7EBKEUcjs.destroyRoot.call(void 0, block.root);
575
+ _chunkID3WBWNOcjs.destroyRoot.call(void 0, block.root);
574
576
  }
575
577
  const range = document.createRange();
576
578
  range.setStartAfter(container.startMarker);
@@ -651,8 +653,8 @@ function createFineGrainedKeyedList(getItems, keyFn, renderItem, needsIndex) {
651
653
  `[fict] Duplicate key "${String(key)}" detected in list rendering. Each item should have a unique key. The previous item with this key will be replaced.`
652
654
  );
653
655
  }
654
- _chunk3U7EBKEUcjs.destroyRoot.call(void 0, existingBlock.root);
655
- _chunk3U7EBKEUcjs.removeNodes.call(void 0, existingBlock.nodes);
656
+ _chunkID3WBWNOcjs.destroyRoot.call(void 0, existingBlock.root);
657
+ _chunkID3WBWNOcjs.removeNodes.call(void 0, existingBlock.nodes);
656
658
  }
657
659
  block = createKeyedBlock(key, item, index, renderItem, needsIndex, hostRoot);
658
660
  createdBlocks.push(block);
@@ -665,8 +667,8 @@ function createFineGrainedKeyedList(getItems, keyFn, renderItem, needsIndex) {
665
667
  hasDuplicateKey = true;
666
668
  const prior = nextOrderedBlocks[position];
667
669
  if (prior && prior !== resolvedBlock) {
668
- _chunk3U7EBKEUcjs.destroyRoot.call(void 0, prior.root);
669
- _chunk3U7EBKEUcjs.removeNodes.call(void 0, prior.nodes);
670
+ _chunkID3WBWNOcjs.destroyRoot.call(void 0, prior.root);
671
+ _chunkID3WBWNOcjs.removeNodes.call(void 0, prior.nodes);
670
672
  }
671
673
  nextOrderedBlocks[position] = resolvedBlock;
672
674
  } else {
@@ -704,7 +706,7 @@ function createFineGrainedKeyedList(getItems, keyFn, renderItem, needsIndex) {
704
706
  }
705
707
  }
706
708
  if (appendedNodes.length > 0) {
707
- _chunk3U7EBKEUcjs.insertNodesBefore.call(void 0, parent, appendedNodes, container.endMarker);
709
+ _chunkID3WBWNOcjs.insertNodesBefore.call(void 0, parent, appendedNodes, container.endMarker);
708
710
  const currentNodes = container.currentNodes;
709
711
  currentNodes.pop();
710
712
  for (let i = 0; i < appendedNodes.length; i++) {
@@ -718,15 +720,15 @@ function createFineGrainedKeyedList(getItems, keyFn, renderItem, needsIndex) {
718
720
  container.nextOrderedBlocks = prevOrderedBlocks;
719
721
  for (const block of createdBlocks) {
720
722
  if (newBlocks.get(block.key) === block) {
721
- _chunk3U7EBKEUcjs.flushOnMount.call(void 0, block.root);
723
+ _chunkID3WBWNOcjs.flushOnMount.call(void 0, block.root);
722
724
  }
723
725
  }
724
726
  return;
725
727
  }
726
728
  if (oldBlocks.size > 0) {
727
729
  for (const block of oldBlocks.values()) {
728
- _chunk3U7EBKEUcjs.destroyRoot.call(void 0, block.root);
729
- _chunk3U7EBKEUcjs.removeNodes.call(void 0, block.nodes);
730
+ _chunkID3WBWNOcjs.destroyRoot.call(void 0, block.root);
731
+ _chunkID3WBWNOcjs.removeNodes.call(void 0, block.nodes);
730
732
  }
731
733
  oldBlocks.clear();
732
734
  }
@@ -785,7 +787,7 @@ function createFineGrainedKeyedList(getItems, keyFn, renderItem, needsIndex) {
785
787
  container.nextOrderedBlocks = prevOrderedBlocks;
786
788
  for (const block of createdBlocks) {
787
789
  if (newBlocks.get(block.key) === block) {
788
- _chunk3U7EBKEUcjs.flushOnMount.call(void 0, block.root);
790
+ _chunkID3WBWNOcjs.flushOnMount.call(void 0, block.root);
789
791
  }
790
792
  }
791
793
  });
@@ -799,15 +801,15 @@ function createFineGrainedKeyedList(getItems, keyFn, renderItem, needsIndex) {
799
801
  const parent = getConnectedParent();
800
802
  if (!parent) return false;
801
803
  const start = () => {
802
- effectDispose = _chunk3U7EBKEUcjs.createRenderEffect.call(void 0, performDiff);
804
+ effectDispose = _chunkID3WBWNOcjs.createRenderEffect.call(void 0, performDiff);
803
805
  effectStarted = true;
804
806
  };
805
807
  if (hostRoot) {
806
- const prev = _chunk3U7EBKEUcjs.pushRoot.call(void 0, hostRoot);
808
+ const prev = _chunkID3WBWNOcjs.pushRoot.call(void 0, hostRoot);
807
809
  try {
808
810
  start();
809
811
  } finally {
810
- _chunk3U7EBKEUcjs.popRoot.call(void 0, prev);
812
+ _chunkID3WBWNOcjs.popRoot.call(void 0, prev);
811
813
  }
812
814
  } else {
813
815
  start();
@@ -821,7 +823,7 @@ function createFineGrainedKeyedList(getItems, keyFn, renderItem, needsIndex) {
821
823
  if (getConnectedParent()) {
822
824
  disconnectObserver();
823
825
  if (ensureEffectStarted()) {
824
- _chunk3U7EBKEUcjs.flush.call(void 0, );
826
+ _chunkID3WBWNOcjs.flush.call(void 0, );
825
827
  }
826
828
  }
827
829
  });
@@ -855,7 +857,7 @@ function createFineGrainedKeyedList(getItems, keyFn, renderItem, needsIndex) {
855
857
  if (disposed) return;
856
858
  scheduleStart();
857
859
  if (ensureEffectStarted()) {
858
- _chunk3U7EBKEUcjs.flush.call(void 0, );
860
+ _chunkID3WBWNOcjs.flush.call(void 0, );
859
861
  } else {
860
862
  waitForConnection();
861
863
  }
@@ -928,5 +930,7 @@ function createFineGrainedKeyedList(getItems, keyFn, renderItem, needsIndex) {
928
930
 
929
931
 
930
932
 
931
- exports.Aliases = _chunk3U7EBKEUcjs.Aliases; exports.BooleanAttributes = _chunk3U7EBKEUcjs.BooleanAttributes; exports.ChildProperties = _chunk3U7EBKEUcjs.ChildProperties; exports.DelegatedEvents = _chunk3U7EBKEUcjs.DelegatedEvents; exports.Fragment = _chunk3U7EBKEUcjs.Fragment; exports.Properties = _chunk3U7EBKEUcjs.Properties; exports.SVGElements = _chunk3U7EBKEUcjs.SVGElements; exports.SVGNamespace = _chunk3U7EBKEUcjs.SVGNamespace; exports.UnitlessStyles = _chunk3U7EBKEUcjs.UnitlessStyles; exports.__fictPopContext = _chunk3U7EBKEUcjs.__fictPopContext; exports.__fictProp = _chunk3U7EBKEUcjs.__fictProp; exports.__fictPropsRest = _chunk3U7EBKEUcjs.__fictPropsRest; exports.__fictPushContext = _chunk3U7EBKEUcjs.__fictPushContext; exports.__fictRender = _chunk3U7EBKEUcjs.__fictRender; exports.__fictResetContext = _chunk3U7EBKEUcjs.__fictResetContext; exports.__fictUseContext = _chunk3U7EBKEUcjs.__fictUseContext; exports.__fictUseEffect = _chunk3U7EBKEUcjs.__fictUseEffect; exports.__fictUseMemo = _chunk3U7EBKEUcjs.__fictUseMemo; exports.__fictUseSignal = _chunk3U7EBKEUcjs.__fictUseSignal; exports.addEventListener = _chunk3U7EBKEUcjs.addEventListener; exports.assign = _chunk3U7EBKEUcjs.assign; exports.bindAttribute = _chunk3U7EBKEUcjs.bindAttribute; exports.bindClass = _chunk3U7EBKEUcjs.bindClass; exports.bindEvent = _chunk3U7EBKEUcjs.bindEvent; exports.bindProperty = _chunk3U7EBKEUcjs.bindProperty; exports.bindRef = _chunk3U7EBKEUcjs.bindRef; exports.bindStyle = _chunk3U7EBKEUcjs.bindStyle; exports.bindText = _chunk3U7EBKEUcjs.bindText; exports.callEventHandler = _chunk3U7EBKEUcjs.callEventHandler; exports.classList = _chunk3U7EBKEUcjs.classList; exports.clearDelegatedEvents = _chunk3U7EBKEUcjs.clearDelegatedEvents; exports.createConditional = _chunk3U7EBKEUcjs.createConditional; exports.createEffect = _chunk3U7EBKEUcjs.createEffect; exports.createElement = _chunk3U7EBKEUcjs.createElement; exports.createKeyedList = createKeyedList; exports.createMemo = _chunk3U7EBKEUcjs.createMemo; exports.createPortal = _chunk3U7EBKEUcjs.createPortal; exports.createPropsProxy = _chunk3U7EBKEUcjs.createPropsProxy; exports.createRenderEffect = _chunk3U7EBKEUcjs.createRenderEffect; exports.createSelector = _chunk3U7EBKEUcjs.createSelector; exports.createSignal = _chunk3U7EBKEUcjs.signal; exports.createStore = createStore; exports.delegateEvents = _chunk3U7EBKEUcjs.delegateEvents; exports.getPropAlias = _chunk3U7EBKEUcjs.getPropAlias; exports.insert = _chunk3U7EBKEUcjs.insert; exports.insertNodesBefore = _chunk3U7EBKEUcjs.insertNodesBefore; exports.isNodeBetweenMarkers = isNodeBetweenMarkers; exports.isReactive = _chunk3U7EBKEUcjs.isReactive; exports.mergeProps = _chunk3U7EBKEUcjs.mergeProps; exports.moveNodesBefore = moveNodesBefore; exports.onDestroy = _chunk3U7EBKEUcjs.onDestroy; exports.prop = _chunk3U7EBKEUcjs.prop; exports.reconcileArrays = reconcileArrays; exports.removeNodes = _chunk3U7EBKEUcjs.removeNodes; exports.runInScope = _chunk3A4VW6AKcjs.runInScope; exports.spread = _chunk3U7EBKEUcjs.spread; exports.template = _chunk3U7EBKEUcjs.template; exports.toNodeArray = _chunk3U7EBKEUcjs.toNodeArray; exports.unwrap = _chunk3U7EBKEUcjs.unwrap;
933
+
934
+
935
+ exports.Aliases = _chunkID3WBWNOcjs.Aliases; exports.BooleanAttributes = _chunkID3WBWNOcjs.BooleanAttributes; exports.ChildProperties = _chunkID3WBWNOcjs.ChildProperties; exports.DelegatedEvents = _chunkID3WBWNOcjs.DelegatedEvents; exports.Fragment = _chunkID3WBWNOcjs.Fragment; exports.Properties = _chunkID3WBWNOcjs.Properties; exports.SVGElements = _chunkID3WBWNOcjs.SVGElements; exports.SVGNamespace = _chunkID3WBWNOcjs.SVGNamespace; exports.UnitlessStyles = _chunkID3WBWNOcjs.UnitlessStyles; exports.__fictPopContext = _chunkID3WBWNOcjs.__fictPopContext; exports.__fictProp = _chunkID3WBWNOcjs.__fictProp; exports.__fictPropsRest = _chunkID3WBWNOcjs.__fictPropsRest; exports.__fictPushContext = _chunkID3WBWNOcjs.__fictPushContext; exports.__fictRender = _chunkID3WBWNOcjs.__fictRender; exports.__fictResetContext = _chunkID3WBWNOcjs.__fictResetContext; exports.__fictUseContext = _chunkID3WBWNOcjs.__fictUseContext; exports.__fictUseEffect = _chunkID3WBWNOcjs.__fictUseEffect; exports.__fictUseMemo = _chunkID3WBWNOcjs.__fictUseMemo; exports.__fictUseSignal = _chunkID3WBWNOcjs.__fictUseSignal; exports.__resetReactiveState = _chunkID3WBWNOcjs.__resetReactiveState; exports.addEventListener = _chunkID3WBWNOcjs.addEventListener; exports.assign = _chunkID3WBWNOcjs.assign; exports.bindAttribute = _chunkID3WBWNOcjs.bindAttribute; exports.bindClass = _chunkID3WBWNOcjs.bindClass; exports.bindEvent = _chunkID3WBWNOcjs.bindEvent; exports.bindProperty = _chunkID3WBWNOcjs.bindProperty; exports.bindRef = _chunkID3WBWNOcjs.bindRef; exports.bindStyle = _chunkID3WBWNOcjs.bindStyle; exports.bindText = _chunkID3WBWNOcjs.bindText; exports.callEventHandler = _chunkID3WBWNOcjs.callEventHandler; exports.classList = _chunkID3WBWNOcjs.classList; exports.clearDelegatedEvents = _chunkID3WBWNOcjs.clearDelegatedEvents; exports.createConditional = _chunkID3WBWNOcjs.createConditional; exports.createEffect = _chunkID3WBWNOcjs.createEffect; exports.createElement = _chunkID3WBWNOcjs.createElement; exports.createKeyedList = createKeyedList; exports.createMemo = _chunkID3WBWNOcjs.createMemo; exports.createPortal = _chunkID3WBWNOcjs.createPortal; exports.createPropsProxy = _chunkID3WBWNOcjs.createPropsProxy; exports.createRenderEffect = _chunkID3WBWNOcjs.createRenderEffect; exports.createSelector = _chunkID3WBWNOcjs.createSelector; exports.createSignal = _chunkID3WBWNOcjs.signal; exports.createStore = createStore; exports.delegateEvents = _chunkID3WBWNOcjs.delegateEvents; exports.getPropAlias = _chunkID3WBWNOcjs.getPropAlias; exports.insert = _chunkID3WBWNOcjs.insert; exports.insertNodesBefore = _chunkID3WBWNOcjs.insertNodesBefore; exports.isNodeBetweenMarkers = isNodeBetweenMarkers; exports.isReactive = _chunkID3WBWNOcjs.isReactive; exports.keyed = _chunkID3WBWNOcjs.keyed; exports.mergeProps = _chunkID3WBWNOcjs.mergeProps; exports.moveNodesBefore = moveNodesBefore; exports.onDestroy = _chunkID3WBWNOcjs.onDestroy; exports.prop = _chunkID3WBWNOcjs.prop; exports.reconcileArrays = reconcileArrays; exports.removeNodes = _chunkID3WBWNOcjs.removeNodes; exports.runInScope = _chunkL4DIV3RCcjs.runInScope; exports.spread = _chunkID3WBWNOcjs.spread; exports.template = _chunkID3WBWNOcjs.template; exports.toNodeArray = _chunkID3WBWNOcjs.toNodeArray; exports.unwrap = _chunkID3WBWNOcjs.unwrap;
932
936
  //# sourceMappingURL=internal.cjs.map