diff options
Diffstat (limited to 'node_modules/clone-deep/index.js')
-rw-r--r-- | node_modules/clone-deep/index.js | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/node_modules/clone-deep/index.js b/node_modules/clone-deep/index.js new file mode 100644 index 0000000..6c66e4e --- /dev/null +++ b/node_modules/clone-deep/index.js @@ -0,0 +1,54 @@ +'use strict'; + +/** + * Module dependenices + */ + +var isObject = require('is-plain-object'); +var clone = require('shallow-clone'); +var typeOf = require('kind-of'); +var forOwn = require('for-own'); + +/** + * Recursively clone native types. + */ + +function cloneDeep(val, instanceClone) { + switch (typeOf(val)) { + case 'object': + return cloneObjectDeep(val, instanceClone); + case 'array': + return cloneArrayDeep(val, instanceClone); + default: { + return clone(val); + } + } +} + +function cloneObjectDeep(obj, instanceClone) { + if (isObject(obj) || (instanceClone === true && typeOf(obj) === 'object')) { + var res = {}; + forOwn(obj, function(val, key) { + this[key] = cloneDeep(val, instanceClone); + }, res); + return res; + } + if (typeof instanceClone === 'function') { + return instanceClone(obj); + } + return obj; +} + +function cloneArrayDeep(arr, instanceClone) { + var res = []; + for (var i = 0; i < arr.length; i++) { + res[i] = cloneDeep(arr[i], instanceClone); + } + return res; +} + +/** + * Expose `cloneDeep` + */ + +module.exports = cloneDeep; |