// eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore import { effect } from './internal/helpers/index.js'; import { dequal } from 'dequal'; /** * Typed Object.keys * * @export * @template {Record} T * @param {T} obj * @returns {(keyof T)[]} */ function keys(obj) { return Object.keys(obj); } export function createSync(stores) { let setters = {}; keys(stores).forEach((key) => { const store = stores[key]; effect(store, (value) => { if (key in setters) { // eslint-disable-next-line @typescript-eslint/no-explicit-any setters[key]?.(value); } }); }); return keys(stores).reduce((acc, key) => { return { ...acc, [key]: function sync(value, setter) { stores[key].update((p) => { if (dequal(p, value)) return p; return value; }); if (setter) { setters = { ...setters, [key]: setter }; } }, }; }, {}); }