UNPKG

@dualjack/svelte-tools

Version:

### Why? Because runes are not safe to toss around by design.

38 lines (37 loc) 1.14 kB
import { get } from "svelte/store"; import { untrack } from "svelte"; import { cloneDeep, isEqual } from "lodash-es"; function isWritable(store) { return typeof store.set === 'function'; } export function fromStoreTwoWayBinding(store) { let value = $state(cloneDeep(get(store))); let oldValue = cloneDeep(value); // Save deep copy of initial value. store.subscribe((v) => { if (!isEqual(v, oldValue)) { oldValue = cloneDeep(v); value = v; } }); $effect.root(() => { $effect.pre(() => { const newValue = cloneDeep(value); // Track it everytime it changes but capture the result. Do not use the Proxy. untrack(() => { if (!isEqual(newValue, oldValue)) { oldValue = cloneDeep(newValue); if (isWritable(store)) { store.set(cloneDeep(newValue)); } } }); }); }); return { get current() { return value; }, set current(v) { value = v; } }; }