function isFreezable(object) { if (object === null) return false; return Array.isArray(object) || typeof object === 'object'; } function needsFreezing(object) { return isFreezable(object) && !Object.isFrozen(object); } function recur(object) { Object.freeze(object); Object.keys(object).forEach((key) => { const value = object[key]; if (needsFreezing(value)) { recur(value); } }); return object; } /** * Deeply freeze a plain javascript object. * * If `process.env.NODE_ENV === 'production'`, this returns the original object * witout freezing. * * @function * @sig a -> a * @param {object} object Object to freeze. * @return {object} Frozen object, unless in production, then the same object. */ function freeze(object) { if (process.env.NODE_ENV === 'production') { return object; } if (needsFreezing(object)) { recur(object); } return object; } export default freeze;