65 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			65 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			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 (!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;
 |