UNPKG

jotai

Version:

👻 Primitive and flexible state management for React

44 lines (43 loc) • 1.32 kB
const frozenAtoms = new WeakSet(); const deepFreeze = (value) => { if (typeof value !== 'object' || value === null) { return value; } Object.freeze(value); const propNames = Object.getOwnPropertyNames(value); for (const name of propNames) { deepFreeze(value[name]); } return value; }; export function freezeAtom(anAtom) { if (frozenAtoms.has(anAtom)) { return anAtom; } frozenAtoms.add(anAtom); const origRead = anAtom.read; anAtom.read = function (get, options) { return deepFreeze(origRead.call(this, get, options)); }; if ('write' in anAtom) { const origWrite = anAtom.write; anAtom.write = function (get, set, ...args) { return origWrite.call(this, get, (...setArgs) => { if (setArgs[0] === anAtom) { setArgs[1] = deepFreeze(setArgs[1]); } return set(...setArgs); }, ...args); }; } return anAtom; } /** * @deprecated Define it on users end */ export function freezeAtomCreator(createAtom) { if (process.env.NODE_ENV !== 'production') { console.warn('[DEPRECATED] freezeAtomCreator is deprecated, define it on users end'); } return ((...args) => freezeAtom(createAtom(...args))); }