UNPKG

@moeenn/fetch

Version:

Native Fetch with better ergonomics and error reporting

1 lines 2.84 kB
{"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"]}