tanstack-fetch 1.0.1 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -474,6 +474,87 @@ await api.request<User>('GET', '/users/:id', { params: { id: '1' } })
474
474
 
475
475
  ---
476
476
 
477
+ ## Upload
478
+
479
+ `FormData` / `Blob` / `File` are sent as-is (no JSON, no forced `Content-Type` — the boundary stays correct).
480
+
481
+ The call still returns the **typed response body** from the server (same as `post`), not a special upload envelope.
482
+
483
+ ### `api.upload()` — file + fields + progress
484
+
485
+ ```ts
486
+ type UploadResponse = { id: string; url: string }
487
+
488
+ const file = input.files[0]
489
+
490
+ const uploaded = await api.upload<UploadResponse>('/files', {
491
+ file,
492
+ fieldName: 'avatar', // default: 'file'
493
+ fields: { folder: 'avatars', public: true },
494
+ onUploadProgress: ({ loaded, total, progress }) => {
495
+ // progress is 0–1 when total is known (browser / XHR)
496
+ console.log(loaded, total, progress)
497
+ },
498
+ })
499
+
500
+ uploaded.url
501
+ ```
502
+
503
+ Multiple files or raw `FormData`:
504
+
505
+ ```ts
506
+ await api.upload('/docs', {
507
+ method: 'PUT',
508
+ files: [fileA, fileB],
509
+ fieldName: 'docs',
510
+ })
511
+
512
+ await api.upload<UploadResponse>('/files', {
513
+ body: createFormData({ file, note: 'cv' }),
514
+ })
515
+ ```
516
+
517
+ ### `createFormData` helper
518
+
519
+ ```ts
520
+ import { createFetch, createFormData } from 'tanstack-fetch'
521
+
522
+ const api = createFetch({ baseUrl: 'https://api.example.com' })
523
+
524
+ const body = createFormData({
525
+ title: 'Report',
526
+ tags: ['a', 'b'], // repeated field
527
+ file,
528
+ })
529
+
530
+ await api.post<UploadResponse>('/files', {
531
+ body,
532
+ onUploadProgress: ({ progress }) => console.log(progress),
533
+ })
534
+ ```
535
+
536
+ | Option | Notes |
537
+ | --- | --- |
538
+ | `file` / `files` | Appended under `fieldName` (default `"file"`) |
539
+ | `fields` | Extra multipart values (string / number / boolean / `Blob` / arrays) |
540
+ | `body` | Pre-built `FormData` / `Blob` / … |
541
+ | `method` | `POST` (default), `PUT`, or `PATCH` |
542
+ | `onUploadProgress` | Browser-only — uses XHR under the hood (`fetch` has no upload progress). No-ops on runtimes without `XMLHttpRequest` (falls back to `fetch`) |
543
+
544
+ Works with TanStack Query mutations the same way as `post`:
545
+
546
+ ```ts
547
+ useMutation({
548
+ mutationFn: (file: File) =>
549
+ api.upload<UploadResponse>('/files', {
550
+ file,
551
+ onUploadProgress: ({ progress }) => setProgress(progress ?? 0),
552
+ }),
553
+ })
554
+ ```
555
+
556
+ ---
557
+
477
558
  ## `FetchError`
478
559
 
479
560
  ```ts
@@ -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,6 +1,6 @@
1
1
  {
2
2
  "name": "tanstack-fetch",
3
- "version": "1.0.1",
3
+ "version": "1.0.2",
4
4
  "description": "TanStack Query–ready fetch client for React and Next.js. SSR, SSE, interceptors, OpenAPI codegen.",
5
5
  "license": "MIT",
6
6
  "author": {