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