'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;