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.
		
		
		
		
			
				
					75 lines
				
				2.2 KiB
			
		
		
			
		
	
	
					75 lines
				
				2.2 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								var arrayEach = require('./_arrayEach'),
							 | 
						||
| 
								 | 
							
								    arrayPush = require('./_arrayPush'),
							 | 
						||
| 
								 | 
							
								    baseFunctions = require('./_baseFunctions'),
							 | 
						||
| 
								 | 
							
								    copyArray = require('./_copyArray'),
							 | 
						||
| 
								 | 
							
								    isFunction = require('./isFunction'),
							 | 
						||
| 
								 | 
							
								    isObject = require('./isObject'),
							 | 
						||
| 
								 | 
							
								    keys = require('./keys');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * Adds all own enumerable string keyed function properties of a source
							 | 
						||
| 
								 | 
							
								 * object to the destination object. If `object` is a function, then methods
							 | 
						||
| 
								 | 
							
								 * are added to its prototype as well.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * **Note:** Use `_.runInContext` to create a pristine `lodash` function to
							 | 
						||
| 
								 | 
							
								 * avoid conflicts caused by modifying the original.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @static
							 | 
						||
| 
								 | 
							
								 * @since 0.1.0
							 | 
						||
| 
								 | 
							
								 * @memberOf _
							 | 
						||
| 
								 | 
							
								 * @category Util
							 | 
						||
| 
								 | 
							
								 * @param {Function|Object} [object=lodash] The destination object.
							 | 
						||
| 
								 | 
							
								 * @param {Object} source The object of functions to add.
							 | 
						||
| 
								 | 
							
								 * @param {Object} [options={}] The options object.
							 | 
						||
| 
								 | 
							
								 * @param {boolean} [options.chain=true] Specify whether mixins are chainable.
							 | 
						||
| 
								 | 
							
								 * @returns {Function|Object} Returns `object`.
							 | 
						||
| 
								 | 
							
								 * @example
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * function vowels(string) {
							 | 
						||
| 
								 | 
							
								 *   return _.filter(string, function(v) {
							 | 
						||
| 
								 | 
							
								 *     return /[aeiou]/i.test(v);
							 | 
						||
| 
								 | 
							
								 *   });
							 | 
						||
| 
								 | 
							
								 * }
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * _.mixin({ 'vowels': vowels });
							 | 
						||
| 
								 | 
							
								 * _.vowels('fred');
							 | 
						||
| 
								 | 
							
								 * // => ['e']
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * _('fred').vowels().value();
							 | 
						||
| 
								 | 
							
								 * // => ['e']
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * _.mixin({ 'vowels': vowels }, { 'chain': false });
							 | 
						||
| 
								 | 
							
								 * _('fred').vowels();
							 | 
						||
| 
								 | 
							
								 * // => ['e']
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								function mixin(object, source, options) {
							 | 
						||
| 
								 | 
							
								  var props = keys(source),
							 | 
						||
| 
								 | 
							
								      methodNames = baseFunctions(source, props);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  var chain = !(isObject(options) && 'chain' in options) || !!options.chain,
							 | 
						||
| 
								 | 
							
								      isFunc = isFunction(object);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  arrayEach(methodNames, function(methodName) {
							 | 
						||
| 
								 | 
							
								    var func = source[methodName];
							 | 
						||
| 
								 | 
							
								    object[methodName] = func;
							 | 
						||
| 
								 | 
							
								    if (isFunc) {
							 | 
						||
| 
								 | 
							
								      object.prototype[methodName] = function() {
							 | 
						||
| 
								 | 
							
								        var chainAll = this.__chain__;
							 | 
						||
| 
								 | 
							
								        if (chain || chainAll) {
							 | 
						||
| 
								 | 
							
								          var result = object(this.__wrapped__),
							 | 
						||
| 
								 | 
							
								              actions = result.__actions__ = copyArray(this.__actions__);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								          actions.push({ 'func': func, 'args': arguments, 'thisArg': object });
							 | 
						||
| 
								 | 
							
								          result.__chain__ = chainAll;
							 | 
						||
| 
								 | 
							
								          return result;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        return func.apply(object, arrayPush([this.value()], arguments));
							 | 
						||
| 
								 | 
							
								      };
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return object;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								module.exports = mixin;
							 |