UNPKG

@dhmk/atom

Version:

Lightweight mobx-like observable values, computed values and side-effects

69 lines (68 loc) 1.96 kB
import { ValueAtom } from "../atoms/value"; var ID_ATOM = Symbol(); var makeMutable = function (name) { return function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } var self = this; self[name].apply(self, args); self[ID_ATOM].set({}); }; }; var makePure = function (name) { return function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } var self = this; self[ID_ATOM].get(); return self[name].apply(self, args); }; }; // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array#copying_methods_and_mutating_methods var mutableMethods = [ "copyWithin", "fill", "pop", "push", "reverse", "shift", "sort", "splice", "unshift", ]; var patchedMethods = Object.create(null); for (var _i = 0, _a = Object.getOwnPropertyNames(Array.prototype); _i < _a.length; _i++) { var k = _a[_i]; var v = Array.prototype[k]; if (typeof v === "function") { patchedMethods[k] = mutableMethods.includes(k) ? makeMutable(k) : makePure(k); } } export default function observableArray(x) { var idAtom = new ValueAtom({}); x[ID_ATOM] = idAtom; return new Proxy(x, { get: function (t, p) { if (patchedMethods[p]) return patchedMethods[p].bind(x); if (p === "length" || !isNaN(p)) idAtom.get(); return t[p]; }, set: function (t, p, v) { if (p === "length" || !isNaN(p)) { var prev = t[p]; if (prev !== v) idAtom.set({}); } t[p] = v; return true; }, }); }