signalium 3.0.2 → 3.0.3

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 (67) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/cjs/development/{component-shared-Cug2Y5YZ.js → component-shared-DzjqSRY-.js} +2 -2
  3. package/dist/cjs/development/{component-shared-Cug2Y5YZ.js.map → component-shared-DzjqSRY-.js.map} +1 -1
  4. package/dist/cjs/development/{debug-C46WDxhL.js → debug-CDy1L3Id.js} +14 -13
  5. package/dist/cjs/development/debug-CDy1L3Id.js.map +1 -0
  6. package/dist/cjs/development/debug.js +1 -1
  7. package/dist/cjs/development/index.js +2 -2
  8. package/dist/cjs/development/react/index.js +4 -4
  9. package/dist/cjs/development/react/index.js.map +1 -1
  10. package/dist/cjs/development/react/index.server.js +1 -1
  11. package/dist/cjs/development/react/server.js +1 -1
  12. package/dist/cjs/development/{snapshot-CbZ6IH3B.js → snapshot-D8Ydfj9E.js} +2 -2
  13. package/dist/cjs/development/{snapshot-CbZ6IH3B.js.map → snapshot-D8Ydfj9E.js.map} +1 -1
  14. package/dist/cjs/development/utils.js +2 -2
  15. package/dist/cjs/production/{component-shared-D0J85PUi.js → component-shared-BuDl2V-v.js} +2 -2
  16. package/dist/cjs/production/{component-shared-D0J85PUi.js.map → component-shared-BuDl2V-v.js.map} +1 -1
  17. package/dist/cjs/production/{contexts-CM3QLfV8.js → contexts-CMvA-Ae9.js} +14 -13
  18. package/dist/cjs/production/contexts-CMvA-Ae9.js.map +1 -0
  19. package/dist/cjs/production/debug.js +1 -1
  20. package/dist/cjs/production/index.js +2 -2
  21. package/dist/cjs/production/react/index.js +4 -4
  22. package/dist/cjs/production/react/index.js.map +1 -1
  23. package/dist/cjs/production/react/index.server.js +1 -1
  24. package/dist/cjs/production/react/server.js +1 -1
  25. package/dist/cjs/production/{snapshot-DWwH7_9y.js → snapshot-I8W4cb8t.js} +2 -2
  26. package/dist/cjs/production/{snapshot-DWwH7_9y.js.map → snapshot-I8W4cb8t.js.map} +1 -1
  27. package/dist/cjs/production/utils.js +2 -2
  28. package/dist/esm/development/{component-shared-CLSmdnGU.js → component-shared-D_i2IMKF.js} +2 -2
  29. package/dist/esm/development/{component-shared-CLSmdnGU.js.map → component-shared-D_i2IMKF.js.map} +1 -1
  30. package/dist/esm/development/{debug-BTLbgTPK.js → debug-DCgp_XPm.js} +14 -13
  31. package/dist/esm/development/debug-DCgp_XPm.js.map +1 -0
  32. package/dist/esm/development/debug.js +1 -1
  33. package/dist/esm/development/index.js +2 -2
  34. package/dist/esm/development/react/index.js +4 -4
  35. package/dist/esm/development/react/index.js.map +1 -1
  36. package/dist/esm/development/react/index.server.js +1 -1
  37. package/dist/esm/development/react/server.js +1 -1
  38. package/dist/esm/development/{snapshot-CkndI4Hh.js → snapshot-D19Mgcgz.js} +2 -2
  39. package/dist/esm/development/{snapshot-CkndI4Hh.js.map → snapshot-D19Mgcgz.js.map} +1 -1
  40. package/dist/esm/development/utils.js +4 -4
  41. package/dist/esm/index.d.ts +1 -1
  42. package/dist/esm/index.d.ts.map +1 -1
  43. package/dist/esm/internals/async.d.ts.map +1 -1
  44. package/dist/esm/internals/scheduling.d.ts +2 -1
  45. package/dist/esm/internals/scheduling.d.ts.map +1 -1
  46. package/dist/esm/internals/watch.d.ts +3 -2
  47. package/dist/esm/internals/watch.d.ts.map +1 -1
  48. package/dist/esm/production/{component-shared-Dva0S5e3.js → component-shared-XZnx53QZ.js} +2 -2
  49. package/dist/esm/production/{component-shared-Dva0S5e3.js.map → component-shared-XZnx53QZ.js.map} +1 -1
  50. package/dist/esm/production/{contexts-FxCndlvf.js → contexts-Cpo7QZDe.js} +14 -13
  51. package/dist/esm/production/contexts-Cpo7QZDe.js.map +1 -0
  52. package/dist/esm/production/debug.js +1 -1
  53. package/dist/esm/production/index.js +2 -2
  54. package/dist/esm/production/react/index.js +4 -4
  55. package/dist/esm/production/react/index.js.map +1 -1
  56. package/dist/esm/production/react/index.server.js +1 -1
  57. package/dist/esm/production/react/server.js +1 -1
  58. package/dist/esm/production/{snapshot-CdCaJJ0L.js → snapshot-CZTu3qTo.js} +2 -2
  59. package/dist/esm/production/{snapshot-CdCaJJ0L.js.map → snapshot-CZTu3qTo.js.map} +1 -1
  60. package/dist/esm/production/utils.js +4 -4
  61. package/dist/esm/types.d.ts +20 -1
  62. package/dist/esm/types.d.ts.map +1 -1
  63. package/package.json +1 -1
  64. package/dist/cjs/development/debug-C46WDxhL.js.map +0 -1
  65. package/dist/cjs/production/contexts-CM3QLfV8.js.map +0 -1
  66. package/dist/esm/development/debug-BTLbgTPK.js.map +0 -1
  67. package/dist/esm/production/contexts-FxCndlvf.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../.tsc-out/react/context.js","../../../../.tsc-out/react/provider.js","../../../../.tsc-out/react/pause-signals-context.js","../../../../.tsc-out/react/async-component.js","../../../../.tsc-out/react/component.js","../../../../.tsc-out/react/use-signal.js","../../../../.tsc-out/react/use-reactive.js"],"sourcesContent":["import { createContext, useContext as useReactContext } from 'react';\nimport { getCurrentConsumer } from '../internals/consumer.js';\nexport const ScopeContext = createContext(undefined);\nexport function useScope() {\n return useReactContext(ScopeContext);\n}\nexport function useContext(context) {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const scope = getCurrentConsumer()?.scope ?? useScope();\n if (!scope) {\n throw new Error('useContext must be used within a signal hook, a withContext, or a component');\n }\n return scope.getContext(context) ?? context.defaultValue;\n}\n","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { useContext, useMemo } from 'react';\nimport { ScopeContext } from './context.js';\nimport { getGlobalScope, SignalScope } from '../internals/contexts.js';\nimport { hashValue } from '../internals/utils/hash.js';\nexport function ContextProvider({ children, contexts = [], inherit = true, }) {\n const parentScope = useContext(ScopeContext) ?? getGlobalScope();\n const scope = useMemo(() => new SignalScope(contexts, inherit ? parentScope : undefined), \n // eslint-disable-next-line react-hooks/exhaustive-deps\n [parentScope, inherit, hashValue(contexts)]);\n return _jsx(ScopeContext.Provider, { value: scope, children: children });\n}\n","import React, { createContext, useContext, useEffect, useRef } from 'react';\nimport { watchSignal, unwatchSignal } from '../internals/watch.js';\nimport { schedulePull } from '../internals/scheduling.js';\nclass PauseSignalsManager {\n signals = new Set();\n _paused;\n constructor(initialPaused) {\n this._paused = initialPaused;\n }\n get paused() {\n return this._paused;\n }\n register(signal) {\n this.signals.add(signal);\n }\n unregister(signal) {\n this.signals.delete(signal);\n }\n setPaused(value) {\n if (value === this._paused)\n return;\n this._paused = value;\n for (const signal of this.signals) {\n if (value) {\n unwatchSignal(signal);\n }\n else {\n watchSignal(signal);\n schedulePull(signal);\n }\n }\n }\n}\nconst PauseSignalsManagerContext = createContext(null);\nexport function PauseSignalsProvider({ value, children }) {\n const managerRef = useRef(null);\n if (managerRef.current === null) {\n managerRef.current = new PauseSignalsManager(value);\n }\n const manager = managerRef.current;\n useEffect(() => {\n manager.setPaused(value);\n }, [manager, value]);\n return React.createElement(PauseSignalsManagerContext.Provider, { value: manager }, children);\n}\nexport function usePauseSignalsManager() {\n return useContext(PauseSignalsManagerContext);\n}\n","import React, { useEffect, useMemo, useRef, useSyncExternalStore } from 'react';\nimport { getCurrentConsumer, setCurrentConsumer } from '../internals/consumer.js';\nimport { createReactiveSignal } from '../internals/reactive.js';\nimport { runSignal } from '../internals/get.js';\nimport { isReactivePromise } from '../internals/async.js';\nimport { hashValue } from '../internals/utils/hash.js';\nimport { isPromise, isThennable } from '../internals/utils/type-utils.js';\nimport { useScope } from './context.js';\nimport { usePauseSignalsManager } from './pause-signals-context.js';\n/**\n * Remembers settled outcomes for yielded thenables so synchronous replay can inject\n * `next(value)` on later attempts without throwing the same fulfilled promise again (which\n * can strand Suspense). Identity must be stable across replays for a given logical await.\n */\nconst thenableOutcome = new WeakMap();\nfunction adoptYieldedThenable(thenable) {\n const expanded = thenable;\n if (expanded.status === 'fulfilled') {\n return expanded.value;\n }\n if (expanded.status === 'rejected') {\n throw expanded.reason;\n }\n if (expanded.status === 'pending') {\n throw thenable;\n }\n const hit = thenableOutcome.get(thenable);\n if (hit !== undefined) {\n if (hit.kind === 'rejected') {\n throw hit.reason;\n }\n return hit.value;\n }\n thenable.then(v => {\n thenableOutcome.set(thenable, { kind: 'fulfilled', value: v });\n }, e => {\n thenableOutcome.set(thenable, { kind: 'rejected', reason: e });\n });\n throw thenable;\n}\n/** Marked on the outer wrapper returned by `component()` for async (generator) definitions. */\nexport const SIGNALIUM_ASYNC_COMPONENT = Symbol.for('signalium.asyncComponent');\n/**\n * Call from wrappers around `use()` if you might receive a Signalium async component by mistake.\n * React's `use()` does not support Signalium async `component()` wrappers — render them under\n * `<Suspense>` and use `await` inside the component (after the async transform) instead.\n */\nexport function throwIfSignaliumAsyncComponentPassedToUse(resource) {\n if (typeof resource === 'function' &&\n resource[SIGNALIUM_ASYNC_COMPONENT] === true) {\n throw new Error('use() with a Signalium async `component()` is not supported. Render the component under <Suspense> and use await inside the component (compiled from async/await by the Signalium preset) instead.');\n }\n}\nexport { isGeneratorFunction, isAsyncFunctionWithoutTransform } from './component-shared.js';\n/**\n * Synchronous replay driver for async `component()` (authoring: `async`/`await`; Babel rewrites to a generator).\n *\n * Each React render starts a **new** iterator and walks it in a tight loop. Each `yield` (from\n * the compiled generator, originally `await`) is treated like `use(promise)` / Suspense: pending\n * thenables **throw** (interrupting the render); settled `ReactivePromise` values are injected via\n * `next(value)` and the loop continues in the same turn.\n *\n * **Hooks after a suspending `await`:** Same family as React `use()` — the throw aborts before\n * later code runs; the next attempt replays from the top. Do not use conditional hooks without\n * Suspense on paths that skip them.\n *\n * **Plain `Promise` / other thenables:** First time pending, **throw** for Suspense and register\n * the outcome in a `WeakMap` keyed by thenable identity. After settlement, the **same** object\n * replays inject the value (or throw the rejection) synchronously. Keep **stable thenable\n * identity** across replays (e.g. store in a ref). Thenables may expose React `use()`-style\n * `status` / `value` / `reason` for synchronous reads when present.\n *\n * **Generator `let` / `const`:** Reset every replay; durable state should use React hooks, refs, or\n * Signalium signals.\n *\n * `ownerSignal` is set as `CURRENT_CONSUMER` so reads inside the generator participate in the\n * reactive graph like `compute` in `runSignal`.\n */\nexport function runSyncReplayAsyncComponent(fn, props, ownerSignal) {\n const prevConsumer = getCurrentConsumer();\n try {\n setCurrentConsumer(ownerSignal);\n const iter = fn(props);\n let sent = undefined;\n for (;;) {\n const step = iter.next(sent);\n if (step.done) {\n return step.value;\n }\n const yielded = step.value;\n if (yielded !== null && typeof yielded === 'object' && isReactivePromise(yielded)) {\n const rp = yielded;\n if (rp.isRejected) {\n throw rp.error;\n }\n if (!rp.isReady) {\n const native = rp._promise;\n throw native !== undefined ? native : rp;\n }\n sent = rp.value;\n continue;\n }\n if (yielded !== null && typeof yielded === 'object' && (isPromise(yielded) || isThennable(yielded))) {\n sent = adoptYieldedThenable(yielded);\n continue;\n }\n sent = yielded;\n }\n }\n finally {\n setCurrentConsumer(prevConsumer);\n }\n}\n/**\n * Async Signalium `component()`: one lazy reactive signal per **instance** (same as sync\n * `component()`), outer `useMemo` keyed by `hashValue(props)`. No definition-scoped props map.\n */\nexport function createAsyncComponentWrapper(fn) {\n const Inner = (props) => {\n const scope = useScope();\n const manager = usePauseSignalsManager();\n const fnSignalRef = useRef(undefined);\n const propsRef = useRef(props);\n propsRef.current = props;\n let sig = fnSignalRef.current;\n if (sig === undefined) {\n let owned;\n owned = createReactiveSignal({\n compute: () => runSyncReplayAsyncComponent(fn, propsRef.current, owned),\n equals: () => false,\n isRelay: false,\n tracer: undefined,\n }, [], undefined, scope);\n owned._isLazy = true;\n fnSignalRef.current = sig = owned;\n }\n const watch = !manager?.paused;\n manager?.register(sig);\n useEffect(() => {\n return () => manager?.unregister(sig);\n }, [manager, sig]);\n useSyncExternalStore(sig.addListenerLazy(watch), () => sig.updatedCount, () => sig.updatedCount);\n runSignal(sig);\n return sig.value;\n };\n const Outer = (props) => {\n const hash = hashValue(props);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n return useMemo(() => React.createElement(Inner, props), [hash]);\n };\n Object.defineProperty(Outer, SIGNALIUM_ASYNC_COMPONENT, { value: true, enumerable: false });\n return Outer;\n}\n","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport * as React from 'react';\nimport { useEffect, useMemo, useRef, useSyncExternalStore } from 'react';\nimport { useScope } from './context.js';\nimport { usePauseSignalsManager } from './pause-signals-context.js';\nimport { setRequestScopeGetter, SignalScope } from '../internals/contexts.js';\nimport { createReactiveSignal } from '../internals/reactive.js';\nimport { runSignal } from '../internals/get.js';\nimport { hashValue } from '../internals/utils/hash.js';\nimport { createAsyncComponentWrapper } from './async-component.js';\nimport { isAsyncFunctionWithoutTransform, isGeneratorFunction, createServerAsyncComponentWrapper, } from './component-shared.js';\nexport { isAsyncFunctionWithoutTransform, runSyncReplayAsyncComponent, SIGNALIUM_ASYNC_COMPONENT, throwIfSignaliumAsyncComponentPassedToUse, } from './async-component.js';\n/**\n * Auto-install per-request scoping for SSR of client components.\n *\n * `setupRscRequestScope()` only affects the RSC bundle; Next.js (and similar frameworks) render\n * client components in a separate SSR module graph. This ensures the SSR bundle also gets a\n * fresh {@link SignalScope} per render via `React.cache` (React 19+).\n */\nlet _ssrScopeInitialized = false;\nfunction ensureSsrScope() {\n if (_ssrScopeInitialized || typeof window !== 'undefined')\n return;\n _ssrScopeInitialized = true;\n const cache = React.cache;\n if (typeof cache === 'function') {\n const getScope = cache(() => new SignalScope([]));\n setRequestScopeGetter(() => getScope());\n }\n}\nexport default function component(fn) {\n ensureSsrScope();\n if (isAsyncFunctionWithoutTransform(fn)) {\n throw new Error('signalium: `component(async (props) => { await ... })` requires the Signalium Babel preset (async transform).');\n }\n if (isGeneratorFunction(fn)) {\n if (typeof window === 'undefined') {\n return createServerAsyncComponentWrapper(fn);\n }\n return createAsyncComponentWrapper(fn);\n }\n // Async `component(async () => { await ... })` is rewritten to a generator by the Babel preset.\n // Remaining callers are synchronous render functions only (see Promise overload for TS authoring).\n const syncFn = fn;\n const Component = (props) => {\n const scope = useScope();\n const manager = usePauseSignalsManager();\n const fnSignalRef = useRef(undefined);\n const propsRef = useRef(props);\n propsRef.current = props;\n let signal = fnSignalRef.current;\n if (signal === undefined) {\n const created = createReactiveSignal({\n compute: () => syncFn(propsRef.current),\n equals: () => false,\n isRelay: false,\n tracer: undefined,\n }, [], undefined, scope);\n created._isLazy = true;\n fnSignalRef.current = signal = created;\n }\n const watch = !manager?.paused;\n manager?.register(signal);\n useEffect(() => {\n return () => manager?.unregister(signal);\n }, [manager, signal]);\n useSyncExternalStore(signal.addListenerLazy(watch), () => signal.updatedCount, () => signal.updatedCount);\n runSignal(signal);\n return signal.value;\n };\n return (props) => {\n const hash = hashValue(props);\n // Renders Comp only when hash changes\n // eslint-disable-next-line react-hooks/exhaustive-deps\n return useMemo(() => _jsx(Component, { ...props }), [hash]);\n };\n}\n","import { useRef } from 'react';\nimport { signal } from '../index.js';\nexport function useSignal(value, opts) {\n const ref = useRef(undefined);\n if (!ref.current) {\n ref.current = signal(value, opts);\n }\n return ref.current;\n}\n","import { useEffect, useRef, useSyncExternalStore } from 'react';\nimport { getReactiveFnAndDefinition, reactiveSignal } from '../internals/core-api.js';\nimport { getCurrentConsumer } from '../internals/consumer.js';\nimport { snapshot } from '../internals/utils/snapshot.js';\nimport { useScope } from './context.js';\nimport { usePauseSignalsManager } from './pause-signals-context.js';\nimport { getGlobalScope } from '../internals/contexts.js';\nfunction useSignalWithSuspension(signal) {\n const manager = usePauseSignalsManager();\n const watch = !manager?.paused;\n manager?.register(signal);\n useEffect(() => {\n return () => manager?.unregister(signal);\n }, [manager, signal]);\n return useSyncExternalStore(signal.addListenerLazy(watch), () => signal.value, () => signal.value);\n}\n/**\n * Subscribe to a reactive thunk without structural cloning. The thunk's\n * `ReactiveDefinition` is memoized by fn identity in a `WeakMap`, so a\n * memoized thunk (via `useCallback` or the Signalium Babel preset) reuses the\n * same scope-cached signal across renders.\n *\n * This is a minimal wrapper: the returned value is whatever the thunk\n * returned, by reference. In particular, when the thunk returns a\n * `ReactivePromise`, re-renders only fire when the underlying signal itself\n * re-evaluates (e.g. a new promise replaces the old one) — not when the\n * existing promise transitions from pending to resolved. If you need promise\n * state transitions to drive React, read its fields inside the thunk (e.g.\n * `useReactiveShallow(() => { const p = fetchThing(); return { value: p.value,\n * isPending: p.isPending }; })`) or use {@link useReactive} for the\n * structurally-shared snapshot that handles this automatically.\n */\nexport function useReactiveShallow(fn) {\n if (IS_DEV && getCurrentConsumer()) {\n throw new Error('signalium: `useReactiveShallow` cannot be called inside a reactive function. ' +\n 'Call your reactive function directly instead — it already participates in the signal graph.');\n }\n const [, def] = getReactiveFnAndDefinition(fn);\n const scope = useScope() ?? getGlobalScope();\n const signal = scope.get(def, []);\n return useSignalWithSuspension(signal);\n}\n/**\n * Subscribe to a reactive thunk and return a structurally-shared snapshot of\n * its value. Nested objects/arrays/Maps/Sets are deep-cloned; unchanged\n * subtrees keep the same reference, so React's referential equality works as\n * expected. ReactivePromise values are flattened to plain objects.\n *\n * This is the default hook for reading reactive values inside a React\n * component — it gives you safe equality semantics at the React boundary.\n * Use {@link useReactiveShallow} if you know you don't need structural\n * sharing.\n */\nexport function useReactive(fn) {\n if (IS_DEV && getCurrentConsumer()) {\n throw new Error('signalium: `useReactive` cannot be called inside a reactive function. ' +\n 'Call your reactive function directly instead — it already participates in the signal graph.');\n }\n const manager = usePauseSignalsManager();\n const watch = !manager?.paused;\n const scope = useScope() ?? getGlobalScope();\n const innerSignalRef = useRef(undefined);\n const cloneSignalRef = useRef(undefined);\n const valueRef = useRef(undefined);\n const [, def] = getReactiveFnAndDefinition(fn);\n const signal = scope.get(def, []);\n if (innerSignalRef.current !== signal) {\n innerSignalRef.current = signal;\n valueRef.current = undefined;\n cloneSignalRef.current = reactiveSignal(() => {\n const next = snapshot(signal.value, valueRef.current);\n valueRef.current = next;\n return next;\n });\n }\n const cloneSignal = cloneSignalRef.current;\n manager?.register(cloneSignal);\n useEffect(() => {\n return () => manager?.unregister(cloneSignal);\n }, [manager, cloneSignal]);\n return useSyncExternalStore(cloneSignal.addListenerLazy(watch), () => cloneSignal.value, () => cloneSignal.value);\n}\n/**\n * @deprecated Use {@link useReactive} instead. `useReactive` is now\n * deep-by-default; `useReactiveDeep` is a thin alias kept for back-compat and\n * will be removed in a future major release.\n */\nexport function useReactiveDeep(fn) {\n if (IS_DEV) {\n warnUseReactiveDeepOnce();\n }\n return useReactive(fn);\n}\nlet _useReactiveDeepWarned = false;\nfunction warnUseReactiveDeepOnce() {\n if (_useReactiveDeepWarned)\n return;\n _useReactiveDeepWarned = true;\n console.warn('[signalium] `useReactiveDeep` is deprecated; use `useReactive` instead. ' +\n '`useReactive` is now deep-by-default. Use `useReactiveShallow` to opt out of structural snapshots.');\n}\n"],"names":["createContext","useReactContext","getCurrentConsumer","contexts","useContext","getGlobalScope","useMemo","SignalScope","hashValue","_jsx","unwatchSignal","watchSignal","schedulePull","useRef","useEffect","setCurrentConsumer","isReactivePromise","isPromise","isThennable","createReactiveSignal","useSyncExternalStore","runSignal","React","setRequestScopeGetter","isAsyncFunctionWithoutTransform","isGeneratorFunction","createServerAsyncComponentWrapper","signal","getReactiveFnAndDefinition","reactiveSignal","snapshot"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../../.tsc-out/react/context.js","../../../../.tsc-out/react/provider.js","../../../../.tsc-out/react/pause-signals-context.js","../../../../.tsc-out/react/async-component.js","../../../../.tsc-out/react/component.js","../../../../.tsc-out/react/use-signal.js","../../../../.tsc-out/react/use-reactive.js"],"sourcesContent":["import { createContext, useContext as useReactContext } from 'react';\nimport { getCurrentConsumer } from '../internals/consumer.js';\nexport const ScopeContext = createContext(undefined);\nexport function useScope() {\n return useReactContext(ScopeContext);\n}\nexport function useContext(context) {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const scope = getCurrentConsumer()?.scope ?? useScope();\n if (!scope) {\n throw new Error('useContext must be used within a signal hook, a withContext, or a component');\n }\n return scope.getContext(context) ?? context.defaultValue;\n}\n","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { useContext, useMemo } from 'react';\nimport { ScopeContext } from './context.js';\nimport { getGlobalScope, SignalScope } from '../internals/contexts.js';\nimport { hashValue } from '../internals/utils/hash.js';\nexport function ContextProvider({ children, contexts = [], inherit = true, }) {\n const parentScope = useContext(ScopeContext) ?? getGlobalScope();\n const scope = useMemo(() => new SignalScope(contexts, inherit ? parentScope : undefined), \n // eslint-disable-next-line react-hooks/exhaustive-deps\n [parentScope, inherit, hashValue(contexts)]);\n return _jsx(ScopeContext.Provider, { value: scope, children: children });\n}\n","import React, { createContext, useContext, useEffect, useRef } from 'react';\nimport { watchSignal, unwatchSignal } from '../internals/watch.js';\nimport { schedulePull } from '../internals/scheduling.js';\nclass PauseSignalsManager {\n signals = new Set();\n _paused;\n constructor(initialPaused) {\n this._paused = initialPaused;\n }\n get paused() {\n return this._paused;\n }\n register(signal) {\n this.signals.add(signal);\n }\n unregister(signal) {\n this.signals.delete(signal);\n }\n setPaused(value) {\n if (value === this._paused)\n return;\n this._paused = value;\n for (const signal of this.signals) {\n if (value) {\n unwatchSignal(signal, { isPausing: true });\n }\n else {\n watchSignal(signal);\n schedulePull(signal);\n }\n }\n }\n}\nconst PauseSignalsManagerContext = createContext(null);\nexport function PauseSignalsProvider({ value, children }) {\n const managerRef = useRef(null);\n if (managerRef.current === null) {\n managerRef.current = new PauseSignalsManager(value);\n }\n const manager = managerRef.current;\n useEffect(() => {\n manager.setPaused(value);\n }, [manager, value]);\n return React.createElement(PauseSignalsManagerContext.Provider, { value: manager }, children);\n}\nexport function usePauseSignalsManager() {\n return useContext(PauseSignalsManagerContext);\n}\n","import React, { useEffect, useMemo, useRef, useSyncExternalStore } from 'react';\nimport { getCurrentConsumer, setCurrentConsumer } from '../internals/consumer.js';\nimport { createReactiveSignal } from '../internals/reactive.js';\nimport { runSignal } from '../internals/get.js';\nimport { isReactivePromise } from '../internals/async.js';\nimport { hashValue } from '../internals/utils/hash.js';\nimport { isPromise, isThennable } from '../internals/utils/type-utils.js';\nimport { useScope } from './context.js';\nimport { usePauseSignalsManager } from './pause-signals-context.js';\n/**\n * Remembers settled outcomes for yielded thenables so synchronous replay can inject\n * `next(value)` on later attempts without throwing the same fulfilled promise again (which\n * can strand Suspense). Identity must be stable across replays for a given logical await.\n */\nconst thenableOutcome = new WeakMap();\nfunction adoptYieldedThenable(thenable) {\n const expanded = thenable;\n if (expanded.status === 'fulfilled') {\n return expanded.value;\n }\n if (expanded.status === 'rejected') {\n throw expanded.reason;\n }\n if (expanded.status === 'pending') {\n throw thenable;\n }\n const hit = thenableOutcome.get(thenable);\n if (hit !== undefined) {\n if (hit.kind === 'rejected') {\n throw hit.reason;\n }\n return hit.value;\n }\n thenable.then(v => {\n thenableOutcome.set(thenable, { kind: 'fulfilled', value: v });\n }, e => {\n thenableOutcome.set(thenable, { kind: 'rejected', reason: e });\n });\n throw thenable;\n}\n/** Marked on the outer wrapper returned by `component()` for async (generator) definitions. */\nexport const SIGNALIUM_ASYNC_COMPONENT = Symbol.for('signalium.asyncComponent');\n/**\n * Call from wrappers around `use()` if you might receive a Signalium async component by mistake.\n * React's `use()` does not support Signalium async `component()` wrappers — render them under\n * `<Suspense>` and use `await` inside the component (after the async transform) instead.\n */\nexport function throwIfSignaliumAsyncComponentPassedToUse(resource) {\n if (typeof resource === 'function' &&\n resource[SIGNALIUM_ASYNC_COMPONENT] === true) {\n throw new Error('use() with a Signalium async `component()` is not supported. Render the component under <Suspense> and use await inside the component (compiled from async/await by the Signalium preset) instead.');\n }\n}\nexport { isGeneratorFunction, isAsyncFunctionWithoutTransform } from './component-shared.js';\n/**\n * Synchronous replay driver for async `component()` (authoring: `async`/`await`; Babel rewrites to a generator).\n *\n * Each React render starts a **new** iterator and walks it in a tight loop. Each `yield` (from\n * the compiled generator, originally `await`) is treated like `use(promise)` / Suspense: pending\n * thenables **throw** (interrupting the render); settled `ReactivePromise` values are injected via\n * `next(value)` and the loop continues in the same turn.\n *\n * **Hooks after a suspending `await`:** Same family as React `use()` — the throw aborts before\n * later code runs; the next attempt replays from the top. Do not use conditional hooks without\n * Suspense on paths that skip them.\n *\n * **Plain `Promise` / other thenables:** First time pending, **throw** for Suspense and register\n * the outcome in a `WeakMap` keyed by thenable identity. After settlement, the **same** object\n * replays inject the value (or throw the rejection) synchronously. Keep **stable thenable\n * identity** across replays (e.g. store in a ref). Thenables may expose React `use()`-style\n * `status` / `value` / `reason` for synchronous reads when present.\n *\n * **Generator `let` / `const`:** Reset every replay; durable state should use React hooks, refs, or\n * Signalium signals.\n *\n * `ownerSignal` is set as `CURRENT_CONSUMER` so reads inside the generator participate in the\n * reactive graph like `compute` in `runSignal`.\n */\nexport function runSyncReplayAsyncComponent(fn, props, ownerSignal) {\n const prevConsumer = getCurrentConsumer();\n try {\n setCurrentConsumer(ownerSignal);\n const iter = fn(props);\n let sent = undefined;\n for (;;) {\n const step = iter.next(sent);\n if (step.done) {\n return step.value;\n }\n const yielded = step.value;\n if (yielded !== null && typeof yielded === 'object' && isReactivePromise(yielded)) {\n const rp = yielded;\n if (rp.isRejected) {\n throw rp.error;\n }\n if (!rp.isReady) {\n const native = rp._promise;\n throw native !== undefined ? native : rp;\n }\n sent = rp.value;\n continue;\n }\n if (yielded !== null && typeof yielded === 'object' && (isPromise(yielded) || isThennable(yielded))) {\n sent = adoptYieldedThenable(yielded);\n continue;\n }\n sent = yielded;\n }\n }\n finally {\n setCurrentConsumer(prevConsumer);\n }\n}\n/**\n * Async Signalium `component()`: one lazy reactive signal per **instance** (same as sync\n * `component()`), outer `useMemo` keyed by `hashValue(props)`. No definition-scoped props map.\n */\nexport function createAsyncComponentWrapper(fn) {\n const Inner = (props) => {\n const scope = useScope();\n const manager = usePauseSignalsManager();\n const fnSignalRef = useRef(undefined);\n const propsRef = useRef(props);\n propsRef.current = props;\n let sig = fnSignalRef.current;\n if (sig === undefined) {\n let owned;\n owned = createReactiveSignal({\n compute: () => runSyncReplayAsyncComponent(fn, propsRef.current, owned),\n equals: () => false,\n isRelay: false,\n tracer: undefined,\n }, [], undefined, scope);\n owned._isLazy = true;\n fnSignalRef.current = sig = owned;\n }\n const watch = !manager?.paused;\n manager?.register(sig);\n useEffect(() => {\n return () => manager?.unregister(sig);\n }, [manager, sig]);\n useSyncExternalStore(sig.addListenerLazy(watch), () => sig.updatedCount, () => sig.updatedCount);\n runSignal(sig);\n return sig.value;\n };\n const Outer = (props) => {\n const hash = hashValue(props);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n return useMemo(() => React.createElement(Inner, props), [hash]);\n };\n Object.defineProperty(Outer, SIGNALIUM_ASYNC_COMPONENT, { value: true, enumerable: false });\n return Outer;\n}\n","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport * as React from 'react';\nimport { useEffect, useMemo, useRef, useSyncExternalStore } from 'react';\nimport { useScope } from './context.js';\nimport { usePauseSignalsManager } from './pause-signals-context.js';\nimport { setRequestScopeGetter, SignalScope } from '../internals/contexts.js';\nimport { createReactiveSignal } from '../internals/reactive.js';\nimport { runSignal } from '../internals/get.js';\nimport { hashValue } from '../internals/utils/hash.js';\nimport { createAsyncComponentWrapper } from './async-component.js';\nimport { isAsyncFunctionWithoutTransform, isGeneratorFunction, createServerAsyncComponentWrapper, } from './component-shared.js';\nexport { isAsyncFunctionWithoutTransform, runSyncReplayAsyncComponent, SIGNALIUM_ASYNC_COMPONENT, throwIfSignaliumAsyncComponentPassedToUse, } from './async-component.js';\n/**\n * Auto-install per-request scoping for SSR of client components.\n *\n * `setupRscRequestScope()` only affects the RSC bundle; Next.js (and similar frameworks) render\n * client components in a separate SSR module graph. This ensures the SSR bundle also gets a\n * fresh {@link SignalScope} per render via `React.cache` (React 19+).\n */\nlet _ssrScopeInitialized = false;\nfunction ensureSsrScope() {\n if (_ssrScopeInitialized || typeof window !== 'undefined')\n return;\n _ssrScopeInitialized = true;\n const cache = React.cache;\n if (typeof cache === 'function') {\n const getScope = cache(() => new SignalScope([]));\n setRequestScopeGetter(() => getScope());\n }\n}\nexport default function component(fn) {\n ensureSsrScope();\n if (isAsyncFunctionWithoutTransform(fn)) {\n throw new Error('signalium: `component(async (props) => { await ... })` requires the Signalium Babel preset (async transform).');\n }\n if (isGeneratorFunction(fn)) {\n if (typeof window === 'undefined') {\n return createServerAsyncComponentWrapper(fn);\n }\n return createAsyncComponentWrapper(fn);\n }\n // Async `component(async () => { await ... })` is rewritten to a generator by the Babel preset.\n // Remaining callers are synchronous render functions only (see Promise overload for TS authoring).\n const syncFn = fn;\n const Component = (props) => {\n const scope = useScope();\n const manager = usePauseSignalsManager();\n const fnSignalRef = useRef(undefined);\n const propsRef = useRef(props);\n propsRef.current = props;\n let signal = fnSignalRef.current;\n if (signal === undefined) {\n const created = createReactiveSignal({\n compute: () => syncFn(propsRef.current),\n equals: () => false,\n isRelay: false,\n tracer: undefined,\n }, [], undefined, scope);\n created._isLazy = true;\n fnSignalRef.current = signal = created;\n }\n const watch = !manager?.paused;\n manager?.register(signal);\n useEffect(() => {\n return () => manager?.unregister(signal);\n }, [manager, signal]);\n useSyncExternalStore(signal.addListenerLazy(watch), () => signal.updatedCount, () => signal.updatedCount);\n runSignal(signal);\n return signal.value;\n };\n return (props) => {\n const hash = hashValue(props);\n // Renders Comp only when hash changes\n // eslint-disable-next-line react-hooks/exhaustive-deps\n return useMemo(() => _jsx(Component, { ...props }), [hash]);\n };\n}\n","import { useRef } from 'react';\nimport { signal } from '../index.js';\nexport function useSignal(value, opts) {\n const ref = useRef(undefined);\n if (!ref.current) {\n ref.current = signal(value, opts);\n }\n return ref.current;\n}\n","import { useEffect, useRef, useSyncExternalStore } from 'react';\nimport { getReactiveFnAndDefinition, reactiveSignal } from '../internals/core-api.js';\nimport { getCurrentConsumer } from '../internals/consumer.js';\nimport { snapshot } from '../internals/utils/snapshot.js';\nimport { useScope } from './context.js';\nimport { usePauseSignalsManager } from './pause-signals-context.js';\nimport { getGlobalScope } from '../internals/contexts.js';\nfunction useSignalWithSuspension(signal) {\n const manager = usePauseSignalsManager();\n const watch = !manager?.paused;\n manager?.register(signal);\n useEffect(() => {\n return () => manager?.unregister(signal);\n }, [manager, signal]);\n return useSyncExternalStore(signal.addListenerLazy(watch), () => signal.value, () => signal.value);\n}\n/**\n * Subscribe to a reactive thunk without structural cloning. The thunk's\n * `ReactiveDefinition` is memoized by fn identity in a `WeakMap`, so a\n * memoized thunk (via `useCallback` or the Signalium Babel preset) reuses the\n * same scope-cached signal across renders.\n *\n * This is a minimal wrapper: the returned value is whatever the thunk\n * returned, by reference. In particular, when the thunk returns a\n * `ReactivePromise`, re-renders only fire when the underlying signal itself\n * re-evaluates (e.g. a new promise replaces the old one) — not when the\n * existing promise transitions from pending to resolved. If you need promise\n * state transitions to drive React, read its fields inside the thunk (e.g.\n * `useReactiveShallow(() => { const p = fetchThing(); return { value: p.value,\n * isPending: p.isPending }; })`) or use {@link useReactive} for the\n * structurally-shared snapshot that handles this automatically.\n */\nexport function useReactiveShallow(fn) {\n if (IS_DEV && getCurrentConsumer()) {\n throw new Error('signalium: `useReactiveShallow` cannot be called inside a reactive function. ' +\n 'Call your reactive function directly instead — it already participates in the signal graph.');\n }\n const [, def] = getReactiveFnAndDefinition(fn);\n const scope = useScope() ?? getGlobalScope();\n const signal = scope.get(def, []);\n return useSignalWithSuspension(signal);\n}\n/**\n * Subscribe to a reactive thunk and return a structurally-shared snapshot of\n * its value. Nested objects/arrays/Maps/Sets are deep-cloned; unchanged\n * subtrees keep the same reference, so React's referential equality works as\n * expected. ReactivePromise values are flattened to plain objects.\n *\n * This is the default hook for reading reactive values inside a React\n * component — it gives you safe equality semantics at the React boundary.\n * Use {@link useReactiveShallow} if you know you don't need structural\n * sharing.\n */\nexport function useReactive(fn) {\n if (IS_DEV && getCurrentConsumer()) {\n throw new Error('signalium: `useReactive` cannot be called inside a reactive function. ' +\n 'Call your reactive function directly instead — it already participates in the signal graph.');\n }\n const manager = usePauseSignalsManager();\n const watch = !manager?.paused;\n const scope = useScope() ?? getGlobalScope();\n const innerSignalRef = useRef(undefined);\n const cloneSignalRef = useRef(undefined);\n const valueRef = useRef(undefined);\n const [, def] = getReactiveFnAndDefinition(fn);\n const signal = scope.get(def, []);\n if (innerSignalRef.current !== signal) {\n innerSignalRef.current = signal;\n valueRef.current = undefined;\n cloneSignalRef.current = reactiveSignal(() => {\n const next = snapshot(signal.value, valueRef.current);\n valueRef.current = next;\n return next;\n });\n }\n const cloneSignal = cloneSignalRef.current;\n manager?.register(cloneSignal);\n useEffect(() => {\n return () => manager?.unregister(cloneSignal);\n }, [manager, cloneSignal]);\n return useSyncExternalStore(cloneSignal.addListenerLazy(watch), () => cloneSignal.value, () => cloneSignal.value);\n}\n/**\n * @deprecated Use {@link useReactive} instead. `useReactive` is now\n * deep-by-default; `useReactiveDeep` is a thin alias kept for back-compat and\n * will be removed in a future major release.\n */\nexport function useReactiveDeep(fn) {\n if (IS_DEV) {\n warnUseReactiveDeepOnce();\n }\n return useReactive(fn);\n}\nlet _useReactiveDeepWarned = false;\nfunction warnUseReactiveDeepOnce() {\n if (_useReactiveDeepWarned)\n return;\n _useReactiveDeepWarned = true;\n console.warn('[signalium] `useReactiveDeep` is deprecated; use `useReactive` instead. ' +\n '`useReactive` is now deep-by-default. Use `useReactiveShallow` to opt out of structural snapshots.');\n}\n"],"names":["createContext","useReactContext","getCurrentConsumer","contexts","useContext","getGlobalScope","useMemo","SignalScope","hashValue","_jsx","unwatchSignal","watchSignal","schedulePull","useRef","useEffect","setCurrentConsumer","isReactivePromise","isPromise","isThennable","createReactiveSignal","useSyncExternalStore","runSignal","React","setRequestScopeGetter","isAsyncFunctionWithoutTransform","isGeneratorFunction","createServerAsyncComponentWrapper","signal","getReactiveFnAndDefinition","reactiveSignal","snapshot"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const componentShared = require("../component-shared-D0J85PUi.js");
3
+ const componentShared = require("../component-shared-BuDl2V-v.js");
4
4
  function component(fn) {
5
5
  if (componentShared.isAsyncFunctionWithoutTransform(fn)) {
6
6
  throw new Error("signalium: `component(async (props) => { await ... })` requires the Signalium Babel preset (async transform).");
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const React = require("react");
4
- const contexts = require("../contexts-CM3QLfV8.js");
4
+ const contexts = require("../contexts-CMvA-Ae9.js");
5
5
  function _interopNamespaceDefault(e) {
6
6
  const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
7
7
  if (e) {
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
- const contexts = require("./contexts-CM3QLfV8.js");
2
+ const contexts = require("./contexts-CMvA-Ae9.js");
3
3
  const DERIVED_DEFINITION_MAP = /* @__PURE__ */ new WeakMap();
4
4
  function getReactiveFnAndDefinition(fn, opts) {
5
5
  let fnAndDef = DERIVED_DEFINITION_MAP.get(fn);
@@ -155,4 +155,4 @@ exports.relay = relay;
155
155
  exports.snapshot = snapshot;
156
156
  exports.task = task;
157
157
  exports.watcher = watcher;
158
- //# sourceMappingURL=snapshot-DWwH7_9y.js.map
158
+ //# sourceMappingURL=snapshot-I8W4cb8t.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"snapshot-DWwH7_9y.js","sources":["../../../.tsc-out/internals/core-api.js","../../../.tsc-out/internals/utils/snapshot.js"],"sourcesContent":["import { getCurrentScope, getScopeOwner, SignalScope } from './contexts.js';\nimport { createReactiveDefinition, createReactiveSignal, } from './reactive.js';\nimport { createRelay, createTask } from './async.js';\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\nexport const DERIVED_DEFINITION_MAP = new WeakMap();\nexport function getReactiveFnAndDefinition(fn, opts) {\n let fnAndDef = DERIVED_DEFINITION_MAP.get(fn);\n if (!fnAndDef) {\n const def = createReactiveDefinition(opts?.id, opts?.desc, fn, opts?.equals, false, opts?.paramKey, undefined);\n const defScope = getCurrentScope();\n const reactiveFn = (...args) => {\n const scope = getCurrentScope(defScope);\n const signal = scope.get(def, args);\n return signal.value;\n };\n fnAndDef = [reactiveFn, def];\n DERIVED_DEFINITION_MAP.set(fn, fnAndDef);\n }\n return fnAndDef;\n}\nexport function reactive(fn, opts) {\n return getReactiveFnAndDefinition(fn, opts)[0];\n}\nexport const reactiveMethod = (owner, fn, opts) => {\n const def = createReactiveDefinition(opts?.id, opts?.desc, fn, opts?.equals, false, opts?.paramKey, undefined);\n const reactiveFn = (...args) => {\n return getScopeOwner(owner).get(def, args).value;\n };\n DERIVED_DEFINITION_MAP.set(reactiveFn, [reactiveFn, def]);\n return reactiveFn;\n};\nexport function relay(activate, opts) {\n const scope = getCurrentScope();\n return createRelay(activate, scope, opts);\n}\nexport const task = (fn, opts) => {\n const scope = getCurrentScope();\n return createTask(fn, scope, opts);\n};\nexport function watcher(fn, opts) {\n const def = createReactiveDefinition(opts?.id, opts?.desc, fn, opts?.equals, false, undefined, opts?.tracer);\n const scope = opts?.isolate ? new SignalScope([]) : getCurrentScope();\n return createReactiveSignal(def, undefined, undefined, scope);\n}\n/**\n * Creates a reactive signal from a compute function. This is useful for when you\n * want to create a signal that does not receive parameters, but is still reactive.\n *\n * @param compute\n * @param opts\n * @returns\n */\nexport const reactiveSignal = (compute, opts) => {\n const def = createReactiveDefinition(opts?.id, opts?.desc, compute, opts?.equals, false, undefined, undefined);\n const scope = opts?.isolate ? new SignalScope([]) : getCurrentScope();\n return createReactiveSignal(def, undefined, undefined, scope);\n};\n","import { isReactivePromise } from '../async.js';\nconst getProto = Object.getPrototypeOf;\nfunction snapshotArray(current, prev, snap) {\n const prevArr = Array.isArray(prev) ? prev : undefined;\n let changed = !prevArr || prevArr.length !== current.length;\n const result = new Array(current.length);\n for (let i = 0; i < current.length; i++) {\n result[i] = snap(current[i], prevArr?.[i]);\n if (!changed && result[i] !== prevArr[i]) {\n changed = true;\n }\n }\n return changed ? result : prevArr;\n}\nfunction snapshotPlainObject(current, prev, snap) {\n const prevObj = prev !== null && prev !== undefined && typeof prev === 'object' && !Array.isArray(prev)\n ? prev\n : undefined;\n const keys = Object.keys(current);\n let changed = !prevObj || Object.keys(prevObj).length !== keys.length;\n const result = {};\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n result[key] = snap(current[key], prevObj?.[key]);\n if (!changed && result[key] !== prevObj[key]) {\n changed = true;\n }\n }\n return changed ? result : prevObj;\n}\nfunction snapshotReactivePromise(current, prev, snap) {\n const prevObj = prev !== null && prev !== undefined && typeof prev === 'object' ? prev : undefined;\n const value = snap(current.value, prevObj?.value);\n const error = current.error;\n const isPending = current.isPending;\n const isRejected = current.isRejected;\n const isResolved = current.isResolved;\n const isReady = current.isReady;\n const isSettled = current.isSettled;\n // `run` is set once in the task constructor and never mutated, so its identity\n // is stable for the lifetime of the underlying ReactivePromiseImpl. Carrying\n // it on the snapshot lets consumers (e.g. React components reading a task via\n // `useReactive`) invoke `result.run(...)` against the live task. For non-task\n // promises this is `undefined`; we still assign the slot so the resulting\n // object's hidden class is stable across task and non-task snapshots.\n const run = current.run;\n if (prevObj &&\n value === prevObj.value &&\n error === prevObj.error &&\n isPending === prevObj.isPending &&\n isRejected === prevObj.isRejected &&\n isResolved === prevObj.isResolved &&\n isReady === prevObj.isReady &&\n isSettled === prevObj.isSettled &&\n run === prevObj.run) {\n return prevObj;\n }\n return { value, error, isPending, isRejected, isResolved, isReady, isSettled, run };\n}\nfunction snapshotMap(current, prev, snap) {\n const prevMap = prev instanceof Map ? prev : undefined;\n let changed = !prevMap || prevMap.size !== current.size;\n const result = new Map();\n for (const [key, val] of current) {\n const snapped = snap(val, prevMap?.get(key));\n result.set(key, snapped);\n if (!changed && snapped !== prevMap.get(key)) {\n changed = true;\n }\n }\n return changed ? result : prevMap;\n}\nfunction snapshotSet(current, prev, _snap) {\n const prevSet = prev instanceof Set ? prev : undefined;\n let changed = !prevSet || prevSet.size !== current.size;\n const result = new Set();\n for (const val of current) {\n const snapped = snapshot(val, prevSet?.has(val) ? val : undefined);\n result.add(snapped);\n if (!changed && !prevSet.has(snapped)) {\n changed = true;\n }\n }\n return changed ? result : prevSet;\n}\n/**\n * Built-in handlers for plain structural types. Matched by exact prototype\n * only — subclasses of `Object` / `Array` / `Map` / `Set` are NOT routed\n * through these handlers (they fall through and, if no custom ancestor is\n * registered, are returned as-is). We use a Map here rather than installing\n * a symbol property on the built-in prototypes, because mutating built-in\n * prototypes (even with a symbol key) changes their hidden class and\n * invalidates V8's fast-path inline caches for every plain object / array\n * in the program.\n */\nconst BUILTIN_PROTO_TO_SNAPSHOT = new Map([\n [Object.prototype, snapshotPlainObject],\n [Array.prototype, snapshotArray],\n [Map.prototype, snapshotMap],\n [Set.prototype, snapshotSet],\n [null, snapshotPlainObject],\n]);\n/**\n * Custom registrations are stored as a non-enumerable symbol property on the\n * class prototype. JS prototype lookup walks the chain natively, so subclass\n * inheritance and override-by-redefinition are free — no resolver, no cache,\n * no invalidation. The symbol is module-private (created with `Symbol()`,\n * not `Symbol.for()`), so it cannot collide with anything else and cannot\n * be addressed by user code.\n */\nconst SNAPSHOT_HANDLER = Symbol('signalium.snapshot.handler');\n/**\n * Register a custom snapshot function for instances of a class.\n * The function receives the current value, the previous snapshot (or undefined),\n * and the recursive `snapshot` function for snapshotting nested values.\n *\n * Subclasses inherit the handler automatically via prototype lookup, so\n * registering once on a base class applies to all descendants. A descendant\n * can override by registering its own handler.\n *\n * Return `prev` when nothing has changed to preserve reference stability.\n *\n * @example\n * ```ts\n * registerCustomSnapshot(MyEntity, (current, prev, snapshot) => {\n * const name = snapshot(current.name, prev?.name);\n * const age = current.age;\n * if (prev && name === prev.name && age === prev.age) return prev;\n * return { name, age };\n * });\n * ```\n */\nexport const registerCustomSnapshot = (ctor, snapshotFn) => {\n // Use defineProperty so the handler is non-enumerable (it shouldn't show up\n // in `Reflect.ownKeys` walks any more than necessary) and so re-registration\n // overwrites cleanly even if a subclass has shadowed it.\n Object.defineProperty(ctor.prototype, SNAPSHOT_HANDLER, {\n value: snapshotFn,\n writable: true,\n configurable: true,\n enumerable: false,\n });\n};\n/**\n * Recursively snapshot a value with structural sharing.\n *\n * - Plain objects and arrays are deep-cloned; unchanged subtrees keep the same reference.\n * - ReactivePromise instances are read (establishing deps) and flattened to a plain object.\n * - Class instances are returned as-is unless a custom handler is registered\n * for the class or any of its ancestors via `registerCustomSnapshot`.\n * - Primitives are returned directly.\n */\nexport function snapshot(currentValue, prevValue) {\n if (currentValue === null || typeof currentValue !== 'object') {\n return currentValue;\n }\n if (isReactivePromise(currentValue)) {\n return snapshotReactivePromise(currentValue, prevValue, snapshot);\n }\n // Custom registrations check first: native prototype lookup walks the chain\n // for us, so subclasses inherit their ancestor's handler with no extra work.\n const customHandler = currentValue[SNAPSHOT_HANDLER];\n if (customHandler !== undefined) {\n return customHandler(currentValue, prevValue, snapshot);\n }\n // Built-in handlers are looked up by exact prototype only.\n const builtIn = BUILTIN_PROTO_TO_SNAPSHOT.get(getProto(currentValue));\n if (builtIn !== undefined) {\n return builtIn(currentValue, prevValue, snapshot);\n }\n return currentValue;\n}\n"],"names":["createReactiveDefinition","getCurrentScope","getScopeOwner","createRelay","createTask","SignalScope","createReactiveSignal","isReactivePromise"],"mappings":"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"}
1
+ {"version":3,"file":"snapshot-I8W4cb8t.js","sources":["../../../.tsc-out/internals/core-api.js","../../../.tsc-out/internals/utils/snapshot.js"],"sourcesContent":["import { getCurrentScope, getScopeOwner, SignalScope } from './contexts.js';\nimport { createReactiveDefinition, createReactiveSignal, } from './reactive.js';\nimport { createRelay, createTask } from './async.js';\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\nexport const DERIVED_DEFINITION_MAP = new WeakMap();\nexport function getReactiveFnAndDefinition(fn, opts) {\n let fnAndDef = DERIVED_DEFINITION_MAP.get(fn);\n if (!fnAndDef) {\n const def = createReactiveDefinition(opts?.id, opts?.desc, fn, opts?.equals, false, opts?.paramKey, undefined);\n const defScope = getCurrentScope();\n const reactiveFn = (...args) => {\n const scope = getCurrentScope(defScope);\n const signal = scope.get(def, args);\n return signal.value;\n };\n fnAndDef = [reactiveFn, def];\n DERIVED_DEFINITION_MAP.set(fn, fnAndDef);\n }\n return fnAndDef;\n}\nexport function reactive(fn, opts) {\n return getReactiveFnAndDefinition(fn, opts)[0];\n}\nexport const reactiveMethod = (owner, fn, opts) => {\n const def = createReactiveDefinition(opts?.id, opts?.desc, fn, opts?.equals, false, opts?.paramKey, undefined);\n const reactiveFn = (...args) => {\n return getScopeOwner(owner).get(def, args).value;\n };\n DERIVED_DEFINITION_MAP.set(reactiveFn, [reactiveFn, def]);\n return reactiveFn;\n};\nexport function relay(activate, opts) {\n const scope = getCurrentScope();\n return createRelay(activate, scope, opts);\n}\nexport const task = (fn, opts) => {\n const scope = getCurrentScope();\n return createTask(fn, scope, opts);\n};\nexport function watcher(fn, opts) {\n const def = createReactiveDefinition(opts?.id, opts?.desc, fn, opts?.equals, false, undefined, opts?.tracer);\n const scope = opts?.isolate ? new SignalScope([]) : getCurrentScope();\n return createReactiveSignal(def, undefined, undefined, scope);\n}\n/**\n * Creates a reactive signal from a compute function. This is useful for when you\n * want to create a signal that does not receive parameters, but is still reactive.\n *\n * @param compute\n * @param opts\n * @returns\n */\nexport const reactiveSignal = (compute, opts) => {\n const def = createReactiveDefinition(opts?.id, opts?.desc, compute, opts?.equals, false, undefined, undefined);\n const scope = opts?.isolate ? new SignalScope([]) : getCurrentScope();\n return createReactiveSignal(def, undefined, undefined, scope);\n};\n","import { isReactivePromise } from '../async.js';\nconst getProto = Object.getPrototypeOf;\nfunction snapshotArray(current, prev, snap) {\n const prevArr = Array.isArray(prev) ? prev : undefined;\n let changed = !prevArr || prevArr.length !== current.length;\n const result = new Array(current.length);\n for (let i = 0; i < current.length; i++) {\n result[i] = snap(current[i], prevArr?.[i]);\n if (!changed && result[i] !== prevArr[i]) {\n changed = true;\n }\n }\n return changed ? result : prevArr;\n}\nfunction snapshotPlainObject(current, prev, snap) {\n const prevObj = prev !== null && prev !== undefined && typeof prev === 'object' && !Array.isArray(prev)\n ? prev\n : undefined;\n const keys = Object.keys(current);\n let changed = !prevObj || Object.keys(prevObj).length !== keys.length;\n const result = {};\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n result[key] = snap(current[key], prevObj?.[key]);\n if (!changed && result[key] !== prevObj[key]) {\n changed = true;\n }\n }\n return changed ? result : prevObj;\n}\nfunction snapshotReactivePromise(current, prev, snap) {\n const prevObj = prev !== null && prev !== undefined && typeof prev === 'object' ? prev : undefined;\n const value = snap(current.value, prevObj?.value);\n const error = current.error;\n const isPending = current.isPending;\n const isRejected = current.isRejected;\n const isResolved = current.isResolved;\n const isReady = current.isReady;\n const isSettled = current.isSettled;\n // `run` is set once in the task constructor and never mutated, so its identity\n // is stable for the lifetime of the underlying ReactivePromiseImpl. Carrying\n // it on the snapshot lets consumers (e.g. React components reading a task via\n // `useReactive`) invoke `result.run(...)` against the live task. For non-task\n // promises this is `undefined`; we still assign the slot so the resulting\n // object's hidden class is stable across task and non-task snapshots.\n const run = current.run;\n if (prevObj &&\n value === prevObj.value &&\n error === prevObj.error &&\n isPending === prevObj.isPending &&\n isRejected === prevObj.isRejected &&\n isResolved === prevObj.isResolved &&\n isReady === prevObj.isReady &&\n isSettled === prevObj.isSettled &&\n run === prevObj.run) {\n return prevObj;\n }\n return { value, error, isPending, isRejected, isResolved, isReady, isSettled, run };\n}\nfunction snapshotMap(current, prev, snap) {\n const prevMap = prev instanceof Map ? prev : undefined;\n let changed = !prevMap || prevMap.size !== current.size;\n const result = new Map();\n for (const [key, val] of current) {\n const snapped = snap(val, prevMap?.get(key));\n result.set(key, snapped);\n if (!changed && snapped !== prevMap.get(key)) {\n changed = true;\n }\n }\n return changed ? result : prevMap;\n}\nfunction snapshotSet(current, prev, _snap) {\n const prevSet = prev instanceof Set ? prev : undefined;\n let changed = !prevSet || prevSet.size !== current.size;\n const result = new Set();\n for (const val of current) {\n const snapped = snapshot(val, prevSet?.has(val) ? val : undefined);\n result.add(snapped);\n if (!changed && !prevSet.has(snapped)) {\n changed = true;\n }\n }\n return changed ? result : prevSet;\n}\n/**\n * Built-in handlers for plain structural types. Matched by exact prototype\n * only — subclasses of `Object` / `Array` / `Map` / `Set` are NOT routed\n * through these handlers (they fall through and, if no custom ancestor is\n * registered, are returned as-is). We use a Map here rather than installing\n * a symbol property on the built-in prototypes, because mutating built-in\n * prototypes (even with a symbol key) changes their hidden class and\n * invalidates V8's fast-path inline caches for every plain object / array\n * in the program.\n */\nconst BUILTIN_PROTO_TO_SNAPSHOT = new Map([\n [Object.prototype, snapshotPlainObject],\n [Array.prototype, snapshotArray],\n [Map.prototype, snapshotMap],\n [Set.prototype, snapshotSet],\n [null, snapshotPlainObject],\n]);\n/**\n * Custom registrations are stored as a non-enumerable symbol property on the\n * class prototype. JS prototype lookup walks the chain natively, so subclass\n * inheritance and override-by-redefinition are free — no resolver, no cache,\n * no invalidation. The symbol is module-private (created with `Symbol()`,\n * not `Symbol.for()`), so it cannot collide with anything else and cannot\n * be addressed by user code.\n */\nconst SNAPSHOT_HANDLER = Symbol('signalium.snapshot.handler');\n/**\n * Register a custom snapshot function for instances of a class.\n * The function receives the current value, the previous snapshot (or undefined),\n * and the recursive `snapshot` function for snapshotting nested values.\n *\n * Subclasses inherit the handler automatically via prototype lookup, so\n * registering once on a base class applies to all descendants. A descendant\n * can override by registering its own handler.\n *\n * Return `prev` when nothing has changed to preserve reference stability.\n *\n * @example\n * ```ts\n * registerCustomSnapshot(MyEntity, (current, prev, snapshot) => {\n * const name = snapshot(current.name, prev?.name);\n * const age = current.age;\n * if (prev && name === prev.name && age === prev.age) return prev;\n * return { name, age };\n * });\n * ```\n */\nexport const registerCustomSnapshot = (ctor, snapshotFn) => {\n // Use defineProperty so the handler is non-enumerable (it shouldn't show up\n // in `Reflect.ownKeys` walks any more than necessary) and so re-registration\n // overwrites cleanly even if a subclass has shadowed it.\n Object.defineProperty(ctor.prototype, SNAPSHOT_HANDLER, {\n value: snapshotFn,\n writable: true,\n configurable: true,\n enumerable: false,\n });\n};\n/**\n * Recursively snapshot a value with structural sharing.\n *\n * - Plain objects and arrays are deep-cloned; unchanged subtrees keep the same reference.\n * - ReactivePromise instances are read (establishing deps) and flattened to a plain object.\n * - Class instances are returned as-is unless a custom handler is registered\n * for the class or any of its ancestors via `registerCustomSnapshot`.\n * - Primitives are returned directly.\n */\nexport function snapshot(currentValue, prevValue) {\n if (currentValue === null || typeof currentValue !== 'object') {\n return currentValue;\n }\n if (isReactivePromise(currentValue)) {\n return snapshotReactivePromise(currentValue, prevValue, snapshot);\n }\n // Custom registrations check first: native prototype lookup walks the chain\n // for us, so subclasses inherit their ancestor's handler with no extra work.\n const customHandler = currentValue[SNAPSHOT_HANDLER];\n if (customHandler !== undefined) {\n return customHandler(currentValue, prevValue, snapshot);\n }\n // Built-in handlers are looked up by exact prototype only.\n const builtIn = BUILTIN_PROTO_TO_SNAPSHOT.get(getProto(currentValue));\n if (builtIn !== undefined) {\n return builtIn(currentValue, prevValue, snapshot);\n }\n return currentValue;\n}\n"],"names":["createReactiveDefinition","getCurrentScope","getScopeOwner","createRelay","createTask","SignalScope","createReactiveSignal","isReactivePromise"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const snapshot = require("./snapshot-DWwH7_9y.js");
4
- const contexts = require("./contexts-CM3QLfV8.js");
3
+ const snapshot = require("./snapshot-I8W4cb8t.js");
4
+ const contexts = require("./contexts-CMvA-Ae9.js");
5
5
  function watchOnce(fn) {
6
6
  const signal = snapshot.watcher(fn);
7
7
  try {
@@ -1,4 +1,4 @@
1
- import { g as getCurrentScope, c as createReactiveSignal, a as generatorResultToPromiseWithConsumer, s as setCurrentConsumer, b as getCurrentConsumer } from "./debug-BTLbgTPK.js";
1
+ import { g as getCurrentScope, c as createReactiveSignal, a as generatorResultToPromiseWithConsumer, s as setCurrentConsumer, b as getCurrentConsumer } from "./debug-DCgp_XPm.js";
2
2
  function isGeneratorFunction(fn) {
3
3
  return typeof fn === "function" && fn.constructor?.name === "GeneratorFunction";
4
4
  }
@@ -31,4 +31,4 @@ export {
31
31
  createServerAsyncComponentWrapper as c,
32
32
  isAsyncFunctionWithoutTransform as i
33
33
  };
34
- //# sourceMappingURL=component-shared-CLSmdnGU.js.map
34
+ //# sourceMappingURL=component-shared-D_i2IMKF.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"component-shared-CLSmdnGU.js","sources":["../../../.tsc-out/react/component-shared.js"],"sourcesContent":["import { getCurrentConsumer, setCurrentConsumer } from '../internals/consumer.js';\nimport { getCurrentScope } from '../internals/contexts.js';\nimport { createReactiveSignal } from '../internals/reactive.js';\nimport { generatorResultToPromiseWithConsumer } from '../internals/generators.js';\nexport function isGeneratorFunction(fn) {\n return (typeof fn === 'function' && fn.constructor?.name === 'GeneratorFunction');\n}\nexport function isAsyncFunctionWithoutTransform(fn) {\n return typeof fn === 'function' && fn.constructor?.name === 'AsyncFunction';\n}\n/**\n * Wrap a Babel-transformed async generator in a real `async function` that drives it\n * with {@link generatorResultToPromiseWithConsumer}. Used on the server (RSC + SSR)\n * where hooks-based Suspense replay is not appropriate.\n */\nexport function createServerAsyncComponentWrapper(fn) {\n return async function (props) {\n const scope = getCurrentScope();\n const owned = createReactiveSignal({ compute: () => null, equals: () => true, isRelay: false, tracer: undefined }, [], undefined, scope);\n return generatorResultToPromiseWithConsumer(fn(props), owned);\n };\n}\n/**\n * Wrap a sync render function with consumer/scope tracking. Used by the server\n * `component()` for non-generator definitions.\n */\nexport function createServerSyncComponentWrapper(fn) {\n return function (props) {\n const scope = getCurrentScope();\n const owned = createReactiveSignal({ compute: () => null, equals: () => true, isRelay: false, tracer: undefined }, [], undefined, scope);\n const prevConsumer = getCurrentConsumer();\n try {\n setCurrentConsumer(owned);\n return fn(props);\n }\n finally {\n setCurrentConsumer(prevConsumer);\n }\n };\n}\n"],"names":[],"mappings":";AAIO,SAAS,oBAAoB,IAAI;AACpC,SAAQ,OAAO,OAAO,cAAc,GAAG,aAAa,SAAS;AACjE;AACO,SAAS,gCAAgC,IAAI;AAChD,SAAO,OAAO,OAAO,cAAc,GAAG,aAAa,SAAS;AAChE;AAMO,SAAS,kCAAkC,IAAI;AAClD,SAAO,eAAgB,OAAO;AAC1B,UAAM,QAAQ,gBAAe;AAC7B,UAAM,QAAQ,qBAAqB,EAAE,SAAS,MAAM,MAAM,QAAQ,MAAM,MAAM,SAAS,OAAO,QAAQ,OAAS,GAAI,CAAA,GAAI,QAAW,KAAK;AACvI,WAAO,qCAAqC,GAAG,KAAK,GAAG,KAAK;AAAA,EAChE;AACJ;AAKO,SAAS,iCAAiC,IAAI;AACjD,SAAO,SAAU,OAAO;AACpB,UAAM,QAAQ,gBAAe;AAC7B,UAAM,QAAQ,qBAAqB,EAAE,SAAS,MAAM,MAAM,QAAQ,MAAM,MAAM,SAAS,OAAO,QAAQ,OAAS,GAAI,CAAA,GAAI,QAAW,KAAK;AACvI,UAAM,eAAe,mBAAkB;AACvC,QAAI;AACA,yBAAmB,KAAK;AACxB,aAAO,GAAG,KAAK;AAAA,IACnB,UACR;AACY,yBAAmB,YAAY;AAAA,IACnC;AAAA,EACJ;AACJ;"}
1
+ {"version":3,"file":"component-shared-D_i2IMKF.js","sources":["../../../.tsc-out/react/component-shared.js"],"sourcesContent":["import { getCurrentConsumer, setCurrentConsumer } from '../internals/consumer.js';\nimport { getCurrentScope } from '../internals/contexts.js';\nimport { createReactiveSignal } from '../internals/reactive.js';\nimport { generatorResultToPromiseWithConsumer } from '../internals/generators.js';\nexport function isGeneratorFunction(fn) {\n return (typeof fn === 'function' && fn.constructor?.name === 'GeneratorFunction');\n}\nexport function isAsyncFunctionWithoutTransform(fn) {\n return typeof fn === 'function' && fn.constructor?.name === 'AsyncFunction';\n}\n/**\n * Wrap a Babel-transformed async generator in a real `async function` that drives it\n * with {@link generatorResultToPromiseWithConsumer}. Used on the server (RSC + SSR)\n * where hooks-based Suspense replay is not appropriate.\n */\nexport function createServerAsyncComponentWrapper(fn) {\n return async function (props) {\n const scope = getCurrentScope();\n const owned = createReactiveSignal({ compute: () => null, equals: () => true, isRelay: false, tracer: undefined }, [], undefined, scope);\n return generatorResultToPromiseWithConsumer(fn(props), owned);\n };\n}\n/**\n * Wrap a sync render function with consumer/scope tracking. Used by the server\n * `component()` for non-generator definitions.\n */\nexport function createServerSyncComponentWrapper(fn) {\n return function (props) {\n const scope = getCurrentScope();\n const owned = createReactiveSignal({ compute: () => null, equals: () => true, isRelay: false, tracer: undefined }, [], undefined, scope);\n const prevConsumer = getCurrentConsumer();\n try {\n setCurrentConsumer(owned);\n return fn(props);\n }\n finally {\n setCurrentConsumer(prevConsumer);\n }\n };\n}\n"],"names":[],"mappings":";AAIO,SAAS,oBAAoB,IAAI;AACpC,SAAQ,OAAO,OAAO,cAAc,GAAG,aAAa,SAAS;AACjE;AACO,SAAS,gCAAgC,IAAI;AAChD,SAAO,OAAO,OAAO,cAAc,GAAG,aAAa,SAAS;AAChE;AAMO,SAAS,kCAAkC,IAAI;AAClD,SAAO,eAAgB,OAAO;AAC1B,UAAM,QAAQ,gBAAe;AAC7B,UAAM,QAAQ,qBAAqB,EAAE,SAAS,MAAM,MAAM,QAAQ,MAAM,MAAM,SAAS,OAAO,QAAQ,OAAS,GAAI,CAAA,GAAI,QAAW,KAAK;AACvI,WAAO,qCAAqC,GAAG,KAAK,GAAG,KAAK;AAAA,EAChE;AACJ;AAKO,SAAS,iCAAiC,IAAI;AACjD,SAAO,SAAU,OAAO;AACpB,UAAM,QAAQ,gBAAe;AAC7B,UAAM,QAAQ,qBAAqB,EAAE,SAAS,MAAM,MAAM,QAAQ,MAAM,MAAM,SAAS,OAAO,QAAQ,OAAS,GAAI,CAAA,GAAI,QAAW,KAAK;AACvI,UAAM,eAAe,mBAAkB;AACvC,QAAI;AACA,yBAAmB,KAAK;AACxB,aAAO,GAAG,KAAK;AAAA,IACnB,UACR;AACY,yBAAmB,YAAY;AAAA,IACnC;AAAA,EACJ;AACJ;"}
@@ -427,12 +427,12 @@ function watchSignal(signal2) {
427
427
  }
428
428
  activateSignal(signal2);
429
429
  }
430
- function unwatchSignal(signal2) {
430
+ function unwatchSignal(signal2, options = {}) {
431
431
  const { watchCount } = signal2;
432
432
  const newWatchCount = Math.max(watchCount - 1, 0);
433
433
  signal2.watchCount = newWatchCount;
434
434
  if (newWatchCount === 0) {
435
- scheduleDeactivate(signal2);
435
+ scheduleDeactivate(signal2, options);
436
436
  }
437
437
  }
438
438
  function activateSignal(signal2) {
@@ -442,22 +442,22 @@ function activateSignal(signal2) {
442
442
  checkSignal(signal2);
443
443
  }
444
444
  }
445
- function deactivateSignal(signal2) {
445
+ function deactivateSignal(signal2, options = {}) {
446
446
  signal2._isActive = false;
447
447
  for (const dep of signal2.deps.keys()) {
448
448
  const newWatchCount = Math.max(dep.watchCount - 1, 0);
449
449
  dep.watchCount = newWatchCount;
450
450
  if (newWatchCount === 0) {
451
- deactivateSignal(dep);
451
+ deactivateSignal(dep, options);
452
452
  }
453
453
  }
454
454
  if (isRelay(signal2)) {
455
- signal2._value?.();
455
+ signal2._value?.(options);
456
456
  }
457
457
  }
458
458
  let PENDING_PULLS = /* @__PURE__ */ new Set();
459
459
  let PENDING_ASYNC_PULLS = [];
460
- let PENDING_DEACTIVE = /* @__PURE__ */ new Set();
460
+ let PENDING_DEACTIVE = /* @__PURE__ */ new Map();
461
461
  let PENDING_LISTENERS = [];
462
462
  let PENDING_TRACERS = [];
463
463
  const microtask = () => Promise.resolve();
@@ -481,8 +481,9 @@ const scheduleAsyncPull = (signal2) => {
481
481
  PENDING_ASYNC_PULLS.push(signal2);
482
482
  scheduleFlush();
483
483
  };
484
- const scheduleDeactivate = (signal2) => {
485
- PENDING_DEACTIVE.add(signal2);
484
+ const scheduleDeactivate = (signal2, options = {}) => {
485
+ const existing = PENDING_DEACTIVE.get(signal2);
486
+ PENDING_DEACTIVE.set(signal2, existing === void 0 ? options : { isPausing: Boolean(existing.isPausing && options.isPausing) });
486
487
  scheduleFlush();
487
488
  };
488
489
  const cancelDeactivate = (signal2) => {
@@ -517,8 +518,8 @@ const flushWatchers = async () => {
517
518
  }
518
519
  currentFlush = null;
519
520
  runBatch(() => {
520
- for (const signal2 of PENDING_DEACTIVE) {
521
- deactivateSignal(signal2);
521
+ for (const [signal2, options] of PENDING_DEACTIVE) {
522
+ deactivateSignal(signal2, options);
522
523
  }
523
524
  PENDING_DEACTIVE.clear();
524
525
  for (const signal2 of PENDING_LISTENERS) {
@@ -1298,11 +1299,11 @@ function createRelay(activate, scope, opts) {
1298
1299
  const p = new ReactivePromiseImpl();
1299
1300
  let active = false;
1300
1301
  let currentSub;
1301
- const unsubscribe = () => {
1302
+ const unsubscribe = (options) => {
1302
1303
  if (typeof currentSub === "function") {
1303
1304
  currentSub();
1304
1305
  } else if (currentSub !== void 0) {
1305
- currentSub.deactivate?.();
1306
+ currentSub.deactivate?.(options);
1306
1307
  }
1307
1308
  const signal2 = p["_signal"];
1308
1309
  signal2.subs = /* @__PURE__ */ new Map();
@@ -2169,4 +2170,4 @@ export {
2169
2170
  isSignal as y,
2170
2171
  callback as z
2171
2172
  };
2172
- //# sourceMappingURL=debug-BTLbgTPK.js.map
2173
+ //# sourceMappingURL=debug-DCgp_XPm.js.map