tanstack-fetch 1.0.0 → 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 +134 -3
- package/dist/cli.js +22 -239
- package/dist/client.type-BBYqVrTM.d.cts +156 -0
- package/dist/client.type-Btgj3NQn.d.ts +156 -0
- package/dist/config.type-eG_cuxpu.d.cts +132 -0
- package/dist/config.type-eG_cuxpu.d.ts +132 -0
- package/dist/index.cjs +2 -881
- package/dist/index.d.cts +23 -17
- package/dist/index.d.ts +23 -17
- package/dist/index.js +2 -3
- package/dist/plugins.cjs +1 -0
- package/dist/plugins.d.cts +19 -0
- package/dist/plugins.d.ts +19 -0
- package/dist/plugins.js +1 -0
- package/dist/react.cjs +1 -951
- package/dist/react.d.cts +6 -6
- package/dist/react.d.ts +6 -6
- package/dist/react.js +1 -91
- package/dist/sse.cjs +7 -0
- package/dist/sse.d.cts +9 -0
- package/dist/sse.d.ts +9 -0
- package/dist/sse.js +7 -0
- package/package.json +19 -6
- package/dist/chunk-T27KPHCL.js +0 -867
- package/dist/chunk-T27KPHCL.js.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/fetch-error-B10Od9AT.d.cts +0 -257
- package/dist/fetch-error-B10Od9AT.d.ts +0 -257
- package/dist/index.cjs.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/react.cjs.map +0 -1
- package/dist/react.js.map +0 -1
package/dist/react.d.cts
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
import * as react from 'react';
|
|
2
2
|
import { ReactNode } from 'react';
|
|
3
|
-
import {
|
|
3
|
+
import { CreateFetchOptions, FetchClient, SseEvent, FetchError } from 'tanstack-fetch';
|
|
4
4
|
|
|
5
|
+
type HttpFetchClient = Omit<FetchClient, 'sse'>;
|
|
5
6
|
type FetchProviderProps = CreateFetchOptions & {
|
|
6
7
|
children: ReactNode;
|
|
7
|
-
|
|
8
|
-
client?: FetchClient;
|
|
8
|
+
client?: FetchClient | HttpFetchClient;
|
|
9
9
|
};
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
type AnyFetchClient = FetchClient | HttpFetchClient;
|
|
12
|
+
declare const useFetch: () => AnyFetchClient;
|
|
12
13
|
|
|
13
|
-
declare const
|
|
14
|
+
declare const FetchProvider: (props: FetchProviderProps) => react.FunctionComponentElement<react.ProviderProps<AnyFetchClient | null>>;
|
|
14
15
|
|
|
15
16
|
type UseSseOptions<T> = {
|
|
16
|
-
/** When false, the stream is not opened. Default true. */
|
|
17
17
|
enabled?: boolean;
|
|
18
18
|
lastEventId?: string;
|
|
19
19
|
params?: Record<string, string | number>;
|
package/dist/react.d.ts
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
import * as react from 'react';
|
|
2
2
|
import { ReactNode } from 'react';
|
|
3
|
-
import {
|
|
3
|
+
import { CreateFetchOptions, FetchClient, SseEvent, FetchError } from 'tanstack-fetch';
|
|
4
4
|
|
|
5
|
+
type HttpFetchClient = Omit<FetchClient, 'sse'>;
|
|
5
6
|
type FetchProviderProps = CreateFetchOptions & {
|
|
6
7
|
children: ReactNode;
|
|
7
|
-
|
|
8
|
-
client?: FetchClient;
|
|
8
|
+
client?: FetchClient | HttpFetchClient;
|
|
9
9
|
};
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
type AnyFetchClient = FetchClient | HttpFetchClient;
|
|
12
|
+
declare const useFetch: () => AnyFetchClient;
|
|
12
13
|
|
|
13
|
-
declare const
|
|
14
|
+
declare const FetchProvider: (props: FetchProviderProps) => react.FunctionComponentElement<react.ProviderProps<AnyFetchClient | null>>;
|
|
14
15
|
|
|
15
16
|
type UseSseOptions<T> = {
|
|
16
|
-
/** When false, the stream is not opened. Default true. */
|
|
17
17
|
enabled?: boolean;
|
|
18
18
|
lastEventId?: string;
|
|
19
19
|
params?: Record<string, string | number>;
|
package/dist/react.js
CHANGED
|
@@ -1,91 +1 @@
|
|
|
1
|
-
import { isFetchError, createFetch }
|
|
2
|
-
import { createContext, useContext, createElement, useState, useRef, useEffect } from 'react';
|
|
3
|
-
|
|
4
|
-
var FetchContext = createContext(null);
|
|
5
|
-
var buildClient = (props) => {
|
|
6
|
-
if (props.client) {
|
|
7
|
-
return props.client;
|
|
8
|
-
}
|
|
9
|
-
const { children: _children, client: _client, ...options } = props;
|
|
10
|
-
return createFetch(options);
|
|
11
|
-
};
|
|
12
|
-
var useFetchProviderState = (props) => {
|
|
13
|
-
const createdRef = useRef(null);
|
|
14
|
-
if (props.client) {
|
|
15
|
-
return { value: props.client, children: props.children };
|
|
16
|
-
}
|
|
17
|
-
if (!createdRef.current) {
|
|
18
|
-
createdRef.current = buildClient(props);
|
|
19
|
-
}
|
|
20
|
-
return { value: createdRef.current, children: props.children };
|
|
21
|
-
};
|
|
22
|
-
var useFetch = () => {
|
|
23
|
-
const client = useContext(FetchContext);
|
|
24
|
-
if (!client) {
|
|
25
|
-
throw new Error("tanstack-fetch: useFetch() must be used inside <FetchProvider>");
|
|
26
|
-
}
|
|
27
|
-
return client;
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
// src/react/fetch-provider.tsx
|
|
31
|
-
var FetchProvider = (props) => {
|
|
32
|
-
const { value, children } = useFetchProviderState(props);
|
|
33
|
-
return createElement(FetchContext.Provider, { value }, children);
|
|
34
|
-
};
|
|
35
|
-
var fetch_provider_default = FetchProvider;
|
|
36
|
-
var useSse = (path, options = {}) => {
|
|
37
|
-
const api = useFetch();
|
|
38
|
-
const [data, setData] = useState(void 0);
|
|
39
|
-
const [event, setEvent] = useState(void 0);
|
|
40
|
-
const [error, setError] = useState(void 0);
|
|
41
|
-
const [isConnected, setIsConnected] = useState(false);
|
|
42
|
-
const closeRef = useRef(null);
|
|
43
|
-
const optionsRef = useRef(options);
|
|
44
|
-
optionsRef.current = options;
|
|
45
|
-
const paramsKey = JSON.stringify(options.params ?? null);
|
|
46
|
-
const queryKey = JSON.stringify(options.query ?? null);
|
|
47
|
-
useEffect(() => {
|
|
48
|
-
if (options.enabled === false) {
|
|
49
|
-
return;
|
|
50
|
-
}
|
|
51
|
-
setError(void 0);
|
|
52
|
-
const subscription = api.sse(path, {
|
|
53
|
-
params: optionsRef.current.params,
|
|
54
|
-
query: optionsRef.current.query,
|
|
55
|
-
lastEventId: optionsRef.current.lastEventId,
|
|
56
|
-
onOpen: () => setIsConnected(true),
|
|
57
|
-
onMessage: (message, nextEvent) => {
|
|
58
|
-
setData(message);
|
|
59
|
-
setEvent(nextEvent);
|
|
60
|
-
optionsRef.current.onMessage?.(message, nextEvent);
|
|
61
|
-
},
|
|
62
|
-
onEvent: (nextEvent) => {
|
|
63
|
-
optionsRef.current.onEvent?.(nextEvent);
|
|
64
|
-
},
|
|
65
|
-
onError: (nextError) => {
|
|
66
|
-
setIsConnected(false);
|
|
67
|
-
const normalized = nextError instanceof Error ? nextError : new Error("SSE connection failed");
|
|
68
|
-
setError(isFetchError(nextError) ? nextError : normalized);
|
|
69
|
-
optionsRef.current.onError?.(nextError);
|
|
70
|
-
},
|
|
71
|
-
onClose: () => setIsConnected(false)
|
|
72
|
-
});
|
|
73
|
-
closeRef.current = subscription.close;
|
|
74
|
-
return () => {
|
|
75
|
-
subscription.close();
|
|
76
|
-
closeRef.current = null;
|
|
77
|
-
setIsConnected(false);
|
|
78
|
-
};
|
|
79
|
-
}, [api, path, options.enabled, options.lastEventId, paramsKey, queryKey]);
|
|
80
|
-
return {
|
|
81
|
-
data,
|
|
82
|
-
event,
|
|
83
|
-
error,
|
|
84
|
-
isConnected,
|
|
85
|
-
close: () => closeRef.current?.()
|
|
86
|
-
};
|
|
87
|
-
};
|
|
88
|
-
|
|
89
|
-
export { fetch_provider_default as FetchProvider, useFetch, useSse };
|
|
90
|
-
//# sourceMappingURL=react.js.map
|
|
91
|
-
//# sourceMappingURL=react.js.map
|
|
1
|
+
import {createContext,useContext,createElement,useState,useRef,useEffect}from'react';import {isFetchError,createFetch}from'tanstack-fetch';var a=createContext(null),O=e=>{if(e.client)return e.client;let{children:t,client:o,...l}=e;return createFetch(l)},p=e=>{let t=useRef(null);return e.client?{value:e.client,children:e.children}:(t.current||(t.current=O(e)),{value:t.current,children:e.children})},f=()=>{let e=useContext(a);if(!e)throw new Error("tanstack-fetch: useFetch() must be used inside <FetchProvider>");return e};var x=e=>{let{value:t,children:o}=p(e);return createElement(a.Provider,{value:t},o)},k=x;var q=e=>!!(e&&typeof e=="object"&&"sse"in e&&typeof e.sse=="function"),I=(e,t={})=>{let o=f(),[l,v]=useState(void 0),[F,y]=useState(void 0),[C,u]=useState(void 0),[S,s]=useState(false),d=useRef(null),n=useRef(t);n.current=t;let E=JSON.stringify(t.params??null),P=JSON.stringify(t.query??null);return useEffect(()=>{if(t.enabled===false)return;if(!q(o)){u(new Error('tanstack-fetch: useSse() needs a client from "tanstack-fetch/sse" (pass client to FetchProvider)'));return}u(void 0);let h=o.sse(e,{params:n.current.params,query:n.current.query,lastEventId:n.current.lastEventId,onOpen:()=>s(true),onMessage:(r,c)=>{v(r),y(c),n.current.onMessage?.(r,c);},onEvent:r=>{n.current.onEvent?.(r);},onError:r=>{s(false);let c=r instanceof Error?r:new Error("SSE connection failed");u(isFetchError(r)?r:c),n.current.onError?.(r);},onClose:()=>s(false)});return d.current=h.close,()=>{h.close(),d.current=null,s(false);}},[o,e,t.enabled,t.lastEventId,E,P]),{data:l,event:F,error:C,isConnected:S,close:()=>d.current?.()}};export{k as FetchProvider,f as useFetch,I as useSse};
|
package/dist/sse.cjs
ADDED
|
@@ -0,0 +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 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
|
+
`).replace(/\r/g,`
|
|
5
|
+
`).split(`
|
|
6
|
+
|
|
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
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { C as CreateFetchOptions, F as FetchClient } from './client.type-BBYqVrTM.cjs';
|
|
2
|
+
import './config.type-eG_cuxpu.cjs';
|
|
3
|
+
|
|
4
|
+
/** Full client with SSE. Prefer this when you need `api.sse()`. */
|
|
5
|
+
declare const createFetch: (options?: CreateFetchOptions) => FetchClient;
|
|
6
|
+
/** @deprecated Use createFetch from `tanstack-fetch/sse` */
|
|
7
|
+
declare const createClient: (options?: CreateFetchOptions) => FetchClient;
|
|
8
|
+
|
|
9
|
+
export { CreateFetchOptions, FetchClient, createClient, createFetch };
|
package/dist/sse.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { C as CreateFetchOptions, F as FetchClient } from './client.type-Btgj3NQn.js';
|
|
2
|
+
import './config.type-eG_cuxpu.js';
|
|
3
|
+
|
|
4
|
+
/** Full client with SSE. Prefer this when you need `api.sse()`. */
|
|
5
|
+
declare const createFetch: (options?: CreateFetchOptions) => FetchClient;
|
|
6
|
+
/** @deprecated Use createFetch from `tanstack-fetch/sse` */
|
|
7
|
+
declare const createClient: (options?: CreateFetchOptions) => FetchClient;
|
|
8
|
+
|
|
9
|
+
export { CreateFetchOptions, FetchClient, createClient, createFetch };
|
package/dist/sse.js
ADDED
|
@@ -0,0 +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 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
|
+
`).replace(/\r/g,`
|
|
5
|
+
`).split(`
|
|
6
|
+
|
|
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.
|
|
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": {
|
|
@@ -44,6 +44,16 @@
|
|
|
44
44
|
"import": "./dist/index.js",
|
|
45
45
|
"require": "./dist/index.cjs"
|
|
46
46
|
},
|
|
47
|
+
"./sse": {
|
|
48
|
+
"types": "./dist/sse.d.ts",
|
|
49
|
+
"import": "./dist/sse.js",
|
|
50
|
+
"require": "./dist/sse.cjs"
|
|
51
|
+
},
|
|
52
|
+
"./plugins": {
|
|
53
|
+
"types": "./dist/plugins.d.ts",
|
|
54
|
+
"import": "./dist/plugins.js",
|
|
55
|
+
"require": "./dist/plugins.cjs"
|
|
56
|
+
},
|
|
47
57
|
"./react": {
|
|
48
58
|
"types": "./dist/react.d.ts",
|
|
49
59
|
"import": "./dist/react.js",
|
|
@@ -67,20 +77,22 @@
|
|
|
67
77
|
"lint": "eslint src test example",
|
|
68
78
|
"format": "prettier --write .",
|
|
69
79
|
"format:check": "prettier --check .",
|
|
80
|
+
"size": "node scripts/size.mjs",
|
|
70
81
|
"example": "tsx example/run.ts",
|
|
71
82
|
"prepublishOnly": "npm run typecheck && npm run lint && npm test && npm run build"
|
|
72
83
|
},
|
|
73
84
|
"peerDependencies": {
|
|
74
|
-
"react": ">=18"
|
|
85
|
+
"react": ">=18",
|
|
86
|
+
"yaml": "^2.0.0"
|
|
75
87
|
},
|
|
76
88
|
"peerDependenciesMeta": {
|
|
77
89
|
"react": {
|
|
78
90
|
"optional": true
|
|
91
|
+
},
|
|
92
|
+
"yaml": {
|
|
93
|
+
"optional": true
|
|
79
94
|
}
|
|
80
95
|
},
|
|
81
|
-
"dependencies": {
|
|
82
|
-
"yaml": "^2.8.1"
|
|
83
|
-
},
|
|
84
96
|
"devDependencies": {
|
|
85
97
|
"@eslint/js": "^9.36.0",
|
|
86
98
|
"@types/node": "^24.5.2",
|
|
@@ -92,6 +104,7 @@
|
|
|
92
104
|
"tsup": "^8.5.0",
|
|
93
105
|
"typescript": "^5.9.2",
|
|
94
106
|
"typescript-eslint": "^8.44.0",
|
|
95
|
-
"vitest": "^3.2.4"
|
|
107
|
+
"vitest": "^3.2.4",
|
|
108
|
+
"yaml": "^2.8.1"
|
|
96
109
|
}
|
|
97
110
|
}
|