@zimic/fetch 1.0.6-canary.1 → 1.0.6-canary.3
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 +4 -3
- package/dist/index.js +25 -15
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +25 -15
- package/dist/index.mjs.map +1 -1
- package/package.json +5 -5
- package/src/client/errors/FetchResponseError.ts +47 -26
package/dist/index.d.ts
CHANGED
|
@@ -204,11 +204,12 @@ declare class FetchResponseError<Schema extends HttpSchema, Method extends HttpS
|
|
|
204
204
|
constructor(request: FetchRequest<Schema, Method, Path>, response: FetchResponse<Schema, Method, Path, true, 'manual'>);
|
|
205
205
|
/** @see {@link https://zimic.dev/docs/fetch/api/fetch-response-error#errortoobject `fetchResponseError.toObject()` API reference} */
|
|
206
206
|
toObject(options: FetchResponseErrorObjectOptions.WithBody): Promise<FetchResponseErrorObject>;
|
|
207
|
-
toObject(options
|
|
208
|
-
toObject(options?: FetchResponseErrorObjectOptions):
|
|
207
|
+
toObject(options?: FetchResponseErrorObjectOptions.WithoutBody): FetchResponseErrorObject;
|
|
208
|
+
toObject(options?: FetchResponseErrorObjectOptions): PossiblePromise<FetchResponseErrorObject>;
|
|
209
209
|
private requestToObject;
|
|
210
210
|
private responseToObject;
|
|
211
|
-
private
|
|
211
|
+
private convertHeadersToObject;
|
|
212
|
+
private withIncludedBodyIfAvailable;
|
|
212
213
|
}
|
|
213
214
|
type AnyFetchRequestError = FetchResponseError<any, any, any>;
|
|
214
215
|
|
package/dist/index.js
CHANGED
|
@@ -14,7 +14,10 @@ var FetchResponseError = class extends Error {
|
|
|
14
14
|
static {
|
|
15
15
|
__name(this, "FetchResponseError");
|
|
16
16
|
}
|
|
17
|
-
toObject({
|
|
17
|
+
toObject({
|
|
18
|
+
includeRequestBody = false,
|
|
19
|
+
includeResponseBody = false
|
|
20
|
+
} = {}) {
|
|
18
21
|
const partialObject = {
|
|
19
22
|
name: this.name,
|
|
20
23
|
message: this.message
|
|
@@ -37,7 +40,7 @@ var FetchResponseError = class extends Error {
|
|
|
37
40
|
url: request.url,
|
|
38
41
|
path: request.path,
|
|
39
42
|
method: request.method,
|
|
40
|
-
headers: this.
|
|
43
|
+
headers: this.convertHeadersToObject(request),
|
|
41
44
|
cache: request.cache,
|
|
42
45
|
destination: request.destination,
|
|
43
46
|
credentials: request.credentials,
|
|
@@ -51,11 +54,7 @@ var FetchResponseError = class extends Error {
|
|
|
51
54
|
if (!options.includeBody) {
|
|
52
55
|
return requestObject;
|
|
53
56
|
}
|
|
54
|
-
|
|
55
|
-
return bodyAsTextPromise.then((bodyAsText) => {
|
|
56
|
-
requestObject.body = bodyAsText.length > 0 ? bodyAsText : null;
|
|
57
|
-
return requestObject;
|
|
58
|
-
});
|
|
57
|
+
return this.withIncludedBodyIfAvailable("request", requestObject);
|
|
59
58
|
}
|
|
60
59
|
responseToObject(options) {
|
|
61
60
|
const response = this.response;
|
|
@@ -65,20 +64,31 @@ var FetchResponseError = class extends Error {
|
|
|
65
64
|
status: response.status,
|
|
66
65
|
statusText: response.statusText,
|
|
67
66
|
ok: response.ok,
|
|
68
|
-
headers: this.
|
|
67
|
+
headers: this.convertHeadersToObject(response),
|
|
69
68
|
redirected: response.redirected
|
|
70
69
|
};
|
|
71
70
|
if (!options.includeBody) {
|
|
72
71
|
return responseObject;
|
|
73
72
|
}
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
});
|
|
73
|
+
return this.withIncludedBodyIfAvailable("response", responseObject);
|
|
74
|
+
}
|
|
75
|
+
convertHeadersToObject(resource) {
|
|
76
|
+
return http.HttpHeaders.prototype.toObject.call(resource.headers);
|
|
79
77
|
}
|
|
80
|
-
|
|
81
|
-
|
|
78
|
+
withIncludedBodyIfAvailable(resourceType, resourceObject) {
|
|
79
|
+
const resource = this[resourceType];
|
|
80
|
+
if (resource.bodyUsed) {
|
|
81
|
+
console.warn(
|
|
82
|
+
`[@zimic/fetch] Could not include the ${resourceType} body because it is already used. If you access the body before calling \`error.toObject()\`, consider reading it from a cloned ${resourceType}.
|
|
83
|
+
|
|
84
|
+
Learn more: https://zimic.dev/docs/fetch/api/fetch-response-error#errortoobject`
|
|
85
|
+
);
|
|
86
|
+
return resourceObject;
|
|
87
|
+
}
|
|
88
|
+
return resource.text().then((body) => {
|
|
89
|
+
resourceObject.body = body.length > 0 ? body : null;
|
|
90
|
+
return resourceObject;
|
|
91
|
+
});
|
|
82
92
|
}
|
|
83
93
|
};
|
|
84
94
|
var FetchResponseError_default = FetchResponseError;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/client/errors/FetchResponseError.ts","../../zimic-utils/dist/chunk-2D3UJWOA.mjs","../../zimic-utils/src/url/createParametrizedPathPattern.ts","../../zimic-utils/src/url/excludeURLParams.ts","../../zimic-utils/src/url/joinURL.ts","../src/client/FetchClient.ts","../src/client/factory.ts"],"names":["HttpHeaders","__defProp","__name","Request","HttpSearchParams"],"mappings":"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","file":"index.js","sourcesContent":["import { HttpHeaders, HttpHeadersSchema, HttpSchema, HttpSchemaMethod, HttpSchemaPath } from '@zimic/http';\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): Promise<FetchResponseErrorObject> | FetchResponseErrorObject;\n toObject({ includeRequestBody = false, includeResponseBody = false }: FetchResponseErrorObjectOptions = {}):\n | Promise<FetchResponseErrorObject>\n | 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 }): Promise<FetchRequestObject> | FetchRequestObject;\n private requestToObject(options: { includeBody: boolean }): Promise<FetchRequestObject> | 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.headersToObject(request.headers),\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 // Optimize type checking by narrowing the type of the body\n const bodyAsTextPromise = request.text() as Promise<string>;\n\n return bodyAsTextPromise.then((bodyAsText) => {\n requestObject.body = bodyAsText.length > 0 ? bodyAsText : null;\n return requestObject;\n });\n }\n\n private responseToObject(options: { includeBody: true }): Promise<FetchResponseObject>;\n private responseToObject(options: { includeBody: false }): FetchResponseObject;\n private responseToObject(options: { includeBody: boolean }): Promise<FetchResponseObject> | FetchResponseObject;\n private responseToObject(options: { includeBody: boolean }): Promise<FetchResponseObject> | 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.headersToObject(response.headers),\n redirected: response.redirected,\n };\n\n if (!options.includeBody) {\n return responseObject;\n }\n\n // Optimize type checking by narrowing the type of the body\n const bodyAsTextPromise = response.text() as Promise<string>;\n\n return bodyAsTextPromise.then((bodyAsText) => {\n responseObject.body = bodyAsText.length > 0 ? bodyAsText : null;\n return responseObject;\n });\n }\n\n private headersToObject(headers: typeof this.request.headers | typeof this.response.headers): HttpHeadersSchema {\n return HttpHeaders.prototype.toObject.call(headers) as HttpHeadersSchema;\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","var __create = Object.create;\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __getProtoOf = Object.getPrototypeOf;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __name = (target, value) => __defProp(target, \"name\", { value, configurable: true });\nvar __commonJS = (cb, mod) => function __require() {\n return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;\n};\nvar __copyProps = (to, from, except, desc) => {\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))\n if (!__hasOwnProp.call(to, key) && key !== except)\n __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n }\n return to;\n};\nvar __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(\n // If the importer is in node compatibility mode or this is not an ESM\n // file that has been converted to a CommonJS file using a Babel-\n // compatible transform (i.e. \"__esModule\" has not been set), then set\n // \"default\" to the CommonJS \"module.exports\" for node compatibility.\n isNodeMode || !mod || !mod.__esModule ? __defProp(target, \"default\", { value: mod, enumerable: true }) : target,\n mod\n));\n\nexport { __commonJS, __name, __toESM };\n//# sourceMappingURL=chunk-2D3UJWOA.mjs.map\n//# sourceMappingURL=chunk-2D3UJWOA.mjs.map","export function getExtraPatternsToEscape() {\n return /([.(){}+$])/g;\n}\n\nexport function getURIEncodedBackSlashPattern() {\n return /%5C/g;\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 getPathParamPattern() {\n return /(?<escape>\\\\)?:(?<identifier>[$_\\p{ID_Start}][$\\p{ID_Continue}]+)/gu;\n}\n\nexport function getRepeatingPathParamPattern() {\n return /(?<escape>\\\\)?:(?<identifier>[$_\\p{ID_Start}][$\\p{ID_Continue}]+)\\\\+/gu;\n}\n\nexport function getOptionalPathParamPattern() {\n return /(?<leadingSlash>\\/)?(?<escape>\\\\)?:(?<identifier>[$_\\p{ID_Start}][$\\p{ID_Continue}]+)\\?(?<trailingSlash>\\/)?/gu;\n}\n\nexport function getOptionalRepeatingPathParamPattern() {\n return /(?<leadingSlash>\\/)?(?<escape>\\\\)?:(?<identifier>[$_\\p{ID_Start}][$\\p{ID_Continue}]+)\\*(?<trailingSlash>\\/)?/gu;\n}\n\nfunction createParametrizedPathPattern(path: string) {\n const replacedURL = encodeURI(path)\n .replace(/^\\/+/g, '')\n .replace(/\\/+$/g, '')\n .replace(getExtraPatternsToEscape(), '\\\\$1')\n .replace(getURIEncodedBackSlashPattern(), '\\\\')\n .replace(\n getOptionalRepeatingPathParamPattern(),\n (\n _match,\n leadingSlash: string | undefined,\n escape: string | undefined,\n identifier: string,\n trailingSlash: string | undefined,\n ) => {\n if (escape) {\n return `:${identifier}`;\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(getRepeatingPathParamPattern(), (_match, escape: string | undefined, identifier: string) => {\n return escape ? `:${identifier}` : `(?<${identifier}>.+)`;\n })\n .replace(\n getOptionalPathParamPattern(),\n (\n _match,\n leadingSlash: string | undefined,\n escape: string | undefined,\n identifier: string,\n trailingSlash: string | undefined,\n ) => {\n if (escape) {\n return `:${identifier}`;\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(getPathParamPattern(), (_match, escape: string | undefined, identifier: string) => {\n return escape ? `:${identifier}` : `(?<${identifier}>[^\\\\/]+?)`;\n });\n\n return new RegExp(`^/?${replacedURL}/?$`);\n}\n\nexport default createParametrizedPathPattern;\n","function excludeURLParams(url: URL) {\n url.hash = '';\n url.search = '';\n url.username = '';\n url.password = '';\n return url;\n}\n\nexport default excludeURLParams;\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 createParametrizedPathPattern from '@zimic/utils/url/createParametrizedPathPattern';\nimport excludeURLParams from '@zimic/utils/url/excludeURLParams';\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>, 'defaults' | 'loose' | 'Request'> {\n fetch: Fetch<Schema>;\n\n constructor({ onRequest, onResponse, ...defaults }: FetchOptions<Schema>) {\n this.fetch = this.createFetchFunction();\n\n this.fetch.defaults = {\n ...defaults,\n headers: defaults.headers ?? {},\n searchParams: defaults.searchParams ?? {},\n };\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.fetch.loose = this.fetch as Fetch<any> as Fetch.Loose;\n\n this.fetch.Request = this.createRequestClass(this.fetch.defaults);\n this.fetch.onRequest = onRequest;\n this.fetch.onResponse = onResponse;\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(defaults: FetchDefaults) {\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(\n input: FetchInput<Schema, Method, Path>,\n init: FetchRequestInit<Schema, Method, LiteralHttpSchemaPathFromNonLiteral<Schema, Method, Path>>,\n ) {\n const initWithDefaults = { ...defaults, ...init };\n\n const headersFromDefaults = new HttpHeaders(defaults.headers);\n const headersFromInit = new HttpHeaders((init satisfies RequestInit as RequestInit).headers);\n\n let url: URL;\n const baseURL = new URL(initWithDefaults.baseURL);\n\n if (input instanceof globalThis.Request) {\n // Optimize type checking by narrowing the type of input\n const request = input as globalThis.Request;\n\n // Optimize type checking by narrowing the type of headers\n const headersFromRequest = new HttpHeaders(input.headers as Headers);\n\n initWithDefaults.headers = {\n ...headersFromDefaults.toObject(),\n ...headersFromRequest.toObject(),\n ...headersFromInit.toObject(),\n };\n\n super(request, initWithDefaults);\n\n url = new URL(input.url);\n } else {\n initWithDefaults.headers = {\n ...headersFromDefaults.toObject(),\n ...headersFromInit.toObject(),\n };\n\n url = input instanceof URL ? new URL(input) : new URL(joinURL(baseURL, input));\n\n const searchParamsFromDefaults = new HttpSearchParams(defaults.searchParams);\n const searchParamsFromInit = new HttpSearchParams(initWithDefaults.searchParams);\n\n initWithDefaults.searchParams = {\n ...searchParamsFromDefaults.toObject(),\n ...searchParamsFromInit.toObject(),\n };\n\n url.search = new HttpSearchParams(initWithDefaults.searchParams).toString();\n\n super(url, initWithDefaults);\n }\n\n const baseURLWithoutTrailingSlash = baseURL.toString().replace(/\\/$/, '');\n\n this.path = excludeURLParams(url)\n .toString()\n .replace(baseURLWithoutTrailingSlash, '') as LiteralHttpSchemaPathFromNonLiteral<Schema, Method, Path>;\n }\n\n clone(): Request<Method, Path> {\n const rawClone = super.clone();\n\n return new Request<Method, Path>(\n rawClone as unknown as FetchInput<Schema, Method, Path>,\n rawClone as unknown as FetchRequestInit<\n Schema,\n Method,\n LiteralHttpSchemaPathFromNonLiteral<Schema, Method, Path>\n >,\n );\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 createParametrizedPathPattern(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/dist/chunk-2D3UJWOA.mjs","../../zimic-utils/src/url/createParametrizedPathPattern.ts","../../zimic-utils/src/url/excludeURLParams.ts","../../zimic-utils/src/url/joinURL.ts","../src/client/FetchClient.ts","../src/client/factory.ts"],"names":["HttpHeaders","__defProp","__name","Request","HttpSearchParams"],"mappings":"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","file":"index.js","sourcesContent":["import { HttpHeaders, HttpHeadersSchema, HttpSchema, HttpSchemaMethod, HttpSchemaPath } 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];\n\n if (resource.bodyUsed) {\n console.warn(\n `[@zimic/fetch] 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 resource.text().then((body: string) => {\n resourceObject.body = body.length > 0 ? body : null;\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","var __create = Object.create;\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __getProtoOf = Object.getPrototypeOf;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __name = (target, value) => __defProp(target, \"name\", { value, configurable: true });\nvar __commonJS = (cb, mod) => function __require() {\n return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;\n};\nvar __copyProps = (to, from, except, desc) => {\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))\n if (!__hasOwnProp.call(to, key) && key !== except)\n __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n }\n return to;\n};\nvar __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(\n // If the importer is in node compatibility mode or this is not an ESM\n // file that has been converted to a CommonJS file using a Babel-\n // compatible transform (i.e. \"__esModule\" has not been set), then set\n // \"default\" to the CommonJS \"module.exports\" for node compatibility.\n isNodeMode || !mod || !mod.__esModule ? __defProp(target, \"default\", { value: mod, enumerable: true }) : target,\n mod\n));\n\nexport { __commonJS, __name, __toESM };\n//# sourceMappingURL=chunk-2D3UJWOA.mjs.map\n//# sourceMappingURL=chunk-2D3UJWOA.mjs.map","export function getExtraPatternsToEscape() {\n return /([.(){}+$])/g;\n}\n\nexport function getURIEncodedBackSlashPattern() {\n return /%5C/g;\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 getPathParamPattern() {\n return /(?<escape>\\\\)?:(?<identifier>[$_\\p{ID_Start}][$\\p{ID_Continue}]+)/gu;\n}\n\nexport function getRepeatingPathParamPattern() {\n return /(?<escape>\\\\)?:(?<identifier>[$_\\p{ID_Start}][$\\p{ID_Continue}]+)\\\\+/gu;\n}\n\nexport function getOptionalPathParamPattern() {\n return /(?<leadingSlash>\\/)?(?<escape>\\\\)?:(?<identifier>[$_\\p{ID_Start}][$\\p{ID_Continue}]+)\\?(?<trailingSlash>\\/)?/gu;\n}\n\nexport function getOptionalRepeatingPathParamPattern() {\n return /(?<leadingSlash>\\/)?(?<escape>\\\\)?:(?<identifier>[$_\\p{ID_Start}][$\\p{ID_Continue}]+)\\*(?<trailingSlash>\\/)?/gu;\n}\n\nfunction createParametrizedPathPattern(path: string) {\n const replacedURL = encodeURI(path)\n .replace(/^\\/+/g, '')\n .replace(/\\/+$/g, '')\n .replace(getExtraPatternsToEscape(), '\\\\$1')\n .replace(getURIEncodedBackSlashPattern(), '\\\\')\n .replace(\n getOptionalRepeatingPathParamPattern(),\n (\n _match,\n leadingSlash: string | undefined,\n escape: string | undefined,\n identifier: string,\n trailingSlash: string | undefined,\n ) => {\n if (escape) {\n return `:${identifier}`;\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(getRepeatingPathParamPattern(), (_match, escape: string | undefined, identifier: string) => {\n return escape ? `:${identifier}` : `(?<${identifier}>.+)`;\n })\n .replace(\n getOptionalPathParamPattern(),\n (\n _match,\n leadingSlash: string | undefined,\n escape: string | undefined,\n identifier: string,\n trailingSlash: string | undefined,\n ) => {\n if (escape) {\n return `:${identifier}`;\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(getPathParamPattern(), (_match, escape: string | undefined, identifier: string) => {\n return escape ? `:${identifier}` : `(?<${identifier}>[^\\\\/]+?)`;\n });\n\n return new RegExp(`^/?${replacedURL}/?$`);\n}\n\nexport default createParametrizedPathPattern;\n","function excludeURLParams(url: URL) {\n url.hash = '';\n url.search = '';\n url.username = '';\n url.password = '';\n return url;\n}\n\nexport default excludeURLParams;\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 createParametrizedPathPattern from '@zimic/utils/url/createParametrizedPathPattern';\nimport excludeURLParams from '@zimic/utils/url/excludeURLParams';\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>, 'defaults' | 'loose' | 'Request'> {\n fetch: Fetch<Schema>;\n\n constructor({ onRequest, onResponse, ...defaults }: FetchOptions<Schema>) {\n this.fetch = this.createFetchFunction();\n\n this.fetch.defaults = {\n ...defaults,\n headers: defaults.headers ?? {},\n searchParams: defaults.searchParams ?? {},\n };\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.fetch.loose = this.fetch as Fetch<any> as Fetch.Loose;\n\n this.fetch.Request = this.createRequestClass(this.fetch.defaults);\n this.fetch.onRequest = onRequest;\n this.fetch.onResponse = onResponse;\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(defaults: FetchDefaults) {\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(\n input: FetchInput<Schema, Method, Path>,\n init: FetchRequestInit<Schema, Method, LiteralHttpSchemaPathFromNonLiteral<Schema, Method, Path>>,\n ) {\n const initWithDefaults = { ...defaults, ...init };\n\n const headersFromDefaults = new HttpHeaders(defaults.headers);\n const headersFromInit = new HttpHeaders((init satisfies RequestInit as RequestInit).headers);\n\n let url: URL;\n const baseURL = new URL(initWithDefaults.baseURL);\n\n if (input instanceof globalThis.Request) {\n // Optimize type checking by narrowing the type of input\n const request = input as globalThis.Request;\n\n // Optimize type checking by narrowing the type of headers\n const headersFromRequest = new HttpHeaders(input.headers as Headers);\n\n initWithDefaults.headers = {\n ...headersFromDefaults.toObject(),\n ...headersFromRequest.toObject(),\n ...headersFromInit.toObject(),\n };\n\n super(request, initWithDefaults);\n\n url = new URL(input.url);\n } else {\n initWithDefaults.headers = {\n ...headersFromDefaults.toObject(),\n ...headersFromInit.toObject(),\n };\n\n url = input instanceof URL ? new URL(input) : new URL(joinURL(baseURL, input));\n\n const searchParamsFromDefaults = new HttpSearchParams(defaults.searchParams);\n const searchParamsFromInit = new HttpSearchParams(initWithDefaults.searchParams);\n\n initWithDefaults.searchParams = {\n ...searchParamsFromDefaults.toObject(),\n ...searchParamsFromInit.toObject(),\n };\n\n url.search = new HttpSearchParams(initWithDefaults.searchParams).toString();\n\n super(url, initWithDefaults);\n }\n\n const baseURLWithoutTrailingSlash = baseURL.toString().replace(/\\/$/, '');\n\n this.path = excludeURLParams(url)\n .toString()\n .replace(baseURLWithoutTrailingSlash, '') as LiteralHttpSchemaPathFromNonLiteral<Schema, Method, Path>;\n }\n\n clone(): Request<Method, Path> {\n const rawClone = super.clone();\n\n return new Request<Method, Path>(\n rawClone as unknown as FetchInput<Schema, Method, Path>,\n rawClone as unknown as FetchRequestInit<\n Schema,\n Method,\n LiteralHttpSchemaPathFromNonLiteral<Schema, Method, Path>\n >,\n );\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 createParametrizedPathPattern(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/dist/index.mjs
CHANGED
|
@@ -12,7 +12,10 @@ var FetchResponseError = class extends Error {
|
|
|
12
12
|
static {
|
|
13
13
|
__name(this, "FetchResponseError");
|
|
14
14
|
}
|
|
15
|
-
toObject({
|
|
15
|
+
toObject({
|
|
16
|
+
includeRequestBody = false,
|
|
17
|
+
includeResponseBody = false
|
|
18
|
+
} = {}) {
|
|
16
19
|
const partialObject = {
|
|
17
20
|
name: this.name,
|
|
18
21
|
message: this.message
|
|
@@ -35,7 +38,7 @@ var FetchResponseError = class extends Error {
|
|
|
35
38
|
url: request.url,
|
|
36
39
|
path: request.path,
|
|
37
40
|
method: request.method,
|
|
38
|
-
headers: this.
|
|
41
|
+
headers: this.convertHeadersToObject(request),
|
|
39
42
|
cache: request.cache,
|
|
40
43
|
destination: request.destination,
|
|
41
44
|
credentials: request.credentials,
|
|
@@ -49,11 +52,7 @@ var FetchResponseError = class extends Error {
|
|
|
49
52
|
if (!options.includeBody) {
|
|
50
53
|
return requestObject;
|
|
51
54
|
}
|
|
52
|
-
|
|
53
|
-
return bodyAsTextPromise.then((bodyAsText) => {
|
|
54
|
-
requestObject.body = bodyAsText.length > 0 ? bodyAsText : null;
|
|
55
|
-
return requestObject;
|
|
56
|
-
});
|
|
55
|
+
return this.withIncludedBodyIfAvailable("request", requestObject);
|
|
57
56
|
}
|
|
58
57
|
responseToObject(options) {
|
|
59
58
|
const response = this.response;
|
|
@@ -63,20 +62,31 @@ var FetchResponseError = class extends Error {
|
|
|
63
62
|
status: response.status,
|
|
64
63
|
statusText: response.statusText,
|
|
65
64
|
ok: response.ok,
|
|
66
|
-
headers: this.
|
|
65
|
+
headers: this.convertHeadersToObject(response),
|
|
67
66
|
redirected: response.redirected
|
|
68
67
|
};
|
|
69
68
|
if (!options.includeBody) {
|
|
70
69
|
return responseObject;
|
|
71
70
|
}
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
});
|
|
71
|
+
return this.withIncludedBodyIfAvailable("response", responseObject);
|
|
72
|
+
}
|
|
73
|
+
convertHeadersToObject(resource) {
|
|
74
|
+
return HttpHeaders.prototype.toObject.call(resource.headers);
|
|
77
75
|
}
|
|
78
|
-
|
|
79
|
-
|
|
76
|
+
withIncludedBodyIfAvailable(resourceType, resourceObject) {
|
|
77
|
+
const resource = this[resourceType];
|
|
78
|
+
if (resource.bodyUsed) {
|
|
79
|
+
console.warn(
|
|
80
|
+
`[@zimic/fetch] Could not include the ${resourceType} body because it is already used. If you access the body before calling \`error.toObject()\`, consider reading it from a cloned ${resourceType}.
|
|
81
|
+
|
|
82
|
+
Learn more: https://zimic.dev/docs/fetch/api/fetch-response-error#errortoobject`
|
|
83
|
+
);
|
|
84
|
+
return resourceObject;
|
|
85
|
+
}
|
|
86
|
+
return resource.text().then((body) => {
|
|
87
|
+
resourceObject.body = body.length > 0 ? body : null;
|
|
88
|
+
return resourceObject;
|
|
89
|
+
});
|
|
80
90
|
}
|
|
81
91
|
};
|
|
82
92
|
var FetchResponseError_default = FetchResponseError;
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/client/errors/FetchResponseError.ts","../../zimic-utils/dist/chunk-2D3UJWOA.mjs","../../zimic-utils/src/url/createParametrizedPathPattern.ts","../../zimic-utils/src/url/excludeURLParams.ts","../../zimic-utils/src/url/joinURL.ts","../src/client/FetchClient.ts","../src/client/factory.ts"],"names":["__defProp","__name","Request","HttpHeaders"],"mappings":";;;;AA0CA,IAAM,kBAAA,GAAN,cAIU,KAAA,CAAM;AAAA,EACd,WAAA,CACS,SACA,QAAA,EACP;AACA,IAAA,KAAA,CAAM,CAAA,EAAG,OAAA,CAAQ,MAAM,CAAA,CAAA,EAAI,OAAA,CAAQ,GAAG,CAAA,oBAAA,EAAuB,QAAA,CAAS,MAAM,CAAA,EAAA,EAAK,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAH/F,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAGP,IAAA,IAAA,CAAK,IAAA,GAAO,oBAAA;AAAA;AACd,EArDF;AA8CgB,IAAA,MAAA,CAAA,IAAA,EAAA,oBAAA,CAAA;AAAA;AAAA,EAad,QAAA,CAAS,EAAE,kBAAA,GAAqB,KAAA,EAAO,sBAAsB,KAAA,EAAM,GAAqC,EAAC,EAE5E;AAC3B,IAAA,MAAM,aAAA,GAAgB;AAAA,MACpB,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,SAAS,IAAA,CAAK;AAAA,KAChB;AAEA,IAAA,IAAI,CAAC,kBAAA,IAAsB,CAAC,mBAAA,EAAqB;AAC/C,MAAA,OAAO;AAAA,QACL,GAAG,aAAA;AAAA,QACH,SAAS,IAAA,CAAK,eAAA,CAAgB,EAAE,WAAA,EAAa,OAAO,CAAA;AAAA,QACpD,UAAU,IAAA,CAAK,gBAAA,CAAiB,EAAE,WAAA,EAAa,OAAO;AAAA,OACxD;AAAA;AAGF,IAAA,OAAO,QAAQ,GAAA,CAAI;AAAA,MACjB,OAAA,CAAQ,QAAQ,IAAA,CAAK,eAAA,CAAgB,EAAE,WAAA,EAAa,kBAAA,EAAoB,CAAC,CAAA;AAAA,MACzE,OAAA,CAAQ,QAAQ,IAAA,CAAK,gBAAA,CAAiB,EAAE,WAAA,EAAa,mBAAA,EAAqB,CAAC;AAAA,KAC5E,CAAA,CAAE,IAAA,CAAK,CAAC,CAAC,OAAA,EAAS,QAAQ,CAAA,MAAO,EAAE,GAAG,aAAA,EAAe,OAAA,EAAS,UAAS,CAAE,CAAA;AAAA;AAC5E,EAKQ,gBAAgB,OAAA,EAAqF;AAC3G,IAAA,MAAM,UAAU,IAAA,CAAK,OAAA;AAErB,IAAA,MAAM,aAAA,GAAoC;AAAA,MACxC,KAAK,OAAA,CAAQ,GAAA;AAAA,MACb,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,OAAA,EAAS,IAAA,CAAK,eAAA,CAAgB,OAAA,CAAQ,OAAO,CAAA;AAAA,MAC7C,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,aAAa,OAAA,CAAQ,WAAA;AAAA,MACrB,aAAa,OAAA,CAAQ,WAAA;AAAA,MACrB,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,gBAAgB,OAAA,CAAQ;AAAA,KAC1B;AAEA,IAAA,IAAI,CAAC,QAAQ,WAAA,EAAa;AACxB,MAAA,OAAO,aAAA;AAAA;AAIT,IAAA,MAAM,iBAAA,GAAoB,QAAQ,IAAA,EAAK;AAEvC,IAAA,OAAO,iBAAA,CAAkB,IAAA,CAAK,CAAC,UAAA,KAAe;AAC5C,MAAA,aAAA,CAAc,IAAA,GAAO,UAAA,CAAW,MAAA,GAAS,CAAA,GAAI,UAAA,GAAa,IAAA;AAC1D,MAAA,OAAO,aAAA;AAAA,KACR,CAAA;AAAA;AACH,EAKQ,iBAAiB,OAAA,EAAuF;AAC9G,IAAA,MAAM,WAAW,IAAA,CAAK,QAAA;AAEtB,IAAA,MAAM,cAAA,GAAsC;AAAA,MAC1C,KAAK,QAAA,CAAS,GAAA;AAAA,MACd,MAAM,QAAA,CAAS,IAAA;AAAA,MACf,QAAQ,QAAA,CAAS,MAAA;AAAA,MACjB,YAAY,QAAA,CAAS,UAAA;AAAA,MACrB,IAAI,QAAA,CAAS,EAAA;AAAA,MACb,OAAA,EAAS,IAAA,CAAK,eAAA,CAAgB,QAAA,CAAS,OAAO,CAAA;AAAA,MAC9C,YAAY,QAAA,CAAS;AAAA,KACvB;AAEA,IAAA,IAAI,CAAC,QAAQ,WAAA,EAAa;AACxB,MAAA,OAAO,cAAA;AAAA;AAIT,IAAA,MAAM,iBAAA,GAAoB,SAAS,IAAA,EAAK;AAExC,IAAA,OAAO,iBAAA,CAAkB,IAAA,CAAK,CAAC,UAAA,KAAe;AAC5C,MAAA,cAAA,CAAe,IAAA,GAAO,UAAA,CAAW,MAAA,GAAS,CAAA,GAAI,UAAA,GAAa,IAAA;AAC3D,MAAA,OAAO,cAAA;AAAA,KACR,CAAA;AAAA;AACH,EAEQ,gBAAgB,OAAA,EAAwF;AAC9G,IAAA,OAAO,WAAA,CAAY,SAAA,CAAU,QAAA,CAAS,IAAA,CAAK,OAAO,CAAA;AAAA;AAEtD,CAAA;AAKA,IAAO,0BAAA,GAAQ;;;ACxJf,IAAIA,aAAY,MAAA,CAAO,cAAA;AAKvB,IAAIC,OAAAA,mBAAS,MAAA,CAAA,CAAC,MAAA,EAAQ,KAAA,KAAUD,UAAAA,CAAU,MAAA,EAAQ,MAAA,EAAQ,EAAE,KAAA,EAAO,YAAA,EAAc,IAAA,EAAM,CAAA,EAA1E,QAAA,CAAA;;;ACNN,SAAS,wBAAA,GAA2B;AACzC,EAAA,OAAO,cAAA;AACT;AAFgB,MAAA,CAAA,wBAAA,EAAA,0BAAA,CAAA;AAAAC,OAAAA,CAAA,0BAAA,0BAAA,CAAA;AAIT,SAAS,6BAAA,GAAgC;AAC9C,EAAA,OAAO,MAAA;AACT;AAFgB,MAAA,CAAA,6BAAA,EAAA,+BAAA,CAAA;AAAAA,OAAAA,CAAA,+BAAA,+BAAA,CAAA;AAMT,SAAS,mBAAA,GAAsB;AACpC,EAAA,OAAO,qEAAA;AACT;AAFgB,MAAA,CAAA,mBAAA,EAAA,qBAAA,CAAA;AAAAA,OAAAA,CAAA,qBAAA,qBAAA,CAAA;AAIT,SAAS,4BAAA,GAA+B;AAC7C,EAAA,OAAO,wEAAA;AACT;AAFgB,MAAA,CAAA,4BAAA,EAAA,8BAAA,CAAA;AAAAA,OAAAA,CAAA,8BAAA,8BAAA,CAAA;AAIT,SAAS,2BAAA,GAA8B;AAC5C,EAAA,OAAO,gHAAA;AACT;AAFgB,MAAA,CAAA,2BAAA,EAAA,6BAAA,CAAA;AAAAA,OAAAA,CAAA,6BAAA,6BAAA,CAAA;AAIT,SAAS,oCAAA,GAAuC;AACrD,EAAA,OAAO,gHAAA;AACT;AAFgB,MAAA,CAAA,oCAAA,EAAA,sCAAA,CAAA;AAAAA,OAAAA,CAAA,sCAAA,sCAAA,CAAA;AAIhB,SAAS,8BAA8B,IAAA,EAAc;AACnD,EAAA,MAAM,WAAA,GAAc,UAAU,IAAI,CAAA,CAC/B,QAAQ,OAAA,EAAS,EAAE,EACnB,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAA,CACnB,OAAA,CAAQ,0BAAA,EAA4B,MAAM,EAC1C,OAAA,CAAQ,6BAAA,EAAA,EAAiC,IAAI,CAAA,CAC7C,OAAA;IACC,oCAAA,EAAA;AACA,IAAA,CACE,MAAA,EACA,YAAA,EACA,MAAA,EACA,UAAA,EACA,aAAA,KACG;AACH,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,OAAO,IAAI,UAAU,CAAA,CAAA;AAAA;AAGvB,MAAA,MAAM,yBAAyB,YAAA,KAAiB,GAAA;AAChD,MAAA,MAAM,gBAAA,GAAmB,yBAAyB,IAAA,GAAO,YAAA;AAEzD,MAAA,MAAM,wBAAwB,aAAA,KAAkB,GAAA;AAChD,MAAA,MAAM,gBAAA,GAAmB,wBAAwB,IAAA,GAAO,aAAA;AAExD,MAAA,IAAI,oBAAoB,gBAAA,EAAkB;AACxC,QAAA,OAAO,CAAA,GAAA,EAAM,gBAAgB,CAAA,GAAA,EAAM,UAAU,SAAS,gBAAgB,CAAA,EAAA,CAAA;AAAA,OAAA,MAAA,IAC7D,gBAAA,EAAkB;AAC3B,QAAA,OAAO,CAAA,GAAA,EAAM,gBAAgB,CAAA,GAAA,EAAM,UAAU,CAAA,OAAA,CAAA;AAAA,OAAA,MAAA,IACpC,gBAAA,EAAkB;AAC3B,QAAA,OAAO,CAAA,MAAA,EAAS,UAAU,CAAA,KAAA,EAAQ,gBAAgB,CAAA,EAAA,CAAA;OAAA,MAC7C;AACL,QAAA,OAAO,MAAM,UAAU,CAAA,MAAA,CAAA;AAAA;AACzB;AACF,GAAA,CAED,QAAQ,4BAAA,EAAA,EAAgC,CAAC,MAAA,EAAQ,QAA4B,UAAA,KAAuB;AACnG,IAAA,OAAO,MAAA,GAAS,CAAA,CAAA,EAAI,UAAU,CAAA,CAAA,GAAK,MAAM,UAAU,CAAA,IAAA,CAAA;AAAA,GACpD,CAAA,CACA,OAAA;IACC,2BAAA,EAAA;AACA,IAAA,CACE,MAAA,EACA,YAAA,EACA,MAAA,EACA,UAAA,EACA,aAAA,KACG;AACH,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,OAAO,IAAI,UAAU,CAAA,CAAA;AAAA;AAGvB,MAAA,MAAM,yBAAyB,YAAA,KAAiB,GAAA;AAChD,MAAA,MAAM,gBAAA,GAAmB,yBAAyB,IAAA,GAAO,YAAA;AAEzD,MAAA,MAAM,wBAAwB,aAAA,KAAkB,GAAA;AAChD,MAAA,MAAM,gBAAA,GAAmB,wBAAwB,IAAA,GAAO,aAAA;AAExD,MAAA,IAAI,oBAAoB,gBAAA,EAAkB;AACxC,QAAA,OAAO,CAAA,GAAA,EAAM,gBAAgB,CAAA,GAAA,EAAM,UAAU,cAAc,gBAAgB,CAAA,CAAA,CAAA;AAAA,OAAA,MAAA,IAClE,gBAAA,EAAkB;AAC3B,QAAA,OAAO,CAAA,GAAA,EAAM,gBAAgB,CAAA,GAAA,EAAM,UAAU,CAAA,YAAA,CAAA;AAAA,OAAA,MAAA,IACpC,gBAAA,EAAkB;AAC3B,QAAA,OAAO,CAAA,MAAA,EAAS,UAAU,CAAA,UAAA,EAAa,gBAAgB,CAAA,EAAA,CAAA;OAAA,MAClD;AACL,QAAA,OAAO,MAAM,UAAU,CAAA,WAAA,CAAA;AAAA;AACzB;AACF,GAAA,CAED,QAAQ,mBAAA,EAAA,EAAuB,CAAC,MAAA,EAAQ,QAA4B,UAAA,KAAuB;AAC1F,IAAA,OAAO,MAAA,GAAS,CAAA,CAAA,EAAI,UAAU,CAAA,CAAA,GAAK,MAAM,UAAU,CAAA,UAAA,CAAA;GACpD,CAAA;AAEH,EAAA,OAAO,IAAI,MAAA,CAAO,CAAA,GAAA,EAAM,WAAW,CAAA,GAAA,CAAK,CAAA;AAC1C;AA1ES,MAAA,CAAA,6BAAA,EAAA,+BAAA,CAAA;AAAAA,OAAAA,CAAA,+BAAA,+BAAA,CAAA;AA4ET,IAAO,qCAAA,GAAQ,6BAAA;;;ACtGf,SAAS,iBAAiB,GAAA,EAAU;AAClC,EAAA,GAAA,CAAI,IAAA,GAAO,EAAA;AACX,EAAA,GAAA,CAAI,MAAA,GAAS,EAAA;AACb,EAAA,GAAA,CAAI,QAAA,GAAW,EAAA;AACf,EAAA,GAAA,CAAI,QAAA,GAAW,EAAA;AACf,EAAA,OAAO,GAAA;AACT;AANS,MAAA,CAAA,gBAAA,EAAA,kBAAA,CAAA;AAAAA,OAAAA,CAAA,kBAAA,kBAAA,CAAA;AAQT,IAAO,wBAAA,GAAQ,gBAAA;;;ACRf,SAAS,WAAW,KAAA,EAAyB;AAC3C,EAAA,OAAO,KAAA,CACJ,GAAA,CAAI,CAAC,IAAA,EAAM,KAAA,KAAU;AACpB,IAAA,MAAM,cAAc,KAAA,KAAU,CAAA;AAC9B,IAAA,MAAM,UAAA,GAAa,KAAA,KAAU,KAAA,CAAM,MAAA,GAAS,CAAA;AAE5C,IAAA,IAAI,YAAA,GAAe,KAAK,QAAA,EAAA;AAExB,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,YAAA,GAAe,YAAA,CAAa,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAAA;AAE/C,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,YAAA,GAAe,YAAA,CAAa,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAAA;AAG/C,IAAA,OAAO,YAAA;GACR,CAAA,CACA,OAAO,CAAC,IAAA,KAAS,KAAK,MAAA,GAAS,CAAC,CAAA,CAChC,IAAA,CAAK,GAAG,CAAA;AACb;AAnBS,MAAA,CAAA,OAAA,EAAA,SAAA,CAAA;AAAAA,OAAAA,CAAA,SAAA,SAAA,CAAA;AAqBT,IAAO,eAAA,GAAQ,OAAA;;;ACLf,IAAM,cAAN,MAA8G;AAAA,EAhB9G;AAgB8G,IAAA,MAAA,CAAA,IAAA,EAAA,aAAA,CAAA;AAAA;AAAA,EAC5G,KAAA;AAAA,EAEA,YAAY,EAAE,SAAA,EAAW,UAAA,EAAY,GAAG,UAAS,EAAyB;AACxE,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAK,mBAAA,EAAoB;AAEtC,IAAA,IAAA,CAAK,MAAM,QAAA,GAAW;AAAA,MACpB,GAAG,QAAA;AAAA,MACH,OAAA,EAAS,QAAA,CAAS,OAAA,IAAW,EAAC;AAAA,MAC9B,YAAA,EAAc,QAAA,CAAS,YAAA,IAAgB;AAAC,KAC1C;AAGA,IAAA,IAAA,CAAK,KAAA,CAAM,QAAQ,IAAA,CAAK,KAAA;AAExB,IAAA,IAAA,CAAK,MAAM,OAAA,GAAU,IAAA,CAAK,kBAAA,CAAmB,IAAA,CAAK,MAAM,QAAQ,CAAA;AAChE,IAAA,IAAA,CAAK,MAAM,SAAA,GAAY,SAAA;AACvB,IAAA,IAAA,CAAK,MAAM,UAAA,GAAa,UAAA;AAAA;AAC1B,EAEQ,mBAAA,GAAsB;AAC5B,IAAA,MAAM,KAAA,mBAAQ,MAAA,CAAA,OAIZ,KAAA,EACA,IAAA,KACG;AACH,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,kBAAA,CAAiC,OAAO,IAAI,CAAA;AACvE,MAAA,MAAM,YAAA,GAAe,QAAQ,KAAA,EAAM;AAEnC,MAAA,MAAM,WAAA,GAAc,MAAM,UAAA,CAAW,KAAA;AAAA;AAAA,QAEnC;AAAA,OACF;AACA,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,mBAAA,CAG1B,SAAS,WAAW,CAAA;AAEtB,MAAA,OAAO,QAAA;AAAA,KACT,EApBc,OAAA,CAAA;AAsBd,IAAA,MAAA,CAAO,cAAA,CAAe,OAAO,IAAI,CAAA;AAEjC,IAAA,OAAO,KAAA;AAAA;AACT,EAEA,MAAc,kBAAA,CAIZ,KAAA,EACA,IAAA,EACA;AACA,IAAA,IAAI,OAAA,GAAU,iBAAiB,OAAA,GAAU,KAAA,GAAQ,IAAI,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,IAAI,CAAA;AAEnF,IAAA,IAAI,IAAA,CAAK,MAAM,SAAA,EAAW;AACxB,MAAA,MAAM,uBAAA,GAA0B,MAAM,IAAA,CAAK,KAAA,CAAM,SAAA;AAAA;AAAA,QAE/C;AAAA,OACF;AAEA,MAAA,IAAI,4BAA4B,OAAA,EAAS;AACvC,QAAA,MAAM,cAAA,GAAiB,uBAAA,YAAmC,IAAA,CAAK,KAAA,CAAM,OAAA;AAErE,QAAA,OAAA,GAAU,iBACL,uBAAA,GACD,IAAI,KAAK,KAAA,CAAM,OAAA,CAAQ,yBAA6D,IAAI,CAAA;AAAA;AAC9F;AAGF,IAAA,OAAO,OAAA;AAAA;AACT,EAEA,MAAc,mBAAA,CAGZ,YAAA,EAAkD,WAAA,EAAuB;AACzE,IAAA,IAAI,QAAA,GAAW,IAAA,CAAK,6BAAA,CAA4C,YAAA,EAAc,WAAW,CAAA;AAEzF,IAAA,IAAI,IAAA,CAAK,MAAM,UAAA,EAAY;AACzB,MAAA,MAAM,wBAAA,GAA2B,MAAM,IAAA,CAAK,KAAA,CAAM,UAAA;AAAA;AAAA,QAEhD;AAAA,OACF;AAEA,MAAA,MAAM,eAAA,GACJ,oCAAoC,QAAA,IACpC,SAAA,IAAa,4BACb,wBAAA,CAAyB,OAAA,YAAmB,KAAK,KAAA,CAAM,OAAA;AAEzD,MAAA,QAAA,GAAW,eAAA,GACN,wBAAA,GACD,IAAA,CAAK,6BAAA,CAA4C,cAAc,wBAAwB,CAAA;AAAA;AAG7F,IAAA,OAAO,QAAA;AAAA;AACT,EAEQ,6BAAA,CAGN,cAAkD,QAAA,EAAoB;AACtE,IAAA,MAAM,aAAA,GAAgB,QAAA;AAEtB,IAAA,MAAA,CAAO,cAAA,CAAe,eAAe,SAAA,EAAW;AAAA,MAC9C,KAAA,EAAO,YAAA;AAAA,MACP,QAAA,EAAU,KAAA;AAAA,MACV,UAAA,EAAY,IAAA;AAAA,MACZ,YAAA,EAAc;AAAA,KACf,CAAA;AAED,IAAA,IAAI,aAAA;AAEJ,IAAA,MAAA,CAAO,cAAA,CAAe,eAAe,OAAA,EAAS;AAAA,MAC5C,GAAA,GAAM;AACJ,QAAA,IAAI,kBAAkB,MAAA,EAAW;AAC/B,UAAA,aAAA,GAAgB,aAAA,CAAc,EAAA,GAC1B,IAAA,GACA,IAAI,0BAAA;AAAA,YACF,YAAA;AAAA,YACA;AAAA,WACF;AAAA;AAEN,QAAA,OAAO,aAAA;AAAA,OACT;AAAA,MACA,UAAA,EAAY,IAAA;AAAA,MACZ,YAAA,EAAc;AAAA,KACf,CAAA;AAED,IAAA,OAAO,aAAA;AAAA;AACT,EAEQ,mBAAmB,QAAA,EAAyB;AAAA,IAClD,MAAMC,QAAAA,SAGI,UAAA,CAAW,OAAA,CAAQ;AAAA,MA1JjC;AA0JiC,QAAA,MAAA,CAAA,IAAA,EAAA,SAAA,CAAA;AAAA;AAAA,MAC3B,IAAA;AAAA,MAEA,WAAA,CACE,OACA,IAAA,EACA;AACA,QAAA,MAAM,gBAAA,GAAmB,EAAE,GAAG,QAAA,EAAU,GAAG,IAAA,EAAK;AAEhD,QAAA,MAAM,mBAAA,GAAsB,IAAIC,WAAAA,CAAY,QAAA,CAAS,OAAO,CAAA;AAC5D,QAAA,MAAM,eAAA,GAAkB,IAAIA,WAAAA,CAAa,IAAA,CAA2C,OAAO,CAAA;AAE3F,QAAA,IAAI,GAAA;AACJ,QAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,gBAAA,CAAiB,OAAO,CAAA;AAEhD,QAAA,IAAI,KAAA,YAAiB,WAAW,OAAA,EAAS;AAEvC,UAAA,MAAM,OAAA,GAAU,KAAA;AAGhB,UAAA,MAAM,kBAAA,GAAqB,IAAIA,WAAAA,CAAY,KAAA,CAAM,OAAkB,CAAA;AAEnE,UAAA,gBAAA,CAAiB,OAAA,GAAU;AAAA,YACzB,GAAG,oBAAoB,QAAA,EAAS;AAAA,YAChC,GAAG,mBAAmB,QAAA,EAAS;AAAA,YAC/B,GAAG,gBAAgB,QAAA;AAAS,WAC9B;AAEA,UAAA,KAAA,CAAM,SAAS,gBAAgB,CAAA;AAE/B,UAAA,GAAA,GAAM,IAAI,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA;AAAA,SACzB,MAAO;AACL,UAAA,gBAAA,CAAiB,OAAA,GAAU;AAAA,YACzB,GAAG,oBAAoB,QAAA,EAAS;AAAA,YAChC,GAAG,gBAAgB,QAAA;AAAS,WAC9B;AAEA,UAAA,GAAA,GAAM,KAAA,YAAiB,GAAA,GAAM,IAAI,GAAA,CAAI,KAAK,CAAA,GAAI,IAAI,GAAA,CAAI,eAAA,CAAQ,OAAA,EAAS,KAAK,CAAC,CAAA;AAE7E,UAAA,MAAM,wBAAA,GAA2B,IAAI,gBAAA,CAAiB,QAAA,CAAS,YAAY,CAAA;AAC3E,UAAA,MAAM,oBAAA,GAAuB,IAAI,gBAAA,CAAiB,gBAAA,CAAiB,YAAY,CAAA;AAE/E,UAAA,gBAAA,CAAiB,YAAA,GAAe;AAAA,YAC9B,GAAG,yBAAyB,QAAA,EAAS;AAAA,YACrC,GAAG,qBAAqB,QAAA;AAAS,WACnC;AAEA,UAAA,GAAA,CAAI,SAAS,IAAI,gBAAA,CAAiB,gBAAA,CAAiB,YAAY,EAAE,QAAA,EAAS;AAE1E,UAAA,KAAA,CAAM,KAAK,gBAAgB,CAAA;AAAA;AAG7B,QAAA,MAAM,8BAA8B,OAAA,CAAQ,QAAA,EAAS,CAAE,OAAA,CAAQ,OAAO,EAAE,CAAA;AAExE,QAAA,IAAA,CAAK,IAAA,GAAO,yBAAiB,GAAG,CAAA,CAC7B,UAAS,CACT,OAAA,CAAQ,6BAA6B,EAAE,CAAA;AAAA;AAC5C,MAEA,KAAA,GAA+B;AAC7B,QAAA,MAAM,QAAA,GAAW,MAAM,KAAA,EAAM;AAE7B,QAAA,OAAO,IAAID,QAAAA;AAAA,UACT,QAAA;AAAA,UACA;AAAA,SAKF;AAAA;AACF;AAGF,IAAA,OAAOA,QAAAA;AAAA;AACT,EAEA,SAAA,CACE,OAAA,EACA,MAAA,EACA,IAAA,EAC+C;AAC/C,IAAA,OACE,mBAAmB,OAAA,IACnB,OAAA,CAAQ,MAAA,KAAW,MAAA,IACnB,UAAU,OAAA,IACV,OAAO,OAAA,CAAQ,IAAA,KAAS,YACxB,qCAAA,CAA8B,IAAI,CAAA,CAAE,IAAA,CAAK,QAAQ,IAAI,CAAA;AAAA;AAEzD,EAEA,UAAA,CACE,QAAA,EACA,MAAA,EACA,IAAA,EACiD;AACjD,IAAA,OACE,oBAAoB,QAAA,IACpB,SAAA,IAAa,QAAA,IACb,IAAA,CAAK,UAAU,QAAA,CAAS,OAAA,EAAS,MAAA,EAAQ,IAAI,KAC7C,OAAA,IAAW,QAAA,KACV,SAAS,KAAA,KAAU,IAAA,IAAQ,SAAS,KAAA,YAAiB,0BAAA,CAAA;AAAA;AAE1D,EAEA,eAAA,CACE,KAAA,EACA,MAAA,EACA,IAAA,EACmD;AACnD,IAAA,OACE,KAAA,YAAiB,0BAAA,IACjB,IAAA,CAAK,SAAA,CAAU,MAAM,OAAA,EAAS,MAAA,EAAQ,IAAI,CAAA,IAC1C,IAAA,CAAK,UAAA,CAAW,KAAA,CAAM,QAAA,EAAU,QAAQ,IAAI,CAAA;AAAA;AAGlD,CAAA;AAEA,IAAO,mBAAA,GAAQ,WAAA;;;ACzQf,SAAS,YAAuC,OAAA,EAA8C;AAC5F,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,IAAI,oBAAoB,OAAO,CAAA;AACjD,EAAA,OAAO,KAAA;AACT;AAHS,MAAA,CAAA,WAAA,EAAA,aAAA,CAAA;AAKT,IAAO,eAAA,GAAQ","file":"index.mjs","sourcesContent":["import { HttpHeaders, HttpHeadersSchema, HttpSchema, HttpSchemaMethod, HttpSchemaPath } from '@zimic/http';\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): Promise<FetchResponseErrorObject> | FetchResponseErrorObject;\n toObject({ includeRequestBody = false, includeResponseBody = false }: FetchResponseErrorObjectOptions = {}):\n | Promise<FetchResponseErrorObject>\n | 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 }): Promise<FetchRequestObject> | FetchRequestObject;\n private requestToObject(options: { includeBody: boolean }): Promise<FetchRequestObject> | 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.headersToObject(request.headers),\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 // Optimize type checking by narrowing the type of the body\n const bodyAsTextPromise = request.text() as Promise<string>;\n\n return bodyAsTextPromise.then((bodyAsText) => {\n requestObject.body = bodyAsText.length > 0 ? bodyAsText : null;\n return requestObject;\n });\n }\n\n private responseToObject(options: { includeBody: true }): Promise<FetchResponseObject>;\n private responseToObject(options: { includeBody: false }): FetchResponseObject;\n private responseToObject(options: { includeBody: boolean }): Promise<FetchResponseObject> | FetchResponseObject;\n private responseToObject(options: { includeBody: boolean }): Promise<FetchResponseObject> | 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.headersToObject(response.headers),\n redirected: response.redirected,\n };\n\n if (!options.includeBody) {\n return responseObject;\n }\n\n // Optimize type checking by narrowing the type of the body\n const bodyAsTextPromise = response.text() as Promise<string>;\n\n return bodyAsTextPromise.then((bodyAsText) => {\n responseObject.body = bodyAsText.length > 0 ? bodyAsText : null;\n return responseObject;\n });\n }\n\n private headersToObject(headers: typeof this.request.headers | typeof this.response.headers): HttpHeadersSchema {\n return HttpHeaders.prototype.toObject.call(headers) as HttpHeadersSchema;\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","var __create = Object.create;\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __getProtoOf = Object.getPrototypeOf;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __name = (target, value) => __defProp(target, \"name\", { value, configurable: true });\nvar __commonJS = (cb, mod) => function __require() {\n return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;\n};\nvar __copyProps = (to, from, except, desc) => {\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))\n if (!__hasOwnProp.call(to, key) && key !== except)\n __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n }\n return to;\n};\nvar __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(\n // If the importer is in node compatibility mode or this is not an ESM\n // file that has been converted to a CommonJS file using a Babel-\n // compatible transform (i.e. \"__esModule\" has not been set), then set\n // \"default\" to the CommonJS \"module.exports\" for node compatibility.\n isNodeMode || !mod || !mod.__esModule ? __defProp(target, \"default\", { value: mod, enumerable: true }) : target,\n mod\n));\n\nexport { __commonJS, __name, __toESM };\n//# sourceMappingURL=chunk-2D3UJWOA.mjs.map\n//# sourceMappingURL=chunk-2D3UJWOA.mjs.map","export function getExtraPatternsToEscape() {\n return /([.(){}+$])/g;\n}\n\nexport function getURIEncodedBackSlashPattern() {\n return /%5C/g;\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 getPathParamPattern() {\n return /(?<escape>\\\\)?:(?<identifier>[$_\\p{ID_Start}][$\\p{ID_Continue}]+)/gu;\n}\n\nexport function getRepeatingPathParamPattern() {\n return /(?<escape>\\\\)?:(?<identifier>[$_\\p{ID_Start}][$\\p{ID_Continue}]+)\\\\+/gu;\n}\n\nexport function getOptionalPathParamPattern() {\n return /(?<leadingSlash>\\/)?(?<escape>\\\\)?:(?<identifier>[$_\\p{ID_Start}][$\\p{ID_Continue}]+)\\?(?<trailingSlash>\\/)?/gu;\n}\n\nexport function getOptionalRepeatingPathParamPattern() {\n return /(?<leadingSlash>\\/)?(?<escape>\\\\)?:(?<identifier>[$_\\p{ID_Start}][$\\p{ID_Continue}]+)\\*(?<trailingSlash>\\/)?/gu;\n}\n\nfunction createParametrizedPathPattern(path: string) {\n const replacedURL = encodeURI(path)\n .replace(/^\\/+/g, '')\n .replace(/\\/+$/g, '')\n .replace(getExtraPatternsToEscape(), '\\\\$1')\n .replace(getURIEncodedBackSlashPattern(), '\\\\')\n .replace(\n getOptionalRepeatingPathParamPattern(),\n (\n _match,\n leadingSlash: string | undefined,\n escape: string | undefined,\n identifier: string,\n trailingSlash: string | undefined,\n ) => {\n if (escape) {\n return `:${identifier}`;\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(getRepeatingPathParamPattern(), (_match, escape: string | undefined, identifier: string) => {\n return escape ? `:${identifier}` : `(?<${identifier}>.+)`;\n })\n .replace(\n getOptionalPathParamPattern(),\n (\n _match,\n leadingSlash: string | undefined,\n escape: string | undefined,\n identifier: string,\n trailingSlash: string | undefined,\n ) => {\n if (escape) {\n return `:${identifier}`;\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(getPathParamPattern(), (_match, escape: string | undefined, identifier: string) => {\n return escape ? `:${identifier}` : `(?<${identifier}>[^\\\\/]+?)`;\n });\n\n return new RegExp(`^/?${replacedURL}/?$`);\n}\n\nexport default createParametrizedPathPattern;\n","function excludeURLParams(url: URL) {\n url.hash = '';\n url.search = '';\n url.username = '';\n url.password = '';\n return url;\n}\n\nexport default excludeURLParams;\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 createParametrizedPathPattern from '@zimic/utils/url/createParametrizedPathPattern';\nimport excludeURLParams from '@zimic/utils/url/excludeURLParams';\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>, 'defaults' | 'loose' | 'Request'> {\n fetch: Fetch<Schema>;\n\n constructor({ onRequest, onResponse, ...defaults }: FetchOptions<Schema>) {\n this.fetch = this.createFetchFunction();\n\n this.fetch.defaults = {\n ...defaults,\n headers: defaults.headers ?? {},\n searchParams: defaults.searchParams ?? {},\n };\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.fetch.loose = this.fetch as Fetch<any> as Fetch.Loose;\n\n this.fetch.Request = this.createRequestClass(this.fetch.defaults);\n this.fetch.onRequest = onRequest;\n this.fetch.onResponse = onResponse;\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(defaults: FetchDefaults) {\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(\n input: FetchInput<Schema, Method, Path>,\n init: FetchRequestInit<Schema, Method, LiteralHttpSchemaPathFromNonLiteral<Schema, Method, Path>>,\n ) {\n const initWithDefaults = { ...defaults, ...init };\n\n const headersFromDefaults = new HttpHeaders(defaults.headers);\n const headersFromInit = new HttpHeaders((init satisfies RequestInit as RequestInit).headers);\n\n let url: URL;\n const baseURL = new URL(initWithDefaults.baseURL);\n\n if (input instanceof globalThis.Request) {\n // Optimize type checking by narrowing the type of input\n const request = input as globalThis.Request;\n\n // Optimize type checking by narrowing the type of headers\n const headersFromRequest = new HttpHeaders(input.headers as Headers);\n\n initWithDefaults.headers = {\n ...headersFromDefaults.toObject(),\n ...headersFromRequest.toObject(),\n ...headersFromInit.toObject(),\n };\n\n super(request, initWithDefaults);\n\n url = new URL(input.url);\n } else {\n initWithDefaults.headers = {\n ...headersFromDefaults.toObject(),\n ...headersFromInit.toObject(),\n };\n\n url = input instanceof URL ? new URL(input) : new URL(joinURL(baseURL, input));\n\n const searchParamsFromDefaults = new HttpSearchParams(defaults.searchParams);\n const searchParamsFromInit = new HttpSearchParams(initWithDefaults.searchParams);\n\n initWithDefaults.searchParams = {\n ...searchParamsFromDefaults.toObject(),\n ...searchParamsFromInit.toObject(),\n };\n\n url.search = new HttpSearchParams(initWithDefaults.searchParams).toString();\n\n super(url, initWithDefaults);\n }\n\n const baseURLWithoutTrailingSlash = baseURL.toString().replace(/\\/$/, '');\n\n this.path = excludeURLParams(url)\n .toString()\n .replace(baseURLWithoutTrailingSlash, '') as LiteralHttpSchemaPathFromNonLiteral<Schema, Method, Path>;\n }\n\n clone(): Request<Method, Path> {\n const rawClone = super.clone();\n\n return new Request<Method, Path>(\n rawClone as unknown as FetchInput<Schema, Method, Path>,\n rawClone as unknown as FetchRequestInit<\n Schema,\n Method,\n LiteralHttpSchemaPathFromNonLiteral<Schema, Method, Path>\n >,\n );\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 createParametrizedPathPattern(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/dist/chunk-2D3UJWOA.mjs","../../zimic-utils/src/url/createParametrizedPathPattern.ts","../../zimic-utils/src/url/excludeURLParams.ts","../../zimic-utils/src/url/joinURL.ts","../src/client/FetchClient.ts","../src/client/factory.ts"],"names":["__defProp","__name","Request","HttpHeaders"],"mappings":"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","file":"index.mjs","sourcesContent":["import { HttpHeaders, HttpHeadersSchema, HttpSchema, HttpSchemaMethod, HttpSchemaPath } 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];\n\n if (resource.bodyUsed) {\n console.warn(\n `[@zimic/fetch] 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 resource.text().then((body: string) => {\n resourceObject.body = body.length > 0 ? body : null;\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","var __create = Object.create;\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __getProtoOf = Object.getPrototypeOf;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __name = (target, value) => __defProp(target, \"name\", { value, configurable: true });\nvar __commonJS = (cb, mod) => function __require() {\n return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;\n};\nvar __copyProps = (to, from, except, desc) => {\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))\n if (!__hasOwnProp.call(to, key) && key !== except)\n __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n }\n return to;\n};\nvar __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(\n // If the importer is in node compatibility mode or this is not an ESM\n // file that has been converted to a CommonJS file using a Babel-\n // compatible transform (i.e. \"__esModule\" has not been set), then set\n // \"default\" to the CommonJS \"module.exports\" for node compatibility.\n isNodeMode || !mod || !mod.__esModule ? __defProp(target, \"default\", { value: mod, enumerable: true }) : target,\n mod\n));\n\nexport { __commonJS, __name, __toESM };\n//# sourceMappingURL=chunk-2D3UJWOA.mjs.map\n//# sourceMappingURL=chunk-2D3UJWOA.mjs.map","export function getExtraPatternsToEscape() {\n return /([.(){}+$])/g;\n}\n\nexport function getURIEncodedBackSlashPattern() {\n return /%5C/g;\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 getPathParamPattern() {\n return /(?<escape>\\\\)?:(?<identifier>[$_\\p{ID_Start}][$\\p{ID_Continue}]+)/gu;\n}\n\nexport function getRepeatingPathParamPattern() {\n return /(?<escape>\\\\)?:(?<identifier>[$_\\p{ID_Start}][$\\p{ID_Continue}]+)\\\\+/gu;\n}\n\nexport function getOptionalPathParamPattern() {\n return /(?<leadingSlash>\\/)?(?<escape>\\\\)?:(?<identifier>[$_\\p{ID_Start}][$\\p{ID_Continue}]+)\\?(?<trailingSlash>\\/)?/gu;\n}\n\nexport function getOptionalRepeatingPathParamPattern() {\n return /(?<leadingSlash>\\/)?(?<escape>\\\\)?:(?<identifier>[$_\\p{ID_Start}][$\\p{ID_Continue}]+)\\*(?<trailingSlash>\\/)?/gu;\n}\n\nfunction createParametrizedPathPattern(path: string) {\n const replacedURL = encodeURI(path)\n .replace(/^\\/+/g, '')\n .replace(/\\/+$/g, '')\n .replace(getExtraPatternsToEscape(), '\\\\$1')\n .replace(getURIEncodedBackSlashPattern(), '\\\\')\n .replace(\n getOptionalRepeatingPathParamPattern(),\n (\n _match,\n leadingSlash: string | undefined,\n escape: string | undefined,\n identifier: string,\n trailingSlash: string | undefined,\n ) => {\n if (escape) {\n return `:${identifier}`;\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(getRepeatingPathParamPattern(), (_match, escape: string | undefined, identifier: string) => {\n return escape ? `:${identifier}` : `(?<${identifier}>.+)`;\n })\n .replace(\n getOptionalPathParamPattern(),\n (\n _match,\n leadingSlash: string | undefined,\n escape: string | undefined,\n identifier: string,\n trailingSlash: string | undefined,\n ) => {\n if (escape) {\n return `:${identifier}`;\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(getPathParamPattern(), (_match, escape: string | undefined, identifier: string) => {\n return escape ? `:${identifier}` : `(?<${identifier}>[^\\\\/]+?)`;\n });\n\n return new RegExp(`^/?${replacedURL}/?$`);\n}\n\nexport default createParametrizedPathPattern;\n","function excludeURLParams(url: URL) {\n url.hash = '';\n url.search = '';\n url.username = '';\n url.password = '';\n return url;\n}\n\nexport default excludeURLParams;\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 createParametrizedPathPattern from '@zimic/utils/url/createParametrizedPathPattern';\nimport excludeURLParams from '@zimic/utils/url/excludeURLParams';\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>, 'defaults' | 'loose' | 'Request'> {\n fetch: Fetch<Schema>;\n\n constructor({ onRequest, onResponse, ...defaults }: FetchOptions<Schema>) {\n this.fetch = this.createFetchFunction();\n\n this.fetch.defaults = {\n ...defaults,\n headers: defaults.headers ?? {},\n searchParams: defaults.searchParams ?? {},\n };\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.fetch.loose = this.fetch as Fetch<any> as Fetch.Loose;\n\n this.fetch.Request = this.createRequestClass(this.fetch.defaults);\n this.fetch.onRequest = onRequest;\n this.fetch.onResponse = onResponse;\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(defaults: FetchDefaults) {\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(\n input: FetchInput<Schema, Method, Path>,\n init: FetchRequestInit<Schema, Method, LiteralHttpSchemaPathFromNonLiteral<Schema, Method, Path>>,\n ) {\n const initWithDefaults = { ...defaults, ...init };\n\n const headersFromDefaults = new HttpHeaders(defaults.headers);\n const headersFromInit = new HttpHeaders((init satisfies RequestInit as RequestInit).headers);\n\n let url: URL;\n const baseURL = new URL(initWithDefaults.baseURL);\n\n if (input instanceof globalThis.Request) {\n // Optimize type checking by narrowing the type of input\n const request = input as globalThis.Request;\n\n // Optimize type checking by narrowing the type of headers\n const headersFromRequest = new HttpHeaders(input.headers as Headers);\n\n initWithDefaults.headers = {\n ...headersFromDefaults.toObject(),\n ...headersFromRequest.toObject(),\n ...headersFromInit.toObject(),\n };\n\n super(request, initWithDefaults);\n\n url = new URL(input.url);\n } else {\n initWithDefaults.headers = {\n ...headersFromDefaults.toObject(),\n ...headersFromInit.toObject(),\n };\n\n url = input instanceof URL ? new URL(input) : new URL(joinURL(baseURL, input));\n\n const searchParamsFromDefaults = new HttpSearchParams(defaults.searchParams);\n const searchParamsFromInit = new HttpSearchParams(initWithDefaults.searchParams);\n\n initWithDefaults.searchParams = {\n ...searchParamsFromDefaults.toObject(),\n ...searchParamsFromInit.toObject(),\n };\n\n url.search = new HttpSearchParams(initWithDefaults.searchParams).toString();\n\n super(url, initWithDefaults);\n }\n\n const baseURLWithoutTrailingSlash = baseURL.toString().replace(/\\/$/, '');\n\n this.path = excludeURLParams(url)\n .toString()\n .replace(baseURLWithoutTrailingSlash, '') as LiteralHttpSchemaPathFromNonLiteral<Schema, Method, Path>;\n }\n\n clone(): Request<Method, Path> {\n const rawClone = super.clone();\n\n return new Request<Method, Path>(\n rawClone as unknown as FetchInput<Schema, Method, Path>,\n rawClone as unknown as FetchRequestInit<\n Schema,\n Method,\n LiteralHttpSchemaPathFromNonLiteral<Schema, Method, Path>\n >,\n );\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 createParametrizedPathPattern(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.0.6-canary.
|
|
16
|
+
"version": "1.0.6-canary.3",
|
|
17
17
|
"homepage": "https://zimic.dev/docs/fetch",
|
|
18
18
|
"repository": {
|
|
19
19
|
"type": "git",
|
|
@@ -72,14 +72,14 @@
|
|
|
72
72
|
"typescript": "^5.9.2",
|
|
73
73
|
"vitest": "^3.2.4",
|
|
74
74
|
"@zimic/eslint-config-node": "0.0.0",
|
|
75
|
-
"@zimic/
|
|
76
|
-
"@zimic/interceptor": "1.1.2-canary.0",
|
|
75
|
+
"@zimic/interceptor": "1.1.2-canary.1",
|
|
77
76
|
"@zimic/tsconfig": "0.0.0",
|
|
78
|
-
"@zimic/utils": "0.0.0"
|
|
77
|
+
"@zimic/utils": "0.0.0",
|
|
78
|
+
"@zimic/lint-staged-config": "0.0.0"
|
|
79
79
|
},
|
|
80
80
|
"peerDependencies": {
|
|
81
81
|
"typescript": ">=5.0.0",
|
|
82
|
-
"@zimic/http": "^1.1.0 || 1.1.2-canary.
|
|
82
|
+
"@zimic/http": "^1.1.0 || 1.1.2-canary.2"
|
|
83
83
|
},
|
|
84
84
|
"peerDependenciesMeta": {
|
|
85
85
|
"typescript": {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { HttpHeaders, HttpHeadersSchema, HttpSchema, HttpSchemaMethod, HttpSchemaPath } from '@zimic/http';
|
|
2
|
+
import { PossiblePromise } from '@zimic/utils/types';
|
|
2
3
|
|
|
3
4
|
import { FetchRequest, FetchRequestObject, FetchResponse, FetchResponseObject } from '../types/requests';
|
|
4
5
|
|
|
@@ -55,11 +56,12 @@ class FetchResponseError<
|
|
|
55
56
|
|
|
56
57
|
/** @see {@link https://zimic.dev/docs/fetch/api/fetch-response-error#errortoobject `fetchResponseError.toObject()` API reference} */
|
|
57
58
|
toObject(options: FetchResponseErrorObjectOptions.WithBody): Promise<FetchResponseErrorObject>;
|
|
58
|
-
toObject(options
|
|
59
|
-
toObject(options?: FetchResponseErrorObjectOptions):
|
|
60
|
-
toObject({
|
|
61
|
-
|
|
62
|
-
|
|
59
|
+
toObject(options?: FetchResponseErrorObjectOptions.WithoutBody): FetchResponseErrorObject;
|
|
60
|
+
toObject(options?: FetchResponseErrorObjectOptions): PossiblePromise<FetchResponseErrorObject>;
|
|
61
|
+
toObject({
|
|
62
|
+
includeRequestBody = false,
|
|
63
|
+
includeResponseBody = false,
|
|
64
|
+
}: FetchResponseErrorObjectOptions = {}): PossiblePromise<FetchResponseErrorObject> {
|
|
63
65
|
const partialObject = {
|
|
64
66
|
name: this.name,
|
|
65
67
|
message: this.message,
|
|
@@ -81,15 +83,15 @@ class FetchResponseError<
|
|
|
81
83
|
|
|
82
84
|
private requestToObject(options: { includeBody: true }): Promise<FetchRequestObject>;
|
|
83
85
|
private requestToObject(options: { includeBody: false }): FetchRequestObject;
|
|
84
|
-
private requestToObject(options: { includeBody: boolean }):
|
|
85
|
-
private requestToObject(options: { includeBody: boolean }):
|
|
86
|
+
private requestToObject(options: { includeBody: boolean }): PossiblePromise<FetchRequestObject>;
|
|
87
|
+
private requestToObject(options: { includeBody: boolean }): PossiblePromise<FetchRequestObject> {
|
|
86
88
|
const request = this.request;
|
|
87
89
|
|
|
88
90
|
const requestObject: FetchRequestObject = {
|
|
89
91
|
url: request.url,
|
|
90
92
|
path: request.path,
|
|
91
93
|
method: request.method,
|
|
92
|
-
headers: this.
|
|
94
|
+
headers: this.convertHeadersToObject(request),
|
|
93
95
|
cache: request.cache,
|
|
94
96
|
destination: request.destination,
|
|
95
97
|
credentials: request.credentials,
|
|
@@ -105,19 +107,13 @@ class FetchResponseError<
|
|
|
105
107
|
return requestObject;
|
|
106
108
|
}
|
|
107
109
|
|
|
108
|
-
|
|
109
|
-
const bodyAsTextPromise = request.text() as Promise<string>;
|
|
110
|
-
|
|
111
|
-
return bodyAsTextPromise.then((bodyAsText) => {
|
|
112
|
-
requestObject.body = bodyAsText.length > 0 ? bodyAsText : null;
|
|
113
|
-
return requestObject;
|
|
114
|
-
});
|
|
110
|
+
return this.withIncludedBodyIfAvailable('request', requestObject);
|
|
115
111
|
}
|
|
116
112
|
|
|
117
113
|
private responseToObject(options: { includeBody: true }): Promise<FetchResponseObject>;
|
|
118
114
|
private responseToObject(options: { includeBody: false }): FetchResponseObject;
|
|
119
|
-
private responseToObject(options: { includeBody: boolean }):
|
|
120
|
-
private responseToObject(options: { includeBody: boolean }):
|
|
115
|
+
private responseToObject(options: { includeBody: boolean }): PossiblePromise<FetchResponseObject>;
|
|
116
|
+
private responseToObject(options: { includeBody: boolean }): PossiblePromise<FetchResponseObject> {
|
|
121
117
|
const response = this.response;
|
|
122
118
|
|
|
123
119
|
const responseObject: FetchResponseObject = {
|
|
@@ -126,7 +122,7 @@ class FetchResponseError<
|
|
|
126
122
|
status: response.status,
|
|
127
123
|
statusText: response.statusText,
|
|
128
124
|
ok: response.ok,
|
|
129
|
-
headers: this.
|
|
125
|
+
headers: this.convertHeadersToObject(response),
|
|
130
126
|
redirected: response.redirected,
|
|
131
127
|
};
|
|
132
128
|
|
|
@@ -134,17 +130,42 @@ class FetchResponseError<
|
|
|
134
130
|
return responseObject;
|
|
135
131
|
}
|
|
136
132
|
|
|
137
|
-
|
|
138
|
-
|
|
133
|
+
return this.withIncludedBodyIfAvailable('response', responseObject);
|
|
134
|
+
}
|
|
139
135
|
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
136
|
+
private convertHeadersToObject(
|
|
137
|
+
resource: FetchRequest<Schema, Method, Path> | FetchResponse<Schema, Method, Path, true, 'manual'>,
|
|
138
|
+
): HttpHeadersSchema {
|
|
139
|
+
return HttpHeaders.prototype.toObject.call(resource.headers) as HttpHeadersSchema;
|
|
144
140
|
}
|
|
145
141
|
|
|
146
|
-
private
|
|
147
|
-
|
|
142
|
+
private withIncludedBodyIfAvailable(
|
|
143
|
+
resourceType: 'request',
|
|
144
|
+
resourceObject: FetchRequestObject,
|
|
145
|
+
): PossiblePromise<FetchRequestObject>;
|
|
146
|
+
private withIncludedBodyIfAvailable(
|
|
147
|
+
resourceType: 'response',
|
|
148
|
+
resourceObject: FetchResponseObject,
|
|
149
|
+
): PossiblePromise<FetchResponseObject>;
|
|
150
|
+
private withIncludedBodyIfAvailable(
|
|
151
|
+
resourceType: 'request' | 'response',
|
|
152
|
+
resourceObject: FetchRequestObject | FetchResponseObject,
|
|
153
|
+
): PossiblePromise<FetchRequestObject | FetchResponseObject> {
|
|
154
|
+
const resource = this[resourceType];
|
|
155
|
+
|
|
156
|
+
if (resource.bodyUsed) {
|
|
157
|
+
console.warn(
|
|
158
|
+
`[@zimic/fetch] Could not include the ${resourceType} body because it is already used. ` +
|
|
159
|
+
'If you access the body before calling `error.toObject()`, consider reading it from a cloned ' +
|
|
160
|
+
`${resourceType}.\n\nLearn more: https://zimic.dev/docs/fetch/api/fetch-response-error#errortoobject`,
|
|
161
|
+
);
|
|
162
|
+
return resourceObject;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
return resource.text().then((body: string) => {
|
|
166
|
+
resourceObject.body = body.length > 0 ? body : null;
|
|
167
|
+
return resourceObject;
|
|
168
|
+
});
|
|
148
169
|
}
|
|
149
170
|
}
|
|
150
171
|
|