@scirexs/fetchy 0.2.0 → 0.2.2

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
@@ -56,7 +56,7 @@ Performs an HTTP request and returns the raw Response object.
56
56
  - `options`: `FetchyOptions` (optional) - Configuration options
57
57
 
58
58
  #### Returns
59
- `Promise<Response | null>`
59
+ `Promise<Response>`; If configure `throwError.onError`, `Promise<Response | null>`
60
60
 
61
61
  #### Example
62
62
  ```ts
@@ -83,7 +83,7 @@ Performs an HTTP request and automatically parses the response body.
83
83
  - `options`: `FetchyOptions` (optional) - Configuration options
84
84
 
85
85
  #### Returns
86
- `Promise<T | string | Uint8Array | null>`
86
+ `Promise<T | string | Uint8Array>`; If configure `throwError.onError`, `Promise<T | string | Uint8Array | null>`
87
87
 
88
88
  #### Example
89
89
  ```ts
@@ -200,11 +200,11 @@ If the timeout duration specified in the `timeout` option is exceeded, `abort("t
200
200
 
201
201
  ### HTTPStatusError
202
202
 
203
- If `onErrorStatus` is set to `true`, an `HTTPStatusError` will be thrown when the response status is outside the 200 range. The error message format is: `404 Not Found`.
203
+ If `onErrorStatus` is set to `true`, an `HTTPStatusError` will be thrown when the response status is outside the 200 range. You can access its status and body through this error object. The error message format is: `404 Not Found: (no response body)`.
204
204
 
205
205
  ### RedirectError
206
206
 
207
- If `redirect` is set to `"error"`, a `RedirectError` will be thrown when the response status is in the 300 range. The error message format is: `Received redirect response: 301`.
207
+ If `redirect` is set to `"error"`, a `RedirectError` will be thrown when the response status is in the 300 range. You can access its status through this error object. The error message format is: `301 Moved Permanently`.
208
208
 
209
209
  ### Others
210
210
 
@@ -274,29 +274,30 @@ const response = await fetchy("https://api.example.com/data", {
274
274
  ```ts
275
275
  import { fetchy, HTTPStatusError, RedirectError } from "@scirexs/fetchy";
276
276
 
277
- // Return null on error (default)
278
- const data = await fetchyb("https://api.example.com/data", "json");
279
- if (data === null) {
280
- console.log("Request failed");
281
- }
282
-
283
- // Throw on error
277
+ // Throw on error (default is same with `fetch`)
284
278
  try {
285
- const data = await fetchyb("https://api.example.com/data", "json", {
286
- throwError: true
287
- });
279
+ const response = await fetchy("https://api.example.com/data");
288
280
  } catch (error) {
289
281
  console.error("Request failed:", error);
290
282
  }
291
283
 
284
+ // Return null on error
285
+ const response = await fetchy("https://api.example.com/data", {
286
+ throwError: false,
287
+ });
288
+ if (response === null) {
289
+ console.log("Request failed");
290
+ }
291
+
292
292
  // Throw only on HTTP errors
