| 'use strict'; | 
|   | 
| var isES5 = typeof Object.defineProperty === 'function' | 
|     && typeof Object.defineProperties === 'function' | 
|     && typeof Object.getPrototypeOf === 'function' | 
|     && typeof Object.setPrototypeOf === 'function'; | 
|   | 
| if (!isES5) { | 
|     throw new TypeError('util.promisify requires a true ES5 environment'); | 
| } | 
|   | 
| var getOwnPropertyDescriptors = require('object.getownpropertydescriptors'); | 
|   | 
| if (typeof Promise !== 'function') { | 
|     throw new TypeError('`Promise` must be globally available for util.promisify to work.'); | 
| } | 
|   | 
| var slice = Function.call.bind(Array.prototype.slice); | 
| var concat = Function.call.bind(Array.prototype.concat); | 
| var forEach = Function.call.bind(Array.prototype.forEach); | 
|   | 
| var hasSymbols = typeof Symbol === 'function' && typeof Symbol('') === 'symbol'; | 
|   | 
| var kCustomPromisifiedSymbol = hasSymbols ? Symbol('util.promisify.custom') : null; | 
| var kCustomPromisifyArgsSymbol = hasSymbols ? Symbol('customPromisifyArgs') : null; | 
|   | 
| module.exports = function promisify(orig) { | 
|     if (typeof orig !== 'function') { | 
|         var error = new TypeError('The "original" argument must be of type function'); | 
|         error.name = 'TypeError [ERR_INVALID_ARG_TYPE]'; | 
|         error.code = 'ERR_INVALID_ARG_TYPE'; | 
|         throw error; | 
|     } | 
|   | 
|     if (hasSymbols && orig[kCustomPromisifiedSymbol]) { | 
|         var customFunction = orig[kCustomPromisifiedSymbol]; | 
|         if (typeof customFunction !== 'function') { | 
|             throw new TypeError('The [util.promisify.custom] property must be a function'); | 
|         } | 
|         Object.defineProperty(customFunction, kCustomPromisifiedSymbol, { | 
|             configurable: true, | 
|             enumerable: false, | 
|             value: customFunction, | 
|             writable: false | 
|         }); | 
|         return customFunction; | 
|     } | 
|   | 
|     // Names to create an object from in case the callback receives multiple | 
|     // arguments, e.g. ['stdout', 'stderr'] for child_process.exec. | 
|     var argumentNames = orig[kCustomPromisifyArgsSymbol]; | 
|   | 
|     var promisified = function fn() { | 
|         var args = slice(arguments); | 
|         var self = this; // eslint-disable-line no-invalid-this | 
|         return new Promise(function (resolve, reject) { | 
|             orig.apply(self, concat(args, function (err) { | 
|                 var values = arguments.length > 1 ? slice(arguments, 1) : []; | 
|                 if (err) { | 
|                     reject(err); | 
|                 } else if (typeof argumentNames !== 'undefined' && values.length > 1) { | 
|                     var obj = {}; | 
|                     forEach(argumentNames, function (name, index) { | 
|                         obj[name] = values[index]; | 
|                     }); | 
|                     resolve(obj); | 
|                 } else { | 
|                     resolve(values[0]); | 
|                 } | 
|             })); | 
|         }); | 
|     }; | 
|   | 
|     Object.setPrototypeOf(promisified, Object.getPrototypeOf(orig)); | 
|   | 
|     Object.defineProperty(promisified, kCustomPromisifiedSymbol, { | 
|         configurable: true, | 
|         enumerable: false, | 
|         value: promisified, | 
|         writable: false | 
|     }); | 
|     return Object.defineProperties(promisified, getOwnPropertyDescriptors(orig)); | 
| }; | 
|   | 
| module.exports.custom = kCustomPromisifiedSymbol; | 
| module.exports.customPromisifyArgs = kCustomPromisifyArgsSymbol; |