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.
		
		
		
		
		
			
		
			
				
					50 lines
				
				1023 B
			
		
		
			
		
	
	
					50 lines
				
				1023 B
			| 
								 
											3 years ago
										 
									 | 
							
								'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;
							 |