{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export interface ICreateWrapperOptions {\n  withCallback?: boolean\n  multiArgs?: boolean | string[]\n}\n/**\n * Turn async functions into promises\n *\n * @param {Function} fn\n * @return {Function}\n * @api public\n */\n\nexport function thenify(\n  fn: Function,\n  options: ICreateWrapperOptions,\n): Function {\n  if (!(typeof fn === 'function')) throw new Error(\"expect `fn` to be a function\");\n  return createWrapper(fn, options)\n}\n\n/**\n * Turn async functions into promises and backward compatible with callback\n */\n\nexport function withCallback<T extends Function>(fn: Function, options?: ICreateWrapperOptions): T {\n  if (!(typeof fn === 'function')) throw new Error(\"expect `fn` to be a function\");\n  options = options || {}\n  options.withCallback = true\n  return createWrapper(fn, options) as T;\n}\n\nfunction createCallback(\n  resolve: Function,\n  reject: Function,\n  multiArgs?: boolean | string[],\n): Function {\n  // default to true\n  if (multiArgs === undefined) multiArgs = true\n  return function (err: Error, value: any) {\n    if (err) return reject(err)\n    const length = arguments.length\n\n    if (length <= 2 || !multiArgs) return resolve(value)\n\n    if (Array.isArray(multiArgs)) {\n      const values: Record<string, any> = {}\n      for (let i = 1; i < length; i++) {\n        values[(multiArgs as string[])[i - 1]] = arguments[i]\n      }\n      return resolve(values)\n    }\n\n    const values = new Array(length - 1)\n    for (let i = 1; i < length; ++i) values[i - 1] = arguments[i]\n    resolve(values)\n  }\n}\n\nfunction createWrapper(\n  fn: Function,\n  options?: ICreateWrapperOptions,\n): Function {\n  options = options || {}\n  let name = fn.name\n  name = (name || '').replace(/\\s|bound(?!$)/g, '')\n  const newFn = function (this: Function) {\n    const self: Function = this\n    const len = arguments.length\n    if (options!.withCallback) {\n      const lastType = typeof arguments[len - 1]\n      if (lastType === 'function') return fn.apply(self, arguments)\n    }\n    const args = new Array(len + 1)\n    for (let i = 0; i < len; ++i) args[i] = arguments[i]\n    const lastIndex = len\n    return new Promise(function (resolve, reject) {\n      args[lastIndex] = createCallback(resolve, reject, options?.multiArgs)\n      fn.apply(self, args)\n    })\n  }\n  Object.defineProperty(newFn, 'name', { value: name })\n  return newFn\n}\n"],"mappings":"AAYO,SAASA,EACdC,EACAC,EACU,CACV,GAAM,OAAOD,GAAO,WAAa,MAAM,IAAI,MAAM,8BAA8B,EAC/E,OAAOE,EAAcF,EAAIC,CAAO,CAClC,CAMO,SAASE,EAAiCH,EAAcC,EAAoC,CACjG,GAAM,OAAOD,GAAO,WAAa,MAAM,IAAI,MAAM,8BAA8B,EAC/E,OAAAC,EAAUA,GAAW,CAAC,EACtBA,EAAQ,aAAe,GAChBC,EAAcF,EAAIC,CAAO,CAClC,CAEA,SAASG,EACPC,EACAC,EACAC,EACU,CAEV,OAAIA,IAAc,SAAWA,EAAY,IAClC,SAAUC,EAAYC,EAAY,CACvC,GAAID,EAAK,OAAOF,EAAOE,CAAG,EAC1B,IAAME,EAAS,UAAU,OAEzB,GAAIA,GAAU,GAAK,CAACH,EAAW,OAAOF,EAAQI,CAAK,EAEnD,GAAI,MAAM,QAAQF,CAAS,EAAG,CAC5B,IAAMI,EAA8B,CAAC,EACrC,QAASC,EAAI,EAAGA,EAAIF,EAAQE,IAC1BD,EAAQJ,EAAuBK,EAAI,CAAC,CAAC,EAAI,UAAUA,CAAC,EAEtD,OAAOP,EAAQM,CAAM,CACvB,CAEA,IAAMA,EAAS,IAAI,MAAMD,EAAS,CAAC,EACnC,QAASE,EAAI,EAAGA,EAAIF,EAAQ,EAAEE,EAAGD,EAAOC,EAAI,CAAC,EAAI,UAAUA,CAAC,EAC5DP,EAAQM,CAAM,CAChB,CACF,CAEA,SAAST,EACPF,EACAC,EACU,CACVA,EAAUA,GAAW,CAAC,EACtB,IAAIY,EAAOb,EAAG,KACda,GAAQA,GAAQ,IAAI,QAAQ,iBAAkB,EAAE,EAChD,IAAMC,EAAQ,UAA0B,CACtC,IAAMC,EAAiB,KACjBC,EAAM,UAAU,OACtB,GAAIf,EAAS,cACM,OAAO,UAAUe,EAAM,CAAC,IACxB,WAAY,OAAOhB,EAAG,MAAMe,EAAM,SAAS,EAE9D,IAAME,EAAO,IAAI,MAAMD,EAAM,CAAC,EAC9B,QAASJ,EAAI,EAAGA,EAAII,EAAK,EAAEJ,EAAGK,EAAKL,CAAC,EAAI,UAAUA,CAAC,EACnD,IAAMM,EAAYF,EAClB,OAAO,IAAI,QAAQ,SAAUX,EAASC,EAAQ,CAC5CW,EAAKC,CAAS,EAAId,EAAeC,EAASC,EAAQL,GAAA,YAAAA,EAAS,SAAS,EACpED,EAAG,MAAMe,EAAME,CAAI,CACrB,CAAC,CACH,EACA,cAAO,eAAeH,EAAO,OAAQ,CAAE,MAAOD,CAAK,CAAC,EAC7CC,CACT","names":["thenify","fn","options","createWrapper","withCallback","createCallback","resolve","reject","multiArgs","err","value","length","values","i","name","newFn","self","len","args","lastIndex"]}