@dualjack/svelte-tools
Version:
### Why? Because runes are not safe to toss around by design.
38 lines (37 loc) • 1.14 kB
JavaScript
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;
}
};
}