mol-proto
Advanced tools
Comparing version 0.1.12 to 0.1.13
{ | ||
"name": "proto", | ||
"version": "0.1.12", | ||
"version": "0.1.13", | ||
"homepage": "https://github.com/milojs/proto", | ||
@@ -5,0 +5,0 @@ "authors": [ |
@@ -247,10 +247,11 @@ 'use strict'; | ||
* @param {Boolean} onlyEnumerable Optional `true` to use only enumerable properties | ||
* @param {Boolean} preserveStructure if true will throw at the attempt to overwrite object with scalar value (including Date and Regex) and vice versa | ||
* @return {Object} | ||
*/ | ||
function deepExtend(obj, onlyEnumerable) { | ||
return _extendTree(this, obj, onlyEnumerable, []); | ||
function deepExtend(obj, onlyEnumerable, preserveStructure) { | ||
return _extendTree(this, obj, onlyEnumerable, preserveStructure, []); | ||
} | ||
function _extendTree(selfNode, objNode, onlyEnumerable, objTraversed) { | ||
function _extendTree(selfNode, objNode, onlyEnumerable, preserveStructure, objTraversed) { | ||
if (objTraversed.indexOf(objNode) >= 0) return; // node already traversed, obj has recursion | ||
@@ -264,11 +265,18 @@ | ||
loop.call(objNode, function(value, prop) { | ||
var descriptor = Object.getOwnPropertyDescriptor(objNode, prop); | ||
if (typeof value == 'object' && value != null | ||
&& ! (value instanceof RegExp) && ! (value instanceof Date)) { | ||
if (! (selfNode.hasOwnProperty(prop) | ||
&& typeof selfNode[prop] == 'object' && selfNode[prop] != null)) | ||
var hasProp = selfNode.hasOwnProperty(prop) | ||
, isSelfObj = isNormalObject(selfNode[prop]) | ||
, isValueObj = isNormalObject(value); | ||
if (preserveStructure && hasProp && isSelfObj != isValueObj) | ||
throw new Error('deepExtend'); | ||
if (isValueObj) { | ||
if (!hasProp || !isSelfObj) | ||
selfNode[prop] = (Array.isArray(value)) ? [] : {}; | ||
_extendTree(selfNode[prop], value, onlyEnumerable, objTraversed); | ||
} else | ||
_extendTree(selfNode[prop], value, onlyEnumerable, preserveStructure, objTraversed); | ||
} else { | ||
var descriptor = Object.getOwnPropertyDescriptor(objNode, prop); | ||
Object.defineProperty(selfNode, prop, descriptor); | ||
} | ||
}, this, onlyEnumerable); | ||
@@ -280,2 +288,8 @@ | ||
function isNormalObject(value) { | ||
return typeof value == 'object' && value != null | ||
&& !(value instanceof RegExp) && !(value instanceof Date) | ||
} | ||
/** | ||
@@ -282,0 +296,0 @@ * Clones all object tree. Class of original object is not preserved. Returns `self` |
{ | ||
"name": "mol-proto", | ||
"version": "0.1.12", | ||
"version": "0.1.13", | ||
"description": "ES5 object manipulation library for node and modern browsers", | ||
@@ -5,0 +5,0 @@ "main": "lib/proto.js", |
@@ -185,2 +185,45 @@ 'use strict'; | ||
it('should allow deepExtend with preserving structure', function() { | ||
var obj = { | ||
attr: { | ||
bind: 'ml-bind', | ||
load: 'ml-load' | ||
} | ||
}; | ||
assert.doesNotThrow(function() { | ||
_.deepExtend(obj, { | ||
attr: { | ||
load: 'cc-load', | ||
ctrl: 'cc-ctrl' | ||
} | ||
}, false, true); | ||
}); | ||
obj = { | ||
wasScalar: 'overwrite' | ||
}; | ||
assert.throws(function() { | ||
_.deepExtend(obj, { | ||
wasScalar: { | ||
inside: 'overwritten scalar' | ||
} | ||
}, false, true); | ||
}); | ||
obj = { | ||
wasObject: { | ||
inside: 'overwrite too' | ||
} | ||
}; | ||
assert.throws(function() { | ||
_.deepExtend(obj, { | ||
wasObject: 'overwritten object' | ||
}, false, true); | ||
}); | ||
}); | ||
it('should define deepClone function', function() { | ||
@@ -187,0 +230,0 @@ var cloned = _.deepClone({ a: 1, b: { c: 2, d: { e: 3 } } }); |
197350
4919