UNPKG

@tkrotoff/fetch

Version:
245 lines (237 loc) 7.71 kB
'use strict'; function entriesToObject(object) { return Object.fromEntries(object.entries()); } class HttpError extends Error { constructor(request, response) { const { status, statusText } = response; super(statusText || String(status)); this.name = 'HttpError'; this.request = request; this.response = response; } } const arrayBufferMimeType = '*/*'; const blobMimeType = '*/*'; const formDataMimeType = 'multipart/form-data'; const jsonMimeType = 'application/json'; const textMimeType = 'text/*'; function isJSONResponse(response) { var _a; const contentType = (_a = response.headers.get('content-type')) !== null && _a !== void 0 ? _a : ''; return contentType.includes(jsonMimeType); } function extendResponsePromiseWithBodyMethods$1(responsePromise, headers) { function setAcceptHeader(mimeType) { var _a; headers.set('accept', (_a = headers.get('accept')) !== null && _a !== void 0 ? _a : mimeType); } responsePromise.arrayBuffer = async () => { setAcceptHeader(arrayBufferMimeType); const response = await responsePromise; return response.arrayBuffer(); }; responsePromise.blob = async () => { setAcceptHeader(blobMimeType); const response = await responsePromise; return response.blob(); }; responsePromise.formData = async () => { setAcceptHeader(formDataMimeType); const response = await responsePromise; return response.formData(); }; responsePromise.json = async () => { setAcceptHeader(jsonMimeType); const response = await responsePromise; if (isJSONResponse(response)) { return response.json(); } return response.text(); }; responsePromise.text = async () => { setAcceptHeader(textMimeType); const response = await responsePromise; return response.text(); }; } const defaults = { init: {} }; function request(input, headers, init, method, body) { async function _fetch() { await Promise.resolve(); const req = new Request(input, { ...defaults.init, ...init, headers, method, body }); const res = await fetch(req); if (!res.ok) throw new HttpError(req, res); return res; } const responsePromise = _fetch(); extendResponsePromiseWithBodyMethods$1(responsePromise, headers); return responsePromise; } function getHeaders(init) { const defaultInitHeaders = entriesToObject(new Headers(defaults.init.headers)); const initHeaders = entriesToObject(new Headers(init === null || init === void 0 ? void 0 : init.headers)); return new Headers({ ...defaultInitHeaders, ...initHeaders }); } function getJSONHeaders(init) { const headers = getHeaders(init); headers.set('content-type', jsonMimeType); return headers; } function get(input, init) { return request(input, getHeaders(init), init, 'GET'); } function post(input, body, init) { return request(input, getHeaders(init), init, 'POST', body); } function postJSON(input, body, init) { return request(input, getJSONHeaders(init), init, 'POST', JSON.stringify(body)); } function put(input, body, init) { return request(input, getHeaders(init), init, 'PUT', body); } function putJSON(input, body, init) { return request(input, getJSONHeaders(init), init, 'PUT', JSON.stringify(body)); } function patch(input, body, init) { return request(input, getHeaders(init), init, 'PATCH', body); } function patchJSON(input, body, init) { return request(input, getJSONHeaders(init), init, 'PATCH', JSON.stringify(body)); } function del(input, init) { return request(input, getHeaders(init), init, 'DELETE'); } function createHttpError(body, status, statusText) { return new HttpError(undefined, new Response(body, { status, statusText })); } function createJSONHttpError(body, status, statusText) { return new HttpError(undefined, new Response(JSON.stringify(body), { status, statusText, headers: { 'content-type': jsonMimeType } })); } function extendResponsePromiseWithBodyMethods(responsePromise, response) { ['arrayBuffer', 'blob', 'formData', 'json', 'text'].forEach(methodName => { responsePromise[methodName] = () => new Promise((resolve, reject) => { if (response.ok) { resolve(response[methodName]()); } else { responsePromise.catch(() => { }); reject(new HttpError(undefined, response)); } }); }); } function createResponsePromise(body, init) { const response = new Response(body, init); const responsePromise = new Promise((resolve, reject) => { if (response.ok) { resolve(response); } else { reject(new HttpError(undefined, response)); } }); extendResponsePromiseWithBodyMethods(responsePromise, response); return responsePromise; } function createJSONResponsePromise(body, init) { return createResponsePromise(JSON.stringify(body), init); } const HttpStatus = { _100_Continue: 100, _101_SwitchingProtocols: 101, _102_Processing: 102, _103_EarlyHints: 103, _200_OK: 200, _201_Created: 201, _202_Accepted: 202, _203_NonAuthoritativeInformation: 203, _204_NoContent: 204, _205_ResetContent: 205, _206_PartialContent: 206, _207_MultiStatus: 207, _208_AlreadyReported: 208, _226_IMUsed: 226, _300_MultipleChoices: 300, _301_MovedPermanently: 301, _302_Found: 302, _303_SeeOther: 303, _304_NotModified: 304, _305_UseProxy: 305, _307_TemporaryRedirect: 307, _308_PermanentRedirect: 308, _400_BadRequest: 400, _401_Unauthorized: 401, _402_PaymentRequired: 402, _403_Forbidden: 403, _404_NotFound: 404, _405_MethodNotAllowed: 405, _406_NotAcceptable: 406, _407_ProxyAuthenticationRequired: 407, _408_RequestTimeout: 408, _409_Conflict: 409, _410_Gone: 410, _411_LengthRequired: 411, _412_PreconditionFailed: 412, _413_PayloadTooLarge: 413, _414_URITooLong: 414, _415_UnsupportedMediaType: 415, _416_RangeNotSatisfiable: 416, _417_ExpectationFailed: 417, _421_MisdirectedRequest: 421, _422_UnprocessableEntity: 422, _423_Locked: 423, _424_FailedDependency: 424, _425_TooEarly: 425, _426_UpgradeRequired: 426, _428_PreconditionRequired: 428, _429_TooManyRequests: 429, _431_RequestHeaderFieldsTooLarge: 431, _451_UnavailableForLegalReasons: 451, _500_InternalServerError: 500, _501_NotImplemented: 501, _502_BadGateway: 502, _503_ServiceUnavailable: 503, _504_GatewayTimeout: 504, _505_HTTPVersionNotSupported: 505, _506_VariantAlsoNegotiates: 506, _507_InsufficientStorage: 507, _508_LoopDetected: 508, _510_NotExtended: 510, _511_NetworkAuthenticationRequired: 511, _420_MethodFailure: 420 }; exports.HttpError = HttpError; exports.HttpStatus = HttpStatus; exports.createHttpError = createHttpError; exports.createJSONHttpError = createJSONHttpError; exports.createJSONResponsePromise = createJSONResponsePromise; exports.createResponsePromise = createResponsePromise; exports.defaults = defaults; exports.del = del; exports.get = get; exports.isJSONResponse = isJSONResponse; exports.jsonMimeType = jsonMimeType; exports.patch = patch; exports.patchJSON = patchJSON; exports.post = post; exports.postJSON = postJSON; exports.put = put; exports.putJSON = putJSON;