@zimic/fetch 1.2.4-canary.6 → 1.2.5-canary.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -37,7 +37,7 @@ type FetchRequestInitWithSearchParams<SearchParamsSchema extends HttpSearchParam
37
37
  } : {
38
38
  searchParams: HttpSearchParamsInit<Default<SearchParamsSchema>>;
39
39
  };
40
- type FetchRequestBodySchema<RequestSchema extends HttpRequestSchema> = 'body' extends keyof RequestSchema ? [RequestSchema['body']] extends [never] ? null | undefined : [Extract<RequestSchema['body'], BodyInit | HttpSearchParams | HttpFormData>] extends [never] ? undefined extends RequestSchema['body'] ? JSONStringified<Exclude<RequestSchema['body'], null | undefined>> | null | undefined : JSONStringified<Exclude<RequestSchema['body'], null>> | Extract<RequestSchema['body'], null> : undefined extends RequestSchema['body'] ? RequestSchema['body'] | null : RequestSchema['body'] : null | undefined;
40
+ type FetchRequestBodySchema<RequestSchema extends HttpRequestSchema> = 'body' extends keyof RequestSchema ? [RequestSchema['body']] extends [never] ? null | undefined : [Extract<RequestSchema['body'], BodyInit | HttpSearchParams | HttpFormData>] extends [never] ? undefined extends RequestSchema['body'] ? JSONStringified<Exclude<RequestSchema['body'], null | undefined>> | null | undefined : JSONStringified<Exclude<RequestSchema['body'], null>> | Extract<RequestSchema['body'], null> : undefined extends RequestSchema['body'] ? RequestSchema['body'] : RequestSchema['body'] : null | undefined;
41
41
  type FetchRequestInitWithBody<BodySchema extends HttpBody> = [BodySchema] extends [never] ? {
42
42
  body?: BodySchema;
43
43
  } : undefined extends BodySchema ? {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client/errors/FetchResponseError.ts","../../zimic-utils/src/url/createRegexFromPath.ts","../../zimic-utils/src/url/excludeNonPathParams.ts","../../zimic-utils/src/url/joinURL.ts","../src/client/FetchClient.ts","../src/client/factory.ts"],"names":["HttpHeaders","parseHttpBody","Request","HttpSearchParams"],"mappings":"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","file":"index.js","sourcesContent":["import {\n HttpHeaders,\n HttpHeadersSchema,\n HttpSchema,\n HttpSchemaMethod,\n HttpSchemaPath,\n parseHttpBody,\n} from '@zimic/http';\nimport { PossiblePromise } from '@zimic/utils/types';\n\nimport { FetchRequest, FetchRequestObject, FetchResponse, FetchResponseObject } from '../types/requests';\n\n/** @see {@link https://zimic.dev/docs/fetch/api/fetch-response-error#errortoobject `fetchResponseError.toObject()` API reference} */\nexport interface FetchResponseErrorObjectOptions {\n /** @see {@link https://zimic.dev/docs/fetch/api/fetch-response-error#errortoobject `fetchResponseError.toObject()` API reference} */\n includeRequestBody?: boolean;\n /** @see {@link https://zimic.dev/docs/fetch/api/fetch-response-error#errortoobject `fetchResponseError.toObject()` API reference} */\n includeResponseBody?: boolean;\n}\n\nexport namespace FetchResponseErrorObjectOptions {\n /**\n * Options for converting a {@link FetchResponseError `FetchResponseError`} into a plain object, including the body of\n * the request and/or response.\n */\n export type WithBody = FetchResponseErrorObjectOptions &\n ({ includeRequestBody: true } | { includeResponseBody: true });\n\n /**\n * Options for converting a {@link FetchResponseError `FetchResponseError`} into a plain object, excluding the body of\n * the request and/or response.\n */\n export type WithoutBody = FetchResponseErrorObjectOptions &\n ({ includeRequestBody?: false } | { includeResponseBody?: false });\n}\n\n/**\n * A plain object representation of a {@link FetchResponseError `FetchResponseError`}, compatible with JSON. It is useful\n * for serialization, debugging, and logging purposes.\n *\n * @see {@link https://zimic.dev/docs/fetch/api/fetch-response-error#errortoobject `fetchResponseError.toObject()` API reference}\n */\nexport interface FetchResponseErrorObject {\n name: string;\n message: string;\n request: FetchRequestObject;\n response: FetchResponseObject;\n}\n\n/** @see {@link https://zimic.dev/docs/fetch/api/fetch-response-error `FetchResponseError` API reference} */\nclass FetchResponseError<\n Schema extends HttpSchema,\n Method extends HttpSchemaMethod<Schema>,\n Path extends HttpSchemaPath.Literal<Schema, Method>,\n> extends Error {\n constructor(\n public request: FetchRequest<Schema, Method, Path>,\n public response: FetchResponse<Schema, Method, Path, true, 'manual'>,\n ) {\n super(`${request.method} ${request.url} failed with status ${response.status}: ${response.statusText}`);\n this.name = 'FetchResponseError';\n }\n\n /** @see {@link https://zimic.dev/docs/fetch/api/fetch-response-error#errortoobject `fetchResponseError.toObject()` API reference} */\n toObject(options: FetchResponseErrorObjectOptions.WithBody): Promise<FetchResponseErrorObject>;\n toObject(options?: FetchResponseErrorObjectOptions.WithoutBody): FetchResponseErrorObject;\n toObject(options?: FetchResponseErrorObjectOptions): PossiblePromise<FetchResponseErrorObject>;\n toObject({\n includeRequestBody = false,\n includeResponseBody = false,\n }: FetchResponseErrorObjectOptions = {}): PossiblePromise<FetchResponseErrorObject> {\n const partialObject = {\n name: this.name,\n message: this.message,\n } satisfies Partial<FetchResponseErrorObject>;\n\n if (!includeRequestBody && !includeResponseBody) {\n return {\n ...partialObject,\n request: this.requestToObject({ includeBody: false }),\n response: this.responseToObject({ includeBody: false }),\n };\n }\n\n return Promise.all([\n Promise.resolve(this.requestToObject({ includeBody: includeRequestBody })),\n Promise.resolve(this.responseToObject({ includeBody: includeResponseBody })),\n ]).then(([request, response]) => ({ ...partialObject, request, response }));\n }\n\n private requestToObject(options: { includeBody: true }): Promise<FetchRequestObject>;\n private requestToObject(options: { includeBody: false }): FetchRequestObject;\n private requestToObject(options: { includeBody: boolean }): PossiblePromise<FetchRequestObject>;\n private requestToObject(options: { includeBody: boolean }): PossiblePromise<FetchRequestObject> {\n const request = this.request;\n\n const requestObject: FetchRequestObject = {\n url: request.url,\n path: request.path,\n method: request.method,\n headers: this.convertHeadersToObject(request),\n cache: request.cache,\n destination: request.destination,\n credentials: request.credentials,\n integrity: request.integrity,\n keepalive: request.keepalive,\n mode: request.mode,\n redirect: request.redirect,\n referrer: request.referrer,\n referrerPolicy: request.referrerPolicy,\n };\n\n if (!options.includeBody) {\n return requestObject;\n }\n\n return this.withIncludedBodyIfAvailable('request', requestObject);\n }\n\n private responseToObject(options: { includeBody: true }): Promise<FetchResponseObject>;\n private responseToObject(options: { includeBody: false }): FetchResponseObject;\n private responseToObject(options: { includeBody: boolean }): PossiblePromise<FetchResponseObject>;\n private responseToObject(options: { includeBody: boolean }): PossiblePromise<FetchResponseObject> {\n const response = this.response;\n\n const responseObject: FetchResponseObject = {\n url: response.url,\n type: response.type,\n status: response.status,\n statusText: response.statusText,\n ok: response.ok,\n headers: this.convertHeadersToObject(response),\n redirected: response.redirected,\n };\n\n if (!options.includeBody) {\n return responseObject;\n }\n\n return this.withIncludedBodyIfAvailable('response', responseObject);\n }\n\n private convertHeadersToObject(\n resource: FetchRequest<Schema, Method, Path> | FetchResponse<Schema, Method, Path, true, 'manual'>,\n ): HttpHeadersSchema {\n return HttpHeaders.prototype.toObject.call(resource.headers) as HttpHeadersSchema;\n }\n\n private withIncludedBodyIfAvailable(\n resourceType: 'request',\n resourceObject: FetchRequestObject,\n ): PossiblePromise<FetchRequestObject>;\n private withIncludedBodyIfAvailable(\n resourceType: 'response',\n resourceObject: FetchResponseObject,\n ): PossiblePromise<FetchResponseObject>;\n private withIncludedBodyIfAvailable(\n resourceType: 'request' | 'response',\n resourceObject: FetchRequestObject | FetchResponseObject,\n ): PossiblePromise<FetchRequestObject | FetchResponseObject> {\n const resource = this[resourceType] as Request | Response;\n\n if (resource.bodyUsed) {\n console.warn(\n '[@zimic/fetch]',\n `Could not include the ${resourceType} body because it is already used. ` +\n 'If you access the body before calling `error.toObject()`, consider reading it from a cloned ' +\n `${resourceType}.\\n\\nLearn more: https://zimic.dev/docs/fetch/api/fetch-response-error#errortoobject`,\n );\n return resourceObject;\n }\n\n return parseHttpBody(resource)\n .then((body) => {\n resourceObject.body = body;\n return resourceObject;\n })\n .catch((error: unknown) => {\n console.error('[@zimic/fetch]', `Failed to parse ${resourceType} body:`, error);\n return resourceObject;\n });\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyFetchRequestError = FetchResponseError<any, any, any>;\n\nexport default FetchResponseError;\n","export function createPathCharactersToEscapeRegex() {\n return /([.(){}+$])/g;\n}\n\nexport function preparePathForRegex(path: string) {\n // We encode the path using the URL API because, differently from encodeURI and encodeURIComponent, URL does not\n // re-encode already encoded characters. Since URL requires a full URL, we use a data scheme and strip it later.\n const pathURLPrefix = `data:${path.startsWith('/') ? '' : '/'}`;\n const pathAsURL = new URL(`${pathURLPrefix}${path}`);\n const encodedPath = pathAsURL.href.replace(pathURLPrefix, '');\n\n return encodedPath.replace(/^\\/+/g, '').replace(/\\/+$/g, '').replace(createPathCharactersToEscapeRegex(), '\\\\$1');\n}\n\n// Path params names must match the JavaScript identifier pattern.\n// See // https://developer.mozilla.org/docs/Web/JavaScript/Reference/Lexical_grammar#identifiers.\nexport function createPathParamRegex() {\n return /(?<escape>\\\\)?:(?<identifier>[$_\\p{ID_Start}][$\\p{ID_Continue}]+)(?!\\\\[*+?])/gu;\n}\n\nexport function createRepeatingPathParamRegex() {\n return /(?<escape>\\\\)?:(?<identifier>[$_\\p{ID_Start}][$\\p{ID_Continue}]+)\\\\\\+/gu;\n}\n\nexport function createOptionalPathParamRegex() {\n return /(?<leadingSlash>\\/)?(?<escape>\\\\)?:(?<identifier>[$_\\p{ID_Start}][$\\p{ID_Continue}]+)\\?(?<trailingSlash>\\/)?/gu;\n}\n\nexport function createOptionalRepeatingPathParamRegex() {\n return /(?<leadingSlash>\\/)?(?<escape>\\\\)?:(?<identifier>[$_\\p{ID_Start}][$\\p{ID_Continue}]+)\\*(?<trailingSlash>\\/)?/gu;\n}\n\nfunction createRegexFromPath(path: string) {\n const pathRegexContent = preparePathForRegex(path)\n .replace(\n createOptionalRepeatingPathParamRegex(),\n (\n _match,\n leadingSlash: string | undefined,\n escape: string | undefined,\n identifier: string,\n trailingSlash: string | undefined,\n ) => {\n if (escape) {\n return `${leadingSlash ?? ''}:${identifier}\\\\*${trailingSlash ?? ''}`;\n }\n\n const hasSegmentBeforePrefix = leadingSlash === '/';\n const prefixExpression = hasSegmentBeforePrefix ? '/?' : leadingSlash;\n\n const hasSegmentAfterSuffix = trailingSlash === '/';\n const suffixExpression = hasSegmentAfterSuffix ? '/?' : trailingSlash;\n\n if (prefixExpression && suffixExpression) {\n return `(?:${prefixExpression}(?<${identifier}>.+?)?${suffixExpression})?`;\n } else if (prefixExpression) {\n return `(?:${prefixExpression}(?<${identifier}>.+?))?`;\n } else if (suffixExpression) {\n return `(?:(?<${identifier}>.+?)${suffixExpression})?`;\n } else {\n return `(?<${identifier}>.+?)?`;\n }\n },\n )\n .replace(createRepeatingPathParamRegex(), (_match, escape: string | undefined, identifier: string) => {\n return escape ? `:${identifier}\\\\+` : `(?<${identifier}>.+)`;\n })\n .replace(\n createOptionalPathParamRegex(),\n (\n _match,\n leadingSlash: string | undefined,\n escape: string | undefined,\n identifier: string,\n trailingSlash: string | undefined,\n ) => {\n if (escape) {\n return `${leadingSlash ?? ''}:${identifier}\\\\?${trailingSlash ?? ''}`;\n }\n\n const hasSegmentBeforePrefix = leadingSlash === '/';\n const prefixExpression = hasSegmentBeforePrefix ? '/?' : leadingSlash;\n\n const hasSegmentAfterSuffix = trailingSlash === '/';\n const suffixExpression = hasSegmentAfterSuffix ? '/?' : trailingSlash;\n\n if (prefixExpression && suffixExpression) {\n return `(?:${prefixExpression}(?<${identifier}>[^\\\\/]+?)?${suffixExpression})`;\n } else if (prefixExpression) {\n return `(?:${prefixExpression}(?<${identifier}>[^\\\\/]+?))?`;\n } else if (suffixExpression) {\n return `(?:(?<${identifier}>[^\\\\/]+?)${suffixExpression})?`;\n } else {\n return `(?<${identifier}>[^\\\\/]+?)?`;\n }\n },\n )\n .replace(createPathParamRegex(), (_match, escape: string | undefined, identifier: string) => {\n return escape ? `:${identifier}` : `(?<${identifier}>[^\\\\/]+?)`;\n });\n\n return new RegExp(`^/?${pathRegexContent}/?$`);\n}\n\nexport default createRegexFromPath;\n","function excludeNonPathParams(url: URL) {\n url.hash = '';\n url.search = '';\n url.username = '';\n url.password = '';\n return url;\n}\n\nexport default excludeNonPathParams;\n","function joinURL(...parts: (URL | string)[]) {\n return parts\n .map((part, index) => {\n const isFirstPart = index === 0;\n const isLastPart = index === parts.length - 1;\n\n let partAsString = part.toString();\n\n if (!isFirstPart) {\n partAsString = partAsString.replace(/^\\//, '');\n }\n if (!isLastPart) {\n partAsString = partAsString.replace(/\\/$/, '');\n }\n\n return partAsString;\n })\n .filter((part) => part.length > 0)\n .join('/');\n}\n\nexport default joinURL;\n","import {\n HttpSchemaPath,\n HttpSchemaMethod,\n HttpSearchParams,\n LiteralHttpSchemaPathFromNonLiteral,\n HttpSchema,\n HttpHeaders,\n} from '@zimic/http';\nimport createRegexFromPath from '@zimic/utils/url/createRegexFromPath';\nimport excludeNonPathParams from '@zimic/utils/url/excludeNonPathParams';\nimport joinURL from '@zimic/utils/url/joinURL';\n\nimport FetchResponseError from './errors/FetchResponseError';\nimport { FetchInput, FetchOptions, Fetch, FetchDefaults } from './types/public';\nimport { FetchRequestConstructor, FetchRequestInit, FetchRequest, FetchResponse } from './types/requests';\n\nclass FetchClient<Schema extends HttpSchema> implements Omit<Fetch<Schema>, 'loose' | 'Request' | keyof FetchDefaults> {\n fetch: Fetch<Schema>;\n\n constructor({ headers = {}, searchParams = {}, ...otherOptions }: FetchOptions<Schema>) {\n this.fetch = this.createFetchFunction();\n this.fetch.headers = headers;\n this.fetch.searchParams = searchParams;\n Object.assign(this.fetch, otherOptions);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.fetch.loose = this.fetch as Fetch<any> as Fetch.Loose;\n this.fetch.Request = this.createRequestClass(this.fetch);\n }\n\n get defaults(): FetchDefaults {\n return this.fetch;\n }\n\n private createFetchFunction() {\n const fetch = async <\n Method extends HttpSchemaMethod<Schema>,\n Path extends HttpSchemaPath.NonLiteral<Schema, Method>,\n >(\n input: FetchInput<Schema, Method, Path>,\n init: FetchRequestInit<Schema, Method, LiteralHttpSchemaPathFromNonLiteral<Schema, Method, Path>>,\n ) => {\n const request = await this.createFetchRequest<Method, Path>(input, init);\n const requestClone = request.clone();\n\n const rawResponse = await globalThis.fetch(\n // Optimize type checking by narrowing the type of request\n requestClone as Request,\n );\n const response = await this.createFetchResponse<\n Method,\n LiteralHttpSchemaPathFromNonLiteral<Schema, Method, Path>\n >(request, rawResponse);\n\n return response;\n };\n\n Object.setPrototypeOf(fetch, this);\n\n return fetch as Fetch<Schema>;\n }\n\n private async createFetchRequest<\n Method extends HttpSchemaMethod<Schema>,\n Path extends HttpSchemaPath.NonLiteral<Schema, Method>,\n >(\n input: FetchInput<Schema, Method, Path>,\n init: FetchRequestInit<Schema, Method, LiteralHttpSchemaPathFromNonLiteral<Schema, Method, Path>>,\n ) {\n let request = input instanceof Request ? input : new this.fetch.Request(input, init);\n\n if (this.fetch.onRequest) {\n const requestAfterInterceptor = await this.fetch.onRequest(\n // Optimize type checking by narrowing the type of request\n request as FetchRequest.Loose,\n );\n\n if (requestAfterInterceptor !== request) {\n const isFetchRequest = requestAfterInterceptor instanceof this.fetch.Request;\n\n request = isFetchRequest\n ? (requestAfterInterceptor as Request as typeof request)\n : new this.fetch.Request(requestAfterInterceptor as FetchInput<Schema, Method, Path>, init);\n }\n }\n\n return request;\n }\n\n private async createFetchResponse<\n Method extends HttpSchemaMethod<Schema>,\n Path extends HttpSchemaPath.Literal<Schema, Method>,\n >(fetchRequest: FetchRequest<Schema, Method, Path>, rawResponse: Response) {\n let response = this.defineFetchResponseProperties<Method, Path>(fetchRequest, rawResponse);\n\n if (this.fetch.onResponse) {\n const responseAfterInterceptor = await this.fetch.onResponse(\n // Optimize type checking by narrowing the type of response\n response as FetchResponse.Loose,\n );\n\n const isFetchResponse =\n responseAfterInterceptor instanceof Response &&\n 'request' in responseAfterInterceptor &&\n responseAfterInterceptor.request instanceof this.fetch.Request;\n\n response = isFetchResponse\n ? (responseAfterInterceptor as typeof response)\n : this.defineFetchResponseProperties<Method, Path>(fetchRequest, responseAfterInterceptor);\n }\n\n return response;\n }\n\n private defineFetchResponseProperties<\n Method extends HttpSchemaMethod<Schema>,\n Path extends HttpSchemaPath.Literal<Schema, Method>,\n >(fetchRequest: FetchRequest<Schema, Method, Path>, response: Response) {\n const fetchResponse = response as FetchResponse<Schema, Method, Path>;\n\n Object.defineProperty(fetchResponse, 'request', {\n value: fetchRequest,\n writable: false,\n enumerable: true,\n configurable: false,\n });\n\n let responseError: FetchResponse.Loose['error'] | undefined;\n\n Object.defineProperty(fetchResponse, 'error', {\n get() {\n if (responseError === undefined) {\n responseError = fetchResponse.ok\n ? null\n : new FetchResponseError(\n fetchRequest,\n fetchResponse as FetchResponse<Schema, Method, Path, true, 'manual'>,\n );\n }\n return responseError;\n },\n enumerable: true,\n configurable: false,\n });\n\n return fetchResponse;\n }\n\n private createRequestClass(fetch: Fetch<Schema>) {\n class Request<\n Method extends HttpSchemaMethod<Schema>,\n Path extends HttpSchemaPath.NonLiteral<Schema, Method>,\n > extends globalThis.Request {\n path: LiteralHttpSchemaPathFromNonLiteral<Schema, Method, Path>;\n\n constructor(input: FetchInput<Schema, Method, Path>, init?: FetchRequestInit.Loose) {\n let actualInput: URL | globalThis.Request;\n\n const actualInit = {\n baseURL: init?.baseURL ?? fetch.baseURL,\n method: init?.method ?? fetch.method,\n headers: new HttpHeaders(fetch.headers),\n searchParams: new HttpSearchParams(fetch.searchParams),\n body: init?.body ?? fetch.body,\n mode: init?.mode ?? fetch.mode,\n cache: init?.cache ?? fetch.cache,\n credentials: init?.credentials ?? fetch.credentials,\n integrity: init?.integrity ?? fetch.integrity,\n keepalive: init?.keepalive ?? fetch.keepalive,\n priority: init?.priority ?? fetch.priority,\n redirect: init?.redirect ?? fetch.redirect,\n referrer: init?.referrer ?? fetch.referrer,\n referrerPolicy: init?.referrerPolicy ?? fetch.referrerPolicy,\n signal: init?.signal ?? fetch.signal,\n window: init?.window === undefined ? fetch.window : init.window,\n duplex: init?.duplex ?? fetch.duplex,\n };\n\n if (init?.headers) {\n actualInit.headers.assign(new HttpHeaders(init.headers));\n }\n\n let url: URL;\n const baseURL = new URL(actualInit.baseURL);\n\n if (input instanceof globalThis.Request) {\n const request = input as globalThis.Request;\n\n actualInit.headers.assign(new HttpHeaders(request.headers));\n\n url = new URL(input.url);\n\n actualInput = request;\n } else {\n url = new URL(input instanceof URL ? input : joinURL(baseURL, input));\n\n actualInit.searchParams.assign(new HttpSearchParams(url.searchParams));\n\n if (init?.searchParams) {\n actualInit.searchParams.assign(new HttpSearchParams(init.searchParams));\n }\n\n url.search = actualInit.searchParams.toString();\n\n actualInput = url;\n }\n\n super(actualInput, actualInit);\n\n const baseURLWithoutTrailingSlash = baseURL.toString().replace(/\\/$/, '');\n\n this.path = excludeNonPathParams(url)\n .toString()\n .replace(baseURLWithoutTrailingSlash, '') as LiteralHttpSchemaPathFromNonLiteral<Schema, Method, Path>;\n }\n\n clone(): this {\n const rawClone = super.clone();\n return new Request(rawClone as FetchInput<Schema, Method, Path>) as this;\n }\n }\n\n return Request as FetchRequestConstructor<Schema>;\n }\n\n isRequest<Path extends HttpSchemaPath.Literal<Schema, Method>, Method extends HttpSchemaMethod<Schema>>(\n request: unknown,\n method: Method,\n path: Path,\n ): request is FetchRequest<Schema, Method, Path> {\n return (\n request instanceof Request &&\n request.method === method &&\n 'path' in request &&\n typeof request.path === 'string' &&\n createRegexFromPath(path).test(request.path)\n );\n }\n\n isResponse<Path extends HttpSchemaPath.Literal<Schema, Method>, Method extends HttpSchemaMethod<Schema>>(\n response: unknown,\n method: Method,\n path: Path,\n ): response is FetchResponse<Schema, Method, Path> {\n return (\n response instanceof Response &&\n 'request' in response &&\n this.isRequest(response.request, method, path) &&\n 'error' in response &&\n (response.error === null || response.error instanceof FetchResponseError)\n );\n }\n\n isResponseError<Path extends HttpSchemaPath.Literal<Schema, Method>, Method extends HttpSchemaMethod<Schema>>(\n error: unknown,\n method: Method,\n path: Path,\n ): error is FetchResponseError<Schema, Method, Path> {\n return (\n error instanceof FetchResponseError &&\n this.isRequest(error.request, method, path) &&\n this.isResponse(error.response, method, path)\n );\n }\n}\n\nexport default FetchClient;\n","import { HttpSchema } from '@zimic/http';\n\nimport FetchClient from './FetchClient';\nimport { FetchOptions, Fetch } from './types/public';\n\n/** @see {@link https://zimic.dev/docs/fetch/api/create-fetch `createFetch` API reference} */\nfunction createFetch<Schema extends HttpSchema>(options: FetchOptions<Schema>): Fetch<Schema> {\n const { fetch } = new FetchClient<Schema>(options);\n return fetch;\n}\n\nexport default createFetch;\n"]}
1
+ {"version":3,"sources":["../src/client/errors/FetchResponseError.ts","../../zimic-utils/src/url/createRegexFromPath.ts","../../zimic-utils/src/url/excludeNonPathParams.ts","../../zimic-utils/src/url/joinURL.ts","../src/client/FetchClient.ts","../src/client/factory.ts"],"names":["HttpHeaders","parseHttpBody","Request","HttpSearchParams"],"mappings":"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","file":"index.js","sourcesContent":["import {\n HttpHeaders,\n HttpHeadersSchema,\n HttpSchema,\n HttpSchemaMethod,\n HttpSchemaPath,\n parseHttpBody,\n} from '@zimic/http';\nimport { PossiblePromise } from '@zimic/utils/types';\n\nimport { FetchRequest, FetchRequestObject, FetchResponse, FetchResponseObject } from '../types/requests';\n\n/** @see {@link https://zimic.dev/docs/fetch/api/fetch-response-error#errortoobject `fetchResponseError.toObject()` API reference} */\nexport interface FetchResponseErrorObjectOptions {\n /** @see {@link https://zimic.dev/docs/fetch/api/fetch-response-error#errortoobject `fetchResponseError.toObject()` API reference} */\n includeRequestBody?: boolean;\n /** @see {@link https://zimic.dev/docs/fetch/api/fetch-response-error#errortoobject `fetchResponseError.toObject()` API reference} */\n includeResponseBody?: boolean;\n}\n\nexport namespace FetchResponseErrorObjectOptions {\n /**\n * Options for converting a {@link FetchResponseError `FetchResponseError`} into a plain object, including the body of\n * the request and/or response.\n */\n export type WithBody = FetchResponseErrorObjectOptions &\n ({ includeRequestBody: true } | { includeResponseBody: true });\n\n /**\n * Options for converting a {@link FetchResponseError `FetchResponseError`} into a plain object, excluding the body of\n * the request and/or response.\n */\n export type WithoutBody = FetchResponseErrorObjectOptions &\n ({ includeRequestBody?: false } | { includeResponseBody?: false });\n}\n\n/**\n * A plain object representation of a {@link FetchResponseError `FetchResponseError`}, compatible with JSON. It is useful\n * for serialization, debugging, and logging purposes.\n *\n * @see {@link https://zimic.dev/docs/fetch/api/fetch-response-error#errortoobject `fetchResponseError.toObject()` API reference}\n */\nexport interface FetchResponseErrorObject {\n name: string;\n message: string;\n request: FetchRequestObject;\n response: FetchResponseObject;\n}\n\n/** @see {@link https://zimic.dev/docs/fetch/api/fetch-response-error `FetchResponseError` API reference} */\nclass FetchResponseError<\n Schema extends HttpSchema,\n Method extends HttpSchemaMethod<Schema>,\n Path extends HttpSchemaPath.Literal<Schema, Method>,\n> extends Error {\n constructor(\n public request: FetchRequest<Schema, Method, Path>,\n public response: FetchResponse<Schema, Method, Path, true, 'manual'>,\n ) {\n super(`${request.method} ${request.url} failed with status ${response.status}: ${response.statusText}`);\n this.name = 'FetchResponseError';\n }\n\n /** @see {@link https://zimic.dev/docs/fetch/api/fetch-response-error#errortoobject `fetchResponseError.toObject()` API reference} */\n toObject(options: FetchResponseErrorObjectOptions.WithBody): Promise<FetchResponseErrorObject>;\n toObject(options?: FetchResponseErrorObjectOptions.WithoutBody): FetchResponseErrorObject;\n toObject(options?: FetchResponseErrorObjectOptions): PossiblePromise<FetchResponseErrorObject>;\n toObject({\n includeRequestBody = false,\n includeResponseBody = false,\n }: FetchResponseErrorObjectOptions = {}): PossiblePromise<FetchResponseErrorObject> {\n const partialObject = {\n name: this.name,\n message: this.message,\n } satisfies Partial<FetchResponseErrorObject>;\n\n if (!includeRequestBody && !includeResponseBody) {\n return {\n ...partialObject,\n request: this.requestToObject({ includeBody: false }),\n response: this.responseToObject({ includeBody: false }),\n };\n }\n\n return Promise.all([\n Promise.resolve(this.requestToObject({ includeBody: includeRequestBody })),\n Promise.resolve(this.responseToObject({ includeBody: includeResponseBody })),\n ]).then(([request, response]) => ({ ...partialObject, request, response }));\n }\n\n private requestToObject(options: { includeBody: true }): Promise<FetchRequestObject>;\n private requestToObject(options: { includeBody: false }): FetchRequestObject;\n private requestToObject(options: { includeBody: boolean }): PossiblePromise<FetchRequestObject>;\n private requestToObject(options: { includeBody: boolean }): PossiblePromise<FetchRequestObject> {\n const request = this.request;\n\n const requestObject: FetchRequestObject = {\n url: request.url,\n path: request.path,\n method: request.method,\n headers: this.convertHeadersToObject(request),\n cache: request.cache,\n destination: request.destination,\n credentials: request.credentials,\n integrity: request.integrity,\n keepalive: request.keepalive,\n mode: request.mode,\n redirect: request.redirect,\n referrer: request.referrer,\n referrerPolicy: request.referrerPolicy,\n };\n\n if (!options.includeBody) {\n return requestObject;\n }\n\n return this.withIncludedBodyIfAvailable('request', requestObject);\n }\n\n private responseToObject(options: { includeBody: true }): Promise<FetchResponseObject>;\n private responseToObject(options: { includeBody: false }): FetchResponseObject;\n private responseToObject(options: { includeBody: boolean }): PossiblePromise<FetchResponseObject>;\n private responseToObject(options: { includeBody: boolean }): PossiblePromise<FetchResponseObject> {\n const response = this.response;\n\n const responseObject: FetchResponseObject = {\n url: response.url,\n type: response.type,\n status: response.status,\n statusText: response.statusText,\n ok: response.ok,\n headers: this.convertHeadersToObject(response),\n redirected: response.redirected,\n };\n\n if (!options.includeBody) {\n return responseObject;\n }\n\n return this.withIncludedBodyIfAvailable('response', responseObject);\n }\n\n private convertHeadersToObject(\n resource: FetchRequest<Schema, Method, Path> | FetchResponse<Schema, Method, Path, true, 'manual'>,\n ): HttpHeadersSchema {\n return HttpHeaders.prototype.toObject.call(resource.headers) as HttpHeadersSchema;\n }\n\n private withIncludedBodyIfAvailable(\n resourceType: 'request',\n resourceObject: FetchRequestObject,\n ): PossiblePromise<FetchRequestObject>;\n private withIncludedBodyIfAvailable(\n resourceType: 'response',\n resourceObject: FetchResponseObject,\n ): PossiblePromise<FetchResponseObject>;\n private withIncludedBodyIfAvailable(\n resourceType: 'request' | 'response',\n resourceObject: FetchRequestObject | FetchResponseObject,\n ): PossiblePromise<FetchRequestObject | FetchResponseObject> {\n const resource = this[resourceType] as Request | Response;\n\n if (resource.bodyUsed) {\n console.warn(\n '[@zimic/fetch]',\n `Could not include the ${resourceType} body because it is already used. ` +\n 'If you access the body before calling `error.toObject()`, consider reading it from a cloned ' +\n `${resourceType}.\\n\\nLearn more: https://zimic.dev/docs/fetch/api/fetch-response-error#errortoobject`,\n );\n return resourceObject;\n }\n\n return parseHttpBody(resource)\n .then((body) => {\n resourceObject.body = body;\n return resourceObject;\n })\n .catch((error: unknown) => {\n console.error('[@zimic/fetch]', `Failed to parse ${resourceType} body:`, error);\n return resourceObject;\n });\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyFetchRequestError = FetchResponseError<any, any, any>;\n\nexport default FetchResponseError;\n","export function createPathCharactersToEscapeRegex() {\n return /([.(){}+$])/g;\n}\n\nexport function preparePathForRegex(path: string) {\n // We encode the path using the URL API because, differently from encodeURI and encodeURIComponent, URL does not\n // re-encode already encoded characters. Since URL requires a full URL, we use a data scheme and strip it later.\n const pathURLPrefix = `data:${path.startsWith('/') ? '' : '/'}`;\n const pathAsURL = new URL(`${pathURLPrefix}${path}`);\n const encodedPath = pathAsURL.href.replace(pathURLPrefix, '');\n\n return encodedPath.replace(/^\\/+/g, '').replace(/\\/+$/g, '').replace(createPathCharactersToEscapeRegex(), '\\\\$1');\n}\n\n// Path params names must match the JavaScript identifier pattern.\n// See // https://developer.mozilla.org/docs/Web/JavaScript/Reference/Lexical_grammar#identifiers.\nexport function createPathParamRegex() {\n return /(?<escape>\\\\)?:(?<identifier>[$_\\p{ID_Start}][$\\p{ID_Continue}]+)(?!\\\\[*+?])/gu;\n}\n\nexport function createRepeatingPathParamRegex() {\n return /(?<escape>\\\\)?:(?<identifier>[$_\\p{ID_Start}][$\\p{ID_Continue}]+)\\\\\\+/gu;\n}\n\nexport function createOptionalPathParamRegex() {\n return /(?<leadingSlash>\\/)?(?<escape>\\\\)?:(?<identifier>[$_\\p{ID_Start}][$\\p{ID_Continue}]+)\\?(?<trailingSlash>\\/)?/gu;\n}\n\nexport function createOptionalRepeatingPathParamRegex() {\n return /(?<leadingSlash>\\/)?(?<escape>\\\\)?:(?<identifier>[$_\\p{ID_Start}][$\\p{ID_Continue}]+)\\*(?<trailingSlash>\\/)?/gu;\n}\n\nfunction createRegexFromPath(path: string) {\n const pathRegexContent = preparePathForRegex(path)\n .replace(\n createOptionalRepeatingPathParamRegex(),\n (\n _match,\n leadingSlash: string | undefined,\n escape: string | undefined,\n identifier: string,\n trailingSlash: string | undefined,\n ) => {\n if (escape) {\n return `${leadingSlash ?? ''}:${identifier}\\\\*${trailingSlash ?? ''}`;\n }\n\n const hasSegmentBeforePrefix = leadingSlash === '/';\n const prefixExpression = hasSegmentBeforePrefix ? '/?' : leadingSlash;\n\n const hasSegmentAfterSuffix = trailingSlash === '/';\n const suffixExpression = hasSegmentAfterSuffix ? '/?' : trailingSlash;\n\n if (prefixExpression && suffixExpression) {\n return `(?:${prefixExpression}(?<${identifier}>.+?)?${suffixExpression})?`;\n } else if (prefixExpression) {\n return `(?:${prefixExpression}(?<${identifier}>.+?))?`;\n } else if (suffixExpression) {\n return `(?:(?<${identifier}>.+?)${suffixExpression})?`;\n } else {\n return `(?<${identifier}>.+?)?`;\n }\n },\n )\n .replace(createRepeatingPathParamRegex(), (_match, escape: string | undefined, identifier: string) => {\n return escape ? `:${identifier}\\\\+` : `(?<${identifier}>.+)`;\n })\n .replace(\n createOptionalPathParamRegex(),\n (\n _match,\n leadingSlash: string | undefined,\n escape: string | undefined,\n identifier: string,\n trailingSlash: string | undefined,\n ) => {\n if (escape) {\n return `${leadingSlash ?? ''}:${identifier}\\\\?${trailingSlash ?? ''}`;\n }\n\n const hasSegmentBeforePrefix = leadingSlash === '/';\n const prefixExpression = hasSegmentBeforePrefix ? '/?' : leadingSlash;\n\n const hasSegmentAfterSuffix = trailingSlash === '/';\n const suffixExpression = hasSegmentAfterSuffix ? '/?' : trailingSlash;\n\n if (prefixExpression && suffixExpression) {\n return `(?:${prefixExpression}(?<${identifier}>[^\\\\/]+?)?${suffixExpression})`;\n } else if (prefixExpression) {\n return `(?:${prefixExpression}(?<${identifier}>[^\\\\/]+?))?`;\n } else if (suffixExpression) {\n return `(?:(?<${identifier}>[^\\\\/]+?)${suffixExpression})?`;\n } else {\n return `(?<${identifier}>[^\\\\/]+?)?`;\n }\n },\n )\n .replace(createPathParamRegex(), (_match, escape: string | undefined, identifier: string) => {\n return escape ? `:${identifier}` : `(?<${identifier}>[^\\\\/]+?)`;\n });\n\n return new RegExp(`^/?${pathRegexContent}/?$`);\n}\n\nexport default createRegexFromPath;\n","function excludeNonPathParams(url: URL) {\n url.hash = '';\n url.search = '';\n url.username = '';\n url.password = '';\n return url;\n}\n\nexport default excludeNonPathParams;\n","function joinURL(...parts: (URL | string)[]) {\n return parts\n .map((part, index) => {\n const isFirstPart = index === 0;\n const isLastPart = index === parts.length - 1;\n\n let partAsString = part.toString();\n\n if (!isFirstPart) {\n partAsString = partAsString.replace(/^\\//, '');\n }\n if (!isLastPart) {\n partAsString = partAsString.replace(/\\/$/, '');\n }\n\n return partAsString;\n })\n .filter((part) => part.length > 0)\n .join('/');\n}\n\nexport default joinURL;\n","import {\n HttpSchemaPath,\n HttpSchemaMethod,\n HttpSearchParams,\n LiteralHttpSchemaPathFromNonLiteral,\n HttpSchema,\n HttpHeaders,\n} from '@zimic/http';\nimport createRegexFromPath from '@zimic/utils/url/createRegexFromPath';\nimport excludeNonPathParams from '@zimic/utils/url/excludeNonPathParams';\nimport joinURL from '@zimic/utils/url/joinURL';\n\nimport FetchResponseError from './errors/FetchResponseError';\nimport { FetchInput, FetchOptions, Fetch, FetchDefaults } from './types/public';\nimport { FetchRequestConstructor, FetchRequestInit, FetchRequest, FetchResponse } from './types/requests';\n\nclass FetchClient<Schema extends HttpSchema> implements Omit<Fetch<Schema>, 'loose' | 'Request' | keyof FetchDefaults> {\n fetch: Fetch<Schema>;\n\n constructor({ headers = {}, searchParams = {}, ...otherOptions }: FetchOptions<Schema>) {\n this.fetch = this.createFetchFunction();\n this.fetch.headers = headers;\n this.fetch.searchParams = searchParams;\n Object.assign(this.fetch, otherOptions);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.fetch.loose = this.fetch as Fetch<any> as Fetch.Loose;\n this.fetch.Request = this.createRequestClass(this.fetch);\n }\n\n get defaults(): FetchDefaults {\n return this.fetch;\n }\n\n private createFetchFunction() {\n const fetch = async <\n Method extends HttpSchemaMethod<Schema>,\n Path extends HttpSchemaPath.NonLiteral<Schema, Method>,\n >(\n input: FetchInput<Schema, Method, Path>,\n init: FetchRequestInit<Schema, Method, LiteralHttpSchemaPathFromNonLiteral<Schema, Method, Path>>,\n ) => {\n const request = await this.createFetchRequest<Method, Path>(input, init);\n const requestClone = request.clone();\n\n const rawResponse = await globalThis.fetch(\n // Optimize type checking by narrowing the type of request\n requestClone as Request,\n );\n const response = await this.createFetchResponse<\n Method,\n LiteralHttpSchemaPathFromNonLiteral<Schema, Method, Path>\n >(request, rawResponse);\n\n return response;\n };\n\n Object.setPrototypeOf(fetch, this);\n\n return fetch as Fetch<Schema>;\n }\n\n private async createFetchRequest<\n Method extends HttpSchemaMethod<Schema>,\n Path extends HttpSchemaPath.NonLiteral<Schema, Method>,\n >(\n input: FetchInput<Schema, Method, Path>,\n init: FetchRequestInit<Schema, Method, LiteralHttpSchemaPathFromNonLiteral<Schema, Method, Path>>,\n ) {\n let request = input instanceof Request ? input : new this.fetch.Request(input, init);\n\n if (this.fetch.onRequest) {\n const requestAfterInterceptor = await this.fetch.onRequest(\n // Optimize type checking by narrowing the type of request\n request as FetchRequest.Loose,\n );\n\n if (requestAfterInterceptor !== request) {\n const isFetchRequest = requestAfterInterceptor instanceof this.fetch.Request;\n\n request = isFetchRequest\n ? (requestAfterInterceptor as Request as typeof request)\n : new this.fetch.Request(requestAfterInterceptor as FetchInput<Schema, Method, Path>, init);\n }\n }\n\n return request;\n }\n\n private async createFetchResponse<\n Method extends HttpSchemaMethod<Schema>,\n Path extends HttpSchemaPath.Literal<Schema, Method>,\n >(fetchRequest: FetchRequest<Schema, Method, Path>, rawResponse: Response) {\n let response = this.defineFetchResponseProperties<Method, Path>(fetchRequest, rawResponse);\n\n if (this.fetch.onResponse) {\n const responseAfterInterceptor = await this.fetch.onResponse(\n // Optimize type checking by narrowing the type of response\n response as FetchResponse.Loose,\n );\n\n const isFetchResponse =\n responseAfterInterceptor instanceof Response &&\n 'request' in responseAfterInterceptor &&\n responseAfterInterceptor.request instanceof this.fetch.Request;\n\n response = isFetchResponse\n ? (responseAfterInterceptor as typeof response)\n : this.defineFetchResponseProperties<Method, Path>(fetchRequest, responseAfterInterceptor);\n }\n\n return response;\n }\n\n private defineFetchResponseProperties<\n Method extends HttpSchemaMethod<Schema>,\n Path extends HttpSchemaPath.Literal<Schema, Method>,\n >(fetchRequest: FetchRequest<Schema, Method, Path>, response: Response) {\n const fetchResponse = response as FetchResponse<Schema, Method, Path>;\n\n Object.defineProperty(fetchResponse, 'request', {\n value: fetchRequest,\n writable: false,\n enumerable: true,\n configurable: false,\n });\n\n let responseError: FetchResponse.Loose['error'] | undefined;\n\n Object.defineProperty(fetchResponse, 'error', {\n get() {\n if (responseError === undefined) {\n responseError = fetchResponse.ok\n ? null\n : new FetchResponseError(\n fetchRequest,\n fetchResponse as FetchResponse<Schema, Method, Path, true, 'manual'>,\n );\n }\n return responseError;\n },\n enumerable: true,\n configurable: false,\n });\n\n return fetchResponse;\n }\n\n private createRequestClass(fetch: Fetch<Schema>) {\n class Request<Method extends HttpSchemaMethod<Schema>, Path extends HttpSchemaPath.NonLiteral<Schema, Method>>\n extends globalThis.Request\n {\n path: LiteralHttpSchemaPathFromNonLiteral<Schema, Method, Path>;\n\n constructor(input: FetchInput<Schema, Method, Path>, init?: FetchRequestInit.Loose) {\n let actualInput: URL | globalThis.Request;\n\n const actualInit = {\n baseURL: init?.baseURL ?? fetch.baseURL,\n method: init?.method ?? fetch.method,\n headers: new HttpHeaders(fetch.headers),\n searchParams: new HttpSearchParams(fetch.searchParams),\n body: init?.body ?? fetch.body,\n mode: init?.mode ?? fetch.mode,\n cache: init?.cache ?? fetch.cache,\n credentials: init?.credentials ?? fetch.credentials,\n integrity: init?.integrity ?? fetch.integrity,\n keepalive: init?.keepalive ?? fetch.keepalive,\n priority: init?.priority ?? fetch.priority,\n redirect: init?.redirect ?? fetch.redirect,\n referrer: init?.referrer ?? fetch.referrer,\n referrerPolicy: init?.referrerPolicy ?? fetch.referrerPolicy,\n signal: init?.signal ?? fetch.signal,\n window: init?.window === undefined ? fetch.window : init.window,\n duplex: init?.duplex ?? fetch.duplex,\n };\n\n if (init?.headers) {\n actualInit.headers.assign(new HttpHeaders(init.headers));\n }\n\n let url: URL;\n const baseURL = new URL(actualInit.baseURL);\n\n if (input instanceof globalThis.Request) {\n const request = input as globalThis.Request;\n\n actualInit.headers.assign(new HttpHeaders(request.headers));\n\n url = new URL(input.url);\n\n actualInput = request;\n } else {\n url = new URL(input instanceof URL ? input : joinURL(baseURL, input));\n\n actualInit.searchParams.assign(new HttpSearchParams(url.searchParams));\n\n if (init?.searchParams) {\n actualInit.searchParams.assign(new HttpSearchParams(init.searchParams));\n }\n\n url.search = actualInit.searchParams.toString();\n\n actualInput = url;\n }\n\n super(actualInput, actualInit);\n\n const baseURLWithoutTrailingSlash = baseURL.toString().replace(/\\/$/, '');\n\n this.path = excludeNonPathParams(url)\n .toString()\n .replace(baseURLWithoutTrailingSlash, '') as LiteralHttpSchemaPathFromNonLiteral<Schema, Method, Path>;\n }\n\n clone(): this {\n const rawClone = super.clone();\n return new Request(rawClone as FetchInput<Schema, Method, Path>) as this;\n }\n }\n\n return Request as FetchRequestConstructor<Schema>;\n }\n\n isRequest<Path extends HttpSchemaPath.Literal<Schema, Method>, Method extends HttpSchemaMethod<Schema>>(\n request: unknown,\n method: Method,\n path: Path,\n ): request is FetchRequest<Schema, Method, Path> {\n return (\n request instanceof Request &&\n request.method === method &&\n 'path' in request &&\n typeof request.path === 'string' &&\n createRegexFromPath(path).test(request.path)\n );\n }\n\n isResponse<Path extends HttpSchemaPath.Literal<Schema, Method>, Method extends HttpSchemaMethod<Schema>>(\n response: unknown,\n method: Method,\n path: Path,\n ): response is FetchResponse<Schema, Method, Path> {\n return (\n response instanceof Response &&\n 'request' in response &&\n this.isRequest(response.request, method, path) &&\n 'error' in response &&\n (response.error === null || response.error instanceof FetchResponseError)\n );\n }\n\n isResponseError<Path extends HttpSchemaPath.Literal<Schema, Method>, Method extends HttpSchemaMethod<Schema>>(\n error: unknown,\n method: Method,\n path: Path,\n ): error is FetchResponseError<Schema, Method, Path> {\n return (\n error instanceof FetchResponseError &&\n this.isRequest(error.request, method, path) &&\n this.isResponse(error.response, method, path)\n );\n }\n}\n\nexport default FetchClient;\n","import { HttpSchema } from '@zimic/http';\n\nimport FetchClient from './FetchClient';\nimport { FetchOptions, Fetch } from './types/public';\n\n/** @see {@link https://zimic.dev/docs/fetch/api/create-fetch `createFetch` API reference} */\nfunction createFetch<Schema extends HttpSchema>(options: FetchOptions<Schema>): Fetch<Schema> {\n const { fetch } = new FetchClient<Schema>(options);\n return fetch;\n}\n\nexport default createFetch;\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client/errors/FetchResponseError.ts","../../zimic-utils/src/url/createRegexFromPath.ts","../../zimic-utils/src/url/excludeNonPathParams.ts","../../zimic-utils/src/url/joinURL.ts","../src/client/FetchClient.ts","../src/client/factory.ts"],"names":["Request","HttpHeaders"],"mappings":"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","file":"index.mjs","sourcesContent":["import {\n HttpHeaders,\n HttpHeadersSchema,\n HttpSchema,\n HttpSchemaMethod,\n HttpSchemaPath,\n parseHttpBody,\n} from '@zimic/http';\nimport { PossiblePromise } from '@zimic/utils/types';\n\nimport { FetchRequest, FetchRequestObject, FetchResponse, FetchResponseObject } from '../types/requests';\n\n/** @see {@link https://zimic.dev/docs/fetch/api/fetch-response-error#errortoobject `fetchResponseError.toObject()` API reference} */\nexport interface FetchResponseErrorObjectOptions {\n /** @see {@link https://zimic.dev/docs/fetch/api/fetch-response-error#errortoobject `fetchResponseError.toObject()` API reference} */\n includeRequestBody?: boolean;\n /** @see {@link https://zimic.dev/docs/fetch/api/fetch-response-error#errortoobject `fetchResponseError.toObject()` API reference} */\n includeResponseBody?: boolean;\n}\n\nexport namespace FetchResponseErrorObjectOptions {\n /**\n * Options for converting a {@link FetchResponseError `FetchResponseError`} into a plain object, including the body of\n * the request and/or response.\n */\n export type WithBody = FetchResponseErrorObjectOptions &\n ({ includeRequestBody: true } | { includeResponseBody: true });\n\n /**\n * Options for converting a {@link FetchResponseError `FetchResponseError`} into a plain object, excluding the body of\n * the request and/or response.\n */\n export type WithoutBody = FetchResponseErrorObjectOptions &\n ({ includeRequestBody?: false } | { includeResponseBody?: false });\n}\n\n/**\n * A plain object representation of a {@link FetchResponseError `FetchResponseError`}, compatible with JSON. It is useful\n * for serialization, debugging, and logging purposes.\n *\n * @see {@link https://zimic.dev/docs/fetch/api/fetch-response-error#errortoobject `fetchResponseError.toObject()` API reference}\n */\nexport interface FetchResponseErrorObject {\n name: string;\n message: string;\n request: FetchRequestObject;\n response: FetchResponseObject;\n}\n\n/** @see {@link https://zimic.dev/docs/fetch/api/fetch-response-error `FetchResponseError` API reference} */\nclass FetchResponseError<\n Schema extends HttpSchema,\n Method extends HttpSchemaMethod<Schema>,\n Path extends HttpSchemaPath.Literal<Schema, Method>,\n> extends Error {\n constructor(\n public request: FetchRequest<Schema, Method, Path>,\n public response: FetchResponse<Schema, Method, Path, true, 'manual'>,\n ) {\n super(`${request.method} ${request.url} failed with status ${response.status}: ${response.statusText}`);\n this.name = 'FetchResponseError';\n }\n\n /** @see {@link https://zimic.dev/docs/fetch/api/fetch-response-error#errortoobject `fetchResponseError.toObject()` API reference} */\n toObject(options: FetchResponseErrorObjectOptions.WithBody): Promise<FetchResponseErrorObject>;\n toObject(options?: FetchResponseErrorObjectOptions.WithoutBody): FetchResponseErrorObject;\n toObject(options?: FetchResponseErrorObjectOptions): PossiblePromise<FetchResponseErrorObject>;\n toObject({\n includeRequestBody = false,\n includeResponseBody = false,\n }: FetchResponseErrorObjectOptions = {}): PossiblePromise<FetchResponseErrorObject> {\n const partialObject = {\n name: this.name,\n message: this.message,\n } satisfies Partial<FetchResponseErrorObject>;\n\n if (!includeRequestBody && !includeResponseBody) {\n return {\n ...partialObject,\n request: this.requestToObject({ includeBody: false }),\n response: this.responseToObject({ includeBody: false }),\n };\n }\n\n return Promise.all([\n Promise.resolve(this.requestToObject({ includeBody: includeRequestBody })),\n Promise.resolve(this.responseToObject({ includeBody: includeResponseBody })),\n ]).then(([request, response]) => ({ ...partialObject, request, response }));\n }\n\n private requestToObject(options: { includeBody: true }): Promise<FetchRequestObject>;\n private requestToObject(options: { includeBody: false }): FetchRequestObject;\n private requestToObject(options: { includeBody: boolean }): PossiblePromise<FetchRequestObject>;\n private requestToObject(options: { includeBody: boolean }): PossiblePromise<FetchRequestObject> {\n const request = this.request;\n\n const requestObject: FetchRequestObject = {\n url: request.url,\n path: request.path,\n method: request.method,\n headers: this.convertHeadersToObject(request),\n cache: request.cache,\n destination: request.destination,\n credentials: request.credentials,\n integrity: request.integrity,\n keepalive: request.keepalive,\n mode: request.mode,\n redirect: request.redirect,\n referrer: request.referrer,\n referrerPolicy: request.referrerPolicy,\n };\n\n if (!options.includeBody) {\n return requestObject;\n }\n\n return this.withIncludedBodyIfAvailable('request', requestObject);\n }\n\n private responseToObject(options: { includeBody: true }): Promise<FetchResponseObject>;\n private responseToObject(options: { includeBody: false }): FetchResponseObject;\n private responseToObject(options: { includeBody: boolean }): PossiblePromise<FetchResponseObject>;\n private responseToObject(options: { includeBody: boolean }): PossiblePromise<FetchResponseObject> {\n const response = this.response;\n\n const responseObject: FetchResponseObject = {\n url: response.url,\n type: response.type,\n status: response.status,\n statusText: response.statusText,\n ok: response.ok,\n headers: this.convertHeadersToObject(response),\n redirected: response.redirected,\n };\n\n if (!options.includeBody) {\n return responseObject;\n }\n\n return this.withIncludedBodyIfAvailable('response', responseObject);\n }\n\n private convertHeadersToObject(\n resource: FetchRequest<Schema, Method, Path> | FetchResponse<Schema, Method, Path, true, 'manual'>,\n ): HttpHeadersSchema {\n return HttpHeaders.prototype.toObject.call(resource.headers) as HttpHeadersSchema;\n }\n\n private withIncludedBodyIfAvailable(\n resourceType: 'request',\n resourceObject: FetchRequestObject,\n ): PossiblePromise<FetchRequestObject>;\n private withIncludedBodyIfAvailable(\n resourceType: 'response',\n resourceObject: FetchResponseObject,\n ): PossiblePromise<FetchResponseObject>;\n private withIncludedBodyIfAvailable(\n resourceType: 'request' | 'response',\n resourceObject: FetchRequestObject | FetchResponseObject,\n ): PossiblePromise<FetchRequestObject | FetchResponseObject> {\n const resource = this[resourceType] as Request | Response;\n\n if (resource.bodyUsed) {\n console.warn(\n '[@zimic/fetch]',\n `Could not include the ${resourceType} body because it is already used. ` +\n 'If you access the body before calling `error.toObject()`, consider reading it from a cloned ' +\n `${resourceType}.\\n\\nLearn more: https://zimic.dev/docs/fetch/api/fetch-response-error#errortoobject`,\n );\n return resourceObject;\n }\n\n return parseHttpBody(resource)\n .then((body) => {\n resourceObject.body = body;\n return resourceObject;\n })\n .catch((error: unknown) => {\n console.error('[@zimic/fetch]', `Failed to parse ${resourceType} body:`, error);\n return resourceObject;\n });\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyFetchRequestError = FetchResponseError<any, any, any>;\n\nexport default FetchResponseError;\n","export function createPathCharactersToEscapeRegex() {\n return /([.(){}+$])/g;\n}\n\nexport function preparePathForRegex(path: string) {\n // We encode the path using the URL API because, differently from encodeURI and encodeURIComponent, URL does not\n // re-encode already encoded characters. Since URL requires a full URL, we use a data scheme and strip it later.\n const pathURLPrefix = `data:${path.startsWith('/') ? '' : '/'}`;\n const pathAsURL = new URL(`${pathURLPrefix}${path}`);\n const encodedPath = pathAsURL.href.replace(pathURLPrefix, '');\n\n return encodedPath.replace(/^\\/+/g, '').replace(/\\/+$/g, '').replace(createPathCharactersToEscapeRegex(), '\\\\$1');\n}\n\n// Path params names must match the JavaScript identifier pattern.\n// See // https://developer.mozilla.org/docs/Web/JavaScript/Reference/Lexical_grammar#identifiers.\nexport function createPathParamRegex() {\n return /(?<escape>\\\\)?:(?<identifier>[$_\\p{ID_Start}][$\\p{ID_Continue}]+)(?!\\\\[*+?])/gu;\n}\n\nexport function createRepeatingPathParamRegex() {\n return /(?<escape>\\\\)?:(?<identifier>[$_\\p{ID_Start}][$\\p{ID_Continue}]+)\\\\\\+/gu;\n}\n\nexport function createOptionalPathParamRegex() {\n return /(?<leadingSlash>\\/)?(?<escape>\\\\)?:(?<identifier>[$_\\p{ID_Start}][$\\p{ID_Continue}]+)\\?(?<trailingSlash>\\/)?/gu;\n}\n\nexport function createOptionalRepeatingPathParamRegex() {\n return /(?<leadingSlash>\\/)?(?<escape>\\\\)?:(?<identifier>[$_\\p{ID_Start}][$\\p{ID_Continue}]+)\\*(?<trailingSlash>\\/)?/gu;\n}\n\nfunction createRegexFromPath(path: string) {\n const pathRegexContent = preparePathForRegex(path)\n .replace(\n createOptionalRepeatingPathParamRegex(),\n (\n _match,\n leadingSlash: string | undefined,\n escape: string | undefined,\n identifier: string,\n trailingSlash: string | undefined,\n ) => {\n if (escape) {\n return `${leadingSlash ?? ''}:${identifier}\\\\*${trailingSlash ?? ''}`;\n }\n\n const hasSegmentBeforePrefix = leadingSlash === '/';\n const prefixExpression = hasSegmentBeforePrefix ? '/?' : leadingSlash;\n\n const hasSegmentAfterSuffix = trailingSlash === '/';\n const suffixExpression = hasSegmentAfterSuffix ? '/?' : trailingSlash;\n\n if (prefixExpression && suffixExpression) {\n return `(?:${prefixExpression}(?<${identifier}>.+?)?${suffixExpression})?`;\n } else if (prefixExpression) {\n return `(?:${prefixExpression}(?<${identifier}>.+?))?`;\n } else if (suffixExpression) {\n return `(?:(?<${identifier}>.+?)${suffixExpression})?`;\n } else {\n return `(?<${identifier}>.+?)?`;\n }\n },\n )\n .replace(createRepeatingPathParamRegex(), (_match, escape: string | undefined, identifier: string) => {\n return escape ? `:${identifier}\\\\+` : `(?<${identifier}>.+)`;\n })\n .replace(\n createOptionalPathParamRegex(),\n (\n _match,\n leadingSlash: string | undefined,\n escape: string | undefined,\n identifier: string,\n trailingSlash: string | undefined,\n ) => {\n if (escape) {\n return `${leadingSlash ?? ''}:${identifier}\\\\?${trailingSlash ?? ''}`;\n }\n\n const hasSegmentBeforePrefix = leadingSlash === '/';\n const prefixExpression = hasSegmentBeforePrefix ? '/?' : leadingSlash;\n\n const hasSegmentAfterSuffix = trailingSlash === '/';\n const suffixExpression = hasSegmentAfterSuffix ? '/?' : trailingSlash;\n\n if (prefixExpression && suffixExpression) {\n return `(?:${prefixExpression}(?<${identifier}>[^\\\\/]+?)?${suffixExpression})`;\n } else if (prefixExpression) {\n return `(?:${prefixExpression}(?<${identifier}>[^\\\\/]+?))?`;\n } else if (suffixExpression) {\n return `(?:(?<${identifier}>[^\\\\/]+?)${suffixExpression})?`;\n } else {\n return `(?<${identifier}>[^\\\\/]+?)?`;\n }\n },\n )\n .replace(createPathParamRegex(), (_match, escape: string | undefined, identifier: string) => {\n return escape ? `:${identifier}` : `(?<${identifier}>[^\\\\/]+?)`;\n });\n\n return new RegExp(`^/?${pathRegexContent}/?$`);\n}\n\nexport default createRegexFromPath;\n","function excludeNonPathParams(url: URL) {\n url.hash = '';\n url.search = '';\n url.username = '';\n url.password = '';\n return url;\n}\n\nexport default excludeNonPathParams;\n","function joinURL(...parts: (URL | string)[]) {\n return parts\n .map((part, index) => {\n const isFirstPart = index === 0;\n const isLastPart = index === parts.length - 1;\n\n let partAsString = part.toString();\n\n if (!isFirstPart) {\n partAsString = partAsString.replace(/^\\//, '');\n }\n if (!isLastPart) {\n partAsString = partAsString.replace(/\\/$/, '');\n }\n\n return partAsString;\n })\n .filter((part) => part.length > 0)\n .join('/');\n}\n\nexport default joinURL;\n","import {\n HttpSchemaPath,\n HttpSchemaMethod,\n HttpSearchParams,\n LiteralHttpSchemaPathFromNonLiteral,\n HttpSchema,\n HttpHeaders,\n} from '@zimic/http';\nimport createRegexFromPath from '@zimic/utils/url/createRegexFromPath';\nimport excludeNonPathParams from '@zimic/utils/url/excludeNonPathParams';\nimport joinURL from '@zimic/utils/url/joinURL';\n\nimport FetchResponseError from './errors/FetchResponseError';\nimport { FetchInput, FetchOptions, Fetch, FetchDefaults } from './types/public';\nimport { FetchRequestConstructor, FetchRequestInit, FetchRequest, FetchResponse } from './types/requests';\n\nclass FetchClient<Schema extends HttpSchema> implements Omit<Fetch<Schema>, 'loose' | 'Request' | keyof FetchDefaults> {\n fetch: Fetch<Schema>;\n\n constructor({ headers = {}, searchParams = {}, ...otherOptions }: FetchOptions<Schema>) {\n this.fetch = this.createFetchFunction();\n this.fetch.headers = headers;\n this.fetch.searchParams = searchParams;\n Object.assign(this.fetch, otherOptions);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.fetch.loose = this.fetch as Fetch<any> as Fetch.Loose;\n this.fetch.Request = this.createRequestClass(this.fetch);\n }\n\n get defaults(): FetchDefaults {\n return this.fetch;\n }\n\n private createFetchFunction() {\n const fetch = async <\n Method extends HttpSchemaMethod<Schema>,\n Path extends HttpSchemaPath.NonLiteral<Schema, Method>,\n >(\n input: FetchInput<Schema, Method, Path>,\n init: FetchRequestInit<Schema, Method, LiteralHttpSchemaPathFromNonLiteral<Schema, Method, Path>>,\n ) => {\n const request = await this.createFetchRequest<Method, Path>(input, init);\n const requestClone = request.clone();\n\n const rawResponse = await globalThis.fetch(\n // Optimize type checking by narrowing the type of request\n requestClone as Request,\n );\n const response = await this.createFetchResponse<\n Method,\n LiteralHttpSchemaPathFromNonLiteral<Schema, Method, Path>\n >(request, rawResponse);\n\n return response;\n };\n\n Object.setPrototypeOf(fetch, this);\n\n return fetch as Fetch<Schema>;\n }\n\n private async createFetchRequest<\n Method extends HttpSchemaMethod<Schema>,\n Path extends HttpSchemaPath.NonLiteral<Schema, Method>,\n >(\n input: FetchInput<Schema, Method, Path>,\n init: FetchRequestInit<Schema, Method, LiteralHttpSchemaPathFromNonLiteral<Schema, Method, Path>>,\n ) {\n let request = input instanceof Request ? input : new this.fetch.Request(input, init);\n\n if (this.fetch.onRequest) {\n const requestAfterInterceptor = await this.fetch.onRequest(\n // Optimize type checking by narrowing the type of request\n request as FetchRequest.Loose,\n );\n\n if (requestAfterInterceptor !== request) {\n const isFetchRequest = requestAfterInterceptor instanceof this.fetch.Request;\n\n request = isFetchRequest\n ? (requestAfterInterceptor as Request as typeof request)\n : new this.fetch.Request(requestAfterInterceptor as FetchInput<Schema, Method, Path>, init);\n }\n }\n\n return request;\n }\n\n private async createFetchResponse<\n Method extends HttpSchemaMethod<Schema>,\n Path extends HttpSchemaPath.Literal<Schema, Method>,\n >(fetchRequest: FetchRequest<Schema, Method, Path>, rawResponse: Response) {\n let response = this.defineFetchResponseProperties<Method, Path>(fetchRequest, rawResponse);\n\n if (this.fetch.onResponse) {\n const responseAfterInterceptor = await this.fetch.onResponse(\n // Optimize type checking by narrowing the type of response\n response as FetchResponse.Loose,\n );\n\n const isFetchResponse =\n responseAfterInterceptor instanceof Response &&\n 'request' in responseAfterInterceptor &&\n responseAfterInterceptor.request instanceof this.fetch.Request;\n\n response = isFetchResponse\n ? (responseAfterInterceptor as typeof response)\n : this.defineFetchResponseProperties<Method, Path>(fetchRequest, responseAfterInterceptor);\n }\n\n return response;\n }\n\n private defineFetchResponseProperties<\n Method extends HttpSchemaMethod<Schema>,\n Path extends HttpSchemaPath.Literal<Schema, Method>,\n >(fetchRequest: FetchRequest<Schema, Method, Path>, response: Response) {\n const fetchResponse = response as FetchResponse<Schema, Method, Path>;\n\n Object.defineProperty(fetchResponse, 'request', {\n value: fetchRequest,\n writable: false,\n enumerable: true,\n configurable: false,\n });\n\n let responseError: FetchResponse.Loose['error'] | undefined;\n\n Object.defineProperty(fetchResponse, 'error', {\n get() {\n if (responseError === undefined) {\n responseError = fetchResponse.ok\n ? null\n : new FetchResponseError(\n fetchRequest,\n fetchResponse as FetchResponse<Schema, Method, Path, true, 'manual'>,\n );\n }\n return responseError;\n },\n enumerable: true,\n configurable: false,\n });\n\n return fetchResponse;\n }\n\n private createRequestClass(fetch: Fetch<Schema>) {\n class Request<\n Method extends HttpSchemaMethod<Schema>,\n Path extends HttpSchemaPath.NonLiteral<Schema, Method>,\n > extends globalThis.Request {\n path: LiteralHttpSchemaPathFromNonLiteral<Schema, Method, Path>;\n\n constructor(input: FetchInput<Schema, Method, Path>, init?: FetchRequestInit.Loose) {\n let actualInput: URL | globalThis.Request;\n\n const actualInit = {\n baseURL: init?.baseURL ?? fetch.baseURL,\n method: init?.method ?? fetch.method,\n headers: new HttpHeaders(fetch.headers),\n searchParams: new HttpSearchParams(fetch.searchParams),\n body: init?.body ?? fetch.body,\n mode: init?.mode ?? fetch.mode,\n cache: init?.cache ?? fetch.cache,\n credentials: init?.credentials ?? fetch.credentials,\n integrity: init?.integrity ?? fetch.integrity,\n keepalive: init?.keepalive ?? fetch.keepalive,\n priority: init?.priority ?? fetch.priority,\n redirect: init?.redirect ?? fetch.redirect,\n referrer: init?.referrer ?? fetch.referrer,\n referrerPolicy: init?.referrerPolicy ?? fetch.referrerPolicy,\n signal: init?.signal ?? fetch.signal,\n window: init?.window === undefined ? fetch.window : init.window,\n duplex: init?.duplex ?? fetch.duplex,\n };\n\n if (init?.headers) {\n actualInit.headers.assign(new HttpHeaders(init.headers));\n }\n\n let url: URL;\n const baseURL = new URL(actualInit.baseURL);\n\n if (input instanceof globalThis.Request) {\n const request = input as globalThis.Request;\n\n actualInit.headers.assign(new HttpHeaders(request.headers));\n\n url = new URL(input.url);\n\n actualInput = request;\n } else {\n url = new URL(input instanceof URL ? input : joinURL(baseURL, input));\n\n actualInit.searchParams.assign(new HttpSearchParams(url.searchParams));\n\n if (init?.searchParams) {\n actualInit.searchParams.assign(new HttpSearchParams(init.searchParams));\n }\n\n url.search = actualInit.searchParams.toString();\n\n actualInput = url;\n }\n\n super(actualInput, actualInit);\n\n const baseURLWithoutTrailingSlash = baseURL.toString().replace(/\\/$/, '');\n\n this.path = excludeNonPathParams(url)\n .toString()\n .replace(baseURLWithoutTrailingSlash, '') as LiteralHttpSchemaPathFromNonLiteral<Schema, Method, Path>;\n }\n\n clone(): this {\n const rawClone = super.clone();\n return new Request(rawClone as FetchInput<Schema, Method, Path>) as this;\n }\n }\n\n return Request as FetchRequestConstructor<Schema>;\n }\n\n isRequest<Path extends HttpSchemaPath.Literal<Schema, Method>, Method extends HttpSchemaMethod<Schema>>(\n request: unknown,\n method: Method,\n path: Path,\n ): request is FetchRequest<Schema, Method, Path> {\n return (\n request instanceof Request &&\n request.method === method &&\n 'path' in request &&\n typeof request.path === 'string' &&\n createRegexFromPath(path).test(request.path)\n );\n }\n\n isResponse<Path extends HttpSchemaPath.Literal<Schema, Method>, Method extends HttpSchemaMethod<Schema>>(\n response: unknown,\n method: Method,\n path: Path,\n ): response is FetchResponse<Schema, Method, Path> {\n return (\n response instanceof Response &&\n 'request' in response &&\n this.isRequest(response.request, method, path) &&\n 'error' in response &&\n (response.error === null || response.error instanceof FetchResponseError)\n );\n }\n\n isResponseError<Path extends HttpSchemaPath.Literal<Schema, Method>, Method extends HttpSchemaMethod<Schema>>(\n error: unknown,\n method: Method,\n path: Path,\n ): error is FetchResponseError<Schema, Method, Path> {\n return (\n error instanceof FetchResponseError &&\n this.isRequest(error.request, method, path) &&\n this.isResponse(error.response, method, path)\n );\n }\n}\n\nexport default FetchClient;\n","import { HttpSchema } from '@zimic/http';\n\nimport FetchClient from './FetchClient';\nimport { FetchOptions, Fetch } from './types/public';\n\n/** @see {@link https://zimic.dev/docs/fetch/api/create-fetch `createFetch` API reference} */\nfunction createFetch<Schema extends HttpSchema>(options: FetchOptions<Schema>): Fetch<Schema> {\n const { fetch } = new FetchClient<Schema>(options);\n return fetch;\n}\n\nexport default createFetch;\n"]}
1
+ {"version":3,"sources":["../src/client/errors/FetchResponseError.ts","../../zimic-utils/src/url/createRegexFromPath.ts","../../zimic-utils/src/url/excludeNonPathParams.ts","../../zimic-utils/src/url/joinURL.ts","../src/client/FetchClient.ts","../src/client/factory.ts"],"names":["Request","HttpHeaders"],"mappings":"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","file":"index.mjs","sourcesContent":["import {\n HttpHeaders,\n HttpHeadersSchema,\n HttpSchema,\n HttpSchemaMethod,\n HttpSchemaPath,\n parseHttpBody,\n} from '@zimic/http';\nimport { PossiblePromise } from '@zimic/utils/types';\n\nimport { FetchRequest, FetchRequestObject, FetchResponse, FetchResponseObject } from '../types/requests';\n\n/** @see {@link https://zimic.dev/docs/fetch/api/fetch-response-error#errortoobject `fetchResponseError.toObject()` API reference} */\nexport interface FetchResponseErrorObjectOptions {\n /** @see {@link https://zimic.dev/docs/fetch/api/fetch-response-error#errortoobject `fetchResponseError.toObject()` API reference} */\n includeRequestBody?: boolean;\n /** @see {@link https://zimic.dev/docs/fetch/api/fetch-response-error#errortoobject `fetchResponseError.toObject()` API reference} */\n includeResponseBody?: boolean;\n}\n\nexport namespace FetchResponseErrorObjectOptions {\n /**\n * Options for converting a {@link FetchResponseError `FetchResponseError`} into a plain object, including the body of\n * the request and/or response.\n */\n export type WithBody = FetchResponseErrorObjectOptions &\n ({ includeRequestBody: true } | { includeResponseBody: true });\n\n /**\n * Options for converting a {@link FetchResponseError `FetchResponseError`} into a plain object, excluding the body of\n * the request and/or response.\n */\n export type WithoutBody = FetchResponseErrorObjectOptions &\n ({ includeRequestBody?: false } | { includeResponseBody?: false });\n}\n\n/**\n * A plain object representation of a {@link FetchResponseError `FetchResponseError`}, compatible with JSON. It is useful\n * for serialization, debugging, and logging purposes.\n *\n * @see {@link https://zimic.dev/docs/fetch/api/fetch-response-error#errortoobject `fetchResponseError.toObject()` API reference}\n */\nexport interface FetchResponseErrorObject {\n name: string;\n message: string;\n request: FetchRequestObject;\n response: FetchResponseObject;\n}\n\n/** @see {@link https://zimic.dev/docs/fetch/api/fetch-response-error `FetchResponseError` API reference} */\nclass FetchResponseError<\n Schema extends HttpSchema,\n Method extends HttpSchemaMethod<Schema>,\n Path extends HttpSchemaPath.Literal<Schema, Method>,\n> extends Error {\n constructor(\n public request: FetchRequest<Schema, Method, Path>,\n public response: FetchResponse<Schema, Method, Path, true, 'manual'>,\n ) {\n super(`${request.method} ${request.url} failed with status ${response.status}: ${response.statusText}`);\n this.name = 'FetchResponseError';\n }\n\n /** @see {@link https://zimic.dev/docs/fetch/api/fetch-response-error#errortoobject `fetchResponseError.toObject()` API reference} */\n toObject(options: FetchResponseErrorObjectOptions.WithBody): Promise<FetchResponseErrorObject>;\n toObject(options?: FetchResponseErrorObjectOptions.WithoutBody): FetchResponseErrorObject;\n toObject(options?: FetchResponseErrorObjectOptions): PossiblePromise<FetchResponseErrorObject>;\n toObject({\n includeRequestBody = false,\n includeResponseBody = false,\n }: FetchResponseErrorObjectOptions = {}): PossiblePromise<FetchResponseErrorObject> {\n const partialObject = {\n name: this.name,\n message: this.message,\n } satisfies Partial<FetchResponseErrorObject>;\n\n if (!includeRequestBody && !includeResponseBody) {\n return {\n ...partialObject,\n request: this.requestToObject({ includeBody: false }),\n response: this.responseToObject({ includeBody: false }),\n };\n }\n\n return Promise.all([\n Promise.resolve(this.requestToObject({ includeBody: includeRequestBody })),\n Promise.resolve(this.responseToObject({ includeBody: includeResponseBody })),\n ]).then(([request, response]) => ({ ...partialObject, request, response }));\n }\n\n private requestToObject(options: { includeBody: true }): Promise<FetchRequestObject>;\n private requestToObject(options: { includeBody: false }): FetchRequestObject;\n private requestToObject(options: { includeBody: boolean }): PossiblePromise<FetchRequestObject>;\n private requestToObject(options: { includeBody: boolean }): PossiblePromise<FetchRequestObject> {\n const request = this.request;\n\n const requestObject: FetchRequestObject = {\n url: request.url,\n path: request.path,\n method: request.method,\n headers: this.convertHeadersToObject(request),\n cache: request.cache,\n destination: request.destination,\n credentials: request.credentials,\n integrity: request.integrity,\n keepalive: request.keepalive,\n mode: request.mode,\n redirect: request.redirect,\n referrer: request.referrer,\n referrerPolicy: request.referrerPolicy,\n };\n\n if (!options.includeBody) {\n return requestObject;\n }\n\n return this.withIncludedBodyIfAvailable('request', requestObject);\n }\n\n private responseToObject(options: { includeBody: true }): Promise<FetchResponseObject>;\n private responseToObject(options: { includeBody: false }): FetchResponseObject;\n private responseToObject(options: { includeBody: boolean }): PossiblePromise<FetchResponseObject>;\n private responseToObject(options: { includeBody: boolean }): PossiblePromise<FetchResponseObject> {\n const response = this.response;\n\n const responseObject: FetchResponseObject = {\n url: response.url,\n type: response.type,\n status: response.status,\n statusText: response.statusText,\n ok: response.ok,\n headers: this.convertHeadersToObject(response),\n redirected: response.redirected,\n };\n\n if (!options.includeBody) {\n return responseObject;\n }\n\n return this.withIncludedBodyIfAvailable('response', responseObject);\n }\n\n private convertHeadersToObject(\n resource: FetchRequest<Schema, Method, Path> | FetchResponse<Schema, Method, Path, true, 'manual'>,\n ): HttpHeadersSchema {\n return HttpHeaders.prototype.toObject.call(resource.headers) as HttpHeadersSchema;\n }\n\n private withIncludedBodyIfAvailable(\n resourceType: 'request',\n resourceObject: FetchRequestObject,\n ): PossiblePromise<FetchRequestObject>;\n private withIncludedBodyIfAvailable(\n resourceType: 'response',\n resourceObject: FetchResponseObject,\n ): PossiblePromise<FetchResponseObject>;\n private withIncludedBodyIfAvailable(\n resourceType: 'request' | 'response',\n resourceObject: FetchRequestObject | FetchResponseObject,\n ): PossiblePromise<FetchRequestObject | FetchResponseObject> {\n const resource = this[resourceType] as Request | Response;\n\n if (resource.bodyUsed) {\n console.warn(\n '[@zimic/fetch]',\n `Could not include the ${resourceType} body because it is already used. ` +\n 'If you access the body before calling `error.toObject()`, consider reading it from a cloned ' +\n `${resourceType}.\\n\\nLearn more: https://zimic.dev/docs/fetch/api/fetch-response-error#errortoobject`,\n );\n return resourceObject;\n }\n\n return parseHttpBody(resource)\n .then((body) => {\n resourceObject.body = body;\n return resourceObject;\n })\n .catch((error: unknown) => {\n console.error('[@zimic/fetch]', `Failed to parse ${resourceType} body:`, error);\n return resourceObject;\n });\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyFetchRequestError = FetchResponseError<any, any, any>;\n\nexport default FetchResponseError;\n","export function createPathCharactersToEscapeRegex() {\n return /([.(){}+$])/g;\n}\n\nexport function preparePathForRegex(path: string) {\n // We encode the path using the URL API because, differently from encodeURI and encodeURIComponent, URL does not\n // re-encode already encoded characters. Since URL requires a full URL, we use a data scheme and strip it later.\n const pathURLPrefix = `data:${path.startsWith('/') ? '' : '/'}`;\n const pathAsURL = new URL(`${pathURLPrefix}${path}`);\n const encodedPath = pathAsURL.href.replace(pathURLPrefix, '');\n\n return encodedPath.replace(/^\\/+/g, '').replace(/\\/+$/g, '').replace(createPathCharactersToEscapeRegex(), '\\\\$1');\n}\n\n// Path params names must match the JavaScript identifier pattern.\n// See // https://developer.mozilla.org/docs/Web/JavaScript/Reference/Lexical_grammar#identifiers.\nexport function createPathParamRegex() {\n return /(?<escape>\\\\)?:(?<identifier>[$_\\p{ID_Start}][$\\p{ID_Continue}]+)(?!\\\\[*+?])/gu;\n}\n\nexport function createRepeatingPathParamRegex() {\n return /(?<escape>\\\\)?:(?<identifier>[$_\\p{ID_Start}][$\\p{ID_Continue}]+)\\\\\\+/gu;\n}\n\nexport function createOptionalPathParamRegex() {\n return /(?<leadingSlash>\\/)?(?<escape>\\\\)?:(?<identifier>[$_\\p{ID_Start}][$\\p{ID_Continue}]+)\\?(?<trailingSlash>\\/)?/gu;\n}\n\nexport function createOptionalRepeatingPathParamRegex() {\n return /(?<leadingSlash>\\/)?(?<escape>\\\\)?:(?<identifier>[$_\\p{ID_Start}][$\\p{ID_Continue}]+)\\*(?<trailingSlash>\\/)?/gu;\n}\n\nfunction createRegexFromPath(path: string) {\n const pathRegexContent = preparePathForRegex(path)\n .replace(\n createOptionalRepeatingPathParamRegex(),\n (\n _match,\n leadingSlash: string | undefined,\n escape: string | undefined,\n identifier: string,\n trailingSlash: string | undefined,\n ) => {\n if (escape) {\n return `${leadingSlash ?? ''}:${identifier}\\\\*${trailingSlash ?? ''}`;\n }\n\n const hasSegmentBeforePrefix = leadingSlash === '/';\n const prefixExpression = hasSegmentBeforePrefix ? '/?' : leadingSlash;\n\n const hasSegmentAfterSuffix = trailingSlash === '/';\n const suffixExpression = hasSegmentAfterSuffix ? '/?' : trailingSlash;\n\n if (prefixExpression && suffixExpression) {\n return `(?:${prefixExpression}(?<${identifier}>.+?)?${suffixExpression})?`;\n } else if (prefixExpression) {\n return `(?:${prefixExpression}(?<${identifier}>.+?))?`;\n } else if (suffixExpression) {\n return `(?:(?<${identifier}>.+?)${suffixExpression})?`;\n } else {\n return `(?<${identifier}>.+?)?`;\n }\n },\n )\n .replace(createRepeatingPathParamRegex(), (_match, escape: string | undefined, identifier: string) => {\n return escape ? `:${identifier}\\\\+` : `(?<${identifier}>.+)`;\n })\n .replace(\n createOptionalPathParamRegex(),\n (\n _match,\n leadingSlash: string | undefined,\n escape: string | undefined,\n identifier: string,\n trailingSlash: string | undefined,\n ) => {\n if (escape) {\n return `${leadingSlash ?? ''}:${identifier}\\\\?${trailingSlash ?? ''}`;\n }\n\n const hasSegmentBeforePrefix = leadingSlash === '/';\n const prefixExpression = hasSegmentBeforePrefix ? '/?' : leadingSlash;\n\n const hasSegmentAfterSuffix = trailingSlash === '/';\n const suffixExpression = hasSegmentAfterSuffix ? '/?' : trailingSlash;\n\n if (prefixExpression && suffixExpression) {\n return `(?:${prefixExpression}(?<${identifier}>[^\\\\/]+?)?${suffixExpression})`;\n } else if (prefixExpression) {\n return `(?:${prefixExpression}(?<${identifier}>[^\\\\/]+?))?`;\n } else if (suffixExpression) {\n return `(?:(?<${identifier}>[^\\\\/]+?)${suffixExpression})?`;\n } else {\n return `(?<${identifier}>[^\\\\/]+?)?`;\n }\n },\n )\n .replace(createPathParamRegex(), (_match, escape: string | undefined, identifier: string) => {\n return escape ? `:${identifier}` : `(?<${identifier}>[^\\\\/]+?)`;\n });\n\n return new RegExp(`^/?${pathRegexContent}/?$`);\n}\n\nexport default createRegexFromPath;\n","function excludeNonPathParams(url: URL) {\n url.hash = '';\n url.search = '';\n url.username = '';\n url.password = '';\n return url;\n}\n\nexport default excludeNonPathParams;\n","function joinURL(...parts: (URL | string)[]) {\n return parts\n .map((part, index) => {\n const isFirstPart = index === 0;\n const isLastPart = index === parts.length - 1;\n\n let partAsString = part.toString();\n\n if (!isFirstPart) {\n partAsString = partAsString.replace(/^\\//, '');\n }\n if (!isLastPart) {\n partAsString = partAsString.replace(/\\/$/, '');\n }\n\n return partAsString;\n })\n .filter((part) => part.length > 0)\n .join('/');\n}\n\nexport default joinURL;\n","import {\n HttpSchemaPath,\n HttpSchemaMethod,\n HttpSearchParams,\n LiteralHttpSchemaPathFromNonLiteral,\n HttpSchema,\n HttpHeaders,\n} from '@zimic/http';\nimport createRegexFromPath from '@zimic/utils/url/createRegexFromPath';\nimport excludeNonPathParams from '@zimic/utils/url/excludeNonPathParams';\nimport joinURL from '@zimic/utils/url/joinURL';\n\nimport FetchResponseError from './errors/FetchResponseError';\nimport { FetchInput, FetchOptions, Fetch, FetchDefaults } from './types/public';\nimport { FetchRequestConstructor, FetchRequestInit, FetchRequest, FetchResponse } from './types/requests';\n\nclass FetchClient<Schema extends HttpSchema> implements Omit<Fetch<Schema>, 'loose' | 'Request' | keyof FetchDefaults> {\n fetch: Fetch<Schema>;\n\n constructor({ headers = {}, searchParams = {}, ...otherOptions }: FetchOptions<Schema>) {\n this.fetch = this.createFetchFunction();\n this.fetch.headers = headers;\n this.fetch.searchParams = searchParams;\n Object.assign(this.fetch, otherOptions);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.fetch.loose = this.fetch as Fetch<any> as Fetch.Loose;\n this.fetch.Request = this.createRequestClass(this.fetch);\n }\n\n get defaults(): FetchDefaults {\n return this.fetch;\n }\n\n private createFetchFunction() {\n const fetch = async <\n Method extends HttpSchemaMethod<Schema>,\n Path extends HttpSchemaPath.NonLiteral<Schema, Method>,\n >(\n input: FetchInput<Schema, Method, Path>,\n init: FetchRequestInit<Schema, Method, LiteralHttpSchemaPathFromNonLiteral<Schema, Method, Path>>,\n ) => {\n const request = await this.createFetchRequest<Method, Path>(input, init);\n const requestClone = request.clone();\n\n const rawResponse = await globalThis.fetch(\n // Optimize type checking by narrowing the type of request\n requestClone as Request,\n );\n const response = await this.createFetchResponse<\n Method,\n LiteralHttpSchemaPathFromNonLiteral<Schema, Method, Path>\n >(request, rawResponse);\n\n return response;\n };\n\n Object.setPrototypeOf(fetch, this);\n\n return fetch as Fetch<Schema>;\n }\n\n private async createFetchRequest<\n Method extends HttpSchemaMethod<Schema>,\n Path extends HttpSchemaPath.NonLiteral<Schema, Method>,\n >(\n input: FetchInput<Schema, Method, Path>,\n init: FetchRequestInit<Schema, Method, LiteralHttpSchemaPathFromNonLiteral<Schema, Method, Path>>,\n ) {\n let request = input instanceof Request ? input : new this.fetch.Request(input, init);\n\n if (this.fetch.onRequest) {\n const requestAfterInterceptor = await this.fetch.onRequest(\n // Optimize type checking by narrowing the type of request\n request as FetchRequest.Loose,\n );\n\n if (requestAfterInterceptor !== request) {\n const isFetchRequest = requestAfterInterceptor instanceof this.fetch.Request;\n\n request = isFetchRequest\n ? (requestAfterInterceptor as Request as typeof request)\n : new this.fetch.Request(requestAfterInterceptor as FetchInput<Schema, Method, Path>, init);\n }\n }\n\n return request;\n }\n\n private async createFetchResponse<\n Method extends HttpSchemaMethod<Schema>,\n Path extends HttpSchemaPath.Literal<Schema, Method>,\n >(fetchRequest: FetchRequest<Schema, Method, Path>, rawResponse: Response) {\n let response = this.defineFetchResponseProperties<Method, Path>(fetchRequest, rawResponse);\n\n if (this.fetch.onResponse) {\n const responseAfterInterceptor = await this.fetch.onResponse(\n // Optimize type checking by narrowing the type of response\n response as FetchResponse.Loose,\n );\n\n const isFetchResponse =\n responseAfterInterceptor instanceof Response &&\n 'request' in responseAfterInterceptor &&\n responseAfterInterceptor.request instanceof this.fetch.Request;\n\n response = isFetchResponse\n ? (responseAfterInterceptor as typeof response)\n : this.defineFetchResponseProperties<Method, Path>(fetchRequest, responseAfterInterceptor);\n }\n\n return response;\n }\n\n private defineFetchResponseProperties<\n Method extends HttpSchemaMethod<Schema>,\n Path extends HttpSchemaPath.Literal<Schema, Method>,\n >(fetchRequest: FetchRequest<Schema, Method, Path>, response: Response) {\n const fetchResponse = response as FetchResponse<Schema, Method, Path>;\n\n Object.defineProperty(fetchResponse, 'request', {\n value: fetchRequest,\n writable: false,\n enumerable: true,\n configurable: false,\n });\n\n let responseError: FetchResponse.Loose['error'] | undefined;\n\n Object.defineProperty(fetchResponse, 'error', {\n get() {\n if (responseError === undefined) {\n responseError = fetchResponse.ok\n ? null\n : new FetchResponseError(\n fetchRequest,\n fetchResponse as FetchResponse<Schema, Method, Path, true, 'manual'>,\n );\n }\n return responseError;\n },\n enumerable: true,\n configurable: false,\n });\n\n return fetchResponse;\n }\n\n private createRequestClass(fetch: Fetch<Schema>) {\n class Request<Method extends HttpSchemaMethod<Schema>, Path extends HttpSchemaPath.NonLiteral<Schema, Method>>\n extends globalThis.Request\n {\n path: LiteralHttpSchemaPathFromNonLiteral<Schema, Method, Path>;\n\n constructor(input: FetchInput<Schema, Method, Path>, init?: FetchRequestInit.Loose) {\n let actualInput: URL | globalThis.Request;\n\n const actualInit = {\n baseURL: init?.baseURL ?? fetch.baseURL,\n method: init?.method ?? fetch.method,\n headers: new HttpHeaders(fetch.headers),\n searchParams: new HttpSearchParams(fetch.searchParams),\n body: init?.body ?? fetch.body,\n mode: init?.mode ?? fetch.mode,\n cache: init?.cache ?? fetch.cache,\n credentials: init?.credentials ?? fetch.credentials,\n integrity: init?.integrity ?? fetch.integrity,\n keepalive: init?.keepalive ?? fetch.keepalive,\n priority: init?.priority ?? fetch.priority,\n redirect: init?.redirect ?? fetch.redirect,\n referrer: init?.referrer ?? fetch.referrer,\n referrerPolicy: init?.referrerPolicy ?? fetch.referrerPolicy,\n signal: init?.signal ?? fetch.signal,\n window: init?.window === undefined ? fetch.window : init.window,\n duplex: init?.duplex ?? fetch.duplex,\n };\n\n if (init?.headers) {\n actualInit.headers.assign(new HttpHeaders(init.headers));\n }\n\n let url: URL;\n const baseURL = new URL(actualInit.baseURL);\n\n if (input instanceof globalThis.Request) {\n const request = input as globalThis.Request;\n\n actualInit.headers.assign(new HttpHeaders(request.headers));\n\n url = new URL(input.url);\n\n actualInput = request;\n } else {\n url = new URL(input instanceof URL ? input : joinURL(baseURL, input));\n\n actualInit.searchParams.assign(new HttpSearchParams(url.searchParams));\n\n if (init?.searchParams) {\n actualInit.searchParams.assign(new HttpSearchParams(init.searchParams));\n }\n\n url.search = actualInit.searchParams.toString();\n\n actualInput = url;\n }\n\n super(actualInput, actualInit);\n\n const baseURLWithoutTrailingSlash = baseURL.toString().replace(/\\/$/, '');\n\n this.path = excludeNonPathParams(url)\n .toString()\n .replace(baseURLWithoutTrailingSlash, '') as LiteralHttpSchemaPathFromNonLiteral<Schema, Method, Path>;\n }\n\n clone(): this {\n const rawClone = super.clone();\n return new Request(rawClone as FetchInput<Schema, Method, Path>) as this;\n }\n }\n\n return Request as FetchRequestConstructor<Schema>;\n }\n\n isRequest<Path extends HttpSchemaPath.Literal<Schema, Method>, Method extends HttpSchemaMethod<Schema>>(\n request: unknown,\n method: Method,\n path: Path,\n ): request is FetchRequest<Schema, Method, Path> {\n return (\n request instanceof Request &&\n request.method === method &&\n 'path' in request &&\n typeof request.path === 'string' &&\n createRegexFromPath(path).test(request.path)\n );\n }\n\n isResponse<Path extends HttpSchemaPath.Literal<Schema, Method>, Method extends HttpSchemaMethod<Schema>>(\n response: unknown,\n method: Method,\n path: Path,\n ): response is FetchResponse<Schema, Method, Path> {\n return (\n response instanceof Response &&\n 'request' in response &&\n this.isRequest(response.request, method, path) &&\n 'error' in response &&\n (response.error === null || response.error instanceof FetchResponseError)\n );\n }\n\n isResponseError<Path extends HttpSchemaPath.Literal<Schema, Method>, Method extends HttpSchemaMethod<Schema>>(\n error: unknown,\n method: Method,\n path: Path,\n ): error is FetchResponseError<Schema, Method, Path> {\n return (\n error instanceof FetchResponseError &&\n this.isRequest(error.request, method, path) &&\n this.isResponse(error.response, method, path)\n );\n }\n}\n\nexport default FetchClient;\n","import { HttpSchema } from '@zimic/http';\n\nimport FetchClient from './FetchClient';\nimport { FetchOptions, Fetch } from './types/public';\n\n/** @see {@link https://zimic.dev/docs/fetch/api/create-fetch `createFetch` API reference} */\nfunction createFetch<Schema extends HttpSchema>(options: FetchOptions<Schema>): Fetch<Schema> {\n const { fetch } = new FetchClient<Schema>(options);\n return fetch;\n}\n\nexport default createFetch;\n"]}
package/package.json CHANGED
@@ -13,7 +13,7 @@
13
13
  "api",
14
14
  "static"
15
15
  ],
16
- "version": "1.2.4-canary.6",
16
+ "version": "1.2.5-canary.0",
17
17
  "homepage": "https://zimic.dev/docs/fetch",
18
18
  "repository": {
19
19
  "type": "git",
@@ -76,9 +76,9 @@
76
76
  },
77
77
  "devDependencies": {
78
78
  "@types/node": "^24.10.1",
79
- "@vitest/browser": "^4.0.13",
80
- "@vitest/browser-playwright": "^4.0.13",
81
- "@vitest/coverage-istanbul": "^4.0.13",
79
+ "@vitest/browser": "^4.0.14",
80
+ "@vitest/browser-playwright": "^4.0.14",
81
+ "@vitest/coverage-istanbul": "^4.0.14",
82
82
  "@zimic/eslint-config-node": "workspace:*",
83
83
  "@zimic/interceptor": "workspace:*",
84
84
  "@zimic/lint-staged-config": "workspace:*",
@@ -87,10 +87,10 @@
87
87
  "dotenv-cli": "^11.0.0",
88
88
  "eslint": "^9.39.1",
89
89
  "picocolors": "^1.1.1",
90
- "playwright": "^1.56.1",
90
+ "playwright": "^1.57.0",
91
91
  "tsup": "^8.5.1",
92
92
  "typescript": "^5.9.3",
93
- "vitest": "^4.0.13"
93
+ "vitest": "^4.0.14"
94
94
  },
95
95
  "peerDependencies": {
96
96
  "@zimic/http": "^1.3.0 || workspace:*",
@@ -147,10 +147,9 @@ class FetchClient<Schema extends HttpSchema> implements Omit<Fetch<Schema>, 'loo
147
147
  }
148
148
 
149
149
  private createRequestClass(fetch: Fetch<Schema>) {
150
- class Request<
151
- Method extends HttpSchemaMethod<Schema>,
152
- Path extends HttpSchemaPath.NonLiteral<Schema, Method>,
153
- > extends globalThis.Request {
150
+ class Request<Method extends HttpSchemaMethod<Schema>, Path extends HttpSchemaPath.NonLiteral<Schema, Method>>
151
+ extends globalThis.Request
152
+ {
154
153
  path: LiteralHttpSchemaPathFromNonLiteral<Schema, Method, Path>;
155
154
 
156
155
  constructor(input: FetchInput<Schema, Method, Path>, init?: FetchRequestInit.Loose) {
@@ -13,8 +13,7 @@ export type FetchInput<
13
13
 
14
14
  /** @see {@link https://zimic.dev/docs/fetch/api/fetch `fetch` API reference} */
15
15
  export interface Fetch<Schema extends HttpSchema>
16
- extends Pick<FetchOptions<Schema>, 'onRequest' | 'onResponse'>,
17
- FetchDefaults {
16
+ extends Pick<FetchOptions<Schema>, 'onRequest' | 'onResponse'>, FetchDefaults {
18
17
  <
19
18
  Method extends HttpSchemaMethod<Schema>,
20
19
  Path extends HttpSchemaPath.NonLiteral<Schema, Method>,
@@ -53,7 +53,7 @@ type FetchRequestBodySchema<RequestSchema extends HttpRequestSchema> = 'body' ex
53
53
  ? JSONStringified<Exclude<RequestSchema['body'], null | undefined>> | null | undefined
54
54
  : JSONStringified<Exclude<RequestSchema['body'], null>> | Extract<RequestSchema['body'], null>
55
55
  : undefined extends RequestSchema['body']
56
- ? RequestSchema['body'] | null
56
+ ? RequestSchema['body']
57
57
  : RequestSchema['body']
58
58
  : null | undefined;
59
59
 
@@ -135,9 +135,9 @@ export interface FetchRequest<
135
135
  Method extends HttpSchemaMethod<Schema>,
136
136
  Path extends HttpSchemaPath.Literal<Schema, Method>,
137
137
  > extends HttpRequest<
138
- HttpRequestBodySchema<Default<Schema[Path][Method]>>,
139
- Default<HttpRequestHeadersSchema<Default<Schema[Path][Method]>>>
140
- > {
138
+ HttpRequestBodySchema<Default<Schema[Path][Method]>>,
139
+ Default<HttpRequestHeadersSchema<Default<Schema[Path][Method]>>>
140
+ > {
141
141
  /** The path of the request, excluding the base URL. */
142
142
  path: AllowAnyStringInPathParams<Path>;
143
143
  /** The HTTP method of the request. */
@@ -195,10 +195,10 @@ export interface FetchResponsePerStatusCode<
195
195
  Path extends HttpSchemaPath.Literal<Schema, Method>,
196
196
  StatusCode extends HttpStatusCode = HttpStatusCode,
197
197
  > extends HttpResponse<
198
- HttpResponseBodySchema<Default<Schema[Path][Method]>, StatusCode>,
199
- Default<HttpResponseHeadersSchema<Default<Schema[Path][Method]>, StatusCode>>,
200
- StatusCode
201
- > {
198
+ HttpResponseBodySchema<Default<Schema[Path][Method]>, StatusCode>,
199
+ Default<HttpResponseHeadersSchema<Default<Schema[Path][Method]>, StatusCode>>,
200
+ StatusCode
201
+ > {
202
202
  /** The request that originated the response. */
203
203
  request: FetchRequest<Schema, Method, Path>;
204
204
 
@@ -220,11 +220,8 @@ export type FetchResponse<
220
220
  Path extends HttpSchemaPath.Literal<Schema, Method>,
221
221
  ErrorOnly extends boolean = false,
222
222
  Redirect extends RequestRedirect = 'follow',
223
- StatusCode extends FetchResponseStatusCode<
224
- Default<Schema[Path][Method]>,
225
- ErrorOnly,
226
- Redirect
227
- > = FetchResponseStatusCode<Default<Schema[Path][Method]>, ErrorOnly, Redirect>,
223
+ StatusCode extends FetchResponseStatusCode<Default<Schema[Path][Method]>, ErrorOnly, Redirect> =
224
+ FetchResponseStatusCode<Default<Schema[Path][Method]>, ErrorOnly, Redirect>,
228
225
  > = StatusCode extends StatusCode ? FetchResponsePerStatusCode<Schema, Method, Path, StatusCode> : never;
229
226
 
230
227
  export namespace FetchResponse {