• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1'use strict';
2
3const processFn = (fn, opts) => function () {
4	const P = opts.promiseModule;
5	const args = new Array(arguments.length);
6
7	for (let i = 0; i < arguments.length; i++) {
8		args[i] = arguments[i];
9	}
10
11	return new P((resolve, reject) => {
12		if (opts.errorFirst) {
13			args.push(function (err, result) {
14				if (opts.multiArgs) {
15					const results = new Array(arguments.length - 1);
16
17					for (let i = 1; i < arguments.length; i++) {
18						results[i - 1] = arguments[i];
19					}
20
21					if (err) {
22						results.unshift(err);
23						reject(results);
24					} else {
25						resolve(results);
26					}
27				} else if (err) {
28					reject(err);
29				} else {
30					resolve(result);
31				}
32			});
33		} else {
34			args.push(function (result) {
35				if (opts.multiArgs) {
36					const results = new Array(arguments.length - 1);
37
38					for (let i = 0; i < arguments.length; i++) {
39						results[i] = arguments[i];
40					}
41
42					resolve(results);
43				} else {
44					resolve(result);
45				}
46			});
47		}
48
49		fn.apply(this, args);
50	});
51};
52
53module.exports = (obj, opts) => {
54	opts = Object.assign({
55		exclude: [/.+(Sync|Stream)$/],
56		errorFirst: true,
57		promiseModule: Promise
58	}, opts);
59
60	const filter = key => {
61		const match = pattern => typeof pattern === 'string' ? key === pattern : pattern.test(key);
62		return opts.include ? opts.include.some(match) : !opts.exclude.some(match);
63	};
64
65	let ret;
66	if (typeof obj === 'function') {
67		ret = function () {
68			if (opts.excludeMain) {
69				return obj.apply(this, arguments);
70			}
71
72			return processFn(obj, opts).apply(this, arguments);
73		};
74	} else {
75		ret = Object.create(Object.getPrototypeOf(obj));
76	}
77
78	for (const key in obj) { // eslint-disable-line guard-for-in
79		const x = obj[key];
80		ret[key] = typeof x === 'function' && filter(key) ? processFn(x, opts) : x;
81	}
82
83	return ret;
84};
85