@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.
Files changed (55) hide show
  1. package/README.md +107 -2
  2. package/dist/assertions/http-adapters.d.ts +35 -0
  3. package/dist/assertions/http-assertions-plugin.d.ts +16 -0
  4. package/dist/assertions/http-ensure.d.ts +42 -0
  5. package/dist/axios-transport.d.ts +22 -0
  6. package/dist/default-schema.d.ts +8 -0
  7. package/dist/fetch-transport.d.ts +21 -0
  8. package/dist/http-request.d.ts +109 -0
  9. package/dist/http-response.d.ts +77 -0
  10. package/dist/http.d.ts +300 -0
  11. package/dist/index.cjs +2076 -0
  12. package/dist/index.cjs.map +1 -0
  13. package/dist/index.d.ts +15 -1116
  14. package/dist/index.js +1727 -845
  15. package/dist/index.js.map +1 -1
  16. package/dist/plugins.d.ts +43 -0
  17. package/dist/request-meta.config.d.ts +56 -0
  18. package/dist/schema.map.d.ts +11 -0
  19. package/dist/transform-response.d.ts +1 -0
  20. package/dist/transport.d.ts +11 -0
  21. package/dist/types.d.ts +39 -0
  22. package/package.json +31 -31
  23. package/.eslintignore +0 -3
  24. package/.eslintrc.cjs +0 -4
  25. package/.turbo/turbo-lint$colon$fix.log +0 -4
  26. package/.turbo/turbo-prettify.log +0 -5
  27. package/.turbo/turbo-test.log +0 -120
  28. package/CHANGELOG.md +0 -335
  29. package/dist/esm/index.js +0 -1117
  30. package/dist/esm/index.js.map +0 -1
  31. package/dist/index.d.cts +0 -1116
  32. package/src/axios-client.ts +0 -35
  33. package/src/default-client-factory.axios.spec.ts +0 -9
  34. package/src/default-client-factory.other.spec.ts +0 -13
  35. package/src/default-client-factory.ts +0 -7
  36. package/src/default-schema.spec.ts +0 -74
  37. package/src/default-schema.ts +0 -127
  38. package/src/http-client.ts +0 -20
  39. package/src/http-request.spec.ts +0 -172
  40. package/src/http-request.ts +0 -201
  41. package/src/http-response.ts +0 -107
  42. package/src/http.spec.ts +0 -189
  43. package/src/http.ts +0 -907
  44. package/src/index.ts +0 -13
  45. package/src/node_modules/.vitest/deps/_metadata.json +0 -8
  46. package/src/node_modules/.vitest/deps/package.json +0 -3
  47. package/src/node_modules/.vitest/results.json +0 -1
  48. package/src/request-meta.config.spec.ts +0 -81
  49. package/src/request-meta.config.ts +0 -134
  50. package/src/request.config.ts +0 -34
  51. package/src/schema.map.spec.ts +0 -50
  52. package/src/schema.map.ts +0 -68
  53. package/src/transform-response.ts +0 -43
  54. package/src/types.ts +0 -37
  55. package/tsup.config.ts +0 -14
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/http-response.ts","../src/axios-client.ts","../src/http-client.ts","../src/http.ts","../src/default-client-factory.ts","../src/http-request.ts","../src/schema.map.ts","../src/request-meta.config.ts","../src/transform-response.ts","../src/default-schema.ts"],"sourcesContent":["export * from \"./axios-client\";\nexport * from \"./http-client\";\nexport * from \"./http\";\nexport * from \"./http-request\";\nexport * from \"./http-response\";\nexport * from \"./default-schema\";\nexport type {\n HTTPAdditionalOptions,\n HTTPMethod,\n SchemaParser,\n RequestHook,\n ResponseHook,\n} from \"./types\";\n","import { HTTPRequest } from \"./http-request\";\nimport { StatusCode } from \"./types\";\n\nexport class HTTPResponse<T = unknown> {\n status: StatusCode;\n statusText: string;\n data: T;\n headers: Record<string, string>;\n request: HTTPRequest<unknown>;\n\n constructor() {\n this.headers = {};\n }\n\n static fromRaw<T>(response: HTTPResponse<T>) {\n const newResponse = new HTTPResponse<T>();\n Object.assign(newResponse, response);\n return response;\n }\n\n /**\n * Decomposes a response, creating an exact copy of the current response,\n * but with a new data value. The data can be provided directly as is, or it\n * can be generated through a callback function which receives the current\n * response data as an argument.\n *\n * ```ts\n * const response = await http.get(\"/products\");\n *\n * // direct value\n * const products = response.data;\n * const firstProduct = response.decompose(products[0]);\n * // callback transformer\n * const secondProduct = response.decompose((products) => products[1]);\n * // callback transformer with destructuring\n * const secondProduct = response.decompose(([product]) => product);\n * ```\n * @param value\n */\n decompose<K>(value: K): HTTPResponse<K>;\n decompose<K>(transformFn: (response: T) => K): HTTPResponse<K>;\n decompose<K>(transformFnOrVal: K | ((response: T) => K)): HTTPResponse<K> {\n const value = getDecompositionValue<T>(this.data, transformFnOrVal);\n return new HTTPResponseBuilder()\n .status(this.status)\n .statusText(this.statusText)\n .headers(this.headers)\n .request(this.request)\n .data(value)\n .build() as HTTPResponse<K>;\n }\n}\n\nfunction getDecompositionValue<T>(data: unknown, transformFn: unknown): T {\n return typeof transformFn === \"function\" ? transformFn(data) : transformFn;\n}\n\nexport class HTTPResponseBuilder {\n #response = new HTTPResponse();\n\n static create() {\n return new HTTPResponseBuilder();\n }\n\n derive() {\n return HTTPResponseBuilder.create()\n .data(this.#response.data)\n .headers(this.#response.headers)\n .request(this.#response.request)\n .status(this.#response.status)\n .statusText(this.#response.statusText);\n }\n\n status(code: StatusCode) {\n this.#response.status = code;\n return this;\n }\n\n statusText(text: string) {\n this.#response.statusText = text;\n return this;\n }\n\n data<T>(data: T) {\n this.#response.data = data;\n return this;\n }\n\n headers(dict: Record<string, string>) {\n this.#response.headers = dict;\n return this;\n }\n\n header(name: string, value: string) {\n this.#response.headers[name] = value;\n return this;\n }\n\n request(request: HTTPRequest<unknown>) {\n this.#response.request = request;\n return this;\n }\n\n build() {\n return this.#response;\n }\n}\n","import { HTTPRequest } from \"./http-request\";\nimport { HTTPResponse, HTTPResponseBuilder } from \"./http-response\";\nimport { HTTPAdditionalOptions, StatusCode } from \"./types\";\nimport axios, { AxiosRequestConfig } from \"axios\";\nimport { HTTPClient } from \"./http-client\";\n\n@HTTPClient.Use()\nexport class AxiosClient extends HTTPClient {\n async request<TRequestType, TResponseType>(\n request: HTTPRequest<TRequestType>,\n options: HTTPAdditionalOptions<AxiosRequestConfig>\n ): Promise<HTTPResponse<TResponseType>> {\n const { baseUrl, route, params, headers, method, data } = request;\n const url = [baseUrl, ...route].join(\"/\");\n const axiosRequest: AxiosRequestConfig = {\n url,\n params,\n headers,\n method,\n data,\n validateStatus: function (status) {\n return status >= 0 && status < 600;\n },\n ...options,\n };\n const response = await axios(axiosRequest);\n return HTTPResponseBuilder.create()\n .status(response.status as StatusCode)\n .statusText(response.statusText)\n .data(response.data)\n .headers(response.headers as Record<string, string>)\n .request(request)\n .build() as HTTPResponse<TResponseType>;\n }\n}\n","import { HTTPRequest } from \"./http-request\";\nimport { HTTPResponse } from \"./http-response\";\nimport { HTTPAdditionalOptions } from \"./types\";\nimport { Class } from \"@autometa/types\";\nexport let defaultClient: Class<HTTPClient>;\nexport abstract class HTTPClient {\n static Use(): (target: Class<HTTPClient>) => void;\n static Use(client?: Class<HTTPClient>) {\n if (client) {\n defaultClient = client;\n }\n return function (target: Class<HTTPClient>) {\n defaultClient = target;\n };\n }\n abstract request<TRequestType, TResponseType>(\n request: HTTPRequest<TRequestType>,\n options?: HTTPAdditionalOptions<unknown>\n ): Promise<HTTPResponse<TResponseType>>;\n}\n","import { Fixture, INJECTION_SCOPE } from \"@autometa/injection\";\nimport { AxiosClient } from \"./axios-client\";\nimport { HTTPClient } from \"./http-client\";\nimport { defaultClientFactory } from \"./default-client-factory\";\nimport { HTTPRequest, HTTPRequestBuilder } from \"./http-request\";\nimport { HTTPResponse } from \"./http-response\";\nimport { MetaConfig, MetaConfigBuilder } from \"./request-meta.config\";\nimport {\n HTTPAdditionalOptions,\n RequestHook,\n ResponseHook,\n SchemaParser,\n StatusCode,\n} from \"./types\";\nimport { transformResponse } from \"./transform-response\";\nimport { AutomationError } from \"@autometa/errors\";\n\n/**\n * The HTTP fixture allows requests to be built and sent to a server. In general,\n * there are 2 modes of operation:\n *\n * * Shared Chain: The shared chain is used to configure the client for all requests, such as\n * routes this instance will always be used. When a shared chain method is called, it returns\n * the same instance of HTTP which can be further chained to configure the client.\n * * Request Chain: The request chain is used to configure a single request, inheriting values\n * set by the shared chain. When called, a new HTTP client instance is created and inherits the values\n * set by it's parent.\n *\n * The 2 modes are intended to simplify configuring an object through an inheritance chain. For example,\n * assume we have an API with 2 controller routes, `/product` and `/seller`. We can set up a Base Client\n * which consumes the HTTP fixture and configures it with the base url of our API.\n *\n * Inheritors can further configure their HTTP instance's routes.\n *\n * ```ts\n * \\@Constructor(HTTP)\n * export class BaseClient {\n * constructor(protected readonly http: HTTP) {\n * this.http.url(\"https://api.example.com\");\n * }\n * }\n *\n * export class ProductClient extends BaseClient {\n * constructor(http: HTTP) {\n * super(http);\n * this.http.sharedRoute(\"product\");\n * }\n * getProduct(id: number) {\n * return this.http.route(id).get();\n * }\n *\n * export class SellerClient extends BaseClient {\n * constructor(http: HTTP) {\n * super(http);\n * this.http.sharedRoute(\"seller\");\n * }\n *\n * getSeller(id: number) {\n * return this.http.route(id).get();\n * }\n * }\n * ```\n *\n * 'Schemas' can also be configured. A Schema is a function or an object with a `parse` method, which\n * takes a response data payload and returns a validated object. Schemas are mapped to\n * HTTP Status Codes, and if configured to be required the request will fail if no schema is found\n * matching that code.\n *\n * Defining a schema function:\n *\n * ```\n * // user.schema.ts\n * export function UserSchema(data: unknown) {\n * if(typeof data !== \"object\") {\n * throw new Error(\"Expected an object\");\n * }\n *\n * if(typeof data.name !== \"string\") {\n * throw new Error(\"Expected a string\");\n * }\n *\n * return data as { name: string };\n * }\n *\n * // user.controller.ts\n * \\@Fixture(INJECTION_SCOPE.TRANSIENT)\n * export class UserController extends BaseController {\n * constructor(private readonly http: HTTP) {\n * super(http);\n * this.http\n * .sharedRoute(\"user\")\n * .sharedSchema(ErrorSchema, { from: 400, to: 499 });\n * }\n *\n * getUser(id: number) {\n * return this.http.route(id).schema(UserSchema, 200).get();\n * // or\n * return this.http\n * .route(id)\n * .schema(UserSchema, { from: 200, to: 299 })\n * .get();\n * // or\n * return this.http\n * .route(id)\n * .schema(UserSchema, 200, 201, 202)\n * .get();\n * }\n * }\n * ```\n *\n * Validation libraries which use a `.parse` or `.validation`, method, such as Zod or MyZod, can also be used as schemas:\n *\n * ```ts\n * // user.schema.ts\n * import { z } from \"myzod\";\n *\n * export const UserSchema = z.object({\n * name: z.string()\n * });\n *\n * // user.controller.ts\n * \\@Fixture(INJECTION_SCOPE.TRANSIENT)\n * export class UserController extends BaseController {\n * constructor(private readonly http: HTTP) {\n * super(http);\n * this.http\n * .sharedRoute(\"user\")\n * .sharedSchema(ErrorSchema, { from: 400, to: 499 })\n * }\n *\n * getUser(id: number) {\n * return this.http.route(id).schema(UserSchema, 200).get();\n * }\n * }\n * ```\n */\n@Fixture(INJECTION_SCOPE.TRANSIENT)\nexport class HTTP {\n #request: HTTPRequestBuilder<HTTPRequest<unknown>>;\n #metaConfig: MetaConfigBuilder;\n constructor(\n private readonly client: HTTPClient = defaultClientFactory(),\n builder: HTTPRequestBuilder<\n HTTPRequest<unknown>\n > = new HTTPRequestBuilder(),\n metaConfig: MetaConfigBuilder = new MetaConfigBuilder()\n ) {\n this.#request = builder;\n this.#metaConfig = metaConfig.derive();\n }\n\n static create(\n client: HTTPClient = new AxiosClient(),\n builder: HTTPRequestBuilder<\n HTTPRequest<unknown>\n > = new HTTPRequestBuilder(),\n metaConfig: MetaConfigBuilder = new MetaConfigBuilder()\n ) {\n const derived = new HTTP(client, builder, metaConfig);\n return derived;\n }\n\n /**\n * Sets the base url of the request for this client, such as\n * `https://api.example.com`, and could include always-used routes like\n * the api version, such as `/v1` or `/api/v1` at the end.\n *\n * ```ts\n *\n * \\@Fixture(INJECTION_SCOPE.TRANSIENT)\n * export abstract class BaseClient {\n * constructor(protected readonly http: HTTP) {\n * this.http.url(\"https://api.example.com\");\n * }\n * }\n * ```\n * @param url\n * @returns\n */\n url(url: string) {\n this.#request.url(url);\n return this;\n }\n\n sharedOptions(options: HTTPAdditionalOptions<unknown>) {\n this.#metaConfig.options(options);\n return this;\n }\n\n /**\n * If set to true, all requests derived from this client will require a schema be defined\n * matching any response status code. If set to false, a schema will still be used for validation\n * if defined, or the unadulterated original body will be returned if no schema matches.\n *\n * @param required Whether or not a schema is required for all responses.\n * @returns This instance of HTTP.\n */\n requireSchema(required: boolean) {\n this.#metaConfig.requireSchema(required);\n return this;\n }\n\n /**\n * If set to true, all requests derived from this client will allow plain text\n * responses. If set to false, plain text responses will throw an serialization error.\n *\n * Useful when an endpoint returns a HTML or plain text response. If the plain text\n * is the value of `true` or `false`, or a number, it will be parsed into the\n * appropriate type.\n *\n * This method is a shared chain method, and will return the same instance of HTTP.\n *\n * @param allow Whether or not plain text responses are allowed.\n * @returns This instance of HTTP.\n */\n sharedAllowPlainText(allow: boolean) {\n this.#metaConfig.allowPlainText(allow);\n return this;\n }\n\n /**\n * If set to true, all requests derived from this client will allow plain text\n * responses. If set to false, plain text responses will throw an serialization error.\n *\n * Useful when an endpoint returns a HTML or plain text response. If the plain text\n * is the value of `true` or `false`, or a number, it will be parsed into the\n * appropriate type.\n *\n * This method is a request chain method, and will return a new instance of HTTP.\n *\n * @param allow Whether or not plain text responses are allowed.\n * @returns A new child instance of HTTP derived from this one.\n */\n allowPlainText(allow: boolean) {\n return HTTP.create(\n this.client,\n this.#request.derive(),\n this.#metaConfig.derive().allowPlainText(allow)\n );\n }\n\n /**\n * Attaches a route to the request, such as `/product` or `/user`. Subsequent calls\n * to this method will append the route to the existing route, such as `/product/1`.\n *\n * Numbers will be converted to strings automatically. Routes can be defined one\n * at a time or as a spread argument.\n *\n * ```ts\n * constructor(http: HTTP) {\n * super(http);\n * this.http.sharedRoute(\"user\", id).get();\n * }\n *\n * // or\n *\n * constructor(http: HTTP) {\n * super(http);\n * this.http\n * .sharedRoute(\"user\")\n * .sharedRoute(id)\n * .get();\n * }\n * ```\n *\n * This method is a shared chain method, and will return the same instance of HTTP. All\n * child clients will inherit the routes defined by this method. Useful to configure\n * in the constructor body.\n *\n * @param route A route or spread list of routes to append to the request.\n * @returns This instance of HTTP.\n */\n sharedRoute(...route: (string | number | boolean)[]) {\n this.#request.route(...route.map((r) => r.toString()));\n return this;\n }\n\n /**\n * Attaches a route to the request, such as `/product` or `/user`. Subsequent calls\n * to this method will append the route to the existing route, such as `/product/1`.\n *\n * Numbers will be converted to strings automatically. Routes can be defined one\n * at a time or as a spread argument.\n *\n * ```ts\n * getUser(id: number) {\n * return this.http.route(\"user\", id).get();\n * }\n *\n * // or\n *\n * getUser(id: number) {\n * return this.http\n * .route(\"user\")\n * .route(id)\n * .get();\n * }\n * ```\n *\n * This method is a request chain method, and will return a new instance of HTTP, inheriting\n * any routes previously defined and appending the new route. Useful to configure\n * in class methods as part of finalizing a request.\n *\n * @param route A route or spread list of routes to append to the request.\n * @returns A new child instance of HTTP derived from this one.\n */\n route(...route: (string | number | boolean)[]) {\n const mapped = route.map((r) => String(r));\n return HTTP.create(\n this.client,\n this.#request.derive().route(...mapped),\n this.#metaConfig.derive()\n );\n }\n\n /**\n * Attaches a shared schema mapping for all requests by this client. Schemas are\n * mapped to HTTP Status Codes, and if configured to be required the request will fail\n * if no schema is found matching that code.\n *\n * The status code mapping can be defined as a single code, a range of codes, or a spread list.\n *\n * ```ts\n * \\@Fixture(INJECTION_SCOPE.TRANSIENT)\n * export class UserController extends BaseController {\n * constructor(private readonly http: HTTP) {\n * super(http);\n * this.http\n * .sharedRoute(\"user\")\n * .sharedSchema(UserSchema, 200)\n * .sharedSchema(EmptySchema, 201, 204)\n * .sharedSchema(ErrorSchema, { from: 400, to: 499 });\n * }\n * }\n * ```\n *\n * This method is a shared chain method, and will return the same instance of HTTP. All\n * child clients will inherit the schemas defined by this method. Useful to configure\n * in the constructor body.\n *\n * @param parser The schema parser to use for this mapping.\n * @param codes A single status code, a range of status codes, or a spread list of status codes.\n * @returns This instance of HTTP.\n */\n sharedSchema(parser: SchemaParser, ...codes: StatusCode[]): HTTP;\n sharedSchema(\n parser: SchemaParser,\n ...range: { from: StatusCode; to: StatusCode }[]\n ): HTTP;\n sharedSchema(\n parser: SchemaParser,\n ...args: (StatusCode | { from: StatusCode; to: StatusCode })[]\n ): HTTP {\n this.#metaConfig.schema(parser, ...args);\n return this;\n }\n\n /**\n * Attaches a schema mapping for this request. Schemas are\n * mapped to HTTP Status Codes, and if configured to be required the request will fail\n * if no schema is found matching that code.\n *\n * The status code mapping can be defined as a single code, a range of codes, or a spread list.\n *\n * ```ts\n * \\@Fixture(INJECTION_SCOPE.TRANSIENT)\n * export class UserController extends BaseController {\n * constructor(private readonly http: HTTP) {\n * super(http);\n * this.http\n * .sharedRoute(\"user\")\n * .schema(ErrorSchema, { from: 400, to: 499 });\n * }\n *\n * getUser(id: number) {\n * return this.http.route(id).schema(UserSchema, 200).get();\n * }\n *\n * getUsers(...ids: number[]) {\n * return this.http\n * .route(\"users\")\n * .schema(UserSchema, { from: 200, to: 299 })\n * .schema(UserSchema, 200)\n * .get();\n * }\n * ```\n *\n * This method is a request chain method, and will return a new instance of HTTP, inheriting\n * any schemas previously defined and appending the new schema. Useful to configure\n * in class methods as part of finalizing a request.\n *\n * @param parser The schema parser to use for this mapping.\n * @param codes A single status code, a range of status codes, or a spread list of status codes.\n * @returns A new child instance of HTTP derived from this one.\n */\n schema(parser: SchemaParser, ...codes: StatusCode[]): HTTP;\n schema(\n parser: SchemaParser,\n ...range: { from: StatusCode; to: StatusCode }[]\n ): HTTP;\n schema(\n parser: SchemaParser,\n ...args: (StatusCode | { from: StatusCode; to: StatusCode })[]\n ): HTTP {\n return HTTP.create(\n this.client,\n this.#request.derive(),\n this.#metaConfig.derive().schema(parser, ...args)\n );\n }\n\n /**\n * Attaches a shared query string parameter to all requests by this client. Query string\n * parameters are key-value pairs which are appended to the request url, such as\n * `https://api.example.com?name=John&age=30`.\n *\n * This method is a shared chain method, and will return the same instance of HTTP. All\n * child clients will inherit the query string parameters defined by this method. Useful to configure\n * in the constructor body.\n *\n * @param name The name of the query string parameter.\n * @param value The value of the query string parameter.\n * @returns This instance of HTTP.\n */\n sharedParam(name: string, value: Record<string, unknown>): HTTP;\n sharedParam(name: string, ...value: (string | number | boolean)[]): HTTP;\n sharedParam(name: string, value: (string | number | boolean)[]): HTTP;\n sharedParam(\n name: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n value: any\n ): HTTP {\n this.#request.param(name, value);\n return this;\n }\n\n /**\n * `onSend` is a pre-request hook which will be executed in order of definition\n * immediately before the request is sent. This hook can be used to analyze or\n * log the request state.\n *\n * ```ts\n *\n * \\@Fixture(INJECTION_SCOPE.TRANSIENT)\n * export class UserController extends BaseController {\n * constructor(private readonly http: HTTP) {\n * super(http);\n * this.http\n * .sharedRoute(\"user\")\n * .sharedOnSend(\"log request\",\n * (request) => console.log(JSON.stringify(request, null, 2))\n * );\n * }\n * }\n * ```\n *\n * This method is a shared chain method, and will return the same instance of HTTP. All\n * child clients will inherit the onSend hooks defined by this method. Useful to configure\n * in the constructor body.\n *\n * @param description A description of the hook, used for debugging.\n * @param hook The hook to execute.\n * @returns This instance of HTTP.\n */\n sharedOnSend(description: string, hook: RequestHook) {\n this.#metaConfig.onBeforeSend(description, hook);\n return this;\n }\n\n /**\n * `onReceive` is a post-request hook which will be executed in order of definition\n * immediately after the response is received. This hook can be used to analyze or\n * log the response state.\n *\n * ```ts\n *\n * \\@Fixture(INJECTION_SCOPE.TRANSIENT)\n * export class UserController extends BaseController {\n * constructor(private readonly http: HTTP) {\n * super(http);\n * this.http\n * .sharedRoute(\"user\")\n * .sharedOnReceive(\"log response\",\n * (response) => console.log(JSON.stringify(response, null, 2))\n * );\n * }\n * }\n * ```\n *\n * This method is a shared chain method, and will return the same instance of HTTP. All\n * child clients will inherit the onReceive hooks defined by this method. Useful to configure\n * in the constructor body.\n *\n * @param description A description of the hook, used for debugging.\n * @param hook The hook to execute.\n * @returns This instance of HTTP.\n */\n sharedOnReceive(description: string, hook: ResponseHook<unknown>) {\n this.#metaConfig.onReceiveResponse(description, hook);\n return this;\n }\n\n /**\n * Attaches a query string parameter object to the request. Query string\n * parameters are key-value pairs which are appended to the request url, such as\n * `https://api.example.com?name=John&age=30`.\n *\n * This method is a shared chain method, and will return the same instance of HTTP. All\n * child clients will inherit the query string parameters defined by this method. Useful to configure\n * in the constructor body.\n *\n * ```ts\n * constructor(http: HTTP) {\n * super(http);\n * this.http\n * .sharedParams({ 'is-test': \"true\" })\n * ```\n * @param name The name of the query string parameter.\n * @param value The value of the query string parameter.\n * @returns This instance of HTTP.\n */\n sharedParams(dict: Record<string, unknown>) {\n this.#request.params(dict);\n return this;\n }\n\n /**\n * Attaches a query string parameter to the request. Query string\n * parameters are key-value pairs which are appended to the request url, such as\n * `https://api.example.com?name=John&age=30`.\n *\n * This method is a request chain method, and will return a new instance of HTTP, inheriting\n * any query string parameters previously defined and appending the new parameter. Useful to configure\n * in class methods as part of finalizing a request.\n *\n * ```ts\n * getUser(id: number) {\n * return this.http\n * .route(id)\n * .param(\"name\", \"John\")\n * .param(\"age\", 30)\n * ```\n *\n * Note: Numbers and Booleans will be converted to strings automatically.\n *\n * @param name The name of the query string parameter.\n * @param value The value of the query string parameter.\n * @returns A new child instance of HTTP derived from this one.\n */\n param(name: string, value: Record<string, unknown>): HTTP;\n param(name: string, ...value: (string | number | boolean)[]): HTTP;\n param(name: string, value: (string | number | boolean)[]): HTTP;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n param(name: string, ...value: any) {\n return HTTP.create(\n this.client,\n this.#request.derive().param(name, value),\n this.#metaConfig.derive()\n );\n }\n\n /**\n * Attaches a query string parameter object to the request. Query string\n * parameters are key-value pairs which are appended to the request url, such as\n * `https://api.example.com?name=John&age=30`.\n *\n * This method is a shared chain method, and will return the same instance of HTTP. All\n * child clients will inherit the query string parameters defined by this method. Useful to configure\n * in the constructor body.\n *\n * ```ts\n * getUser(id: number) {\n * return this.http\n * .route(id)\n * .param({ name: \"John\", age: \"30\" })\n *\n * @param name The name of the query string parameter.\n * @param value The value of the query string parameter.\n * @returns This instance of HTTP.\n */\n params(dict: Record<string, unknown>) {\n return HTTP.create(\n this.client,\n this.#request.derive().params(dict),\n this.#metaConfig.derive()\n );\n }\n\n /**\n * Attaches a shared data payload to this client. The data payload is the body of the request,\n * and can be any type. If the data payload is an object, it will be serialized to JSON.\n *\n * This method is a shared chain method, and will return the same instance of HTTP. All\n * child clients will inherit the data payload defined by this method. Useful to configure\n * in the constructor body.\n *\n * @param data The data payload to attach to the request.\n * @returns This instance of HTTP.\n */\n sharedData<T>(data: T) {\n this.#request.data(data);\n return this;\n }\n\n /**\n * Attaches a shared header to this client. Headers are string:string key-value pairs which are\n * sent with the request, such as `Content-Type: application/json`.\n *\n * Numbers, Booleans and Null will be converted to string values automatically.\n *\n * A Factory function can also be provided to generate the header value at the time of request.\n *\n * This method is a shared chain method, and will return the same instance of HTTP. All\n * child clients will inherit the header defined by this method. Useful to configure\n * in the constructor body.\n *\n * @param name The name of the header.\n * @param value The value of the header.\n */\n sharedHeader(\n name: string,\n value:\n | string\n | number\n | boolean\n | null\n | (string | number | boolean)[]\n | (() => string | number | boolean | null)\n | (() => Promise<string | number | boolean | null>)\n ) {\n this.#request.header(name, value);\n return this;\n }\n\n header(\n name: string,\n value:\n | string\n | number\n | boolean\n | null\n | (string | number | boolean)[]\n | (() => string | number | boolean | null)\n | (() => Promise<string | number | boolean | null>)\n ) {\n return HTTP.create(\n this.client,\n this.#request.derive().header(name, value),\n this.#metaConfig.derive()\n );\n }\n\n /**\n * Attaches a data payload to this request. The data payload is the body of the request,\n * and can be any type. If the data payload is an object, it will be serialized to JSON.\n *\n * This method is a request chain method, and will return a new instance of HTTP, inheriting\n * any data payload previously defined and appending the new payload. Useful to configure\n * in class methods as part of finalizing a request.\n *\n * @param data The data payload to attach to the request.\n * @returns A new child instance of HTTP derived from this one.\n */\n data<T>(data: T) {\n this.#request.data(data);\n return HTTP.create(\n this.client,\n this.#request.derive().data(data),\n this.#metaConfig.derive()\n );\n }\n\n /**\n * `onSend` is a pre-request hook which will be executed in order of definition\n * immediately before the request is sent. This hook can be used to modify the request,\n * or to log the state of a request before final send-off.\n *\n * ```ts\n *\n * \\@Fixture(INJECTION_SCOPE.TRANSIENT)\n * export class UserController extends BaseController {\n * constructor(private readonly http: HTTP) {\n * super(http);\n * }\n *\n * getUser(id: number) {\n * return this.http\n * .route(id)\n * .onSend(\"log request\",\n * (request) => console.log(JSON.stringify(request, null, 2)\n * )\n * .get();\n * }\n * ```\n *\n * This method is a request chain method, and will return a new instance of HTTP, inheriting\n * any onSend hooks previously defined and appending the new hook. Useful to configure\n * in class methods as part of finalizing a request.\n *\n * @param description A description of the hook, used for debugging.\n * @param hook The hook to execute.\n * @returns A new child instance of HTTP derived from this one.\n */\n onSend(description: string, hook: RequestHook) {\n return HTTP.create(\n this.client,\n this.#request.derive(),\n this.#metaConfig.derive().onBeforeSend(description, hook)\n );\n }\n\n /**\n * `onReceive` is a post-request hook which will be executed in order of definition\n * immediately after the response is received. This hook can be used to modify the response,\n * or to log the state of a response after it is received.\n *\n * ```ts\n *\n * \\@Fixture(INJECTION_SCOPE.TRANSIENT)\n * export class UserController extends BaseController {\n * constructor(private readonly http: HTTP) {\n * super(http);\n * }\n *\n * getUser(id: number) {\n * return this.http\n * .route(id)\n * .onReceive(\"log response\",\n * (response) => console.log(JSON.stringify(response, null, 2)\n * )\n * .get();\n * }\n * ```\n *\n * This method is a request chain method, and will return a new instance of HTTP, inheriting\n * any onReceive hooks previously defined and appending the new hook. Useful to configure\n * in class methods as part of finalizing a request.\n *\n * @param description A description of the hook, used for debugging.\n * @param hook The hook to execute.\n * @returns A new child instance of HTTP derived from this one.\n */\n onReceive(description: string, hook: ResponseHook<unknown>) {\n return HTTP.create(\n this.client,\n this.#request.derive(),\n this.#metaConfig.derive().onReceiveResponse(description, hook)\n );\n }\n\n /**\n * Executes the current request state as a GET request.\n *\n * @param options Additional options to pass to the underlying http client, such\n * as e.g Axios configuration values.\n * @returns A promise which resolves to the response.\n */\n get<TResponseType>(options?: HTTPAdditionalOptions<unknown>) {\n return this.#makeRequest(\n this.#request.derive().method(\"GET\"),\n options\n ) as Promise<HTTPResponse<TResponseType>>;\n }\n\n /**\n * Executes the current request state as a POST request.\n *\n * @param data The data payload to attach to the request.\n * @param options Additional options to pass to the underlying http client, such\n * as e.g Axios configuration values.\n * @returns A promise which resolves to the response.\n */\n post<TResponseType>(options?: HTTPAdditionalOptions<unknown>) {\n return this.#makeRequest(\n this.#request.derive().method(\"POST\"),\n options\n ) as Promise<HTTPResponse<TResponseType>>;\n }\n\n /**\n * Executes the current request state as a DELETE request.\n *\n * @param options Additional options to pass to the underlying http client, such\n * as e.g Axios configuration values.\n * @returns A promise which resolves to the response.\n * as e.g Axios configuration values.\n */\n delete<TResponseType>(options?: HTTPAdditionalOptions<unknown>) {\n return this.#makeRequest(\n this.#request.derive().method(\"DELETE\"),\n options\n ) as Promise<HTTPResponse<TResponseType>>;\n }\n\n /**\n * Executes the current request state as a PUT request.\n *\n * @param options Additional options to pass to the underlying http client, such\n * as e.g Axios configuration values.\n * @returns A promise which resolves to the response.\n */\n put<TResponseType>(options?: HTTPAdditionalOptions<unknown>) {\n return this.#makeRequest(\n this.#request.derive().method(\"PUT\"),\n options\n ) as Promise<HTTPResponse<TResponseType>>;\n }\n /**\n * Executes the current request state as a PATCH request.\n *\n * @param options Additional options to pass to the underlying http client, such\n * as e.g Axios configuration values.\n * @returns A promise which resolves to the response.\n */\n patch<TResponseType>(options?: HTTPAdditionalOptions<unknown>) {\n return this.#makeRequest(\n this.#request.derive().method(\"PATCH\"),\n options\n ) as Promise<HTTPResponse<TResponseType>>;\n }\n\n head<TResponseType>(options?: HTTPAdditionalOptions<unknown>) {\n return this.#makeRequest(\n this.#request.derive().method(\"HEAD\"),\n options\n ) as Promise<HTTPResponse<TResponseType>>;\n }\n\n options<TResponseType>(options?: HTTPAdditionalOptions<unknown>) {\n return this.#makeRequest(\n this.#request.derive().method(\"OPTIONS\"),\n options\n ) as Promise<HTTPResponse<TResponseType>>;\n }\n\n trace<TResponseType>(options?: HTTPAdditionalOptions<unknown>) {\n return this.#makeRequest(\n this.#request.derive().method(\"TRACE\"),\n options\n ) as Promise<HTTPResponse<TResponseType>>;\n }\n\n connect<TResponseType>(options?: HTTPAdditionalOptions<unknown>) {\n return this.#makeRequest(\n this.#request.derive().method(\"CONNECT\"),\n options\n ) as Promise<HTTPResponse<TResponseType>>;\n }\n\n async #makeRequest(\n builder: HTTPRequestBuilder<HTTPRequest<unknown>>,\n options?: HTTPAdditionalOptions<unknown>\n ) {\n const request = (await builder.resolveDynamicHeaders()).build();\n const meta = this.#metaConfig.derive().build();\n await this.runOnSendHooks(meta, request);\n const opts = { ...meta.options, ...options };\n const result = await this.client.request<unknown, string>(request, opts);\n result.data = transformResponse(meta.allowPlainText, result.data);\n await this.runOnReceiveHooks(meta, result);\n const validated = this.#validateResponse(result, meta);\n return validated;\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 (e) {\n const cause = e as Error;\n const msg = `An error occurred while sending a request in hook: '${description}'`;\n throw new AutomationError(msg, { cause });\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 (e) {\n const cause = e as Error;\n const msg = `An error occurred while receiving a response in hook: '${description}'`;\n throw new AutomationError(msg, { cause });\n }\n }\n }\n\n #validateResponse<T>(\n response: HTTPResponse<unknown>,\n meta: MetaConfig\n ): HTTPResponse<T> {\n const { status, data } = response;\n const validated = meta.schemas.validate(\n status,\n data,\n meta.requireSchema\n ) as T;\n response.data = validated;\n return response as HTTPResponse<T>;\n }\n}\n","import { Class } from \"@autometa/types\";\nimport { defaultClient, type HTTPClient } from \"./http-client\";\n\nexport function defaultClientFactory() {\n const type = defaultClient as Class<HTTPClient>;\n return new type();\n}\n","import { RequestConfig, RequestConfigBasic } from \"./request.config\";\nimport { HTTPMethod } from \"./types\";\nimport { urlJoinP } from \"url-join-ts\";\nexport class HTTPRequest<T = unknown> implements RequestConfig<T> {\n headers: Record<string, string> = {};\n params: Record<string, string | string[] | Record<string, unknown>> = {};\n baseUrl?: string;\n route: string[] = [];\n method: HTTPMethod;\n data: T;\n\n constructor(config?: RequestConfigBasic) {\n Object.assign(this, config);\n }\n\n /**\n * Returns the full URL of the request, including the base url,\n * routes, and query parameters.\n *\n * ```ts\n * console.log(request.fullUrl())// https://example.com/foo?bar=baz?array=1,2,3\n * ```\n *\n * Note characters may be converted to escape codes. I.e (space => %20) and (comma => %2C)\n *\n * N.B this getter estimates what the url will be. The actual value\n * might be different depending on your underlying HTTPClient and\n * configuration. For example, query parameters might\n * use different array formats.\n */\n get fullUrl() {\n return urlJoinP(this.baseUrl, this.route, this.params);\n }\n\n /**\n * Returns a new independent copy of the request.\n */\n static derive(original: HTTPRequest<unknown>) {\n const request = new HTTPRequest();\n request.headers = { ...original.headers };\n request.params = { ...original.params };\n request.baseUrl = original.baseUrl;\n request.route = [...original.route];\n request.method = original.method;\n request.data = original.data;\n return request;\n }\n}\n\nexport class HTTPRequestBuilder<T extends HTTPRequest<unknown>> {\n #request: T;\n #dynamicHeaders = new Map<\n string,\n | (() => string | number | boolean | null)\n | (() => Promise<string | number | boolean | null>)\n >();\n\n constructor(request: T | (() => T) = () => new HTTPRequest() as T) {\n if (typeof request === \"function\") {\n this.#request = request();\n return;\n }\n this.#request = request;\n }\n\n static create<T extends HTTPRequest<unknown>>() {\n return new HTTPRequestBuilder<T>();\n }\n\n get request() {\n return this.#request;\n }\n\n async resolveDynamicHeaders(\n request: HTTPRequest<T> = this.#request as HTTPRequest<T>\n ) {\n for (const [name, value] of this.#dynamicHeaders) {\n try {\n if (!request.headers) request.headers = {};\n request.headers[name] = String(await value());\n } catch (e) {\n const cause = e as Error;\n const msg = `Failed to resolve dynamic header \"${name}\": \n${cause}`;\n throw new Error(msg);\n }\n }\n return this;\n }\n\n url(url: string) {\n this.#request.baseUrl = url;\n return this;\n }\n\n route(...route: string[]) {\n this.#request.route.push(...route);\n return this;\n }\n\n param(\n name: string,\n value:\n | string\n | number\n | boolean\n | (string | number | boolean)[]\n | Record<string, string | number | boolean>\n ) {\n if (Array.isArray(value)) {\n const asStr = value.flatMap(String);\n this.#request.params[name] = asStr;\n return this;\n }\n if (!Array.isArray(value) && typeof value === \"object\") {\n this.#request.params[name] = value;\n return this;\n }\n this.#request.params[name] = String(value);\n return this;\n }\n\n params(dict: Record<string, unknown>) {\n Object.assign(this.#request.params, dict);\n return this;\n }\n\n data<T>(data: T) {\n this.#request.data = data;\n return this;\n }\n\n header(\n name: string,\n value:\n | string\n | number\n | boolean\n | null\n | (string | number | boolean)[]\n | (() => string | number | boolean | null)\n | (() => Promise<string | number | boolean | null>),\n onArray: (value: (string | number | boolean)[]) => string = (value) =>\n value.join(\",\")\n ) {\n if (typeof value === \"function\") {\n if (this.#request.headers[name]) {\n delete this.#request.headers[name];\n }\n this.#dynamicHeaders.set(name, value);\n return this;\n }\n if (this.#dynamicHeaders.has(name)) {\n this.#dynamicHeaders.delete(name);\n }\n const val = Array.isArray(value) ? onArray(value) : String(value);\n this.#request.headers[name] = val;\n return this;\n }\n\n headers(dict: Record<string, string>) {\n Object.assign(this.#request.headers, dict);\n return this;\n }\n\n get() {\n return this.#request;\n }\n\n method(method: HTTPMethod) {\n this.#request.method = method;\n return this;\n }\n\n #setDynamicHeaders(\n headers: Map<\n string,\n | (() => string | number | boolean | null)\n | (() => Promise<string | number | boolean | null>)\n >\n ) {\n this.#dynamicHeaders = new Map(headers);\n return this;\n }\n\n derive(): HTTPRequestBuilder<T> {\n const request = HTTPRequest.derive(this.#request);\n return new HTTPRequestBuilder(request).#setDynamicHeaders(\n this.#dynamicHeaders\n ) as HTTPRequestBuilder<T>;\n }\n\n build(): HTTPRequest<T> {\n return this.#request as HTTPRequest<T>;\n }\n\n async buildAsync(): Promise<HTTPRequest<T>> {\n await this.resolveDynamicHeaders();\n return this.#request as HTTPRequest<T>;\n }\n}\n","import { SchemaParser, StatusCode } from \"./types\";\nexport class SchemaMap {\n #map: Map<StatusCode, SchemaParser>;\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 = new Map(map);\n }\n\n derive() {\n return new SchemaMap(this.#map);\n }\n\n registerStatus(parser: SchemaParser, ...codes: StatusCode[]) {\n codes.forEach((code) => {\n if (this.#map.has(code)) {\n const msg = `Status code ${code} is already registered with a parser`;\n throw new Error(msg);\n }\n this.#map.set(code, parser);\n });\n }\n\n registerRange(parser: SchemaParser, from: StatusCode, to: StatusCode) {\n for (let i = from; i <= to; i++) {\n if (this.#map.has(i)) {\n throw new Error(`Status code ${i} is already registered with a parser`);\n }\n this.#map.set(i, parser);\n }\n }\n\n validate(status: StatusCode, data: unknown, requireSchema: boolean) {\n const parser = this.getParser(status, requireSchema);\n if (\"parse\" in parser) {\n return parser.parse(data);\n }\n if (\"validate\" in parser) {\n return parser.validate(data);\n }\n try {\n return parser(data);\n } catch (e) {\n const msg = `Failed to schema parse response data for status code ${status} with data:\n \n${JSON.stringify(data, null, 2)}}`;\n throw new Error(msg);\n }\n }\n\n getParser(status: StatusCode, requireSchema: boolean) {\n const parser = this.#map.get(status);\n if (!parser && requireSchema) {\n const msg = `No parser registered for status code ${status} but 'requireSchema' is true`;\n throw new Error(msg);\n }\n if (parser) {\n return parser;\n }\n return (data: unknown) => data;\n }\n\n toObject() {\n return Object.fromEntries(this.#map) as Record<StatusCode, SchemaParser>;\n }\n}\n","import { SchemaMap } from \"./schema.map\";\nimport {\n HTTPAdditionalOptions,\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\n// export type MetaConfig = SchemaConfig & HTTPHooks;\n\nexport class MetaConfig implements SchemaConfig, HTTPHooks {\n schemas: SchemaMap;\n requireSchema: boolean;\n allowPlainText: boolean;\n onSend: [string, RequestHook][] = [];\n onReceive: [string, ResponseHook<unknown>][] = [];\n throwOnServerError: boolean;\n options: HTTPAdditionalOptions<unknown> = {};\n}\n\nexport class MetaConfigBuilder {\n #schemaMap = new SchemaMap();\n #requireSchema = false;\n #allowPlainText = false;\n #onBeforeSend: [string, RequestHook][] = [];\n #onAfterSend: [string, ResponseHook<unknown>][] = [];\n #throwOnServerError = false;\n #options: HTTPAdditionalOptions<unknown> = {};\n\n options(options: HTTPAdditionalOptions<unknown>) {\n this.#options = { ...options };\n return this;\n }\n schemaMap(map: SchemaMap) {\n this.#schemaMap = map;\n return this;\n }\n\n schema(parser: SchemaParser, ...codes: StatusCode[]): MetaConfigBuilder;\n schema(\n parser: SchemaParser,\n ...range: { from: StatusCode; to: StatusCode }[]\n ): MetaConfigBuilder;\n schema(\n parser: SchemaParser,\n ...args: (StatusCode | { from: StatusCode; to: StatusCode })[]\n ): MetaConfigBuilder;\n schema(\n parser: SchemaParser,\n ...args: (StatusCode | { from: StatusCode; to: StatusCode })[]\n ) {\n args.forEach((arg) => {\n if (typeof arg === \"number\") {\n this.#schemaMap.registerStatus(parser, arg);\n } else if (Array.isArray(arg)) {\n this.#schemaMap.registerStatus(parser, ...arg);\n } else {\n this.#schemaMap.registerRange(parser, arg.from, arg.to);\n }\n });\n\n return this;\n }\n\n requireSchema(value: boolean) {\n this.#requireSchema = value;\n return this;\n }\n\n allowPlainText(value: boolean) {\n this.#allowPlainText = value;\n return this;\n }\n\n onBeforeSend(description: string, hook: RequestHook) {\n this.#onBeforeSend.push([description, hook]);\n return this;\n }\n\n #setOnSend(hooks: [string, RequestHook][]) {\n this.#onBeforeSend = [...hooks];\n return this;\n }\n\n throwOnServerError(value: boolean) {\n this.#throwOnServerError = value;\n return this;\n }\n\n onReceiveResponse(description: string, hook: ResponseHook<unknown>) {\n this.#onAfterSend.push([description, hook]);\n return this;\n }\n\n #setOnReceive(hooks: [string, ResponseHook<unknown>][]) {\n this.#onAfterSend = [...hooks];\n return this;\n }\n\n build() {\n const config = new MetaConfig();\n config.schemas = this.#schemaMap.derive();\n config.requireSchema = this.#requireSchema;\n config.allowPlainText = this.#allowPlainText;\n config.onSend = this.#onBeforeSend;\n config.onReceive = this.#onAfterSend;\n config.options = this.#options;\n config.throwOnServerError = this.#throwOnServerError;\n return config;\n }\n\n derive() {\n return new MetaConfigBuilder()\n .schemaMap(this.#schemaMap.derive())\n .requireSchema(this.#requireSchema)\n .allowPlainText(this.#allowPlainText)\n .throwOnServerError(this.#throwOnServerError)\n .options(this.#options)\n .#setOnSend(this.#onBeforeSend)\n .#setOnReceive(this.#onAfterSend);\n }\n}\n","import { AutomationError } from \"@autometa/errors\";\nimport isJson from \"@stdlib/assert-is-json\";\nimport { highlight } from \"cli-highlight\";\n\nexport function transformResponse(\n allowPlainText: boolean,\n data: null | undefined | string\n) {\n if (data === null) {\n return null;\n }\n if (data === undefined) {\n return undefined;\n }\n if (data === \"\") {\n return data;\n }\n if (isJson(data)) {\n return JSON.parse(data);\n }\n if (typeof data === \"string\" && [\"true\", \"false\"].includes(data)) {\n return JSON.parse(data);\n }\n if (typeof data === \"string\" && /^\\d*\\.?\\d+$/.test(data)) {\n return JSON.parse(data);\n }\n\n if (typeof data === \"object\") {\n return data;\n }\n if (allowPlainText) {\n return data;\n }\n const dataStr = typeof data === \"string\" ? data : JSON.stringify(data);\n const response = highlight(dataStr, { language: \"html\" });\n const message = [\n `Could not parse a response as json, and this request was not configured to allow plain text responses.`,\n `To allow plain text responses, use the 'allowPlainText' method on the HTTP client.`,\n \"\",\n response,\n ];\n throw new AutomationError(message.join(\"\\n\"));\n}\n","import isJson from \"@stdlib/assert-is-json\";\n\n/**\n * Schema which does not care about data validation.\n *\n * Useful if `requireSchema` is set to true, but a specific\n * endpoints response does not matter.\n * @param data\n * @returns\n */\nexport function AnySchema(data: unknown) {\n return data;\n}\n\n/**\n * Schema which validates that a response is empty. This can mean\n * the data payload was `null`, `undefined` or the string `'null'`.\n *\n * Useful if `requireSchema` is set to true, but a specific\n * endpoints response should be null or not defined.\n * @param data\n * @returns\n */\nexport function EmptySchema(data: unknown) {\n if (data !== null && data !== undefined && data !== \"null\") {\n throw new Error(`Expected null but got <${typeof data}> for ${data}`);\n }\n return data === \"null\" ? null : data;\n}\n\n/**\n * Schema which validates a response was null.\n *\n * Useful if `requireSchema` is set to true, but a specific\n * endpoints response should be null.\n * @param data\n * @returns\n */\nexport function NullSchema(data: unknown) {\n if (data !== null && data !== \"null\") {\n throw new Error(`Expected null but got <${typeof data}> for ${data}`);\n }\n return null;\n}\n\n/**\n * Schema which validates a response was undefined.\n *\n * Useful if `requireSchema` is set to true, but a specific\n * endpoints response should be undefined.\n *\n * @param data\n * @returns\n */\nexport function UndefinedSchema(data: unknown) {\n if (data !== undefined) {\n throw new Error(`Expected undefined but got <${typeof data}> for ${data}`);\n }\n return undefined;\n}\n\n/**\n * Schema which validates a response was a boolean, or a string of value\n * `'true'` or `'false'`.\n *\n * Useful if `requireSchema` is set to true, but a specific\n * endpoints response should be a boolean.\n *\n * @param data\n * @returns\n */\nexport function BooleanSchema(data: unknown) {\n if (\n !(typeof data === \"boolean\") &&\n [\"true\", \"false\"].includes(String(data)) === false\n ) {\n throw new Error(`Expected boolean but got <${typeof data}> for ${data}`);\n }\n return JSON.parse(data as string);\n}\n\n/**\n * Schema which validates a response was a number, or a string of value\n * of a number.\n *\n * Useful if `requireSchema` is set to true, but a specific\n * endpoints response should be a number.\n *\n * @param data\n * @returns\n */\nexport function NumberSchema(data: unknown) {\n if (\n !(typeof data === \"number\") &&\n /^\\d*\\.?\\d+$/.test(String(data)) === false\n ) {\n throw new Error(`Expected number but got <${typeof data}> for ${data}`);\n }\n return JSON.parse(data as string);\n}\n\n/**\n * Schema which validates a response was a string.\n *\n * Useful if `requireSchema` is set to true, but a specific\n * endpoints response should be a string.\n *\n * @param data\n * @returns\n */\nexport function StringSchema(data: unknown) {\n if (typeof data !== \"string\") {\n throw new Error(`Expected string but got <${typeof data}> for ${data}`);\n }\n return data;\n}\n\nexport function JSONSchema<T = unknown>(data: unknown) {\n if (typeof data === \"object\") {\n return data as T;\n }\n if (!isJson(data)) {\n throw new Error(`Expected JSON but got <${typeof data}> for ${data}`);\n }\n const result = JSON.parse(data);\n return result;\n}\n"],"mappings":"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","names":["axios","value","isJson","import_errors","_request","import_assert_is_json","isJson"]}
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"]}
@@ -0,0 +1,43 @@
1
+ import type { HTTPRequest } from "./http-request";
2
+ import type { HTTPResponse } from "./http-response";
3
+ import type { HTTPAdditionalOptions } from "./types";
4
+ export interface HTTPRequestContext<TOptions = HTTPAdditionalOptions> {
5
+ request: HTTPRequest<unknown>;
6
+ options: HTTPAdditionalOptions<TOptions>;
7
+ }
8
+ export interface HTTPResponseContext<TResponse = unknown, TOptions = HTTPAdditionalOptions> {
9
+ request: HTTPRequest<unknown>;
10
+ response: HTTPResponse<TResponse>;
11
+ options: HTTPAdditionalOptions<TOptions>;
12
+ }
13
+ export interface HTTPErrorContext<TOptions = HTTPAdditionalOptions> {
14
+ request: HTTPRequest<unknown>;
15
+ options: HTTPAdditionalOptions<TOptions>;
16
+ error: unknown;
17
+ }
18
+ export interface HTTPPlugin {
19
+ name?: string;
20
+ onRequest?(context: HTTPRequestContext): Promise<void> | void;
21
+ onResponse?(context: HTTPResponseContext): Promise<void> | void;
22
+ onError?(context: HTTPErrorContext): Promise<void> | void;
23
+ }
24
+ export type HTTPLogEvent = {
25
+ type: "request";
26
+ timestamp: number;
27
+ request: HTTPRequest<unknown>;
28
+ options: HTTPAdditionalOptions<Record<string, unknown>>;
29
+ } | {
30
+ type: "response";
31
+ timestamp: number;
32
+ request: HTTPRequest<unknown>;
33
+ response: HTTPResponse<unknown>;
34
+ options: HTTPAdditionalOptions<Record<string, unknown>>;
35
+ } | {
36
+ type: "error";
37
+ timestamp: number;
38
+ request: HTTPRequest<unknown>;
39
+ error: unknown;
40
+ options: HTTPAdditionalOptions<Record<string, unknown>>;
41
+ };
42
+ export type HTTPLogSink = (event: HTTPLogEvent) => void | Promise<void>;
43
+ export declare function createLoggingPlugin(sink: HTTPLogSink): HTTPPlugin;
@@ -0,0 +1,56 @@
1
+ import { SchemaMap } from "./schema.map";
2
+ import type { HTTPAdditionalOptions, HTTPRetryOptions, RequestHook, ResponseHook, SchemaParser, StatusCode } from "./types";
3
+ export interface SchemaConfig {
4
+ schemas: SchemaMap;
5
+ requireSchema: boolean;
6
+ allowPlainText: boolean;
7
+ }
8
+ export interface HTTPHooks {
9
+ onSend: [string, RequestHook][];
10
+ onReceive: [string, ResponseHook<unknown>][];
11
+ }
12
+ export declare class MetaConfig implements SchemaConfig, HTTPHooks {
13
+ schemas: SchemaMap;
14
+ requireSchema: boolean;
15
+ allowPlainText: boolean;
16
+ onSend: [string, RequestHook][];
17
+ onReceive: [string, ResponseHook<unknown>][];
18
+ throwOnServerError: boolean;
19
+ options: HTTPAdditionalOptions<unknown>;
20
+ retry?: HTTPRetryOptions;
21
+ streamResponse: boolean;
22
+ timeoutMs: number | undefined;
23
+ constructor(init?: Partial<MetaConfig>);
24
+ }
25
+ export declare class MetaConfigBuilder {
26
+ private schemaMapValue;
27
+ private requireSchemaValue;
28
+ private allowPlainTextValue;
29
+ private onBeforeSendHooks;
30
+ private onAfterReceiveHooks;
31
+ private throwOnServerErrorValue;
32
+ private optionsValue;
33
+ private retryOptionsValue;
34
+ private streamResponseValue;
35
+ private timeoutMsValue;
36
+ merge(builder: MetaConfigBuilder): this;
37
+ schemaMap(map: SchemaMap): this;
38
+ schema(parser: SchemaParser, ...codes: StatusCode[]): MetaConfigBuilder;
39
+ schema(parser: SchemaParser, ...ranges: {
40
+ from: StatusCode;
41
+ to: StatusCode;
42
+ }[]): MetaConfigBuilder;
43
+ requireSchema(value: boolean): this;
44
+ allowPlainText(value: boolean): this;
45
+ onBeforeSend(description: string, hook: RequestHook): this;
46
+ onReceiveResponse(description: string, hook: ResponseHook<unknown>): this;
47
+ throwOnServerError(value: boolean): this;
48
+ options(options: HTTPAdditionalOptions<unknown>): this;
49
+ retry(options: HTTPRetryOptions | null): this;
50
+ streamResponse(value: boolean): this;
51
+ timeout(duration: number | null | undefined): this;
52
+ build(): MetaConfig;
53
+ derive(): MetaConfigBuilder;
54
+ private setOnBeforeSend;
55
+ private setOnAfterReceive;
56
+ }
@@ -0,0 +1,11 @@
1
+ import type { SchemaParser, StatusCode } from "./types";
2
+ export declare class SchemaMap {
3
+ private map;
4
+ constructor(map?: Map<StatusCode, SchemaParser> | SchemaMap);
5
+ derive(): SchemaMap;
6
+ registerStatus(parser: SchemaParser, ...codes: StatusCode[]): void;
7
+ registerRange(parser: SchemaParser, from: StatusCode, to: StatusCode): void;
8
+ validate(status: StatusCode, data: unknown, requireSchema: boolean): unknown;
9
+ getParser(status: StatusCode, requireSchema: boolean): SchemaParser | null;
10
+ toObject(): Record<StatusCode, SchemaParser>;
11
+ }
@@ -0,0 +1 @@
1
+ export declare function transformResponse(allowPlainText: boolean, data: unknown): unknown;
@@ -0,0 +1,11 @@
1
+ import type { HTTPRequest } from "./http-request";
2
+ import type { HTTPAdditionalOptions, StatusCode } from "./types";
3
+ export interface HTTPTransportResponse<T = unknown> {
4
+ status: StatusCode;
5
+ statusText: string;
6
+ headers: Record<string, string | string[]>;
7
+ data: T;
8
+ }
9
+ export interface HTTPTransport<TOptions = Record<string, unknown>> {
10
+ send<TRequest, TResponse>(request: HTTPRequest<TRequest>, options: HTTPAdditionalOptions<TOptions>): Promise<HTTPTransportResponse<TResponse>>;
11
+ }