@vielzeug/courier 1.1.5 → 2.0.1

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.
Files changed (131) hide show
  1. package/README.md +10 -12
  2. package/dist/_dev.cjs +1 -1
  3. package/dist/_dev.cjs.map +1 -1
  4. package/dist/_dev.js +1 -1
  5. package/dist/_dev.js.map +1 -1
  6. package/dist/api.cjs +1 -1
  7. package/dist/api.cjs.map +1 -1
  8. package/dist/api.d.ts +4 -7
  9. package/dist/api.d.ts.map +1 -1
  10. package/dist/api.js +1 -1
  11. package/dist/api.js.map +1 -1
  12. package/dist/courier.cjs +5 -6
  13. package/dist/courier.cjs.map +1 -1
  14. package/dist/courier.d.ts +20 -142
  15. package/dist/courier.d.ts.map +1 -1
  16. package/dist/courier.iife.js +5 -6
  17. package/dist/courier.iife.js.map +1 -1
  18. package/dist/courier.js +5 -6
  19. package/dist/courier.js.map +1 -1
  20. package/dist/devtools.cjs.map +1 -1
  21. package/dist/devtools.d.ts +0 -28
  22. package/dist/devtools.d.ts.map +1 -1
  23. package/dist/devtools.js.map +1 -1
  24. package/dist/errors.cjs +1 -1
  25. package/dist/errors.cjs.map +1 -1
  26. package/dist/errors.d.ts +0 -3
  27. package/dist/errors.d.ts.map +1 -1
  28. package/dist/errors.js +1 -1
  29. package/dist/errors.js.map +1 -1
  30. package/dist/index.cjs +1 -1
  31. package/dist/index.d.ts +6 -22
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +1 -1
  34. package/dist/interceptors.cjs +1 -1
  35. package/dist/interceptors.cjs.map +1 -1
  36. package/dist/interceptors.js +1 -1
  37. package/dist/interceptors.js.map +1 -1
  38. package/dist/query.cjs +1 -1
  39. package/dist/query.cjs.map +1 -1
  40. package/dist/query.d.ts +8 -101
  41. package/dist/query.d.ts.map +1 -1
  42. package/dist/query.js +1 -1
  43. package/dist/query.js.map +1 -1
  44. package/dist/serialize.cjs +1 -1
  45. package/dist/serialize.cjs.map +1 -1
  46. package/dist/serialize.d.ts +1 -1
  47. package/dist/serialize.d.ts.map +1 -1
  48. package/dist/serialize.js +1 -1
  49. package/dist/serialize.js.map +1 -1
  50. package/dist/stream.cjs +5 -1
  51. package/dist/stream.cjs.map +1 -1
  52. package/dist/stream.d.ts +22 -39
  53. package/dist/stream.d.ts.map +1 -1
  54. package/dist/stream.js +5 -1
  55. package/dist/stream.js.map +1 -1
  56. package/dist/transport.cjs.map +1 -1
  57. package/dist/transport.d.ts +1 -1
  58. package/dist/transport.js.map +1 -1
  59. package/dist/types.d.ts +38 -46
  60. package/dist/types.d.ts.map +1 -1
  61. package/dist/url.cjs.map +1 -1
  62. package/dist/url.d.ts +0 -9
  63. package/dist/url.d.ts.map +1 -1
  64. package/dist/url.js.map +1 -1
  65. package/package.json +11 -6
  66. package/dist/batcher.cjs +0 -2
  67. package/dist/batcher.cjs.map +0 -1
  68. package/dist/batcher.d.ts +0 -66
  69. package/dist/batcher.d.ts.map +0 -1
  70. package/dist/batcher.js +0 -2
  71. package/dist/batcher.js.map +0 -1
  72. package/dist/focus.cjs +0 -2
  73. package/dist/focus.cjs.map +0 -1
  74. package/dist/focus.d.ts +0 -25
  75. package/dist/focus.d.ts.map +0 -1
  76. package/dist/focus.js +0 -2
  77. package/dist/focus.js.map +0 -1
  78. package/dist/mutation.cjs +0 -2
  79. package/dist/mutation.cjs.map +0 -1
  80. package/dist/mutation.d.ts +0 -81
  81. package/dist/mutation.d.ts.map +0 -1
  82. package/dist/mutation.js +0 -2
  83. package/dist/mutation.js.map +0 -1
  84. package/dist/persist.cjs +0 -2
  85. package/dist/persist.cjs.map +0 -1
  86. package/dist/persist.d.ts +0 -86
  87. package/dist/persist.d.ts.map +0 -1
  88. package/dist/persist.js +0 -2
  89. package/dist/persist.js.map +0 -1
  90. package/dist/query-cache.cjs +0 -2
  91. package/dist/query-cache.cjs.map +0 -1
  92. package/dist/query-cache.d.ts +0 -88
  93. package/dist/query-cache.d.ts.map +0 -1
  94. package/dist/query-cache.js +0 -2
  95. package/dist/query-cache.js.map +0 -1
  96. package/dist/query-observe.cjs +0 -2
  97. package/dist/query-observe.cjs.map +0 -1
  98. package/dist/query-observe.d.ts +0 -17
  99. package/dist/query-observe.d.ts.map +0 -1
  100. package/dist/query-observe.js +0 -2
  101. package/dist/query-observe.js.map +0 -1
  102. package/dist/retry.cjs +0 -2
  103. package/dist/retry.cjs.map +0 -1
  104. package/dist/retry.d.ts +0 -34
  105. package/dist/retry.d.ts.map +0 -1
  106. package/dist/retry.js +0 -2
  107. package/dist/retry.js.map +0 -1
  108. package/dist/stream-readable.cjs +0 -3
  109. package/dist/stream-readable.cjs.map +0 -1
  110. package/dist/stream-readable.d.ts +0 -46
  111. package/dist/stream-readable.d.ts.map +0 -1
  112. package/dist/stream-readable.js +0 -3
  113. package/dist/stream-readable.js.map +0 -1
  114. package/dist/stream-shared.cjs +0 -2
  115. package/dist/stream-shared.cjs.map +0 -1
  116. package/dist/stream-shared.d.ts +0 -41
  117. package/dist/stream-shared.d.ts.map +0 -1
  118. package/dist/stream-shared.js +0 -2
  119. package/dist/stream-shared.js.map +0 -1
  120. package/dist/stream-sse.cjs +0 -6
  121. package/dist/stream-sse.cjs.map +0 -1
  122. package/dist/stream-sse.d.ts +0 -59
  123. package/dist/stream-sse.d.ts.map +0 -1
  124. package/dist/stream-sse.js +0 -6
  125. package/dist/stream-sse.js.map +0 -1
  126. package/dist/sync-store.cjs +0 -2
  127. package/dist/sync-store.cjs.map +0 -1
  128. package/dist/sync-store.d.ts +0 -20
  129. package/dist/sync-store.d.ts.map +0 -1
  130. package/dist/sync-store.js +0 -2
  131. 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:** `createApi`, `createCourier`, `createQuery`, `createMutation`, `createStream`, `CourierError`, `CourierHttpError`, `CourierNetworkError`, `CourierTimeoutError`, `CourierAbortError`
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
- // observe() returns a SyncStore and triggers a background fetch if stale
44
- const store = client.query.observe({
45
- key: ['users', 1],
46
- fn: ({ signal }) => client.api.get<User>('/users/{id}', { params: { id: 1 }, signal }),
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 createUser = client.mutation((input: NewUser, signal) =>
51
- client.api.post<User>('/users', { body: input, signal }),
52
- );
53
-
54
- const nextUser = await createUser.mutate({ name: 'Alice' });
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
- var e=!globalThis.__COURIER_PROD__;function t(t){e&&console.warn(`[@vielzeug/courier] ${t}`)}exports.warn=t;
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":"AAAA,IAAM,EAAQ,CAAE,WAA8C,iBAG9D,SAAgB,EAAK,EAAmB,CAClC,GAAO,QAAQ,KAAK,uBAAuB,GAAK,CACtD"}
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
- var e=!globalThis.__COURIER_PROD__;function t(t){e&&console.warn(`[@vielzeug/courier] ${t}`)}export{t as warn};
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":"AAAA,IAAM,EAAQ,CAAE,WAA8C,iBAG9D,SAAgB,EAAK,EAAmB,CAClC,GAAO,QAAQ,KAAK,uBAAuB,GAAK,CACtD"}
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");let a=require("@vielzeug/arsenal");var o=new Set([`GET`,`HEAD`,`OPTIONS`]);function s(e,t,n,r){if(o.has(e))return`${e}:${t}:${n}`;if(r!==void 0)return`${e}:${t}:${(0,a.hash)(r)}`}function c(a){let{transport:o,...c}=a??{},l=o??r.createTransportCore(c),u=!o,d=new Map;async function f(n,r,i,a,o,s){let c=r.signal,u;try{u=await l.dispatch({headers:n,init:r,url:i})}catch(t){throw e.classifyRequestError(t,a,i,c)}if(!u.ok){let n;try{n=await t.parseResponse(u,o??`auto`)}catch{n=await u.text().catch(()=>``)}throw e.CourierHttpError.fromResponse(u,n,a,i)}let d;try{d=await t.parseResponse(u,o??`auto`)}catch(t){throw e.classifyRequestError(t,a,i,c)}if(s)try{return s.parse(d)}catch(t){throw new e.CourierSchemaValidationError(t,d)}return d}async function p(t,a,o={}){if(l.disposed)throw new e.CourierDisposedError(`ApiClient`);let c=t.toUpperCase(),u;try{u=i.buildUrl(l.baseUrl,a,o.params,o.query)}catch(t){throw e.classifyRequestError(t,c,a)}let{body:p,dedupe:m=!0,dedupeKey:h,fetchInit:g,headers:_,responseType:v,schema:y,signal:b,timeout:x}=o;x!==void 0&&r.validateTimeout(x);let S=l.mergeHeaders(_),C=m?s(c,u,v??`auto`,h):void 0;if(C){let e=d.get(C);if(e)return e}let w=new AbortController,T=l.track(w),E=r.anySignal(b,w.signal)??w.signal,{headers:D,...O}=n.buildRequestInit(c,S,p,r.buildTimeoutSignal(x??l.getTimeout(),E),g??{}),k=f(D,O,u,c,v,y);C&&d.set(C,k);try{return await k}finally{C&&d.delete(C),T()}}return{cancelAll(){l.cancelAll(),d.clear()},delete:(e,t)=>p(`DELETE`,e,t),get disposalSignal(){return l.disposalSignal},dispose(){d.clear(),u&&l.dispose()},get disposed(){return l.disposed},get:(e,t)=>p(`GET`,e,t),getHeaders:l.getHeaders,headers:l.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:l.use}}exports.createApi=c;
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, hash } from './serialize';\nimport {\n anySignal,\n buildTimeoutSignal,\n createTransportCore,\n type FetchContext,\n type Interceptor,\n type TransportCore,\n type TransportOptions,\n validateTimeout,\n} from './transport';\nimport { buildUrl } from './url';\n\nexport type { FetchContext, Interceptor };\n\n// Only safe + idempotent methods are auto-deduplicated. DELETE is idempotent but\n// not safe (it produces a side-effect), so it must opt-in via explicit dedupeKey\n// to avoid silently coalescing concurrent destructive requests.\nconst IDEMPOTENT_METHODS = new Set(['GET', 'HEAD', 'OPTIONS']);\n\nfunction getDedupeKey(\n method: string,\n url: string,\n responseType: string,\n dedupeKey: HttpRequestConfig['dedupeKey'],\n): string | undefined {\n if (IDEMPOTENT_METHODS.has(method)) {\n // Key on method + URL + responseType only. Headers are uniform within a\n // single client instance and should not prevent deduplication when a token\n // refresh updates globalHeaders mid-flight.\n return `${method}:${url}:${responseType}`;\n }\n\n if (dedupeKey === undefined) {\n return undefined;\n }\n\n return `${method}:${url}:${hash(dedupeKey)}`;\n}\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 * Safe + idempotent requests (`GET`/`HEAD`/`OPTIONS`) are deduplicated by default — concurrent\n * calls with the same method, URL, and response type share a single in-flight request.\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 const inFlight = new Map<string, Promise<unknown>>();\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 // For error responses: parse body using normal content-type detection,\n // fall back to text for unknown content-types (better than blob for debugging).\n let body: unknown;\n\n try {\n body = await parseResponse(res, responseType ?? 'auto');\n } catch {\n body = await res.text().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('ApiClient');\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 dedupe = true,\n dedupeKey,\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 mergedHeaders = transport.mergeHeaders(headers);\n const requestDedupeKey = dedupe ? getDedupeKey(m, full, responseType ?? 'auto', dedupeKey) : undefined;\n\n if (requestDedupeKey) {\n const existing = inFlight.get(requestDedupeKey);\n\n if (existing) return existing as Promise<T>;\n }\n\n const requestAc = new AbortController();\n const untrack = transport.track(requestAc);\n const combinedExt = anySignal(extSignal, requestAc.signal) ?? requestAc.signal;\n const signal = buildTimeoutSignal(cfgTimeout ?? transport.getTimeout(), combinedExt);\n\n const { headers: initHeaders, ...restInit } = buildRequestInit(m, mergedHeaders, body, signal, fetchInit ?? {});\n const p = 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\n if (requestDedupeKey) inFlight.set(requestDedupeKey, p);\n\n try {\n return (await p) as T;\n } finally {\n if (requestDedupeKey) inFlight.delete(requestDedupeKey);\n\n untrack();\n }\n }\n\n return {\n cancelAll(): void {\n // Note: narrow race — a request that starts after the abort signals fire but before\n // their in-flight promise settles may see an empty inFlight map and error a redundant\n // request. This is an accepted trade-off for the simplicity of a synchronous clear.\n transport.cancelAll();\n inFlight.clear();\n },\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 inFlight.clear();\n\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":"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"}
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":"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"}
package/dist/api.d.ts CHANGED
@@ -1,13 +1,10 @@
1
1
  import type { HttpRequestConfig } from './url';
2
- import { type FetchContext, type Interceptor, type TransportCore, type TransportOptions } from './transport';
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(): void;
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,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,gBAAgB,EAEtB,MAAM,aAAa,CAAC;AAGrB,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC;AA2B1C;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,SAAS,CAAC,IAAI,CAAC,EAAE,gBAAgB,GAAG;IAAE,SAAS,CAAC,EAAE,aAAa,CAAA;CAAE;iBA2HhE,IAAI;aAOR,CAAC,EAAE,CAAC,SAAS,MAAM,gBAAgB,CAAC,QAAQ,iBAAiB,CAAC,CAAC,CAAC;;eAI9D,IAAI;;UAQT,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;cA3FjD,CAAC,EAAE,CAAC,SAAS,MAAM,mBAChC,MAAM,OACT,CAAC,WACE,iBAAiB,CAAC,CAAC,CAAC;wBA0FR,IAAI;;EAK3B;AAED,MAAM,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC"}
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,hash as o}from"./serialize.js";import{anySignal as s,buildTimeoutSignal as c,createTransportCore as l,validateTimeout as u}from"./transport.js";import{buildUrl as d}from"./url.js";var f=new Set([`GET`,`HEAD`,`OPTIONS`]);function p(e,t,n,r){if(f.has(e))return`${e}:${t}:${n}`;if(r!==void 0)return`${e}:${t}:${o(r)}`}function m(o){let{transport:f,...m}=o??{},h=f??l(m),g=!f,_=new Map;async function v(e,a,o,s,c,l){let u=a.signal,d;try{d=await h.dispatch({headers:e,init:a,url:o})}catch(e){throw r(e,s,o,u)}if(!d.ok){let e;try{e=await i(d,c??`auto`)}catch{e=await d.text().catch(()=>``)}throw t.fromResponse(d,e,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 y(t,n,i={}){if(h.disposed)throw new e(`ApiClient`);let o=t.toUpperCase(),l;try{l=d(h.baseUrl,n,i.params,i.query)}catch(e){throw r(e,o,n)}let{body:f,dedupe:m=!0,dedupeKey:g,fetchInit:y,headers:b,responseType:x,schema:S,signal:C,timeout:w}=i;w!==void 0&&u(w);let T=h.mergeHeaders(b),E=m?p(o,l,x??`auto`,g):void 0;if(E){let e=_.get(E);if(e)return e}let D=new AbortController,O=h.track(D),k=s(C,D.signal)??D.signal,{headers:A,...j}=a(o,T,f,c(w??h.getTimeout(),k),y??{}),M=v(A,j,l,o,x,S);E&&_.set(E,M);try{return await M}finally{E&&_.delete(E),O()}}return{cancelAll(){h.cancelAll(),_.clear()},delete:(e,t)=>y(`DELETE`,e,t),get disposalSignal(){return h.disposalSignal},dispose(){_.clear(),g&&h.dispose()},get disposed(){return h.disposed},get:(e,t)=>y(`GET`,e,t),getHeaders:h.getHeaders,headers:h.headers,patch:(e,t)=>y(`PATCH`,e,t),post:(e,t)=>y(`POST`,e,t),put:(e,t)=>y(`PUT`,e,t),request:y,[Symbol.dispose](){this.dispose()},use:h.use}}export{m as createApi};
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, hash } from './serialize';\nimport {\n anySignal,\n buildTimeoutSignal,\n createTransportCore,\n type FetchContext,\n type Interceptor,\n type TransportCore,\n type TransportOptions,\n validateTimeout,\n} from './transport';\nimport { buildUrl } from './url';\n\nexport type { FetchContext, Interceptor };\n\n// Only safe + idempotent methods are auto-deduplicated. DELETE is idempotent but\n// not safe (it produces a side-effect), so it must opt-in via explicit dedupeKey\n// to avoid silently coalescing concurrent destructive requests.\nconst IDEMPOTENT_METHODS = new Set(['GET', 'HEAD', 'OPTIONS']);\n\nfunction getDedupeKey(\n method: string,\n url: string,\n responseType: string,\n dedupeKey: HttpRequestConfig['dedupeKey'],\n): string | undefined {\n if (IDEMPOTENT_METHODS.has(method)) {\n // Key on method + URL + responseType only. Headers are uniform within a\n // single client instance and should not prevent deduplication when a token\n // refresh updates globalHeaders mid-flight.\n return `${method}:${url}:${responseType}`;\n }\n\n if (dedupeKey === undefined) {\n return undefined;\n }\n\n return `${method}:${url}:${hash(dedupeKey)}`;\n}\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 * Safe + idempotent requests (`GET`/`HEAD`/`OPTIONS`) are deduplicated by default — concurrent\n * calls with the same method, URL, and response type share a single in-flight request.\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 const inFlight = new Map<string, Promise<unknown>>();\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 // For error responses: parse body using normal content-type detection,\n // fall back to text for unknown content-types (better than blob for debugging).\n let body: unknown;\n\n try {\n body = await parseResponse(res, responseType ?? 'auto');\n } catch {\n body = await res.text().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('ApiClient');\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 dedupe = true,\n dedupeKey,\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 mergedHeaders = transport.mergeHeaders(headers);\n const requestDedupeKey = dedupe ? getDedupeKey(m, full, responseType ?? 'auto', dedupeKey) : undefined;\n\n if (requestDedupeKey) {\n const existing = inFlight.get(requestDedupeKey);\n\n if (existing) return existing as Promise<T>;\n }\n\n const requestAc = new AbortController();\n const untrack = transport.track(requestAc);\n const combinedExt = anySignal(extSignal, requestAc.signal) ?? requestAc.signal;\n const signal = buildTimeoutSignal(cfgTimeout ?? transport.getTimeout(), combinedExt);\n\n const { headers: initHeaders, ...restInit } = buildRequestInit(m, mergedHeaders, body, signal, fetchInit ?? {});\n const p = 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\n if (requestDedupeKey) inFlight.set(requestDedupeKey, p);\n\n try {\n return (await p) as T;\n } finally {\n if (requestDedupeKey) inFlight.delete(requestDedupeKey);\n\n untrack();\n }\n }\n\n return {\n cancelAll(): void {\n // Note: narrow race — a request that starts after the abort signals fire but before\n // their in-flight promise settles may see an empty inFlight map and error a redundant\n // request. This is an accepted trade-off for the simplicity of a synchronous clear.\n transport.cancelAll();\n inFlight.clear();\n },\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 inFlight.clear();\n\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":"oYAsBA,IAAM,EAAqB,IAAI,IAAI,CAAC,MAAO,OAAQ,SAAS,CAAC,EAE7D,SAAS,EACP,EACA,EACA,EACA,EACoB,CACpB,GAAI,EAAmB,IAAI,CAAM,EAI/B,MAAO,GAAG,EAAO,GAAG,EAAI,GAAG,IAGzB,OAAc,IAAA,GAIlB,MAAO,GAAG,EAAO,GAAG,EAAI,GAAG,EAAK,CAAS,GAC3C,CAsBA,SAAgB,EAAU,EAAyD,CACjF,GAAM,CAAE,UAAW,EAAiB,GAAG,GAAkB,GAAQ,CAAC,EAC5D,EAAY,GAAmB,EAAoB,CAAa,EAChE,EAAe,CAAC,EAChB,EAAW,IAAI,IAErB,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,CAGX,IAAI,EAEJ,GAAI,CACF,EAAO,MAAM,EAAc,EAAK,GAAgB,MAAM,CACxD,MAAQ,CACN,EAAO,MAAM,EAAI,KAAK,CAAC,CAAC,UAAY,EAAE,CACxC,CAEA,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,WAAW,EAElE,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,SAAS,GACT,YACA,YACA,UACA,eACA,SACA,OAAQ,EACR,QAAS,GACP,EAEA,IAAe,IAAA,IAAW,EAAgB,CAAU,EAExD,IAAM,EAAgB,EAAU,aAAa,CAAO,EAC9C,EAAmB,EAAS,EAAa,EAAG,EAAM,GAAgB,OAAQ,CAAS,EAAI,IAAA,GAE7F,GAAI,EAAkB,CACpB,IAAM,EAAW,EAAS,IAAI,CAAgB,EAE9C,GAAI,EAAU,OAAO,CACvB,CAEA,IAAM,EAAY,IAAI,gBAChB,EAAU,EAAU,MAAM,CAAS,EACnC,EAAc,EAAU,EAAW,EAAU,MAAM,GAAK,EAAU,OAGlE,CAAE,QAAS,EAAa,GAAG,GAAa,EAAiB,EAAG,EAAe,EAFlE,EAAmB,GAAc,EAAU,WAAW,EAAG,CAEe,EAAQ,GAAa,CAAC,CAAC,EACxG,EAAI,EACR,EACA,EACA,EACA,EACA,EACA,CACF,EAEI,GAAkB,EAAS,IAAI,EAAkB,CAAC,EAEtD,GAAI,CACF,OAAQ,MAAM,CAChB,QAAU,CACJ,GAAkB,EAAS,OAAO,CAAgB,EAEtD,EAAQ,CACV,CACF,CAEA,MAAO,CACL,WAAkB,CAIhB,EAAU,UAAU,EACpB,EAAS,MAAM,CACjB,EACA,QAAuC,EAAQ,IAA+B,EAAc,SAAU,EAAK,CAAG,EAC9G,IAAI,gBAAiB,CACnB,OAAO,EAAU,cACnB,EACA,SAAgB,CACd,EAAS,MAAM,EAEX,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"}
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
- `))!==-1;){let e=t.slice(0,a).trim();if(t=t.slice(a+1),e)try{yield JSON.parse(e)}catch{throw new l(`NDJSON: failed to parse line: ${e.slice(0,200)}`)}}}}else for(;;){let{done:t,value:n}=await e.read();if(t){c=!0;break}yield r.decode(n,{stream:!0})}}finally{e.releaseLock()}}catch(e){if(t.disposed||x.signal.aborted)break;r=e instanceof Error?e:Error(String(e))}if(t.disposed||x.signal.aborted)break;if(y===0){if(r)if(u)u(r);else throw r;else w=c;break}if(C>=y){let e=r??Error(`[courier] readable() reconnect budget exhausted`);if(u)u(e);else if(r)throw r;break}if(c&&!r){w=!0;break}let m=typeof b==`function`?b(C):b;C++,await(0,e.sleep)(m,x.signal).catch(()=>{})}}finally{w||x.abort(),S()}}function Z(e){try{return JSON.parse(e)}catch{return e}}function ne(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:l,params:u,query:d,reconnect:f=!1,signal:p,timeout:m}=r;m!==void 0&&_(m);let h=new Map,g=new AbortController,v=t.track(g),y=!1,b=`connecting`,x=``,S=f===!0?{}:f===!1?{times:0}:f,C=S.times??(f?5:0),w=S.delay??T;function E(e,t){let n=h.get(e);if(!n?.size)return;let r=Z(t);for(let e of n)e(r)}async function D(){let e=(await Y(t,n,g,{body:i,extSignal:p,fetchInit:a,headers:o,method:s,params:u,query:d,timeout:m},{accept:`text/event-stream`,"cache-control":`no-cache`,...x?{"last-event-id":x}:{}})).body.getReader(),r=new TextDecoder,c=``,l=`message`,f=``,h=``;try{for(;;){let{done:t,value:n}=await e.read();if(t)break;c+=r.decode(n,{stream:!0}).replace(/\r\n/g,`
3
- `).replace(/\r/g,`
4
- `);let i;for(;(i=c.indexOf(`
5
- `))!==-1;){let e=c.slice(0,i);if(c=c.slice(i+1),e===``)f!==``&&(h&&(x=h),E(l,f.replace(/\n$/,``))),l=`message`,f=``,h=``;else if(!e.startsWith(`:`)){let t=e.indexOf(`:`),n=t===-1?e:e.slice(0,t),r=t===-1?``:e.slice(t+1).replace(/^ /,``);if(n===`event`)l=r;else if(n===`data`)f+=(f?`
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