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.
		
		
		
		
		
			
		
			
				
					
					
						
							64 lines
						
					
					
						
							1.1 KiB
						
					
					
				
			
		
		
	
	
							64 lines
						
					
					
						
							1.1 KiB
						
					
					
				'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 (!isValidKey(key)) { | 
						|
    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); | 
						|
} | 
						|
 | 
						|
/** | 
						|
 * Returns true if `key` is a valid key to use when extending objects. | 
						|
 * | 
						|
 * @param  {String} `key` | 
						|
 * @return {Boolean} | 
						|
 */ | 
						|
 | 
						|
function isValidKey(key) { | 
						|
  return key !== '__proto__' && key !== 'constructor' && key !== 'prototype'; | 
						|
}; | 
						|
 | 
						|
/** | 
						|
 * Expose `mixinDeep` | 
						|
 */ | 
						|
 | 
						|
module.exports = mixinDeep;
 | 
						|
 |