@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 +32 -19
- package/esm/main.js +25 -38
- package/package.json +1 -1
- package/types/main.d.ts +31 -4
- package/types/main.d.ts.map +1 -1
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: `
|
|
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
|
-
//
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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., "
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
313
|
+
throw RedirectError.fromResponse(resp);
|
|
327
314
|
}
|
|
328
315
|
}
|
|
329
316
|
const interval = _getNextInterval(count, opts, resp);
|
package/package.json
CHANGED
package/types/main.d.ts
CHANGED
|
@@ -27,7 +27,18 @@ interface Options {
|
|
|
27
27
|
userRedirect: "follow" | "error" | "manual";
|
|
28
28
|
}
|
|
29
29
|
/**
|
|
30
|
-
*
|
|
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., "
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
package/types/main.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,QAAQ,EACR,eAAe,EACf,WAAW,EACX,gBAAgB,EAChB,WAAW,EACX,eAAe,EACf,eAAe,EACf,uBAAuB,EACvB,OAAO,EACP,aAAa,EACb,SAAS,EACT,cAAc,EACd,SAAS,EACT,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,WAAW,EACX,KAAK,EACL,OAAO,EACP,MAAM,EACN,OAAO,EACP,eAAe,EACf,aAAa,GACd,CAAC;AAEF,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAGxF;;;GAGG;AACH,QAAA,MAAM,OAAO,EAAE,OAUL,CAAC;AAGX;;;GAGG;AACH,KAAK,KAAK,GAAG,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC;AAMpC;;;GAGG;AACH,UAAU,OAAO;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,EAAE,OAAO,CAAC;IACvB,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,YAAY,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;CAC7C;
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
|