'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;