| 'use strict'; | 
|   | 
| const processFn = (fn, opts) => function () { | 
|     const P = opts.promiseModule; | 
|     const args = new Array(arguments.length); | 
|   | 
|     for (let i = 0; i < arguments.length; i++) { | 
|         args[i] = arguments[i]; | 
|     } | 
|   | 
|     return new P((resolve, reject) => { | 
|         if (opts.errorFirst) { | 
|             args.push(function (err, result) { | 
|                 if (opts.multiArgs) { | 
|                     const results = new Array(arguments.length - 1); | 
|   | 
|                     for (let i = 1; i < arguments.length; i++) { | 
|                         results[i - 1] = arguments[i]; | 
|                     } | 
|   | 
|                     if (err) { | 
|                         results.unshift(err); | 
|                         reject(results); | 
|                     } else { | 
|                         resolve(results); | 
|                     } | 
|                 } else if (err) { | 
|                     reject(err); | 
|                 } else { | 
|                     resolve(result); | 
|                 } | 
|             }); | 
|         } else { | 
|             args.push(function (result) { | 
|                 if (opts.multiArgs) { | 
|                     const results = new Array(arguments.length - 1); | 
|   | 
|                     for (let i = 0; i < arguments.length; i++) { | 
|                         results[i] = arguments[i]; | 
|                     } | 
|   | 
|                     resolve(results); | 
|                 } else { | 
|                     resolve(result); | 
|                 } | 
|             }); | 
|         } | 
|   | 
|         fn.apply(this, args); | 
|     }); | 
| }; | 
|   | 
| module.exports = (obj, opts) => { | 
|     opts = Object.assign({ | 
|         exclude: [/.+(Sync|Stream)$/], | 
|         errorFirst: true, | 
|         promiseModule: Promise | 
|     }, opts); | 
|   | 
|     const filter = key => { | 
|         const match = pattern => typeof pattern === 'string' ? key === pattern : pattern.test(key); | 
|         return opts.include ? opts.include.some(match) : !opts.exclude.some(match); | 
|     }; | 
|   | 
|     let ret; | 
|     if (typeof obj === 'function') { | 
|         ret = function () { | 
|             if (opts.excludeMain) { | 
|                 return obj.apply(this, arguments); | 
|             } | 
|   | 
|             return processFn(obj, opts).apply(this, arguments); | 
|         }; | 
|     } else { | 
|         ret = Object.create(Object.getPrototypeOf(obj)); | 
|     } | 
|   | 
|     for (const key in obj) { // eslint-disable-line guard-for-in | 
|         const x = obj[key]; | 
|         ret[key] = typeof x === 'function' && filter(key) ? processFn(x, opts) : x; | 
|     } | 
|   | 
|     return ret; | 
| }; |