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.
		
		
		
		
		
			
		
			
				
					69 lines
				
				1.6 KiB
			
		
		
			
		
	
	
					69 lines
				
				1.6 KiB
			| 
											3 years ago
										 | 'use strict'; | ||
|  | 
 | ||
|  | const processFn = (fn, options) => function (...args) { | ||
|  | 	const P = options.promiseModule; | ||
|  | 
 | ||
|  | 	return new P((resolve, reject) => { | ||
|  | 		if (options.multiArgs) { | ||
|  | 			args.push((...result) => { | ||
|  | 				if (options.errorFirst) { | ||
|  | 					if (result[0]) { | ||
|  | 						reject(result); | ||
|  | 					} else { | ||
|  | 						result.shift(); | ||
|  | 						resolve(result); | ||
|  | 					} | ||
|  | 				} else { | ||
|  | 					resolve(result); | ||
|  | 				} | ||
|  | 			}); | ||
|  | 		} else if (options.errorFirst) { | ||
|  | 			args.push((error, result) => { | ||
|  | 				if (error) { | ||
|  | 					reject(error); | ||
|  | 				} else { | ||
|  | 					resolve(result); | ||
|  | 				} | ||
|  | 			}); | ||
|  | 		} else { | ||
|  | 			args.push(resolve); | ||
|  | 		} | ||
|  | 
 | ||
|  | 		fn.apply(this, args); | ||
|  | 	}); | ||
|  | }; | ||
|  | 
 | ||
|  | module.exports = (input, options) => { | ||
|  | 	options = Object.assign({ | ||
|  | 		exclude: [/.+(Sync|Stream)$/], | ||
|  | 		errorFirst: true, | ||
|  | 		promiseModule: Promise | ||
|  | 	}, options); | ||
|  | 
 | ||
|  | 	const objType = typeof input; | ||
|  | 	if (!(input !== null && (objType === 'object' || objType === 'function'))) { | ||
|  | 		throw new TypeError(`Expected \`input\` to be a \`Function\` or \`Object\`, got \`${input === null ? 'null' : objType}\``); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	const filter = key => { | ||
|  | 		const match = pattern => typeof pattern === 'string' ? key === pattern : pattern.test(key); | ||
|  | 		return options.include ? options.include.some(match) : !options.exclude.some(match); | ||
|  | 	}; | ||
|  | 
 | ||
|  | 	let ret; | ||
|  | 	if (objType === 'function') { | ||
|  | 		ret = function (...args) { | ||
|  | 			return options.excludeMain ? input(...args) : processFn(input, options).apply(this, args); | ||
|  | 		}; | ||
|  | 	} else { | ||
|  | 		ret = Object.create(Object.getPrototypeOf(input)); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	for (const key in input) { // eslint-disable-line guard-for-in
 | ||
|  | 		const property = input[key]; | ||
|  | 		ret[key] = typeof property === 'function' && filter(key) ? processFn(property, options) : property; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	return ret; | ||
|  | }; |