@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
30 lines (29 loc) • 893 B
JavaScript
import { l as persistSource } from "../persist-core-B5VikEft.mjs";
import { snapshot, subscribe } from "valtio/vanilla";
//#region src/adapters/sources/valtio.ts
/**
* Persist a valtio proxy. `snapshot` for reads, `Object.assign` for writes,
* `subscribe` for change tracking.
*
* @example
* ```ts
* import { proxy } from "valtio";
* import { persistProxy } from "@stainless-code/persist/sources/valtio";
* const state = proxy({ count: 0 });
* const persist = persistProxy(state, { name: "count" });
* ```
*/
function persistProxy(proxyObject, options) {
return persistSource({
getState: () => snapshot(proxyObject),
setState: (updater) => {
const next = updater(snapshot(proxyObject));
Object.assign(proxyObject, next);
},
subscribe: (listener) => {
return { unsubscribe: subscribe(proxyObject, () => listener()) };
}
}, options);
}
//#endregion
export { persistProxy };