@autometa/http 1.4.20 → 2.0.0-rc.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 +107 -2
- package/dist/assertions/http-adapters.d.ts +35 -0
- package/dist/assertions/http-assertions-plugin.d.ts +16 -0
- package/dist/assertions/http-ensure.d.ts +42 -0
- package/dist/axios-transport.d.ts +22 -0
- package/dist/default-schema.d.ts +8 -0
- package/dist/fetch-transport.d.ts +21 -0
- package/dist/http-request.d.ts +109 -0
- package/dist/http-response.d.ts +77 -0
- package/dist/http.d.ts +300 -0
- package/dist/index.cjs +2076 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +15 -1116
- package/dist/index.js +1727 -845
- package/dist/index.js.map +1 -1
- package/dist/plugins.d.ts +43 -0
- package/dist/request-meta.config.d.ts +56 -0
- package/dist/schema.map.d.ts +11 -0
- package/dist/transform-response.d.ts +1 -0
- package/dist/transport.d.ts +11 -0
- package/dist/types.d.ts +39 -0
- package/package.json +31 -31
- package/.eslintignore +0 -3
- package/.eslintrc.cjs +0 -4
- package/.turbo/turbo-lint$colon$fix.log +0 -4
- package/.turbo/turbo-prettify.log +0 -5
- package/.turbo/turbo-test.log +0 -120
- package/CHANGELOG.md +0 -335
- package/dist/esm/index.js +0 -1117
- package/dist/esm/index.js.map +0 -1
- package/dist/index.d.cts +0 -1116
- package/src/axios-client.ts +0 -35
- package/src/default-client-factory.axios.spec.ts +0 -9
- package/src/default-client-factory.other.spec.ts +0 -13
- package/src/default-client-factory.ts +0 -7
- package/src/default-schema.spec.ts +0 -74
- package/src/default-schema.ts +0 -127
- package/src/http-client.ts +0 -20
- package/src/http-request.spec.ts +0 -172
- package/src/http-request.ts +0 -201
- package/src/http-response.ts +0 -107
- package/src/http.spec.ts +0 -189
- package/src/http.ts +0 -907
- package/src/index.ts +0 -13
- package/src/node_modules/.vitest/deps/_metadata.json +0 -8
- package/src/node_modules/.vitest/deps/package.json +0 -3
- package/src/node_modules/.vitest/results.json +0 -1
- package/src/request-meta.config.spec.ts +0 -81
- package/src/request-meta.config.ts +0 -134
- package/src/request.config.ts +0 -34
- package/src/schema.map.spec.ts +0 -50
- package/src/schema.map.ts +0 -68
- package/src/transform-response.ts +0 -43
- package/src/types.ts +0 -37
- package/tsup.config.ts +0 -14
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/http.ts","../src/fetch-transport.ts","../src/http-request.ts","../src/http-response.ts","../src/schema.map.ts","../src/request-meta.config.ts","../src/transform-response.ts","../src/default-schema.ts","../src/plugins.ts","../src/axios-transport.ts","../src/assertions/http-ensure.ts","../src/assertions/http-assertions-plugin.ts","../src/assertions/http-adapters.ts"],"names":["AutomationError","mergeOptions","tryParseJson","mergeHeaders","pass","normalizeHeaders"],"mappings":"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","sourcesContent":["import { AutomationError } from \"@autometa/errors\";\nimport { createFetchTransport } from \"./fetch-transport\";\nimport { HTTPRequest, HTTPRequestBuilder } from \"./http-request\";\nimport type { HeaderPrimitive, ParamValue } from \"./http-request\";\nimport { HTTPResponse, HTTPResponseBuilder } from \"./http-response\";\nimport { MetaConfig, MetaConfigBuilder } from \"./request-meta.config\";\nimport type {\n HTTPErrorContext,\n HTTPPlugin,\n HTTPRequestContext,\n HTTPResponseContext,\n} from \"./plugins\";\nimport { transformResponse } from \"./transform-response\";\nimport type { HTTPTransport } from \"./transport\";\nimport type {\n HTTPAdditionalOptions,\n HTTPMethod,\n HTTPRetryOptions,\n QueryParamSerializationOptions,\n RequestHook,\n ResponseHook,\n SchemaParser,\n StatusCode,\n} from \"./types\";\n\nexport class HTTPError extends AutomationError {\n readonly request: HTTPRequest<unknown>;\n readonly response: HTTPResponse<unknown> | undefined;\n readonly originalError: unknown;\n\n constructor(\n message: string,\n request: HTTPRequest<unknown>,\n response?: HTTPResponse<unknown>,\n cause?: unknown\n ) {\n super(message, {\n cause: cause instanceof Error ? cause : undefined,\n });\n this.request = request;\n this.response = response;\n this.originalError = cause;\n this.name = this.constructor.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class HTTPTransportError extends HTTPError {\n constructor(request: HTTPRequest<unknown>, cause: unknown) {\n super(\"Failed to execute HTTP request\", request, undefined, cause);\n this.name = \"HTTPTransportError\";\n }\n}\n\nexport class HTTPSchemaValidationError extends HTTPError {\n constructor(\n request: HTTPRequest<unknown>,\n response: HTTPResponse<unknown>,\n cause: unknown\n ) {\n super(\"Response schema validation failed\", request, response, cause);\n this.name = \"HTTPSchemaValidationError\";\n }\n}\n\nexport class HTTPServerError extends HTTPError {\n constructor(request: HTTPRequest<unknown>, response: HTTPResponse<unknown>) {\n super(`Server responded with status ${response.status}`, request, response);\n this.name = \"HTTPServerError\";\n }\n}\n\n/**\n * Optional configuration applied during {@link HTTP.create}.\n */\nexport interface HTTPCreateOptions {\n /**\n * Custom transport implementation overriding the default Fetch based transport.\n */\n transport?: HTTPTransport;\n /**\n * Plugins that will be registered on every derived client instance.\n */\n plugins?: HTTPPlugin[];\n}\n\n/**\n * Fluent HTTP client with pluggable transport, schema validation and hook support.\n */\nexport class HTTP {\n private static sharedPlugins: HTTPPlugin[] = [];\n private transport: HTTPTransport;\n private builder: HTTPRequestBuilder<HTTPRequest<unknown>>;\n private meta: MetaConfigBuilder;\n private sharedPlugins: HTTPPlugin[];\n private scopedPlugins: HTTPPlugin[];\n\n private constructor(\n transport: HTTPTransport,\n builder: HTTPRequestBuilder<HTTPRequest<unknown>>,\n meta: MetaConfigBuilder,\n sharedPlugins: HTTPPlugin[],\n scopedPlugins: HTTPPlugin[]\n ) {\n this.transport = transport;\n this.builder = builder;\n this.meta = meta;\n this.sharedPlugins = sharedPlugins;\n this.scopedPlugins = scopedPlugins;\n }\n\n /**\n * Factory helper that prepares an {@link HTTP} instance with shared state.\n */\n static create(options: HTTPCreateOptions = {}) {\n const transport = options.transport ?? createFetchTransport();\n const plugins = [...HTTP.sharedPlugins, ...(options.plugins ?? [])];\n return new HTTP(\n transport,\n HTTPRequestBuilder.create(),\n new MetaConfigBuilder(),\n plugins,\n []\n );\n }\n\n /**\n * Registers a plugin applied to every client created via {@link HTTP.create}.\n */\n static registerSharedPlugin(plugin: HTTPPlugin): void {\n this.sharedPlugins = [...this.sharedPlugins, plugin];\n }\n\n /**\n * Replaces the shared plugin registry used by {@link HTTP.create}.\n */\n static setSharedPlugins(plugins: readonly HTTPPlugin[]): void {\n this.sharedPlugins = [...plugins];\n }\n\n /**\n * Returns a copy of the currently registered shared plugins.\n */\n static getSharedPlugins(): readonly HTTPPlugin[] {\n return [...this.sharedPlugins];\n }\n\n /**\n * Registers a plugin that runs for every request executed by this instance and its clones.\n */\n use(plugin: HTTPPlugin) {\n this.sharedPlugins.push(plugin);\n return this;\n }\n\n /**\n * Returns a scoped clone with an additional plugin applied only to that clone.\n */\n plugin(plugin: HTTPPlugin) {\n return this.derive(({ plugins }) => {\n plugins.push(plugin);\n });\n }\n\n /**\n * Mutates the current instance to use a different transport implementation.\n */\n useTransport(transport: HTTPTransport) {\n this.transport = transport;\n return this;\n }\n\n /**\n * Produces a new client with an alternate transport without changing the original instance.\n */\n withTransport(transport: HTTPTransport) {\n return this.derive(undefined, { transport });\n }\n\n /**\n * Sets the base URL shared by subsequent requests.\n */\n url(url: string) {\n this.builder.url(url);\n return this;\n }\n\n /**\n * Applies additional transport specific options to every request executed by this instance.\n */\n sharedOptions(options: HTTPAdditionalOptions<unknown>) {\n this.meta.options(options);\n return this;\n }\n\n /**\n * Returns a derived client with extra transport options applied only to that clone.\n */\n withOptions(options: HTTPAdditionalOptions<unknown>) {\n return this.derive(({ meta }) => {\n meta.options(options);\n });\n }\n\n /**\n * Registers an {@link AbortSignal} that will be forwarded to every request issued by this instance.\n */\n sharedAbortSignal(signal: AbortSignal | null) {\n this.meta.options({ signal: signal ?? undefined });\n return this;\n }\n\n /**\n * Returns a derived client configured with the provided {@link AbortSignal}.\n */\n abortSignal(signal: AbortSignal | null) {\n return this.derive(({ meta }) => {\n meta.options({ signal: signal ?? undefined });\n });\n }\n\n /**\n * Configures automatic retries for this instance and all derived clients.\n */\n sharedRetry(options: HTTPRetryOptions | null) {\n this.meta.retry(options);\n return this;\n }\n\n /**\n * Returns a derived client with custom retry behaviour.\n */\n retry(options: HTTPRetryOptions | null) {\n return this.derive(({ meta }) => {\n meta.retry(options);\n });\n }\n\n /**\n * Forces subsequent requests to return raw response streams without parsing.\n */\n sharedStreamResponse(enabled: boolean) {\n this.meta.streamResponse(enabled);\n return this;\n }\n\n /**\n * Returns a derived client configured for streaming responses.\n */\n streamResponse(enabled: boolean) {\n return this.derive(({ meta }) => {\n meta.streamResponse(enabled);\n });\n }\n\n /**\n * Convenience helper that returns a clone configured for streaming responses.\n */\n asStream() {\n return this.streamResponse(true);\n }\n\n /**\n * Executes a GET request while preserving the raw response stream.\n */\n stream<TResponse>(options?: HTTPAdditionalOptions<unknown>) {\n return this.streamResponse(true).get<TResponse>(options);\n }\n\n /**\n * Sets a shared timeout (in milliseconds) applied to every request from this instance.\n */\n sharedTimeout(duration: number | null) {\n this.meta.timeout(duration);\n return this;\n }\n\n /**\n * Returns a derived client with a per-request timeout in milliseconds.\n */\n timeout(duration: number | null) {\n return this.derive(({ meta }) => {\n meta.timeout(duration);\n });\n }\n\n /**\n * Configures whether schema validation is required before resolving a response.\n */\n requireSchema(required: boolean) {\n this.meta.requireSchema(required);\n return this;\n }\n\n /**\n * Returns a clone with overridden plain text handling mode.\n */\n allowPlainText(allow: boolean) {\n return this.derive(({ meta }) => {\n meta.allowPlainText(allow);\n });\n }\n\n /**\n * Sets plain text handling for the current instance and all future requests.\n */\n sharedAllowPlainText(allow: boolean) {\n this.meta.allowPlainText(allow);\n return this;\n }\n\n /**\n * Adds path segments that will be included in every request.\n */\n sharedRoute(...segments: (string | number | boolean)[]) {\n this.builder.route(...segments);\n return this;\n }\n\n /**\n * Executes a request using the provided method.\n *\n * Use this when the verb is dynamic (e.g. provided by a parameter). It\n * behaves like calling {@link get}/{@link post}/{@link patch}, respecting any\n * route/headers/body configured earlier in the chain.\n */\n fetchWith<TResponse>(method: HTTPMethod | Lowercase<HTTPMethod>, options?: HTTPAdditionalOptions<unknown>) {\n const normalized = String(method).trim().toUpperCase() as HTTPMethod;\n return this.execute<TResponse>(normalized, options);\n }\n\n /**\n * Returns a clone with additional path segments.\n */\n route(...segments: (string | number | boolean)[]) {\n return this.derive(({ builder }) => {\n builder.route(...segments);\n });\n }\n\n /**\n * Applies query serialization preferences to all future requests originating from this instance.\n */\n sharedQueryFormat(options: QueryParamSerializationOptions) {\n this.builder.queryFormat(options);\n return this;\n }\n\n /**\n * Returns a derived client with custom query serialization that does not affect the source instance.\n */\n queryFormat(options: QueryParamSerializationOptions) {\n return this.derive(({ builder }) => {\n builder.queryFormat(options);\n });\n }\n\n /**\n * Registers schema validation for one or more status codes on the current instance.\n */\n sharedSchema(parser: SchemaParser, ...codes: StatusCode[]): HTTP;\n sharedSchema(\n parser: SchemaParser,\n ...ranges: { from: StatusCode; to: StatusCode }[]\n ): HTTP;\n sharedSchema(\n parser: SchemaParser,\n ...args: (StatusCode | { from: StatusCode; to: StatusCode })[]\n ) {\n this.meta.schema(parser, ...(args as never[]));\n return this;\n }\n\n /**\n * Returns a clone with schema validation limited to the derived instance.\n */\n schema(parser: SchemaParser, ...codes: StatusCode[]): HTTP;\n schema(\n parser: SchemaParser,\n ...ranges: { from: StatusCode; to: StatusCode }[]\n ): HTTP;\n schema(\n parser: SchemaParser,\n ...args: (StatusCode | { from: StatusCode; to: StatusCode })[]\n ) {\n return this.derive(({ meta }) => {\n meta.schema(parser, ...(args as never[]));\n });\n }\n\n /**\n * Sets a shared query parameter for all future requests.\n */\n sharedParam(name: string, value: Record<string, unknown>): HTTP;\n sharedParam(\n name: string,\n value: (string | number | boolean | null | undefined)[]\n ): HTTP;\n sharedParam(name: string, ...value: (string | number | boolean)[]): HTTP;\n sharedParam(name: string, value: unknown, ...rest: unknown[]) {\n this.builder.param(name, toParamValue(value, rest));\n return this;\n }\n\n /**\n * Derives a client with additional query parameters.\n */\n param(name: string, value: Record<string, unknown>): HTTP;\n param(\n name: string,\n value: (string | number | boolean | null | undefined)[]\n ): HTTP;\n param(name: string, ...value: (string | number | boolean)[]): HTTP;\n param(name: string, value: unknown, ...rest: unknown[]) {\n return this.derive(({ builder }) => {\n builder.param(name, toParamValue(value, rest));\n });\n }\n\n /**\n * Merges multiple shared query parameters into the instance.\n */\n sharedParams(dict: Record<string, unknown>) {\n this.builder.params(dict);\n return this;\n }\n\n /**\n * Derives a client with additional query parameters applied together.\n */\n params(dict: Record<string, unknown>) {\n return this.derive(({ builder }) => {\n builder.params(dict);\n });\n }\n\n /**\n * Sets a shared request body used by every request from this instance.\n */\n sharedData<T>(data: T | undefined) {\n this.builder.data(data);\n return this;\n }\n\n /**\n * Derives a client with a one-off request body.\n */\n data<T>(data: T | undefined) {\n return this.derive(({ builder }) => {\n builder.data(data);\n });\n }\n\n /**\n * Registers a header that will be resolved for every request on this instance.\n */\n sharedHeader(\n name: string,\n value:\n | string\n | number\n | boolean\n | null\n | (string | number | boolean)[]\n | (() => HeaderPrimitive | Promise<HeaderPrimitive>)\n ) {\n this.builder.header(name, value);\n return this;\n }\n\n /**\n * Returns a clone with a header applied only to the resulting client.\n */\n header(\n name: string,\n value:\n | string\n | number\n | boolean\n | null\n | (string | number | boolean)[]\n | (() => HeaderPrimitive | Promise<HeaderPrimitive>)\n ) {\n return this.derive(({ builder }) => {\n builder.header(name, value);\n });\n }\n\n /**\n * Registers multiple shared headers for every downstream request.\n */\n sharedHeaders(dict: Record<string, HeaderPrimitive | HeaderPrimitive[]>) {\n this.builder.headers(dict);\n return this;\n }\n\n /**\n * Returns a derived client with additional headers.\n */\n headers(dict: Record<string, HeaderPrimitive | HeaderPrimitive[]>) {\n return this.derive(({ builder }) => {\n builder.headers(dict);\n });\n }\n\n /**\n * Registers a request hook that runs before every execution on this instance.\n */\n sharedOnSend(description: string, hook: RequestHook) {\n this.meta.onBeforeSend(description, hook);\n return this;\n }\n\n /**\n * Returns a clone with a request hook used only for that clone.\n */\n onSend(description: string, hook: RequestHook) {\n return this.derive(({ meta }) => {\n meta.onBeforeSend(description, hook);\n });\n }\n\n /**\n * Registers a response hook executed after every transport response.\n */\n sharedOnReceive(description: string, hook: ResponseHook<unknown>) {\n this.meta.onReceiveResponse(description, hook);\n return this;\n }\n\n /**\n * Returns a derived client with a response hook limited to that client.\n */\n onReceive(description: string, hook: ResponseHook<unknown>) {\n return this.derive(({ meta }) => {\n meta.onReceiveResponse(description, hook);\n });\n }\n\n /**\n * Configures whether server errors (>=500) throw by default for every request.\n */\n sharedThrowOnServerError(value: boolean) {\n this.meta.throwOnServerError(value);\n return this;\n }\n\n /**\n * Returns a derived client with custom server error behaviour.\n */\n throwOnServerError(value: boolean) {\n return this.derive(({ meta }) => {\n meta.throwOnServerError(value);\n });\n }\n\n /**\n * Executes a GET request using the current configuration.\n */\n get<TResponse>(options?: HTTPAdditionalOptions<unknown>) {\n return this.execute<TResponse>(\"GET\", options);\n }\n\n /**\n * Executes a POST request using the current configuration.\n */\n post<TResponse>(options?: HTTPAdditionalOptions<unknown>) {\n return this.execute<TResponse>(\"POST\", options);\n }\n\n /**\n * Executes a PUT request using the current configuration.\n */\n put<TResponse>(options?: HTTPAdditionalOptions<unknown>) {\n return this.execute<TResponse>(\"PUT\", options);\n }\n\n /**\n * Executes a PATCH request using the current configuration.\n */\n patch<TResponse>(options?: HTTPAdditionalOptions<unknown>) {\n return this.execute<TResponse>(\"PATCH\", options);\n }\n\n /**\n * Executes a DELETE request using the current configuration.\n */\n delete<TResponse>(options?: HTTPAdditionalOptions<unknown>) {\n return this.execute<TResponse>(\"DELETE\", options);\n }\n\n /**\n * Executes a HEAD request using the current configuration.\n */\n head<TResponse>(options?: HTTPAdditionalOptions<unknown>) {\n return this.execute<TResponse>(\"HEAD\", options);\n }\n\n /**\n * Executes an OPTIONS request using the current configuration.\n */\n options<TResponse>(options?: HTTPAdditionalOptions<unknown>) {\n return this.execute<TResponse>(\"OPTIONS\", options);\n }\n\n /**\n * Executes a TRACE request using the current configuration.\n */\n trace<TResponse>(options?: HTTPAdditionalOptions<unknown>) {\n return this.execute<TResponse>(\"TRACE\", options);\n }\n\n /**\n * Executes a CONNECT request using the current configuration.\n */\n connect<TResponse>(options?: HTTPAdditionalOptions<unknown>) {\n return this.execute<TResponse>(\"CONNECT\", options);\n }\n\n private async execute<TResponse>(\n method: HTTPMethod,\n options?: HTTPAdditionalOptions<unknown>\n ) {\n const baseBuilder = this.builder.clone().method(method);\n const meta = this.meta.derive().build();\n const baseOptions = mergeOptions(meta.options, options);\n if (meta.streamResponse) {\n (baseOptions as Record<string, unknown>).streamResponse = true;\n }\n const retryPolicy = meta.retry;\n const maxRetries = retryPolicy?.attempts ?? 0;\n\n for (let retriesUsed = 0; ; ) {\n const attemptBuilder = baseBuilder.clone();\n await attemptBuilder.resolveDynamicHeaders();\n const request = attemptBuilder.build();\n request.method = method;\n\n const attemptOptions = {\n ...baseOptions,\n } as HTTPAdditionalOptions<unknown> & { signal?: AbortSignal };\n\n let timeoutController: AbortController | undefined;\n let timeoutHandle: ReturnType<typeof setTimeout> | undefined;\n let combinedSignal: CombinedAbortSignal | undefined;\n\n if (typeof meta.timeoutMs === \"number\" && meta.timeoutMs > 0) {\n const setup = createTimeoutController(meta.timeoutMs);\n timeoutController = setup.controller;\n timeoutHandle = setup.timer;\n }\n\n const existingSignal = attemptOptions.signal;\n const signals: AbortSignal[] = [];\n if (existingSignal) {\n signals.push(existingSignal);\n }\n if (timeoutController) {\n signals.push(timeoutController.signal);\n }\n\n if (signals.length === 1) {\n const singleSignal = signals[0];\n if (singleSignal) {\n attemptOptions.signal = singleSignal;\n } else if (\"signal\" in attemptOptions) {\n delete attemptOptions.signal;\n }\n } else if (signals.length > 1) {\n combinedSignal = combineAbortSignals(signals);\n attemptOptions.signal = combinedSignal.signal;\n } else if (\"signal\" in attemptOptions) {\n delete attemptOptions.signal;\n }\n\n const activeSignal = attemptOptions.signal;\n if (activeSignal?.aborted) {\n const reason = (activeSignal.reason as unknown) ?? createAbortError();\n throw new HTTPTransportError(request, reason);\n }\n\n const requestContext: HTTPRequestContext = {\n request,\n options: attemptOptions,\n };\n\n let response: HTTPResponse<unknown> | undefined;\n\n try {\n await this.runRequestPlugins(requestContext);\n await this.runOnSendHooks(meta, request);\n const raw = await this.transport\n .send(request, attemptOptions)\n .catch((cause) => {\n throw new HTTPTransportError(request, cause);\n });\n\n response = this.buildResponse(raw, request);\n const isStreaming = meta.streamResponse;\n if (!isStreaming) {\n response.data = transformResponse(meta.allowPlainText, response.data);\n }\n\n if (meta.throwOnServerError && response.status >= 500) {\n throw new HTTPServerError(request, response);\n }\n\n await this.runOnReceiveHooks(meta, response);\n\n let validated: HTTPResponse<TResponse>;\n if (meta.streamResponse) {\n validated = response as HTTPResponse<TResponse>;\n } else {\n try {\n validated = this.validateResponse<TResponse>(response, meta);\n } catch (cause) {\n throw new HTTPSchemaValidationError(request, response, cause);\n }\n }\n\n await this.runResponsePlugins({\n request,\n response: validated,\n options: attemptOptions,\n });\n\n return validated;\n } catch (thrown) {\n const normalized = thrown instanceof HTTPError ? thrown : (thrown as unknown);\n const retryAttempt = retriesUsed + 1;\n const policy = retryPolicy;\n const canRetry =\n policy !== undefined &&\n retryAttempt <= maxRetries &&\n (await this.shouldRetryRequest(\n normalized,\n policy,\n retryAttempt,\n request\n ));\n\n if (!canRetry) {\n await this.runErrorPlugins({\n request,\n options: attemptOptions,\n error: normalized,\n });\n throw normalized;\n }\n\n retriesUsed += 1;\n await this.delayRetry(retryAttempt, policy);\n } finally {\n if (timeoutHandle !== undefined) {\n clearTimeout(timeoutHandle);\n }\n combinedSignal?.dispose();\n }\n }\n }\n\n private async runRequestPlugins(context: HTTPRequestContext) {\n for (const plugin of this.plugins()) {\n if (plugin.onRequest) {\n await plugin.onRequest(context);\n }\n }\n }\n\n private async runResponsePlugins(context: HTTPResponseContext) {\n for (const plugin of this.plugins()) {\n if (plugin.onResponse) {\n await plugin.onResponse(context);\n }\n }\n }\n\n private async runErrorPlugins(context: HTTPErrorContext) {\n for (const plugin of this.plugins()) {\n if (plugin.onError) {\n await plugin.onError(context);\n }\n }\n }\n\n private async runOnSendHooks(\n meta: MetaConfig,\n request: HTTPRequest<unknown>\n ) {\n for (const [description, hook] of meta.onSend) {\n try {\n await hook(request);\n } catch (error) {\n throw new AutomationError(\n `An error occurred in onSend hook \"${description}\"`,\n { cause: error as Error }\n );\n }\n }\n }\n\n private async runOnReceiveHooks(\n meta: MetaConfig,\n response: HTTPResponse<unknown>\n ) {\n for (const [description, hook] of meta.onReceive) {\n try {\n await hook(response);\n } catch (error) {\n throw new AutomationError(\n `An error occurred in onReceive hook \"${description}\"`,\n { cause: error as Error }\n );\n }\n }\n }\n\n private validateResponse<T>(response: HTTPResponse<unknown>, meta: MetaConfig) {\n const validated = meta.schemas.validate(\n response.status as StatusCode,\n response.data,\n meta.requireSchema\n ) as T;\n response.data = validated;\n return response as HTTPResponse<T>;\n }\n\n private buildResponse<T>(\n raw: {\n status: StatusCode;\n statusText: string;\n headers: Record<string, string | string[]>;\n data: T;\n },\n request: HTTPRequest<unknown>\n ) {\n return HTTPResponseBuilder.create()\n .status(raw.status)\n .statusText(raw.statusText)\n .headers(normalizeHeaders(raw.headers))\n .data(raw.data)\n .request(request)\n .build();\n }\n\n private plugins() {\n return [...this.sharedPlugins, ...this.scopedPlugins];\n }\n\n private async shouldRetryRequest(\n error: unknown,\n policy: HTTPRetryOptions,\n attempt: number,\n request: HTTPRequest<unknown>\n ) {\n if (attempt > policy.attempts) {\n return false;\n }\n\n const response = error instanceof HTTPError ? error.response : undefined;\n\n if (policy.retryOn) {\n const retryContext = response\n ? { error, attempt, request, response }\n : { error, attempt, request };\n return await policy.retryOn(retryContext);\n }\n\n if (error instanceof HTTPTransportError) {\n return true;\n }\n\n if (response && response.status >= 500) {\n return true;\n }\n\n return false;\n }\n\n private async delayRetry(attempt: number, policy: HTTPRetryOptions) {\n const { delay } = policy;\n\n let duration: number | undefined;\n if (typeof delay === \"function\") {\n duration = await delay(attempt);\n } else if (typeof delay === \"number\") {\n duration = delay * attempt;\n } else {\n duration = attempt * 100;\n }\n\n if (!duration || duration <= 0) {\n return;\n }\n\n await new Promise((resolve) => setTimeout(resolve, duration));\n }\n\n private derive(\n mutate?: (state: {\n builder: HTTPRequestBuilder<HTTPRequest<unknown>>;\n meta: MetaConfigBuilder;\n plugins: HTTPPlugin[];\n }) => void,\n overrides?: { transport?: HTTPTransport }\n ) {\n const builder = this.builder.clone();\n const meta = this.meta.derive();\n const plugins = [...this.scopedPlugins];\n\n if (mutate) {\n mutate({ builder, meta, plugins });\n }\n\n return new HTTP(\n overrides?.transport ?? this.transport,\n builder,\n meta,\n this.sharedPlugins,\n plugins\n );\n }\n}\n\nfunction mergeOptions(\n base: HTTPAdditionalOptions<unknown>,\n overrides?: HTTPAdditionalOptions<unknown>\n) {\n if (!overrides) {\n return { ...base } as HTTPAdditionalOptions<unknown>;\n }\n\n const merged = { ...base } as Record<string, unknown>;\n for (const [key, value] of Object.entries(overrides)) {\n if (value === undefined) {\n delete merged[key];\n } else {\n merged[key] = value;\n }\n }\n return merged as HTTPAdditionalOptions<unknown>;\n}\n\nfunction normalizeHeaders(headers: Record<string, string | string[]>) {\n const next: Record<string, string> = {};\n for (const [key, value] of Object.entries(headers)) {\n next[key] = Array.isArray(value) ? value.join(\",\") : String(value);\n }\n return next;\n}\n\nfunction toParamValue(value: unknown, rest: unknown[]): ParamValue {\n if (rest.length > 0) {\n return [value, ...rest] as ParamValue;\n }\n return value as ParamValue;\n}\n\ninterface CombinedAbortSignal {\n signal: AbortSignal;\n dispose: () => void;\n}\n\ninterface TimeoutSetup {\n controller: AbortController;\n timer: ReturnType<typeof setTimeout>;\n}\n\nfunction createTimeoutController(timeoutMs: number): TimeoutSetup {\n const controller = new AbortController();\n const timer = setTimeout(() => {\n controller.abort(createAbortError(`Request timed out after ${timeoutMs} ms`));\n }, timeoutMs);\n maybeUnrefTimer(timer);\n return { controller, timer };\n}\n\nfunction combineAbortSignals(signals: AbortSignal[]): CombinedAbortSignal {\n const controller = new AbortController();\n\n const aborted = signals.find((signal) => signal.aborted);\n if (aborted) {\n controller.abort((aborted.reason as unknown) ?? createAbortError());\n return { signal: controller.signal, dispose: () => undefined };\n }\n\n const listeners: Array<{ signal: AbortSignal; listener: () => void }> = [];\n\n for (const signal of signals) {\n const listener = () => {\n controller.abort((signal.reason as unknown) ?? createAbortError());\n };\n signal.addEventListener(\"abort\", listener, { once: true });\n listeners.push({ signal, listener });\n }\n\n const dispose = () => {\n for (const { signal, listener } of listeners) {\n signal.removeEventListener(\"abort\", listener);\n }\n };\n\n controller.signal.addEventListener(\"abort\", dispose, { once: true });\n\n return { signal: controller.signal, dispose };\n}\n\nfunction maybeUnrefTimer(timer: ReturnType<typeof setTimeout>) {\n if (typeof timer === \"object\" && timer !== null) {\n const maybeTimer = timer as { unref?: () => void };\n if (typeof maybeTimer.unref === \"function\") {\n maybeTimer.unref();\n }\n }\n}\n\nfunction createAbortError(message = \"The operation was aborted.\") {\n const error = new Error(message);\n error.name = \"AbortError\";\n return error;\n}\n","import type { HTTPRequest } from \"./http-request\";\nimport type { HTTPTransport } from \"./transport\";\nimport type { HTTPAdditionalOptions, StatusCode } from \"./types\";\n\nexport interface FetchRequestOptions extends Record<string, unknown> {\n headers?: Record<string, string | number | boolean | null | undefined>;\n body?: unknown;\n method?: string;\n signal?: AbortSignal;\n streamResponse?: boolean;\n}\n\nexport interface FetchResponseLike {\n status: number;\n statusText: string;\n headers: HeadersLike;\n text(): Promise<string>;\n body?: unknown;\n}\n\nexport interface HeadersLike {\n forEach(callback: (value: string, key: string) => void): void;\n}\n\nexport type FetchLike = (\n input: string,\n init?: FetchRequestOptions\n) => Promise<FetchResponseLike>;\n\nexport function createFetchTransport(\n fetchImpl: FetchLike = globalThis.fetch as FetchLike\n): HTTPTransport<FetchRequestOptions> {\n if (!fetchImpl) {\n throw new Error(\n \"No fetch implementation available. Provide one via createFetchTransport(fetchImpl).\"\n );\n }\n\n return {\n async send<TRequest, TResponse>(\n request: HTTPRequest<TRequest>,\n options: HTTPAdditionalOptions<FetchRequestOptions> = {}\n ) {\n const {\n headers: optionHeaders,\n body: optionBody,\n signal: optionSignal,\n streamResponse,\n ...restOptions\n } = options;\n const headers = mergeHeaders(request.headers, optionHeaders);\n\n const body = optionBody ?? createBody(request, headers);\n\n const url = request.fullUrl ?? \"\";\n const fetchOptions: FetchRequestOptions = {\n ...restOptions,\n method: request.method ?? \"GET\",\n headers,\n body,\n };\n\n if (optionSignal !== undefined) {\n fetchOptions.signal = optionSignal;\n }\n\n const response = await fetchImpl(url, fetchOptions);\n\n const data = streamResponse ? response.body ?? null : await readBody(response);\n return {\n status: response.status as StatusCode,\n statusText: response.statusText,\n headers: headersToRecord(response.headers),\n data: data as TResponse,\n };\n },\n } satisfies HTTPTransport<FetchRequestOptions>;\n}\n\nfunction mergeHeaders(\n base: Record<string, string>,\n additional?: Record<string, string | number | boolean | null | undefined>\n) {\n const next: Record<string, string> = { ...base };\n if (!additional) {\n return next;\n }\n for (const [key, value] of Object.entries(additional)) {\n if (value === undefined || value === null) {\n delete next[key];\n } else {\n next[key] = String(value);\n }\n }\n return next;\n}\n\nfunction createBody(request: HTTPRequest<unknown>, headers: Record<string, string>) {\n const { data } = request;\n if (data === undefined || data === null) {\n return undefined;\n }\n\n if (isBodyInit(data)) {\n return data;\n }\n\n if (typeof data === \"string\") {\n return data;\n }\n\n if (typeof data === \"object\") {\n if (!hasHeader(headers, \"content-type\")) {\n headers[\"content-type\"] = \"application/json\";\n }\n return JSON.stringify(data);\n }\n\n return String(data);\n}\n\nasync function readBody(response: FetchResponseLike) {\n if (response.status === 204 || response.status === 205) {\n return null;\n }\n const text = await response.text();\n return text.length === 0 ? null : text;\n}\n\nfunction headersToRecord(headers: HeadersLike) {\n const record: Record<string, string | string[]> = {};\n headers.forEach((value, key) => {\n record[key] = value;\n });\n return record;\n}\n\nfunction hasHeader(headers: Record<string, string>, name: string) {\n const lower = name.toLowerCase();\n return Object.keys(headers).some((key) => key.toLowerCase() === lower);\n}\n\nfunction isBodyInit(value: unknown): value is string | ArrayBuffer | ArrayBufferView {\n if (typeof value === \"string\") {\n return true;\n }\n if (typeof ArrayBuffer !== \"undefined\" && value instanceof ArrayBuffer) {\n return true;\n }\n if (typeof ArrayBuffer !== \"undefined\" && ArrayBuffer.isView(value)) {\n return true;\n }\n return false;\n}\n","import type {\n HTTPMethod,\n QueryParamSerializationOptions,\n QueryParamValue,\n QueryParamPrimitive,\n} from \"./types\";\n\nexport type HeaderPrimitive = string | number | boolean | null | undefined;\nexport type HeaderFactory =\n | (() => HeaderPrimitive | Promise<HeaderPrimitive>)\n | undefined;\nexport type ParamPrimitive = QueryParamPrimitive;\nexport type ParamDictionary = Record<string, ParamValue>;\nexport type ParamValue = QueryParamValue | undefined;\n\nexport interface RequestConfigBasic<T = unknown> {\n headers?: Record<string, string>;\n params?: Record<string, ParamValue>;\n baseUrl?: string;\n route?: string[];\n method?: HTTPMethod;\n data?: T;\n queryOptions?: QueryParamSerializationOptions;\n}\n\n/**\n * Represents the request payload sent via {@link HTTP} including URL, headers and metadata.\n */\nexport class HTTPRequest<T = unknown> {\n /**\n * Normalised header collection that will be sent with the request.\n */\n headers: Record<string, string> = {};\n params: Record<string, ParamValue> = {};\n baseUrl: string | undefined;\n route: string[] = [];\n method: HTTPMethod | undefined;\n data: T | undefined;\n queryOptions: QueryParamSerializationOptions = {};\n\n constructor(config?: RequestConfigBasic<T>) {\n if (config) {\n Object.assign(this, config);\n if (config.queryOptions) {\n this.queryOptions = { ...config.queryOptions };\n }\n }\n }\n\n /**\n * Full request URL derived from {@link baseUrl}, {@link route} and {@link params}.\n */\n get fullUrl() {\n return buildFullUrl(\n this.baseUrl,\n this.route,\n this.params,\n this.queryOptions\n );\n }\n\n /**\n * Creates a deep copy of an existing request instance.\n */\n static derive<T>(original: HTTPRequest<T>) {\n const request = new HTTPRequest<T>();\n request.headers = { ...original.headers };\n request.params = cloneParams(original.params);\n request.baseUrl = original.baseUrl;\n request.route = [...original.route];\n request.method = original.method;\n request.data = original.data;\n request.queryOptions = { ...original.queryOptions };\n return request;\n }\n}\n\n/**\n * Fluent utility used to construct {@link HTTPRequest} instances while keeping internal state safe.\n */\nexport class HTTPRequestBuilder<T extends HTTPRequest<unknown>> {\n private requestInstance: T;\n private dynamicHeaders = new Map<string, HeaderFactory>();\n private queryOptions: QueryParamSerializationOptions;\n\n constructor(request: T | (() => T) = () => new HTTPRequest() as T) {\n this.requestInstance =\n typeof request === \"function\" ? request() : request;\n this.queryOptions = { ...this.requestInstance.queryOptions };\n }\n\n /**\n * Initializes a new builder for the default {@link HTTPRequest} type.\n */\n static create<T extends HTTPRequest<unknown>>() {\n return new HTTPRequestBuilder<T>();\n }\n\n /**\n * Exposes the underlying request without defensive cloning.\n */\n get request() {\n return this.requestInstance;\n }\n\n /**\n * Resolves asynchronous header factories into concrete header values on demand.\n */\n async resolveDynamicHeaders(\n request: HTTPRequest = this.requestInstance as HTTPRequest\n ) {\n for (const [name, factory] of this.dynamicHeaders) {\n if (!factory) {\n continue;\n }\n try {\n const result = await factory();\n if (result === undefined || result === null) {\n delete request.headers[name];\n continue;\n }\n request.headers[name] = String(result);\n } catch (error) {\n const cause = error as Error;\n throw new Error(\n `Failed to resolve dynamic header \"${name}\": ${cause.message}`\n );\n }\n }\n return this;\n }\n\n /**\n * Sets the root URL (protocol, host and optional base path).\n */\n url(url: string) {\n this.requestInstance.baseUrl = url;\n return this;\n }\n\n /**\n * Appends one or more path segments to the current request route.\n */\n route(...segments: (string | number | boolean)[]) {\n const mapped = segments\n .map((segment) => String(segment))\n .filter((segment) => segment.length > 0);\n this.requestInstance.route.push(...mapped);\n return this;\n }\n\n /**\n * Adds or removes a query parameter value.\n */\n param(name: string, value: ParamValue) {\n if (value === undefined) {\n delete this.requestInstance.params[name];\n return this;\n }\n\n if (Array.isArray(value)) {\n const list = value.filter(\n (item): item is QueryParamValue => item !== undefined && item !== null\n );\n const existing = this.requestInstance.params[name];\n if (Array.isArray(existing)) {\n this.requestInstance.params[name] = [\n ...existing,\n ...list,\n ];\n } else {\n this.requestInstance.params[name] = list;\n }\n return this;\n }\n\n if (value && typeof value === \"object\") {\n const dictEntries = Object.entries(\n value as Record<string, QueryParamValue>\n ).reduce<Record<string, QueryParamValue>>((acc, [key, paramValue]) => {\n if (paramValue !== undefined) {\n acc[key] = paramValue;\n }\n return acc;\n }, {});\n const existing = this.requestInstance.params[name];\n if (isPlainObject(existing)) {\n this.requestInstance.params[name] = {\n ...(existing as Record<string, QueryParamValue>),\n ...dictEntries,\n } as QueryParamValue;\n } else {\n this.requestInstance.params[name] = dictEntries;\n }\n return this;\n }\n\n this.requestInstance.params[name] = value;\n return this;\n }\n\n /**\n * Merges a dictionary of query parameters into the request.\n */\n params(dict: Record<string, unknown>) {\n for (const [key, value] of Object.entries(dict)) {\n this.param(key, value as ParamValue);\n }\n return this;\n }\n\n queryFormat(options: QueryParamSerializationOptions) {\n if (options.arrayFormat !== undefined) {\n this.queryOptions.arrayFormat = options.arrayFormat;\n }\n if (options.objectFormat !== undefined) {\n this.queryOptions.objectFormat = options.objectFormat;\n }\n if (Object.prototype.hasOwnProperty.call(options, \"serializer\")) {\n const serializer = options.serializer ?? undefined;\n if (serializer) {\n this.queryOptions.serializer = serializer;\n } else {\n delete this.queryOptions.serializer;\n }\n }\n this.requestInstance.queryOptions = { ...this.queryOptions };\n return this;\n }\n\n /**\n * Sets the request body payload. Passing `undefined` removes the body.\n */\n data<K>(data: K | undefined) {\n if (data === undefined) {\n delete this.requestInstance.data;\n return this;\n }\n this.requestInstance.data = data;\n return this;\n }\n\n /**\n * Sets a single header using direct values or a lazy factory.\n */\n header(\n name: string,\n value:\n | HeaderPrimitive\n | HeaderPrimitive[]\n | (() => HeaderPrimitive | Promise<HeaderPrimitive>)\n ) {\n if (typeof value === \"function\") {\n this.dynamicHeaders.set(name, value);\n delete this.requestInstance.headers[name];\n return this;\n }\n\n this.dynamicHeaders.delete(name);\n\n if (value === undefined || value === null) {\n delete this.requestInstance.headers[name];\n return this;\n }\n\n if (Array.isArray(value)) {\n const filtered = value.filter(\n (item) => item !== undefined && item !== null\n );\n this.requestInstance.headers[name] = filtered.map(String).join(\",\");\n return this;\n }\n\n this.requestInstance.headers[name] = String(value);\n return this;\n }\n\n /**\n * Replaces or merges multiple headers in one call.\n */\n headers(dict: Record<string, HeaderPrimitive | HeaderPrimitive[]>) {\n for (const [key, value] of Object.entries(dict)) {\n this.header(key, value as HeaderPrimitive | HeaderPrimitive[]);\n }\n return this;\n }\n\n /**\n * Stores the HTTP verb ensuring consistent casing.\n */\n method(method: HTTPMethod) {\n this.requestInstance.method = method.toUpperCase() as HTTPMethod;\n return this;\n }\n\n /**\n * Returns a copy-on-write builder pointing at the same request state.\n */\n derive() {\n return this.clone();\n }\n\n /**\n * Produces a deep copy of the builder and the underlying request.\n */\n clone() {\n const request = HTTPRequest.derive(this.requestInstance) as T;\n const builder = new HTTPRequestBuilder<T>(request);\n builder.dynamicHeaders = new Map(this.dynamicHeaders);\n builder.queryOptions = { ...this.queryOptions };\n builder.requestInstance.queryOptions = { ...this.queryOptions };\n return builder;\n }\n\n /**\n * Returns the current request without resolving header factories.\n */\n build() {\n this.requestInstance.queryOptions = { ...this.queryOptions };\n return this.requestInstance as HTTPRequest<T>;\n }\n\n /**\n * Resolves lazy headers before returning the request.\n */\n async buildAsync() {\n await this.resolveDynamicHeaders();\n this.requestInstance.queryOptions = { ...this.queryOptions };\n return this.requestInstance as HTTPRequest<T>;\n }\n}\n\nfunction cloneParams(\n params: Record<string, ParamValue>\n) {\n return Object.entries(params).reduce<\n Record<string, ParamValue>\n >((acc, [key, value]) => {\n if (Array.isArray(value)) {\n acc[key] = [...value] as ParamValue;\n return acc;\n }\n if (isPlainObject(value)) {\n acc[key] = { ...(value as Record<string, ParamValue>) };\n return acc;\n }\n acc[key] = value;\n return acc;\n }, {});\n}\n\nfunction buildFullUrl(\n baseUrl: string | undefined,\n route: string[],\n params: Record<string, ParamValue>,\n options?: QueryParamSerializationOptions\n) {\n const pathSegments = route\n .map((segment) => String(segment))\n .filter((segment) => segment.length > 0)\n .map((segment) => segment.replace(/^\\/+|\\/+$/g, \"\"));\n\n const query = buildQueryString(params, options);\n\n if (baseUrl && /^https?:\\/\\//i.test(baseUrl)) {\n const url = new URL(baseUrl);\n if (pathSegments.length > 0) {\n const basePath = url.pathname.replace(/^\\/+|\\/+$/g, \"\");\n const combined = [basePath, ...pathSegments].filter(Boolean).join(\"/\");\n url.pathname = `/${combined}`;\n }\n url.search = query ? `?${query}` : \"\";\n return url.toString();\n }\n\n const trimmedBase = (baseUrl ?? \"\").replace(/\\/+$/g, \"\");\n const joinedPath = pathSegments.join(\"/\");\n const path = [trimmedBase, joinedPath]\n .filter((segment) => segment && segment.length > 0)\n .join(trimmedBase && joinedPath ? \"/\" : \"\");\n\n if (!path && !query) {\n return \"\";\n }\n\n if (!path) {\n return query ? `?${query}` : \"\";\n }\n\n return query ? `${path}?${query}` : path;\n}\n\nfunction buildQueryString(\n params: Record<string, ParamValue>,\n options?: QueryParamSerializationOptions\n) {\n if (!params || Object.keys(params).length === 0) {\n return \"\";\n }\n\n const serializer = options?.serializer ?? undefined;\n if (serializer) {\n return serializer(params);\n }\n\n const arrayFormat = options?.arrayFormat ?? \"repeat\";\n const objectFormat = options?.objectFormat ?? \"brackets\";\n const search = new URLSearchParams();\n const append = (key: string, value: unknown) => {\n if (value === undefined || value === null) {\n return;\n }\n search.append(key, String(value));\n };\n\n const encode = (key: string, value: ParamValue) => {\n if (value === undefined || value === null) {\n return;\n }\n\n if (Array.isArray(value)) {\n const filtered = value.filter(\n (item) => item !== undefined && item !== null\n ) as ParamValue[];\n if (filtered.length === 0) {\n return;\n }\n switch (arrayFormat) {\n case \"json\": {\n append(key, JSON.stringify(filtered));\n return;\n }\n case \"comma\": {\n const joined = filtered.map((item) => String(item)).join(\",\");\n append(key, joined);\n return;\n }\n case \"indices\": {\n filtered.forEach((item, index) => {\n encode(`${key}[${index}]`, item);\n });\n return;\n }\n case \"brackets\": {\n filtered.forEach((item) => {\n encode(`${key}[]`, item);\n });\n return;\n }\n default: {\n filtered.forEach((item) => {\n encode(key, item);\n });\n return;\n }\n }\n }\n\n if (isPlainObject(value)) {\n if (objectFormat === \"json\") {\n append(key, JSON.stringify(value));\n return;\n }\n for (const [childKey, childValue] of Object.entries(\n value as Record<string, ParamValue>\n )) {\n const nextKey =\n objectFormat === \"dot\"\n ? `${key}.${childKey}`\n : `${key}[${childKey}]`;\n encode(nextKey, childValue);\n }\n return;\n }\n\n append(key, value);\n };\n\n for (const [key, value] of Object.entries(params)) {\n encode(key, value);\n }\n\n return search.toString();\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (value === null || typeof value !== \"object\") {\n return false;\n }\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n","import type { HTTPRequest } from \"./http-request\";\nimport type { StatusCode } from \"./types\";\n\n/**\n * Immutable view of a completed HTTP response produced by {@link HTTP}.\n *\n * Use {@link HTTPResponseBuilder} to clone or modify instances in a safe way.\n */\nexport class HTTPResponse<T = unknown> {\n /**\n * HTTP status code returned by the remote service.\n */\n status!: StatusCode;\n\n /**\n * Human-readable text accompanying {@link status}.\n */\n statusText = \"\";\n\n /**\n * Response payload after all transformations and schema validation.\n */\n data!: T;\n\n /**\n * Normalised response headers keyed by lowercase header names.\n */\n headers: Record<string, string> = {};\n\n /**\n * Original request that produced this response.\n */\n request!: HTTPRequest<unknown>;\n\n /**\n * Creates a shallow clone from an existing response instance.\n */\n static fromRaw<T>(response: HTTPResponse<T>) {\n const next = new HTTPResponse<T>();\n next.status = response.status;\n next.statusText = response.statusText;\n next.data = response.data;\n next.headers = { ...response.headers };\n next.request = response.request;\n return next;\n }\n\n mapData<K>(value: K): HTTPResponse<K>;\n mapData<K>(transform: (response: T) => K): HTTPResponse<K>;\n /**\n * Returns a new response with identical metadata but a transformed payload.\n *\n * @example\n * const productResponse = await http.route(\"products\", 1).get<Product>()\n * const simplified = productResponse.mapData((product) => product.name)\n */\n mapData<K>(transform: K | ((response: T) => K)): HTTPResponse<K> {\n const nextValue =\n typeof transform === \"function\" ? (transform as (input: T) => K)(this.data) : transform;\n return new HTTPResponseBuilder()\n .status(this.status)\n .statusText(this.statusText)\n .headers(this.headers)\n .request(this.request)\n .data(nextValue)\n .build() as HTTPResponse<K>;\n }\n}\n\n/**\n * Fluent builder used by {@link HTTP} to create {@link HTTPResponse} instances.\n */\nexport class HTTPResponseBuilder {\n private response = new HTTPResponse();\n\n /**\n * Creates a new empty builder.\n */\n static create() {\n return new HTTPResponseBuilder();\n }\n\n /**\n * Produces a new builder seeded with the current response state.\n */\n derive() {\n return HTTPResponseBuilder.create()\n .status(this.response.status)\n .statusText(this.response.statusText)\n .headers({ ...this.response.headers })\n .request(this.response.request)\n .data(this.response.data);\n }\n\n /**\n * Sets the response status code.\n */\n status(code: StatusCode) {\n this.response.status = code;\n return this;\n }\n\n /**\n * Sets the textual status message.\n */\n statusText(text: string) {\n this.response.statusText = text;\n return this;\n }\n\n /**\n * Attaches the response payload.\n */\n data<T>(data: T) {\n this.response.data = data;\n return this;\n }\n\n /**\n * Replaces the entire headers collection.\n */\n headers(dict: Record<string, string>) {\n this.response.headers = { ...dict };\n return this;\n }\n\n /**\n * Sets or overrides a single response header.\n */\n header(name: string, value: string) {\n this.response.headers[name] = value;\n return this;\n }\n\n /**\n * References the originating request.\n */\n request(request: HTTPRequest<unknown>) {\n this.response.request = request;\n return this;\n }\n\n /**\n * Builds the immutable {@link HTTPResponse} instance.\n */\n build() {\n return this.response;\n }\n}\n","import type { SchemaParser, StatusCode } from \"./types\";\n\nexport class SchemaMap {\n private map: Map<StatusCode, SchemaParser>;\n\n constructor(map?: Map<StatusCode, SchemaParser> | SchemaMap) {\n if (map instanceof SchemaMap) {\n this.map = new Map(map.map);\n return;\n }\n this.map = map ? new Map(map) : new Map();\n }\n\n derive() {\n return new SchemaMap(this.map);\n }\n\n registerStatus(parser: SchemaParser, ...codes: StatusCode[]) {\n codes.forEach((code) => {\n this.map.set(code, parser);\n });\n }\n\n registerRange(parser: SchemaParser, from: StatusCode, to: StatusCode) {\n for (let code = from; code <= to; code++) {\n this.map.set(code as StatusCode, parser);\n }\n }\n\n validate(status: StatusCode, data: unknown, requireSchema: boolean) {\n const parser = this.getParser(status, requireSchema);\n if (!parser) {\n return data;\n }\n if (typeof parser === \"function\") {\n return parser(data);\n }\n if (\"parse\" in parser) {\n return parser.parse(data);\n }\n if (\"validate\" in parser) {\n return parser.validate(data);\n }\n return data;\n }\n\n getParser(status: StatusCode, requireSchema: boolean) {\n const parser = this.map.get(status);\n if (!parser && requireSchema) {\n throw new Error(\n `No schema parser registered for status code ${status} while requireSchema is true.`\n );\n }\n return parser ?? null;\n }\n\n toObject() {\n return Object.fromEntries(this.map) as Record<StatusCode, SchemaParser>;\n }\n}\n","import { SchemaMap } from \"./schema.map\";\nimport type {\n HTTPAdditionalOptions,\n HTTPRetryOptions,\n RequestHook,\n ResponseHook,\n SchemaParser,\n StatusCode,\n} from \"./types\";\n\nexport interface SchemaConfig {\n schemas: SchemaMap;\n requireSchema: boolean;\n allowPlainText: boolean;\n}\n\nexport interface HTTPHooks {\n onSend: [string, RequestHook][];\n onReceive: [string, ResponseHook<unknown>][];\n}\n\nexport class MetaConfig implements SchemaConfig, HTTPHooks {\n schemas: SchemaMap = new SchemaMap();\n requireSchema = false;\n allowPlainText = false;\n onSend: [string, RequestHook][] = [];\n onReceive: [string, ResponseHook<unknown>][] = [];\n throwOnServerError = false;\n options: HTTPAdditionalOptions<unknown> = {};\n retry?: HTTPRetryOptions;\n streamResponse = false;\n timeoutMs: number | undefined = undefined;\n\n constructor(init?: Partial<MetaConfig>) {\n Object.assign(this, init);\n }\n}\n\nexport class MetaConfigBuilder {\n private schemaMapValue = new SchemaMap();\n private requireSchemaValue = false;\n private allowPlainTextValue = false;\n private onBeforeSendHooks: [string, RequestHook][] = [];\n private onAfterReceiveHooks: [string, ResponseHook<unknown>][] = [];\n private throwOnServerErrorValue = false;\n private optionsValue: HTTPAdditionalOptions<unknown> = {};\n private retryOptionsValue: HTTPRetryOptions | undefined;\n private streamResponseValue = false;\n private timeoutMsValue: number | undefined;\n\n merge(builder: MetaConfigBuilder) {\n this.schemaMapValue = builder.schemaMapValue.derive();\n this.requireSchemaValue = builder.requireSchemaValue;\n this.allowPlainTextValue = builder.allowPlainTextValue;\n this.onBeforeSendHooks = [...builder.onBeforeSendHooks];\n this.onAfterReceiveHooks = [...builder.onAfterReceiveHooks];\n this.throwOnServerErrorValue = builder.throwOnServerErrorValue;\n this.optionsValue = { ...builder.optionsValue };\n this.retryOptionsValue = builder.retryOptionsValue\n ? { ...builder.retryOptionsValue }\n : undefined;\n this.streamResponseValue = builder.streamResponseValue;\n this.timeoutMsValue = builder.timeoutMsValue;\n return this;\n }\n\n schemaMap(map: SchemaMap) {\n this.schemaMapValue = map;\n return this;\n }\n\n schema(parser: SchemaParser, ...codes: StatusCode[]): MetaConfigBuilder;\n schema(\n parser: SchemaParser,\n ...ranges: { from: StatusCode; to: StatusCode }[]\n ): MetaConfigBuilder;\n schema(\n parser: SchemaParser,\n ...args: (StatusCode | { from: StatusCode; to: StatusCode })[]\n ): MetaConfigBuilder {\n args.forEach((arg) => {\n if (typeof arg === \"number\") {\n this.schemaMapValue.registerStatus(parser, arg);\n return;\n }\n if (Array.isArray(arg)) {\n this.schemaMapValue.registerStatus(parser, ...arg);\n return;\n }\n this.schemaMapValue.registerRange(parser, arg.from, arg.to);\n });\n return this;\n }\n\n requireSchema(value: boolean) {\n this.requireSchemaValue = value;\n return this;\n }\n\n allowPlainText(value: boolean) {\n this.allowPlainTextValue = value;\n return this;\n }\n\n onBeforeSend(description: string, hook: RequestHook) {\n this.onBeforeSendHooks.push([description, hook]);\n return this;\n }\n\n onReceiveResponse(description: string, hook: ResponseHook<unknown>) {\n this.onAfterReceiveHooks.push([description, hook]);\n return this;\n }\n\n throwOnServerError(value: boolean) {\n this.throwOnServerErrorValue = value;\n return this;\n }\n\n options(options: HTTPAdditionalOptions<unknown>) {\n this.optionsValue = mergeOptions(this.optionsValue, options);\n return this;\n }\n\n retry(options: HTTPRetryOptions | null) {\n this.retryOptionsValue = options ? { ...options } : undefined;\n return this;\n }\n\n streamResponse(value: boolean) {\n this.streamResponseValue = value;\n return this;\n }\n\n timeout(duration: number | null | undefined) {\n if (typeof duration === \"number\" && duration > 0) {\n this.timeoutMsValue = duration;\n } else {\n this.timeoutMsValue = undefined;\n }\n return this;\n }\n\n build() {\n const retry = this.retryOptionsValue\n ? { ...this.retryOptionsValue }\n : undefined;\n\n return new MetaConfig({\n schemas: this.schemaMapValue.derive(),\n requireSchema: this.requireSchemaValue,\n allowPlainText: this.allowPlainTextValue,\n onSend: [...this.onBeforeSendHooks],\n onReceive: [...this.onAfterReceiveHooks],\n options: { ...this.optionsValue },\n throwOnServerError: this.throwOnServerErrorValue,\n ...(retry ? { retry } : {}),\n streamResponse: this.streamResponseValue,\n timeoutMs: this.timeoutMsValue,\n });\n }\n\n derive() {\n return new MetaConfigBuilder()\n .schemaMap(this.schemaMapValue.derive())\n .requireSchema(this.requireSchemaValue)\n .allowPlainText(this.allowPlainTextValue)\n .throwOnServerError(this.throwOnServerErrorValue)\n .options(this.optionsValue)\n .retry(this.retryOptionsValue ?? null)\n .streamResponse(this.streamResponseValue)\n .timeout(this.timeoutMsValue)\n .setOnBeforeSend(this.onBeforeSendHooks)\n .setOnAfterReceive(this.onAfterReceiveHooks);\n }\n\n private setOnBeforeSend(hooks: [string, RequestHook][]) {\n this.onBeforeSendHooks = [...hooks];\n return this;\n }\n\n private setOnAfterReceive(hooks: [string, ResponseHook<unknown>][]) {\n this.onAfterReceiveHooks = [...hooks];\n return this;\n }\n}\n\nfunction mergeOptions(\n target: HTTPAdditionalOptions<unknown>,\n updates: HTTPAdditionalOptions<unknown>\n) {\n const next = { ...target } as Record<string, unknown>;\n for (const [key, value] of Object.entries(updates)) {\n if (value === undefined) {\n delete next[key];\n } else {\n next[key] = value;\n }\n }\n return next as HTTPAdditionalOptions<unknown>;\n}\n","import { AutomationError } from \"@autometa/errors\";\nimport { highlight } from \"cli-highlight\";\n\nexport function transformResponse(\n allowPlainText: boolean,\n data: unknown\n): unknown {\n if (data === null || data === undefined) {\n return data;\n }\n\n if (typeof data === \"string\") {\n const trimmed = data.trim();\n if (trimmed.length === 0) {\n return undefined;\n }\n if (trimmed.toLowerCase() === \"undefined\") {\n return undefined;\n }\n }\n\n const primitive = normalizePrimitive(data);\n if (primitive !== undefined) {\n return primitive;\n }\n\n if (typeof data === \"object\") {\n return data;\n }\n\n if (allowPlainText) {\n return String(data);\n }\n\n const rendered = typeof data === \"string\" ? data : String(data);\n const message = [\n \"Could not parse response as JSON and plain text responses are disabled.\",\n \"Call 'allowPlainText(true)' or 'sharedAllowPlainText(true)' to permit plain text responses.\",\n \"\",\n highlight(rendered, { language: \"html\" }),\n ].join(\"\\n\");\n throw new AutomationError(message);\n}\n\nfunction normalizePrimitive(data: unknown): unknown {\n if (typeof data === \"string\") {\n const parsed = tryParseJson(data);\n if (parsed !== undefined) {\n return parsed;\n }\n const lowered = data.toLowerCase();\n if (lowered === \"true\" || lowered === \"false\") {\n return lowered === \"true\";\n }\n if (/^(?:\\d+|\\d*\\.\\d+)$/.test(data)) {\n return Number(data);\n }\n return undefined;\n }\n\n if (isArrayBufferLike(data)) {\n const text = bufferToString(data);\n return normalizePrimitive(text) ?? text;\n }\n\n if (typeof data === \"boolean\" || typeof data === \"number\") {\n return data;\n }\n\n return undefined;\n}\n\nfunction tryParseJson(value: string) {\n try {\n return JSON.parse(value);\n } catch {\n return undefined;\n }\n}\n\nfunction isArrayBufferLike(value: unknown): value is ArrayBufferView | ArrayBuffer {\n return (\n (typeof ArrayBuffer !== \"undefined\" && value instanceof ArrayBuffer) ||\n (typeof ArrayBuffer !== \"undefined\" && ArrayBuffer.isView(value))\n );\n}\n\nfunction bufferToString(value: ArrayBuffer | ArrayBufferView) {\n const view: Uint8Array =\n value instanceof ArrayBuffer\n ? new Uint8Array(value)\n : new Uint8Array(value.buffer, value.byteOffset, value.byteLength);\n if (typeof TextDecoder !== \"undefined\") {\n return new TextDecoder().decode(view);\n }\n let output = \"\";\n for (let i = 0; i < view.length; i++) {\n const code = view[i];\n if (code === undefined) {\n continue;\n }\n output += String.fromCharCode(code);\n }\n return output;\n}\n","export function AnySchema<T = unknown>(data: T) {\n return data;\n}\n\nexport function EmptySchema(data: unknown) {\n if (data !== null && data !== undefined && data !== \"null\") {\n throw new Error(`Expected null but received ${describeValue(data)}`);\n }\n return data === \"null\" ? null : data;\n}\n\nexport function NullSchema(data: unknown) {\n if (data !== null && data !== \"null\") {\n throw new Error(`Expected null but received ${describeValue(data)}`);\n }\n return null;\n}\n\nexport function UndefinedSchema(data: unknown) {\n if (data !== undefined) {\n throw new Error(`Expected undefined but received ${describeValue(data)}`);\n }\n return undefined;\n}\n\nexport function BooleanSchema(data: unknown) {\n if (\n typeof data === \"boolean\" ||\n (typeof data === \"string\" && [\"true\", \"false\"].includes(data))\n ) {\n return typeof data === \"boolean\" ? data : data === \"true\";\n }\n throw new Error(`Expected boolean but received ${describeValue(data)}`);\n}\n\nexport function NumberSchema(data: unknown) {\n if (typeof data === \"number\") {\n return data;\n }\n if (typeof data === \"string\" && /^(?:\\d+|\\d*\\.\\d+)$/.test(data)) {\n return Number(data);\n }\n throw new Error(`Expected number but received ${describeValue(data)}`);\n}\n\nexport function StringSchema(data: unknown) {\n if (typeof data === \"string\") {\n return data;\n }\n throw new Error(`Expected string but received ${describeValue(data)}`);\n}\n\nexport function JSONSchema<T = unknown>(data: unknown) {\n if (typeof data === \"object\" && data !== null) {\n return data as T;\n }\n if (typeof data === \"string\") {\n const parsed = tryParseJson<T>(data);\n if (parsed !== undefined) {\n return parsed;\n }\n }\n throw new Error(`Expected JSON but received ${describeValue(data)}`);\n}\n\nfunction describeValue(value: unknown) {\n return `<${typeof value}> ${String(value)}`;\n}\n\nfunction tryParseJson<T>(value: string) {\n try {\n return JSON.parse(value) as T;\n } catch {\n return undefined;\n }\n}\n","import type { HTTPRequest } from \"./http-request\";\nimport type { HTTPResponse } from \"./http-response\";\nimport type { HTTPAdditionalOptions } from \"./types\";\n\nexport interface HTTPRequestContext<TOptions = HTTPAdditionalOptions> {\n request: HTTPRequest<unknown>;\n options: HTTPAdditionalOptions<TOptions>;\n}\n\nexport interface HTTPResponseContext<\n TResponse = unknown,\n TOptions = HTTPAdditionalOptions\n> {\n request: HTTPRequest<unknown>;\n response: HTTPResponse<TResponse>;\n options: HTTPAdditionalOptions<TOptions>;\n}\n\nexport interface HTTPErrorContext<TOptions = HTTPAdditionalOptions> {\n request: HTTPRequest<unknown>;\n options: HTTPAdditionalOptions<TOptions>;\n error: unknown;\n}\n\nexport interface HTTPPlugin {\n name?: string;\n onRequest?(context: HTTPRequestContext): Promise<void> | void;\n onResponse?(context: HTTPResponseContext): Promise<void> | void;\n onError?(context: HTTPErrorContext): Promise<void> | void;\n}\n\nexport type HTTPLogEvent =\n | {\n type: \"request\";\n timestamp: number;\n request: HTTPRequest<unknown>;\n options: HTTPAdditionalOptions<Record<string, unknown>>;\n }\n | {\n type: \"response\";\n timestamp: number;\n request: HTTPRequest<unknown>;\n response: HTTPResponse<unknown>;\n options: HTTPAdditionalOptions<Record<string, unknown>>;\n }\n | {\n type: \"error\";\n timestamp: number;\n request: HTTPRequest<unknown>;\n error: unknown;\n options: HTTPAdditionalOptions<Record<string, unknown>>;\n };\n\nexport type HTTPLogSink = (event: HTTPLogEvent) => void | Promise<void>;\n\nexport function createLoggingPlugin(sink: HTTPLogSink): HTTPPlugin {\n return {\n name: \"http-logging\",\n async onRequest(context) {\n await sink({\n type: \"request\",\n timestamp: Date.now(),\n request: context.request,\n options: context.options,\n });\n },\n async onResponse(context) {\n await sink({\n type: \"response\",\n timestamp: Date.now(),\n request: context.request,\n response: context.response,\n options: context.options,\n });\n },\n async onError(context) {\n await sink({\n type: \"error\",\n timestamp: Date.now(),\n request: context.request,\n error: context.error,\n options: context.options,\n });\n },\n } satisfies HTTPPlugin;\n}\n","import type { HTTPRequest } from \"./http-request\";\nimport type { HTTPTransport } from \"./transport\";\nimport type { HTTPAdditionalOptions, StatusCode } from \"./types\";\n\nexport interface AxiosRequestConfigLike extends Record<string, unknown> {\n url?: string;\n method?: string;\n headers?: Record<string, string | number | boolean | null | undefined>;\n params?: Record<string, unknown>;\n data?: unknown;\n validateStatus?: (status: number) => boolean;\n signal?: AbortSignal;\n responseType?: string;\n}\n\nexport interface AxiosResponseLike<T = unknown> {\n status: number;\n statusText: string;\n data: T;\n headers?: Record<string, string | string[]>;\n}\n\nexport interface AxiosLike {\n request<T = unknown, R = AxiosResponseLike<T>>(\n config: AxiosRequestConfigLike\n ): Promise<R>;\n}\n\nexport function createAxiosTransport(\n axios: AxiosLike\n): HTTPTransport<AxiosRequestConfigLike> {\n if (!axios || typeof axios.request !== \"function\") {\n throw new Error(\"Axios transport requires an axios-like client instance.\");\n }\n\n return {\n async send<TRequest, TResponse>(\n request: HTTPRequest<TRequest>,\n options: HTTPAdditionalOptions<AxiosRequestConfigLike> = {}\n ) {\n const {\n headers: optionHeaders,\n streamResponse,\n ...restOptions\n } = options;\n\n const config: AxiosRequestConfigLike = {\n url: request.fullUrl ?? \"\",\n method: request.method ?? \"GET\",\n headers: { ...request.headers },\n data: request.data,\n validateStatus: () => true,\n ...restOptions,\n };\n\n if (optionHeaders) {\n config.headers = mergeHeaders(config.headers ?? {}, optionHeaders);\n }\n\n if (streamResponse) {\n config.responseType = config.responseType ?? \"stream\";\n }\n\n const response = await axios.request<TResponse>(config);\n\n return {\n status: response.status as StatusCode,\n statusText: response.statusText,\n headers: response.headers ?? {},\n data: response.data,\n };\n },\n } satisfies HTTPTransport<AxiosRequestConfigLike>;\n}\n\nfunction mergeHeaders(\n base: Record<string, string | number | boolean | null | undefined>,\n overrides: Record<string, string | number | boolean | null | undefined>\n) {\n const next: Record<string, string> = {};\n for (const [key, value] of Object.entries(base)) {\n if (value === undefined || value === null) {\n continue;\n }\n next[key] = String(value);\n }\n for (const [key, value] of Object.entries(overrides)) {\n if (value === undefined || value === null) {\n delete next[key];\n continue;\n }\n next[key] = String(value);\n }\n return next;\n}\n","import { EnsureError, type EnsureOptions } from \"@autometa/assertions\";\n\ntype HeadersLike = {\n get(name: string): string | null;\n has?(name: string): boolean;\n entries?: () => IterableIterator<[string, string]>;\n [Symbol.iterator]?: () => IterableIterator<[string, string]>;\n};\n\ntype HeaderSource = HeadersLike | Record<string, unknown>;\n\nexport type HttpResponseLike = {\n status: number;\n statusText?: string;\n headers: HeaderSource;\n data?: unknown;\n raw?: unknown;\n};\n\nexport type StatusExpectation =\n | number\n | `${1 | 2 | 3 | 4 | 5}xx`\n | readonly [number, number]\n | { readonly min: number; readonly max: number }\n | ((status: number) => boolean);\n\nexport type HeaderExpectation =\n | string\n | RegExp\n | readonly string[]\n | ((value: string) => boolean);\n\nexport interface CacheControlExpectation {\n readonly cacheability?: \"public\" | \"private\";\n readonly maxAge?: number | { readonly min?: number; readonly max?: number };\n readonly sMaxAge?: number;\n readonly revalidate?: boolean;\n readonly immutable?: boolean;\n}\n\nexport interface HttpEnsureChain<\n T extends HttpResponseLike = HttpResponseLike\n> {\n readonly value: T;\n readonly not: HttpEnsureChain<T>;\n toHaveStatus(expectation: StatusExpectation): HttpEnsureChain<T>;\n toHaveHeader(\n name: string,\n expectation?: HeaderExpectation\n ): HttpEnsureChain<T>;\n toBeCacheable(expectation?: CacheControlExpectation): HttpEnsureChain<T>;\n toHaveCorrelationId(headerName?: string): HttpEnsureChain<T>;\n}\n\ntype EnsureErrorDetails = ConstructorParameters<typeof EnsureError>[0];\n\nexport function ensureHttp<T extends HttpResponseLike>(\n response: T,\n options: EnsureOptions & { readonly negated?: boolean } = {}\n): HttpEnsureChain<T> {\n return new HttpEnsureChainImpl<T>(response, {\n ...(options.label ? { label: options.label } : {}),\n negated: Boolean(options.negated),\n });\n}\n\nclass HttpEnsureChainImpl<T extends HttpResponseLike>\n implements HttpEnsureChain<T>\n{\n public readonly value: T;\n private readonly label: string | undefined;\n private readonly negated: boolean;\n private readonly normalized: NormalizedResponse;\n\n constructor(\n value: T,\n state: { readonly label?: string; readonly negated: boolean }\n ) {\n this.value = value;\n this.label = state.label;\n this.negated = state.negated;\n this.normalized = normalizeResponse(value);\n }\n\n public get not(): HttpEnsureChain<T> {\n return new HttpEnsureChainImpl(this.value, {\n ...(this.label ? { label: this.label } : {}),\n negated: !this.negated,\n });\n }\n\n public toHaveStatus(expectation: StatusExpectation): HttpEnsureChain<T> {\n const { pass, description } = matchesStatus(\n this.normalized.status,\n expectation\n );\n if (shouldFail(pass, this.negated)) {\n const baseMessage = this.negated\n ? `Expected response status not to be ${description}`\n : `Expected response status to be ${description}`;\n this.fail({\n matcher: \"toHaveStatus\",\n message: baseMessage,\n actual: this.normalized.status,\n expected: description,\n });\n }\n return this;\n }\n\n public toHaveHeader(\n name: string,\n expectation?: HeaderExpectation\n ): HttpEnsureChain<T> {\n const key = name.toLowerCase();\n const actual = this.normalized.headers[key];\n\n if (expectation === undefined) {\n const pass = actual !== undefined;\n if (shouldFail(pass, this.negated)) {\n const baseMessage = this.negated\n ? `Expected response not to include header ${name}`\n : `Expected response to include header ${name}`;\n this.fail({\n matcher: \"toHaveHeader\",\n message: baseMessage,\n actual: actual ?? \"<missing>\",\n expected: name,\n });\n }\n return this;\n }\n\n const pass = matchHeaderValue(actual, expectation);\n if (shouldFail(pass, this.negated)) {\n const baseMessage = this.negated\n ? `Expected header ${name} not to match`\n : `Expected header ${name} to match`;\n this.fail({\n matcher: \"toHaveHeader\",\n message: baseMessage,\n actual: actual ?? \"<missing>\",\n expected: expectation,\n });\n }\n\n return this;\n }\n\n public toBeCacheable(\n expectation: CacheControlExpectation = {}\n ): HttpEnsureChain<T> {\n const cacheControl = this.normalized.headers[\"cache-control\"];\n\n if (!cacheControl) {\n if (!this.negated) {\n this.fail({\n matcher: \"toBeCacheable\",\n message: \"Expected Cache-Control header to be present\",\n actual: \"<missing>\",\n });\n }\n return this;\n }\n\n const directives = parseCacheControl(cacheControl);\n const impliedCacheable = !(\n \"no-store\" in directives || \"no-cache\" in directives\n );\n const expectationPass = evaluateCacheExpectations(directives, expectation);\n const pass = impliedCacheable && expectationPass;\n\n if (shouldFail(pass, this.negated)) {\n const baseMessage = this.negated\n ? \"Expected response not to advertise cacheable directives\"\n : \"Expected response to advertise cacheable directives\";\n this.fail({\n matcher: \"toBeCacheable\",\n message: baseMessage,\n actual: directives,\n expected: expectation,\n });\n }\n\n return this;\n }\n\n public toHaveCorrelationId(\n headerName = \"x-correlation-id\"\n ): HttpEnsureChain<T> {\n const key = headerName.toLowerCase();\n const value = this.normalized.headers[key];\n const pass = typeof value === \"string\" && value.trim().length > 0;\n\n if (shouldFail(pass, this.negated)) {\n const baseMessage = this.negated\n ? `Expected header ${headerName} to be missing or empty`\n : `Expected header ${headerName} to be present`;\n this.fail({\n matcher: \"toHaveCorrelationId\",\n message: baseMessage,\n actual: value ?? \"<missing>\",\n expected: headerName,\n });\n }\n\n return this;\n }\n\n private fail(details: Omit<EnsureErrorDetails, \"receivedLabel\">): never {\n const merged: EnsureErrorDetails = {\n ...details,\n ...(this.label ? { receivedLabel: this.label } : {}),\n };\n throw new EnsureError(merged);\n }\n}\n\nfunction shouldFail(pass: boolean, negated: boolean): boolean {\n return negated ? pass : !pass;\n}\n\ninterface NormalizedResponse {\n readonly status: number;\n readonly statusText: string;\n readonly headers: Record<string, string>;\n readonly original: unknown;\n}\n\nfunction normalizeResponse(response: HttpResponseLike): NormalizedResponse {\n return {\n status: response.status,\n statusText: response.statusText ?? \"\",\n headers: normalizeHeaders(response.headers),\n original: response.raw ?? response,\n };\n}\n\nfunction normalizeHeaders(source: HeaderSource): Record<string, string> {\n const result: Record<string, string> = {};\n\n // Headers instance (or anything structurally compatible)\n if (typeof (source as HeadersLike).get === \"function\") {\n const entries = (source as HeadersLike).entries;\n const iterator = entries\n ? entries.call(source)\n : (source as HeadersLike)[Symbol.iterator]?.call(source);\n if (iterator) {\n for (const [name, value] of iterator) {\n result[String(name).toLowerCase()] = String(value);\n }\n return result;\n }\n }\n\n // Plain record\n for (const [key, value] of Object.entries(\n source as Record<string, unknown>\n )) {\n result[String(key).toLowerCase()] = String(value);\n }\n\n return result;\n}\n\nfunction matchesStatus(\n status: number,\n expectation: StatusExpectation\n): {\n pass: boolean;\n description: string;\n} {\n if (typeof expectation === \"number\") {\n return {\n pass: status === expectation,\n description: expectation.toString(),\n };\n }\n\n if (typeof expectation === \"string\") {\n const digit = Number.parseInt(expectation.charAt(0), 10);\n if (!Number.isNaN(digit) && expectation.endsWith(\"xx\")) {\n const min = digit * 100;\n return {\n pass: status >= min && status < min + 100,\n description: `${digit}xx`,\n };\n }\n return {\n pass: status.toString() === expectation,\n description: expectation,\n };\n }\n\n if (Array.isArray(expectation)) {\n const [min, max] = expectation;\n return {\n pass: status >= min && status <= max,\n description: `[${min}, ${max}]`,\n };\n }\n\n if (typeof expectation === \"function\") {\n return {\n pass: expectation(status),\n description: \"predicate(status)\",\n };\n }\n\n const range = expectation as { readonly min: number; readonly max: number };\n return {\n pass: status >= range.min && status <= range.max,\n description: `[${range.min}, ${range.max}]`,\n };\n}\n\nfunction matchHeaderValue(\n actual: string | undefined,\n expected: HeaderExpectation\n): boolean {\n if (actual === undefined) {\n return false;\n }\n\n if (typeof expected === \"string\") {\n return actual === expected;\n }\n\n if (expected instanceof RegExp) {\n return expected.test(actual);\n }\n\n if (Array.isArray(expected as unknown[])) {\n const list = expected as readonly string[];\n const actualParts = actual\n .split(\",\")\n .map((part) => part.trim())\n .filter(Boolean);\n return list.every((value) => actualParts.includes(value));\n }\n\n return (expected as (value: string) => boolean)(actual);\n}\n\ntype CacheDirectives = Record<string, string | true>;\n\nfunction parseCacheControl(value: string): CacheDirectives {\n const directives: CacheDirectives = {};\n for (const segment of value.split(\",\")) {\n const trimmed = segment.trim();\n if (!trimmed) {\n continue;\n }\n const [rawName, rawParameter] = trimmed.split(\"=\", 2);\n const name = rawName?.trim();\n if (!name) {\n continue;\n }\n if (rawParameter === undefined) {\n directives[name.toLowerCase()] = true;\n continue;\n }\n const parameter = rawParameter.trim().replace(/^\"|\"$/g, \"\");\n directives[name.toLowerCase()] = parameter;\n }\n return directives;\n}\n\nfunction evaluateCacheExpectations(\n directives: CacheDirectives,\n expectation: CacheControlExpectation\n): boolean {\n if (expectation.cacheability) {\n if (!(expectation.cacheability in directives)) {\n return false;\n }\n }\n\n if (expectation.maxAge !== undefined) {\n const raw = directives[\"max-age\"];\n if (typeof raw !== \"string\") {\n return false;\n }\n const parsed = Number.parseInt(raw, 10);\n if (Number.isNaN(parsed)) {\n return false;\n }\n if (typeof expectation.maxAge === \"number\") {\n if (parsed !== expectation.maxAge) {\n return false;\n }\n } else {\n const { min, max } = expectation.maxAge;\n if (min !== undefined && parsed < min) {\n return false;\n }\n if (max !== undefined && parsed > max) {\n return false;\n }\n }\n }\n\n if (expectation.sMaxAge !== undefined) {\n const raw = directives[\"s-maxage\"];\n if (typeof raw !== \"string\") {\n return false;\n }\n const parsed = Number.parseInt(raw, 10);\n if (Number.isNaN(parsed) || parsed !== expectation.sMaxAge) {\n return false;\n }\n }\n\n if (expectation.revalidate) {\n if (\n !(\"must-revalidate\" in directives || \"proxy-revalidate\" in directives)\n ) {\n return false;\n }\n }\n\n if (expectation.immutable && !(\"immutable\" in directives)) {\n return false;\n }\n\n return true;\n}\n","import type { AssertionPlugin, EnsureOptions } from \"@autometa/assertions\";\n\nimport type { HTTPResponse } from \"../http-response\";\nimport {\n ensureHttp,\n type HttpEnsureChain,\n type HttpResponseLike,\n} from \"./http-ensure\";\n\n/**\n * Callable facet attached as `ensure.http(...)`.\n *\n * Supports plugin-level negation: `ensure.not.http(response)`.\n * Also supports chain-level negation: `ensure.http(response).not...`.\n */\nexport type HttpAssertionsFacet = <T = unknown>(\n response: HttpResponseLike | HTTPResponse<T>,\n options?: EnsureOptions\n) => HttpEnsureChain<HttpResponseLike>;\n\n/**\n * Assertion plugin that provides HTTP response matchers as a facet.\n *\n * This keeps the base `ensure(value)` matcher chain domain-agnostic.\n */\nexport const httpAssertionsPlugin = <World>(): AssertionPlugin<World, HttpAssertionsFacet> =>\n ({ isNot }) =>\n (_world) => {\n const facet: HttpAssertionsFacet = <T = unknown>(\n response: HttpResponseLike | HTTPResponse<T>,\n options?: EnsureOptions\n ) => {\n return ensureHttp(response as HttpResponseLike, {\n ...(options?.label ? { label: options.label } : {}),\n negated: isNot,\n });\n };\n\n return facet;\n };\n","type HeadersLike = {\n\tget(name: string): string | null;\n\thas?(name: string): boolean;\n\tentries?: () => IterableIterator<[string, string]>;\n\t[Symbol.iterator]?: () => IterableIterator<[string, string]>;\n};\n\ntype HeaderSource = HeadersLike | Record<string, unknown>;\n\nexport type HttpResponseLike = {\n\tstatus: number;\n\tstatusText?: string;\n\theaders: HeaderSource;\n\tdata?: unknown;\n\traw?: unknown;\n};\n\n/**\n * Adapts an @autometa/http `HTTPResponse` (or any similarly-shaped object) into a\n * stable `HttpResponseLike` for HTTP assertions.\n */\nexport function fromHttpResponse<T extends { headers: Record<string, string> }>(\n\tresponse: T & { status: number; statusText?: string; data?: unknown }\n): HttpResponseLike {\n\treturn {\n\t\tstatus: response.status,\n\t\tstatusText: response.statusText ?? \"\",\n\t\theaders: response.headers,\n\t\tdata: response.data,\n\t\traw: response,\n\t};\n}\n\n/**\n * Adapts a fetch-style response (or any similarly-shaped object) into a stable\n * `HttpResponseLike` for HTTP assertions.\n */\nexport function fromFetchResponse(\n\tresponse: { status: number; statusText?: string; headers: HeadersLike },\n\tdata?: unknown\n): HttpResponseLike {\n\treturn {\n\t\tstatus: response.status,\n\t\tstatusText: response.statusText ?? \"\",\n\t\theaders: response.headers,\n\t\tdata,\n\t\traw: response,\n\t};\n}\n"]}
|