@fictjs/runtime 0.5.1 → 0.5.2

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 (48) hide show
  1. package/dist/advanced.cjs +9 -9
  2. package/dist/advanced.js +4 -4
  3. package/dist/{chunk-AR6NSCZM.js → chunk-4NUHM77Z.js} +3 -3
  4. package/dist/{chunk-RY5CY4CI.js → chunk-D2IWOO4X.js} +2 -2
  5. package/dist/{chunk-LFMXNQZC.cjs → chunk-KNGHYGK4.cjs} +17 -17
  6. package/dist/{chunk-LFMXNQZC.cjs.map → chunk-KNGHYGK4.cjs.map} +1 -1
  7. package/dist/{chunk-7BO6P2KP.js → chunk-LRFMCJY3.js} +84 -1
  8. package/dist/chunk-LRFMCJY3.js.map +1 -0
  9. package/dist/{chunk-4ZPZM5IG.cjs → chunk-QB2UD62G.cjs} +8 -8
  10. package/dist/{chunk-4ZPZM5IG.cjs.map → chunk-QB2UD62G.cjs.map} +1 -1
  11. package/dist/{chunk-5OYBRKE4.js → chunk-SLFAEVKJ.js} +3 -3
  12. package/dist/{chunk-WJHXPF7M.cjs → chunk-Z6M3HKLG.cjs} +156 -156
  13. package/dist/{chunk-WJHXPF7M.cjs.map → chunk-Z6M3HKLG.cjs.map} +1 -1
  14. package/dist/{chunk-6RCEIWZL.cjs → chunk-ZR435MDC.cjs} +85 -2
  15. package/dist/chunk-ZR435MDC.cjs.map +1 -0
  16. package/dist/index.cjs +95 -45
  17. package/dist/index.cjs.map +1 -1
  18. package/dist/index.dev.js +87 -7
  19. package/dist/index.dev.js.map +1 -1
  20. package/dist/index.js +60 -10
  21. package/dist/index.js.map +1 -1
  22. package/dist/internal.cjs +51 -41
  23. package/dist/internal.cjs.map +1 -1
  24. package/dist/internal.d.cts +11 -2
  25. package/dist/internal.d.ts +11 -2
  26. package/dist/internal.js +13 -3
  27. package/dist/internal.js.map +1 -1
  28. package/dist/jsx-dev-runtime.d.cts +671 -0
  29. package/dist/jsx-dev-runtime.d.ts +671 -0
  30. package/dist/loader.cjs +60 -8
  31. package/dist/loader.cjs.map +1 -1
  32. package/dist/loader.d.cts +1 -1
  33. package/dist/loader.d.ts +1 -1
  34. package/dist/loader.js +53 -1
  35. package/dist/loader.js.map +1 -1
  36. package/dist/{resume-Dx8_l72o.d.ts → resume-CqeQ3v_q.d.ts} +5 -1
  37. package/dist/{resume-BrAkmSTY.d.cts → resume-i-A3EFox.d.cts} +5 -1
  38. package/package.json +1 -1
  39. package/src/internal.ts +4 -0
  40. package/src/loader.ts +58 -0
  41. package/src/resume.ts +55 -0
  42. package/src/ssr-stream.ts +38 -0
  43. package/src/suspense.ts +62 -7
  44. package/dist/chunk-6RCEIWZL.cjs.map +0 -1
  45. package/dist/chunk-7BO6P2KP.js.map +0 -1
  46. /package/dist/{chunk-AR6NSCZM.js.map → chunk-4NUHM77Z.js.map} +0 -0
  47. /package/dist/{chunk-RY5CY4CI.js.map → chunk-D2IWOO4X.js.map} +0 -0
  48. /package/dist/{chunk-5OYBRKE4.js.map → chunk-SLFAEVKJ.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/delegated-events.ts","../src/constants.ts","../src/devtools.ts","../src/cycle-guard.ts","../src/lifecycle.ts","../src/effect.ts","../src/hooks.ts","../src/signal.ts","../src/memo.ts","../src/ssr-stream.ts","../src/store.ts","../src/resume.ts"],"sourcesContent":["export const DelegatedEventNames = [\n 'beforeinput',\n 'click',\n 'dblclick',\n 'contextmenu',\n 'focusin',\n 'focusout',\n 'input',\n 'keydown',\n 'keyup',\n 'mousedown',\n 'mousemove',\n 'mouseout',\n 'mouseover',\n 'mouseup',\n 'pointerdown',\n 'pointermove',\n 'pointerout',\n 'pointerover',\n 'pointerup',\n 'touchend',\n 'touchmove',\n 'touchstart',\n] as const\n","/**\n * Fict DOM Constants\n *\n * Property constants and configurations for DOM attribute handling.\n * Borrowed from dom-expressions for comprehensive DOM support.\n */\n\nimport { DelegatedEventNames } from './delegated-events'\n\n// Detect dev mode at runtime:\n// 1. Check __DEV__ global (set by bundlers via define, e.g., Vite plugin sets this)\n// 2. Check process.env.NODE_ENV (Node.js)\n// Note: We cannot use import.meta.env here because import.meta is ES module syntax\n// and will cause syntax errors when the code is bundled to CJS format.\nconst isDev =\n typeof __DEV__ !== 'undefined'\n ? __DEV__\n : typeof process === 'undefined' || process.env?.NODE_ENV !== 'production'\n\n// ============================================================================\n// Boolean Attributes\n// ============================================================================\n\n/**\n * Complete list of boolean attributes (lowercase)\n * These attributes are set as empty strings when true, removed when false\n */\nconst booleans = isDev\n ? [\n 'allowfullscreen',\n 'async',\n 'alpha', // HTMLInputElement\n 'autofocus', // HTMLElement prop\n 'autoplay',\n 'checked',\n 'controls',\n 'default',\n 'disabled',\n 'formnovalidate',\n 'hidden', // HTMLElement prop\n 'indeterminate',\n 'inert', // HTMLElement prop\n 'ismap',\n 'loop',\n 'multiple',\n 'muted',\n 'nomodule',\n 'novalidate',\n 'open',\n 'playsinline',\n 'readonly',\n 'required',\n 'reversed',\n 'seamless', // HTMLIframeElement - non-standard\n 'selected',\n // Experimental attributes\n 'adauctionheaders',\n 'browsingtopics',\n 'credentialless',\n 'defaultchecked',\n 'defaultmuted',\n 'defaultselected',\n 'defer',\n 'disablepictureinpicture',\n 'disableremoteplayback',\n 'preservespitch',\n 'shadowrootclonable',\n 'shadowrootcustomelementregistry',\n 'shadowrootdelegatesfocus',\n 'shadowrootserializable',\n 'sharedstoragewritable',\n ]\n : []\n\nexport const BooleanAttributes = new Set<string>(booleans)\n\n// ============================================================================\n// Properties Set\n// ============================================================================\n\n/**\n * Properties that should be set via DOM property (not attribute)\n * Includes camelCase versions of boolean attributes\n */\nconst properties = isDev\n ? [\n // Core properties\n 'className',\n 'value',\n\n // CamelCase booleans\n 'readOnly',\n 'noValidate',\n 'formNoValidate',\n 'isMap',\n 'noModule',\n 'playsInline',\n\n // Experimental (camelCase)\n 'adAuctionHeaders',\n 'allowFullscreen',\n 'browsingTopics',\n 'defaultChecked',\n 'defaultMuted',\n 'defaultSelected',\n 'disablePictureInPicture',\n 'disableRemotePlayback',\n 'preservesPitch',\n 'shadowRootClonable',\n 'shadowRootCustomElementRegistry',\n 'shadowRootDelegatesFocus',\n 'shadowRootSerializable',\n 'sharedStorageWritable',\n\n // All lowercase booleans\n ...booleans,\n ]\n : []\n\nexport const Properties = new Set<string>(properties)\n\n// ============================================================================\n// Child Properties\n// ============================================================================\n\n/**\n * Properties that represent children/content\n */\nexport const ChildProperties = new Set<string>([\n 'innerHTML',\n 'textContent',\n 'innerText',\n 'children',\n])\n\n// ============================================================================\n// Property Aliases\n// ============================================================================\n\n/**\n * React compatibility aliases (className -> class)\n */\nexport const Aliases: Record<string, string> = {\n className: 'class',\n htmlFor: 'for',\n}\n\n/**\n * Element-specific property aliases\n * Maps lowercase attribute names to their camelCase property equivalents\n * Only for specific elements that have these properties\n */\nconst PropAliases: Record<string, string | { $: string; [tagName: string]: string | number }> =\n isDev\n ? {\n // Direct mapping\n class: 'className',\n\n // Element-specific mappings\n novalidate: {\n $: 'noValidate',\n FORM: 1,\n },\n formnovalidate: {\n $: 'formNoValidate',\n BUTTON: 1,\n INPUT: 1,\n },\n ismap: {\n $: 'isMap',\n IMG: 1,\n },\n nomodule: {\n $: 'noModule',\n SCRIPT: 1,\n },\n playsinline: {\n $: 'playsInline',\n VIDEO: 1,\n },\n readonly: {\n $: 'readOnly',\n INPUT: 1,\n TEXTAREA: 1,\n },\n\n // Experimental element-specific\n adauctionheaders: {\n $: 'adAuctionHeaders',\n IFRAME: 1,\n },\n allowfullscreen: {\n $: 'allowFullscreen',\n IFRAME: 1,\n },\n browsingtopics: {\n $: 'browsingTopics',\n IMG: 1,\n },\n defaultchecked: {\n $: 'defaultChecked',\n INPUT: 1,\n },\n defaultmuted: {\n $: 'defaultMuted',\n AUDIO: 1,\n VIDEO: 1,\n },\n defaultselected: {\n $: 'defaultSelected',\n OPTION: 1,\n },\n disablepictureinpicture: {\n $: 'disablePictureInPicture',\n VIDEO: 1,\n },\n disableremoteplayback: {\n $: 'disableRemotePlayback',\n AUDIO: 1,\n VIDEO: 1,\n },\n preservespitch: {\n $: 'preservesPitch',\n AUDIO: 1,\n VIDEO: 1,\n },\n shadowrootclonable: {\n $: 'shadowRootClonable',\n TEMPLATE: 1,\n },\n shadowrootdelegatesfocus: {\n $: 'shadowRootDelegatesFocus',\n TEMPLATE: 1,\n },\n shadowrootserializable: {\n $: 'shadowRootSerializable',\n TEMPLATE: 1,\n },\n sharedstoragewritable: {\n $: 'sharedStorageWritable',\n IFRAME: 1,\n IMG: 1,\n },\n }\n : {}\n\n/**\n * Get the property alias for a given attribute and tag name\n */\nexport function getPropAlias(prop: string, tagName: string): string | undefined {\n if (!isDev) return undefined\n const a = PropAliases[prop]\n if (typeof a === 'object') {\n return a[tagName] ? a['$'] : undefined\n }\n return a\n}\n\n// ============================================================================\n// Event Delegation\n// ============================================================================\n\n/**\n * Symbol for storing delegated events on the document\n */\nexport const $$EVENTS = '_$FICT_DELEGATE'\n\n/**\n * Events that should use event delegation for performance\n * These events bubble and are commonly used across many elements\n * Note: This must match the compiler's DelegatedEvents set\n */\nexport const DelegatedEvents = new Set<string>(DelegatedEventNames)\n\n// ============================================================================\n// SVG Support\n// ============================================================================\n\n/**\n * SVG element names (excluding common ones that overlap with HTML)\n */\nconst svgElements = isDev\n ? [\n 'altGlyph',\n 'altGlyphDef',\n 'altGlyphItem',\n 'animate',\n 'animateColor',\n 'animateMotion',\n 'animateTransform',\n 'circle',\n 'clipPath',\n 'color-profile',\n 'cursor',\n 'defs',\n 'desc',\n 'ellipse',\n 'feBlend',\n 'feColorMatrix',\n 'feComponentTransfer',\n 'feComposite',\n 'feConvolveMatrix',\n 'feDiffuseLighting',\n 'feDisplacementMap',\n 'feDistantLight',\n 'feDropShadow',\n 'feFlood',\n 'feFuncA',\n 'feFuncB',\n 'feFuncG',\n 'feFuncR',\n 'feGaussianBlur',\n 'feImage',\n 'feMerge',\n 'feMergeNode',\n 'feMorphology',\n 'feOffset',\n 'fePointLight',\n 'feSpecularLighting',\n 'feSpotLight',\n 'feTile',\n 'feTurbulence',\n 'filter',\n 'font',\n 'font-face',\n 'font-face-format',\n 'font-face-name',\n 'font-face-src',\n 'font-face-uri',\n 'foreignObject',\n 'g',\n 'glyph',\n 'glyphRef',\n 'hkern',\n 'image',\n 'line',\n 'linearGradient',\n 'marker',\n 'mask',\n 'metadata',\n 'missing-glyph',\n 'mpath',\n 'path',\n 'pattern',\n 'polygon',\n 'polyline',\n 'radialGradient',\n 'rect',\n 'set',\n 'stop',\n 'svg',\n 'switch',\n 'symbol',\n 'text',\n 'textPath',\n 'tref',\n 'tspan',\n 'use',\n 'view',\n 'vkern',\n ]\n : []\n\nexport const SVGElements = new Set<string>(svgElements)\n\n/**\n * SVG attribute namespaces\n */\nexport const SVGNamespace: Record<string, string> = {\n xlink: 'http://www.w3.org/1999/xlink',\n xml: 'http://www.w3.org/XML/1998/namespace',\n}\n\n// ============================================================================\n// Unitless CSS Properties\n// ============================================================================\n\n/**\n * CSS properties that don't need a unit (like 'px')\n */\nconst unitlessList = isDev\n ? [\n 'animationIterationCount',\n 'animation-iteration-count',\n 'borderImageOutset',\n 'border-image-outset',\n 'borderImageSlice',\n 'border-image-slice',\n 'borderImageWidth',\n 'border-image-width',\n 'boxFlex',\n 'box-flex',\n 'boxFlexGroup',\n 'box-flex-group',\n 'boxOrdinalGroup',\n 'box-ordinal-group',\n 'columnCount',\n 'column-count',\n 'columns',\n 'flex',\n 'flexGrow',\n 'flex-grow',\n 'flexPositive',\n 'flex-positive',\n 'flexShrink',\n 'flex-shrink',\n 'flexNegative',\n 'flex-negative',\n 'flexOrder',\n 'flex-order',\n 'gridRow',\n 'grid-row',\n 'gridRowEnd',\n 'grid-row-end',\n 'gridRowSpan',\n 'grid-row-span',\n 'gridRowStart',\n 'grid-row-start',\n 'gridColumn',\n 'grid-column',\n 'gridColumnEnd',\n 'grid-column-end',\n 'gridColumnSpan',\n 'grid-column-span',\n 'gridColumnStart',\n 'grid-column-start',\n 'fontWeight',\n 'font-weight',\n 'lineClamp',\n 'line-clamp',\n 'lineHeight',\n 'line-height',\n 'opacity',\n 'order',\n 'orphans',\n 'tabSize',\n 'tab-size',\n 'widows',\n 'zIndex',\n 'z-index',\n 'zoom',\n 'fillOpacity',\n 'fill-opacity',\n 'floodOpacity',\n 'flood-opacity',\n 'stopOpacity',\n 'stop-opacity',\n 'strokeDasharray',\n 'stroke-dasharray',\n 'strokeDashoffset',\n 'stroke-dashoffset',\n 'strokeMiterlimit',\n 'stroke-miterlimit',\n 'strokeOpacity',\n 'stroke-opacity',\n 'strokeWidth',\n 'stroke-width',\n ]\n : ['opacity', 'zIndex']\n\nexport const UnitlessStyles = new Set<string>(unitlessList)\n","export interface FictDevtoolsHook {\n registerSignal: (\n id: number,\n value: unknown,\n options?: { name?: string; source?: string; ownerId?: number },\n ) => void\n updateSignal: (id: number, value: unknown) => void\n registerComputed: (\n id: number,\n value: unknown,\n options?: { name?: string; source?: string; ownerId?: number; hasValue?: boolean },\n ) => void\n updateComputed: (id: number, value: unknown) => void\n registerEffect: (id: number, options?: { ownerId?: number; source?: string }) => void\n effectRun: (id: number) => void\n /** Track a dependency relationship between subscriber and dependency */\n trackDependency?: (subscriberId: number, dependencyId: number) => void\n /** Remove a dependency relationship when unlinked */\n untrackDependency?: (subscriberId: number, dependencyId: number) => void\n cycleDetected?: (payload: { reason: string; detail?: Record<string, unknown> }) => void\n\n // Component lifecycle\n registerComponent?: (id: number, name: string, parentId?: number, source?: any) => void\n componentMount?: (id: number, elements?: HTMLElement[]) => void\n componentUnmount?: (id: number) => void\n componentRender?: (id: number) => void\n}\n\nfunction getGlobalHook(): FictDevtoolsHook | undefined {\n if (typeof globalThis === 'undefined') return undefined\n return (globalThis as typeof globalThis & { __FICT_DEVTOOLS_HOOK__?: FictDevtoolsHook })\n .__FICT_DEVTOOLS_HOOK__\n}\n\nexport function getDevtoolsHook(): FictDevtoolsHook | undefined {\n return getGlobalHook()\n}\n","import { getDevtoolsHook } from './devtools'\n\nconst isDev =\n typeof __DEV__ !== 'undefined'\n ? __DEV__\n : typeof process === 'undefined' || process.env?.NODE_ENV !== 'production'\n\nexport interface CycleProtectionOptions {\n /** Enable cycle protection guards (defaults to dev-only) */\n enabled?: boolean\n maxFlushCyclesPerMicrotask?: number\n maxEffectRunsPerFlush?: number\n windowSize?: number\n highUsageRatio?: number\n maxRootReentrantDepth?: number\n enableWindowWarning?: boolean\n devMode?: boolean\n /** Enable backoff warnings at 50% and 75% of limits */\n enableBackoffWarning?: boolean\n /** Ratio at which to show first backoff warning (default 0.5) */\n backoffWarningRatio?: number\n}\n\ninterface CycleWindowEntry {\n used: number\n budget: number\n}\n\nlet setCycleProtectionOptions: (opts: CycleProtectionOptions) => void = () => {}\nlet resetCycleProtectionStateForTests: () => void = () => {}\nlet beginFlushGuard: () => void = () => {}\nlet beforeEffectRunGuard: () => boolean = () => true\nlet endFlushGuard: () => void = () => {}\nlet enterRootGuard: (root: object) => boolean = () => true\nlet exitRootGuard: (root: object) => void = () => {}\n\nconst defaultOptions = {\n enabled: isDev,\n maxFlushCyclesPerMicrotask: 10_000,\n maxEffectRunsPerFlush: 20_000,\n windowSize: 5,\n highUsageRatio: 0.8,\n maxRootReentrantDepth: 10,\n enableWindowWarning: true,\n devMode: isDev,\n // Backoff warning options\n enableBackoffWarning: isDev,\n backoffWarningRatio: 0.5,\n}\n\nlet enabled = defaultOptions.enabled\nlet options: Required<CycleProtectionOptions> = {\n ...defaultOptions,\n} as Required<CycleProtectionOptions>\n\nlet effectRunsThisFlush = 0\nlet windowUsage: CycleWindowEntry[] = []\nlet rootDepth = new WeakMap<object, number>()\nlet flushWarned = false\nlet rootWarned = false\nlet windowWarned = false\n// Backoff warning state\nlet backoffWarned50 = false\nlet backoffWarned75 = false\n\nsetCycleProtectionOptions = opts => {\n if (typeof opts.enabled === 'boolean') {\n enabled = opts.enabled\n }\n options = { ...options, ...opts }\n}\n\nresetCycleProtectionStateForTests = () => {\n options = { ...defaultOptions } as Required<CycleProtectionOptions>\n enabled = defaultOptions.enabled\n effectRunsThisFlush = 0\n windowUsage = []\n rootDepth = new WeakMap<object, number>()\n flushWarned = false\n rootWarned = false\n windowWarned = false\n // Reset backoff state\n backoffWarned50 = false\n backoffWarned75 = false\n}\n\nbeginFlushGuard = () => {\n if (!enabled) return\n effectRunsThisFlush = 0\n flushWarned = false\n windowWarned = false\n // Reset backoff state for new flush\n backoffWarned50 = false\n backoffWarned75 = false\n}\n\nbeforeEffectRunGuard = () => {\n if (!enabled) return true\n const next = ++effectRunsThisFlush\n const limit = Math.min(options.maxFlushCyclesPerMicrotask, options.maxEffectRunsPerFlush)\n\n // Backoff warnings at 50% and 75% of limit\n if (options.enableBackoffWarning && isDev) {\n const ratio = next / limit\n const backoffRatio = options.backoffWarningRatio ?? 0.5\n\n if (!backoffWarned50 && ratio >= backoffRatio && ratio < backoffRatio + 0.25) {\n backoffWarned50 = true\n console.warn(\n `[fict] cycle guard: approaching effect limit (${Math.round(ratio * 100)}% of budget used)\\n` +\n ` - Current: ${next} effects, Limit: ${limit}\\n` +\n ` - Tip: Check for effects that trigger other effects in a loop.\\n` +\n ` - Common causes: signal updates inside effects that read and write the same signal.`,\n )\n } else if (!backoffWarned75 && ratio >= backoffRatio + 0.25 && ratio < 1) {\n backoffWarned75 = true\n console.warn(\n `[fict] cycle guard: nearing effect limit (${Math.round(ratio * 100)}% of budget used)\\n` +\n ` - Current: ${next} effects, Limit: ${limit}\\n` +\n ` - Warning: Consider breaking the reactive dependency cycle.\\n` +\n ` - Debug: Use browser devtools to identify the recursive effect chain.`,\n )\n }\n }\n\n if (next > limit) {\n const message = `[fict] cycle protection triggered: flush-budget-exceeded`\n if (options.devMode) {\n throw new Error(\n message +\n `\\n - Effect runs: ${next}, Limit: ${limit}` +\n `\\n - This indicates a reactive cycle where effects keep triggering each other.` +\n `\\n - Check for patterns like: createEffect(() => { signal(); signal(newValue); })`,\n )\n }\n if (!flushWarned) {\n flushWarned = true\n console.warn(message, { effectRuns: next, limit })\n }\n return false\n }\n return true\n}\n\nendFlushGuard = () => {\n if (!enabled) return\n recordWindowUsage(effectRunsThisFlush, options.maxFlushCyclesPerMicrotask)\n effectRunsThisFlush = 0\n}\n\nenterRootGuard = root => {\n if (!enabled) return true\n const depth = (rootDepth.get(root) ?? 0) + 1\n if (depth > options.maxRootReentrantDepth) {\n const message = `[fict] cycle protection triggered: root-reentry`\n if (options.devMode) {\n throw new Error(\n message +\n `\\n - Re-entry depth: ${depth}, Max allowed: ${options.maxRootReentrantDepth}` +\n `\\n - This indicates recursive render() or component initialization.` +\n `\\n - Check for components that trigger re-renders during their own render phase.`,\n )\n }\n if (!rootWarned) {\n rootWarned = true\n console.warn(message, { depth, maxAllowed: options.maxRootReentrantDepth })\n }\n return false\n }\n rootDepth.set(root, depth)\n return true\n}\n\nexitRootGuard = root => {\n if (!enabled) return\n const depth = rootDepth.get(root)\n if (depth === undefined) return\n if (depth <= 1) {\n rootDepth.delete(root)\n } else {\n rootDepth.set(root, depth - 1)\n }\n}\n\nconst recordWindowUsage = (used: number, budget: number): void => {\n if (!options.enableWindowWarning) return\n const entry = { used, budget }\n windowUsage.push(entry)\n if (windowUsage.length > options.windowSize) {\n windowUsage.shift()\n }\n if (windowWarned) return\n if (\n windowUsage.length >= options.windowSize &&\n windowUsage.every(item => item.budget > 0 && item.used / item.budget >= options.highUsageRatio)\n ) {\n windowWarned = true\n reportCycle('high-usage-window', {\n windowSize: options.windowSize,\n ratio: options.highUsageRatio,\n })\n }\n}\n\nconst reportCycle = (\n reason: string,\n detail: Record<string, unknown> | undefined = undefined,\n): void => {\n const hook = getDevtoolsHook()\n hook?.cycleDetected?.(detail ? { reason, detail } : { reason })\n console.warn(`[fict] cycle protection triggered: ${reason}`, detail ?? '')\n}\n\nexport {\n setCycleProtectionOptions,\n resetCycleProtectionStateForTests,\n beginFlushGuard,\n beforeEffectRunGuard,\n endFlushGuard,\n enterRootGuard,\n exitRootGuard,\n}\n","import { enterRootGuard, exitRootGuard } from './cycle-guard'\nimport type { Cleanup, ErrorInfo, SuspenseToken } from './types'\n\nconst isDev =\n typeof __DEV__ !== 'undefined'\n ? __DEV__\n : typeof process === 'undefined' || process.env?.NODE_ENV !== 'production'\n\ntype LifecycleFn = () => void | Cleanup\n\nexport interface RootContext {\n parent?: RootContext | undefined\n onMountCallbacks?: LifecycleFn[]\n cleanups: Cleanup[]\n destroyCallbacks: Cleanup[]\n errorHandlers?: ErrorHandler[]\n suspenseHandlers?: SuspenseHandler[]\n suspended?: boolean\n}\n\nexport interface CreateRootOptions {\n inherit?: boolean\n}\n\ntype ErrorHandler = (err: unknown, info?: ErrorInfo) => boolean | void\ntype SuspenseHandler = (token: SuspenseToken | PromiseLike<unknown>) => boolean | void\n\nlet currentRoot: RootContext | undefined\nlet currentEffectCleanups: Cleanup[] | undefined\nconst globalErrorHandlers = new WeakMap<RootContext, ErrorHandler[]>()\nconst globalSuspenseHandlers = new WeakMap<RootContext, SuspenseHandler[]>()\n\nexport function createRootContext(parent?: RootContext): RootContext {\n return { parent, cleanups: [], destroyCallbacks: [], suspended: false }\n}\n\nexport function pushRoot(root: RootContext): RootContext | undefined {\n if (!enterRootGuard(root)) {\n return currentRoot\n }\n const prev = currentRoot\n currentRoot = root\n return prev\n}\n\nexport function getCurrentRoot(): RootContext | undefined {\n return currentRoot\n}\n\nexport function popRoot(prev: RootContext | undefined): void {\n if (currentRoot) {\n exitRootGuard(currentRoot)\n }\n currentRoot = prev\n}\n\nexport function onMount(fn: LifecycleFn): void {\n if (currentRoot) {\n ;(currentRoot.onMountCallbacks ||= []).push(fn)\n return\n }\n runLifecycle(fn)\n}\n\nexport function onDestroy(fn: LifecycleFn): void {\n if (currentRoot) {\n currentRoot.destroyCallbacks.push(() => runLifecycle(fn))\n return\n }\n runLifecycle(fn)\n}\n\nexport function onCleanup(fn: Cleanup): void {\n registerEffectCleanup(fn)\n}\n\nexport function flushOnMount(root: RootContext): void {\n const cbs = root.onMountCallbacks\n if (!cbs || cbs.length === 0) return\n // Temporarily restore root context so onCleanup calls inside\n // mount callbacks register correctly\n const prevRoot = currentRoot\n currentRoot = root\n try {\n for (let i = 0; i < cbs.length; i++) {\n const cleanup = cbs[i]!()\n if (typeof cleanup === 'function') {\n root.cleanups.push(cleanup)\n }\n }\n } finally {\n currentRoot = prevRoot\n cbs.length = 0\n }\n}\n\nexport function registerRootCleanup(fn: Cleanup): void {\n if (currentRoot) {\n currentRoot.cleanups.push(fn)\n }\n}\n\nexport function clearRoot(root: RootContext): void {\n runCleanupList(root.cleanups)\n if (root.onMountCallbacks) {\n root.onMountCallbacks.length = 0\n }\n}\n\nexport function destroyRoot(root: RootContext): void {\n clearRoot(root)\n runCleanupList(root.destroyCallbacks)\n if (root.errorHandlers) {\n root.errorHandlers.length = 0\n }\n if (globalErrorHandlers.has(root)) {\n globalErrorHandlers.delete(root)\n }\n if (root.suspenseHandlers) {\n root.suspenseHandlers.length = 0\n }\n if (globalSuspenseHandlers.has(root)) {\n globalSuspenseHandlers.delete(root)\n }\n}\n\nexport function createRoot<T>(\n fn: () => T,\n options?: CreateRootOptions,\n): { dispose: () => void; value: T } {\n const parent = options?.inherit ? currentRoot : undefined\n const root = createRootContext(parent)\n const prev = pushRoot(root)\n let value: T\n try {\n value = fn()\n } finally {\n popRoot(prev)\n }\n flushOnMount(root)\n return {\n dispose: () => destroyRoot(root),\n value,\n }\n}\n\nexport function withEffectCleanups<T>(bucket: Cleanup[], fn: () => T): T {\n const prev = currentEffectCleanups\n currentEffectCleanups = bucket\n try {\n return fn()\n } finally {\n currentEffectCleanups = prev\n }\n}\n\nexport function registerEffectCleanup(fn: Cleanup): void {\n if (currentEffectCleanups) {\n currentEffectCleanups.push(fn)\n } else {\n registerRootCleanup(fn)\n }\n}\n\nexport function runCleanupList(list: Cleanup[]): void {\n let error: unknown\n for (let i = list.length - 1; i >= 0; i--) {\n try {\n const cleanup = list[i]\n if (cleanup) cleanup()\n } catch (err) {\n if (error === undefined) {\n error = err\n }\n }\n }\n list.length = 0\n if (error !== undefined) {\n if (!handleError(error, { source: 'cleanup' })) {\n throw error\n }\n }\n}\n\nfunction runLifecycle(fn: LifecycleFn): void {\n const cleanup = fn()\n if (typeof cleanup === 'function') {\n cleanup()\n }\n}\n\nexport function registerErrorHandler(fn: ErrorHandler): void {\n if (!currentRoot) {\n const message = isDev\n ? 'registerErrorHandler must be called within a root'\n : 'FICT:E_ROOT_HANDLER'\n throw new Error(message)\n }\n if (!currentRoot.errorHandlers) {\n currentRoot.errorHandlers = []\n }\n currentRoot.errorHandlers.push(fn)\n const existing = globalErrorHandlers.get(currentRoot)\n if (existing) {\n existing.push(fn)\n } else {\n globalErrorHandlers.set(currentRoot, [fn])\n }\n}\n\nexport function registerSuspenseHandler(fn: SuspenseHandler): void {\n if (!currentRoot) {\n const message = isDev\n ? 'registerSuspenseHandler must be called within a root'\n : 'FICT:E_ROOT_SUSPENSE'\n throw new Error(message)\n }\n if (!currentRoot.suspenseHandlers) {\n currentRoot.suspenseHandlers = []\n }\n currentRoot.suspenseHandlers.push(fn)\n const existing = globalSuspenseHandlers.get(currentRoot)\n if (existing) {\n existing.push(fn)\n } else {\n globalSuspenseHandlers.set(currentRoot, [fn])\n }\n}\n\nexport function handleError(err: unknown, info?: ErrorInfo, startRoot?: RootContext): boolean {\n let root: RootContext | undefined = startRoot ?? currentRoot\n let error = err\n while (root) {\n const handlers = root.errorHandlers\n if (handlers && handlers.length) {\n for (let i = handlers.length - 1; i >= 0; i--) {\n const handler = handlers[i]!\n try {\n const handled = handler(error, info)\n if (handled !== false) {\n return true\n }\n } catch (nextErr) {\n error = nextErr\n }\n }\n }\n root = root.parent\n }\n const globalForRoot = startRoot\n ? globalErrorHandlers.get(startRoot)\n : currentRoot\n ? globalErrorHandlers.get(currentRoot)\n : undefined\n if (globalForRoot && globalForRoot.length) {\n for (let i = globalForRoot.length - 1; i >= 0; i--) {\n const handler = globalForRoot[i]!\n try {\n const handled = handler(error, info)\n if (handled !== false) {\n return true\n }\n } catch (nextErr) {\n error = nextErr\n }\n }\n }\n // The caller (e.g., runCleanupList) can decide whether to rethrow.\n // This makes the API consistent: handleError always returns a boolean\n // indicating whether the error was handled.\n return false\n}\n\nexport function handleSuspend(\n token: SuspenseToken | PromiseLike<unknown>,\n startRoot?: RootContext,\n): boolean {\n let root: RootContext | undefined = startRoot ?? currentRoot\n const originRoot = root // Preserve reference to set suspended flag on success\n while (root) {\n const handlers = root.suspenseHandlers\n if (handlers && handlers.length) {\n for (let i = handlers.length - 1; i >= 0; i--) {\n const handler = handlers[i]!\n const handled = handler(token)\n if (handled !== false) {\n // Only set suspended = true when a handler actually handles the token\n if (originRoot) originRoot.suspended = true\n return true\n }\n }\n }\n root = root.parent\n }\n const globalForRoot =\n startRoot && globalSuspenseHandlers.get(startRoot)\n ? globalSuspenseHandlers.get(startRoot)\n : currentRoot\n ? globalSuspenseHandlers.get(currentRoot)\n : undefined\n if (globalForRoot && globalForRoot.length) {\n for (let i = globalForRoot.length - 1; i >= 0; i--) {\n const handler = globalForRoot[i]!\n const handled = handler(token)\n if (handled !== false) {\n // Only set suspended = true when a handler actually handles the token\n if (originRoot) originRoot.suspended = true\n return true\n }\n }\n }\n return false\n}\n","import {\n getCurrentRoot,\n handleError,\n handleSuspend,\n registerRootCleanup,\n runCleanupList,\n withEffectCleanups,\n} from './lifecycle'\nimport { effectWithCleanup } from './signal'\nimport type { Cleanup } from './types'\n\n/**\n * Effect callback run synchronously; async callbacks are not tracked after the first await.\n * TypeScript will reject `async () => {}` here—split async work or read signals before awaiting.\n */\nexport type Effect = () => void | Cleanup\n\nexport function createEffect(fn: Effect): () => void {\n let cleanups: Cleanup[] = []\n const rootForError = getCurrentRoot()\n\n // Cleanup runner - called by runEffect BEFORE signal values are committed\n const doCleanup = () => {\n runCleanupList(cleanups)\n cleanups = []\n }\n\n const run = () => {\n // Note: cleanups are now run by signal.ts runEffect before this function is called\n const bucket: Cleanup[] = []\n withEffectCleanups(bucket, () => {\n try {\n const maybeCleanup = fn()\n if (typeof maybeCleanup === 'function') {\n bucket.push(maybeCleanup)\n }\n } catch (err) {\n if (handleSuspend(err as any, rootForError)) {\n return\n }\n if (handleError(err, { source: 'effect' }, rootForError)) {\n return\n }\n throw err\n }\n })\n cleanups = bucket\n }\n\n const disposeEffect = effectWithCleanup(run, doCleanup, rootForError)\n const teardown = () => {\n runCleanupList(cleanups)\n disposeEffect()\n }\n\n registerRootCleanup(teardown)\n\n return teardown\n}\n\nexport const $effect = createEffect\n\nexport function createRenderEffect(fn: Effect): () => void {\n let cleanup: Cleanup | undefined\n const rootForError = getCurrentRoot()\n\n // Cleanup runner - called by runEffect BEFORE signal values are committed\n const doCleanup = () => {\n if (cleanup) {\n cleanup()\n cleanup = undefined\n }\n }\n\n const run = () => {\n // Note: cleanups are now run by signal.ts runEffect before this function is called\n try {\n const maybeCleanup = fn()\n if (typeof maybeCleanup === 'function') {\n cleanup = maybeCleanup\n }\n } catch (err) {\n if (handleSuspend(err as any, rootForError)) {\n return\n }\n const handled = handleError(err, { source: 'effect' }, rootForError)\n if (handled) {\n return\n }\n throw err\n }\n }\n\n const disposeEffect = effectWithCleanup(run, doCleanup, rootForError)\n const teardown = () => {\n if (cleanup) {\n cleanup()\n cleanup = undefined\n }\n disposeEffect()\n }\n\n registerRootCleanup(teardown)\n\n return teardown\n}\n","import { createEffect } from './effect'\nimport { createMemo } from './memo'\nimport {\n createSignal,\n type SignalAccessor,\n type ComputedAccessor,\n type MemoOptions,\n type SignalOptions,\n} from './signal'\n\nconst isDev =\n typeof __DEV__ !== 'undefined'\n ? __DEV__\n : typeof process === 'undefined' || process.env?.NODE_ENV !== 'production'\n\nexport interface HookContext {\n slots: unknown[]\n cursor: number\n rendering?: boolean\n componentId?: number\n parentId?: number\n scopeId?: string\n scopeType?: string\n slotMap?: Record<string, number>\n}\n\nconst ctxStack: HookContext[] = []\nlet preparedContext: HookContext | null = null\n\nfunction assertRenderContext(ctx: HookContext, hookName: string): void {\n if (!ctx.rendering) {\n const message = isDev\n ? `${hookName} can only be used during render execution`\n : 'FICT:E_HOOK_RENDER'\n throw new Error(message)\n }\n}\n\nexport function __fictUseContext(): HookContext {\n if (ctxStack.length === 0) {\n // fix: Don't silently create context when called outside render.\n // This would cause a memory leak and undefined behavior.\n const message = isDev\n ? 'Invalid hook call: hooks can only be used while rendering a component. ' +\n 'Make sure you are not calling hooks in event handlers or outside of components.'\n : 'FICT:E_HOOK_OUTSIDE_RENDER'\n throw new Error(message)\n }\n const ctx = ctxStack[ctxStack.length - 1]!\n // fix: Only reset cursor when starting a new render, not during an existing render.\n // This allows custom hooks to share the same hook slot sequence as the calling component,\n // similar to React's \"rules of hooks\" where hooks are called in consistent order.\n if (!ctx.rendering) {\n ctx.cursor = 0\n ctx.rendering = true\n }\n return ctx\n}\n\nexport function __fictPushContext(): HookContext {\n const ctx: HookContext = preparedContext ?? { slots: [], cursor: 0 }\n preparedContext = null\n ctxStack.push(ctx)\n return ctx\n}\n\nexport function __fictPrepareContext(ctx: HookContext): void {\n preparedContext = ctx\n}\n\nexport function __fictGetCurrentComponentId(): number | undefined {\n return ctxStack[ctxStack.length - 1]?.componentId\n}\n\nexport function __fictPopContext(): void {\n // fix: Reset rendering flag when popping to avoid state leakage\n const ctx = ctxStack.pop()\n if (ctx) ctx.rendering = false\n}\n\nexport function __fictResetContext(): void {\n ctxStack.length = 0\n}\n\nexport function __fictUseSignal<T>(\n ctx: HookContext,\n initial: T,\n optionsOrSlot?: number | SignalOptions<T>,\n slot?: number,\n): SignalAccessor<T> {\n assertRenderContext(ctx, '__fictUseSignal')\n const options = typeof optionsOrSlot === 'number' ? undefined : optionsOrSlot\n const resolvedSlot = typeof optionsOrSlot === 'number' ? optionsOrSlot : slot\n const index = resolvedSlot ?? ctx.cursor++\n if (!ctx.slots[index]) {\n ctx.slots[index] = createSignal(initial, options)\n }\n if (options?.name) {\n if (!ctx.slotMap) ctx.slotMap = {}\n ctx.slotMap[options.name] = index\n }\n return ctx.slots[index] as SignalAccessor<T>\n}\n\nexport function __fictUseMemo<T>(\n ctx: HookContext,\n fn: () => T,\n optionsOrSlot?: number | MemoOptions<T>,\n slot?: number,\n): ComputedAccessor<T> {\n assertRenderContext(ctx, '__fictUseMemo')\n const options = typeof optionsOrSlot === 'number' ? undefined : optionsOrSlot\n const resolvedSlot = typeof optionsOrSlot === 'number' ? optionsOrSlot : slot\n const index = resolvedSlot ?? ctx.cursor++\n if (!ctx.slots[index]) {\n ctx.slots[index] = createMemo(fn, options)\n }\n return ctx.slots[index] as ComputedAccessor<T>\n}\n\nexport function __fictUseEffect(ctx: HookContext, fn: () => void, slot?: number): void {\n // fix: When a slot number is provided, we trust the compiler has allocated this slot.\n // This allows effects inside conditional callbacks to work even outside render context.\n // The slot number proves this is a known, statically-allocated effect location.\n if (slot !== undefined) {\n if (ctx.slots[slot]) {\n // Effect already exists, nothing to do\n return\n }\n // Create the effect even outside render context - the slot number proves validity\n ctx.slots[slot] = createEffect(fn)\n return\n }\n\n // For cursor-based allocation (no slot number), we need render context\n assertRenderContext(ctx, '__fictUseEffect')\n const index = ctx.cursor++\n if (!ctx.slots[index]) {\n ctx.slots[index] = createEffect(fn)\n }\n}\n\nexport function __fictRender<T>(ctx: HookContext, fn: () => T): T {\n ctxStack.push(ctx)\n ctx.cursor = 0\n ctx.rendering = true\n try {\n return fn()\n } finally {\n ctx.rendering = false\n ctxStack.pop()\n }\n}\n","import { beginFlushGuard, beforeEffectRunGuard, endFlushGuard } from './cycle-guard'\nimport { getDevtoolsHook } from './devtools'\nimport { __fictGetCurrentComponentId } from './hooks'\nimport {\n getCurrentRoot,\n handleError,\n handleSuspend,\n registerRootCleanup,\n type RootContext,\n} from './lifecycle'\nimport type { SuspenseToken } from './types'\n\nconst isDev =\n typeof __DEV__ !== 'undefined'\n ? __DEV__\n : typeof process === 'undefined' || process.env?.NODE_ENV !== 'production'\n\n// ============================================================================\n// Type Definitions\n// ============================================================================\n\n/**\n * Reactive node that can be either a signal, computed, effect, or effect scope\n */\nexport type ReactiveNode =\n | SignalNode<unknown>\n | ComputedNode<unknown>\n | EffectNode\n | EffectScopeNode\n | SubscriberNode\n\n/**\n * Link between a dependency and a subscriber in the reactive graph\n */\nexport interface Link {\n /** Version/cycle when this link was created */\n version: number\n /** The dependency being tracked */\n dep: ReactiveNode\n /** The subscriber tracking this dependency */\n sub: ReactiveNode\n /** Previous dependency link in the subscriber's dependency list */\n prevDep: Link | undefined\n /** Next dependency link in the subscriber's dependency list */\n nextDep: Link | undefined\n /** Previous subscriber link in the dependency's subscriber list */\n prevSub: Link | undefined\n /** Next subscriber link in the dependency's subscriber list */\n nextSub: Link | undefined\n}\n\n/**\n * Stack frame for traversing the reactive graph\n */\nexport interface StackFrame {\n /** The link value at this stack level */\n value: Link | undefined\n /** Previous stack frame */\n prev: StackFrame | undefined\n}\n\n/**\n * Base interface for all reactive nodes\n */\nexport interface BaseNode {\n /** First subscriber link */\n subs: Link | undefined\n /** Last subscriber link */\n subsTail: Link | undefined\n /** Reactive flags (Mutable, Watching, Running, etc.) */\n flags: number\n}\n\n/**\n * Options for creating a signal\n */\nexport interface SignalOptions<T> {\n /** Custom equality check */\n equals?: false | ((prev: T, next: T) => boolean)\n /** Debug name */\n name?: string\n /** Source location */\n devToolsSource?: string\n}\n\n/**\n * Options for creating a memo\n */\nexport interface MemoOptions<T> {\n /** Custom equality check */\n equals?: false | ((prev: T, next: T) => boolean)\n /** Debug name */\n name?: string\n /** Source location */\n devToolsSource?: string\n}\n\n/**\n * Signal node - mutable reactive value\n */\nexport interface SignalNode<T = unknown> extends BaseNode {\n /** Current committed value */\n currentValue: T\n /** Pending value to be committed */\n pendingValue: T\n /** Previous committed value (for cleanup reads) */\n prevValue?: T\n /** Flush id when prevValue was recorded */\n prevFlushId?: number\n /** Signals don't have dependencies */\n deps?: undefined\n depsTail?: undefined\n getter?: undefined\n /** DevTools ID */\n __id?: number | undefined\n /** Equality check */\n equals?: false | ((prev: T, next: T) => boolean)\n /** Debug name */\n name?: string\n /** Source location */\n devToolsSource?: string\n}\n\n/**\n * Computed node - derived reactive value\n */\nexport interface ComputedNode<T = unknown> extends BaseNode {\n /** Current computed value */\n value: T\n /** Previous computed value (for cleanup reads) */\n prevValue?: T\n /** Flush id when prevValue was recorded */\n prevFlushId?: number\n /** First dependency link */\n deps: Link | undefined\n /** Last dependency link */\n depsTail: Link | undefined\n /** Getter function to compute the value */\n getter: (oldValue: T | undefined) => T\n /** DevTools ID */\n __id?: number | undefined\n /** Equality check */\n equals?: false | ((prev: T, next: T) => boolean)\n /** Debug name */\n name?: string\n /** Source location */\n devToolsSource?: string\n}\n\n/**\n * Effect node - side effect that runs when dependencies change\n */\nexport interface EffectNode extends BaseNode {\n /** Effect function to execute */\n fn: () => void\n /** First dependency link */\n deps: Link | undefined\n /** Last dependency link */\n depsTail: Link | undefined\n /** Optional cleanup runner to be called before checkDirty */\n runCleanup?: () => void\n /** Root context for error/suspense handling */\n root?: RootContext\n /** Devtools ID */\n __id?: number | undefined\n}\n\n/**\n * Effect scope node - manages multiple effects\n */\nexport interface EffectScopeNode extends BaseNode {\n /** First dependency link */\n deps: Link | undefined\n /** Last dependency link */\n depsTail: Link | undefined\n}\n\n/**\n * Subscriber node used in trigger\n */\nexport interface SubscriberNode {\n /** First dependency link */\n deps: Link | undefined\n /** Last dependency link */\n depsTail: Link | undefined\n /** Reactive flags */\n flags: number\n subs?: undefined\n subsTail?: undefined\n}\n\n/**\n * Signal accessor - function to get/set signal value\n */\nexport interface SignalAccessor<T> {\n (): T\n (value: T): void\n}\n\n/**\n * Computed accessor - function to get computed value\n */\nexport type ComputedAccessor<T> = () => T\n\n/**\n * Effect disposer - function to dispose an effect\n */\nexport type EffectDisposer = () => void\n\n/**\n * Effect scope disposer - function to dispose an effect scope\n */\nexport type EffectScopeDisposer = () => void\n\n/**\n * Options for creating a custom reactive system\n */\nexport interface ReactiveSystemOptions {\n /** Update function for reactive nodes */\n update: (node: ReactiveNode) => boolean\n /** Notify function when a subscriber needs to be notified */\n notify: (sub: ReactiveNode) => void\n /** Callback when a dependency becomes unwatched */\n unwatched: (dep: ReactiveNode) => void\n}\n\n/**\n * Custom reactive system methods\n */\nexport interface ReactiveSystem {\n /** Link a dependency to a subscriber */\n link: typeof link\n /** Unlink a dependency from a subscriber */\n unlink: (lnk: Link, sub?: ReactiveNode) => Link | undefined\n /** Propagate changes through the reactive graph */\n propagate: (firstLink: Link) => void\n /** Check if a node is dirty */\n checkDirty: (firstLink: Link, sub: ReactiveNode) => boolean\n /** Shallow propagate changes */\n shallowPropagate: (firstLink: Link) => void\n}\n\n// ============================================================================\n// Flags\n// ============================================================================\nconst Mutable = 1\nconst Watching = 2\nconst Running = 4\nconst Recursed = 8\nconst Dirty = 16\nconst Pending = 32\n// Pre-computed combinations\nconst MutableDirty = 17\nconst MutablePending = 33\nconst MutableRunning = 5\nconst WatchingRunning = 6\n// Global state\nlet cycle = 0\nlet batchDepth = 0\nlet activeSub: ReactiveNode | undefined\nlet flushScheduled = false\nlet currentFlushId = 0\nlet activeCleanupFlushId = 0\n// Dual-priority queue for scheduler\nconst highPriorityQueue: EffectNode[] = []\nconst lowPriorityQueue: EffectNode[] = []\nlet isInTransition = false\nconst enqueueMicrotask =\n typeof queueMicrotask === 'function'\n ? queueMicrotask\n : (fn: () => void) => {\n Promise.resolve().then(fn)\n }\n// Flag to indicate cleanup is running - signal reads should return currentValue without updating\nlet inCleanup = false\n// This ensures type detection works correctly even after minification\nconst SIGNAL_MARKER = Symbol.for('fict:signal')\nconst COMPUTED_MARKER = Symbol.for('fict:computed')\nconst EFFECT_MARKER = Symbol.for('fict:effect')\nconst EFFECT_SCOPE_MARKER = Symbol.for('fict:effectScope')\nexport const ReactiveFlags = {\n None: 0,\n Mutable,\n Watching,\n RecursedCheck: Running,\n Recursed,\n Dirty,\n Pending,\n}\n// ============================================================================\n// createReactiveSystem - Support for custom systems\n// ============================================================================\n/**\n * Create a custom reactive system with custom update, notify, and unwatched handlers\n * @param options - Reactive system options\n * @returns Custom reactive system methods\n */\nexport function createReactiveSystem({\n update,\n notify: notifyFn,\n unwatched: unwatchedFn,\n}: ReactiveSystemOptions): ReactiveSystem {\n function customPropagate(firstLink: Link): void {\n let link = firstLink\n let next = link.nextSub\n let stack: StackFrame | undefined\n\n top: for (;;) {\n const sub = link.sub\n let flags = sub.flags\n\n if (!(flags & 60)) {\n sub.flags = flags | Pending\n } else if (!(flags & 12)) {\n flags = 0\n } else if (!(flags & Running)) {\n sub.flags = (flags & ~Recursed) | Pending\n } else if (!(flags & 48)) {\n let vlink = sub.depsTail\n let valid = false\n while (vlink !== undefined) {\n if (vlink === link) {\n valid = true\n break\n }\n vlink = vlink.prevDep\n }\n if (valid) {\n sub.flags = flags | 40\n flags &= Mutable\n } else {\n flags = 0\n }\n } else {\n flags = 0\n }\n\n if (flags & Watching) notifyFn(sub)\n\n if (flags & Mutable) {\n const subSubs = sub.subs\n if (subSubs !== undefined) {\n const nextSub = subSubs.nextSub\n if (nextSub !== undefined) {\n stack = { value: next, prev: stack }\n next = nextSub\n }\n link = subSubs\n continue\n }\n }\n\n if (next !== undefined) {\n link = next\n next = link.nextSub\n continue\n }\n\n while (stack !== undefined) {\n link = stack.value!\n stack = stack.prev\n if (link !== undefined) {\n next = link.nextSub\n continue top\n }\n }\n break\n }\n }\n function customCheckDirty(firstLink: Link, sub: ReactiveNode): boolean {\n let link = firstLink\n let stack: StackFrame | undefined\n let checkDepth = 0\n let dirty = false\n\n top: for (;;) {\n const dep = link.dep\n const depFlags = dep.flags\n\n if (sub.flags & Dirty) {\n dirty = true\n } else if ((depFlags & MutableDirty) === MutableDirty) {\n if (update(dep)) {\n const subs = dep.subs\n if (subs !== undefined && subs.nextSub !== undefined) {\n customShallowPropagate(subs)\n }\n dirty = true\n }\n } else if ((depFlags & MutablePending) === MutablePending) {\n if (!dep.deps) {\n const nextDep = link.nextDep\n if (nextDep !== undefined) {\n link = nextDep\n continue\n }\n } else {\n if (link.nextSub !== undefined || link.prevSub !== undefined) {\n stack = { value: link, prev: stack }\n }\n link = dep.deps\n sub = dep\n ++checkDepth\n continue\n }\n }\n\n if (!dirty) {\n const nextDep = link.nextDep\n if (nextDep !== undefined) {\n link = nextDep\n continue\n }\n }\n\n while (checkDepth-- > 0) {\n const firstSub = sub.subs!\n const hasMultipleSubs = firstSub.nextSub !== undefined\n\n if (hasMultipleSubs) {\n link = stack!.value!\n stack = stack!.prev\n } else link = firstSub\n\n if (dirty) {\n if (update(sub)) {\n if (hasMultipleSubs) customShallowPropagate(firstSub)\n sub = link.sub\n continue\n }\n dirty = false\n } else {\n sub.flags &= ~Pending\n }\n\n sub = link.sub\n const nextDep = link.nextDep\n if (nextDep !== undefined) {\n link = nextDep\n continue top\n }\n }\n\n return dirty\n }\n }\n function customShallowPropagate(firstLink: Link): void {\n let link: Link | undefined = firstLink\n do {\n const sub = link.sub\n const flags = sub.flags\n if ((flags & 48) === Pending) {\n sub.flags = flags | Dirty\n if ((flags & 6) === Watching) notifyFn(sub)\n }\n link = link.nextSub\n } while (link !== undefined)\n }\n function customUnlink(lnk: Link, sub: ReactiveNode = lnk.sub): Link | undefined {\n const dep = lnk.dep\n const prevDep = lnk.prevDep\n const nextDep = lnk.nextDep\n const nextSub = lnk.nextSub\n const prevSub = lnk.prevSub\n\n if (nextDep !== undefined) nextDep.prevDep = prevDep\n else sub.depsTail = prevDep\n if (prevDep !== undefined) prevDep.nextDep = nextDep\n else sub.deps = nextDep\n\n if (nextSub !== undefined) nextSub.prevSub = prevSub\n else dep.subsTail = prevSub\n if (prevSub !== undefined) prevSub.nextSub = nextSub\n else if ((dep.subs = nextSub) === undefined) unwatchedFn(dep)\n\n return nextDep\n }\n return {\n link,\n unlink: customUnlink,\n propagate: customPropagate,\n checkDirty: customCheckDirty,\n shallowPropagate: customShallowPropagate,\n }\n}\n// ============================================================================\n// Core functions\n// ============================================================================\n/**\n * Create a link between a dependency and a subscriber\n * @param dep - The dependency node\n * @param sub - The subscriber node\n * @param version - The cycle version\n */\nfunction link(dep: ReactiveNode, sub: ReactiveNode, version: number): void {\n const prevDep = sub.depsTail\n if (prevDep !== undefined && prevDep.dep === dep) return\n\n const nextDep = prevDep !== undefined ? prevDep.nextDep : sub.deps\n if (nextDep !== undefined && nextDep.dep === dep) {\n nextDep.version = version\n sub.depsTail = nextDep\n return\n }\n\n const prevSub = dep.subsTail\n if (prevSub !== undefined && prevSub.version === version && prevSub.sub === sub) return\n\n const newLink = { version, dep, sub, prevDep, nextDep, prevSub, nextSub: undefined }\n sub.depsTail = newLink\n dep.subsTail = newLink\n\n if (nextDep !== undefined) nextDep.prevDep = newLink\n if (prevDep !== undefined) prevDep.nextDep = newLink\n else sub.deps = newLink\n if (prevSub !== undefined) prevSub.nextSub = newLink\n else dep.subs = newLink\n\n // Track dependency for devtools\n if (isDev) trackDependencyDevtools(dep, sub)\n}\n/**\n * Remove a link between a dependency and a subscriber\n * @param lnk - The link to remove\n * @param sub - The subscriber node (defaults to lnk.sub)\n * @returns The next dependency link\n */\nfunction unlink(lnk: Link, sub: ReactiveNode = lnk.sub): Link | undefined {\n const dep = lnk.dep\n const prevDep = lnk.prevDep\n const nextDep = lnk.nextDep\n const nextSub = lnk.nextSub\n const prevSub = lnk.prevSub\n\n if (nextDep !== undefined) nextDep.prevDep = prevDep\n else sub.depsTail = prevDep\n if (prevDep !== undefined) prevDep.nextDep = nextDep\n else sub.deps = nextDep\n\n if (nextSub !== undefined) nextSub.prevSub = prevSub\n else dep.subsTail = prevSub\n if (prevSub !== undefined) prevSub.nextSub = nextSub\n else if ((dep.subs = nextSub) === undefined) unwatched(dep)\n\n // Notify devtools that dependency edge is removed\n if (isDev) untrackDependencyDevtools(dep, sub)\n\n return nextDep\n}\n/**\n * Handle when a dependency becomes unwatched\n * @param dep - The dependency node\n */\nfunction unwatched(dep: ReactiveNode): void {\n if (!(dep.flags & Mutable)) {\n disposeNode(dep)\n } else if ('getter' in dep && dep.getter !== undefined) {\n dep.depsTail = undefined\n dep.flags = MutableDirty\n purgeDeps(dep)\n }\n}\n/**\n * Propagate changes through the reactive graph\n * @param firstLink - The first link to propagate from\n */\nfunction propagate(firstLink: Link): void {\n let link = firstLink\n let next = link.nextSub\n let stack: StackFrame | undefined\n\n top: for (;;) {\n const sub = link.sub\n let flags = sub.flags\n\n if (!(flags & 60)) {\n sub.flags = flags | Pending\n } else if (!(flags & 12)) {\n flags = 0\n } else if (!(flags & Running)) {\n sub.flags = (flags & ~Recursed) | Pending\n } else if (!(flags & 48)) {\n let vlink = sub.depsTail\n let valid = false\n while (vlink !== undefined) {\n if (vlink === link) {\n valid = true\n break\n }\n vlink = vlink.prevDep\n }\n if (valid) {\n sub.flags = flags | 40\n flags &= Mutable\n } else {\n flags = 0\n }\n } else {\n flags = 0\n }\n\n if (flags & Watching) notify(sub)\n\n if (flags & Mutable) {\n const subSubs = sub.subs\n if (subSubs !== undefined) {\n const nextSub = subSubs.nextSub\n if (nextSub !== undefined) {\n stack = { value: next, prev: stack }\n next = nextSub\n }\n link = subSubs\n continue\n }\n }\n\n if (next !== undefined) {\n link = next\n next = link.nextSub\n continue\n }\n\n while (stack !== undefined) {\n link = stack.value!\n stack = stack.prev\n if (link !== undefined) {\n next = link.nextSub\n continue top\n }\n }\n break\n }\n}\n/**\n * Check if a node is dirty by traversing its dependencies\n * @param firstLink - The first link to check\n * @param sub - The subscriber node\n * @returns True if the node is dirty\n */\nfunction checkDirty(firstLink: Link, sub: ReactiveNode): boolean {\n let link = firstLink\n let stack: StackFrame | undefined\n let checkDepth = 0\n let dirty = false\n\n top: for (;;) {\n const dep = link.dep\n const depFlags = dep.flags\n\n if (sub.flags & Dirty) {\n dirty = true\n } else if ((depFlags & MutableDirty) === MutableDirty) {\n if (update(dep)) {\n const subs = dep.subs\n if (subs !== undefined && subs.nextSub !== undefined) shallowPropagate(subs)\n dirty = true\n }\n } else if ((depFlags & MutablePending) === MutablePending) {\n if (!dep.deps) {\n // No dependencies to check, skip this node\n const nextDep = link.nextDep\n if (nextDep !== undefined) {\n link = nextDep\n continue\n }\n } else {\n if (link.nextSub !== undefined || link.prevSub !== undefined) {\n stack = { value: link, prev: stack }\n }\n link = dep.deps\n sub = dep\n ++checkDepth\n continue\n }\n }\n\n if (!dirty) {\n const nextDep = link.nextDep\n if (nextDep !== undefined) {\n link = nextDep\n continue\n }\n }\n\n while (checkDepth-- > 0) {\n const firstSub = sub.subs!\n const hasMultipleSubs = firstSub.nextSub !== undefined\n\n if (hasMultipleSubs) {\n link = stack!.value!\n stack = stack!.prev\n } else {\n link = firstSub\n }\n\n if (dirty) {\n if (update(sub)) {\n if (hasMultipleSubs) shallowPropagate(firstSub)\n sub = link.sub\n continue\n }\n dirty = false\n } else {\n sub.flags &= ~Pending\n }\n\n sub = link.sub\n const nextDep = link.nextDep\n if (nextDep !== undefined) {\n link = nextDep\n continue top\n }\n }\n\n return dirty\n }\n}\n/**\n * Shallow propagate changes without traversing deeply\n * @param firstLink - The first link to propagate from\n */\nfunction shallowPropagate(firstLink: Link): void {\n let link: Link | undefined = firstLink\n do {\n const sub = link.sub\n const flags = sub.flags\n if ((flags & 48) === Pending) {\n sub.flags = flags | Dirty\n if ((flags & 6) === Watching) notify(sub)\n }\n link = link.nextSub\n } while (link !== undefined)\n}\n/**\n * Update a reactive node (signal or computed)\n * @param node - The node to update\n * @returns True if the value changed\n */\nfunction update(node: ReactiveNode): boolean {\n return 'getter' in node && node.getter !== undefined\n ? updateComputed(node as ComputedNode)\n : updateSignal(node as SignalNode)\n}\n\nfunction valuesDiffer<T>(\n node: { equals?: false | ((prev: T, next: T) => boolean) },\n prev: T,\n next: T,\n): boolean {\n if (node.equals === false) return true\n if (typeof node.equals === 'function') return !node.equals(prev, next)\n return prev !== next\n}\n/**\n * Notify an effect and add it to the queue\n * @param effect - The effect to notify\n */\nfunction notify(effect: ReactiveNode): void {\n effect.flags &= ~Watching\n const effects: EffectNode[] = []\n\n for (;;) {\n effects.push(effect as EffectNode)\n const nextLink = effect.subs\n if (nextLink === undefined) break\n effect = nextLink.sub\n if (effect === undefined || !(effect.flags & Watching)) break\n effect.flags &= ~Watching\n }\n\n // Route effects to appropriate queue based on transition context\n const targetQueue = isInTransition ? lowPriorityQueue : highPriorityQueue\n for (let i = effects.length - 1; i >= 0; i--) {\n targetQueue.push(effects[i]!)\n }\n}\n/**\n * Purge all dependencies from a subscriber\n * @param sub - The subscriber node\n */\nfunction purgeDeps(sub: ReactiveNode): void {\n const depsTail = sub.depsTail\n let dep = depsTail !== undefined ? depsTail.nextDep : sub.deps\n while (dep !== undefined) dep = unlink(dep, sub)\n}\n/**\n * Dispose a reactive node\n * @param node - The node to dispose\n */\nfunction disposeNode(node: ReactiveNode): void {\n node.depsTail = undefined\n node.flags = 0\n purgeDeps(node)\n let sub = node.subs\n while (sub !== undefined) {\n const next = sub.nextSub\n unlink(sub)\n sub = next\n }\n}\n/**\n * Update a signal node\n * @param s - The signal node\n * @returns True if the value changed\n */\nfunction updateSignal(s: SignalNode): boolean {\n s.flags = Mutable\n const current = s.currentValue\n const pending = s.pendingValue\n if (valuesDiffer(s, current, pending)) {\n s.prevValue = current\n s.prevFlushId = currentFlushId\n s.currentValue = pending\n return true\n }\n return false\n}\n/**\n * Update a computed node\n * @param c - The computed node\n * @returns True if the value changed\n */\nfunction updateComputed<T>(c: ComputedNode<T>): boolean {\n ++cycle\n const oldValue = c.value\n c.depsTail = undefined\n c.flags = MutableRunning\n const prevSub = activeSub\n activeSub = c\n\n try {\n const newValue = c.getter(oldValue)\n activeSub = prevSub\n c.flags &= ~Running\n purgeDeps(c)\n if (valuesDiffer(c, oldValue, newValue)) {\n c.prevValue = oldValue\n c.prevFlushId = currentFlushId\n c.value = newValue\n if (isDev) updateComputedDevtools(c, newValue)\n return true\n }\n return false\n } catch (e) {\n activeSub = prevSub\n c.flags &= ~Running\n throw e\n }\n}\n/**\n * Run an effect\n * @param e - The effect node\n */\nfunction runEffect(e: EffectNode): void {\n const flags = e.flags\n const runCleanup = () => {\n if (!e.runCleanup) return\n inCleanup = true\n activeCleanupFlushId = currentFlushId\n try {\n e.runCleanup()\n } finally {\n activeCleanupFlushId = 0\n inCleanup = false\n }\n }\n if (flags & Dirty) {\n // Run cleanup before re-run; values are still the previous commit.\n runCleanup()\n ++cycle\n if (isDev) effectRunDevtools(e)\n e.depsTail = undefined\n e.flags = WatchingRunning\n const prevSub = activeSub\n activeSub = e\n try {\n e.fn()\n activeSub = prevSub\n e.flags = Watching\n purgeDeps(e)\n } catch (err) {\n activeSub = prevSub\n e.flags = Watching\n throw err\n }\n } else if (flags & Pending && e.deps) {\n let isDirty = false\n try {\n isDirty = checkDirty(e.deps, e)\n } catch (err) {\n if (handleSuspend(err as SuspenseToken, e.root)) {\n if (e.flags !== 0) {\n e.flags = Watching\n }\n return\n }\n if (handleError(err, { source: 'effect' }, e.root)) {\n if (e.flags !== 0) {\n e.flags = Watching\n }\n return\n }\n throw err\n }\n if (isDirty) {\n // Only run cleanup if the effect will actually re-run.\n // Cleanup reads should observe previous values for this flush.\n runCleanup()\n ++cycle\n if (isDev) effectRunDevtools(e)\n e.depsTail = undefined\n e.flags = WatchingRunning\n const prevSub = activeSub\n activeSub = e\n try {\n e.fn()\n activeSub = prevSub\n e.flags = Watching\n purgeDeps(e)\n } catch (err) {\n activeSub = prevSub\n e.flags = Watching\n throw err\n }\n } else {\n e.flags = Watching\n }\n } else {\n e.flags = Watching\n }\n}\n/**\n * Schedule a flush in a microtask to coalesce synchronous writes\n */\nexport function scheduleFlush(): void {\n const hasWork = highPriorityQueue.length > 0 || lowPriorityQueue.length > 0\n if (flushScheduled || !hasWork) return\n if (batchDepth > 0) return\n flushScheduled = true\n enqueueMicrotask(() => {\n flush()\n })\n}\n/**\n * Flush all queued effects with priority-based scheduling\n * High priority effects execute first; low priority can be interrupted\n */\nfunction flush(): void {\n beginFlushGuard()\n if (batchDepth > 0) {\n // If batching is active, defer until the batch completes\n scheduleFlush()\n endFlushGuard()\n return\n }\n const hasWork = highPriorityQueue.length > 0 || lowPriorityQueue.length > 0\n if (!hasWork) {\n flushScheduled = false\n endFlushGuard()\n return\n }\n currentFlushId++\n flushScheduled = false\n\n // 1. Process all high-priority effects first\n let highIndex = 0\n while (highIndex < highPriorityQueue.length) {\n const e = highPriorityQueue[highIndex]!\n if (!beforeEffectRunGuard()) {\n // fix: When cycle guard fails, drop the current queues to avoid microtask spin.\n // Dev mode will throw inside beforeEffectRunGuard; this branch is for prod warnings.\n for (let i = 0; i < highPriorityQueue.length; i++) {\n const queued = highPriorityQueue[i]\n if (queued && queued.flags !== 0) {\n queued.flags = Watching\n }\n }\n for (let i = 0; i < lowPriorityQueue.length; i++) {\n const queued = lowPriorityQueue[i]\n if (queued && queued.flags !== 0) {\n queued.flags = Watching\n }\n }\n highPriorityQueue.length = 0\n lowPriorityQueue.length = 0\n flushScheduled = false\n endFlushGuard()\n return\n }\n highIndex++\n runEffect(e)\n }\n highPriorityQueue.length = 0\n\n // 2. Process low-priority effects, interruptible by high priority\n let lowIndex = 0\n while (lowIndex < lowPriorityQueue.length) {\n // Check if high priority work arrived during low priority execution\n if (highPriorityQueue.length > 0) {\n if (lowIndex > 0) {\n lowPriorityQueue.copyWithin(0, lowIndex)\n lowPriorityQueue.length -= lowIndex\n }\n scheduleFlush()\n endFlushGuard()\n return\n }\n const e = lowPriorityQueue[lowIndex]!\n if (!beforeEffectRunGuard()) {\n // fix: When cycle guard fails, drop the current queues to avoid microtask spin.\n // Dev mode will throw inside beforeEffectRunGuard; this branch is for prod warnings.\n for (let i = 0; i < highPriorityQueue.length; i++) {\n const queued = highPriorityQueue[i]\n if (queued && queued.flags !== 0) {\n queued.flags = Watching\n }\n }\n for (let i = 0; i < lowPriorityQueue.length; i++) {\n const queued = lowPriorityQueue[i]\n if (queued && queued.flags !== 0) {\n queued.flags = Watching\n }\n }\n highPriorityQueue.length = 0\n lowPriorityQueue.length = 0\n flushScheduled = false\n endFlushGuard()\n return\n }\n lowIndex++\n runEffect(e)\n }\n lowPriorityQueue.length = 0\n\n endFlushGuard()\n}\n// ============================================================================\n// Signal - Inline optimized version\n// ============================================================================\n/**\n * Create a reactive signal\n * @param initialValue - The initial value\n * @returns A signal accessor function\n */\nexport function signal<T>(initialValue: T, options?: SignalOptions<T>): SignalAccessor<T> {\n const s: SignalNode<T> = {\n currentValue: initialValue,\n pendingValue: initialValue,\n subs: undefined,\n subsTail: undefined,\n flags: Mutable,\n __id: undefined as number | undefined,\n ...(options?.equals !== undefined ? { equals: options.equals } : {}),\n ...(options?.name !== undefined ? { name: options.name } : {}),\n ...(options?.devToolsSource !== undefined ? { devToolsSource: options.devToolsSource } : {}),\n }\n if (isDev) registerSignalDevtools(s)\n const accessor = signalOper.bind(s as any) as SignalAccessor<T> & Record<symbol, boolean>\n accessor[SIGNAL_MARKER] = true\n return accessor as SignalAccessor<T>\n}\nfunction signalOper<T>(this: SignalNode<T>, value?: T): T | void {\n if (arguments.length > 0) {\n const next = value as T\n const prev = this.pendingValue\n if (valuesDiffer(this, prev as T, next)) {\n this.pendingValue = next\n this.flags = MutableDirty\n if (isDev) updateSignalDevtools(this, next)\n const subs = this.subs\n if (subs !== undefined) {\n propagate(subs)\n if (!batchDepth) scheduleFlush()\n }\n }\n return\n }\n\n const flags = this.flags\n // During cleanup, don't update signal - return currentValue as-is\n if (flags & Dirty && !inCleanup) {\n if (updateSignal(this as any)) {\n const subs = this.subs\n if (subs !== undefined) shallowPropagate(subs)\n }\n }\n if (inCleanup) {\n if (this.prevFlushId === activeCleanupFlushId) {\n return this.prevValue as T\n }\n return this.currentValue\n }\n\n let sub = activeSub\n while (sub !== undefined) {\n if (sub.flags & 3) {\n link(this as any, sub, cycle)\n break\n }\n const subSubs = sub.subs\n sub = subSubs !== undefined ? subSubs.sub : undefined\n }\n\n return this.currentValue\n}\n// ============================================================================\n// Computed\n// ============================================================================\n/**\n * Create a computed reactive value\n * @param getter - The getter function\n * @param options - Computed options\n * @returns A computed accessor function\n */\nexport function computed<T>(\n getter: (oldValue?: T) => T,\n options?: MemoOptions<T>,\n): ComputedAccessor<T> {\n const c: ComputedNode<T> = {\n value: undefined as unknown as T,\n subs: undefined,\n subsTail: undefined,\n deps: undefined,\n depsTail: undefined,\n flags: 0,\n getter,\n __id: undefined as number | undefined,\n ...(options?.equals !== undefined ? { equals: options.equals } : {}),\n ...(options?.name !== undefined ? { name: options.name } : {}),\n ...(options?.devToolsSource !== undefined ? { devToolsSource: options.devToolsSource } : {}),\n }\n if (isDev) registerComputedDevtools(c)\n const bound = (computedOper as (this: ComputedNode<T>) => T).bind(\n c as any,\n ) as ComputedAccessor<T> & Record<symbol, boolean>\n bound[COMPUTED_MARKER] = true\n return bound as ComputedAccessor<T>\n}\nfunction computedOper<T>(this: ComputedNode<T>): T {\n // fix: During cleanup, return previous value for this flush without triggering updates.\n // This ensures cleanup functions observe the pre-commit state for this effect.\n if (inCleanup) {\n if (this.prevFlushId === activeCleanupFlushId) {\n return this.prevValue as T\n }\n return this.value\n }\n\n const flags = this.flags\n\n if (flags & Dirty) {\n if (updateComputed(this)) {\n const subs = this.subs\n if (subs !== undefined) shallowPropagate(subs)\n }\n } else if (flags & Pending) {\n if (this.deps && checkDirty(this.deps, this)) {\n if (updateComputed(this)) {\n const subs = this.subs\n if (subs !== undefined) shallowPropagate(subs)\n }\n } else {\n this.flags = flags & ~Pending\n }\n } else if (!flags) {\n this.flags = MutableRunning\n const prevSub = setActiveSub(this)\n try {\n this.value = this.getter(undefined)\n if (isDev) updateComputedDevtools(this, this.value)\n } finally {\n setActiveSub(prevSub)\n this.flags &= ~Running\n }\n }\n\n if (activeSub !== undefined) link(this, activeSub, cycle)\n return this.value\n}\n// ============================================================================\n// Effect\n// ============================================================================\n/**\n * Create a reactive effect\n * @param fn - The effect function\n * @returns An effect disposer function\n */\nexport function effect(fn: () => void): EffectDisposer {\n const e: EffectNode = {\n fn,\n subs: undefined,\n subsTail: undefined,\n deps: undefined,\n depsTail: undefined,\n flags: WatchingRunning,\n __id: undefined as number | undefined,\n }\n const root = getCurrentRoot()\n if (root) {\n e.root = root\n }\n\n if (isDev) registerEffectDevtools(e)\n\n const prevSub = activeSub\n if (prevSub !== undefined) link(e, prevSub, 0)\n activeSub = e\n\n try {\n if (isDev) effectRunDevtools(e)\n fn()\n } finally {\n activeSub = prevSub\n e.flags &= ~Running\n }\n\n const disposer = effectOper.bind(e) as EffectDisposer & Record<symbol, boolean>\n disposer[EFFECT_MARKER] = true\n return disposer as EffectDisposer\n}\n\n/**\n * Create a reactive effect with a custom cleanup runner\n * The cleanup runner is called BEFORE signal values are committed, allowing\n * cleanup functions to access the previous values of signals.\n * @param fn - The effect function\n * @param cleanupRunner - Function to run cleanups before signal value commit\n * @param root - Root context for error/suspense handling (defaults to current root)\n * @returns An effect disposer function\n */\nexport function effectWithCleanup(\n fn: () => void,\n cleanupRunner: () => void,\n root?: RootContext,\n): EffectDisposer {\n const e: EffectNode = {\n fn,\n subs: undefined,\n subsTail: undefined,\n deps: undefined,\n depsTail: undefined,\n flags: WatchingRunning,\n runCleanup: cleanupRunner,\n __id: undefined as number | undefined,\n }\n const resolvedRoot = root ?? getCurrentRoot()\n if (resolvedRoot) {\n e.root = resolvedRoot\n }\n\n if (isDev) registerEffectDevtools(e)\n\n const prevSub = activeSub\n if (prevSub !== undefined) link(e, prevSub, 0)\n activeSub = e\n\n try {\n if (isDev) effectRunDevtools(e)\n fn()\n } finally {\n activeSub = prevSub\n e.flags &= ~Running\n }\n\n const disposer = effectOper.bind(e) as EffectDisposer & Record<symbol, boolean>\n disposer[EFFECT_MARKER] = true\n return disposer as EffectDisposer\n}\n\nfunction effectOper(this: EffectNode): void {\n disposeNode(this)\n}\n// ============================================================================\n// Effect Scope\n// ============================================================================\n/**\n * Create a reactive effect scope\n * @param fn - The scope function\n * @returns An effect scope disposer function\n */\nexport function effectScope(fn: () => void): EffectScopeDisposer {\n const e = { deps: undefined, depsTail: undefined, subs: undefined, subsTail: undefined, flags: 0 }\n\n const prevSub = activeSub\n if (prevSub !== undefined) link(e, prevSub, 0)\n activeSub = e\n\n try {\n fn()\n } finally {\n activeSub = prevSub\n }\n\n const disposer = effectScopeOper.bind(e) as EffectScopeDisposer & Record<symbol, boolean>\n disposer[EFFECT_SCOPE_MARKER] = true\n return disposer as EffectScopeDisposer\n}\nfunction effectScopeOper(this: EffectScopeNode): void {\n disposeNode(this)\n}\n// ============================================================================\n// Trigger\n// ============================================================================\n/**\n * Trigger a reactive computation without creating a persistent subscription\n * @param fn - The function to run\n */\nexport function trigger(fn: () => void): void {\n const sub: SubscriberNode = { deps: undefined, depsTail: undefined, flags: Watching }\n const prevSub = activeSub\n activeSub = sub as ReactiveNode\n\n try {\n fn()\n } finally {\n activeSub = prevSub\n let lnk = sub.deps\n while (lnk !== undefined) {\n const dep = lnk.dep\n lnk = unlink(lnk, sub)\n const subs = dep.subs\n if (subs !== undefined) {\n sub.flags = 0\n propagate(subs)\n shallowPropagate(subs)\n }\n }\n if (!batchDepth) scheduleFlush()\n }\n}\n// ============================================================================\n// Batch processing & Utility API\n// ============================================================================\n/**\n * Start a batch of updates\n */\nexport function startBatch(): void {\n ++batchDepth\n}\n/**\n * End a batch of updates and flush effects\n */\nexport function endBatch(): void {\n if (--batchDepth === 0) flush()\n}\n/**\n * Execute a function in a batch\n * @param fn - The function to execute\n * @returns The return value of the function\n */\nexport function batch<T>(fn: () => T): T {\n ++batchDepth\n let result!: T\n let error: unknown\n try {\n result = fn()\n } catch (e) {\n error = e\n } finally {\n --batchDepth\n if (batchDepth === 0) {\n try {\n flush()\n } catch (flushErr) {\n if (error === undefined) {\n error = flushErr\n }\n }\n }\n }\n if (error !== undefined) {\n throw error\n }\n return result\n}\n/**\n * Get the current active subscriber\n * @returns The active subscriber or undefined\n */\nexport function getActiveSub(): ReactiveNode | undefined {\n return activeSub\n}\n/**\n * Set the active subscriber\n * @param sub - The new active subscriber\n * @returns The previous active subscriber\n */\nexport function setActiveSub(sub: ReactiveNode | undefined): ReactiveNode | undefined {\n const prev = activeSub\n activeSub = sub\n return prev\n}\n/**\n * Get the current batch depth\n * @returns The current batch depth\n */\nexport function getBatchDepth(): number {\n return batchDepth\n}\n/**\n * Reset all global reactive state for test isolation.\n * ONLY use this in test setup/teardown - never in production code.\n * This clears effect queues, resets batch depth, and clears pending flushes.\n */\nexport function __resetReactiveState(): void {\n highPriorityQueue.length = 0\n lowPriorityQueue.length = 0\n batchDepth = 0\n activeSub = undefined\n flushScheduled = false\n isInTransition = false\n inCleanup = false\n cycle = 0\n currentFlushId = 0\n activeCleanupFlushId = 0\n}\n/**\n * Execute a function without tracking dependencies\n * @param fn - The function to execute\n * @returns The return value of the function\n */\nexport function untrack<T>(fn: () => T): T {\n const prev = activeSub\n activeSub = undefined\n try {\n return fn()\n } finally {\n activeSub = prev\n }\n}\n/**\n * Peek at a reactive value without tracking it as a dependency\n * @param accessor - The accessor function\n * @returns The value\n */\nexport function peek<T>(accessor: () => T): T {\n return untrack(accessor)\n}\n// This ensures correct detection even after minification\n/**\n * Check if a function is a signal accessor\n * @param fn - The function to check\n * @returns True if the function is a signal accessor\n */\nexport function isSignal(fn: unknown): fn is SignalAccessor<unknown> {\n return (\n typeof fn === 'function' && (fn as unknown as Record<symbol, boolean>)[SIGNAL_MARKER] === true\n )\n}\n/**\n * Check if a function is a computed accessor\n * @param fn - The function to check\n * @returns True if the function is a computed accessor\n */\nexport function isComputed(fn: unknown): fn is ComputedAccessor<unknown> {\n return (\n typeof fn === 'function' && (fn as unknown as Record<symbol, boolean>)[COMPUTED_MARKER] === true\n )\n}\n/**\n * Check if a function is an effect disposer\n * @param fn - The function to check\n * @returns True if the function is an effect disposer\n */\nexport function isEffect(fn: unknown): fn is EffectDisposer {\n return (\n typeof fn === 'function' && (fn as unknown as Record<symbol, boolean>)[EFFECT_MARKER] === true\n )\n}\n/**\n * Check if a function is an effect scope disposer\n * @param fn - The function to check\n * @returns True if the function is an effect scope disposer\n */\nexport function isEffectScope(fn: unknown): fn is EffectScopeDisposer {\n return (\n typeof fn === 'function' &&\n (fn as unknown as Record<symbol, boolean>)[EFFECT_SCOPE_MARKER] === true\n )\n}\n// ============================================================================\n// Transition Context (for priority scheduling)\n// ============================================================================\n/**\n * Set the transition context\n * @param value - Whether we're inside a transition\n * @returns The previous transition context value\n */\nexport function setTransitionContext(value: boolean): boolean {\n const prev = isInTransition\n isInTransition = value\n return prev\n}\n/**\n * Get the current transition context\n * @returns True if currently inside a transition\n */\nexport function getTransitionContext(): boolean {\n return isInTransition\n}\n// Export aliases for API compatibility\nexport { signal as createSignal }\nexport type { SignalAccessor as Signal }\n\nexport { flush, link, unlink, propagate, checkDirty, shallowPropagate }\nexport default {\n signal,\n computed,\n effect,\n effectScope,\n trigger,\n batch,\n startBatch,\n endBatch,\n flush,\n untrack,\n peek,\n isSignal,\n isComputed,\n isEffect,\n isEffectScope,\n getActiveSub,\n setActiveSub,\n getBatchDepth,\n link,\n unlink,\n propagate,\n checkDirty,\n shallowPropagate,\n createReactiveSystem,\n ReactiveFlags,\n}\nexport const $state = signal as <T>(value: T) => T\n\ninterface DevtoolsIdentifiable {\n __id?: number\n}\n\nlet registerSignalDevtools: <T>(node: SignalNode<T>) => number | undefined = () => undefined\nlet updateSignalDevtools: <T>(node: SignalNode<T>, value: unknown) => void = () => {}\nlet registerComputedDevtools: <T>(node: ComputedNode<T>) => number | undefined = () => undefined\nlet updateComputedDevtools: <T>(node: ComputedNode<T>, value: unknown) => void = () => {}\nlet registerEffectDevtools: (node: EffectNode) => number | undefined = () => undefined\nlet effectRunDevtools: (node: EffectNode) => void = () => {}\nlet trackDependencyDevtools: (dep: ReactiveNode, sub: ReactiveNode) => void = () => {}\nlet untrackDependencyDevtools: (dep: ReactiveNode, sub: ReactiveNode) => void = () => {}\n\nif (isDev) {\n // Unified ID counter for all reactive nodes (signal/computed/effect)\n // to prevent ID collisions when storing in single devtools maps\n let nextDevtoolsId = 0\n\n registerSignalDevtools = node => {\n const hook = getDevtoolsHook()\n if (!hook) return undefined\n const id = ++nextDevtoolsId\n const options: { name?: string; source?: string } = {}\n if (node.name !== undefined) options.name = node.name\n if (node.devToolsSource !== undefined) options.source = node.devToolsSource\n const ownerId = __fictGetCurrentComponentId()\n if (ownerId !== undefined) (options as any).ownerId = ownerId\n hook.registerSignal(id, node.currentValue, options)\n ;(node as SignalNode & DevtoolsIdentifiable).__id = id\n return id\n }\n\n updateSignalDevtools = (node, value) => {\n const hook = getDevtoolsHook()\n if (!hook) return\n const id = (node as SignalNode & DevtoolsIdentifiable).__id\n if (id) hook.updateSignal(id, value)\n }\n\n registerComputedDevtools = node => {\n const hook = getDevtoolsHook()\n if (!hook) return undefined\n const id = ++nextDevtoolsId\n const options: { name?: string; source?: string } = {}\n if (node.name !== undefined) options.name = node.name\n if (node.devToolsSource !== undefined) options.source = node.devToolsSource\n const ownerId = __fictGetCurrentComponentId()\n if (ownerId !== undefined) (options as any).ownerId = ownerId\n ;(options as any).hasValue = false\n hook.registerComputed(id, node.value, options)\n ;(node as ComputedNode & DevtoolsIdentifiable).__id = id\n return id\n }\n\n updateComputedDevtools = (node, value) => {\n const hook = getDevtoolsHook()\n if (!hook) return\n const id = (node as ComputedNode & DevtoolsIdentifiable).__id\n if (id) hook.updateComputed(id, value)\n }\n\n registerEffectDevtools = node => {\n const hook = getDevtoolsHook()\n if (!hook) return undefined\n const id = ++nextDevtoolsId\n const ownerId = __fictGetCurrentComponentId()\n hook.registerEffect(id, ownerId !== undefined ? { ownerId } : undefined)\n ;(node as EffectNode & DevtoolsIdentifiable).__id = id\n return id\n }\n\n effectRunDevtools = node => {\n const hook = getDevtoolsHook()\n if (!hook) return\n const id = (node as EffectNode & DevtoolsIdentifiable).__id\n if (id) hook.effectRun(id)\n }\n\n trackDependencyDevtools = (dep, sub) => {\n const hook = getDevtoolsHook()\n if (!hook?.trackDependency) return\n const depId = (dep as ReactiveNode & DevtoolsIdentifiable).__id\n const subId = (sub as ReactiveNode & DevtoolsIdentifiable).__id\n if (depId && subId) hook.trackDependency(subId, depId)\n }\n\n untrackDependencyDevtools = (dep, sub) => {\n const hook = getDevtoolsHook()\n if (!hook?.untrackDependency) return\n const depId = (dep as ReactiveNode & DevtoolsIdentifiable).__id\n const subId = (sub as ReactiveNode & DevtoolsIdentifiable).__id\n if (depId && subId) hook.untrackDependency(subId, depId)\n }\n}\n\n// ============================================================================\n// Selector\n// ============================================================================\n/**\n * Create a selector signal that efficiently updates only when the selected key matches.\n * Useful for large lists where only one item is selected.\n *\n * @param source - The source signal returning the current key\n * @param equalityFn - Optional equality function\n * @returns A selector function that takes a key and returns a boolean signal accessor\n */\nexport function createSelector<T>(\n source: () => T,\n equalityFn: (a: T, b: T) => boolean = (a, b) => a === b,\n): (key: T) => boolean {\n let current = source()\n const observers = new Map<T, SignalAccessor<boolean>>()\n\n const dispose = effect(() => {\n const next = source()\n if (equalityFn(current, next)) return\n\n const prevSig = observers.get(current)\n if (prevSig) prevSig(false)\n\n const nextSig = observers.get(next)\n if (nextSig) nextSig(true)\n\n current = next\n })\n registerRootCleanup(() => {\n dispose()\n observers.clear()\n })\n\n return (key: T) => {\n let sig = observers.get(key)\n if (!sig) {\n sig = signal(equalityFn(key, current))\n observers.set(key, sig)\n registerRootCleanup(() => observers.delete(key))\n }\n return sig()\n }\n}\n","import { computed, type Signal, type MemoOptions } from './signal'\n\nexport type Memo<T> = () => T\n\nexport function createMemo<T>(fn: () => T, options?: MemoOptions<T>): Memo<T> {\n return computed(fn, options)\n}\n\nexport function fromSignal<T>(signal: Signal<T>): Memo<T> {\n return () => signal()\n}\n\nexport const $memo = createMemo\n","export interface SSRStreamHooks {\n registerBoundary?: (start: Comment, end: Comment) => string | null\n boundaryPending?: (id: string) => void\n boundaryResolved?: (id: string) => void\n onError?: (error: unknown, boundaryId?: string) => void\n}\n\nlet ssrStreamHooks: SSRStreamHooks | null = null\nconst boundaryStack: string[] = []\n\nexport function __fictSetSSRStreamHooks(hooks: SSRStreamHooks | null): void {\n ssrStreamHooks = hooks\n if (!hooks) {\n boundaryStack.length = 0\n }\n}\n\nexport function __fictGetSSRStreamHooks(): SSRStreamHooks | null {\n return ssrStreamHooks\n}\n\nexport function __fictPushSSRBoundary(id: string): void {\n boundaryStack.push(id)\n}\n\nexport function __fictPopSSRBoundary(expected?: string): void {\n if (boundaryStack.length === 0) return\n const top = boundaryStack[boundaryStack.length - 1]\n if (expected && top !== expected) {\n boundaryStack.pop()\n return\n }\n boundaryStack.pop()\n}\n\nexport function __fictGetCurrentSSRBoundary(): string | null {\n return boundaryStack.length > 0 ? boundaryStack[boundaryStack.length - 1]! : null\n}\n","import { signal, batch, type SignalAccessor } from './signal'\n\nconst PROXY = Symbol('fict:store-proxy')\nconst TARGET = Symbol('fict:store-target')\nconst ITERATE_KEY = Symbol('fict:iterate')\n\n// ============================================================================\n// Store (Deep Proxy)\n// ============================================================================\n\nexport type Store<T> = T\n\n/**\n * Create a Store: a reactive proxy that allows fine-grained access and mutation.\n *\n * @param initialValue - The initial state object\n * @returns [store, setStore]\n */\nexport function createStore<T extends object>(\n initialValue: T,\n): [Store<T>, (fn: (state: T) => void | T) => void] {\n const unwrapped = unwrap(initialValue)\n const wrapped = wrap(unwrapped)\n\n function setStore(fn: (state: T) => void | T) {\n batch(() => {\n const result = fn(wrapped)\n if (result !== undefined) {\n reconcile(wrapped, result)\n }\n })\n }\n\n return [wrapped, setStore]\n}\n\n// Map of target object -> Proxy\nconst proxyCache = new WeakMap<object, unknown>()\n// Map of target object -> Map<key, Signal>\nconst signalCache = new WeakMap<object, Map<string | symbol, SignalAccessor<unknown>>>()\n\nfunction wrap<T>(value: T): T {\n if (value === null || typeof value !== 'object') return value\n if (Reflect.get(value, PROXY)) return value\n\n if (proxyCache.has(value)) return proxyCache.get(value) as T\n\n const handler: ProxyHandler<object> = {\n get(target, prop, receiver) {\n if (prop === PROXY) return true\n if (prop === TARGET) return target\n\n const value = Reflect.get(target, prop, receiver)\n\n // Track property access\n track(target, prop)\n\n // Recursively wrap objects\n return wrap(value)\n },\n has(target, prop) {\n const result = Reflect.has(target, prop)\n track(target, prop)\n return result\n },\n ownKeys(target) {\n track(target, ITERATE_KEY)\n return Reflect.ownKeys(target)\n },\n getOwnPropertyDescriptor(target, prop) {\n track(target, prop)\n return Reflect.getOwnPropertyDescriptor(target, prop)\n },\n set(target, prop, value, receiver) {\n if (prop === PROXY || prop === TARGET) return false\n\n const isArrayLength = Array.isArray(target) && prop === 'length'\n const oldLength = isArrayLength ? target.length : undefined\n const hadKey = Object.prototype.hasOwnProperty.call(target, prop)\n const oldValue = Reflect.get(target, prop, receiver)\n if (oldValue === value) return true\n\n const result = Reflect.set(target, prop, value, receiver)\n if (result) {\n trigger(target, prop)\n if (!hadKey) {\n trigger(target, ITERATE_KEY)\n }\n if (isArrayLength) {\n const nextLength = target.length\n if (typeof oldLength === 'number' && nextLength < oldLength) {\n const signals = signalCache.get(target)\n if (signals) {\n for (const key of signals.keys()) {\n if (typeof key !== 'string') continue\n const index = Number(key)\n if (!Number.isInteger(index) || String(index) !== key) continue\n if (index >= nextLength && index < oldLength) {\n trigger(target, key)\n }\n }\n }\n }\n trigger(target, ITERATE_KEY)\n }\n }\n return result\n },\n deleteProperty(target, prop) {\n const hadKey = Object.prototype.hasOwnProperty.call(target, prop)\n const result = Reflect.deleteProperty(target, prop)\n if (result) {\n trigger(target, prop)\n if (hadKey) {\n trigger(target, ITERATE_KEY)\n }\n }\n return result\n },\n }\n\n const proxy = new Proxy(value, handler)\n proxyCache.set(value, proxy)\n return proxy as T\n}\n\nfunction unwrap<T>(value: T): T {\n if (value && typeof value === 'object' && Reflect.get(value, PROXY)) {\n return Reflect.get(value, TARGET) as T\n }\n return value\n}\n\nexport function isStoreProxy(value: unknown): boolean {\n return !!(value && typeof value === 'object' && Reflect.get(value as object, PROXY))\n}\n\nexport function unwrapStore<T>(value: T): T {\n return unwrap(value)\n}\n\nfunction track(target: object, prop: string | symbol) {\n let signals = signalCache.get(target)\n if (!signals) {\n signals = new Map()\n signalCache.set(target, signals)\n }\n\n let s = signals.get(prop)\n if (!s) {\n const initial =\n prop === ITERATE_KEY ? (Reflect.ownKeys(target).length as number) : getLastValue(target, prop)\n s = signal(initial)\n signals.set(prop, s)\n }\n s() // subscribe\n}\n\nfunction trigger(target: object, prop: string | symbol) {\n const signals = signalCache.get(target)\n if (signals) {\n const s = signals.get(prop)\n if (s) {\n if (prop === ITERATE_KEY) {\n s(Reflect.ownKeys(target).length)\n } else {\n s(getLastValue(target, prop)) // notify with new value\n }\n }\n }\n}\n\nfunction getLastValue(target: object, prop: string | symbol) {\n return Reflect.get(target, prop)\n}\n\n/**\n * Reconcile a store path with a new value (shallow merge/diff)\n */\nfunction reconcile(target: object, value: unknown) {\n if (target === value) return\n if (value === null || typeof value !== 'object') {\n throw new Error(\n `[Fict] Cannot replace store with primitive value: ${String(\n value,\n )}. setStore should return an object/array to merge.`,\n )\n }\n\n const realTarget = unwrap(target)\n const realValue = unwrap(value)\n\n const keys = new Set([...Object.keys(realTarget), ...Object.keys(realValue)])\n for (const key of keys) {\n const rTarget = realTarget as Record<string, unknown>\n const rValue = realValue as Record<string, unknown>\n\n if (rValue[key] === undefined && rTarget[key] !== undefined) {\n // deleted\n delete (target as Record<string, unknown>)[key] // Triggers proxy trap\n } else if (rTarget[key] !== rValue[key]) {\n ;(target as Record<string, unknown>)[key] = rValue[key] // Triggers proxy trap\n }\n }\n\n // Fix array length if needed\n if (Array.isArray(target) && Array.isArray(realValue) && target.length !== realValue.length) {\n target.length = realValue.length\n }\n}\n\n// ============================================================================\n// Diffing Signal (for List Items)\n// ============================================================================\n\n/**\n * Creates a signal that returns a Stable Proxy.\n * Updates to the signal (via set) will diff the new value against the old value\n * and trigger property-specific updates.\n */\nexport function createDiffingSignal<T extends object>(initialValue: T) {\n let currentValue = unwrap(initialValue)\n const signals = new Map<string | symbol, SignalAccessor<unknown>>()\n let iterateSignal: SignalAccessor<number> | undefined\n\n const getPropSignal = (prop: string | symbol) => {\n let s = signals.get(prop)\n if (!s) {\n s = signal(Reflect.get(currentValue as object, prop))\n signals.set(prop, s)\n }\n return s\n }\n\n const trackIterate = () => {\n if (!iterateSignal) {\n iterateSignal = signal(Reflect.ownKeys(currentValue).length)\n }\n iterateSignal()\n }\n\n const updateIterate = (value: T) => {\n if (iterateSignal) {\n iterateSignal(Reflect.ownKeys(value).length)\n }\n }\n\n // The stable proxy we return\n const proxy = new Proxy({} as T, {\n get(_, prop) {\n if (prop === PROXY) return true\n if (prop === TARGET) return currentValue\n\n // Subscribe to property\n const s = getPropSignal(prop)\n return s()\n },\n ownKeys() {\n trackIterate()\n return Reflect.ownKeys(currentValue)\n },\n has(target, prop) {\n getPropSignal(prop)()\n return Reflect.has(currentValue, prop)\n },\n getOwnPropertyDescriptor(target, prop) {\n getPropSignal(prop)()\n return Reflect.getOwnPropertyDescriptor(currentValue, prop)\n },\n })\n\n const read = () => proxy\n\n const write = (newValue: T) => {\n const next = unwrap(newValue)\n const prev = currentValue\n currentValue = next\n\n if (prev === next) {\n // Same ref update: re-evaluate all tracked signals\n // This is necessary for in-place mutations\n for (const [prop, s] of signals) {\n const newVal = Reflect.get(next as object, prop)\n s(newVal)\n }\n updateIterate(next)\n return\n }\n\n // Diff logic\n // We only trigger signals for properties that exist in our cache (tracked)\n // and have changed.\n for (const [prop, s] of signals) {\n const oldVal = Reflect.get(prev as object, prop)\n const newVal = Reflect.get(next as object, prop)\n if (oldVal !== newVal) {\n s(newVal)\n }\n }\n updateIterate(next)\n\n // Note: If new properties appeared that weren't tracked, we don't care\n // because no one is listening.\n // If we assume shape stability (Keyed List), this is efficient.\n }\n\n return [read, write] as const\n}\n","import type { HookContext } from './hooks'\nimport { createSignal, isSignal } from './signal'\nimport { __fictGetCurrentSSRBoundary } from './ssr-stream'\nimport { createStore, isStoreProxy, unwrapStore } from './store'\n\n// ============================================================================\n// Serialization Types\n// ============================================================================\n\n/**\n * Type markers for serialized values.\n * These allow us to preserve type information through JSON serialization.\n */\ntype SerializedMarker =\n | { __t: 'd'; v: number } // Date (as timestamp)\n | { __t: 'm'; v: [unknown, unknown][] } // Map (as entries array)\n | { __t: 's'; v: unknown[] } // Set (as array)\n | { __t: 'r'; v: { s: string; f: string } } // RegExp (source + flags)\n | { __t: 'u' } // undefined\n | { __t: 'n' } // NaN\n | { __t: '+i' } // Infinity\n | { __t: '-i' } // -Infinity\n | { __t: 'b'; v: string } // BigInt (as string)\n | { __t: 'ref'; v: string } // Circular reference (path)\n\nexport type SlotSnapshot =\n | [index: number, type: 'sig', value: unknown]\n | [index: number, type: 'store', value: unknown]\n | [index: number, type: 'raw', value: unknown]\n\nexport interface ScopeSnapshot {\n id: string\n t?: string\n slots: SlotSnapshot[]\n props?: Record<string, unknown>\n vars?: Record<string, number>\n}\n\nexport interface SSRState {\n scopes: Record<string, ScopeSnapshot>\n}\n\nexport interface ScopeRecord {\n id: string\n ctx: HookContext\n host: Element\n boundaryId?: string\n type?: string\n props?: Record<string, unknown>\n}\n\nlet ssrEnabled = false\nlet resumableEnabled = false\nlet hydrating = false\nlet scopeCounter = 0\nlet scopeRegistry = new Map<string, ScopeRecord>()\nlet boundaryScopes = new Map<string, Set<string>>()\nlet snapshotState: SSRState | null = null\nconst resumedScopes = new Map<\n string,\n { ctx: HookContext; host: Element; props?: Record<string, unknown> }\n>()\n\nexport function __fictEnableSSR(): void {\n ssrEnabled = true\n scopeCounter = 0\n scopeRegistry = new Map()\n boundaryScopes = new Map()\n resumedScopes.clear()\n snapshotState = null\n}\n\nexport function __fictDisableSSR(): void {\n ssrEnabled = false\n boundaryScopes = new Map()\n}\n\nexport function __fictEnableResumable(): void {\n resumableEnabled = true\n}\n\nexport function __fictDisableResumable(): void {\n resumableEnabled = false\n resumedScopes.clear()\n}\n\nexport function __fictIsResumable(): boolean {\n return ssrEnabled || resumableEnabled\n}\n\nexport function __fictIsSSR(): boolean {\n return ssrEnabled\n}\n\nexport function __fictEnterHydration(): void {\n hydrating = true\n}\n\nexport function __fictExitHydration(): void {\n hydrating = false\n}\n\nexport function __fictIsHydrating(): boolean {\n return hydrating\n}\n\nexport function __fictRegisterScope(\n ctx: HookContext,\n host: Element,\n type?: string,\n props?: Record<string, unknown>,\n): string {\n if (!__fictIsResumable()) return ''\n\n const id = `s${++scopeCounter}`\n ctx.scopeId = id\n if (type !== undefined) {\n ctx.scopeType = type\n }\n host.setAttribute('data-fict-s', id)\n if (type) {\n host.setAttribute('data-fict-t', type)\n }\n\n const record: ScopeRecord = { id, ctx, host }\n if (type !== undefined) {\n record.type = type\n }\n if (props !== undefined) {\n record.props = props\n }\n const boundaryId = __fictGetCurrentSSRBoundary()\n if (boundaryId) {\n record.boundaryId = boundaryId\n let scopes = boundaryScopes.get(boundaryId)\n if (!scopes) {\n scopes = new Set()\n boundaryScopes.set(boundaryId, scopes)\n }\n scopes.add(id)\n }\n scopeRegistry.set(id, record)\n return id\n}\n\nexport function __fictGetScopeRegistry(): Map<string, ScopeRecord> {\n return scopeRegistry\n}\n\nexport function __fictGetScopesForBoundary(boundaryId: string): string[] {\n const scopes = boundaryScopes.get(boundaryId)\n if (!scopes) return []\n return Array.from(scopes)\n}\n\nexport function __fictSerializeSSRState(): SSRState {\n const scopes: Record<string, ScopeSnapshot> = {}\n\n for (const [id, record] of scopeRegistry.entries()) {\n const snapshot: ScopeSnapshot = {\n id,\n slots: serializeSlots(record.ctx),\n }\n if (record.type !== undefined) {\n snapshot.t = record.type\n }\n if (record.props !== undefined) {\n snapshot.props = record.props\n }\n if (record.ctx.slotMap !== undefined) {\n snapshot.vars = record.ctx.slotMap\n }\n scopes[id] = snapshot\n }\n\n return { scopes }\n}\n\nexport function __fictSerializeSSRStateForScopes(scopeIds: Iterable<string>): SSRState {\n const scopes: Record<string, ScopeSnapshot> = {}\n\n for (const id of scopeIds) {\n const record = scopeRegistry.get(id)\n if (!record) continue\n const snapshot: ScopeSnapshot = {\n id,\n slots: serializeSlots(record.ctx),\n }\n if (record.type !== undefined) {\n snapshot.t = record.type\n }\n if (record.props !== undefined) {\n snapshot.props = record.props\n }\n if (record.ctx.slotMap !== undefined) {\n snapshot.vars = record.ctx.slotMap\n }\n scopes[id] = snapshot\n }\n\n return { scopes }\n}\n\nexport function __fictSetSSRState(state: SSRState | null): void {\n snapshotState = state\n if (!state) {\n resumedScopes.clear()\n }\n}\n\nexport function __fictMergeSSRState(state: SSRState | null): void {\n if (!state) return\n if (!snapshotState) {\n snapshotState = { scopes: { ...state.scopes } }\n return\n }\n Object.assign(snapshotState.scopes, state.scopes)\n}\n\nexport function __fictGetSSRScope(id: string): ScopeSnapshot | undefined {\n return snapshotState?.scopes[id]\n}\n\nexport function __fictEnsureScope(\n scopeId: string,\n host: Element,\n snapshot?: ScopeSnapshot,\n): HookContext {\n const existing = resumedScopes.get(scopeId)\n if (existing) return existing.ctx\n\n const ctx = createContextFromSnapshot(snapshot)\n ctx.scopeId = scopeId\n if (snapshot?.t !== undefined) {\n ctx.scopeType = snapshot.t\n }\n const entry: { ctx: HookContext; host: Element; props?: Record<string, unknown> } = { ctx, host }\n if (snapshot?.props !== undefined) {\n entry.props = snapshot.props\n }\n resumedScopes.set(scopeId, entry)\n return ctx\n}\n\nexport function __fictUseLexicalScope(scopeId: string, names: string[]): unknown[] {\n const record = resumedScopes.get(scopeId)\n if (!record) {\n throw new Error(`[fict] Missing resumed scope for ${scopeId}`)\n }\n const ctx = record.ctx\n const map = ctx.slotMap ?? {}\n return names.map(name => ctx.slots[map[name] ?? -1])\n}\n\nexport function __fictGetScopeProps(scopeId: string): Record<string, unknown> | undefined {\n return resumedScopes.get(scopeId)?.props\n}\n\nexport function __fictQrl(moduleId: string, exportName: string): string {\n const manifest = (globalThis as Record<string, unknown>).__FICT_MANIFEST__ as\n | Record<string, string>\n | undefined\n\n // Check manifest first (production builds)\n if (manifest?.[moduleId]) {\n return `${manifest[moduleId]}#${exportName}`\n }\n\n // Handle file:// URLs for Vite dev mode SSR\n if (moduleId.startsWith('file://')) {\n const filePath = moduleId.slice(7) // Remove 'file://'\n\n // Check for configured SSR base path (project root)\n const ssrBase = (globalThis as Record<string, unknown>).__FICT_SSR_BASE__ as string | undefined\n if (ssrBase) {\n // Strip base to get relative path (e.g., /src/App.tsx)\n if (filePath.startsWith(ssrBase)) {\n const relativePath = filePath.slice(ssrBase.length)\n return `${relativePath}#${exportName}`\n }\n }\n\n // Fallback: use Vite's /@fs/ convention for direct file system access\n return `/@fs${filePath}#${exportName}`\n }\n\n return `${moduleId}#${exportName}`\n}\n\n// Registry for resume functions to prevent tree-shaking\nconst resumeFunctionRegistry = new Map<string, (...args: unknown[]) => unknown>()\n\n/**\n * Register a resume function to prevent it from being tree-shaken.\n * This is called at module load time by compiled component code.\n */\nexport function __fictRegisterResume(name: string, fn: (...args: unknown[]) => unknown): void {\n resumeFunctionRegistry.set(name, fn)\n}\n\n/**\n * Get a registered resume function by name.\n * Used by the loader to find resume functions.\n */\nexport function __fictGetResume(name: string): ((...args: unknown[]) => unknown) | undefined {\n return resumeFunctionRegistry.get(name)\n}\n\nfunction serializeSlots(ctx: HookContext): SlotSnapshot[] {\n const slots: SlotSnapshot[] = []\n const values = ctx.slots ?? []\n // Share the 'seen' map across all slots to handle cross-slot circular references\n const seen = new Map<object, string>()\n\n for (let i = 0; i < values.length; i++) {\n const value = values[i]\n // Note: we don't skip undefined anymore since we can serialize it\n if (value === undefined) {\n slots.push([i, 'raw', serializeValue(undefined, seen, `$[${i}]`)])\n continue\n }\n\n if (isSignal(value)) {\n try {\n const raw = (value as () => unknown)()\n slots.push([i, 'sig', serializeValue(raw, seen, `$[${i}]`)])\n } catch {\n // ignore signal read errors during SSR\n }\n continue\n }\n\n if (isStoreProxy(value)) {\n const raw = unwrapStore(value)\n slots.push([i, 'store', serializeValue(raw, seen, `$[${i}]`)])\n continue\n }\n\n // Fallback: serialize raw slot value with complex type support\n slots.push([i, 'raw', serializeValue(value, seen, `$[${i}]`)])\n }\n\n return slots\n}\n\nfunction createContextFromSnapshot(snapshot?: ScopeSnapshot): HookContext {\n const ctx: HookContext = { slots: [], cursor: 0 }\n if (!snapshot) return ctx\n\n for (const slot of snapshot.slots) {\n const [index, type, value] = slot\n if (type === 'sig') {\n ctx.slots[index] = createSignal(deserializeValue(value))\n } else if (type === 'store') {\n ctx.slots[index] = createStore(deserializeValue(value) as object)[0]\n } else {\n ctx.slots[index] = deserializeValue(value)\n }\n }\n if (snapshot.vars) {\n ctx.slotMap = { ...snapshot.vars }\n }\n\n return ctx\n}\n\n// ============================================================================\n// Value Serialization - Complex Type Support\n// ============================================================================\n\n/**\n * Check if value has a serialization marker\n */\nfunction isSerializedMarker(value: unknown): value is SerializedMarker {\n return (\n typeof value === 'object' &&\n value !== null &&\n '__t' in value &&\n typeof (value as SerializedMarker).__t === 'string'\n )\n}\n\n/**\n * Serialize a value with support for complex types.\n * Handles: Date, Map, Set, RegExp, undefined, NaN, Infinity, -Infinity, BigInt, circular references\n */\nexport function serializeValue(\n value: unknown,\n seen = new Map<object, string>(),\n path = '$',\n): unknown {\n // Handle primitives that JSON can't represent correctly\n if (value === undefined) {\n return { __t: 'u' } as SerializedMarker\n }\n\n if (typeof value === 'number') {\n if (Number.isNaN(value)) {\n return { __t: 'n' } as SerializedMarker\n }\n if (value === Infinity) {\n return { __t: '+i' } as SerializedMarker\n }\n if (value === -Infinity) {\n return { __t: '-i' } as SerializedMarker\n }\n return value\n }\n\n if (typeof value === 'bigint') {\n return { __t: 'b', v: value.toString() } as SerializedMarker\n }\n\n // Primitives that JSON handles correctly\n if (value === null || typeof value === 'boolean' || typeof value === 'string') {\n return value\n }\n\n // Handle functions - can't serialize, skip\n if (typeof value === 'function') {\n return undefined\n }\n\n // Handle objects - check for circular references first\n if (typeof value === 'object') {\n // Check for circular reference\n if (seen.has(value)) {\n return { __t: 'ref', v: seen.get(value)! } as SerializedMarker\n }\n\n // Date\n if (value instanceof Date) {\n return { __t: 'd', v: value.getTime() } as SerializedMarker\n }\n\n // RegExp\n if (value instanceof RegExp) {\n return { __t: 'r', v: { s: value.source, f: value.flags } } as SerializedMarker\n }\n\n // Map\n if (value instanceof Map) {\n seen.set(value, path)\n const entries: [unknown, unknown][] = []\n let i = 0\n for (const [k, v] of value) {\n entries.push([\n serializeValue(k, seen, `${path}.k${i}`),\n serializeValue(v, seen, `${path}.v${i}`),\n ])\n i++\n }\n return { __t: 'm', v: entries } as SerializedMarker\n }\n\n // Set\n if (value instanceof Set) {\n seen.set(value, path)\n const items: unknown[] = []\n let i = 0\n for (const item of value) {\n items.push(serializeValue(item, seen, `${path}[${i}]`))\n i++\n }\n return { __t: 's', v: items } as SerializedMarker\n }\n\n // Array\n if (Array.isArray(value)) {\n seen.set(value, path)\n return value.map((item, i) => serializeValue(item, seen, `${path}[${i}]`))\n }\n\n // Plain object\n seen.set(value, path)\n const result: Record<string, unknown> = {}\n for (const key of Object.keys(value)) {\n const serialized = serializeValue(\n (value as Record<string, unknown>)[key],\n seen,\n `${path}.${key}`,\n )\n if (serialized !== undefined) {\n result[key] = serialized\n }\n }\n return result\n }\n\n return value\n}\n\n/**\n * Deserialize a value, restoring complex types from their serialized form.\n */\nexport function deserializeValue(\n value: unknown,\n refs = new Map<string, unknown>(),\n path = '$',\n): unknown {\n // Handle null\n if (value === null) {\n return null\n }\n\n // Handle primitives\n if (typeof value !== 'object') {\n return value\n }\n\n // Check for serialization markers\n if (isSerializedMarker(value)) {\n switch (value.__t) {\n case 'u':\n return undefined\n case 'n':\n return NaN\n case '+i':\n return Infinity\n case '-i':\n return -Infinity\n case 'b':\n return BigInt(value.v)\n case 'd':\n return new Date(value.v)\n case 'r':\n return new RegExp(value.v.s, value.v.f)\n case 'm': {\n const map = new Map<unknown, unknown>()\n refs.set(path, map)\n for (let i = 0; i < value.v.length; i++) {\n const entry = value.v[i]\n if (!entry) continue\n const [k, v] = entry\n map.set(\n deserializeValue(k, refs, `${path}.k${i}`),\n deserializeValue(v, refs, `${path}.v${i}`),\n )\n }\n return map\n }\n case 's': {\n const set = new Set<unknown>()\n refs.set(path, set)\n for (let i = 0; i < value.v.length; i++) {\n set.add(deserializeValue(value.v[i], refs, `${path}[${i}]`))\n }\n return set\n }\n case 'ref':\n return refs.get(value.v)\n }\n }\n\n // Handle arrays\n if (Array.isArray(value)) {\n const arr: unknown[] = []\n refs.set(path, arr)\n for (let i = 0; i < value.length; i++) {\n arr.push(deserializeValue(value[i], refs, `${path}[${i}]`))\n }\n return arr\n }\n\n // Handle plain objects\n const obj: Record<string, unknown> = {}\n refs.set(path, obj)\n for (const key of Object.keys(value)) {\n obj[key] = deserializeValue((value as Record<string, unknown>)[key], refs, `${path}.${key}`)\n }\n return obj\n}\n"],"mappings":"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","names":["isDev","isDev","options","isDev","options","isDev","isDev","link","effect","options","isDev","options","options","value"]}
@@ -1,12 +1,12 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
2
 
3
- var _chunkWJHXPF7Mcjs = require('./chunk-WJHXPF7M.cjs');
3
+ var _chunkZ6M3HKLGcjs = require('./chunk-Z6M3HKLG.cjs');
4
4
 
5
5
 
6
6
 
7
7
 
8
8
 
9
- var _chunk6RCEIWZLcjs = require('./chunk-6RCEIWZL.cjs');
9
+ var _chunkZR435MDCcjs = require('./chunk-ZR435MDC.cjs');
10
10
 
11
11
  // src/scope.ts
12
12
  function createScope() {
@@ -19,17 +19,17 @@ function createScope() {
19
19
  };
20
20
  const run = (fn) => {
21
21
  stop();
22
- const { dispose: rootDispose, value } = _chunk6RCEIWZLcjs.createRoot.call(void 0, fn, { inherit: true });
22
+ const { dispose: rootDispose, value } = _chunkZR435MDCcjs.createRoot.call(void 0, fn, { inherit: true });
23
23
  dispose = rootDispose;
24
24
  return value;
25
25
  };
26
- _chunk6RCEIWZLcjs.registerRootCleanup.call(void 0, stop);
26
+ _chunkZR435MDCcjs.registerRootCleanup.call(void 0, stop);
27
27
  return { run, stop };
28
28
  }
29
29
  function runInScope(flag, fn) {
30
30
  const scope = createScope();
31
- const evaluate = () => _chunkWJHXPF7Mcjs.isReactive.call(void 0, flag) ? flag() : !!flag;
32
- _chunk6RCEIWZLcjs.createEffect.call(void 0, () => {
31
+ const evaluate = () => _chunkZ6M3HKLGcjs.isReactive.call(void 0, flag) ? flag() : !!flag;
32
+ _chunkZR435MDCcjs.createEffect.call(void 0, () => {
33
33
  const enabled = evaluate();
34
34
  if (enabled) {
35
35
  scope.run(fn);
@@ -37,11 +37,11 @@ function runInScope(flag, fn) {
37
37
  scope.stop();
38
38
  }
39
39
  });
40
- _chunk6RCEIWZLcjs.onCleanup.call(void 0, scope.stop);
40
+ _chunkZR435MDCcjs.onCleanup.call(void 0, scope.stop);
41
41
  }
42
42
 
43
43
 
44
44
 
45
45
 
46
46
  exports.createScope = createScope; exports.runInScope = runInScope;
47
- //# sourceMappingURL=chunk-4ZPZM5IG.cjs.map
47
+ //# sourceMappingURL=chunk-QB2UD62G.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/fict/fict/packages/runtime/dist/chunk-4ZPZM5IG.cjs","../src/scope.ts"],"names":[],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACA;ACKO,SAAS,WAAA,CAAA,EAA6B;AAC3C,EAAA,IAAI,QAAA,EAA+B,IAAA;AAEnC,EAAA,MAAM,KAAA,EAAO,CAAA,EAAA,GAAM;AACjB,IAAA,GAAA,CAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,CAAA;AACR,MAAA,QAAA,EAAU,IAAA;AAAA,IACZ;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,IAAA,EAAM,CAAI,EAAA,EAAA,GAAmB;AACjC,IAAA,IAAA,CAAK,CAAA;AACL,IAAA,MAAM,EAAE,OAAA,EAAS,WAAA,EAAa,MAAM,EAAA,EAAI,0CAAA,EAAW,EAAI,EAAE,OAAA,EAAS,KAAK,CAAC,CAAA;AACxE,IAAA,QAAA,EAAU,WAAA;AACV,IAAA,OAAO,KAAA;AAAA,EACT,CAAA;AAEA,EAAA,mDAAA,IAAwB,CAAA;AACxB,EAAA,OAAO,EAAE,GAAA,EAAK,KAAK,CAAA;AACrB;AAMO,SAAS,UAAA,CAAW,IAAA,EAA8B,EAAA,EAAsB;AAC7E,EAAA,MAAM,MAAA,EAAQ,WAAA,CAAY,CAAA;AAC1B,EAAA,MAAM,SAAA,EAAW,CAAA,EAAA,GAAO,0CAAA,IAAe,EAAA,EAAK,IAAA,CAAuB,EAAA,EAAI,CAAC,CAAC,IAAA;AAEzE,EAAA,4CAAA,CAAa,EAAA,GAAM;AACjB,IAAA,MAAM,QAAA,EAAU,QAAA,CAAS,CAAA;AACzB,IAAA,GAAA,CAAI,OAAA,EAAS;AACX,MAAA,KAAA,CAAM,GAAA,CAAI,EAAE,CAAA;AAAA,IACd,EAAA,KAAO;AACL,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA;AAAA,IACb;AAAA,EACF,CAAC,CAAA;AAED,EAAA,yCAAA,KAAU,CAAM,IAAI,CAAA;AACtB;ADbA;AACA;AACE;AACA;AACF,mEAAC","file":"/home/runner/work/fict/fict/packages/runtime/dist/chunk-4ZPZM5IG.cjs","sourcesContent":[null,"import { isReactive, type MaybeReactive } from './binding'\nimport { createEffect } from './effect'\nimport { createRoot, onCleanup, registerRootCleanup } from './lifecycle'\n\nexport { effectScope } from './signal'\n\nexport interface ReactiveScope {\n run<T>(fn: () => T): T\n stop(): void\n}\n\n/**\n * Create an explicit reactive scope that can contain effects/memos and be stopped manually.\n * The scope registers with the current root for cleanup.\n */\nexport function createScope(): ReactiveScope {\n let dispose: (() => void) | null = null\n\n const stop = () => {\n if (dispose) {\n dispose()\n dispose = null\n }\n }\n\n const run = <T>(fn: () => T): T => {\n stop()\n const { dispose: rootDispose, value } = createRoot(fn, { inherit: true })\n dispose = rootDispose\n return value\n }\n\n registerRootCleanup(stop)\n return { run, stop }\n}\n\n/**\n * Run a block of reactive code inside a managed scope that follows a boolean flag.\n * When the flag turns false, the scope is disposed and all contained effects/memos are cleaned up.\n */\nexport function runInScope(flag: MaybeReactive<boolean>, fn: () => void): void {\n const scope = createScope()\n const evaluate = () => (isReactive(flag) ? (flag as () => boolean)() : !!flag)\n\n createEffect(() => {\n const enabled = evaluate()\n if (enabled) {\n scope.run(fn)\n } else {\n scope.stop()\n }\n })\n\n onCleanup(scope.stop)\n}\n"]}
1
+ {"version":3,"sources":["/home/runner/work/fict/fict/packages/runtime/dist/chunk-QB2UD62G.cjs","../src/scope.ts"],"names":[],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACA;ACKO,SAAS,WAAA,CAAA,EAA6B;AAC3C,EAAA,IAAI,QAAA,EAA+B,IAAA;AAEnC,EAAA,MAAM,KAAA,EAAO,CAAA,EAAA,GAAM;AACjB,IAAA,GAAA,CAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,CAAA;AACR,MAAA,QAAA,EAAU,IAAA;AAAA,IACZ;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,IAAA,EAAM,CAAI,EAAA,EAAA,GAAmB;AACjC,IAAA,IAAA,CAAK,CAAA;AACL,IAAA,MAAM,EAAE,OAAA,EAAS,WAAA,EAAa,MAAM,EAAA,EAAI,0CAAA,EAAW,EAAI,EAAE,OAAA,EAAS,KAAK,CAAC,CAAA;AACxE,IAAA,QAAA,EAAU,WAAA;AACV,IAAA,OAAO,KAAA;AAAA,EACT,CAAA;AAEA,EAAA,mDAAA,IAAwB,CAAA;AACxB,EAAA,OAAO,EAAE,GAAA,EAAK,KAAK,CAAA;AACrB;AAMO,SAAS,UAAA,CAAW,IAAA,EAA8B,EAAA,EAAsB;AAC7E,EAAA,MAAM,MAAA,EAAQ,WAAA,CAAY,CAAA;AAC1B,EAAA,MAAM,SAAA,EAAW,CAAA,EAAA,GAAO,0CAAA,IAAe,EAAA,EAAK,IAAA,CAAuB,EAAA,EAAI,CAAC,CAAC,IAAA;AAEzE,EAAA,4CAAA,CAAa,EAAA,GAAM;AACjB,IAAA,MAAM,QAAA,EAAU,QAAA,CAAS,CAAA;AACzB,IAAA,GAAA,CAAI,OAAA,EAAS;AACX,MAAA,KAAA,CAAM,GAAA,CAAI,EAAE,CAAA;AAAA,IACd,EAAA,KAAO;AACL,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA;AAAA,IACb;AAAA,EACF,CAAC,CAAA;AAED,EAAA,yCAAA,KAAU,CAAM,IAAI,CAAA;AACtB;ADbA;AACA;AACE;AACA;AACF,mEAAC","file":"/home/runner/work/fict/fict/packages/runtime/dist/chunk-QB2UD62G.cjs","sourcesContent":[null,"import { isReactive, type MaybeReactive } from './binding'\nimport { createEffect } from './effect'\nimport { createRoot, onCleanup, registerRootCleanup } from './lifecycle'\n\nexport { effectScope } from './signal'\n\nexport interface ReactiveScope {\n run<T>(fn: () => T): T\n stop(): void\n}\n\n/**\n * Create an explicit reactive scope that can contain effects/memos and be stopped manually.\n * The scope registers with the current root for cleanup.\n */\nexport function createScope(): ReactiveScope {\n let dispose: (() => void) | null = null\n\n const stop = () => {\n if (dispose) {\n dispose()\n dispose = null\n }\n }\n\n const run = <T>(fn: () => T): T => {\n stop()\n const { dispose: rootDispose, value } = createRoot(fn, { inherit: true })\n dispose = rootDispose\n return value\n }\n\n registerRootCleanup(stop)\n return { run, stop }\n}\n\n/**\n * Run a block of reactive code inside a managed scope that follows a boolean flag.\n * When the flag turns false, the scope is disposed and all contained effects/memos are cleaned up.\n */\nexport function runInScope(flag: MaybeReactive<boolean>, fn: () => void): void {\n const scope = createScope()\n const evaluate = () => (isReactive(flag) ? (flag as () => boolean)() : !!flag)\n\n createEffect(() => {\n const enabled = evaluate()\n if (enabled) {\n scope.run(fn)\n } else {\n scope.stop()\n }\n })\n\n onCleanup(scope.stop)\n}\n"]}
@@ -3,7 +3,7 @@ import {
3
3
  insertNodesBefore,
4
4
  removeNodes,
5
5
  toNodeArray
6
- } from "./chunk-RY5CY4CI.js";
6
+ } from "./chunk-D2IWOO4X.js";
7
7
  import {
8
8
  createRenderEffect,
9
9
  createRootContext,
@@ -12,7 +12,7 @@ import {
12
12
  getCurrentRoot,
13
13
  popRoot,
14
14
  pushRoot
15
- } from "./chunk-7BO6P2KP.js";
15
+ } from "./chunk-LRFMCJY3.js";
16
16
 
17
17
  // src/context.ts
18
18
  var contextStorage = /* @__PURE__ */ new WeakMap();
@@ -108,4 +108,4 @@ export {
108
108
  useContext,
109
109
  hasContext
110
110
  };
111
- //# sourceMappingURL=chunk-5OYBRKE4.js.map
111
+ //# sourceMappingURL=chunk-SLFAEVKJ.js.map