@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
JavaScript
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 };