├── .gitignore ├── .travis.yml ├── LICENSE ├── example └── deep.js ├── index.js ├── package.json ├── readme.markdown └── test ├── deep.js ├── dict.js └── strict.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - 0.6 4 | - 0.8 5 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | This software is released to the public domain. 2 | 3 | It is based in part on the deepFreeze function from: 4 | https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/freeze 5 | 6 | https://developer.mozilla.org/en-US/docs/Project:Copyrights 7 | -------------------------------------------------------------------------------- /example/deep.js: -------------------------------------------------------------------------------- 1 | var deepFreeze = require('../'); 2 | 3 | deepFreeze(Buffer); 4 | Buffer.x = 5; 5 | console.log(Buffer.x === undefined); 6 | 7 | Buffer.prototype.z = 3; 8 | console.log(Buffer.prototype.z === undefined); 9 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | module.exports = function deepFreeze (o) { 2 | Object.freeze(o); 3 | 4 | var oIsFunction = typeof o === "function"; 5 | var hasOwnProp = Object.prototype.hasOwnProperty; 6 | 7 | Object.getOwnPropertyNames(o).forEach(function (prop) { 8 | if (hasOwnProp.call(o, prop) 9 | && (oIsFunction ? prop !== 'caller' && prop !== 'callee' && prop !== 'arguments' : true ) 10 | && o[prop] !== null 11 | && (typeof o[prop] === "object" || typeof o[prop] === "function") 12 | && !Object.isFrozen(o[prop])) { 13 | deepFreeze(o[prop]); 14 | } 15 | }); 16 | 17 | return o; 18 | }; 19 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "deep-freeze-strict", 3 | "version": "1.1.1", 4 | "description": "recursively Object.freeze() objects and functions, works in strict mode", 5 | "main": "index.js", 6 | "directories": { 7 | "example": "example", 8 | "test": "test" 9 | }, 10 | "devDependencies": { 11 | "tap": "~0.3.0" 12 | }, 13 | "scripts": { 14 | "test": "tap test/*.js" 15 | }, 16 | "repository": { 17 | "type": "git", 18 | "url": "git://github.com/jsdf/deep-freeze.git" 19 | }, 20 | "homepage": "https://github.com/jsdf/deep-freeze", 21 | "keywords": [ 22 | "freeze", 23 | "deep", 24 | "object", 25 | "recursive", 26 | "strict-mode" 27 | ], 28 | "author": { 29 | "name": "James Friend", 30 | "email": "james@jsdf.co", 31 | "url": "http://jsdf.co" 32 | }, 33 | "license": "public domain" 34 | } 35 | -------------------------------------------------------------------------------- /readme.markdown: -------------------------------------------------------------------------------- 1 | # deep-freeze-strict 2 | 3 | recursively `Object.freeze()` objects. 4 | 5 | this fork works in strict mode, so when 6 | freezing a function you don't get the error: 7 | ``` 8 | > (function(){ "use strict"; deepFreeze(function(){}); })(); 9 | 10 | TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them 11 | ``` 12 | 13 | # example 14 | 15 | ``` js 16 | var deepFreeze = require('deep-freeze-strict'); 17 | 18 | deepFreeze(Buffer); 19 | Buffer.x = 5; 20 | console.log(Buffer.x === undefined); 21 | 22 | Buffer.prototype.z = 3; 23 | console.log(Buffer.prototype.z === undefined); 24 | ``` 25 | 26 | *** 27 | 28 | ``` 29 | $ node example/deep.js 30 | true 31 | true 32 | ``` 33 | 34 | # methods 35 | 36 | ``` js 37 | var deepFreeze = require('deep-freeze-strict') 38 | ``` 39 | 40 | ## deepFreeze(obj) 41 | 42 | Call `Object.freeze(obj)` recursively on all unfrozen properties of `obj` that 43 | are functions or objects. 44 | 45 | # license 46 | 47 | public domain 48 | 49 | Based in part on the code snippet from 50 | [the MDN wiki page on Object.freeze()](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/freeze), 51 | which 52 | [is released to the public domain](https://developer.mozilla.org/en-US/docs/Project:Copyrights). 53 | -------------------------------------------------------------------------------- /test/deep.js: -------------------------------------------------------------------------------- 1 | var test = require('tap').test; 2 | var deepFreeze = require('../'); 3 | 4 | test('deep freeze', function (t) { 5 | t.plan(2); 6 | 7 | deepFreeze(Buffer); 8 | Buffer.x = 5; 9 | t.equal(Buffer.x, undefined); 10 | 11 | Buffer.prototype.z = 3; 12 | t.equal(Buffer.prototype.z, undefined); 13 | }); 14 | -------------------------------------------------------------------------------- /test/dict.js: -------------------------------------------------------------------------------- 1 | var test = require('tap').test; 2 | var deepFreeze = require('../'); 3 | 4 | test('deep freeze', function (t) { 5 | "use strict"; 6 | 7 | t.plan(3); 8 | 9 | var a = Object.create(null); 10 | a.x = 1; 11 | 12 | deepFreeze(a); 13 | var msg; 14 | try { 15 | a.x = 2; 16 | } catch (e) { 17 | msg = e.message; 18 | } 19 | t.ok(msg); 20 | t.ok(/^cannot assign to read only property/i.test(msg)); 21 | t.equals(a.x, 1); 22 | }); 23 | -------------------------------------------------------------------------------- /test/strict.js: -------------------------------------------------------------------------------- 1 | var test = require('tap').test; 2 | var deepFreeze = require('../'); 3 | 4 | test('deep freeze', function (t) { 5 | "use strict"; 6 | 7 | t.plan(2); 8 | 9 | var a = { 10 | // a function 11 | b: function() {}, 12 | }; 13 | 14 | deepFreeze(a); 15 | try { 16 | a.x = 5; 17 | } catch (e) { 18 | t.ok('error thrown as expected'); 19 | } 20 | t.equal(a.x, undefined); 21 | }); --------------------------------------------------------------------------------