.gitignore added
[dotfiles/.git] / .config / coc / extensions / node_modules / coc-prettier / node_modules / pify / index.js
1 'use strict';
2
3 const 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
53 module.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 };