{"version":3,"sources":["../src/index.ts"],"sourcesContent":["const DEFAULT_TIMEOUT = 10_000\n\nexport async function fetchJSON(\n  url: string | URL | Request,\n  options: RequestInit & { timeout?: number },\n): Promise<unknown> {\n  /** automatically add default headers, if required */\n  const headers = new Headers(options.headers)\n  if (!headers.has(\"Content-Type\") && !(options.body instanceof FormData)) {\n    headers.set(\"Content-Type\", \"application/json\")\n  }\n\n  let res: Response\n  try {\n    res = await fetch(url, {\n      ...options,\n      headers,\n      signal: AbortSignal.timeout(options.timeout || DEFAULT_TIMEOUT),\n    })\n  } catch (err) {\n    /** handle timeout error */\n    if (err instanceof DOMException) {\n      throw new Error(\"The request to the server timed-out\")\n    }\n    throw err\n  }\n\n  let parseError: unknown | null = null\n  let parsedResponse: unknown\n  try {\n    parsedResponse = await res.json()\n  } catch (err) {\n    parseError = err\n  }\n\n  /** handle >=400 status code related errors */\n  if (!res.ok) {\n    if (parseError !== null) {\n      throw new Error(\"Unexpected response sent from the server\")\n    }\n\n    if (typeof parsedResponse === \"object\" && parsedResponse != null) {\n      if (\"message\" in parsedResponse && typeof parsedResponse.message === \"string\") {\n        throw new Error(parsedResponse.message)\n      }\n  \n      if (\"error\" in parsedResponse && typeof parsedResponse.error === \"string\") {\n        throw new Error(parsedResponse.error)\n      }  \n    }\n\n    throw new Error(`${res.status} ${res.statusText}`)\n  }\n\n  return parsedResponse\n}"],"mappings":";;;;AAAA,IAAMA,kBAAkB;AAExB,eAAsBC,UACpBC,KACAC,SAA2C;AAG3C,QAAMC,UAAU,IAAIC,QAAQF,QAAQC,OAAO;AAC3C,MAAI,CAACA,QAAQE,IAAI,cAAA,KAAmB,EAAEH,QAAQI,gBAAgBC,WAAW;AACvEJ,YAAQK,IAAI,gBAAgB,kBAAA;EAC9B;AAEA,MAAIC;AACJ,MAAI;AACFA,UAAM,MAAMC,MAAMT,KAAK;MACrB,GAAGC;MACHC;MACAQ,QAAQC,YAAYC,QAAQX,QAAQW,WAAWd,eAAAA;IACjD,CAAA;EACF,SAASe,KAAK;AAEZ,QAAIA,eAAeC,cAAc;AAC/B,YAAM,IAAIC,MAAM,qCAAA;IAClB;AACA,UAAMF;EACR;AAEA,MAAIG,aAA6B;AACjC,MAAIC;AACJ,MAAI;AACFA,qBAAiB,MAAMT,IAAIU,KAAI;EACjC,SAASL,KAAK;AACZG,iBAAaH;EACf;AAGA,MAAI,CAACL,IAAIW,IAAI;AACX,QAAIH,eAAe,MAAM;AACvB,YAAM,IAAID,MAAM,0CAAA;IAClB;AAEA,QAAI,OAAOE,mBAAmB,YAAYA,kBAAkB,MAAM;AAChE,UAAI,aAAaA,kBAAkB,OAAOA,eAAeG,YAAY,UAAU;AAC7E,cAAM,IAAIL,MAAME,eAAeG,OAAO;MACxC;AAEA,UAAI,WAAWH,kBAAkB,OAAOA,eAAeI,UAAU,UAAU;AACzE,cAAM,IAAIN,MAAME,eAAeI,KAAK;MACtC;IACF;AAEA,UAAM,IAAIN,MAAM,GAAGP,IAAIc,MAAM,IAAId,IAAIe,UAAU,EAAE;EACnD;AAEA,SAAON;AACT;AArDsBlB;","names":["DEFAULT_TIMEOUT","fetchJSON","url","options","headers","Headers","has","body","FormData","set","res","fetch","signal","AbortSignal","timeout","err","DOMException","Error","parseError","parsedResponse","json","ok","message","error","status","statusText"]}