UNPKG

simple-deep-freeze

Version:

[![NPM version](https://badge.fury.io/js/simple-deep-freeze.svg)](http://badge.fury.io/js/simple-deep-freeze) [![peerDependencies Status](https://david-dm.org/remix/simple-deep-freeze/peer-status.svg)](https://david-dm.org/remix/simple-deep-freeze?type=pe

36 lines (30 loc) 1.2 kB
'use strict'; module.exports = function simpleDeepFreeze(object) { // No freezing in production (for better performance). try { if (process.env.NODE_ENV === 'production') { return object; } } catch (e) {} // When already frozen, we assume its children are frozen (for better performance). // This should be true if you always use `simpleDeepFreeze` to freeze objects, // which is why you should have a linter rule that prevents you from using // `Object.freeze` standalone. // // Note that Object.isFrozen will also return `true` for primitives (numbers, // strings, booleans, undefined, null), so there is no need to check for // those explicitly. if (Object.isFrozen(object)) { return object; } if (!Array.isArray(object) && Object.getPrototypeOf(object) !== Object.getPrototypeOf({})) { throw new Error('simpleDeepFreeze only supports plain objects, arrays, and primitives'); } // At this point we know that we're dealing with either an array or plain object, so // just freeze it and recurse on its values. Object.freeze(object); Object.keys(object).forEach(function(key) { simpleDeepFreeze(object[key]); }); return object; };