| 'use strict'; |
| |
| var processFn = function (fn, P, opts) { |
| return function () { |
| var that = this; |
| var args = new Array(arguments.length); |
| |
| for (var i = 0; i < arguments.length; i++) { |
| args[i] = arguments[i]; |
| } |
| |
| return new P(function (resolve, reject) { |
| args.push(function (err, result) { |
| if (err) { |
| reject(err); |
| } else if (opts.multiArgs) { |
| var results = new Array(arguments.length - 1); |
| |
| for (var i = 1; i < arguments.length; i++) { |
| results[i - 1] = arguments[i]; |
| } |
| |
| resolve(results); |
| } else { |
| resolve(result); |
| } |
| }); |
| |
| fn.apply(that, args); |
| }); |
| }; |
| }; |
| |
| var pify = module.exports = function (obj, P, opts) { |
| if (typeof P !== 'function') { |
| opts = P; |
| P = Promise; |
| } |
| |
| opts = opts || {}; |
| opts.exclude = opts.exclude || [/.+Sync$/]; |
| |
| var filter = function (key) { |
| var match = function (pattern) { |
| return typeof pattern === 'string' ? key === pattern : pattern.test(key); |
| }; |
| |
| return opts.include ? opts.include.some(match) : !opts.exclude.some(match); |
| }; |
| |
| var ret = typeof obj === 'function' ? function () { |
| if (opts.excludeMain) { |
| return obj.apply(this, arguments); |
| } |
| |
| return processFn(obj, P, opts).apply(this, arguments); |
| } : {}; |
| |
| return Object.keys(obj).reduce(function (ret, key) { |
| var x = obj[key]; |
| |
| ret[key] = typeof x === 'function' && filter(key) ? processFn(x, P, opts) : x; |
| |
| return ret; |
| }, ret); |
| }; |
| |
| pify.all = pify; |