UNPKG

nests

Version:

Fast and easy state storage with a lot of control.

59 lines (58 loc) 2.26 kB
import EventEmitter from "./EventEmitter"; export default function make( // This can be safely ignored, the Data will always be an object or it won't work anyway. // @ts-ignore data = {}, { nestArrays = true, } = {}) { const emitter = new EventEmitter(); function createProxy(target, root, path) { return new Proxy(target, { get(target, property) { const newPath = [...path, property]; const value = target[property]; if (value !== undefined && value !== null) { emitter.get({ path: newPath, value, }); if (!nestArrays && Array.isArray(value)) { return value; } if (typeof value === "object") { return createProxy(value, root, newPath); } return value; } return createProxy((target[property] = {}), root, newPath); }, set(target, property, value) { target[property] = value; emitter.set({ path: [...path, property], value, }); // This needs to return true or it errors. /shrug return true; }, deleteProperty(target, property) { if (delete target[property]) { emitter.delete({ path: [...path, property], }); return true; } return false; }, has(target, property) { if (typeof target[property] === "object" && Object.keys(target[property]).length === 0) { return false; } return property in target; }, }); } return Object.assign({ store: createProxy(data, data, []), // This can be safely ignored, the Data will always be an object or it won't work anyway. // @ts-ignore ghost: data }, emitter); }