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.
		
		
		
		
			
				
					65 lines
				
				1.1 KiB
			
		
		
			
		
	
	
					65 lines
				
				1.1 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								'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;
							 |