UNPKG

diffable-objects

Version:

A package for dynamic state tracking for Cloudflare's Durable Objects using SQLite

34 lines (33 loc) 1.08 kB
import { atomizeChangeset, diff } from "json-diff-ts"; export function recursivelyObservable(data, opts) { const processUpdate = opts.processUpdate ?? ((applyChanges) => { const old = structuredClone(data); applyChanges(); const diffs = diff(old, data); const atomicChanges = atomizeChangeset(diffs); if (atomicChanges.length > 0) { opts.onUpdate(atomicChanges, data); } }); const proxyOpts = { get(target, p) { const property = target[p]; if (property !== null && typeof property === "object") { // @ts-ignore TODO return recursivelyObservable(property, { ...opts, processUpdate, }); } return target[p]; }, set(target, p, newValue) { processUpdate(() => { target[p] = newValue; }); return true; }, }; return new Proxy(data, proxyOpts); }