@zayne-labs/callapi 1.6.24 → 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -5
- package/dist/cjs/{error-DIHsfUiJ.d.cts → error-C7M77J6L.d.cts} +59 -4
- package/dist/cjs/index.cjs +161 -33
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.d.cts +2 -2
- package/dist/cjs/utils/index.cjs +1 -1
- package/dist/cjs/utils/index.cjs.map +1 -1
- package/dist/cjs/utils/index.d.cts +1 -1
- package/dist/esm/{chunk-UA7QPQFE.js → chunk-PAYXYIB5.js} +9 -4
- package/dist/esm/chunk-PAYXYIB5.js.map +1 -0
- package/dist/esm/{error-DIHsfUiJ.d.ts → error-C7M77J6L.d.ts} +59 -4
- package/dist/esm/index.d.ts +2 -2
- package/dist/esm/index.js +157 -34
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/utils/index.d.ts +1 -1
- package/dist/esm/utils/index.js +1 -1
- package/package.json +5 -5
- package/dist/esm/chunk-UA7QPQFE.js.map +0 -1
package/dist/esm/index.js
CHANGED
|
@@ -1,5 +1,107 @@
|
|
|
1
|
-
import { splitConfig, isFunction, splitBaseConfig, combineHooks, defaultExtraOptions, defaultRequestOptions, mergeAndResolveHeaders, isSerializable, executeHooks, HTTPError, resolveErrorResult, isHTTPErrorInstance, waitUntil, omitKeys, isPlainObject, isString, isArray, toQueryString, getFetchImpl } from './chunk-
|
|
2
|
-
export { HTTPError, getDefaultOptions } from './chunk-
|
|
1
|
+
import { splitConfig, isFunction, splitBaseConfig, combineHooks, defaultExtraOptions, defaultRequestOptions, mergeAndResolveHeaders, isSerializable, executeHooks, HTTPError, resolveErrorResult, isHTTPErrorInstance, waitUntil, omitKeys, isPlainObject, isString, isArray, toQueryString, getFetchImpl, isReadableStream, isObject } from './chunk-PAYXYIB5.js';
|
|
2
|
+
export { HTTPError, getDefaultOptions } from './chunk-PAYXYIB5.js';
|
|
3
|
+
|
|
4
|
+
// src/stream.ts
|
|
5
|
+
var createProgressEvent = (options) => {
|
|
6
|
+
const { chunk, totalBytes, transferredBytes } = options;
|
|
7
|
+
return {
|
|
8
|
+
chunk,
|
|
9
|
+
progress: Math.round(transferredBytes / totalBytes * 100) || 0,
|
|
10
|
+
totalBytes,
|
|
11
|
+
transferredBytes
|
|
12
|
+
};
|
|
13
|
+
};
|
|
14
|
+
var calculateTotalBytesFromBody = async (requestBody, existingTotalBytes) => {
|
|
15
|
+
let totalBytes = existingTotalBytes;
|
|
16
|
+
if (!requestBody) {
|
|
17
|
+
return totalBytes;
|
|
18
|
+
}
|
|
19
|
+
for await (const chunk of requestBody) {
|
|
20
|
+
totalBytes += chunk.byteLength;
|
|
21
|
+
}
|
|
22
|
+
return totalBytes;
|
|
23
|
+
};
|
|
24
|
+
var toStreamableRequest = async (context) => {
|
|
25
|
+
const { options, request, requestInstance } = context;
|
|
26
|
+
if (!options.onRequestStream || !requestInstance.body) return;
|
|
27
|
+
const contentLength = requestInstance.headers.get("content-length") ?? new Headers(request.headers).get("content-length") ?? request.body?.size;
|
|
28
|
+
let totalBytes = Number(contentLength ?? 0);
|
|
29
|
+
const shouldForceContentLengthCalc = isObject(options.forceStreamSizeCalc) ? options.forceStreamSizeCalc.request : options.forceStreamSizeCalc;
|
|
30
|
+
if (!contentLength && shouldForceContentLengthCalc) {
|
|
31
|
+
totalBytes = await calculateTotalBytesFromBody(requestInstance.clone().body, totalBytes);
|
|
32
|
+
}
|
|
33
|
+
let transferredBytes = 0;
|
|
34
|
+
await executeHooks(
|
|
35
|
+
options.onRequestStream({
|
|
36
|
+
event: createProgressEvent({ chunk: new Uint8Array(), totalBytes, transferredBytes }),
|
|
37
|
+
options,
|
|
38
|
+
request,
|
|
39
|
+
requestInstance
|
|
40
|
+
})
|
|
41
|
+
);
|
|
42
|
+
const body = requestInstance.body;
|
|
43
|
+
void new ReadableStream({
|
|
44
|
+
start: async (controller) => {
|
|
45
|
+
if (!body) return;
|
|
46
|
+
for await (const chunk of body) {
|
|
47
|
+
transferredBytes += chunk.byteLength;
|
|
48
|
+
totalBytes = Math.max(totalBytes, transferredBytes);
|
|
49
|
+
await executeHooks(
|
|
50
|
+
options.onRequestStream?.({
|
|
51
|
+
event: createProgressEvent({ chunk, totalBytes, transferredBytes }),
|
|
52
|
+
options,
|
|
53
|
+
request,
|
|
54
|
+
requestInstance
|
|
55
|
+
})
|
|
56
|
+
);
|
|
57
|
+
controller.enqueue(chunk);
|
|
58
|
+
}
|
|
59
|
+
controller.close();
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
};
|
|
63
|
+
var toStreamableResponse = async (context) => {
|
|
64
|
+
const { options, request, response } = context;
|
|
65
|
+
if (!options.onResponseStream || !response.body) {
|
|
66
|
+
return response;
|
|
67
|
+
}
|
|
68
|
+
const contentLength = response.headers.get("content-length");
|
|
69
|
+
let totalBytes = Number(contentLength ?? 0);
|
|
70
|
+
const shouldForceContentLengthCalc = isObject(options.forceStreamSizeCalc) ? options.forceStreamSizeCalc.response : options.forceStreamSizeCalc;
|
|
71
|
+
if (!contentLength && shouldForceContentLengthCalc) {
|
|
72
|
+
totalBytes = await calculateTotalBytesFromBody(response.clone().body, totalBytes);
|
|
73
|
+
}
|
|
74
|
+
let transferredBytes = 0;
|
|
75
|
+
await executeHooks(
|
|
76
|
+
options.onResponseStream({
|
|
77
|
+
event: createProgressEvent({ chunk: new Uint8Array(), totalBytes, transferredBytes }),
|
|
78
|
+
options,
|
|
79
|
+
request,
|
|
80
|
+
response
|
|
81
|
+
})
|
|
82
|
+
);
|
|
83
|
+
const body = response.body;
|
|
84
|
+
const stream = new ReadableStream({
|
|
85
|
+
start: async (controller) => {
|
|
86
|
+
if (!body) return;
|
|
87
|
+
for await (const chunk of body) {
|
|
88
|
+
transferredBytes += chunk.byteLength;
|
|
89
|
+
totalBytes = Math.max(totalBytes, transferredBytes);
|
|
90
|
+
await executeHooks(
|
|
91
|
+
options.onResponseStream?.({
|
|
92
|
+
event: createProgressEvent({ chunk, totalBytes, transferredBytes }),
|
|
93
|
+
options,
|
|
94
|
+
request,
|
|
95
|
+
response
|
|
96
|
+
})
|
|
97
|
+
);
|
|
98
|
+
controller.enqueue(chunk);
|
|
99
|
+
}
|
|
100
|
+
controller.close();
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
return new Response(stream, response);
|
|
104
|
+
};
|
|
3
105
|
|
|
4
106
|
// src/dedupe.ts
|
|
5
107
|
var createDedupeStrategy = async (context) => {
|
|
@@ -25,12 +127,29 @@ var createDedupeStrategy = async (context) => {
|
|
|
25
127
|
prevRequestInfo.controller.abort(reason);
|
|
26
128
|
return Promise.resolve();
|
|
27
129
|
};
|
|
28
|
-
const handleRequestDeferStrategy = () => {
|
|
130
|
+
const handleRequestDeferStrategy = async () => {
|
|
29
131
|
const fetchApi = getFetchImpl(options.customFetchImpl);
|
|
30
132
|
const shouldUsePromiseFromCache = prevRequestInfo && options.dedupeStrategy === "defer";
|
|
31
|
-
const
|
|
133
|
+
const requestInstance = new Request(
|
|
134
|
+
options.fullURL,
|
|
135
|
+
isReadableStream(request.body) && !request.duplex ? { ...request, duplex: "half" } : request
|
|
136
|
+
);
|
|
137
|
+
void toStreamableRequest({
|
|
138
|
+
options,
|
|
139
|
+
request,
|
|
140
|
+
requestInstance: requestInstance.clone()
|
|
141
|
+
});
|
|
142
|
+
const responsePromise = shouldUsePromiseFromCache ? prevRequestInfo.responsePromise : (
|
|
143
|
+
// eslint-disable-next-line unicorn/no-nested-ternary -- Allow
|
|
144
|
+
isReadableStream(request.body) ? fetchApi(requestInstance.clone()) : fetchApi(options.fullURL, request)
|
|
145
|
+
);
|
|
32
146
|
$RequestInfoCacheOrNull?.set(dedupeKey, { controller: newFetchController, responsePromise });
|
|
33
|
-
|
|
147
|
+
const streamableResponse = toStreamableResponse({
|
|
148
|
+
options,
|
|
149
|
+
request,
|
|
150
|
+
response: await responsePromise
|
|
151
|
+
});
|
|
152
|
+
return streamableResponse;
|
|
34
153
|
};
|
|
35
154
|
const removeDedupeKeyFromCache = () => $RequestInfoCacheOrNull?.delete(dedupeKey);
|
|
36
155
|
return {
|
|
@@ -45,7 +164,8 @@ var definePlugin = (plugin) => {
|
|
|
45
164
|
return plugin;
|
|
46
165
|
};
|
|
47
166
|
var createMergedHook = (hooks, mergedHooksExecutionMode) => {
|
|
48
|
-
|
|
167
|
+
if (hooks.length === 0) return;
|
|
168
|
+
const mergedHook = async (ctx) => {
|
|
49
169
|
if (mergedHooksExecutionMode === "sequential") {
|
|
50
170
|
for (const hook of hooks) {
|
|
51
171
|
await hook?.(ctx);
|
|
@@ -57,13 +177,16 @@ var createMergedHook = (hooks, mergedHooksExecutionMode) => {
|
|
|
57
177
|
await Promise.all(hookArray.map((uniqueHook) => uniqueHook?.(ctx)));
|
|
58
178
|
}
|
|
59
179
|
};
|
|
180
|
+
return mergedHook;
|
|
60
181
|
};
|
|
61
182
|
var hooksEnum = {
|
|
62
183
|
onError: /* @__PURE__ */ new Set(),
|
|
63
184
|
onRequest: /* @__PURE__ */ new Set(),
|
|
64
185
|
onRequestError: /* @__PURE__ */ new Set(),
|
|
186
|
+
onRequestStream: /* @__PURE__ */ new Set(),
|
|
65
187
|
onResponse: /* @__PURE__ */ new Set(),
|
|
66
188
|
onResponseError: /* @__PURE__ */ new Set(),
|
|
189
|
+
onResponseStream: /* @__PURE__ */ new Set(),
|
|
67
190
|
onRetry: /* @__PURE__ */ new Set(),
|
|
68
191
|
onSuccess: /* @__PURE__ */ new Set()
|
|
69
192
|
};
|
|
@@ -128,7 +251,7 @@ var initializePlugins = async (context) => {
|
|
|
128
251
|
}
|
|
129
252
|
const resolvedHooks = {};
|
|
130
253
|
for (const [key, hookRegistry] of Object.entries(hookRegistries)) {
|
|
131
|
-
const flattenedHookArray = [...hookRegistry].flat();
|
|
254
|
+
const flattenedHookArray = [...hookRegistry].flat().filter(Boolean);
|
|
132
255
|
const mergedHook = createMergedHook(flattenedHookArray, options.mergedHooksExecutionMode);
|
|
133
256
|
resolvedHooks[key] = mergedHook;
|
|
134
257
|
}
|
|
@@ -190,45 +313,45 @@ var getExponentialDelay = (currentAttemptCount, options) => {
|
|
|
190
313
|
return Math.min(exponentialDelay, maxDelay);
|
|
191
314
|
};
|
|
192
315
|
var createRetryStrategy = (ctx) => {
|
|
193
|
-
const
|
|
316
|
+
const { options } = ctx;
|
|
317
|
+
const currentRetryCount = options["~retryCount"] ?? 0;
|
|
194
318
|
const getDelay = () => {
|
|
195
|
-
if (
|
|
196
|
-
return getExponentialDelay(currentRetryCount,
|
|
319
|
+
if (options.retryStrategy === "exponential") {
|
|
320
|
+
return getExponentialDelay(currentRetryCount, options);
|
|
197
321
|
}
|
|
198
|
-
return getLinearDelay(
|
|
322
|
+
return getLinearDelay(options);
|
|
199
323
|
};
|
|
200
324
|
const shouldAttemptRetry = async () => {
|
|
201
|
-
const customRetryCondition = await
|
|
202
|
-
const maxRetryAttempts =
|
|
325
|
+
const customRetryCondition = await options.retryCondition?.(ctx) ?? true;
|
|
326
|
+
const maxRetryAttempts = options.retryAttempts ?? 0;
|
|
203
327
|
const baseRetryCondition = maxRetryAttempts > currentRetryCount && customRetryCondition;
|
|
204
328
|
if (ctx.error.name !== "HTTPError") {
|
|
205
329
|
return baseRetryCondition;
|
|
206
330
|
}
|
|
207
331
|
const includesMethod = (
|
|
208
332
|
// eslint-disable-next-line no-implicit-coercion -- Boolean doesn't narrow
|
|
209
|
-
!!ctx.request.method &&
|
|
333
|
+
!!ctx.request.method && options.retryMethods?.includes(ctx.request.method)
|
|
210
334
|
);
|
|
211
335
|
const includesCodes = (
|
|
212
336
|
// eslint-disable-next-line no-implicit-coercion -- Boolean doesn't narrow
|
|
213
|
-
!!ctx.response?.status &&
|
|
337
|
+
!!ctx.response?.status && options.retryStatusCodes?.includes(ctx.response.status)
|
|
214
338
|
);
|
|
215
339
|
return includesCodes && includesMethod && baseRetryCondition;
|
|
216
340
|
};
|
|
217
341
|
const executeRetryHook = async (shouldThrowOnError) => {
|
|
218
342
|
try {
|
|
219
|
-
|
|
220
|
-
await executeHooks(ctx.options.onRetry(ctx));
|
|
343
|
+
return await executeHooks(options.onRetry?.(ctx));
|
|
221
344
|
} catch (error) {
|
|
222
|
-
const {
|
|
223
|
-
cloneResponse:
|
|
224
|
-
defaultErrorMessage:
|
|
345
|
+
const { apiDetails } = resolveErrorResult({
|
|
346
|
+
cloneResponse: options.cloneResponse,
|
|
347
|
+
defaultErrorMessage: options.defaultErrorMessage,
|
|
225
348
|
error,
|
|
226
|
-
resultMode:
|
|
349
|
+
resultMode: options.resultMode
|
|
227
350
|
});
|
|
228
351
|
if (shouldThrowOnError) {
|
|
229
352
|
throw error;
|
|
230
353
|
}
|
|
231
|
-
return
|
|
354
|
+
return apiDetails;
|
|
232
355
|
}
|
|
233
356
|
};
|
|
234
357
|
return {
|
|
@@ -369,7 +492,7 @@ var createFetchClient = (baseConfig = {}) => {
|
|
|
369
492
|
const { handleRequestCancelStrategy, handleRequestDeferStrategy, removeDedupeKeyFromCache } = await createDedupeStrategy({ $RequestInfoCache, newFetchController, options, request });
|
|
370
493
|
await handleRequestCancelStrategy();
|
|
371
494
|
try {
|
|
372
|
-
await executeHooks(options.onRequest({ options, request }));
|
|
495
|
+
await executeHooks(options.onRequest?.({ options, request }));
|
|
373
496
|
request.headers = mergeAndResolveHeaders({
|
|
374
497
|
auth: options.auth,
|
|
375
498
|
body: request.body,
|
|
@@ -405,11 +528,11 @@ var createFetchClient = (baseConfig = {}) => {
|
|
|
405
528
|
data: validSuccessData,
|
|
406
529
|
options,
|
|
407
530
|
request,
|
|
408
|
-
response
|
|
531
|
+
response
|
|
409
532
|
};
|
|
410
533
|
await executeHooks(
|
|
411
|
-
options.onSuccess(successContext),
|
|
412
|
-
options.onResponse({ ...successContext, error: null })
|
|
534
|
+
options.onSuccess?.(successContext),
|
|
535
|
+
options.onResponse?.({ ...successContext, error: null })
|
|
413
536
|
);
|
|
414
537
|
return await resolveSuccessResult({
|
|
415
538
|
data: successContext.data,
|
|
@@ -444,33 +567,33 @@ var createFetchClient = (baseConfig = {}) => {
|
|
|
444
567
|
return callApi2(initURL, updatedOptions);
|
|
445
568
|
}
|
|
446
569
|
if (shouldThrowOnError) {
|
|
447
|
-
throw
|
|
570
|
+
throw error;
|
|
448
571
|
}
|
|
449
572
|
return customInfo ? getErrorResult(customInfo) : getErrorResult();
|
|
450
573
|
};
|
|
451
574
|
if (isHTTPErrorInstance(error)) {
|
|
452
575
|
await executeHooks(
|
|
453
|
-
options.onResponseError(errorContext),
|
|
454
|
-
options.onError(errorContext),
|
|
455
|
-
options.onResponse({ ...errorContext, data: null })
|
|
576
|
+
options.onResponseError?.(errorContext),
|
|
577
|
+
options.onError?.(errorContext),
|
|
578
|
+
options.onResponse?.({ ...errorContext, data: null })
|
|
456
579
|
);
|
|
457
580
|
return await handleRetryOrGetResult();
|
|
458
581
|
}
|
|
459
582
|
if (error instanceof DOMException && error.name === "AbortError") {
|
|
460
583
|
const { message, name } = error;
|
|
461
|
-
console.error(`${name}:`, message);
|
|
584
|
+
!shouldThrowOnError && console.error(`${name}:`, message);
|
|
462
585
|
return await handleRetryOrGetResult();
|
|
463
586
|
}
|
|
464
587
|
if (error instanceof DOMException && error.name === "TimeoutError") {
|
|
465
588
|
const message = `Request timed out after ${options.timeout}ms`;
|
|
466
|
-
console.error(`${error.name}:`, message);
|
|
589
|
+
!shouldThrowOnError && console.error(`${error.name}:`, message);
|
|
467
590
|
return await handleRetryOrGetResult({ message });
|
|
468
591
|
}
|
|
469
592
|
await executeHooks(
|
|
470
593
|
// == At this point only the request errors exist, so the request error interceptor is called
|
|
471
|
-
options.onRequestError(errorContext),
|
|
594
|
+
options.onRequestError?.(errorContext),
|
|
472
595
|
// == Also call the onError interceptor
|
|
473
|
-
options.onError(errorContext)
|
|
596
|
+
options.onError?.(errorContext)
|
|
474
597
|
);
|
|
475
598
|
return await handleRetryOrGetResult();
|
|
476
599
|
} finally {
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/dedupe.ts","../../src/plugins.ts","../../src/response.ts","../../src/retry.ts","../../src/url.ts","../../src/utils/polyfills.ts","../../src/validation.ts","../../src/createFetchClient.ts","../../src/defineParameters.ts"],"names":["callApi"],"mappings":"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","file":"index.js","sourcesContent":["import type { CallApiExtraOptions, CallApiRequestOptions } from \"./types/common\";\nimport { getFetchImpl, waitUntil } from \"./utils/common\";\n\ntype RequestInfo = {\n\tcontroller: AbortController;\n\tresponsePromise: Promise<Response>;\n};\n\nexport type RequestInfoCache = Map<string | null, RequestInfo>;\n\ntype DedupeContext = {\n\t$RequestInfoCache: RequestInfoCache;\n\tnewFetchController: AbortController;\n\toptions: CallApiExtraOptions;\n\trequest: CallApiRequestOptions;\n};\n\nexport const createDedupeStrategy = async (context: DedupeContext) => {\n\tconst { $RequestInfoCache, newFetchController, options, request } = context;\n\n\tconst generateDedupeKey = () => {\n\t\tconst shouldHaveDedupeKey =\n\t\t\toptions.dedupeStrategy === \"cancel\" || options.dedupeStrategy === \"defer\";\n\n\t\tif (!shouldHaveDedupeKey) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn `${options.fullURL}-${JSON.stringify({ options, request })}`;\n\t};\n\n\tconst dedupeKey = options.dedupeKey ?? generateDedupeKey();\n\n\t// == This is to ensure cache operations only occur when key is available\n\tconst $RequestInfoCacheOrNull = dedupeKey !== null ? $RequestInfoCache : null;\n\n\t/******\n\t * == Add a small delay to the execution to ensure proper request deduplication when multiple requests with the same key start simultaneously.\n\t * == This gives time for the cache to be updated with the previous request info before the next request checks it.\n\t ******/\n\tif (dedupeKey !== null) {\n\t\tawait waitUntil(0.1);\n\t}\n\n\tconst prevRequestInfo = $RequestInfoCacheOrNull?.get(dedupeKey);\n\n\tconst handleRequestCancelStrategy = () => {\n\t\tconst shouldCancelRequest = prevRequestInfo && options.dedupeStrategy === \"cancel\";\n\n\t\tif (!shouldCancelRequest) return;\n\n\t\tconst message = options.dedupeKey\n\t\t\t? `Duplicate request detected - Aborting previous request with key '${options.dedupeKey}' as a new request was initiated`\n\t\t\t: `Duplicate request detected - Aborting previous request to '${options.fullURL}' as a new request with identical options was initiated`;\n\n\t\tconst reason = new DOMException(message, \"AbortError\");\n\n\t\tprevRequestInfo.controller.abort(reason);\n\n\t\t// == Adding this just so that eslint forces me put await when calling the function (it looks better that way tbh)\n\t\treturn Promise.resolve();\n\t};\n\n\tconst handleRequestDeferStrategy = () => {\n\t\tconst fetchApi = getFetchImpl(options.customFetchImpl);\n\n\t\tconst shouldUsePromiseFromCache = prevRequestInfo && options.dedupeStrategy === \"defer\";\n\n\t\tconst responsePromise = shouldUsePromiseFromCache\n\t\t\t? prevRequestInfo.responsePromise\n\t\t\t: fetchApi(options.fullURL as NonNullable<typeof options.fullURL>, request as RequestInit);\n\n\t\t$RequestInfoCacheOrNull?.set(dedupeKey, { controller: newFetchController, responsePromise });\n\n\t\treturn responsePromise;\n\t};\n\n\tconst removeDedupeKeyFromCache = () => $RequestInfoCacheOrNull?.delete(dedupeKey);\n\n\treturn {\n\t\thandleRequestCancelStrategy,\n\t\thandleRequestDeferStrategy,\n\t\tremoveDedupeKeyFromCache,\n\t};\n};\n","/* eslint-disable ts-eslint/consistent-type-definitions -- I need to use interfaces for the sake of user overrides */\nimport type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport type {\n\tBaseCallApiExtraOptions,\n\tCallApiExtraOptions,\n\tCallApiRequestOptions,\n\tCallApiRequestOptionsForHooks,\n\tCombinedCallApiExtraOptions,\n\tInterceptors,\n\tInterceptorsOrInterceptorArray,\n\tWithMoreOptions,\n} from \"./types/common\";\nimport type { DefaultMoreOptions } from \"./types/default-types\";\nimport type { InitURL } from \"./url\";\nimport { isPlainObject, isString } from \"./utils/type-guards\";\nimport type { AnyFunction, Awaitable } from \"./utils/type-helpers\";\nimport type { InferSchemaResult } from \"./validation\";\n\ntype UnionToIntersection<TUnion> = (TUnion extends unknown ? (param: TUnion) => void : never) extends (\n\tparam: infer TParam\n) => void\n\t? TParam\n\t: never;\n\ntype InferSchema<TResult> = TResult extends StandardSchemaV1\n\t? InferSchemaResult<TResult, NonNullable<unknown>>\n\t: TResult;\n\nexport type InferPluginOptions<TPluginArray extends CallApiPlugin[]> = UnionToIntersection<\n\tInferSchema<ReturnType<NonNullable<TPluginArray[number][\"createExtraOptions\"]>>>\n>;\n\nexport type PluginInitContext<TMoreOptions = DefaultMoreOptions> = WithMoreOptions<TMoreOptions> & {\n\tbaseConfig: BaseCallApiExtraOptions & CallApiRequestOptions;\n\tconfig: CallApiExtraOptions & CallApiRequestOptions;\n\tinitURL: InitURL | undefined;\n\toptions: CombinedCallApiExtraOptions;\n\trequest: CallApiRequestOptionsForHooks;\n};\n\nexport type PluginInitResult = Partial<\n\tOmit<PluginInitContext, \"request\"> & { request: CallApiRequestOptions }\n>;\n\nexport interface CallApiPlugin<TData = never, TErrorData = never> {\n\t/**\n\t * Defines additional options that can be passed to callApi\n\t */\n\tcreateExtraOptions?: (...params: never[]) => unknown;\n\n\t/**\n\t * A description for the plugin\n\t */\n\tdescription?: string;\n\n\t/**\n\t * Hooks / Interceptors for the plugin\n\t */\n\thooks?: InterceptorsOrInterceptorArray<TData, TErrorData>;\n\n\t/**\n\t * A unique id for the plugin\n\t */\n\tid: string;\n\n\t/**\n\t * A function that will be called when the plugin is initialized. This will be called before the any of the other internal functions.\n\t */\n\tinit?: (context: PluginInitContext) => Awaitable<PluginInitResult> | Awaitable<void>;\n\n\t/**\n\t * A name for the plugin\n\t */\n\tname: string;\n\n\t/**\n\t * A version for the plugin\n\t */\n\tversion?: string;\n}\n\nexport const definePlugin = <\n\t// eslint-disable-next-line perfectionist/sort-union-types -- Let the first one be first\n\tTPlugin extends CallApiPlugin | AnyFunction<CallApiPlugin>,\n>(\n\tplugin: TPlugin\n) => {\n\treturn plugin;\n};\n\nconst createMergedHook = (\n\thooks: Array<AnyFunction | undefined>,\n\tmergedHooksExecutionMode: CombinedCallApiExtraOptions[\"mergedHooksExecutionMode\"]\n) => {\n\treturn async (ctx: Record<string, unknown>) => {\n\t\tif (mergedHooksExecutionMode === \"sequential\") {\n\t\t\tfor (const hook of hooks) {\n\t\t\t\t// eslint-disable-next-line no-await-in-loop -- This is necessary in this case\n\t\t\t\tawait hook?.(ctx);\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (mergedHooksExecutionMode === \"parallel\") {\n\t\t\tconst hookArray = [...hooks];\n\n\t\t\tawait Promise.all(hookArray.map((uniqueHook) => uniqueHook?.(ctx)));\n\t\t}\n\t};\n};\n\n// prettier-ignore\ntype HookRegistries = {\n\t[Key in keyof Interceptors]: Set<Interceptors[Key]>;\n};\n\nexport const hooksEnum = {\n\tonError: new Set(),\n\tonRequest: new Set(),\n\tonRequestError: new Set(),\n\tonResponse: new Set(),\n\tonResponseError: new Set(),\n\tonRetry: new Set(),\n\tonSuccess: new Set(),\n} satisfies HookRegistries;\n\nexport type Plugins<TPluginArray extends CallApiPlugin[]> = TPluginArray;\n\nconst getPluginArray = (plugins: Plugins<CallApiPlugin[]> | undefined) => {\n\tif (!plugins) {\n\t\treturn [];\n\t}\n\n\treturn plugins;\n};\n\nexport const initializePlugins = async (\n\tcontext: Omit<PluginInitContext, \"request\"> & { request: CallApiRequestOptions }\n) => {\n\tconst { baseConfig, config, initURL, options, request } = context;\n\n\tconst hookRegistries = structuredClone(hooksEnum);\n\n\tconst addMainHooks = () => {\n\t\tfor (const key of Object.keys(hooksEnum)) {\n\t\t\tconst mainHook = options[key as keyof Interceptors] as never;\n\n\t\t\thookRegistries[key as keyof Interceptors].add(mainHook);\n\t\t}\n\t};\n\n\tconst addPluginHooks = (pluginHooks: Required<CallApiPlugin>[\"hooks\"]) => {\n\t\tfor (const key of Object.keys(hooksEnum)) {\n\t\t\tconst pluginHook = pluginHooks[key as keyof Interceptors] as never;\n\n\t\t\thookRegistries[key as keyof Interceptors].add(pluginHook);\n\t\t}\n\t};\n\n\tif (options.mergedHooksExecutionOrder === \"mainHooksBeforePlugins\") {\n\t\taddMainHooks();\n\t}\n\n\tconst resolvedPlugins = [\n\t\t...getPluginArray(options.plugins),\n\t\t...getPluginArray(options.extend?.plugins),\n\t];\n\n\tlet resolvedUrl = initURL;\n\tlet resolvedOptions = options;\n\tlet resolvedRequestOptions = request;\n\n\tconst executePluginInit = async (pluginInit: CallApiPlugin[\"init\"]) => {\n\t\tif (!pluginInit) return;\n\n\t\tconst initResult = await pluginInit({\n\t\t\tbaseConfig,\n\t\t\tconfig,\n\t\t\tinitURL,\n\t\t\toptions,\n\t\t\trequest: request as CallApiRequestOptionsForHooks,\n\t\t});\n\n\t\tif (!isPlainObject(initResult)) return;\n\n\t\tif (isString(initResult.initURL)) {\n\t\t\tresolvedUrl = initResult.initURL;\n\t\t}\n\n\t\tif (isPlainObject(initResult.request)) {\n\t\t\tresolvedRequestOptions = initResult.request as CallApiRequestOptionsForHooks;\n\t\t}\n\n\t\tif (isPlainObject(initResult.options)) {\n\t\t\tresolvedOptions = initResult.options;\n\t\t}\n\t};\n\n\tfor (const plugin of resolvedPlugins) {\n\t\t// eslint-disable-next-line no-await-in-loop -- Await is necessary in this case.\n\t\tawait executePluginInit(plugin.init);\n\n\t\tif (!plugin.hooks) continue;\n\n\t\taddPluginHooks(plugin.hooks);\n\t}\n\n\tif (\n\t\t!options.mergedHooksExecutionOrder\n\t\t|| options.mergedHooksExecutionOrder === \"mainHooksAfterPlugins\"\n\t) {\n\t\taddMainHooks();\n\t}\n\n\tconst resolvedHooks = {} as Required<Interceptors>;\n\n\tfor (const [key, hookRegistry] of Object.entries(hookRegistries)) {\n\t\tconst flattenedHookArray = [...hookRegistry].flat();\n\n\t\tconst mergedHook = createMergedHook(flattenedHookArray, options.mergedHooksExecutionMode);\n\n\t\tresolvedHooks[key as keyof Interceptors] = mergedHook;\n\t}\n\n\treturn {\n\t\tresolvedHooks,\n\t\tresolvedOptions,\n\t\tresolvedRequestOptions,\n\t\turl: resolvedUrl?.toString(),\n\t};\n};\n","import type { CallApiExtraOptions, CallApiResultSuccessVariant, ResultModeMap } from \"./types\";\nimport { omitKeys } from \"./utils/common\";\nimport type { Awaitable } from \"./utils/type-helpers\";\n\ntype Parser = (responseString: string) => Awaitable<Record<string, unknown>>;\n\nexport const getResponseType = <TResponse>(response: Response, parser?: Parser) => ({\n\tarrayBuffer: () => response.arrayBuffer(),\n\tblob: () => response.blob(),\n\tformData: () => response.formData(),\n\tjson: async () => {\n\t\tif (parser) {\n\t\t\tconst text = await response.text();\n\t\t\treturn parser(text) as TResponse;\n\t\t}\n\n\t\treturn response.json() as Promise<TResponse>;\n\t},\n\tstream: () => response.body,\n\ttext: () => response.text(),\n});\n\ntype InitResponseTypeMap<TResponse = unknown> = ReturnType<typeof getResponseType<TResponse>>;\n\nexport type ResponseTypeUnion = keyof InitResponseTypeMap | undefined;\n\nexport type ResponseTypeMap<TResponse> = {\n\t[Key in keyof InitResponseTypeMap<TResponse>]: Awaited<ReturnType<InitResponseTypeMap<TResponse>[Key]>>;\n};\n\nexport type GetResponseType<\n\tTResponse,\n\tTResponseType extends ResponseTypeUnion,\n\tTComputedMap extends ResponseTypeMap<TResponse> = ResponseTypeMap<TResponse>,\n> = undefined extends TResponseType\n\t? TComputedMap[\"json\"]\n\t: TResponseType extends NonNullable<ResponseTypeUnion>\n\t\t? TComputedMap[TResponseType]\n\t\t: never;\n\nexport const resolveResponseData = async <TResponse>(\n\tresponse: Response,\n\tresponseType: keyof ResponseTypeMap<TResponse>,\n\tparser: Parser | undefined\n) => {\n\tconst RESPONSE_TYPE_LOOKUP = getResponseType<TResponse>(response, parser);\n\n\tif (!Object.hasOwn(RESPONSE_TYPE_LOOKUP, responseType)) {\n\t\tthrow new Error(`Invalid response type: ${responseType}`);\n\t}\n\n\tconst responseData = await RESPONSE_TYPE_LOOKUP[responseType]();\n\n\treturn responseData;\n};\n\ntype SuccessInfo = {\n\tdata: unknown;\n\tresponse: Response;\n\tresultMode: CallApiExtraOptions[\"resultMode\"];\n};\n\n// == The CallApiResult type is used to cast all return statements due to a design limitation in ts.\n// LINK - See https://www.zhenghao.io/posts/type-functions for more info\nexport const resolveSuccessResult = <TCallApiResult>(info: SuccessInfo): TCallApiResult => {\n\tconst { data, response, resultMode } = info;\n\n\tconst apiDetails = { data, error: null, response } satisfies CallApiResultSuccessVariant<unknown>;\n\n\tif (!resultMode) {\n\t\treturn apiDetails as TCallApiResult;\n\t}\n\n\tconst resultModeMap = {\n\t\tall: apiDetails,\n\t\tallWithException: apiDetails,\n\t\tallWithoutResponse: omitKeys(apiDetails, [\"response\"]),\n\t\tonlyError: apiDetails.error,\n\t\tonlyResponse: apiDetails.response,\n\t\tonlyResponseWithException: apiDetails.response,\n\t\tonlySuccess: apiDetails.data,\n\t\tonlySuccessWithException: apiDetails.data,\n\t} satisfies ResultModeMap;\n\n\treturn resultModeMap[resultMode] as TCallApiResult;\n};\n","/* eslint-disable ts-eslint/consistent-type-definitions -- I need to use interfaces for the sake of user overrides */\nimport { resolveErrorResult } from \"./error\";\nimport type { Method } from \"./types\";\nimport type { ErrorContext } from \"./types/common\";\nimport { executeHooks } from \"./utils/common\";\nimport { isFunction } from \"./utils/type-guards\";\nimport type { AnyNumber, Awaitable } from \"./utils/type-helpers\";\n\ntype RetryCondition<TErrorData> = (context: ErrorContext<TErrorData>) => Awaitable<boolean>;\n\nexport interface RetryOptions<TErrorData> {\n\t/**\n\t * Keeps track of the number of times the request has already been retried\n\t * @deprecated This property is used internally to track retries. Please abstain from modifying it.\n\t */\n\treadonly [\"~retryCount\"]?: number;\n\n\t/**\n\t * Number of allowed retry attempts on HTTP errors\n\t * @default 0\n\t */\n\tretryAttempts?: number;\n\n\t/**\n\t * Callback whose return value determines if a request should be retried or not\n\t */\n\tretryCondition?: RetryCondition<TErrorData>;\n\n\t/**\n\t * Delay between retries in milliseconds\n\t * @default 1000\n\t */\n\tretryDelay?: number;\n\n\t/**\n\t * Maximum delay in milliseconds. Only applies to exponential strategy\n\t * @default 10000\n\t */\n\tretryMaxDelay?: number;\n\n\t/**\n\t * HTTP methods that are allowed to retry\n\t * @default [\"GET\", \"POST\"]\n\t */\n\tretryMethods?: Method[];\n\n\t/**\n\t * HTTP status codes that trigger a retry\n\t * @default [409, 425, 429, 500, 502, 503, 504]\n\t */\n\tretryStatusCodes?: Array<409 | 425 | 429 | 500 | 502 | 503 | 504 | AnyNumber>;\n\n\t/**\n\t * Strategy to use when retrying\n\t * @default \"linear\"\n\t */\n\tretryStrategy?: \"exponential\" | \"linear\";\n}\n\nconst getLinearDelay = <TErrorData>(options: RetryOptions<TErrorData>) => options.retryDelay ?? 1000;\n\nconst getExponentialDelay = <TErrorData>(\n\tcurrentAttemptCount: number,\n\toptions: RetryOptions<TErrorData>\n) => {\n\tconst maxDelay = options.retryMaxDelay ?? 10000;\n\n\tconst exponentialDelay = (options.retryDelay ?? 1000) * 2 ** currentAttemptCount;\n\n\treturn Math.min(exponentialDelay, maxDelay);\n};\n\nexport const createRetryStrategy = <TErrorData>(ctx: ErrorContext<TErrorData>) => {\n\tconst currentRetryCount = ctx.options[\"~retryCount\"] ?? 0;\n\n\tconst getDelay = () => {\n\t\tif (ctx.options.retryStrategy === \"exponential\") {\n\t\t\treturn getExponentialDelay(currentRetryCount, ctx.options);\n\t\t}\n\n\t\treturn getLinearDelay(ctx.options);\n\t};\n\n\tconst shouldAttemptRetry = async () => {\n\t\tconst customRetryCondition = (await ctx.options.retryCondition?.(ctx)) ?? true;\n\n\t\tconst maxRetryAttempts = ctx.options.retryAttempts ?? 0;\n\n\t\tconst baseRetryCondition = maxRetryAttempts > currentRetryCount && customRetryCondition;\n\n\t\tif (ctx.error.name !== \"HTTPError\") {\n\t\t\treturn baseRetryCondition;\n\t\t}\n\n\t\tconst includesMethod =\n\t\t\t// eslint-disable-next-line no-implicit-coercion -- Boolean doesn't narrow\n\t\t\t!!ctx.request.method && ctx.options.retryMethods?.includes(ctx.request.method);\n\n\t\tconst includesCodes =\n\t\t\t// eslint-disable-next-line no-implicit-coercion -- Boolean doesn't narrow\n\t\t\t!!ctx.response?.status && ctx.options.retryStatusCodes?.includes(ctx.response.status);\n\n\t\treturn includesCodes && includesMethod && baseRetryCondition;\n\t};\n\n\tconst executeRetryHook = async (shouldThrowOnError: boolean | undefined) => {\n\t\ttry {\n\t\t\tif (!isFunction(ctx.options.onRetry)) return;\n\n\t\t\tawait executeHooks(ctx.options.onRetry(ctx));\n\t\t} catch (error) {\n\t\t\tconst { getErrorResult } = resolveErrorResult({\n\t\t\t\tcloneResponse: ctx.options.cloneResponse,\n\t\t\t\tdefaultErrorMessage: ctx.options.defaultErrorMessage as string,\n\t\t\t\terror,\n\t\t\t\tresultMode: ctx.options.resultMode,\n\t\t\t});\n\n\t\t\tif (shouldThrowOnError) {\n\t\t\t\tthrow error;\n\t\t\t}\n\n\t\t\treturn getErrorResult();\n\t\t}\n\t};\n\n\treturn {\n\t\texecuteRetryHook,\n\t\tgetDelay,\n\t\tshouldAttemptRetry,\n\t};\n};\n","/* eslint-disable ts-eslint/consistent-type-definitions -- I need to use interfaces for the sake of user overrides */\n\nimport type { CallApiExtraOptions } from \"./types/common\";\nimport { toQueryString } from \"./utils\";\nimport { isArray } from \"./utils/type-guards\";\nimport type { UnmaskType } from \"./utils/type-helpers\";\nimport type { CallApiSchemas, InferSchemaResult } from \"./validation\";\n\nconst slash = \"/\";\nconst column = \":\";\nconst mergeUrlWithParams = (url: string, params: CallApiExtraOptions[\"params\"]) => {\n\tif (!params) {\n\t\treturn url;\n\t}\n\n\tlet newUrl = url;\n\n\tif (isArray(params)) {\n\t\tconst matchedParamArray = newUrl.split(slash).filter((param) => param.startsWith(column));\n\n\t\tfor (const [index, matchedParam] of matchedParamArray.entries()) {\n\t\t\tconst realParam = params[index] as string;\n\t\t\tnewUrl = newUrl.replace(matchedParam, realParam);\n\t\t}\n\n\t\treturn newUrl;\n\t}\n\n\tfor (const [key, value] of Object.entries(params)) {\n\t\tnewUrl = newUrl.replace(`${column}${key}`, String(value));\n\t}\n\n\treturn newUrl;\n};\n\nconst questionMark = \"?\";\nconst ampersand = \"&\";\nconst mergeUrlWithQuery = (url: string, query: CallApiExtraOptions[\"query\"]): string => {\n\tif (!query) {\n\t\treturn url;\n\t}\n\n\tconst queryString = toQueryString(query);\n\n\tif (queryString?.length === 0) {\n\t\treturn url;\n\t}\n\n\tif (url.endsWith(questionMark)) {\n\t\treturn `${url}${queryString}`;\n\t}\n\n\tif (url.includes(questionMark)) {\n\t\treturn `${url}${ampersand}${queryString}`;\n\t}\n\n\treturn `${url}${questionMark}${queryString}`;\n};\n\nexport const mergeUrlWithParamsAndQuery = (\n\turl: string | undefined,\n\tparams: CallApiExtraOptions[\"params\"],\n\tquery: CallApiExtraOptions[\"query\"]\n) => {\n\tif (!url) return;\n\n\tconst urlWithMergedParams = mergeUrlWithParams(url, params);\n\n\treturn mergeUrlWithQuery(urlWithMergedParams, query);\n};\n\nexport type Params = UnmaskType<\n\t// eslint-disable-next-line perfectionist/sort-union-types -- I need the Record to be first\n\tRecord<string, boolean | number | string> | Array<boolean | number | string>\n>;\n\nexport type Query = UnmaskType<Record<string, boolean | number | string>>;\n\nexport type InitURL = UnmaskType<string | URL>;\n\nexport interface UrlOptions<TSchemas extends CallApiSchemas> {\n\t/**\n\t * URL to be used in the request.\n\t */\n\treadonly initURL?: string;\n\n\t/**\n\t * Parameters to be appended to the URL (i.e: /:id)\n\t */\n\tparams?: InferSchemaResult<TSchemas[\"params\"], Params>;\n\n\t/**\n\t * Query parameters to append to the URL.\n\t */\n\tquery?: InferSchemaResult<TSchemas[\"query\"], Query>;\n}\n","// prettier-ignore\nexport const createCombinedSignal = (...signals: Array<AbortSignal | null | undefined>) => AbortSignal.any(signals.filter(Boolean));\n\nexport const createTimeoutSignal = (milliseconds: number) => AbortSignal.timeout(milliseconds);\n","/* eslint-disable ts-eslint/consistent-type-definitions -- I need to use interfaces for the sake of user overrides */\nimport type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport type { Body, GlobalMeta, Headers, Method } from \"./types\";\nimport type { CombinedCallApiExtraOptions } from \"./types/common\";\nimport type { InitURL, Params, Query } from \"./url\";\n\nexport const standardSchemaParser = async <TSchema extends StandardSchemaV1>(\n\tschema: TSchema,\n\tinputData: StandardSchemaV1.InferInput<TSchema>\n): Promise<StandardSchemaV1.InferOutput<TSchema>> => {\n\tconst result = await schema[\"~standard\"].validate(inputData);\n\n\t// == If the `issues` field exists, it means the validation failed\n\tif (result.issues) {\n\t\tthrow new Error(JSON.stringify(result.issues, null, 2), { cause: result.issues });\n\t}\n\n\treturn result.value;\n};\n\nexport interface CallApiSchemas {\n\t/**\n\t * The schema to use for validating the request body.\n\t */\n\tbody?: StandardSchemaV1<Body>;\n\n\t/**\n\t * The schema to use for validating the response data.\n\t */\n\tdata?: StandardSchemaV1;\n\n\t/**\n\t * The schema to use for validating the response error data.\n\t */\n\terrorData?: StandardSchemaV1;\n\n\t/**\n\t * The schema to use for validating the request headers.\n\t */\n\theaders?: StandardSchemaV1<Headers>;\n\n\t/**\n\t * The schema to use for validating the request url.\n\t */\n\tinitURL?: StandardSchemaV1<InitURL>;\n\n\t/**\n\t * The schema to use for validating the meta option.\n\t */\n\tmeta?: StandardSchemaV1<GlobalMeta>;\n\n\t/**\n\t * The schema to use for validating the request method.\n\t */\n\tmethod?: StandardSchemaV1<Method>;\n\n\t/**\n\t * The schema to use for validating the request url parameter.\n\t */\n\tparams?: StandardSchemaV1<Params>;\n\n\t/**\n\t * The schema to use for validating the request url querys.\n\t */\n\tquery?: StandardSchemaV1<Query>;\n}\n\nexport interface CallApiValidators<TData = unknown, TErrorData = unknown> {\n\t/**\n\t * Custom function to validate the response data.\n\t */\n\tdata?: (value: unknown) => TData;\n\n\t/**\n\t * Custom function to validate the response error data, stemming from the api.\n\t * This only runs if the api actually sends back error status codes, else it will be ignored, in which case you should only use the `responseValidator` option.\n\t */\n\terrorData?: (value: unknown) => TErrorData;\n}\n\nexport type InferSchemaResult<TSchema, TData> = TSchema extends StandardSchemaV1\n\t? StandardSchemaV1.InferOutput<TSchema>\n\t: TData;\n\nexport const createExtensibleSchemasAndValidators = (options: CombinedCallApiExtraOptions) => {\n\tconst schemas =\n\t\toptions.schemas && ({ ...options.schemas, ...options.extend?.schemas } as CallApiSchemas);\n\n\tconst validators = options.validators && { ...options.validators, ...options.extend?.validators };\n\n\treturn { schemas, validators };\n};\n\nexport const handleValidation = async (\n\tresponseData: unknown,\n\tschema: CallApiSchemas[keyof NonNullable<CallApiSchemas>],\n\tvalidator?: CallApiValidators[keyof NonNullable<CallApiValidators>]\n) => {\n\tconst validResponseData = validator ? validator(responseData) : responseData;\n\n\tconst schemaValidResponseData = schema\n\t\t? await standardSchemaParser(schema, validResponseData)\n\t\t: validResponseData;\n\n\treturn schemaValidResponseData;\n};\n","import { type RequestInfoCache, createDedupeStrategy } from \"./dedupe\";\nimport { HTTPError, resolveErrorResult } from \"./error\";\nimport { type CallApiPlugin, type PluginInitContext, hooksEnum, initializePlugins } from \"./plugins\";\nimport { type ResponseTypeUnion, resolveResponseData, resolveSuccessResult } from \"./response\";\nimport { createRetryStrategy } from \"./retry\";\nimport type {\n\tBaseCallApiConfig,\n\tCallApiParameters,\n\tCallApiRequestOptions,\n\tCallApiRequestOptionsForHooks,\n\tCallApiResult,\n\tCombinedCallApiExtraOptions,\n\tErrorContext,\n\tInterceptors,\n\tResultModeUnion,\n\tSuccessContext,\n} from \"./types/common\";\nimport type {\n\tDefaultDataType,\n\tDefaultMoreOptions,\n\tDefaultPluginArray,\n\tDefaultThrowOnError,\n} from \"./types/default-types\";\nimport { mergeUrlWithParamsAndQuery } from \"./url\";\nimport {\n\tcombineHooks,\n\texecuteHooks,\n\tmergeAndResolveHeaders,\n\tsplitBaseConfig,\n\tsplitConfig,\n\twaitUntil,\n} from \"./utils/common\";\nimport { defaultExtraOptions, defaultRequestOptions } from \"./utils/constants\";\nimport { createCombinedSignal, createTimeoutSignal } from \"./utils/polyfills\";\nimport { isFunction, isHTTPErrorInstance, isSerializable } from \"./utils/type-guards\";\nimport {\n\ttype CallApiSchemas,\n\ttype InferSchemaResult,\n\tcreateExtensibleSchemasAndValidators,\n\thandleValidation,\n} from \"./validation\";\n\nexport const createFetchClient = <\n\tTBaseData = DefaultDataType,\n\tTBaseErrorData = DefaultDataType,\n\tTBaseResultMode extends ResultModeUnion = ResultModeUnion,\n\tTBaseThrowOnError extends boolean = DefaultThrowOnError,\n\tTBaseResponseType extends ResponseTypeUnion = ResponseTypeUnion,\n\tTBasePluginArray extends CallApiPlugin[] = DefaultPluginArray,\n\tTBaseSchemas extends CallApiSchemas = DefaultMoreOptions,\n>(\n\tbaseConfig: BaseCallApiConfig<\n\t\tTBaseData,\n\t\tTBaseErrorData,\n\t\tTBaseResultMode,\n\t\tTBaseThrowOnError,\n\t\tTBaseResponseType,\n\t\tTBasePluginArray,\n\t\tTBaseSchemas\n\t> = {} as never\n) => {\n\tconst $RequestInfoCache: RequestInfoCache = new Map();\n\n\tconst callApi = async <\n\t\tTData = InferSchemaResult<TBaseSchemas[\"data\"], TBaseData>,\n\t\tTErrorData = InferSchemaResult<TBaseSchemas[\"errorData\"], TBaseErrorData>,\n\t\tTResultMode extends ResultModeUnion = TBaseResultMode,\n\t\tTThrowOnError extends boolean = TBaseThrowOnError,\n\t\tTResponseType extends ResponseTypeUnion = TBaseResponseType,\n\t\tTPluginArray extends CallApiPlugin[] = TBasePluginArray,\n\t\tTSchemas extends CallApiSchemas = TBaseSchemas,\n\t>(\n\t\t...parameters: CallApiParameters<\n\t\t\tTData,\n\t\t\tTErrorData,\n\t\t\tTResultMode,\n\t\t\tTThrowOnError,\n\t\t\tTResponseType,\n\t\t\tTPluginArray,\n\t\t\tTSchemas\n\t\t>\n\t): CallApiResult<\n\t\tInferSchemaResult<TSchemas[\"data\"], TData>,\n\t\tInferSchemaResult<TSchemas[\"errorData\"], TErrorData>,\n\t\tTResultMode,\n\t\tTThrowOnError,\n\t\tTResponseType\n\t> => {\n\t\tconst [initURL, config = {} as never] = parameters;\n\n\t\tconst [fetchOptions, extraOptions] = splitConfig(config);\n\n\t\tconst resolvedBaseConfig = isFunction(baseConfig)\n\t\t\t? baseConfig({\n\t\t\t\t\tinitURL: initURL.toString(),\n\t\t\t\t\toptions: extraOptions,\n\t\t\t\t\trequest: fetchOptions,\n\t\t\t\t})\n\t\t\t: baseConfig;\n\n\t\tconst [baseFetchOptions, baseExtraOptions] = splitBaseConfig(resolvedBaseConfig);\n\n\t\tconst initCombinedHooks = {} as Required<Interceptors>;\n\n\t\tfor (const key of Object.keys(hooksEnum)) {\n\t\t\tconst combinedHook = combineHooks(\n\t\t\t\tbaseExtraOptions[key as keyof Interceptors],\n\t\t\t\textraOptions[key as keyof Interceptors]\n\t\t\t);\n\n\t\t\tinitCombinedHooks[key as keyof Interceptors] = combinedHook as never;\n\t\t}\n\n\t\t// == Merged Extra Options\n\t\tconst mergedExtraOptions = {\n\t\t\t...defaultExtraOptions,\n\t\t\t...baseExtraOptions,\n\t\t\t...extraOptions,\n\t\t};\n\n\t\t// == Merged Request Options\n\t\tconst mergedRequestOptions = {\n\t\t\t...defaultRequestOptions,\n\t\t\t...baseFetchOptions,\n\t\t\t...fetchOptions,\n\t\t} satisfies CallApiRequestOptions;\n\n\t\tconst { resolvedHooks, resolvedOptions, resolvedRequestOptions, url } = await initializePlugins({\n\t\t\tbaseConfig: resolvedBaseConfig as PluginInitContext[\"config\"],\n\t\t\tconfig: config as PluginInitContext[\"config\"],\n\t\t\tinitURL,\n\t\t\toptions: mergedExtraOptions,\n\t\t\trequest: mergedRequestOptions,\n\t\t});\n\n\t\tconst fullURL = `${resolvedOptions.baseURL}${mergeUrlWithParamsAndQuery(url, resolvedOptions.params, resolvedOptions.query)}`;\n\n\t\t// FIXME - Consider adding an option for refetching a callApi request\n\t\tconst options = {\n\t\t\t...resolvedOptions,\n\t\t\t...resolvedHooks,\n\t\t\tfullURL,\n\t\t\tinitURL: initURL.toString(),\n\t\t} satisfies CombinedCallApiExtraOptions as typeof mergedExtraOptions & typeof resolvedHooks;\n\n\t\tconst newFetchController = new AbortController();\n\n\t\tconst timeoutSignal = options.timeout != null ? createTimeoutSignal(options.timeout) : null;\n\n\t\tconst combinedSignal = createCombinedSignal(\n\t\t\tresolvedRequestOptions.signal,\n\t\t\ttimeoutSignal,\n\t\t\tnewFetchController.signal\n\t\t);\n\n\t\tconst request = {\n\t\t\t...resolvedRequestOptions,\n\n\t\t\tbody: isSerializable(resolvedRequestOptions.body)\n\t\t\t\t? options.bodySerializer(resolvedRequestOptions.body)\n\t\t\t\t: resolvedRequestOptions.body,\n\n\t\t\theaders: mergeAndResolveHeaders({\n\t\t\t\tauth: options.auth,\n\t\t\t\tbaseHeaders: baseFetchOptions.headers,\n\t\t\t\tbody: resolvedRequestOptions.body,\n\t\t\t\theaders: fetchOptions.headers,\n\t\t\t}),\n\n\t\t\tsignal: combinedSignal,\n\t\t} satisfies CallApiRequestOptionsForHooks;\n\n\t\tconst { handleRequestCancelStrategy, handleRequestDeferStrategy, removeDedupeKeyFromCache } =\n\t\t\tawait createDedupeStrategy({ $RequestInfoCache, newFetchController, options, request });\n\n\t\tawait handleRequestCancelStrategy();\n\n\t\ttry {\n\t\t\tawait executeHooks(options.onRequest({ options, request }));\n\n\t\t\t// == Apply determined headers again after onRequest incase they were modified\n\t\t\trequest.headers = mergeAndResolveHeaders({\n\t\t\t\tauth: options.auth,\n\t\t\t\tbody: request.body,\n\t\t\t\theaders: request.headers,\n\t\t\t});\n\n\t\t\tconst response = await handleRequestDeferStrategy();\n\n\t\t\tconst { schemas, validators } = createExtensibleSchemasAndValidators(options);\n\n\t\t\t// == Also clone response when dedupeStrategy is set to \"defer\", to avoid error thrown from reading response.(whatever) more than once\n\t\t\tconst shouldCloneResponse = options.dedupeStrategy === \"defer\" || options.cloneResponse;\n\n\t\t\tif (!response.ok) {\n\t\t\t\tconst errorData = await resolveResponseData<TErrorData>(\n\t\t\t\t\tshouldCloneResponse ? response.clone() : response,\n\t\t\t\t\toptions.responseType,\n\t\t\t\t\toptions.responseParser\n\t\t\t\t);\n\n\t\t\t\tconst validErrorData = await handleValidation(\n\t\t\t\t\terrorData,\n\t\t\t\t\tschemas?.errorData,\n\t\t\t\t\tvalidators?.errorData\n\t\t\t\t);\n\n\t\t\t\t// == Push all error handling responsibilities to the catch block if not retrying\n\t\t\t\tthrow new HTTPError({\n\t\t\t\t\tdefaultErrorMessage: options.defaultErrorMessage,\n\t\t\t\t\terrorData: validErrorData,\n\t\t\t\t\tresponse,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst successData = await resolveResponseData<TData>(\n\t\t\t\tshouldCloneResponse ? response.clone() : response,\n\t\t\t\toptions.responseType,\n\t\t\t\toptions.responseParser\n\t\t\t);\n\n\t\t\tconst validSuccessData = await handleValidation(successData, schemas?.data, validators?.data);\n\n\t\t\tconst successContext = {\n\t\t\t\tdata: validSuccessData,\n\t\t\t\toptions,\n\t\t\t\trequest,\n\t\t\t\tresponse: options.cloneResponse ? response.clone() : response,\n\t\t\t} satisfies SuccessContext<unknown>;\n\n\t\t\tawait executeHooks(\n\t\t\t\toptions.onSuccess(successContext),\n\n\t\t\t\toptions.onResponse({ ...successContext, error: null })\n\t\t\t);\n\n\t\t\treturn await resolveSuccessResult({\n\t\t\t\tdata: successContext.data,\n\t\t\t\tresponse: successContext.response,\n\t\t\t\tresultMode: options.resultMode,\n\t\t\t});\n\n\t\t\t// == Exhaustive Error handling\n\t\t} catch (error) {\n\t\t\tconst { apiDetails, getErrorResult } = resolveErrorResult({\n\t\t\t\tcloneResponse: options.cloneResponse,\n\t\t\t\tdefaultErrorMessage: options.defaultErrorMessage,\n\t\t\t\terror,\n\t\t\t\tresultMode: options.resultMode,\n\t\t\t});\n\n\t\t\tconst errorContext = {\n\t\t\t\terror: apiDetails.error as never,\n\t\t\t\toptions,\n\t\t\t\trequest,\n\t\t\t\tresponse: apiDetails.response as never,\n\t\t\t} satisfies ErrorContext<unknown>;\n\n\t\t\tconst shouldThrowOnError = isFunction(options.throwOnError)\n\t\t\t\t? options.throwOnError(errorContext)\n\t\t\t\t: options.throwOnError;\n\n\t\t\t// eslint-disable-next-line unicorn/consistent-function-scoping -- False alarm: this function is depends on this scope\n\t\t\tconst handleRetryOrGetResult = async (customInfo?: { message?: string }) => {\n\t\t\t\tconst { executeRetryHook, getDelay, shouldAttemptRetry } = createRetryStrategy(errorContext);\n\n\t\t\t\tconst shouldRetry = !combinedSignal.aborted && (await shouldAttemptRetry());\n\n\t\t\t\tif (shouldRetry) {\n\t\t\t\t\tawait executeRetryHook(shouldThrowOnError);\n\n\t\t\t\t\tconst delay = getDelay();\n\n\t\t\t\t\tawait waitUntil(delay);\n\n\t\t\t\t\tconst updatedOptions = {\n\t\t\t\t\t\t...config,\n\t\t\t\t\t\t\"~retryCount\": (options[\"~retryCount\"] ?? 0) + 1,\n\t\t\t\t\t} satisfies typeof config;\n\n\t\t\t\t\treturn callApi(initURL, updatedOptions as never) as never;\n\t\t\t\t}\n\n\t\t\t\tif (shouldThrowOnError) {\n\t\t\t\t\t// eslint-disable-next-line ts-eslint/only-throw-error -- It's fine to throw this\n\t\t\t\t\tthrow apiDetails.error;\n\t\t\t\t}\n\n\t\t\t\treturn customInfo ? getErrorResult(customInfo) : getErrorResult();\n\t\t\t};\n\n\t\t\tif (isHTTPErrorInstance<TErrorData>(error)) {\n\t\t\t\tawait executeHooks(\n\t\t\t\t\toptions.onResponseError(errorContext),\n\n\t\t\t\t\toptions.onError(errorContext),\n\n\t\t\t\t\toptions.onResponse({ ...errorContext, data: null })\n\t\t\t\t);\n\n\t\t\t\treturn await handleRetryOrGetResult();\n\t\t\t}\n\n\t\t\tif (error instanceof DOMException && error.name === \"AbortError\") {\n\t\t\t\tconst { message, name } = error;\n\n\t\t\t\tconsole.error(`${name}:`, message);\n\n\t\t\t\treturn await handleRetryOrGetResult();\n\t\t\t}\n\n\t\t\tif (error instanceof DOMException && error.name === \"TimeoutError\") {\n\t\t\t\tconst message = `Request timed out after ${options.timeout}ms`;\n\n\t\t\t\tconsole.error(`${error.name}:`, message);\n\n\t\t\t\treturn await handleRetryOrGetResult({ message });\n\t\t\t}\n\n\t\t\tawait executeHooks(\n\t\t\t\t// == At this point only the request errors exist, so the request error interceptor is called\n\t\t\t\toptions.onRequestError(errorContext as never),\n\n\t\t\t\t// == Also call the onError interceptor\n\t\t\t\toptions.onError(errorContext)\n\t\t\t);\n\n\t\t\treturn await handleRetryOrGetResult();\n\n\t\t\t// == Removing the now unneeded AbortController from store\n\t\t} finally {\n\t\t\tremoveDedupeKeyFromCache();\n\t\t}\n\t};\n\n\treturn callApi;\n};\n\nexport const callApi = createFetchClient();\n","import type { CallApiPlugin } from \"./plugins\";\nimport type { ResponseTypeUnion } from \"./response\";\nimport type { CallApiParameters, ResultModeUnion } from \"./types\";\nimport type { DefaultMoreOptions, DefaultPluginArray, DefaultThrowOnError } from \"./types/default-types\";\nimport type { CallApiSchemas } from \"./validation\";\n\nconst defineParameters = <\n\tTData = unknown,\n\tTErrorData = unknown,\n\tTResultMode extends ResultModeUnion = ResultModeUnion,\n\tTThrowOnError extends boolean = DefaultThrowOnError,\n\tTResponseType extends ResponseTypeUnion = ResponseTypeUnion,\n\tTPluginArray extends CallApiPlugin[] = DefaultPluginArray,\n\tTSchemas extends CallApiSchemas = DefaultMoreOptions,\n>(\n\t...parameters: CallApiParameters<\n\t\tTData,\n\t\tTErrorData,\n\t\tTResultMode,\n\t\tTThrowOnError,\n\t\tTResponseType,\n\t\tTPluginArray,\n\t\tTSchemas\n\t>\n) => {\n\treturn parameters;\n};\n\nexport { defineParameters };\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/stream.ts","../../src/dedupe.ts","../../src/plugins.ts","../../src/response.ts","../../src/retry.ts","../../src/url.ts","../../src/utils/polyfills.ts","../../src/validation.ts","../../src/createFetchClient.ts","../../src/defineParameters.ts"],"names":["callApi"],"mappings":"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","file":"index.js","sourcesContent":["import type { CallApiRequestOptionsForHooks, CombinedCallApiExtraOptions } from \"./types\";\nimport { executeHooks } from \"./utils/common\";\nimport { isObject } from \"./utils/guards\";\n\nexport type StreamProgressEvent = {\n\t/**\n\t * Current chunk of data being streamed\n\t */\n\tchunk: Uint8Array;\n\t/**\n\t * Progress in percentage\n\t */\n\tprogress: number;\n\t/**\n\t * Total size of data in bytes\n\t */\n\ttotalBytes: number;\n\t/**\n\t * Amount of data transferred so far\n\t */\n\ttransferredBytes: number;\n};\n\nexport type RequestStreamContext = {\n\tevent: StreamProgressEvent;\n\toptions: CombinedCallApiExtraOptions;\n\trequest: CallApiRequestOptionsForHooks;\n\trequestInstance: Request;\n};\n\nexport type ResponseStreamContext = {\n\tevent: StreamProgressEvent;\n\toptions: CombinedCallApiExtraOptions;\n\trequest: CallApiRequestOptionsForHooks;\n\tresponse: Response;\n};\n\ndeclare global {\n\t// eslint-disable-next-line ts-eslint/consistent-type-definitions -- Allow\n\tinterface ReadableStream<R> {\n\t\t[Symbol.asyncIterator]: () => AsyncIterableIterator<R>;\n\t}\n}\n\nconst createProgressEvent = (options: {\n\tchunk: Uint8Array;\n\ttotalBytes: number;\n\ttransferredBytes: number;\n}): StreamProgressEvent => {\n\tconst { chunk, totalBytes, transferredBytes } = options;\n\n\treturn {\n\t\tchunk,\n\t\tprogress: Math.round((transferredBytes / totalBytes) * 100) || 0,\n\t\ttotalBytes,\n\t\ttransferredBytes,\n\t};\n};\n\nconst calculateTotalBytesFromBody = async (\n\trequestBody: Request[\"body\"] | null,\n\texistingTotalBytes: number\n) => {\n\tlet totalBytes = existingTotalBytes;\n\n\tif (!requestBody) {\n\t\treturn totalBytes;\n\t}\n\n\tfor await (const chunk of requestBody) {\n\t\ttotalBytes += chunk.byteLength;\n\t}\n\n\treturn totalBytes;\n};\n\ntype StreamableRequestContext = {\n\toptions: CombinedCallApiExtraOptions;\n\trequest: CallApiRequestOptionsForHooks;\n\trequestInstance: Request;\n};\n\nexport const toStreamableRequest = async (context: StreamableRequestContext) => {\n\tconst { options, request, requestInstance } = context;\n\n\tif (!options.onRequestStream || !requestInstance.body) return;\n\n\tconst contentLength =\n\t\trequestInstance.headers.get(\"content-length\")\n\t\t?? new Headers(request.headers as HeadersInit).get(\"content-length\")\n\t\t?? (request.body as Blob | null)?.size;\n\n\tlet totalBytes = Number(contentLength ?? 0);\n\n\tconst shouldForceContentLengthCalc = isObject(options.forceStreamSizeCalc)\n\t\t? options.forceStreamSizeCalc.request\n\t\t: options.forceStreamSizeCalc;\n\n\t// If no content length is present, we read the total bytes from the body\n\tif (!contentLength && shouldForceContentLengthCalc) {\n\t\ttotalBytes = await calculateTotalBytesFromBody(requestInstance.clone().body, totalBytes);\n\t}\n\n\tlet transferredBytes = 0;\n\n\tawait executeHooks(\n\t\toptions.onRequestStream({\n\t\t\tevent: createProgressEvent({ chunk: new Uint8Array(), totalBytes, transferredBytes }),\n\t\t\toptions,\n\t\t\trequest,\n\t\t\trequestInstance,\n\t\t})\n\t);\n\n\tconst body = requestInstance.body as ReadableStream<Uint8Array> | null;\n\n\tvoid new ReadableStream({\n\t\tstart: async (controller) => {\n\t\t\tif (!body) return;\n\n\t\t\tfor await (const chunk of body) {\n\t\t\t\ttransferredBytes += chunk.byteLength;\n\n\t\t\t\ttotalBytes = Math.max(totalBytes, transferredBytes);\n\n\t\t\t\tawait executeHooks(\n\t\t\t\t\toptions.onRequestStream?.({\n\t\t\t\t\t\tevent: createProgressEvent({ chunk, totalBytes, transferredBytes }),\n\t\t\t\t\t\toptions,\n\t\t\t\t\t\trequest,\n\t\t\t\t\t\trequestInstance,\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t\tcontroller.enqueue(chunk);\n\t\t\t}\n\t\t\tcontroller.close();\n\t\t},\n\t});\n};\n\ntype StreamableResponseContext = {\n\toptions: CombinedCallApiExtraOptions;\n\trequest: CallApiRequestOptionsForHooks;\n\tresponse: Response;\n};\nexport const toStreamableResponse = async (context: StreamableResponseContext): Promise<Response> => {\n\tconst { options, request, response } = context;\n\n\tif (!options.onResponseStream || !response.body) {\n\t\treturn response;\n\t}\n\n\tconst contentLength = response.headers.get(\"content-length\");\n\n\tlet totalBytes = Number(contentLength ?? 0);\n\n\tconst shouldForceContentLengthCalc = isObject(options.forceStreamSizeCalc)\n\t\t? options.forceStreamSizeCalc.response\n\t\t: options.forceStreamSizeCalc;\n\n\t// If no content length is present and `forceContentLengthCalculation` is enabled, we read the total bytes from the body\n\tif (!contentLength && shouldForceContentLengthCalc) {\n\t\ttotalBytes = await calculateTotalBytesFromBody(response.clone().body, totalBytes);\n\t}\n\n\tlet transferredBytes = 0;\n\n\tawait executeHooks(\n\t\toptions.onResponseStream({\n\t\t\tevent: createProgressEvent({ chunk: new Uint8Array(), totalBytes, transferredBytes }),\n\t\t\toptions,\n\t\t\trequest,\n\t\t\tresponse,\n\t\t})\n\t);\n\n\tconst body = response.body as ReadableStream<Uint8Array> | null;\n\n\tconst stream = new ReadableStream({\n\t\tstart: async (controller) => {\n\t\t\tif (!body) return;\n\n\t\t\tfor await (const chunk of body) {\n\t\t\t\ttransferredBytes += chunk.byteLength;\n\n\t\t\t\ttotalBytes = Math.max(totalBytes, transferredBytes);\n\n\t\t\t\tawait executeHooks(\n\t\t\t\t\toptions.onResponseStream?.({\n\t\t\t\t\t\tevent: createProgressEvent({ chunk, totalBytes, transferredBytes }),\n\t\t\t\t\t\toptions,\n\t\t\t\t\t\trequest,\n\t\t\t\t\t\tresponse,\n\t\t\t\t\t})\n\t\t\t\t);\n\n\t\t\t\tcontroller.enqueue(chunk);\n\t\t\t}\n\n\t\t\tcontroller.close();\n\t\t},\n\t});\n\n\treturn new Response(stream, response);\n};\n","import { toStreamableRequest, toStreamableResponse } from \"./stream\";\nimport type {\n\tCallApiRequestOptions,\n\tCallApiRequestOptionsForHooks,\n\tCombinedCallApiExtraOptions,\n} from \"./types/common\";\nimport { getFetchImpl, waitUntil } from \"./utils/common\";\nimport { isReadableStream } from \"./utils/guards\";\n\ntype RequestInfo = {\n\tcontroller: AbortController;\n\tresponsePromise: Promise<Response>;\n};\n\nexport type RequestInfoCache = Map<string | null, RequestInfo>;\n\ntype DedupeContext = {\n\t$RequestInfoCache: RequestInfoCache;\n\tnewFetchController: AbortController;\n\toptions: CombinedCallApiExtraOptions;\n\trequest: CallApiRequestOptions;\n};\n\nexport const createDedupeStrategy = async (context: DedupeContext) => {\n\tconst { $RequestInfoCache, newFetchController, options, request } = context;\n\n\tconst generateDedupeKey = () => {\n\t\tconst shouldHaveDedupeKey =\n\t\t\toptions.dedupeStrategy === \"cancel\" || options.dedupeStrategy === \"defer\";\n\n\t\tif (!shouldHaveDedupeKey) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn `${options.fullURL}-${JSON.stringify({ options, request })}`;\n\t};\n\n\tconst dedupeKey = options.dedupeKey ?? generateDedupeKey();\n\n\t// == This is to ensure cache operations only occur when key is available\n\tconst $RequestInfoCacheOrNull = dedupeKey !== null ? $RequestInfoCache : null;\n\n\t/******\n\t * == Add a small delay to the execution to ensure proper request deduplication when multiple requests with the same key start simultaneously.\n\t * == This gives time for the cache to be updated with the previous request info before the next request checks it.\n\t ******/\n\tif (dedupeKey !== null) {\n\t\tawait waitUntil(0.1);\n\t}\n\n\tconst prevRequestInfo = $RequestInfoCacheOrNull?.get(dedupeKey);\n\n\tconst handleRequestCancelStrategy = () => {\n\t\tconst shouldCancelRequest = prevRequestInfo && options.dedupeStrategy === \"cancel\";\n\n\t\tif (!shouldCancelRequest) return;\n\n\t\tconst message = options.dedupeKey\n\t\t\t? `Duplicate request detected - Aborting previous request with key '${options.dedupeKey}' as a new request was initiated`\n\t\t\t: `Duplicate request detected - Aborting previous request to '${options.fullURL}' as a new request with identical options was initiated`;\n\n\t\tconst reason = new DOMException(message, \"AbortError\");\n\n\t\tprevRequestInfo.controller.abort(reason);\n\n\t\t// == Adding this just so that eslint forces me put await when calling the function (it looks better that way tbh)\n\t\treturn Promise.resolve();\n\t};\n\n\tconst handleRequestDeferStrategy = async () => {\n\t\tconst fetchApi = getFetchImpl(options.customFetchImpl);\n\n\t\tconst shouldUsePromiseFromCache = prevRequestInfo && options.dedupeStrategy === \"defer\";\n\n\t\tconst requestInstance = new Request(\n\t\t\toptions.fullURL as NonNullable<typeof options.fullURL>,\n\t\t\t(isReadableStream(request.body) && !request.duplex\n\t\t\t\t? { ...request, duplex: \"half\" }\n\t\t\t\t: request) as RequestInit\n\t\t);\n\n\t\tvoid toStreamableRequest({\n\t\t\toptions,\n\t\t\trequest: request as CallApiRequestOptionsForHooks,\n\t\t\trequestInstance: requestInstance.clone(),\n\t\t});\n\n\t\tconst responsePromise = shouldUsePromiseFromCache\n\t\t\t? prevRequestInfo.responsePromise\n\t\t\t: // eslint-disable-next-line unicorn/no-nested-ternary -- Allow\n\t\t\t\tisReadableStream(request.body)\n\t\t\t\t? fetchApi(requestInstance.clone())\n\t\t\t\t: fetchApi(options.fullURL as NonNullable<typeof options.fullURL>, request as RequestInit);\n\n\t\t$RequestInfoCacheOrNull?.set(dedupeKey, { controller: newFetchController, responsePromise });\n\n\t\tconst streamableResponse = toStreamableResponse({\n\t\t\toptions,\n\t\t\trequest: request as CallApiRequestOptionsForHooks,\n\t\t\tresponse: await responsePromise,\n\t\t});\n\n\t\treturn streamableResponse;\n\t};\n\n\tconst removeDedupeKeyFromCache = () => $RequestInfoCacheOrNull?.delete(dedupeKey);\n\n\treturn {\n\t\thandleRequestCancelStrategy,\n\t\thandleRequestDeferStrategy,\n\t\tremoveDedupeKeyFromCache,\n\t};\n};\n","/* eslint-disable ts-eslint/consistent-type-definitions -- I need to use interfaces for the sake of user overrides */\nimport type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport type {\n\tBaseCallApiExtraOptions,\n\tCallApiExtraOptions,\n\tCallApiRequestOptions,\n\tCallApiRequestOptionsForHooks,\n\tCombinedCallApiExtraOptions,\n\tInterceptors,\n\tInterceptorsOrInterceptorArray,\n\tWithMoreOptions,\n} from \"./types/common\";\nimport type { DefaultMoreOptions } from \"./types/default-types\";\nimport type { InitURL } from \"./url\";\nimport { isPlainObject, isString } from \"./utils/guards\";\nimport type { AnyFunction, Awaitable } from \"./utils/type-helpers\";\nimport type { InferSchemaResult } from \"./validation\";\n\ntype UnionToIntersection<TUnion> = (TUnion extends unknown ? (param: TUnion) => void : never) extends (\n\tparam: infer TParam\n) => void\n\t? TParam\n\t: never;\n\ntype InferSchema<TResult> = TResult extends StandardSchemaV1\n\t? InferSchemaResult<TResult, NonNullable<unknown>>\n\t: TResult;\n\nexport type InferPluginOptions<TPluginArray extends CallApiPlugin[]> = UnionToIntersection<\n\tInferSchema<ReturnType<NonNullable<TPluginArray[number][\"createExtraOptions\"]>>>\n>;\n\nexport type PluginInitContext<TMoreOptions = DefaultMoreOptions> = WithMoreOptions<TMoreOptions> & {\n\tbaseConfig: BaseCallApiExtraOptions & CallApiRequestOptions;\n\tconfig: CallApiExtraOptions & CallApiRequestOptions;\n\tinitURL: InitURL | undefined;\n\toptions: CombinedCallApiExtraOptions;\n\trequest: CallApiRequestOptionsForHooks;\n};\n\nexport type PluginInitResult = Partial<\n\tOmit<PluginInitContext, \"request\"> & { request: CallApiRequestOptions }\n>;\n\nexport interface CallApiPlugin<TData = never, TErrorData = never> {\n\t/**\n\t * Defines additional options that can be passed to callApi\n\t */\n\tcreateExtraOptions?: (...params: never[]) => unknown;\n\n\t/**\n\t * A description for the plugin\n\t */\n\tdescription?: string;\n\n\t/**\n\t * Hooks / Interceptors for the plugin\n\t */\n\thooks?: InterceptorsOrInterceptorArray<TData, TErrorData>;\n\n\t/**\n\t * A unique id for the plugin\n\t */\n\tid: string;\n\n\t/**\n\t * A function that will be called when the plugin is initialized. This will be called before the any of the other internal functions.\n\t */\n\tinit?: (context: PluginInitContext) => Awaitable<PluginInitResult> | Awaitable<void>;\n\n\t/**\n\t * A name for the plugin\n\t */\n\tname: string;\n\n\t/**\n\t * A version for the plugin\n\t */\n\tversion?: string;\n}\n\nexport const definePlugin = <\n\t// eslint-disable-next-line perfectionist/sort-union-types -- Let the first one be first\n\tTPlugin extends CallApiPlugin | AnyFunction<CallApiPlugin>,\n>(\n\tplugin: TPlugin\n) => {\n\treturn plugin;\n};\n\nconst createMergedHook = (\n\thooks: Array<AnyFunction | undefined>,\n\tmergedHooksExecutionMode: CombinedCallApiExtraOptions[\"mergedHooksExecutionMode\"]\n) => {\n\tif (hooks.length === 0) return;\n\n\tconst mergedHook = async (ctx: Record<string, unknown>) => {\n\t\tif (mergedHooksExecutionMode === \"sequential\") {\n\t\t\tfor (const hook of hooks) {\n\t\t\t\t// eslint-disable-next-line no-await-in-loop -- This is necessary in this case\n\t\t\t\tawait hook?.(ctx);\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (mergedHooksExecutionMode === \"parallel\") {\n\t\t\tconst hookArray = [...hooks];\n\n\t\t\tawait Promise.all(hookArray.map((uniqueHook) => uniqueHook?.(ctx)));\n\t\t}\n\t};\n\n\treturn mergedHook;\n};\n\n// prettier-ignore\ntype HookRegistries = {\n\t[Key in keyof Interceptors]: Set<Interceptors[Key]>;\n};\n\nexport const hooksEnum = {\n\tonError: new Set(),\n\tonRequest: new Set(),\n\tonRequestError: new Set(),\n\tonRequestStream: new Set(),\n\tonResponse: new Set(),\n\tonResponseError: new Set(),\n\tonResponseStream: new Set(),\n\tonRetry: new Set(),\n\tonSuccess: new Set(),\n} satisfies HookRegistries;\n\nexport type Plugins<TPluginArray extends CallApiPlugin[]> = TPluginArray;\n\nconst getPluginArray = (plugins: Plugins<CallApiPlugin[]> | undefined) => {\n\tif (!plugins) {\n\t\treturn [];\n\t}\n\n\treturn plugins;\n};\n\nexport const initializePlugins = async (\n\tcontext: Omit<PluginInitContext, \"request\"> & { request: CallApiRequestOptions }\n) => {\n\tconst { baseConfig, config, initURL, options, request } = context;\n\n\tconst hookRegistries = structuredClone(hooksEnum);\n\n\tconst addMainHooks = () => {\n\t\tfor (const key of Object.keys(hooksEnum)) {\n\t\t\tconst mainHook = options[key as keyof Interceptors] as never;\n\n\t\t\thookRegistries[key as keyof Interceptors].add(mainHook);\n\t\t}\n\t};\n\n\tconst addPluginHooks = (pluginHooks: Required<CallApiPlugin>[\"hooks\"]) => {\n\t\tfor (const key of Object.keys(hooksEnum)) {\n\t\t\tconst pluginHook = pluginHooks[key as keyof Interceptors] as never;\n\n\t\t\thookRegistries[key as keyof Interceptors].add(pluginHook);\n\t\t}\n\t};\n\n\tif (options.mergedHooksExecutionOrder === \"mainHooksBeforePlugins\") {\n\t\taddMainHooks();\n\t}\n\n\tconst resolvedPlugins = [\n\t\t...getPluginArray(options.plugins),\n\t\t...getPluginArray(options.extend?.plugins),\n\t];\n\n\tlet resolvedUrl = initURL;\n\tlet resolvedOptions = options;\n\tlet resolvedRequestOptions = request;\n\n\tconst executePluginInit = async (pluginInit: CallApiPlugin[\"init\"]) => {\n\t\tif (!pluginInit) return;\n\n\t\tconst initResult = await pluginInit({\n\t\t\tbaseConfig,\n\t\t\tconfig,\n\t\t\tinitURL,\n\t\t\toptions,\n\t\t\trequest: request as CallApiRequestOptionsForHooks,\n\t\t});\n\n\t\tif (!isPlainObject(initResult)) return;\n\n\t\tif (isString(initResult.initURL)) {\n\t\t\tresolvedUrl = initResult.initURL;\n\t\t}\n\n\t\tif (isPlainObject(initResult.request)) {\n\t\t\tresolvedRequestOptions = initResult.request as CallApiRequestOptionsForHooks;\n\t\t}\n\n\t\tif (isPlainObject(initResult.options)) {\n\t\t\tresolvedOptions = initResult.options;\n\t\t}\n\t};\n\n\tfor (const plugin of resolvedPlugins) {\n\t\t// eslint-disable-next-line no-await-in-loop -- Await is necessary in this case.\n\t\tawait executePluginInit(plugin.init);\n\n\t\tif (!plugin.hooks) continue;\n\n\t\taddPluginHooks(plugin.hooks);\n\t}\n\n\tif (\n\t\t!options.mergedHooksExecutionOrder\n\t\t|| options.mergedHooksExecutionOrder === \"mainHooksAfterPlugins\"\n\t) {\n\t\taddMainHooks();\n\t}\n\n\tconst resolvedHooks: Interceptors = {};\n\n\tfor (const [key, hookRegistry] of Object.entries(hookRegistries)) {\n\t\tconst flattenedHookArray = [...hookRegistry].flat().filter(Boolean);\n\n\t\tconst mergedHook = createMergedHook(flattenedHookArray, options.mergedHooksExecutionMode);\n\n\t\tresolvedHooks[key as keyof Interceptors] = mergedHook;\n\t}\n\n\treturn {\n\t\tresolvedHooks,\n\t\tresolvedOptions,\n\t\tresolvedRequestOptions,\n\t\turl: resolvedUrl?.toString(),\n\t};\n};\n","import type { CallApiExtraOptions, CallApiResultSuccessVariant, ResultModeMap } from \"./types\";\nimport { omitKeys } from \"./utils/common\";\nimport type { Awaitable } from \"./utils/type-helpers\";\n\ntype Parser = (responseString: string) => Awaitable<Record<string, unknown>>;\n\nexport const getResponseType = <TResponse>(response: Response, parser?: Parser) => ({\n\tarrayBuffer: () => response.arrayBuffer(),\n\tblob: () => response.blob(),\n\tformData: () => response.formData(),\n\tjson: async () => {\n\t\tif (parser) {\n\t\t\tconst text = await response.text();\n\t\t\treturn parser(text) as TResponse;\n\t\t}\n\n\t\treturn response.json() as Promise<TResponse>;\n\t},\n\tstream: () => response.body,\n\ttext: () => response.text(),\n});\n\ntype InitResponseTypeMap<TResponse = unknown> = ReturnType<typeof getResponseType<TResponse>>;\n\nexport type ResponseTypeUnion = keyof InitResponseTypeMap | undefined;\n\nexport type ResponseTypeMap<TResponse> = {\n\t[Key in keyof InitResponseTypeMap<TResponse>]: Awaited<ReturnType<InitResponseTypeMap<TResponse>[Key]>>;\n};\n\nexport type GetResponseType<\n\tTResponse,\n\tTResponseType extends ResponseTypeUnion,\n\tTComputedMap extends ResponseTypeMap<TResponse> = ResponseTypeMap<TResponse>,\n> = undefined extends TResponseType\n\t? TComputedMap[\"json\"]\n\t: TResponseType extends NonNullable<ResponseTypeUnion>\n\t\t? TComputedMap[TResponseType]\n\t\t: never;\n\nexport const resolveResponseData = async <TResponse>(\n\tresponse: Response,\n\tresponseType: keyof ResponseTypeMap<TResponse>,\n\tparser: Parser | undefined\n) => {\n\tconst RESPONSE_TYPE_LOOKUP = getResponseType<TResponse>(response, parser);\n\n\tif (!Object.hasOwn(RESPONSE_TYPE_LOOKUP, responseType)) {\n\t\tthrow new Error(`Invalid response type: ${responseType}`);\n\t}\n\n\tconst responseData = await RESPONSE_TYPE_LOOKUP[responseType]();\n\n\treturn responseData;\n};\n\ntype SuccessInfo = {\n\tdata: unknown;\n\tresponse: Response;\n\tresultMode: CallApiExtraOptions[\"resultMode\"];\n};\n\n// == The CallApiResult type is used to cast all return statements due to a design limitation in ts.\n// LINK - See https://www.zhenghao.io/posts/type-functions for more info\nexport const resolveSuccessResult = <TCallApiResult>(info: SuccessInfo): TCallApiResult => {\n\tconst { data, response, resultMode } = info;\n\n\tconst apiDetails = { data, error: null, response } satisfies CallApiResultSuccessVariant<unknown>;\n\n\tif (!resultMode) {\n\t\treturn apiDetails as TCallApiResult;\n\t}\n\n\tconst resultModeMap = {\n\t\tall: apiDetails,\n\t\tallWithException: apiDetails,\n\t\tallWithoutResponse: omitKeys(apiDetails, [\"response\"]),\n\t\tonlyError: apiDetails.error,\n\t\tonlyResponse: apiDetails.response,\n\t\tonlyResponseWithException: apiDetails.response,\n\t\tonlySuccess: apiDetails.data,\n\t\tonlySuccessWithException: apiDetails.data,\n\t} satisfies ResultModeMap;\n\n\treturn resultModeMap[resultMode] as TCallApiResult;\n};\n","/* eslint-disable ts-eslint/consistent-type-definitions -- I need to use interfaces for the sake of user overrides */\nimport { resolveErrorResult } from \"./error\";\nimport type { Method } from \"./types\";\nimport type { ErrorContext } from \"./types/common\";\nimport { executeHooks } from \"./utils/common\";\nimport type { AnyNumber, Awaitable } from \"./utils/type-helpers\";\n\ntype RetryCondition<TErrorData> = (context: ErrorContext<TErrorData>) => Awaitable<boolean>;\n\nexport interface RetryOptions<TErrorData> {\n\t/**\n\t * Keeps track of the number of times the request has already been retried\n\t * @deprecated This property is used internally to track retries. Please abstain from modifying it.\n\t */\n\treadonly [\"~retryCount\"]?: number;\n\n\t/**\n\t * Number of allowed retry attempts on HTTP errors\n\t * @default 0\n\t */\n\tretryAttempts?: number;\n\n\t/**\n\t * Callback whose return value determines if a request should be retried or not\n\t */\n\tretryCondition?: RetryCondition<TErrorData>;\n\n\t/**\n\t * Delay between retries in milliseconds\n\t * @default 1000\n\t */\n\tretryDelay?: number;\n\n\t/**\n\t * Maximum delay in milliseconds. Only applies to exponential strategy\n\t * @default 10000\n\t */\n\tretryMaxDelay?: number;\n\n\t/**\n\t * HTTP methods that are allowed to retry\n\t * @default [\"GET\", \"POST\"]\n\t */\n\tretryMethods?: Method[];\n\n\t/**\n\t * HTTP status codes that trigger a retry\n\t * @default [409, 425, 429, 500, 502, 503, 504]\n\t */\n\tretryStatusCodes?: Array<409 | 425 | 429 | 500 | 502 | 503 | 504 | AnyNumber>;\n\n\t/**\n\t * Strategy to use when retrying\n\t * @default \"linear\"\n\t */\n\tretryStrategy?: \"exponential\" | \"linear\";\n}\n\nconst getLinearDelay = <TErrorData>(options: RetryOptions<TErrorData>) => options.retryDelay ?? 1000;\n\nconst getExponentialDelay = <TErrorData>(\n\tcurrentAttemptCount: number,\n\toptions: RetryOptions<TErrorData>\n) => {\n\tconst maxDelay = options.retryMaxDelay ?? 10000;\n\n\tconst exponentialDelay = (options.retryDelay ?? 1000) * 2 ** currentAttemptCount;\n\n\treturn Math.min(exponentialDelay, maxDelay);\n};\n\nexport const createRetryStrategy = <TErrorData>(ctx: ErrorContext<TErrorData>) => {\n\tconst { options } = ctx;\n\n\tconst currentRetryCount = options[\"~retryCount\"] ?? 0;\n\n\tconst getDelay = () => {\n\t\tif (options.retryStrategy === \"exponential\") {\n\t\t\treturn getExponentialDelay(currentRetryCount, options);\n\t\t}\n\n\t\treturn getLinearDelay(options);\n\t};\n\n\tconst shouldAttemptRetry = async () => {\n\t\tconst customRetryCondition = (await options.retryCondition?.(ctx)) ?? true;\n\n\t\tconst maxRetryAttempts = options.retryAttempts ?? 0;\n\n\t\tconst baseRetryCondition = maxRetryAttempts > currentRetryCount && customRetryCondition;\n\n\t\tif (ctx.error.name !== \"HTTPError\") {\n\t\t\treturn baseRetryCondition;\n\t\t}\n\n\t\tconst includesMethod =\n\t\t\t// eslint-disable-next-line no-implicit-coercion -- Boolean doesn't narrow\n\t\t\t!!ctx.request.method && options.retryMethods?.includes(ctx.request.method);\n\n\t\tconst includesCodes =\n\t\t\t// eslint-disable-next-line no-implicit-coercion -- Boolean doesn't narrow\n\t\t\t!!ctx.response?.status && options.retryStatusCodes?.includes(ctx.response.status);\n\n\t\treturn includesCodes && includesMethod && baseRetryCondition;\n\t};\n\n\tconst executeRetryHook = async (shouldThrowOnError: boolean | undefined) => {\n\t\ttry {\n\t\t\treturn await executeHooks(options.onRetry?.(ctx));\n\t\t} catch (error) {\n\t\t\tconst { apiDetails } = resolveErrorResult({\n\t\t\t\tcloneResponse: options.cloneResponse,\n\t\t\t\tdefaultErrorMessage: options.defaultErrorMessage as string,\n\t\t\t\terror,\n\t\t\t\tresultMode: options.resultMode,\n\t\t\t});\n\n\t\t\tif (shouldThrowOnError) {\n\t\t\t\tthrow error;\n\t\t\t}\n\n\t\t\treturn apiDetails;\n\t\t}\n\t};\n\n\treturn {\n\t\texecuteRetryHook,\n\t\tgetDelay,\n\t\tshouldAttemptRetry,\n\t};\n};\n","/* eslint-disable ts-eslint/consistent-type-definitions -- I need to use interfaces for the sake of user overrides */\n\nimport type { CallApiExtraOptions } from \"./types/common\";\nimport { toQueryString } from \"./utils\";\nimport { isArray } from \"./utils/guards\";\nimport type { UnmaskType } from \"./utils/type-helpers\";\nimport type { CallApiSchemas, InferSchemaResult } from \"./validation\";\n\nconst slash = \"/\";\nconst column = \":\";\nconst mergeUrlWithParams = (url: string, params: CallApiExtraOptions[\"params\"]) => {\n\tif (!params) {\n\t\treturn url;\n\t}\n\n\tlet newUrl = url;\n\n\tif (isArray(params)) {\n\t\tconst matchedParamArray = newUrl.split(slash).filter((param) => param.startsWith(column));\n\n\t\tfor (const [index, matchedParam] of matchedParamArray.entries()) {\n\t\t\tconst realParam = params[index] as string;\n\t\t\tnewUrl = newUrl.replace(matchedParam, realParam);\n\t\t}\n\n\t\treturn newUrl;\n\t}\n\n\tfor (const [key, value] of Object.entries(params)) {\n\t\tnewUrl = newUrl.replace(`${column}${key}`, String(value));\n\t}\n\n\treturn newUrl;\n};\n\nconst questionMark = \"?\";\nconst ampersand = \"&\";\nconst mergeUrlWithQuery = (url: string, query: CallApiExtraOptions[\"query\"]): string => {\n\tif (!query) {\n\t\treturn url;\n\t}\n\n\tconst queryString = toQueryString(query);\n\n\tif (queryString?.length === 0) {\n\t\treturn url;\n\t}\n\n\tif (url.endsWith(questionMark)) {\n\t\treturn `${url}${queryString}`;\n\t}\n\n\tif (url.includes(questionMark)) {\n\t\treturn `${url}${ampersand}${queryString}`;\n\t}\n\n\treturn `${url}${questionMark}${queryString}`;\n};\n\nexport const mergeUrlWithParamsAndQuery = (\n\turl: string | undefined,\n\tparams: CallApiExtraOptions[\"params\"],\n\tquery: CallApiExtraOptions[\"query\"]\n) => {\n\tif (!url) return;\n\n\tconst urlWithMergedParams = mergeUrlWithParams(url, params);\n\n\treturn mergeUrlWithQuery(urlWithMergedParams, query);\n};\n\nexport type Params = UnmaskType<\n\t// eslint-disable-next-line perfectionist/sort-union-types -- I need the Record to be first\n\tRecord<string, boolean | number | string> | Array<boolean | number | string>\n>;\n\nexport type Query = UnmaskType<Record<string, boolean | number | string>>;\n\nexport type InitURL = UnmaskType<string | URL>;\n\nexport interface UrlOptions<TSchemas extends CallApiSchemas> {\n\t/**\n\t * URL to be used in the request.\n\t */\n\treadonly initURL?: string;\n\n\t/**\n\t * Parameters to be appended to the URL (i.e: /:id)\n\t */\n\tparams?: InferSchemaResult<TSchemas[\"params\"], Params>;\n\n\t/**\n\t * Query parameters to append to the URL.\n\t */\n\tquery?: InferSchemaResult<TSchemas[\"query\"], Query>;\n}\n","// prettier-ignore\nexport const createCombinedSignal = (...signals: Array<AbortSignal | null | undefined>) => AbortSignal.any(signals.filter(Boolean));\n\nexport const createTimeoutSignal = (milliseconds: number) => AbortSignal.timeout(milliseconds);\n","/* eslint-disable ts-eslint/consistent-type-definitions -- I need to use interfaces for the sake of user overrides */\nimport type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport type { Body, GlobalMeta, Headers, Method } from \"./types\";\nimport type { CombinedCallApiExtraOptions } from \"./types/common\";\nimport type { InitURL, Params, Query } from \"./url\";\n\nexport const standardSchemaParser = async <TSchema extends StandardSchemaV1>(\n\tschema: TSchema,\n\tinputData: StandardSchemaV1.InferInput<TSchema>\n): Promise<StandardSchemaV1.InferOutput<TSchema>> => {\n\tconst result = await schema[\"~standard\"].validate(inputData);\n\n\t// == If the `issues` field exists, it means the validation failed\n\tif (result.issues) {\n\t\tthrow new Error(JSON.stringify(result.issues, null, 2), { cause: result.issues });\n\t}\n\n\treturn result.value;\n};\n\nexport interface CallApiSchemas {\n\t/**\n\t * The schema to use for validating the request body.\n\t */\n\tbody?: StandardSchemaV1<Body>;\n\n\t/**\n\t * The schema to use for validating the response data.\n\t */\n\tdata?: StandardSchemaV1;\n\n\t/**\n\t * The schema to use for validating the response error data.\n\t */\n\terrorData?: StandardSchemaV1;\n\n\t/**\n\t * The schema to use for validating the request headers.\n\t */\n\theaders?: StandardSchemaV1<Headers>;\n\n\t/**\n\t * The schema to use for validating the request url.\n\t */\n\tinitURL?: StandardSchemaV1<InitURL>;\n\n\t/**\n\t * The schema to use for validating the meta option.\n\t */\n\tmeta?: StandardSchemaV1<GlobalMeta>;\n\n\t/**\n\t * The schema to use for validating the request method.\n\t */\n\tmethod?: StandardSchemaV1<Method>;\n\n\t/**\n\t * The schema to use for validating the request url parameter.\n\t */\n\tparams?: StandardSchemaV1<Params>;\n\n\t/**\n\t * The schema to use for validating the request url querys.\n\t */\n\tquery?: StandardSchemaV1<Query>;\n}\n\nexport interface CallApiValidators<TData = unknown, TErrorData = unknown> {\n\t/**\n\t * Custom function to validate the response data.\n\t */\n\tdata?: (value: unknown) => TData;\n\n\t/**\n\t * Custom function to validate the response error data, stemming from the api.\n\t * This only runs if the api actually sends back error status codes, else it will be ignored, in which case you should only use the `responseValidator` option.\n\t */\n\terrorData?: (value: unknown) => TErrorData;\n}\n\nexport type InferSchemaResult<TSchema, TData> = TSchema extends StandardSchemaV1\n\t? StandardSchemaV1.InferOutput<TSchema>\n\t: TData;\n\nexport const createExtensibleSchemasAndValidators = (options: CombinedCallApiExtraOptions) => {\n\tconst schemas =\n\t\toptions.schemas && ({ ...options.schemas, ...options.extend?.schemas } as CallApiSchemas);\n\n\tconst validators = options.validators && { ...options.validators, ...options.extend?.validators };\n\n\treturn { schemas, validators };\n};\n\nexport const handleValidation = async (\n\tresponseData: unknown,\n\tschema: CallApiSchemas[keyof NonNullable<CallApiSchemas>],\n\tvalidator?: CallApiValidators[keyof NonNullable<CallApiValidators>]\n) => {\n\tconst validResponseData = validator ? validator(responseData) : responseData;\n\n\tconst schemaValidResponseData = schema\n\t\t? await standardSchemaParser(schema, validResponseData)\n\t\t: validResponseData;\n\n\treturn schemaValidResponseData;\n};\n","import { type RequestInfoCache, createDedupeStrategy } from \"./dedupe\";\nimport { HTTPError, resolveErrorResult } from \"./error\";\nimport { type CallApiPlugin, type PluginInitContext, hooksEnum, initializePlugins } from \"./plugins\";\nimport { type ResponseTypeUnion, resolveResponseData, resolveSuccessResult } from \"./response\";\nimport { createRetryStrategy } from \"./retry\";\nimport type {\n\tBaseCallApiConfig,\n\tCallApiParameters,\n\tCallApiRequestOptions,\n\tCallApiRequestOptionsForHooks,\n\tCallApiResult,\n\tCombinedCallApiExtraOptions,\n\tErrorContext,\n\tInterceptors,\n\tResultModeUnion,\n\tSuccessContext,\n} from \"./types/common\";\nimport type {\n\tDefaultDataType,\n\tDefaultMoreOptions,\n\tDefaultPluginArray,\n\tDefaultThrowOnError,\n} from \"./types/default-types\";\nimport { mergeUrlWithParamsAndQuery } from \"./url\";\nimport {\n\tcombineHooks,\n\texecuteHooks,\n\tmergeAndResolveHeaders,\n\tsplitBaseConfig,\n\tsplitConfig,\n\twaitUntil,\n} from \"./utils/common\";\nimport { defaultExtraOptions, defaultRequestOptions } from \"./utils/constants\";\nimport { isFunction, isHTTPErrorInstance, isSerializable } from \"./utils/guards\";\nimport { createCombinedSignal, createTimeoutSignal } from \"./utils/polyfills\";\nimport {\n\ttype CallApiSchemas,\n\ttype InferSchemaResult,\n\tcreateExtensibleSchemasAndValidators,\n\thandleValidation,\n} from \"./validation\";\n\nexport const createFetchClient = <\n\tTBaseData = DefaultDataType,\n\tTBaseErrorData = DefaultDataType,\n\tTBaseResultMode extends ResultModeUnion = ResultModeUnion,\n\tTBaseThrowOnError extends boolean = DefaultThrowOnError,\n\tTBaseResponseType extends ResponseTypeUnion = ResponseTypeUnion,\n\tTBasePluginArray extends CallApiPlugin[] = DefaultPluginArray,\n\tTBaseSchemas extends CallApiSchemas = DefaultMoreOptions,\n>(\n\tbaseConfig: BaseCallApiConfig<\n\t\tTBaseData,\n\t\tTBaseErrorData,\n\t\tTBaseResultMode,\n\t\tTBaseThrowOnError,\n\t\tTBaseResponseType,\n\t\tTBasePluginArray,\n\t\tTBaseSchemas\n\t> = {} as never\n) => {\n\tconst $RequestInfoCache: RequestInfoCache = new Map();\n\n\tconst callApi = async <\n\t\tTData = InferSchemaResult<TBaseSchemas[\"data\"], TBaseData>,\n\t\tTErrorData = InferSchemaResult<TBaseSchemas[\"errorData\"], TBaseErrorData>,\n\t\tTResultMode extends ResultModeUnion = TBaseResultMode,\n\t\tTThrowOnError extends boolean = TBaseThrowOnError,\n\t\tTResponseType extends ResponseTypeUnion = TBaseResponseType,\n\t\tTPluginArray extends CallApiPlugin[] = TBasePluginArray,\n\t\tTSchemas extends CallApiSchemas = TBaseSchemas,\n\t>(\n\t\t...parameters: CallApiParameters<\n\t\t\tTData,\n\t\t\tTErrorData,\n\t\t\tTResultMode,\n\t\t\tTThrowOnError,\n\t\t\tTResponseType,\n\t\t\tTPluginArray,\n\t\t\tTSchemas\n\t\t>\n\t): CallApiResult<\n\t\tInferSchemaResult<TSchemas[\"data\"], TData>,\n\t\tInferSchemaResult<TSchemas[\"errorData\"], TErrorData>,\n\t\tTResultMode,\n\t\tTThrowOnError,\n\t\tTResponseType\n\t> => {\n\t\tconst [initURL, config = {} as never] = parameters;\n\n\t\tconst [fetchOptions, extraOptions] = splitConfig(config);\n\n\t\tconst resolvedBaseConfig = isFunction(baseConfig)\n\t\t\t? baseConfig({\n\t\t\t\t\tinitURL: initURL.toString(),\n\t\t\t\t\toptions: extraOptions,\n\t\t\t\t\trequest: fetchOptions,\n\t\t\t\t})\n\t\t\t: baseConfig;\n\n\t\tconst [baseFetchOptions, baseExtraOptions] = splitBaseConfig(resolvedBaseConfig);\n\n\t\tconst initCombinedHooks = {} as Required<Interceptors>;\n\n\t\tfor (const key of Object.keys(hooksEnum)) {\n\t\t\tconst combinedHook = combineHooks(\n\t\t\t\tbaseExtraOptions[key as keyof Interceptors],\n\t\t\t\textraOptions[key as keyof Interceptors]\n\t\t\t);\n\n\t\t\tinitCombinedHooks[key as keyof Interceptors] = combinedHook as never;\n\t\t}\n\n\t\t// == Merged Extra Options\n\t\tconst mergedExtraOptions = {\n\t\t\t...defaultExtraOptions,\n\t\t\t...baseExtraOptions,\n\t\t\t...extraOptions,\n\t\t};\n\n\t\t// == Merged Request Options\n\t\tconst mergedRequestOptions = {\n\t\t\t...defaultRequestOptions,\n\t\t\t...baseFetchOptions,\n\t\t\t...fetchOptions,\n\t\t} satisfies CallApiRequestOptions;\n\n\t\tconst { resolvedHooks, resolvedOptions, resolvedRequestOptions, url } = await initializePlugins({\n\t\t\tbaseConfig: resolvedBaseConfig as PluginInitContext[\"config\"],\n\t\t\tconfig: config as PluginInitContext[\"config\"],\n\t\t\tinitURL,\n\t\t\toptions: mergedExtraOptions as CombinedCallApiExtraOptions,\n\t\t\trequest: mergedRequestOptions,\n\t\t});\n\n\t\tconst fullURL = `${resolvedOptions.baseURL}${mergeUrlWithParamsAndQuery(url, resolvedOptions.params, resolvedOptions.query)}`;\n\n\t\t// FIXME - Consider adding an option for refetching a callApi request\n\t\tconst options = {\n\t\t\t...resolvedOptions,\n\t\t\t...resolvedHooks,\n\t\t\tfullURL,\n\t\t\tinitURL: initURL.toString(),\n\t\t} satisfies CombinedCallApiExtraOptions as typeof mergedExtraOptions & typeof resolvedHooks;\n\n\t\tconst newFetchController = new AbortController();\n\n\t\tconst timeoutSignal = options.timeout != null ? createTimeoutSignal(options.timeout) : null;\n\n\t\tconst combinedSignal = createCombinedSignal(\n\t\t\tresolvedRequestOptions.signal,\n\t\t\ttimeoutSignal,\n\t\t\tnewFetchController.signal\n\t\t);\n\n\t\tconst request = {\n\t\t\t...resolvedRequestOptions,\n\n\t\t\tbody: isSerializable(resolvedRequestOptions.body)\n\t\t\t\t? options.bodySerializer(resolvedRequestOptions.body)\n\t\t\t\t: resolvedRequestOptions.body,\n\n\t\t\theaders: mergeAndResolveHeaders({\n\t\t\t\tauth: options.auth,\n\t\t\t\tbaseHeaders: baseFetchOptions.headers,\n\t\t\t\tbody: resolvedRequestOptions.body,\n\t\t\t\theaders: fetchOptions.headers,\n\t\t\t}),\n\n\t\t\tsignal: combinedSignal,\n\t\t} satisfies CallApiRequestOptionsForHooks;\n\n\t\tconst { handleRequestCancelStrategy, handleRequestDeferStrategy, removeDedupeKeyFromCache } =\n\t\t\tawait createDedupeStrategy({ $RequestInfoCache, newFetchController, options, request });\n\n\t\tawait handleRequestCancelStrategy();\n\n\t\ttry {\n\t\t\tawait executeHooks(options.onRequest?.({ options, request }));\n\n\t\t\t// == Apply determined headers again after onRequest incase they were modified\n\t\t\trequest.headers = mergeAndResolveHeaders({\n\t\t\t\tauth: options.auth,\n\t\t\t\tbody: request.body,\n\t\t\t\theaders: request.headers,\n\t\t\t});\n\n\t\t\tconst response = await handleRequestDeferStrategy();\n\n\t\t\tconst { schemas, validators } = createExtensibleSchemasAndValidators(options);\n\t\t\t// == Also clone response when dedupeStrategy is set to \"defer\" or when onRequestStream is set, to avoid error thrown from reading response.(whatever) more than once\n\t\t\tconst shouldCloneResponse = options.dedupeStrategy === \"defer\" || options.cloneResponse;\n\n\t\t\tif (!response.ok) {\n\t\t\t\tconst errorData = await resolveResponseData<TErrorData>(\n\t\t\t\t\tshouldCloneResponse ? response.clone() : response,\n\t\t\t\t\toptions.responseType,\n\t\t\t\t\toptions.responseParser\n\t\t\t\t);\n\n\t\t\t\tconst validErrorData = await handleValidation(\n\t\t\t\t\terrorData,\n\t\t\t\t\tschemas?.errorData,\n\t\t\t\t\tvalidators?.errorData\n\t\t\t\t);\n\n\t\t\t\t// == Push all error handling responsibilities to the catch block if not retrying\n\t\t\t\tthrow new HTTPError({\n\t\t\t\t\tdefaultErrorMessage: options.defaultErrorMessage,\n\t\t\t\t\terrorData: validErrorData,\n\t\t\t\t\tresponse,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst successData = await resolveResponseData<TData>(\n\t\t\t\tshouldCloneResponse ? response.clone() : response,\n\t\t\t\toptions.responseType,\n\t\t\t\toptions.responseParser\n\t\t\t);\n\n\t\t\tconst validSuccessData = await handleValidation(successData, schemas?.data, validators?.data);\n\n\t\t\tconst successContext = {\n\t\t\t\tdata: validSuccessData,\n\t\t\t\toptions,\n\t\t\t\trequest,\n\t\t\t\tresponse,\n\t\t\t} satisfies SuccessContext<unknown>;\n\n\t\t\tawait executeHooks(\n\t\t\t\toptions.onSuccess?.(successContext),\n\n\t\t\t\toptions.onResponse?.({ ...successContext, error: null })\n\t\t\t);\n\n\t\t\treturn await resolveSuccessResult({\n\t\t\t\tdata: successContext.data,\n\t\t\t\tresponse: successContext.response,\n\t\t\t\tresultMode: options.resultMode,\n\t\t\t});\n\n\t\t\t// == Exhaustive Error handling\n\t\t} catch (error) {\n\t\t\tconst { apiDetails, getErrorResult } = resolveErrorResult({\n\t\t\t\tcloneResponse: options.cloneResponse,\n\t\t\t\tdefaultErrorMessage: options.defaultErrorMessage,\n\t\t\t\terror,\n\t\t\t\tresultMode: options.resultMode,\n\t\t\t});\n\n\t\t\tconst errorContext = {\n\t\t\t\terror: apiDetails.error as never,\n\t\t\t\toptions,\n\t\t\t\trequest,\n\t\t\t\tresponse: apiDetails.response as never,\n\t\t\t} satisfies ErrorContext<unknown>;\n\n\t\t\tconst shouldThrowOnError = isFunction(options.throwOnError)\n\t\t\t\t? options.throwOnError(errorContext)\n\t\t\t\t: options.throwOnError;\n\n\t\t\tconst handleRetryOrGetResult = async (customInfo?: { message?: string }) => {\n\t\t\t\tconst { executeRetryHook, getDelay, shouldAttemptRetry } = createRetryStrategy(errorContext);\n\n\t\t\t\tconst shouldRetry = !combinedSignal.aborted && (await shouldAttemptRetry());\n\n\t\t\t\tif (shouldRetry) {\n\t\t\t\t\tawait executeRetryHook(shouldThrowOnError);\n\n\t\t\t\t\tconst delay = getDelay();\n\n\t\t\t\t\tawait waitUntil(delay);\n\n\t\t\t\t\tconst updatedOptions = {\n\t\t\t\t\t\t...config,\n\t\t\t\t\t\t\"~retryCount\": (options[\"~retryCount\"] ?? 0) + 1,\n\t\t\t\t\t} satisfies typeof config;\n\n\t\t\t\t\treturn callApi(initURL, updatedOptions as never) as never;\n\t\t\t\t}\n\n\t\t\t\tif (shouldThrowOnError) {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\n\t\t\t\treturn customInfo ? getErrorResult(customInfo) : getErrorResult();\n\t\t\t};\n\n\t\t\tif (isHTTPErrorInstance<TErrorData>(error)) {\n\t\t\t\tawait executeHooks(\n\t\t\t\t\toptions.onResponseError?.(errorContext),\n\n\t\t\t\t\toptions.onError?.(errorContext),\n\n\t\t\t\t\toptions.onResponse?.({ ...errorContext, data: null })\n\t\t\t\t);\n\n\t\t\t\treturn await handleRetryOrGetResult();\n\t\t\t}\n\n\t\t\tif (error instanceof DOMException && error.name === \"AbortError\") {\n\t\t\t\tconst { message, name } = error;\n\n\t\t\t\t!shouldThrowOnError && console.error(`${name}:`, message);\n\n\t\t\t\treturn await handleRetryOrGetResult();\n\t\t\t}\n\n\t\t\tif (error instanceof DOMException && error.name === \"TimeoutError\") {\n\t\t\t\tconst message = `Request timed out after ${options.timeout}ms`;\n\n\t\t\t\t!shouldThrowOnError && console.error(`${error.name}:`, message);\n\n\t\t\t\treturn await handleRetryOrGetResult({ message });\n\t\t\t}\n\n\t\t\tawait executeHooks(\n\t\t\t\t// == At this point only the request errors exist, so the request error interceptor is called\n\t\t\t\toptions.onRequestError?.(errorContext as never),\n\n\t\t\t\t// == Also call the onError interceptor\n\t\t\t\toptions.onError?.(errorContext)\n\t\t\t);\n\n\t\t\treturn await handleRetryOrGetResult();\n\n\t\t\t// == Removing the now unneeded AbortController from store\n\t\t} finally {\n\t\t\tremoveDedupeKeyFromCache();\n\t\t}\n\t};\n\n\treturn callApi;\n};\n\nexport const callApi = createFetchClient();\n","import type { CallApiPlugin } from \"./plugins\";\nimport type { ResponseTypeUnion } from \"./response\";\nimport type { CallApiParameters, ResultModeUnion } from \"./types\";\nimport type { DefaultMoreOptions, DefaultPluginArray, DefaultThrowOnError } from \"./types/default-types\";\nimport type { CallApiSchemas } from \"./validation\";\n\nconst defineParameters = <\n\tTData = unknown,\n\tTErrorData = unknown,\n\tTResultMode extends ResultModeUnion = ResultModeUnion,\n\tTThrowOnError extends boolean = DefaultThrowOnError,\n\tTResponseType extends ResponseTypeUnion = ResponseTypeUnion,\n\tTPluginArray extends CallApiPlugin[] = DefaultPluginArray,\n\tTSchemas extends CallApiSchemas = DefaultMoreOptions,\n>(\n\t...parameters: CallApiParameters<\n\t\tTData,\n\t\tTErrorData,\n\t\tTResultMode,\n\t\tTThrowOnError,\n\t\tTResponseType,\n\t\tTPluginArray,\n\t\tTSchemas\n\t>\n) => {\n\treturn parameters;\n};\n\nexport { defineParameters };\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { m as CallApiExtraOptions, o as PossibleHTTPError, n as PossibleJavaScriptError, H as HTTPError } from '../error-
|
|
1
|
+
import { m as CallApiExtraOptions, o as PossibleHTTPError, n as PossibleJavaScriptError, H as HTTPError } from '../error-C7M77J6L.js';
|
|
2
2
|
import '@standard-schema/spec';
|
|
3
3
|
|
|
4
4
|
type ToQueryStringFn = {
|
package/dist/esm/utils/index.js
CHANGED
package/package.json
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zayne-labs/callapi",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.7.0",
|
|
5
5
|
"description": "A lightweight wrapper over fetch with quality of life improvements like built-in request cancellation, retries, interceptors and more",
|
|
6
6
|
"author": "Ryan Zayne",
|
|
7
7
|
"license": "MIT",
|
|
8
8
|
"homepage": "https://github.com/zayne-labs/call-api#readme",
|
|
9
9
|
"repository": {
|
|
10
10
|
"type": "git",
|
|
11
|
-
"url": "https://github.com/zayne-labs/call-api.git"
|
|
11
|
+
"url": "git+https://github.com/zayne-labs/call-api.git"
|
|
12
12
|
},
|
|
13
13
|
"bugs": {
|
|
14
14
|
"url": "https://github.com/zayne-labs/call-api/issues"
|
|
@@ -47,10 +47,10 @@
|
|
|
47
47
|
"@size-limit/preset-small-lib": "11.2.0",
|
|
48
48
|
"@standard-schema/spec": "^1.0.0",
|
|
49
49
|
"@total-typescript/ts-reset": "0.6.1",
|
|
50
|
-
"@zayne-labs/tsconfig": "0.
|
|
50
|
+
"@zayne-labs/tsconfig": "0.8.0",
|
|
51
51
|
"concurrently": "^9.1.2",
|
|
52
52
|
"cross-env": "^7.0.3",
|
|
53
|
-
"publint": "^0.3.
|
|
53
|
+
"publint": "^0.3.11",
|
|
54
54
|
"size-limit": "11.2.0",
|
|
55
55
|
"terser": "5.39.0",
|
|
56
56
|
"tsup": "8.4.0",
|
|
@@ -65,7 +65,7 @@
|
|
|
65
65
|
"size-limit": [
|
|
66
66
|
{
|
|
67
67
|
"path": "./src/index.ts",
|
|
68
|
-
"limit": "4 kb"
|
|
68
|
+
"limit": "4.5 kb"
|
|
69
69
|
},
|
|
70
70
|
{
|
|
71
71
|
"path": "./src/utils/index.ts",
|