fetch-request-browser 1.0.9 → 1.0.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -34,6 +34,7 @@ await sendGET<IHTTPBinResponse>(
34
34
  );
35
35
  // {
36
36
  // code: 200,
37
+ // statusText: 'OK',
37
38
  // headers: Headers {
38
39
  // date: 'Fri, 06 Dec 2024 14:14:12 GMT',
39
40
  // 'content-type': 'application/json',
@@ -81,6 +82,7 @@ await sendPOST<IHTTPBinResponse>(
81
82
  );
82
83
  // {
83
84
  // code: 200,
85
+ // statusText: 'OK',
84
86
  // headers: Headers {
85
87
  // date: 'Fri, 06 Dec 2024 12:57:25 GMT',
86
88
  // 'content-type': 'application/json',
@@ -133,6 +135,7 @@ await sendPOST<IHTTPBinResponse>(
133
135
  );
134
136
  // {
135
137
  // code: 200,
138
+ // statusText: 'OK',
136
139
  // headers: Headers {
137
140
  // date: 'Fri, 06 Dec 2024 13:05:20 GMT',
138
141
  // 'content-type': 'application/json',
@@ -168,6 +171,7 @@ await sendPOST<IHTTPBinResponse>(
168
171
  await sendGET<IHTTPBinResponse>('https://httpbin.org/get?foo=hey&bar=123');
169
172
  // {
170
173
  // code: 200,
174
+ // statusText: 'OK',
171
175
  // headers: Headers {
172
176
  // date: 'Fri, 06 Dec 2024 13:05:20 GMT',
173
177
  // 'content-type': 'application/json',
@@ -213,6 +217,7 @@ await sendPOST<IHTTPBinResponse>(
213
217
  );
214
218
  // {
215
219
  // code: 200,
220
+ // statusText: 'OK',
216
221
  // headers: Headers {
217
222
  // date: 'Fri, 06 Dec 2024 13:13:18 GMT',
218
223
  // 'content-type': 'application/json',
@@ -264,6 +269,7 @@ await sendPOST<IHTTPBinResponse>(
264
269
  );
265
270
  // {
266
271
  // code: 200,
272
+ // statusText: 'OK',
267
273
  // headers: Headers {
268
274
  // date: 'Fri, 06 Dec 2024 13:19:07 GMT',
269
275
  // 'content-type': 'application/json',
@@ -315,6 +321,7 @@ await sendPOST<IHTTPBinResponse>(
315
321
  );
316
322
  // {
317
323
  // code: 200,
324
+ // statusText: 'OK',
318
325
  // headers: Headers {
319
326
  // date: 'Fri, 06 Dec 2024 13:22:54 GMT',
320
327
  // 'content-type': 'application/json',
@@ -356,6 +363,7 @@ await sendPOST<IHTTPBinResponse>(
356
363
  await sendDELETE<IHTTPBinResponse>('https://httpbin.org/delete?id=1');
357
364
  // {
358
365
  // code: 200,
366
+ // statusText: 'OK',
359
367
  // headers: Headers {
360
368
  // date: 'Fri, 06 Dec 2024 13:25:41 GMT',
361
369
  // 'content-type': 'application/json',
@@ -518,6 +526,9 @@ await sendPOST<IHTTPBinResponse>(
518
526
  // the HTTP status code extracted from the Response
519
527
  code: number;
520
528
 
529
+ // the message associated with the status code
530
+ statusText: string;
531
+
521
532
  // the Response's Headers. Useful as some service providers attach important info in the headers
522
533
  headers: Headers;
523
534
 
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import{extractMessage}from"error-message-utils";import{isArrayValid,delay}from"web-utils-kit";import{buildOptions,buildRequest,extractResponseData}from"./utils/utils.js";import{validateResponse}from"./validations/validations.js";const __executeSend=async(e,s)=>{const t=buildOptions(s),n=buildRequest(e,t.requestOptions),r=await fetch(n);return validateResponse(n,r,t),r.redirected&&console.warn(`The request sent to '${n.url}' was redirected. Please update the implementation to avoid future redirections.`),{code:r.status,headers:r.headers,data:await extractResponseData(r,t.responseDataType)}},send=async(e,s,t)=>{try{return await __executeSend(e,s)}catch(n){if(extractMessage(n).includes("429")||!isArrayValid(t))throw n;return await delay(t[0]),send(e,s,t.slice(1))}},sendGET=(e,s,t)=>send(e,{...s,requestOptions:{...s?.requestOptions,method:"GET"}},t),sendPOST=(e,s,t)=>send(e,{...s,requestOptions:{...s?.requestOptions,method:"POST"}},t),sendPUT=(e,s,t)=>send(e,{...s,requestOptions:{...s?.requestOptions,method:"PUT"}},t),sendPATCH=(e,s,t)=>send(e,{...s,requestOptions:{...s?.requestOptions,method:"PATCH"}},t),sendDELETE=(e,s,t)=>send(e,{...s,requestOptions:{...s?.requestOptions,method:"DELETE"}},t);export{send,sendGET,sendPOST,sendPUT,sendPATCH,sendDELETE};
1
+ import{extractMessage}from"error-message-utils";import{isArrayValid,delay}from"web-utils-kit";import{buildOptions,buildRequest,extractErrorMessageFromResponseBody,extractResponseData}from"./utils/utils.js";import{validateResponse}from"./validations/validations.js";const __executeSend=async(e,t)=>{const s=buildOptions(t),r=buildRequest(e,s.requestOptions),a=await fetch(r);try{return validateResponse(r,a,s),a.redirected&&console.warn(`The request sent to '${r.url}' was redirected. Please update the implementation to avoid future redirections.`),{code:a.status,statusText:a.statusText,headers:a.headers,data:await extractResponseData(a,s.responseDataType)}}catch(e){const t=await extractErrorMessageFromResponseBody(a);if(t)throw new Error(extractMessage(e),{cause:t});throw e}},send=async(e,t,s)=>{try{return await __executeSend(e,t)}catch(r){if(extractMessage(r).includes("429")||!isArrayValid(s))throw r;return await delay(s[0]),send(e,t,s.slice(1))}},sendGET=(e,t,s)=>send(e,{...t,requestOptions:{...t?.requestOptions,method:"GET"}},s),sendPOST=(e,t,s)=>send(e,{...t,requestOptions:{...t?.requestOptions,method:"POST"}},s),sendPUT=(e,t,s)=>send(e,{...t,requestOptions:{...t?.requestOptions,method:"PUT"}},s),sendPATCH=(e,t,s)=>send(e,{...t,requestOptions:{...t?.requestOptions,method:"PATCH"}},s),sendDELETE=(e,t,s)=>send(e,{...t,requestOptions:{...t?.requestOptions,method:"DELETE"}},s);export{send,sendGET,sendPOST,sendPUT,sendPATCH,sendDELETE};
@@ -54,6 +54,7 @@ interface IOptions {
54
54
  */
55
55
  interface IRequestResponse<T> {
56
56
  code: number;
57
+ statusText: string;
57
58
  headers: Headers;
58
59
  data: T;
59
60
  }
@@ -19,10 +19,18 @@ declare const buildRequest: (input: IRequestInput, options?: Partial<IRequestOpt
19
19
  * - INVALID_RESPONSE_DTYPE: if the data type is not supported by the Response Instance
20
20
  */
21
21
  declare const extractResponseData: <T>(res: Response, dType: IResponseDataType) => Promise<T>;
22
+ /**
23
+ * Attempts to extract the error message from the response object. If it fails, it returns
24
+ * undefined.
25
+ * @param res
26
+ * @returns Promise<string | undefined>
27
+ * @stable
28
+ */
29
+ declare const extractErrorMessageFromResponseBody: (res: Response) => Promise<string | undefined>;
22
30
  /**
23
31
  * Builds the main options object based on given args (if any).
24
32
  * @param options
25
33
  * @returns IOptions
26
34
  */
27
35
  declare const buildOptions: (options?: Partial<IOptions>) => IOptions;
28
- export { buildRequest, extractResponseData, buildOptions, };
36
+ export { buildRequest, extractResponseData, extractErrorMessageFromResponseBody, buildOptions, };
@@ -1 +1 @@
1
- import{encodeError,isEncodedError}from"error-message-utils";import{isArrayValid,isObjectValid}from"web-utils-kit";import{ERRORS}from"../shared/errors.js";const __buildRequestInput=e=>{if(e instanceof URL)return e;try{return new URL(e)}catch(e){throw new Error(encodeError(e,ERRORS.INVALID_REQUEST_URL))}},__buildRequestHeaders=(e,r)=>{let t;if(e&&"object"==typeof e)try{t=new Headers(e)}catch(e){throw new Error(encodeError(e,ERRORS.INVALID_REQUEST_HEADERS))}else t=e instanceof Headers?e:"GET"===r?new Headers({Accept:"application/json"}):new Headers({Accept:"application/json","Content-Type":"application/json"});return t.has("Accept")||t.append("Accept","application/json"),t.has("Content-Type")||"GET"===r||t.append("Content-Type","application/json"),t},__buildRequestBody=e=>e?isObjectValid(e,!0)||isArrayValid(e,!0)?JSON.stringify(e):e:null,__buildRequestOptions=(e={})=>{const r=e.method??"GET";return{method:r,mode:e.mode??"cors",cache:e.cache??"default",credentials:e.credentials??"same-origin",headers:__buildRequestHeaders(e.headers,r),priority:e.priority??"auto",redirect:e.redirect??"follow",referrer:e.referrer??"about:client",referrerPolicy:e.referrerPolicy??"no-referrer-when-downgrade",signal:e.signal,integrity:e.integrity||"",keepalive:e.keepalive??!1,body:"GET"===r?null:__buildRequestBody(e.body)}},buildRequest=(e,r)=>{try{return new Request(__buildRequestInput(e),__buildRequestOptions(r))}catch(e){if(isEncodedError(e))throw e;throw new Error(encodeError(e,ERRORS.INVALID_REQUEST_OPTIONS))}},extractResponseData=async(e,r)=>{switch(r){case"arrayBuffer":return e.arrayBuffer();case"blob":return e.blob();case"formData":return e.formData();case"json":return e.json();case"text":return e.text();default:throw new Error(encodeError(`The provided response data type '${r}' is invalid.`,ERRORS.INVALID_RESPONSE_DTYPE))}},buildOptions=(e={})=>({requestOptions:e.requestOptions,responseDataType:e.responseDataType??"json",acceptableStatusCodes:e.acceptableStatusCodes,acceptableStatusCodesRange:e.acceptableStatusCodesRange??{min:200,max:299},skipStatusCodeValidation:e.skipStatusCodeValidation??!1});export{buildRequest,extractResponseData,buildOptions};
1
+ import{encodeError,extractMessage,isDefaultErrorMessage,isEncodedError}from"error-message-utils";import{isArrayValid,isObjectValid}from"web-utils-kit";import{ERRORS}from"../shared/errors.js";const __buildRequestInput=e=>{if(e instanceof URL)return e;try{return new URL(e)}catch(e){throw new Error(encodeError(e,ERRORS.INVALID_REQUEST_URL))}},__buildRequestHeaders=(e,r)=>{let t;if(e&&"object"==typeof e)try{t=new Headers(e)}catch(e){throw new Error(encodeError(e,ERRORS.INVALID_REQUEST_HEADERS))}else t=e instanceof Headers?e:"GET"===r?new Headers({Accept:"application/json"}):new Headers({Accept:"application/json","Content-Type":"application/json"});return t.has("Accept")||t.append("Accept","application/json"),t.has("Content-Type")||"GET"===r||t.append("Content-Type","application/json"),t},__buildRequestBody=e=>e?isObjectValid(e,!0)||isArrayValid(e,!0)?JSON.stringify(e):e:null,__buildRequestOptions=(e={})=>{const r=e.method??"GET";return{method:r,mode:e.mode??"cors",cache:e.cache??"default",credentials:e.credentials??"same-origin",headers:__buildRequestHeaders(e.headers,r),priority:e.priority??"auto",redirect:e.redirect??"follow",referrer:e.referrer??"about:client",referrerPolicy:e.referrerPolicy??"no-referrer-when-downgrade",signal:e.signal,integrity:e.integrity||"",keepalive:e.keepalive??!1,body:"GET"===r?null:__buildRequestBody(e.body)}},buildRequest=(e,r)=>{try{return new Request(__buildRequestInput(e),__buildRequestOptions(r))}catch(e){if(isEncodedError(e))throw e;throw new Error(encodeError(e,ERRORS.INVALID_REQUEST_OPTIONS))}},extractResponseData=async(e,r)=>{switch(r){case"arrayBuffer":return e.arrayBuffer();case"blob":return e.blob();case"formData":return e.formData();case"json":return e.json();case"text":return e.text();default:throw new Error(encodeError(`The provided response data type '${r}' is invalid.`,ERRORS.INVALID_RESPONSE_DTYPE))}},extractErrorMessageFromResponseBody=async e=>{try{const r=await e.json(),t=extractMessage(r);return isDefaultErrorMessage(t)?void 0:t}catch(e){return}},buildOptions=(e={})=>({requestOptions:e.requestOptions,responseDataType:e.responseDataType??"json",acceptableStatusCodes:e.acceptableStatusCodes,acceptableStatusCodesRange:e.acceptableStatusCodesRange??{min:200,max:299},skipStatusCodeValidation:e.skipStatusCodeValidation??!1});export{buildRequest,extractResponseData,extractErrorMessageFromResponseBody,buildOptions};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fetch-request-browser",
3
- "version": "1.0.9",
3
+ "version": "1.0.10",
4
4
  "description": "The fetch-request-browser package makes working with external APIs simple and efficient. This intuitive wrapper leverages the power of the Fetch API, providing a clean and concise interface for your API interactions.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -42,7 +42,7 @@
42
42
  "vitest": "^1.6.1"
43
43
  },
44
44
  "dependencies": {
45
- "error-message-utils": "^1.1.2",
45
+ "error-message-utils": "^1.1.3",
46
46
  "web-utils-kit": "^1.0.5"
47
47
  }
48
48
  }