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.
		
		
		
		
		
			
		
			
				
					
					
						
							68 lines
						
					
					
						
							1.6 KiB
						
					
					
				
			
		
		
	
	
							68 lines
						
					
					
						
							1.6 KiB
						
					
					
				'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; | 
						|
};
 | 
						|
 |