@zayne-labs/callapi 1.7.14 → 1.7.16

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.
@@ -315,7 +315,7 @@ type CallApiResultSuccessVariant<TData> = {
315
315
  response: Response;
316
316
  };
317
317
  type PossibleJavaScriptError = UnmaskType<{
318
- errorData: DOMException | Error | SyntaxError | TypeError;
318
+ errorData: PossibleJavaScriptError["originalError"];
319
319
  message: string;
320
320
  name: "AbortError" | "Error" | "SyntaxError" | "TimeoutError" | "TypeError" | (`${string}Error` & {});
321
321
  originalError: DOMException | Error | SyntaxError | TypeError;
@@ -1,5 +1,5 @@
1
- import { R as ResultModeUnion, a as ResponseTypeUnion, C as CallApiPlugin, D as DefaultPluginArray, b as CallApiSchemas, I as InferSchemaResult, c as CallApiConfig, d as CallApiResult, e as DefaultDataType, f as DefaultThrowOnError, g as DefaultMoreOptions, B as BaseCallApiConfig, h as CallApiParameters } from './common-UwnX74fm.js';
2
- export { z as BaseCallApiExtraOptions, A as CallApiExtraOptions, F as CallApiRequestOptions, G as CallApiRequestOptionsForHooks, o as CallApiResultErrorVariant, p as CallApiResultSuccessVariant, J as CombinedCallApiExtraOptions, E as ErrorContext, H as HTTPError, q as Hooks, r as HooksOrHooksArray, j as PluginHooks, k as PluginHooksWithMoreOptions, P as PluginInitContext, m as PossibleHTTPError, n as PossibleJavaScriptError, K as Register, s as RequestContext, t as RequestErrorContext, u as RequestStreamContext, v as ResponseContext, w as ResponseErrorContext, x as ResponseStreamContext, l as RetryOptions, S as SharedHookContext, y as SuccessContext, i as definePlugin } from './common-UwnX74fm.js';
1
+ import { R as ResultModeUnion, a as ResponseTypeUnion, C as CallApiPlugin, D as DefaultPluginArray, b as CallApiSchemas, I as InferSchemaResult, c as CallApiConfig, d as CallApiResult, e as DefaultDataType, f as DefaultThrowOnError, g as DefaultMoreOptions, B as BaseCallApiConfig, h as CallApiParameters } from './common-CWVY4h_f.js';
2
+ export { z as BaseCallApiExtraOptions, A as CallApiExtraOptions, F as CallApiRequestOptions, G as CallApiRequestOptionsForHooks, o as CallApiResultErrorVariant, p as CallApiResultSuccessVariant, J as CombinedCallApiExtraOptions, E as ErrorContext, H as HTTPError, q as Hooks, r as HooksOrHooksArray, j as PluginHooks, k as PluginHooksWithMoreOptions, P as PluginInitContext, m as PossibleHTTPError, n as PossibleJavaScriptError, K as Register, s as RequestContext, t as RequestErrorContext, u as RequestStreamContext, v as ResponseContext, w as ResponseErrorContext, x as ResponseStreamContext, l as RetryOptions, S as SharedHookContext, y as SuccessContext, i as definePlugin } from './common-CWVY4h_f.js';
3
3
 
4
4
  declare const createFetchClient: <TBaseData = DefaultDataType, TBaseErrorData = DefaultDataType, TBaseResultMode extends ResultModeUnion = ResultModeUnion, TBaseThrowOnError extends boolean = DefaultThrowOnError, TBaseResponseType extends ResponseTypeUnion = ResponseTypeUnion, TBasePluginArray extends CallApiPlugin[] = DefaultPluginArray, TBaseSchemas extends CallApiSchemas = DefaultMoreOptions>(initBaseConfig?: BaseCallApiConfig<TBaseData, TBaseErrorData, TBaseResultMode, TBaseThrowOnError, TBaseResponseType, TBasePluginArray, TBaseSchemas>) => <TData = InferSchemaResult<TBaseSchemas["data"], TBaseData>, TErrorData = InferSchemaResult<TBaseSchemas["errorData"], TBaseErrorData>, TResultMode extends ResultModeUnion = TBaseResultMode, TThrowOnError extends boolean = TBaseThrowOnError, TResponseType extends ResponseTypeUnion = TBaseResponseType, TPluginArray extends CallApiPlugin[] = TBasePluginArray, TSchemas extends CallApiSchemas = TBaseSchemas>(initURL: InferSchemaResult<TSchemas["initURL"], string | URL>, config?: CallApiConfig<TData, TErrorData, TResultMode, TThrowOnError, TResponseType, TPluginArray, TSchemas> | undefined) => CallApiResult<InferSchemaResult<TSchemas["data"], TData>, InferSchemaResult<TSchemas["errorData"], TErrorData>, TResultMode, TThrowOnError, TResponseType>;
5
5
  declare const callApi: <TData = unknown, TErrorData = unknown, TResultMode extends ResultModeUnion = ResultModeUnion, TThrowOnError extends boolean = boolean, TResponseType extends ResponseTypeUnion = ResponseTypeUnion, TPluginArray extends CallApiPlugin[] = DefaultPluginArray, TSchemas extends CallApiSchemas = {}>(initURL: InferSchemaResult<TSchemas["initURL"], string | URL>, config?: CallApiConfig<TData, TErrorData, TResultMode, TThrowOnError, TResponseType, TPluginArray, TSchemas> | undefined) => CallApiResult<InferSchemaResult<TSchemas["data"], TData>, InferSchemaResult<TSchemas["errorData"], TErrorData>, TResultMode, TThrowOnError, TResponseType>;
package/dist/esm/index.js CHANGED
@@ -22,6 +22,15 @@ var resolveResponseData = (response, responseType, parser) => {
22
22
  }
23
23
  return RESPONSE_TYPE_LOOKUP[selectedResponseType]();
24
24
  };
25
+ var getResultModeMap = (details) => {
26
+ const resultModeMap = {
27
+ all: () => details,
28
+ allWithException: () => resultModeMap.all(),
29
+ onlySuccess: () => details.data,
30
+ onlySuccessWithException: () => resultModeMap.onlySuccess()
31
+ };
32
+ return resultModeMap;
33
+ };
25
34
  var resolveSuccessResult = (data, info) => {
26
35
  const { response, resultMode } = info;
27
36
  const details = {
@@ -29,13 +38,8 @@ var resolveSuccessResult = (data, info) => {
29
38
  error: null,
30
39
  response
31
40
  };
32
- const resultModeMap = {
33
- all: details,
34
- allWithException: details,
35
- onlySuccess: details.data,
36
- onlySuccessWithException: details.data
37
- };
38
- const successResult = resultModeMap[resultMode ?? "all"];
41
+ const resultModeMap = getResultModeMap(details);
42
+ const successResult = resultModeMap[resultMode ?? "all"]();
39
43
  return successResult;
40
44
  };
41
45
  var resolveErrorResult = (error, info) => {
@@ -64,13 +68,8 @@ var resolveErrorResult = (error, info) => {
64
68
  response: cloneResponse ? response.clone() : response
65
69
  };
66
70
  }
67
- const resultModeMap = {
68
- all: details,
69
- allWithException: details,
70
- onlySuccess: details.data,
71
- onlySuccessWithException: details.data
72
- };
73
- const errorResult = resultModeMap[resultMode ?? "all"];
71
+ const resultModeMap = getResultModeMap(details);
72
+ const errorResult = resultModeMap[resultMode ?? "all"]();
74
73
  return errorResult;
75
74
  };
76
75
  var getCustomizedErrorResult = (errorResult, customErrorInfo) => {
@@ -115,24 +114,21 @@ var composeTwoHooks = (hooks, mergedHooksExecutionMode) => {
115
114
  };
116
115
  return mergedHook;
117
116
  };
