You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							49 lines
						
					
					
						
							1023 B
						
					
					
				
			
		
		
	
	
							49 lines
						
					
					
						
							1023 B
						
					
					
				'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;
 | 
						|
 |