nests
Version:
Fast and easy state storage with a lot of control.
59 lines (58 loc) • 2.26 kB
JavaScript
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);
}