return-fetch-json
Version:
An extended function of return-fetch ot serialize request body and deserialize response body as object.
1 lines • 3.57 kB
Source Map (JSON)
{"version":3,"file":"index.cjs","sources":["../src/index.ts"],"sourcesContent":["import returnFetch, {\n FetchArgs,\n ReturnFetchDefaultOptions,\n} from \"return-fetch\";\n\nexport type ReturnFetchJson = typeof returnFetchJson;\n\nexport type ReturnFetchJsonDefaultOptions = ReturnFetchDefaultOptions & {\n jsonParser?: typeof JSON.parse;\n};\n\n// Use as a replacer of `RequestInit`\nexport type JsonRequestInit = Omit<NonNullable<FetchArgs[1]>, \"body\"> & {\n body?: object;\n};\n\n// Use as a replacer of `Response`\nexport type ResponseGenericBody<T> = Omit<\n Awaited<ReturnType<typeof fetch>>,\n keyof Body | \"clone\"\n> & {\n body: T;\n};\n\nexport type JsonResponse<T> = T extends object\n ? ResponseGenericBody<T>\n : ResponseGenericBody<string>;\n\n// this resembles the default behavior of axios json parser\n// https://github.com/axios/axios/blob/21a5ad34c4a5956d81d338059ac0dd34a19ed094/lib/defaults/index.js#L25\nconst parseJsonSafely = (\n text: string,\n jsonParser = JSON.parse,\n): object | string => {\n try {\n return jsonParser(text);\n } catch (e) {\n if ((e as Error).name !== \"SyntaxError\") {\n throw e;\n }\n\n return text.trim();\n }\n};\n\n// Write your own high order function to serialize request body and deserialize response body.\nconst returnFetchJson = (args?: ReturnFetchJsonDefaultOptions) => {\n const fetch = returnFetch(args);\n\n return async <T>(\n url: FetchArgs[0],\n init?: JsonRequestInit,\n ): Promise<JsonResponse<T>> => {\n const headers = new Headers(init?.headers);\n if (init?.method && init.method.toUpperCase() !== \"GET\") {\n headers.get(\"Content-Type\") ||\n headers.set(\"Content-Type\", \"application/json\");\n }\n headers.get(\"Accept\") || headers.set(\"Accept\", \"application/json\");\n\n const response = await fetch(url, {\n ...init,\n headers,\n body: init?.body && JSON.stringify(init.body),\n });\n\n const body = parseJsonSafely(await response.text(), args?.jsonParser) as T;\n\n return {\n headers: response.headers,\n ok: response.ok,\n redirected: response.redirected,\n status: response.status,\n statusText: response.statusText,\n type: response.type,\n url: response.url,\n body,\n } as JsonResponse<T>;\n };\n};\n\nexport default returnFetchJson;\n"],"names":["args","fetch","returnFetch","url","init","headers","Headers","method","toUpperCase","get","set","Promise","resolve","_extends","body","JSON","stringify","then","response","text","_response$text","jsonParser","parse","e","name","trim","parseJsonSafely","ok","redirected","status","statusText","type","reject"],"mappings":"yWA8CwB,SAACA,GACvB,IAAMC,EAAQC,UAAYF,GAE1B,OACEG,SAAAA,EACAC,OAEA,IAAMC,EAAU,IAAIC,QAAY,MAAJF,OAAI,EAAJA,EAAMC,SAKiC,OAJ/DD,MAAAA,GAAAA,EAAMG,QAAwC,QAA9BH,EAAKG,OAAOC,gBAC9BH,EAAQI,IAAI,iBACVJ,EAAQK,IAAI,eAAgB,qBAEhCL,EAAQI,IAAI,WAAaJ,EAAQK,IAAI,SAAU,oBAAoBC,QAAAC,QAE5CX,EAAME,EAAGU,EAC3BT,CAAAA,EAAAA,EACHC,CAAAA,QAAAA,EACAS,MAAMV,MAAAA,OAAAA,EAAAA,EAAMU,OAAQC,KAAKC,UAAUZ,EAAKU,UACxCG,KAAA,SAJIC,GAAQ,OAAAP,QAAAC,QAMqBM,EAASC,QAAMF,KAAA,SAAAG,GAAlD,IAAMN,EApCc,SACtBK,EACAE,QAAU,IAAVA,IAAAA,EAAaN,KAAKO,OAElB,IACE,OAAOD,EAAWF,EACnB,CAAC,MAAOI,GACP,GAA0B,gBAArBA,EAAYC,KACf,MAAMD,EAGR,OAAOJ,EAAKM,MACb,CACH,CAuBiBC,CAAeN,EAAwBpB,MAAAA,OAAAA,EAAAA,EAAMqB,YAE1D,MAAO,CACLhB,QAASa,EAASb,QAClBsB,GAAIT,EAASS,GACbC,WAAYV,EAASU,WACrBC,OAAQX,EAASW,OACjBC,WAAYZ,EAASY,WACrBC,KAAMb,EAASa,KACf5B,IAAKe,EAASf,IACdW,KAAAA,EACmB,EACvB,EAAA,CAAC,MAAAS,UAAAZ,QAAAqB,OAAAT,EACH,CAAA,CAAA"}