| 'use strict'; |
| |
| /** |
| * Module dependenices |
| */ |
| |
| const clone = require('shallow-clone'); |
| const typeOf = require('kind-of'); |
| const isPlainObject = require('is-plain-object'); |
| |
| 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(val, instanceClone) { |
| if (typeof instanceClone === 'function') { |
| return instanceClone(val); |
| } |
| if (instanceClone || isPlainObject(val)) { |
| const res = new val.constructor(); |
| for (let key in val) { |
| res[key] = cloneDeep(val[key], instanceClone); |
| } |
| return res; |
| } |
| return val; |
| } |
| |
| function cloneArrayDeep(val, instanceClone) { |
| const res = new val.constructor(val.length); |
| for (let i = 0; i < val.length; i++) { |
| res[i] = cloneDeep(val[i], instanceClone); |
| } |
| return res; |
| } |
| |
| /** |
| * Expose `cloneDeep` |
| */ |
| |
| module.exports = cloneDeep; |