@vielzeug/courier 1.1.4 → 2.0.0
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 +10 -12
- package/dist/_dev.cjs +1 -1
- package/dist/_dev.cjs.map +1 -1
- package/dist/_dev.js +1 -1
- package/dist/_dev.js.map +1 -1
- package/dist/api.cjs +1 -1
- package/dist/api.cjs.map +1 -1
- package/dist/api.d.ts +4 -7
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +1 -1
- package/dist/api.js.map +1 -1
- package/dist/courier.cjs +5 -6
- package/dist/courier.cjs.map +1 -1
- package/dist/courier.d.ts +20 -142
- package/dist/courier.d.ts.map +1 -1
- package/dist/courier.iife.js +5 -6
- package/dist/courier.iife.js.map +1 -1
- package/dist/courier.js +5 -6
- package/dist/courier.js.map +1 -1
- package/dist/devtools.cjs.map +1 -1
- package/dist/devtools.d.ts +0 -28
- package/dist/devtools.d.ts.map +1 -1
- package/dist/devtools.js.map +1 -1
- package/dist/errors.cjs +1 -1
- package/dist/errors.cjs.map +1 -1
- package/dist/errors.d.ts +0 -3
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +1 -1
- package/dist/errors.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +6 -22
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/interceptors.cjs +1 -1
- package/dist/interceptors.cjs.map +1 -1
- package/dist/interceptors.js +1 -1
- package/dist/interceptors.js.map +1 -1
- package/dist/query.cjs +1 -1
- package/dist/query.cjs.map +1 -1
- package/dist/query.d.ts +8 -101
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +1 -1
- package/dist/query.js.map +1 -1
- package/dist/serialize.cjs +1 -1
- package/dist/serialize.cjs.map +1 -1
- package/dist/serialize.d.ts +1 -1
- package/dist/serialize.d.ts.map +1 -1
- package/dist/serialize.js +1 -1
- package/dist/serialize.js.map +1 -1
- package/dist/stream.cjs +5 -1
- package/dist/stream.cjs.map +1 -1
- package/dist/stream.d.ts +22 -39
- package/dist/stream.d.ts.map +1 -1
- package/dist/stream.js +5 -1
- package/dist/stream.js.map +1 -1
- package/dist/transport.cjs.map +1 -1
- package/dist/transport.d.ts +1 -1
- package/dist/transport.js.map +1 -1
- package/dist/types.d.ts +38 -46
- package/dist/types.d.ts.map +1 -1
- package/dist/url.cjs.map +1 -1
- package/dist/url.d.ts +0 -9
- package/dist/url.d.ts.map +1 -1
- package/dist/url.js.map +1 -1
- package/package.json +4 -4
- package/dist/batcher.cjs +0 -2
- package/dist/batcher.cjs.map +0 -1
- package/dist/batcher.d.ts +0 -66
- package/dist/batcher.d.ts.map +0 -1
- package/dist/batcher.js +0 -2
- package/dist/batcher.js.map +0 -1
- package/dist/focus.cjs +0 -2
- package/dist/focus.cjs.map +0 -1
- package/dist/focus.d.ts +0 -25
- package/dist/focus.d.ts.map +0 -1
- package/dist/focus.js +0 -2
- package/dist/focus.js.map +0 -1
- package/dist/mutation.cjs +0 -2
- package/dist/mutation.cjs.map +0 -1
- package/dist/mutation.d.ts +0 -81
- package/dist/mutation.d.ts.map +0 -1
- package/dist/mutation.js +0 -2
- package/dist/mutation.js.map +0 -1
- package/dist/persist.cjs +0 -2
- package/dist/persist.cjs.map +0 -1
- package/dist/persist.d.ts +0 -86
- package/dist/persist.d.ts.map +0 -1
- package/dist/persist.js +0 -2
- package/dist/persist.js.map +0 -1
- package/dist/query-cache.cjs +0 -2
- package/dist/query-cache.cjs.map +0 -1
- package/dist/query-cache.d.ts +0 -88
- package/dist/query-cache.d.ts.map +0 -1
- package/dist/query-cache.js +0 -2
- package/dist/query-cache.js.map +0 -1
- package/dist/query-observe.cjs +0 -2
- package/dist/query-observe.cjs.map +0 -1
- package/dist/query-observe.d.ts +0 -17
- package/dist/query-observe.d.ts.map +0 -1
- package/dist/query-observe.js +0 -2
- package/dist/query-observe.js.map +0 -1
- package/dist/retry.cjs +0 -2
- package/dist/retry.cjs.map +0 -1
- package/dist/retry.d.ts +0 -34
- package/dist/retry.d.ts.map +0 -1
- package/dist/retry.js +0 -2
- package/dist/retry.js.map +0 -1
- package/dist/stream-readable.cjs +0 -3
- package/dist/stream-readable.cjs.map +0 -1
- package/dist/stream-readable.d.ts +0 -46
- package/dist/stream-readable.d.ts.map +0 -1
- package/dist/stream-readable.js +0 -3
- package/dist/stream-readable.js.map +0 -1
- package/dist/stream-shared.cjs +0 -2
- package/dist/stream-shared.cjs.map +0 -1
- package/dist/stream-shared.d.ts +0 -41
- package/dist/stream-shared.d.ts.map +0 -1
- package/dist/stream-shared.js +0 -2
- package/dist/stream-shared.js.map +0 -1
- package/dist/stream-sse.cjs +0 -6
- package/dist/stream-sse.cjs.map +0 -1
- package/dist/stream-sse.d.ts +0 -59
- package/dist/stream-sse.d.ts.map +0 -1
- package/dist/stream-sse.js +0 -6
- package/dist/stream-sse.js.map +0 -1
- package/dist/sync-store.cjs +0 -2
- package/dist/sync-store.cjs.map +0 -1
- package/dist/sync-store.d.ts +0 -20
- package/dist/sync-store.d.ts.map +0 -1
- package/dist/sync-store.js +0 -2
- package/dist/sync-store.js.map +0 -1
package/README.md
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
|
|
10
10
|
**Package:** `@vielzeug/courier` · **Category:** Http
|
|
11
11
|
|
|
12
|
-
**Key exports:** `
|
|
12
|
+
**Key exports:** `createCourier`, `CourierError`, `CourierHttpError`, `CourierNetworkError`, `CourierTimeoutError`, `CourierAbortError`
|
|
13
13
|
|
|
14
14
|
**When to use:** Typed HTTP, caching, mutations, SSE, and readable streaming with a shared interceptor pipeline.
|
|
15
15
|
|
|
@@ -40,20 +40,18 @@ const client = createCourier({
|
|
|
40
40
|
query: { staleTime: 5_000 },
|
|
41
41
|
});
|
|
42
42
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
43
|
+
const userKey = ['users', 1] as const;
|
|
44
|
+
await client.queries.fetch({
|
|
45
|
+
fetch: ({ signal }) => client.get<User>('/users/{id}', { params: { id: 1 }, signal }),
|
|
46
|
+
key: userKey,
|
|
47
47
|
staleTime: 5_000,
|
|
48
48
|
});
|
|
49
49
|
|
|
50
|
-
const
|
|
51
|
-
client.
|
|
52
|
-
);
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
client.query.set(['users', nextUser.id], nextUser);
|
|
56
|
-
client.query.invalidate(['users']);
|
|
50
|
+
const nextUser = await client.mutate({
|
|
51
|
+
request: ({ signal }) => client.post<User>('/users', { body: { name: 'Alice' }, signal }),
|
|
52
|
+
});
|
|
53
|
+
client.queries.set(['users', nextUser.id], nextUser);
|
|
54
|
+
client.queries.invalidate(['users']);
|
|
57
55
|
```
|
|
58
56
|
|
|
59
57
|
## Documentation
|
package/dist/_dev.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
function e(e){}exports.warn=e;
|
|
2
2
|
//# sourceMappingURL=_dev.cjs.map
|
package/dist/_dev.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_dev.cjs","names":[],"sources":["../src/_dev.ts"],"sourcesContent":["const isDev = !(globalThis as { __COURIER_PROD__?: boolean }).__COURIER_PROD__;\n\n/** @internal @security Messages may include user-supplied data. */\nexport function warn(msg: string): void {\n if (isDev) console.warn(`[@vielzeug/courier] ${msg}`);\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"_dev.cjs","names":[],"sources":["../src/_dev.ts"],"sourcesContent":["const isDev = !(globalThis as { __COURIER_PROD__?: boolean }).__COURIER_PROD__;\n\n/** @internal @security Messages may include user-supplied data. */\nexport function warn(msg: string): void {\n if (isDev) console.warn(`[@vielzeug/courier] ${msg}`);\n}\n"],"mappings":"AAGA,SAAgB,EAAK,EAAmB,CAExC"}
|
package/dist/_dev.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
function e(e){}export{e as warn};
|
|
2
2
|
//# sourceMappingURL=_dev.js.map
|
package/dist/_dev.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_dev.js","names":[],"sources":["../src/_dev.ts"],"sourcesContent":["const isDev = !(globalThis as { __COURIER_PROD__?: boolean }).__COURIER_PROD__;\n\n/** @internal @security Messages may include user-supplied data. */\nexport function warn(msg: string): void {\n if (isDev) console.warn(`[@vielzeug/courier] ${msg}`);\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"_dev.js","names":[],"sources":["../src/_dev.ts"],"sourcesContent":["const isDev = !(globalThis as { __COURIER_PROD__?: boolean }).__COURIER_PROD__;\n\n/** @internal @security Messages may include user-supplied data. */\nexport function warn(msg: string): void {\n if (isDev) console.warn(`[@vielzeug/courier] ${msg}`);\n}\n"],"mappings":"AAGA,SAAgB,EAAK,EAAmB,CAExC"}
|
package/dist/api.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require("./errors.cjs"),t=require("./response.cjs"),n=require("./serialize.cjs"),r=require("./transport.cjs"),i=require("./url.cjs");
|
|
1
|
+
const e=require("./errors.cjs"),t=require("./response.cjs"),n=require("./serialize.cjs"),r=require("./transport.cjs"),i=require("./url.cjs");function a(a){let{transport:o,...s}=a??{},c=o??r.createTransportCore(s),l=!o;async function u(n,r,i,a,o,s){let l=r.signal,u;try{u=await c.dispatch({headers:n,init:r,url:i})}catch(t){throw e.classifyRequestError(t,a,i,l)}if(!u.ok){let n=u.headers.get(`content-type`)?.includes(`json`)??!1,r;if(typeof u.text==`function`){let e=await u.text().catch(()=>``);if(r=e,e&&n)try{r=JSON.parse(e)}catch{}}else r=await t.parseResponse(u,n?`json`:`auto`).catch(()=>``);throw e.CourierHttpError.fromResponse(u,r,a,i)}let d;try{d=await t.parseResponse(u,o??`auto`)}catch(t){throw e.classifyRequestError(t,a,i,l)}if(s)try{return s.parse(d)}catch(t){throw new e.CourierSchemaValidationError(t,d)}return d}async function d(t,a,o={}){if(c.disposed)throw new e.CourierDisposedError(`Courier`);let s=t.toUpperCase(),l;try{l=i.buildUrl(c.baseUrl,a,o.params,o.query)}catch(t){throw e.classifyRequestError(t,s,a)}let{body:d,fetchInit:f,headers:p,responseType:m,schema:h,signal:g,timeout:_}=o;_!==void 0&&r.validateTimeout(_);let v=new AbortController,y=c.track(v),b=r.buildTimeoutSignal(_??c.getTimeout(),r.anySignal(g,v.signal)),{headers:x,...S}=n.buildRequestInit(s,c.mergeHeaders(p),d,b,f??{});try{return await u(x,S,l,s,m,h)}finally{y()}}return{cancelAll:c.cancelAll,delete:(e,t)=>d(`DELETE`,e,t),get disposalSignal(){return c.disposalSignal},dispose(){l&&c.dispose()},get disposed(){return c.disposed},get:(e,t)=>d(`GET`,e,t),getHeaders:c.getHeaders,headers:c.headers,patch:(e,t)=>d(`PATCH`,e,t),post:(e,t)=>d(`POST`,e,t),put:(e,t)=>d(`PUT`,e,t),request:d,[Symbol.dispose](){this.dispose()},use:c.use}}exports.createApi=a;
|
|
2
2
|
//# sourceMappingURL=api.cjs.map
|
package/dist/api.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.cjs","names":[],"sources":["../src/api.ts"],"sourcesContent":["import type { HttpRequestConfig, Params } from './url';\n\nimport { classifyRequestError, CourierDisposedError, CourierHttpError, CourierSchemaValidationError } from './errors';\nimport { parseResponse } from './response';\nimport { buildRequestInit
|
|
1
|
+
{"version":3,"file":"api.cjs","names":[],"sources":["../src/api.ts"],"sourcesContent":["import type { HttpRequestConfig, Params } from './url';\n\nimport { classifyRequestError, CourierDisposedError, CourierHttpError, CourierSchemaValidationError } from './errors';\nimport { parseResponse } from './response';\nimport { buildRequestInit } from './serialize';\nimport {\n anySignal,\n buildTimeoutSignal,\n createTransportCore,\n type TransportCore,\n type TransportOptions,\n validateTimeout,\n} from './transport';\nimport { buildUrl } from './url';\n\nexport type { FetchContext, Interceptor } from './transport';\n\n/**\n * Creates a typed REST client — `get`/`post`/`put`/`patch`/`delete`/`request`, all backed by a\n * shared interceptor pipeline, header management, and `AbortController` lifecycle.\n *\n * @example\n * ```ts\n * const api = createApi({ baseUrl: 'https://api.example.com', timeout: 10_000 });\n *\n * const user = await api.get<User>('/users/{id}', { params: { id: '1' } });\n * const created = await api.post<User>('/users', { body: { name: 'Ada' } });\n *\n * api.use(async (ctx, next) => next(ctx.withHeaders({ authorization: `Bearer ${token}` })));\n *\n * // later:\n * api.dispose();\n * ```\n */\nexport function createApi(opts?: TransportOptions & { transport?: TransportCore }) {\n const { transport: sharedTransport, ...transportOpts } = opts ?? {};\n const transport = sharedTransport ?? createTransportCore(transportOpts);\n const ownTransport = !sharedTransport;\n\n async function execute<T>(\n headers: Record<string, string>,\n init: Omit<RequestInit, 'headers'>,\n full: string,\n m: string,\n responseType: HttpRequestConfig['responseType'],\n schema?: { parse(data: unknown): T },\n ): Promise<T> {\n const signal = init.signal as AbortSignal | undefined;\n let res: Response;\n\n try {\n res = await transport.dispatch({ headers, init, url: full });\n } catch (err) {\n throw classifyRequestError(err, m, full, signal);\n }\n\n if (!res.ok) {\n // Error bodies are read once as text, then JSON-parsed if the content-type\n // says so — a binary success config (`responseType: 'blob'`) must not trap\n // the server's error message in an unreadable wrapper, and a failed\n // parseResponse-then-fallback double-read loses the body entirely.\n // `res.text` is missing on minimal custom-fetch fakes — fall back to\n // parseResponse there.\n const isJson = res.headers.get('content-type')?.includes('json') ?? false;\n let body: unknown;\n\n if (typeof res.text === 'function') {\n const text = await res.text().catch(() => '');\n\n body = text;\n\n if (text && isJson) {\n try {\n body = JSON.parse(text);\n } catch {\n // Malformed JSON error body — keep the raw text, not ''.\n }\n }\n } else {\n body = await parseResponse(res, isJson ? 'json' : 'auto').catch(() => '');\n }\n\n throw CourierHttpError.fromResponse(res, body, m, full);\n }\n\n let raw: unknown;\n\n try {\n raw = await parseResponse(res, responseType ?? 'auto');\n } catch (err) {\n throw classifyRequestError(err, m, full, signal);\n }\n\n if (schema) {\n try {\n return schema.parse(raw);\n } catch (err) {\n throw new CourierSchemaValidationError(err, raw);\n }\n }\n\n return raw as T;\n }\n\n async function request<T, P extends string = string>(\n method: string,\n url: P,\n config: HttpRequestConfig<P> = {} as HttpRequestConfig<P>,\n ) {\n if (transport.disposed) throw new CourierDisposedError('Courier');\n\n const m = method.toUpperCase();\n\n let full: string;\n\n try {\n full = buildUrl(transport.baseUrl, url, config.params as Params | undefined, config.query);\n } catch (err) {\n throw classifyRequestError(err, m, url);\n }\n\n const {\n body,\n fetchInit,\n headers,\n responseType,\n schema,\n signal: extSignal,\n timeout: cfgTimeout,\n } = config as HttpRequestConfig;\n\n if (cfgTimeout !== undefined) validateTimeout(cfgTimeout);\n\n const requestAc = new AbortController();\n const untrack = transport.track(requestAc);\n const signal = buildTimeoutSignal(cfgTimeout ?? transport.getTimeout(), anySignal(extSignal, requestAc.signal));\n const { headers: initHeaders, ...restInit } = buildRequestInit(\n m,\n transport.mergeHeaders(headers),\n body,\n signal,\n fetchInit ?? {},\n );\n\n try {\n return await execute<T>(\n initHeaders as Record<string, string>,\n restInit,\n full,\n m,\n responseType,\n schema as { parse(data: unknown): T } | undefined,\n );\n } finally {\n untrack();\n }\n }\n\n return {\n cancelAll: transport.cancelAll,\n delete: <T, P extends string = string>(url: P, cfg?: HttpRequestConfig<P>) => request<T, P>('DELETE', url, cfg),\n get disposalSignal() {\n return transport.disposalSignal;\n },\n dispose(): void {\n if (ownTransport) transport.dispose();\n },\n get disposed() {\n return transport.disposed;\n },\n get: <T, P extends string = string>(url: P, cfg?: HttpRequestConfig<P>) => request<T, P>('GET', url, cfg),\n getHeaders: transport.getHeaders,\n headers: transport.headers,\n patch: <T, P extends string = string>(url: P, cfg?: HttpRequestConfig<P>) => request<T, P>('PATCH', url, cfg),\n post: <T, P extends string = string>(url: P, cfg?: HttpRequestConfig<P>) => request<T, P>('POST', url, cfg),\n put: <T, P extends string = string>(url: P, cfg?: HttpRequestConfig<P>) => request<T, P>('PUT', url, cfg),\n request,\n [Symbol.dispose](): void {\n this.dispose();\n },\n use: transport.use,\n };\n}\n\nexport type ApiClient = ReturnType<typeof createApi>;\n"],"mappings":"6IAkCA,SAAgB,EAAU,EAAyD,CACjF,GAAM,CAAE,UAAW,EAAiB,GAAG,GAAkB,GAAQ,CAAC,EAC5D,EAAY,GAAmB,EAAA,oBAAoB,CAAa,EAChE,EAAe,CAAC,EAEtB,eAAe,EACb,EACA,EACA,EACA,EACA,EACA,EACY,CACZ,IAAM,EAAS,EAAK,OAChB,EAEJ,GAAI,CACF,EAAM,MAAM,EAAU,SAAS,CAAE,UAAS,OAAM,IAAK,CAAK,CAAC,CAC7D,OAAS,EAAK,CACZ,MAAM,EAAA,qBAAqB,EAAK,EAAG,EAAM,CAAM,CACjD,CAEA,GAAI,CAAC,EAAI,GAAI,CAOX,IAAM,EAAS,EAAI,QAAQ,IAAI,cAAc,CAAC,EAAE,SAAS,MAAM,GAAK,GAChE,EAEJ,GAAI,OAAO,EAAI,MAAS,WAAY,CAClC,IAAM,EAAO,MAAM,EAAI,KAAK,CAAC,CAAC,UAAY,EAAE,EAI5C,GAFA,EAAO,EAEH,GAAQ,EACV,GAAI,CACF,EAAO,KAAK,MAAM,CAAI,CACxB,MAAQ,CAER,CAEJ,KACE,GAAO,MAAM,EAAA,cAAc,EAAK,EAAS,OAAS,MAAM,CAAC,CAAC,UAAY,EAAE,EAG1E,MAAM,EAAA,iBAAiB,aAAa,EAAK,EAAM,EAAG,CAAI,CACxD,CAEA,IAAI,EAEJ,GAAI,CACF,EAAM,MAAM,EAAA,cAAc,EAAK,GAAgB,MAAM,CACvD,OAAS,EAAK,CACZ,MAAM,EAAA,qBAAqB,EAAK,EAAG,EAAM,CAAM,CACjD,CAEA,GAAI,EACF,GAAI,CACF,OAAO,EAAO,MAAM,CAAG,CACzB,OAAS,EAAK,CACZ,MAAM,IAAI,EAAA,6BAA6B,EAAK,CAAG,CACjD,CAGF,OAAO,CACT,CAEA,eAAe,EACb,EACA,EACA,EAA+B,CAAC,EAChC,CACA,GAAI,EAAU,SAAU,MAAM,IAAI,EAAA,qBAAqB,SAAS,EAEhE,IAAM,EAAI,EAAO,YAAY,EAEzB,EAEJ,GAAI,CACF,EAAO,EAAA,SAAS,EAAU,QAAS,EAAK,EAAO,OAA8B,EAAO,KAAK,CAC3F,OAAS,EAAK,CACZ,MAAM,EAAA,qBAAqB,EAAK,EAAG,CAAG,CACxC,CAEA,GAAM,CACJ,OACA,YACA,UACA,eACA,SACA,OAAQ,EACR,QAAS,GACP,EAEA,IAAe,IAAA,IAAW,EAAA,gBAAgB,CAAU,EAExD,IAAM,EAAY,IAAI,gBAChB,EAAU,EAAU,MAAM,CAAS,EACnC,EAAS,EAAA,mBAAmB,GAAc,EAAU,WAAW,EAAG,EAAA,UAAU,EAAW,EAAU,MAAM,CAAC,EACxG,CAAE,QAAS,EAAa,GAAG,GAAa,EAAA,iBAC5C,EACA,EAAU,aAAa,CAAO,EAC9B,EACA,EACA,GAAa,CAAC,CAChB,EAEA,GAAI,CACF,OAAO,MAAM,EACX,EACA,EACA,EACA,EACA,EACA,CACF,CACF,QAAU,CACR,EAAQ,CACV,CACF,CAEA,MAAO,CACL,UAAW,EAAU,UACrB,QAAuC,EAAQ,IAA+B,EAAc,SAAU,EAAK,CAAG,EAC9G,IAAI,gBAAiB,CACnB,OAAO,EAAU,cACnB,EACA,SAAgB,CACV,GAAc,EAAU,QAAQ,CACtC,EACA,IAAI,UAAW,CACb,OAAO,EAAU,QACnB,EACA,KAAoC,EAAQ,IAA+B,EAAc,MAAO,EAAK,CAAG,EACxG,WAAY,EAAU,WACtB,QAAS,EAAU,QACnB,OAAsC,EAAQ,IAA+B,EAAc,QAAS,EAAK,CAAG,EAC5G,MAAqC,EAAQ,IAA+B,EAAc,OAAQ,EAAK,CAAG,EAC1G,KAAoC,EAAQ,IAA+B,EAAc,MAAO,EAAK,CAAG,EACxG,UACA,CAAC,OAAO,UAAiB,CACvB,KAAK,QAAQ,CACf,EACA,IAAK,EAAU,GACjB,CACF"}
|
package/dist/api.d.ts
CHANGED
|
@@ -1,13 +1,10 @@
|
|
|
1
1
|
import type { HttpRequestConfig } from './url';
|
|
2
|
-
import { type
|
|
3
|
-
export type { FetchContext, Interceptor };
|
|
2
|
+
import { type TransportCore, type TransportOptions } from './transport';
|
|
3
|
+
export type { FetchContext, Interceptor } from './transport';
|
|
4
4
|
/**
|
|
5
5
|
* Creates a typed REST client — `get`/`post`/`put`/`patch`/`delete`/`request`, all backed by a
|
|
6
6
|
* shared interceptor pipeline, header management, and `AbortController` lifecycle.
|
|
7
7
|
*
|
|
8
|
-
* Safe + idempotent requests (`GET`/`HEAD`/`OPTIONS`) are deduplicated by default — concurrent
|
|
9
|
-
* calls with the same method, URL, and response type share a single in-flight request.
|
|
10
|
-
*
|
|
11
8
|
* @example
|
|
12
9
|
* ```ts
|
|
13
10
|
* const api = createApi({ baseUrl: 'https://api.example.com', timeout: 10_000 });
|
|
@@ -24,7 +21,7 @@ export type { FetchContext, Interceptor };
|
|
|
24
21
|
export declare function createApi(opts?: TransportOptions & {
|
|
25
22
|
transport?: TransportCore;
|
|
26
23
|
}): {
|
|
27
|
-
cancelAll()
|
|
24
|
+
cancelAll: () => void;
|
|
28
25
|
delete: <T, P extends string = string>(url: P, cfg?: HttpRequestConfig<P>) => Promise<T>;
|
|
29
26
|
readonly disposalSignal: AbortSignal;
|
|
30
27
|
dispose(): void;
|
|
@@ -37,7 +34,7 @@ export declare function createApi(opts?: TransportOptions & {
|
|
|
37
34
|
put: <T, P extends string = string>(url: P, cfg?: HttpRequestConfig<P>) => Promise<T>;
|
|
38
35
|
request: <T, P extends string = string>(method: string, url: P, config?: HttpRequestConfig<P>) => Promise<T>;
|
|
39
36
|
[Symbol.dispose](): void;
|
|
40
|
-
use: (interceptor: Interceptor) => () => void;
|
|
37
|
+
use: (interceptor: import("./transport").Interceptor) => () => void;
|
|
41
38
|
};
|
|
42
39
|
export type ApiClient = ReturnType<typeof createApi>;
|
|
43
40
|
//# sourceMappingURL=api.d.ts.map
|
package/dist/api.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAU,MAAM,OAAO,CAAC;AAKvD,OAAO,EAIL,KAAK,
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAU,MAAM,OAAO,CAAC;AAKvD,OAAO,EAIL,KAAK,aAAa,EAClB,KAAK,gBAAgB,EAEtB,MAAM,aAAa,CAAC;AAGrB,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE7D;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,SAAS,CAAC,IAAI,CAAC,EAAE,gBAAgB,GAAG;IAAE,SAAS,CAAC,EAAE,aAAa,CAAA;CAAE;;aA8HpE,CAAC,EAAE,CAAC,SAAS,MAAM,gBAAgB,CAAC,QAAQ,iBAAiB,CAAC,CAAC,CAAC;;eAI9D,IAAI;;UAMT,CAAC,EAAE,CAAC,SAAS,MAAM,gBAAgB,CAAC,QAAQ,iBAAiB,CAAC,CAAC,CAAC;;;YAG9D,CAAC,EAAE,CAAC,SAAS,MAAM,gBAAgB,CAAC,QAAQ,iBAAiB,CAAC,CAAC,CAAC;WACjE,CAAC,EAAE,CAAC,SAAS,MAAM,gBAAgB,CAAC,QAAQ,iBAAiB,CAAC,CAAC,CAAC;UACjE,CAAC,EAAE,CAAC,SAAS,MAAM,gBAAgB,CAAC,QAAQ,iBAAiB,CAAC,CAAC,CAAC;cAvEjD,CAAC,EAAE,CAAC,SAAS,MAAM,mBAChC,MAAM,OACT,CAAC,WACE,iBAAiB,CAAC,CAAC,CAAC;wBAsER,IAAI;;EAK3B;AAED,MAAM,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC"}
|
package/dist/api.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{CourierDisposedError as e,CourierHttpError as t,CourierSchemaValidationError as n,classifyRequestError as r}from"./errors.js";import{parseResponse as i}from"./response.js";import{buildRequestInit as a
|
|
1
|
+
import{CourierDisposedError as e,CourierHttpError as t,CourierSchemaValidationError as n,classifyRequestError as r}from"./errors.js";import{parseResponse as i}from"./response.js";import{buildRequestInit as a}from"./serialize.js";import{anySignal as o,buildTimeoutSignal as s,createTransportCore as c,validateTimeout as l}from"./transport.js";import{buildUrl as u}from"./url.js";function d(d){let{transport:f,...p}=d??{},m=f??c(p),h=!f;async function g(e,a,o,s,c,l){let u=a.signal,d;try{d=await m.dispatch({headers:e,init:a,url:o})}catch(e){throw r(e,s,o,u)}if(!d.ok){let e=d.headers.get(`content-type`)?.includes(`json`)??!1,n;if(typeof d.text==`function`){let t=await d.text().catch(()=>``);if(n=t,t&&e)try{n=JSON.parse(t)}catch{}}else n=await i(d,e?`json`:`auto`).catch(()=>``);throw t.fromResponse(d,n,s,o)}let f;try{f=await i(d,c??`auto`)}catch(e){throw r(e,s,o,u)}if(l)try{return l.parse(f)}catch(e){throw new n(e,f)}return f}async function _(t,n,i={}){if(m.disposed)throw new e(`Courier`);let c=t.toUpperCase(),d;try{d=u(m.baseUrl,n,i.params,i.query)}catch(e){throw r(e,c,n)}let{body:f,fetchInit:p,headers:h,responseType:_,schema:v,signal:y,timeout:b}=i;b!==void 0&&l(b);let x=new AbortController,S=m.track(x),C=s(b??m.getTimeout(),o(y,x.signal)),{headers:w,...T}=a(c,m.mergeHeaders(h),f,C,p??{});try{return await g(w,T,d,c,_,v)}finally{S()}}return{cancelAll:m.cancelAll,delete:(e,t)=>_(`DELETE`,e,t),get disposalSignal(){return m.disposalSignal},dispose(){h&&m.dispose()},get disposed(){return m.disposed},get:(e,t)=>_(`GET`,e,t),getHeaders:m.getHeaders,headers:m.headers,patch:(e,t)=>_(`PATCH`,e,t),post:(e,t)=>_(`POST`,e,t),put:(e,t)=>_(`PUT`,e,t),request:_,[Symbol.dispose](){this.dispose()},use:m.use}}export{d as createApi};
|
|
2
2
|
//# sourceMappingURL=api.js.map
|
package/dist/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","names":[],"sources":["../src/api.ts"],"sourcesContent":["import type { HttpRequestConfig, Params } from './url';\n\nimport { classifyRequestError, CourierDisposedError, CourierHttpError, CourierSchemaValidationError } from './errors';\nimport { parseResponse } from './response';\nimport { buildRequestInit
|
|
1
|
+
{"version":3,"file":"api.js","names":[],"sources":["../src/api.ts"],"sourcesContent":["import type { HttpRequestConfig, Params } from './url';\n\nimport { classifyRequestError, CourierDisposedError, CourierHttpError, CourierSchemaValidationError } from './errors';\nimport { parseResponse } from './response';\nimport { buildRequestInit } from './serialize';\nimport {\n anySignal,\n buildTimeoutSignal,\n createTransportCore,\n type TransportCore,\n type TransportOptions,\n validateTimeout,\n} from './transport';\nimport { buildUrl } from './url';\n\nexport type { FetchContext, Interceptor } from './transport';\n\n/**\n * Creates a typed REST client — `get`/`post`/`put`/`patch`/`delete`/`request`, all backed by a\n * shared interceptor pipeline, header management, and `AbortController` lifecycle.\n *\n * @example\n * ```ts\n * const api = createApi({ baseUrl: 'https://api.example.com', timeout: 10_000 });\n *\n * const user = await api.get<User>('/users/{id}', { params: { id: '1' } });\n * const created = await api.post<User>('/users', { body: { name: 'Ada' } });\n *\n * api.use(async (ctx, next) => next(ctx.withHeaders({ authorization: `Bearer ${token}` })));\n *\n * // later:\n * api.dispose();\n * ```\n */\nexport function createApi(opts?: TransportOptions & { transport?: TransportCore }) {\n const { transport: sharedTransport, ...transportOpts } = opts ?? {};\n const transport = sharedTransport ?? createTransportCore(transportOpts);\n const ownTransport = !sharedTransport;\n\n async function execute<T>(\n headers: Record<string, string>,\n init: Omit<RequestInit, 'headers'>,\n full: string,\n m: string,\n responseType: HttpRequestConfig['responseType'],\n schema?: { parse(data: unknown): T },\n ): Promise<T> {\n const signal = init.signal as AbortSignal | undefined;\n let res: Response;\n\n try {\n res = await transport.dispatch({ headers, init, url: full });\n } catch (err) {\n throw classifyRequestError(err, m, full, signal);\n }\n\n if (!res.ok) {\n // Error bodies are read once as text, then JSON-parsed if the content-type\n // says so — a binary success config (`responseType: 'blob'`) must not trap\n // the server's error message in an unreadable wrapper, and a failed\n // parseResponse-then-fallback double-read loses the body entirely.\n // `res.text` is missing on minimal custom-fetch fakes — fall back to\n // parseResponse there.\n const isJson = res.headers.get('content-type')?.includes('json') ?? false;\n let body: unknown;\n\n if (typeof res.text === 'function') {\n const text = await res.text().catch(() => '');\n\n body = text;\n\n if (text && isJson) {\n try {\n body = JSON.parse(text);\n } catch {\n // Malformed JSON error body — keep the raw text, not ''.\n }\n }\n } else {\n body = await parseResponse(res, isJson ? 'json' : 'auto').catch(() => '');\n }\n\n throw CourierHttpError.fromResponse(res, body, m, full);\n }\n\n let raw: unknown;\n\n try {\n raw = await parseResponse(res, responseType ?? 'auto');\n } catch (err) {\n throw classifyRequestError(err, m, full, signal);\n }\n\n if (schema) {\n try {\n return schema.parse(raw);\n } catch (err) {\n throw new CourierSchemaValidationError(err, raw);\n }\n }\n\n return raw as T;\n }\n\n async function request<T, P extends string = string>(\n method: string,\n url: P,\n config: HttpRequestConfig<P> = {} as HttpRequestConfig<P>,\n ) {\n if (transport.disposed) throw new CourierDisposedError('Courier');\n\n const m = method.toUpperCase();\n\n let full: string;\n\n try {\n full = buildUrl(transport.baseUrl, url, config.params as Params | undefined, config.query);\n } catch (err) {\n throw classifyRequestError(err, m, url);\n }\n\n const {\n body,\n fetchInit,\n headers,\n responseType,\n schema,\n signal: extSignal,\n timeout: cfgTimeout,\n } = config as HttpRequestConfig;\n\n if (cfgTimeout !== undefined) validateTimeout(cfgTimeout);\n\n const requestAc = new AbortController();\n const untrack = transport.track(requestAc);\n const signal = buildTimeoutSignal(cfgTimeout ?? transport.getTimeout(), anySignal(extSignal, requestAc.signal));\n const { headers: initHeaders, ...restInit } = buildRequestInit(\n m,\n transport.mergeHeaders(headers),\n body,\n signal,\n fetchInit ?? {},\n );\n\n try {\n return await execute<T>(\n initHeaders as Record<string, string>,\n restInit,\n full,\n m,\n responseType,\n schema as { parse(data: unknown): T } | undefined,\n );\n } finally {\n untrack();\n }\n }\n\n return {\n cancelAll: transport.cancelAll,\n delete: <T, P extends string = string>(url: P, cfg?: HttpRequestConfig<P>) => request<T, P>('DELETE', url, cfg),\n get disposalSignal() {\n return transport.disposalSignal;\n },\n dispose(): void {\n if (ownTransport) transport.dispose();\n },\n get disposed() {\n return transport.disposed;\n },\n get: <T, P extends string = string>(url: P, cfg?: HttpRequestConfig<P>) => request<T, P>('GET', url, cfg),\n getHeaders: transport.getHeaders,\n headers: transport.headers,\n patch: <T, P extends string = string>(url: P, cfg?: HttpRequestConfig<P>) => request<T, P>('PATCH', url, cfg),\n post: <T, P extends string = string>(url: P, cfg?: HttpRequestConfig<P>) => request<T, P>('POST', url, cfg),\n put: <T, P extends string = string>(url: P, cfg?: HttpRequestConfig<P>) => request<T, P>('PUT', url, cfg),\n request,\n [Symbol.dispose](): void {\n this.dispose();\n },\n use: transport.use,\n };\n}\n\nexport type ApiClient = ReturnType<typeof createApi>;\n"],"mappings":"0XAkCA,SAAgB,EAAU,EAAyD,CACjF,GAAM,CAAE,UAAW,EAAiB,GAAG,GAAkB,GAAQ,CAAC,EAC5D,EAAY,GAAmB,EAAoB,CAAa,EAChE,EAAe,CAAC,EAEtB,eAAe,EACb,EACA,EACA,EACA,EACA,EACA,EACY,CACZ,IAAM,EAAS,EAAK,OAChB,EAEJ,GAAI,CACF,EAAM,MAAM,EAAU,SAAS,CAAE,UAAS,OAAM,IAAK,CAAK,CAAC,CAC7D,OAAS,EAAK,CACZ,MAAM,EAAqB,EAAK,EAAG,EAAM,CAAM,CACjD,CAEA,GAAI,CAAC,EAAI,GAAI,CAOX,IAAM,EAAS,EAAI,QAAQ,IAAI,cAAc,CAAC,EAAE,SAAS,MAAM,GAAK,GAChE,EAEJ,GAAI,OAAO,EAAI,MAAS,WAAY,CAClC,IAAM,EAAO,MAAM,EAAI,KAAK,CAAC,CAAC,UAAY,EAAE,EAI5C,GAFA,EAAO,EAEH,GAAQ,EACV,GAAI,CACF,EAAO,KAAK,MAAM,CAAI,CACxB,MAAQ,CAER,CAEJ,KACE,GAAO,MAAM,EAAc,EAAK,EAAS,OAAS,MAAM,CAAC,CAAC,UAAY,EAAE,EAG1E,MAAM,EAAiB,aAAa,EAAK,EAAM,EAAG,CAAI,CACxD,CAEA,IAAI,EAEJ,GAAI,CACF,EAAM,MAAM,EAAc,EAAK,GAAgB,MAAM,CACvD,OAAS,EAAK,CACZ,MAAM,EAAqB,EAAK,EAAG,EAAM,CAAM,CACjD,CAEA,GAAI,EACF,GAAI,CACF,OAAO,EAAO,MAAM,CAAG,CACzB,OAAS,EAAK,CACZ,MAAM,IAAI,EAA6B,EAAK,CAAG,CACjD,CAGF,OAAO,CACT,CAEA,eAAe,EACb,EACA,EACA,EAA+B,CAAC,EAChC,CACA,GAAI,EAAU,SAAU,MAAM,IAAI,EAAqB,SAAS,EAEhE,IAAM,EAAI,EAAO,YAAY,EAEzB,EAEJ,GAAI,CACF,EAAO,EAAS,EAAU,QAAS,EAAK,EAAO,OAA8B,EAAO,KAAK,CAC3F,OAAS,EAAK,CACZ,MAAM,EAAqB,EAAK,EAAG,CAAG,CACxC,CAEA,GAAM,CACJ,OACA,YACA,UACA,eACA,SACA,OAAQ,EACR,QAAS,GACP,EAEA,IAAe,IAAA,IAAW,EAAgB,CAAU,EAExD,IAAM,EAAY,IAAI,gBAChB,EAAU,EAAU,MAAM,CAAS,EACnC,EAAS,EAAmB,GAAc,EAAU,WAAW,EAAG,EAAU,EAAW,EAAU,MAAM,CAAC,EACxG,CAAE,QAAS,EAAa,GAAG,GAAa,EAC5C,EACA,EAAU,aAAa,CAAO,EAC9B,EACA,EACA,GAAa,CAAC,CAChB,EAEA,GAAI,CACF,OAAO,MAAM,EACX,EACA,EACA,EACA,EACA,EACA,CACF,CACF,QAAU,CACR,EAAQ,CACV,CACF,CAEA,MAAO,CACL,UAAW,EAAU,UACrB,QAAuC,EAAQ,IAA+B,EAAc,SAAU,EAAK,CAAG,EAC9G,IAAI,gBAAiB,CACnB,OAAO,EAAU,cACnB,EACA,SAAgB,CACV,GAAc,EAAU,QAAQ,CACtC,EACA,IAAI,UAAW,CACb,OAAO,EAAU,QACnB,EACA,KAAoC,EAAQ,IAA+B,EAAc,MAAO,EAAK,CAAG,EACxG,WAAY,EAAU,WACtB,QAAS,EAAU,QACnB,OAAsC,EAAQ,IAA+B,EAAc,QAAS,EAAK,CAAG,EAC5G,MAAqC,EAAQ,IAA+B,EAAc,OAAQ,EAAK,CAAG,EAC1G,KAAoC,EAAQ,IAA+B,EAAc,MAAO,EAAK,CAAG,EACxG,UACA,CAAC,OAAO,UAAiB,CACvB,KAAK,QAAQ,CACf,EACA,IAAK,EAAU,GACjB,CACF"}
|
package/dist/courier.cjs
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require("@vielzeug/arsenal");var t=class e extends Error{constructor(e,t){super(e,t),this.name=new.target.name,Object.setPrototypeOf(this,new.target.prototype)}static is(t){return t instanceof e}},n=class e extends t{url;method;status;data;headers;constructor(e){super(e.message),this.url=e.url,this.method=e.method,this.status=e.status,this.data=e.data,this.headers=e.headers}static fromResponse(t,n,r,i){return new e({data:n,headers:t.headers,message:t.statusText||`HTTP ${t.status}`,method:r,status:t.status,url:i})}static is(t,n){return t instanceof e&&(n===void 0||t.status===n)}},r=class extends t{url;method;constructor(e){super(e.message,{cause:e.cause}),this.url=e.url,this.method=e.method}},i=class extends t{url;method;constructor(e){super(e.message,{cause:e.cause}),this.url=e.url,this.method=e.method}},a=class extends t{url;method;constructor(e){super(e.message,{cause:e.cause}),this.url=e.url,this.method=e.method}},o=class extends t{data;constructor(e,t){super(e instanceof Error?e.message:String(e),{cause:e}),this.data=t}},s=class extends t{},c=class extends t{constructor(e){super(`[courier] ${e} disposed`)}},l=class extends t{};function u(e,t,n,o){let s=e instanceof Error?e.message:String(e),c=o?.reason;return c instanceof Error&&c.name===`TimeoutError`?new i({cause:e,message:s,method:t,url:n}):e instanceof DOMException?e.name===`TimeoutError`?new i({cause:e,message:s,method:t,url:n}):new a({cause:e,message:s,method:t,url:n}):e instanceof Error&&e.name===`AbortError`||o?.aborted?new a({cause:e,message:s,method:t,url:n}):new r({cause:e,message:s,method:t,url:n})}async function d(e,t=`auto`){if(t===`raw`)return e;if(e.status===204||e.status===205||e.status===304)return;if(t===`json`)return e.json();if(t===`text`)return e.text();if(t===`blob`)return e.blob();if(t===`arrayBuffer`)return e.arrayBuffer();let n=e.headers.get(`content-type`)??``;return n.includes(`application/json`)||n.includes(`+json`)?e.json():n.startsWith(`text/`)?e.text():n.startsWith(`image/`)||n.startsWith(`audio/`)||n.startsWith(`video/`)?e.blob():e.text()}function f(e,t,n,r,i){return n!==void 0&&!p(n)?{...i,body:JSON.stringify(n),headers:{"content-type":`application/json`,...t},method:e.toUpperCase(),signal:r}:{...i,...n!==void 0&&{body:n},headers:t,method:e.toUpperCase(),signal:r}}function p(e){return e instanceof FormData||e instanceof Blob||e instanceof URLSearchParams||typeof e==`string`||e instanceof ArrayBuffer||ArrayBuffer.isView(e)||typeof ReadableStream<`u`&&e instanceof ReadableStream}function m(e,t,n){return{headers:t,init:n,url:e,withHeaders(r){let i={...t};for(let[e,t]of Object.entries(r))i[e.toLowerCase()]=t;return m(e,i,n)}}}function h(...e){let t=e.filter(e=>e!=null);if(t.length!==0)return t.length===1?t[0]:AbortSignal.any(t)}var g=3e4;function _(e){if((e<=0||!Number.isFinite(e))&&e!==1/0)throw new t(`[courier] timeout must be a positive number or Infinity`)}function v(e,t){return e===1/0?t??void 0:h(AbortSignal.timeout(e),t)}function y(e={}){let{baseUrl:t=``,fetch:n=globalThis.fetch,headers:r={},timeout:i=g}=e;_(i);let a=Object.fromEntries(Object.entries(r).map(([e,t])=>[e.toLowerCase(),t])),o=new Set,s=new AbortController,c=[],l=null,u=!1;function d(){if(l)return l;let e=e=>n(e.url,{...e.init,headers:e.headers});return l=c.length===0?e:c.reduceRight((e,t)=>n=>t(n,e),e),l}function f(e){return c.push(e),l=null,()=>{let t=c.indexOf(e);t!==-1&&(c.splice(t,1),l=null)}}function p(e){for(let[t,n]of Object.entries(e)){let e=t.toLowerCase();n===void 0?delete a[e]:a[e]=n}}function h(){return{...a}}function v(e,t){let n=e?Object.fromEntries(Object.entries(e).map(([e,t])=>[e.toLowerCase(),t])):void 0;return{...a,...n,...t}}function y(e){return o.add(e),()=>o.delete(e)}function b(e){return d()(m(e.url,e.headers,e.init))}function x(){for(let e of[...o])e.abort();o.clear()}function S(){if(!u){u=!0,s.abort();for(let e of o)e.abort();o.clear(),c.length=0,l=null}}return{baseUrl:t,cancelAll:x,dispatch:b,get disposalSignal(){return s.signal},dispose:S,get disposed(){return u},getHeaders:h,getTimeout(){return i},headers:p,mergeHeaders:v,track:y,use:f}}function b(e,t,n,r){let i=e.replace(/\/+$/,``),a=t.replace(/^\/+/,``);a=a.replace(/\{([^}]+)\}/g,(e,r)=>{let i=n?.[r];if(i==null)throw new l(`unresolved path param {${r}} in '${t}'`);return encodeURIComponent(String(i))});let o=i&&a?`${i}/${a}`:i||a;if(!r)return o;let s=new URLSearchParams;for(let[e,t]of Object.entries(r))if(t!==void 0){if(Array.isArray(t)){for(let n of t)n!==void 0&&s.append(e,n===null?``:String(n));continue}s.append(e,t===null?``:String(t))}let c=s.toString();return c?`${o}${o.includes(`?`)?`&`:`?`}${c}`:o}var x=new Set([`GET`,`HEAD`,`OPTIONS`]);function S(t,n,r,i){if(x.has(t))return`${t}:${n}:${r}`;if(i!==void 0)return`${t}:${n}:${(0,e.hash)(i)}`}function C(e){let{transport:t,...r}=e??{},i=t??y(r),a=!t,s=new Map;async function l(e,t,r,a,s,c){let l=t.signal,f;try{f=await i.dispatch({headers:e,init:t,url:r})}catch(e){throw u(e,a,r,l)}if(!f.ok){let e;try{e=await d(f,s??`auto`)}catch{e=await f.text().catch(()=>``)}throw n.fromResponse(f,e,a,r)}let p;try{p=await d(f,s??`auto`)}catch(e){throw u(e,a,r,l)}if(c)try{return c.parse(p)}catch(e){throw new o(e,p)}return p}async function p(e,t,n={}){if(i.disposed)throw new c(`ApiClient`);let r=e.toUpperCase(),a;try{a=b(i.baseUrl,t,n.params,n.query)}catch(e){throw u(e,r,t)}let{body:o,dedupe:d=!0,dedupeKey:p,fetchInit:m,headers:g,responseType:y,schema:x,signal:C,timeout:w}=n;w!==void 0&&_(w);let T=i.mergeHeaders(g),E=d?S(r,a,y??`auto`,p):void 0;if(E){let e=s.get(E);if(e)return e}let D=new AbortController,O=i.track(D),k=h(C,D.signal)??D.signal,{headers:A,...j}=f(r,T,o,v(w??i.getTimeout(),k),m??{}),M=l(A,j,a,r,y,x);E&&s.set(E,M);try{return await M}finally{E&&s.delete(E),O()}}return{cancelAll(){i.cancelAll(),s.clear()},delete:(e,t)=>p(`DELETE`,e,t),get disposalSignal(){return i.disposalSignal},dispose(){s.clear(),a&&i.dispose()},get disposed(){return i.disposed},get:(e,t)=>p(`GET`,e,t),getHeaders:i.getHeaders,headers:i.headers,patch:(e,t)=>p(`PATCH`,e,t),post:(e,t)=>p(`POST`,e,t),put:(e,t)=>p(`PUT`,e,t),request:p,[Symbol.dispose](){this.dispose()},use:i.use}}function w(e){let{maxSize:t=25,resolve:n,resolveSettled:r,window:i=0}=e,a=[],o=new AbortController,l=!1,u=null,d=!1;function f(){if(a.length===0)return;let e=a.splice(0,t);a.length>0&&p();let i=e.map(e=>e.key);try{r?r(i).then(t=>{if(t.length!==e.length){let n=new s(`Batcher: resolveSettled() returned ${t.length} results for ${e.length} keys`);for(let t of e)t.reject(n);return}e.forEach((e,n)=>{let r=t[n];r.status===`fulfilled`?e.resolve(r.value):e.reject(r.reason)})}).catch(t=>{for(let n of e)n.reject(t)}):n(i).then(t=>{if(t.length!==e.length){let n=new s(`Batcher: resolve() returned ${t.length} results for ${e.length} keys`);for(let t of e)t.reject(n);return}e.forEach((e,n)=>e.resolve(t[n]))}).catch(t=>{for(let n of e)n.reject(t)})}catch(t){for(let n of e)n.reject(t)}}function p(){l||(l=!0,i===0?queueMicrotask(()=>{l=!1,f()}):u=setTimeout(()=>{u=null,l=!1,f()},i))}return{get disposalSignal(){return o.signal},dispose(){if(d)return;d=!0,u!==null&&(clearTimeout(u),u=null);let e=new c(`Batcher`);for(let t of a.splice(0))t.reject(e);l=!1,o.abort()},get disposed(){return d},load(e){return d?Promise.reject(new c(`Batcher`)):new Promise((n,r)=>{a.push({key:e,reject:r,resolve:n}),a.length>=t?(u!==null&&(clearTimeout(u),u=null),l=!1,f()):p()})},[Symbol.dispose](){this.dispose()}}}function T(t){return Math.random()*(0,e.backoff)(t)}function E(e,t){if(typeof t==`function`){let n=t(e);return Number.isFinite(n)?Math.max(0,n):0}return typeof t==`number`?Number.isFinite(t)?Math.max(0,t):0:T(e)}var D=Object.freeze({data:void 0,error:null,isFetching:!1,isLoading:!0,status:`loading`,updatedAt:void 0});function O(t,n){let r=D,i=0,a=null,o=new Set,s=!1,l=null;function u(){o.forEach(e=>e())}async function d(e){try{await e?.()}catch(e){if(n?.onCallbackError)try{n.onCallbackError(e instanceof Error?e:Error(String(e)))}catch{}}}return{async cancel(){let e=a;e&&(e.controller.abort(),await e.promise.catch(()=>{}))},dispose(){s||(s=!0,a?.controller.abort(),a=null,o.clear())},get disposed(){return s},async mutate(o,l){if(s)throw new c(`Mutation`);let f=new AbortController,p=l?.signal?h(l.signal,f.signal):f.signal,m=++i;r={data:void 0,error:null,isFetching:!0,isLoading:!0,status:`loading`,updatedAt:void 0},u();let g={controller:f,promise:null};a=g;let _=(async()=>{try{let a=await(0,e.retry)(()=>t(o,p),{delay:e=>E(e,n?.delay),shouldRetry:n?.shouldRetry,signal:p,times:n?.times??1});return m===i&&(r={data:a,error:null,isFetching:!1,isLoading:!1,status:`success`,updatedAt:Date.now()},u()),await d(()=>n?.onSuccess?.(a,o)),await d(()=>n?.onFinally?.(o)),await d(()=>n?.onSettled?.({data:a,status:`success`,variables:o})),a}catch(t){let a=t instanceof Error?t:Error(String(t)),s=p.aborted||(0,e.isAbortError)(a);throw m===i&&(r=s?D:{data:void 0,error:a,isFetching:!1,isLoading:!1,status:`error`,updatedAt:Date.now()},u()),s||await d(()=>n?.onError?.(a,o)),await d(()=>n?.onFinally?.(o)),await d(()=>n?.onSettled?.(s?{status:`aborted`,variables:o}:{error:a,status:`error`,variables:o})),a}finally{a?.controller===f&&(a=null)}})();return g.promise=_,_},peek(){return r},reset(){r=D,u()},get store(){return l??={peek:()=>r,subscribe:e=>s?()=>{}:(o.add(e),()=>o.delete(e))}},subscribe(e){return s?()=>{}:(o.add(e),()=>o.delete(e))},[Symbol.dispose](){this.dispose()}}}function k(e){return typeof e==`function`?e():e}function A(t){return(0,e.hash)(t)}function j(t){return(0,e.hash)(t)}function M(t,n){let r=(0,e.hash)(n),i=t.entries.get(r);return i||(i={data:void 0,error:null,hash:r,inflight:null,isFetching:!1,key:n,lastConfig:void 0,observers:new Set,segmentHashes:n.map(t=>(0,e.hash)(t)),status:`loading`,updatedAt:void 0},t.entries.set(r,i)),i}function N(e,t){let n=e.gcTimers.get(t);n&&(clearTimeout(n),e.gcTimers.delete(t))}function P(e,t,n){if(e.disposed||(N(e,t.hash),t.observers.size>0))return;if(n===0){e.entries.delete(t.hash);return}let r=setTimeout(()=>{let n=e.entries.get(t.hash);!n||n.observers.size>0||n.isFetching||(e.entries.delete(t.hash),e.gcTimers.delete(t.hash))},n);e.gcTimers.set(t.hash,r)}function F(e,t){t.inflight?.controller.abort(),N(e,t.hash),e.entries.delete(t.hash)}function I(e,t){return t.length>e.segmentHashes.length?!1:t.every((t,n)=>t===e.segmentHashes[n])}function L(e,t){t.isFetching=!0,t.status=`loading`,t.error=null,e.notify(t)}function R(e,t,n,r){t.data=n,t.error=null,t.status=`success`,t.updatedAt=Date.now(),t.isFetching=!1,t.inflight=null,P(e,t,r),e.notify(t)}function z(e,t,n,r){t.error=n,t.status=`error`,t.updatedAt=Date.now(),t.isFetching=!1,t.inflight=null,P(e,t,r),e.notify(t)}function B(e,t,n,r){if(t.data=n.data,t.error=n.error,t.status=n.status,t.updatedAt=n.updatedAt,t.isFetching=!1,t.inflight=null,t.observers.size===0&&t.status===`loading`&&t.data===void 0){F(e,t);return}P(e,t,r),e.notify(t)}function V(e,t){if(t.inflight?.controller.abort(),t.observers.size>0){t.inflight=null,t.isFetching=!1,t.status=`loading`,t.data=void 0,t.error=null,t.updatedAt=void 0,e.notify(t);return}F(e,t)}function H(t,n,r){if(n.inflight)return n.inflight.promise;let{delay:i,fn:a,gcTime:o,shouldRetry:s,times:c}=r,l=new AbortController,u={data:n.data,error:n.error,status:n.status,updatedAt:n.updatedAt},d=(async()=>{try{let r=await(0,e.retry)(()=>a({key:n.key,signal:l.signal}),{delay:e=>E(e,i),shouldRetry:s,signal:l.signal,times:c});return R(t,n,r,o),r}catch(r){let i=r instanceof Error?r:Error(String(r));throw l.signal.aborted||(0,e.isAbortError)(i)?B(t,n,u,o):z(t,n,i,o),i}})();return n.inflight={controller:l,promise:d},L(t,n),d}function U(e,t){return{delay:t.delay??e.delayDefault,fn:t.fn,gcTime:t.gcTime??e.gcTimeDefault,shouldRetry:t.shouldRetry??e.shouldRetryDefault,staleTime:t.staleTime??e.staleTimeDefault,times:t.times??e.timesDefault}}function ee(e,t,n,r){return{delayDefault:e.delay,disposed:!1,entries:t,gcTimeDefault:e.gcTime??3e5,gcTimers:n,notify:r,shouldRetryDefault:e.shouldRetry,staleTimeDefault:e.staleTime??0,timesDefault:e.times??1}}var te=Object.freeze({data:void 0,error:null,isFetching:!1,isLoading:!0,status:`loading`,updatedAt:void 0});function W(e){return e.status===`loading`?{data:void 0,error:null,isFetching:e.isFetching,isLoading:!0,status:`loading`,updatedAt:void 0}:e.status===`success`?{data:e.data,error:null,isFetching:e.isFetching,isLoading:!1,status:`success`,updatedAt:e.updatedAt}:{data:e.data,error:e.error,isFetching:e.isFetching,isLoading:!1,status:`error`,updatedAt:e.updatedAt}}function G(e,t){let n=W(e);if(n.status===`loading`){let e=k(t.placeholderData);return{...n,data:e}}let r=t.select?t.select(n.data):n.data;return{...n,data:r}}function K(e){for(let t of e.observers){let n=t,r=G(e,n),i=n.previous,a=Object.is(i?.data,r.data),o=!!i&&i.status===r.status&&i.isFetching===r.isFetching&&Object.is(i.error,r.error);(n.select?o&&a:o&&i?.updatedAt===r.updatedAt&&a)||(n.previous=r,n.listener())}}function q(e,t,n){let r={listener:()=>{},...n};return{peek(){let n=e.entries.get(A(t));return n?G(n,r):te},subscribe(i){if(e.disposed)return()=>{};let a=M(e,t);N(e,a.hash);let o={...n,listener:i,previous:G(a,r)};return a.observers.add(o),()=>{a.observers.delete(o),a.observers.size===0&&P(e,a,a.lastConfig?.gcTime??e.gcTimeDefault)}}}}function J(e){let t=!1,n=new AbortController,r=new Map,i=new Map,a=ee({delay:e?.delay,gcTime:e?.gcTime,shouldRetry:e?.shouldRetry,staleTime:e?.staleTime,times:e?.times},r,i,K);async function o(e){if(t)throw new c(`QueryClient`);let{enabled:n=!0,fn:i,gcTime:o,initialData:s,key:l,staleTime:u,...d}=e;if(!n){let e=A(l);return r.get(e)?.data??void 0}let f=M(a,l),p=U(a,{fn:i,gcTime:o,staleTime:u,...d});if(s!==void 0&&f.status===`loading`&&f.data===void 0){let e=k(s);e!==void 0&&(f.data=e,f.error=null,f.status=`success`,f.updatedAt=Date.now())}return f.status===`success`&&f.updatedAt!==void 0&&Date.now()-f.updatedAt<p.staleTime&&!f.isFetching?(f.lastConfig=p,f.data):(f.lastConfig=p,f.inflight?f.inflight.promise:H(a,f,p))}function s(e){if(!e.lastConfig){V(a,e);return}e.isFetching||H(a,e,e.lastConfig).catch(()=>{})}function l(e){let t=e.map(e=>j(e));for(let e of[...r.values()])if(I(e,t)){if(e.observers.size>0){s(e);continue}V(a,e)}}function u(e,t,n){let r=M(a,e),i=n?.gcTime??r.lastConfig?.gcTime??a.gcTimeDefault;r.data=typeof t==`function`?t(r.data):t,r.error=null,r.status=`success`,r.updatedAt=n?.updatedAt??Date.now(),r.isFetching=!1,r.inflight=null,K(r),P(a,r,i)}function d(e){return e.observers.size===0||!e.lastConfig||e.isFetching?!1:e.status===`success`&&e.updatedAt!==void 0||e.status===`error`&&e.data!==void 0&&e.updatedAt!==void 0?Date.now()-e.updatedAt>=e.lastConfig.staleTime:!1}function f(e){let{fetch:t=!0,key:n,placeholderData:r,select:i}=e,s=q(a,n,{placeholderData:r,select:i});return t&&e.fn&&o({...e}).catch(()=>{}),s}return{cancel(e){let t=r.get(A(e));t?.inflight&&t.inflight.controller.abort()},cancelAll(){for(let e of r.values())e.inflight?.controller.abort()},clear(){for(let e of[...r.values()])V(a,e)},get disposalSignal(){return n.signal},dispose(){if(!t){t=!0,a.disposed=!0,n.abort();for(let[,e]of r)e.observers.clear(),e.inflight?.controller.abort();for(let[,e]of i)clearTimeout(e);i.clear(),r.clear()}},get disposed(){return t},fetch:o,fetchMany(e){return Promise.all(e.map(e=>o(e)))},get(e){let t=r.get(A(e));return t?t.data:void 0},getState(e){let t=r.get(A(e));return t?W(t):null},invalidate:l,keys(){return[...r.values()].map(e=>e.key)},observe:f,observeMany(e){let t=e.map(e=>q(a,e));return{peek(){return t.map(e=>e.peek())},subscribe(e){let n=t.map(t=>t.subscribe(e));return()=>{for(let e of n)e()}}}},refetchStale(){for(let e of[...r.values()])d(e)&&H(a,e,e.lastConfig).catch(()=>{})},remove(e){let t=r.get(A(e));t&&V(a,t)},set:u,get size(){return r.size},[Symbol.dispose](){this.dispose()}}}async function Y(e,t,r,i,a){let o=i.method.toUpperCase(),s=b(e.baseUrl,t,i.params,i.query),c=h(i.extSignal,r.signal)??r.signal,d=v(i.timeout??1/0,c),{headers:p,...m}=f(o,e.mergeHeaders(i.headers,a),i.body,d,i.fetchInit??{}),g;try{g=await e.dispatch({headers:p,init:m,url:s})}catch(e){throw u(e,o,s,d??c)}if(!g.ok){let e=await g.text().catch(()=>``);throw n.fromResponse(g,e,o,s)}if(!g.body)throw new l(`Response has no body`);return g}async function*X(t,n,r={}){if(t.disposed)throw new c(`StreamClient`);let{body:i,fetchInit:a,headers:o,method:s=i===void 0?`GET`:`POST`,onError:u,params:d,parse:f=`text`,query:p,reconnect:m=!1,signal:h,timeout:g}=r;g!==void 0&&_(g);let v=m===!0?{}:m===!1?{times:0}:m,y=v.times??(m?5:0),b=v.delay??T,x=new AbortController,S=t.track(x),C=0,w=!1;try{for(;!t.disposed&&!x.signal.aborted;){let r,c=!1;try{let e=(await Y(t,n,x,{body:i,extSignal:h,fetchInit:a,headers:o,method:s,params:d,query:p,timeout:g})).body.getReader(),r=new TextDecoder;try{if(f===`ndjson`){let t=``;for(;;){let{done:n,value:i}=await e.read();if(n){let e=t.trim();if(e)try{yield JSON.parse(e)}catch{throw new l(`NDJSON: failed to parse line: ${e.slice(0,200)}`)}c=!0;break}t+=r.decode(i,{stream:!0});let a;for(;(a=t.indexOf(`
|
|
2
|
-
`)
|
|
3
|
-
`).
|
|
4
|
-
`);let i;for(;(
|
|
5
|
-
`))!==-1;){let e=
|
|
6
|
-
`:``)+r;else if(n===`id`&&!r.includes(`\0`))h=r;else if(n===`retry`){let e=parseInt(r,10);Number.isNaN(e)||(w=e)}}}}}finally{e.releaseLock()}}async function O(){let n=0;try{for(;!y&&!t.disposed&&!g.signal.aborted;){let r;b=`connecting`;try{b=`open`,await D()}catch(e){if(y||t.disposed||g.signal.aborted)break;r=e instanceof Error?e:Error(String(e))}if(y||t.disposed||g.signal.aborted)break;if(C===0){r&&l?.(r);break}if(n>=C){l?.(r??Error(`[courier] SSE reconnect budget exhausted`));break}b=`reconnecting`;let i=typeof w==`function`?w(n):w;n++,await(0,e.sleep)(i,g.signal).catch(()=>{})}}finally{b=`closed`,v()}}return O().catch(e=>{!y&&!t.disposed&&l?.(e instanceof Error?e:Error(String(e)))}),{get closed(){return y},dispose(){y=!0,g.abort(),h.clear()},on(e,t){if(y)return()=>{};let n=h.get(e);return n||(n=new Set,h.set(e,n)),n.add(t),()=>n.delete(t)},get status(){return b},[Symbol.dispose](){this.dispose()}}}function Q(e){let{transport:t,...n}=e??{},r=!t,i=t??y(n);return{cancelAll(){i.cancelAll()},get disposalSignal(){return i.disposalSignal},dispose(){r&&i.dispose()},get disposed(){return i.disposed},getHeaders:i.getHeaders,headers:i.headers,readable:(e,t)=>X(i,e,t),sse:(e,t)=>ne(i,e,t),[Symbol.dispose](){this.dispose()},use:i.use}}function re(e){let{mutationDefaults:t,query:n,...r}=e??{},i=y(r),a=C({transport:i}),o=Q({transport:i}),s=J(n);return{api:a,cancelAll(){i.cancelAll(),s.cancelAll()},get disposalSignal(){return i.disposalSignal},dispose(){i.dispose(),s.dispose()},get disposed(){return i.disposed},headers:i.headers,mutation(e,n){let{invalidates:r,sets:i,...a}=n??{},o=async(e,t)=>{if(i){let n=i(e,t);for(let[e,t]of n)s.set(e,t)}if(r)for(let e of r)s.invalidate(e);await a.onSuccess?.(e,t)};return O(e,{...t,...a,onSuccess:o})},query:s,stream:o,[Symbol.dispose](){this.dispose()},use:i.use}}var ie=!globalThis.__COURIER_PROD__;function ae(e){ie&&console.warn(`[@vielzeug/courier] ${e}`)}function oe(e,t){let n=[],r=typeof document<`u`,i=typeof window<`u`;if(!r&&!i&&ae(`bindRefetch() called with no document/window in scope — no listeners attached`),r){let t=()=>{document.visibilityState===`visible`&&e.refetchStale()};document.addEventListener(`visibilitychange`,t),n.push(()=>document.removeEventListener(`visibilitychange`,t))}if(i){let t=()=>e.refetchStale();window.addEventListener(`online`,t),n.push(()=>window.removeEventListener(`online`,t))}let a=()=>{for(let e of n)e();n.length=0};return t?.signal?.addEventListener(`abort`,a,{once:!0}),a}function $(e){return async(t,n)=>{let r=typeof e==`function`?await e():e;return n(t.withHeaders({authorization:`Bearer ${r}`}))}}function se(t){let n=t?.header??`x-request-id`,r=t?.generate??e.uuid;return(e,t)=>t(e.withHeaders({[n]:r()}))}function ce(e){let t=e?.logger??((e,t)=>{console.debug(e,t)});return async(e,n)=>{let r=performance.now(),i=(e.init.method??`GET`).toUpperCase();try{let a=await n(e),o=Math.round(performance.now()-r);return t(`${i} ${e.url} ${a.status} (${o}ms)`,{duration:o,method:i,status:a.status,url:e.url}),a}catch(n){let a=Math.round(performance.now()-r);throw t(`${i} ${e.url} ERR (${a}ms)`,{duration:a,method:i,status:0,url:e.url}),n}}}function le(t,n){let{keys:r,onError:i,prefix:a=`courier:`,storage:o}=n,s=t.keys(),c=typeof r==`function`?s.filter(r):r,l=[];function u(t){return`${a}${(0,e.hash)(t)}`}function d(e,t){if(t.status!==`success`)return;let n={data:t.data,updatedAt:t.updatedAt};try{let t=o.setItem(u(e),JSON.stringify(n));t instanceof Promise&&t.catch(t=>i?.(t,e))}catch(t){i?.(t,e)}}for(let e of c){let n=t.getState(e);n&&d(e,n);let r=t.observe({fetch:!1,key:e}),i=r.subscribe(()=>d(e,r.peek()));l.push(i)}return()=>{for(let e of l)e();l.length=0}}async function ue(t,n){let{keys:r,maxAge:i,onError:a,prefix:o=`courier:`,storage:s}=n,c=t.keys(),l=typeof r==`function`?c.filter(r):r;await Promise.all(l.map(async n=>{try{let r=await s.getItem(`${o}${(0,e.hash)(n)}`);if(!r)return;let c=JSON.parse(r);if(typeof c!=`object`||!c||!(`data`in c)||typeof c.updatedAt!=`number`){a?.(Error(`[courier] Malformed persisted entry`),n);return}let l=c;if(i!==void 0&&Date.now()-l.updatedAt>i)return;t.set(n,l.data,{updatedAt:l.updatedAt})}catch(e){a?.(e,n)}}))}function de(e){return{peek:()=>e.peek(),subscribe:t=>e.subscribe(t)}}exports.CourierAbortError=a,exports.CourierBatcherError=s,exports.CourierDisposedError=c,exports.CourierError=t,exports.CourierHttpError=n,exports.CourierNetworkError=r,exports.CourierParseError=l,exports.CourierSchemaValidationError=o,exports.CourierTimeoutError=i,exports.bindRefetch=oe,exports.createApi=C,exports.createBatcher=w,exports.createCourier=re,exports.createMutation=O,exports.createQuery=J,exports.createStream=Q,exports.hydrateQueryCache=ue,exports.persistQueryCache=le,exports.toSyncStore=de,exports.withBearerAuth=$,exports.withLogging=ce,exports.withRequestId=se;
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=class e extends Error{constructor(e,t){super(e,t),this.name=new.target.name,Object.setPrototypeOf(this,new.target.prototype)}static is(t){return t instanceof e}},t=class t extends e{url;method;status;data;headers;constructor(e){super(e.message),this.url=e.url,this.method=e.method,this.status=e.status,this.data=e.data,this.headers=e.headers}static fromResponse(e,n,r,i){return new t({data:n,headers:e.headers,message:e.statusText||`HTTP ${e.status}`,method:r,status:e.status,url:i})}static is(e,n){return e instanceof t&&(n===void 0||e.status===n)}},n=class extends e{url;method;constructor(e){super(e.message,{cause:e.cause}),this.url=e.url,this.method=e.method}},r=class extends e{url;method;constructor(e){super(e.message,{cause:e.cause}),this.url=e.url,this.method=e.method}},i=class extends e{url;method;constructor(e){super(e.message,{cause:e.cause}),this.url=e.url,this.method=e.method}},a=class extends e{data;constructor(e,t){super(e instanceof Error?e.message:String(e),{cause:e}),this.data=t}},o=class extends e{constructor(e){super(`[courier] ${e} disposed`)}},s=class extends e{};function c(e,t,a,o){let s=e instanceof Error?e.message:String(e),c=o?.reason;return c instanceof Error&&c.name===`TimeoutError`?new r({cause:e,message:s,method:t,url:a}):e instanceof DOMException?e.name===`TimeoutError`?new r({cause:e,message:s,method:t,url:a}):new i({cause:e,message:s,method:t,url:a}):e instanceof Error&&e.name===`AbortError`||o?.aborted?new i({cause:e,message:s,method:t,url:a}):new n({cause:e,message:s,method:t,url:a})}async function l(e,t=`auto`){if(t===`raw`)return e;if(e.status===204||e.status===205||e.status===304)return;if(t===`json`)return e.json();if(t===`text`)return e.text();if(t===`blob`)return e.blob();if(t===`arrayBuffer`)return e.arrayBuffer();let n=e.headers.get(`content-type`)??``;return n.includes(`application/json`)||n.includes(`+json`)?e.json():n.startsWith(`text/`)?e.text():n.startsWith(`image/`)||n.startsWith(`audio/`)||n.startsWith(`video/`)?e.blob():e.text()}var u=class e extends Error{constructor(e,t){super(e,t),this.name=new.target.name,Object.setPrototypeOf(this,new.target.prototype)}static is(t){return t instanceof e}},d=class extends u{};function f(e,t,n){if(e===void 0)return`undefined`;if(e===null)return`null`;if(typeof e==`bigint`)return`${e}n`;if(typeof e!=`object`)return JSON.stringify(e);if(n.has(e))return`[Circular]`;if(n.add(e),e instanceof Date)return`[Date:${Number.isNaN(e.getTime())?`Invalid`:e.toISOString()}]`;if(e instanceof RegExp)return`[RegExp:${e.source}/${e.flags}]`;if(e instanceof Set)return`[Set:${[...e].map(e=>f(e,t,n)).sort().join(`,`)}]`;if(e instanceof Map)return`[Map:${[...e.entries()].map(([e,r])=>[f(e,t,n),f(r,t,n)]).sort(([e,t],[n,r])=>e===n?t.localeCompare(r):e.localeCompare(n)).map(([e,t])=>`${e}=>${t}`).join(`,`)}]`;if(Array.isArray(e))return`[${e.map(e=>f(e,t,n)).join(`,`)}]`;let r=Object.getPrototypeOf(e);if(r!==Object.prototype&&r!==null){if(t?.onClassInstance===`throw`)throw new d(`hash: unsupported type ${e.constructor?.name??`unknown`}`);return String(e)}let i=e;return`{${Object.keys(i).filter(e=>i[e]!==void 0).sort().map(e=>`${JSON.stringify(e)}:${f(i[e],t,n)}`).join(`,`)}}`}function p(e,t){return f(e,t,new Set)}function m(e,t,n,r,i){return n!==void 0&&!h(n)?{...i,body:JSON.stringify(n),headers:{"content-type":`application/json`,...t},method:e.toUpperCase(),signal:r}:{...i,...n!==void 0&&{body:n},headers:t,method:e.toUpperCase(),signal:r}}function h(e){return e instanceof FormData||e instanceof Blob||e instanceof URLSearchParams||typeof e==`string`||e instanceof ArrayBuffer||ArrayBuffer.isView(e)||typeof ReadableStream<`u`&&e instanceof ReadableStream}function g(e,t,n){return{headers:t,init:n,url:e,withHeaders(r){let i={...t};for(let[e,t]of Object.entries(r))i[e.toLowerCase()]=t;return g(e,i,n)}}}function _(...e){let t=e.filter(e=>e!=null);if(t.length!==0)return t.length===1?t[0]:AbortSignal.any(t)}var v=3e4;function y(t){if((t<=0||!Number.isFinite(t))&&t!==1/0)throw new e(`[courier] timeout must be a positive number or Infinity`)}function b(e,t){return e===1/0?t??void 0:_(AbortSignal.timeout(e),t)}function x(e={}){let{baseUrl:t=``,fetch:n=globalThis.fetch,headers:r={},timeout:i=v}=e;y(i);let a=Object.fromEntries(Object.entries(r).map(([e,t])=>[e.toLowerCase(),t])),o=new Set,s=new AbortController,c=[],l=null,u=!1;function d(){if(l)return l;let e=e=>n(e.url,{...e.init,headers:e.headers});return l=c.length===0?e:c.reduceRight((e,t)=>n=>t(n,e),e),l}function f(e){return c.push(e),l=null,()=>{let t=c.indexOf(e);t!==-1&&(c.splice(t,1),l=null)}}function p(e){for(let[t,n]of Object.entries(e)){let e=t.toLowerCase();n===void 0?delete a[e]:a[e]=n}}function m(){return{...a}}function h(e,t){let n=e?Object.fromEntries(Object.entries(e).map(([e,t])=>[e.toLowerCase(),t])):void 0;return{...a,...n,...t}}function _(e){return o.add(e),()=>o.delete(e)}function b(e){return d()(g(e.url,e.headers,e.init))}function x(){for(let e of[...o])e.abort();o.clear()}function S(){if(!u){u=!0,s.abort();for(let e of o)e.abort();o.clear(),c.length=0,l=null}}return{baseUrl:t,cancelAll:x,dispatch:b,get disposalSignal(){return s.signal},dispose:S,get disposed(){return u},getHeaders:m,getTimeout(){return i},headers:p,mergeHeaders:h,track:_,use:f}}function S(e,t,n,r){let i=e.replace(/\/+$/,``),a=t.replace(/^\/+/,``);a=a.replace(/\{([^}]+)\}/g,(e,r)=>{let i=n?.[r];if(i==null)throw new s(`unresolved path param {${r}} in '${t}'`);return encodeURIComponent(String(i))});let o=i&&a?`${i}/${a}`:i||a;if(!r)return o;let c=new URLSearchParams;for(let[e,t]of Object.entries(r))if(t!==void 0){if(Array.isArray(t)){for(let n of t)n!==void 0&&c.append(e,n===null?``:String(n));continue}c.append(e,t===null?``:String(t))}let l=c.toString();return l?`${o}${o.includes(`?`)?`&`:`?`}${l}`:o}function C(e){let{transport:n,...r}=e??{},i=n??x(r),s=!n;async function u(e,n,r,o,s,u){let d=n.signal,f;try{f=await i.dispatch({headers:e,init:n,url:r})}catch(e){throw c(e,o,r,d)}if(!f.ok){let e=f.headers.get(`content-type`)?.includes(`json`)??!1,n;if(typeof f.text==`function`){let t=await f.text().catch(()=>``);if(n=t,t&&e)try{n=JSON.parse(t)}catch{}}else n=await l(f,e?`json`:`auto`).catch(()=>``);throw t.fromResponse(f,n,o,r)}let p;try{p=await l(f,s??`auto`)}catch(e){throw c(e,o,r,d)}if(u)try{return u.parse(p)}catch(e){throw new a(e,p)}return p}async function d(e,t,n={}){if(i.disposed)throw new o(`Courier`);let r=e.toUpperCase(),a;try{a=S(i.baseUrl,t,n.params,n.query)}catch(e){throw c(e,r,t)}let{body:s,fetchInit:l,headers:d,responseType:f,schema:p,signal:h,timeout:g}=n;g!==void 0&&y(g);let v=new AbortController,x=i.track(v),C=b(g??i.getTimeout(),_(h,v.signal)),{headers:w,...T}=m(r,i.mergeHeaders(d),s,C,l??{});try{return await u(w,T,a,r,f,p)}finally{x()}}return{cancelAll:i.cancelAll,delete:(e,t)=>d(`DELETE`,e,t),get disposalSignal(){return i.disposalSignal},dispose(){s&&i.dispose()},get disposed(){return i.disposed},get:(e,t)=>d(`GET`,e,t),getHeaders:i.getHeaders,headers:i.headers,patch:(e,t)=>d(`PATCH`,e,t),post:(e,t)=>d(`POST`,e,t),put:(e,t)=>d(`PUT`,e,t),request:d,[Symbol.dispose](){this.dispose()},use:i.use}}var w=0;function T(e=!1){return{data:void 0,error:null,isFetching:e,status:`loading`,updatedAt:void 0}}function E(e){let t=new Map,n=new Map,r=e?.signal?.aborted??!1,i=e=>{for(let t of[...n.get(p(e))??[]])t()},a=()=>{for(let e of t.values())e.controller?.abort()},s=()=>{let e=[...t.values()].map(e=>e.key);a(),t.clear();for(let t of e)i(t)};e?.signal?.addEventListener(`abort`,()=>{r=!0,s()},{once:!0});let c=e=>{let n=p(e),r=t.get(n);return r||(r={controller:void 0,definition:void 0,key:e,promise:void 0,snapshot:T()},t.set(n,r)),r},l=(t,n)=>{if(r)return Promise.reject(new o(`QueryCache`));if(!t.definition)return Promise.reject(Error(`No fetch function registered for query ${p(t.key)}.`));let a=t.definition.staleTime??e?.staleTime??w;if(!n&&t.snapshot.status===`success`&&Date.now()-t.snapshot.updatedAt<a&&!t.snapshot.isFetching)return Promise.resolve(t.snapshot.data);if(t.promise)return t.promise;let s=new AbortController;t.controller=s,t.snapshot=t.snapshot.status===`success`?{...t.snapshot,isFetching:!0}:{...T(!0)},i(t.key);let c=Promise.resolve().then(()=>t.definition.fetch({key:t.key,signal:s.signal})).then(e=>(t.snapshot={data:e,error:null,isFetching:!1,status:`success`,updatedAt:Date.now()},t.controller=void 0,t.promise=void 0,i(t.key),e),e=>{let n=e instanceof Error?e:Error(String(e));throw t.snapshot={data:t.snapshot.status===`success`?t.snapshot.data:void 0,error:n,isFetching:!1,status:`error`,updatedAt:Date.now()},t.controller=void 0,t.promise=void 0,i(t.key),n});return t.promise=c,c};return{cancelAll:a,clear:s,fetch(e,t){let n=c(e.key);return n.definition=e,l(n,t?.force??!1)},get(e){let n=t.get(p(e));return n?.snapshot.status===`success`?n.snapshot.data:void 0},getSnapshot(e){return t.get(p(e))?.snapshot??null},invalidate(e){for(let n of t.values())e.length<=n.key.length&&e.every((e,t)=>p(e)===p(n.key[t]))&&(n.snapshot.status===`success`&&(n.snapshot={...n.snapshot,updatedAt:0}),i(n.key))},keys(){return[...t.values()].map(e=>e.key)},refetchStale(){for(let n of t.values()){if(!n.definition||n.snapshot.status!==`success`||n.snapshot.isFetching)continue;let t=n.definition.staleTime??e?.staleTime??w;Date.now()-n.snapshot.updatedAt>=t&&l(n,!0).catch(()=>{`${p(n.key)}`})}},set(e,t,n){let r=c(e);r.snapshot={data:t,error:null,isFetching:!1,status:`success`,updatedAt:n?.updatedAt??Date.now()},i(e)},subscribe(e,t){let r=p(e),i=n.get(r)??new Set;return i.add(t),n.set(r,i),()=>{i.delete(t),i.size===0&&n.delete(r)}}}}function D(e){let t=new AbortController,n=e(t.signal);return{next:e=>n.next(e),return:e=>(t.abort(),n.return(e)),[Symbol.asyncIterator](){return this},throw:e=>(t.abort(),n.throw(e))}}async function O(e,n,r){if(e.disposed)throw new o(`Courier`);let i=new AbortController,a=e.track(i),l=(r.method??(r.body===void 0?`GET`:`POST`)).toUpperCase(),u=b(r.timeout??1/0,_(r.signal,i.signal)),d=n;try{d=S(e.baseUrl,n,r.params,r.query);let{headers:o,...c}=m(l,e.mergeHeaders(r.headers),r.body,u,r.fetchInit??{}),f=await e.dispatch({headers:o,init:c,url:d});if(!f.ok)throw t.fromResponse(f,await f.text().catch(()=>``),l,d);if(!f.body)throw new s(`Response has no body`);return{controller:i,response:f,untrack:a}}catch(e){throw a(),e instanceof t||e instanceof s?e:c(e,l,d,u)}}function k(e){async function*t(t,n){let{controller:r,response:i,untrack:a}=await O(e,t,n),o=i.body.getReader(),s=new TextDecoder,c=``,l=`message`,u=``;try{for(;;){let e=await o.read();if(e.done)break;c+=s.decode(e.value,{stream:!0}).replace(/\r\n?/g,`
|
|
2
|
+
`);let t;for(;(t=c.indexOf(`
|
|
3
|
+
`))!==-1;){let e=c.slice(0,t);if(c=c.slice(t+1),e===``){if(u!==``){let e=u.endsWith(`
|
|
4
|
+
`)?u.slice(0,-1):u;try{e=JSON.parse(e)}catch{}yield{data:e,event:l}}u=``,l=`message`;continue}if(e.startsWith(`:`))continue;let n=e.indexOf(`:`),r=n===-1?e:e.slice(0,n),i=(n===-1?``:e.slice(n+1)).replace(/^ /,``);r===`data`?u+=`${i}\n`:r===`event`&&(l=i)}}}finally{o.releaseLock(),r.abort(),a()}}async function*n(t,n){let{controller:r,response:i,untrack:a}=await O(e,t,n),o=i.body.getReader(),c=new TextDecoder,l=``;try{for(;;){let e=await o.read();if(e.done){if(n.parse===`ndjson`&&l.trim())try{yield JSON.parse(l)}catch{throw new s(`NDJSON: failed to parse line: ${l.slice(0,200)}`)}break}let t=c.decode(e.value,{stream:!0});if(n.parse!==`ndjson`){yield t;continue}l+=t;let r;for(;(r=l.indexOf(`
|
|
5
|
+
`))!==-1;){let e=l.slice(0,r).trim();if(l=l.slice(r+1),e)try{yield JSON.parse(e)}catch{throw new s(`NDJSON: failed to parse line: ${e.slice(0,200)}`)}}}}finally{o.releaseLock(),r.abort(),a()}}return{events(e,n={}){return D(r=>t(e,{...n,headers:{accept:`text/event-stream`,"cache-control":`no-cache`,...n.headers},signal:_(n.signal,r)}))},read(e,t={}){return D(r=>n(e,{...t,signal:_(t.signal,r)}))}}}function A(e={}){let{query:t,...n}=e,r=x(n),i=C({transport:r}),a=E({...t,signal:r.disposalSignal}),s=a,c=k(r),l=new Set;return{cancelAll(){r.cancelAll(),a.cancelAll();for(let e of l)e.abort()},delete:i.delete,get disposalSignal(){return r.disposalSignal},dispose(){for(let e of l)e.abort();l.clear(),s.clear(),r.dispose()},get disposed(){return r.disposed},events:c.events,get:i.get,getHeaders:i.getHeaders,headers:r.headers,mutate:async e=>{if(r.disposed)throw new o(`Courier`);let t=new AbortController;l.add(t);let n=_(e.signal,t.signal,r.disposalSignal)??t.signal;try{let t=await e.request({signal:n});return await e.onSuccess?.(t,s),t}finally{l.delete(t)}},patch:i.patch,post:i.post,put:i.put,queries:s,read:c.read,request:i.request,[Symbol.dispose](){this.dispose()},use:r.use}}function j(){return crypto.randomUUID()}function M(e){return async(t,n)=>{let r=typeof e==`function`?await e():e;return n(t.withHeaders({authorization:`Bearer ${r}`}))}}function N(e){let t=e?.header??`x-request-id`,n=e?.generate??j;return(e,r)=>r(e.withHeaders({[t]:n()}))}function P(e){let t=e?.logger??((e,t)=>{console.debug(e,t)});return async(e,n)=>{let r=performance.now(),i=(e.init.method??`GET`).toUpperCase();try{let a=await n(e),o=Math.round(performance.now()-r);return t(`${i} ${e.url} ${a.status} (${o}ms)`,{duration:o,method:i,status:a.status,url:e.url}),a}catch(n){let a=Math.round(performance.now()-r);throw t(`${i} ${e.url} ERR (${a}ms)`,{duration:a,method:i,status:0,url:e.url}),n}}}exports.CourierAbortError=i,exports.CourierDisposedError=o,exports.CourierError=e,exports.CourierHttpError=t,exports.CourierNetworkError=n,exports.CourierParseError=s,exports.CourierSchemaValidationError=a,exports.CourierTimeoutError=r,exports.createCourier=A,exports.withBearerAuth=M,exports.withLogging=P,exports.withRequestId=N;
|
|
7
6
|
//# sourceMappingURL=courier.cjs.map
|