'use strict';

var _apply = require('./_apply.js');
var _baseRest = require('./_baseRest.js');
var _customDefaultsMerge = require('./_customDefaultsMerge.js');
var mergeWith = require('./mergeWith.js');

/**
 * This method is like `_.defaults` except that it recursively assigns
 * default properties.
 *
 * **Note:** This method mutates `object`.
 *
 * @static
 * @memberOf _
 * @since 3.10.0
 * @category Object
 * @param {Object} object The destination object.
 * @param {...Object} [sources] The source objects.
 * @returns {Object} Returns `object`.
 * @see _.defaults
 * @example
 *
 * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } });
 * // => { 'a': { 'b': 2, 'c': 3 } }
 */
var defaultsDeep = _baseRest(function(args) {
  args.push(undefined, _customDefaultsMerge);
  return _apply(mergeWith, undefined, args);
});

var _defaultsDeep = defaultsDeep;

module.exports = _defaultsDeep;
