@vielzeug/courier 2.3.0 → 3.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 +11 -34
- package/dist/_cache.d.ts +19 -0
- package/dist/_cache.d.ts.map +1 -0
- package/dist/courier.cjs +1 -5
- package/dist/courier.cjs.map +1 -1
- package/dist/courier.d.ts +22 -24
- package/dist/courier.d.ts.map +1 -1
- package/dist/courier.iife.js +1 -5
- package/dist/courier.iife.js.map +1 -1
- package/dist/courier.js +1 -5
- package/dist/courier.js.map +1 -1
- package/dist/errors.d.ts +9 -10
- package/dist/errors.d.ts.map +1 -1
- package/dist/index.cjs +2 -1
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +5 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +670 -1
- package/dist/index.js.map +1 -0
- package/dist/interceptors.d.ts +17 -9
- package/dist/interceptors.d.ts.map +1 -1
- package/dist/response.d.ts +1 -0
- package/dist/response.d.ts.map +1 -1
- package/dist/serialize.d.ts +1 -1
- package/dist/serialize.d.ts.map +1 -1
- package/dist/transport.d.ts +16 -14
- package/dist/transport.d.ts.map +1 -1
- package/dist/url.d.ts +48 -10
- package/dist/url.d.ts.map +1 -1
- package/package.json +11 -9
- package/dist/errors.cjs +0 -2
- package/dist/errors.cjs.map +0 -1
- package/dist/errors.js +0 -2
- package/dist/errors.js.map +0 -1
- package/dist/interceptors.cjs +0 -2
- package/dist/interceptors.cjs.map +0 -1
- package/dist/interceptors.js +0 -2
- package/dist/interceptors.js.map +0 -1
- package/dist/query.cjs +0 -2
- package/dist/query.cjs.map +0 -1
- package/dist/query.d.ts +0 -13
- package/dist/query.d.ts.map +0 -1
- package/dist/query.js +0 -2
- package/dist/query.js.map +0 -1
- package/dist/response.cjs +0 -2
- package/dist/response.cjs.map +0 -1
- package/dist/response.js +0 -2
- package/dist/response.js.map +0 -1
- package/dist/serialize.cjs +0 -2
- package/dist/serialize.cjs.map +0 -1
- package/dist/serialize.js +0 -2
- package/dist/serialize.js.map +0 -1
- package/dist/stream.cjs +0 -6
- package/dist/stream.cjs.map +0 -1
- package/dist/stream.d.ts +0 -17
- package/dist/stream.d.ts.map +0 -1
- package/dist/stream.js +0 -6
- package/dist/stream.js.map +0 -1
- package/dist/transport.cjs +0 -2
- package/dist/transport.cjs.map +0 -1
- package/dist/transport.js +0 -2
- package/dist/transport.js.map +0 -1
- package/dist/types.d.ts +0 -62
- package/dist/types.d.ts.map +0 -1
- package/dist/url.cjs +0 -2
- package/dist/url.cjs.map +0 -1
- package/dist/url.js +0 -2
- package/dist/url.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","names":[],"sources":["../src/errors.ts","../src/transport.ts","../src/_cache.ts","../src/response.ts","../src/serialize.ts","../src/url.ts","../src/courier.ts","../src/interceptors.ts"],"sourcesContent":["/**\n * Base class for all courier errors.\n * Use `instanceof CourierError` to catch any courier-originated error in one branch.\n * Use `CourierHttpError.is(e, status?)` to check for a specific HTTP status code.\n */\nexport class CourierError extends Error {\n protected static readonly errorName: string = 'CourierError';\n\n constructor(message: string, opts?: ErrorOptions) {\n super(message, opts);\n this.name = (new.target as typeof CourierError).errorName;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Thrown when the server responds with a non-2xx HTTP status code.\n * Use `CourierHttpError.is(e, status?)` to narrow to a specific status.\n */\nexport class CourierHttpError extends CourierError {\n protected static override readonly errorName = 'CourierHttpError';\n readonly url: string;\n readonly method: string;\n readonly status: number;\n readonly data: unknown;\n readonly headers: Headers;\n\n constructor(opts: { data: unknown; headers: Headers; message: string; method: string; status: number; url: string }) {\n super(opts.message);\n this.url = opts.url;\n this.method = opts.method;\n this.status = opts.status;\n this.data = opts.data;\n this.headers = opts.headers;\n }\n\n static fromResponse(res: Response, data: unknown, method: string, url: string): CourierHttpError {\n return new CourierHttpError({\n data,\n headers: res.headers,\n message: res.statusText || `HTTP ${res.status}`,\n method,\n status: res.status,\n url,\n });\n }\n\n static is(err: unknown, status?: number): err is CourierHttpError {\n return err instanceof CourierHttpError && (status === undefined || err.status === status);\n }\n}\n\n/**\n * Thrown when a fetch fails due to a network-level error (DNS, TCP, CORS, etc.)\n * with no HTTP response. Distinct from `HttpError` so callers never need to check\n * for a missing `status` field.\n */\nexport class CourierNetworkError extends CourierError {\n protected static override readonly errorName = 'CourierNetworkError';\n readonly url: string;\n readonly method: string;\n\n constructor(opts: { cause?: unknown; message: string; method: string; url: string }) {\n super(opts.message, { cause: opts.cause });\n this.url = opts.url;\n this.method = opts.method;\n }\n}\n\n/**\n * Thrown when a request is aborted via `AbortSignal.timeout()` or a caller-supplied\n * timeout option. Distinct from `AbortError` so callers can show retry UI on timeouts\n * without checking any `kind` discriminant.\n */\nexport class CourierTimeoutError extends CourierError {\n protected static override readonly errorName = 'CourierTimeoutError';\n readonly url: string;\n readonly method: string;\n\n constructor(opts: { cause?: unknown; message: string; method: string; url: string }) {\n super(opts.message, { cause: opts.cause });\n this.url = opts.url;\n this.method = opts.method;\n }\n}\n\n/**\n * Thrown when a request is cancelled via a caller-supplied `AbortSignal` or\n * `cancelAll()` / `dispose()`. Safe to ignore in most UI handlers.\n */\nexport class CourierAbortError extends CourierError {\n protected static override readonly errorName = 'CourierAbortError';\n readonly url: string;\n readonly method: string;\n\n constructor(opts: { cause?: unknown; message: string; method: string; url: string }) {\n super(opts.message, { cause: opts.cause });\n this.url = opts.url;\n this.method = opts.method;\n }\n}\n\n/**\n * Thrown when a response body fails schema validation (via the `schema` option).\n * Distinct from the HTTP error classes so callers can separately handle network failures\n * vs. data contract violations without inspecting the error shape.\n */\nexport class CourierSchemaValidationError extends CourierError {\n protected static override readonly errorName = 'CourierSchemaValidationError';\n /** The raw (pre-validation) response body that failed parsing. */\n readonly data: unknown;\n\n constructor(cause: unknown, data: unknown) {\n super(cause instanceof Error ? cause.message : String(cause), { cause });\n this.data = data;\n }\n}\n\n/** Thrown when a method is called on a disposed client instance. */\nexport class CourierDisposedError extends CourierError {\n protected static override readonly errorName = 'CourierDisposedError';\n\n constructor(clientName: string) {\n super(`${clientName} disposed`);\n }\n}\n\n/** Thrown when a response body cannot be read or parsed. */\nexport class CourierParseError extends CourierError {\n protected static override readonly errorName = 'CourierParseError';\n}\n\n/**\n * Classify an error thrown by `fetch` or an abort signal into the appropriate\n * courier error class. Signal reason is checked first so a timed-out signal\n * always produces `TimeoutError` even when `fetch` throws a generic Error.\n *\n * We check `.name` rather than `instanceof DOMException` because `AbortSignal.timeout()`\n * sets reason to the *native* Node.js DOMException which may differ from the environment's\n * global DOMException (e.g. jsdom), causing `instanceof` checks to fail cross-realm.\n */\nfunction errorName(value: unknown): string | undefined {\n try {\n return typeof value === 'object' && value !== null && typeof (value as { name?: unknown }).name === 'string'\n ? (value as { name: string }).name\n : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction errorMessage(value: unknown): string {\n try {\n return typeof value === 'object' && value !== null && typeof (value as { message?: unknown }).message === 'string'\n ? (value as { message: string }).message\n : String(value);\n } catch {\n return 'Request failed';\n }\n}\n\nexport function classifyRequestError(\n cause: unknown,\n method: string,\n url: string,\n signal?: AbortSignal,\n): CourierNetworkError | CourierTimeoutError | CourierAbortError {\n const message = errorMessage(cause);\n\n // Signal reason is authoritative — a timed-out signal carries a TimeoutError reason\n // regardless of what error `fetch` actually threw.\n const reasonName = errorName(signal?.reason);\n const causeName = errorName(cause);\n\n if (reasonName === 'TimeoutError' || causeName === 'TimeoutError') {\n return new CourierTimeoutError({ cause, message, method, url });\n }\n\n if (reasonName === 'AbortError' || causeName === 'AbortError' || signal?.aborted) {\n return new CourierAbortError({ cause, message, method, url });\n }\n\n return new CourierNetworkError({ cause, message, method, url });\n}\n","import { CourierError, classifyRequestError } from './errors.js';\n\n/**\n * Immutable request context passed through the middleware pipeline.\n *\n * **Never mutate `init` or `headers` directly.** Use `ctx.withHeaders(updates)` to\n * produce a new context with merged headers — this is the safe, idiomatic pattern\n * for middleware that needs to add or override headers.\n *\n * @example\n * ```ts\n * // Correct — returns a new context\n * return next(ctx.withHeaders({ authorization: `Bearer ${token}` }));\n *\n * // Wrong — mutates shared state, risks stomping other middleware\n * ctx.init.headers = { ...ctx.init.headers, authorization: `Bearer ${token}` };\n * ```\n */\nexport type FetchContext = {\n readonly headers: Readonly<Record<string, string>>;\n readonly init: Readonly<Omit<RequestInit, 'headers'>>;\n readonly url: string;\n /** Returns a new `FetchContext` with the given header overrides merged in (lowercase keys). */\n withHeaders(updates: Record<string, string | undefined>): FetchContext;\n /** Returns a new context with fetch-init overrides. */\n withInit(updates: Partial<Omit<RequestInit, 'body' | 'headers' | 'method' | 'signal'>>): FetchContext;\n};\n\nfunction makeFetchContext(\n url: string,\n headers: Record<string, string>,\n init: Omit<RequestInit, 'headers'>,\n): FetchContext {\n const immutableHeaders = Object.freeze({ ...headers });\n const immutableInit = Object.freeze({ ...init });\n const ctx: FetchContext = {\n headers: immutableHeaders,\n init: immutableInit,\n url,\n withHeaders(updates: Record<string, string | undefined>): FetchContext {\n const merged = { ...immutableHeaders };\n\n for (const [key, value] of Object.entries(updates)) {\n const normalized = key.toLowerCase();\n if (value === undefined) delete merged[normalized];\n else merged[normalized] = value;\n }\n\n return makeFetchContext(url, merged, immutableInit);\n },\n withInit(updates: Partial<Omit<RequestInit, 'body' | 'headers' | 'method' | 'signal'>>): FetchContext {\n return makeFetchContext(url, immutableHeaders, { ...immutableInit, ...updates });\n },\n };\n\n return Object.freeze(ctx);\n}\n\nexport function anySignal(...signals: ReadonlyArray<AbortSignal | null | undefined>): AbortSignal | undefined {\n const active = signals.filter((s): s is AbortSignal => s != null);\n\n if (active.length === 0) return undefined;\n\n if (active.length === 1) return active[0];\n\n return AbortSignal.any(active);\n}\n\n/** Middleware applied to every request. Compose policies like auth, logging, or tracing. */\nexport type Middleware = (ctx: FetchContext, next: (ctx: FetchContext) => Promise<Response>) => Promise<Response>;\n\nexport type TransportOptions = {\n baseUrl?: string;\n fetch?: typeof globalThis.fetch;\n headers?: HeadersInit;\n /** Immutable middleware chain. Configured once at construction; never mutated at runtime. */\n middleware?: readonly Middleware[];\n timeout?: number;\n};\n\nexport const DEFAULT_TIMEOUT = 30_000;\nconst MAX_TIMEOUT = 2_147_483_647;\n\nexport function validateTimeout(timeoutMs: number): void {\n if (\n timeoutMs !== Number.POSITIVE_INFINITY &&\n (!Number.isInteger(timeoutMs) || timeoutMs <= 0 || timeoutMs > MAX_TIMEOUT)\n ) {\n throw new CourierError(`[courier] timeout must be an integer from 1 to ${MAX_TIMEOUT}, or Infinity`);\n }\n}\n\nexport function buildTimeoutSignal(timeoutMs: number, external?: AbortSignal | null): AbortSignal | undefined {\n if (timeoutMs === Number.POSITIVE_INFINITY) {\n return external ?? undefined;\n }\n\n return anySignal(AbortSignal.timeout(timeoutMs), external);\n}\n\n/**\n * Shared transport core: immutable middleware pipeline, header defaults, AbortController lifecycle.\n * HTTP requests build on this. Middleware is fixed at construction — there is no runtime `use()`.\n */\nexport function createTransportCore(opts: TransportOptions = {}) {\n const {\n baseUrl = '',\n fetch: fetchFn = globalThis.fetch,\n headers: initialHeaders = {},\n middleware = [],\n timeout = DEFAULT_TIMEOUT,\n } = opts;\n\n validateTimeout(timeout);\n\n const globalHeaders: Record<string, string> = Object.fromEntries(new Headers(initialHeaders).entries());\n const activeControllers = new Set<AbortController>();\n const disposeController = new AbortController();\n let disposed = false;\n\n const base = async (ctx: FetchContext): Promise<Response> => {\n try {\n return await fetchFn(ctx.url, { ...ctx.init, headers: ctx.headers });\n } catch (error) {\n throw classifyRequestError(\n error,\n (ctx.init.method ?? 'GET').toUpperCase(),\n ctx.url,\n ctx.init.signal as AbortSignal | undefined,\n );\n }\n };\n\n const pipeline: (ctx: FetchContext) => Promise<Response> =\n middleware.length === 0\n ? base\n : middleware.reduceRight<(ctx: FetchContext) => Promise<Response>>((next, mw) => (ctx) => mw(ctx, next), base);\n\n /** Merge global headers with optional per-request headers (normalised to lowercase). */\n function mergeHeaders(perRequest?: HeadersInit): Record<string, string> {\n const normalized = perRequest ? Object.fromEntries(new Headers(perRequest).entries()) : undefined;\n\n return { ...globalHeaders, ...normalized };\n }\n\n /** Register an AbortController for lifecycle tracking (cancelAll / dispose). Returns an untrack fn. */\n function track(ac: AbortController): () => void {\n activeControllers.add(ac);\n\n return () => activeControllers.delete(ac);\n }\n\n /**\n * Dispatch a request through the middleware pipeline.\n * Accepts a plain `{ url, headers, init }` object and promotes it to a\n * full `FetchContext` with `withHeaders()` before entering the pipeline.\n */\n function dispatch(raw: {\n headers: Record<string, string>;\n init: Omit<RequestInit, 'headers'>;\n url: string;\n }): Promise<Response> {\n return pipeline(makeFetchContext(raw.url, raw.headers, raw.init));\n }\n\n function cancelAll(): void {\n for (const ac of [...activeControllers]) ac.abort();\n activeControllers.clear();\n }\n\n function dispose(): void {\n if (disposed) return;\n\n disposed = true;\n disposeController.abort();\n\n for (const ac of activeControllers) ac.abort();\n\n activeControllers.clear();\n }\n\n return {\n baseUrl,\n cancelAll,\n dispatch,\n get disposalSignal() {\n return disposeController.signal;\n },\n dispose,\n get disposed() {\n return disposed;\n },\n mergeHeaders,\n /** Configured request timeout in ms. */\n timeout,\n track,\n };\n}\n\nexport type TransportCore = ReturnType<typeof createTransportCore>;\n","import { cache } from '@vielzeug/arsenal/cache';\nimport { hash } from '@vielzeug/arsenal/object';\n\nimport { CourierError, classifyRequestError } from './errors.js';\nimport { buildTimeoutSignal, validateTimeout } from './transport.js';\nimport type { CourierCacheKey, CourierCacheOptions, CourierReadCache } from './url.js';\n\nconst DEFAULT_CAPACITY = 100;\nconst DEFAULT_TTL = 30_000;\n\ntype Stored = {\n cachedAt: number;\n data: unknown;\n key: CourierCacheKey;\n};\n\ntype Pending = {\n cacheable: boolean;\n controller: AbortController;\n id: string;\n key: CourierCacheKey;\n owners: number;\n promise: Promise<unknown>;\n settled: boolean;\n ttlMs: number;\n waiters: number;\n};\n\ntype LoadOptions<T> = {\n cache: CourierReadCache;\n load: (signal: AbortSignal) => Promise<T>;\n signal?: AbortSignal;\n timeout: number;\n url: string;\n};\n\ntype PrefetchOptions<T> = Omit<LoadOptions<T>, 'signal' | 'timeout' | 'url'>;\n\nfunction duration(value: number, name: string): number {\n if (value !== Number.POSITIVE_INFINITY && (!Number.isFinite(value) || value < 0)) {\n throw new CourierError(`${name} must be a non-negative finite number or Infinity`);\n }\n return value;\n}\n\nfunction capacity(value: number): number {\n if (value !== Number.POSITIVE_INFINITY && (!Number.isInteger(value) || value < 1)) {\n throw new CourierError('cache.capacity must be a positive integer or Infinity');\n }\n return value;\n}\n\nfunction keyId(key: CourierCacheKey): string {\n if (!Array.isArray(key) || key.length === 0) throw new CourierError('cache.key must be a non-empty array');\n\n for (const atom of key) {\n if (atom !== null && !['boolean', 'number', 'string'].includes(typeof atom)) {\n throw new CourierError('cache.key atoms must be strings, finite numbers, booleans, or null');\n }\n if (typeof atom === 'number' && !Number.isFinite(atom)) {\n throw new CourierError('cache.key numbers must be finite');\n }\n }\n\n return hash(key);\n}\n\nfunction matches(key: CourierCacheKey, prefix: CourierCacheKey): boolean {\n return prefix.length <= key.length && prefix.every((atom, index) => atom === key[index]);\n}\n\nfunction waitFor<T>(promise: Promise<T>, signal: AbortSignal | undefined, url: string): Promise<T> {\n if (!signal) return promise;\n if (signal.aborted) return Promise.reject(classifyRequestError(signal.reason, 'GET', url, signal));\n\n return new Promise<T>((resolve, reject) => {\n const abort = (): void => reject(classifyRequestError(signal.reason, 'GET', url, signal));\n signal.addEventListener('abort', abort, { once: true });\n void promise.then(\n (value) => {\n signal.removeEventListener('abort', abort);\n resolve(value);\n },\n (error: unknown) => {\n signal.removeEventListener('abort', abort);\n reject(error);\n },\n );\n });\n}\n\nexport function createReadCache(options?: CourierCacheOptions) {\n const defaultTtl = duration(options?.ttlMs ?? DEFAULT_TTL, 'cache.ttlMs');\n const values = cache<string, Stored>({ capacity: capacity(options?.capacity ?? DEFAULT_CAPACITY) });\n const pending = new Map<string, Pending>();\n const active = new Set<Pending>();\n\n const resolveCache = (config: CourierReadCache): { id: string; key: CourierCacheKey; ttlMs: number } => {\n const id = keyId(config.key);\n const key = Object.freeze([...config.key]) as CourierCacheKey;\n return { id, key, ttlMs: duration(config.ttlMs ?? defaultTtl, 'cache.ttlMs') };\n };\n\n const readStored = (id: string, ttlMs: number): Stored | undefined => {\n const stored = values.get(id);\n if (!stored) return undefined;\n if (ttlMs !== Number.POSITIVE_INFINITY && Date.now() - stored.cachedAt >= ttlMs) {\n values.delete(id);\n return undefined;\n }\n return stored;\n };\n\n const release = (entry: Pending, owner: 'prefetch' | 'waiter'): void => {\n if (owner === 'prefetch') entry.owners--;\n else entry.waiters--;\n if (entry.settled || entry.owners > 0 || entry.waiters > 0) return;\n entry.cacheable = false;\n if (pending.get(entry.id) === entry) pending.delete(entry.id);\n entry.controller.abort();\n };\n\n const start = <T>(\n id: string,\n key: CourierCacheKey,\n ttlMs: number,\n load: (signal: AbortSignal) => Promise<T>,\n ): Pending => {\n const controller = new AbortController();\n const entry: Pending = {\n cacheable: true,\n controller,\n id,\n key,\n owners: 0,\n promise: undefined as unknown as Promise<unknown>,\n settled: false,\n ttlMs,\n waiters: 0,\n };\n let loaded: Promise<T>;\n try {\n loaded = Promise.resolve(load(controller.signal));\n } catch (error) {\n loaded = Promise.reject(error);\n }\n const promise = loaded\n .then((data) => {\n if (entry.cacheable && !controller.signal.aborted) {\n values.set(id, { cachedAt: Date.now(), data, key }, { ttlMs: entry.ttlMs });\n }\n return data;\n })\n .finally(() => {\n entry.settled = true;\n active.delete(entry);\n if (pending.get(id) === entry) pending.delete(id);\n });\n\n entry.promise = promise;\n pending.set(id, entry);\n active.add(entry);\n return entry;\n };\n\n const obtain = <T>(config: CourierReadCache, load: (signal: AbortSignal) => Promise<T>) => {\n const resolved = resolveCache(config);\n const stored = readStored(resolved.id, resolved.ttlMs);\n if (stored) return { ...resolved, stored };\n\n const entry = pending.get(resolved.id) ?? start(resolved.id, resolved.key, resolved.ttlMs, load);\n entry.ttlMs = Math.min(entry.ttlMs, resolved.ttlMs);\n return { ...resolved, entry };\n };\n\n return {\n cancelAll(): void {\n for (const entry of active) {\n entry.cacheable = false;\n entry.controller.abort();\n }\n pending.clear();\n },\n clear(): void {\n values.clear();\n for (const entry of active) entry.cacheable = false;\n pending.clear();\n },\n dispose(): void {\n values.clear();\n for (const entry of active) {\n entry.cacheable = false;\n entry.controller.abort();\n }\n pending.clear();\n active.clear();\n },\n invalidate(prefix: CourierCacheKey): void {\n keyId(prefix);\n for (const [id, stored] of values.entries()) {\n if (matches(stored.key, prefix)) values.delete(id);\n }\n for (const entry of active) {\n if (!matches(entry.key, prefix)) continue;\n entry.cacheable = false;\n if (pending.get(entry.id) === entry) pending.delete(entry.id);\n }\n },\n prefetch<T>({ cache: config, load }: PrefetchOptions<T>): Promise<void> {\n const result = obtain(config, load);\n if ('stored' in result) return Promise.resolve();\n\n result.entry.owners++;\n return result.entry.promise\n .then(\n () => undefined,\n () => undefined,\n )\n .finally(() => release(result.entry, 'prefetch'));\n },\n read<T>({ cache: config, load, signal, timeout, url }: LoadOptions<T>): Promise<T> {\n validateTimeout(timeout);\n const callerSignal = buildTimeoutSignal(timeout, signal);\n if (callerSignal?.aborted) {\n return Promise.reject(classifyRequestError(callerSignal.reason, 'GET', url, callerSignal));\n }\n\n const result = obtain(config, load);\n if ('stored' in result) return Promise.resolve(result.stored.data as T);\n\n result.entry.waiters++;\n return waitFor(result.entry.promise as Promise<T>, callerSignal, url).finally(() =>\n release(result.entry, 'waiter'),\n );\n },\n };\n}\n","import { abortError } from '@vielzeug/arsenal';\n\nimport { CourierParseError } from './errors.js';\n\n/** Response parsing strategy. 'raw' returns the Response object directly. */\nexport type ResponseType = 'auto' | 'json' | 'text' | 'blob' | 'arrayBuffer' | 'raw';\n\nasync function parseJson(res: Response): Promise<unknown> {\n const text = (await res.text()).trim();\n\n return text ? JSON.parse(text) : undefined;\n}\n\nexport function trackRawResponse(response: Response, signal: AbortSignal | undefined, onDone: () => void): Response {\n if (!response.body) {\n onDone();\n return response;\n }\n\n if (response.body.locked) throw new CourierParseError('Raw response body is already locked');\n\n const reader = response.body.getReader();\n let settled = false;\n let streamController: ReadableStreamDefaultController<Uint8Array> | undefined;\n const finish = (): void => {\n if (settled) return;\n settled = true;\n signal?.removeEventListener('abort', abort);\n onDone();\n };\n const abort = (): void => {\n const reason = abortError(signal, 'The operation was aborted.');\n try {\n streamController?.error(reason);\n } catch {}\n finish();\n void reader.cancel(reason).catch(() => undefined);\n };\n const body = new ReadableStream<Uint8Array>({\n cancel: async (reason) => {\n try {\n await reader.cancel(reason);\n } finally {\n finish();\n }\n },\n pull: async (controller) => {\n try {\n const chunk = await reader.read();\n if (settled) return;\n if (chunk.done) {\n controller.close();\n finish();\n } else {\n controller.enqueue(chunk.value);\n }\n } catch (error) {\n if (!settled) controller.error(error);\n finish();\n }\n },\n start: (controller) => {\n streamController = controller;\n if (signal?.aborted) abort();\n else signal?.addEventListener('abort', abort, { once: true });\n },\n });\n const tracked = new Response(body, {\n headers: response.headers,\n status: response.status,\n statusText: response.statusText,\n });\n\n return preserveMetadata(tracked, response);\n}\n\nfunction preserveMetadata(target: Response, source: Response): Response {\n const clone = target.clone.bind(target);\n\n Object.defineProperties(target, {\n clone: { value: () => preserveMetadata(clone(), source) },\n redirected: { value: source.redirected },\n type: { value: source.type },\n url: { value: source.url },\n });\n\n return target;\n}\n\nexport async function parseResponse(res: Response, responseType: ResponseType = 'auto'): Promise<unknown> {\n if (responseType === 'raw') return res;\n\n if (res.status === 204 || res.status === 205) return;\n\n if (responseType === 'json') return parseJson(res);\n\n if (responseType === 'text') return res.text();\n\n if (responseType === 'blob') return res.blob();\n\n if (responseType === 'arrayBuffer') return res.arrayBuffer();\n\n const contentType = res.headers.get('content-type') ?? '';\n\n if (contentType.includes('application/json') || contentType.includes('+json')) return parseJson(res);\n\n if (contentType.startsWith('text/')) return res.text();\n\n if (contentType.startsWith('image/') || contentType.startsWith('audio/') || contentType.startsWith('video/')) {\n return res.blob();\n }\n\n // Unknown content-type — fall back to text, which is always safe to read and debug.\n return res.text();\n}\n","/**\n * Build a `RequestInit` object from the request components, handling body serialisation.\n * JSON-serializable non-BodyInit values are encoded and receive `content-type: application/json`.\n * BodyInit values (FormData, Blob, etc.) are forwarded as-is.\n */\nexport function buildRequestInit(\n method: string,\n headers: Record<string, string>,\n body: unknown,\n signal: AbortSignal | undefined,\n rest: Omit<RequestInit, 'body' | 'headers' | 'method' | 'signal'>,\n): RequestInit {\n if (body !== undefined && !isBodyInit(body)) {\n const encoded = JSON.stringify(body);\n if (encoded === undefined) throw new TypeError('request body is not JSON-serializable');\n\n return {\n ...rest,\n body: encoded,\n headers: { 'content-type': 'application/json', ...headers },\n method: method.toUpperCase(),\n signal,\n };\n }\n\n return {\n ...rest,\n ...(body !== undefined && { body: body as BodyInit }),\n ...(isReadableStream(body) && { duplex: 'half' }),\n headers,\n method: method.toUpperCase(),\n signal,\n };\n}\n\nfunction objectTag(value: unknown): string {\n try {\n return Object.prototype.toString.call(value);\n } catch {\n return '';\n }\n}\n\nfunction isReadableStream(value: unknown): value is ReadableStream {\n return objectTag(value) === '[object ReadableStream]' && typeof (value as ReadableStream).getReader === 'function';\n}\n\nexport function isBodyInit(value: unknown): value is BodyInit {\n if (typeof value === 'string' || ArrayBuffer.isView(value)) return true;\n\n return [\n '[object ArrayBuffer]',\n '[object Blob]',\n '[object FormData]',\n '[object URLSearchParams]',\n '[object ReadableStream]',\n ].includes(objectTag(value));\n}\n","import { CourierParseError } from './errors.js';\nimport type { ResponseType } from './response.js';\n\ntype QueryScalar = string | number | boolean | null;\n\nexport type ParamValue = QueryScalar | readonly QueryScalar[] | undefined;\nexport type Params = Record<string, ParamValue>;\n\nexport type CourierCacheKeyAtom = string | number | boolean | null;\nexport type CourierCacheKey = readonly [CourierCacheKeyAtom, ...CourierCacheKeyAtom[]];\nexport type CourierCacheOptions = {\n capacity?: number;\n ttlMs?: number;\n};\nexport type CourierReadCache = {\n key: CourierCacheKey;\n ttlMs?: number;\n};\n\n// Type-safe path params: extracts {param} placeholders from a path string\ntype ExtractPathParams<P extends string> = P extends `${string}{${infer K}}${infer R}`\n ? K | ExtractPathParams<R>\n : never;\n\nexport type PathConfig<P extends string> = string extends P\n ? { params?: Record<string, string | number | boolean> }\n : [ExtractPathParams<P>] extends [never]\n ? { params?: never }\n : { params: Record<ExtractPathParams<P>, string | number | boolean> };\n\ntype ParsedResponseConfig<T> = {\n /** Response parsing strategy. */\n responseType?: Exclude<ResponseType, 'raw'>;\n /**\n * Optional schema for response validation. Any object with a `parse(data)` method\n * works — e.g. a `@vielzeug/spell` schema or a plain validator function wrapper.\n * Called after the response body is parsed; throws if validation fails.\n * The schema's return type must be assignable to `T`.\n */\n schema?: { parse(data: unknown): T };\n};\n\ntype RawResponseConfig = { responseType: 'raw'; schema?: never };\n\ntype RequestOptions = {\n /** Request body. BodyInit values pass through; other JSON-serializable values are encoded. */\n body?: unknown;\n /** Query string parameters. */\n query?: Params;\n /** Request timeout in ms. Overrides client default. */\n timeout?: number;\n};\n\ntype HttpOptions = {\n /** Raw fetch options for advanced use (credentials, cache, mode, referrer, etc.). */\n fetchInit?: Omit<RequestInit, 'body' | 'headers' | 'method' | 'signal'>;\n /** Per-request headers merged with (and overriding) global client headers. */\n headers?: HeadersInit;\n /** External abort signal merged with internal cancellation. */\n signal?: AbortSignal;\n};\n\nexport type CourierRequestConfig<P extends string = string, T = unknown> = PathConfig<P> &\n (ParsedResponseConfig<T> | RawResponseConfig) &\n RequestOptions;\n\nexport type HttpRequestConfig<P extends string = string, T = unknown> = CourierRequestConfig<P, T> &\n HttpOptions & { cache?: never };\n\nexport type GetRequestConfig<P extends string = string, T = unknown> = PathConfig<P> &\n ((ParsedResponseConfig<T> & { cache?: CourierReadCache }) | (RawResponseConfig & { cache?: never })) &\n RequestOptions &\n HttpOptions & { body?: never };\nexport type PrefetchConfig<P extends string = string, T = unknown> = PathConfig<P> &\n ParsedResponseConfig<T> &\n Omit<RequestOptions, 'body' | 'timeout'> &\n Omit<HttpOptions, 'signal'> & { body?: never; cache: CourierReadCache; signal?: never; timeout?: never };\nexport type RequestConfig<P extends string = string, T = unknown> = HttpRequestConfig<P, T> & { method?: string };\n\nexport function buildUrl(base: string, path: string, params?: Params, query?: Params): string {\n const baseClean = base.replace(/\\/+$/, '');\n let pathClean = baseClean ? path.replace(/^\\/+/, '') : path;\n\n pathClean = pathClean.replace(/\\{([^}]+)\\}/g, (_, key: string) => {\n const val = params?.[key];\n\n if (val === undefined || val === null) throw new CourierParseError(`unresolved path param {${key}} in '${path}'`);\n\n return encodeURIComponent(String(val));\n });\n\n const url = baseClean && pathClean ? `${baseClean}/${pathClean}` : baseClean || pathClean;\n\n if (!query) return url;\n\n const qs = new URLSearchParams();\n\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined) {\n continue;\n }\n\n if (Array.isArray(value)) {\n for (const entry of value) {\n if (entry !== undefined) {\n qs.append(key, entry === null ? '' : String(entry));\n }\n }\n\n continue;\n }\n\n qs.append(key, value === null ? '' : String(value));\n }\n\n const queryString = qs.toString();\n\n if (!queryString) return url;\n\n const hashIndex = url.indexOf('#');\n const beforeHash = hashIndex === -1 ? url : url.slice(0, hashIndex);\n const hash = hashIndex === -1 ? '' : url.slice(hashIndex);\n\n return `${beforeHash}${beforeHash.includes('?') ? '&' : '?'}${queryString}${hash}`;\n}\n","import { createReadCache } from './_cache.js';\nimport {\n CourierAbortError,\n CourierDisposedError,\n CourierError,\n CourierHttpError,\n CourierNetworkError,\n CourierParseError,\n CourierSchemaValidationError,\n CourierTimeoutError,\n classifyRequestError,\n} from './errors.js';\nimport { parseResponse, trackRawResponse } from './response.js';\nimport { buildRequestInit } from './serialize.js';\nimport {\n anySignal,\n buildTimeoutSignal,\n createTransportCore,\n type TransportOptions,\n validateTimeout,\n} from './transport.js';\nimport type {\n CourierCacheKey,\n CourierCacheOptions,\n GetRequestConfig,\n HttpRequestConfig,\n Params,\n PrefetchConfig,\n RequestConfig,\n} from './url.js';\nimport { buildUrl } from './url.js';\n\nexport type CourierOptions = TransportOptions & {\n cache?: CourierCacheOptions;\n};\n\nexport type Courier = ReturnType<typeof createCourier>;\n\nexport type CourierEvent =\n | { readonly method: string; readonly type: 'request-start'; readonly url: string }\n | {\n readonly duration: number;\n readonly method: string;\n readonly status: number;\n readonly type: 'request-success';\n readonly url: string;\n }\n | { readonly error: unknown; readonly method: string; readonly type: 'request-error'; readonly url: string }\n | { readonly type: 'dispose' };\n\nexport {\n CourierAbortError,\n CourierDisposedError,\n CourierError,\n CourierHttpError,\n CourierNetworkError,\n CourierParseError,\n CourierSchemaValidationError,\n CourierTimeoutError,\n};\n\n/** One client owns HTTP transport, explicit cached reads, middleware, and cancellation. */\nexport function createCourier(options: CourierOptions = {}) {\n const { cache: cacheOptions, ...transportOptions } = options;\n const transport = createTransportCore(transportOptions);\n const readCache = createReadCache(cacheOptions);\n const tapCleanups = new Set<() => void>();\n const tappers = new Set<(event: CourierEvent) => void>();\n\n function emit(event: CourierEvent): void {\n if (tappers.size === 0) return;\n const snapshot = Object.freeze(event);\n\n for (const tapper of [...tappers]) {\n try {\n tapper(snapshot);\n } catch {}\n }\n }\n\n function tap(handler: (event: CourierEvent) => void, options?: { signal?: AbortSignal }): () => void {\n if (transport.disposed || options?.signal?.aborted) return () => {};\n\n tappers.add(handler);\n const remove = (): void => {\n tappers.delete(handler);\n tapCleanups.delete(remove);\n options?.signal?.removeEventListener('abort', remove);\n };\n\n if (options?.signal) {\n tapCleanups.add(remove);\n options.signal.addEventListener('abort', remove, { once: true });\n }\n return remove;\n }\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<{ result: T; status: number }> {\n const signal = init.signal as AbortSignal | undefined;\n const res = await transport.dispatch({ headers, init, url: full });\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 const isJson = res.headers.get('content-type')?.includes('json') ?? false;\n let text: string;\n\n try {\n text = await res.text();\n } catch (error) {\n if (signal?.aborted) throw classifyRequestError(error, m, full, signal);\n throw new CourierParseError(error instanceof Error ? error.message : String(error), { cause: error });\n }\n\n let body: unknown = 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\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 (error) {\n if (signal?.aborted) throw classifyRequestError(error, m, full, signal);\n if (error instanceof CourierError) throw error;\n throw new CourierParseError(error instanceof Error ? error.message : String(error), { cause: error });\n }\n\n if (schema) {\n try {\n return { result: schema.parse(raw), status: res.status };\n } catch (err) {\n throw new CourierSchemaValidationError(err, raw);\n }\n }\n\n return { result: raw as T, status: res.status };\n }\n\n function resolveUrl<T, P extends string>(path: P, config: RequestConfig<P, T> | GetRequestConfig<P, T>): string {\n try {\n return buildUrl(transport.baseUrl, path, config.params as Params | undefined, config.query);\n } catch (error) {\n if (error instanceof CourierError) throw error;\n throw new CourierParseError(error instanceof Error ? error.message : String(error), { cause: error });\n }\n }\n\n async function request<T, P extends string = string>(\n path: P,\n config: RequestConfig<P, T> = {} as RequestConfig<P, T>,\n ): Promise<T> {\n if (transport.disposed) throw new CourierDisposedError('Courier');\n\n const m = (config.method ?? 'GET').toUpperCase();\n const full = resolveUrl(path, config);\n const { body, fetchInit, headers, responseType, schema, signal: extSignal, timeout: cfgTimeout } = config;\n\n if ((m === 'GET' || m === 'HEAD') && body !== undefined) {\n throw new CourierParseError(`${m} requests cannot include a body`);\n }\n if (responseType === 'raw' && schema !== undefined) {\n throw new CourierParseError('Raw responses cannot use a schema');\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.timeout, anySignal(extSignal, requestAc.signal));\n const started = performance.now();\n let rawResponseOwned = false;\n\n emit({ method: m, type: 'request-start', url: full });\n\n try {\n let requestInit: RequestInit;\n\n try {\n requestInit = buildRequestInit(m, transport.mergeHeaders(headers), body, signal, fetchInit ?? {});\n } catch (error) {\n throw new CourierParseError(error instanceof Error ? error.message : String(error), { cause: error });\n }\n\n const { headers: initHeaders, ...restInit } = requestInit;\n const { result, status } = 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\n if (responseType === 'raw' && result instanceof Response) {\n const tracked = trackRawResponse(result, signal, untrack);\n rawResponseOwned = true;\n emit({ duration: performance.now() - started, method: m, status, type: 'request-success', url: full });\n return tracked as T;\n }\n\n emit({ duration: performance.now() - started, method: m, status, type: 'request-success', url: full });\n return result;\n } catch (error) {\n emit({ error, method: m, type: 'request-error', url: full });\n throw error;\n } finally {\n if (!rawResponseOwned) untrack();\n }\n }\n\n const requestWithMethod = <T, P extends string>(method: string, path: P, config?: HttpRequestConfig<P, T>) =>\n request<T, P>(path, { ...config, method } as RequestConfig<P, T>);\n\n function get<T, P extends string = string>(path: P, config?: GetRequestConfig<P, T>): Promise<T> {\n try {\n const resolved = config ?? ({} as GetRequestConfig<P, T>);\n const { cache, signal, timeout, ...sharedConfig } = resolved;\n if (!cache) {\n return requestWithMethod<T, P>('GET', path, {\n ...sharedConfig,\n signal,\n timeout,\n } as HttpRequestConfig<P, T>);\n }\n\n const url = resolveUrl(path, resolved);\n return readCache.read({\n cache,\n load: (internalSignal) =>\n requestWithMethod<T, P>('GET', path, {\n ...sharedConfig,\n signal: internalSignal,\n } as HttpRequestConfig<P, T>),\n signal,\n timeout: timeout ?? transport.timeout,\n url,\n });\n } catch (error) {\n return Promise.reject(error);\n }\n }\n\n function prefetch<T, P extends string = string>(path: P, config: PrefetchConfig<P, T>): Promise<void> {\n if (transport.disposed) throw new CourierDisposedError('Courier');\n const { cache, ...sharedConfig } = config;\n resolveUrl(path, config);\n return readCache.prefetch({\n cache,\n load: (internalSignal) =>\n requestWithMethod<T, P>('GET', path, {\n ...sharedConfig,\n signal: internalSignal,\n } as HttpRequestConfig<P, T>),\n });\n }\n\n return {\n cancelAll() {\n readCache.cancelAll();\n transport.cancelAll();\n },\n clearCache() {\n readCache.clear();\n },\n /** Convenience for `request(path, { ...config, method: 'DELETE' })`. */\n delete: <T, P extends string = string>(path: P, config?: HttpRequestConfig<P, T>) =>\n requestWithMethod<T, P>('DELETE', path, config),\n get disposalSignal() {\n return transport.disposalSignal;\n },\n dispose() {\n if (transport.disposed) return;\n emit({ type: 'dispose' });\n for (const cleanup of [...tapCleanups]) cleanup();\n tappers.clear();\n readCache.dispose();\n transport.dispose();\n },\n get disposed() {\n return transport.disposed;\n },\n /** Convenience for `request(path, { ...config, method: 'GET' })`, with explicit opt-in caching. */\n get,\n invalidateCache(prefix: CourierCacheKey) {\n readCache.invalidate(prefix);\n },\n /** Convenience for `request(path, { ...config, method: 'PATCH' })`. */\n patch: <T, P extends string = string>(path: P, config?: HttpRequestConfig<P, T>) =>\n requestWithMethod<T, P>('PATCH', path, config),\n /** Convenience for `request(path, { ...config, method: 'POST' })`. */\n post: <T, P extends string = string>(path: P, config?: HttpRequestConfig<P, T>) =>\n requestWithMethod<T, P>('POST', path, config),\n prefetch,\n /** Convenience for `request(path, { ...config, method: 'PUT' })`. */\n put: <T, P extends string = string>(path: P, config?: HttpRequestConfig<P, T>) =>\n requestWithMethod<T, P>('PUT', path, config),\n request,\n tap,\n [Symbol.dispose]() {\n this.dispose();\n },\n };\n}\n","import type { Middleware } from './transport.js';\n\n/**\n * Attaches a Bearer token `Authorization` header to every request.\n * The token can be a static string or an async function (useful for refresh flows).\n * Nullish and empty results remove any existing authorization header.\n *\n * @example\n * ```ts\n * const courier = createCourier({\n * baseUrl: 'https://api.example.com',\n * middleware: [withBearerAuth(() => tokenStore.getAccessToken())],\n * });\n * ```\n */\nexport function withBearerAuth(\n token: string | (() => Promise<string | null | undefined> | string | null | undefined),\n): Middleware {\n return async (ctx, next) => {\n const value = typeof token === 'function' ? await token() : token;\n\n return next(ctx.withHeaders({ authorization: value ? `Bearer ${value}` : undefined }));\n };\n}\n\n/**\n * Adds a unique request ID to every request as a header.\n *\n * Defaults to `x-request-id` populated with `crypto.randomUUID()`.\n *\n * @example\n * ```ts\n * const courier = createCourier({\n * baseUrl: 'https://api.example.com',\n * middleware: [withRequestId()],\n * });\n * ```\n */\nexport function withRequestId(opts?: { generate?: () => string; header?: string }): Middleware {\n const header = opts?.header ?? 'x-request-id';\n const generate = opts?.generate ?? (() => crypto.randomUUID());\n\n return (ctx, next) => next(ctx.withHeaders({ [header]: generate() }));\n}\n\n/**\n * Logs each request's method, URL, status code, and duration.\n *\n * Requires an explicit `logger` function — no default console output.\n *\n * **Security note:** The full URL is logged, including any query parameters.\n * If your URLs may contain sensitive data (tokens, PII), provide a custom\n * `logger` that sanitizes the URL before writing to persistent logs.\n *\n * @example\n * ```ts\n * const courier = createCourier({\n * baseUrl: 'https://api.example.com',\n * middleware: [withLogging({ logger: (msg) => console.log(msg) })],\n * });\n * ```\n */\nexport function withLogging(opts: {\n logger: (msg: string, meta: { duration: number; method: string; status: number; url: string }) => void;\n}): Middleware {\n const log = opts.logger;\n const write = (message: string, meta: { duration: number; method: string; status: number; url: string }): void => {\n try {\n log(message, meta);\n } catch {}\n };\n\n return async (ctx, next) => {\n const start = performance.now();\n const method = (ctx.init.method ?? 'GET').toUpperCase();\n\n try {\n const res = await next(ctx);\n const duration = Math.round(performance.now() - start);\n\n write(`${method} ${ctx.url} ${res.status} (${duration}ms)`, {\n duration,\n method,\n status: res.status,\n url: ctx.url,\n });\n\n return res;\n } catch (err) {\n const duration = Math.round(performance.now() - start);\n\n write(`${method} ${ctx.url} ERR (${duration}ms)`, {\n duration,\n method,\n status: 0,\n url: ctx.url,\n });\n\n throw err;\n }\n };\n}\n"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
export { type Courier, type CourierEvent, type CourierOptions, createCourier } from './courier';
|
|
2
|
-
export {
|
|
3
|
-
export {
|
|
4
|
-
export type {
|
|
5
|
-
export type {
|
|
6
|
-
export type { AsyncState, MutationContext, MutationOptions, QueryCache, QueryContext, QueryDefinition, QueryKey, QueryKeyAtom, Unsubscribe, } from './types';
|
|
7
|
-
export type { HttpRequestConfig as RequestConfig, Params } from './url';
|
|
1
|
+
export { type Courier, CourierAbortError, CourierDisposedError, CourierError, type CourierEvent, CourierHttpError, CourierNetworkError, type CourierOptions, CourierParseError, CourierSchemaValidationError, CourierTimeoutError, createCourier, } from './courier.js';
|
|
2
|
+
export { withBearerAuth, withLogging, withRequestId } from './interceptors.js';
|
|
3
|
+
export type { ResponseType } from './response.js';
|
|
4
|
+
export type { FetchContext, Middleware, TransportOptions } from './transport.js';
|
|
5
|
+
export type { CourierCacheKey, CourierCacheKeyAtom, CourierCacheOptions, CourierReadCache, GetRequestConfig, Params, PrefetchConfig, RequestConfig, } from './url.js';
|
|
8
6
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EACZ,iBAAiB,EACjB,oBAAoB,EACpB,YAAY,EACZ,KAAK,YAAY,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,KAAK,cAAc,EACnB,iBAAiB,EACjB,4BAA4B,EAC5B,mBAAmB,EACnB,aAAa,GACd,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAC/E,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACjF,YAAY,EACV,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,EAChB,MAAM,EACN,cAAc,EACd,aAAa,GACd,MAAM,UAAU,CAAC"}
|