54 lines
		
	
	
		
			872 B
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			54 lines
		
	
	
		
			872 B
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | 'use strict'; | ||
|  | 
 | ||
|  | var isExtendable = require('is-extendable'); | ||
|  | var forIn = require('for-in'); | ||
|  | 
 | ||
|  | function mixinDeep(target, objects) { | ||
|  |   var len = arguments.length, i = 0; | ||
|  |   while (++i < len) { | ||
|  |     var obj = arguments[i]; | ||
|  |     if (isObject(obj)) { | ||
|  |       forIn(obj, copy, target); | ||
|  |     } | ||
|  |   } | ||
|  |   return target; | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  |  * Copy properties from the source object to the | ||
|  |  * target object. | ||
|  |  * | ||
|  |  * @param  {*} `val` | ||
|  |  * @param  {String} `key` | ||
|  |  */ | ||
|  | 
 | ||
|  | function copy(val, key) { | ||
|  |   if (key === '__proto__') { | ||
|  |     return; | ||
|  |   } | ||
|  | 
 | ||
|  |   var obj = this[key]; | ||
|  |   if (isObject(val) && isObject(obj)) { | ||
|  |     mixinDeep(obj, val); | ||
|  |   } else { | ||
|  |     this[key] = val; | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  |  * Returns true if `val` is an object or function. | ||
|  |  * | ||
|  |  * @param  {any} val | ||
|  |  * @return {Boolean} | ||
|  |  */ | ||
|  | 
 | ||
|  | function isObject(val) { | ||
|  |   return isExtendable(val) && !Array.isArray(val); | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  |  * Expose `mixinDeep` | ||
|  |  */ | ||
|  | 
 | ||
|  | module.exports = mixinDeep; |