source: frontend/node_modules/thenify/index.js

Last change on this file was 9af201e, checked in by MBK <marija.karapandzova@…>, 11 days ago

Fix frontend appearance

  • Property mode set to 100644
File size: 1.9 KB
Line 
1
2var Promise = require('any-promise')
3var assert = require('assert')
4
5module.exports = thenify
6
7/**
8 * Turn async functions into promises
9 *
10 * @param {Function} fn
11 * @return {Function}
12 * @api public
13 */
14
15function thenify(fn, options) {
16 assert(typeof fn === 'function')
17 return createWrapper(fn, options)
18}
19
20/**
21 * Turn async functions into promises and backward compatible with callback
22 *
23 * @param {Function} fn
24 * @return {Function}
25 * @api public
26 */
27
28thenify.withCallback = function (fn, options) {
29 assert(typeof fn === 'function')
30 options = options || {}
31 options.withCallback = true
32 return createWrapper(fn, options)
33}
34
35function createCallback(resolve, reject, multiArgs) {
36 // default to true
37 if (multiArgs === undefined) multiArgs = true
38 return function(err, value) {
39 if (err) return reject(err)
40 var length = arguments.length
41
42 if (length <= 2 || !multiArgs) return resolve(value)
43
44 if (Array.isArray(multiArgs)) {
45 var values = {}
46 for (var i = 1; i < length; i++) values[multiArgs[i - 1]] = arguments[i]
47 return resolve(values)
48 }
49
50 var values = new Array(length - 1)
51 for (var i = 1; i < length; ++i) values[i - 1] = arguments[i]
52 resolve(values)
53 }
54}
55
56function createWrapper(fn, options) {
57 options = options || {}
58 var name = fn.name;
59 name = (name || '').replace(/\s|bound(?!$)/g, '')
60 var newFn = function () {
61 var self = this
62 var len = arguments.length
63 if (options.withCallback) {
64 var lastType = typeof arguments[len - 1]
65 if (lastType === 'function') return fn.apply(self, arguments)
66 }
67 var args = new Array(len + 1)
68 for (var i = 0; i < len; ++i) args[i] = arguments[i]
69 var lastIndex = i
70 return new Promise(function (resolve, reject) {
71 args[lastIndex] = createCallback(resolve, reject, options.multiArgs)
72 fn.apply(self, args)
73 })
74 }
75 Object.defineProperty(newFn, 'name', { value: name })
76 return newFn
77}
Note: See TracBrowser for help on using the repository browser.