293
293
  try {
294
- const data = await fetchyb("https://api.example.com/data", "json", {
295
- throwError: { onErrorStatus: true }
294
+ const response = await fetchy("https://api.example.com/data", {
295
+ throwError: { onError: false, onErrorStatus: true }
296
296
  });
297
297
  } catch (error) {
298
298
  if (error instanceof HTTPStatusError) {
299
- console.error("HTTP error:", error.message); // e.g., "404 Not Found"
299
+ // You can also use error.status and error.body.
300
+ console.error("HTTP error:", error.message); // e.g., "404 Not Found: (no response body)"
300
301
  }
301
302
  }
302
303
 
@@ -354,7 +355,6 @@ interface ApiResponse<T> {
354
355
  data: T;
355
356
  error?: string;
356
357
  }
357
-
358
358
  interface Todo {
359
359
  id: number;
360
360
  title: string;
@@ -366,11 +366,24 @@ const response = await fetchyb<ApiResponse<Todo>>(
366
366
  "json"
367
367
  );
368
368
 
369
- if (response?.success) {
369
+ if (response.success) {
370
370
  console.log(response.data.title); // Fully typed
371
371
  }
372
372
  ```
373
373
 
374
+ #### Restricting the Return Type
375
+
376
+ When setting the `throwError` property in `FetchyOptions`, the return type will include `null` even if you set it to `true` or `{ onError: true }`. To prevent this and ensure a non-nullable return type, add `as const` to the `throwError` property value:
377
+ ```ts
378
+ interface User {
379
+ id: number;
380
+ name: string;
381
+ }
382
+
383
+ const options = { timeout: 5, throwError: true as const }; // Add `as const`
384
+ const response = await fetchy("https://api.example.com/todos/1", "json", options); // `response` is User (not User | null)
385
+ ```
386
+
374
387
  ## License
375
388
 
376
389
  MIT
package/esm/main.js CHANGED
@@ -17,7 +17,7 @@ const DEFAULT = {
17
17
  };
18
18
  /*=============== Main Code =====================*/
19
19
  /**
20
- * Error thrown when HTTP response has a non-OK status code (4xx, 5xx).
20
+ * Error thrown when HTTP response has a non-OK status code (4xx, 5xx, ...).
21
21
  * Only thrown when throwError.onErrorStatus is set to true.
22
22
  *
23
23
  * @example
@@ -28,15 +28,28 @@ const DEFAULT = {
28
28
  * });
29
29
  * } catch (error) {
30
30
  * if (error instanceof HTTPStatusError) {
31
- * console.error("HTTP error:", error.message); // e.g., "404 Not Found"
31
+ * console.error("HTTP error:", error.message); // e.g., "403 Forbidden: {success:false}"
32
32
  * }
33
33
  * }
34
34
  * ```
35
35
  */
36
36
  class HTTPStatusError extends Error {
37
- constructor(msg) {
37
+ static #MAX_BODY_LEN = 80;
38
+ status;
39
+ body;
40
+ constructor(msg, status, body) {
38
41
  super(msg);
39
42
  this.name = "HTTPStatusError";
43
+ this.status = status;
44
+ this.body = body;
45
+ }
46
+ static async fromResponse(resp) {
47
+ const body = await resp.text();
48
+ const bodyMsg = body.length > this.#MAX_BODY_LEN
49
+ ? `${body.slice(0, this.#MAX_BODY_LEN)}... (more ${body.length - this.#MAX_BODY_LEN} chars)`
50
+ : body || "(no response body)";
51
+ const msg = `${resp.status} ${resp.statusText}: ${bodyMsg}`;
52
+ return new this(msg, resp.status, body);
40
53
  }
41
54
  }
42
55
  /**
@@ -56,9 +69,15 @@ class HTTPStatusError extends Error {
56
69
  * ```
57
70
  */
58
71
  class RedirectError extends Error {
59
- constructor(msg) {
72
+ status;
73
+ constructor(msg, status) {
60
74
  super(msg);
61
75
  this.name = "RedirectError";
76
+ this.status = status;
77
+ }
78
+ static fromResponse(resp) {
79
+ const msg = `${resp.status} ${resp.statusText}`.trim();
80
+ return new this(msg, resp.status);
62
81
  }
63
82
  }
64
83
  async function fetchyb(url, type = "auto", options) {
@@ -79,45 +98,13 @@ async function fetchyb(url, type = "auto", options) {
79
98
  return null;
80
99
  }
81
100
  }
82
- /**
83
- * Performs an HTTP request with enhanced features like timeout, retry, and automatic header management.
84
- * Returns the raw Response object or null on failure, unless throwError is configured.
85
- *
86
- * @param url - The URL to fetch. Can be a string, URL object, or Request object.
87
- * @param options - Configuration options for the request.
88
- * @returns Response object or null on failure.
89
- *
90
- * @example
91
- * ```ts
92
- * import { fetchy } from "@scirexs/fetchy";
93
- *
94
- * // Simple GET request
95
- * const response = await fetchy("https://api.example.com/data");
96
- * if (response?.ok) {
97
- * const data = await response.json();
98
- * }
99
- *
100
- * // POST request with JSON body
101
- * const response = await fetchy("https://api.example.com/create", {
102
- * body: { name: "John", age: 30 },
103
- * bearerToken: "your-token"
104
- * });
105
- *
106
- * // With retry and timeout
107
- * const response = await fetchy("https://api.example.com/data", {
108
- * timeout: 10,
109
- * retry: { max: 5, interval: 2 },
110
- * throwError: { onErrorStatus: true }
111
- * });
112
- * ```
113
- */
114
101
  async function fetchy(url, options) {
115
102
  try {
116
103
  const opts = _getOptions(options);
117
104
  const init = _getRequestInit(options, opts.abort);
118
105
  const resp = await _fetchWithRetry(url, init, opts);
119
106
  if (!resp.ok && opts.onErrorStatus)
120
- throw new HTTPStatusError(`${resp.status} ${resp.statusText}`.trim());
107
+ throw await HTTPStatusError.fromResponse(resp);
121
108
  return resp;
122
109
  }
123
110
  catch (e) {
@@ -323,7 +310,7 @@ async function _shouldNotRetry(count, opts, resp) {
323
310
  return true;
324
311
  if (opts.userRedirect === "error") {
325
312
  opts.max = 0;
326
- throw new RedirectError(`Received redirect response: ${resp.status}`);
313
+ throw RedirectError.fromResponse(resp);
327
314
  }
328
315
  }
329
316
  const interval = _getNextInterval(count, opts, resp);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@scirexs/fetchy",
3
- "version": "0.2.0",
3
+ "version": "0.2.2",
4
4
  "description": "A lightweight fetch wrapper.",
5
5
  "keywords": [
6
6
  "fetch",
package/types/main.d.ts CHANGED
@@ -27,7 +27,18 @@ interface Options {
27
27
  userRedirect: "follow" | "error" | "manual";
28
28
  }
29
29
  /**
30
- * Error thrown when HTTP response has a non-OK status code (4xx, 5xx).
30
+ * Infer helper type for response type overload.
31
+ * @internal
32
+ */
33
+ type ThrowError = FetchyOptions & Partial<{
34
+ throwError: true;
35
+ }> | FetchyOptions & Partial<{
36
+ throwError: {
37
+ onError: true;
38
+ };
39
+ }>;
40
+ /**
41
+ * Error thrown when HTTP response has a non-OK status code (4xx, 5xx, ...).
31
42
  * Only thrown when throwError.onErrorStatus is set to true.
32
43
  *
33
44
  * @example
@@ -38,13 +49,17 @@ interface Options {
38
49
  * });
39
50
  * } catch (error) {
40
51
  * if (error instanceof HTTPStatusError) {
41
- * console.error("HTTP error:", error.message); // e.g., "404 Not Found"
52
+ * console.error("HTTP error:", error.message); // e.g., "403 Forbidden: {success:false}"
42
53
  * }
43
54
  * }
44
55
  * ```
45
56
  */
46
57
  declare class HTTPStatusError extends Error {
47
- constructor(msg: string);
58
+ #private;
59
+ status: number;
60
+ body: string;
61
+ constructor(msg: string, status: number, body: string);
62
+ static fromResponse(resp: Response): Promise<InstanceType<typeof this>>;
48
63
  }
49
64
  /**
50
65
  * Error thrown when a redirect response is received and redirect option is set to "error".
@@ -63,7 +78,9 @@ declare class HTTPStatusError extends Error {
63
78
  * ```
64
79
  */
65
80
  declare class RedirectError extends Error {
66
- constructor(msg: string);
81
+ status: number;
82
+ constructor(msg: string, status: number);
83
+ static fromResponse(resp: Response): InstanceType<typeof this>;
67
84
  }
68
85
  /**
69
86
  * Performs an HTTP request and automatically parses the response body based on Content-Type or specified type.
@@ -92,9 +109,17 @@ declare class RedirectError extends Error {
92
109
  * const bytes = await fetchyb("https://example.com/image.png", "bytes");
93
110
  * ```
94
111
  */
112
+ declare function fetchyb(url: Input, type: "text", options?: undefined): Promise<string>;
113
+ declare function fetchyb(url: Input, type: "text", options: FetchyOptions & ThrowError): Promise<string>;
95
114
  declare function fetchyb(url: Input, type: "text", options?: FetchyOptions): Promise<string | null>;
115
+ declare function fetchyb<T>(url: Input, type: "json", options?: undefined): Promise<T>;
116
+ declare function fetchyb<T>(url: Input, type: "json", options: FetchyOptions & ThrowError): Promise<T>;
96
117
  declare function fetchyb<T>(url: Input, type: "json", options?: FetchyOptions): Promise<T | null>;
118
+ declare function fetchyb(url: Input, type: "bytes", options?: undefined): Promise<Uint8Array>;
119
+ declare function fetchyb(url: Input, type: "bytes", options: FetchyOptions & ThrowError): Promise<Uint8Array>;
97
120
  declare function fetchyb(url: Input, type: "bytes", options?: FetchyOptions): Promise<Uint8Array | null>;
121
+ declare function fetchyb<T>(url: Input, type?: "auto", options?: undefined): Promise<T | string | Uint8Array>;
122
+ declare function fetchyb<T>(url: Input, type?: "auto", options?: FetchyOptions & ThrowError): Promise<T | string | Uint8Array>;
98
123
  declare function fetchyb<T>(url: Input, type?: "auto", options?: FetchyOptions): Promise<T | string | Uint8Array | null>;
99
124
  /**
100
125
  * Performs an HTTP request with enhanced features like timeout, retry, and automatic header management.
@@ -128,6 +153,8 @@ declare function fetchyb<T>(url: Input, type?: "auto", options?: FetchyOptions):
128
153
  * });
129
154
  * ```
130
155
  */
156
+ declare function fetchy(url: Input, options?: undefined): Promise<Response>;
157
+ declare function fetchy(url: Input, options: FetchyOptions & ThrowError): Promise<Response>;
131
158
  declare function fetchy(url: Input, options?: FetchyOptions): Promise<Response | null>;
132
159
  /**
133
160
  * Checks if a value is a string.
@@ -1 +1 @@
1
- {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}