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 CHANGED
@@ -1,21 +1,63 @@
1
1
  # tanstack-fetch
2
2
 
3
- Typed `fetch` client shaped for **TanStack Query** — tiny HTTP core, optional SSE / React.
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
+ [![npm version](https://img.shields.io/npm/v/tanstack-fetch.svg)](https://www.npmjs.com/package/tanstack-fetch)
6
+ [![npm downloads](https://img.shields.io/npm/dm/tanstack-fetch.svg)](https://www.npmjs.com/package/tanstack-fetch)
7
+ [![bundlephobia](https://img.shields.io/bundlephobia/minzip/tanstack-fetch)](https://bundlephobia.com/package/tanstack-fetch)
8
+ [![license](https://img.shields.io/npm/l/tanstack-fetch.svg)](./LICENSE)
9
+ [![Node.js](https://img.shields.io/node/v/tanstack-fetch.svg)](https://nodejs.org)
10
+ [![TypeScript](https://img.shields.io/badge/TypeScript-ready-3178c6.svg)](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
- ```bash
13
- npm install tanstack-fetch
14
- ```
49
+ ### Compared to axios, ky, ofetch
15
50
 
16
- Node 18+ (native `fetch`).
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
- > Not an official TanStack package built to fit the same mental model as `@tanstack/react-query`.
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, CreateClientOptions as a, SseEvent as b, SseHandlers as c, SseSubscription as d };
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, CreateClientOptions as a, SseEvent as b, SseHandlers as c, SseSubscription as d };
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=ae;exports.createFetch=B;exports.createFetchError=d;exports.isAbortError=h;exports.isFetchError=J;exports.unwrap=k;exports.unwrapAsync=X;
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-BE-mgD4y.cjs';
2
- export { a as CreateClientOptions, H as HttpClient, R as RequestOptions, S as SseCallOptions, b as SseEvent, c as SseHandlers, d as SseSubscription } from './client.type-BE-mgD4y.cjs';
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-D1zw5tFf.js';
2
- export { a as CreateClientOptions, H as HttpClient, R as RequestOptions, S as SseCallOptions, b as SseEvent, c as SseHandlers, d as SseSubscription } from './client.type-D1zw5tFf.js';
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{ae as createClient,B as createFetch,d as createFetchError,h as isAbortError,J as isFetchError,k as unwrap,X as unwrapAsync};
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(a=>{if(!a.startsWith(":")){if(a.startsWith("data:")){t.push(a.slice(5).replace(/^ /,""));return}if(a.startsWith("event:")){r=a.slice(6).replace(/^ /,"");return}if(a.startsWith("id:")){n=a.slice(3).replace(/^ /,"");return}if(a.startsWith("retry:")){let c=Number.parseInt(a.slice(6).trim(),10);Number.isNaN(c)||(o=c);}}}),t.length===0&&!r)return;let s=t.join(`
3
- `),i=s;if(s)try{i=JSON.parse(s);}catch{i=s;}return {event:r,data:i,id:n,retry:o}},Y=e=>{let r=e.replace(/\r\n/g,`
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=>me(s.trim())).filter(s=>!!s),rest:n}};var he=async e=>{if(e.incoming)return typeof e.incoming=="function"?e.incoming():e.incoming},v=async(e,t,r)=>{let n=e.client.source??"browser";O(e.client.baseUrl,n);let o=H(e.client.baseUrl,e.path,e.requestOptions?.params,e.requestOptions?.query),s=F(await w(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 he(e.client),meta:{attempt:t,maxRetries:e.client.maxRetries??2,source:n,operation:e.requestOptions?.operation,lastEventId:r}}};var Z=e=>{let t=T(e.interceptors,e.requestOptions?.interceptors),r=e.client.fetch??globalThis.fetch,n=[],o,s="",i=e.requestOptions?.headers?new Headers(e.requestOptions.headers).get("last-event-id")??void 0:void 0,a=0,c=false,p=async()=>n.length>0?{value:n.shift(),done:false}:c?{value:void 0,done:true}:!o&&!await d()?(c=true,{value:void 0,done:true}):h(),d=async()=>{if(!r)throw new Error("tanstack-fetch: fetch is not available");let u=await v(e,a,i),y=await l(t,m=>m.onRequest,u);if(y.type==="short-circuit"||y.type==="retry")return false;y.type==="continue"&&(u=y.context);let f=await r(u.request.url,{method:"GET",headers:u.request.headers,signal:u.request.signal,credentials:e.client.credentials});if(u.response=f,!f.ok||!f.body){u.error=g(f.status,await f.text());let m=await l(t,E=>E.onSseError,u);if(m.type==="retry"&&a<u.meta.maxRetries){a+=1,await q(m.delayMs??500);let E=await l(t,S=>S.onSseReconnect,u);return E.type==="continue"&&(i=E.context.meta.lastEventId??i),d()}throw Object.assign(new Error(u.error.message),{error:u.error})}return await l(t,m=>m.onSseOpen,u),o=f.body.pipeThrough(new TextDecoderStream).getReader(),true},h=async()=>{let u=o;if(!u)return c=true,{value:void 0,done:true};let y=await u.read();if(y.done)return o=void 0,c=true,p();let f=Y(s+y.value);s=f.rest;for(let m of f.events){i=m.id??i;let E=await v(e,a,i),S=await l(t,ee=>ee.onSseEvent,{...E,event:m});S.type!=="drop"&&S.type==="continue"&&S.context.event&&n.push(S.context.event);}return p()};return {next:p}};var C=e=>({[Symbol.asyncIterator]:()=>Z(e)});var ye=["onMessage","onEvent","onOpen","onError","onClose","lastEventId"],Ee=e=>{let t={},r={...e??{}},n=e?.lastEventId;for(let o of ye){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}},Se=e=>!!(e&&(e.onMessage||e.onEvent||e.onOpen||e.onError||e.onClose)),ge=(e,t)=>{let r=new AbortController,n=b([e.requestOptions?.signal,r.signal]);return (async()=>{try{t.onOpen?.();for await(let s of C({...e,requestOptions:{...e.requestOptions,signal:n}}))t.onEvent?.(s),t.onMessage?.(s.data,s);t.onClose?.();}catch(s){if(R(s)||r.signal.aborted){t.onClose?.();return}t.onError?.(s);}})(),{close:()=>r.abort()}},V=e=>((r,n)=>{let{handlers:o,requestOptions:s}=Ee(n),i={path:r,requestOptions:s,client:e.client,interceptors:e.interceptors};return Se(n)?ge(i,o):C(i)});var Ie=(e={})=>{let t=K(e);return {...X(t),sse:V({client:t.clientOptions,interceptors:t.interceptors})}},Ft=Ie;exports.createClient=Ft;exports.createFetch=Ie;
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-BE-mgD4y.cjs';
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-D1zw5tFf.js';
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(a=>{if(!a.startsWith(":")){if(a.startsWith("data:")){t.push(a.slice(5).replace(/^ /,""));return}if(a.startsWith("event:")){r=a.slice(6).replace(/^ /,"");return}if(a.startsWith("id:")){n=a.slice(3).replace(/^ /,"");return}if(a.startsWith("retry:")){let c=Number.parseInt(a.slice(6).trim(),10);Number.isNaN(c)||(o=c);}}}),t.length===0&&!r)return;let s=t.join(`
3
- `),i=s;if(s)try{i=JSON.parse(s);}catch{i=s;}return {event:r,data:i,id:n,retry:o}},Y=e=>{let r=e.replace(/\r\n/g,`
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=>me(s.trim())).filter(s=>!!s),rest:n}};var he=async e=>{if(e.incoming)return typeof e.incoming=="function"?e.incoming():e.incoming},v=async(e,t,r)=>{let n=e.client.source??"browser";O(e.client.baseUrl,n);let o=H(e.client.baseUrl,e.path,e.requestOptions?.params,e.requestOptions?.query),s=F(await w(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 he(e.client),meta:{attempt:t,maxRetries:e.client.maxRetries??2,source:n,operation:e.requestOptions?.operation,lastEventId:r}}};var Z=e=>{let t=T(e.interceptors,e.requestOptions?.interceptors),r=e.client.fetch??globalThis.fetch,n=[],o,s="",i=e.requestOptions?.headers?new Headers(e.requestOptions.headers).get("last-event-id")??void 0:void 0,a=0,c=false,p=async()=>n.length>0?{value:n.shift(),done:false}:c?{value:void 0,done:true}:!o&&!await d()?(c=true,{value:void 0,done:true}):h(),d=async()=>{if(!r)throw new Error("tanstack-fetch: fetch is not available");let u=await v(e,a,i),y=await l(t,m=>m.onRequest,u);if(y.type==="short-circuit"||y.type==="retry")return false;y.type==="continue"&&(u=y.context);let f=await r(u.request.url,{method:"GET",headers:u.request.headers,signal:u.request.signal,credentials:e.client.credentials});if(u.response=f,!f.ok||!f.body){u.error=g(f.status,await f.text());let m=await l(t,E=>E.onSseError,u);if(m.type==="retry"&&a<u.meta.maxRetries){a+=1,await q(m.delayMs??500);let E=await l(t,S=>S.onSseReconnect,u);return E.type==="continue"&&(i=E.context.meta.lastEventId??i),d()}throw Object.assign(new Error(u.error.message),{error:u.error})}return await l(t,m=>m.onSseOpen,u),o=f.body.pipeThrough(new TextDecoderStream).getReader(),true},h=async()=>{let u=o;if(!u)return c=true,{value:void 0,done:true};let y=await u.read();if(y.done)return o=void 0,c=true,p();let f=Y(s+y.value);s=f.rest;for(let m of f.events){i=m.id??i;let E=await v(e,a,i),S=await l(t,ee=>ee.onSseEvent,{...E,event:m});S.type!=="drop"&&S.type==="continue"&&S.context.event&&n.push(S.context.event);}return p()};return {next:p}};var C=e=>({[Symbol.asyncIterator]:()=>Z(e)});var ye=["onMessage","onEvent","onOpen","onError","onClose","lastEventId"],Ee=e=>{let t={},r={...e??{}},n=e?.lastEventId;for(let o of ye){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}},Se=e=>!!(e&&(e.onMessage||e.onEvent||e.onOpen||e.onError||e.onClose)),ge=(e,t)=>{let r=new AbortController,n=b([e.requestOptions?.signal,r.signal]);return (async()=>{try{t.onOpen?.();for await(let s of C({...e,requestOptions:{...e.requestOptions,signal:n}}))t.onEvent?.(s),t.onMessage?.(s.data,s);t.onClose?.();}catch(s){if(R(s)||r.signal.aborted){t.onClose?.();return}t.onError?.(s);}})(),{close:()=>r.abort()}},V=e=>((r,n)=>{let{handlers:o,requestOptions:s}=Ee(n),i={path:r,requestOptions:s,client:e.client,interceptors:e.interceptors};return Se(n)?ge(i,o):C(i)});var Ie=(e={})=>{let t=K(e);return {...X(t),sse:V({client:t.clientOptions,interceptors:t.interceptors})}},Ft=Ie;export{Ft as createClient,Ie as createFetch};
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.1",
4
- "description": "TanStack Query–ready fetch client for React and Next.js. SSR, SSE, interceptors, OpenAPI codegen.",
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
- "nextjs",
30
- "react",
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,