tanstack-fetch 1.0.1 → 1.0.3
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 +147 -7
- package/dist/{client.type-BE-mgD4y.d.cts → client.type-BBYqVrTM.d.cts} +41 -1
- package/dist/{client.type-D1zw5tFf.d.ts → client.type-Btgj3NQn.d.ts} +41 -1
- package/dist/index.cjs +2 -2
- package/dist/index.d.cts +6 -3
- package/dist/index.d.ts +6 -3
- package/dist/index.js +2 -2
- package/dist/sse.cjs +4 -4
- package/dist/sse.d.cts +1 -1
- package/dist/sse.d.ts +1 -1
- package/dist/sse.js +4 -4
- package/package.json +29 -5
package/README.md
CHANGED
|
@@ -1,21 +1,63 @@
|
|
|
1
1
|
# tanstack-fetch
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
**TypeScript HTTP / fetch client for TanStack Query (React Query)** — built for Next.js SSR, auth interceptors, SSE streams, and multipart file upload. A tiny (~3.5KB gzip), tree-shakeable alternative to axios when your `queryFn` / `mutationFn` just needs a typed `fetch` wrapper.
|
|
4
|
+
|
|
5
|
+
[](https://www.npmjs.com/package/tanstack-fetch)
|
|
6
|
+
[](https://www.npmjs.com/package/tanstack-fetch)
|
|
7
|
+
[](https://bundlephobia.com/package/tanstack-fetch)
|
|
8
|
+
[](./LICENSE)
|
|
9
|
+
[](https://nodejs.org)
|
|
10
|
+
[](https://www.typescriptlang.org/)
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
npm install tanstack-fetch
|
|
14
|
+
# or
|
|
15
|
+
pnpm add tanstack-fetch
|
|
16
|
+
# or
|
|
17
|
+
yarn add tanstack-fetch
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Node 18+ (native `fetch`). Works in the browser, Node, and the Edge runtime.
|
|
21
|
+
|
|
22
|
+
> **Not an official TanStack package** — designed to match the `@tanstack/react-query` mental model (`throw` on HTTP errors, pass `signal`, typed data).
|
|
23
|
+
|
|
24
|
+
### Who is this for?
|
|
25
|
+
|
|
26
|
+
- Apps using **TanStack Query / React Query** that need a shared HTTP client for `queryFn` and `mutationFn`
|
|
27
|
+
- **Next.js** (App Router) SSR that must forward cookies / auth headers to your API
|
|
28
|
+
- Teams wanting a **lightweight axios / ky / ofetch alternative** with interceptors, retries, SSE, and upload progress — without a large HTTP stack
|
|
29
|
+
|
|
30
|
+
### Features at a glance
|
|
31
|
+
|
|
32
|
+
- Typed `get` / `post` / `put` / `patch` / `delete` / `upload` → `Promise<T>`
|
|
33
|
+
- Throws `FetchError` by default (TanStack Query–friendly); optional `FetchResult` union
|
|
34
|
+
- `AbortSignal` + timeout, Bearer auth, 401 / 403 / 404 / 5xx handlers
|
|
35
|
+
- Named interceptors (retry, short-circuit mocks, per-request eject)
|
|
36
|
+
- SSR cookie / header forwarding (`ssr-forward` plugin)
|
|
37
|
+
- Optional **SSE** over `fetch` streams (`tanstack-fetch/sse`)
|
|
38
|
+
- Multipart **file upload** + `onUploadProgress` (browser)
|
|
39
|
+
- Optional React `FetchProvider` / `useFetch` / `useSse`
|
|
40
|
+
- OpenAPI → TypeScript client CLI
|
|
4
41
|
|
|
5
42
|
| Import | What you get | Typical gzip |
|
|
6
43
|
| --- | --- | --- |
|
|
7
|
-
| `tanstack-fetch` | HTTP only (`get/post/…`) | **~3.5KB** |
|
|
44
|
+
| `tanstack-fetch` | HTTP only (`get/post/upload/…`) | **~3.5KB** |
|
|
8
45
|
| `tanstack-fetch/sse` | + `api.sse()` | **~4.7KB** |
|
|
9
46
|
| `tanstack-fetch/plugins` | plugin factories | **~0.9KB** |
|
|
10
47
|
| `tanstack-fetch/react` | `FetchProvider` / hooks (peer: core) | **~1KB** |
|
|
11
48
|
|
|
12
|
-
|
|
13
|
-
npm install tanstack-fetch
|
|
14
|
-
```
|
|
49
|
+
### Compared to axios, ky, ofetch
|
|
15
50
|
|
|
16
|
-
|
|
51
|
+
| Need | `tanstack-fetch` |
|
|
52
|
+
| --- | --- |
|
|
53
|
+
| Drop into TanStack Query `queryFn` | Yes — returns data, throws `FetchError`, takes `signal` |
|
|
54
|
+
| Next.js SSR cookie forwarding | Built-in `ssr-forward` plugin |
|
|
55
|
+
| Interceptors without axios weight | Named, ordered, ejectable plugins |
|
|
56
|
+
| SSE with Authorization headers | `tanstack-fetch/sse` (fetch streams, not `EventSource`) |
|
|
57
|
+
| File upload + progress | `api.upload()` + `onUploadProgress` |
|
|
58
|
+
| Bundle size | ~3.5KB gzip (HTTP core) |
|
|
17
59
|
|
|
18
|
-
|
|
60
|
+
Search terms this package targets: *fetch client for tanstack query*, *react query http client*, *next.js ssr fetch cookies*, *axios alternative typescript*, *openapi fetch codegen*.
|
|
19
61
|
|
|
20
62
|
---
|
|
21
63
|
|
|
@@ -474,6 +516,87 @@ await api.request<User>('GET', '/users/:id', { params: { id: '1' } })
|
|
|
474
516
|
|
|
475
517
|
---
|
|
476
518
|
|
|
519
|
+
## Upload
|
|
520
|
+
|
|
521
|
+
`FormData` / `Blob` / `File` are sent as-is (no JSON, no forced `Content-Type` — the boundary stays correct).
|
|
522
|
+
|
|
523
|
+
The call still returns the **typed response body** from the server (same as `post`), not a special upload envelope.
|
|
524
|
+
|
|
525
|
+
### `api.upload()` — file + fields + progress
|
|
526
|
+
|
|
527
|
+
```ts
|
|
528
|
+
type UploadResponse = { id: string; url: string }
|
|
529
|
+
|
|
530
|
+
const file = input.files[0]
|
|
531
|
+
|
|
532
|
+
const uploaded = await api.upload<UploadResponse>('/files', {
|
|
533
|
+
file,
|
|
534
|
+
fieldName: 'avatar', // default: 'file'
|
|
535
|
+
fields: { folder: 'avatars', public: true },
|
|
536
|
+
onUploadProgress: ({ loaded, total, progress }) => {
|
|
537
|
+
// progress is 0–1 when total is known (browser / XHR)
|
|
538
|
+
console.log(loaded, total, progress)
|
|
539
|
+
},
|
|
540
|
+
})
|
|
541
|
+
|
|
542
|
+
uploaded.url
|
|
543
|
+
```
|
|
544
|
+
|
|
545
|
+
Multiple files or raw `FormData`:
|
|
546
|
+
|
|
547
|
+
```ts
|
|
548
|
+
await api.upload('/docs', {
|
|
549
|
+
method: 'PUT',
|
|
550
|
+
files: [fileA, fileB],
|
|
551
|
+
fieldName: 'docs',
|
|
552
|
+
})
|
|
553
|
+
|
|
554
|
+
await api.upload<UploadResponse>('/files', {
|
|
555
|
+
body: createFormData({ file, note: 'cv' }),
|
|
556
|
+
})
|
|
557
|
+
```
|
|
558
|
+
|
|
559
|
+
### `createFormData` helper
|
|
560
|
+
|
|
561
|
+
```ts
|
|
562
|
+
import { createFetch, createFormData } from 'tanstack-fetch'
|
|
563
|
+
|
|
564
|
+
const api = createFetch({ baseUrl: 'https://api.example.com' })
|
|
565
|
+
|
|
566
|
+
const body = createFormData({
|
|
567
|
+
title: 'Report',
|
|
568
|
+
tags: ['a', 'b'], // repeated field
|
|
569
|
+
file,
|
|
570
|
+
})
|
|
571
|
+
|
|
572
|
+
await api.post<UploadResponse>('/files', {
|
|
573
|
+
body,
|
|
574
|
+
onUploadProgress: ({ progress }) => console.log(progress),
|
|
575
|
+
})
|
|
576
|
+
```
|
|
577
|
+
|
|
578
|
+
| Option | Notes |
|
|
579
|
+
| --- | --- |
|
|
580
|
+
| `file` / `files` | Appended under `fieldName` (default `"file"`) |
|
|
581
|
+
| `fields` | Extra multipart values (string / number / boolean / `Blob` / arrays) |
|
|
582
|
+
| `body` | Pre-built `FormData` / `Blob` / … |
|
|
583
|
+
| `method` | `POST` (default), `PUT`, or `PATCH` |
|
|
584
|
+
| `onUploadProgress` | Browser-only — uses XHR under the hood (`fetch` has no upload progress). No-ops on runtimes without `XMLHttpRequest` (falls back to `fetch`) |
|
|
585
|
+
|
|
586
|
+
Works with TanStack Query mutations the same way as `post`:
|
|
587
|
+
|
|
588
|
+
```ts
|
|
589
|
+
useMutation({
|
|
590
|
+
mutationFn: (file: File) =>
|
|
591
|
+
api.upload<UploadResponse>('/files', {
|
|
592
|
+
file,
|
|
593
|
+
onUploadProgress: ({ progress }) => setProgress(progress ?? 0),
|
|
594
|
+
}),
|
|
595
|
+
})
|
|
596
|
+
```
|
|
597
|
+
|
|
598
|
+
---
|
|
599
|
+
|
|
477
600
|
## `FetchError`
|
|
478
601
|
|
|
479
602
|
```ts
|
|
@@ -840,6 +963,7 @@ npm run example
|
|
|
840
963
|
```ts
|
|
841
964
|
import {
|
|
842
965
|
createFetch,
|
|
966
|
+
createFormData,
|
|
843
967
|
createFetchError,
|
|
844
968
|
isFetchError,
|
|
845
969
|
isAbortError,
|
|
@@ -855,10 +979,26 @@ import {
|
|
|
855
979
|
| Method | Description |
|
|
856
980
|
| --- | --- |
|
|
857
981
|
| `get/post/put/patch/delete` | Typed HTTP → `Promise<T>` |
|
|
982
|
+
| `upload(path, opts?)` | Multipart / file upload → `Promise<T>` |
|
|
858
983
|
| `request(method, path, opts?)` | Generic verb |
|
|
859
984
|
| `sse(path, { onMessage })` | Simple stream — returns `{ close }` |
|
|
860
985
|
| `sse(path)` | Advanced — `for await` iterable |
|
|
861
986
|
| `use` / `eject` | Interceptors |
|
|
987
|
+
| `createFormData(fields)` | Build `FormData` from a plain object |
|
|
988
|
+
|
|
989
|
+
## FAQ
|
|
990
|
+
|
|
991
|
+
**Is tanstack-fetch an official TanStack package?**
|
|
992
|
+
No. It is an independent MIT library shaped for `@tanstack/react-query`.
|
|
993
|
+
|
|
994
|
+
**Can I use it without React Query?**
|
|
995
|
+
Yes. It is a plain TypeScript `fetch` client; React Query is optional.
|
|
996
|
+
|
|
997
|
+
**Does it work with Next.js App Router SSR?**
|
|
998
|
+
Yes. Use `source: 'ssr'`, the `ssr-forward` plugin, and `incoming` cookies/headers.
|
|
999
|
+
|
|
1000
|
+
**How do I upload files?**
|
|
1001
|
+
Use `api.upload({ file, fields, onUploadProgress })` or `api.post` with `createFormData(...)`.
|
|
862
1002
|
|
|
863
1003
|
## License
|
|
864
1004
|
|
|
@@ -20,6 +20,33 @@ type SseHandlers<T = unknown> = {
|
|
|
20
20
|
onClose?: () => void;
|
|
21
21
|
};
|
|
22
22
|
|
|
23
|
+
type UploadProgressEvent = {
|
|
24
|
+
loaded: number;
|
|
25
|
+
total?: number;
|
|
26
|
+
/** `loaded / total` when `total` is known (0–1). */
|
|
27
|
+
progress?: number;
|
|
28
|
+
};
|
|
29
|
+
type UploadProgressHandler = (event: UploadProgressEvent) => void;
|
|
30
|
+
type FormDataPrimitive = string | number | boolean | Blob;
|
|
31
|
+
type FormDataFieldValue = FormDataPrimitive | null | undefined | FormDataPrimitive[];
|
|
32
|
+
type FormDataFields = Record<string, FormDataFieldValue>;
|
|
33
|
+
type UploadBody = FormData | Blob | ArrayBuffer | URLSearchParams | string;
|
|
34
|
+
type UploadOptions = {
|
|
35
|
+
/** Pre-built body (`FormData`, `Blob`, `File`, …). */
|
|
36
|
+
body?: UploadBody;
|
|
37
|
+
/** Single file — appended as `fieldName` (default `"file"`). */
|
|
38
|
+
file?: Blob;
|
|
39
|
+
/** Multiple files — same field name repeated. */
|
|
40
|
+
files?: Blob[];
|
|
41
|
+
/** Extra multipart fields (strings, numbers, Blobs). */
|
|
42
|
+
fields?: FormDataFields;
|
|
43
|
+
/** Form field name for `file` / `files`. Default `"file"`. */
|
|
44
|
+
fieldName?: string;
|
|
45
|
+
/** HTTP method. Default `POST`. */
|
|
46
|
+
method?: 'POST' | 'PUT' | 'PATCH';
|
|
47
|
+
onUploadProgress?: UploadProgressHandler;
|
|
48
|
+
};
|
|
49
|
+
|
|
23
50
|
type RequestInterceptorConfig = {
|
|
24
51
|
use?: HttpInterceptor[];
|
|
25
52
|
eject?: string[];
|
|
@@ -36,6 +63,8 @@ type RequestOptions = {
|
|
|
36
63
|
parseAs?: 'json' | 'text' | 'blob';
|
|
37
64
|
operation?: string;
|
|
38
65
|
interceptors?: RequestInterceptorConfig;
|
|
66
|
+
/** Browser-only — uses XHR under the hood when set (fetch has no upload progress). */
|
|
67
|
+
onUploadProgress?: UploadProgressHandler;
|
|
39
68
|
};
|
|
40
69
|
type CreateFetchOptions = {
|
|
41
70
|
baseUrl?: string;
|
|
@@ -79,6 +108,15 @@ type FetchRequest = {
|
|
|
79
108
|
<T>(method: HttpMethod, path: string, options?: ThrowingOptions): Promise<T>;
|
|
80
109
|
<T, E = FetchErrorInfo>(method: HttpMethod, path: string, options: ResultOptions): Promise<FetchResult<T, E>>;
|
|
81
110
|
};
|
|
111
|
+
type UploadCallOptions = Omit<RequestOptions, 'body' | 'onUploadProgress'> & UploadOptions;
|
|
112
|
+
type UploadMethod = {
|
|
113
|
+
<T>(path: string, options?: UploadCallOptions & {
|
|
114
|
+
throwOnError?: true;
|
|
115
|
+
}): Promise<T>;
|
|
116
|
+
<T, E = FetchErrorInfo>(path: string, options: UploadCallOptions & {
|
|
117
|
+
throwOnError: false;
|
|
118
|
+
}): Promise<FetchResult<T, E>>;
|
|
119
|
+
};
|
|
82
120
|
type SseCallOptions<T = unknown> = RequestOptions & SseHandlers<T> & {
|
|
83
121
|
lastEventId?: string;
|
|
84
122
|
};
|
|
@@ -95,6 +133,8 @@ type FetchClient = {
|
|
|
95
133
|
put: FetchMethod;
|
|
96
134
|
patch: FetchMethod;
|
|
97
135
|
delete: FetchMethod;
|
|
136
|
+
/** Multipart / file upload — returns the same typed response body as `post`. */
|
|
137
|
+
upload: UploadMethod;
|
|
98
138
|
/**
|
|
99
139
|
* Simple: pass `onMessage` / `onEvent` → returns `{ close }`.
|
|
100
140
|
* Advanced: no handlers → `AsyncIterable` for `for await`.
|
|
@@ -113,4 +153,4 @@ type CreateClientOptions = CreateFetchOptions;
|
|
|
113
153
|
/** @deprecated Use FetchClient */
|
|
114
154
|
type HttpClient = FetchClient;
|
|
115
155
|
|
|
116
|
-
export type { CreateFetchOptions as C, FetchClient as F, HttpClient as H, RequestOptions as R, SseCallOptions as S,
|
|
156
|
+
export type { CreateFetchOptions as C, FetchClient as F, HttpClient as H, RequestOptions as R, SseCallOptions as S, UploadCallOptions as U, FormDataFields as a, CreateClientOptions as b, FormDataFieldValue as c, SseEvent as d, SseHandlers as e, SseSubscription as f, UploadOptions as g, UploadProgressEvent as h, UploadProgressHandler as i };
|
|
@@ -20,6 +20,33 @@ type SseHandlers<T = unknown> = {
|
|
|
20
20
|
onClose?: () => void;
|
|
21
21
|
};
|
|
22
22
|
|
|
23
|
+
type UploadProgressEvent = {
|
|
24
|
+
loaded: number;
|
|
25
|
+
total?: number;
|
|
26
|
+
/** `loaded / total` when `total` is known (0–1). */
|
|
27
|
+
progress?: number;
|
|
28
|
+
};
|
|
29
|
+
type UploadProgressHandler = (event: UploadProgressEvent) => void;
|
|
30
|
+
type FormDataPrimitive = string | number | boolean | Blob;
|
|
31
|
+
type FormDataFieldValue = FormDataPrimitive | null | undefined | FormDataPrimitive[];
|
|
32
|
+
type FormDataFields = Record<string, FormDataFieldValue>;
|
|
33
|
+
type UploadBody = FormData | Blob | ArrayBuffer | URLSearchParams | string;
|
|
34
|
+
type UploadOptions = {
|
|
35
|
+
/** Pre-built body (`FormData`, `Blob`, `File`, …). */
|
|
36
|
+
body?: UploadBody;
|
|
37
|
+
/** Single file — appended as `fieldName` (default `"file"`). */
|
|
38
|
+
file?: Blob;
|
|
39
|
+
/** Multiple files — same field name repeated. */
|
|
40
|
+
files?: Blob[];
|
|
41
|
+
/** Extra multipart fields (strings, numbers, Blobs). */
|
|
42
|
+
fields?: FormDataFields;
|
|
43
|
+
/** Form field name for `file` / `files`. Default `"file"`. */
|
|
44
|
+
fieldName?: string;
|
|
45
|
+
/** HTTP method. Default `POST`. */
|
|
46
|
+
method?: 'POST' | 'PUT' | 'PATCH';
|
|
47
|
+
onUploadProgress?: UploadProgressHandler;
|
|
48
|
+
};
|
|
49
|
+
|
|
23
50
|
type RequestInterceptorConfig = {
|
|
24
51
|
use?: HttpInterceptor[];
|
|
25
52
|
eject?: string[];
|
|
@@ -36,6 +63,8 @@ type RequestOptions = {
|
|
|
36
63
|
parseAs?: 'json' | 'text' | 'blob';
|
|
37
64
|
operation?: string;
|
|
38
65
|
interceptors?: RequestInterceptorConfig;
|
|
66
|
+
/** Browser-only — uses XHR under the hood when set (fetch has no upload progress). */
|
|
67
|
+
onUploadProgress?: UploadProgressHandler;
|
|
39
68
|
};
|
|
40
69
|
type CreateFetchOptions = {
|
|
41
70
|
baseUrl?: string;
|
|
@@ -79,6 +108,15 @@ type FetchRequest = {
|
|
|
79
108
|
<T>(method: HttpMethod, path: string, options?: ThrowingOptions): Promise<T>;
|
|
80
109
|
<T, E = FetchErrorInfo>(method: HttpMethod, path: string, options: ResultOptions): Promise<FetchResult<T, E>>;
|
|
81
110
|
};
|
|
111
|
+
type UploadCallOptions = Omit<RequestOptions, 'body' | 'onUploadProgress'> & UploadOptions;
|
|
112
|
+
type UploadMethod = {
|
|
113
|
+
<T>(path: string, options?: UploadCallOptions & {
|
|
114
|
+
throwOnError?: true;
|
|
115
|
+
}): Promise<T>;
|
|
116
|
+
<T, E = FetchErrorInfo>(path: string, options: UploadCallOptions & {
|
|
117
|
+
throwOnError: false;
|
|
118
|
+
}): Promise<FetchResult<T, E>>;
|
|
119
|
+
};
|
|
82
120
|
type SseCallOptions<T = unknown> = RequestOptions & SseHandlers<T> & {
|
|
83
121
|
lastEventId?: string;
|
|
84
122
|
};
|
|
@@ -95,6 +133,8 @@ type FetchClient = {
|
|
|
95
133
|
put: FetchMethod;
|
|
96
134
|
patch: FetchMethod;
|
|
97
135
|
delete: FetchMethod;
|
|
136
|
+
/** Multipart / file upload — returns the same typed response body as `post`. */
|
|
137
|
+
upload: UploadMethod;
|
|
98
138
|
/**
|
|
99
139
|
* Simple: pass `onMessage` / `onEvent` → returns `{ close }`.
|
|
100
140
|
* Advanced: no handlers → `AsyncIterable` for `for await`.
|
|
@@ -113,4 +153,4 @@ type CreateClientOptions = CreateFetchOptions;
|
|
|
113
153
|
/** @deprecated Use FetchClient */
|
|
114
154
|
type HttpClient = FetchClient;
|
|
115
155
|
|
|
116
|
-
export type { CreateFetchOptions as C, FetchClient as F, HttpClient as H, RequestOptions as R, SseCallOptions as S,
|
|
156
|
+
export type { CreateFetchOptions as C, FetchClient as F, HttpClient as H, RequestOptions as R, SseCallOptions as S, UploadCallOptions as U, FormDataFields as a, CreateClientOptions as b, FormDataFieldValue as c, SseEvent as d, SseHandlers as e, SseSubscription as f, UploadOptions as g, UploadProgressEvent as h, UploadProgressHandler as i };
|
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
'use strict';var E=e=>({name:"auth",order:15,onRequest:async t=>{let r=await e.getToken();if(!r)return {action:"continue",context:t};let n=e.header??"authorization",o=e.scheme===void 0?"Bearer":e.scheme,c=o?`${o} ${r}`:r;return t.request.headers.set(n,c),{action:"continue",context:t}}});var z=(e,t)=>{let r=t[e];return r||(e>=500&&e<600&&t["5xx"]?t["5xx"]:e>=400&&e<500&&t["4xx"]?t["4xx"]:t.default)},I=e=>({name:"on-status",order:95,onResponseError:async t=>{let r=t.error?.status??t.response?.status;if(r===void 0||!t.error)return {action:"continue",context:t};let n=z(r,e);if(!n)return {action:"continue",context:t};let o=await n({status:r,error:t.error,context:t});return o?.action==="retry"?{action:"retry",delayMs:o.delayMs}:{action:"continue",context:t}}});var $=e=>{let t={...e.onStatus??{}};return e.onUnauthorized&&t[401]===void 0&&(t[401]=e.onUnauthorized),e.onForbidden&&t[403]===void 0&&(t[403]=e.onForbidden),e.onNotFound&&t[404]===void 0&&(t[404]=e.onNotFound),e.onServerError&&t["5xx"]===void 0&&t[500]===void 0&&(t["5xx"]=e.onServerError),Object.entries(t).some(([,n])=>!!n)?t:void 0},Q=e=>{if(e.auth)return e.auth;if(e.getToken)return {getToken:e.getToken}},R=e=>{let t=[],r=Q(e);r&&t.push(E(r));let n=$(e);return n&&t.push(I(n)),t};var H=new Set(["GET","HEAD","OPTIONS"]),g=new Set([502,503,504]);var F=()=>({name:"retry-idempotent",order:80,onResponseError:e=>H.has(e.request.method)&&e.meta.attempt<e.meta.maxRetries&&!!(e.error&&g.has(e.error.status))?{action:"retry",delayMs:200*(e.meta.attempt+1)}:{action:"continue",context:e}});var T=()=>({name:"sse-resume",order:20,onSseEvent:e=>e.event.event==="ping"||e.event.event==="heartbeat"?{action:"drop"}:{action:"continue",context:e},onSseReconnect:e=>(e.meta.lastEventId&&e.request.headers.set("last-event-id",e.meta.lastEventId),{action:"continue",context:e})});var O=()=>({name:"ssr-forward",order:10,onRequest:e=>e.meta.source==="browser"?{action:"skip"}:(e.incoming?.cookie&&e.request.headers.set("cookie",e.incoming.cookie),e.incoming?.authorization&&e.request.headers.set("authorization",e.incoming.authorization),e.incoming?.requestId&&e.request.headers.set("x-request-id",e.incoming.requestId),{action:"continue",context:e})});var w=()=>({name:"trace",order:0,onRequest:e=>{let t=e.incoming?.requestId??globalThis.crypto.randomUUID();return e.request.headers.set("x-request-id",t),e.meta.requestId=t,{action:"continue",context:e}}});var S={trace:w,"ssr-forward":O,"retry-idempotent":F,"sse-resume":T};var d=e=>{let t=e.ok?{status:e.status,code:"UNKNOWN",message:"Request failed",body:e.data}:e.error,r=new Error(t.message);return Object.defineProperties(r,{name:{value:"FetchError"},status:{value:t.status},code:{value:t.code},body:{value:t.body},headers:{value:e.headers},result:{value:e.ok?{ok:false,status:t.status,error:t,headers:e.headers}:e}}),r},J=e=>!!(e&&typeof e=="object"&&e.name==="FetchError"&&"status"in e&&"code"in e),h=e=>e instanceof DOMException&&e.name==="AbortError"||e instanceof Error&&e.name==="AbortError";var G=(e,t)=>{let r=e.match;return r?!(r.operation&&r.operation!==t.meta.operation||r.method&&r.method!==t.request.method||r.pathPrefix&&!t.request.url.pathname.startsWith(r.pathPrefix)||r.status!==void 0&&t.response?.status!==r.status):true},q=(e,t)=>{let r=new Set(t?.eject??[]);return [...e,...t?.use??[]].filter(o=>!r.has(o.name)).sort((o,c)=>(o.order??100)-(c.order??100))},f=async(e,t,r)=>{let n=r;for(let o of e){if(!G(o,n))continue;let c=t(o);if(!c)continue;let s=await c(n)??{action:"continue",context:n};if(s.action!=="skip"){if(s.action==="drop")return {type:"drop"};if(s.action==="retry")return {type:"retry",delayMs:s.delayMs};if(s.action==="short-circuit")return {type:"short-circuit",result:s.result};n=s.context??n;}}return {type:"continue",context:n}};var K=e=>!!(e&&e.includes("json")),b=async(e,t)=>{if(e.status===204)return null;if(t==="blob")return e.blob();if(t==="text")return e.text();let r=e.headers.get("content-type");if(t==="json"||K(r)){let n=await e.text();return n?JSON.parse(n):null}return e.text()},x=(e,t)=>{if(e!=null)return typeof e=="string"||e instanceof FormData||e instanceof Blob||e instanceof URLSearchParams||e instanceof ArrayBuffer?e:(t.has("content-type")||t.set("content-type","application/json"),JSON.stringify(e))};var l=(e,t)=>{let r=t&&typeof t=="object"?t:void 0,n=typeof r?.code=="string"?r.code:"HTTP_ERROR",o=typeof r?.message=="string"?r.message:`Request failed with status ${e}`;return {status:e,code:n,message:o,body:t}},C=(e,t,r)=>({ok:true,status:e,data:t,headers:r}),y=(e,t,r)=>({ok:false,status:e,error:t,headers:r}),k=e=>{if(e.ok)return e.data;throw d(e)},X=async e=>k(await e);var A=async e=>{let{context:t,interceptors:r,fetchImpl:n,client:o,requestOptions:c}=e;try{let s=await n(t.request.url,{method:t.request.method,headers:t.request.headers,body:x(t.request.body,t.request.headers),signal:t.request.signal,credentials:o.credentials});return Y({interceptors:r,context:t,response:s,requestOptions:c})}catch(s){if(h(s))throw s;t.error=l(0,{code:"NETWORK_ERROR",message:s instanceof Error?s.message:"Network error"});let a=await f(r,u=>u.onRequestError,t);if(a.type==="retry")return {kind:"retry",delayMs:a.delayMs};if(a.type==="short-circuit")return {kind:"result",result:a.result};throw d(y(0,t.error,new Headers))}},Y=async e=>{let{interceptors:t,response:r,requestOptions:n}=e,o={...e.context,response:r,data:await b(r,n?.parseAs)},c=r.ok?i=>i.onResponse:i=>i.onResponseError;r.ok||(o.error=l(r.status,o.data));let s=await f(t,c,o);if(s.type==="retry")return {kind:"retry",delayMs:s.delayMs};if(s.type==="short-circuit")return {kind:"result",result:s.result};let a=s.type==="continue"?s.context:o;return {kind:"result",result:r.ok?C(r.status,a.data,r.headers):y(r.status,a.error??l(r.status,a.data),r.headers)}};var Z=(e,t)=>e.replace(/:([A-Za-z0-9_]+)/g,(r,n)=>{let o=t?.[n];if(o===void 0)throw new Error(`tanstack-fetch: missing path param "${n}"`);return encodeURIComponent(String(o))}),V=(e,t)=>{t&&Object.entries(t).forEach(([r,n])=>{n!=null&&e.searchParams.set(r,String(n));});},P=(e,t)=>{if(!(t==="browser"||!e)&&!/^https?:\/\//i.test(e))throw new Error("tanstack-fetch: set an absolute baseUrl for SSR and Edge runtimes")},M=(e,t,r,n)=>{let o=Z(t.replace(/\{([A-Za-z0-9_]+)\}/g,":$1"),r),c=/^https?:\/\//i.test(o)?o:`${(e??"").replace(/\/$/,"")}/${o.replace(/^\//,"")}`,s=new URL(c);return V(s,n),s};var ee=e=>new Headers(e),v=(...e)=>{let t=new Headers;return e.forEach(r=>{r&&new Headers(r).forEach((n,o)=>{t.set(o,n);});}),t},U=async e=>{if(!e)return new Headers;let t=typeof e=="function"?await e():e;return ee(t)};var _=e=>new Promise(t=>setTimeout(t,e)),D=e=>{let t=e.filter(n=>!!n);if(t.length===0)return;if(t.length===1)return t[0];if(typeof AbortSignal.any=="function")return AbortSignal.any(t);let r=new AbortController;return t.forEach(n=>{if(n.aborted){r.abort(n.reason);return}n.addEventListener("abort",()=>r.abort(n.reason),{once:true});}),r.signal},N=e=>{if(!e||e<=0)return;let t=new AbortController,r=setTimeout(()=>t.abort(new Error("tanstack-fetch: request timed out")),e);return t.signal.addEventListener("abort",()=>clearTimeout(r),{once:true}),t.signal};var re=async e=>{if(e.incoming)return typeof e.incoming=="function"?e.incoming():e.incoming},ne=async(e,t)=>{let{method:r,path:n,requestOptions:o,client:c}=e,s=c.source??"browser";P(c.baseUrl,s);let a=M(c.baseUrl,n,o?.params,o?.query),u=v(await U(c.headers),o?.headers),i=o?.timeoutMs??c.timeoutMs??3e4,p=D([o?.signal,N(i)]);return {request:{method:r,url:a,headers:u,body:o?.body,signal:p},incoming:await re(c),meta:{attempt:t,maxRetries:c.maxRetries??2,source:s,operation:o?.operation}}},j=async e=>{let t=q(e.interceptors,e.requestOptions?.interceptors),r=e.client.fetch??globalThis.fetch;if(!r)throw new Error("tanstack-fetch: fetch is not available");let n=0,o=e.client.maxRetries??2;for(;n<=o;){let c=await oe({args:e,interceptors:t,fetchImpl:r,attempt:n});if(c.kind==="result")return c.result;n+=1,c.delayMs&&await _(c.delayMs);}throw new Error("tanstack-fetch: exceeded retry budget")},oe=async e=>{let t=await ne(e.args,e.attempt),r=await f(e.interceptors,n=>n.onRequest,t);return r.type==="short-circuit"?{kind:"result",result:r.result}:r.type==="retry"?{kind:"retry",delayMs:r.delayMs}:(r.type==="continue"&&(t=r.context),A({requestOptions:e.args.requestOptions,client:e.args.client,interceptors:e.interceptors,fetchImpl:e.fetchImpl,context:t}))};var se=(e={})=>{let t={throwOnError:true,...e},r=[...R(t),...(t.plugins??[]).map(n=>S[n]()),...t.interceptors??[]];return {clientOptions:t,interceptors:r}},ce=e=>{let{clientOptions:t,interceptors:r}=e,n=(a,u,i)=>{let p={...u,name:a,order:i?.order??u.order},m=r.findIndex(L=>L.name===a);if(m>=0){r.splice(m,1,p);return}r.push(p);},o=a=>{let u=r.findIndex(i=>i.name===a);u>=0&&r.splice(u,1);},c=(async(a,u,i)=>{let p=await j({method:a,path:u,requestOptions:i,client:t,interceptors:r}),m=i?.throwOnError??t.throwOnError??true;if(!p.ok&&m)throw d(p);return m&&p.ok?p.data:p}),s=a=>(i,p)=>c(a,i,p);return {use:n,eject:o,request:c,get:s("GET"),post:s("POST"),put:s("PUT"),patch:s("PATCH"),delete:s("DELETE")}},B=e=>ce(se(e)),ae=B;
|
|
2
|
-
exports.createClient=
|
|
1
|
+
'use strict';var F=e=>({name:"auth",order:15,onRequest:async t=>{let r=await e.getToken();if(!r)return {action:"continue",context:t};let o=e.header??"authorization",n=e.scheme===void 0?"Bearer":e.scheme,s=n?`${n} ${r}`:r;return t.request.headers.set(o,s),{action:"continue",context:t}}});var Y=(e,t)=>{let r=t[e];return r||(e>=500&&e<600&&t["5xx"]?t["5xx"]:e>=400&&e<500&&t["4xx"]?t["4xx"]:t.default)},R=e=>({name:"on-status",order:95,onResponseError:async t=>{let r=t.error?.status??t.response?.status;if(r===void 0||!t.error)return {action:"continue",context:t};let o=Y(r,e);if(!o)return {action:"continue",context:t};let n=await o({status:r,error:t.error,context:t});return n?.action==="retry"?{action:"retry",delayMs:n.delayMs}:{action:"continue",context:t}}});var Z=e=>{let t={...e.onStatus??{}};return e.onUnauthorized&&t[401]===void 0&&(t[401]=e.onUnauthorized),e.onForbidden&&t[403]===void 0&&(t[403]=e.onForbidden),e.onNotFound&&t[404]===void 0&&(t[404]=e.onNotFound),e.onServerError&&t["5xx"]===void 0&&t[500]===void 0&&(t["5xx"]=e.onServerError),Object.entries(t).some(([,o])=>!!o)?t:void 0},ee=e=>{if(e.auth)return e.auth;if(e.getToken)return {getToken:e.getToken}},H=e=>{let t=[],r=ee(e);r&&t.push(F(r));let o=Z(e);return o&&t.push(R(o)),t};var I=new Set(["GET","HEAD","OPTIONS"]),T=new Set([502,503,504]);var b=()=>({name:"retry-idempotent",order:80,onResponseError:e=>I.has(e.request.method)&&e.meta.attempt<e.meta.maxRetries&&!!(e.error&&T.has(e.error.status))?{action:"retry",delayMs:200*(e.meta.attempt+1)}:{action:"continue",context:e}});var w=()=>({name:"sse-resume",order:20,onSseEvent:e=>e.event.event==="ping"||e.event.event==="heartbeat"?{action:"drop"}:{action:"continue",context:e},onSseReconnect:e=>(e.meta.lastEventId&&e.request.headers.set("last-event-id",e.meta.lastEventId),{action:"continue",context:e})});var O=()=>({name:"ssr-forward",order:10,onRequest:e=>e.meta.source==="browser"?{action:"skip"}:(e.incoming?.cookie&&e.request.headers.set("cookie",e.incoming.cookie),e.incoming?.authorization&&e.request.headers.set("authorization",e.incoming.authorization),e.incoming?.requestId&&e.request.headers.set("x-request-id",e.incoming.requestId),{action:"continue",context:e})});var q=()=>({name:"trace",order:0,onRequest:e=>{let t=e.incoming?.requestId??globalThis.crypto.randomUUID();return e.request.headers.set("x-request-id",t),e.meta.requestId=t,{action:"continue",context:e}}});var S={trace:q,"ssr-forward":O,"retry-idempotent":b,"sse-resume":w};var f=e=>{let t=e.ok?{status:e.status,code:"UNKNOWN",message:"Request failed",body:e.data}:e.error,r=new Error(t.message);return Object.defineProperties(r,{name:{value:"FetchError"},status:{value:t.status},code:{value:t.code},body:{value:t.body},headers:{value:e.headers},result:{value:e.ok?{ok:false,status:t.status,error:t,headers:e.headers}:e}}),r},te=e=>!!(e&&typeof e=="object"&&e.name==="FetchError"&&"status"in e&&"code"in e),E=e=>e instanceof DOMException&&e.name==="AbortError"||e instanceof Error&&e.name==="AbortError";var oe=(e,t)=>{let r=e.match;return r?!(r.operation&&r.operation!==t.meta.operation||r.method&&r.method!==t.request.method||r.pathPrefix&&!t.request.url.pathname.startsWith(r.pathPrefix)||r.status!==void 0&&t.response?.status!==r.status):true},x=(e,t)=>{let r=new Set(t?.eject??[]);return [...e,...t?.use??[]].filter(n=>!r.has(n.name)).sort((n,s)=>(n.order??100)-(s.order??100))},m=async(e,t,r)=>{let o=r;for(let n of e){if(!oe(n,o))continue;let s=t(n);if(!s)continue;let a=await s(o)??{action:"continue",context:o};if(a.action!=="skip"){if(a.action==="drop")return {type:"drop"};if(a.action==="retry")return {type:"retry",delayMs:a.delayMs};if(a.action==="short-circuit")return {type:"short-circuit",result:a.result};o=a.context??o;}}return {type:"continue",context:o}};var ne=e=>!!(e&&e.includes("json")),C=async(e,t)=>{if(e.status===204)return null;if(t==="blob")return e.blob();if(t==="text")return e.text();let r=e.headers.get("content-type");if(t==="json"||ne(r)){let o=await e.text();return o?JSON.parse(o):null}return e.text()},A=(e,t)=>{if(e!=null)return typeof e=="string"||e instanceof FormData||e instanceof Blob||e instanceof URLSearchParams||e instanceof ArrayBuffer?e:(t.has("content-type")||t.set("content-type","application/json"),JSON.stringify(e))};var h=(e,t)=>{let r=t&&typeof t=="object"?t:void 0,o=typeof r?.code=="string"?r.code:"HTTP_ERROR",n=typeof r?.message=="string"?r.message:`Request failed with status ${e}`;return {status:e,code:o,message:n,body:t}},P=(e,t,r)=>({ok:true,status:e,data:t,headers:r}),g=(e,t,r)=>({ok:false,status:e,error:t,headers:r}),k=e=>{if(e.ok)return e.data;throw f(e)},se=async e=>k(await e);var ae=e=>{let t=new Headers;for(let r of e.trim().split(/[\r\n]+/)){let o=r.indexOf(":");o!==-1&&t.append(r.slice(0,o).trim(),r.slice(o+1).trim());}return t},ie=e=>{let t=e.lengthComputable?e.total:void 0;return {loaded:e.loaded,total:t,progress:t&&t>0?e.loaded/t:void 0}},U=e=>new Promise((t,r)=>{let o=new XMLHttpRequest;o.open(e.method,e.url.toString(),true),o.responseType="arraybuffer",o.withCredentials=e.credentials==="include",e.headers.forEach((s,a)=>{a.toLowerCase()==="content-type"&&e.body instanceof FormData||o.setRequestHeader(a,s);}),o.upload.onprogress=s=>{e.onUploadProgress(ie(s));};let n=()=>o.abort();e.signal?.addEventListener("abort",n,{once:true}),o.onload=()=>{e.signal?.removeEventListener("abort",n),t(new Response(o.response.byteLength>0?o.response:null,{status:o.status,statusText:o.statusText,headers:ae(o.getAllResponseHeaders())}));},o.onerror=()=>{e.signal?.removeEventListener("abort",n),r(new TypeError("Network request failed"));},o.onabort=()=>{e.signal?.removeEventListener("abort",n),r(new DOMException("The operation was aborted.","AbortError"));},o.send(e.body??null);}),v=()=>typeof XMLHttpRequest<"u";var ce=async(e,t)=>{let{context:r,fetchImpl:o,client:n,requestOptions:s}=e,a=s?.onUploadProgress;return a&&v()?U({url:r.request.url,method:r.request.method,headers:r.request.headers,body:t??null,signal:r.request.signal,credentials:n.credentials,onUploadProgress:a}):o(r.request.url,{method:r.request.method,headers:r.request.headers,body:t,signal:r.request.signal,credentials:n.credentials})},M=async e=>{let{context:t,interceptors:r,requestOptions:o}=e;try{let n=await ce(e,A(t.request.body,t.request.headers));return ue({interceptors:r,context:t,response:n,requestOptions:o})}catch(n){if(E(n))throw n;t.error=h(0,{code:"NETWORK_ERROR",message:n instanceof Error?n.message:"Network error"});let s=await m(r,a=>a.onRequestError,t);if(s.type==="retry")return {kind:"retry",delayMs:s.delayMs};if(s.type==="short-circuit")return {kind:"result",result:s.result};throw f(g(0,t.error,new Headers))}},ue=async e=>{let{interceptors:t,response:r,requestOptions:o}=e,n={...e.context,response:r,data:await C(r,o?.parseAs)},s=r.ok?i=>i.onResponse:i=>i.onResponseError;r.ok||(n.error=h(r.status,n.data));let a=await m(t,s,n);if(a.type==="retry")return {kind:"retry",delayMs:a.delayMs};if(a.type==="short-circuit")return {kind:"result",result:a.result};let d=a.type==="continue"?a.context:n;return {kind:"result",result:r.ok?P(r.status,d.data,r.headers):g(r.status,d.error??h(r.status,d.data),r.headers)}};var pe=(e,t)=>e.replace(/:([A-Za-z0-9_]+)/g,(r,o)=>{let n=t?.[o];if(n===void 0)throw new Error(`tanstack-fetch: missing path param "${o}"`);return encodeURIComponent(String(n))}),de=(e,t)=>{t&&Object.entries(t).forEach(([r,o])=>{o!=null&&e.searchParams.set(r,String(o));});},D=(e,t)=>{if(!(t==="browser"||!e)&&!/^https?:\/\//i.test(e))throw new Error("tanstack-fetch: set an absolute baseUrl for SSR and Edge runtimes")},B=(e,t,r,o)=>{let n=pe(t.replace(/\{([A-Za-z0-9_]+)\}/g,":$1"),r),s=/^https?:\/\//i.test(n)?n:`${(e??"").replace(/\/$/,"")}/${n.replace(/^\//,"")}`,a=new URL(s);return de(a,o),a};var le=e=>new Headers(e),L=(...e)=>{let t=new Headers;return e.forEach(r=>{r&&new Headers(r).forEach((o,n)=>{t.set(n,o);});}),t},_=async e=>{if(!e)return new Headers;let t=typeof e=="function"?await e():e;return le(t)};var N=e=>new Promise(t=>setTimeout(t,e)),j=e=>{let t=e.filter(o=>!!o);if(t.length===0)return;if(t.length===1)return t[0];if(typeof AbortSignal.any=="function")return AbortSignal.any(t);let r=new AbortController;return t.forEach(o=>{if(o.aborted){r.abort(o.reason);return}o.addEventListener("abort",()=>r.abort(o.reason),{once:true});}),r.signal},X=e=>{if(!e||e<=0)return;let t=new AbortController,r=setTimeout(()=>t.abort(new Error("tanstack-fetch: request timed out")),e);return t.signal.addEventListener("abort",()=>clearTimeout(r),{once:true}),t.signal};var me=async e=>{if(e.incoming)return typeof e.incoming=="function"?e.incoming():e.incoming},he=async(e,t)=>{let{method:r,path:o,requestOptions:n,client:s}=e,a=s.source??"browser";D(s.baseUrl,a);let d=B(s.baseUrl,o,n?.params,n?.query),c=L(await _(s.headers),n?.headers),i=n?.timeoutMs??s.timeoutMs??3e4,u=j([n?.signal,X(i)]);return {request:{method:r,url:d,headers:c,body:n?.body,signal:u},incoming:await me(s),meta:{attempt:t,maxRetries:s.maxRetries??2,source:a,operation:n?.operation}}},z=async e=>{let t=x(e.interceptors,e.requestOptions?.interceptors),r=e.client.fetch??globalThis.fetch;if(!r)throw new Error("tanstack-fetch: fetch is not available");let o=0,n=e.client.maxRetries??2;for(;o<=n;){let s=await ye({args:e,interceptors:t,fetchImpl:r,attempt:o});if(s.kind==="result")return s.result;o+=1,s.delayMs&&await N(s.delayMs);}throw new Error("tanstack-fetch: exceeded retry budget")},ye=async e=>{let t=await he(e.args,e.attempt),r=await m(e.interceptors,o=>o.onRequest,t);return r.type==="short-circuit"?{kind:"result",result:r.result}:r.type==="retry"?{kind:"retry",delayMs:r.delayMs}:(r.type==="continue"&&(t=r.context),M({requestOptions:e.args.requestOptions,client:e.args.client,interceptors:e.interceptors,fetchImpl:e.fetchImpl,context:t}))};var Ee=(e,t,r)=>{if(r==null)return;let o=Array.isArray(r)?r:[r];for(let n of o)if(n!=null){if(n instanceof Blob){e.append(t,n);continue}e.append(t,String(n));}},$=(e,t)=>{for(let[r,o]of Object.entries(t))Ee(e,r,o);return e},W=(e={})=>$(new FormData,e),ge=e=>!!(e.file||e.files?.length||e.fields),Q=e=>{if(e.body!==void 0&&!ge(e))return e.body;if(e.body!==void 0&&!(e.body instanceof FormData))throw new Error("tanstack-fetch: upload `body` must be FormData when using `file`, `files`, or `fields`");let t=e.body instanceof FormData?e.body:W();e.fields&&$(t,e.fields);let r=e.fieldName??"file";if(e.file&&t.append(r,e.file),e.files)for(let o of e.files)t.append(r,o);return t};var Fe=(e={})=>{let t={throwOnError:true,...e},r=[...H(t),...(t.plugins??[]).map(o=>S[o]()),...t.interceptors??[]];return {clientOptions:t,interceptors:r}},Re=e=>{let{clientOptions:t,interceptors:r}=e,o=(c,i,u)=>{let p={...i,name:c,order:u?.order??i.order},l=r.findIndex(y=>y.name===c);if(l>=0){r.splice(l,1,p);return}r.push(p);},n=c=>{let i=r.findIndex(u=>u.name===c);i>=0&&r.splice(i,1);},s=(async(c,i,u)=>{let p=await z({method:c,path:i,requestOptions:u,client:t,interceptors:r}),l=u?.throwOnError??t.throwOnError??true;if(!p.ok&&l)throw f(p);return l&&p.ok?p.data:p}),a=c=>(u,p)=>s(c,u,p),d=((c,i)=>{let{method:u="POST",file:p,files:l,fields:y,fieldName:J,body:G,...K}=i??{};return s(u,c,{...K,body:Q({body:G,file:p,files:l,fields:y,fieldName:J}),onUploadProgress:i?.onUploadProgress})});return {use:o,eject:n,request:s,get:a("GET"),post:a("POST"),put:a("PUT"),patch:a("PATCH"),delete:a("DELETE"),upload:d}},V=e=>Re(Fe(e)),He=V;
|
|
2
|
+
exports.createClient=He;exports.createFetch=V;exports.createFetchError=f;exports.createFormData=W;exports.isAbortError=E;exports.isFetchError=te;exports.unwrap=k;exports.unwrapAsync=se;
|
package/dist/index.d.cts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { C as CreateFetchOptions, F as FetchClient } from './client.type-
|
|
2
|
-
export {
|
|
1
|
+
import { C as CreateFetchOptions, F as FetchClient, a as FormDataFields } from './client.type-BBYqVrTM.cjs';
|
|
2
|
+
export { b as CreateClientOptions, c as FormDataFieldValue, H as HttpClient, R as RequestOptions, S as SseCallOptions, d as SseEvent, e as SseHandlers, f as SseSubscription, U as UploadCallOptions, g as UploadOptions, h as UploadProgressEvent, i as UploadProgressHandler } from './client.type-BBYqVrTM.cjs';
|
|
3
3
|
import { F as FetchResult, a as FetchErrorInfo } from './config.type-eG_cuxpu.cjs';
|
|
4
4
|
export { A as AuthConfig, H as HttpError, b as HttpInterceptor, c as HttpMethod, d as HttpResult, I as IncomingHeaders, P as PluginName, R as RequestContext, S as StatusHandler, e as StatusHandlerInput, f as StatusHandlerResult, g as StatusHandlers } from './config.type-eG_cuxpu.cjs';
|
|
5
5
|
|
|
@@ -20,7 +20,10 @@ declare const createFetchError: (result: FetchResult<never, FetchErrorInfo>) =>
|
|
|
20
20
|
declare const isFetchError: (error: unknown) => error is FetchError;
|
|
21
21
|
declare const isAbortError: (error: unknown) => boolean;
|
|
22
22
|
|
|
23
|
+
/** Build `FormData` from a plain object (files, strings, numbers, arrays). */
|
|
24
|
+
declare const createFormData: (fields?: FormDataFields) => FormData;
|
|
25
|
+
|
|
23
26
|
declare const unwrap: <T>(result: FetchResult<T, FetchErrorInfo>) => T;
|
|
24
27
|
declare const unwrapAsync: <T>(promise: Promise<FetchResult<T, FetchErrorInfo>>) => Promise<T>;
|
|
25
28
|
|
|
26
|
-
export { CreateFetchOptions, FetchClient, type FetchError, FetchErrorInfo, FetchResult, createClient, createFetch, createFetchError, isAbortError, isFetchError, unwrap, unwrapAsync };
|
|
29
|
+
export { CreateFetchOptions, FetchClient, type FetchError, FetchErrorInfo, FetchResult, FormDataFields, createClient, createFetch, createFetchError, createFormData, isAbortError, isFetchError, unwrap, unwrapAsync };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { C as CreateFetchOptions, F as FetchClient } from './client.type-
|
|
2
|
-
export {
|
|
1
|
+
import { C as CreateFetchOptions, F as FetchClient, a as FormDataFields } from './client.type-Btgj3NQn.js';
|
|
2
|
+
export { b as CreateClientOptions, c as FormDataFieldValue, H as HttpClient, R as RequestOptions, S as SseCallOptions, d as SseEvent, e as SseHandlers, f as SseSubscription, U as UploadCallOptions, g as UploadOptions, h as UploadProgressEvent, i as UploadProgressHandler } from './client.type-Btgj3NQn.js';
|
|
3
3
|
import { F as FetchResult, a as FetchErrorInfo } from './config.type-eG_cuxpu.js';
|
|
4
4
|
export { A as AuthConfig, H as HttpError, b as HttpInterceptor, c as HttpMethod, d as HttpResult, I as IncomingHeaders, P as PluginName, R as RequestContext, S as StatusHandler, e as StatusHandlerInput, f as StatusHandlerResult, g as StatusHandlers } from './config.type-eG_cuxpu.js';
|
|
5
5
|
|
|
@@ -20,7 +20,10 @@ declare const createFetchError: (result: FetchResult<never, FetchErrorInfo>) =>
|
|
|
20
20
|
declare const isFetchError: (error: unknown) => error is FetchError;
|
|
21
21
|
declare const isAbortError: (error: unknown) => boolean;
|
|
22
22
|
|
|
23
|
+
/** Build `FormData` from a plain object (files, strings, numbers, arrays). */
|
|
24
|
+
declare const createFormData: (fields?: FormDataFields) => FormData;
|
|
25
|
+
|
|
23
26
|
declare const unwrap: <T>(result: FetchResult<T, FetchErrorInfo>) => T;
|
|
24
27
|
declare const unwrapAsync: <T>(promise: Promise<FetchResult<T, FetchErrorInfo>>) => Promise<T>;
|
|
25
28
|
|
|
26
|
-
export { CreateFetchOptions, FetchClient, type FetchError, FetchErrorInfo, FetchResult, createClient, createFetch, createFetchError, isAbortError, isFetchError, unwrap, unwrapAsync };
|
|
29
|
+
export { CreateFetchOptions, FetchClient, type FetchError, FetchErrorInfo, FetchResult, FormDataFields, createClient, createFetch, createFetchError, createFormData, isAbortError, isFetchError, unwrap, unwrapAsync };
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var E=e=>({name:"auth",order:15,onRequest:async t=>{let r=await e.getToken();if(!r)return {action:"continue",context:t};let n=e.header??"authorization",o=e.scheme===void 0?"Bearer":e.scheme,c=o?`${o} ${r}`:r;return t.request.headers.set(n,c),{action:"continue",context:t}}});var z=(e,t)=>{let r=t[e];return r||(e>=500&&e<600&&t["5xx"]?t["5xx"]:e>=400&&e<500&&t["4xx"]?t["4xx"]:t.default)},I=e=>({name:"on-status",order:95,onResponseError:async t=>{let r=t.error?.status??t.response?.status;if(r===void 0||!t.error)return {action:"continue",context:t};let n=z(r,e);if(!n)return {action:"continue",context:t};let o=await n({status:r,error:t.error,context:t});return o?.action==="retry"?{action:"retry",delayMs:o.delayMs}:{action:"continue",context:t}}});var $=e=>{let t={...e.onStatus??{}};return e.onUnauthorized&&t[401]===void 0&&(t[401]=e.onUnauthorized),e.onForbidden&&t[403]===void 0&&(t[403]=e.onForbidden),e.onNotFound&&t[404]===void 0&&(t[404]=e.onNotFound),e.onServerError&&t["5xx"]===void 0&&t[500]===void 0&&(t["5xx"]=e.onServerError),Object.entries(t).some(([,n])=>!!n)?t:void 0},Q=e=>{if(e.auth)return e.auth;if(e.getToken)return {getToken:e.getToken}},R=e=>{let t=[],r=Q(e);r&&t.push(E(r));let n=$(e);return n&&t.push(I(n)),t};var H=new Set(["GET","HEAD","OPTIONS"]),g=new Set([502,503,504]);var F=()=>({name:"retry-idempotent",order:80,onResponseError:e=>H.has(e.request.method)&&e.meta.attempt<e.meta.maxRetries&&!!(e.error&&g.has(e.error.status))?{action:"retry",delayMs:200*(e.meta.attempt+1)}:{action:"continue",context:e}});var T=()=>({name:"sse-resume",order:20,onSseEvent:e=>e.event.event==="ping"||e.event.event==="heartbeat"?{action:"drop"}:{action:"continue",context:e},onSseReconnect:e=>(e.meta.lastEventId&&e.request.headers.set("last-event-id",e.meta.lastEventId),{action:"continue",context:e})});var O=()=>({name:"ssr-forward",order:10,onRequest:e=>e.meta.source==="browser"?{action:"skip"}:(e.incoming?.cookie&&e.request.headers.set("cookie",e.incoming.cookie),e.incoming?.authorization&&e.request.headers.set("authorization",e.incoming.authorization),e.incoming?.requestId&&e.request.headers.set("x-request-id",e.incoming.requestId),{action:"continue",context:e})});var w=()=>({name:"trace",order:0,onRequest:e=>{let t=e.incoming?.requestId??globalThis.crypto.randomUUID();return e.request.headers.set("x-request-id",t),e.meta.requestId=t,{action:"continue",context:e}}});var S={trace:w,"ssr-forward":O,"retry-idempotent":F,"sse-resume":T};var d=e=>{let t=e.ok?{status:e.status,code:"UNKNOWN",message:"Request failed",body:e.data}:e.error,r=new Error(t.message);return Object.defineProperties(r,{name:{value:"FetchError"},status:{value:t.status},code:{value:t.code},body:{value:t.body},headers:{value:e.headers},result:{value:e.ok?{ok:false,status:t.status,error:t,headers:e.headers}:e}}),r},J=e=>!!(e&&typeof e=="object"&&e.name==="FetchError"&&"status"in e&&"code"in e),h=e=>e instanceof DOMException&&e.name==="AbortError"||e instanceof Error&&e.name==="AbortError";var G=(e,t)=>{let r=e.match;return r?!(r.operation&&r.operation!==t.meta.operation||r.method&&r.method!==t.request.method||r.pathPrefix&&!t.request.url.pathname.startsWith(r.pathPrefix)||r.status!==void 0&&t.response?.status!==r.status):true},q=(e,t)=>{let r=new Set(t?.eject??[]);return [...e,...t?.use??[]].filter(o=>!r.has(o.name)).sort((o,c)=>(o.order??100)-(c.order??100))},f=async(e,t,r)=>{let n=r;for(let o of e){if(!G(o,n))continue;let c=t(o);if(!c)continue;let s=await c(n)??{action:"continue",context:n};if(s.action!=="skip"){if(s.action==="drop")return {type:"drop"};if(s.action==="retry")return {type:"retry",delayMs:s.delayMs};if(s.action==="short-circuit")return {type:"short-circuit",result:s.result};n=s.context??n;}}return {type:"continue",context:n}};var K=e=>!!(e&&e.includes("json")),b=async(e,t)=>{if(e.status===204)return null;if(t==="blob")return e.blob();if(t==="text")return e.text();let r=e.headers.get("content-type");if(t==="json"||K(r)){let n=await e.text();return n?JSON.parse(n):null}return e.text()},x=(e,t)=>{if(e!=null)return typeof e=="string"||e instanceof FormData||e instanceof Blob||e instanceof URLSearchParams||e instanceof ArrayBuffer?e:(t.has("content-type")||t.set("content-type","application/json"),JSON.stringify(e))};var l=(e,t)=>{let r=t&&typeof t=="object"?t:void 0,n=typeof r?.code=="string"?r.code:"HTTP_ERROR",o=typeof r?.message=="string"?r.message:`Request failed with status ${e}`;return {status:e,code:n,message:o,body:t}},C=(e,t,r)=>({ok:true,status:e,data:t,headers:r}),y=(e,t,r)=>({ok:false,status:e,error:t,headers:r}),k=e=>{if(e.ok)return e.data;throw d(e)},X=async e=>k(await e);var A=async e=>{let{context:t,interceptors:r,fetchImpl:n,client:o,requestOptions:c}=e;try{let s=await n(t.request.url,{method:t.request.method,headers:t.request.headers,body:x(t.request.body,t.request.headers),signal:t.request.signal,credentials:o.credentials});return Y({interceptors:r,context:t,response:s,requestOptions:c})}catch(s){if(h(s))throw s;t.error=l(0,{code:"NETWORK_ERROR",message:s instanceof Error?s.message:"Network error"});let a=await f(r,u=>u.onRequestError,t);if(a.type==="retry")return {kind:"retry",delayMs:a.delayMs};if(a.type==="short-circuit")return {kind:"result",result:a.result};throw d(y(0,t.error,new Headers))}},Y=async e=>{let{interceptors:t,response:r,requestOptions:n}=e,o={...e.context,response:r,data:await b(r,n?.parseAs)},c=r.ok?i=>i.onResponse:i=>i.onResponseError;r.ok||(o.error=l(r.status,o.data));let s=await f(t,c,o);if(s.type==="retry")return {kind:"retry",delayMs:s.delayMs};if(s.type==="short-circuit")return {kind:"result",result:s.result};let a=s.type==="continue"?s.context:o;return {kind:"result",result:r.ok?C(r.status,a.data,r.headers):y(r.status,a.error??l(r.status,a.data),r.headers)}};var Z=(e,t)=>e.replace(/:([A-Za-z0-9_]+)/g,(r,n)=>{let o=t?.[n];if(o===void 0)throw new Error(`tanstack-fetch: missing path param "${n}"`);return encodeURIComponent(String(o))}),V=(e,t)=>{t&&Object.entries(t).forEach(([r,n])=>{n!=null&&e.searchParams.set(r,String(n));});},P=(e,t)=>{if(!(t==="browser"||!e)&&!/^https?:\/\//i.test(e))throw new Error("tanstack-fetch: set an absolute baseUrl for SSR and Edge runtimes")},M=(e,t,r,n)=>{let o=Z(t.replace(/\{([A-Za-z0-9_]+)\}/g,":$1"),r),c=/^https?:\/\//i.test(o)?o:`${(e??"").replace(/\/$/,"")}/${o.replace(/^\//,"")}`,s=new URL(c);return V(s,n),s};var ee=e=>new Headers(e),v=(...e)=>{let t=new Headers;return e.forEach(r=>{r&&new Headers(r).forEach((n,o)=>{t.set(o,n);});}),t},U=async e=>{if(!e)return new Headers;let t=typeof e=="function"?await e():e;return ee(t)};var _=e=>new Promise(t=>setTimeout(t,e)),D=e=>{let t=e.filter(n=>!!n);if(t.length===0)return;if(t.length===1)return t[0];if(typeof AbortSignal.any=="function")return AbortSignal.any(t);let r=new AbortController;return t.forEach(n=>{if(n.aborted){r.abort(n.reason);return}n.addEventListener("abort",()=>r.abort(n.reason),{once:true});}),r.signal},N=e=>{if(!e||e<=0)return;let t=new AbortController,r=setTimeout(()=>t.abort(new Error("tanstack-fetch: request timed out")),e);return t.signal.addEventListener("abort",()=>clearTimeout(r),{once:true}),t.signal};var re=async e=>{if(e.incoming)return typeof e.incoming=="function"?e.incoming():e.incoming},ne=async(e,t)=>{let{method:r,path:n,requestOptions:o,client:c}=e,s=c.source??"browser";P(c.baseUrl,s);let a=M(c.baseUrl,n,o?.params,o?.query),u=v(await U(c.headers),o?.headers),i=o?.timeoutMs??c.timeoutMs??3e4,p=D([o?.signal,N(i)]);return {request:{method:r,url:a,headers:u,body:o?.body,signal:p},incoming:await re(c),meta:{attempt:t,maxRetries:c.maxRetries??2,source:s,operation:o?.operation}}},j=async e=>{let t=q(e.interceptors,e.requestOptions?.interceptors),r=e.client.fetch??globalThis.fetch;if(!r)throw new Error("tanstack-fetch: fetch is not available");let n=0,o=e.client.maxRetries??2;for(;n<=o;){let c=await oe({args:e,interceptors:t,fetchImpl:r,attempt:n});if(c.kind==="result")return c.result;n+=1,c.delayMs&&await _(c.delayMs);}throw new Error("tanstack-fetch: exceeded retry budget")},oe=async e=>{let t=await ne(e.args,e.attempt),r=await f(e.interceptors,n=>n.onRequest,t);return r.type==="short-circuit"?{kind:"result",result:r.result}:r.type==="retry"?{kind:"retry",delayMs:r.delayMs}:(r.type==="continue"&&(t=r.context),A({requestOptions:e.args.requestOptions,client:e.args.client,interceptors:e.interceptors,fetchImpl:e.fetchImpl,context:t}))};var se=(e={})=>{let t={throwOnError:true,...e},r=[...R(t),...(t.plugins??[]).map(n=>S[n]()),...t.interceptors??[]];return {clientOptions:t,interceptors:r}},ce=e=>{let{clientOptions:t,interceptors:r}=e,n=(a,u,i)=>{let p={...u,name:a,order:i?.order??u.order},m=r.findIndex(L=>L.name===a);if(m>=0){r.splice(m,1,p);return}r.push(p);},o=a=>{let u=r.findIndex(i=>i.name===a);u>=0&&r.splice(u,1);},c=(async(a,u,i)=>{let p=await j({method:a,path:u,requestOptions:i,client:t,interceptors:r}),m=i?.throwOnError??t.throwOnError??true;if(!p.ok&&m)throw d(p);return m&&p.ok?p.data:p}),s=a=>(i,p)=>c(a,i,p);return {use:n,eject:o,request:c,get:s("GET"),post:s("POST"),put:s("PUT"),patch:s("PATCH"),delete:s("DELETE")}},B=e=>ce(se(e)),ae=B;
|
|
2
|
-
export{
|
|
1
|
+
var F=e=>({name:"auth",order:15,onRequest:async t=>{let r=await e.getToken();if(!r)return {action:"continue",context:t};let o=e.header??"authorization",n=e.scheme===void 0?"Bearer":e.scheme,s=n?`${n} ${r}`:r;return t.request.headers.set(o,s),{action:"continue",context:t}}});var Y=(e,t)=>{let r=t[e];return r||(e>=500&&e<600&&t["5xx"]?t["5xx"]:e>=400&&e<500&&t["4xx"]?t["4xx"]:t.default)},R=e=>({name:"on-status",order:95,onResponseError:async t=>{let r=t.error?.status??t.response?.status;if(r===void 0||!t.error)return {action:"continue",context:t};let o=Y(r,e);if(!o)return {action:"continue",context:t};let n=await o({status:r,error:t.error,context:t});return n?.action==="retry"?{action:"retry",delayMs:n.delayMs}:{action:"continue",context:t}}});var Z=e=>{let t={...e.onStatus??{}};return e.onUnauthorized&&t[401]===void 0&&(t[401]=e.onUnauthorized),e.onForbidden&&t[403]===void 0&&(t[403]=e.onForbidden),e.onNotFound&&t[404]===void 0&&(t[404]=e.onNotFound),e.onServerError&&t["5xx"]===void 0&&t[500]===void 0&&(t["5xx"]=e.onServerError),Object.entries(t).some(([,o])=>!!o)?t:void 0},ee=e=>{if(e.auth)return e.auth;if(e.getToken)return {getToken:e.getToken}},H=e=>{let t=[],r=ee(e);r&&t.push(F(r));let o=Z(e);return o&&t.push(R(o)),t};var I=new Set(["GET","HEAD","OPTIONS"]),T=new Set([502,503,504]);var b=()=>({name:"retry-idempotent",order:80,onResponseError:e=>I.has(e.request.method)&&e.meta.attempt<e.meta.maxRetries&&!!(e.error&&T.has(e.error.status))?{action:"retry",delayMs:200*(e.meta.attempt+1)}:{action:"continue",context:e}});var w=()=>({name:"sse-resume",order:20,onSseEvent:e=>e.event.event==="ping"||e.event.event==="heartbeat"?{action:"drop"}:{action:"continue",context:e},onSseReconnect:e=>(e.meta.lastEventId&&e.request.headers.set("last-event-id",e.meta.lastEventId),{action:"continue",context:e})});var O=()=>({name:"ssr-forward",order:10,onRequest:e=>e.meta.source==="browser"?{action:"skip"}:(e.incoming?.cookie&&e.request.headers.set("cookie",e.incoming.cookie),e.incoming?.authorization&&e.request.headers.set("authorization",e.incoming.authorization),e.incoming?.requestId&&e.request.headers.set("x-request-id",e.incoming.requestId),{action:"continue",context:e})});var q=()=>({name:"trace",order:0,onRequest:e=>{let t=e.incoming?.requestId??globalThis.crypto.randomUUID();return e.request.headers.set("x-request-id",t),e.meta.requestId=t,{action:"continue",context:e}}});var S={trace:q,"ssr-forward":O,"retry-idempotent":b,"sse-resume":w};var f=e=>{let t=e.ok?{status:e.status,code:"UNKNOWN",message:"Request failed",body:e.data}:e.error,r=new Error(t.message);return Object.defineProperties(r,{name:{value:"FetchError"},status:{value:t.status},code:{value:t.code},body:{value:t.body},headers:{value:e.headers},result:{value:e.ok?{ok:false,status:t.status,error:t,headers:e.headers}:e}}),r},te=e=>!!(e&&typeof e=="object"&&e.name==="FetchError"&&"status"in e&&"code"in e),E=e=>e instanceof DOMException&&e.name==="AbortError"||e instanceof Error&&e.name==="AbortError";var oe=(e,t)=>{let r=e.match;return r?!(r.operation&&r.operation!==t.meta.operation||r.method&&r.method!==t.request.method||r.pathPrefix&&!t.request.url.pathname.startsWith(r.pathPrefix)||r.status!==void 0&&t.response?.status!==r.status):true},x=(e,t)=>{let r=new Set(t?.eject??[]);return [...e,...t?.use??[]].filter(n=>!r.has(n.name)).sort((n,s)=>(n.order??100)-(s.order??100))},m=async(e,t,r)=>{let o=r;for(let n of e){if(!oe(n,o))continue;let s=t(n);if(!s)continue;let a=await s(o)??{action:"continue",context:o};if(a.action!=="skip"){if(a.action==="drop")return {type:"drop"};if(a.action==="retry")return {type:"retry",delayMs:a.delayMs};if(a.action==="short-circuit")return {type:"short-circuit",result:a.result};o=a.context??o;}}return {type:"continue",context:o}};var ne=e=>!!(e&&e.includes("json")),C=async(e,t)=>{if(e.status===204)return null;if(t==="blob")return e.blob();if(t==="text")return e.text();let r=e.headers.get("content-type");if(t==="json"||ne(r)){let o=await e.text();return o?JSON.parse(o):null}return e.text()},A=(e,t)=>{if(e!=null)return typeof e=="string"||e instanceof FormData||e instanceof Blob||e instanceof URLSearchParams||e instanceof ArrayBuffer?e:(t.has("content-type")||t.set("content-type","application/json"),JSON.stringify(e))};var h=(e,t)=>{let r=t&&typeof t=="object"?t:void 0,o=typeof r?.code=="string"?r.code:"HTTP_ERROR",n=typeof r?.message=="string"?r.message:`Request failed with status ${e}`;return {status:e,code:o,message:n,body:t}},P=(e,t,r)=>({ok:true,status:e,data:t,headers:r}),g=(e,t,r)=>({ok:false,status:e,error:t,headers:r}),k=e=>{if(e.ok)return e.data;throw f(e)},se=async e=>k(await e);var ae=e=>{let t=new Headers;for(let r of e.trim().split(/[\r\n]+/)){let o=r.indexOf(":");o!==-1&&t.append(r.slice(0,o).trim(),r.slice(o+1).trim());}return t},ie=e=>{let t=e.lengthComputable?e.total:void 0;return {loaded:e.loaded,total:t,progress:t&&t>0?e.loaded/t:void 0}},U=e=>new Promise((t,r)=>{let o=new XMLHttpRequest;o.open(e.method,e.url.toString(),true),o.responseType="arraybuffer",o.withCredentials=e.credentials==="include",e.headers.forEach((s,a)=>{a.toLowerCase()==="content-type"&&e.body instanceof FormData||o.setRequestHeader(a,s);}),o.upload.onprogress=s=>{e.onUploadProgress(ie(s));};let n=()=>o.abort();e.signal?.addEventListener("abort",n,{once:true}),o.onload=()=>{e.signal?.removeEventListener("abort",n),t(new Response(o.response.byteLength>0?o.response:null,{status:o.status,statusText:o.statusText,headers:ae(o.getAllResponseHeaders())}));},o.onerror=()=>{e.signal?.removeEventListener("abort",n),r(new TypeError("Network request failed"));},o.onabort=()=>{e.signal?.removeEventListener("abort",n),r(new DOMException("The operation was aborted.","AbortError"));},o.send(e.body??null);}),v=()=>typeof XMLHttpRequest<"u";var ce=async(e,t)=>{let{context:r,fetchImpl:o,client:n,requestOptions:s}=e,a=s?.onUploadProgress;return a&&v()?U({url:r.request.url,method:r.request.method,headers:r.request.headers,body:t??null,signal:r.request.signal,credentials:n.credentials,onUploadProgress:a}):o(r.request.url,{method:r.request.method,headers:r.request.headers,body:t,signal:r.request.signal,credentials:n.credentials})},M=async e=>{let{context:t,interceptors:r,requestOptions:o}=e;try{let n=await ce(e,A(t.request.body,t.request.headers));return ue({interceptors:r,context:t,response:n,requestOptions:o})}catch(n){if(E(n))throw n;t.error=h(0,{code:"NETWORK_ERROR",message:n instanceof Error?n.message:"Network error"});let s=await m(r,a=>a.onRequestError,t);if(s.type==="retry")return {kind:"retry",delayMs:s.delayMs};if(s.type==="short-circuit")return {kind:"result",result:s.result};throw f(g(0,t.error,new Headers))}},ue=async e=>{let{interceptors:t,response:r,requestOptions:o}=e,n={...e.context,response:r,data:await C(r,o?.parseAs)},s=r.ok?i=>i.onResponse:i=>i.onResponseError;r.ok||(n.error=h(r.status,n.data));let a=await m(t,s,n);if(a.type==="retry")return {kind:"retry",delayMs:a.delayMs};if(a.type==="short-circuit")return {kind:"result",result:a.result};let d=a.type==="continue"?a.context:n;return {kind:"result",result:r.ok?P(r.status,d.data,r.headers):g(r.status,d.error??h(r.status,d.data),r.headers)}};var pe=(e,t)=>e.replace(/:([A-Za-z0-9_]+)/g,(r,o)=>{let n=t?.[o];if(n===void 0)throw new Error(`tanstack-fetch: missing path param "${o}"`);return encodeURIComponent(String(n))}),de=(e,t)=>{t&&Object.entries(t).forEach(([r,o])=>{o!=null&&e.searchParams.set(r,String(o));});},D=(e,t)=>{if(!(t==="browser"||!e)&&!/^https?:\/\//i.test(e))throw new Error("tanstack-fetch: set an absolute baseUrl for SSR and Edge runtimes")},B=(e,t,r,o)=>{let n=pe(t.replace(/\{([A-Za-z0-9_]+)\}/g,":$1"),r),s=/^https?:\/\//i.test(n)?n:`${(e??"").replace(/\/$/,"")}/${n.replace(/^\//,"")}`,a=new URL(s);return de(a,o),a};var le=e=>new Headers(e),L=(...e)=>{let t=new Headers;return e.forEach(r=>{r&&new Headers(r).forEach((o,n)=>{t.set(n,o);});}),t},_=async e=>{if(!e)return new Headers;let t=typeof e=="function"?await e():e;return le(t)};var N=e=>new Promise(t=>setTimeout(t,e)),j=e=>{let t=e.filter(o=>!!o);if(t.length===0)return;if(t.length===1)return t[0];if(typeof AbortSignal.any=="function")return AbortSignal.any(t);let r=new AbortController;return t.forEach(o=>{if(o.aborted){r.abort(o.reason);return}o.addEventListener("abort",()=>r.abort(o.reason),{once:true});}),r.signal},X=e=>{if(!e||e<=0)return;let t=new AbortController,r=setTimeout(()=>t.abort(new Error("tanstack-fetch: request timed out")),e);return t.signal.addEventListener("abort",()=>clearTimeout(r),{once:true}),t.signal};var me=async e=>{if(e.incoming)return typeof e.incoming=="function"?e.incoming():e.incoming},he=async(e,t)=>{let{method:r,path:o,requestOptions:n,client:s}=e,a=s.source??"browser";D(s.baseUrl,a);let d=B(s.baseUrl,o,n?.params,n?.query),c=L(await _(s.headers),n?.headers),i=n?.timeoutMs??s.timeoutMs??3e4,u=j([n?.signal,X(i)]);return {request:{method:r,url:d,headers:c,body:n?.body,signal:u},incoming:await me(s),meta:{attempt:t,maxRetries:s.maxRetries??2,source:a,operation:n?.operation}}},z=async e=>{let t=x(e.interceptors,e.requestOptions?.interceptors),r=e.client.fetch??globalThis.fetch;if(!r)throw new Error("tanstack-fetch: fetch is not available");let o=0,n=e.client.maxRetries??2;for(;o<=n;){let s=await ye({args:e,interceptors:t,fetchImpl:r,attempt:o});if(s.kind==="result")return s.result;o+=1,s.delayMs&&await N(s.delayMs);}throw new Error("tanstack-fetch: exceeded retry budget")},ye=async e=>{let t=await he(e.args,e.attempt),r=await m(e.interceptors,o=>o.onRequest,t);return r.type==="short-circuit"?{kind:"result",result:r.result}:r.type==="retry"?{kind:"retry",delayMs:r.delayMs}:(r.type==="continue"&&(t=r.context),M({requestOptions:e.args.requestOptions,client:e.args.client,interceptors:e.interceptors,fetchImpl:e.fetchImpl,context:t}))};var Ee=(e,t,r)=>{if(r==null)return;let o=Array.isArray(r)?r:[r];for(let n of o)if(n!=null){if(n instanceof Blob){e.append(t,n);continue}e.append(t,String(n));}},$=(e,t)=>{for(let[r,o]of Object.entries(t))Ee(e,r,o);return e},W=(e={})=>$(new FormData,e),ge=e=>!!(e.file||e.files?.length||e.fields),Q=e=>{if(e.body!==void 0&&!ge(e))return e.body;if(e.body!==void 0&&!(e.body instanceof FormData))throw new Error("tanstack-fetch: upload `body` must be FormData when using `file`, `files`, or `fields`");let t=e.body instanceof FormData?e.body:W();e.fields&&$(t,e.fields);let r=e.fieldName??"file";if(e.file&&t.append(r,e.file),e.files)for(let o of e.files)t.append(r,o);return t};var Fe=(e={})=>{let t={throwOnError:true,...e},r=[...H(t),...(t.plugins??[]).map(o=>S[o]()),...t.interceptors??[]];return {clientOptions:t,interceptors:r}},Re=e=>{let{clientOptions:t,interceptors:r}=e,o=(c,i,u)=>{let p={...i,name:c,order:u?.order??i.order},l=r.findIndex(y=>y.name===c);if(l>=0){r.splice(l,1,p);return}r.push(p);},n=c=>{let i=r.findIndex(u=>u.name===c);i>=0&&r.splice(i,1);},s=(async(c,i,u)=>{let p=await z({method:c,path:i,requestOptions:u,client:t,interceptors:r}),l=u?.throwOnError??t.throwOnError??true;if(!p.ok&&l)throw f(p);return l&&p.ok?p.data:p}),a=c=>(u,p)=>s(c,u,p),d=((c,i)=>{let{method:u="POST",file:p,files:l,fields:y,fieldName:J,body:G,...K}=i??{};return s(u,c,{...K,body:Q({body:G,file:p,files:l,fields:y,fieldName:J}),onUploadProgress:i?.onUploadProgress})});return {use:o,eject:n,request:s,get:a("GET"),post:a("POST"),put:a("PUT"),patch:a("PATCH"),delete:a("DELETE"),upload:d}},V=e=>Re(Fe(e)),He=V;
|
|
2
|
+
export{He as createClient,V as createFetch,f as createFetchError,W as createFormData,E as isAbortError,te as isFetchError,k as unwrap,se as unwrapAsync};
|
package/dist/sse.cjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
'use strict';var A=e=>({name:"auth",order:15,onRequest:async t=>{let r=await e.getToken();if(!r)return {action:"continue",context:t};let n=e.header??"authorization",o=e.scheme===void 0?"Bearer":e.scheme,s=o?`${o} ${r}`:r;return t.request.headers.set(n,s),{action:"continue",context:t}}});var te=(e,t)=>{let r=t[e];return r||(e>=500&&e<600&&t["5xx"]?t["5xx"]:e>=400&&e<500&&t["4xx"]?t["4xx"]:t.default)},k=e=>({name:"on-status",order:95,onResponseError:async t=>{let r=t.error?.status??t.response?.status;if(r===void 0||!t.error)return {action:"continue",context:t};let n=te(r,e);if(!n)return {action:"continue",context:t};let o=await n({status:r,error:t.error,context:t});return o?.action==="retry"?{action:"retry",delayMs:o.delayMs}:{action:"continue",context:t}}});var re=e=>{let t={...e.onStatus??{}};return e.onUnauthorized&&t[401]===void 0&&(t[401]=e.onUnauthorized),e.onForbidden&&t[403]===void 0&&(t[403]=e.onForbidden),e.onNotFound&&t[404]===void 0&&(t[404]=e.onNotFound),e.onServerError&&t["5xx"]===void 0&&t[500]===void 0&&(t["5xx"]=e.onServerError),Object.entries(t).some(([,n])=>!!n)?t:void 0},ne=e=>{if(e.auth)return e.auth;if(e.getToken)return {getToken:e.getToken}},P=e=>{let t=[],r=ne(e);r&&t.push(A(r));let n=re(e);return n&&t.push(k(n)),t};var M=new Set(["GET","HEAD","OPTIONS"]),U=new Set([502,503,504]);var _=()=>({name:"retry-idempotent",order:80,onResponseError:e=>M.has(e.request.method)&&e.meta.attempt<e.meta.maxRetries&&!!(e.error&&U.has(e.error.status))?{action:"retry",delayMs:200*(e.meta.attempt+1)}:{action:"continue",context:e}});var N=()=>({name:"sse-resume",order:20,onSseEvent:e=>e.event.event==="ping"||e.event.event==="heartbeat"?{action:"drop"}:{action:"continue",context:e},onSseReconnect:e=>(e.meta.lastEventId&&e.request.headers.set("last-event-id",e.meta.lastEventId),{action:"continue",context:e})});var D=()=>({name:"ssr-forward",order:10,onRequest:e=>e.meta.source==="browser"?{action:"skip"}:(e.incoming?.cookie&&e.request.headers.set("cookie",e.incoming.cookie),e.incoming?.authorization&&e.request.headers.set("authorization",e.incoming.authorization),e.incoming?.requestId&&e.request.headers.set("x-request-id",e.incoming.requestId),{action:"continue",context:e})});var B=()=>({name:"trace",order:0,onRequest:e=>{let t=e.incoming?.requestId??globalThis.crypto.randomUUID();return e.request.headers.set("x-request-id",t),e.meta.requestId=t,{action:"continue",context:e}}});var j={trace:B,"ssr-forward":D,"retry-idempotent":_,"sse-resume":N};var I=e=>{let t=e.ok?{status:e.status,code:"UNKNOWN",message:"Request failed",body:e.data}:e.error,r=new Error(t.message);return Object.defineProperties(r,{name:{value:"FetchError"},status:{value:t.status},code:{value:t.code},body:{value:t.body},headers:{value:e.headers},result:{value:e.ok?{ok:false,status:t.status,error:t,headers:e.headers}:e}}),r};var R=e=>e instanceof DOMException&&e.name==="AbortError"||e instanceof Error&&e.name==="AbortError";var se=(e,t)=>{let r=e.match;return r?!(r.operation&&r.operation!==t.meta.operation||r.method&&r.method!==t.request.method||r.pathPrefix&&!t.request.url.pathname.startsWith(r.pathPrefix)||r.status!==void 0&&t.response?.status!==r.status):true},T=(e,t)=>{let r=new Set(t?.eject??[]);return [...e,...t?.use??[]].filter(o=>!r.has(o.name)).sort((o,s)=>(o.order??100)-(s.order??100))},l=async(e,t,r)=>{let n=r;for(let o of e){if(!se(o,n))continue;let s=t(o);if(!s)continue;let i=await s(n)??{action:"continue",context:n};if(i.action!=="skip"){if(i.action==="drop")return {type:"drop"};if(i.action==="retry")return {type:"retry",delayMs:i.delayMs};if(i.action==="short-circuit")return {type:"short-circuit",result:i.result};n=i.context??n;}}return {type:"continue",context:n}};var ie=e=>!!(e&&e.includes("json")),L=async(e,t)=>{if(e.status===204)return null;if(t==="blob")return e.blob();if(t==="text")return e.text();let r=e.headers.get("content-type");if(t==="json"||ie(r)){let n=await e.text();return n?JSON.parse(n):null}return e.text()},z=(e,t)=>{if(e!=null)return typeof e=="string"||e instanceof FormData||e instanceof Blob||e instanceof URLSearchParams||e instanceof ArrayBuffer?e:(t.has("content-type")||t.set("content-type","application/json"),JSON.stringify(e))};var g=(e,t)=>{let r=t&&typeof t=="object"?t:void 0,n=typeof r?.code=="string"?r.code:"HTTP_ERROR",o=typeof r?.message=="string"?r.message:`Request failed with status ${e}`;return {status:e,code:n,message:o,body:t}},W=(e,t,r)=>({ok:true,status:e,data:t,headers:r}),x=(e,t,r)=>({ok:false,status:e,error:t,headers:r});var $=async e=>{let{context:t,interceptors:r,fetchImpl:n,client:o,requestOptions:s}=e;try{let i=await n(t.request.url,{method:t.request.method,headers:t.request.headers,body:z(t.request.body,t.request.headers),signal:t.request.signal,credentials:o.credentials});return ae({interceptors:r,context:t,response:i,requestOptions:s})}catch(i){if(R(i))throw i;t.error=g(0,{code:"NETWORK_ERROR",message:i instanceof Error?i.message:"Network error"});let a=await l(r,c=>c.onRequestError,t);if(a.type==="retry")return {kind:"retry",delayMs:a.delayMs};if(a.type==="short-circuit")return {kind:"result",result:a.result};throw I(x(0,t.error,new Headers))}},ae=async e=>{let{interceptors:t,response:r,requestOptions:n}=e,o={...e.context,response:r,data:await L(r,n?.parseAs)},s=r.ok?p=>p.onResponse:p=>p.onResponseError;r.ok||(o.error=g(r.status,o.data));let i=await l(t,s,o);if(i.type==="retry")return {kind:"retry",delayMs:i.delayMs};if(i.type==="short-circuit")return {kind:"result",result:i.result};let a=i.type==="continue"?i.context:o;return {kind:"result",result:r.ok?W(r.status,a.data,r.headers):x(r.status,a.error??g(r.status,a.data),r.headers)}};var ce=(e,t)=>e.replace(/:([A-Za-z0-9_]+)/g,(r,n)=>{let o=t?.[n];if(o===void 0)throw new Error(`tanstack-fetch: missing path param "${n}"`);return encodeURIComponent(String(o))}),ue=(e,t)=>{t&&Object.entries(t).forEach(([r,n])=>{n!=null&&e.searchParams.set(r,String(n));});},O=(e,t)=>{if(!(t==="browser"||!e)&&!/^https?:\/\//i.test(e))throw new Error("tanstack-fetch: set an absolute baseUrl for SSR and Edge runtimes")},H=(e,t,r,n)=>{let o=ce(t.replace(/\{([A-Za-z0-9_]+)\}/g,":$1"),r),s=/^https?:\/\//i.test(o)?o:`${(e??"").replace(/\/$/,"")}/${o.replace(/^\//,"")}`,i=new URL(s);return ue(i,n),i};var pe=e=>new Headers(e),F=(...e)=>{let t=new Headers;return e.forEach(r=>{r&&new Headers(r).forEach((n,o)=>{t.set(o,n);});}),t},w=async e=>{if(!e)return new Headers;let t=typeof e=="function"?await e():e;return pe(t)};var q=e=>new Promise(t=>setTimeout(t,e)),b=e=>{let t=e.filter(n=>!!n);if(t.length===0)return;if(t.length===1)return t[0];if(typeof AbortSignal.any=="function")return AbortSignal.any(t);let r=new AbortController;return t.forEach(n=>{if(n.aborted){r.abort(n.reason);return}n.addEventListener("abort",()=>r.abort(n.reason),{once:true});}),r.signal},G=e=>{if(!e||e<=0)return;let t=new AbortController,r=setTimeout(()=>t.abort(new Error("tanstack-fetch: request timed out")),e);return t.signal.addEventListener("abort",()=>clearTimeout(r),{once:true}),t.signal};var de=async e=>{if(e.incoming)return typeof e.incoming=="function"?e.incoming():e.incoming},le=async(e,t)=>{let{method:r,path:n,requestOptions:o,client:s}=e,i=s.source??"browser";O(s.baseUrl,i);let a=H(s.baseUrl,n,o?.params,o?.query),c=F(await w(s.headers),o?.headers),p=o?.timeoutMs??s.timeoutMs??3e4,d=b([o?.signal,G(p)]);return {request:{method:r,url:a,headers:c,body:o?.body,signal:d},incoming:await de(s),meta:{attempt:t,maxRetries:s.maxRetries??2,source:i,operation:o?.operation}}},Q=async e=>{let t=T(e.interceptors,e.requestOptions?.interceptors),r=e.client.fetch??globalThis.fetch;if(!r)throw new Error("tanstack-fetch: fetch is not available");let n=0,o=e.client.maxRetries??2;for(;n<=o;){let s=await fe({args:e,interceptors:t,fetchImpl:r,attempt:n});if(s.kind==="result")return s.result;n+=1,s.delayMs&&await q(s.delayMs);}throw new Error("tanstack-fetch: exceeded retry budget")},fe=async e=>{let t=await le(e.args,e.attempt),r=await l(e.interceptors,n=>n.onRequest,t);return r.type==="short-circuit"?{kind:"result",result:r.result}:r.type==="retry"?{kind:"retry",delayMs:r.delayMs}:(r.type==="continue"&&(t=r.context),$({requestOptions:e.args.requestOptions,client:e.args.client,interceptors:e.interceptors,fetchImpl:e.fetchImpl,context:t}))};var K=(e={})=>{let t={throwOnError:true,...e},r=[...P(t),...(t.plugins??[]).map(n=>j[n]()),...t.interceptors??[]];return {clientOptions:t,interceptors:r}},X=e=>{let{clientOptions:t,interceptors:r}=e,n=(a,c,p)=>{let d={...c,name:a,order:p?.order??c.order},h=r.findIndex(u=>u.name===a);if(h>=0){r.splice(h,1,d);return}r.push(d);},o=a=>{let c=r.findIndex(p=>p.name===a);c>=0&&r.splice(c,1);},s=(async(a,c,p)=>{let d=await Q({method:a,path:c,requestOptions:p,client:t,interceptors:r}),h=p?.throwOnError??t.throwOnError??true;if(!d.ok&&h)throw I(d);return h&&d.ok?d.data:d}),i=a=>(p,d)=>s(a,p,d);return {use:n,eject:o,request:s,get:i("GET"),post:i("POST"),put:i("PUT"),patch:i("PATCH"),delete:i("DELETE")}};var me=e=>{let t=[],r,n,o;if(e.split(`
|
|
2
|
-
`).forEach(
|
|
3
|
-
`),
|
|
1
|
+
'use strict';var A=e=>({name:"auth",order:15,onRequest:async t=>{let r=await e.getToken();if(!r)return {action:"continue",context:t};let n=e.header??"authorization",o=e.scheme===void 0?"Bearer":e.scheme,s=o?`${o} ${r}`:r;return t.request.headers.set(n,s),{action:"continue",context:t}}});var se=(e,t)=>{let r=t[e];return r||(e>=500&&e<600&&t["5xx"]?t["5xx"]:e>=400&&e<500&&t["4xx"]?t["4xx"]:t.default)},k=e=>({name:"on-status",order:95,onResponseError:async t=>{let r=t.error?.status??t.response?.status;if(r===void 0||!t.error)return {action:"continue",context:t};let n=se(r,e);if(!n)return {action:"continue",context:t};let o=await n({status:r,error:t.error,context:t});return o?.action==="retry"?{action:"retry",delayMs:o.delayMs}:{action:"continue",context:t}}});var ae=e=>{let t={...e.onStatus??{}};return e.onUnauthorized&&t[401]===void 0&&(t[401]=e.onUnauthorized),e.onForbidden&&t[403]===void 0&&(t[403]=e.onForbidden),e.onNotFound&&t[404]===void 0&&(t[404]=e.onNotFound),e.onServerError&&t["5xx"]===void 0&&t[500]===void 0&&(t["5xx"]=e.onServerError),Object.entries(t).some(([,n])=>!!n)?t:void 0},ie=e=>{if(e.auth)return e.auth;if(e.getToken)return {getToken:e.getToken}},P=e=>{let t=[],r=ie(e);r&&t.push(A(r));let n=ae(e);return n&&t.push(k(n)),t};var U=new Set(["GET","HEAD","OPTIONS"]),M=new Set([502,503,504]);var D=()=>({name:"retry-idempotent",order:80,onResponseError:e=>U.has(e.request.method)&&e.meta.attempt<e.meta.maxRetries&&!!(e.error&&M.has(e.error.status))?{action:"retry",delayMs:200*(e.meta.attempt+1)}:{action:"continue",context:e}});var B=()=>({name:"sse-resume",order:20,onSseEvent:e=>e.event.event==="ping"||e.event.event==="heartbeat"?{action:"drop"}:{action:"continue",context:e},onSseReconnect:e=>(e.meta.lastEventId&&e.request.headers.set("last-event-id",e.meta.lastEventId),{action:"continue",context:e})});var N=()=>({name:"ssr-forward",order:10,onRequest:e=>e.meta.source==="browser"?{action:"skip"}:(e.incoming?.cookie&&e.request.headers.set("cookie",e.incoming.cookie),e.incoming?.authorization&&e.request.headers.set("authorization",e.incoming.authorization),e.incoming?.requestId&&e.request.headers.set("x-request-id",e.incoming.requestId),{action:"continue",context:e})});var L=()=>({name:"trace",order:0,onRequest:e=>{let t=e.incoming?.requestId??globalThis.crypto.randomUUID();return e.request.headers.set("x-request-id",t),e.meta.requestId=t,{action:"continue",context:e}}});var _={trace:L,"ssr-forward":N,"retry-idempotent":D,"sse-resume":B};var R=e=>{let t=e.ok?{status:e.status,code:"UNKNOWN",message:"Request failed",body:e.data}:e.error,r=new Error(t.message);return Object.defineProperties(r,{name:{value:"FetchError"},status:{value:t.status},code:{value:t.code},body:{value:t.body},headers:{value:e.headers},result:{value:e.ok?{ok:false,status:t.status,error:t,headers:e.headers}:e}}),r};var T=e=>e instanceof DOMException&&e.name==="AbortError"||e instanceof Error&&e.name==="AbortError";var ue=(e,t)=>{let r=e.match;return r?!(r.operation&&r.operation!==t.meta.operation||r.method&&r.method!==t.request.method||r.pathPrefix&&!t.request.url.pathname.startsWith(r.pathPrefix)||r.status!==void 0&&t.response?.status!==r.status):true},I=(e,t)=>{let r=new Set(t?.eject??[]);return [...e,...t?.use??[]].filter(o=>!r.has(o.name)).sort((o,s)=>(o.order??100)-(s.order??100))},y=async(e,t,r)=>{let n=r;for(let o of e){if(!ue(o,n))continue;let s=t(o);if(!s)continue;let a=await s(n)??{action:"continue",context:n};if(a.action!=="skip"){if(a.action==="drop")return {type:"drop"};if(a.action==="retry")return {type:"retry",delayMs:a.delayMs};if(a.action==="short-circuit")return {type:"short-circuit",result:a.result};n=a.context??n;}}return {type:"continue",context:n}};var pe=e=>!!(e&&e.includes("json")),j=async(e,t)=>{if(e.status===204)return null;if(t==="blob")return e.blob();if(t==="text")return e.text();let r=e.headers.get("content-type");if(t==="json"||pe(r)){let n=await e.text();return n?JSON.parse(n):null}return e.text()},X=(e,t)=>{if(e!=null)return typeof e=="string"||e instanceof FormData||e instanceof Blob||e instanceof URLSearchParams||e instanceof ArrayBuffer?e:(t.has("content-type")||t.set("content-type","application/json"),JSON.stringify(e))};var S=(e,t)=>{let r=t&&typeof t=="object"?t:void 0,n=typeof r?.code=="string"?r.code:"HTTP_ERROR",o=typeof r?.message=="string"?r.message:`Request failed with status ${e}`;return {status:e,code:n,message:o,body:t}},z=(e,t,r)=>({ok:true,status:e,data:t,headers:r}),x=(e,t,r)=>({ok:false,status:e,error:t,headers:r});var de=e=>{let t=new Headers;for(let r of e.trim().split(/[\r\n]+/)){let n=r.indexOf(":");n!==-1&&t.append(r.slice(0,n).trim(),r.slice(n+1).trim());}return t},le=e=>{let t=e.lengthComputable?e.total:void 0;return {loaded:e.loaded,total:t,progress:t&&t>0?e.loaded/t:void 0}},W=e=>new Promise((t,r)=>{let n=new XMLHttpRequest;n.open(e.method,e.url.toString(),true),n.responseType="arraybuffer",n.withCredentials=e.credentials==="include",e.headers.forEach((s,a)=>{a.toLowerCase()==="content-type"&&e.body instanceof FormData||n.setRequestHeader(a,s);}),n.upload.onprogress=s=>{e.onUploadProgress(le(s));};let o=()=>n.abort();e.signal?.addEventListener("abort",o,{once:true}),n.onload=()=>{e.signal?.removeEventListener("abort",o),t(new Response(n.response.byteLength>0?n.response:null,{status:n.status,statusText:n.statusText,headers:de(n.getAllResponseHeaders())}));},n.onerror=()=>{e.signal?.removeEventListener("abort",o),r(new TypeError("Network request failed"));},n.onabort=()=>{e.signal?.removeEventListener("abort",o),r(new DOMException("The operation was aborted.","AbortError"));},n.send(e.body??null);}),$=()=>typeof XMLHttpRequest<"u";var fe=async(e,t)=>{let{context:r,fetchImpl:n,client:o,requestOptions:s}=e,a=s?.onUploadProgress;return a&&$()?W({url:r.request.url,method:r.request.method,headers:r.request.headers,body:t??null,signal:r.request.signal,credentials:o.credentials,onUploadProgress:a}):n(r.request.url,{method:r.request.method,headers:r.request.headers,body:t,signal:r.request.signal,credentials:o.credentials})},G=async e=>{let{context:t,interceptors:r,requestOptions:n}=e;try{let o=await fe(e,X(t.request.body,t.request.headers));return me({interceptors:r,context:t,response:o,requestOptions:n})}catch(o){if(T(o))throw o;t.error=S(0,{code:"NETWORK_ERROR",message:o instanceof Error?o.message:"Network error"});let s=await y(r,a=>a.onRequestError,t);if(s.type==="retry")return {kind:"retry",delayMs:s.delayMs};if(s.type==="short-circuit")return {kind:"result",result:s.result};throw R(x(0,t.error,new Headers))}},me=async e=>{let{interceptors:t,response:r,requestOptions:n}=e,o={...e.context,response:r,data:await j(r,n?.parseAs)},s=r.ok?p=>p.onResponse:p=>p.onResponseError;r.ok||(o.error=S(r.status,o.data));let a=await y(t,s,o);if(a.type==="retry")return {kind:"retry",delayMs:a.delayMs};if(a.type==="short-circuit")return {kind:"result",result:a.result};let c=a.type==="continue"?a.context:o;return {kind:"result",result:r.ok?z(r.status,c.data,r.headers):x(r.status,c.error??S(r.status,c.data),r.headers)}};var he=(e,t)=>e.replace(/:([A-Za-z0-9_]+)/g,(r,n)=>{let o=t?.[n];if(o===void 0)throw new Error(`tanstack-fetch: missing path param "${n}"`);return encodeURIComponent(String(o))}),ye=(e,t)=>{t&&Object.entries(t).forEach(([r,n])=>{n!=null&&e.searchParams.set(r,String(n));});},F=(e,t)=>{if(!(t==="browser"||!e)&&!/^https?:\/\//i.test(e))throw new Error("tanstack-fetch: set an absolute baseUrl for SSR and Edge runtimes")},H=(e,t,r,n)=>{let o=he(t.replace(/\{([A-Za-z0-9_]+)\}/g,":$1"),r),s=/^https?:\/\//i.test(o)?o:`${(e??"").replace(/\/$/,"")}/${o.replace(/^\//,"")}`,a=new URL(s);return ye(a,n),a};var Ee=e=>new Headers(e),O=(...e)=>{let t=new Headers;return e.forEach(r=>{r&&new Headers(r).forEach((n,o)=>{t.set(o,n);});}),t},b=async e=>{if(!e)return new Headers;let t=typeof e=="function"?await e():e;return Ee(t)};var w=e=>new Promise(t=>setTimeout(t,e)),q=e=>{let t=e.filter(n=>!!n);if(t.length===0)return;if(t.length===1)return t[0];if(typeof AbortSignal.any=="function")return AbortSignal.any(t);let r=new AbortController;return t.forEach(n=>{if(n.aborted){r.abort(n.reason);return}n.addEventListener("abort",()=>r.abort(n.reason),{once:true});}),r.signal},J=e=>{if(!e||e<=0)return;let t=new AbortController,r=setTimeout(()=>t.abort(new Error("tanstack-fetch: request timed out")),e);return t.signal.addEventListener("abort",()=>clearTimeout(r),{once:true}),t.signal};var ge=async e=>{if(e.incoming)return typeof e.incoming=="function"?e.incoming():e.incoming},Se=async(e,t)=>{let{method:r,path:n,requestOptions:o,client:s}=e,a=s.source??"browser";F(s.baseUrl,a);let c=H(s.baseUrl,n,o?.params,o?.query),u=O(await b(s.headers),o?.headers),p=o?.timeoutMs??s.timeoutMs??3e4,d=q([o?.signal,J(p)]);return {request:{method:r,url:c,headers:u,body:o?.body,signal:d},incoming:await ge(s),meta:{attempt:t,maxRetries:s.maxRetries??2,source:a,operation:o?.operation}}},K=async e=>{let t=I(e.interceptors,e.requestOptions?.interceptors),r=e.client.fetch??globalThis.fetch;if(!r)throw new Error("tanstack-fetch: fetch is not available");let n=0,o=e.client.maxRetries??2;for(;n<=o;){let s=await Re({args:e,interceptors:t,fetchImpl:r,attempt:n});if(s.kind==="result")return s.result;n+=1,s.delayMs&&await w(s.delayMs);}throw new Error("tanstack-fetch: exceeded retry budget")},Re=async e=>{let t=await Se(e.args,e.attempt),r=await y(e.interceptors,n=>n.onRequest,t);return r.type==="short-circuit"?{kind:"result",result:r.result}:r.type==="retry"?{kind:"retry",delayMs:r.delayMs}:(r.type==="continue"&&(t=r.context),G({requestOptions:e.args.requestOptions,client:e.args.client,interceptors:e.interceptors,fetchImpl:e.fetchImpl,context:t}))};var Te=(e,t,r)=>{if(r==null)return;let n=Array.isArray(r)?r:[r];for(let o of n)if(o!=null){if(o instanceof Blob){e.append(t,o);continue}e.append(t,String(o));}},V=(e,t)=>{for(let[r,n]of Object.entries(t))Te(e,r,n);return e},Ie=(e={})=>V(new FormData,e),Fe=e=>!!(e.file||e.files?.length||e.fields),Y=e=>{if(e.body!==void 0&&!Fe(e))return e.body;if(e.body!==void 0&&!(e.body instanceof FormData))throw new Error("tanstack-fetch: upload `body` must be FormData when using `file`, `files`, or `fields`");let t=e.body instanceof FormData?e.body:Ie();e.fields&&V(t,e.fields);let r=e.fieldName??"file";if(e.file&&t.append(r,e.file),e.files)for(let n of e.files)t.append(r,n);return t};var Z=(e={})=>{let t={throwOnError:true,...e},r=[...P(t),...(t.plugins??[]).map(n=>_[n]()),...t.interceptors??[]];return {clientOptions:t,interceptors:r}},ee=e=>{let{clientOptions:t,interceptors:r}=e,n=(u,p,d)=>{let l={...p,name:u,order:d?.order??p.order},i=r.findIndex(f=>f.name===u);if(i>=0){r.splice(i,1,l);return}r.push(l);},o=u=>{let p=r.findIndex(d=>d.name===u);p>=0&&r.splice(p,1);},s=(async(u,p,d)=>{let l=await K({method:u,path:p,requestOptions:d,client:t,interceptors:r}),i=d?.throwOnError??t.throwOnError??true;if(!l.ok&&i)throw R(l);return i&&l.ok?l.data:l}),a=u=>(d,l)=>s(u,d,l),c=((u,p)=>{let{method:d="POST",file:l,files:i,fields:f,fieldName:m,body:h,...E}=p??{};return s(d,u,{...E,body:Y({body:h,file:l,files:i,fields:f,fieldName:m}),onUploadProgress:p?.onUploadProgress})});return {use:n,eject:o,request:s,get:a("GET"),post:a("POST"),put:a("PUT"),patch:a("PATCH"),delete:a("DELETE"),upload:c}};var He=e=>{let t=[],r,n,o;if(e.split(`
|
|
2
|
+
`).forEach(c=>{if(!c.startsWith(":")){if(c.startsWith("data:")){t.push(c.slice(5).replace(/^ /,""));return}if(c.startsWith("event:")){r=c.slice(6).replace(/^ /,"");return}if(c.startsWith("id:")){n=c.slice(3).replace(/^ /,"");return}if(c.startsWith("retry:")){let u=Number.parseInt(c.slice(6).trim(),10);Number.isNaN(u)||(o=u);}}}),t.length===0&&!r)return;let s=t.join(`
|
|
3
|
+
`),a=s;if(s)try{a=JSON.parse(s);}catch{a=s;}return {event:r,data:a,id:n,retry:o}},te=e=>{let r=e.replace(/\r\n/g,`
|
|
4
4
|
`).replace(/\r/g,`
|
|
5
5
|
`).split(`
|
|
6
6
|
|
|
7
|
-
`),n=r.pop()??"";return {events:r.map(s=>
|
|
7
|
+
`),n=r.pop()??"";return {events:r.map(s=>He(s.trim())).filter(s=>!!s),rest:n}};var Oe=async e=>{if(e.incoming)return typeof e.incoming=="function"?e.incoming():e.incoming},C=async(e,t,r)=>{let n=e.client.source??"browser";F(e.client.baseUrl,n);let o=H(e.client.baseUrl,e.path,e.requestOptions?.params,e.requestOptions?.query),s=O(await b(e.client.headers),e.requestOptions?.headers);return s.set("accept","text/event-stream"),r&&s.set("last-event-id",r),{request:{method:"GET",url:o,headers:s,body:e.requestOptions?.body,signal:e.requestOptions?.signal},incoming:await Oe(e.client),meta:{attempt:t,maxRetries:e.client.maxRetries??2,source:n,operation:e.requestOptions?.operation,lastEventId:r}}};var re=e=>{let t=I(e.interceptors,e.requestOptions?.interceptors),r=e.client.fetch??globalThis.fetch,n=[],o,s="",a=e.requestOptions?.headers?new Headers(e.requestOptions.headers).get("last-event-id")??void 0:void 0,c=0,u=false,p=async()=>n.length>0?{value:n.shift(),done:false}:u?{value:void 0,done:true}:!o&&!await d()?(u=true,{value:void 0,done:true}):l(),d=async()=>{if(!r)throw new Error("tanstack-fetch: fetch is not available");let i=await C(e,c,a),f=await y(t,h=>h.onRequest,i);if(f.type==="short-circuit"||f.type==="retry")return false;f.type==="continue"&&(i=f.context);let m=await r(i.request.url,{method:"GET",headers:i.request.headers,signal:i.request.signal,credentials:e.client.credentials});if(i.response=m,!m.ok||!m.body){i.error=S(m.status,await m.text());let h=await y(t,E=>E.onSseError,i);if(h.type==="retry"&&c<i.meta.maxRetries){c+=1,await w(h.delayMs??500);let E=await y(t,g=>g.onSseReconnect,i);return E.type==="continue"&&(a=E.context.meta.lastEventId??a),d()}throw Object.assign(new Error(i.error.message),{error:i.error})}return await y(t,h=>h.onSseOpen,i),o=m.body.pipeThrough(new TextDecoderStream).getReader(),true},l=async()=>{let i=o;if(!i)return u=true,{value:void 0,done:true};let f=await i.read();if(f.done)return o=void 0,u=true,p();let m=te(s+f.value);s=m.rest;for(let h of m.events){a=h.id??a;let E=await C(e,c,a),g=await y(t,oe=>oe.onSseEvent,{...E,event:h});g.type!=="drop"&&g.type==="continue"&&g.context.event&&n.push(g.context.event);}return p()};return {next:p}};var v=e=>({[Symbol.asyncIterator]:()=>re(e)});var be=["onMessage","onEvent","onOpen","onError","onClose","lastEventId"],we=e=>{let t={},r={...e??{}},n=e?.lastEventId;for(let o of be){if(o==="lastEventId"){delete r.lastEventId;continue}e&&o in e&&(t[o]=e[o],delete r[o]);}if(n){let o=new Headers(r.headers);o.set("last-event-id",n),r.headers=o;}return {handlers:t,requestOptions:r,lastEventId:n}},qe=e=>!!(e&&(e.onMessage||e.onEvent||e.onOpen||e.onError||e.onClose)),xe=(e,t)=>{let r=new AbortController,n=q([e.requestOptions?.signal,r.signal]);return (async()=>{try{t.onOpen?.();for await(let s of v({...e,requestOptions:{...e.requestOptions,signal:n}}))t.onEvent?.(s),t.onMessage?.(s.data,s);t.onClose?.();}catch(s){if(T(s)||r.signal.aborted){t.onClose?.();return}t.onError?.(s);}})(),{close:()=>r.abort()}},ne=e=>((r,n)=>{let{handlers:o,requestOptions:s}=we(n),a={path:r,requestOptions:s,client:e.client,interceptors:e.interceptors};return qe(n)?xe(a,o):v(a)});var Ce=(e={})=>{let t=Z(e);return {...ee(t),sse:ne({client:t.clientOptions,interceptors:t.interceptors})}},Nt=Ce;exports.createClient=Nt;exports.createFetch=Ce;
|
package/dist/sse.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { C as CreateFetchOptions, F as FetchClient } from './client.type-
|
|
1
|
+
import { C as CreateFetchOptions, F as FetchClient } from './client.type-BBYqVrTM.cjs';
|
|
2
2
|
import './config.type-eG_cuxpu.cjs';
|
|
3
3
|
|
|
4
4
|
/** Full client with SSE. Prefer this when you need `api.sse()`. */
|
package/dist/sse.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { C as CreateFetchOptions, F as FetchClient } from './client.type-
|
|
1
|
+
import { C as CreateFetchOptions, F as FetchClient } from './client.type-Btgj3NQn.js';
|
|
2
2
|
import './config.type-eG_cuxpu.js';
|
|
3
3
|
|
|
4
4
|
/** Full client with SSE. Prefer this when you need `api.sse()`. */
|
package/dist/sse.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
var A=e=>({name:"auth",order:15,onRequest:async t=>{let r=await e.getToken();if(!r)return {action:"continue",context:t};let n=e.header??"authorization",o=e.scheme===void 0?"Bearer":e.scheme,s=o?`${o} ${r}`:r;return t.request.headers.set(n,s),{action:"continue",context:t}}});var te=(e,t)=>{let r=t[e];return r||(e>=500&&e<600&&t["5xx"]?t["5xx"]:e>=400&&e<500&&t["4xx"]?t["4xx"]:t.default)},k=e=>({name:"on-status",order:95,onResponseError:async t=>{let r=t.error?.status??t.response?.status;if(r===void 0||!t.error)return {action:"continue",context:t};let n=te(r,e);if(!n)return {action:"continue",context:t};let o=await n({status:r,error:t.error,context:t});return o?.action==="retry"?{action:"retry",delayMs:o.delayMs}:{action:"continue",context:t}}});var re=e=>{let t={...e.onStatus??{}};return e.onUnauthorized&&t[401]===void 0&&(t[401]=e.onUnauthorized),e.onForbidden&&t[403]===void 0&&(t[403]=e.onForbidden),e.onNotFound&&t[404]===void 0&&(t[404]=e.onNotFound),e.onServerError&&t["5xx"]===void 0&&t[500]===void 0&&(t["5xx"]=e.onServerError),Object.entries(t).some(([,n])=>!!n)?t:void 0},ne=e=>{if(e.auth)return e.auth;if(e.getToken)return {getToken:e.getToken}},P=e=>{let t=[],r=ne(e);r&&t.push(A(r));let n=re(e);return n&&t.push(k(n)),t};var M=new Set(["GET","HEAD","OPTIONS"]),U=new Set([502,503,504]);var _=()=>({name:"retry-idempotent",order:80,onResponseError:e=>M.has(e.request.method)&&e.meta.attempt<e.meta.maxRetries&&!!(e.error&&U.has(e.error.status))?{action:"retry",delayMs:200*(e.meta.attempt+1)}:{action:"continue",context:e}});var N=()=>({name:"sse-resume",order:20,onSseEvent:e=>e.event.event==="ping"||e.event.event==="heartbeat"?{action:"drop"}:{action:"continue",context:e},onSseReconnect:e=>(e.meta.lastEventId&&e.request.headers.set("last-event-id",e.meta.lastEventId),{action:"continue",context:e})});var D=()=>({name:"ssr-forward",order:10,onRequest:e=>e.meta.source==="browser"?{action:"skip"}:(e.incoming?.cookie&&e.request.headers.set("cookie",e.incoming.cookie),e.incoming?.authorization&&e.request.headers.set("authorization",e.incoming.authorization),e.incoming?.requestId&&e.request.headers.set("x-request-id",e.incoming.requestId),{action:"continue",context:e})});var B=()=>({name:"trace",order:0,onRequest:e=>{let t=e.incoming?.requestId??globalThis.crypto.randomUUID();return e.request.headers.set("x-request-id",t),e.meta.requestId=t,{action:"continue",context:e}}});var j={trace:B,"ssr-forward":D,"retry-idempotent":_,"sse-resume":N};var I=e=>{let t=e.ok?{status:e.status,code:"UNKNOWN",message:"Request failed",body:e.data}:e.error,r=new Error(t.message);return Object.defineProperties(r,{name:{value:"FetchError"},status:{value:t.status},code:{value:t.code},body:{value:t.body},headers:{value:e.headers},result:{value:e.ok?{ok:false,status:t.status,error:t,headers:e.headers}:e}}),r};var R=e=>e instanceof DOMException&&e.name==="AbortError"||e instanceof Error&&e.name==="AbortError";var se=(e,t)=>{let r=e.match;return r?!(r.operation&&r.operation!==t.meta.operation||r.method&&r.method!==t.request.method||r.pathPrefix&&!t.request.url.pathname.startsWith(r.pathPrefix)||r.status!==void 0&&t.response?.status!==r.status):true},T=(e,t)=>{let r=new Set(t?.eject??[]);return [...e,...t?.use??[]].filter(o=>!r.has(o.name)).sort((o,s)=>(o.order??100)-(s.order??100))},l=async(e,t,r)=>{let n=r;for(let o of e){if(!se(o,n))continue;let s=t(o);if(!s)continue;let i=await s(n)??{action:"continue",context:n};if(i.action!=="skip"){if(i.action==="drop")return {type:"drop"};if(i.action==="retry")return {type:"retry",delayMs:i.delayMs};if(i.action==="short-circuit")return {type:"short-circuit",result:i.result};n=i.context??n;}}return {type:"continue",context:n}};var ie=e=>!!(e&&e.includes("json")),L=async(e,t)=>{if(e.status===204)return null;if(t==="blob")return e.blob();if(t==="text")return e.text();let r=e.headers.get("content-type");if(t==="json"||ie(r)){let n=await e.text();return n?JSON.parse(n):null}return e.text()},z=(e,t)=>{if(e!=null)return typeof e=="string"||e instanceof FormData||e instanceof Blob||e instanceof URLSearchParams||e instanceof ArrayBuffer?e:(t.has("content-type")||t.set("content-type","application/json"),JSON.stringify(e))};var g=(e,t)=>{let r=t&&typeof t=="object"?t:void 0,n=typeof r?.code=="string"?r.code:"HTTP_ERROR",o=typeof r?.message=="string"?r.message:`Request failed with status ${e}`;return {status:e,code:n,message:o,body:t}},W=(e,t,r)=>({ok:true,status:e,data:t,headers:r}),x=(e,t,r)=>({ok:false,status:e,error:t,headers:r});var $=async e=>{let{context:t,interceptors:r,fetchImpl:n,client:o,requestOptions:s}=e;try{let i=await n(t.request.url,{method:t.request.method,headers:t.request.headers,body:z(t.request.body,t.request.headers),signal:t.request.signal,credentials:o.credentials});return ae({interceptors:r,context:t,response:i,requestOptions:s})}catch(i){if(R(i))throw i;t.error=g(0,{code:"NETWORK_ERROR",message:i instanceof Error?i.message:"Network error"});let a=await l(r,c=>c.onRequestError,t);if(a.type==="retry")return {kind:"retry",delayMs:a.delayMs};if(a.type==="short-circuit")return {kind:"result",result:a.result};throw I(x(0,t.error,new Headers))}},ae=async e=>{let{interceptors:t,response:r,requestOptions:n}=e,o={...e.context,response:r,data:await L(r,n?.parseAs)},s=r.ok?p=>p.onResponse:p=>p.onResponseError;r.ok||(o.error=g(r.status,o.data));let i=await l(t,s,o);if(i.type==="retry")return {kind:"retry",delayMs:i.delayMs};if(i.type==="short-circuit")return {kind:"result",result:i.result};let a=i.type==="continue"?i.context:o;return {kind:"result",result:r.ok?W(r.status,a.data,r.headers):x(r.status,a.error??g(r.status,a.data),r.headers)}};var ce=(e,t)=>e.replace(/:([A-Za-z0-9_]+)/g,(r,n)=>{let o=t?.[n];if(o===void 0)throw new Error(`tanstack-fetch: missing path param "${n}"`);return encodeURIComponent(String(o))}),ue=(e,t)=>{t&&Object.entries(t).forEach(([r,n])=>{n!=null&&e.searchParams.set(r,String(n));});},O=(e,t)=>{if(!(t==="browser"||!e)&&!/^https?:\/\//i.test(e))throw new Error("tanstack-fetch: set an absolute baseUrl for SSR and Edge runtimes")},H=(e,t,r,n)=>{let o=ce(t.replace(/\{([A-Za-z0-9_]+)\}/g,":$1"),r),s=/^https?:\/\//i.test(o)?o:`${(e??"").replace(/\/$/,"")}/${o.replace(/^\//,"")}`,i=new URL(s);return ue(i,n),i};var pe=e=>new Headers(e),F=(...e)=>{let t=new Headers;return e.forEach(r=>{r&&new Headers(r).forEach((n,o)=>{t.set(o,n);});}),t},w=async e=>{if(!e)return new Headers;let t=typeof e=="function"?await e():e;return pe(t)};var q=e=>new Promise(t=>setTimeout(t,e)),b=e=>{let t=e.filter(n=>!!n);if(t.length===0)return;if(t.length===1)return t[0];if(typeof AbortSignal.any=="function")return AbortSignal.any(t);let r=new AbortController;return t.forEach(n=>{if(n.aborted){r.abort(n.reason);return}n.addEventListener("abort",()=>r.abort(n.reason),{once:true});}),r.signal},G=e=>{if(!e||e<=0)return;let t=new AbortController,r=setTimeout(()=>t.abort(new Error("tanstack-fetch: request timed out")),e);return t.signal.addEventListener("abort",()=>clearTimeout(r),{once:true}),t.signal};var de=async e=>{if(e.incoming)return typeof e.incoming=="function"?e.incoming():e.incoming},le=async(e,t)=>{let{method:r,path:n,requestOptions:o,client:s}=e,i=s.source??"browser";O(s.baseUrl,i);let a=H(s.baseUrl,n,o?.params,o?.query),c=F(await w(s.headers),o?.headers),p=o?.timeoutMs??s.timeoutMs??3e4,d=b([o?.signal,G(p)]);return {request:{method:r,url:a,headers:c,body:o?.body,signal:d},incoming:await de(s),meta:{attempt:t,maxRetries:s.maxRetries??2,source:i,operation:o?.operation}}},Q=async e=>{let t=T(e.interceptors,e.requestOptions?.interceptors),r=e.client.fetch??globalThis.fetch;if(!r)throw new Error("tanstack-fetch: fetch is not available");let n=0,o=e.client.maxRetries??2;for(;n<=o;){let s=await fe({args:e,interceptors:t,fetchImpl:r,attempt:n});if(s.kind==="result")return s.result;n+=1,s.delayMs&&await q(s.delayMs);}throw new Error("tanstack-fetch: exceeded retry budget")},fe=async e=>{let t=await le(e.args,e.attempt),r=await l(e.interceptors,n=>n.onRequest,t);return r.type==="short-circuit"?{kind:"result",result:r.result}:r.type==="retry"?{kind:"retry",delayMs:r.delayMs}:(r.type==="continue"&&(t=r.context),$({requestOptions:e.args.requestOptions,client:e.args.client,interceptors:e.interceptors,fetchImpl:e.fetchImpl,context:t}))};var K=(e={})=>{let t={throwOnError:true,...e},r=[...P(t),...(t.plugins??[]).map(n=>j[n]()),...t.interceptors??[]];return {clientOptions:t,interceptors:r}},X=e=>{let{clientOptions:t,interceptors:r}=e,n=(a,c,p)=>{let d={...c,name:a,order:p?.order??c.order},h=r.findIndex(u=>u.name===a);if(h>=0){r.splice(h,1,d);return}r.push(d);},o=a=>{let c=r.findIndex(p=>p.name===a);c>=0&&r.splice(c,1);},s=(async(a,c,p)=>{let d=await Q({method:a,path:c,requestOptions:p,client:t,interceptors:r}),h=p?.throwOnError??t.throwOnError??true;if(!d.ok&&h)throw I(d);return h&&d.ok?d.data:d}),i=a=>(p,d)=>s(a,p,d);return {use:n,eject:o,request:s,get:i("GET"),post:i("POST"),put:i("PUT"),patch:i("PATCH"),delete:i("DELETE")}};var me=e=>{let t=[],r,n,o;if(e.split(`
|
|
2
|
-
`).forEach(
|
|
3
|
-
`),
|
|
1
|
+
var A=e=>({name:"auth",order:15,onRequest:async t=>{let r=await e.getToken();if(!r)return {action:"continue",context:t};let n=e.header??"authorization",o=e.scheme===void 0?"Bearer":e.scheme,s=o?`${o} ${r}`:r;return t.request.headers.set(n,s),{action:"continue",context:t}}});var se=(e,t)=>{let r=t[e];return r||(e>=500&&e<600&&t["5xx"]?t["5xx"]:e>=400&&e<500&&t["4xx"]?t["4xx"]:t.default)},k=e=>({name:"on-status",order:95,onResponseError:async t=>{let r=t.error?.status??t.response?.status;if(r===void 0||!t.error)return {action:"continue",context:t};let n=se(r,e);if(!n)return {action:"continue",context:t};let o=await n({status:r,error:t.error,context:t});return o?.action==="retry"?{action:"retry",delayMs:o.delayMs}:{action:"continue",context:t}}});var ae=e=>{let t={...e.onStatus??{}};return e.onUnauthorized&&t[401]===void 0&&(t[401]=e.onUnauthorized),e.onForbidden&&t[403]===void 0&&(t[403]=e.onForbidden),e.onNotFound&&t[404]===void 0&&(t[404]=e.onNotFound),e.onServerError&&t["5xx"]===void 0&&t[500]===void 0&&(t["5xx"]=e.onServerError),Object.entries(t).some(([,n])=>!!n)?t:void 0},ie=e=>{if(e.auth)return e.auth;if(e.getToken)return {getToken:e.getToken}},P=e=>{let t=[],r=ie(e);r&&t.push(A(r));let n=ae(e);return n&&t.push(k(n)),t};var U=new Set(["GET","HEAD","OPTIONS"]),M=new Set([502,503,504]);var D=()=>({name:"retry-idempotent",order:80,onResponseError:e=>U.has(e.request.method)&&e.meta.attempt<e.meta.maxRetries&&!!(e.error&&M.has(e.error.status))?{action:"retry",delayMs:200*(e.meta.attempt+1)}:{action:"continue",context:e}});var B=()=>({name:"sse-resume",order:20,onSseEvent:e=>e.event.event==="ping"||e.event.event==="heartbeat"?{action:"drop"}:{action:"continue",context:e},onSseReconnect:e=>(e.meta.lastEventId&&e.request.headers.set("last-event-id",e.meta.lastEventId),{action:"continue",context:e})});var N=()=>({name:"ssr-forward",order:10,onRequest:e=>e.meta.source==="browser"?{action:"skip"}:(e.incoming?.cookie&&e.request.headers.set("cookie",e.incoming.cookie),e.incoming?.authorization&&e.request.headers.set("authorization",e.incoming.authorization),e.incoming?.requestId&&e.request.headers.set("x-request-id",e.incoming.requestId),{action:"continue",context:e})});var L=()=>({name:"trace",order:0,onRequest:e=>{let t=e.incoming?.requestId??globalThis.crypto.randomUUID();return e.request.headers.set("x-request-id",t),e.meta.requestId=t,{action:"continue",context:e}}});var _={trace:L,"ssr-forward":N,"retry-idempotent":D,"sse-resume":B};var R=e=>{let t=e.ok?{status:e.status,code:"UNKNOWN",message:"Request failed",body:e.data}:e.error,r=new Error(t.message);return Object.defineProperties(r,{name:{value:"FetchError"},status:{value:t.status},code:{value:t.code},body:{value:t.body},headers:{value:e.headers},result:{value:e.ok?{ok:false,status:t.status,error:t,headers:e.headers}:e}}),r};var T=e=>e instanceof DOMException&&e.name==="AbortError"||e instanceof Error&&e.name==="AbortError";var ue=(e,t)=>{let r=e.match;return r?!(r.operation&&r.operation!==t.meta.operation||r.method&&r.method!==t.request.method||r.pathPrefix&&!t.request.url.pathname.startsWith(r.pathPrefix)||r.status!==void 0&&t.response?.status!==r.status):true},I=(e,t)=>{let r=new Set(t?.eject??[]);return [...e,...t?.use??[]].filter(o=>!r.has(o.name)).sort((o,s)=>(o.order??100)-(s.order??100))},y=async(e,t,r)=>{let n=r;for(let o of e){if(!ue(o,n))continue;let s=t(o);if(!s)continue;let a=await s(n)??{action:"continue",context:n};if(a.action!=="skip"){if(a.action==="drop")return {type:"drop"};if(a.action==="retry")return {type:"retry",delayMs:a.delayMs};if(a.action==="short-circuit")return {type:"short-circuit",result:a.result};n=a.context??n;}}return {type:"continue",context:n}};var pe=e=>!!(e&&e.includes("json")),j=async(e,t)=>{if(e.status===204)return null;if(t==="blob")return e.blob();if(t==="text")return e.text();let r=e.headers.get("content-type");if(t==="json"||pe(r)){let n=await e.text();return n?JSON.parse(n):null}return e.text()},X=(e,t)=>{if(e!=null)return typeof e=="string"||e instanceof FormData||e instanceof Blob||e instanceof URLSearchParams||e instanceof ArrayBuffer?e:(t.has("content-type")||t.set("content-type","application/json"),JSON.stringify(e))};var S=(e,t)=>{let r=t&&typeof t=="object"?t:void 0,n=typeof r?.code=="string"?r.code:"HTTP_ERROR",o=typeof r?.message=="string"?r.message:`Request failed with status ${e}`;return {status:e,code:n,message:o,body:t}},z=(e,t,r)=>({ok:true,status:e,data:t,headers:r}),x=(e,t,r)=>({ok:false,status:e,error:t,headers:r});var de=e=>{let t=new Headers;for(let r of e.trim().split(/[\r\n]+/)){let n=r.indexOf(":");n!==-1&&t.append(r.slice(0,n).trim(),r.slice(n+1).trim());}return t},le=e=>{let t=e.lengthComputable?e.total:void 0;return {loaded:e.loaded,total:t,progress:t&&t>0?e.loaded/t:void 0}},W=e=>new Promise((t,r)=>{let n=new XMLHttpRequest;n.open(e.method,e.url.toString(),true),n.responseType="arraybuffer",n.withCredentials=e.credentials==="include",e.headers.forEach((s,a)=>{a.toLowerCase()==="content-type"&&e.body instanceof FormData||n.setRequestHeader(a,s);}),n.upload.onprogress=s=>{e.onUploadProgress(le(s));};let o=()=>n.abort();e.signal?.addEventListener("abort",o,{once:true}),n.onload=()=>{e.signal?.removeEventListener("abort",o),t(new Response(n.response.byteLength>0?n.response:null,{status:n.status,statusText:n.statusText,headers:de(n.getAllResponseHeaders())}));},n.onerror=()=>{e.signal?.removeEventListener("abort",o),r(new TypeError("Network request failed"));},n.onabort=()=>{e.signal?.removeEventListener("abort",o),r(new DOMException("The operation was aborted.","AbortError"));},n.send(e.body??null);}),$=()=>typeof XMLHttpRequest<"u";var fe=async(e,t)=>{let{context:r,fetchImpl:n,client:o,requestOptions:s}=e,a=s?.onUploadProgress;return a&&$()?W({url:r.request.url,method:r.request.method,headers:r.request.headers,body:t??null,signal:r.request.signal,credentials:o.credentials,onUploadProgress:a}):n(r.request.url,{method:r.request.method,headers:r.request.headers,body:t,signal:r.request.signal,credentials:o.credentials})},G=async e=>{let{context:t,interceptors:r,requestOptions:n}=e;try{let o=await fe(e,X(t.request.body,t.request.headers));return me({interceptors:r,context:t,response:o,requestOptions:n})}catch(o){if(T(o))throw o;t.error=S(0,{code:"NETWORK_ERROR",message:o instanceof Error?o.message:"Network error"});let s=await y(r,a=>a.onRequestError,t);if(s.type==="retry")return {kind:"retry",delayMs:s.delayMs};if(s.type==="short-circuit")return {kind:"result",result:s.result};throw R(x(0,t.error,new Headers))}},me=async e=>{let{interceptors:t,response:r,requestOptions:n}=e,o={...e.context,response:r,data:await j(r,n?.parseAs)},s=r.ok?p=>p.onResponse:p=>p.onResponseError;r.ok||(o.error=S(r.status,o.data));let a=await y(t,s,o);if(a.type==="retry")return {kind:"retry",delayMs:a.delayMs};if(a.type==="short-circuit")return {kind:"result",result:a.result};let c=a.type==="continue"?a.context:o;return {kind:"result",result:r.ok?z(r.status,c.data,r.headers):x(r.status,c.error??S(r.status,c.data),r.headers)}};var he=(e,t)=>e.replace(/:([A-Za-z0-9_]+)/g,(r,n)=>{let o=t?.[n];if(o===void 0)throw new Error(`tanstack-fetch: missing path param "${n}"`);return encodeURIComponent(String(o))}),ye=(e,t)=>{t&&Object.entries(t).forEach(([r,n])=>{n!=null&&e.searchParams.set(r,String(n));});},F=(e,t)=>{if(!(t==="browser"||!e)&&!/^https?:\/\//i.test(e))throw new Error("tanstack-fetch: set an absolute baseUrl for SSR and Edge runtimes")},H=(e,t,r,n)=>{let o=he(t.replace(/\{([A-Za-z0-9_]+)\}/g,":$1"),r),s=/^https?:\/\//i.test(o)?o:`${(e??"").replace(/\/$/,"")}/${o.replace(/^\//,"")}`,a=new URL(s);return ye(a,n),a};var Ee=e=>new Headers(e),O=(...e)=>{let t=new Headers;return e.forEach(r=>{r&&new Headers(r).forEach((n,o)=>{t.set(o,n);});}),t},b=async e=>{if(!e)return new Headers;let t=typeof e=="function"?await e():e;return Ee(t)};var w=e=>new Promise(t=>setTimeout(t,e)),q=e=>{let t=e.filter(n=>!!n);if(t.length===0)return;if(t.length===1)return t[0];if(typeof AbortSignal.any=="function")return AbortSignal.any(t);let r=new AbortController;return t.forEach(n=>{if(n.aborted){r.abort(n.reason);return}n.addEventListener("abort",()=>r.abort(n.reason),{once:true});}),r.signal},J=e=>{if(!e||e<=0)return;let t=new AbortController,r=setTimeout(()=>t.abort(new Error("tanstack-fetch: request timed out")),e);return t.signal.addEventListener("abort",()=>clearTimeout(r),{once:true}),t.signal};var ge=async e=>{if(e.incoming)return typeof e.incoming=="function"?e.incoming():e.incoming},Se=async(e,t)=>{let{method:r,path:n,requestOptions:o,client:s}=e,a=s.source??"browser";F(s.baseUrl,a);let c=H(s.baseUrl,n,o?.params,o?.query),u=O(await b(s.headers),o?.headers),p=o?.timeoutMs??s.timeoutMs??3e4,d=q([o?.signal,J(p)]);return {request:{method:r,url:c,headers:u,body:o?.body,signal:d},incoming:await ge(s),meta:{attempt:t,maxRetries:s.maxRetries??2,source:a,operation:o?.operation}}},K=async e=>{let t=I(e.interceptors,e.requestOptions?.interceptors),r=e.client.fetch??globalThis.fetch;if(!r)throw new Error("tanstack-fetch: fetch is not available");let n=0,o=e.client.maxRetries??2;for(;n<=o;){let s=await Re({args:e,interceptors:t,fetchImpl:r,attempt:n});if(s.kind==="result")return s.result;n+=1,s.delayMs&&await w(s.delayMs);}throw new Error("tanstack-fetch: exceeded retry budget")},Re=async e=>{let t=await Se(e.args,e.attempt),r=await y(e.interceptors,n=>n.onRequest,t);return r.type==="short-circuit"?{kind:"result",result:r.result}:r.type==="retry"?{kind:"retry",delayMs:r.delayMs}:(r.type==="continue"&&(t=r.context),G({requestOptions:e.args.requestOptions,client:e.args.client,interceptors:e.interceptors,fetchImpl:e.fetchImpl,context:t}))};var Te=(e,t,r)=>{if(r==null)return;let n=Array.isArray(r)?r:[r];for(let o of n)if(o!=null){if(o instanceof Blob){e.append(t,o);continue}e.append(t,String(o));}},V=(e,t)=>{for(let[r,n]of Object.entries(t))Te(e,r,n);return e},Ie=(e={})=>V(new FormData,e),Fe=e=>!!(e.file||e.files?.length||e.fields),Y=e=>{if(e.body!==void 0&&!Fe(e))return e.body;if(e.body!==void 0&&!(e.body instanceof FormData))throw new Error("tanstack-fetch: upload `body` must be FormData when using `file`, `files`, or `fields`");let t=e.body instanceof FormData?e.body:Ie();e.fields&&V(t,e.fields);let r=e.fieldName??"file";if(e.file&&t.append(r,e.file),e.files)for(let n of e.files)t.append(r,n);return t};var Z=(e={})=>{let t={throwOnError:true,...e},r=[...P(t),...(t.plugins??[]).map(n=>_[n]()),...t.interceptors??[]];return {clientOptions:t,interceptors:r}},ee=e=>{let{clientOptions:t,interceptors:r}=e,n=(u,p,d)=>{let l={...p,name:u,order:d?.order??p.order},i=r.findIndex(f=>f.name===u);if(i>=0){r.splice(i,1,l);return}r.push(l);},o=u=>{let p=r.findIndex(d=>d.name===u);p>=0&&r.splice(p,1);},s=(async(u,p,d)=>{let l=await K({method:u,path:p,requestOptions:d,client:t,interceptors:r}),i=d?.throwOnError??t.throwOnError??true;if(!l.ok&&i)throw R(l);return i&&l.ok?l.data:l}),a=u=>(d,l)=>s(u,d,l),c=((u,p)=>{let{method:d="POST",file:l,files:i,fields:f,fieldName:m,body:h,...E}=p??{};return s(d,u,{...E,body:Y({body:h,file:l,files:i,fields:f,fieldName:m}),onUploadProgress:p?.onUploadProgress})});return {use:n,eject:o,request:s,get:a("GET"),post:a("POST"),put:a("PUT"),patch:a("PATCH"),delete:a("DELETE"),upload:c}};var He=e=>{let t=[],r,n,o;if(e.split(`
|
|
2
|
+
`).forEach(c=>{if(!c.startsWith(":")){if(c.startsWith("data:")){t.push(c.slice(5).replace(/^ /,""));return}if(c.startsWith("event:")){r=c.slice(6).replace(/^ /,"");return}if(c.startsWith("id:")){n=c.slice(3).replace(/^ /,"");return}if(c.startsWith("retry:")){let u=Number.parseInt(c.slice(6).trim(),10);Number.isNaN(u)||(o=u);}}}),t.length===0&&!r)return;let s=t.join(`
|
|
3
|
+
`),a=s;if(s)try{a=JSON.parse(s);}catch{a=s;}return {event:r,data:a,id:n,retry:o}},te=e=>{let r=e.replace(/\r\n/g,`
|
|
4
4
|
`).replace(/\r/g,`
|
|
5
5
|
`).split(`
|
|
6
6
|
|
|
7
|
-
`),n=r.pop()??"";return {events:r.map(s=>
|
|
7
|
+
`),n=r.pop()??"";return {events:r.map(s=>He(s.trim())).filter(s=>!!s),rest:n}};var Oe=async e=>{if(e.incoming)return typeof e.incoming=="function"?e.incoming():e.incoming},C=async(e,t,r)=>{let n=e.client.source??"browser";F(e.client.baseUrl,n);let o=H(e.client.baseUrl,e.path,e.requestOptions?.params,e.requestOptions?.query),s=O(await b(e.client.headers),e.requestOptions?.headers);return s.set("accept","text/event-stream"),r&&s.set("last-event-id",r),{request:{method:"GET",url:o,headers:s,body:e.requestOptions?.body,signal:e.requestOptions?.signal},incoming:await Oe(e.client),meta:{attempt:t,maxRetries:e.client.maxRetries??2,source:n,operation:e.requestOptions?.operation,lastEventId:r}}};var re=e=>{let t=I(e.interceptors,e.requestOptions?.interceptors),r=e.client.fetch??globalThis.fetch,n=[],o,s="",a=e.requestOptions?.headers?new Headers(e.requestOptions.headers).get("last-event-id")??void 0:void 0,c=0,u=false,p=async()=>n.length>0?{value:n.shift(),done:false}:u?{value:void 0,done:true}:!o&&!await d()?(u=true,{value:void 0,done:true}):l(),d=async()=>{if(!r)throw new Error("tanstack-fetch: fetch is not available");let i=await C(e,c,a),f=await y(t,h=>h.onRequest,i);if(f.type==="short-circuit"||f.type==="retry")return false;f.type==="continue"&&(i=f.context);let m=await r(i.request.url,{method:"GET",headers:i.request.headers,signal:i.request.signal,credentials:e.client.credentials});if(i.response=m,!m.ok||!m.body){i.error=S(m.status,await m.text());let h=await y(t,E=>E.onSseError,i);if(h.type==="retry"&&c<i.meta.maxRetries){c+=1,await w(h.delayMs??500);let E=await y(t,g=>g.onSseReconnect,i);return E.type==="continue"&&(a=E.context.meta.lastEventId??a),d()}throw Object.assign(new Error(i.error.message),{error:i.error})}return await y(t,h=>h.onSseOpen,i),o=m.body.pipeThrough(new TextDecoderStream).getReader(),true},l=async()=>{let i=o;if(!i)return u=true,{value:void 0,done:true};let f=await i.read();if(f.done)return o=void 0,u=true,p();let m=te(s+f.value);s=m.rest;for(let h of m.events){a=h.id??a;let E=await C(e,c,a),g=await y(t,oe=>oe.onSseEvent,{...E,event:h});g.type!=="drop"&&g.type==="continue"&&g.context.event&&n.push(g.context.event);}return p()};return {next:p}};var v=e=>({[Symbol.asyncIterator]:()=>re(e)});var be=["onMessage","onEvent","onOpen","onError","onClose","lastEventId"],we=e=>{let t={},r={...e??{}},n=e?.lastEventId;for(let o of be){if(o==="lastEventId"){delete r.lastEventId;continue}e&&o in e&&(t[o]=e[o],delete r[o]);}if(n){let o=new Headers(r.headers);o.set("last-event-id",n),r.headers=o;}return {handlers:t,requestOptions:r,lastEventId:n}},qe=e=>!!(e&&(e.onMessage||e.onEvent||e.onOpen||e.onError||e.onClose)),xe=(e,t)=>{let r=new AbortController,n=q([e.requestOptions?.signal,r.signal]);return (async()=>{try{t.onOpen?.();for await(let s of v({...e,requestOptions:{...e.requestOptions,signal:n}}))t.onEvent?.(s),t.onMessage?.(s.data,s);t.onClose?.();}catch(s){if(T(s)||r.signal.aborted){t.onClose?.();return}t.onError?.(s);}})(),{close:()=>r.abort()}},ne=e=>((r,n)=>{let{handlers:o,requestOptions:s}=we(n),a={path:r,requestOptions:s,client:e.client,interceptors:e.interceptors};return qe(n)?xe(a,o):v(a)});var Ce=(e={})=>{let t=Z(e);return {...ee(t),sse:ne({client:t.clientOptions,interceptors:t.interceptors})}},Nt=Ce;export{Nt as createClient,Ce as createFetch};
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tanstack-fetch",
|
|
3
|
-
"version": "1.0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "1.0.3",
|
|
4
|
+
"description": "TypeScript fetch / HTTP client for TanStack Query & React Query. Next.js SSR, interceptors, SSE, file upload, OpenAPI — lightweight axios alternative (~3.5KB).",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "Mohammad Garmabi",
|
|
@@ -18,17 +18,41 @@
|
|
|
18
18
|
"homepage": "https://github.com/mohamadgarmabi/tanstack-fetch#readme",
|
|
19
19
|
"keywords": [
|
|
20
20
|
"fetch",
|
|
21
|
+
"http-client",
|
|
21
22
|
"http",
|
|
23
|
+
"api-client",
|
|
24
|
+
"rest-client",
|
|
22
25
|
"typescript",
|
|
23
26
|
"tanstack",
|
|
24
27
|
"tanstack-query",
|
|
28
|
+
"tanstack-react-query",
|
|
25
29
|
"react-query",
|
|
30
|
+
"@tanstack/react-query",
|
|
31
|
+
"queryfn",
|
|
32
|
+
"react",
|
|
33
|
+
"nextjs",
|
|
34
|
+
"next.js",
|
|
26
35
|
"ssr",
|
|
36
|
+
"server-side-rendering",
|
|
37
|
+
"edge",
|
|
27
38
|
"sse",
|
|
39
|
+
"server-sent-events",
|
|
40
|
+
"streaming",
|
|
28
41
|
"openapi",
|
|
29
|
-
"
|
|
30
|
-
"
|
|
31
|
-
"interceptor"
|
|
42
|
+
"openapi-codegen",
|
|
43
|
+
"codegen",
|
|
44
|
+
"interceptor",
|
|
45
|
+
"middleware",
|
|
46
|
+
"axios-alternative",
|
|
47
|
+
"axios",
|
|
48
|
+
"ky",
|
|
49
|
+
"ofetch",
|
|
50
|
+
"multipart",
|
|
51
|
+
"formdata",
|
|
52
|
+
"file-upload",
|
|
53
|
+
"upload-progress",
|
|
54
|
+
"abortsignal",
|
|
55
|
+
"fetch-wrapper"
|
|
32
56
|
],
|
|
33
57
|
"type": "module",
|
|
34
58
|
"sideEffects": false,
|