jotai
Version:
👻 Primitive and flexible state management for React
44 lines (43 loc) • 1.32 kB
JavaScript
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)));
}