@zimic/fetch 1.2.0-canary.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +9 -8
- package/dist/index.js +44 -38
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +44 -38
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
- package/src/client/FetchClient.ts +51 -56
- package/src/client/types/public.ts +13 -5
- package/src/client/types/requests.ts +0 -2
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { HttpSchema, HttpSchemaMethod, HttpSchemaPath, HttpMethodSchema, HttpHeadersSchema, HttpHeadersInit, HttpRequestHeadersSchema, HttpSearchParamsSchema, HttpSearchParamsInit, HttpRequestSearchParamsSchema, HttpBody, HttpRequestSchema, HttpSearchParams, HttpFormData,
|
|
1
|
+
import { HttpSchema, HttpSchemaMethod, HttpSchemaPath, HttpMethodSchema, HttpHeadersSchema, HttpHeadersInit, HttpRequestHeadersSchema, HttpSearchParamsSchema, HttpSearchParamsInit, HttpRequestSearchParamsSchema, HttpBody, HttpRequestSchema, HttpSearchParams, HttpFormData, HttpRequest, HttpRequestBodySchema, AllowAnyStringInPathParams, HttpMethod, HttpStatusCode, HttpResponseSchemaStatusCode, HttpResponse, HttpResponseBodySchema, HttpResponseHeadersSchema, HttpHeadersSerialized, LiteralHttpSchemaPathFromNonLiteral } from '@zimic/http';
|
|
2
2
|
|
|
3
3
|
declare const value: unique symbol;
|
|
4
4
|
/**
|
|
@@ -61,8 +61,6 @@ declare namespace FetchRequestInit {
|
|
|
61
61
|
/** The default options for each request sent by a fetch instance. */
|
|
62
62
|
interface Defaults extends Omit<RequestInit, 'headers'> {
|
|
63
63
|
baseURL: string;
|
|
64
|
-
/** The HTTP method of the request. */
|
|
65
|
-
method?: HttpMethod;
|
|
66
64
|
/** The headers of the request. */
|
|
67
65
|
headers?: HttpHeadersSchema.Loose;
|
|
68
66
|
/** The search parameters of the request. */
|
|
@@ -220,10 +218,13 @@ type AnyFetchRequestError = FetchResponseError<any, any, any>;
|
|
|
220
218
|
/** @see {@link https://zimic.dev/docs/fetch/api/fetch `fetch` API reference} */
|
|
221
219
|
type FetchInput<Schema extends HttpSchema, Method extends HttpSchemaMethod<Schema>, Path extends HttpSchemaPath.NonLiteral<Schema, Method>> = Path | URL | FetchRequest<Schema, Method, LiteralHttpSchemaPathFromNonLiteral<Schema, Method, Path>>;
|
|
222
220
|
/** @see {@link https://zimic.dev/docs/fetch/api/fetch `fetch` API reference} */
|
|
223
|
-
interface Fetch<Schema extends HttpSchema> extends Pick<FetchOptions<Schema>, 'onRequest' | 'onResponse'
|
|
221
|
+
interface Fetch<Schema extends HttpSchema> extends Pick<FetchOptions<Schema>, 'onRequest' | 'onResponse'>, FetchDefaults {
|
|
224
222
|
<Method extends HttpSchemaMethod<Schema>, Path extends HttpSchemaPath.NonLiteral<Schema, Method>, Redirect extends RequestRedirect = 'follow'>(input: Path | URL, init: FetchRequestInit<Schema, Method, LiteralHttpSchemaPathFromNonLiteral<Schema, Method, Path>, Redirect>): Promise<FetchResponse<Schema, Method, LiteralHttpSchemaPathFromNonLiteral<Schema, Method, Path>, false, Redirect>>;
|
|
225
|
-
<Method extends HttpSchemaMethod<Schema>, Path extends HttpSchemaPath.NonLiteral<Schema, Method>, Redirect extends RequestRedirect = 'follow'>(input: FetchRequest<Schema, Method, LiteralHttpSchemaPathFromNonLiteral<Schema, Method, Path>>, init?: FetchRequestInit<Schema, Method, LiteralHttpSchemaPathFromNonLiteral<Schema, Method, Path>, Redirect>): Promise<FetchResponse<Schema, Method, LiteralHttpSchemaPathFromNonLiteral<Schema, Method, Path>, false, Redirect>>;
|
|
226
|
-
/**
|
|
223
|
+
<Method extends HttpSchemaMethod<Schema>, Path extends HttpSchemaPath.NonLiteral<Schema, Method>, Redirect extends RequestRedirect = 'follow'>(input: FetchRequest<Schema, Method, LiteralHttpSchemaPathFromNonLiteral<Schema, Method, Path>>, init?: Omit<FetchRequestInit<Schema, Method, LiteralHttpSchemaPathFromNonLiteral<Schema, Method, Path>, Redirect>, 'baseURL' | 'searchParams'>): Promise<FetchResponse<Schema, Method, LiteralHttpSchemaPathFromNonLiteral<Schema, Method, Path>, false, Redirect>>;
|
|
224
|
+
/**
|
|
225
|
+
* @deprecated Consider accessing the default options directly from the fetch instance.
|
|
226
|
+
* @see {@link https://zimic.dev/docs/fetch/api/fetch#fetch-defaults `fetch` defaults}
|
|
227
|
+
*/
|
|
227
228
|
defaults: FetchDefaults;
|
|
228
229
|
/** @see {@link https://zimic.dev/docs/fetch/api/fetch#fetchloose `fetch.loose`} */
|
|
229
230
|
loose: Fetch.Loose;
|
|
@@ -248,9 +249,9 @@ interface FetchOptions<Schema extends HttpSchema> extends Omit<FetchRequestInit.
|
|
|
248
249
|
onResponse?: (this: Fetch<Schema>, response: FetchResponse.Loose) => PossiblePromise<Response>;
|
|
249
250
|
}
|
|
250
251
|
/**
|
|
251
|
-
* The default options
|
|
252
|
+
* The default options to send with each request.
|
|
252
253
|
*
|
|
253
|
-
* @see {@link https://zimic.dev/docs/fetch/api/fetch
|
|
254
|
+
* @see {@link https://zimic.dev/docs/fetch/api/fetch `fetch` API reference}
|
|
254
255
|
*/
|
|
255
256
|
type FetchDefaults = RequiredByKey<FetchRequestInit.Defaults, 'headers' | 'searchParams'>;
|
|
256
257
|
/**
|
package/dist/index.js
CHANGED
|
@@ -195,17 +195,16 @@ var joinURL_default = joinURL;
|
|
|
195
195
|
// src/client/FetchClient.ts
|
|
196
196
|
var FetchClient = class {
|
|
197
197
|
fetch;
|
|
198
|
-
constructor({
|
|
198
|
+
constructor({ headers = {}, searchParams = {}, ...otherOptions }) {
|
|
199
199
|
this.fetch = this.createFetchFunction();
|
|
200
|
-
this.fetch.
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
searchParams: defaults.searchParams ?? {}
|
|
204
|
-
};
|
|
200
|
+
this.fetch.headers = headers;
|
|
201
|
+
this.fetch.searchParams = searchParams;
|
|
202
|
+
Object.assign(this.fetch, otherOptions);
|
|
205
203
|
this.fetch.loose = this.fetch;
|
|
206
|
-
this.fetch.Request = this.createRequestClass(this.fetch
|
|
207
|
-
|
|
208
|
-
|
|
204
|
+
this.fetch.Request = this.createRequestClass(this.fetch);
|
|
205
|
+
}
|
|
206
|
+
get defaults() {
|
|
207
|
+
return this.fetch;
|
|
209
208
|
}
|
|
210
209
|
createFetchFunction() {
|
|
211
210
|
const fetch = async (input, init) => {
|
|
@@ -271,49 +270,56 @@ var FetchClient = class {
|
|
|
271
270
|
});
|
|
272
271
|
return fetchResponse;
|
|
273
272
|
}
|
|
274
|
-
createRequestClass(
|
|
273
|
+
createRequestClass(fetch) {
|
|
275
274
|
class Request2 extends globalThis.Request {
|
|
276
275
|
path;
|
|
277
276
|
constructor(input, init) {
|
|
278
|
-
|
|
279
|
-
const
|
|
280
|
-
|
|
277
|
+
let actualInput;
|
|
278
|
+
const actualInit = {
|
|
279
|
+
baseURL: init?.baseURL ?? fetch.baseURL,
|
|
280
|
+
method: init?.method ?? fetch.method,
|
|
281
|
+
headers: new http.HttpHeaders(fetch.headers),
|
|
282
|
+
searchParams: new http.HttpSearchParams(fetch.searchParams),
|
|
283
|
+
body: init?.body ?? fetch.body,
|
|
284
|
+
mode: init?.mode ?? fetch.mode,
|
|
285
|
+
cache: init?.cache ?? fetch.cache,
|
|
286
|
+
credentials: init?.credentials ?? fetch.credentials,
|
|
287
|
+
integrity: init?.integrity ?? fetch.integrity,
|
|
288
|
+
keepalive: init?.keepalive ?? fetch.keepalive,
|
|
289
|
+
priority: init?.priority ?? fetch.priority,
|
|
290
|
+
redirect: init?.redirect ?? fetch.redirect,
|
|
291
|
+
referrer: init?.referrer ?? fetch.referrer,
|
|
292
|
+
referrerPolicy: init?.referrerPolicy ?? fetch.referrerPolicy,
|
|
293
|
+
signal: init?.signal ?? fetch.signal,
|
|
294
|
+
window: init?.window === void 0 ? fetch.window : init.window,
|
|
295
|
+
duplex: init?.duplex ?? fetch.duplex
|
|
296
|
+
};
|
|
297
|
+
if (init?.headers) {
|
|
298
|
+
actualInit.headers.assign(new http.HttpHeaders(init.headers));
|
|
299
|
+
}
|
|
281
300
|
let url;
|
|
282
|
-
const baseURL = new URL(
|
|
301
|
+
const baseURL = new URL(actualInit.baseURL);
|
|
283
302
|
if (input instanceof globalThis.Request) {
|
|
284
303
|
const request = input;
|
|
285
|
-
|
|
286
|
-
initWithDefaults.headers = {
|
|
287
|
-
...headersFromDefaults.toObject(),
|
|
288
|
-
...headersFromRequest.toObject(),
|
|
289
|
-
...headersFromInit.toObject()
|
|
290
|
-
};
|
|
291
|
-
super(request, initWithDefaults);
|
|
304
|
+
actualInit.headers.assign(new http.HttpHeaders(request.headers));
|
|
292
305
|
url = new URL(input.url);
|
|
306
|
+
actualInput = request;
|
|
293
307
|
} else {
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
initWithDefaults.searchParams = {
|
|
302
|
-
...searchParamsFromDefaults.toObject(),
|
|
303
|
-
...searchParamsFromInit.toObject()
|
|
304
|
-
};
|
|
305
|
-
url.search = new http.HttpSearchParams(initWithDefaults.searchParams).toString();
|
|
306
|
-
super(url, initWithDefaults);
|
|
308
|
+
url = new URL(input instanceof URL ? input : joinURL_default(baseURL, input));
|
|
309
|
+
actualInit.searchParams.assign(new http.HttpSearchParams(url.searchParams));
|
|
310
|
+
if (init?.searchParams) {
|
|
311
|
+
actualInit.searchParams.assign(new http.HttpSearchParams(init.searchParams));
|
|
312
|
+
}
|
|
313
|
+
url.search = actualInit.searchParams.toString();
|
|
314
|
+
actualInput = url;
|
|
307
315
|
}
|
|
316
|
+
super(actualInput, actualInit);
|
|
308
317
|
const baseURLWithoutTrailingSlash = baseURL.toString().replace(/\/$/, "");
|
|
309
318
|
this.path = excludeNonPathParams_default(url).toString().replace(baseURLWithoutTrailingSlash, "");
|
|
310
319
|
}
|
|
311
320
|
clone() {
|
|
312
321
|
const rawClone = super.clone();
|
|
313
|
-
return new Request2(
|
|
314
|
-
rawClone,
|
|
315
|
-
rawClone
|
|
316
|
-
);
|
|
322
|
+
return new Request2(rawClone);
|
|
317
323
|
}
|
|
318
324
|
}
|
|
319
325
|
return Request2;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/client/errors/FetchResponseError.ts","../../zimic-utils/src/url/createRegexFromPath.ts","../../zimic-utils/src/url/excludeNonPathParams.ts","../../zimic-utils/src/url/joinURL.ts","../src/client/FetchClient.ts","../src/client/factory.ts"],"names":["HttpHeaders","parseHttpBody","Request","HttpSearchParams"],"mappings":"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","file":"index.js","sourcesContent":["import {\n HttpHeaders,\n HttpHeadersSchema,\n HttpSchema,\n HttpSchemaMethod,\n HttpSchemaPath,\n parseHttpBody,\n} from '@zimic/http';\nimport { PossiblePromise } from '@zimic/utils/types';\n\nimport { FetchRequest, FetchRequestObject, FetchResponse, FetchResponseObject } from '../types/requests';\n\n/** @see {@link https://zimic.dev/docs/fetch/api/fetch-response-error#errortoobject `fetchResponseError.toObject()` API reference} */\nexport interface FetchResponseErrorObjectOptions {\n /** @see {@link https://zimic.dev/docs/fetch/api/fetch-response-error#errortoobject `fetchResponseError.toObject()` API reference} */\n includeRequestBody?: boolean;\n /** @see {@link https://zimic.dev/docs/fetch/api/fetch-response-error#errortoobject `fetchResponseError.toObject()` API reference} */\n includeResponseBody?: boolean;\n}\n\nexport namespace FetchResponseErrorObjectOptions {\n /**\n * Options for converting a {@link FetchResponseError `FetchResponseError`} into a plain object, including the body of\n * the request and/or response.\n */\n export type WithBody = FetchResponseErrorObjectOptions &\n ({ includeRequestBody: true } | { includeResponseBody: true });\n\n /**\n * Options for converting a {@link FetchResponseError `FetchResponseError`} into a plain object, excluding the body of\n * the request and/or response.\n */\n export type WithoutBody = FetchResponseErrorObjectOptions &\n ({ includeRequestBody?: false } | { includeResponseBody?: false });\n}\n\n/**\n * A plain object representation of a {@link FetchResponseError `FetchResponseError`}, compatible with JSON. It is useful\n * for serialization, debugging, and logging purposes.\n *\n * @see {@link https://zimic.dev/docs/fetch/api/fetch-response-error#errortoobject `fetchResponseError.toObject()` API reference}\n */\nexport interface FetchResponseErrorObject {\n name: string;\n message: string;\n request: FetchRequestObject;\n response: FetchResponseObject;\n}\n\n/** @see {@link https://zimic.dev/docs/fetch/api/fetch-response-error `FetchResponseError` API reference} */\nclass FetchResponseError<\n Schema extends HttpSchema,\n Method extends HttpSchemaMethod<Schema>,\n Path extends HttpSchemaPath.Literal<Schema, Method>,\n> extends Error {\n constructor(\n public request: FetchRequest<Schema, Method, Path>,\n public response: FetchResponse<Schema, Method, Path, true, 'manual'>,\n ) {\n super(`${request.method} ${request.url} failed with status ${response.status}: ${response.statusText}`);\n this.name = 'FetchResponseError';\n }\n\n /** @see {@link https://zimic.dev/docs/fetch/api/fetch-response-error#errortoobject `fetchResponseError.toObject()` API reference} */\n toObject(options: FetchResponseErrorObjectOptions.WithBody): Promise<FetchResponseErrorObject>;\n toObject(options?: FetchResponseErrorObjectOptions.WithoutBody): FetchResponseErrorObject;\n toObject(options?: FetchResponseErrorObjectOptions): PossiblePromise<FetchResponseErrorObject>;\n toObject({\n includeRequestBody = false,\n includeResponseBody = false,\n }: FetchResponseErrorObjectOptions = {}): PossiblePromise<FetchResponseErrorObject> {\n const partialObject = {\n name: this.name,\n message: this.message,\n } satisfies Partial<FetchResponseErrorObject>;\n\n if (!includeRequestBody && !includeResponseBody) {\n return {\n ...partialObject,\n request: this.requestToObject({ includeBody: false }),\n response: this.responseToObject({ includeBody: false }),\n };\n }\n\n return Promise.all([\n Promise.resolve(this.requestToObject({ includeBody: includeRequestBody })),\n Promise.resolve(this.responseToObject({ includeBody: includeResponseBody })),\n ]).then(([request, response]) => ({ ...partialObject, request, response }));\n }\n\n private requestToObject(options: { includeBody: true }): Promise<FetchRequestObject>;\n private requestToObject(options: { includeBody: false }): FetchRequestObject;\n private requestToObject(options: { includeBody: boolean }): PossiblePromise<FetchRequestObject>;\n private requestToObject(options: { includeBody: boolean }): PossiblePromise<FetchRequestObject> {\n const request = this.request;\n\n const requestObject: FetchRequestObject = {\n url: request.url,\n path: request.path,\n method: request.method,\n headers: this.convertHeadersToObject(request),\n cache: request.cache,\n destination: request.destination,\n credentials: request.credentials,\n integrity: request.integrity,\n keepalive: request.keepalive,\n mode: request.mode,\n redirect: request.redirect,\n referrer: request.referrer,\n referrerPolicy: request.referrerPolicy,\n };\n\n if (!options.includeBody) {\n return requestObject;\n }\n\n return this.withIncludedBodyIfAvailable('request', requestObject);\n }\n\n private responseToObject(options: { includeBody: true }): Promise<FetchResponseObject>;\n private responseToObject(options: { includeBody: false }): FetchResponseObject;\n private responseToObject(options: { includeBody: boolean }): PossiblePromise<FetchResponseObject>;\n private responseToObject(options: { includeBody: boolean }): PossiblePromise<FetchResponseObject> {\n const response = this.response;\n\n const responseObject: FetchResponseObject = {\n url: response.url,\n type: response.type,\n status: response.status,\n statusText: response.statusText,\n ok: response.ok,\n headers: this.convertHeadersToObject(response),\n redirected: response.redirected,\n };\n\n if (!options.includeBody) {\n return responseObject;\n }\n\n return this.withIncludedBodyIfAvailable('response', responseObject);\n }\n\n private convertHeadersToObject(\n resource: FetchRequest<Schema, Method, Path> | FetchResponse<Schema, Method, Path, true, 'manual'>,\n ): HttpHeadersSchema {\n return HttpHeaders.prototype.toObject.call(resource.headers) as HttpHeadersSchema;\n }\n\n private withIncludedBodyIfAvailable(\n resourceType: 'request',\n resourceObject: FetchRequestObject,\n ): PossiblePromise<FetchRequestObject>;\n private withIncludedBodyIfAvailable(\n resourceType: 'response',\n resourceObject: FetchResponseObject,\n ): PossiblePromise<FetchResponseObject>;\n private withIncludedBodyIfAvailable(\n resourceType: 'request' | 'response',\n resourceObject: FetchRequestObject | FetchResponseObject,\n ): PossiblePromise<FetchRequestObject | FetchResponseObject> {\n const resource = this[resourceType] as Request | Response;\n\n if (resource.bodyUsed) {\n console.warn(\n '[@zimic/fetch]',\n `Could not include the ${resourceType} body because it is already used. ` +\n 'If you access the body before calling `error.toObject()`, consider reading it from a cloned ' +\n `${resourceType}.\\n\\nLearn more: https://zimic.dev/docs/fetch/api/fetch-response-error#errortoobject`,\n );\n return resourceObject;\n }\n\n return parseHttpBody(resource)\n .then((body) => {\n resourceObject.body = body;\n return resourceObject;\n })\n .catch((error: unknown) => {\n console.error('[@zimic/fetch]', `Failed to parse ${resourceType} body:`, error);\n return resourceObject;\n });\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyFetchRequestError = FetchResponseError<any, any, any>;\n\nexport default FetchResponseError;\n","export function createPathCharactersToEscapeRegex() {\n return /([.(){}+$])/g;\n}\n\nexport function preparePathForRegex(path: string) {\n // We encode the path using the URL API because, differently from encodeURI and encodeURIComponent, URL does not\n // re-encode already encoded characters. Since URL requires a full URL, we use a data scheme and strip it later.\n const pathURLPrefix = `data:${path.startsWith('/') ? '' : '/'}`;\n const pathAsURL = new URL(`${pathURLPrefix}${path}`);\n const encodedPath = pathAsURL.href.replace(pathURLPrefix, '');\n\n return encodedPath.replace(/^\\/+/g, '').replace(/\\/+$/g, '').replace(createPathCharactersToEscapeRegex(), '\\\\$1');\n}\n\n// Path params names must match the JavaScript identifier pattern.\n// See // https://developer.mozilla.org/docs/Web/JavaScript/Reference/Lexical_grammar#identifiers.\nexport function createPathParamRegex() {\n return /(?<escape>\\\\)?:(?<identifier>[$_\\p{ID_Start}][$\\p{ID_Continue}]+)(?!\\\\[*+?])/gu;\n}\n\nexport function createRepeatingPathParamRegex() {\n return /(?<escape>\\\\)?:(?<identifier>[$_\\p{ID_Start}][$\\p{ID_Continue}]+)\\\\\\+/gu;\n}\n\nexport function createOptionalPathParamRegex() {\n return /(?<leadingSlash>\\/)?(?<escape>\\\\)?:(?<identifier>[$_\\p{ID_Start}][$\\p{ID_Continue}]+)\\?(?<trailingSlash>\\/)?/gu;\n}\n\nexport function createOptionalRepeatingPathParamRegex() {\n return /(?<leadingSlash>\\/)?(?<escape>\\\\)?:(?<identifier>[$_\\p{ID_Start}][$\\p{ID_Continue}]+)\\*(?<trailingSlash>\\/)?/gu;\n}\n\nfunction createRegexFromPath(path: string) {\n const pathRegexContent = preparePathForRegex(path)\n .replace(\n createOptionalRepeatingPathParamRegex(),\n (\n _match,\n leadingSlash: string | undefined,\n escape: string | undefined,\n identifier: string,\n trailingSlash: string | undefined,\n ) => {\n if (escape) {\n return `${leadingSlash ?? ''}:${identifier}\\\\*${trailingSlash ?? ''}`;\n }\n\n const hasSegmentBeforePrefix = leadingSlash === '/';\n const prefixExpression = hasSegmentBeforePrefix ? '/?' : leadingSlash;\n\n const hasSegmentAfterSuffix = trailingSlash === '/';\n const suffixExpression = hasSegmentAfterSuffix ? '/?' : trailingSlash;\n\n if (prefixExpression && suffixExpression) {\n return `(?:${prefixExpression}(?<${identifier}>.+?)?${suffixExpression})?`;\n } else if (prefixExpression) {\n return `(?:${prefixExpression}(?<${identifier}>.+?))?`;\n } else if (suffixExpression) {\n return `(?:(?<${identifier}>.+?)${suffixExpression})?`;\n } else {\n return `(?<${identifier}>.+?)?`;\n }\n },\n )\n .replace(createRepeatingPathParamRegex(), (_match, escape: string | undefined, identifier: string) => {\n return escape ? `:${identifier}\\\\+` : `(?<${identifier}>.+)`;\n })\n .replace(\n createOptionalPathParamRegex(),\n (\n _match,\n leadingSlash: string | undefined,\n escape: string | undefined,\n identifier: string,\n trailingSlash: string | undefined,\n ) => {\n if (escape) {\n return `${leadingSlash ?? ''}:${identifier}\\\\?${trailingSlash ?? ''}`;\n }\n\n const hasSegmentBeforePrefix = leadingSlash === '/';\n const prefixExpression = hasSegmentBeforePrefix ? '/?' : leadingSlash;\n\n const hasSegmentAfterSuffix = trailingSlash === '/';\n const suffixExpression = hasSegmentAfterSuffix ? '/?' : trailingSlash;\n\n if (prefixExpression && suffixExpression) {\n return `(?:${prefixExpression}(?<${identifier}>[^\\\\/]+?)?${suffixExpression})`;\n } else if (prefixExpression) {\n return `(?:${prefixExpression}(?<${identifier}>[^\\\\/]+?))?`;\n } else if (suffixExpression) {\n return `(?:(?<${identifier}>[^\\\\/]+?)${suffixExpression})?`;\n } else {\n return `(?<${identifier}>[^\\\\/]+?)?`;\n }\n },\n )\n .replace(createPathParamRegex(), (_match, escape: string | undefined, identifier: string) => {\n return escape ? `:${identifier}` : `(?<${identifier}>[^\\\\/]+?)`;\n });\n\n return new RegExp(`^/?${pathRegexContent}/?$`);\n}\n\nexport default createRegexFromPath;\n","function excludeNonPathParams(url: URL) {\n url.hash = '';\n url.search = '';\n url.username = '';\n url.password = '';\n return url;\n}\n\nexport default excludeNonPathParams;\n","function joinURL(...parts: (URL | string)[]) {\n return parts\n .map((part, index) => {\n const isFirstPart = index === 0;\n const isLastPart = index === parts.length - 1;\n\n let partAsString = part.toString();\n\n if (!isFirstPart) {\n partAsString = partAsString.replace(/^\\//, '');\n }\n if (!isLastPart) {\n partAsString = partAsString.replace(/\\/$/, '');\n }\n\n return partAsString;\n })\n .filter((part) => part.length > 0)\n .join('/');\n}\n\nexport default joinURL;\n","import {\n HttpSchemaPath,\n HttpSchemaMethod,\n HttpSearchParams,\n LiteralHttpSchemaPathFromNonLiteral,\n HttpSchema,\n HttpHeaders,\n} from '@zimic/http';\nimport createRegexFromPath from '@zimic/utils/url/createRegexFromPath';\nimport excludeNonPathParams from '@zimic/utils/url/excludeNonPathParams';\nimport joinURL from '@zimic/utils/url/joinURL';\n\nimport FetchResponseError from './errors/FetchResponseError';\nimport { FetchInput, FetchOptions, Fetch, FetchDefaults } from './types/public';\nimport { FetchRequestConstructor, FetchRequestInit, FetchRequest, FetchResponse } from './types/requests';\n\nclass FetchClient<Schema extends HttpSchema> implements Omit<Fetch<Schema>, '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 = excludeNonPathParams(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 createRegexFromPath(path).test(request.path)\n );\n }\n\n isResponse<Path extends HttpSchemaPath.Literal<Schema, Method>, Method extends HttpSchemaMethod<Schema>>(\n response: unknown,\n method: Method,\n path: Path,\n ): response is FetchResponse<Schema, Method, Path> {\n return (\n response instanceof Response &&\n 'request' in response &&\n this.isRequest(response.request, method, path) &&\n 'error' in response &&\n (response.error === null || response.error instanceof FetchResponseError)\n );\n }\n\n isResponseError<Path extends HttpSchemaPath.Literal<Schema, Method>, Method extends HttpSchemaMethod<Schema>>(\n error: unknown,\n method: Method,\n path: Path,\n ): error is FetchResponseError<Schema, Method, Path> {\n return (\n error instanceof FetchResponseError &&\n this.isRequest(error.request, method, path) &&\n this.isResponse(error.response, method, path)\n );\n }\n}\n\nexport default FetchClient;\n","import { HttpSchema } from '@zimic/http';\n\nimport FetchClient from './FetchClient';\nimport { FetchOptions, Fetch } from './types/public';\n\n/** @see {@link https://zimic.dev/docs/fetch/api/create-fetch `createFetch` API reference} */\nfunction createFetch<Schema extends HttpSchema>(options: FetchOptions<Schema>): Fetch<Schema> {\n const { fetch } = new FetchClient<Schema>(options);\n return fetch;\n}\n\nexport default createFetch;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/client/errors/FetchResponseError.ts","../../zimic-utils/src/url/createRegexFromPath.ts","../../zimic-utils/src/url/excludeNonPathParams.ts","../../zimic-utils/src/url/joinURL.ts","../src/client/FetchClient.ts","../src/client/factory.ts"],"names":["HttpHeaders","parseHttpBody","Request","HttpSearchParams"],"mappings":"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","file":"index.js","sourcesContent":["import {\n HttpHeaders,\n HttpHeadersSchema,\n HttpSchema,\n HttpSchemaMethod,\n HttpSchemaPath,\n parseHttpBody,\n} from '@zimic/http';\nimport { PossiblePromise } from '@zimic/utils/types';\n\nimport { FetchRequest, FetchRequestObject, FetchResponse, FetchResponseObject } from '../types/requests';\n\n/** @see {@link https://zimic.dev/docs/fetch/api/fetch-response-error#errortoobject `fetchResponseError.toObject()` API reference} */\nexport interface FetchResponseErrorObjectOptions {\n /** @see {@link https://zimic.dev/docs/fetch/api/fetch-response-error#errortoobject `fetchResponseError.toObject()` API reference} */\n includeRequestBody?: boolean;\n /** @see {@link https://zimic.dev/docs/fetch/api/fetch-response-error#errortoobject `fetchResponseError.toObject()` API reference} */\n includeResponseBody?: boolean;\n}\n\nexport namespace FetchResponseErrorObjectOptions {\n /**\n * Options for converting a {@link FetchResponseError `FetchResponseError`} into a plain object, including the body of\n * the request and/or response.\n */\n export type WithBody = FetchResponseErrorObjectOptions &\n ({ includeRequestBody: true } | { includeResponseBody: true });\n\n /**\n * Options for converting a {@link FetchResponseError `FetchResponseError`} into a plain object, excluding the body of\n * the request and/or response.\n */\n export type WithoutBody = FetchResponseErrorObjectOptions &\n ({ includeRequestBody?: false } | { includeResponseBody?: false });\n}\n\n/**\n * A plain object representation of a {@link FetchResponseError `FetchResponseError`}, compatible with JSON. It is useful\n * for serialization, debugging, and logging purposes.\n *\n * @see {@link https://zimic.dev/docs/fetch/api/fetch-response-error#errortoobject `fetchResponseError.toObject()` API reference}\n */\nexport interface FetchResponseErrorObject {\n name: string;\n message: string;\n request: FetchRequestObject;\n response: FetchResponseObject;\n}\n\n/** @see {@link https://zimic.dev/docs/fetch/api/fetch-response-error `FetchResponseError` API reference} */\nclass FetchResponseError<\n Schema extends HttpSchema,\n Method extends HttpSchemaMethod<Schema>,\n Path extends HttpSchemaPath.Literal<Schema, Method>,\n> extends Error {\n constructor(\n public request: FetchRequest<Schema, Method, Path>,\n public response: FetchResponse<Schema, Method, Path, true, 'manual'>,\n ) {\n super(`${request.method} ${request.url} failed with status ${response.status}: ${response.statusText}`);\n this.name = 'FetchResponseError';\n }\n\n /** @see {@link https://zimic.dev/docs/fetch/api/fetch-response-error#errortoobject `fetchResponseError.toObject()` API reference} */\n toObject(options: FetchResponseErrorObjectOptions.WithBody): Promise<FetchResponseErrorObject>;\n toObject(options?: FetchResponseErrorObjectOptions.WithoutBody): FetchResponseErrorObject;\n toObject(options?: FetchResponseErrorObjectOptions): PossiblePromise<FetchResponseErrorObject>;\n toObject({\n includeRequestBody = false,\n includeResponseBody = false,\n }: FetchResponseErrorObjectOptions = {}): PossiblePromise<FetchResponseErrorObject> {\n const partialObject = {\n name: this.name,\n message: this.message,\n } satisfies Partial<FetchResponseErrorObject>;\n\n if (!includeRequestBody && !includeResponseBody) {\n return {\n ...partialObject,\n request: this.requestToObject({ includeBody: false }),\n response: this.responseToObject({ includeBody: false }),\n };\n }\n\n return Promise.all([\n Promise.resolve(this.requestToObject({ includeBody: includeRequestBody })),\n Promise.resolve(this.responseToObject({ includeBody: includeResponseBody })),\n ]).then(([request, response]) => ({ ...partialObject, request, response }));\n }\n\n private requestToObject(options: { includeBody: true }): Promise<FetchRequestObject>;\n private requestToObject(options: { includeBody: false }): FetchRequestObject;\n private requestToObject(options: { includeBody: boolean }): PossiblePromise<FetchRequestObject>;\n private requestToObject(options: { includeBody: boolean }): PossiblePromise<FetchRequestObject> {\n const request = this.request;\n\n const requestObject: FetchRequestObject = {\n url: request.url,\n path: request.path,\n method: request.method,\n headers: this.convertHeadersToObject(request),\n cache: request.cache,\n destination: request.destination,\n credentials: request.credentials,\n integrity: request.integrity,\n keepalive: request.keepalive,\n mode: request.mode,\n redirect: request.redirect,\n referrer: request.referrer,\n referrerPolicy: request.referrerPolicy,\n };\n\n if (!options.includeBody) {\n return requestObject;\n }\n\n return this.withIncludedBodyIfAvailable('request', requestObject);\n }\n\n private responseToObject(options: { includeBody: true }): Promise<FetchResponseObject>;\n private responseToObject(options: { includeBody: false }): FetchResponseObject;\n private responseToObject(options: { includeBody: boolean }): PossiblePromise<FetchResponseObject>;\n private responseToObject(options: { includeBody: boolean }): PossiblePromise<FetchResponseObject> {\n const response = this.response;\n\n const responseObject: FetchResponseObject = {\n url: response.url,\n type: response.type,\n status: response.status,\n statusText: response.statusText,\n ok: response.ok,\n headers: this.convertHeadersToObject(response),\n redirected: response.redirected,\n };\n\n if (!options.includeBody) {\n return responseObject;\n }\n\n return this.withIncludedBodyIfAvailable('response', responseObject);\n }\n\n private convertHeadersToObject(\n resource: FetchRequest<Schema, Method, Path> | FetchResponse<Schema, Method, Path, true, 'manual'>,\n ): HttpHeadersSchema {\n return HttpHeaders.prototype.toObject.call(resource.headers) as HttpHeadersSchema;\n }\n\n private withIncludedBodyIfAvailable(\n resourceType: 'request',\n resourceObject: FetchRequestObject,\n ): PossiblePromise<FetchRequestObject>;\n private withIncludedBodyIfAvailable(\n resourceType: 'response',\n resourceObject: FetchResponseObject,\n ): PossiblePromise<FetchResponseObject>;\n private withIncludedBodyIfAvailable(\n resourceType: 'request' | 'response',\n resourceObject: FetchRequestObject | FetchResponseObject,\n ): PossiblePromise<FetchRequestObject | FetchResponseObject> {\n const resource = this[resourceType] as Request | Response;\n\n if (resource.bodyUsed) {\n console.warn(\n '[@zimic/fetch]',\n `Could not include the ${resourceType} body because it is already used. ` +\n 'If you access the body before calling `error.toObject()`, consider reading it from a cloned ' +\n `${resourceType}.\\n\\nLearn more: https://zimic.dev/docs/fetch/api/fetch-response-error#errortoobject`,\n );\n return resourceObject;\n }\n\n return parseHttpBody(resource)\n .then((body) => {\n resourceObject.body = body;\n return resourceObject;\n })\n .catch((error: unknown) => {\n console.error('[@zimic/fetch]', `Failed to parse ${resourceType} body:`, error);\n return resourceObject;\n });\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyFetchRequestError = FetchResponseError<any, any, any>;\n\nexport default FetchResponseError;\n","export function createPathCharactersToEscapeRegex() {\n return /([.(){}+$])/g;\n}\n\nexport function preparePathForRegex(path: string) {\n // We encode the path using the URL API because, differently from encodeURI and encodeURIComponent, URL does not\n // re-encode already encoded characters. Since URL requires a full URL, we use a data scheme and strip it later.\n const pathURLPrefix = `data:${path.startsWith('/') ? '' : '/'}`;\n const pathAsURL = new URL(`${pathURLPrefix}${path}`);\n const encodedPath = pathAsURL.href.replace(pathURLPrefix, '');\n\n return encodedPath.replace(/^\\/+/g, '').replace(/\\/+$/g, '').replace(createPathCharactersToEscapeRegex(), '\\\\$1');\n}\n\n// Path params names must match the JavaScript identifier pattern.\n// See // https://developer.mozilla.org/docs/Web/JavaScript/Reference/Lexical_grammar#identifiers.\nexport function createPathParamRegex() {\n return /(?<escape>\\\\)?:(?<identifier>[$_\\p{ID_Start}][$\\p{ID_Continue}]+)(?!\\\\[*+?])/gu;\n}\n\nexport function createRepeatingPathParamRegex() {\n return /(?<escape>\\\\)?:(?<identifier>[$_\\p{ID_Start}][$\\p{ID_Continue}]+)\\\\\\+/gu;\n}\n\nexport function createOptionalPathParamRegex() {\n return /(?<leadingSlash>\\/)?(?<escape>\\\\)?:(?<identifier>[$_\\p{ID_Start}][$\\p{ID_Continue}]+)\\?(?<trailingSlash>\\/)?/gu;\n}\n\nexport function createOptionalRepeatingPathParamRegex() {\n return /(?<leadingSlash>\\/)?(?<escape>\\\\)?:(?<identifier>[$_\\p{ID_Start}][$\\p{ID_Continue}]+)\\*(?<trailingSlash>\\/)?/gu;\n}\n\nfunction createRegexFromPath(path: string) {\n const pathRegexContent = preparePathForRegex(path)\n .replace(\n createOptionalRepeatingPathParamRegex(),\n (\n _match,\n leadingSlash: string | undefined,\n escape: string | undefined,\n identifier: string,\n trailingSlash: string | undefined,\n ) => {\n if (escape) {\n return `${leadingSlash ?? ''}:${identifier}\\\\*${trailingSlash ?? ''}`;\n }\n\n const hasSegmentBeforePrefix = leadingSlash === '/';\n const prefixExpression = hasSegmentBeforePrefix ? '/?' : leadingSlash;\n\n const hasSegmentAfterSuffix = trailingSlash === '/';\n const suffixExpression = hasSegmentAfterSuffix ? '/?' : trailingSlash;\n\n if (prefixExpression && suffixExpression) {\n return `(?:${prefixExpression}(?<${identifier}>.+?)?${suffixExpression})?`;\n } else if (prefixExpression) {\n return `(?:${prefixExpression}(?<${identifier}>.+?))?`;\n } else if (suffixExpression) {\n return `(?:(?<${identifier}>.+?)${suffixExpression})?`;\n } else {\n return `(?<${identifier}>.+?)?`;\n }\n },\n )\n .replace(createRepeatingPathParamRegex(), (_match, escape: string | undefined, identifier: string) => {\n return escape ? `:${identifier}\\\\+` : `(?<${identifier}>.+)`;\n })\n .replace(\n createOptionalPathParamRegex(),\n (\n _match,\n leadingSlash: string | undefined,\n escape: string | undefined,\n identifier: string,\n trailingSlash: string | undefined,\n ) => {\n if (escape) {\n return `${leadingSlash ?? ''}:${identifier}\\\\?${trailingSlash ?? ''}`;\n }\n\n const hasSegmentBeforePrefix = leadingSlash === '/';\n const prefixExpression = hasSegmentBeforePrefix ? '/?' : leadingSlash;\n\n const hasSegmentAfterSuffix = trailingSlash === '/';\n const suffixExpression = hasSegmentAfterSuffix ? '/?' : trailingSlash;\n\n if (prefixExpression && suffixExpression) {\n return `(?:${prefixExpression}(?<${identifier}>[^\\\\/]+?)?${suffixExpression})`;\n } else if (prefixExpression) {\n return `(?:${prefixExpression}(?<${identifier}>[^\\\\/]+?))?`;\n } else if (suffixExpression) {\n return `(?:(?<${identifier}>[^\\\\/]+?)${suffixExpression})?`;\n } else {\n return `(?<${identifier}>[^\\\\/]+?)?`;\n }\n },\n )\n .replace(createPathParamRegex(), (_match, escape: string | undefined, identifier: string) => {\n return escape ? `:${identifier}` : `(?<${identifier}>[^\\\\/]+?)`;\n });\n\n return new RegExp(`^/?${pathRegexContent}/?$`);\n}\n\nexport default createRegexFromPath;\n","function excludeNonPathParams(url: URL) {\n url.hash = '';\n url.search = '';\n url.username = '';\n url.password = '';\n return url;\n}\n\nexport default excludeNonPathParams;\n","function joinURL(...parts: (URL | string)[]) {\n return parts\n .map((part, index) => {\n const isFirstPart = index === 0;\n const isLastPart = index === parts.length - 1;\n\n let partAsString = part.toString();\n\n if (!isFirstPart) {\n partAsString = partAsString.replace(/^\\//, '');\n }\n if (!isLastPart) {\n partAsString = partAsString.replace(/\\/$/, '');\n }\n\n return partAsString;\n })\n .filter((part) => part.length > 0)\n .join('/');\n}\n\nexport default joinURL;\n","import {\n HttpSchemaPath,\n HttpSchemaMethod,\n HttpSearchParams,\n LiteralHttpSchemaPathFromNonLiteral,\n HttpSchema,\n HttpHeaders,\n} from '@zimic/http';\nimport createRegexFromPath from '@zimic/utils/url/createRegexFromPath';\nimport excludeNonPathParams from '@zimic/utils/url/excludeNonPathParams';\nimport joinURL from '@zimic/utils/url/joinURL';\n\nimport FetchResponseError from './errors/FetchResponseError';\nimport { FetchInput, FetchOptions, Fetch, FetchDefaults } from './types/public';\nimport { FetchRequestConstructor, FetchRequestInit, FetchRequest, FetchResponse } from './types/requests';\n\nclass FetchClient<Schema extends HttpSchema> implements Omit<Fetch<Schema>, 'loose' | 'Request' | keyof FetchDefaults> {\n fetch: Fetch<Schema>;\n\n constructor({ headers = {}, searchParams = {}, ...otherOptions }: FetchOptions<Schema>) {\n this.fetch = this.createFetchFunction();\n this.fetch.headers = headers;\n this.fetch.searchParams = searchParams;\n Object.assign(this.fetch, otherOptions);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.fetch.loose = this.fetch as Fetch<any> as Fetch.Loose;\n this.fetch.Request = this.createRequestClass(this.fetch);\n }\n\n get defaults(): FetchDefaults {\n return this.fetch;\n }\n\n private createFetchFunction() {\n const fetch = async <\n Method extends HttpSchemaMethod<Schema>,\n Path extends HttpSchemaPath.NonLiteral<Schema, Method>,\n >(\n input: FetchInput<Schema, Method, Path>,\n init: FetchRequestInit<Schema, Method, LiteralHttpSchemaPathFromNonLiteral<Schema, Method, Path>>,\n ) => {\n const request = await this.createFetchRequest<Method, Path>(input, init);\n const requestClone = request.clone();\n\n const rawResponse = await globalThis.fetch(\n // Optimize type checking by narrowing the type of request\n requestClone as Request,\n );\n const response = await this.createFetchResponse<\n Method,\n LiteralHttpSchemaPathFromNonLiteral<Schema, Method, Path>\n >(request, rawResponse);\n\n return response;\n };\n\n Object.setPrototypeOf(fetch, this);\n\n return fetch as Fetch<Schema>;\n }\n\n private async createFetchRequest<\n Method extends HttpSchemaMethod<Schema>,\n Path extends HttpSchemaPath.NonLiteral<Schema, Method>,\n >(\n input: FetchInput<Schema, Method, Path>,\n init: FetchRequestInit<Schema, Method, LiteralHttpSchemaPathFromNonLiteral<Schema, Method, Path>>,\n ) {\n let request = input instanceof Request ? input : new this.fetch.Request(input, init);\n\n if (this.fetch.onRequest) {\n const requestAfterInterceptor = await this.fetch.onRequest(\n // Optimize type checking by narrowing the type of request\n request as FetchRequest.Loose,\n );\n\n if (requestAfterInterceptor !== request) {\n const isFetchRequest = requestAfterInterceptor instanceof this.fetch.Request;\n\n request = isFetchRequest\n ? (requestAfterInterceptor as Request as typeof request)\n : new this.fetch.Request(requestAfterInterceptor as FetchInput<Schema, Method, Path>, init);\n }\n }\n\n return request;\n }\n\n private async createFetchResponse<\n Method extends HttpSchemaMethod<Schema>,\n Path extends HttpSchemaPath.Literal<Schema, Method>,\n >(fetchRequest: FetchRequest<Schema, Method, Path>, rawResponse: Response) {\n let response = this.defineFetchResponseProperties<Method, Path>(fetchRequest, rawResponse);\n\n if (this.fetch.onResponse) {\n const responseAfterInterceptor = await this.fetch.onResponse(\n // Optimize type checking by narrowing the type of response\n response as FetchResponse.Loose,\n );\n\n const isFetchResponse =\n responseAfterInterceptor instanceof Response &&\n 'request' in responseAfterInterceptor &&\n responseAfterInterceptor.request instanceof this.fetch.Request;\n\n response = isFetchResponse\n ? (responseAfterInterceptor as typeof response)\n : this.defineFetchResponseProperties<Method, Path>(fetchRequest, responseAfterInterceptor);\n }\n\n return response;\n }\n\n private defineFetchResponseProperties<\n Method extends HttpSchemaMethod<Schema>,\n Path extends HttpSchemaPath.Literal<Schema, Method>,\n >(fetchRequest: FetchRequest<Schema, Method, Path>, response: Response) {\n const fetchResponse = response as FetchResponse<Schema, Method, Path>;\n\n Object.defineProperty(fetchResponse, 'request', {\n value: fetchRequest,\n writable: false,\n enumerable: true,\n configurable: false,\n });\n\n let responseError: FetchResponse.Loose['error'] | undefined;\n\n Object.defineProperty(fetchResponse, 'error', {\n get() {\n if (responseError === undefined) {\n responseError = fetchResponse.ok\n ? null\n : new FetchResponseError(\n fetchRequest,\n fetchResponse as FetchResponse<Schema, Method, Path, true, 'manual'>,\n );\n }\n return responseError;\n },\n enumerable: true,\n configurable: false,\n });\n\n return fetchResponse;\n }\n\n private createRequestClass(fetch: Fetch<Schema>) {\n class Request<\n Method extends HttpSchemaMethod<Schema>,\n Path extends HttpSchemaPath.NonLiteral<Schema, Method>,\n > extends globalThis.Request {\n path: LiteralHttpSchemaPathFromNonLiteral<Schema, Method, Path>;\n\n constructor(input: FetchInput<Schema, Method, Path>, init?: FetchRequestInit.Loose) {\n let actualInput: URL | globalThis.Request;\n\n const actualInit = {\n baseURL: init?.baseURL ?? fetch.baseURL,\n method: init?.method ?? fetch.method,\n headers: new HttpHeaders(fetch.headers),\n searchParams: new HttpSearchParams(fetch.searchParams),\n body: init?.body ?? fetch.body,\n mode: init?.mode ?? fetch.mode,\n cache: init?.cache ?? fetch.cache,\n credentials: init?.credentials ?? fetch.credentials,\n integrity: init?.integrity ?? fetch.integrity,\n keepalive: init?.keepalive ?? fetch.keepalive,\n priority: init?.priority ?? fetch.priority,\n redirect: init?.redirect ?? fetch.redirect,\n referrer: init?.referrer ?? fetch.referrer,\n referrerPolicy: init?.referrerPolicy ?? fetch.referrerPolicy,\n signal: init?.signal ?? fetch.signal,\n window: init?.window === undefined ? fetch.window : init.window,\n duplex: init?.duplex ?? fetch.duplex,\n };\n\n if (init?.headers) {\n actualInit.headers.assign(new HttpHeaders(init.headers));\n }\n\n let url: URL;\n const baseURL = new URL(actualInit.baseURL);\n\n if (input instanceof globalThis.Request) {\n const request = input as globalThis.Request;\n\n actualInit.headers.assign(new HttpHeaders(request.headers));\n\n url = new URL(input.url);\n\n actualInput = request;\n } else {\n url = new URL(input instanceof URL ? input : joinURL(baseURL, input));\n\n actualInit.searchParams.assign(new HttpSearchParams(url.searchParams));\n\n if (init?.searchParams) {\n actualInit.searchParams.assign(new HttpSearchParams(init.searchParams));\n }\n\n url.search = actualInit.searchParams.toString();\n\n actualInput = url;\n }\n\n super(actualInput, actualInit);\n\n const baseURLWithoutTrailingSlash = baseURL.toString().replace(/\\/$/, '');\n\n this.path = excludeNonPathParams(url)\n .toString()\n .replace(baseURLWithoutTrailingSlash, '') as LiteralHttpSchemaPathFromNonLiteral<Schema, Method, Path>;\n }\n\n clone(): this {\n const rawClone = super.clone();\n return new Request(rawClone as FetchInput<Schema, Method, Path>) as this;\n }\n }\n\n return Request as FetchRequestConstructor<Schema>;\n }\n\n isRequest<Path extends HttpSchemaPath.Literal<Schema, Method>, Method extends HttpSchemaMethod<Schema>>(\n request: unknown,\n method: Method,\n path: Path,\n ): request is FetchRequest<Schema, Method, Path> {\n return (\n request instanceof Request &&\n request.method === method &&\n 'path' in request &&\n typeof request.path === 'string' &&\n createRegexFromPath(path).test(request.path)\n );\n }\n\n isResponse<Path extends HttpSchemaPath.Literal<Schema, Method>, Method extends HttpSchemaMethod<Schema>>(\n response: unknown,\n method: Method,\n path: Path,\n ): response is FetchResponse<Schema, Method, Path> {\n return (\n response instanceof Response &&\n 'request' in response &&\n this.isRequest(response.request, method, path) &&\n 'error' in response &&\n (response.error === null || response.error instanceof FetchResponseError)\n );\n }\n\n isResponseError<Path extends HttpSchemaPath.Literal<Schema, Method>, Method extends HttpSchemaMethod<Schema>>(\n error: unknown,\n method: Method,\n path: Path,\n ): error is FetchResponseError<Schema, Method, Path> {\n return (\n error instanceof FetchResponseError &&\n this.isRequest(error.request, method, path) &&\n this.isResponse(error.response, method, path)\n );\n }\n}\n\nexport default FetchClient;\n","import { HttpSchema } from '@zimic/http';\n\nimport FetchClient from './FetchClient';\nimport { FetchOptions, Fetch } from './types/public';\n\n/** @see {@link https://zimic.dev/docs/fetch/api/create-fetch `createFetch` API reference} */\nfunction createFetch<Schema extends HttpSchema>(options: FetchOptions<Schema>): Fetch<Schema> {\n const { fetch } = new FetchClient<Schema>(options);\n return fetch;\n}\n\nexport default createFetch;\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -193,17 +193,16 @@ var joinURL_default = joinURL;
|
|
|
193
193
|
// src/client/FetchClient.ts
|
|
194
194
|
var FetchClient = class {
|
|
195
195
|
fetch;
|
|
196
|
-
constructor({
|
|
196
|
+
constructor({ headers = {}, searchParams = {}, ...otherOptions }) {
|
|
197
197
|
this.fetch = this.createFetchFunction();
|
|
198
|
-
this.fetch.
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
searchParams: defaults.searchParams ?? {}
|
|
202
|
-
};
|
|
198
|
+
this.fetch.headers = headers;
|
|
199
|
+
this.fetch.searchParams = searchParams;
|
|
200
|
+
Object.assign(this.fetch, otherOptions);
|
|
203
201
|
this.fetch.loose = this.fetch;
|
|
204
|
-
this.fetch.Request = this.createRequestClass(this.fetch
|
|
205
|
-
|
|
206
|
-
|
|
202
|
+
this.fetch.Request = this.createRequestClass(this.fetch);
|
|
203
|
+
}
|
|
204
|
+
get defaults() {
|
|
205
|
+
return this.fetch;
|
|
207
206
|
}
|
|
208
207
|
createFetchFunction() {
|
|
209
208
|
const fetch = async (input, init) => {
|
|
@@ -269,49 +268,56 @@ var FetchClient = class {
|
|
|
269
268
|
});
|
|
270
269
|
return fetchResponse;
|
|
271
270
|
}
|
|
272
|
-
createRequestClass(
|
|
271
|
+
createRequestClass(fetch) {
|
|
273
272
|
class Request2 extends globalThis.Request {
|
|
274
273
|
path;
|
|
275
274
|
constructor(input, init) {
|
|
276
|
-
|
|
277
|
-
const
|
|
278
|
-
|
|
275
|
+
let actualInput;
|
|
276
|
+
const actualInit = {
|
|
277
|
+
baseURL: init?.baseURL ?? fetch.baseURL,
|
|
278
|
+
method: init?.method ?? fetch.method,
|
|
279
|
+
headers: new HttpHeaders(fetch.headers),
|
|
280
|
+
searchParams: new HttpSearchParams(fetch.searchParams),
|
|
281
|
+
body: init?.body ?? fetch.body,
|
|
282
|
+
mode: init?.mode ?? fetch.mode,
|
|
283
|
+
cache: init?.cache ?? fetch.cache,
|
|
284
|
+
credentials: init?.credentials ?? fetch.credentials,
|
|
285
|
+
integrity: init?.integrity ?? fetch.integrity,
|
|
286
|
+
keepalive: init?.keepalive ?? fetch.keepalive,
|
|
287
|
+
priority: init?.priority ?? fetch.priority,
|
|
288
|
+
redirect: init?.redirect ?? fetch.redirect,
|
|
289
|
+
referrer: init?.referrer ?? fetch.referrer,
|
|
290
|
+
referrerPolicy: init?.referrerPolicy ?? fetch.referrerPolicy,
|
|
291
|
+
signal: init?.signal ?? fetch.signal,
|
|
292
|
+
window: init?.window === void 0 ? fetch.window : init.window,
|
|
293
|
+
duplex: init?.duplex ?? fetch.duplex
|
|
294
|
+
};
|
|
295
|
+
if (init?.headers) {
|
|
296
|
+
actualInit.headers.assign(new HttpHeaders(init.headers));
|
|
297
|
+
}
|
|
279
298
|
let url;
|
|
280
|
-
const baseURL = new URL(
|
|
299
|
+
const baseURL = new URL(actualInit.baseURL);
|
|
281
300
|
if (input instanceof globalThis.Request) {
|
|
282
301
|
const request = input;
|
|
283
|
-
|
|
284
|
-
initWithDefaults.headers = {
|
|
285
|
-
...headersFromDefaults.toObject(),
|
|
286
|
-
...headersFromRequest.toObject(),
|
|
287
|
-
...headersFromInit.toObject()
|
|
288
|
-
};
|
|
289
|
-
super(request, initWithDefaults);
|
|
302
|
+
actualInit.headers.assign(new HttpHeaders(request.headers));
|
|
290
303
|
url = new URL(input.url);
|
|
304
|
+
actualInput = request;
|
|
291
305
|
} else {
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
initWithDefaults.searchParams = {
|
|
300
|
-
...searchParamsFromDefaults.toObject(),
|
|
301
|
-
...searchParamsFromInit.toObject()
|
|
302
|
-
};
|
|
303
|
-
url.search = new HttpSearchParams(initWithDefaults.searchParams).toString();
|
|
304
|
-
super(url, initWithDefaults);
|
|
306
|
+
url = new URL(input instanceof URL ? input : joinURL_default(baseURL, input));
|
|
307
|
+
actualInit.searchParams.assign(new HttpSearchParams(url.searchParams));
|
|
308
|
+
if (init?.searchParams) {
|
|
309
|
+
actualInit.searchParams.assign(new HttpSearchParams(init.searchParams));
|
|
310
|
+
}
|
|
311
|
+
url.search = actualInit.searchParams.toString();
|
|
312
|
+
actualInput = url;
|
|
305
313
|
}
|
|
314
|
+
super(actualInput, actualInit);
|
|
306
315
|
const baseURLWithoutTrailingSlash = baseURL.toString().replace(/\/$/, "");
|
|
307
316
|
this.path = excludeNonPathParams_default(url).toString().replace(baseURLWithoutTrailingSlash, "");
|
|
308
317
|
}
|
|
309
318
|
clone() {
|
|
310
319
|
const rawClone = super.clone();
|
|
311
|
-
return new Request2(
|
|
312
|
-
rawClone,
|
|
313
|
-
rawClone
|
|
314
|
-
);
|
|
320
|
+
return new Request2(rawClone);
|
|
315
321
|
}
|
|
316
322
|
}
|
|
317
323
|
return Request2;
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/client/errors/FetchResponseError.ts","../../zimic-utils/src/url/createRegexFromPath.ts","../../zimic-utils/src/url/excludeNonPathParams.ts","../../zimic-utils/src/url/joinURL.ts","../src/client/FetchClient.ts","../src/client/factory.ts"],"names":["Request","HttpHeaders"],"mappings":"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","file":"index.mjs","sourcesContent":["import {\n HttpHeaders,\n HttpHeadersSchema,\n HttpSchema,\n HttpSchemaMethod,\n HttpSchemaPath,\n parseHttpBody,\n} from '@zimic/http';\nimport { PossiblePromise } from '@zimic/utils/types';\n\nimport { FetchRequest, FetchRequestObject, FetchResponse, FetchResponseObject } from '../types/requests';\n\n/** @see {@link https://zimic.dev/docs/fetch/api/fetch-response-error#errortoobject `fetchResponseError.toObject()` API reference} */\nexport interface FetchResponseErrorObjectOptions {\n /** @see {@link https://zimic.dev/docs/fetch/api/fetch-response-error#errortoobject `fetchResponseError.toObject()` API reference} */\n includeRequestBody?: boolean;\n /** @see {@link https://zimic.dev/docs/fetch/api/fetch-response-error#errortoobject `fetchResponseError.toObject()` API reference} */\n includeResponseBody?: boolean;\n}\n\nexport namespace FetchResponseErrorObjectOptions {\n /**\n * Options for converting a {@link FetchResponseError `FetchResponseError`} into a plain object, including the body of\n * the request and/or response.\n */\n export type WithBody = FetchResponseErrorObjectOptions &\n ({ includeRequestBody: true } | { includeResponseBody: true });\n\n /**\n * Options for converting a {@link FetchResponseError `FetchResponseError`} into a plain object, excluding the body of\n * the request and/or response.\n */\n export type WithoutBody = FetchResponseErrorObjectOptions &\n ({ includeRequestBody?: false } | { includeResponseBody?: false });\n}\n\n/**\n * A plain object representation of a {@link FetchResponseError `FetchResponseError`}, compatible with JSON. It is useful\n * for serialization, debugging, and logging purposes.\n *\n * @see {@link https://zimic.dev/docs/fetch/api/fetch-response-error#errortoobject `fetchResponseError.toObject()` API reference}\n */\nexport interface FetchResponseErrorObject {\n name: string;\n message: string;\n request: FetchRequestObject;\n response: FetchResponseObject;\n}\n\n/** @see {@link https://zimic.dev/docs/fetch/api/fetch-response-error `FetchResponseError` API reference} */\nclass FetchResponseError<\n Schema extends HttpSchema,\n Method extends HttpSchemaMethod<Schema>,\n Path extends HttpSchemaPath.Literal<Schema, Method>,\n> extends Error {\n constructor(\n public request: FetchRequest<Schema, Method, Path>,\n public response: FetchResponse<Schema, Method, Path, true, 'manual'>,\n ) {\n super(`${request.method} ${request.url} failed with status ${response.status}: ${response.statusText}`);\n this.name = 'FetchResponseError';\n }\n\n /** @see {@link https://zimic.dev/docs/fetch/api/fetch-response-error#errortoobject `fetchResponseError.toObject()` API reference} */\n toObject(options: FetchResponseErrorObjectOptions.WithBody): Promise<FetchResponseErrorObject>;\n toObject(options?: FetchResponseErrorObjectOptions.WithoutBody): FetchResponseErrorObject;\n toObject(options?: FetchResponseErrorObjectOptions): PossiblePromise<FetchResponseErrorObject>;\n toObject({\n includeRequestBody = false,\n includeResponseBody = false,\n }: FetchResponseErrorObjectOptions = {}): PossiblePromise<FetchResponseErrorObject> {\n const partialObject = {\n name: this.name,\n message: this.message,\n } satisfies Partial<FetchResponseErrorObject>;\n\n if (!includeRequestBody && !includeResponseBody) {\n return {\n ...partialObject,\n request: this.requestToObject({ includeBody: false }),\n response: this.responseToObject({ includeBody: false }),\n };\n }\n\n return Promise.all([\n Promise.resolve(this.requestToObject({ includeBody: includeRequestBody })),\n Promise.resolve(this.responseToObject({ includeBody: includeResponseBody })),\n ]).then(([request, response]) => ({ ...partialObject, request, response }));\n }\n\n private requestToObject(options: { includeBody: true }): Promise<FetchRequestObject>;\n private requestToObject(options: { includeBody: false }): FetchRequestObject;\n private requestToObject(options: { includeBody: boolean }): PossiblePromise<FetchRequestObject>;\n private requestToObject(options: { includeBody: boolean }): PossiblePromise<FetchRequestObject> {\n const request = this.request;\n\n const requestObject: FetchRequestObject = {\n url: request.url,\n path: request.path,\n method: request.method,\n headers: this.convertHeadersToObject(request),\n cache: request.cache,\n destination: request.destination,\n credentials: request.credentials,\n integrity: request.integrity,\n keepalive: request.keepalive,\n mode: request.mode,\n redirect: request.redirect,\n referrer: request.referrer,\n referrerPolicy: request.referrerPolicy,\n };\n\n if (!options.includeBody) {\n return requestObject;\n }\n\n return this.withIncludedBodyIfAvailable('request', requestObject);\n }\n\n private responseToObject(options: { includeBody: true }): Promise<FetchResponseObject>;\n private responseToObject(options: { includeBody: false }): FetchResponseObject;\n private responseToObject(options: { includeBody: boolean }): PossiblePromise<FetchResponseObject>;\n private responseToObject(options: { includeBody: boolean }): PossiblePromise<FetchResponseObject> {\n const response = this.response;\n\n const responseObject: FetchResponseObject = {\n url: response.url,\n type: response.type,\n status: response.status,\n statusText: response.statusText,\n ok: response.ok,\n headers: this.convertHeadersToObject(response),\n redirected: response.redirected,\n };\n\n if (!options.includeBody) {\n return responseObject;\n }\n\n return this.withIncludedBodyIfAvailable('response', responseObject);\n }\n\n private convertHeadersToObject(\n resource: FetchRequest<Schema, Method, Path> | FetchResponse<Schema, Method, Path, true, 'manual'>,\n ): HttpHeadersSchema {\n return HttpHeaders.prototype.toObject.call(resource.headers) as HttpHeadersSchema;\n }\n\n private withIncludedBodyIfAvailable(\n resourceType: 'request',\n resourceObject: FetchRequestObject,\n ): PossiblePromise<FetchRequestObject>;\n private withIncludedBodyIfAvailable(\n resourceType: 'response',\n resourceObject: FetchResponseObject,\n ): PossiblePromise<FetchResponseObject>;\n private withIncludedBodyIfAvailable(\n resourceType: 'request' | 'response',\n resourceObject: FetchRequestObject | FetchResponseObject,\n ): PossiblePromise<FetchRequestObject | FetchResponseObject> {\n const resource = this[resourceType] as Request | Response;\n\n if (resource.bodyUsed) {\n console.warn(\n '[@zimic/fetch]',\n `Could not include the ${resourceType} body because it is already used. ` +\n 'If you access the body before calling `error.toObject()`, consider reading it from a cloned ' +\n `${resourceType}.\\n\\nLearn more: https://zimic.dev/docs/fetch/api/fetch-response-error#errortoobject`,\n );\n return resourceObject;\n }\n\n return parseHttpBody(resource)\n .then((body) => {\n resourceObject.body = body;\n return resourceObject;\n })\n .catch((error: unknown) => {\n console.error('[@zimic/fetch]', `Failed to parse ${resourceType} body:`, error);\n return resourceObject;\n });\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyFetchRequestError = FetchResponseError<any, any, any>;\n\nexport default FetchResponseError;\n","export function createPathCharactersToEscapeRegex() {\n return /([.(){}+$])/g;\n}\n\nexport function preparePathForRegex(path: string) {\n // We encode the path using the URL API because, differently from encodeURI and encodeURIComponent, URL does not\n // re-encode already encoded characters. Since URL requires a full URL, we use a data scheme and strip it later.\n const pathURLPrefix = `data:${path.startsWith('/') ? '' : '/'}`;\n const pathAsURL = new URL(`${pathURLPrefix}${path}`);\n const encodedPath = pathAsURL.href.replace(pathURLPrefix, '');\n\n return encodedPath.replace(/^\\/+/g, '').replace(/\\/+$/g, '').replace(createPathCharactersToEscapeRegex(), '\\\\$1');\n}\n\n// Path params names must match the JavaScript identifier pattern.\n// See // https://developer.mozilla.org/docs/Web/JavaScript/Reference/Lexical_grammar#identifiers.\nexport function createPathParamRegex() {\n return /(?<escape>\\\\)?:(?<identifier>[$_\\p{ID_Start}][$\\p{ID_Continue}]+)(?!\\\\[*+?])/gu;\n}\n\nexport function createRepeatingPathParamRegex() {\n return /(?<escape>\\\\)?:(?<identifier>[$_\\p{ID_Start}][$\\p{ID_Continue}]+)\\\\\\+/gu;\n}\n\nexport function createOptionalPathParamRegex() {\n return /(?<leadingSlash>\\/)?(?<escape>\\\\)?:(?<identifier>[$_\\p{ID_Start}][$\\p{ID_Continue}]+)\\?(?<trailingSlash>\\/)?/gu;\n}\n\nexport function createOptionalRepeatingPathParamRegex() {\n return /(?<leadingSlash>\\/)?(?<escape>\\\\)?:(?<identifier>[$_\\p{ID_Start}][$\\p{ID_Continue}]+)\\*(?<trailingSlash>\\/)?/gu;\n}\n\nfunction createRegexFromPath(path: string) {\n const pathRegexContent = preparePathForRegex(path)\n .replace(\n createOptionalRepeatingPathParamRegex(),\n (\n _match,\n leadingSlash: string | undefined,\n escape: string | undefined,\n identifier: string,\n trailingSlash: string | undefined,\n ) => {\n if (escape) {\n return `${leadingSlash ?? ''}:${identifier}\\\\*${trailingSlash ?? ''}`;\n }\n\n const hasSegmentBeforePrefix = leadingSlash === '/';\n const prefixExpression = hasSegmentBeforePrefix ? '/?' : leadingSlash;\n\n const hasSegmentAfterSuffix = trailingSlash === '/';\n const suffixExpression = hasSegmentAfterSuffix ? '/?' : trailingSlash;\n\n if (prefixExpression && suffixExpression) {\n return `(?:${prefixExpression}(?<${identifier}>.+?)?${suffixExpression})?`;\n } else if (prefixExpression) {\n return `(?:${prefixExpression}(?<${identifier}>.+?))?`;\n } else if (suffixExpression) {\n return `(?:(?<${identifier}>.+?)${suffixExpression})?`;\n } else {\n return `(?<${identifier}>.+?)?`;\n }\n },\n )\n .replace(createRepeatingPathParamRegex(), (_match, escape: string | undefined, identifier: string) => {\n return escape ? `:${identifier}\\\\+` : `(?<${identifier}>.+)`;\n })\n .replace(\n createOptionalPathParamRegex(),\n (\n _match,\n leadingSlash: string | undefined,\n escape: string | undefined,\n identifier: string,\n trailingSlash: string | undefined,\n ) => {\n if (escape) {\n return `${leadingSlash ?? ''}:${identifier}\\\\?${trailingSlash ?? ''}`;\n }\n\n const hasSegmentBeforePrefix = leadingSlash === '/';\n const prefixExpression = hasSegmentBeforePrefix ? '/?' : leadingSlash;\n\n const hasSegmentAfterSuffix = trailingSlash === '/';\n const suffixExpression = hasSegmentAfterSuffix ? '/?' : trailingSlash;\n\n if (prefixExpression && suffixExpression) {\n return `(?:${prefixExpression}(?<${identifier}>[^\\\\/]+?)?${suffixExpression})`;\n } else if (prefixExpression) {\n return `(?:${prefixExpression}(?<${identifier}>[^\\\\/]+?))?`;\n } else if (suffixExpression) {\n return `(?:(?<${identifier}>[^\\\\/]+?)${suffixExpression})?`;\n } else {\n return `(?<${identifier}>[^\\\\/]+?)?`;\n }\n },\n )\n .replace(createPathParamRegex(), (_match, escape: string | undefined, identifier: string) => {\n return escape ? `:${identifier}` : `(?<${identifier}>[^\\\\/]+?)`;\n });\n\n return new RegExp(`^/?${pathRegexContent}/?$`);\n}\n\nexport default createRegexFromPath;\n","function excludeNonPathParams(url: URL) {\n url.hash = '';\n url.search = '';\n url.username = '';\n url.password = '';\n return url;\n}\n\nexport default excludeNonPathParams;\n","function joinURL(...parts: (URL | string)[]) {\n return parts\n .map((part, index) => {\n const isFirstPart = index === 0;\n const isLastPart = index === parts.length - 1;\n\n let partAsString = part.toString();\n\n if (!isFirstPart) {\n partAsString = partAsString.replace(/^\\//, '');\n }\n if (!isLastPart) {\n partAsString = partAsString.replace(/\\/$/, '');\n }\n\n return partAsString;\n })\n .filter((part) => part.length > 0)\n .join('/');\n}\n\nexport default joinURL;\n","import {\n HttpSchemaPath,\n HttpSchemaMethod,\n HttpSearchParams,\n LiteralHttpSchemaPathFromNonLiteral,\n HttpSchema,\n HttpHeaders,\n} from '@zimic/http';\nimport createRegexFromPath from '@zimic/utils/url/createRegexFromPath';\nimport excludeNonPathParams from '@zimic/utils/url/excludeNonPathParams';\nimport joinURL from '@zimic/utils/url/joinURL';\n\nimport FetchResponseError from './errors/FetchResponseError';\nimport { FetchInput, FetchOptions, Fetch, FetchDefaults } from './types/public';\nimport { FetchRequestConstructor, FetchRequestInit, FetchRequest, FetchResponse } from './types/requests';\n\nclass FetchClient<Schema extends HttpSchema> implements Omit<Fetch<Schema>, '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 = excludeNonPathParams(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 createRegexFromPath(path).test(request.path)\n );\n }\n\n isResponse<Path extends HttpSchemaPath.Literal<Schema, Method>, Method extends HttpSchemaMethod<Schema>>(\n response: unknown,\n method: Method,\n path: Path,\n ): response is FetchResponse<Schema, Method, Path> {\n return (\n response instanceof Response &&\n 'request' in response &&\n this.isRequest(response.request, method, path) &&\n 'error' in response &&\n (response.error === null || response.error instanceof FetchResponseError)\n );\n }\n\n isResponseError<Path extends HttpSchemaPath.Literal<Schema, Method>, Method extends HttpSchemaMethod<Schema>>(\n error: unknown,\n method: Method,\n path: Path,\n ): error is FetchResponseError<Schema, Method, Path> {\n return (\n error instanceof FetchResponseError &&\n this.isRequest(error.request, method, path) &&\n this.isResponse(error.response, method, path)\n );\n }\n}\n\nexport default FetchClient;\n","import { HttpSchema } from '@zimic/http';\n\nimport FetchClient from './FetchClient';\nimport { FetchOptions, Fetch } from './types/public';\n\n/** @see {@link https://zimic.dev/docs/fetch/api/create-fetch `createFetch` API reference} */\nfunction createFetch<Schema extends HttpSchema>(options: FetchOptions<Schema>): Fetch<Schema> {\n const { fetch } = new FetchClient<Schema>(options);\n return fetch;\n}\n\nexport default createFetch;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/client/errors/FetchResponseError.ts","../../zimic-utils/src/url/createRegexFromPath.ts","../../zimic-utils/src/url/excludeNonPathParams.ts","../../zimic-utils/src/url/joinURL.ts","../src/client/FetchClient.ts","../src/client/factory.ts"],"names":["Request","HttpHeaders"],"mappings":"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","file":"index.mjs","sourcesContent":["import {\n HttpHeaders,\n HttpHeadersSchema,\n HttpSchema,\n HttpSchemaMethod,\n HttpSchemaPath,\n parseHttpBody,\n} from '@zimic/http';\nimport { PossiblePromise } from '@zimic/utils/types';\n\nimport { FetchRequest, FetchRequestObject, FetchResponse, FetchResponseObject } from '../types/requests';\n\n/** @see {@link https://zimic.dev/docs/fetch/api/fetch-response-error#errortoobject `fetchResponseError.toObject()` API reference} */\nexport interface FetchResponseErrorObjectOptions {\n /** @see {@link https://zimic.dev/docs/fetch/api/fetch-response-error#errortoobject `fetchResponseError.toObject()` API reference} */\n includeRequestBody?: boolean;\n /** @see {@link https://zimic.dev/docs/fetch/api/fetch-response-error#errortoobject `fetchResponseError.toObject()` API reference} */\n includeResponseBody?: boolean;\n}\n\nexport namespace FetchResponseErrorObjectOptions {\n /**\n * Options for converting a {@link FetchResponseError `FetchResponseError`} into a plain object, including the body of\n * the request and/or response.\n */\n export type WithBody = FetchResponseErrorObjectOptions &\n ({ includeRequestBody: true } | { includeResponseBody: true });\n\n /**\n * Options for converting a {@link FetchResponseError `FetchResponseError`} into a plain object, excluding the body of\n * the request and/or response.\n */\n export type WithoutBody = FetchResponseErrorObjectOptions &\n ({ includeRequestBody?: false } | { includeResponseBody?: false });\n}\n\n/**\n * A plain object representation of a {@link FetchResponseError `FetchResponseError`}, compatible with JSON. It is useful\n * for serialization, debugging, and logging purposes.\n *\n * @see {@link https://zimic.dev/docs/fetch/api/fetch-response-error#errortoobject `fetchResponseError.toObject()` API reference}\n */\nexport interface FetchResponseErrorObject {\n name: string;\n message: string;\n request: FetchRequestObject;\n response: FetchResponseObject;\n}\n\n/** @see {@link https://zimic.dev/docs/fetch/api/fetch-response-error `FetchResponseError` API reference} */\nclass FetchResponseError<\n Schema extends HttpSchema,\n Method extends HttpSchemaMethod<Schema>,\n Path extends HttpSchemaPath.Literal<Schema, Method>,\n> extends Error {\n constructor(\n public request: FetchRequest<Schema, Method, Path>,\n public response: FetchResponse<Schema, Method, Path, true, 'manual'>,\n ) {\n super(`${request.method} ${request.url} failed with status ${response.status}: ${response.statusText}`);\n this.name = 'FetchResponseError';\n }\n\n /** @see {@link https://zimic.dev/docs/fetch/api/fetch-response-error#errortoobject `fetchResponseError.toObject()` API reference} */\n toObject(options: FetchResponseErrorObjectOptions.WithBody): Promise<FetchResponseErrorObject>;\n toObject(options?: FetchResponseErrorObjectOptions.WithoutBody): FetchResponseErrorObject;\n toObject(options?: FetchResponseErrorObjectOptions): PossiblePromise<FetchResponseErrorObject>;\n toObject({\n includeRequestBody = false,\n includeResponseBody = false,\n }: FetchResponseErrorObjectOptions = {}): PossiblePromise<FetchResponseErrorObject> {\n const partialObject = {\n name: this.name,\n message: this.message,\n } satisfies Partial<FetchResponseErrorObject>;\n\n if (!includeRequestBody && !includeResponseBody) {\n return {\n ...partialObject,\n request: this.requestToObject({ includeBody: false }),\n response: this.responseToObject({ includeBody: false }),\n };\n }\n\n return Promise.all([\n Promise.resolve(this.requestToObject({ includeBody: includeRequestBody })),\n Promise.resolve(this.responseToObject({ includeBody: includeResponseBody })),\n ]).then(([request, response]) => ({ ...partialObject, request, response }));\n }\n\n private requestToObject(options: { includeBody: true }): Promise<FetchRequestObject>;\n private requestToObject(options: { includeBody: false }): FetchRequestObject;\n private requestToObject(options: { includeBody: boolean }): PossiblePromise<FetchRequestObject>;\n private requestToObject(options: { includeBody: boolean }): PossiblePromise<FetchRequestObject> {\n const request = this.request;\n\n const requestObject: FetchRequestObject = {\n url: request.url,\n path: request.path,\n method: request.method,\n headers: this.convertHeadersToObject(request),\n cache: request.cache,\n destination: request.destination,\n credentials: request.credentials,\n integrity: request.integrity,\n keepalive: request.keepalive,\n mode: request.mode,\n redirect: request.redirect,\n referrer: request.referrer,\n referrerPolicy: request.referrerPolicy,\n };\n\n if (!options.includeBody) {\n return requestObject;\n }\n\n return this.withIncludedBodyIfAvailable('request', requestObject);\n }\n\n private responseToObject(options: { includeBody: true }): Promise<FetchResponseObject>;\n private responseToObject(options: { includeBody: false }): FetchResponseObject;\n private responseToObject(options: { includeBody: boolean }): PossiblePromise<FetchResponseObject>;\n private responseToObject(options: { includeBody: boolean }): PossiblePromise<FetchResponseObject> {\n const response = this.response;\n\n const responseObject: FetchResponseObject = {\n url: response.url,\n type: response.type,\n status: response.status,\n statusText: response.statusText,\n ok: response.ok,\n headers: this.convertHeadersToObject(response),\n redirected: response.redirected,\n };\n\n if (!options.includeBody) {\n return responseObject;\n }\n\n return this.withIncludedBodyIfAvailable('response', responseObject);\n }\n\n private convertHeadersToObject(\n resource: FetchRequest<Schema, Method, Path> | FetchResponse<Schema, Method, Path, true, 'manual'>,\n ): HttpHeadersSchema {\n return HttpHeaders.prototype.toObject.call(resource.headers) as HttpHeadersSchema;\n }\n\n private withIncludedBodyIfAvailable(\n resourceType: 'request',\n resourceObject: FetchRequestObject,\n ): PossiblePromise<FetchRequestObject>;\n private withIncludedBodyIfAvailable(\n resourceType: 'response',\n resourceObject: FetchResponseObject,\n ): PossiblePromise<FetchResponseObject>;\n private withIncludedBodyIfAvailable(\n resourceType: 'request' | 'response',\n resourceObject: FetchRequestObject | FetchResponseObject,\n ): PossiblePromise<FetchRequestObject | FetchResponseObject> {\n const resource = this[resourceType] as Request | Response;\n\n if (resource.bodyUsed) {\n console.warn(\n '[@zimic/fetch]',\n `Could not include the ${resourceType} body because it is already used. ` +\n 'If you access the body before calling `error.toObject()`, consider reading it from a cloned ' +\n `${resourceType}.\\n\\nLearn more: https://zimic.dev/docs/fetch/api/fetch-response-error#errortoobject`,\n );\n return resourceObject;\n }\n\n return parseHttpBody(resource)\n .then((body) => {\n resourceObject.body = body;\n return resourceObject;\n })\n .catch((error: unknown) => {\n console.error('[@zimic/fetch]', `Failed to parse ${resourceType} body:`, error);\n return resourceObject;\n });\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyFetchRequestError = FetchResponseError<any, any, any>;\n\nexport default FetchResponseError;\n","export function createPathCharactersToEscapeRegex() {\n return /([.(){}+$])/g;\n}\n\nexport function preparePathForRegex(path: string) {\n // We encode the path using the URL API because, differently from encodeURI and encodeURIComponent, URL does not\n // re-encode already encoded characters. Since URL requires a full URL, we use a data scheme and strip it later.\n const pathURLPrefix = `data:${path.startsWith('/') ? '' : '/'}`;\n const pathAsURL = new URL(`${pathURLPrefix}${path}`);\n const encodedPath = pathAsURL.href.replace(pathURLPrefix, '');\n\n return encodedPath.replace(/^\\/+/g, '').replace(/\\/+$/g, '').replace(createPathCharactersToEscapeRegex(), '\\\\$1');\n}\n\n// Path params names must match the JavaScript identifier pattern.\n// See // https://developer.mozilla.org/docs/Web/JavaScript/Reference/Lexical_grammar#identifiers.\nexport function createPathParamRegex() {\n return /(?<escape>\\\\)?:(?<identifier>[$_\\p{ID_Start}][$\\p{ID_Continue}]+)(?!\\\\[*+?])/gu;\n}\n\nexport function createRepeatingPathParamRegex() {\n return /(?<escape>\\\\)?:(?<identifier>[$_\\p{ID_Start}][$\\p{ID_Continue}]+)\\\\\\+/gu;\n}\n\nexport function createOptionalPathParamRegex() {\n return /(?<leadingSlash>\\/)?(?<escape>\\\\)?:(?<identifier>[$_\\p{ID_Start}][$\\p{ID_Continue}]+)\\?(?<trailingSlash>\\/)?/gu;\n}\n\nexport function createOptionalRepeatingPathParamRegex() {\n return /(?<leadingSlash>\\/)?(?<escape>\\\\)?:(?<identifier>[$_\\p{ID_Start}][$\\p{ID_Continue}]+)\\*(?<trailingSlash>\\/)?/gu;\n}\n\nfunction createRegexFromPath(path: string) {\n const pathRegexContent = preparePathForRegex(path)\n .replace(\n createOptionalRepeatingPathParamRegex(),\n (\n _match,\n leadingSlash: string | undefined,\n escape: string | undefined,\n identifier: string,\n trailingSlash: string | undefined,\n ) => {\n if (escape) {\n return `${leadingSlash ?? ''}:${identifier}\\\\*${trailingSlash ?? ''}`;\n }\n\n const hasSegmentBeforePrefix = leadingSlash === '/';\n const prefixExpression = hasSegmentBeforePrefix ? '/?' : leadingSlash;\n\n const hasSegmentAfterSuffix = trailingSlash === '/';\n const suffixExpression = hasSegmentAfterSuffix ? '/?' : trailingSlash;\n\n if (prefixExpression && suffixExpression) {\n return `(?:${prefixExpression}(?<${identifier}>.+?)?${suffixExpression})?`;\n } else if (prefixExpression) {\n return `(?:${prefixExpression}(?<${identifier}>.+?))?`;\n } else if (suffixExpression) {\n return `(?:(?<${identifier}>.+?)${suffixExpression})?`;\n } else {\n return `(?<${identifier}>.+?)?`;\n }\n },\n )\n .replace(createRepeatingPathParamRegex(), (_match, escape: string | undefined, identifier: string) => {\n return escape ? `:${identifier}\\\\+` : `(?<${identifier}>.+)`;\n })\n .replace(\n createOptionalPathParamRegex(),\n (\n _match,\n leadingSlash: string | undefined,\n escape: string | undefined,\n identifier: string,\n trailingSlash: string | undefined,\n ) => {\n if (escape) {\n return `${leadingSlash ?? ''}:${identifier}\\\\?${trailingSlash ?? ''}`;\n }\n\n const hasSegmentBeforePrefix = leadingSlash === '/';\n const prefixExpression = hasSegmentBeforePrefix ? '/?' : leadingSlash;\n\n const hasSegmentAfterSuffix = trailingSlash === '/';\n const suffixExpression = hasSegmentAfterSuffix ? '/?' : trailingSlash;\n\n if (prefixExpression && suffixExpression) {\n return `(?:${prefixExpression}(?<${identifier}>[^\\\\/]+?)?${suffixExpression})`;\n } else if (prefixExpression) {\n return `(?:${prefixExpression}(?<${identifier}>[^\\\\/]+?))?`;\n } else if (suffixExpression) {\n return `(?:(?<${identifier}>[^\\\\/]+?)${suffixExpression})?`;\n } else {\n return `(?<${identifier}>[^\\\\/]+?)?`;\n }\n },\n )\n .replace(createPathParamRegex(), (_match, escape: string | undefined, identifier: string) => {\n return escape ? `:${identifier}` : `(?<${identifier}>[^\\\\/]+?)`;\n });\n\n return new RegExp(`^/?${pathRegexContent}/?$`);\n}\n\nexport default createRegexFromPath;\n","function excludeNonPathParams(url: URL) {\n url.hash = '';\n url.search = '';\n url.username = '';\n url.password = '';\n return url;\n}\n\nexport default excludeNonPathParams;\n","function joinURL(...parts: (URL | string)[]) {\n return parts\n .map((part, index) => {\n const isFirstPart = index === 0;\n const isLastPart = index === parts.length - 1;\n\n let partAsString = part.toString();\n\n if (!isFirstPart) {\n partAsString = partAsString.replace(/^\\//, '');\n }\n if (!isLastPart) {\n partAsString = partAsString.replace(/\\/$/, '');\n }\n\n return partAsString;\n })\n .filter((part) => part.length > 0)\n .join('/');\n}\n\nexport default joinURL;\n","import {\n HttpSchemaPath,\n HttpSchemaMethod,\n HttpSearchParams,\n LiteralHttpSchemaPathFromNonLiteral,\n HttpSchema,\n HttpHeaders,\n} from '@zimic/http';\nimport createRegexFromPath from '@zimic/utils/url/createRegexFromPath';\nimport excludeNonPathParams from '@zimic/utils/url/excludeNonPathParams';\nimport joinURL from '@zimic/utils/url/joinURL';\n\nimport FetchResponseError from './errors/FetchResponseError';\nimport { FetchInput, FetchOptions, Fetch, FetchDefaults } from './types/public';\nimport { FetchRequestConstructor, FetchRequestInit, FetchRequest, FetchResponse } from './types/requests';\n\nclass FetchClient<Schema extends HttpSchema> implements Omit<Fetch<Schema>, 'loose' | 'Request' | keyof FetchDefaults> {\n fetch: Fetch<Schema>;\n\n constructor({ headers = {}, searchParams = {}, ...otherOptions }: FetchOptions<Schema>) {\n this.fetch = this.createFetchFunction();\n this.fetch.headers = headers;\n this.fetch.searchParams = searchParams;\n Object.assign(this.fetch, otherOptions);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.fetch.loose = this.fetch as Fetch<any> as Fetch.Loose;\n this.fetch.Request = this.createRequestClass(this.fetch);\n }\n\n get defaults(): FetchDefaults {\n return this.fetch;\n }\n\n private createFetchFunction() {\n const fetch = async <\n Method extends HttpSchemaMethod<Schema>,\n Path extends HttpSchemaPath.NonLiteral<Schema, Method>,\n >(\n input: FetchInput<Schema, Method, Path>,\n init: FetchRequestInit<Schema, Method, LiteralHttpSchemaPathFromNonLiteral<Schema, Method, Path>>,\n ) => {\n const request = await this.createFetchRequest<Method, Path>(input, init);\n const requestClone = request.clone();\n\n const rawResponse = await globalThis.fetch(\n // Optimize type checking by narrowing the type of request\n requestClone as Request,\n );\n const response = await this.createFetchResponse<\n Method,\n LiteralHttpSchemaPathFromNonLiteral<Schema, Method, Path>\n >(request, rawResponse);\n\n return response;\n };\n\n Object.setPrototypeOf(fetch, this);\n\n return fetch as Fetch<Schema>;\n }\n\n private async createFetchRequest<\n Method extends HttpSchemaMethod<Schema>,\n Path extends HttpSchemaPath.NonLiteral<Schema, Method>,\n >(\n input: FetchInput<Schema, Method, Path>,\n init: FetchRequestInit<Schema, Method, LiteralHttpSchemaPathFromNonLiteral<Schema, Method, Path>>,\n ) {\n let request = input instanceof Request ? input : new this.fetch.Request(input, init);\n\n if (this.fetch.onRequest) {\n const requestAfterInterceptor = await this.fetch.onRequest(\n // Optimize type checking by narrowing the type of request\n request as FetchRequest.Loose,\n );\n\n if (requestAfterInterceptor !== request) {\n const isFetchRequest = requestAfterInterceptor instanceof this.fetch.Request;\n\n request = isFetchRequest\n ? (requestAfterInterceptor as Request as typeof request)\n : new this.fetch.Request(requestAfterInterceptor as FetchInput<Schema, Method, Path>, init);\n }\n }\n\n return request;\n }\n\n private async createFetchResponse<\n Method extends HttpSchemaMethod<Schema>,\n Path extends HttpSchemaPath.Literal<Schema, Method>,\n >(fetchRequest: FetchRequest<Schema, Method, Path>, rawResponse: Response) {\n let response = this.defineFetchResponseProperties<Method, Path>(fetchRequest, rawResponse);\n\n if (this.fetch.onResponse) {\n const responseAfterInterceptor = await this.fetch.onResponse(\n // Optimize type checking by narrowing the type of response\n response as FetchResponse.Loose,\n );\n\n const isFetchResponse =\n responseAfterInterceptor instanceof Response &&\n 'request' in responseAfterInterceptor &&\n responseAfterInterceptor.request instanceof this.fetch.Request;\n\n response = isFetchResponse\n ? (responseAfterInterceptor as typeof response)\n : this.defineFetchResponseProperties<Method, Path>(fetchRequest, responseAfterInterceptor);\n }\n\n return response;\n }\n\n private defineFetchResponseProperties<\n Method extends HttpSchemaMethod<Schema>,\n Path extends HttpSchemaPath.Literal<Schema, Method>,\n >(fetchRequest: FetchRequest<Schema, Method, Path>, response: Response) {\n const fetchResponse = response as FetchResponse<Schema, Method, Path>;\n\n Object.defineProperty(fetchResponse, 'request', {\n value: fetchRequest,\n writable: false,\n enumerable: true,\n configurable: false,\n });\n\n let responseError: FetchResponse.Loose['error'] | undefined;\n\n Object.defineProperty(fetchResponse, 'error', {\n get() {\n if (responseError === undefined) {\n responseError = fetchResponse.ok\n ? null\n : new FetchResponseError(\n fetchRequest,\n fetchResponse as FetchResponse<Schema, Method, Path, true, 'manual'>,\n );\n }\n return responseError;\n },\n enumerable: true,\n configurable: false,\n });\n\n return fetchResponse;\n }\n\n private createRequestClass(fetch: Fetch<Schema>) {\n class Request<\n Method extends HttpSchemaMethod<Schema>,\n Path extends HttpSchemaPath.NonLiteral<Schema, Method>,\n > extends globalThis.Request {\n path: LiteralHttpSchemaPathFromNonLiteral<Schema, Method, Path>;\n\n constructor(input: FetchInput<Schema, Method, Path>, init?: FetchRequestInit.Loose) {\n let actualInput: URL | globalThis.Request;\n\n const actualInit = {\n baseURL: init?.baseURL ?? fetch.baseURL,\n method: init?.method ?? fetch.method,\n headers: new HttpHeaders(fetch.headers),\n searchParams: new HttpSearchParams(fetch.searchParams),\n body: init?.body ?? fetch.body,\n mode: init?.mode ?? fetch.mode,\n cache: init?.cache ?? fetch.cache,\n credentials: init?.credentials ?? fetch.credentials,\n integrity: init?.integrity ?? fetch.integrity,\n keepalive: init?.keepalive ?? fetch.keepalive,\n priority: init?.priority ?? fetch.priority,\n redirect: init?.redirect ?? fetch.redirect,\n referrer: init?.referrer ?? fetch.referrer,\n referrerPolicy: init?.referrerPolicy ?? fetch.referrerPolicy,\n signal: init?.signal ?? fetch.signal,\n window: init?.window === undefined ? fetch.window : init.window,\n duplex: init?.duplex ?? fetch.duplex,\n };\n\n if (init?.headers) {\n actualInit.headers.assign(new HttpHeaders(init.headers));\n }\n\n let url: URL;\n const baseURL = new URL(actualInit.baseURL);\n\n if (input instanceof globalThis.Request) {\n const request = input as globalThis.Request;\n\n actualInit.headers.assign(new HttpHeaders(request.headers));\n\n url = new URL(input.url);\n\n actualInput = request;\n } else {\n url = new URL(input instanceof URL ? input : joinURL(baseURL, input));\n\n actualInit.searchParams.assign(new HttpSearchParams(url.searchParams));\n\n if (init?.searchParams) {\n actualInit.searchParams.assign(new HttpSearchParams(init.searchParams));\n }\n\n url.search = actualInit.searchParams.toString();\n\n actualInput = url;\n }\n\n super(actualInput, actualInit);\n\n const baseURLWithoutTrailingSlash = baseURL.toString().replace(/\\/$/, '');\n\n this.path = excludeNonPathParams(url)\n .toString()\n .replace(baseURLWithoutTrailingSlash, '') as LiteralHttpSchemaPathFromNonLiteral<Schema, Method, Path>;\n }\n\n clone(): this {\n const rawClone = super.clone();\n return new Request(rawClone as FetchInput<Schema, Method, Path>) as this;\n }\n }\n\n return Request as FetchRequestConstructor<Schema>;\n }\n\n isRequest<Path extends HttpSchemaPath.Literal<Schema, Method>, Method extends HttpSchemaMethod<Schema>>(\n request: unknown,\n method: Method,\n path: Path,\n ): request is FetchRequest<Schema, Method, Path> {\n return (\n request instanceof Request &&\n request.method === method &&\n 'path' in request &&\n typeof request.path === 'string' &&\n createRegexFromPath(path).test(request.path)\n );\n }\n\n isResponse<Path extends HttpSchemaPath.Literal<Schema, Method>, Method extends HttpSchemaMethod<Schema>>(\n response: unknown,\n method: Method,\n path: Path,\n ): response is FetchResponse<Schema, Method, Path> {\n return (\n response instanceof Response &&\n 'request' in response &&\n this.isRequest(response.request, method, path) &&\n 'error' in response &&\n (response.error === null || response.error instanceof FetchResponseError)\n );\n }\n\n isResponseError<Path extends HttpSchemaPath.Literal<Schema, Method>, Method extends HttpSchemaMethod<Schema>>(\n error: unknown,\n method: Method,\n path: Path,\n ): error is FetchResponseError<Schema, Method, Path> {\n return (\n error instanceof FetchResponseError &&\n this.isRequest(error.request, method, path) &&\n this.isResponse(error.response, method, path)\n );\n }\n}\n\nexport default FetchClient;\n","import { HttpSchema } from '@zimic/http';\n\nimport FetchClient from './FetchClient';\nimport { FetchOptions, Fetch } from './types/public';\n\n/** @see {@link https://zimic.dev/docs/fetch/api/create-fetch `createFetch` API reference} */\nfunction createFetch<Schema extends HttpSchema>(options: FetchOptions<Schema>): Fetch<Schema> {\n const { fetch } = new FetchClient<Schema>(options);\n return fetch;\n}\n\nexport default createFetch;\n"]}
|
package/package.json
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"api",
|
|
14
14
|
"static"
|
|
15
15
|
],
|
|
16
|
-
"version": "1.2.0
|
|
16
|
+
"version": "1.2.0",
|
|
17
17
|
"homepage": "https://zimic.dev/docs/fetch",
|
|
18
18
|
"repository": {
|
|
19
19
|
"type": "git",
|
|
@@ -93,7 +93,7 @@
|
|
|
93
93
|
"vitest": "^3.2.4"
|
|
94
94
|
},
|
|
95
95
|
"peerDependencies": {
|
|
96
|
-
"@zimic/http": "^1.
|
|
96
|
+
"@zimic/http": "^1.3.0 || workspace:*",
|
|
97
97
|
"typescript": ">=5.0.0"
|
|
98
98
|
},
|
|
99
99
|
"peerDependenciesMeta": {
|
|
@@ -14,24 +14,22 @@ import FetchResponseError from './errors/FetchResponseError';
|
|
|
14
14
|
import { FetchInput, FetchOptions, Fetch, FetchDefaults } from './types/public';
|
|
15
15
|
import { FetchRequestConstructor, FetchRequestInit, FetchRequest, FetchResponse } from './types/requests';
|
|
16
16
|
|
|
17
|
-
class FetchClient<Schema extends HttpSchema> implements Omit<Fetch<Schema>, '
|
|
17
|
+
class FetchClient<Schema extends HttpSchema> implements Omit<Fetch<Schema>, 'loose' | 'Request' | keyof FetchDefaults> {
|
|
18
18
|
fetch: Fetch<Schema>;
|
|
19
19
|
|
|
20
|
-
constructor({
|
|
20
|
+
constructor({ headers = {}, searchParams = {}, ...otherOptions }: FetchOptions<Schema>) {
|
|
21
21
|
this.fetch = this.createFetchFunction();
|
|
22
|
-
|
|
23
|
-
this.fetch.
|
|
24
|
-
|
|
25
|
-
headers: defaults.headers ?? {},
|
|
26
|
-
searchParams: defaults.searchParams ?? {},
|
|
27
|
-
};
|
|
22
|
+
this.fetch.headers = headers;
|
|
23
|
+
this.fetch.searchParams = searchParams;
|
|
24
|
+
Object.assign(this.fetch, otherOptions);
|
|
28
25
|
|
|
29
26
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
30
27
|
this.fetch.loose = this.fetch as Fetch<any> as Fetch.Loose;
|
|
28
|
+
this.fetch.Request = this.createRequestClass(this.fetch);
|
|
29
|
+
}
|
|
31
30
|
|
|
32
|
-
|
|
33
|
-
this.fetch
|
|
34
|
-
this.fetch.onResponse = onResponse;
|
|
31
|
+
get defaults(): FetchDefaults {
|
|
32
|
+
return this.fetch;
|
|
35
33
|
}
|
|
36
34
|
|
|
37
35
|
private createFetchFunction() {
|
|
@@ -148,62 +146,67 @@ class FetchClient<Schema extends HttpSchema> implements Omit<Fetch<Schema>, 'def
|
|
|
148
146
|
return fetchResponse;
|
|
149
147
|
}
|
|
150
148
|
|
|
151
|
-
private createRequestClass(
|
|
149
|
+
private createRequestClass(fetch: Fetch<Schema>) {
|
|
152
150
|
class Request<
|
|
153
151
|
Method extends HttpSchemaMethod<Schema>,
|
|
154
152
|
Path extends HttpSchemaPath.NonLiteral<Schema, Method>,
|
|
155
153
|
> extends globalThis.Request {
|
|
156
154
|
path: LiteralHttpSchemaPathFromNonLiteral<Schema, Method, Path>;
|
|
157
155
|
|
|
158
|
-
constructor(
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
156
|
+
constructor(input: FetchInput<Schema, Method, Path>, init?: FetchRequestInit.Loose) {
|
|
157
|
+
let actualInput: URL | globalThis.Request;
|
|
158
|
+
|
|
159
|
+
const actualInit = {
|
|
160
|
+
baseURL: init?.baseURL ?? fetch.baseURL,
|
|
161
|
+
method: init?.method ?? fetch.method,
|
|
162
|
+
headers: new HttpHeaders(fetch.headers),
|
|
163
|
+
searchParams: new HttpSearchParams(fetch.searchParams),
|
|
164
|
+
body: init?.body ?? fetch.body,
|
|
165
|
+
mode: init?.mode ?? fetch.mode,
|
|
166
|
+
cache: init?.cache ?? fetch.cache,
|
|
167
|
+
credentials: init?.credentials ?? fetch.credentials,
|
|
168
|
+
integrity: init?.integrity ?? fetch.integrity,
|
|
169
|
+
keepalive: init?.keepalive ?? fetch.keepalive,
|
|
170
|
+
priority: init?.priority ?? fetch.priority,
|
|
171
|
+
redirect: init?.redirect ?? fetch.redirect,
|
|
172
|
+
referrer: init?.referrer ?? fetch.referrer,
|
|
173
|
+
referrerPolicy: init?.referrerPolicy ?? fetch.referrerPolicy,
|
|
174
|
+
signal: init?.signal ?? fetch.signal,
|
|
175
|
+
window: init?.window === undefined ? fetch.window : init.window,
|
|
176
|
+
duplex: init?.duplex ?? fetch.duplex,
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
if (init?.headers) {
|
|
180
|
+
actualInit.headers.assign(new HttpHeaders(init.headers));
|
|
181
|
+
}
|
|
166
182
|
|
|
167
183
|
let url: URL;
|
|
168
|
-
const baseURL = new URL(
|
|
184
|
+
const baseURL = new URL(actualInit.baseURL);
|
|
169
185
|
|
|
170
186
|
if (input instanceof globalThis.Request) {
|
|
171
|
-
// Optimize type checking by narrowing the type of input
|
|
172
187
|
const request = input as globalThis.Request;
|
|
173
188
|
|
|
174
|
-
|
|
175
|
-
const headersFromRequest = new HttpHeaders(input.headers as Headers);
|
|
176
|
-
|
|
177
|
-
initWithDefaults.headers = {
|
|
178
|
-
...headersFromDefaults.toObject(),
|
|
179
|
-
...headersFromRequest.toObject(),
|
|
180
|
-
...headersFromInit.toObject(),
|
|
181
|
-
};
|
|
182
|
-
|
|
183
|
-
super(request, initWithDefaults);
|
|
189
|
+
actualInit.headers.assign(new HttpHeaders(request.headers));
|
|
184
190
|
|
|
185
191
|
url = new URL(input.url);
|
|
186
|
-
} else {
|
|
187
|
-
initWithDefaults.headers = {
|
|
188
|
-
...headersFromDefaults.toObject(),
|
|
189
|
-
...headersFromInit.toObject(),
|
|
190
|
-
};
|
|
191
192
|
|
|
192
|
-
|
|
193
|
+
actualInput = request;
|
|
194
|
+
} else {
|
|
195
|
+
url = new URL(input instanceof URL ? input : joinURL(baseURL, input));
|
|
193
196
|
|
|
194
|
-
|
|
195
|
-
const searchParamsFromInit = new HttpSearchParams(initWithDefaults.searchParams);
|
|
197
|
+
actualInit.searchParams.assign(new HttpSearchParams(url.searchParams));
|
|
196
198
|
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
};
|
|
199
|
+
if (init?.searchParams) {
|
|
200
|
+
actualInit.searchParams.assign(new HttpSearchParams(init.searchParams));
|
|
201
|
+
}
|
|
201
202
|
|
|
202
|
-
url.search =
|
|
203
|
+
url.search = actualInit.searchParams.toString();
|
|
203
204
|
|
|
204
|
-
|
|
205
|
+
actualInput = url;
|
|
205
206
|
}
|
|
206
207
|
|
|
208
|
+
super(actualInput, actualInit);
|
|
209
|
+
|
|
207
210
|
const baseURLWithoutTrailingSlash = baseURL.toString().replace(/\/$/, '');
|
|
208
211
|
|
|
209
212
|
this.path = excludeNonPathParams(url)
|
|
@@ -211,17 +214,9 @@ class FetchClient<Schema extends HttpSchema> implements Omit<Fetch<Schema>, 'def
|
|
|
211
214
|
.replace(baseURLWithoutTrailingSlash, '') as LiteralHttpSchemaPathFromNonLiteral<Schema, Method, Path>;
|
|
212
215
|
}
|
|
213
216
|
|
|
214
|
-
clone():
|
|
217
|
+
clone(): this {
|
|
215
218
|
const rawClone = super.clone();
|
|
216
|
-
|
|
217
|
-
return new Request<Method, Path>(
|
|
218
|
-
rawClone as unknown as FetchInput<Schema, Method, Path>,
|
|
219
|
-
rawClone as unknown as FetchRequestInit<
|
|
220
|
-
Schema,
|
|
221
|
-
Method,
|
|
222
|
-
LiteralHttpSchemaPathFromNonLiteral<Schema, Method, Path>
|
|
223
|
-
>,
|
|
224
|
-
);
|
|
219
|
+
return new Request(rawClone as FetchInput<Schema, Method, Path>) as this;
|
|
225
220
|
}
|
|
226
221
|
}
|
|
227
222
|
|
|
@@ -12,7 +12,9 @@ export type FetchInput<
|
|
|
12
12
|
> = Path | URL | FetchRequest<Schema, Method, LiteralHttpSchemaPathFromNonLiteral<Schema, Method, Path>>;
|
|
13
13
|
|
|
14
14
|
/** @see {@link https://zimic.dev/docs/fetch/api/fetch `fetch` API reference} */
|
|
15
|
-
export interface Fetch<Schema extends HttpSchema>
|
|
15
|
+
export interface Fetch<Schema extends HttpSchema>
|
|
16
|
+
extends Pick<FetchOptions<Schema>, 'onRequest' | 'onResponse'>,
|
|
17
|
+
FetchDefaults {
|
|
16
18
|
<
|
|
17
19
|
Method extends HttpSchemaMethod<Schema>,
|
|
18
20
|
Path extends HttpSchemaPath.NonLiteral<Schema, Method>,
|
|
@@ -28,10 +30,16 @@ export interface Fetch<Schema extends HttpSchema> extends Pick<FetchOptions<Sche
|
|
|
28
30
|
Redirect extends RequestRedirect = 'follow',
|
|
29
31
|
>(
|
|
30
32
|
input: FetchRequest<Schema, Method, LiteralHttpSchemaPathFromNonLiteral<Schema, Method, Path>>,
|
|
31
|
-
init?:
|
|
33
|
+
init?: Omit<
|
|
34
|
+
FetchRequestInit<Schema, Method, LiteralHttpSchemaPathFromNonLiteral<Schema, Method, Path>, Redirect>,
|
|
35
|
+
'baseURL' | 'searchParams'
|
|
36
|
+
>,
|
|
32
37
|
): Promise<FetchResponse<Schema, Method, LiteralHttpSchemaPathFromNonLiteral<Schema, Method, Path>, false, Redirect>>;
|
|
33
38
|
|
|
34
|
-
/**
|
|
39
|
+
/**
|
|
40
|
+
* @deprecated Consider accessing the default options directly from the fetch instance.
|
|
41
|
+
* @see {@link https://zimic.dev/docs/fetch/api/fetch#fetch-defaults `fetch` defaults}
|
|
42
|
+
*/
|
|
35
43
|
defaults: FetchDefaults;
|
|
36
44
|
|
|
37
45
|
/** @see {@link https://zimic.dev/docs/fetch/api/fetch#fetchloose `fetch.loose`} */
|
|
@@ -80,9 +88,9 @@ export interface FetchOptions<Schema extends HttpSchema> extends Omit<FetchReque
|
|
|
80
88
|
}
|
|
81
89
|
|
|
82
90
|
/**
|
|
83
|
-
* The default options
|
|
91
|
+
* The default options to send with each request.
|
|
84
92
|
*
|
|
85
|
-
* @see {@link https://zimic.dev/docs/fetch/api/fetch
|
|
93
|
+
* @see {@link https://zimic.dev/docs/fetch/api/fetch `fetch` API reference}
|
|
86
94
|
*/
|
|
87
95
|
export type FetchDefaults = RequiredByKey<FetchRequestInit.Defaults, 'headers' | 'searchParams'>;
|
|
88
96
|
|
|
@@ -90,8 +90,6 @@ export namespace FetchRequestInit {
|
|
|
90
90
|
/** The default options for each request sent by a fetch instance. */
|
|
91
91
|
export interface Defaults extends Omit<RequestInit, 'headers'> {
|
|
92
92
|
baseURL: string;
|
|
93
|
-
/** The HTTP method of the request. */
|
|
94
|
-
method?: HttpMethod;
|
|
95
93
|
/** The headers of the request. */
|
|
96
94
|
headers?: HttpHeadersSchema.Loose;
|
|
97
95
|
/** The search parameters of the request. */
|