118
- var executeHooksInTryBlock = async (...hookResults) => {
119
- await Promise.all(hookResults);
117
+ var executeHooksInTryBlock = async (...hookResultsOrPromise) => {
118
+ await Promise.all(hookResultsOrPromise);
120
119
  };
121
- var createExecuteHooksFn = (info) => {
122
- const { errorInfo, shouldThrowOnError } = info;
123
- const executeHooksInCatchBlock = async (...hookResults) => {
124
- try {
125
- await Promise.all(hookResults);
126
- return null;
127
- } catch (hookError) {
128
- const hookErrorResult = resolveErrorResult(hookError, errorInfo);
129
- if (shouldThrowOnError) {
130
- throw hookError;
131
- }
132
- return hookErrorResult;
120
+ var executeHooksInCatchBlock = async (hookResultsOrPromise, hookInfo) => {
121
+ const { errorInfo, shouldThrowOnError } = hookInfo;
122
+ try {
123
+ await Promise.all(hookResultsOrPromise);
124
+ return null;
125
+ } catch (hookError) {
126
+ const hookErrorResult = resolveErrorResult(hookError, errorInfo);
127
+ if (shouldThrowOnError) {
128
+ throw hookError;
133
129
  }
134
- };
135
- return executeHooksInCatchBlock;
130
+ return hookErrorResult;
131
+ }
136
132
  };
137
133
 
138
134
  // src/stream.ts
@@ -631,7 +627,7 @@ var createFetchClient = (initBaseConfig = {}) => {
631
627
  options.onSuccess?.(successContext),
632
628
  options.onResponse?.({ ...successContext, error: null })
633
629
  );
634
- const successResult = await resolveSuccessResult(successContext.data, {
630
+ const successResult = resolveSuccessResult(successContext.data, {
635
631
  response: successContext.response,
636
632
  resultMode: options.resultMode
637
633
  });
@@ -652,7 +648,10 @@ var createFetchClient = (initBaseConfig = {}) => {
652
648
  response: generalErrorResult?.response
653
649
  };
654
650
  const shouldThrowOnError = isFunction(options.throwOnError) ? options.throwOnError(errorContext) : options.throwOnError;
655
- const executeHooksInCatchBlock = createExecuteHooksFn({ errorInfo, shouldThrowOnError });
651
+ const hookInfo = {
652
+ errorInfo,
653
+ shouldThrowOnError
654
+ };
656
655
  const handleRetryOrGetErrorResult = async () => {
657
656
  const { currentAttemptCount, getDelay, shouldAttemptRetry } = createRetryStrategy(errorContext);
658
657
  const shouldRetry = !combinedSignal.aborted && await shouldAttemptRetry();
@@ -661,7 +660,10 @@ var createFetchClient = (initBaseConfig = {}) => {
661
660
  ...errorContext,
662
661
  retryAttemptCount: currentAttemptCount
663
662
  };
664
- const hookError2 = await executeHooksInCatchBlock(options.onRetry?.(retryContext));
663
+ const hookError2 = await executeHooksInCatchBlock(
664
+ [options.onRetry?.(retryContext)],
665
+ hookInfo
666
+ );
665
667
  if (hookError2) {
666
668
  return hookError2;
667
669
  }
@@ -680,9 +682,12 @@ var createFetchClient = (initBaseConfig = {}) => {
680
682
  };
681
683
  if (isHTTPErrorInstance(error)) {
682
684
  const hookError2 = await executeHooksInCatchBlock(
683
- options.onResponseError?.(errorContext),
684
- options.onError?.(errorContext),
685
- options.onResponse?.({ ...errorContext, data: null })
685
+ [
686
+ options.onResponseError?.(errorContext),
687
+ options.onError?.(errorContext),
688
+ options.onResponse?.({ ...errorContext, data: null })
689
+ ],
690
+ hookInfo
686
691
  );
687
692
  if (hookError2) {
688
693
  return hookError2;
@@ -698,10 +703,8 @@ var createFetchClient = (initBaseConfig = {}) => {
698
703
  !shouldThrowOnError && console.error(`${error.name}:`, timeoutMessage);
699
704
  }
700
705
  const hookError = await executeHooksInCatchBlock(
701
- // == At this point only the request errors exist, so the request error hook is called
702
- options.onRequestError?.(errorContext),
703
- // == Also call the onError hook
704
- options.onError?.(errorContext)
706
+ [options.onRequestError?.(errorContext), options.onError?.(errorContext)],
707
+ hookInfo
705
708
  );
706
709
  if (hookError) {
707
710
  return hookError;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/result.ts","../../src/hooks.ts","../../src/stream.ts","../../src/dedupe.ts","../../src/plugins.ts","../../src/retry.ts","../../src/url.ts","../../src/validation.ts","../../src/createFetchClient.ts","../../src/defineParameters.ts"],"names":["callApi","hookError"],"mappings":"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","file":"index.js","sourcesContent":["import { commonDefaults, responseDefaults } from \"./constants/default-options\";\nimport type { HTTPError } from \"./error\";\nimport type { CallApiExtraOptions } from \"./types\";\nimport type { DefaultDataType } from \"./types/default-types\";\nimport { isHTTPErrorInstance } from \"./utils/guards\";\nimport type { Awaitable, Prettify, UnmaskType } 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\tconst text = await response.text();\n\t\treturn parser(text) as 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 | null;\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\tTComputedResponseTypeMap extends ResponseTypeMap<TResponse> = ResponseTypeMap<TResponse>,\n> = null extends TResponseType\n\t? TComputedResponseTypeMap[\"json\"]\n\t: TResponseType extends NonNullable<ResponseTypeUnion>\n\t\t? TComputedResponseTypeMap[TResponseType]\n\t\t: never;\n\nexport const resolveResponseData = <TResponse>(\n\tresponse: Response,\n\tresponseType?: ResponseTypeUnion,\n\tparser?: Parser\n) => {\n\tconst selectedParser = parser ?? responseDefaults.responseParser;\n\tconst selectedResponseType = responseType ?? responseDefaults.responseType;\n\n\tconst RESPONSE_TYPE_LOOKUP = getResponseType<TResponse>(response, selectedParser);\n\n\tif (!Object.hasOwn(RESPONSE_TYPE_LOOKUP, selectedResponseType)) {\n\t\tthrow new Error(`Invalid response type: ${responseType}`);\n\t}\n\n\treturn RESPONSE_TYPE_LOOKUP[selectedResponseType]();\n};\n\nexport type CallApiResultSuccessVariant<TData> = {\n\tdata: TData;\n\terror: null;\n\tresponse: Response;\n};\n\nexport type PossibleJavaScriptError = UnmaskType<{\n\terrorData: DOMException | Error | SyntaxError | TypeError;\n\tmessage: string;\n\tname: \"AbortError\" | \"Error\" | \"SyntaxError\" | \"TimeoutError\" | \"TypeError\" | (`${string}Error` & {});\n\toriginalError: DOMException | Error | SyntaxError | TypeError;\n}>;\n\nexport type PossibleHTTPError<TErrorData> = Prettify<\n\tUnmaskType<{\n\t\terrorData: TErrorData;\n\t\tmessage: string;\n\t\tname: \"HTTPError\";\n\t\toriginalError: HTTPError;\n\t}>\n>;\n\nexport type CallApiResultErrorVariant<TErrorData> =\n\t| {\n\t\t\tdata: null;\n\t\t\terror: PossibleHTTPError<TErrorData>;\n\t\t\tresponse: Response;\n\t }\n\t| {\n\t\t\tdata: null;\n\t\t\terror: PossibleJavaScriptError;\n\t\t\tresponse: null;\n\t };\n\nexport type ResultModeMap<\n\tTData = DefaultDataType,\n\tTErrorData = DefaultDataType,\n\tTResponseType extends ResponseTypeUnion = ResponseTypeUnion,\n\tTComputedData = GetResponseType<TData, TResponseType>,\n\tTComputedErrorData = GetResponseType<TErrorData, TResponseType>,\n> = UnmaskType<{\n\t/* eslint-disable perfectionist/sort-union-types -- I need the first one to be first */\n\tall: CallApiResultSuccessVariant<TComputedData> | CallApiResultErrorVariant<TComputedErrorData>;\n\n\tallWithException: CallApiResultSuccessVariant<TComputedData>;\n\n\tonlySuccess:\n\t\t| CallApiResultErrorVariant<TComputedErrorData>[\"data\"]\n\t\t| CallApiResultSuccessVariant<TComputedData>[\"data\"];\n\n\tonlySuccessWithException: CallApiResultSuccessVariant<TComputedData>[\"data\"];\n\t/* eslint-enable perfectionist/sort-union-types -- I need the first one to be first */\n}>;\n\nexport type ResultModeUnion = keyof ResultModeMap | null;\n\nexport type GetCallApiResult<\n\tTData,\n\tTErrorData,\n\tTResultMode extends ResultModeUnion,\n\tTThrowOnError extends boolean,\n\tTResponseType extends ResponseTypeUnion,\n> = TErrorData extends false | undefined\n\t? ResultModeMap<TData, TErrorData, TResponseType>[\"onlySuccessWithException\"]\n\t: null extends TResultMode\n\t\t? TThrowOnError extends true\n\t\t\t? ResultModeMap<TData, TErrorData, TResponseType>[\"allWithException\"]\n\t\t\t: ResultModeMap<TData, TErrorData, TResponseType>[\"all\"]\n\t\t: TResultMode extends NonNullable<ResultModeUnion>\n\t\t\t? ResultModeMap<TData, TErrorData, TResponseType>[TResultMode]\n\t\t\t: never;\n\ntype SuccessInfo = {\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 = (data: unknown, info: SuccessInfo) => {\n\tconst { response, resultMode } = info;\n\n\tconst details = {\n\t\tdata,\n\t\terror: null,\n\t\tresponse,\n\t} satisfies CallApiResultSuccessVariant<unknown>;\n\n\tconst resultModeMap = {\n\t\tall: details,\n\t\tallWithException: details,\n\t\tonlySuccess: details.data,\n\t\tonlySuccessWithException: details.data,\n\t} satisfies ResultModeMap;\n\n\tconst successResult = resultModeMap[resultMode ?? \"all\"];\n\n\treturn successResult;\n};\n\n// export const resolveErrorResultAndContextForHooks = (info: ErrorInfo) => {\n// \tconst { baseConfig, config, error, message: customErrorMessage, options, request } = info;\n\n// \tconst errorContext = {\n// \t\tbaseConfig,\n// \t\tconfig,\n// \t\terror: errorResult?.error as never,\n// \t\toptions,\n// \t\trequest,\n// \t\tresponse: errorResult?.response as never,\n// \t} satisfies ErrorContext<unknown>;\n\n// \tconst shouldThrowOnError = isFunction(options.throwOnError)\n// \t\t? options.throwOnError(errorContext)\n// \t\t: options.throwOnError;\n\n// \tconst executeHooksInCatchBlock = async (...hookResults: Array<Awaitable<unknown>>) => {\n// \t\ttry {\n// \t\t\tawait Promise.all(hookResults);\n\n// \t\t\treturn null;\n// \t\t} catch (hookError) {\n// \t\t\tif (shouldThrowOnError) {\n// \t\t\t\tthrow hookError;\n// \t\t\t}\n\n// \t\t\tconst { errorResult: hookErrorResult } = resolveErrorResult({ ...info, error: hookError });\n\n// \t\t\treturn hookErrorResult;\n// \t\t}\n// \t};\n\n// \treturn { errorContext, errorResult, executeHooksInCatchBlock, shouldThrowOnError };\n// };\n\nexport type ErrorInfo = {\n\tcloneResponse: CallApiExtraOptions[\"cloneResponse\"];\n\tdefaultErrorMessage: CallApiExtraOptions[\"defaultErrorMessage\"];\n\tmessage?: string;\n\tresultMode: CallApiExtraOptions[\"resultMode\"];\n};\n\ntype ErrorResult = CallApiResultErrorVariant<unknown> | null;\n\nexport const resolveErrorResult = (error: unknown, info: ErrorInfo): ErrorResult => {\n\tconst { cloneResponse, defaultErrorMessage, message: customErrorMessage, resultMode } = info;\n\n\tlet details = {\n\t\tdata: null,\n\t\terror: {\n\t\t\terrorData: error as Error,\n\t\t\tmessage: customErrorMessage ?? (error as Error).message,\n\t\t\tname: (error as Error).name as PossibleJavaScriptError[\"name\"],\n\t\t\toriginalError: error as Error,\n\t\t},\n\t\tresponse: null,\n\t} satisfies CallApiResultErrorVariant<unknown> as CallApiResultErrorVariant<unknown>;\n\n\tif (isHTTPErrorInstance<never>(error)) {\n\t\tconst selectedDefaultErrorMessage = defaultErrorMessage ?? commonDefaults.defaultErrorMessage;\n\n\t\tconst { errorData, message = selectedDefaultErrorMessage, name, response } = error;\n\n\t\tdetails = {\n\t\t\tdata: null,\n\t\t\terror: {\n\t\t\t\terrorData,\n\t\t\t\tmessage,\n\t\t\t\tname,\n\t\t\t\toriginalError: error,\n\t\t\t},\n\t\t\tresponse: cloneResponse ? response.clone() : response,\n\t\t};\n\t}\n\n\tconst resultModeMap = {\n\t\tall: details,\n\t\tallWithException: details as never,\n\t\tonlySuccess: details.data,\n\t\tonlySuccessWithException: details.data,\n\t} satisfies ResultModeMap;\n\n\tconst errorResult = resultModeMap[resultMode ?? \"all\"];\n\n\treturn errorResult;\n};\n\nexport const getCustomizedErrorResult = (\n\terrorResult: ErrorResult,\n\tcustomErrorInfo: { message: string }\n): ErrorResult => {\n\tif (!errorResult) {\n\t\treturn null;\n\t}\n\n\tconst { message = errorResult.error.message } = customErrorInfo;\n\n\treturn {\n\t\t...errorResult,\n\t\terror: {\n\t\t\t...errorResult.error,\n\t\t\tmessage,\n\t\t} satisfies NonNullable<ErrorResult>[\"error\"] as never,\n\t};\n};\n","import {\n\ttype ErrorInfo,\n\ttype PossibleHTTPError,\n\ttype PossibleJavaScriptError,\n\tresolveErrorResult,\n} from \"./result\";\nimport type { StreamProgressEvent } from \"./stream\";\nimport type {\n\tBaseCallApiExtraOptions,\n\tCallApiExtraOptions,\n\tCallApiRequestOptions,\n\tCallApiRequestOptionsForHooks,\n\tCombinedCallApiExtraOptions,\n} from \"./types/common\";\nimport type { DefaultDataType, DefaultMoreOptions } from \"./types/default-types\";\nimport type { AnyFunction, Awaitable, Prettify, UnmaskType } from \"./utils/type-helpers\";\n\nexport type WithMoreOptions<TMoreOptions = DefaultMoreOptions> = {\n\toptions: CombinedCallApiExtraOptions & Partial<TMoreOptions>;\n};\n\nexport type Hooks<\n\tTData = DefaultDataType,\n\tTErrorData = DefaultDataType,\n\tTMoreOptions = DefaultMoreOptions,\n> = {\n\t/**\n\t * Hook that will be called when any error occurs within the request/response lifecycle, regardless of whether the error is from the api or not.\n\t * It is basically a combination of `onRequestError` and `onResponseError` hooks\n\t */\n\tonError?: (context: ErrorContext<TErrorData> & WithMoreOptions<TMoreOptions>) => Awaitable<unknown>;\n\n\t/**\n\t * Hook that will be called just before the request is made, allowing for modifications or additional operations.\n\t */\n\tonRequest?: (context: Prettify<RequestContext & WithMoreOptions<TMoreOptions>>) => Awaitable<unknown>;\n\n\t/**\n\t * Hook that will be called when an error occurs during the fetch request.\n\t */\n\tonRequestError?: (\n\t\tcontext: Prettify<RequestErrorContext & WithMoreOptions<TMoreOptions>>\n\t) => Awaitable<unknown>;\n\n\t/**\n\t * Hook that will be called when upload stream progress is tracked\n\t */\n\tonRequestStream?: (\n\t\tcontext: Prettify<RequestStreamContext & WithMoreOptions<TMoreOptions>>\n\t) => Awaitable<unknown>;\n\n\t/**\n\t * Hook that will be called when any response is received from the api, whether successful or not\n\t */\n\tonResponse?: (\n\t\tcontext: ResponseContext<TData, TErrorData> & WithMoreOptions<TMoreOptions>\n\t) => Awaitable<unknown>;\n\n\t/**\n\t * Hook that will be called when an error response is received from the api.\n\t */\n\tonResponseError?: (\n\t\tcontext: Prettify<ResponseErrorContext<TErrorData> & WithMoreOptions<TMoreOptions>>\n\t) => Awaitable<unknown>;\n\n\t/**\n\t * Hook that will be called when download stream progress is tracked\n\t */\n\tonResponseStream?: (\n\t\tcontext: Prettify<ResponseStreamContext & WithMoreOptions<TMoreOptions>>\n\t) => Awaitable<unknown>;\n\n\t/**\n\t * Hook that will be called when a request is retried.\n\t */\n\tonRetry?: (response: RetryContext<TErrorData> & WithMoreOptions<TMoreOptions>) => Awaitable<unknown>;\n\n\t/**\n\t * Hook that will be called when a successful response is received from the api.\n\t */\n\tonSuccess?: (\n\t\tcontext: Prettify<SuccessContext<TData> & WithMoreOptions<TMoreOptions>>\n\t) => Awaitable<unknown>;\n};\n\nexport type HooksOrHooksArray<\n\tTData = DefaultDataType,\n\tTErrorData = DefaultDataType,\n\tTMoreOptions = DefaultMoreOptions,\n> = {\n\t[Key in keyof Hooks<TData, TErrorData, TMoreOptions>]:\n\t\t| Hooks<TData, TErrorData, TMoreOptions>[Key]\n\t\t// eslint-disable-next-line perfectionist/sort-union-types -- I need arrays to be last\n\t\t| Array<Hooks<TData, TErrorData, TMoreOptions>[Key]>;\n};\n\nexport type SharedHookContext<TMoreOptions = DefaultMoreOptions> = {\n\t/**\n\t * Config object passed to createFetchClient\n\t */\n\tbaseConfig: BaseCallApiExtraOptions & CallApiRequestOptions;\n\t/**\n\t * Config object passed to the callApi instance\n\t */\n\tconfig: CallApiExtraOptions & CallApiRequestOptions;\n\t/**\n\t * Merged options consisting of extra options from createFetchClient, the callApi instance and default options.\n\t *\n\t */\n\toptions: CombinedCallApiExtraOptions & Partial<TMoreOptions>;\n\t/**\n\t * Merged request consisting of request options from createFetchClient, the callApi instance and default request options.\n\t */\n\trequest: CallApiRequestOptionsForHooks;\n};\n\nexport type RequestContext = UnmaskType<SharedHookContext>;\n\nexport type ResponseContext<TData, TErrorData> = UnmaskType<\n\t| Prettify<\n\t\t\tSharedHookContext & {\n\t\t\t\tdata: TData;\n\t\t\t\terror: null;\n\t\t\t\tresponse: Response;\n\t\t\t}\n\t >\n\t// eslint-disable-next-line perfectionist/sort-union-types -- I need the first one to be first\n\t| Prettify<\n\t\t\tSharedHookContext & {\n\t\t\t\tdata: null;\n\t\t\t\terror: PossibleHTTPError<TErrorData>;\n\t\t\t\tresponse: Response;\n\t\t\t}\n\t >\n>;\n\nexport type SuccessContext<TData> = UnmaskType<\n\tPrettify<\n\t\tSharedHookContext & {\n\t\t\tdata: TData;\n\t\t\tresponse: Response;\n\t\t}\n\t>\n>;\n\nexport type RequestErrorContext = UnmaskType<\n\tPrettify<\n\t\tSharedHookContext & {\n\t\t\terror: PossibleJavaScriptError;\n\t\t\tresponse: null;\n\t\t}\n\t>\n>;\n\nexport type ResponseErrorContext<TErrorData> = UnmaskType<\n\tPrettify<\n\t\tSharedHookContext & {\n\t\t\terror: PossibleHTTPError<TErrorData>;\n\t\t\tresponse: Response;\n\t\t}\n\t>\n>;\n\nexport type RetryContext<TErrorData> = UnmaskType<\n\tPrettify<ErrorContext<TErrorData> & { retryAttemptCount: number }>\n>;\n\nexport type ErrorContext<TErrorData> = UnmaskType<\n\t| Prettify<\n\t\t\tSharedHookContext & {\n\t\t\t\terror: PossibleHTTPError<TErrorData>;\n\t\t\t\tresponse: Response;\n\t\t\t}\n\t >\n\t| Prettify<\n\t\t\tSharedHookContext & {\n\t\t\t\terror: PossibleJavaScriptError;\n\t\t\t\tresponse: null;\n\t\t\t}\n\t >\n>;\n\nexport type RequestStreamContext = UnmaskType<\n\tPrettify<\n\t\tSharedHookContext & {\n\t\t\tevent: StreamProgressEvent;\n\t\t\trequestInstance: Request;\n\t\t}\n\t>\n>;\n\nexport type ResponseStreamContext = UnmaskType<\n\tPrettify<\n\t\tSharedHookContext & {\n\t\t\tevent: StreamProgressEvent;\n\t\t\tresponse: Response;\n\t\t}\n\t>\n>;\n\ntype HookRegistries = {\n\t[Key in keyof Hooks]: Set<Hooks[Key]>;\n};\n\nexport const hookRegistries = {\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 const composeTwoHooks = (\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\nexport const executeHooksInTryBlock = async (...hookResults: Array<Awaitable<unknown>>) => {\n\tawait Promise.all(hookResults);\n};\n\ntype Info = {\n\terrorInfo: ErrorInfo;\n\tshouldThrowOnError: boolean | undefined;\n};\n\nexport const createExecuteHooksFn = (info: Info) => {\n\tconst { errorInfo, shouldThrowOnError } = info;\n\n\tconst executeHooksInCatchBlock = async (...hookResults: Array<Awaitable<unknown>>) => {\n\t\ttry {\n\t\t\tawait Promise.all(hookResults);\n\n\t\t\treturn null;\n\t\t} catch (hookError) {\n\t\t\tconst hookErrorResult = resolveErrorResult(hookError, errorInfo);\n\n\t\t\tif (shouldThrowOnError) {\n\t\t\t\tthrow hookError;\n\t\t\t}\n\n\t\t\treturn hookErrorResult;\n\t\t}\n\t};\n\n\treturn executeHooksInCatchBlock;\n};\n","import { type SharedHookContext, executeHooksInTryBlock } from \"./hooks\";\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\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 ToStreamableRequestContext = SharedHookContext & { requestInstance: Request };\n\nexport const toStreamableRequest = async (context: ToStreamableRequestContext) => {\n\tconst { baseConfig, config, 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.forceCalculateStreamSize)\n\t\t? options.forceCalculateStreamSize.request\n\t\t: options.forceCalculateStreamSize;\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 executeHooksInTryBlock(\n\t\toptions.onRequestStream({\n\t\t\tbaseConfig,\n\t\t\tconfig,\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 executeHooksInTryBlock(\n\t\t\t\t\toptions.onRequestStream?.({\n\t\t\t\t\t\tbaseConfig,\n\t\t\t\t\t\tconfig,\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 = SharedHookContext & { response: Response };\nexport const toStreamableResponse = async (context: StreamableResponseContext): Promise<Response> => {\n\tconst { baseConfig, config, 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.forceCalculateStreamSize)\n\t\t? options.forceCalculateStreamSize.response\n\t\t: options.forceCalculateStreamSize;\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 executeHooksInTryBlock(\n\t\toptions.onResponseStream({\n\t\t\tbaseConfig,\n\t\t\tconfig,\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 executeHooksInTryBlock(\n\t\t\t\t\toptions.onResponseStream?.({\n\t\t\t\t\t\tbaseConfig,\n\t\t\t\t\t\tconfig,\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 { dedupeDefaults, requestOptionDefaults } from \"./constants/default-options\";\nimport type { SharedHookContext } from \"./hooks\";\nimport { toStreamableRequest, toStreamableResponse } from \"./stream\";\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 = SharedHookContext & {\n\t$RequestInfoCache: RequestInfoCache;\n\tnewFetchController: AbortController;\n};\n\nexport const createDedupeStrategy = async (context: DedupeContext) => {\n\tconst { $RequestInfoCache, baseConfig, config, newFetchController, options, request } = context;\n\n\tconst dedupeStrategy = options.dedupeStrategy ?? dedupeDefaults.dedupeStrategy;\n\n\tconst generateDedupeKey = () => {\n\t\tconst shouldHaveDedupeKey = dedupeStrategy === \"cancel\" || 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 && 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 && 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\tawait toStreamableRequest({\n\t\t\tbaseConfig,\n\t\t\tconfig,\n\t\t\toptions,\n\t\t\trequest,\n\t\t\trequestInstance: requestInstance.clone(),\n\t\t});\n\n\t\tconst getFetchApiPromise = () => {\n\t\t\tif (isReadableStream(request.body)) {\n\t\t\t\treturn fetchApi(requestInstance.clone());\n\t\t\t}\n\n\t\t\tconst method = request.method ?? requestOptionDefaults.method;\n\n\t\t\tconst modifiedRequest = { ...request, method } as RequestInit;\n\n\t\t\treturn fetchApi(options.fullURL as NonNullable<typeof options.fullURL>, modifiedRequest);\n\t\t};\n\n\t\tconst responsePromise = shouldUsePromiseFromCache\n\t\t\t? prevRequestInfo.responsePromise\n\t\t\t: getFetchApiPromise();\n\n\t\t$RequestInfoCacheOrNull?.set(dedupeKey, { controller: newFetchController, responsePromise });\n\n\t\tconst streamableResponse = toStreamableResponse({\n\t\t\tbaseConfig,\n\t\t\tconfig,\n\t\t\toptions,\n\t\t\trequest,\n\t\t\tresponse: await responsePromise,\n\t\t});\n\n\t\treturn streamableResponse;\n\t};\n\n\tconst removeDedupeKeyFromCache = () => {\n\t\t$RequestInfoCacheOrNull?.delete(dedupeKey);\n\t};\n\n\treturn {\n\t\tdedupeStrategy,\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 { hookDefaults } from \"./constants/default-options\";\nimport {\n\ttype Hooks,\n\ttype HooksOrHooksArray,\n\ttype SharedHookContext,\n\tcomposeTwoHooks,\n\thookRegistries,\n} from \"./hooks\";\nimport type {\n\tBaseCallApiExtraOptions,\n\tCallApiExtraOptions,\n\tCallApiRequestOptions,\n\tCallApiRequestOptionsForHooks,\n} from \"./types/common\";\nimport type { DefaultMoreOptions } from \"./types/default-types\";\nimport type { InitURL } from \"./url\";\nimport { isArray, isFunction, isPlainObject, isString } from \"./utils/guards\";\nimport type { AnyFunction, Awaitable, Prettify } 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\nexport type InferPluginOptions<\n\tTPluginArray extends CallApiPlugin[],\n\t// TCreateExtraOptions = ReturnType<NonNullable<TPluginArray[number][\"createExtraOptions\"]>>,\n> = UnionToIntersection<\n\tTPluginArray extends Array<infer TPlugin>\n\t\t? TPlugin extends CallApiPlugin\n\t\t\t? TPlugin[\"createExtraOptions\"] extends AnyFunction<infer TResult>\n\t\t\t\t? InferSchemaResult<TResult, TResult>\n\t\t\t\t: NonNullable<unknown>\n\t\t\t: NonNullable<unknown>\n\t\t: NonNullable<unknown>\n>;\n\nexport type PluginInitContext<TMoreOptions = DefaultMoreOptions> = Prettify<\n\tSharedHookContext<TMoreOptions> & { initURL: InitURL | undefined }\n>;\n\nexport type PluginInitResult = Partial<\n\tOmit<PluginInitContext, \"request\"> & { request: CallApiRequestOptions }\n>;\n\nexport type PluginHooksWithMoreOptions<TMoreOptions = DefaultMoreOptions> = HooksOrHooksArray<\n\tnever,\n\tnever,\n\tTMoreOptions\n>;\n\nexport type PluginHooks<\n\tTData = never,\n\tTErrorData = never,\n\tTMoreOptions = DefaultMoreOptions,\n> = HooksOrHooksArray<TData, TErrorData, TMoreOptions>;\n\nexport interface CallApiPlugin {\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?: PluginHooks;\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\nexport type Plugins<TPluginArray extends CallApiPlugin[]> = TPluginArray;\n\nconst resolvePluginArray = (\n\tplugins: CallApiExtraOptions[\"plugins\"] | undefined,\n\tbasePlugins: BaseCallApiExtraOptions[\"plugins\"] | undefined\n) => {\n\tif (!plugins) {\n\t\treturn [];\n\t}\n\n\tif (isFunction(plugins)) {\n\t\treturn plugins({ basePlugins: basePlugins ?? [] });\n\t}\n\n\treturn plugins;\n};\n\nexport const initializePlugins = async (context: PluginInitContext) => {\n\tconst { baseConfig, config, initURL, options, request } = context;\n\n\tconst clonedHookRegistries = structuredClone(hookRegistries);\n\n\tconst addMainHooks = () => {\n\t\tfor (const key of Object.keys(clonedHookRegistries) as Array<keyof Hooks>) {\n\t\t\tconst baseHook = baseConfig[key];\n\t\t\tconst instanceHook = config[key];\n\n\t\t\tconst overriddenHook = options[key] as HooksOrHooksArray[typeof key];\n\n\t\t\t// If the base hook is an array and instance hook is defined, we need to compose it with the overridden hook\n\t\t\tconst mainHook =\n\t\t\t\tisArray(baseHook) && Boolean(instanceHook) ? [baseHook, instanceHook].flat() : overriddenHook;\n\n\t\t\tif (!mainHook) continue;\n\n\t\t\tclonedHookRegistries[key].add(mainHook as never);\n\t\t}\n\t};\n\n\tconst addPluginHooks = (pluginHooks: Required<CallApiPlugin>[\"hooks\"]) => {\n\t\tfor (const key of Object.keys(clonedHookRegistries) as Array<keyof Hooks>) {\n\t\t\tconst pluginHook = pluginHooks[key];\n\n\t\t\tif (!pluginHook) continue;\n\n\t\t\tclonedHookRegistries[key].add(pluginHook as never);\n\t\t}\n\t};\n\n\tconst mergedHooksExecutionOrder =\n\t\toptions.mergedHooksExecutionOrder ?? hookDefaults.mergedHooksExecutionOrder;\n\n\tif (mergedHooksExecutionOrder === \"mainHooksBeforePlugins\") {\n\t\taddMainHooks();\n\t}\n\n\tconst resolvedPlugins = resolvePluginArray(options.plugins, baseConfig.plugins);\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,\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 (mergedHooksExecutionOrder === \"mainHooksAfterPlugins\") {\n\t\taddMainHooks();\n\t}\n\n\tconst resolvedHooks: Hooks = {};\n\n\tfor (const [key, hookRegistry] of Object.entries(clonedHookRegistries)) {\n\t\tconst flattenedHookArray = [...hookRegistry].flat();\n\n\t\tconst mergedHooksExecutionMode =\n\t\t\toptions.mergedHooksExecutionMode ?? hookDefaults.mergedHooksExecutionMode;\n\n\t\tconst composedHook = composeTwoHooks(flattenedHookArray, mergedHooksExecutionMode);\n\n\t\tcomposedHook && (resolvedHooks[key as keyof Hooks] = composedHook);\n\t}\n\n\treturn {\n\t\tresolvedHooks,\n\t\tresolvedOptions,\n\t\tresolvedRequestOptions,\n\t\turl: resolvedUrl?.toString(),\n\t};\n};\n","/* eslint-disable ts-eslint/consistent-type-definitions -- I need to use interfaces for the sake of user overrides */\nimport { requestOptionDefaults, retryDefaults } from \"./constants/default-options\";\nimport type { ErrorContext } from \"./hooks\";\nimport type { Method } from \"./types\";\nimport { isFunction, isHTTPError } from \"./utils/guards\";\nimport type { Awaitable } from \"./utils/type-helpers\";\n\ntype RetryCondition<TErrorData> = (context: ErrorContext<TErrorData>) => Awaitable<boolean>;\n\ntype InnerRetryKeys<TErrorData> = Exclude<keyof RetryOptions<TErrorData>, \"~retryAttemptCount\" | \"retry\">;\n\ntype InnerRetryOptions<TErrorData> = {\n\t[Key in InnerRetryKeys<TErrorData> as Key extends `retry${infer TRest}`\n\t\t? Uncapitalize<TRest> extends \"attempts\"\n\t\t\t? never\n\t\t\t: Uncapitalize<TRest>\n\t\t: Key]?: RetryOptions<TErrorData>[Key];\n} & {\n\tattempts: NonNullable<RetryOptions<TErrorData>[\"retryAttempts\"]>;\n};\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 [\"~retryAttemptCount\"]?: number;\n\n\t/**\n\t * All retry options in a single object instead of separate properties\n\t */\n\tretry?: InnerRetryOptions<TErrorData>;\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 | ((currentAttemptCount: number) => 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 */\n\tretryStatusCodes?: number[];\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>(currentAttemptCount: number, options: RetryOptions<TErrorData>) => {\n\tconst retryDelay = options.retryDelay ?? options.retry?.delay;\n\n\tconst resolveRetryDelay =\n\t\t(isFunction(retryDelay) ? retryDelay(currentAttemptCount) : retryDelay) ?? retryDefaults.delay;\n\n\treturn resolveRetryDelay;\n};\n\nconst getExponentialDelay = <TErrorData>(\n\tcurrentAttemptCount: number,\n\toptions: RetryOptions<TErrorData>\n) => {\n\tconst retryDelay = options.retryDelay ?? options.retry?.delay ?? retryDefaults.delay;\n\n\tconst resolvedRetryDelay = Number(\n\t\tisFunction(retryDelay) ? retryDelay(currentAttemptCount) : retryDelay\n\t);\n\n\tconst maxDelay = Number(options.retryMaxDelay ?? options.retry?.maxDelay ?? retryDefaults.maxDelay);\n\n\tconst exponentialDelay = resolvedRetryDelay * 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 currentAttemptCount = options[\"~retryAttemptCount\"] ?? 1;\n\n\tconst retryStrategy = options.retryStrategy ?? options.retry?.strategy ?? retryDefaults.strategy;\n\n\tconst getDelay = () => {\n\t\tswitch (retryStrategy) {\n\t\t\tcase \"exponential\": {\n\t\t\t\treturn getExponentialDelay(currentAttemptCount, options);\n\t\t\t}\n\t\t\tcase \"linear\": {\n\t\t\t\treturn getLinearDelay(currentAttemptCount, options);\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tthrow new Error(`Invalid retry strategy: ${String(retryStrategy)}`);\n\t\t\t}\n\t\t}\n\t};\n\n\tconst shouldAttemptRetry = async () => {\n\t\tconst retryCondition = options.retryCondition ?? options.retry?.condition ?? retryDefaults.condition;\n\n\t\tconst maximumRetryAttempts =\n\t\t\toptions.retryAttempts ?? options.retry?.attempts ?? retryDefaults.attempts;\n\n\t\tconst customRetryCondition = await retryCondition(ctx);\n\n\t\tconst baseShouldRetry = maximumRetryAttempts >= currentAttemptCount && customRetryCondition;\n\n\t\tif (!baseShouldRetry) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// == If error is not an HTTP error, just return true since at this point we know it's a retryable error\n\t\tif (!isHTTPError(ctx.error)) {\n\t\t\treturn true;\n\t\t}\n\n\t\tconst selectedMethodArray = options.retryMethods ?? options.retry?.methods ?? retryDefaults.methods;\n\n\t\tconst retryMethods = new Set(selectedMethodArray);\n\n\t\tconst method = ctx.request.method ?? requestOptionDefaults.method;\n\n\t\tconst includesMethod = Boolean(method) && retryMethods.has(method);\n\n\t\tconst selectedStatusCodeArray = options.retryStatusCodes ?? options.retry?.statusCodes;\n\n\t\tconst retryStatusCodes = selectedStatusCodeArray ? new Set(selectedStatusCodeArray) : null;\n\n\t\tconst includesStatusCodes =\n\t\t\tBoolean(ctx.response?.status) && (retryStatusCodes?.has(ctx.response.status) ?? true);\n\n\t\tconst shouldRetry = includesMethod && includesStatusCodes;\n\n\t\treturn shouldRetry;\n\t};\n\n\treturn {\n\t\tcurrentAttemptCount,\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 */\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","/* eslint-disable ts-eslint/consistent-type-definitions -- I need to use interfaces for the sake of user overrides */\nimport type { Body, GlobalMeta, Headers, Method } from \"./types\";\nimport type { StandardSchemaV1 } from \"./types/standard-schema\";\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 = NonNullable<unknown>> = TSchema extends StandardSchemaV1\n\t? StandardSchemaV1.InferOutput<TSchema>\n\t: TData;\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 { commonDefaults } from \"./constants/default-options\";\nimport { type RequestInfoCache, createDedupeStrategy } from \"./dedupe\";\nimport { HTTPError } from \"./error\";\nimport {\n\ttype ErrorContext,\n\ttype RetryContext,\n\ttype SuccessContext,\n\tcreateExecuteHooksFn,\n\texecuteHooksInTryBlock,\n} from \"./hooks\";\nimport { type CallApiPlugin, initializePlugins } from \"./plugins\";\nimport {\n\ttype ErrorInfo,\n\ttype ResponseTypeUnion,\n\ttype ResultModeUnion,\n\tgetCustomizedErrorResult,\n\tresolveErrorResult,\n\tresolveResponseData,\n\tresolveSuccessResult,\n} from \"./result\";\nimport { createRetryStrategy } from \"./retry\";\nimport type {\n\tBaseCallApiConfig,\n\tBaseCallApiExtraOptions,\n\tCallApiExtraOptions,\n\tCallApiParameters,\n\tCallApiRequestOptions,\n\tCallApiRequestOptionsForHooks,\n\tCallApiResult,\n\tCombinedCallApiExtraOptions,\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\tcreateCombinedSignal,\n\tcreateTimeoutSignal,\n\tgetHeaders,\n\tsplitBaseConfig,\n\tsplitConfig,\n\twaitUntil,\n} from \"./utils/common\";\nimport { isFunction, isHTTPErrorInstance, isSerializable } from \"./utils/guards\";\nimport { type CallApiSchemas, type InferSchemaResult, handleValidation } 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\tinitBaseConfig: 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, initConfig = {}] = parameters;\n\n\t\tconst [fetchOptions, extraOptions] = splitConfig(initConfig);\n\n\t\tconst resolvedBaseConfig = isFunction(initBaseConfig)\n\t\t\t? initBaseConfig({ initURL: initURL.toString(), options: extraOptions, request: fetchOptions })\n\t\t\t: initBaseConfig;\n\n\t\tconst [baseFetchOptions, baseExtraOptions] = splitBaseConfig(resolvedBaseConfig);\n\n\t\t// == Merged Extra Options\n\t\tconst mergedExtraOptions = {\n\t\t\t...baseExtraOptions,\n\t\t\t...(baseExtraOptions.skipAutoMergeFor !== \"all\"\n\t\t\t\t&& baseExtraOptions.skipAutoMergeFor !== \"options\"\n\t\t\t\t&& extraOptions),\n\t\t};\n\n\t\t// == Merged Request Options\n\t\tconst mergedRequestOptions = {\n\t\t\t...baseFetchOptions,\n\t\t\t...(baseExtraOptions.skipAutoMergeFor !== \"all\"\n\t\t\t\t&& baseExtraOptions.skipAutoMergeFor !== \"request\"\n\t\t\t\t&& fetchOptions),\n\t\t} satisfies CallApiRequestOptions;\n\n\t\tconst baseConfig = resolvedBaseConfig as BaseCallApiExtraOptions & CallApiRequestOptions;\n\t\tconst config = initConfig as CallApiExtraOptions & CallApiRequestOptions;\n\n\t\tconst { resolvedHooks, resolvedOptions, resolvedRequestOptions, url } = await initializePlugins({\n\t\t\tbaseConfig,\n\t\t\tconfig,\n\t\t\tinitURL,\n\t\t\toptions: mergedExtraOptions as CombinedCallApiExtraOptions,\n\t\t\trequest: mergedRequestOptions as CallApiRequestOptionsForHooks,\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 bodySerializer = options.bodySerializer ?? commonDefaults.bodySerializer;\n\n\t\tconst request = {\n\t\t\t...resolvedRequestOptions,\n\n\t\t\tbody: isSerializable(resolvedRequestOptions.body)\n\t\t\t\t? bodySerializer(resolvedRequestOptions.body)\n\t\t\t\t: resolvedRequestOptions.body,\n\n\t\t\theaders: await getHeaders({\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 {\n\t\t\tdedupeStrategy,\n\t\t\thandleRequestCancelStrategy,\n\t\t\thandleRequestDeferStrategy,\n\t\t\tremoveDedupeKeyFromCache,\n\t\t} = await createDedupeStrategy({\n\t\t\t$RequestInfoCache,\n\t\t\tbaseConfig,\n\t\t\tconfig,\n\t\t\tnewFetchController,\n\t\t\toptions,\n\t\t\trequest,\n\t\t});\n\n\t\tawait handleRequestCancelStrategy();\n\n\t\ttry {\n\t\t\tawait executeHooksInTryBlock(options.onRequest?.({ baseConfig, config, options, request }));\n\n\t\t\t// == Apply determined headers again after onRequest incase they were modified\n\t\t\trequest.headers = await getHeaders({\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\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\n\t\t\tconst shouldCloneResponse = dedupeStrategy === \"defer\" || options.cloneResponse;\n\n\t\t\tconst schemas = (\n\t\t\t\tisFunction(options.schemas)\n\t\t\t\t\t? options.schemas({ baseSchemas: baseExtraOptions.schemas })\n\t\t\t\t\t: options.schemas\n\t\t\t) as CallApiSchemas | undefined;\n\n\t\t\tconst validators = isFunction(options.validators)\n\t\t\t\t? options.validators({ baseValidators: baseExtraOptions.validators })\n\t\t\t\t: options.validators;\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\t{\n\t\t\t\t\t\tdefaultErrorMessage: options.defaultErrorMessage,\n\t\t\t\t\t\terrorData: validErrorData,\n\t\t\t\t\t\tresponse,\n\t\t\t\t\t},\n\t\t\t\t\t{ cause: validErrorData }\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\tbaseConfig,\n\t\t\t\tconfig,\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 executeHooksInTryBlock(\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\tconst successResult = await resolveSuccessResult(successContext.data, {\n\t\t\t\tresponse: successContext.response,\n\t\t\t\tresultMode: options.resultMode,\n\t\t\t});\n\n\t\t\treturn successResult as never;\n\n\t\t\t// == Exhaustive Error handling\n\t\t} catch (error) {\n\t\t\tconst errorInfo = {\n\t\t\t\tcloneResponse: options.cloneResponse,\n\t\t\t\tdefaultErrorMessage: options.defaultErrorMessage,\n\t\t\t\tresultMode: options.resultMode,\n\t\t\t} satisfies ErrorInfo;\n\n\t\t\tconst generalErrorResult = resolveErrorResult(error, errorInfo);\n\n\t\t\tconst errorContext = {\n\t\t\t\tbaseConfig,\n\t\t\t\tconfig,\n\t\t\t\terror: generalErrorResult?.error as never,\n\t\t\t\toptions,\n\t\t\t\trequest,\n\t\t\t\tresponse: generalErrorResult?.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 executeHooksInCatchBlock = createExecuteHooksFn({ errorInfo, shouldThrowOnError });\n\n\t\t\tconst handleRetryOrGetErrorResult = async () => {\n\t\t\t\tconst { currentAttemptCount, getDelay, shouldAttemptRetry } =\n\t\t\t\t\tcreateRetryStrategy(errorContext);\n\n\t\t\t\tconst shouldRetry = !combinedSignal.aborted && (await shouldAttemptRetry());\n\n\t\t\t\tif (shouldRetry) {\n\t\t\t\t\tconst retryContext = {\n\t\t\t\t\t\t...errorContext,\n\t\t\t\t\t\tretryAttemptCount: currentAttemptCount,\n\t\t\t\t\t} satisfies RetryContext<unknown>;\n\n\t\t\t\t\tconst hookError = await executeHooksInCatchBlock(options.onRetry?.(retryContext));\n\n\t\t\t\t\tif (hookError) {\n\t\t\t\t\t\treturn hookError;\n\t\t\t\t\t}\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\"~retryAttemptCount\": currentAttemptCount + 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 generalErrorResult;\n\t\t\t};\n\n\t\t\tif (isHTTPErrorInstance<TErrorData>(error)) {\n\t\t\t\tconst hookError = await executeHooksInCatchBlock(\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\t// eslint-disable-next-line max-depth -- Allow for now\n\t\t\t\tif (hookError) {\n\t\t\t\t\treturn hookError as never;\n\t\t\t\t}\n\n\t\t\t\treturn (await handleRetryOrGetErrorResult()) as never;\n\t\t\t}\n\n\t\t\tif (error instanceof DOMException && error.name === \"AbortError\") {\n\t\t\t\t!shouldThrowOnError && console.error(`${error.name}:`, error.message);\n\t\t\t}\n\n\t\t\tlet timeoutMessage: string | undefined;\n\n\t\t\tif (error instanceof DOMException && error.name === \"TimeoutError\") {\n\t\t\t\ttimeoutMessage = `Request timed out after ${options.timeout}ms`;\n\n\t\t\t\t!shouldThrowOnError && console.error(`${error.name}:`, timeoutMessage);\n\t\t\t}\n\n\t\t\tconst hookError = await executeHooksInCatchBlock(\n\t\t\t\t// == At this point only the request errors exist, so the request error hook is called\n\t\t\t\toptions.onRequestError?.(errorContext),\n\n\t\t\t\t// == Also call the onError hook\n\t\t\t\toptions.onError?.(errorContext)\n\t\t\t);\n\n\t\t\tif (hookError) {\n\t\t\t\treturn hookError as never;\n\t\t\t}\n\n\t\t\tconst errorResult = await handleRetryOrGetErrorResult();\n\n\t\t\treturn (\n\t\t\t\ttimeoutMessage\n\t\t\t\t\t? getCustomizedErrorResult(errorResult, { message: timeoutMessage })\n\t\t\t\t\t: errorResult\n\t\t\t) as never;\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, ResultModeUnion } from \"./result\";\nimport type { CallApiParameters } 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/result.ts","../../src/hooks.ts","../../src/stream.ts","../../src/dedupe.ts","../../src/plugins.ts","../../src/retry.ts","../../src/url.ts","../../src/validation.ts","../../src/createFetchClient.ts","../../src/defineParameters.ts"],"names":["callApi","hookError"],"mappings":"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","file":"index.js","sourcesContent":["import { commonDefaults, responseDefaults } from \"./constants/default-options\";\nimport type { HTTPError } from \"./error\";\nimport type { CallApiExtraOptions } from \"./types\";\nimport type { DefaultDataType } from \"./types/default-types\";\nimport { isHTTPErrorInstance } from \"./utils/guards\";\nimport type { Awaitable, Prettify, UnmaskType } 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\tconst text = await response.text();\n\t\treturn parser(text) as 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 | null;\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\tTComputedResponseTypeMap extends ResponseTypeMap<TResponse> = ResponseTypeMap<TResponse>,\n> = null extends TResponseType\n\t? TComputedResponseTypeMap[\"json\"]\n\t: TResponseType extends NonNullable<ResponseTypeUnion>\n\t\t? TComputedResponseTypeMap[TResponseType]\n\t\t: never;\n\nexport const resolveResponseData = <TResponse>(\n\tresponse: Response,\n\tresponseType?: ResponseTypeUnion,\n\tparser?: Parser\n) => {\n\tconst selectedParser = parser ?? responseDefaults.responseParser;\n\tconst selectedResponseType = responseType ?? responseDefaults.responseType;\n\n\tconst RESPONSE_TYPE_LOOKUP = getResponseType<TResponse>(response, selectedParser);\n\n\tif (!Object.hasOwn(RESPONSE_TYPE_LOOKUP, selectedResponseType)) {\n\t\tthrow new Error(`Invalid response type: ${responseType}`);\n\t}\n\n\treturn RESPONSE_TYPE_LOOKUP[selectedResponseType]();\n};\n\nexport type CallApiResultSuccessVariant<TData> = {\n\tdata: TData;\n\terror: null;\n\tresponse: Response;\n};\n\nexport type PossibleJavaScriptError = UnmaskType<{\n\terrorData: PossibleJavaScriptError[\"originalError\"];\n\tmessage: string;\n\tname: \"AbortError\" | \"Error\" | \"SyntaxError\" | \"TimeoutError\" | \"TypeError\" | (`${string}Error` & {});\n\toriginalError: DOMException | Error | SyntaxError | TypeError;\n}>;\n\nexport type PossibleHTTPError<TErrorData> = Prettify<\n\tUnmaskType<{\n\t\terrorData: TErrorData;\n\t\tmessage: string;\n\t\tname: \"HTTPError\";\n\t\toriginalError: HTTPError;\n\t}>\n>;\n\nexport type CallApiResultErrorVariant<TErrorData> =\n\t| {\n\t\t\tdata: null;\n\t\t\terror: PossibleHTTPError<TErrorData>;\n\t\t\tresponse: Response;\n\t }\n\t| {\n\t\t\tdata: null;\n\t\t\terror: PossibleJavaScriptError;\n\t\t\tresponse: null;\n\t };\n\nexport type ResultModeMap<\n\tTData = DefaultDataType,\n\tTErrorData = DefaultDataType,\n\tTResponseType extends ResponseTypeUnion = ResponseTypeUnion,\n\tTComputedData = GetResponseType<TData, TResponseType>,\n\tTComputedErrorData = GetResponseType<TErrorData, TResponseType>,\n> = UnmaskType<{\n\t/* eslint-disable perfectionist/sort-union-types -- I need the first one to be first */\n\tall: CallApiResultSuccessVariant<TComputedData> | CallApiResultErrorVariant<TComputedErrorData>;\n\n\tallWithException: CallApiResultSuccessVariant<TComputedData>;\n\n\tonlySuccess:\n\t\t| CallApiResultErrorVariant<TComputedErrorData>[\"data\"]\n\t\t| CallApiResultSuccessVariant<TComputedData>[\"data\"];\n\n\tonlySuccessWithException: CallApiResultSuccessVariant<TComputedData>[\"data\"];\n\t/* eslint-enable perfectionist/sort-union-types -- I need the first one to be first */\n}>;\n\nexport type ResultModeUnion = keyof ResultModeMap | null;\n\nexport type GetCallApiResult<\n\tTData,\n\tTErrorData,\n\tTResultMode extends ResultModeUnion,\n\tTThrowOnError extends boolean,\n\tTResponseType extends ResponseTypeUnion,\n> = TErrorData extends false | undefined\n\t? ResultModeMap<TData, TErrorData, TResponseType>[\"onlySuccessWithException\"]\n\t: null extends TResultMode\n\t\t? TThrowOnError extends true\n\t\t\t? ResultModeMap<TData, TErrorData, TResponseType>[\"allWithException\"]\n\t\t\t: ResultModeMap<TData, TErrorData, TResponseType>[\"all\"]\n\t\t: TResultMode extends NonNullable<ResultModeUnion>\n\t\t\t? ResultModeMap<TData, TErrorData, TResponseType>[TResultMode]\n\t\t\t: never;\n\ntype SuccessInfo = {\n\tresponse: Response;\n\tresultMode: CallApiExtraOptions[\"resultMode\"];\n};\n\ntype LazyResultModeMap = {\n\t[key in keyof ResultModeMap]: () => ResultModeMap[key];\n};\n\nconst getResultModeMap = (\n\tdetails: CallApiResultErrorVariant<unknown> | CallApiResultSuccessVariant<unknown>\n) => {\n\tconst resultModeMap = {\n\t\tall: () => details,\n\t\tallWithException: () => resultModeMap.all() as never,\n\t\tonlySuccess: () => details.data,\n\t\tonlySuccessWithException: () => resultModeMap.onlySuccess(),\n\t} satisfies LazyResultModeMap as LazyResultModeMap;\n\n\treturn resultModeMap;\n};\n\ntype SuccessResult = CallApiResultSuccessVariant<unknown> | null;\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 = (data: unknown, info: SuccessInfo): SuccessResult => {\n\tconst { response, resultMode } = info;\n\n\tconst details = {\n\t\tdata,\n\t\terror: null,\n\t\tresponse,\n\t} satisfies CallApiResultSuccessVariant<unknown>;\n\n\tconst resultModeMap = getResultModeMap(details);\n\n\tconst successResult = resultModeMap[resultMode ?? \"all\"]();\n\n\treturn successResult as SuccessResult;\n};\n\n// export const resolveErrorResultAndContextForHooks = (info: ErrorInfo) => {\n// \tconst { baseConfig, config, error, message: customErrorMessage, options, request } = info;\n\n// \tconst errorContext = {\n// \t\tbaseConfig,\n// \t\tconfig,\n// \t\terror: errorResult?.error as never,\n// \t\toptions,\n// \t\trequest,\n// \t\tresponse: errorResult?.response as never,\n// \t} satisfies ErrorContext<unknown>;\n\n// \tconst shouldThrowOnError = isFunction(options.throwOnError)\n// \t\t? options.throwOnError(errorContext)\n// \t\t: options.throwOnError;\n\n// \tconst executeHooksInCatchBlock = async (...hookResults: Array<Awaitable<unknown>>) => {\n// \t\ttry {\n// \t\t\tawait Promise.all(hookResults);\n\n// \t\t\treturn null;\n// \t\t} catch (hookError) {\n// \t\t\tif (shouldThrowOnError) {\n// \t\t\t\tthrow hookError;\n// \t\t\t}\n\n// \t\t\tconst { errorResult: hookErrorResult } = resolveErrorResult({ ...info, error: hookError });\n\n// \t\t\treturn hookErrorResult;\n// \t\t}\n// \t};\n\n// \treturn { errorContext, errorResult, executeHooksInCatchBlock, shouldThrowOnError };\n// };\n\nexport type ErrorInfo = {\n\tcloneResponse: CallApiExtraOptions[\"cloneResponse\"];\n\tdefaultErrorMessage: CallApiExtraOptions[\"defaultErrorMessage\"];\n\tmessage?: string;\n\tresultMode: CallApiExtraOptions[\"resultMode\"];\n};\n\ntype ErrorResult = CallApiResultErrorVariant<unknown> | null;\n\nexport const resolveErrorResult = (error: unknown, info: ErrorInfo): ErrorResult => {\n\tconst { cloneResponse, defaultErrorMessage, message: customErrorMessage, resultMode } = info;\n\n\tlet details = {\n\t\tdata: null,\n\t\terror: {\n\t\t\terrorData: error as Error,\n\t\t\tmessage: customErrorMessage ?? (error as Error).message,\n\t\t\tname: (error as Error).name as PossibleJavaScriptError[\"name\"],\n\t\t\toriginalError: error as Error,\n\t\t},\n\t\tresponse: null,\n\t} satisfies CallApiResultErrorVariant<unknown> as CallApiResultErrorVariant<unknown>;\n\n\tif (isHTTPErrorInstance<never>(error)) {\n\t\tconst selectedDefaultErrorMessage = defaultErrorMessage ?? commonDefaults.defaultErrorMessage;\n\n\t\tconst { errorData, message = selectedDefaultErrorMessage, name, response } = error;\n\n\t\tdetails = {\n\t\t\tdata: null,\n\t\t\terror: {\n\t\t\t\terrorData,\n\t\t\t\tmessage,\n\t\t\t\tname,\n\t\t\t\toriginalError: error,\n\t\t\t},\n\t\t\tresponse: cloneResponse ? response.clone() : response,\n\t\t};\n\t}\n\n\tconst resultModeMap = getResultModeMap(details);\n\n\tconst errorResult = resultModeMap[resultMode ?? \"all\"]();\n\n\treturn errorResult as ErrorResult;\n};\n\nexport const getCustomizedErrorResult = (\n\terrorResult: ErrorResult,\n\tcustomErrorInfo: { message: string }\n): ErrorResult => {\n\tif (!errorResult) {\n\t\treturn null;\n\t}\n\n\tconst { message = errorResult.error.message } = customErrorInfo;\n\n\treturn {\n\t\t...errorResult,\n\t\terror: {\n\t\t\t...errorResult.error,\n\t\t\tmessage,\n\t\t} satisfies NonNullable<ErrorResult>[\"error\"] as never,\n\t};\n};\n","import {\n\ttype ErrorInfo,\n\ttype PossibleHTTPError,\n\ttype PossibleJavaScriptError,\n\tresolveErrorResult,\n} from \"./result\";\nimport type { StreamProgressEvent } from \"./stream\";\nimport type {\n\tBaseCallApiExtraOptions,\n\tCallApiExtraOptions,\n\tCallApiRequestOptions,\n\tCallApiRequestOptionsForHooks,\n\tCombinedCallApiExtraOptions,\n} from \"./types/common\";\nimport type { DefaultDataType, DefaultMoreOptions } from \"./types/default-types\";\nimport type { AnyFunction, Awaitable, Prettify, UnmaskType } from \"./utils/type-helpers\";\n\nexport type WithMoreOptions<TMoreOptions = DefaultMoreOptions> = {\n\toptions: CombinedCallApiExtraOptions & Partial<TMoreOptions>;\n};\n\nexport type Hooks<\n\tTData = DefaultDataType,\n\tTErrorData = DefaultDataType,\n\tTMoreOptions = DefaultMoreOptions,\n> = {\n\t/**\n\t * Hook that will be called when any error occurs within the request/response lifecycle, regardless of whether the error is from the api or not.\n\t * It is basically a combination of `onRequestError` and `onResponseError` hooks\n\t */\n\tonError?: (context: ErrorContext<TErrorData> & WithMoreOptions<TMoreOptions>) => Awaitable<unknown>;\n\n\t/**\n\t * Hook that will be called just before the request is made, allowing for modifications or additional operations.\n\t */\n\tonRequest?: (context: Prettify<RequestContext & WithMoreOptions<TMoreOptions>>) => Awaitable<unknown>;\n\n\t/**\n\t * Hook that will be called when an error occurs during the fetch request.\n\t */\n\tonRequestError?: (\n\t\tcontext: Prettify<RequestErrorContext & WithMoreOptions<TMoreOptions>>\n\t) => Awaitable<unknown>;\n\n\t/**\n\t * Hook that will be called when upload stream progress is tracked\n\t */\n\tonRequestStream?: (\n\t\tcontext: Prettify<RequestStreamContext & WithMoreOptions<TMoreOptions>>\n\t) => Awaitable<unknown>;\n\n\t/**\n\t * Hook that will be called when any response is received from the api, whether successful or not\n\t */\n\tonResponse?: (\n\t\tcontext: ResponseContext<TData, TErrorData> & WithMoreOptions<TMoreOptions>\n\t) => Awaitable<unknown>;\n\n\t/**\n\t * Hook that will be called when an error response is received from the api.\n\t */\n\tonResponseError?: (\n\t\tcontext: Prettify<ResponseErrorContext<TErrorData> & WithMoreOptions<TMoreOptions>>\n\t) => Awaitable<unknown>;\n\n\t/**\n\t * Hook that will be called when download stream progress is tracked\n\t */\n\tonResponseStream?: (\n\t\tcontext: Prettify<ResponseStreamContext & WithMoreOptions<TMoreOptions>>\n\t) => Awaitable<unknown>;\n\n\t/**\n\t * Hook that will be called when a request is retried.\n\t */\n\tonRetry?: (response: RetryContext<TErrorData> & WithMoreOptions<TMoreOptions>) => Awaitable<unknown>;\n\n\t/**\n\t * Hook that will be called when a successful response is received from the api.\n\t */\n\tonSuccess?: (\n\t\tcontext: Prettify<SuccessContext<TData> & WithMoreOptions<TMoreOptions>>\n\t) => Awaitable<unknown>;\n};\n\nexport type HooksOrHooksArray<\n\tTData = DefaultDataType,\n\tTErrorData = DefaultDataType,\n\tTMoreOptions = DefaultMoreOptions,\n> = {\n\t[Key in keyof Hooks<TData, TErrorData, TMoreOptions>]:\n\t\t| Hooks<TData, TErrorData, TMoreOptions>[Key]\n\t\t// eslint-disable-next-line perfectionist/sort-union-types -- I need arrays to be last\n\t\t| Array<Hooks<TData, TErrorData, TMoreOptions>[Key]>;\n};\n\nexport type SharedHookContext<TMoreOptions = DefaultMoreOptions> = {\n\t/**\n\t * Config object passed to createFetchClient\n\t */\n\tbaseConfig: BaseCallApiExtraOptions & CallApiRequestOptions;\n\t/**\n\t * Config object passed to the callApi instance\n\t */\n\tconfig: CallApiExtraOptions & CallApiRequestOptions;\n\t/**\n\t * Merged options consisting of extra options from createFetchClient, the callApi instance and default options.\n\t *\n\t */\n\toptions: CombinedCallApiExtraOptions & Partial<TMoreOptions>;\n\t/**\n\t * Merged request consisting of request options from createFetchClient, the callApi instance and default request options.\n\t */\n\trequest: CallApiRequestOptionsForHooks;\n};\n\nexport type RequestContext = UnmaskType<SharedHookContext>;\n\nexport type ResponseContext<TData, TErrorData> = UnmaskType<\n\t| Prettify<\n\t\t\tSharedHookContext & {\n\t\t\t\tdata: TData;\n\t\t\t\terror: null;\n\t\t\t\tresponse: Response;\n\t\t\t}\n\t >\n\t// eslint-disable-next-line perfectionist/sort-union-types -- I need the first one to be first\n\t| Prettify<\n\t\t\tSharedHookContext & {\n\t\t\t\tdata: null;\n\t\t\t\terror: PossibleHTTPError<TErrorData>;\n\t\t\t\tresponse: Response;\n\t\t\t}\n\t >\n>;\n\nexport type SuccessContext<TData> = UnmaskType<\n\tPrettify<\n\t\tSharedHookContext & {\n\t\t\tdata: TData;\n\t\t\tresponse: Response;\n\t\t}\n\t>\n>;\n\nexport type RequestErrorContext = UnmaskType<\n\tPrettify<\n\t\tSharedHookContext & {\n\t\t\terror: PossibleJavaScriptError;\n\t\t\tresponse: null;\n\t\t}\n\t>\n>;\n\nexport type ResponseErrorContext<TErrorData> = UnmaskType<\n\tPrettify<\n\t\tSharedHookContext & {\n\t\t\terror: PossibleHTTPError<TErrorData>;\n\t\t\tresponse: Response;\n\t\t}\n\t>\n>;\n\nexport type RetryContext<TErrorData> = UnmaskType<\n\tPrettify<ErrorContext<TErrorData> & { retryAttemptCount: number }>\n>;\n\nexport type ErrorContext<TErrorData> = UnmaskType<\n\t| Prettify<\n\t\t\tSharedHookContext & {\n\t\t\t\terror: PossibleHTTPError<TErrorData>;\n\t\t\t\tresponse: Response;\n\t\t\t}\n\t >\n\t| Prettify<\n\t\t\tSharedHookContext & {\n\t\t\t\terror: PossibleJavaScriptError;\n\t\t\t\tresponse: null;\n\t\t\t}\n\t >\n>;\n\nexport type RequestStreamContext = UnmaskType<\n\tPrettify<\n\t\tSharedHookContext & {\n\t\t\tevent: StreamProgressEvent;\n\t\t\trequestInstance: Request;\n\t\t}\n\t>\n>;\n\nexport type ResponseStreamContext = UnmaskType<\n\tPrettify<\n\t\tSharedHookContext & {\n\t\t\tevent: StreamProgressEvent;\n\t\t\tresponse: Response;\n\t\t}\n\t>\n>;\n\ntype HookRegistries = {\n\t[Key in keyof Hooks]: Set<Hooks[Key]>;\n};\n\nexport const hookRegistries = {\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 const composeTwoHooks = (\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\nexport const executeHooksInTryBlock = async (...hookResultsOrPromise: Array<Awaitable<unknown>>) => {\n\tawait Promise.all(hookResultsOrPromise);\n};\n\nexport type ExecuteHookInfo = {\n\terrorInfo: ErrorInfo;\n\tshouldThrowOnError: boolean | undefined;\n};\n\nexport const executeHooksInCatchBlock = async (\n\thookResultsOrPromise: Array<Awaitable<unknown>>,\n\thookInfo: ExecuteHookInfo\n) => {\n\tconst { errorInfo, shouldThrowOnError } = hookInfo;\n\n\ttry {\n\t\tawait Promise.all(hookResultsOrPromise);\n\n\t\treturn null;\n\t} catch (hookError) {\n\t\tconst hookErrorResult = resolveErrorResult(hookError, errorInfo);\n\n\t\tif (shouldThrowOnError) {\n\t\t\tthrow hookError;\n\t\t}\n\n\t\treturn hookErrorResult;\n\t}\n};\n","import { type SharedHookContext, executeHooksInTryBlock } from \"./hooks\";\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\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 ToStreamableRequestContext = SharedHookContext & { requestInstance: Request };\n\nexport const toStreamableRequest = async (context: ToStreamableRequestContext) => {\n\tconst { baseConfig, config, 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.forceCalculateStreamSize)\n\t\t? options.forceCalculateStreamSize.request\n\t\t: options.forceCalculateStreamSize;\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 executeHooksInTryBlock(\n\t\toptions.onRequestStream({\n\t\t\tbaseConfig,\n\t\t\tconfig,\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 executeHooksInTryBlock(\n\t\t\t\t\toptions.onRequestStream?.({\n\t\t\t\t\t\tbaseConfig,\n\t\t\t\t\t\tconfig,\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 = SharedHookContext & { response: Response };\nexport const toStreamableResponse = async (context: StreamableResponseContext): Promise<Response> => {\n\tconst { baseConfig, config, 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.forceCalculateStreamSize)\n\t\t? options.forceCalculateStreamSize.response\n\t\t: options.forceCalculateStreamSize;\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 executeHooksInTryBlock(\n\t\toptions.onResponseStream({\n\t\t\tbaseConfig,\n\t\t\tconfig,\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 executeHooksInTryBlock(\n\t\t\t\t\toptions.onResponseStream?.({\n\t\t\t\t\t\tbaseConfig,\n\t\t\t\t\t\tconfig,\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 { dedupeDefaults, requestOptionDefaults } from \"./constants/default-options\";\nimport type { SharedHookContext } from \"./hooks\";\nimport { toStreamableRequest, toStreamableResponse } from \"./stream\";\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 = SharedHookContext & {\n\t$RequestInfoCache: RequestInfoCache;\n\tnewFetchController: AbortController;\n};\n\nexport const createDedupeStrategy = async (context: DedupeContext) => {\n\tconst { $RequestInfoCache, baseConfig, config, newFetchController, options, request } = context;\n\n\tconst dedupeStrategy = options.dedupeStrategy ?? dedupeDefaults.dedupeStrategy;\n\n\tconst generateDedupeKey = () => {\n\t\tconst shouldHaveDedupeKey = dedupeStrategy === \"cancel\" || 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 && 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 && 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\tawait toStreamableRequest({\n\t\t\tbaseConfig,\n\t\t\tconfig,\n\t\t\toptions,\n\t\t\trequest,\n\t\t\trequestInstance: requestInstance.clone(),\n\t\t});\n\n\t\tconst getFetchApiPromise = () => {\n\t\t\tif (isReadableStream(request.body)) {\n\t\t\t\treturn fetchApi(requestInstance.clone());\n\t\t\t}\n\n\t\t\tconst method = request.method ?? requestOptionDefaults.method;\n\n\t\t\tconst modifiedRequest = { ...request, method } as RequestInit;\n\n\t\t\treturn fetchApi(options.fullURL as NonNullable<typeof options.fullURL>, modifiedRequest);\n\t\t};\n\n\t\tconst responsePromise = shouldUsePromiseFromCache\n\t\t\t? prevRequestInfo.responsePromise\n\t\t\t: getFetchApiPromise();\n\n\t\t$RequestInfoCacheOrNull?.set(dedupeKey, { controller: newFetchController, responsePromise });\n\n\t\tconst streamableResponse = toStreamableResponse({\n\t\t\tbaseConfig,\n\t\t\tconfig,\n\t\t\toptions,\n\t\t\trequest,\n\t\t\tresponse: await responsePromise,\n\t\t});\n\n\t\treturn streamableResponse;\n\t};\n\n\tconst removeDedupeKeyFromCache = () => {\n\t\t$RequestInfoCacheOrNull?.delete(dedupeKey);\n\t};\n\n\treturn {\n\t\tdedupeStrategy,\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 { hookDefaults } from \"./constants/default-options\";\nimport {\n\ttype Hooks,\n\ttype HooksOrHooksArray,\n\ttype SharedHookContext,\n\tcomposeTwoHooks,\n\thookRegistries,\n} from \"./hooks\";\nimport type {\n\tBaseCallApiExtraOptions,\n\tCallApiExtraOptions,\n\tCallApiRequestOptions,\n\tCallApiRequestOptionsForHooks,\n} from \"./types/common\";\nimport type { DefaultMoreOptions } from \"./types/default-types\";\nimport type { InitURL } from \"./url\";\nimport { isArray, isFunction, isPlainObject, isString } from \"./utils/guards\";\nimport type { AnyFunction, Awaitable, Prettify } 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\nexport type InferPluginOptions<\n\tTPluginArray extends CallApiPlugin[],\n\t// TCreateExtraOptions = ReturnType<NonNullable<TPluginArray[number][\"createExtraOptions\"]>>,\n> = UnionToIntersection<\n\tTPluginArray extends Array<infer TPlugin>\n\t\t? TPlugin extends CallApiPlugin\n\t\t\t? TPlugin[\"createExtraOptions\"] extends AnyFunction<infer TResult>\n\t\t\t\t? InferSchemaResult<TResult, TResult>\n\t\t\t\t: NonNullable<unknown>\n\t\t\t: NonNullable<unknown>\n\t\t: NonNullable<unknown>\n>;\n\nexport type PluginInitContext<TMoreOptions = DefaultMoreOptions> = Prettify<\n\tSharedHookContext<TMoreOptions> & { initURL: InitURL | undefined }\n>;\n\nexport type PluginInitResult = Partial<\n\tOmit<PluginInitContext, \"request\"> & { request: CallApiRequestOptions }\n>;\n\nexport type PluginHooksWithMoreOptions<TMoreOptions = DefaultMoreOptions> = HooksOrHooksArray<\n\tnever,\n\tnever,\n\tTMoreOptions\n>;\n\nexport type PluginHooks<\n\tTData = never,\n\tTErrorData = never,\n\tTMoreOptions = DefaultMoreOptions,\n> = HooksOrHooksArray<TData, TErrorData, TMoreOptions>;\n\nexport interface CallApiPlugin {\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?: PluginHooks;\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\nexport type Plugins<TPluginArray extends CallApiPlugin[]> = TPluginArray;\n\nconst resolvePluginArray = (\n\tplugins: CallApiExtraOptions[\"plugins\"] | undefined,\n\tbasePlugins: BaseCallApiExtraOptions[\"plugins\"] | undefined\n) => {\n\tif (!plugins) {\n\t\treturn [];\n\t}\n\n\tif (isFunction(plugins)) {\n\t\treturn plugins({ basePlugins: basePlugins ?? [] });\n\t}\n\n\treturn plugins;\n};\n\nexport const initializePlugins = async (context: PluginInitContext) => {\n\tconst { baseConfig, config, initURL, options, request } = context;\n\n\tconst clonedHookRegistries = structuredClone(hookRegistries);\n\n\tconst addMainHooks = () => {\n\t\tfor (const key of Object.keys(clonedHookRegistries) as Array<keyof Hooks>) {\n\t\t\tconst baseHook = baseConfig[key];\n\t\t\tconst instanceHook = config[key];\n\n\t\t\tconst overriddenHook = options[key] as HooksOrHooksArray[typeof key];\n\n\t\t\t// If the base hook is an array and instance hook is defined, we need to compose it with the overridden hook\n\t\t\tconst mainHook =\n\t\t\t\tisArray(baseHook) && Boolean(instanceHook) ? [baseHook, instanceHook].flat() : overriddenHook;\n\n\t\t\tif (!mainHook) continue;\n\n\t\t\tclonedHookRegistries[key].add(mainHook as never);\n\t\t}\n\t};\n\n\tconst addPluginHooks = (pluginHooks: Required<CallApiPlugin>[\"hooks\"]) => {\n\t\tfor (const key of Object.keys(clonedHookRegistries) as Array<keyof Hooks>) {\n\t\t\tconst pluginHook = pluginHooks[key];\n\n\t\t\tif (!pluginHook) continue;\n\n\t\t\tclonedHookRegistries[key].add(pluginHook as never);\n\t\t}\n\t};\n\n\tconst mergedHooksExecutionOrder =\n\t\toptions.mergedHooksExecutionOrder ?? hookDefaults.mergedHooksExecutionOrder;\n\n\tif (mergedHooksExecutionOrder === \"mainHooksBeforePlugins\") {\n\t\taddMainHooks();\n\t}\n\n\tconst resolvedPlugins = resolvePluginArray(options.plugins, baseConfig.plugins);\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,\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 (mergedHooksExecutionOrder === \"mainHooksAfterPlugins\") {\n\t\taddMainHooks();\n\t}\n\n\tconst resolvedHooks: Hooks = {};\n\n\tfor (const [key, hookRegistry] of Object.entries(clonedHookRegistries)) {\n\t\tconst flattenedHookArray = [...hookRegistry].flat();\n\n\t\tconst mergedHooksExecutionMode =\n\t\t\toptions.mergedHooksExecutionMode ?? hookDefaults.mergedHooksExecutionMode;\n\n\t\tconst composedHook = composeTwoHooks(flattenedHookArray, mergedHooksExecutionMode);\n\n\t\tcomposedHook && (resolvedHooks[key as keyof Hooks] = composedHook);\n\t}\n\n\treturn {\n\t\tresolvedHooks,\n\t\tresolvedOptions,\n\t\tresolvedRequestOptions,\n\t\turl: resolvedUrl?.toString(),\n\t};\n};\n","/* eslint-disable ts-eslint/consistent-type-definitions -- I need to use interfaces for the sake of user overrides */\nimport { requestOptionDefaults, retryDefaults } from \"./constants/default-options\";\nimport type { ErrorContext } from \"./hooks\";\nimport type { Method } from \"./types\";\nimport { isFunction, isHTTPError } from \"./utils/guards\";\nimport type { Awaitable } from \"./utils/type-helpers\";\n\ntype RetryCondition<TErrorData> = (context: ErrorContext<TErrorData>) => Awaitable<boolean>;\n\ntype InnerRetryKeys<TErrorData> = Exclude<keyof RetryOptions<TErrorData>, \"~retryAttemptCount\" | \"retry\">;\n\ntype InnerRetryOptions<TErrorData> = {\n\t[Key in InnerRetryKeys<TErrorData> as Key extends `retry${infer TRest}`\n\t\t? Uncapitalize<TRest> extends \"attempts\"\n\t\t\t? never\n\t\t\t: Uncapitalize<TRest>\n\t\t: Key]?: RetryOptions<TErrorData>[Key];\n} & {\n\tattempts: NonNullable<RetryOptions<TErrorData>[\"retryAttempts\"]>;\n};\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 [\"~retryAttemptCount\"]?: number;\n\n\t/**\n\t * All retry options in a single object instead of separate properties\n\t */\n\tretry?: InnerRetryOptions<TErrorData>;\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 | ((currentAttemptCount: number) => 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 */\n\tretryStatusCodes?: number[];\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>(currentAttemptCount: number, options: RetryOptions<TErrorData>) => {\n\tconst retryDelay = options.retryDelay ?? options.retry?.delay;\n\n\tconst resolveRetryDelay =\n\t\t(isFunction(retryDelay) ? retryDelay(currentAttemptCount) : retryDelay) ?? retryDefaults.delay;\n\n\treturn resolveRetryDelay;\n};\n\nconst getExponentialDelay = <TErrorData>(\n\tcurrentAttemptCount: number,\n\toptions: RetryOptions<TErrorData>\n) => {\n\tconst retryDelay = options.retryDelay ?? options.retry?.delay ?? retryDefaults.delay;\n\n\tconst resolvedRetryDelay = Number(\n\t\tisFunction(retryDelay) ? retryDelay(currentAttemptCount) : retryDelay\n\t);\n\n\tconst maxDelay = Number(options.retryMaxDelay ?? options.retry?.maxDelay ?? retryDefaults.maxDelay);\n\n\tconst exponentialDelay = resolvedRetryDelay * 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 currentAttemptCount = options[\"~retryAttemptCount\"] ?? 1;\n\n\tconst retryStrategy = options.retryStrategy ?? options.retry?.strategy ?? retryDefaults.strategy;\n\n\tconst getDelay = () => {\n\t\tswitch (retryStrategy) {\n\t\t\tcase \"exponential\": {\n\t\t\t\treturn getExponentialDelay(currentAttemptCount, options);\n\t\t\t}\n\t\t\tcase \"linear\": {\n\t\t\t\treturn getLinearDelay(currentAttemptCount, options);\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tthrow new Error(`Invalid retry strategy: ${String(retryStrategy)}`);\n\t\t\t}\n\t\t}\n\t};\n\n\tconst shouldAttemptRetry = async () => {\n\t\tconst retryCondition = options.retryCondition ?? options.retry?.condition ?? retryDefaults.condition;\n\n\t\tconst maximumRetryAttempts =\n\t\t\toptions.retryAttempts ?? options.retry?.attempts ?? retryDefaults.attempts;\n\n\t\tconst customRetryCondition = await retryCondition(ctx);\n\n\t\tconst baseShouldRetry = maximumRetryAttempts >= currentAttemptCount && customRetryCondition;\n\n\t\tif (!baseShouldRetry) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// == If error is not an HTTP error, just return true since at this point we know it's a retryable error\n\t\tif (!isHTTPError(ctx.error)) {\n\t\t\treturn true;\n\t\t}\n\n\t\tconst selectedMethodArray = options.retryMethods ?? options.retry?.methods ?? retryDefaults.methods;\n\n\t\tconst retryMethods = new Set(selectedMethodArray);\n\n\t\tconst method = ctx.request.method ?? requestOptionDefaults.method;\n\n\t\tconst includesMethod = Boolean(method) && retryMethods.has(method);\n\n\t\tconst selectedStatusCodeArray = options.retryStatusCodes ?? options.retry?.statusCodes;\n\n\t\tconst retryStatusCodes = selectedStatusCodeArray ? new Set(selectedStatusCodeArray) : null;\n\n\t\tconst includesStatusCodes =\n\t\t\tBoolean(ctx.response?.status) && (retryStatusCodes?.has(ctx.response.status) ?? true);\n\n\t\tconst shouldRetry = includesMethod && includesStatusCodes;\n\n\t\treturn shouldRetry;\n\t};\n\n\treturn {\n\t\tcurrentAttemptCount,\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 */\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","/* eslint-disable ts-eslint/consistent-type-definitions -- I need to use interfaces for the sake of user overrides */\nimport type { Body, GlobalMeta, Headers, Method } from \"./types\";\nimport type { StandardSchemaV1 } from \"./types/standard-schema\";\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 = NonNullable<unknown>> = TSchema extends StandardSchemaV1\n\t? StandardSchemaV1.InferOutput<TSchema>\n\t: TData;\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 { commonDefaults } from \"./constants/default-options\";\nimport { type RequestInfoCache, createDedupeStrategy } from \"./dedupe\";\nimport { HTTPError } from \"./error\";\nimport {\n\ttype ErrorContext,\n\ttype ExecuteHookInfo,\n\ttype RetryContext,\n\ttype SuccessContext,\n\texecuteHooksInCatchBlock,\n\texecuteHooksInTryBlock,\n} from \"./hooks\";\nimport { type CallApiPlugin, initializePlugins } from \"./plugins\";\nimport {\n\ttype ErrorInfo,\n\ttype ResponseTypeUnion,\n\ttype ResultModeUnion,\n\tgetCustomizedErrorResult,\n\tresolveErrorResult,\n\tresolveResponseData,\n\tresolveSuccessResult,\n} from \"./result\";\nimport { createRetryStrategy } from \"./retry\";\nimport type {\n\tBaseCallApiConfig,\n\tBaseCallApiExtraOptions,\n\tCallApiExtraOptions,\n\tCallApiParameters,\n\tCallApiRequestOptions,\n\tCallApiRequestOptionsForHooks,\n\tCallApiResult,\n\tCombinedCallApiExtraOptions,\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\tcreateCombinedSignal,\n\tcreateTimeoutSignal,\n\tgetHeaders,\n\tsplitBaseConfig,\n\tsplitConfig,\n\twaitUntil,\n} from \"./utils/common\";\nimport { isFunction, isHTTPErrorInstance, isSerializable } from \"./utils/guards\";\nimport { type CallApiSchemas, type InferSchemaResult, handleValidation } 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\tinitBaseConfig: 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, initConfig = {}] = parameters;\n\n\t\tconst [fetchOptions, extraOptions] = splitConfig(initConfig);\n\n\t\tconst resolvedBaseConfig = isFunction(initBaseConfig)\n\t\t\t? initBaseConfig({ initURL: initURL.toString(), options: extraOptions, request: fetchOptions })\n\t\t\t: initBaseConfig;\n\n\t\tconst [baseFetchOptions, baseExtraOptions] = splitBaseConfig(resolvedBaseConfig);\n\n\t\t// == Merged Extra Options\n\t\tconst mergedExtraOptions = {\n\t\t\t...baseExtraOptions,\n\t\t\t...(baseExtraOptions.skipAutoMergeFor !== \"all\"\n\t\t\t\t&& baseExtraOptions.skipAutoMergeFor !== \"options\"\n\t\t\t\t&& extraOptions),\n\t\t};\n\n\t\t// == Merged Request Options\n\t\tconst mergedRequestOptions = {\n\t\t\t...baseFetchOptions,\n\t\t\t...(baseExtraOptions.skipAutoMergeFor !== \"all\"\n\t\t\t\t&& baseExtraOptions.skipAutoMergeFor !== \"request\"\n\t\t\t\t&& fetchOptions),\n\t\t} satisfies CallApiRequestOptions;\n\n\t\tconst baseConfig = resolvedBaseConfig as BaseCallApiExtraOptions & CallApiRequestOptions;\n\t\tconst config = initConfig as CallApiExtraOptions & CallApiRequestOptions;\n\n\t\tconst { resolvedHooks, resolvedOptions, resolvedRequestOptions, url } = await initializePlugins({\n\t\t\tbaseConfig,\n\t\t\tconfig,\n\t\t\tinitURL,\n\t\t\toptions: mergedExtraOptions as CombinedCallApiExtraOptions,\n\t\t\trequest: mergedRequestOptions as CallApiRequestOptionsForHooks,\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 bodySerializer = options.bodySerializer ?? commonDefaults.bodySerializer;\n\n\t\tconst request = {\n\t\t\t...resolvedRequestOptions,\n\n\t\t\tbody: isSerializable(resolvedRequestOptions.body)\n\t\t\t\t? bodySerializer(resolvedRequestOptions.body)\n\t\t\t\t: resolvedRequestOptions.body,\n\n\t\t\theaders: await getHeaders({\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 {\n\t\t\tdedupeStrategy,\n\t\t\thandleRequestCancelStrategy,\n\t\t\thandleRequestDeferStrategy,\n\t\t\tremoveDedupeKeyFromCache,\n\t\t} = await createDedupeStrategy({\n\t\t\t$RequestInfoCache,\n\t\t\tbaseConfig,\n\t\t\tconfig,\n\t\t\tnewFetchController,\n\t\t\toptions,\n\t\t\trequest,\n\t\t});\n\n\t\tawait handleRequestCancelStrategy();\n\n\t\ttry {\n\t\t\tawait executeHooksInTryBlock(options.onRequest?.({ baseConfig, config, options, request }));\n\n\t\t\t// == Apply determined headers again after onRequest incase they were modified\n\t\t\trequest.headers = await getHeaders({\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\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\n\t\t\tconst shouldCloneResponse = dedupeStrategy === \"defer\" || options.cloneResponse;\n\n\t\t\tconst schemas = (\n\t\t\t\tisFunction(options.schemas)\n\t\t\t\t\t? options.schemas({ baseSchemas: baseExtraOptions.schemas })\n\t\t\t\t\t: options.schemas\n\t\t\t) as CallApiSchemas | undefined;\n\n\t\t\tconst validators = isFunction(options.validators)\n\t\t\t\t? options.validators({ baseValidators: baseExtraOptions.validators })\n\t\t\t\t: options.validators;\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\t{\n\t\t\t\t\t\tdefaultErrorMessage: options.defaultErrorMessage,\n\t\t\t\t\t\terrorData: validErrorData,\n\t\t\t\t\t\tresponse,\n\t\t\t\t\t},\n\t\t\t\t\t{ cause: validErrorData }\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\tbaseConfig,\n\t\t\t\tconfig,\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 executeHooksInTryBlock(\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\tconst successResult = resolveSuccessResult(successContext.data, {\n\t\t\t\tresponse: successContext.response,\n\t\t\t\tresultMode: options.resultMode,\n\t\t\t});\n\n\t\t\treturn successResult as never;\n\n\t\t\t// == Exhaustive Error handling\n\t\t} catch (error) {\n\t\t\tconst errorInfo = {\n\t\t\t\tcloneResponse: options.cloneResponse,\n\t\t\t\tdefaultErrorMessage: options.defaultErrorMessage,\n\t\t\t\tresultMode: options.resultMode,\n\t\t\t} satisfies ErrorInfo;\n\n\t\t\tconst generalErrorResult = resolveErrorResult(error, errorInfo);\n\n\t\t\tconst errorContext = {\n\t\t\t\tbaseConfig,\n\t\t\t\tconfig,\n\t\t\t\terror: generalErrorResult?.error as never,\n\t\t\t\toptions,\n\t\t\t\trequest,\n\t\t\t\tresponse: generalErrorResult?.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 hookInfo = {\n\t\t\t\terrorInfo,\n\t\t\t\tshouldThrowOnError,\n\t\t\t} satisfies ExecuteHookInfo;\n\n\t\t\tconst handleRetryOrGetErrorResult = async () => {\n\t\t\t\tconst { currentAttemptCount, getDelay, shouldAttemptRetry } =\n\t\t\t\t\tcreateRetryStrategy(errorContext);\n\n\t\t\t\tconst shouldRetry = !combinedSignal.aborted && (await shouldAttemptRetry());\n\n\t\t\t\tif (shouldRetry) {\n\t\t\t\t\tconst retryContext = {\n\t\t\t\t\t\t...errorContext,\n\t\t\t\t\t\tretryAttemptCount: currentAttemptCount,\n\t\t\t\t\t} satisfies RetryContext<unknown>;\n\n\t\t\t\t\tconst hookError = await executeHooksInCatchBlock(\n\t\t\t\t\t\t[options.onRetry?.(retryContext)],\n\t\t\t\t\t\thookInfo\n\t\t\t\t\t);\n\n\t\t\t\t\tif (hookError) {\n\t\t\t\t\t\treturn hookError;\n\t\t\t\t\t}\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\"~retryAttemptCount\": currentAttemptCount + 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 generalErrorResult;\n\t\t\t};\n\n\t\t\tif (isHTTPErrorInstance<TErrorData>(error)) {\n\t\t\t\tconst hookError = await executeHooksInCatchBlock(\n\t\t\t\t\t[\n\t\t\t\t\t\toptions.onResponseError?.(errorContext),\n\n\t\t\t\t\t\toptions.onError?.(errorContext),\n\n\t\t\t\t\t\toptions.onResponse?.({ ...errorContext, data: null }),\n\t\t\t\t\t],\n\t\t\t\t\thookInfo\n\t\t\t\t);\n\n\t\t\t\t// eslint-disable-next-line max-depth -- Ignore for now\n\t\t\t\tif (hookError) {\n\t\t\t\t\treturn hookError as never;\n\t\t\t\t}\n\n\t\t\t\treturn (await handleRetryOrGetErrorResult()) as never;\n\t\t\t}\n\n\t\t\tif (error instanceof DOMException && error.name === \"AbortError\") {\n\t\t\t\t!shouldThrowOnError && console.error(`${error.name}:`, error.message);\n\t\t\t}\n\n\t\t\tlet timeoutMessage: string | undefined;\n\n\t\t\tif (error instanceof DOMException && error.name === \"TimeoutError\") {\n\t\t\t\ttimeoutMessage = `Request timed out after ${options.timeout}ms`;\n\n\t\t\t\t!shouldThrowOnError && console.error(`${error.name}:`, timeoutMessage);\n\t\t\t}\n\n\t\t\tconst hookError = await executeHooksInCatchBlock(\n\t\t\t\t[options.onRequestError?.(errorContext), options.onError?.(errorContext)],\n\t\t\t\thookInfo\n\t\t\t);\n\n\t\t\tif (hookError) {\n\t\t\t\treturn hookError as never;\n\t\t\t}\n\n\t\t\tconst errorResult = await handleRetryOrGetErrorResult();\n\n\t\t\treturn (\n\t\t\t\ttimeoutMessage\n\t\t\t\t\t? getCustomizedErrorResult(errorResult, { message: timeoutMessage })\n\t\t\t\t\t: errorResult\n\t\t\t) as never;\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, ResultModeUnion } from \"./result\";\nimport type { CallApiParameters } 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 { A as CallApiExtraOptions, o as CallApiResultErrorVariant, m as PossibleHTTPError, H as HTTPError } from '../common-UwnX74fm.js';
1
+ import { A as CallApiExtraOptions, o as CallApiResultErrorVariant, m as PossibleHTTPError, H as HTTPError } from '../common-CWVY4h_f.js';
2
2
 
3
3
  type ToQueryStringFn = {
4
4
  (params: CallApiExtraOptions["query"]): string | null;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@zayne-labs/callapi",
3
3
  "type": "module",
4
- "version": "1.7.14",
4
+ "version": "1.7.16",
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",