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