UNPKG

@stainless-code/persist

Version:

Hydration-aware persistence for any reactive store — zero-dep persistSource core; codecs, backends, cross-tab transport, source + framework hydration adapters ship as opt-in recipes

31 lines (30 loc) • 991 B
import { createSubscriber } from "svelte/reactivity"; //#region src/adapters/frameworks/svelte.ts const alwaysTrue = { get current() { return true; } }; /** * Mount a `HydrationSignal` into Svelte 5 reactivity (`createSubscriber`). * Read `current` inside a reactive context (`$derived`/`$effect`/`{#if}`) to * track the gate. Null/undefined signal → `current` is always `true`; the * subscription is owned by the reactive context (cleaned up on dispose). * Renders `true` on the server (no-op `PersistApi`). * * Svelte 4 (pre-runes): `./frameworks/svelte-store` (`hydratedStore`). * * @example * ```ts * const hydrated = hydratedRune(prefsHydration); * // {#if !hydrated.current}<Skeleton />{:else}<Prefs />{/if} * ``` */ function hydratedRune(signal) { if (!signal) return alwaysTrue; const subscribe = createSubscriber((update) => signal.subscribeHydrated(update)); return { get current() { subscribe(); return signal.isHydrated(); } }; } //#endregion export { hydratedRune };