UNPKG

nests

Version:

Fast and easy state storage with a lot of control.

65 lines (64 loc) 2.53 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const EventEmitter_1 = __importDefault(require("./EventEmitter")); 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_1.default(); 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); } exports.default = make;