@zayne-labs/callapi 1.0.0-rc.9 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts","../../src/utils/typeof.ts","../../src/utils/global.ts","../../src/createFetchClient.ts"],"sourcesContent":["export { callApi, createFetchClient } from \"./createFetchClient\";\r\n\r\nexport type {\r\n\tRequestOptions,\r\n\tExtraOptions,\r\n\tCallApiConfig,\r\n\tResponseContext,\r\n\tResponseErrorContext,\r\n\tErrorContext,\r\n} from \"./types\";\r\n","import type { AnyFunction } from \"./type-helpers\";\r\n\r\nexport const isArray = <TArrayItem>(value: unknown): value is TArrayItem[] => Array.isArray(value);\r\n\r\nexport const isObject = <TObject extends Record<string, unknown>>(value: unknown): value is TObject => {\r\n\treturn typeof value === \"object\" && value !== null && !(value instanceof FormData) && !isArray(value);\r\n};\r\n\r\nexport const isFunction = <TFunction extends AnyFunction>(value: unknown): value is TFunction =>\r\n\ttypeof value === \"function\";\r\n\r\nexport const isQueryString = (value: unknown): value is string => isString(value) && value.includes(\"=\");\r\n\r\nexport const isString = (value: unknown) => typeof value === \"string\";\r\n","import type {\r\n\tApiErrorVariant,\r\n\tBaseCallApiConfig,\r\n\tBaseExtraOptions,\r\n\tCallApiConfig,\r\n\tExtraOptions,\r\n\tPossibleErrorNames,\r\n\tRequestOptions,\r\n\tResultModeMap,\r\n} from \"../types\";\r\nimport type { AnyFunction, Awaitable } from \"./type-helpers\";\r\nimport { isArray, isObject } from \"./typeof\";\r\n\r\n// prettier-ignore\r\nexport const generateRequestKey = (url: string, config: Record<string, unknown>) => `${url} ${ampersand} ${JSON.stringify(config)}`;\r\n\r\ntype ToQueryStringFn = {\r\n\t(params: ExtraOptions[\"query\"]): string | null;\r\n\t(params: Required<ExtraOptions>[\"query\"]): string;\r\n};\r\n\r\nexport const toQueryString: ToQueryStringFn = (params) => {\r\n\tif (!params) {\r\n\t\tconsole.error(\"toQueryString:\", \"No query params provided!\");\r\n\r\n\t\treturn null as never;\r\n\t}\r\n\r\n\treturn new URLSearchParams(params as Record<string, string>).toString();\r\n};\r\n\r\nconst slash = \"/\";\r\nconst column = \":\";\r\nconst mergeUrlWithParams = (url: string, params: ExtraOptions[\"params\"]) => {\r\n\tif (!params) {\r\n\t\treturn url;\r\n\t}\r\n\r\n\tlet newUrl = url;\r\n\r\n\tif (isArray(params)) {\r\n\t\tconst matchedParamArray = newUrl\r\n\t\t\t.split(slash)\r\n\t\t\t.filter((matchedParam) => matchedParam.startsWith(column));\r\n\r\n\t\tfor (const [index, matchedParam] of matchedParamArray.entries()) {\r\n\t\t\tconst param = params[index] as string;\r\n\t\t\tnewUrl = newUrl.replace(matchedParam, param);\r\n\t\t}\r\n\r\n\t\treturn newUrl;\r\n\t}\r\n\r\n\tfor (const [key, value] of Object.entries(params)) {\r\n\t\tnewUrl = newUrl.replace(`:${key}`, String(value));\r\n\t}\r\n\r\n\treturn newUrl;\r\n};\r\n\r\nconst questionMark = \"?\";\r\nconst ampersand = \"&\";\r\n\r\nconst mergeUrlWithQuery = (url: string, query: ExtraOptions[\"query\"]): string => {\r\n\tif (!query) {\r\n\t\treturn url;\r\n\t}\r\n\r\n\tconst queryString = toQueryString(query);\r\n\r\n\tif (queryString?.length === 0) {\r\n\t\treturn url;\r\n\t}\r\n\r\n\tif (url.endsWith(questionMark)) {\r\n\t\treturn `${url}${queryString}`;\r\n\t}\r\n\r\n\tif (url.includes(questionMark)) {\r\n\t\treturn `${url}${ampersand}${queryString}`;\r\n\t}\r\n\r\n\treturn `${url}${questionMark}${queryString}`;\r\n};\r\n\r\nexport const mergeUrlWithParamsAndQuery = (\r\n\turl: string,\r\n\tparams: ExtraOptions[\"params\"],\r\n\tquery: ExtraOptions[\"query\"]\r\n) => {\r\n\tconst urlWithMergedParams = mergeUrlWithParams(url, params);\r\n\r\n\treturn mergeUrlWithQuery(urlWithMergedParams, query);\r\n};\r\n\r\nexport const objectifyHeaders = (headers: RequestInit[\"headers\"]): Record<string, string> | undefined => {\r\n\tif (!headers || isObject(headers)) {\r\n\t\treturn headers;\r\n\t}\r\n\r\n\treturn Object.fromEntries(isArray(headers) ? headers : headers.entries());\r\n};\r\n\r\nconst retryCodesLookup = {\r\n\t408: \"Request Timeout\",\r\n\t409: \"Conflict\",\r\n\t425: \"Too Early\",\r\n\t429: \"Too Many Requests\",\r\n\t500: \"Internal Server Error\",\r\n\t502: \"Bad Gateway\",\r\n\t503: \"Service Unavailable\",\r\n\t504: \"Gateway Timeout\",\r\n};\r\n\r\nexport const defaultRetryCodes: Required<BaseCallApiConfig>[\"retryCodes\"] =\r\n\tObject.keys(retryCodesLookup).map(Number);\r\n\r\nexport const defaultRetryMethods: Required<BaseCallApiConfig>[\"retryMethods\"] = [\"GET\"];\r\n\r\nexport const fetchSpecificKeys = [\r\n\t\"body\",\r\n\t\"integrity\",\r\n\t\"method\",\r\n\t\"headers\",\r\n\t\"signal\",\r\n\t\"cache\",\r\n\t\"redirect\",\r\n\t\"window\",\r\n\t\"credentials\",\r\n\t\"keepalive\",\r\n\t\"referrer\",\r\n\t\"priority\",\r\n\t\"mode\",\r\n\t\"referrerPolicy\",\r\n] satisfies Array<keyof CallApiConfig>;\r\n\r\nexport const omitKeys = <\r\n\tTObject extends Record<string, unknown>,\r\n\tconst TOmitArray extends Array<keyof TObject>,\r\n>(\r\n\tinitialObject: TObject,\r\n\tkeysToOmit: TOmitArray\r\n) => {\r\n\tconst arrayFromFilteredObject = Object.entries(initialObject).filter(\r\n\t\t([key]) => !keysToOmit.includes(key)\r\n\t);\r\n\r\n\tconst updatedObject = Object.fromEntries(arrayFromFilteredObject);\r\n\r\n\treturn updatedObject as Omit<TObject, keyof TOmitArray>;\r\n};\r\n\r\nconst pickKeys = <TObject extends Record<string, unknown>, const TPickArray extends Array<keyof TObject>>(\r\n\tinitialObject: TObject,\r\n\tkeysToPick: TPickArray\r\n) => {\r\n\tconst keysToPickSet = new Set(keysToPick);\r\n\r\n\tconst arrayFromInitObject = Object.entries(initialObject);\r\n\r\n\tconst filteredArray = arrayFromInitObject.filter(([objectKey]) => keysToPickSet.has(objectKey));\r\n\r\n\tconst updatedObject = Object.fromEntries(filteredArray);\r\n\r\n\treturn updatedObject as Pick<TObject, TPickArray[number]>;\r\n};\r\n\r\n// eslint-disable-next-line ts-eslint/no-explicit-any\r\nexport const splitBaseConfig = (baseConfig: Record<string, any>) =>\r\n\t[\r\n\t\tpickKeys(baseConfig, fetchSpecificKeys) as RequestOptions,\r\n\t\tomitKeys(baseConfig, [...fetchSpecificKeys, \"requestKey\"] satisfies Array<\r\n\t\t\tkeyof CallApiConfig\r\n\t\t>) as BaseExtraOptions,\r\n\t] as const;\r\n\r\n// eslint-disable-next-line ts-eslint/no-explicit-any\r\nexport const splitConfig = (config: Record<string, any>) =>\r\n\t[\r\n\t\tpickKeys(config, fetchSpecificKeys) as RequestOptions,\r\n\t\tomitKeys(config, fetchSpecificKeys) as ExtraOptions,\r\n\t] as const;\r\n\r\nexport const handleInterceptorsMerge = <\r\n\tTBaseInterceptor extends AnyFunction<Awaitable<void>> | Array<AnyFunction<Awaitable<void>>>,\r\n\tTInterceptor extends AnyFunction<Awaitable<void>>,\r\n>(\r\n\tbaseInterceptor: TBaseInterceptor | undefined,\r\n\tinterceptor: TInterceptor | undefined,\r\n\tshouldMergeInterceptors: ExtraOptions[\"shouldMergeInterceptors\"],\r\n\tmergedInterceptorsExecutionMode: ExtraOptions[\"mergedInterceptorsExecutionMode\"]\r\n) => {\r\n\tif (isArray(baseInterceptor) && shouldMergeInterceptors) {\r\n\t\tconst mergedInterceptor = async (ctx: Record<string, unknown>) => {\r\n\t\t\tif (!interceptor) return;\r\n\r\n\t\t\tconst interceptorArray = [...baseInterceptor, interceptor] as Array<AnyFunction<Awaitable<void>>>;\r\n\r\n\t\t\tconst uniqueInterceptorArray = [...new Set(interceptorArray)];\r\n\r\n\t\t\tif (mergedInterceptorsExecutionMode === \"sequential\") {\r\n\t\t\t\tfor (const uniqueInterceptor of uniqueInterceptorArray) {\r\n\t\t\t\t\t// eslint-disable-next-line no-await-in-loop\r\n\t\t\t\t\tawait uniqueInterceptor(ctx);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (mergedInterceptorsExecutionMode === \"parallel\") {\r\n\t\t\t\tawait Promise.all(uniqueInterceptorArray.map((uniqueInterceptor) => uniqueInterceptor(ctx)));\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\treturn mergedInterceptor;\r\n\t}\r\n\r\n\treturn interceptor ?? (baseInterceptor as typeof interceptor);\r\n};\r\n\r\nexport const handleResponseType = <TResponse>(\r\n\tresponse: Response,\r\n\tparser?: Required<ExtraOptions>[\"responseParser\"]\r\n) => ({\r\n\tarrayBuffer: () => response.arrayBuffer() as Promise<TResponse>,\r\n\tblob: () => response.blob() as Promise<TResponse>,\r\n\tformData: () => response.formData() as Promise<TResponse>,\r\n\tjson: async () => {\r\n\t\tif (parser) {\r\n\t\t\treturn parser(await response.text());\r\n\t\t}\r\n\r\n\t\treturn response.json() as Promise<TResponse>;\r\n\t},\r\n\ttext: () => response.text() as Promise<TResponse>,\r\n});\r\n\r\nexport const getResponseData = <TResponse>(\r\n\tresponse: Response,\r\n\tresponseType: keyof ReturnType<typeof handleResponseType>,\r\n\tparser: ExtraOptions[\"responseParser\"]\r\n) => {\r\n\tconst RESPONSE_TYPE_LOOKUP = handleResponseType<TResponse>(response, parser);\r\n\r\n\tif (!Object.hasOwn(RESPONSE_TYPE_LOOKUP, responseType)) {\r\n\t\tthrow new Error(`Invalid response type: ${responseType}`);\r\n\t}\r\n\r\n\treturn RESPONSE_TYPE_LOOKUP[responseType]();\r\n};\r\n\r\ntype SuccessInfo = {\r\n\tresponse: Response;\r\n\tresultMode: ExtraOptions[\"resultMode\"];\r\n\tsuccessData: unknown;\r\n};\r\n\r\n// == The CallApiResult type is used to cast all return statements due to a design limitation in ts.\r\n// LINK - See https://www.zhenghao.io/posts/type-functions for more info\r\nexport const resolveSuccessResult = <CallApiResult>(info: SuccessInfo): CallApiResult => {\r\n\tconst { response, resultMode, successData } = info;\r\n\r\n\tconst apiDetails = {\r\n\t\tdata: successData,\r\n\t\terror: null,\r\n\t\tresponse,\r\n\t};\r\n\r\n\tif (!resultMode) {\r\n\t\treturn apiDetails as CallApiResult;\r\n\t}\r\n\r\n\treturn {\r\n\t\tall: apiDetails,\r\n\t\tonlyError: apiDetails.error,\r\n\t\tonlyResponse: apiDetails.response,\r\n\t\tonlySuccess: apiDetails.data,\r\n\t}[resultMode] as CallApiResult;\r\n};\r\n\r\ntype ErrorInfo = {\r\n\tdefaultErrorMessage: Required<ExtraOptions>[\"defaultErrorMessage\"];\r\n\terror?: unknown;\r\n\tresultMode: ExtraOptions[\"resultMode\"];\r\n};\r\n\r\nexport const resolveErrorResult = <CallApiResult>(info: ErrorInfo): CallApiResult => {\r\n\tconst { defaultErrorMessage, error, resultMode } = info;\r\n\r\n\tlet apiDetails!: ResultModeMap[\"all\"];\r\n\r\n\tif (isHTTPErrorInstance(error)) {\r\n\t\tconst { errorData, message = defaultErrorMessage, name, response } = error;\r\n\r\n\t\tapiDetails = {\r\n\t\t\tdata: null,\r\n\t\t\terror: { errorData, message, name },\r\n\t\t\tresponse,\r\n\t\t};\r\n\t}\r\n\r\n\tif (error) {\r\n\t\tconst { message, name } = error as Error;\r\n\r\n\t\tapiDetails = {\r\n\t\t\tdata: null,\r\n\t\t\terror: { errorData: error as Error, message, name: name as PossibleErrorNames },\r\n\t\t\tresponse: null,\r\n\t\t};\r\n\t}\r\n\r\n\tif (!resultMode) {\r\n\t\treturn apiDetails as CallApiResult;\r\n\t}\r\n\r\n\treturn {\r\n\t\tall: apiDetails,\r\n\t\tonlyError: apiDetails.error,\r\n\t\tonlyResponse: apiDetails.response,\r\n\t\tonlySuccess: apiDetails.data,\r\n\t}[resultMode] as CallApiResult;\r\n};\r\n\r\nexport const isHTTPError = <TErrorData>(error: ApiErrorVariant<TErrorData>[\"error\"] | null) => {\r\n\treturn isObject(error) && error.name === \"HTTPError\";\r\n};\r\n\r\ntype ErrorDetails<TErrorResponse> = {\r\n\tdefaultErrorMessage: string;\r\n\terrorData: TErrorResponse;\r\n\tresponse: Response;\r\n};\r\n\r\ntype ErrorOptions = {\r\n\tcause?: unknown;\r\n};\r\n\r\nexport class HTTPError<TErrorResponse = Record<string, unknown>> extends Error {\r\n\terrorData: ErrorDetails<TErrorResponse>[\"errorData\"];\r\n\tisHTTPError = true;\r\n\r\n\toverride name = \"HTTPError\" as const;\r\n\r\n\tresponse: ErrorDetails<TErrorResponse>[\"response\"];\r\n\r\n\tconstructor(errorDetails: ErrorDetails<TErrorResponse>, errorOptions?: ErrorOptions) {\r\n\t\tconst { defaultErrorMessage, errorData, response } = errorDetails;\r\n\r\n\t\tsuper((errorData as { message?: string }).message ?? defaultErrorMessage, errorOptions);\r\n\r\n\t\tthis.errorData = errorData;\r\n\t\tthis.response = response;\r\n\t}\r\n}\r\n\r\n// prettier-ignore\r\nexport const isHTTPErrorInstance = <TErrorResponse>(\r\n\terror: unknown\r\n): error is HTTPError<TErrorResponse> => {\r\n\treturn (\r\n\t\terror instanceof HTTPError || (isObject(error) && error.name === \"HTTPError\" && error.isHTTPError === true)\r\n\t);\r\n};\r\n\r\nexport const waitUntil = (delay: number) => {\r\n\tif (delay === 0) return;\r\n\r\n\tconst { promise, resolve } = Promise.withResolvers();\r\n\r\n\tsetTimeout(resolve, delay);\r\n\r\n\treturn promise;\r\n};\r\n","import type {\r\n\tBaseCallApiConfig,\r\n\tCallApiConfig,\r\n\tExtraOptions,\r\n\tGetCallApiResult,\r\n\tInterceptorUnion,\r\n\tRequestOptions,\r\n\tResultModeUnion,\r\n} from \"./types\";\r\nimport {\r\n\tHTTPError,\r\n\tdefaultRetryCodes,\r\n\tdefaultRetryMethods,\r\n\tgenerateRequestKey,\r\n\tgetResponseData,\r\n\thandleInterceptorsMerge,\r\n\tisHTTPErrorInstance,\r\n\tmergeUrlWithParamsAndQuery,\r\n\tobjectifyHeaders,\r\n\tresolveErrorResult,\r\n\tresolveSuccessResult,\r\n\tsplitBaseConfig,\r\n\tsplitConfig,\r\n\twaitUntil,\r\n} from \"./utils/global\";\r\nimport { isFunction, isObject, isQueryString, isString } from \"./utils/typeof\";\r\n\r\nexport const createFetchClient = <\r\n\tTBaseData,\r\n\tTBaseErrorData = unknown,\r\n\tTBaseResultMode extends ResultModeUnion = \"all\",\r\n>(\r\n\tbaseConfig: BaseCallApiConfig<TBaseData, TBaseErrorData, TBaseResultMode> = {}\r\n) => {\r\n\tconst [baseFetchConfig, baseExtraOptions] = splitBaseConfig(baseConfig);\r\n\r\n\tconst {\r\n\t\tbody: baseBody,\r\n\t\theaders: baseHeaders,\r\n\t\tsignal: baseSignal,\r\n\t\t...restOfBaseFetchConfig\r\n\t} = baseFetchConfig;\r\n\r\n\tconst {\r\n\t\tonError: onBaseError,\r\n\t\tonRequest: onBaseRequest,\r\n\t\tonRequestError: onBaseRequestError,\r\n\t\tonResponse: onBaseResponse,\r\n\t\tonResponseError: onBaseResponseError,\r\n\t\t...restOfBaseExtraOptions\r\n\t} = baseExtraOptions;\r\n\r\n\tconst requestInfoCache = new Map<\r\n\t\tstring | null,\r\n\t\t{ controller: AbortController; responsePromise: Promise<Response> }\r\n\t>();\r\n\r\n\t// eslint-disable-next-line complexity\r\n\tconst callApi = async <\r\n\t\tTData = TBaseData,\r\n\t\tTErrorData = TBaseErrorData,\r\n\t\tTResultMode extends ResultModeUnion = TBaseResultMode,\r\n\t>(\r\n\t\turl: string,\r\n\t\tconfig: CallApiConfig<TData, TErrorData, TResultMode> = {}\r\n\t): Promise<GetCallApiResult<TData, TErrorData, TResultMode>> => {\r\n\t\ttype CallApiResult = GetCallApiResult<TData, TErrorData, TResultMode>;\r\n\r\n\t\tconst [fetchConfig, extraOptions] = splitConfig(config);\r\n\r\n\t\tconst { body = baseBody, headers, signal = baseSignal, ...restOfFetchConfig } = fetchConfig;\r\n\r\n\t\t// prettier-ignore\r\n\t\tconst {\r\n\t\t\tonError,\r\n\t\t\tonRequest,\r\n\t\t\tonRequestError,\r\n\t\t\tonResponse,\r\n\t\t\tonResponseError,\r\n\t\t\t...restOfExtraOptions\r\n\t\t} = extraOptions;\r\n\r\n\t\t// == Default Extra Options\r\n\t\tconst defaultOptions = {\r\n\t\t\tbaseURL: \"\",\r\n\t\t\tbodySerializer: JSON.stringify,\r\n\t\t\tdedupeStrategy: \"cancel\",\r\n\t\t\tdefaultErrorMessage: \"Failed to fetch data from server!\",\r\n\t\t\tmergedInterceptorsExecutionMode: \"parallel\",\r\n\t\t\tresponseType: \"json\",\r\n\t\t\tresultMode: \"all\",\r\n\t\t\tretries: 0,\r\n\t\t\tretryCodes: defaultRetryCodes,\r\n\t\t\tretryDelay: 0,\r\n\t\t\tretryMethods: defaultRetryMethods,\r\n\t\t\tshouldMergeInterceptors: true,\r\n\r\n\t\t\t...restOfBaseExtraOptions,\r\n\t\t\t...restOfExtraOptions,\r\n\t\t} satisfies Omit<ExtraOptions, InterceptorUnion>;\r\n\r\n\t\tconst interceptors = {\r\n\t\t\tonError: handleInterceptorsMerge(\r\n\t\t\t\tonBaseError,\r\n\t\t\t\tonError,\r\n\t\t\t\tdefaultOptions.shouldMergeInterceptors,\r\n\t\t\t\tdefaultOptions.mergedInterceptorsExecutionMode\r\n\t\t\t),\r\n\t\t\tonRequest: handleInterceptorsMerge(\r\n\t\t\t\tonBaseRequest,\r\n\t\t\t\tonRequest,\r\n\t\t\t\tdefaultOptions.shouldMergeInterceptors,\r\n\t\t\t\tdefaultOptions.mergedInterceptorsExecutionMode\r\n\t\t\t),\r\n\t\t\tonRequestError: handleInterceptorsMerge(\r\n\t\t\t\tonBaseRequestError,\r\n\t\t\t\tonRequestError,\r\n\t\t\t\tdefaultOptions.shouldMergeInterceptors,\r\n\t\t\t\tdefaultOptions.mergedInterceptorsExecutionMode\r\n\t\t\t),\r\n\t\t\tonResponse: handleInterceptorsMerge(\r\n\t\t\t\tonBaseResponse,\r\n\t\t\t\tonResponse,\r\n\t\t\t\tdefaultOptions.shouldMergeInterceptors,\r\n\t\t\t\tdefaultOptions.mergedInterceptorsExecutionMode\r\n\t\t\t),\r\n\t\t\tonResponseError: handleInterceptorsMerge(\r\n\t\t\t\tonBaseResponseError,\r\n\t\t\t\tonResponseError,\r\n\t\t\t\tdefaultOptions.shouldMergeInterceptors,\r\n\t\t\t\tdefaultOptions.mergedInterceptorsExecutionMode\r\n\t\t\t),\r\n\t\t} satisfies Pick<ExtraOptions, InterceptorUnion>;\r\n\r\n\t\tconst options = {\r\n\t\t\t...interceptors,\r\n\t\t\t...defaultOptions,\r\n\t\t};\r\n\r\n\t\t// == Default Request Init\r\n\t\tconst defaultRequestOptions = {\r\n\t\t\tmethod: \"GET\",\r\n\r\n\t\t\t// eslint-disable-next-line perfectionist/sort-objects\r\n\t\t\tbody: isObject(body) ? options.bodySerializer(body) : body,\r\n\r\n\t\t\t// == Return undefined if the following conditions are not met (so that native fetch would auto set the correct headers):\r\n\t\t\t// - headers are provided\r\n\t\t\t// - The body is an object\r\n\t\t\t// - The auth option is provided\r\n\t\t\theaders:\r\n\t\t\t\tbaseHeaders || headers || isObject(body) || options.auth\r\n\t\t\t\t\t? {\r\n\t\t\t\t\t\t\t...(isObject(body) && {\r\n\t\t\t\t\t\t\t\tAccept: \"application/json\",\r\n\t\t\t\t\t\t\t\t\"Content-Type\": \"application/json\",\r\n\t\t\t\t\t\t\t}),\r\n\t\t\t\t\t\t\t...(isQueryString(body) && {\r\n\t\t\t\t\t\t\t\t\"Content-Type\": \"application/x-www-form-urlencoded\",\r\n\t\t\t\t\t\t\t}),\r\n\t\t\t\t\t\t\t...((isString(options.auth) || options.auth === null) && {\r\n\t\t\t\t\t\t\t\tAuthorization: `Bearer ${options.auth}`,\r\n\t\t\t\t\t\t\t}),\r\n\t\t\t\t\t\t\t...(isObject(options.auth) && {\r\n\t\t\t\t\t\t\t\tAuthorization:\r\n\t\t\t\t\t\t\t\t\t\"bearer\" in options.auth\r\n\t\t\t\t\t\t\t\t\t\t? `Bearer ${options.auth.bearer}`\r\n\t\t\t\t\t\t\t\t\t\t: `Token ${options.auth.token}`,\r\n\t\t\t\t\t\t\t}),\r\n\t\t\t\t\t\t\t...objectifyHeaders(baseHeaders),\r\n\t\t\t\t\t\t\t...objectifyHeaders(headers),\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t: undefined,\r\n\r\n\t\t\t...restOfBaseFetchConfig,\r\n\t\t\t...restOfFetchConfig,\r\n\t\t} satisfies RequestOptions;\r\n\r\n\t\t// prettier-ignore\r\n\t\tconst shouldHaveRequestKey = options.dedupeStrategy === \"cancel\" || options.dedupeStrategy === \"defer\";\r\n\r\n\t\tconst requestKey =\r\n\t\t\toptions.requestKey ??\r\n\t\t\t(shouldHaveRequestKey ? generateRequestKey(url, { ...defaultRequestOptions, ...options }) : null);\r\n\r\n\t\t// == This is required to leave the smallest window of time for the cache to be updated with the last request info, if all requests with the same key start at the same time\r\n\t\tif (requestKey != null) {\r\n\t\t\tawait waitUntil(0.1);\r\n\t\t}\r\n\r\n\t\t// == This ensures cache operations only occur when key is available\r\n\t\tconst requestInfoCacheOrNull = requestKey ? requestInfoCache : null;\r\n\r\n\t\tconst prevRequestInfo = requestInfoCacheOrNull?.get(requestKey);\r\n\r\n\t\tif (prevRequestInfo && options.dedupeStrategy === \"cancel\") {\r\n\t\t\tconst reason = new DOMException(\r\n\t\t\t\t`Request aborted as another request to the endpoint: ${url}, with the same request options was initiated.`,\r\n\t\t\t\t\"AbortError\"\r\n\t\t\t);\r\n\r\n\t\t\tprevRequestInfo.controller.abort(reason);\r\n\t\t}\r\n\r\n\t\tconst newFetchController = new AbortController();\r\n\r\n\t\tconst timeoutSignal = options.timeout ? AbortSignal.timeout(options.timeout) : null;\r\n\r\n\t\tconst combinedSignal = AbortSignal.any([\r\n\t\t\tnewFetchController.signal,\r\n\t\t\t...(timeoutSignal ? [timeoutSignal] : []),\r\n\t\t\t...(signal ? [signal] : []),\r\n\t\t]);\r\n\r\n\t\tconst requestInit = {\r\n\t\t\tsignal: combinedSignal,\r\n\t\t\t...defaultRequestOptions,\r\n\t\t} satisfies RequestOptions;\r\n\r\n\t\ttry {\r\n\t\t\tawait options.onRequest?.({ options, request: requestInit });\r\n\r\n\t\t\tconst responsePromise =\r\n\t\t\t\tprevRequestInfo && options.dedupeStrategy === \"defer\"\r\n\t\t\t\t\t? prevRequestInfo.responsePromise\r\n\t\t\t\t\t: fetch(\r\n\t\t\t\t\t\t\t`${options.baseURL}${mergeUrlWithParamsAndQuery(url, options.params, options.query)}`,\r\n\t\t\t\t\t\t\trequestInit\r\n\t\t\t\t\t\t);\r\n\r\n\t\t\trequestInfoCacheOrNull?.set(requestKey, { controller: newFetchController, responsePromise });\r\n\r\n\t\t\tconst response = await responsePromise;\r\n\r\n\t\t\tconst shouldRetry =\r\n\t\t\t\t!response.ok &&\r\n\t\t\t\t!combinedSignal.aborted &&\r\n\t\t\t\toptions.retries > 0 &&\r\n\t\t\t\toptions.retryCodes.includes(response.status) &&\r\n\t\t\t\toptions.retryMethods.includes(requestInit.method);\r\n\r\n\t\t\tif (shouldRetry) {\r\n\t\t\t\tawait waitUntil(options.retryDelay);\r\n\r\n\t\t\t\treturn await callApi(url, { ...config, retries: options.retries - 1 });\r\n\t\t\t}\r\n\r\n\t\t\t// == Also clone response when dedupeStrategy is set to \"defer\", to avoid error thrown from reading response.json more than once\r\n\t\t\tconst shouldCloneResponse = options.dedupeStrategy === \"defer\" || options.shouldCloneResponse;\r\n\r\n\t\t\tif (!response.ok) {\r\n\t\t\t\tconst errorData = await getResponseData<TErrorData>(\r\n\t\t\t\t\tshouldCloneResponse ? response.clone() : response,\r\n\t\t\t\t\toptions.responseType,\r\n\t\t\t\t\toptions.responseParser\r\n\t\t\t\t);\r\n\r\n\t\t\t\t// == Pushing all error handling responsibilities to the catch block\r\n\t\t\t\tthrow new HTTPError({\r\n\t\t\t\t\tdefaultErrorMessage: options.defaultErrorMessage,\r\n\t\t\t\t\terrorData,\r\n\t\t\t\t\tresponse,\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\tconst successData = await getResponseData<TData>(\r\n\t\t\t\tshouldCloneResponse ? response.clone() : response,\r\n\t\t\t\toptions.responseType,\r\n\t\t\t\toptions.responseParser\r\n\t\t\t);\r\n\r\n\t\t\tconst validSuccessData = options.responseValidator\r\n\t\t\t\t? options.responseValidator(successData)\r\n\t\t\t\t: successData;\r\n\r\n\t\t\tawait options.onResponse?.({\r\n\t\t\t\tdata: validSuccessData,\r\n\t\t\t\toptions,\r\n\t\t\t\trequest: requestInit,\r\n\t\t\t\tresponse: options.shouldCloneResponse ? response.clone() : response,\r\n\t\t\t});\r\n\r\n\t\t\treturn resolveSuccessResult<CallApiResult>({\r\n\t\t\t\tresponse,\r\n\t\t\t\tresultMode: options.resultMode,\r\n\t\t\t\tsuccessData: validSuccessData,\r\n\t\t\t});\r\n\r\n\t\t\t// == Exhaustive Error handling\r\n\t\t} catch (error) {\r\n\t\t\tconst generalErrorResult = resolveErrorResult<CallApiResult>({\r\n\t\t\t\tdefaultErrorMessage: options.defaultErrorMessage,\r\n\t\t\t\terror,\r\n\t\t\t\tresultMode: options.resultMode,\r\n\t\t\t});\r\n\r\n\t\t\tconst shouldThrowOnError = isFunction(options.throwOnError)\r\n\t\t\t\t? options.throwOnError({\r\n\t\t\t\t\t\terror: (generalErrorResult as { error: never }).error,\r\n\t\t\t\t\t\toptions,\r\n\t\t\t\t\t\trequest: requestInit,\r\n\t\t\t\t\t})\r\n\t\t\t\t: options.throwOnError;\r\n\r\n\t\t\tif (shouldThrowOnError) {\r\n\t\t\t\tthrow error;\r\n\t\t\t}\r\n\r\n\t\t\tif (error instanceof DOMException && error.name === \"TimeoutError\") {\r\n\t\t\t\tconst message = `Request timed out after ${options.timeout}ms`;\r\n\r\n\t\t\t\tconsole.error(`${error.name}:`, message);\r\n\r\n\t\t\t\treturn { ...generalErrorResult, message };\r\n\t\t\t}\r\n\r\n\t\t\tif (error instanceof DOMException && error.name === \"AbortError\") {\r\n\t\t\t\tconst { message, name } = error;\r\n\r\n\t\t\t\tconsole.error(`${name}:`, message);\r\n\r\n\t\t\t\treturn generalErrorResult;\r\n\t\t\t}\r\n\r\n\t\t\tif (isHTTPErrorInstance<TErrorData>(error)) {\r\n\t\t\t\tconst { errorData, response } = error;\r\n\r\n\t\t\t\tvoid (await Promise.all([\r\n\t\t\t\t\toptions.onResponseError?.({\r\n\t\t\t\t\t\terrorData,\r\n\t\t\t\t\t\toptions,\r\n\t\t\t\t\t\trequest: requestInit,\r\n\t\t\t\t\t\tresponse: options.shouldCloneResponse ? response.clone() : response,\r\n\t\t\t\t\t}),\r\n\r\n\t\t\t\t\t// == Also call the onError interceptor\r\n\t\t\t\t\toptions.onError?.({\r\n\t\t\t\t\t\terror,\r\n\t\t\t\t\t\toptions,\r\n\t\t\t\t\t\trequest: requestInit,\r\n\t\t\t\t\t\tresponse,\r\n\t\t\t\t\t}),\r\n\t\t\t\t]));\r\n\r\n\t\t\t\treturn generalErrorResult;\r\n\t\t\t}\r\n\r\n\t\t\tvoid (await Promise.all([\r\n\t\t\t\t// == At this point only the request errors exist, so the request error interceptor is called\r\n\t\t\t\toptions.onRequestError?.({ error: error as Error, options, request: requestInit }),\r\n\r\n\t\t\t\t// == Also call the onError interceptor\r\n\t\t\t\toptions.onError?.({\r\n\t\t\t\t\terror: (generalErrorResult as { error: never }).error,\r\n\t\t\t\t\toptions,\r\n\t\t\t\t\trequest: requestInit,\r\n\t\t\t\t\tresponse: null,\r\n\t\t\t\t}),\r\n\t\t\t]));\r\n\r\n\t\t\treturn generalErrorResult;\r\n\r\n\t\t\t// == Removing the now unneeded AbortController from store\r\n\t\t} finally {\r\n\t\t\trequestInfoCacheOrNull?.delete(requestKey);\r\n\t\t}\r\n\t};\r\n\r\n\tcallApi.create = createFetchClient;\r\n\r\n\treturn callApi;\r\n};\r\n\r\nexport const callApi = createFetchClient();\r\n"],"mappings":"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","names":["callApi"]}
1
+ {"version":3,"sources":["../../src/index.ts","../../src/utils/type-guards.ts","../../src/plugins.ts","../../src/auth.ts","../../src/utils/type-helpers.ts","../../src/types.ts","../../src/utils/constants.ts","../../src/utils/common.ts","../../src/url.ts","../../src/utils/polyfills.ts","../../src/createFetchClient.ts"],"sourcesContent":["export { callApi, createFetchClient } from \"./createFetchClient\";\n\nexport { definePlugin } from \"./plugins\";\nexport type { CallApiPlugin, PluginInitContext } from \"./plugins\";\n\nexport type {\n\tBaseCallApiConfig,\n\tBaseCallApiExtraOptions,\n\tCallApiConfig,\n\tCallApiExtraOptions,\n\tCallApiParameters,\n\tCallApiRequestOptions,\n\tCallApiRequestOptionsForHooks,\n\tCallApiResultErrorVariant,\n\tCallApiResultModeUnion,\n\tCallApiResultSuccessVariant,\n\tCombinedCallApiExtraOptions,\n\tPossibleJavascriptErrorNames,\n\tErrorContext,\n\tRegister,\n\tRequestContext,\n\tRequestErrorContext,\n\tResponseContext,\n\tResponseErrorContext,\n\tSuccessContext,\n} from \"./types\";\n","import type { AnyFunction } from \"./type-helpers\";\n\nexport const isArray = <TArrayItem>(value: unknown): value is TArrayItem[] => Array.isArray(value);\n\nexport const isObject = (value: unknown) => typeof value === \"object\" && value !== null;\n\nexport const isPlainObject = <TPlainObject extends Record<string, unknown>>(\n\tvalue: unknown\n): value is TPlainObject => {\n\tif (!isObject(value)) {\n\t\treturn false;\n\t}\n\n\tconst prototype = Object.getPrototypeOf(value) as unknown;\n\n\t// Check if it's a plain object\n\treturn (\n\t\t// prettier-ignore\n\t\t(prototype == null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(Symbol.toStringTag in value)\n\t);\n};\n\nexport const isFunction = <TFunction extends AnyFunction>(value: unknown): value is TFunction =>\n\ttypeof value === \"function\";\n\nexport const isQueryString = (value: unknown): value is string => isString(value) && value.includes(\"=\");\n\nexport const isString = (value: unknown) => typeof value === \"string\";\n\n// https://github.com/unjs/ofetch/blob/main/src/utils.ts\n// TODO Find a way to incorporate this function in checking when to apply the bodySerializer on the body and also whether to add the content type application/json\nexport const isJSONSerializable = (value: unknown) => {\n\tif (value === undefined) {\n\t\treturn false;\n\t}\n\tconst t = typeof value;\n\t// eslint-disable-next-line ts-eslint/no-unnecessary-condition -- No time to make this more type-safe\n\tif (t === \"string\" || t === \"number\" || t === \"boolean\" || t === null) {\n\t\treturn true;\n\t}\n\tif (t !== \"object\") {\n\t\treturn false;\n\t}\n\tif (isArray(value)) {\n\t\treturn true;\n\t}\n\tif ((value as Buffer | null)?.buffer) {\n\t\treturn false;\n\t}\n\n\treturn (\n\t\t// eslint-disable-next-line ts-eslint/prefer-nullish-coalescing -- Nullish coalescing makes no sense in this boolean context\n\t\t(value?.constructor && value.constructor.name === \"Object\") ||\n\t\ttypeof (value as { toJSON: () => unknown } | null)?.toJSON === \"function\"\n\t);\n};\n","import type {\n\tCallApiRequestOptionsForHooks,\n\tCombinedCallApiExtraOptions,\n\tInterceptors,\n\tInterceptorsArray,\n} from \"./types\";\nimport { isFunction, isPlainObject, isString } from \"./utils/type-guards\";\nimport type { AnyFunction, Awaitable } from \"./utils/type-helpers\";\n\nexport type PluginInitContext<TData = unknown, TErrorData = unknown> = {\n\tinitURL: string;\n\toptions: CombinedCallApiExtraOptions<TData, TErrorData>;\n\trequest: Omit<CallApiRequestOptionsForHooks, \"fullURL\">;\n};\n\nexport type CallApiPlugin<TData = unknown, TErrorData = unknown> = {\n\t/**\n\t * @description A description for the plugin\n\t */\n\tdescription?: string;\n\n\t/**\n\t * Hooks/Interceptors for the plugin\n\t */\n\thooks?: Interceptors<TData, TErrorData>;\n\n\t/**\n\t * @description A unique id for the plugin\n\t */\n\tid: string;\n\n\t/**\n\t * @description A function that will be called when the plugin is\n\t * initialized. This will be called before the any\n\t * of the other internal functions.\n\t */\n\tinit?: (context: PluginInitContext<TData, TErrorData>) =>\n\t\t| Awaitable<{\n\t\t\t\toptions?: CombinedCallApiExtraOptions<TData, TErrorData>;\n\t\t\t\trequest: CallApiRequestOptionsForHooks;\n\t\t\t\turl?: string;\n\t\t }>\n\t\t| Awaitable<void>;\n\n\t/**\n\t * @description A name for the plugin\n\t */\n\tname: string;\n\n\t/**\n\t * @description A version for the plugin\n\t */\n\tversion?: string;\n};\n\nconst createMergedInterceptor = (\n\tinterceptors: Array<AnyFunction<Awaitable<unknown>> | undefined>,\n\tmergedInterceptorsExecutionMode: CombinedCallApiExtraOptions[\"mergedInterceptorsExecutionMode\"]\n) => {\n\treturn async (ctx: Record<string, unknown>) => {\n\t\tif (mergedInterceptorsExecutionMode === \"sequential\") {\n\t\t\tfor (const interceptor of interceptors) {\n\t\t\t\t// eslint-disable-next-line no-await-in-loop -- This is necessary in this case\n\t\t\t\tawait interceptor?.(ctx);\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (mergedInterceptorsExecutionMode === \"parallel\") {\n\t\t\tconst interceptorArray = [...interceptors];\n\n\t\t\tawait Promise.all(interceptorArray.map((uniqueInterceptor) => uniqueInterceptor?.(ctx)));\n\t\t}\n\t};\n};\n\ntype InterceptorsOrInterceptorsArray<TData, TErrorData> =\n\t| Interceptors<TData, TErrorData>\n\t| InterceptorsArray<TData, TErrorData>;\n\n// prettier-ignore\ntype PluginHooks<TData, TErrorData> = {\n\t[Key in keyof Interceptors<TData, TErrorData>]: Set<InterceptorsOrInterceptorsArray<TData, TErrorData>[Key]>;\n};\n\nexport const initializePlugins = async <TData, TErrorData>(\n\tcontext: PluginInitContext<TData, TErrorData>\n) => {\n\tconst { initURL, options, request } = context;\n\n\tconst hookRegistry = {\n\t\tonError: new Set([]),\n\t\tonRequest: new Set([]),\n\t\tonRequestError: new Set([]),\n\t\tonResponse: new Set([]),\n\t\tonResponseError: new Set([]),\n\t\tonSuccess: new Set([]),\n\t} satisfies PluginHooks<TData, TErrorData> as Required<PluginHooks<TData, TErrorData>>;\n\n\tconst addMainInterceptors = () => {\n\t\thookRegistry.onRequest.add(options.onRequest);\n\t\thookRegistry.onRequestError.add(options.onRequestError);\n\t\thookRegistry.onResponse.add(options.onResponse);\n\t\thookRegistry.onResponseError.add(options.onResponseError);\n\t\thookRegistry.onSuccess.add(options.onSuccess);\n\t\thookRegistry.onError.add(options.onError);\n\t};\n\n\tconst addPluginInterceptors = (pluginHooks: Interceptors<TData, TErrorData>) => {\n\t\thookRegistry.onRequest.add(pluginHooks.onRequest);\n\t\thookRegistry.onRequestError.add(pluginHooks.onRequestError);\n\t\thookRegistry.onResponse.add(pluginHooks.onResponse);\n\t\thookRegistry.onResponseError.add(pluginHooks.onResponseError);\n\t\thookRegistry.onSuccess.add(pluginHooks.onSuccess);\n\t\thookRegistry.onError.add(pluginHooks.onError);\n\t};\n\n\tif (options.mergedInterceptorsExecutionOrder === \"mainInterceptorFirst\") {\n\t\taddMainInterceptors();\n\t}\n\n\tconst resolvedPlugins = isFunction(options.plugins)\n\t\t? [options.plugins({ initURL, options, request }), options.extend?.plugins ?? []].flat()\n\t\t: [options.plugins ?? [], options.extend?.plugins ?? []].flat();\n\n\tlet resolvedUrl = initURL;\n\tlet resolvedOptions = options;\n\tlet resolvedRequestOptions = request;\n\n\tconst executePluginInit = async (pluginInit: CallApiPlugin<TData, TErrorData>[\"init\"]) => {\n\t\tif (!pluginInit) return;\n\n\t\tconst pluginInitResult = await pluginInit({ initURL, options, request });\n\n\t\tif (!isPlainObject(pluginInitResult)) return;\n\n\t\tif (isString(pluginInitResult.url)) {\n\t\t\tresolvedUrl = pluginInitResult.url;\n\t\t}\n\n\t\tif (isPlainObject(pluginInitResult.request)) {\n\t\t\tresolvedRequestOptions = pluginInitResult.request;\n\t\t}\n\n\t\tif (isPlainObject(pluginInitResult.options)) {\n\t\t\tresolvedOptions = pluginInitResult.options;\n\t\t}\n\t};\n\n\tfor (const plugin of options.override?.plugins ?? 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\taddPluginInterceptors(plugin.hooks);\n\t}\n\n\tif (\n\t\t!options.mergedInterceptorsExecutionOrder ||\n\t\toptions.mergedInterceptorsExecutionOrder === \"mainInterceptorLast\"\n\t) {\n\t\taddMainInterceptors();\n\t}\n\n\tconst handleInterceptorsMerge = (interceptors: Array<AnyFunction<Awaitable<unknown>> | undefined>) => {\n\t\tconst mergedInterceptor = createMergedInterceptor(\n\t\t\tinterceptors,\n\t\t\toptions.mergedInterceptorsExecutionMode\n\t\t);\n\n\t\treturn mergedInterceptor;\n\t};\n\n\tconst interceptors = {\n\t\tonError: handleInterceptorsMerge([...hookRegistry.onError].flat()),\n\t\tonRequest: handleInterceptorsMerge([...hookRegistry.onRequest].flat()),\n\t\tonRequestError: handleInterceptorsMerge([...hookRegistry.onRequestError].flat()),\n\t\tonResponse: handleInterceptorsMerge([...hookRegistry.onResponse].flat()),\n\t\tonResponseError: handleInterceptorsMerge([...hookRegistry.onResponseError].flat()),\n\t\tonSuccess: handleInterceptorsMerge([...hookRegistry.onSuccess].flat()),\n\t} satisfies Interceptors<TData, TErrorData>;\n\n\treturn {\n\t\tinterceptors,\n\t\tresolvedOptions,\n\t\tresolvedRequestOptions,\n\t\turl: resolvedUrl,\n\t};\n};\n\nexport const definePlugin = <\n\t// eslint-disable-next-line perfectionist/sort-union-types -- I want the first one to be first\n\tTPlugin extends CallApiPlugin<never, never> | AnyFunction<CallApiPlugin<never, never>>,\n>(\n\tplugin: TPlugin\n) => {\n\treturn plugin;\n};\n","/* eslint-disable perfectionist/sort-object-types -- Avoid Sorting for now */\n\nimport type { ExtraOptions } from \"./types\";\nimport { isFunction, isString } from \"./utils/type-guards\";\n\ntype ValueOrFunctionResult<TValue> = TValue | (() => TValue);\n\n/**\n * Bearer Or Token authentication\n *\n * The value of `bearer` will be added to a header as\n * `auth: Bearer some-auth-token`,\n *\n * The value of `token` will be added to a header as\n * `auth: Token some-auth-token`,\n */\nexport type BearerOrTokenAuth =\n\t| {\n\t\t\ttype?: never;\n\t\t\tbearer?: never;\n\t\t\ttoken?: ValueOrFunctionResult<string | null>;\n\t }\n\t| {\n\t\t\ttype?: never;\n\t\t\tbearer?: ValueOrFunctionResult<string | null>;\n\t\t\ttoken?: never;\n\t };\n\n/**\n * Basic auth\n */\nexport type BasicAuth = {\n\ttype: \"Basic\";\n\tusername: ValueOrFunctionResult<string | null | undefined>;\n\tpassword: ValueOrFunctionResult<string | null | undefined>;\n};\n\n/**\n * Custom auth\n *\n * @param prefix - prefix of the header\n * @param authValue - value of the header\n *\n * @example\n * ```ts\n * {\n * type: \"Custom\",\n * prefix: \"Token\",\n * authValue: \"token\"\n * }\n * ```\n */\nexport type CustomAuth = {\n\ttype: \"Custom\";\n\tprefix: ValueOrFunctionResult<string | null | undefined>;\n\tvalue: ValueOrFunctionResult<string | null | undefined>;\n};\n\n// eslint-disable-next-line perfectionist/sort-union-types -- Let the first one be first\nexport type Auth = BearerOrTokenAuth | BasicAuth | CustomAuth;\n\nconst getValue = (value: ValueOrFunctionResult<string | null | undefined>) => {\n\treturn isFunction(value) ? value() : value;\n};\n\ntype AuthorizationHeader = {\n\tAuthorization: string;\n};\n\nexport const getAuthHeader = (auth: ExtraOptions[\"auth\"]): false | AuthorizationHeader | undefined => {\n\tif (auth === undefined) return;\n\n\tif (isString(auth) || auth === null) {\n\t\treturn { Authorization: `Bearer ${auth}` };\n\t}\n\n\tswitch (auth.type) {\n\t\tcase \"Basic\": {\n\t\t\tconst username = getValue(auth.username);\n\t\t\tconst password = getValue(auth.password);\n\n\t\t\tif (username === undefined || password === undefined) return;\n\n\t\t\treturn {\n\t\t\t\tAuthorization: `Basic ${globalThis.btoa(`${username}:${password}`)}`,\n\t\t\t};\n\t\t}\n\n\t\tcase \"Custom\": {\n\t\t\tconst value = getValue(auth.value);\n\n\t\t\tif (value === undefined) return;\n\n\t\t\tconst prefix = getValue(auth.prefix);\n\n\t\t\treturn {\n\t\t\t\tAuthorization: `${prefix} ${value}`,\n\t\t\t};\n\t\t}\n\n\t\tdefault: {\n\t\t\tconst bearer = getValue(auth.bearer);\n\t\t\tconst token = getValue(auth.token);\n\n\t\t\tif (\"token\" in auth && token !== undefined) {\n\t\t\t\treturn { Authorization: `Token ${token}` };\n\t\t\t}\n\n\t\t\treturn bearer !== undefined && { Authorization: `Bearer ${bearer}` };\n\t\t}\n\t}\n};\n","// == These two types allows for adding arbitrary literal types, while still provided autocomplete for defaults.\n// == Usually intersection with \"{}\" or \"NonNullable<unknown>\" would make it work fine, but the placeholder with never type is added to make the AnyWhatever type appear last in a given union.\nexport type AnyString = string & { placeholder?: never };\nexport type AnyNumber = number & { placeholder?: never };\n\n// eslint-disable-next-line ts-eslint/no-explicit-any -- Any is required here so that one can pass custom function type without type errors\nexport type AnyFunction<TResult = any> = (...args: any[]) => TResult;\n\nexport type CallbackFn<in TParams, out TResult = void> = (...params: TParams[]) => TResult;\n\nexport type Prettify<TObject> = NonNullable<unknown> & { [Key in keyof TObject]: TObject[Key] };\n\nexport type Writeable<TObject, TType extends \"deep\" | \"shallow\" = \"shallow\"> = {\n\t-readonly [key in keyof TObject]: TType extends \"shallow\"\n\t\t? TObject[key]\n\t\t: TType extends \"deep\"\n\t\t\t? TObject[key] extends object\n\t\t\t\t? Writeable<TObject[key], TType>\n\t\t\t\t: TObject[key]\n\t\t\t: never;\n};\n\nexport const defineEnum = <const TValue>(value: TValue) => value as Prettify<Writeable<TValue, \"deep\">>;\n\n// == Using this Immediately Indexed Mapped type helper to help show computed type of anything passed to it instead of just the type name\nexport type UnmaskType<TValue> = { _: TValue }[\"_\"];\n\nexport type Awaitable<TValue> = Promise<TValue> | TValue;\n\nexport type CommonRequestHeaders =\n\t| \"Access-Control-Allow-Credentials\"\n\t| \"Access-Control-Allow-Headers\"\n\t| \"Access-Control-Allow-Methods\"\n\t| \"Access-Control-Allow-Origin\"\n\t| \"Access-Control-Expose-Headers\"\n\t| \"Access-Control-Max-Age\"\n\t| \"Age\"\n\t| \"Allow\"\n\t| \"Cache-Control\"\n\t| \"Clear-Site-Data\"\n\t| \"Content-Disposition\"\n\t| \"Content-Encoding\"\n\t| \"Content-Language\"\n\t| \"Content-Length\"\n\t| \"Content-Location\"\n\t| \"Content-Range\"\n\t| \"Content-Security-Policy-Report-Only\"\n\t| \"Content-Security-Policy\"\n\t| \"Cookie\"\n\t| \"Cross-Origin-Embedder-Policy\"\n\t| \"Cross-Origin-Opener-Policy\"\n\t| \"Cross-Origin-Resource-Policy\"\n\t| \"Date\"\n\t| \"ETag\"\n\t| \"Expires\"\n\t| \"Last-Modified\"\n\t| \"Location\"\n\t| \"Permissions-Policy\"\n\t| \"Pragma\"\n\t| \"Retry-After\"\n\t| \"Save-Data\"\n\t| \"Sec-CH-Prefers-Color-Scheme\"\n\t| \"Sec-CH-Prefers-Reduced-Motion\"\n\t| \"Sec-CH-UA-Arch\"\n\t| \"Sec-CH-UA-Bitness\"\n\t| \"Sec-CH-UA-Form-Factor\"\n\t| \"Sec-CH-UA-Full-Version-List\"\n\t| \"Sec-CH-UA-Full-Version\"\n\t| \"Sec-CH-UA-Mobile\"\n\t| \"Sec-CH-UA-Model\"\n\t| \"Sec-CH-UA-Platform-Version\"\n\t| \"Sec-CH-UA-Platform\"\n\t| \"Sec-CH-UA-WoW64\"\n\t| \"Sec-CH-UA\"\n\t| \"Sec-Fetch-Dest\"\n\t| \"Sec-Fetch-Mode\"\n\t| \"Sec-Fetch-Site\"\n\t| \"Sec-Fetch-User\"\n\t| \"Sec-GPC\"\n\t| \"Server-Timing\"\n\t| \"Server\"\n\t| \"Service-Worker-Navigation-Preload\"\n\t| \"Set-Cookie\"\n\t| \"Strict-Transport-Security\"\n\t| \"Timing-Allow-Origin\"\n\t| \"Trailer\"\n\t| \"Transfer-Encoding\"\n\t| \"Upgrade\"\n\t| \"Vary\"\n\t| \"Warning\"\n\t| \"WWW-Authenticate\"\n\t| \"X-Content-Type-Options\"\n\t| \"X-DNS-Prefetch-Control\"\n\t| \"X-Frame-Options\"\n\t| \"X-Permitted-Cross-Domain-Policies\"\n\t| \"X-Powered-By\"\n\t| \"X-Robots-Tag\"\n\t| \"X-XSS-Protection\";\n\nexport type CommonContentTypes =\n\t| \"application/epub+zip\"\n\t| \"application/gzip\"\n\t| \"application/json\"\n\t| \"application/ld+json\"\n\t| \"application/octet-stream\"\n\t| \"application/ogg\"\n\t| \"application/pdf\"\n\t| \"application/rtf\"\n\t| \"application/vnd.ms-fontobject\"\n\t| \"application/wasm\"\n\t| \"application/xhtml+xml\"\n\t| \"application/xml\"\n\t| \"application/zip\"\n\t| \"audio/aac\"\n\t| \"audio/mpeg\"\n\t| \"audio/ogg\"\n\t| \"audio/opus\"\n\t| \"audio/webm\"\n\t| \"audio/x-midi\"\n\t| \"font/otf\"\n\t| \"font/ttf\"\n\t| \"font/woff\"\n\t| \"font/woff2\"\n\t| \"image/avif\"\n\t| \"image/bmp\"\n\t| \"image/gif\"\n\t| \"image/jpeg\"\n\t| \"image/png\"\n\t| \"image/svg+xml\"\n\t| \"image/tiff\"\n\t| \"image/webp\"\n\t| \"image/x-icon\"\n\t| \"model/gltf-binary\"\n\t| \"model/gltf+json\"\n\t| \"text/calendar\"\n\t| \"text/css\"\n\t| \"text/csv\"\n\t| \"text/html\"\n\t| \"text/javascript\"\n\t| \"text/plain\"\n\t| \"video/3gpp\"\n\t| \"video/3gpp2\"\n\t| \"video/av1\"\n\t| \"video/mp2t\"\n\t| \"video/mp4\"\n\t| \"video/mpeg\"\n\t| \"video/ogg\"\n\t| \"video/webm\"\n\t| \"video/x-msvideo\";\n","/* eslint-disable ts-eslint/consistent-type-definitions -- I need to use interfaces for the sake of user overrides */\nimport type { Auth } from \"./auth\";\nimport type { CallApiPlugin, PluginInitContext } from \"./plugins\";\nimport type { getResponseType } from \"./utils/common\";\nimport type { fetchSpecificKeys } from \"./utils/constants\";\nimport {\n\ttype AnyNumber,\n\ttype AnyString,\n\ttype Awaitable,\n\ttype CommonContentTypes,\n\ttype CommonRequestHeaders,\n\ttype UnmaskType,\n\tdefineEnum,\n} from \"./utils/type-helpers\";\n\ntype FetchSpecificKeysUnion = Exclude<(typeof fetchSpecificKeys)[number], \"body\" | \"headers\" | \"method\">;\n\nexport interface CallApiRequestOptions extends Pick<RequestInit, FetchSpecificKeysUnion> {\n\t/**\n\t * @description Optional body of the request, can be a object or any other supported body type.\n\t */\n\tbody?: Record<string, unknown> | RequestInit[\"body\"];\n\n\t/**\n\t * @description Headers to be used in the request.\n\t */\n\theaders?:\n\t\t| Record<\"Content-Type\", CommonContentTypes>\n\t\t// eslint-disable-next-line perfectionist/sort-union-types -- I need the first one to be first\n\t\t| Record<CommonRequestHeaders | AnyString, string>\n\t\t| RequestInit[\"headers\"];\n\n\t/**\n\t * @description HTTP method for the request.\n\t * @default \"GET\"\n\t */\n\tmethod?: \"DELETE\" | \"GET\" | \"PATCH\" | \"POST\" | \"PUT\" | AnyString;\n}\n\nexport interface CallApiRequestOptionsForHooks extends CallApiRequestOptions {\n\t/**\n\t * @description Resolved request URL\n\t */\n\treadonly fullURL?: string;\n\n\t// eslint-disable-next-line perfectionist/sort-union-types -- I need the first one to be first\n\theaders?: Record<CommonRequestHeaders | AnyString, string>;\n}\n\n// eslint-disable-next-line ts-eslint/no-empty-object-type -- This needs to be empty to allow users to register their own meta\nexport interface Register {\n\t// == meta: R_Meta\n}\n\nexport type R_Meta = Register extends { meta?: infer TMeta extends Record<string, unknown> }\n\t? TMeta\n\t: never;\n\nexport interface Interceptors<TData = unknown, TErrorData = unknown> {\n\t/**\n\t * @description Interceptor to be called when any error occurs within the request/response lifecyle, regardless of whether the error is from the api or not.\n\t * It is basically a combination of `onRequestError` and `onResponseError` interceptors\n\t */\n\tonError?: (context: ErrorContext<TErrorData>) => Awaitable<unknown>;\n\n\t/**\n\t * @description Interceptor to be called just before the request is made, allowing for modifications or additional operations.\n\t */\n\tonRequest?: (context: RequestContext) => Awaitable<unknown>;\n\n\t/**\n\t * @description Interceptor to be called when an error occurs during the fetch request.\n\t */\n\tonRequestError?: (context: RequestErrorContext) => Awaitable<unknown>;\n\n\t/**\n\t * @description Interceptor to be called when any response is received from the api, whether successful or not\n\t */\n\tonResponse?: (context: ResponseContext<TData, TErrorData>) => Awaitable<unknown>;\n\n\t/**\n\t * @description Interceptor to be called when an error response is received from the api.\n\t */\n\tonResponseError?: (context: ResponseErrorContext<TErrorData>) => Awaitable<unknown>;\n\n\t/**\n\t * @description Interceptor to be called when a successful response is received from the api.\n\t */\n\tonSuccess?: (context: SuccessContext<TData>) => Awaitable<unknown>;\n}\n\nexport interface InterceptorsArray<TData = unknown, TErrorData = unknown> {\n\t/**\n\t * @description Interceptor to be called when any error occurs within the request/response lifecyle, regardless of whether the error is from the api or not.\n\t * It is basically a combination of `onRequestError` and `onResponseError` interceptors\n\t */\n\tonError?: Array<Interceptors<TData, TErrorData>[\"onError\"]>;\n\n\t/**\n\t * @description Interceptor to be called just before the request is made, allowing for modifications or additional operations.\n\t */\n\tonRequest?: Array<Interceptors<TData, TErrorData>[\"onRequest\"]>;\n\n\t/**\n\t * @description Interceptor to be called when an error occurs during the fetch request.\n\t */\n\tonRequestError?: Array<Interceptors<TData, TErrorData>[\"onRequestError\"]>;\n\n\t/**\n\t * @description Interceptor to be called when any response is received from the api, whether successful or not\n\t */\n\tonResponse?: Array<Interceptors<TData, TErrorData>[\"onResponse\"]>;\n\n\t/**\n\t * @description Interceptor to be called when an error response is received from the api.\n\t */\n\tonResponseError?: Array<Interceptors<TData, TErrorData>[\"onResponseError\"]>;\n\n\t/**\n\t * @description Interceptor to be called when a successful response is received from the api.\n\t */\n\tonSuccess?: Array<Interceptors<TData, TErrorData>[\"onSuccess\"]>;\n}\n\ntype FetchImpl = UnmaskType<(input: string | Request | URL, init?: RequestInit) => Promise<Response>>;\n\ntype CallApiPluginArray<TData, TErrorData> = Array<CallApiPlugin<TData, TErrorData>>;\n\ntype CallApiPluginFn<TData, TErrorData> = (\n\tcontext: PluginInitContext<TData, TErrorData>\n) => Array<CallApiPlugin<TData, TErrorData>>;\n\nexport type ExtraOptions<\n\tTData = unknown,\n\tTErrorData = unknown,\n\tTResultMode extends CallApiResultModeUnion = CallApiResultModeUnion,\n\t// eslint-disable-next-line perfectionist/sort-intersection-types -- I want the first one to be first\n> = (Interceptors<TData, TErrorData> | InterceptorsArray<TData, TErrorData>) & {\n\t/**\n\t * @description Authorization header value.\n\t */\n\tauth?: string | Auth | null;\n\n\t/**\n\t * @description Base URL to be prepended to all request URLs\n\t */\n\tbaseURL?: string;\n\n\t/**\n\t * @description Custom function to serialize the body object into a string.\n\t */\n\tbodySerializer?: (bodyData: Record<string, unknown>) => string;\n\n\t/**\n\t * @description Whether or not to clone the response, so response.json() and the like, can be read again else where.\n\t * @see https://developer.mozilla.org/en-US/docs/Web/API/Response/clone\n\t * @default false\n\t */\n\tcloneResponse?: boolean;\n\n\t/**\n\t * @description Custom fetch implementation\n\t */\n\tcustomFetchImpl?: FetchImpl;\n\n\t/**\n\t * @description Custom request key to be used to identify a request in the fetch deduplication strategy.\n\t * @default the full request url + string formed from the request options\n\t */\n\tdedupeKey?: string;\n\n\t/**\n\t * @description Defines the deduplication strategy for the request, can be set to \"none\" | \"defer\" | \"cancel\".\n\t * - If set to \"none\", deduplication is disabled.\n\t *\n\t * - If set to \"cancel\"(default), the previous pending request with the same request key will be cancelled and lets the new request through.\n\t *\n\t * - If set to \"defer\", all new request with the same request key will be share the same response, until the previous one is completed.\n\t * @default \"cancel\"\n\t */\n\tdedupeStrategy?: \"cancel\" | \"defer\" | \"none\";\n\n\t/**\n\t * @description Default error message to use if none is provided from a response.\n\t * @default \"Failed to fetch data from server!\"\n\t */\n\tdefaultErrorMessage?: string;\n\n\t/**\n\t * @description URL to be used in the request.\n\t */\n\treadonly initURL?: string;\n\n\t/**\n\t * @description Defines the mode in which the merged interceptors are executed, can be set to \"parallel\" | \"sequential\".\n\t * - If set to \"parallel\", both plugin and main interceptors will be executed in parallel.\n\t * - If set to \"sequential\", the plugin interceptors will be executed first, followed by the main interceptor.\n\t * @default \"parallel\"\n\t */\n\tmergedInterceptorsExecutionMode?: \"parallel\" | \"sequential\";\n\n\t/**\n\t * @description - Controls what order in which the mergedInterceptors execute\n\t * @default \"mainInterceptorLast\"\n\t */\n\tmergedInterceptorsExecutionOrder?: \"mainInterceptorFirst\" | \"mainInterceptorLast\";\n\n\t/**\n\t * @description - An optional field you can fill with additional information,\n\t * to associate with the request, typically used for logging or tracing.\n\t *\n\t * - A good use case for this, would be to use the info to handle specific cases in any of the shared interceptors.\n\t *\n\t * @example\n\t * ```ts\n\t * const callMainApi = callApi.create({\n\t * \tbaseURL: \"https://main-api.com\",\n\t * \tonResponseError: ({ response, options }) => {\n\t * \t\tif (options.meta?.userId) {\n\t * \t\t\tconsole.error(`User ${options.meta.userId} made an error`);\n\t * \t\t}\n\t * \t},\n\t * });\n\t *\n\t * const response = await callMainApi({\n\t * \turl: \"https://example.com/api/data\",\n\t * \tmeta: { userId: \"123\" },\n\t * });\n\t * ```\n\t */\n\tmeta?: R_Meta;\n\n\t/**\n\t * @description Params to be appended to the URL (i.e: /:id)\n\t */\n\t// eslint-disable-next-line perfectionist/sort-union-types -- I need the Record to be first\n\tparams?: Record<string, boolean | number | string> | Array<boolean | number | string>;\n\n\t/**\n\t * @description An array of CallApi plugins. It allows you to extend the behavior of the library.\n\t */\n\tplugins?: CallApiPluginArray<TData, TErrorData>;\n\n\t/**\n\t * @description Query parameters to append to the URL.\n\t */\n\tquery?: Record<string, boolean | number | string>;\n\n\t/**\n\t * @description 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\tresponseErrorValidator?: (data: unknown) => TErrorData;\n\n\t/**\n\t * @description Custom function to parse the response string into a object.\n\t */\n\tresponseParser?: (responseString: string) => Awaitable<Record<string, unknown>>;\n\n\t/**\n\t * @description Expected response type, affects how response is parsed\n\t * @default \"json\"\n\t */\n\tresponseType?: keyof ReturnType<typeof getResponseType>;\n\n\t/**\n\t * @description Custom function to validate the response data.\n\t */\n\tresponseValidator?: (data: unknown) => TData;\n\n\t/**\n\t * @description Mode of the result, can influence how results are handled or returned.\n\t * Can be set to \"all\" | \"onlySuccess\" | \"onlyError\" | \"onlyResponse\".\n\t * @default \"all\"\n\t */\n\tresultMode?: TResultMode;\n\n\t/**\n\t * @description Number of retry attempts for failed requests\n\t * @default 0\n\t */\n\tretryAttempts?: number;\n\n\t/**\n\t * @description HTTP status codes that trigger a retry\n\t * @default [409, 425, 429, 500, 502, 503, 504]\n\t */\n\tretryCodes?: Array<409 | 425 | 429 | 500 | 502 | 503 | 504 | AnyNumber>;\n\n\t/**\n\t * @description Delay between retries in milliseconds\n\t * @default 500\n\t */\n\tretryDelay?: number;\n\n\t/**\n\t * HTTP methods that are allowed to retry\n\t * @default [\"GET\", \"POST\"]\n\t */\n\tretryMethods?: Array<\"GET\" | \"POST\" | AnyString>;\n\n\t/**\n\t * If true or the function returns true, throws errors instead of returning them\n\t * The function is passed the error object and can be used to conditionally throw the error\n\t * @default false\n\t */\n\tthrowOnError?: boolean | ((context: ErrorContext<TErrorData>) => boolean);\n\n\t/**\n\t * @description Request timeout in milliseconds\n\t */\n\ttimeout?: number;\n};\n\nexport const optionsEnumToOmitFromBase = defineEnum([\"extend\", \"override\", \"dedupeKey\"]);\n\n// prettier-ignore\nexport interface BaseCallApiExtraOptions<\n\tTBaseData = unknown,\n\tTBaseErrorData = unknown,\n\tTBaseResultMode extends CallApiResultModeUnion = CallApiResultModeUnion,\n> extends Omit<CallApiExtraOptions<TBaseData, TBaseErrorData, TBaseResultMode>, typeof optionsEnumToOmitFromBase[number]> {\n\t/**\n\t * @description An array of CallApi plugins. It allows you to extend the behavior of the library.\n\t */\n\tplugins?: CallApiPluginArray<TBaseData, TBaseErrorData> | CallApiPluginFn<TBaseData, TBaseErrorData>;\n}\n\nexport const optionsEnumToOmitFromInstance = defineEnum([\"plugins\"]);\n\nexport interface CallApiExtraOptions<\n\tTData = unknown,\n\tTErrorData = unknown,\n\tTResultMode extends CallApiResultModeUnion = CallApiResultModeUnion,\n> extends Omit<\n\t\tExtraOptions<TData, TErrorData, TResultMode>,\n\t\t(typeof optionsEnumToOmitFromInstance)[number]\n\t> {\n\t/**\n\t * @description Options that should extend the base options.\n\t */\n\textend?: Pick<\n\t\tExtraOptions<TData, TErrorData, TResultMode>,\n\t\t(typeof optionsEnumToOmitFromInstance)[number]\n\t>;\n\n\t/**\n\t * @description Options that should override the base options.\n\t */\n\toverride?: Pick<\n\t\tExtraOptions<TData, TErrorData, TResultMode>,\n\t\t(typeof optionsEnumToOmitFromInstance)[number]\n\t>;\n}\n\n// prettier-ignore\nexport interface CombinedCallApiExtraOptions<\n\tTData = unknown,\n\tTErrorData = unknown,\n\tTResultMode extends CallApiResultModeUnion = CallApiResultModeUnion,\n> extends BaseCallApiExtraOptions<TData, TErrorData, TResultMode>, CallApiExtraOptions<TData, TErrorData, TResultMode> { }\n\n// prettier-ignore\nexport interface BaseCallApiConfig<\n\tTBaseData = unknown,\n\tTBaseErrorData = unknown,\n\tTBaseResultMode extends CallApiResultModeUnion = CallApiResultModeUnion,\n> extends CallApiRequestOptions, BaseCallApiExtraOptions<TBaseData, TBaseErrorData, TBaseResultMode> { }\n\n// prettier-ignore\nexport interface CallApiConfig<\n\tTData = unknown,\n\tTErrorData = unknown,\n\tTResultMode extends CallApiResultModeUnion = CallApiResultModeUnion,\n> extends CallApiRequestOptions, CallApiExtraOptions<TData, TErrorData, TResultMode> { }\n\nexport type CallApiParameters<\n\tTData = unknown,\n\tTErrorData = unknown,\n\tTResultMode extends CallApiResultModeUnion = CallApiResultModeUnion,\n> = [initURL: string, config?: CallApiConfig<TData, TErrorData, TResultMode>];\n\nexport type RequestContext = UnmaskType<{\n\toptions: CombinedCallApiExtraOptions;\n\trequest: CallApiRequestOptionsForHooks;\n}>;\n\nexport type ResponseContext<TData, TErrorData> = UnmaskType<\n\t| {\n\t\t\tdata: TData;\n\t\t\terror: null;\n\t\t\toptions: CombinedCallApiExtraOptions;\n\t\t\trequest: CallApiRequestOptionsForHooks;\n\t\t\tresponse: Response;\n\t }\n\t// eslint-disable-next-line perfectionist/sort-union-types -- I need the first one to be first\n\t| {\n\t\t\tdata: null;\n\t\t\terror: PossibleHTTPError<TErrorData>;\n\t\t\toptions: CombinedCallApiExtraOptions;\n\t\t\trequest: CallApiRequestOptionsForHooks;\n\t\t\tresponse: Response;\n\t }\n>;\n\nexport type SuccessContext<TData> = UnmaskType<{\n\tdata: TData;\n\toptions: CombinedCallApiExtraOptions;\n\trequest: CallApiRequestOptionsForHooks;\n\tresponse: Response;\n}>;\n\nexport type RequestErrorContext = UnmaskType<{\n\terror: PossibleJavaScriptError;\n\toptions: CombinedCallApiExtraOptions;\n\trequest: CallApiRequestOptionsForHooks;\n}>;\n\nexport type ResponseErrorContext<TErrorData> = UnmaskType<{\n\terror: PossibleHTTPError<TErrorData>;\n\toptions: CombinedCallApiExtraOptions;\n\trequest: CallApiRequestOptionsForHooks;\n\tresponse: Response;\n}>;\n\nexport type ErrorContext<TErrorData> = UnmaskType<\n\t| {\n\t\t\terror: PossibleHTTPError<TErrorData>;\n\t\t\toptions: CombinedCallApiExtraOptions;\n\t\t\trequest: CallApiRequestOptionsForHooks;\n\t\t\tresponse: Response;\n\t }\n\t| {\n\t\t\terror: PossibleJavaScriptError;\n\t\t\toptions: CombinedCallApiExtraOptions;\n\t\t\trequest: CallApiRequestOptionsForHooks;\n\t\t\tresponse: null;\n\t }\n>;\n\nexport type PossibleJavascriptErrorNames =\n\t| \"AbortError\"\n\t| \"Error\"\n\t| \"SyntaxError\"\n\t| \"TimeoutError\"\n\t| \"TypeError\"\n\t| (`${string}Error` & {});\n\nexport type PossibleJavaScriptError = UnmaskType<{\n\terrorData: DOMException | Error | SyntaxError | TypeError;\n\tmessage: string;\n\tname: PossibleJavascriptErrorNames;\n}>;\n\nexport type PossibleHTTPError<TErrorData> = UnmaskType<{\n\terrorData: TErrorData;\n\tmessage: string;\n\tname: \"HTTPError\";\n}>;\n\nexport type ErrorObjectUnion<TErrorData = unknown> =\n\t| PossibleHTTPError<TErrorData>\n\t| PossibleJavaScriptError;\n\nexport type CallApiResultSuccessVariant<TData> = {\n\tdata: TData;\n\terror: null;\n\tresponse: Response;\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<TData = unknown, TErrorData = unknown> = {\n\t// eslint-disable-next-line perfectionist/sort-union-types -- I need the first one to be first\n\tall: CallApiResultSuccessVariant<TData> | CallApiResultErrorVariant<TErrorData>;\n\tonlyError: CallApiResultErrorVariant<TErrorData>[\"error\"] | null;\n\tonlyResponse: CallApiResultSuccessVariant<TData>[\"response\"] | null;\n\tonlySuccess: CallApiResultSuccessVariant<TData>[\"data\"] | null;\n\tonlySuccessWithException: CallApiResultSuccessVariant<TData>[\"data\"];\n};\n\nexport type CallApiResultModeUnion =\n\t| { [Key in keyof ResultModeMap]: Key }[keyof ResultModeMap]\n\t| undefined;\n\nexport type GetCallApiResult<TData, TErrorData, TResultMode> = TErrorData extends false\n\t? ResultModeMap<TData, TErrorData>[\"onlySuccessWithException\"]\n\t: undefined extends TResultMode\n\t\t? ResultModeMap<TData, TErrorData>[\"all\"]\n\t\t: TResultMode extends NonNullable<CallApiResultModeUnion>\n\t\t\t? ResultModeMap<TData, TErrorData>[TResultMode]\n\t\t\t: never;\n","import type { BaseCallApiConfig } from \"../types\";\nimport { defineEnum } from \"./type-helpers\";\n\nexport const fetchSpecificKeys = defineEnum([\n\t\"body\",\n\t\"integrity\",\n\t\"method\",\n\t\"headers\",\n\t\"signal\",\n\t\"cache\",\n\t\"redirect\",\n\t\"window\",\n\t\"credentials\",\n\t\"keepalive\",\n\t\"referrer\",\n\t\"priority\",\n\t\"mode\",\n\t\"referrerPolicy\",\n] satisfies Array<keyof RequestInit>);\n\nconst retryCodesLookup = defineEnum({\n\t408: \"Request Timeout\",\n\t409: \"Conflict\",\n\t425: \"Too Early\",\n\t429: \"Too Many Requests\",\n\t500: \"Internal Server Error\",\n\t502: \"Bad Gateway\",\n\t503: \"Service Unavailable\",\n\t504: \"Gateway Timeout\",\n});\n\nexport const defaultRetryMethods = [\"GET\"] satisfies BaseCallApiConfig[\"retryMethods\"];\n\nexport const defaultRetryCodes = Object.keys(retryCodesLookup).map(\n\tNumber\n) as Required<BaseCallApiConfig>[\"retryCodes\"];\n","import { getAuthHeader } from \"@/auth\";\nimport {\n\ttype BaseCallApiExtraOptions,\n\ttype CallApiConfig,\n\ttype CallApiExtraOptions,\n\ttype CallApiRequestOptions,\n\ttype CallApiResultErrorVariant,\n\ttype ErrorObjectUnion,\n\ttype PossibleHTTPError,\n\ttype PossibleJavascriptErrorNames,\n\ttype ResultModeMap,\n\toptionsEnumToOmitFromBase,\n\toptionsEnumToOmitFromInstance,\n} from \"../types\";\nimport { fetchSpecificKeys } from \"./constants\";\nimport { isArray, isFunction, isPlainObject, isQueryString, isString } from \"./type-guards\";\nimport type { AnyFunction, Awaitable } from \"./type-helpers\";\n\nconst omitKeys = <TObject extends Record<string, unknown>, const TOmitArray extends Array<keyof TObject>>(\n\tinitialObject: TObject,\n\tkeysToOmit: TOmitArray\n) => {\n\tconst updatedObject = {} as Record<string, unknown>;\n\n\tconst keysToOmitSet = new Set(keysToOmit);\n\n\tfor (const [key, value] of Object.entries(initialObject)) {\n\t\tif (!keysToOmitSet.has(key)) {\n\t\t\tupdatedObject[key] = value;\n\t\t}\n\t}\n\n\treturn updatedObject as Omit<TObject, TOmitArray[number]>;\n};\n\nconst pickKeys = <TObject extends Record<string, unknown>, const TPickArray extends Array<keyof TObject>>(\n\tinitialObject: TObject,\n\tkeysToPick: TPickArray\n) => {\n\tconst updatedObject = {} as Record<string, unknown>;\n\n\tconst keysToPickSet = new Set(keysToPick);\n\n\tfor (const [key, value] of Object.entries(initialObject)) {\n\t\tif (keysToPickSet.has(key)) {\n\t\t\tupdatedObject[key] = value;\n\t\t}\n\t}\n\n\treturn updatedObject as Pick<TObject, TPickArray[number]>;\n};\n\n// eslint-disable-next-line ts-eslint/no-explicit-any -- Any is required here so that one can pass custom function type without type errors\nexport const splitBaseConfig = (baseConfig: Record<string, any>) =>\n\t[\n\t\tpickKeys(baseConfig, fetchSpecificKeys) as CallApiRequestOptions,\n\t\tomitKeys(baseConfig, [\n\t\t\t...fetchSpecificKeys,\n\t\t\t...optionsEnumToOmitFromBase,\n\t\t]) as BaseCallApiExtraOptions,\n\t] as const;\n\n// eslint-disable-next-line ts-eslint/no-explicit-any -- Any is required here so that one can pass custom function type without type errors\nexport const splitConfig = (config: Record<string, any>) =>\n\t[\n\t\tpickKeys(config, fetchSpecificKeys) as CallApiRequestOptions,\n\t\tomitKeys(config, [...fetchSpecificKeys, ...optionsEnumToOmitFromInstance]) as CallApiExtraOptions,\n\t] as const;\n\nexport const objectifyHeaders = (headers: RequestInit[\"headers\"]): Record<string, string> | undefined => {\n\tif (!headers || isPlainObject(headers)) {\n\t\treturn headers;\n\t}\n\n\treturn Object.fromEntries(headers);\n};\n\nexport const generateDedupeKey = (\n\turl: string,\n\tconfig: Record<string, unknown> & { shouldHaveDedupeKey: boolean }\n) => {\n\tif (!config.shouldHaveDedupeKey) {\n\t\treturn null;\n\t}\n\n\treturn `${url}-${JSON.stringify(config)}`;\n};\n\ntype ToQueryStringFn = {\n\t(params: CallApiConfig[\"query\"]): string | null;\n\t(params: Required<CallApiConfig>[\"query\"]): string;\n};\n\nexport const toQueryString: ToQueryStringFn = (params) => {\n\tif (!params) {\n\t\tconsole.error(\"toQueryString:\", \"No query params provided!\");\n\n\t\treturn null as never;\n\t}\n\n\treturn new URLSearchParams(params as Record<string, string>).toString();\n};\n\n// export mergeAndResolve\n\nexport const mergeAndResolveHeaders = (options: {\n\tauth: CallApiConfig[\"auth\"];\n\tbaseHeaders: CallApiConfig[\"headers\"];\n\tbody: CallApiConfig[\"body\"];\n\theaders: CallApiConfig[\"headers\"];\n}) => {\n\tconst { auth, baseHeaders, body, headers } = options;\n\n\t// eslint-disable-next-line ts-eslint/prefer-nullish-coalescing -- Nullish coalescing makes no sense in this boolean context\n\tconst shouldResolveHeaders = Boolean(baseHeaders || headers || body || auth);\n\n\t// == Return early if any of the following conditions are not met (so that native fetch would auto set the correct headers):\n\t// == - headers are provided\n\t// == - The body is an object\n\t// == - The auth option is provided\n\tif (!shouldResolveHeaders) return;\n\n\tconst headersObject: Record<string, string> = {\n\t\t...getAuthHeader(auth),\n\t\t...objectifyHeaders(baseHeaders),\n\t\t...objectifyHeaders(headers),\n\t};\n\n\tif (isQueryString(body)) {\n\t\theadersObject[\"Content-Type\"] = \"application/x-www-form-urlencoded\";\n\n\t\treturn headersObject;\n\t}\n\n\tif (isPlainObject(body) || (isString(body) && body.startsWith(\"{\"))) {\n\t\theadersObject[\"Content-Type\"] = \"application/json\";\n\t\theadersObject.Accept = \"application/json\";\n\t}\n\n\treturn headersObject;\n};\n\nexport const flattenHooks = <\n\tTBaseInterceptor extends\n\t\t| AnyFunction<Awaitable<unknown>>\n\t\t| Array<AnyFunction<Awaitable<unknown>> | undefined>,\n\tTInterceptor extends\n\t\t| AnyFunction<Awaitable<unknown>>\n\t\t| Array<AnyFunction<Awaitable<unknown>> | undefined>,\n>(\n\tbaseInterceptor: TBaseInterceptor | undefined,\n\tinterceptor: TInterceptor | undefined\n) => {\n\tif (isArray(baseInterceptor)) {\n\t\treturn [baseInterceptor, interceptor].flat() as TInterceptor;\n\t}\n\n\treturn interceptor ?? baseInterceptor;\n};\n\nexport const getFetchImpl = (customFetchImpl: CallApiExtraOptions[\"customFetchImpl\"]) => {\n\tif (customFetchImpl) {\n\t\treturn customFetchImpl;\n\t}\n\n\tif (typeof globalThis !== \"undefined\" && isFunction(globalThis.fetch)) {\n\t\treturn globalThis.fetch;\n\t}\n\n\tthrow new Error(\"No fetch implementation found\");\n};\n\nexport const getResponseType = <TResponse>(\n\tresponse: Response,\n\tparser?: Required<CallApiExtraOptions>[\"responseParser\"]\n) => ({\n\tarrayBuffer: () => response.arrayBuffer() as Promise<TResponse>,\n\tblob: () => response.blob() as Promise<TResponse>,\n\tformData: () => response.formData() as Promise<TResponse>,\n\tjson: async () => {\n\t\tif (parser) {\n\t\t\tconst text = await response.text();\n\t\t\treturn parser(text);\n\t\t}\n\n\t\treturn response.json() as Promise<TResponse>;\n\t},\n\tstream: () => response.body,\n\ttext: () => response.text() as Promise<TResponse>,\n});\n\nexport const executeHooks = <TInterceptor extends Awaitable<unknown>>(...interceptors: TInterceptor[]) =>\n\tPromise.all(interceptors);\n\nexport const getResponseData = async <TResponse>(\n\tresponse: Response,\n\tresponseType: keyof ReturnType<typeof getResponseType>,\n\tparser: CallApiExtraOptions[\"responseParser\"],\n\tvalidator?: CallApiExtraOptions[\"responseValidator\"]\n) => {\n\tconst RESPONSE_TYPE_LOOKUP = getResponseType<TResponse>(response, parser);\n\n\tif (!Object.hasOwn(RESPONSE_TYPE_LOOKUP, responseType)) {\n\t\tthrow new Error(`Invalid response type: ${responseType}`);\n\t}\n\n\tconst responseData = await RESPONSE_TYPE_LOOKUP[responseType]();\n\n\tconst validResponseData = validator ? validator(responseData) : responseData;\n\n\treturn validResponseData;\n};\n\ntype SuccessInfo = {\n\tdata: unknown;\n\tresponse: Response;\n\tresultMode: CallApiExtraOptions[\"resultMode\"];\n};\n\n// == The CallApiResult type is used to cast all return statements due to a design limitation in ts.\n// LINK - See https://www.zhenghao.io/posts/type-functions for more info\nexport const resolveSuccessResult = <CallApiResult>(info: SuccessInfo): CallApiResult => {\n\tconst { data, response, resultMode } = info;\n\n\tconst apiDetails = { data, error: null, response };\n\n\tif (!resultMode) {\n\t\treturn apiDetails as CallApiResult;\n\t}\n\n\tconst resultModeMap: ResultModeMap = {\n\t\tall: apiDetails,\n\t\tonlyError: apiDetails.error,\n\t\tonlyResponse: apiDetails.response,\n\t\tonlySuccess: apiDetails.data,\n\t\tonlySuccessWithException: apiDetails.data,\n\t};\n\n\treturn resultModeMap[resultMode] as CallApiResult;\n};\n\ntype ErrorInfo = {\n\tdefaultErrorMessage: Required<CallApiExtraOptions>[\"defaultErrorMessage\"];\n\terror?: unknown;\n\tmessage?: string;\n\tresultMode: CallApiExtraOptions[\"resultMode\"];\n};\n\nexport const resolveErrorResult = <TCallApiResult>(info: ErrorInfo) => {\n\tconst { defaultErrorMessage, error, message: customErrorMessage, resultMode } = info;\n\n\tlet apiDetails: CallApiResultErrorVariant<unknown> = {\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 PossibleJavascriptErrorNames,\n\t\t},\n\t\tresponse: null,\n\t};\n\n\tif (isHTTPErrorInstance(error)) {\n\t\tconst { errorData, message = defaultErrorMessage, name, response } = error;\n\n\t\tapiDetails = {\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},\n\t\t\tresponse,\n\t\t};\n\t}\n\n\tconst resultModeMap: ResultModeMap = {\n\t\tall: apiDetails,\n\t\tonlyError: apiDetails.error,\n\t\tonlyResponse: apiDetails.response,\n\t\tonlySuccess: apiDetails.data,\n\t\tonlySuccessWithException: apiDetails.data,\n\t};\n\n\tconst generalErrorResult = resultModeMap[resultMode ?? \"all\"] as TCallApiResult;\n\n\t// prettier-ignore\n\tconst resolveCustomErrorInfo = ({ message }: Pick<ErrorInfo, \"message\">) => {\n\t\tconst errorResult = resolveErrorResult<TCallApiResult>({ ...info, message });\n\n\t\treturn errorResult.generalErrorResult;\n\t};\n\n\treturn { apiDetails, generalErrorResult, resolveCustomErrorInfo };\n};\n\nexport const isHTTPError = <TErrorData>(\n\terror: ErrorObjectUnion<TErrorData> | null\n): error is PossibleHTTPError<TErrorData> => {\n\treturn isPlainObject(error) && error.name === \"HTTPError\";\n};\n\ntype ErrorDetails<TErrorResponse> = {\n\tdefaultErrorMessage: string;\n\terrorData: TErrorResponse;\n\tresponse: Response;\n};\n\ntype ErrorOptions = {\n\tcause?: unknown;\n};\n\nexport class HTTPError<TErrorResponse = Record<string, unknown>> extends Error {\n\terrorData: ErrorDetails<TErrorResponse>[\"errorData\"];\n\tisHTTPError = true;\n\n\toverride name = \"HTTPError\" as const;\n\n\tresponse: ErrorDetails<TErrorResponse>[\"response\"];\n\n\tconstructor(errorDetails: ErrorDetails<TErrorResponse>, errorOptions?: ErrorOptions) {\n\t\tconst { defaultErrorMessage, errorData, response } = errorDetails;\n\n\t\tsuper((errorData as { message?: string } | undefined)?.message ?? defaultErrorMessage, errorOptions);\n\n\t\tthis.errorData = errorData;\n\t\tthis.response = response;\n\n\t\tError.captureStackTrace(this, this.constructor);\n\t}\n}\n\nexport const isHTTPErrorInstance = <TErrorResponse>(\n\terror: unknown\n): error is HTTPError<TErrorResponse> => {\n\treturn (\n\t\t// prettier-ignore\n\t\terror instanceof HTTPError|| (isPlainObject(error) && error.name === \"HTTPError\" && error.isHTTPError === true)\n\t);\n};\n\nconst PromiseWithResolvers = () => {\n\tlet reject!: (reason?: unknown) => void;\n\tlet resolve!: (value: unknown) => void;\n\n\tconst promise = new Promise((res, rej) => {\n\t\tresolve = res;\n\t\treject = rej;\n\t});\n\n\treturn { promise, reject, resolve };\n};\n\nexport const waitUntil = (delay: number) => {\n\tif (delay === 0) return;\n\n\tconst { promise, resolve } = PromiseWithResolvers();\n\n\tsetTimeout(resolve, delay);\n\n\treturn promise;\n};\n","import type { CallApiConfig, CallApiExtraOptions } from \"./types\";\nimport { toQueryString } from \"./utils\";\nimport { isArray } from \"./utils/type-guards\";\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\n\t\t\t.split(slash)\n\t\t\t.filter((matchedParam) => matchedParam.startsWith(column));\n\n\t\tfor (const [index, matchedParam] of matchedParamArray.entries()) {\n\t\t\tconst param = params[index] as string;\n\t\t\tnewUrl = newUrl.replace(matchedParam, param);\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: CallApiConfig[\"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,\n\tparams: CallApiExtraOptions[\"params\"],\n\tquery: CallApiExtraOptions[\"query\"]\n) => {\n\tconst urlWithMergedParams = mergeUrlWithParams(url, params);\n\n\treturn mergeUrlWithQuery(urlWithMergedParams, query);\n};\n","// prettier-ignore\nexport const createCombinedSignal = (...signals: Array<AbortSignal | null | undefined>) => AbortSignal.any(signals.filter(Boolean));\n\nexport const createTimeoutSignal = (milliseconds: number) => AbortSignal.timeout(milliseconds);\n","import { initializePlugins } from \"./plugins\";\nimport type {\n\tBaseCallApiConfig,\n\tCallApiParameters,\n\tCallApiRequestOptions,\n\tCallApiRequestOptionsForHooks,\n\tCallApiResultModeUnion,\n\tCombinedCallApiExtraOptions,\n\tGetCallApiResult,\n\tPossibleHTTPError,\n\tPossibleJavaScriptError,\n} from \"./types\";\nimport { mergeUrlWithParamsAndQuery } from \"./url\";\nimport {\n\tHTTPError,\n\texecuteHooks,\n\tflattenHooks,\n\tgenerateDedupeKey,\n\tgetFetchImpl,\n\tgetResponseData,\n\tisHTTPErrorInstance,\n\tmergeAndResolveHeaders,\n\tresolveErrorResult,\n\tresolveSuccessResult,\n\tsplitBaseConfig,\n\tsplitConfig,\n\twaitUntil,\n} from \"./utils/common\";\nimport { defaultRetryCodes, defaultRetryMethods } from \"./utils/constants\";\nimport { createCombinedSignal, createTimeoutSignal } from \"./utils/polyfills\";\nimport { isFunction, isPlainObject } from \"./utils/type-guards\";\n\nexport const createFetchClient = <\n\tTBaseData = unknown,\n\tTBaseErrorData = unknown,\n\tTBaseResultMode extends CallApiResultModeUnion = CallApiResultModeUnion,\n>(\n\tbaseConfig: BaseCallApiConfig<TBaseData, TBaseErrorData, TBaseResultMode> = {}\n) => {\n\tconst [baseFetchConfig, baseExtraOptions] = splitBaseConfig(baseConfig);\n\n\tconst {\n\t\tbody: baseBody,\n\t\theaders: baseHeaders,\n\t\tsignal: baseSignal,\n\t\t...restOfBaseFetchConfig\n\t} = baseFetchConfig;\n\n\tconst requestInfoCache = new Map<\n\t\tstring | null,\n\t\t{ controller: AbortController; responsePromise: Promise<Response> }\n\t>();\n\n\tconst callApi = async <\n\t\tTData = TBaseData,\n\t\tTErrorData = TBaseErrorData,\n\t\tTResultMode extends CallApiResultModeUnion = TBaseResultMode,\n\t>(\n\t\t...parameters: CallApiParameters<TData, TErrorData, TResultMode>\n\t): Promise<GetCallApiResult<TData, TErrorData, TResultMode>> => {\n\t\tconst [initURL, config] = parameters;\n\n\t\ttype CallApiResult = never;\n\n\t\tconst [fetchConfig, extraOptions] = splitConfig(config ?? {});\n\n\t\tconst { body = baseBody, headers, signal = baseSignal, ...restOfFetchConfig } = fetchConfig;\n\n\t\t// == Default Extra Options\n\t\tconst defaultExtraOptions = {\n\t\t\tbaseURL: \"\",\n\t\t\tbodySerializer: JSON.stringify,\n\t\t\tdedupeStrategy: \"cancel\",\n\t\t\tdefaultErrorMessage: \"Failed to fetch data from server!\",\n\t\t\tmergedInterceptorsExecutionMode: \"parallel\",\n\t\t\tmergedInterceptorsExecutionOrder: \"mainInterceptorLast\",\n\t\t\tresponseType: \"json\",\n\t\t\tresultMode: \"all\",\n\t\t\tretryAttempts: 0,\n\t\t\tretryCodes: defaultRetryCodes,\n\t\t\tretryDelay: 0,\n\t\t\tretryMethods: defaultRetryMethods,\n\n\t\t\t...baseExtraOptions,\n\t\t\t...extraOptions,\n\n\t\t\tonError: flattenHooks(baseExtraOptions.onError, extraOptions.onError),\n\t\t\tonRequest: flattenHooks(baseExtraOptions.onRequest, extraOptions.onRequest),\n\t\t\tonRequestError: flattenHooks(baseExtraOptions.onRequestError, extraOptions.onRequestError),\n\t\t\tonResponse: flattenHooks(baseExtraOptions.onResponse, extraOptions.onResponse),\n\t\t\tonResponseError: flattenHooks(baseExtraOptions.onResponseError, extraOptions.onResponseError),\n\t\t\tonSuccess: flattenHooks(baseExtraOptions.onSuccess, extraOptions.onSuccess),\n\t\t} satisfies CombinedCallApiExtraOptions;\n\n\t\tconst { interceptors, resolvedOptions, resolvedRequestOptions, url } = await initializePlugins({\n\t\t\tinitURL,\n\t\t\toptions: defaultExtraOptions,\n\t\t\trequest: { ...restOfBaseFetchConfig, ...restOfFetchConfig },\n\t\t});\n\n\t\tconst options = {\n\t\t\t...resolvedOptions,\n\t\t\t...interceptors,\n\t\t\tinitURL,\n\t\t} satisfies CombinedCallApiExtraOptions as typeof defaultExtraOptions & typeof interceptors;\n\n\t\t// == Default Request Options\n\t\tconst defaultRequestOptions = {\n\t\t\tbody: isPlainObject(body) ? options.bodySerializer(body) : body,\n\t\t\tmethod: \"GET\",\n\n\t\t\t...resolvedRequestOptions,\n\t\t} satisfies CallApiRequestOptions;\n\n\t\tconst fullURL = `${options.baseURL}${mergeUrlWithParamsAndQuery(url, options.params, options.query)}`;\n\n\t\t// prettier-ignore\n\t\tconst shouldHaveDedupeKey = options.dedupeStrategy === \"cancel\" || options.dedupeStrategy === \"defer\";\n\n\t\tconst dedupeKey =\n\t\t\toptions.dedupeKey ??\n\t\t\tgenerateDedupeKey(fullURL, { shouldHaveDedupeKey, ...resolvedRequestOptions, ...options });\n\n\t\t// == This is required to leave the smallest window of time for the cache to be updated with the last request info, if all requests with the same key start at the same time\n\t\tif (dedupeKey != null) {\n\t\t\tawait waitUntil(0.1);\n\t\t}\n\n\t\t// == This ensures cache operations only occur when key is available\n\t\tconst requestInfoCacheOrNull = dedupeKey != null ? requestInfoCache : null;\n\n\t\tconst prevRequestInfo = requestInfoCacheOrNull?.get(dedupeKey);\n\n\t\tif (prevRequestInfo && options.dedupeStrategy === \"cancel\") {\n\t\t\tconst message = options.dedupeKey\n\t\t\t\t? `Duplicate request detected - Aborting previous request with key '${dedupeKey}' as a new request was initiated`\n\t\t\t\t: `Duplicate request detected - Aborting previous request to '${fullURL}' as a new request with identical options was initiated`;\n\n\t\t\tconst reason = new DOMException(message, \"AbortError\");\n\n\t\t\tprevRequestInfo.controller.abort(reason);\n\t\t}\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(newFetchController.signal, timeoutSignal, signal);\n\n\t\tconst request = {\n\t\t\tfullURL,\n\t\t\tsignal: combinedSignal,\n\t\t\t...defaultRequestOptions,\n\t\t} satisfies CallApiRequestOptionsForHooks;\n\n\t\tconst fetch = getFetchImpl(options.customFetchImpl);\n\n\t\ttry {\n\t\t\tawait executeHooks(options.onRequest({ options, request }));\n\n\t\t\t// == Apply determined headers\n\t\t\trequest.headers = mergeAndResolveHeaders({\n\t\t\t\tauth: options.auth,\n\t\t\t\tbaseHeaders: baseHeaders ?? headers,\n\t\t\t\tbody,\n\t\t\t\theaders: request.headers,\n\t\t\t});\n\n\t\t\tconst shouldUsePromiseFromCache = prevRequestInfo && options.dedupeStrategy === \"defer\";\n\n\t\t\tconst responsePromise = shouldUsePromiseFromCache\n\t\t\t\t? prevRequestInfo.responsePromise\n\t\t\t\t: fetch(fullURL, request as RequestInit);\n\n\t\t\trequestInfoCacheOrNull?.set(dedupeKey, { controller: newFetchController, responsePromise });\n\n\t\t\tconst response = await responsePromise;\n\n\t\t\tconst shouldRetry =\n\t\t\t\t!response.ok &&\n\t\t\t\t!combinedSignal.aborted &&\n\t\t\t\toptions.retryAttempts > 0 &&\n\t\t\t\toptions.retryCodes.includes(response.status) &&\n\t\t\t\toptions.retryMethods.includes(request.method);\n\n\t\t\tif (shouldRetry) {\n\t\t\t\tawait waitUntil(options.retryDelay);\n\n\t\t\t\treturn await callApi(initURL, { ...config, retryAttempts: options.retryAttempts - 1 });\n\t\t\t}\n\n\t\t\t// == Clone response when dedupeStrategy is set to \"defer\", to avoid error thrown from reading response.(whatever) more than once\n\t\t\t// == Also clone response when resultMode is set to \"onlyResponse\", to avoid error thrown from reading response.(whatever) more than once\n\t\t\tconst shouldCloneResponse =\n\t\t\t\toptions.dedupeStrategy === \"defer\" ||\n\t\t\t\toptions.resultMode === \"onlyResponse\" ||\n\t\t\t\toptions.cloneResponse;\n\n\t\t\tif (!response.ok) {\n\t\t\t\tconst errorData = await getResponseData<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\toptions.responseErrorValidator\n\t\t\t\t);\n\n\t\t\t\t// == Pushing all error handling responsibilities to the catch block\n\t\t\t\tthrow new HTTPError({\n\t\t\t\t\tdefaultErrorMessage: options.defaultErrorMessage,\n\t\t\t\t\terrorData,\n\t\t\t\t\tresponse,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst successData = await getResponseData<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\toptions.responseValidator\n\t\t\t);\n\n\t\t\tawait executeHooks(\n\t\t\t\toptions.onSuccess({\n\t\t\t\t\tdata: successData,\n\t\t\t\t\toptions,\n\t\t\t\t\trequest,\n\t\t\t\t\tresponse: options.cloneResponse ? response.clone() : response,\n\t\t\t\t}),\n\n\t\t\t\toptions.onResponse({\n\t\t\t\t\tdata: successData,\n\t\t\t\t\terror: null,\n\t\t\t\t\toptions,\n\t\t\t\t\trequest,\n\t\t\t\t\tresponse: options.cloneResponse ? response.clone() : response,\n\t\t\t\t})\n\t\t\t);\n\n\t\t\treturn resolveSuccessResult<CallApiResult>({\n\t\t\t\tdata: successData,\n\t\t\t\tresponse,\n\t\t\t\tresultMode: options.resultMode,\n\t\t\t});\n\n\t\t\t// == Exhaustive Error handling\n\t\t} catch (error) {\n\t\t\tconst { apiDetails, generalErrorResult, resolveCustomErrorInfo } =\n\t\t\t\tresolveErrorResult<CallApiResult>({\n\t\t\t\t\tdefaultErrorMessage: options.defaultErrorMessage,\n\t\t\t\t\terror,\n\t\t\t\t\tresultMode: options.resultMode,\n\t\t\t\t});\n\n\t\t\tconst shouldThrowOnError = isFunction(options.throwOnError)\n\t\t\t\t? options.throwOnError({\n\t\t\t\t\t\terror: apiDetails.error as never,\n\t\t\t\t\t\toptions,\n\t\t\t\t\t\trequest,\n\t\t\t\t\t\tresponse: apiDetails.response,\n\t\t\t\t\t})\n\t\t\t\t: options.throwOnError;\n\n\t\t\t// eslint-disable-next-line unicorn/consistent-function-scoping -- This error is wrong cause the function is using some variables within the catch block\n\t\t\tconst handleThrowOnError = () => {\n\t\t\t\tif (!shouldThrowOnError) return;\n\n\t\t\t\tthrow apiDetails.error as Error;\n\t\t\t};\n\n\t\t\tif (isHTTPErrorInstance<TErrorData>(error)) {\n\t\t\t\tconst { response } = error;\n\n\t\t\t\tconst possibleHttpError = (generalErrorResult as { error: PossibleHTTPError<TErrorData> })\n\t\t\t\t\t.error;\n\n\t\t\t\tawait executeHooks(\n\t\t\t\t\toptions.onResponseError({\n\t\t\t\t\t\terror: possibleHttpError,\n\t\t\t\t\t\toptions,\n\t\t\t\t\t\trequest,\n\t\t\t\t\t\tresponse: options.cloneResponse ? response.clone() : response,\n\t\t\t\t\t}),\n\n\t\t\t\t\toptions.onError({\n\t\t\t\t\t\terror: possibleHttpError,\n\t\t\t\t\t\toptions,\n\t\t\t\t\t\trequest,\n\t\t\t\t\t\tresponse: options.cloneResponse ? response.clone() : response,\n\t\t\t\t\t}),\n\n\t\t\t\t\toptions.onResponse({\n\t\t\t\t\t\tdata: null,\n\t\t\t\t\t\terror: possibleHttpError,\n\t\t\t\t\t\toptions,\n\t\t\t\t\t\trequest,\n\t\t\t\t\t\tresponse: options.cloneResponse ? response.clone() : response,\n\t\t\t\t\t})\n\t\t\t\t);\n\n\t\t\t\thandleThrowOnError();\n\n\t\t\t\treturn generalErrorResult;\n\t\t\t}\n\n\t\t\tif (error instanceof DOMException && error.name === \"TimeoutError\") {\n\t\t\t\tconst message = `Request timed out after ${options.timeout}ms`;\n\n\t\t\t\tconsole.error(`${error.name}:`, message);\n\n\t\t\t\thandleThrowOnError();\n\n\t\t\t\treturn resolveCustomErrorInfo({ message });\n\t\t\t}\n\n\t\t\tif (error instanceof DOMException && error.name === \"AbortError\") {\n\t\t\t\tconst { message, name } = error;\n\n\t\t\t\tconsole.error(`${name}:`, message);\n\n\t\t\t\thandleThrowOnError();\n\n\t\t\t\treturn generalErrorResult;\n\t\t\t}\n\n\t\t\tconst possibleJavascriptError = (generalErrorResult as { error: PossibleJavaScriptError }).error;\n\n\t\t\tawait executeHooks(\n\t\t\t\t// == At this point only the request errors exist, so the request error interceptor is called\n\t\t\t\toptions.onRequestError({\n\t\t\t\t\terror: possibleJavascriptError,\n\t\t\t\t\toptions,\n\t\t\t\t\trequest,\n\t\t\t\t}),\n\n\t\t\t\t// == Also call the onError interceptor\n\t\t\t\toptions.onError({\n\t\t\t\t\terror: possibleJavascriptError,\n\t\t\t\t\toptions,\n\t\t\t\t\trequest,\n\t\t\t\t\tresponse: null,\n\t\t\t\t})\n\t\t\t);\n\n\t\t\thandleThrowOnError();\n\n\t\t\treturn generalErrorResult;\n\n\t\t\t// == Removing the now unneeded AbortController from store\n\t\t} finally {\n\t\t\trequestInfoCacheOrNull?.delete(dedupeKey);\n\t\t}\n\t};\n\n\tcallApi.create = createFetchClient;\n\n\treturn callApi;\n};\n\nexport const callApi = createFetchClient();\n"],"mappings":"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","names":["interceptors","callApi"]}
@@ -1,16 +1,16 @@
1
- import { R as ResultModeUnion, B as BaseCallApiConfig, C as CallApiConfig, G as GetCallApiResult } from './index-CsbbOYaN.cjs';
2
- export { d as ErrorContext, E as ExtraOptions, a as RequestOptions, b as ResponseContext, c as ResponseErrorContext } from './index-CsbbOYaN.cjs';
1
+ import { C as CallApiResultModeUnion, B as BaseCallApiConfig, a as CallApiConfig, G as GetCallApiResult } from './index-CQTSJgO6.cjs';
2
+ export { c as BaseCallApiExtraOptions, e as CallApiExtraOptions, f as CallApiParameters, b as CallApiPlugin, g as CallApiRequestOptions, h as CallApiRequestOptionsForHooks, i as CallApiResultErrorVariant, j as CallApiResultSuccessVariant, k as CombinedCallApiExtraOptions, E as ErrorContext, P as PluginInitContext, l as PossibleJavascriptErrorNames, R as Register, m as RequestContext, n as RequestErrorContext, o as ResponseContext, p as ResponseErrorContext, S as SuccessContext, d as definePlugin } from './index-CQTSJgO6.cjs';
3
3
 
4
- declare const createFetchClient: <TBaseData, TBaseErrorData = unknown, TBaseResultMode extends ResultModeUnion = "all">(baseConfig?: BaseCallApiConfig<TBaseData, TBaseErrorData, TBaseResultMode>) => {
5
- <TData = TBaseData, TErrorData = TBaseErrorData, TResultMode extends ResultModeUnion = TBaseResultMode>(url: string, config?: CallApiConfig<TData, TErrorData, TResultMode>): Promise<GetCallApiResult<TData, TErrorData, TResultMode>>;
6
- create: any;
4
+ declare const createFetchClient: <TBaseData = unknown, TBaseErrorData = unknown, TBaseResultMode extends CallApiResultModeUnion = CallApiResultModeUnion>(baseConfig?: BaseCallApiConfig<TBaseData, TBaseErrorData, TBaseResultMode>) => {
5
+ <TData = TBaseData, TErrorData = TBaseErrorData, TResultMode extends CallApiResultModeUnion = TBaseResultMode>(initURL: string, config?: CallApiConfig<TData, TErrorData, TResultMode> | undefined): Promise<GetCallApiResult<TData, TErrorData, TResultMode>>;
6
+ create: /*elided*/ any;
7
7
  };
8
8
  declare const callApi: {
9
- <TData = unknown, TErrorData = unknown, TResultMode extends ResultModeUnion = "all">(url: string, config?: CallApiConfig<TData, TErrorData, TResultMode>): Promise<GetCallApiResult<TData, TErrorData, TResultMode>>;
10
- create: <TBaseData, TBaseErrorData = unknown, TBaseResultMode extends ResultModeUnion = "all">(baseConfig?: BaseCallApiConfig<TBaseData, TBaseErrorData, TBaseResultMode>) => {
11
- <TData = TBaseData, TErrorData = TBaseErrorData, TResultMode extends ResultModeUnion = TBaseResultMode>(url: string, config?: CallApiConfig<TData, TErrorData, TResultMode>): Promise<GetCallApiResult<TData, TErrorData, TResultMode>>;
12
- create: any;
9
+ <TData = unknown, TErrorData = unknown, TResultMode extends CallApiResultModeUnion = CallApiResultModeUnion>(initURL: string, config?: CallApiConfig<TData, TErrorData, TResultMode> | undefined): Promise<GetCallApiResult<TData, TErrorData, TResultMode>>;
10
+ create: <TBaseData = unknown, TBaseErrorData = unknown, TBaseResultMode extends CallApiResultModeUnion = CallApiResultModeUnion>(baseConfig?: BaseCallApiConfig<TBaseData, TBaseErrorData, TBaseResultMode>) => {
11
+ <TData = TBaseData, TErrorData = TBaseErrorData, TResultMode extends CallApiResultModeUnion = TBaseResultMode>(initURL: string, config?: CallApiConfig<TData, TErrorData, TResultMode> | undefined): Promise<GetCallApiResult<TData, TErrorData, TResultMode>>;
12
+ create: /*elided*/ any;
13
13
  };
14
14
  };
15
15
 
16
- export { CallApiConfig, callApi, createFetchClient };
16
+ export { BaseCallApiConfig, CallApiConfig, CallApiResultModeUnion, callApi, createFetchClient };
@@ -0,0 +1 @@
1
+ "use strict";var e,r=Object.defineProperty,o=Object.getOwnPropertyDescriptor,t=Object.getOwnPropertyNames,s=Object.prototype.hasOwnProperty,n={};((e,o)=>{for(var t in o)r(e,t,{get:o[t],enumerable:!0})})(n,{callApiWithOptions:()=>B,createFetchClientWithOptions:()=>z,defineOptions:()=>K}),module.exports=(e=n,((e,n,a,i)=>{if(n&&"object"==typeof n||"function"==typeof n)for(let u of t(n))s.call(e,u)||u===a||r(e,u,{get:()=>n[u],enumerable:!(i=o(n,u))||i.enumerable});return e})(r({},"__esModule",{value:!0}),e));var a=e=>Array.isArray(e),i=e=>{if(!(e=>"object"==typeof e&&null!==e)(e))return!1;const r=Object.getPrototypeOf(e);return(null==r||r===Object.prototype||null===Object.getPrototypeOf(r))&&!(Symbol.toStringTag in e)},u=e=>"function"==typeof e,l=e=>"string"==typeof e,c=async e=>{const{initURL:r,options:o,request:t}=e,s={onError:new Set([]),onRequest:new Set([]),onRequestError:new Set([]),onResponse:new Set([]),onResponseError:new Set([]),onSuccess:new Set([])},n=()=>{s.onRequest.add(o.onRequest),s.onRequestError.add(o.onRequestError),s.onResponse.add(o.onResponse),s.onResponseError.add(o.onResponseError),s.onSuccess.add(o.onSuccess),s.onError.add(o.onError)};"mainInterceptorFirst"===o.mergedInterceptorsExecutionOrder&&n();const a=u(o.plugins)?[o.plugins({initURL:r,options:o,request:t}),o.extend?.plugins??[]].flat():[o.plugins??[],o.extend?.plugins??[]].flat();let c=r,p=o,d=t;const f=async e=>{if(!e)return;const s=await e({initURL:r,options:o,request:t});i(s)&&(l(s.url)&&(c=s.url),i(s.request)&&(d=s.request),i(s.options)&&(p=s.options))};for(const e of o.override?.plugins??a)await f(e.init),e.hooks&&(y=e.hooks,s.onRequest.add(y.onRequest),s.onRequestError.add(y.onRequestError),s.onResponse.add(y.onResponse),s.onResponseError.add(y.onResponseError),s.onSuccess.add(y.onSuccess),s.onError.add(y.onError));var y;o.mergedInterceptorsExecutionOrder&&"mainInterceptorLast"!==o.mergedInterceptorsExecutionOrder||n();const E=e=>{const r=((e,r)=>async o=>{if("sequential"!==r){if("parallel"===r){const r=[...e];await Promise.all(r.map((e=>e?.(o))))}}else for(const r of e)await(r?.(o))})(e,o.mergedInterceptorsExecutionMode);return r};return{interceptors:{onError:E([...s.onError].flat()),onRequest:E([...s.onRequest].flat()),onRequestError:E([...s.onRequestError].flat()),onResponse:E([...s.onResponse].flat()),onResponseError:E([...s.onResponseError].flat()),onSuccess:E([...s.onSuccess].flat())},resolvedOptions:p,resolvedRequestOptions:d,url:c}},p=e=>u(e)?e():e,d=e=>{if(void 0!==e){if(l(e)||null===e)return{Authorization:`Bearer ${e}`};switch(e.type){case"Basic":{const r=p(e.username),o=p(e.password);if(void 0===r||void 0===o)return;return{Authorization:`Basic ${globalThis.btoa(`${r}:${o}`)}`}}case"Custom":{const r=p(e.value);if(void 0===r)return;return{Authorization:`${p(e.prefix)} ${r}`}}default:{const r=p(e.bearer),o=p(e.token);return"token"in e&&void 0!==o?{Authorization:`Token ${o}`}:void 0!==r&&{Authorization:`Bearer ${r}`}}}}},f=["extend","override","dedupeKey"],y=["plugins"],E=["body","integrity","method","headers","signal","cache","redirect","window","credentials","keepalive","referrer","priority","mode","referrerPolicy"],m={408:"Request Timeout",409:"Conflict",425:"Too Early",429:"Too Many Requests",500:"Internal Server Error",502:"Bad Gateway",503:"Service Unavailable",504:"Gateway Timeout"},R=["GET"],g=Object.keys(m).map(Number),h=(e,r)=>{const o={},t=new Set(r);for(const[r,s]of Object.entries(e))t.has(r)||(o[r]=s);return o},w=(e,r)=>{const o={},t=new Set(r);for(const[r,s]of Object.entries(e))t.has(r)&&(o[r]=s);return o},q=e=>[w(e,E),h(e,[...E,...f])],b=e=>[w(e,E),h(e,[...E,...y])],S=e=>!e||i(e)?e:Object.fromEntries(e),O=(e,r)=>r.shouldHaveDedupeKey?`${e}-${JSON.stringify(r)}`:null,M=e=>{const{auth:r,baseHeaders:o,body:t,headers:s}=e;if(!Boolean(o||s||t||r))return;const n={...d(r),...S(o),...S(s)};return l(a=t)&&a.includes("=")?(n["Content-Type"]="application/x-www-form-urlencoded",n):((i(t)||l(t)&&t.startsWith("{"))&&(n["Content-Type"]="application/json",n.Accept="application/json"),n);var a},v=(e,r)=>a(e)?[e,r].flat():r??e,T=e=>{if(e)return e;if("undefined"!=typeof globalThis&&u(globalThis.fetch))return globalThis.fetch;throw new Error("No fetch implementation found")},$=(...e)=>Promise.all(e),D=async(e,r,o,t)=>{const s=((e,r)=>({arrayBuffer:()=>e.arrayBuffer(),blob:()=>e.blob(),formData:()=>e.formData(),json:async()=>{if(r){const o=await e.text();return r(o)}return e.json()},stream:()=>e.body,text:()=>e.text()}))(e,o);if(!Object.hasOwn(s,r))throw new Error(`Invalid response type: ${r}`);const n=await s[r]();return t?t(n):n},A=e=>{const{data:r,response:o,resultMode:t}=e,s={data:r,error:null,response:o};if(!t)return s;return{all:s,onlyError:s.error,onlyResponse:s.response,onlySuccess:s.data,onlySuccessWithException:s.data}[t]},x=e=>{const{defaultErrorMessage:r,error:o,message:t,resultMode:s}=e;let n={data:null,error:{errorData:o,message:t??o.message,name:o.name},response:null};if(j(o)){const{errorData:e,message:t=r,name:s,response:a}=o;n={data:null,error:{errorData:e,message:t,name:s},response:a}}return{apiDetails:n,generalErrorResult:{all:n,onlyError:n.error,onlyResponse:n.response,onlySuccess:n.data,onlySuccessWithException:n.data}[s??"all"],resolveCustomErrorInfo:({message:r})=>x({...e,message:r}).generalErrorResult}},P=class extends Error{errorData;isHTTPError=!0;name="HTTPError";response;constructor(e,r){const{defaultErrorMessage:o,errorData:t,response:s}=e;super(t?.message??o,r),this.errorData=t,this.response=s,Error.captureStackTrace(this,this.constructor)}},j=e=>e instanceof P||i(e)&&"HTTPError"===e.name&&!0===e.isHTTPError,I=e=>{if(0===e)return;const{promise:r,resolve:o}=(()=>{let e,r;return{promise:new Promise(((o,t)=>{r=o,e=t})),reject:e,resolve:r}})();return setTimeout(o,e),r},L=(e,r)=>{if(!r)return e;const o=(t=r)?new URLSearchParams(t).toString():(console.error("toQueryString:","No query params provided!"),null);var t;return 0===o?.length?e:e.endsWith("?")?`${e}${o}`:e.includes("?")?`${e}&${o}`:`${e}?${o}`},U=(e,r,o)=>{const t=((e,r)=>{if(!r)return e;let o=e;if(a(r)){const e=o.split("/").filter((e=>e.startsWith(":")));for(const[t,s]of e.entries()){const e=r[t];o=o.replace(s,e)}return o}for(const[e,t]of Object.entries(r))o=o.replace(`:${e}`,String(t));return o})(e,r);return L(t,o)},k=(...e)=>AbortSignal.any(e.filter(Boolean)),C=e=>AbortSignal.timeout(e),H=(e={})=>{const[r,o]=q(e),{body:t,headers:s,signal:n,...a}=r,l=new Map,p=async(...e)=>{const[r,d]=e,[f,y]=b(d??{}),{body:E=t,headers:m,signal:h=n,...w}=f,q={baseURL:"",bodySerializer:JSON.stringify,dedupeStrategy:"cancel",defaultErrorMessage:"Failed to fetch data from server!",mergedInterceptorsExecutionMode:"parallel",mergedInterceptorsExecutionOrder:"mainInterceptorLast",responseType:"json",resultMode:"all",retryAttempts:0,retryCodes:g,retryDelay:0,retryMethods:R,...o,...y,onError:v(o.onError,y.onError),onRequest:v(o.onRequest,y.onRequest),onRequestError:v(o.onRequestError,y.onRequestError),onResponse:v(o.onResponse,y.onResponse),onResponseError:v(o.onResponseError,y.onResponseError),onSuccess:v(o.onSuccess,y.onSuccess)},{interceptors:S,resolvedOptions:L,resolvedRequestOptions:H,url:z}=await c({initURL:r,options:q,request:{...a,...w}}),B={...L,...S,initURL:r},K={body:i(E)?B.bodySerializer(E):E,method:"GET",...H},N=`${B.baseURL}${U(z,B.params,B.query)}`,W="cancel"===B.dedupeStrategy||"defer"===B.dedupeStrategy,F=B.dedupeKey??O(N,{shouldHaveDedupeKey:W,...H,...B});null!=F&&await I(.1);const G=null!=F?l:null,V=G?.get(F);if(V&&"cancel"===B.dedupeStrategy){const e=B.dedupeKey?`Duplicate request detected - Aborting previous request with key '${F}' as a new request was initiated`:`Duplicate request detected - Aborting previous request to '${N}' as a new request with identical options was initiated`,r=new DOMException(e,"AbortError");V.controller.abort(r)}const J=new AbortController,_=null!=B.timeout?C(B.timeout):null,Q=k(J.signal,_,h),X={fullURL:N,signal:Q,...K},Y=T(B.customFetchImpl);try{await $(B.onRequest({options:B,request:X})),X.headers=M({auth:B.auth,baseHeaders:s??m,body:E,headers:X.headers});const e=V&&"defer"===B.dedupeStrategy?V.responsePromise:Y(N,X);G?.set(F,{controller:J,responsePromise:e});const o=await e;if(!o.ok&&!Q.aborted&&B.retryAttempts>0&&B.retryCodes.includes(o.status)&&B.retryMethods.includes(X.method))return await I(B.retryDelay),await p(r,{...d,retryAttempts:B.retryAttempts-1});const t="defer"===B.dedupeStrategy||"onlyResponse"===B.resultMode||B.cloneResponse;if(!o.ok){const e=await D(t?o.clone():o,B.responseType,B.responseParser,B.responseErrorValidator);throw new P({defaultErrorMessage:B.defaultErrorMessage,errorData:e,response:o})}const n=await D(t?o.clone():o,B.responseType,B.responseParser,B.responseValidator);return await $(B.onSuccess({data:n,options:B,request:X,response:B.cloneResponse?o.clone():o}),B.onResponse({data:n,error:null,options:B,request:X,response:B.cloneResponse?o.clone():o})),A({data:n,response:o,resultMode:B.resultMode})}catch(e){const{apiDetails:r,generalErrorResult:o,resolveCustomErrorInfo:t}=x({defaultErrorMessage:B.defaultErrorMessage,error:e,resultMode:B.resultMode}),s=u(B.throwOnError)?B.throwOnError({error:r.error,options:B,request:X,response:r.response}):B.throwOnError,n=()=>{if(s)throw r.error};if(j(e)){const{response:r}=e,t=o.error;return await $(B.onResponseError({error:t,options:B,request:X,response:B.cloneResponse?r.clone():r}),B.onError({error:t,options:B,request:X,response:B.cloneResponse?r.clone():r}),B.onResponse({data:null,error:t,options:B,request:X,response:B.cloneResponse?r.clone():r})),n(),o}if(e instanceof DOMException&&"TimeoutError"===e.name){const r=`Request timed out after ${B.timeout}ms`;return console.error(`${e.name}:`,r),n(),t({message:r})}if(e instanceof DOMException&&"AbortError"===e.name){const{message:r,name:t}=e;return console.error(`${t}:`,r),n(),o}const a=o.error;return await $(B.onRequestError({error:a,options:B,request:X}),B.onError({error:a,options:B,request:X,response:null})),n(),o}finally{G?.delete(F)}};return p.create=H,p},z=(H(),(e={})=>{const[r,o]=q(e),{body:t,headers:s,signal:n,...a}=r,l=new Map,p=async e=>{const{initURL:r,...d}=e,[f,y]=b(d),{body:E=t,headers:m,signal:h=n,...w}=f,q={baseURL:"",bodySerializer:JSON.stringify,dedupeStrategy:"cancel",defaultErrorMessage:"Failed to fetch data from server!",mergedInterceptorsExecutionMode:"parallel",mergedInterceptorsExecutionOrder:"mainInterceptorLast",responseType:"json",resultMode:"all",retryAttempts:0,retryCodes:g,retryDelay:0,retryMethods:R,...o,...y,onError:v(o.onError,y.onError),onRequest:v(o.onRequest,y.onRequest),onRequestError:v(o.onRequestError,y.onRequestError),onResponse:v(o.onResponse,y.onResponse),onResponseError:v(o.onResponseError,y.onResponseError),onSuccess:v(o.onSuccess,y.onSuccess)},{interceptors:S,resolvedOptions:L,resolvedRequestOptions:H,url:z}=await c({initURL:r,options:q,request:{...a,...w}}),B={...L,...S,initURL:r},K={body:i(E)?B.bodySerializer(E):E,method:"GET",...H},N=`${B.baseURL}${U(z,B.params,B.query)}`,W="cancel"===B.dedupeStrategy||"defer"===B.dedupeStrategy,F=B.dedupeKey??O(N,{shouldHaveDedupeKey:W,...H,...B});null!=F&&await I(.1);const G=null!=F?l:null,V=G?.get(F);if(V&&"cancel"===B.dedupeStrategy){const e=B.dedupeKey?`Duplicate request detected - Aborting previous request with key '${F}' as a new request was initiated`:`Duplicate request detected - Aborting previous request to '${N}' as a new request with identical options was initiated`,r=new DOMException(e,"AbortError");V.controller.abort(r)}const J=new AbortController,_=null!=B.timeout?C(B.timeout):null,Q=k(J.signal,_,h),X={fullURL:N,signal:Q,...K},Y=T(B.customFetchImpl);try{await $(B.onRequest({options:B,request:X})),X.headers=M({auth:B.auth,baseHeaders:s??m,body:E,headers:X.headers});const r=V&&"defer"===B.dedupeStrategy?V.responsePromise:Y(N,X);G?.set(F,{controller:J,responsePromise:r});const o=await r;if(!o.ok&&!Q.aborted&&B.retryAttempts>0&&B.retryCodes.includes(o.status)&&B.retryMethods.includes(X.method))return await I(B.retryDelay),await p({...e,retryAttempts:B.retryAttempts-1});const t="defer"===B.dedupeStrategy||"onlyResponse"===B.resultMode||B.cloneResponse;if(!o.ok){const e=await D(t?o.clone():o,B.responseType,B.responseParser,B.responseErrorValidator);throw new P({defaultErrorMessage:B.defaultErrorMessage,errorData:e,response:o})}const n=await D(t?o.clone():o,B.responseType,B.responseParser,B.responseValidator);return await $(B.onSuccess({data:n,options:B,request:X,response:B.cloneResponse?o.clone():o}),B.onResponse({data:n,error:null,options:B,request:X,response:B.cloneResponse?o.clone():o})),A({data:n,response:o,resultMode:B.resultMode})}catch(e){const{apiDetails:r,generalErrorResult:o,resolveCustomErrorInfo:t}=x({defaultErrorMessage:B.defaultErrorMessage,error:e,resultMode:B.resultMode}),s=u(B.throwOnError)?B.throwOnError({error:r.error,options:B,request:X,response:r.response}):B.throwOnError,n=()=>{if(s)throw r.error};if(j(e)){const{response:r}=e,t=o.error;return await $(B.onResponseError({error:t,options:B,request:X,response:B.cloneResponse?r.clone():r}),B.onError({error:t,options:B,request:X,response:B.cloneResponse?r.clone():r}),B.onResponse({data:null,error:t,options:B,request:X,response:B.cloneResponse?r.clone():r})),n(),o}if(e instanceof DOMException&&"TimeoutError"===e.name){const r=`Request timed out after ${B.timeout}ms`;return console.error(`${e.name}:`,r),n(),t({message:r})}if(e instanceof DOMException&&"AbortError"===e.name){const{message:r,name:t}=e;return console.error(`${t}:`,r),n(),o}const a=o.error;return await $(B.onRequestError({error:a,options:B,request:X}),B.onError({error:a,options:B,request:X,response:null})),n(),o}finally{G?.delete(F)}};return p.create=H,p}),B=z(),K=e=>e;//# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/options/index.ts","../../../src/utils/type-guards.ts","../../../src/plugins.ts","../../../src/auth.ts","../../../src/utils/type-helpers.ts","../../../src/types.ts","../../../src/utils/constants.ts","../../../src/utils/common.ts","../../../src/url.ts","../../../src/utils/polyfills.ts","../../../src/createFetchClient.ts","../../../src/options/createFetchClientWithOptions.ts","../../../src/options/defineOptions.ts"],"sourcesContent":["export { callApiWithOptions, createFetchClientWithOptions } from \"./createFetchClientWithOptions\";\nexport { defineOptions } from \"./defineOptions\";\nexport type { CallApiConfigWithRequiredURL } from \"./types\";\n","import type { AnyFunction } from \"./type-helpers\";\n\nexport const isArray = <TArrayItem>(value: unknown): value is TArrayItem[] => Array.isArray(value);\n\nexport const isObject = (value: unknown) => typeof value === \"object\" && value !== null;\n\nexport const isPlainObject = <TPlainObject extends Record<string, unknown>>(\n\tvalue: unknown\n): value is TPlainObject => {\n\tif (!isObject(value)) {\n\t\treturn false;\n\t}\n\n\tconst prototype = Object.getPrototypeOf(value) as unknown;\n\n\t// Check if it's a plain object\n\treturn (\n\t\t// prettier-ignore\n\t\t(prototype == null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(Symbol.toStringTag in value)\n\t);\n};\n\nexport const isFunction = <TFunction extends AnyFunction>(value: unknown): value is TFunction =>\n\ttypeof value === \"function\";\n\nexport const isQueryString = (value: unknown): value is string => isString(value) && value.includes(\"=\");\n\nexport const isString = (value: unknown) => typeof value === \"string\";\n\n// https://github.com/unjs/ofetch/blob/main/src/utils.ts\n// TODO Find a way to incorporate this function in checking when to apply the bodySerializer on the body and also whether to add the content type application/json\nexport const isJSONSerializable = (value: unknown) => {\n\tif (value === undefined) {\n\t\treturn false;\n\t}\n\tconst t = typeof value;\n\t// eslint-disable-next-line ts-eslint/no-unnecessary-condition -- No time to make this more type-safe\n\tif (t === \"string\" || t === \"number\" || t === \"boolean\" || t === null) {\n\t\treturn true;\n\t}\n\tif (t !== \"object\") {\n\t\treturn false;\n\t}\n\tif (isArray(value)) {\n\t\treturn true;\n\t}\n\tif ((value as Buffer | null)?.buffer) {\n\t\treturn false;\n\t}\n\n\treturn (\n\t\t// eslint-disable-next-line ts-eslint/prefer-nullish-coalescing -- Nullish coalescing makes no sense in this boolean context\n\t\t(value?.constructor && value.constructor.name === \"Object\") ||\n\t\ttypeof (value as { toJSON: () => unknown } | null)?.toJSON === \"function\"\n\t);\n};\n","import type {\n\tCallApiRequestOptionsForHooks,\n\tCombinedCallApiExtraOptions,\n\tInterceptors,\n\tInterceptorsArray,\n} from \"./types\";\nimport { isFunction, isPlainObject, isString } from \"./utils/type-guards\";\nimport type { AnyFunction, Awaitable } from \"./utils/type-helpers\";\n\nexport type PluginInitContext<TData = unknown, TErrorData = unknown> = {\n\tinitURL: string;\n\toptions: CombinedCallApiExtraOptions<TData, TErrorData>;\n\trequest: Omit<CallApiRequestOptionsForHooks, \"fullURL\">;\n};\n\nexport type CallApiPlugin<TData = unknown, TErrorData = unknown> = {\n\t/**\n\t * @description A description for the plugin\n\t */\n\tdescription?: string;\n\n\t/**\n\t * Hooks/Interceptors for the plugin\n\t */\n\thooks?: Interceptors<TData, TErrorData>;\n\n\t/**\n\t * @description A unique id for the plugin\n\t */\n\tid: string;\n\n\t/**\n\t * @description A function that will be called when the plugin is\n\t * initialized. This will be called before the any\n\t * of the other internal functions.\n\t */\n\tinit?: (context: PluginInitContext<TData, TErrorData>) =>\n\t\t| Awaitable<{\n\t\t\t\toptions?: CombinedCallApiExtraOptions<TData, TErrorData>;\n\t\t\t\trequest: CallApiRequestOptionsForHooks;\n\t\t\t\turl?: string;\n\t\t }>\n\t\t| Awaitable<void>;\n\n\t/**\n\t * @description A name for the plugin\n\t */\n\tname: string;\n\n\t/**\n\t * @description A version for the plugin\n\t */\n\tversion?: string;\n};\n\nconst createMergedInterceptor = (\n\tinterceptors: Array<AnyFunction<Awaitable<unknown>> | undefined>,\n\tmergedInterceptorsExecutionMode: CombinedCallApiExtraOptions[\"mergedInterceptorsExecutionMode\"]\n) => {\n\treturn async (ctx: Record<string, unknown>) => {\n\t\tif (mergedInterceptorsExecutionMode === \"sequential\") {\n\t\t\tfor (const interceptor of interceptors) {\n\t\t\t\t// eslint-disable-next-line no-await-in-loop -- This is necessary in this case\n\t\t\t\tawait interceptor?.(ctx);\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (mergedInterceptorsExecutionMode === \"parallel\") {\n\t\t\tconst interceptorArray = [...interceptors];\n\n\t\t\tawait Promise.all(interceptorArray.map((uniqueInterceptor) => uniqueInterceptor?.(ctx)));\n\t\t}\n\t};\n};\n\ntype InterceptorsOrInterceptorsArray<TData, TErrorData> =\n\t| Interceptors<TData, TErrorData>\n\t| InterceptorsArray<TData, TErrorData>;\n\n// prettier-ignore\ntype PluginHooks<TData, TErrorData> = {\n\t[Key in keyof Interceptors<TData, TErrorData>]: Set<InterceptorsOrInterceptorsArray<TData, TErrorData>[Key]>;\n};\n\nexport const initializePlugins = async <TData, TErrorData>(\n\tcontext: PluginInitContext<TData, TErrorData>\n) => {\n\tconst { initURL, options, request } = context;\n\n\tconst hookRegistry = {\n\t\tonError: new Set([]),\n\t\tonRequest: new Set([]),\n\t\tonRequestError: new Set([]),\n\t\tonResponse: new Set([]),\n\t\tonResponseError: new Set([]),\n\t\tonSuccess: new Set([]),\n\t} satisfies PluginHooks<TData, TErrorData> as Required<PluginHooks<TData, TErrorData>>;\n\n\tconst addMainInterceptors = () => {\n\t\thookRegistry.onRequest.add(options.onRequest);\n\t\thookRegistry.onRequestError.add(options.onRequestError);\n\t\thookRegistry.onResponse.add(options.onResponse);\n\t\thookRegistry.onResponseError.add(options.onResponseError);\n\t\thookRegistry.onSuccess.add(options.onSuccess);\n\t\thookRegistry.onError.add(options.onError);\n\t};\n\n\tconst addPluginInterceptors = (pluginHooks: Interceptors<TData, TErrorData>) => {\n\t\thookRegistry.onRequest.add(pluginHooks.onRequest);\n\t\thookRegistry.onRequestError.add(pluginHooks.onRequestError);\n\t\thookRegistry.onResponse.add(pluginHooks.onResponse);\n\t\thookRegistry.onResponseError.add(pluginHooks.onResponseError);\n\t\thookRegistry.onSuccess.add(pluginHooks.onSuccess);\n\t\thookRegistry.onError.add(pluginHooks.onError);\n\t};\n\n\tif (options.mergedInterceptorsExecutionOrder === \"mainInterceptorFirst\") {\n\t\taddMainInterceptors();\n\t}\n\n\tconst resolvedPlugins = isFunction(options.plugins)\n\t\t? [options.plugins({ initURL, options, request }), options.extend?.plugins ?? []].flat()\n\t\t: [options.plugins ?? [], options.extend?.plugins ?? []].flat();\n\n\tlet resolvedUrl = initURL;\n\tlet resolvedOptions = options;\n\tlet resolvedRequestOptions = request;\n\n\tconst executePluginInit = async (pluginInit: CallApiPlugin<TData, TErrorData>[\"init\"]) => {\n\t\tif (!pluginInit) return;\n\n\t\tconst pluginInitResult = await pluginInit({ initURL, options, request });\n\n\t\tif (!isPlainObject(pluginInitResult)) return;\n\n\t\tif (isString(pluginInitResult.url)) {\n\t\t\tresolvedUrl = pluginInitResult.url;\n\t\t}\n\n\t\tif (isPlainObject(pluginInitResult.request)) {\n\t\t\tresolvedRequestOptions = pluginInitResult.request;\n\t\t}\n\n\t\tif (isPlainObject(pluginInitResult.options)) {\n\t\t\tresolvedOptions = pluginInitResult.options;\n\t\t}\n\t};\n\n\tfor (const plugin of options.override?.plugins ?? 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\taddPluginInterceptors(plugin.hooks);\n\t}\n\n\tif (\n\t\t!options.mergedInterceptorsExecutionOrder ||\n\t\toptions.mergedInterceptorsExecutionOrder === \"mainInterceptorLast\"\n\t) {\n\t\taddMainInterceptors();\n\t}\n\n\tconst handleInterceptorsMerge = (interceptors: Array<AnyFunction<Awaitable<unknown>> | undefined>) => {\n\t\tconst mergedInterceptor = createMergedInterceptor(\n\t\t\tinterceptors,\n\t\t\toptions.mergedInterceptorsExecutionMode\n\t\t);\n\n\t\treturn mergedInterceptor;\n\t};\n\n\tconst interceptors = {\n\t\tonError: handleInterceptorsMerge([...hookRegistry.onError].flat()),\n\t\tonRequest: handleInterceptorsMerge([...hookRegistry.onRequest].flat()),\n\t\tonRequestError: handleInterceptorsMerge([...hookRegistry.onRequestError].flat()),\n\t\tonResponse: handleInterceptorsMerge([...hookRegistry.onResponse].flat()),\n\t\tonResponseError: handleInterceptorsMerge([...hookRegistry.onResponseError].flat()),\n\t\tonSuccess: handleInterceptorsMerge([...hookRegistry.onSuccess].flat()),\n\t} satisfies Interceptors<TData, TErrorData>;\n\n\treturn {\n\t\tinterceptors,\n\t\tresolvedOptions,\n\t\tresolvedRequestOptions,\n\t\turl: resolvedUrl,\n\t};\n};\n\nexport const definePlugin = <\n\t// eslint-disable-next-line perfectionist/sort-union-types -- I want the first one to be first\n\tTPlugin extends CallApiPlugin<never, never> | AnyFunction<CallApiPlugin<never, never>>,\n>(\n\tplugin: TPlugin\n) => {\n\treturn plugin;\n};\n","/* eslint-disable perfectionist/sort-object-types -- Avoid Sorting for now */\n\nimport type { ExtraOptions } from \"./types\";\nimport { isFunction, isString } from \"./utils/type-guards\";\n\ntype ValueOrFunctionResult<TValue> = TValue | (() => TValue);\n\n/**\n * Bearer Or Token authentication\n *\n * The value of `bearer` will be added to a header as\n * `auth: Bearer some-auth-token`,\n *\n * The value of `token` will be added to a header as\n * `auth: Token some-auth-token`,\n */\nexport type BearerOrTokenAuth =\n\t| {\n\t\t\ttype?: never;\n\t\t\tbearer?: never;\n\t\t\ttoken?: ValueOrFunctionResult<string | null>;\n\t }\n\t| {\n\t\t\ttype?: never;\n\t\t\tbearer?: ValueOrFunctionResult<string | null>;\n\t\t\ttoken?: never;\n\t };\n\n/**\n * Basic auth\n */\nexport type BasicAuth = {\n\ttype: \"Basic\";\n\tusername: ValueOrFunctionResult<string | null | undefined>;\n\tpassword: ValueOrFunctionResult<string | null | undefined>;\n};\n\n/**\n * Custom auth\n *\n * @param prefix - prefix of the header\n * @param authValue - value of the header\n *\n * @example\n * ```ts\n * {\n * type: \"Custom\",\n * prefix: \"Token\",\n * authValue: \"token\"\n * }\n * ```\n */\nexport type CustomAuth = {\n\ttype: \"Custom\";\n\tprefix: ValueOrFunctionResult<string | null | undefined>;\n\tvalue: ValueOrFunctionResult<string | null | undefined>;\n};\n\n// eslint-disable-next-line perfectionist/sort-union-types -- Let the first one be first\nexport type Auth = BearerOrTokenAuth | BasicAuth | CustomAuth;\n\nconst getValue = (value: ValueOrFunctionResult<string | null | undefined>) => {\n\treturn isFunction(value) ? value() : value;\n};\n\ntype AuthorizationHeader = {\n\tAuthorization: string;\n};\n\nexport const getAuthHeader = (auth: ExtraOptions[\"auth\"]): false | AuthorizationHeader | undefined => {\n\tif (auth === undefined) return;\n\n\tif (isString(auth) || auth === null) {\n\t\treturn { Authorization: `Bearer ${auth}` };\n\t}\n\n\tswitch (auth.type) {\n\t\tcase \"Basic\": {\n\t\t\tconst username = getValue(auth.username);\n\t\t\tconst password = getValue(auth.password);\n\n\t\t\tif (username === undefined || password === undefined) return;\n\n\t\t\treturn {\n\t\t\t\tAuthorization: `Basic ${globalThis.btoa(`${username}:${password}`)}`,\n\t\t\t};\n\t\t}\n\n\t\tcase \"Custom\": {\n\t\t\tconst value = getValue(auth.value);\n\n\t\t\tif (value === undefined) return;\n\n\t\t\tconst prefix = getValue(auth.prefix);\n\n\t\t\treturn {\n\t\t\t\tAuthorization: `${prefix} ${value}`,\n\t\t\t};\n\t\t}\n\n\t\tdefault: {\n\t\t\tconst bearer = getValue(auth.bearer);\n\t\t\tconst token = getValue(auth.token);\n\n\t\t\tif (\"token\" in auth && token !== undefined) {\n\t\t\t\treturn { Authorization: `Token ${token}` };\n\t\t\t}\n\n\t\t\treturn bearer !== undefined && { Authorization: `Bearer ${bearer}` };\n\t\t}\n\t}\n};\n","// == These two types allows for adding arbitrary literal types, while still provided autocomplete for defaults.\n// == Usually intersection with \"{}\" or \"NonNullable<unknown>\" would make it work fine, but the placeholder with never type is added to make the AnyWhatever type appear last in a given union.\nexport type AnyString = string & { placeholder?: never };\nexport type AnyNumber = number & { placeholder?: never };\n\n// eslint-disable-next-line ts-eslint/no-explicit-any -- Any is required here so that one can pass custom function type without type errors\nexport type AnyFunction<TResult = any> = (...args: any[]) => TResult;\n\nexport type CallbackFn<in TParams, out TResult = void> = (...params: TParams[]) => TResult;\n\nexport type Prettify<TObject> = NonNullable<unknown> & { [Key in keyof TObject]: TObject[Key] };\n\nexport type Writeable<TObject, TType extends \"deep\" | \"shallow\" = \"shallow\"> = {\n\t-readonly [key in keyof TObject]: TType extends \"shallow\"\n\t\t? TObject[key]\n\t\t: TType extends \"deep\"\n\t\t\t? TObject[key] extends object\n\t\t\t\t? Writeable<TObject[key], TType>\n\t\t\t\t: TObject[key]\n\t\t\t: never;\n};\n\nexport const defineEnum = <const TValue>(value: TValue) => value as Prettify<Writeable<TValue, \"deep\">>;\n\n// == Using this Immediately Indexed Mapped type helper to help show computed type of anything passed to it instead of just the type name\nexport type UnmaskType<TValue> = { _: TValue }[\"_\"];\n\nexport type Awaitable<TValue> = Promise<TValue> | TValue;\n\nexport type CommonRequestHeaders =\n\t| \"Access-Control-Allow-Credentials\"\n\t| \"Access-Control-Allow-Headers\"\n\t| \"Access-Control-Allow-Methods\"\n\t| \"Access-Control-Allow-Origin\"\n\t| \"Access-Control-Expose-Headers\"\n\t| \"Access-Control-Max-Age\"\n\t| \"Age\"\n\t| \"Allow\"\n\t| \"Cache-Control\"\n\t| \"Clear-Site-Data\"\n\t| \"Content-Disposition\"\n\t| \"Content-Encoding\"\n\t| \"Content-Language\"\n\t| \"Content-Length\"\n\t| \"Content-Location\"\n\t| \"Content-Range\"\n\t| \"Content-Security-Policy-Report-Only\"\n\t| \"Content-Security-Policy\"\n\t| \"Cookie\"\n\t| \"Cross-Origin-Embedder-Policy\"\n\t| \"Cross-Origin-Opener-Policy\"\n\t| \"Cross-Origin-Resource-Policy\"\n\t| \"Date\"\n\t| \"ETag\"\n\t| \"Expires\"\n\t| \"Last-Modified\"\n\t| \"Location\"\n\t| \"Permissions-Policy\"\n\t| \"Pragma\"\n\t| \"Retry-After\"\n\t| \"Save-Data\"\n\t| \"Sec-CH-Prefers-Color-Scheme\"\n\t| \"Sec-CH-Prefers-Reduced-Motion\"\n\t| \"Sec-CH-UA-Arch\"\n\t| \"Sec-CH-UA-Bitness\"\n\t| \"Sec-CH-UA-Form-Factor\"\n\t| \"Sec-CH-UA-Full-Version-List\"\n\t| \"Sec-CH-UA-Full-Version\"\n\t| \"Sec-CH-UA-Mobile\"\n\t| \"Sec-CH-UA-Model\"\n\t| \"Sec-CH-UA-Platform-Version\"\n\t| \"Sec-CH-UA-Platform\"\n\t| \"Sec-CH-UA-WoW64\"\n\t| \"Sec-CH-UA\"\n\t| \"Sec-Fetch-Dest\"\n\t| \"Sec-Fetch-Mode\"\n\t| \"Sec-Fetch-Site\"\n\t| \"Sec-Fetch-User\"\n\t| \"Sec-GPC\"\n\t| \"Server-Timing\"\n\t| \"Server\"\n\t| \"Service-Worker-Navigation-Preload\"\n\t| \"Set-Cookie\"\n\t| \"Strict-Transport-Security\"\n\t| \"Timing-Allow-Origin\"\n\t| \"Trailer\"\n\t| \"Transfer-Encoding\"\n\t| \"Upgrade\"\n\t| \"Vary\"\n\t| \"Warning\"\n\t| \"WWW-Authenticate\"\n\t| \"X-Content-Type-Options\"\n\t| \"X-DNS-Prefetch-Control\"\n\t| \"X-Frame-Options\"\n\t| \"X-Permitted-Cross-Domain-Policies\"\n\t| \"X-Powered-By\"\n\t| \"X-Robots-Tag\"\n\t| \"X-XSS-Protection\";\n\nexport type CommonContentTypes =\n\t| \"application/epub+zip\"\n\t| \"application/gzip\"\n\t| \"application/json\"\n\t| \"application/ld+json\"\n\t| \"application/octet-stream\"\n\t| \"application/ogg\"\n\t| \"application/pdf\"\n\t| \"application/rtf\"\n\t| \"application/vnd.ms-fontobject\"\n\t| \"application/wasm\"\n\t| \"application/xhtml+xml\"\n\t| \"application/xml\"\n\t| \"application/zip\"\n\t| \"audio/aac\"\n\t| \"audio/mpeg\"\n\t| \"audio/ogg\"\n\t| \"audio/opus\"\n\t| \"audio/webm\"\n\t| \"audio/x-midi\"\n\t| \"font/otf\"\n\t| \"font/ttf\"\n\t| \"font/woff\"\n\t| \"font/woff2\"\n\t| \"image/avif\"\n\t| \"image/bmp\"\n\t| \"image/gif\"\n\t| \"image/jpeg\"\n\t| \"image/png\"\n\t| \"image/svg+xml\"\n\t| \"image/tiff\"\n\t| \"image/webp\"\n\t| \"image/x-icon\"\n\t| \"model/gltf-binary\"\n\t| \"model/gltf+json\"\n\t| \"text/calendar\"\n\t| \"text/css\"\n\t| \"text/csv\"\n\t| \"text/html\"\n\t| \"text/javascript\"\n\t| \"text/plain\"\n\t| \"video/3gpp\"\n\t| \"video/3gpp2\"\n\t| \"video/av1\"\n\t| \"video/mp2t\"\n\t| \"video/mp4\"\n\t| \"video/mpeg\"\n\t| \"video/ogg\"\n\t| \"video/webm\"\n\t| \"video/x-msvideo\";\n","/* eslint-disable ts-eslint/consistent-type-definitions -- I need to use interfaces for the sake of user overrides */\nimport type { Auth } from \"./auth\";\nimport type { CallApiPlugin, PluginInitContext } from \"./plugins\";\nimport type { getResponseType } from \"./utils/common\";\nimport type { fetchSpecificKeys } from \"./utils/constants\";\nimport {\n\ttype AnyNumber,\n\ttype AnyString,\n\ttype Awaitable,\n\ttype CommonContentTypes,\n\ttype CommonRequestHeaders,\n\ttype UnmaskType,\n\tdefineEnum,\n} from \"./utils/type-helpers\";\n\ntype FetchSpecificKeysUnion = Exclude<(typeof fetchSpecificKeys)[number], \"body\" | \"headers\" | \"method\">;\n\nexport interface CallApiRequestOptions extends Pick<RequestInit, FetchSpecificKeysUnion> {\n\t/**\n\t * @description Optional body of the request, can be a object or any other supported body type.\n\t */\n\tbody?: Record<string, unknown> | RequestInit[\"body\"];\n\n\t/**\n\t * @description Headers to be used in the request.\n\t */\n\theaders?:\n\t\t| Record<\"Content-Type\", CommonContentTypes>\n\t\t// eslint-disable-next-line perfectionist/sort-union-types -- I need the first one to be first\n\t\t| Record<CommonRequestHeaders | AnyString, string>\n\t\t| RequestInit[\"headers\"];\n\n\t/**\n\t * @description HTTP method for the request.\n\t * @default \"GET\"\n\t */\n\tmethod?: \"DELETE\" | \"GET\" | \"PATCH\" | \"POST\" | \"PUT\" | AnyString;\n}\n\nexport interface CallApiRequestOptionsForHooks extends CallApiRequestOptions {\n\t/**\n\t * @description Resolved request URL\n\t */\n\treadonly fullURL?: string;\n\n\t// eslint-disable-next-line perfectionist/sort-union-types -- I need the first one to be first\n\theaders?: Record<CommonRequestHeaders | AnyString, string>;\n}\n\n// eslint-disable-next-line ts-eslint/no-empty-object-type -- This needs to be empty to allow users to register their own meta\nexport interface Register {\n\t// == meta: R_Meta\n}\n\nexport type R_Meta = Register extends { meta?: infer TMeta extends Record<string, unknown> }\n\t? TMeta\n\t: never;\n\nexport interface Interceptors<TData = unknown, TErrorData = unknown> {\n\t/**\n\t * @description Interceptor to be called when any error occurs within the request/response lifecyle, regardless of whether the error is from the api or not.\n\t * It is basically a combination of `onRequestError` and `onResponseError` interceptors\n\t */\n\tonError?: (context: ErrorContext<TErrorData>) => Awaitable<unknown>;\n\n\t/**\n\t * @description Interceptor to be called just before the request is made, allowing for modifications or additional operations.\n\t */\n\tonRequest?: (context: RequestContext) => Awaitable<unknown>;\n\n\t/**\n\t * @description Interceptor to be called when an error occurs during the fetch request.\n\t */\n\tonRequestError?: (context: RequestErrorContext) => Awaitable<unknown>;\n\n\t/**\n\t * @description Interceptor to be called when any response is received from the api, whether successful or not\n\t */\n\tonResponse?: (context: ResponseContext<TData, TErrorData>) => Awaitable<unknown>;\n\n\t/**\n\t * @description Interceptor to be called when an error response is received from the api.\n\t */\n\tonResponseError?: (context: ResponseErrorContext<TErrorData>) => Awaitable<unknown>;\n\n\t/**\n\t * @description Interceptor to be called when a successful response is received from the api.\n\t */\n\tonSuccess?: (context: SuccessContext<TData>) => Awaitable<unknown>;\n}\n\nexport interface InterceptorsArray<TData = unknown, TErrorData = unknown> {\n\t/**\n\t * @description Interceptor to be called when any error occurs within the request/response lifecyle, regardless of whether the error is from the api or not.\n\t * It is basically a combination of `onRequestError` and `onResponseError` interceptors\n\t */\n\tonError?: Array<Interceptors<TData, TErrorData>[\"onError\"]>;\n\n\t/**\n\t * @description Interceptor to be called just before the request is made, allowing for modifications or additional operations.\n\t */\n\tonRequest?: Array<Interceptors<TData, TErrorData>[\"onRequest\"]>;\n\n\t/**\n\t * @description Interceptor to be called when an error occurs during the fetch request.\n\t */\n\tonRequestError?: Array<Interceptors<TData, TErrorData>[\"onRequestError\"]>;\n\n\t/**\n\t * @description Interceptor to be called when any response is received from the api, whether successful or not\n\t */\n\tonResponse?: Array<Interceptors<TData, TErrorData>[\"onResponse\"]>;\n\n\t/**\n\t * @description Interceptor to be called when an error response is received from the api.\n\t */\n\tonResponseError?: Array<Interceptors<TData, TErrorData>[\"onResponseError\"]>;\n\n\t/**\n\t * @description Interceptor to be called when a successful response is received from the api.\n\t */\n\tonSuccess?: Array<Interceptors<TData, TErrorData>[\"onSuccess\"]>;\n}\n\ntype FetchImpl = UnmaskType<(input: string | Request | URL, init?: RequestInit) => Promise<Response>>;\n\ntype CallApiPluginArray<TData, TErrorData> = Array<CallApiPlugin<TData, TErrorData>>;\n\ntype CallApiPluginFn<TData, TErrorData> = (\n\tcontext: PluginInitContext<TData, TErrorData>\n) => Array<CallApiPlugin<TData, TErrorData>>;\n\nexport type ExtraOptions<\n\tTData = unknown,\n\tTErrorData = unknown,\n\tTResultMode extends CallApiResultModeUnion = CallApiResultModeUnion,\n\t// eslint-disable-next-line perfectionist/sort-intersection-types -- I want the first one to be first\n> = (Interceptors<TData, TErrorData> | InterceptorsArray<TData, TErrorData>) & {\n\t/**\n\t * @description Authorization header value.\n\t */\n\tauth?: string | Auth | null;\n\n\t/**\n\t * @description Base URL to be prepended to all request URLs\n\t */\n\tbaseURL?: string;\n\n\t/**\n\t * @description Custom function to serialize the body object into a string.\n\t */\n\tbodySerializer?: (bodyData: Record<string, unknown>) => string;\n\n\t/**\n\t * @description Whether or not to clone the response, so response.json() and the like, can be read again else where.\n\t * @see https://developer.mozilla.org/en-US/docs/Web/API/Response/clone\n\t * @default false\n\t */\n\tcloneResponse?: boolean;\n\n\t/**\n\t * @description Custom fetch implementation\n\t */\n\tcustomFetchImpl?: FetchImpl;\n\n\t/**\n\t * @description Custom request key to be used to identify a request in the fetch deduplication strategy.\n\t * @default the full request url + string formed from the request options\n\t */\n\tdedupeKey?: string;\n\n\t/**\n\t * @description Defines the deduplication strategy for the request, can be set to \"none\" | \"defer\" | \"cancel\".\n\t * - If set to \"none\", deduplication is disabled.\n\t *\n\t * - If set to \"cancel\"(default), the previous pending request with the same request key will be cancelled and lets the new request through.\n\t *\n\t * - If set to \"defer\", all new request with the same request key will be share the same response, until the previous one is completed.\n\t * @default \"cancel\"\n\t */\n\tdedupeStrategy?: \"cancel\" | \"defer\" | \"none\";\n\n\t/**\n\t * @description Default error message to use if none is provided from a response.\n\t * @default \"Failed to fetch data from server!\"\n\t */\n\tdefaultErrorMessage?: string;\n\n\t/**\n\t * @description URL to be used in the request.\n\t */\n\treadonly initURL?: string;\n\n\t/**\n\t * @description Defines the mode in which the merged interceptors are executed, can be set to \"parallel\" | \"sequential\".\n\t * - If set to \"parallel\", both plugin and main interceptors will be executed in parallel.\n\t * - If set to \"sequential\", the plugin interceptors will be executed first, followed by the main interceptor.\n\t * @default \"parallel\"\n\t */\n\tmergedInterceptorsExecutionMode?: \"parallel\" | \"sequential\";\n\n\t/**\n\t * @description - Controls what order in which the mergedInterceptors execute\n\t * @default \"mainInterceptorLast\"\n\t */\n\tmergedInterceptorsExecutionOrder?: \"mainInterceptorFirst\" | \"mainInterceptorLast\";\n\n\t/**\n\t * @description - An optional field you can fill with additional information,\n\t * to associate with the request, typically used for logging or tracing.\n\t *\n\t * - A good use case for this, would be to use the info to handle specific cases in any of the shared interceptors.\n\t *\n\t * @example\n\t * ```ts\n\t * const callMainApi = callApi.create({\n\t * \tbaseURL: \"https://main-api.com\",\n\t * \tonResponseError: ({ response, options }) => {\n\t * \t\tif (options.meta?.userId) {\n\t * \t\t\tconsole.error(`User ${options.meta.userId} made an error`);\n\t * \t\t}\n\t * \t},\n\t * });\n\t *\n\t * const response = await callMainApi({\n\t * \turl: \"https://example.com/api/data\",\n\t * \tmeta: { userId: \"123\" },\n\t * });\n\t * ```\n\t */\n\tmeta?: R_Meta;\n\n\t/**\n\t * @description Params to be appended to the URL (i.e: /:id)\n\t */\n\t// eslint-disable-next-line perfectionist/sort-union-types -- I need the Record to be first\n\tparams?: Record<string, boolean | number | string> | Array<boolean | number | string>;\n\n\t/**\n\t * @description An array of CallApi plugins. It allows you to extend the behavior of the library.\n\t */\n\tplugins?: CallApiPluginArray<TData, TErrorData>;\n\n\t/**\n\t * @description Query parameters to append to the URL.\n\t */\n\tquery?: Record<string, boolean | number | string>;\n\n\t/**\n\t * @description 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\tresponseErrorValidator?: (data: unknown) => TErrorData;\n\n\t/**\n\t * @description Custom function to parse the response string into a object.\n\t */\n\tresponseParser?: (responseString: string) => Awaitable<Record<string, unknown>>;\n\n\t/**\n\t * @description Expected response type, affects how response is parsed\n\t * @default \"json\"\n\t */\n\tresponseType?: keyof ReturnType<typeof getResponseType>;\n\n\t/**\n\t * @description Custom function to validate the response data.\n\t */\n\tresponseValidator?: (data: unknown) => TData;\n\n\t/**\n\t * @description Mode of the result, can influence how results are handled or returned.\n\t * Can be set to \"all\" | \"onlySuccess\" | \"onlyError\" | \"onlyResponse\".\n\t * @default \"all\"\n\t */\n\tresultMode?: TResultMode;\n\n\t/**\n\t * @description Number of retry attempts for failed requests\n\t * @default 0\n\t */\n\tretryAttempts?: number;\n\n\t/**\n\t * @description HTTP status codes that trigger a retry\n\t * @default [409, 425, 429, 500, 502, 503, 504]\n\t */\n\tretryCodes?: Array<409 | 425 | 429 | 500 | 502 | 503 | 504 | AnyNumber>;\n\n\t/**\n\t * @description Delay between retries in milliseconds\n\t * @default 500\n\t */\n\tretryDelay?: number;\n\n\t/**\n\t * HTTP methods that are allowed to retry\n\t * @default [\"GET\", \"POST\"]\n\t */\n\tretryMethods?: Array<\"GET\" | \"POST\" | AnyString>;\n\n\t/**\n\t * If true or the function returns true, throws errors instead of returning them\n\t * The function is passed the error object and can be used to conditionally throw the error\n\t * @default false\n\t */\n\tthrowOnError?: boolean | ((context: ErrorContext<TErrorData>) => boolean);\n\n\t/**\n\t * @description Request timeout in milliseconds\n\t */\n\ttimeout?: number;\n};\n\nexport const optionsEnumToOmitFromBase = defineEnum([\"extend\", \"override\", \"dedupeKey\"]);\n\n// prettier-ignore\nexport interface BaseCallApiExtraOptions<\n\tTBaseData = unknown,\n\tTBaseErrorData = unknown,\n\tTBaseResultMode extends CallApiResultModeUnion = CallApiResultModeUnion,\n> extends Omit<CallApiExtraOptions<TBaseData, TBaseErrorData, TBaseResultMode>, typeof optionsEnumToOmitFromBase[number]> {\n\t/**\n\t * @description An array of CallApi plugins. It allows you to extend the behavior of the library.\n\t */\n\tplugins?: CallApiPluginArray<TBaseData, TBaseErrorData> | CallApiPluginFn<TBaseData, TBaseErrorData>;\n}\n\nexport const optionsEnumToOmitFromInstance = defineEnum([\"plugins\"]);\n\nexport interface CallApiExtraOptions<\n\tTData = unknown,\n\tTErrorData = unknown,\n\tTResultMode extends CallApiResultModeUnion = CallApiResultModeUnion,\n> extends Omit<\n\t\tExtraOptions<TData, TErrorData, TResultMode>,\n\t\t(typeof optionsEnumToOmitFromInstance)[number]\n\t> {\n\t/**\n\t * @description Options that should extend the base options.\n\t */\n\textend?: Pick<\n\t\tExtraOptions<TData, TErrorData, TResultMode>,\n\t\t(typeof optionsEnumToOmitFromInstance)[number]\n\t>;\n\n\t/**\n\t * @description Options that should override the base options.\n\t */\n\toverride?: Pick<\n\t\tExtraOptions<TData, TErrorData, TResultMode>,\n\t\t(typeof optionsEnumToOmitFromInstance)[number]\n\t>;\n}\n\n// prettier-ignore\nexport interface CombinedCallApiExtraOptions<\n\tTData = unknown,\n\tTErrorData = unknown,\n\tTResultMode extends CallApiResultModeUnion = CallApiResultModeUnion,\n> extends BaseCallApiExtraOptions<TData, TErrorData, TResultMode>, CallApiExtraOptions<TData, TErrorData, TResultMode> { }\n\n// prettier-ignore\nexport interface BaseCallApiConfig<\n\tTBaseData = unknown,\n\tTBaseErrorData = unknown,\n\tTBaseResultMode extends CallApiResultModeUnion = CallApiResultModeUnion,\n> extends CallApiRequestOptions, BaseCallApiExtraOptions<TBaseData, TBaseErrorData, TBaseResultMode> { }\n\n// prettier-ignore\nexport interface CallApiConfig<\n\tTData = unknown,\n\tTErrorData = unknown,\n\tTResultMode extends CallApiResultModeUnion = CallApiResultModeUnion,\n> extends CallApiRequestOptions, CallApiExtraOptions<TData, TErrorData, TResultMode> { }\n\nexport type CallApiParameters<\n\tTData = unknown,\n\tTErrorData = unknown,\n\tTResultMode extends CallApiResultModeUnion = CallApiResultModeUnion,\n> = [initURL: string, config?: CallApiConfig<TData, TErrorData, TResultMode>];\n\nexport type RequestContext = UnmaskType<{\n\toptions: CombinedCallApiExtraOptions;\n\trequest: CallApiRequestOptionsForHooks;\n}>;\n\nexport type ResponseContext<TData, TErrorData> = UnmaskType<\n\t| {\n\t\t\tdata: TData;\n\t\t\terror: null;\n\t\t\toptions: CombinedCallApiExtraOptions;\n\t\t\trequest: CallApiRequestOptionsForHooks;\n\t\t\tresponse: Response;\n\t }\n\t// eslint-disable-next-line perfectionist/sort-union-types -- I need the first one to be first\n\t| {\n\t\t\tdata: null;\n\t\t\terror: PossibleHTTPError<TErrorData>;\n\t\t\toptions: CombinedCallApiExtraOptions;\n\t\t\trequest: CallApiRequestOptionsForHooks;\n\t\t\tresponse: Response;\n\t }\n>;\n\nexport type SuccessContext<TData> = UnmaskType<{\n\tdata: TData;\n\toptions: CombinedCallApiExtraOptions;\n\trequest: CallApiRequestOptionsForHooks;\n\tresponse: Response;\n}>;\n\nexport type RequestErrorContext = UnmaskType<{\n\terror: PossibleJavaScriptError;\n\toptions: CombinedCallApiExtraOptions;\n\trequest: CallApiRequestOptionsForHooks;\n}>;\n\nexport type ResponseErrorContext<TErrorData> = UnmaskType<{\n\terror: PossibleHTTPError<TErrorData>;\n\toptions: CombinedCallApiExtraOptions;\n\trequest: CallApiRequestOptionsForHooks;\n\tresponse: Response;\n}>;\n\nexport type ErrorContext<TErrorData> = UnmaskType<\n\t| {\n\t\t\terror: PossibleHTTPError<TErrorData>;\n\t\t\toptions: CombinedCallApiExtraOptions;\n\t\t\trequest: CallApiRequestOptionsForHooks;\n\t\t\tresponse: Response;\n\t }\n\t| {\n\t\t\terror: PossibleJavaScriptError;\n\t\t\toptions: CombinedCallApiExtraOptions;\n\t\t\trequest: CallApiRequestOptionsForHooks;\n\t\t\tresponse: null;\n\t }\n>;\n\nexport type PossibleJavascriptErrorNames =\n\t| \"AbortError\"\n\t| \"Error\"\n\t| \"SyntaxError\"\n\t| \"TimeoutError\"\n\t| \"TypeError\"\n\t| (`${string}Error` & {});\n\nexport type PossibleJavaScriptError = UnmaskType<{\n\terrorData: DOMException | Error | SyntaxError | TypeError;\n\tmessage: string;\n\tname: PossibleJavascriptErrorNames;\n}>;\n\nexport type PossibleHTTPError<TErrorData> = UnmaskType<{\n\terrorData: TErrorData;\n\tmessage: string;\n\tname: \"HTTPError\";\n}>;\n\nexport type ErrorObjectUnion<TErrorData = unknown> =\n\t| PossibleHTTPError<TErrorData>\n\t| PossibleJavaScriptError;\n\nexport type CallApiResultSuccessVariant<TData> = {\n\tdata: TData;\n\terror: null;\n\tresponse: Response;\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<TData = unknown, TErrorData = unknown> = {\n\t// eslint-disable-next-line perfectionist/sort-union-types -- I need the first one to be first\n\tall: CallApiResultSuccessVariant<TData> | CallApiResultErrorVariant<TErrorData>;\n\tonlyError: CallApiResultErrorVariant<TErrorData>[\"error\"] | null;\n\tonlyResponse: CallApiResultSuccessVariant<TData>[\"response\"] | null;\n\tonlySuccess: CallApiResultSuccessVariant<TData>[\"data\"] | null;\n\tonlySuccessWithException: CallApiResultSuccessVariant<TData>[\"data\"];\n};\n\nexport type CallApiResultModeUnion =\n\t| { [Key in keyof ResultModeMap]: Key }[keyof ResultModeMap]\n\t| undefined;\n\nexport type GetCallApiResult<TData, TErrorData, TResultMode> = TErrorData extends false\n\t? ResultModeMap<TData, TErrorData>[\"onlySuccessWithException\"]\n\t: undefined extends TResultMode\n\t\t? ResultModeMap<TData, TErrorData>[\"all\"]\n\t\t: TResultMode extends NonNullable<CallApiResultModeUnion>\n\t\t\t? ResultModeMap<TData, TErrorData>[TResultMode]\n\t\t\t: never;\n","import type { BaseCallApiConfig } from \"../types\";\nimport { defineEnum } from \"./type-helpers\";\n\nexport const fetchSpecificKeys = defineEnum([\n\t\"body\",\n\t\"integrity\",\n\t\"method\",\n\t\"headers\",\n\t\"signal\",\n\t\"cache\",\n\t\"redirect\",\n\t\"window\",\n\t\"credentials\",\n\t\"keepalive\",\n\t\"referrer\",\n\t\"priority\",\n\t\"mode\",\n\t\"referrerPolicy\",\n] satisfies Array<keyof RequestInit>);\n\nconst retryCodesLookup = defineEnum({\n\t408: \"Request Timeout\",\n\t409: \"Conflict\",\n\t425: \"Too Early\",\n\t429: \"Too Many Requests\",\n\t500: \"Internal Server Error\",\n\t502: \"Bad Gateway\",\n\t503: \"Service Unavailable\",\n\t504: \"Gateway Timeout\",\n});\n\nexport const defaultRetryMethods = [\"GET\"] satisfies BaseCallApiConfig[\"retryMethods\"];\n\nexport const defaultRetryCodes = Object.keys(retryCodesLookup).map(\n\tNumber\n) as Required<BaseCallApiConfig>[\"retryCodes\"];\n","import { getAuthHeader } from \"@/auth\";\nimport {\n\ttype BaseCallApiExtraOptions,\n\ttype CallApiConfig,\n\ttype CallApiExtraOptions,\n\ttype CallApiRequestOptions,\n\ttype CallApiResultErrorVariant,\n\ttype ErrorObjectUnion,\n\ttype PossibleHTTPError,\n\ttype PossibleJavascriptErrorNames,\n\ttype ResultModeMap,\n\toptionsEnumToOmitFromBase,\n\toptionsEnumToOmitFromInstance,\n} from \"../types\";\nimport { fetchSpecificKeys } from \"./constants\";\nimport { isArray, isFunction, isPlainObject, isQueryString, isString } from \"./type-guards\";\nimport type { AnyFunction, Awaitable } from \"./type-helpers\";\n\nconst omitKeys = <TObject extends Record<string, unknown>, const TOmitArray extends Array<keyof TObject>>(\n\tinitialObject: TObject,\n\tkeysToOmit: TOmitArray\n) => {\n\tconst updatedObject = {} as Record<string, unknown>;\n\n\tconst keysToOmitSet = new Set(keysToOmit);\n\n\tfor (const [key, value] of Object.entries(initialObject)) {\n\t\tif (!keysToOmitSet.has(key)) {\n\t\t\tupdatedObject[key] = value;\n\t\t}\n\t}\n\n\treturn updatedObject as Omit<TObject, TOmitArray[number]>;\n};\n\nconst pickKeys = <TObject extends Record<string, unknown>, const TPickArray extends Array<keyof TObject>>(\n\tinitialObject: TObject,\n\tkeysToPick: TPickArray\n) => {\n\tconst updatedObject = {} as Record<string, unknown>;\n\n\tconst keysToPickSet = new Set(keysToPick);\n\n\tfor (const [key, value] of Object.entries(initialObject)) {\n\t\tif (keysToPickSet.has(key)) {\n\t\t\tupdatedObject[key] = value;\n\t\t}\n\t}\n\n\treturn updatedObject as Pick<TObject, TPickArray[number]>;\n};\n\n// eslint-disable-next-line ts-eslint/no-explicit-any -- Any is required here so that one can pass custom function type without type errors\nexport const splitBaseConfig = (baseConfig: Record<string, any>) =>\n\t[\n\t\tpickKeys(baseConfig, fetchSpecificKeys) as CallApiRequestOptions,\n\t\tomitKeys(baseConfig, [\n\t\t\t...fetchSpecificKeys,\n\t\t\t...optionsEnumToOmitFromBase,\n\t\t]) as BaseCallApiExtraOptions,\n\t] as const;\n\n// eslint-disable-next-line ts-eslint/no-explicit-any -- Any is required here so that one can pass custom function type without type errors\nexport const splitConfig = (config: Record<string, any>) =>\n\t[\n\t\tpickKeys(config, fetchSpecificKeys) as CallApiRequestOptions,\n\t\tomitKeys(config, [...fetchSpecificKeys, ...optionsEnumToOmitFromInstance]) as CallApiExtraOptions,\n\t] as const;\n\nexport const objectifyHeaders = (headers: RequestInit[\"headers\"]): Record<string, string> | undefined => {\n\tif (!headers || isPlainObject(headers)) {\n\t\treturn headers;\n\t}\n\n\treturn Object.fromEntries(headers);\n};\n\nexport const generateDedupeKey = (\n\turl: string,\n\tconfig: Record<string, unknown> & { shouldHaveDedupeKey: boolean }\n) => {\n\tif (!config.shouldHaveDedupeKey) {\n\t\treturn null;\n\t}\n\n\treturn `${url}-${JSON.stringify(config)}`;\n};\n\ntype ToQueryStringFn = {\n\t(params: CallApiConfig[\"query\"]): string | null;\n\t(params: Required<CallApiConfig>[\"query\"]): string;\n};\n\nexport const toQueryString: ToQueryStringFn = (params) => {\n\tif (!params) {\n\t\tconsole.error(\"toQueryString:\", \"No query params provided!\");\n\n\t\treturn null as never;\n\t}\n\n\treturn new URLSearchParams(params as Record<string, string>).toString();\n};\n\n// export mergeAndResolve\n\nexport const mergeAndResolveHeaders = (options: {\n\tauth: CallApiConfig[\"auth\"];\n\tbaseHeaders: CallApiConfig[\"headers\"];\n\tbody: CallApiConfig[\"body\"];\n\theaders: CallApiConfig[\"headers\"];\n}) => {\n\tconst { auth, baseHeaders, body, headers } = options;\n\n\t// eslint-disable-next-line ts-eslint/prefer-nullish-coalescing -- Nullish coalescing makes no sense in this boolean context\n\tconst shouldResolveHeaders = Boolean(baseHeaders || headers || body || auth);\n\n\t// == Return early if any of the following conditions are not met (so that native fetch would auto set the correct headers):\n\t// == - headers are provided\n\t// == - The body is an object\n\t// == - The auth option is provided\n\tif (!shouldResolveHeaders) return;\n\n\tconst headersObject: Record<string, string> = {\n\t\t...getAuthHeader(auth),\n\t\t...objectifyHeaders(baseHeaders),\n\t\t...objectifyHeaders(headers),\n\t};\n\n\tif (isQueryString(body)) {\n\t\theadersObject[\"Content-Type\"] = \"application/x-www-form-urlencoded\";\n\n\t\treturn headersObject;\n\t}\n\n\tif (isPlainObject(body) || (isString(body) && body.startsWith(\"{\"))) {\n\t\theadersObject[\"Content-Type\"] = \"application/json\";\n\t\theadersObject.Accept = \"application/json\";\n\t}\n\n\treturn headersObject;\n};\n\nexport const flattenHooks = <\n\tTBaseInterceptor extends\n\t\t| AnyFunction<Awaitable<unknown>>\n\t\t| Array<AnyFunction<Awaitable<unknown>> | undefined>,\n\tTInterceptor extends\n\t\t| AnyFunction<Awaitable<unknown>>\n\t\t| Array<AnyFunction<Awaitable<unknown>> | undefined>,\n>(\n\tbaseInterceptor: TBaseInterceptor | undefined,\n\tinterceptor: TInterceptor | undefined\n) => {\n\tif (isArray(baseInterceptor)) {\n\t\treturn [baseInterceptor, interceptor].flat() as TInterceptor;\n\t}\n\n\treturn interceptor ?? baseInterceptor;\n};\n\nexport const getFetchImpl = (customFetchImpl: CallApiExtraOptions[\"customFetchImpl\"]) => {\n\tif (customFetchImpl) {\n\t\treturn customFetchImpl;\n\t}\n\n\tif (typeof globalThis !== \"undefined\" && isFunction(globalThis.fetch)) {\n\t\treturn globalThis.fetch;\n\t}\n\n\tthrow new Error(\"No fetch implementation found\");\n};\n\nexport const getResponseType = <TResponse>(\n\tresponse: Response,\n\tparser?: Required<CallApiExtraOptions>[\"responseParser\"]\n) => ({\n\tarrayBuffer: () => response.arrayBuffer() as Promise<TResponse>,\n\tblob: () => response.blob() as Promise<TResponse>,\n\tformData: () => response.formData() as Promise<TResponse>,\n\tjson: async () => {\n\t\tif (parser) {\n\t\t\tconst text = await response.text();\n\t\t\treturn parser(text);\n\t\t}\n\n\t\treturn response.json() as Promise<TResponse>;\n\t},\n\tstream: () => response.body,\n\ttext: () => response.text() as Promise<TResponse>,\n});\n\nexport const executeHooks = <TInterceptor extends Awaitable<unknown>>(...interceptors: TInterceptor[]) =>\n\tPromise.all(interceptors);\n\nexport const getResponseData = async <TResponse>(\n\tresponse: Response,\n\tresponseType: keyof ReturnType<typeof getResponseType>,\n\tparser: CallApiExtraOptions[\"responseParser\"],\n\tvalidator?: CallApiExtraOptions[\"responseValidator\"]\n) => {\n\tconst RESPONSE_TYPE_LOOKUP = getResponseType<TResponse>(response, parser);\n\n\tif (!Object.hasOwn(RESPONSE_TYPE_LOOKUP, responseType)) {\n\t\tthrow new Error(`Invalid response type: ${responseType}`);\n\t}\n\n\tconst responseData = await RESPONSE_TYPE_LOOKUP[responseType]();\n\n\tconst validResponseData = validator ? validator(responseData) : responseData;\n\n\treturn validResponseData;\n};\n\ntype SuccessInfo = {\n\tdata: unknown;\n\tresponse: Response;\n\tresultMode: CallApiExtraOptions[\"resultMode\"];\n};\n\n// == The CallApiResult type is used to cast all return statements due to a design limitation in ts.\n// LINK - See https://www.zhenghao.io/posts/type-functions for more info\nexport const resolveSuccessResult = <CallApiResult>(info: SuccessInfo): CallApiResult => {\n\tconst { data, response, resultMode } = info;\n\n\tconst apiDetails = { data, error: null, response };\n\n\tif (!resultMode) {\n\t\treturn apiDetails as CallApiResult;\n\t}\n\n\tconst resultModeMap: ResultModeMap = {\n\t\tall: apiDetails,\n\t\tonlyError: apiDetails.error,\n\t\tonlyResponse: apiDetails.response,\n\t\tonlySuccess: apiDetails.data,\n\t\tonlySuccessWithException: apiDetails.data,\n\t};\n\n\treturn resultModeMap[resultMode] as CallApiResult;\n};\n\ntype ErrorInfo = {\n\tdefaultErrorMessage: Required<CallApiExtraOptions>[\"defaultErrorMessage\"];\n\terror?: unknown;\n\tmessage?: string;\n\tresultMode: CallApiExtraOptions[\"resultMode\"];\n};\n\nexport const resolveErrorResult = <TCallApiResult>(info: ErrorInfo) => {\n\tconst { defaultErrorMessage, error, message: customErrorMessage, resultMode } = info;\n\n\tlet apiDetails: CallApiResultErrorVariant<unknown> = {\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 PossibleJavascriptErrorNames,\n\t\t},\n\t\tresponse: null,\n\t};\n\n\tif (isHTTPErrorInstance(error)) {\n\t\tconst { errorData, message = defaultErrorMessage, name, response } = error;\n\n\t\tapiDetails = {\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},\n\t\t\tresponse,\n\t\t};\n\t}\n\n\tconst resultModeMap: ResultModeMap = {\n\t\tall: apiDetails,\n\t\tonlyError: apiDetails.error,\n\t\tonlyResponse: apiDetails.response,\n\t\tonlySuccess: apiDetails.data,\n\t\tonlySuccessWithException: apiDetails.data,\n\t};\n\n\tconst generalErrorResult = resultModeMap[resultMode ?? \"all\"] as TCallApiResult;\n\n\t// prettier-ignore\n\tconst resolveCustomErrorInfo = ({ message }: Pick<ErrorInfo, \"message\">) => {\n\t\tconst errorResult = resolveErrorResult<TCallApiResult>({ ...info, message });\n\n\t\treturn errorResult.generalErrorResult;\n\t};\n\n\treturn { apiDetails, generalErrorResult, resolveCustomErrorInfo };\n};\n\nexport const isHTTPError = <TErrorData>(\n\terror: ErrorObjectUnion<TErrorData> | null\n): error is PossibleHTTPError<TErrorData> => {\n\treturn isPlainObject(error) && error.name === \"HTTPError\";\n};\n\ntype ErrorDetails<TErrorResponse> = {\n\tdefaultErrorMessage: string;\n\terrorData: TErrorResponse;\n\tresponse: Response;\n};\n\ntype ErrorOptions = {\n\tcause?: unknown;\n};\n\nexport class HTTPError<TErrorResponse = Record<string, unknown>> extends Error {\n\terrorData: ErrorDetails<TErrorResponse>[\"errorData\"];\n\tisHTTPError = true;\n\n\toverride name = \"HTTPError\" as const;\n\n\tresponse: ErrorDetails<TErrorResponse>[\"response\"];\n\n\tconstructor(errorDetails: ErrorDetails<TErrorResponse>, errorOptions?: ErrorOptions) {\n\t\tconst { defaultErrorMessage, errorData, response } = errorDetails;\n\n\t\tsuper((errorData as { message?: string } | undefined)?.message ?? defaultErrorMessage, errorOptions);\n\n\t\tthis.errorData = errorData;\n\t\tthis.response = response;\n\n\t\tError.captureStackTrace(this, this.constructor);\n\t}\n}\n\nexport const isHTTPErrorInstance = <TErrorResponse>(\n\terror: unknown\n): error is HTTPError<TErrorResponse> => {\n\treturn (\n\t\t// prettier-ignore\n\t\terror instanceof HTTPError|| (isPlainObject(error) && error.name === \"HTTPError\" && error.isHTTPError === true)\n\t);\n};\n\nconst PromiseWithResolvers = () => {\n\tlet reject!: (reason?: unknown) => void;\n\tlet resolve!: (value: unknown) => void;\n\n\tconst promise = new Promise((res, rej) => {\n\t\tresolve = res;\n\t\treject = rej;\n\t});\n\n\treturn { promise, reject, resolve };\n};\n\nexport const waitUntil = (delay: number) => {\n\tif (delay === 0) return;\n\n\tconst { promise, resolve } = PromiseWithResolvers();\n\n\tsetTimeout(resolve, delay);\n\n\treturn promise;\n};\n","import type { CallApiConfig, CallApiExtraOptions } from \"./types\";\nimport { toQueryString } from \"./utils\";\nimport { isArray } from \"./utils/type-guards\";\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\n\t\t\t.split(slash)\n\t\t\t.filter((matchedParam) => matchedParam.startsWith(column));\n\n\t\tfor (const [index, matchedParam] of matchedParamArray.entries()) {\n\t\t\tconst param = params[index] as string;\n\t\t\tnewUrl = newUrl.replace(matchedParam, param);\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: CallApiConfig[\"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,\n\tparams: CallApiExtraOptions[\"params\"],\n\tquery: CallApiExtraOptions[\"query\"]\n) => {\n\tconst urlWithMergedParams = mergeUrlWithParams(url, params);\n\n\treturn mergeUrlWithQuery(urlWithMergedParams, query);\n};\n","// prettier-ignore\nexport const createCombinedSignal = (...signals: Array<AbortSignal | null | undefined>) => AbortSignal.any(signals.filter(Boolean));\n\nexport const createTimeoutSignal = (milliseconds: number) => AbortSignal.timeout(milliseconds);\n","import { initializePlugins } from \"./plugins\";\nimport type {\n\tBaseCallApiConfig,\n\tCallApiParameters,\n\tCallApiRequestOptions,\n\tCallApiRequestOptionsForHooks,\n\tCallApiResultModeUnion,\n\tCombinedCallApiExtraOptions,\n\tGetCallApiResult,\n\tPossibleHTTPError,\n\tPossibleJavaScriptError,\n} from \"./types\";\nimport { mergeUrlWithParamsAndQuery } from \"./url\";\nimport {\n\tHTTPError,\n\texecuteHooks,\n\tflattenHooks,\n\tgenerateDedupeKey,\n\tgetFetchImpl,\n\tgetResponseData,\n\tisHTTPErrorInstance,\n\tmergeAndResolveHeaders,\n\tresolveErrorResult,\n\tresolveSuccessResult,\n\tsplitBaseConfig,\n\tsplitConfig,\n\twaitUntil,\n} from \"./utils/common\";\nimport { defaultRetryCodes, defaultRetryMethods } from \"./utils/constants\";\nimport { createCombinedSignal, createTimeoutSignal } from \"./utils/polyfills\";\nimport { isFunction, isPlainObject } from \"./utils/type-guards\";\n\nexport const createFetchClient = <\n\tTBaseData = unknown,\n\tTBaseErrorData = unknown,\n\tTBaseResultMode extends CallApiResultModeUnion = CallApiResultModeUnion,\n>(\n\tbaseConfig: BaseCallApiConfig<TBaseData, TBaseErrorData, TBaseResultMode> = {}\n) => {\n\tconst [baseFetchConfig, baseExtraOptions] = splitBaseConfig(baseConfig);\n\n\tconst {\n\t\tbody: baseBody,\n\t\theaders: baseHeaders,\n\t\tsignal: baseSignal,\n\t\t...restOfBaseFetchConfig\n\t} = baseFetchConfig;\n\n\tconst requestInfoCache = new Map<\n\t\tstring | null,\n\t\t{ controller: AbortController; responsePromise: Promise<Response> }\n\t>();\n\n\tconst callApi = async <\n\t\tTData = TBaseData,\n\t\tTErrorData = TBaseErrorData,\n\t\tTResultMode extends CallApiResultModeUnion = TBaseResultMode,\n\t>(\n\t\t...parameters: CallApiParameters<TData, TErrorData, TResultMode>\n\t): Promise<GetCallApiResult<TData, TErrorData, TResultMode>> => {\n\t\tconst [initURL, config] = parameters;\n\n\t\ttype CallApiResult = never;\n\n\t\tconst [fetchConfig, extraOptions] = splitConfig(config ?? {});\n\n\t\tconst { body = baseBody, headers, signal = baseSignal, ...restOfFetchConfig } = fetchConfig;\n\n\t\t// == Default Extra Options\n\t\tconst defaultExtraOptions = {\n\t\t\tbaseURL: \"\",\n\t\t\tbodySerializer: JSON.stringify,\n\t\t\tdedupeStrategy: \"cancel\",\n\t\t\tdefaultErrorMessage: \"Failed to fetch data from server!\",\n\t\t\tmergedInterceptorsExecutionMode: \"parallel\",\n\t\t\tmergedInterceptorsExecutionOrder: \"mainInterceptorLast\",\n\t\t\tresponseType: \"json\",\n\t\t\tresultMode: \"all\",\n\t\t\tretryAttempts: 0,\n\t\t\tretryCodes: defaultRetryCodes,\n\t\t\tretryDelay: 0,\n\t\t\tretryMethods: defaultRetryMethods,\n\n\t\t\t...baseExtraOptions,\n\t\t\t...extraOptions,\n\n\t\t\tonError: flattenHooks(baseExtraOptions.onError, extraOptions.onError),\n\t\t\tonRequest: flattenHooks(baseExtraOptions.onRequest, extraOptions.onRequest),\n\t\t\tonRequestError: flattenHooks(baseExtraOptions.onRequestError, extraOptions.onRequestError),\n\t\t\tonResponse: flattenHooks(baseExtraOptions.onResponse, extraOptions.onResponse),\n\t\t\tonResponseError: flattenHooks(baseExtraOptions.onResponseError, extraOptions.onResponseError),\n\t\t\tonSuccess: flattenHooks(baseExtraOptions.onSuccess, extraOptions.onSuccess),\n\t\t} satisfies CombinedCallApiExtraOptions;\n\n\t\tconst { interceptors, resolvedOptions, resolvedRequestOptions, url } = await initializePlugins({\n\t\t\tinitURL,\n\t\t\toptions: defaultExtraOptions,\n\t\t\trequest: { ...restOfBaseFetchConfig, ...restOfFetchConfig },\n\t\t});\n\n\t\tconst options = {\n\t\t\t...resolvedOptions,\n\t\t\t...interceptors,\n\t\t\tinitURL,\n\t\t} satisfies CombinedCallApiExtraOptions as typeof defaultExtraOptions & typeof interceptors;\n\n\t\t// == Default Request Options\n\t\tconst defaultRequestOptions = {\n\t\t\tbody: isPlainObject(body) ? options.bodySerializer(body) : body,\n\t\t\tmethod: \"GET\",\n\n\t\t\t...resolvedRequestOptions,\n\t\t} satisfies CallApiRequestOptions;\n\n\t\tconst fullURL = `${options.baseURL}${mergeUrlWithParamsAndQuery(url, options.params, options.query)}`;\n\n\t\t// prettier-ignore\n\t\tconst shouldHaveDedupeKey = options.dedupeStrategy === \"cancel\" || options.dedupeStrategy === \"defer\";\n\n\t\tconst dedupeKey =\n\t\t\toptions.dedupeKey ??\n\t\t\tgenerateDedupeKey(fullURL, { shouldHaveDedupeKey, ...resolvedRequestOptions, ...options });\n\n\t\t// == This is required to leave the smallest window of time for the cache to be updated with the last request info, if all requests with the same key start at the same time\n\t\tif (dedupeKey != null) {\n\t\t\tawait waitUntil(0.1);\n\t\t}\n\n\t\t// == This ensures cache operations only occur when key is available\n\t\tconst requestInfoCacheOrNull = dedupeKey != null ? requestInfoCache : null;\n\n\t\tconst prevRequestInfo = requestInfoCacheOrNull?.get(dedupeKey);\n\n\t\tif (prevRequestInfo && options.dedupeStrategy === \"cancel\") {\n\t\t\tconst message = options.dedupeKey\n\t\t\t\t? `Duplicate request detected - Aborting previous request with key '${dedupeKey}' as a new request was initiated`\n\t\t\t\t: `Duplicate request detected - Aborting previous request to '${fullURL}' as a new request with identical options was initiated`;\n\n\t\t\tconst reason = new DOMException(message, \"AbortError\");\n\n\t\t\tprevRequestInfo.controller.abort(reason);\n\t\t}\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(newFetchController.signal, timeoutSignal, signal);\n\n\t\tconst request = {\n\t\t\tfullURL,\n\t\t\tsignal: combinedSignal,\n\t\t\t...defaultRequestOptions,\n\t\t} satisfies CallApiRequestOptionsForHooks;\n\n\t\tconst fetch = getFetchImpl(options.customFetchImpl);\n\n\t\ttry {\n\t\t\tawait executeHooks(options.onRequest({ options, request }));\n\n\t\t\t// == Apply determined headers\n\t\t\trequest.headers = mergeAndResolveHeaders({\n\t\t\t\tauth: options.auth,\n\t\t\t\tbaseHeaders: baseHeaders ?? headers,\n\t\t\t\tbody,\n\t\t\t\theaders: request.headers,\n\t\t\t});\n\n\t\t\tconst shouldUsePromiseFromCache = prevRequestInfo && options.dedupeStrategy === \"defer\";\n\n\t\t\tconst responsePromise = shouldUsePromiseFromCache\n\t\t\t\t? prevRequestInfo.responsePromise\n\t\t\t\t: fetch(fullURL, request as RequestInit);\n\n\t\t\trequestInfoCacheOrNull?.set(dedupeKey, { controller: newFetchController, responsePromise });\n\n\t\t\tconst response = await responsePromise;\n\n\t\t\tconst shouldRetry =\n\t\t\t\t!response.ok &&\n\t\t\t\t!combinedSignal.aborted &&\n\t\t\t\toptions.retryAttempts > 0 &&\n\t\t\t\toptions.retryCodes.includes(response.status) &&\n\t\t\t\toptions.retryMethods.includes(request.method);\n\n\t\t\tif (shouldRetry) {\n\t\t\t\tawait waitUntil(options.retryDelay);\n\n\t\t\t\treturn await callApi(initURL, { ...config, retryAttempts: options.retryAttempts - 1 });\n\t\t\t}\n\n\t\t\t// == Clone response when dedupeStrategy is set to \"defer\", to avoid error thrown from reading response.(whatever) more than once\n\t\t\t// == Also clone response when resultMode is set to \"onlyResponse\", to avoid error thrown from reading response.(whatever) more than once\n\t\t\tconst shouldCloneResponse =\n\t\t\t\toptions.dedupeStrategy === \"defer\" ||\n\t\t\t\toptions.resultMode === \"onlyResponse\" ||\n\t\t\t\toptions.cloneResponse;\n\n\t\t\tif (!response.ok) {\n\t\t\t\tconst errorData = await getResponseData<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\toptions.responseErrorValidator\n\t\t\t\t);\n\n\t\t\t\t// == Pushing all error handling responsibilities to the catch block\n\t\t\t\tthrow new HTTPError({\n\t\t\t\t\tdefaultErrorMessage: options.defaultErrorMessage,\n\t\t\t\t\terrorData,\n\t\t\t\t\tresponse,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst successData = await getResponseData<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\toptions.responseValidator\n\t\t\t);\n\n\t\t\tawait executeHooks(\n\t\t\t\toptions.onSuccess({\n\t\t\t\t\tdata: successData,\n\t\t\t\t\toptions,\n\t\t\t\t\trequest,\n\t\t\t\t\tresponse: options.cloneResponse ? response.clone() : response,\n\t\t\t\t}),\n\n\t\t\t\toptions.onResponse({\n\t\t\t\t\tdata: successData,\n\t\t\t\t\terror: null,\n\t\t\t\t\toptions,\n\t\t\t\t\trequest,\n\t\t\t\t\tresponse: options.cloneResponse ? response.clone() : response,\n\t\t\t\t})\n\t\t\t);\n\n\t\t\treturn resolveSuccessResult<CallApiResult>({\n\t\t\t\tdata: successData,\n\t\t\t\tresponse,\n\t\t\t\tresultMode: options.resultMode,\n\t\t\t});\n\n\t\t\t// == Exhaustive Error handling\n\t\t} catch (error) {\n\t\t\tconst { apiDetails, generalErrorResult, resolveCustomErrorInfo } =\n\t\t\t\tresolveErrorResult<CallApiResult>({\n\t\t\t\t\tdefaultErrorMessage: options.defaultErrorMessage,\n\t\t\t\t\terror,\n\t\t\t\t\tresultMode: options.resultMode,\n\t\t\t\t});\n\n\t\t\tconst shouldThrowOnError = isFunction(options.throwOnError)\n\t\t\t\t? options.throwOnError({\n\t\t\t\t\t\terror: apiDetails.error as never,\n\t\t\t\t\t\toptions,\n\t\t\t\t\t\trequest,\n\t\t\t\t\t\tresponse: apiDetails.response,\n\t\t\t\t\t})\n\t\t\t\t: options.throwOnError;\n\n\t\t\t// eslint-disable-next-line unicorn/consistent-function-scoping -- This error is wrong cause the function is using some variables within the catch block\n\t\t\tconst handleThrowOnError = () => {\n\t\t\t\tif (!shouldThrowOnError) return;\n\n\t\t\t\tthrow apiDetails.error as Error;\n\t\t\t};\n\n\t\t\tif (isHTTPErrorInstance<TErrorData>(error)) {\n\t\t\t\tconst { response } = error;\n\n\t\t\t\tconst possibleHttpError = (generalErrorResult as { error: PossibleHTTPError<TErrorData> })\n\t\t\t\t\t.error;\n\n\t\t\t\tawait executeHooks(\n\t\t\t\t\toptions.onResponseError({\n\t\t\t\t\t\terror: possibleHttpError,\n\t\t\t\t\t\toptions,\n\t\t\t\t\t\trequest,\n\t\t\t\t\t\tresponse: options.cloneResponse ? response.clone() : response,\n\t\t\t\t\t}),\n\n\t\t\t\t\toptions.onError({\n\t\t\t\t\t\terror: possibleHttpError,\n\t\t\t\t\t\toptions,\n\t\t\t\t\t\trequest,\n\t\t\t\t\t\tresponse: options.cloneResponse ? response.clone() : response,\n\t\t\t\t\t}),\n\n\t\t\t\t\toptions.onResponse({\n\t\t\t\t\t\tdata: null,\n\t\t\t\t\t\terror: possibleHttpError,\n\t\t\t\t\t\toptions,\n\t\t\t\t\t\trequest,\n\t\t\t\t\t\tresponse: options.cloneResponse ? response.clone() : response,\n\t\t\t\t\t})\n\t\t\t\t);\n\n\t\t\t\thandleThrowOnError();\n\n\t\t\t\treturn generalErrorResult;\n\t\t\t}\n\n\t\t\tif (error instanceof DOMException && error.name === \"TimeoutError\") {\n\t\t\t\tconst message = `Request timed out after ${options.timeout}ms`;\n\n\t\t\t\tconsole.error(`${error.name}:`, message);\n\n\t\t\t\thandleThrowOnError();\n\n\t\t\t\treturn resolveCustomErrorInfo({ message });\n\t\t\t}\n\n\t\t\tif (error instanceof DOMException && error.name === \"AbortError\") {\n\t\t\t\tconst { message, name } = error;\n\n\t\t\t\tconsole.error(`${name}:`, message);\n\n\t\t\t\thandleThrowOnError();\n\n\t\t\t\treturn generalErrorResult;\n\t\t\t}\n\n\t\t\tconst possibleJavascriptError = (generalErrorResult as { error: PossibleJavaScriptError }).error;\n\n\t\t\tawait executeHooks(\n\t\t\t\t// == At this point only the request errors exist, so the request error interceptor is called\n\t\t\t\toptions.onRequestError({\n\t\t\t\t\terror: possibleJavascriptError,\n\t\t\t\t\toptions,\n\t\t\t\t\trequest,\n\t\t\t\t}),\n\n\t\t\t\t// == Also call the onError interceptor\n\t\t\t\toptions.onError({\n\t\t\t\t\terror: possibleJavascriptError,\n\t\t\t\t\toptions,\n\t\t\t\t\trequest,\n\t\t\t\t\tresponse: null,\n\t\t\t\t})\n\t\t\t);\n\n\t\t\thandleThrowOnError();\n\n\t\t\treturn generalErrorResult;\n\n\t\t\t// == Removing the now unneeded AbortController from store\n\t\t} finally {\n\t\t\trequestInfoCacheOrNull?.delete(dedupeKey);\n\t\t}\n\t};\n\n\tcallApi.create = createFetchClient;\n\n\treturn callApi;\n};\n\nexport const callApi = createFetchClient();\n","import { createFetchClient } from \"@/createFetchClient\";\nimport { initializePlugins } from \"@/plugins\";\nimport type {\n\tBaseCallApiConfig,\n\tCallApiRequestOptions,\n\tCallApiRequestOptionsForHooks,\n\tCallApiResultModeUnion,\n\tCombinedCallApiExtraOptions,\n\tGetCallApiResult,\n\tPossibleHTTPError,\n\tPossibleJavaScriptError,\n} from \"@/types\";\nimport { mergeUrlWithParamsAndQuery } from \"@/url\";\nimport {\n\tHTTPError,\n\texecuteHooks,\n\tflattenHooks,\n\tgenerateDedupeKey,\n\tgetFetchImpl,\n\tgetResponseData,\n\tisHTTPErrorInstance,\n\tmergeAndResolveHeaders,\n\tresolveErrorResult,\n\tresolveSuccessResult,\n\tsplitBaseConfig,\n\tsplitConfig,\n\twaitUntil,\n} from \"@/utils/common\";\nimport { defaultRetryCodes, defaultRetryMethods } from \"@/utils/constants\";\nimport { createCombinedSignal, createTimeoutSignal } from \"@/utils/polyfills\";\nimport { isFunction, isPlainObject } from \"@/utils/type-guards\";\nimport type { CallApiConfigWithRequiredURL } from \"./types\";\n\nexport const createFetchClientWithOptions = <\n\tTBaseData = unknown,\n\tTBaseErrorData = unknown,\n\tTBaseResultMode extends CallApiResultModeUnion = CallApiResultModeUnion,\n>(\n\tbaseConfig: BaseCallApiConfig<TBaseData, TBaseErrorData, TBaseResultMode> = {}\n) => {\n\tconst [baseFetchConfig, baseExtraOptions] = splitBaseConfig(baseConfig);\n\n\tconst {\n\t\tbody: baseBody,\n\t\theaders: baseHeaders,\n\t\tsignal: baseSignal,\n\t\t...restOfBaseFetchConfig\n\t} = baseFetchConfig;\n\n\tconst requestInfoCache = new Map<\n\t\tstring | null,\n\t\t{ controller: AbortController; responsePromise: Promise<Response> }\n\t>();\n\n\tconst callApi = async <\n\t\tTData = TBaseData,\n\t\tTErrorData = TBaseErrorData,\n\t\tTResultMode extends CallApiResultModeUnion = TBaseResultMode,\n\t>(\n\t\tconfigWithRequiredURL: CallApiConfigWithRequiredURL<TData, TErrorData, TResultMode>\n\t): Promise<GetCallApiResult<TData, TErrorData, TResultMode>> => {\n\t\tconst { initURL, ...config } = configWithRequiredURL;\n\n\t\ttype CallApiResult = never;\n\n\t\tconst [fetchConfig, extraOptions] = splitConfig(config);\n\n\t\tconst { body = baseBody, headers, signal = baseSignal, ...restOfFetchConfig } = fetchConfig;\n\n\t\t// == Default Extra Options\n\t\tconst defaultExtraOptions = {\n\t\t\tbaseURL: \"\",\n\t\t\tbodySerializer: JSON.stringify,\n\t\t\tdedupeStrategy: \"cancel\",\n\t\t\tdefaultErrorMessage: \"Failed to fetch data from server!\",\n\t\t\tmergedInterceptorsExecutionMode: \"parallel\",\n\t\t\tmergedInterceptorsExecutionOrder: \"mainInterceptorLast\",\n\t\t\tresponseType: \"json\",\n\t\t\tresultMode: \"all\",\n\t\t\tretryAttempts: 0,\n\t\t\tretryCodes: defaultRetryCodes,\n\t\t\tretryDelay: 0,\n\t\t\tretryMethods: defaultRetryMethods,\n\n\t\t\t...baseExtraOptions,\n\t\t\t...extraOptions,\n\n\t\t\tonError: flattenHooks(baseExtraOptions.onError, extraOptions.onError),\n\t\t\tonRequest: flattenHooks(baseExtraOptions.onRequest, extraOptions.onRequest),\n\t\t\tonRequestError: flattenHooks(baseExtraOptions.onRequestError, extraOptions.onRequestError),\n\t\t\tonResponse: flattenHooks(baseExtraOptions.onResponse, extraOptions.onResponse),\n\t\t\tonResponseError: flattenHooks(baseExtraOptions.onResponseError, extraOptions.onResponseError),\n\t\t\tonSuccess: flattenHooks(baseExtraOptions.onSuccess, extraOptions.onSuccess),\n\t\t} satisfies CombinedCallApiExtraOptions;\n\n\t\tconst { interceptors, resolvedOptions, resolvedRequestOptions, url } = await initializePlugins({\n\t\t\tinitURL,\n\t\t\toptions: defaultExtraOptions,\n\t\t\trequest: { ...restOfBaseFetchConfig, ...restOfFetchConfig },\n\t\t});\n\n\t\tconst options = {\n\t\t\t...resolvedOptions,\n\t\t\t...interceptors,\n\t\t\tinitURL,\n\t\t} satisfies CombinedCallApiExtraOptions as typeof defaultExtraOptions & typeof interceptors;\n\n\t\t// == Default Request Options\n\t\tconst defaultRequestOptions = {\n\t\t\tbody: isPlainObject(body) ? options.bodySerializer(body) : body,\n\t\t\tmethod: \"GET\",\n\n\t\t\t...resolvedRequestOptions,\n\t\t} satisfies CallApiRequestOptions;\n\n\t\tconst fullURL = `${options.baseURL}${mergeUrlWithParamsAndQuery(url, options.params, options.query)}`;\n\n\t\t// prettier-ignore\n\t\tconst shouldHaveDedupeKey = options.dedupeStrategy === \"cancel\" || options.dedupeStrategy === \"defer\";\n\n\t\tconst dedupeKey =\n\t\t\toptions.dedupeKey ??\n\t\t\tgenerateDedupeKey(fullURL, { shouldHaveDedupeKey, ...resolvedRequestOptions, ...options });\n\n\t\t// == This is required to leave the smallest window of time for the cache to be updated with the last request info, if all requests with the same key start at the same time\n\t\tif (dedupeKey != null) {\n\t\t\tawait waitUntil(0.1);\n\t\t}\n\n\t\t// == This ensures cache operations only occur when key is available\n\t\tconst requestInfoCacheOrNull = dedupeKey != null ? requestInfoCache : null;\n\n\t\tconst prevRequestInfo = requestInfoCacheOrNull?.get(dedupeKey);\n\n\t\tif (prevRequestInfo && options.dedupeStrategy === \"cancel\") {\n\t\t\tconst message = options.dedupeKey\n\t\t\t\t? `Duplicate request detected - Aborting previous request with key '${dedupeKey}' as a new request was initiated`\n\t\t\t\t: `Duplicate request detected - Aborting previous request to '${fullURL}' as a new request with identical options was initiated`;\n\n\t\t\tconst reason = new DOMException(message, \"AbortError\");\n\n\t\t\tprevRequestInfo.controller.abort(reason);\n\t\t}\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(newFetchController.signal, timeoutSignal, signal);\n\n\t\tconst request = {\n\t\t\tfullURL,\n\t\t\tsignal: combinedSignal,\n\t\t\t...defaultRequestOptions,\n\t\t} satisfies CallApiRequestOptionsForHooks;\n\n\t\tconst fetch = getFetchImpl(options.customFetchImpl);\n\n\t\ttry {\n\t\t\tawait executeHooks(options.onRequest({ options, request }));\n\n\t\t\t// == Apply determined headers\n\t\t\trequest.headers = mergeAndResolveHeaders({\n\t\t\t\tauth: options.auth,\n\t\t\t\tbaseHeaders: baseHeaders ?? headers,\n\t\t\t\tbody,\n\t\t\t\theaders: request.headers,\n\t\t\t});\n\n\t\t\tconst shouldUsePromiseFromCache = prevRequestInfo && options.dedupeStrategy === \"defer\";\n\n\t\t\tconst responsePromise = shouldUsePromiseFromCache\n\t\t\t\t? prevRequestInfo.responsePromise\n\t\t\t\t: fetch(fullURL, request as RequestInit);\n\n\t\t\trequestInfoCacheOrNull?.set(dedupeKey, { controller: newFetchController, responsePromise });\n\n\t\t\tconst response = await responsePromise;\n\n\t\t\tconst shouldRetry =\n\t\t\t\t!response.ok &&\n\t\t\t\t!combinedSignal.aborted &&\n\t\t\t\toptions.retryAttempts > 0 &&\n\t\t\t\toptions.retryCodes.includes(response.status) &&\n\t\t\t\toptions.retryMethods.includes(request.method);\n\n\t\t\tif (shouldRetry) {\n\t\t\t\tawait waitUntil(options.retryDelay);\n\n\t\t\t\treturn await callApi({ ...configWithRequiredURL, retryAttempts: options.retryAttempts - 1 });\n\t\t\t}\n\n\t\t\t// == Clone response when dedupeStrategy is set to \"defer\", to avoid error thrown from reading response.(whatever) more than once\n\t\t\t// == Also clone response when resultMode is set to \"onlyResponse\", to avoid error thrown from reading response.(whatever) more than once\n\t\t\tconst shouldCloneResponse =\n\t\t\t\toptions.dedupeStrategy === \"defer\" ||\n\t\t\t\toptions.resultMode === \"onlyResponse\" ||\n\t\t\t\toptions.cloneResponse;\n\n\t\t\tif (!response.ok) {\n\t\t\t\tconst errorData = await getResponseData<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\toptions.responseErrorValidator\n\t\t\t\t);\n\n\t\t\t\t// == Pushing all error handling responsibilities to the catch block\n\t\t\t\tthrow new HTTPError({\n\t\t\t\t\tdefaultErrorMessage: options.defaultErrorMessage,\n\t\t\t\t\terrorData,\n\t\t\t\t\tresponse,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst successData = await getResponseData<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\toptions.responseValidator\n\t\t\t);\n\n\t\t\tawait executeHooks(\n\t\t\t\toptions.onSuccess({\n\t\t\t\t\tdata: successData,\n\t\t\t\t\toptions,\n\t\t\t\t\trequest,\n\t\t\t\t\tresponse: options.cloneResponse ? response.clone() : response,\n\t\t\t\t}),\n\n\t\t\t\toptions.onResponse({\n\t\t\t\t\tdata: successData,\n\t\t\t\t\terror: null,\n\t\t\t\t\toptions,\n\t\t\t\t\trequest,\n\t\t\t\t\tresponse: options.cloneResponse ? response.clone() : response,\n\t\t\t\t})\n\t\t\t);\n\n\t\t\treturn resolveSuccessResult<CallApiResult>({\n\t\t\t\tdata: successData,\n\t\t\t\tresponse,\n\t\t\t\tresultMode: options.resultMode,\n\t\t\t});\n\n\t\t\t// == Exhaustive Error handling\n\t\t} catch (error) {\n\t\t\tconst { apiDetails, generalErrorResult, resolveCustomErrorInfo } =\n\t\t\t\tresolveErrorResult<CallApiResult>({\n\t\t\t\t\tdefaultErrorMessage: options.defaultErrorMessage,\n\t\t\t\t\terror,\n\t\t\t\t\tresultMode: options.resultMode,\n\t\t\t\t});\n\n\t\t\tconst shouldThrowOnError = isFunction(options.throwOnError)\n\t\t\t\t? options.throwOnError({\n\t\t\t\t\t\terror: apiDetails.error as never,\n\t\t\t\t\t\toptions,\n\t\t\t\t\t\trequest,\n\t\t\t\t\t\tresponse: apiDetails.response,\n\t\t\t\t\t})\n\t\t\t\t: options.throwOnError;\n\n\t\t\t// eslint-disable-next-line unicorn/consistent-function-scoping -- This error is wrong cause the function is using some variables within the catch block\n\t\t\tconst handleThrowOnError = () => {\n\t\t\t\tif (!shouldThrowOnError) return;\n\n\t\t\t\tthrow apiDetails.error as Error;\n\t\t\t};\n\n\t\t\tif (isHTTPErrorInstance<TErrorData>(error)) {\n\t\t\t\tconst { response } = error;\n\n\t\t\t\tconst possibleHttpError = (generalErrorResult as { error: PossibleHTTPError<TErrorData> })\n\t\t\t\t\t.error;\n\n\t\t\t\tawait executeHooks(\n\t\t\t\t\toptions.onResponseError({\n\t\t\t\t\t\terror: possibleHttpError,\n\t\t\t\t\t\toptions,\n\t\t\t\t\t\trequest,\n\t\t\t\t\t\tresponse: options.cloneResponse ? response.clone() : response,\n\t\t\t\t\t}),\n\n\t\t\t\t\toptions.onError({\n\t\t\t\t\t\terror: possibleHttpError,\n\t\t\t\t\t\toptions,\n\t\t\t\t\t\trequest,\n\t\t\t\t\t\tresponse: options.cloneResponse ? response.clone() : response,\n\t\t\t\t\t}),\n\n\t\t\t\t\toptions.onResponse({\n\t\t\t\t\t\tdata: null,\n\t\t\t\t\t\terror: possibleHttpError,\n\t\t\t\t\t\toptions,\n\t\t\t\t\t\trequest,\n\t\t\t\t\t\tresponse: options.cloneResponse ? response.clone() : response,\n\t\t\t\t\t})\n\t\t\t\t);\n\n\t\t\t\thandleThrowOnError();\n\n\t\t\t\treturn generalErrorResult;\n\t\t\t}\n\n\t\t\tif (error instanceof DOMException && error.name === \"TimeoutError\") {\n\t\t\t\tconst message = `Request timed out after ${options.timeout}ms`;\n\n\t\t\t\tconsole.error(`${error.name}:`, message);\n\n\t\t\t\thandleThrowOnError();\n\n\t\t\t\treturn resolveCustomErrorInfo({ message });\n\t\t\t}\n\n\t\t\tif (error instanceof DOMException && error.name === \"AbortError\") {\n\t\t\t\tconst { message, name } = error;\n\n\t\t\t\tconsole.error(`${name}:`, message);\n\n\t\t\t\thandleThrowOnError();\n\n\t\t\t\treturn generalErrorResult;\n\t\t\t}\n\n\t\t\tconst possibleJavascriptError = (generalErrorResult as { error: PossibleJavaScriptError }).error;\n\n\t\t\tawait executeHooks(\n\t\t\t\t// == At this point only the request errors exist, so the request error interceptor is called\n\t\t\t\toptions.onRequestError({\n\t\t\t\t\terror: possibleJavascriptError,\n\t\t\t\t\toptions,\n\t\t\t\t\trequest,\n\t\t\t\t}),\n\n\t\t\t\t// == Also call the onError interceptor\n\t\t\t\toptions.onError({\n\t\t\t\t\terror: possibleJavascriptError,\n\t\t\t\t\toptions,\n\t\t\t\t\trequest,\n\t\t\t\t\tresponse: null,\n\t\t\t\t})\n\t\t\t);\n\n\t\t\thandleThrowOnError();\n\n\t\t\treturn generalErrorResult;\n\n\t\t\t// == Removing the now unneeded AbortController from store\n\t\t} finally {\n\t\t\trequestInfoCacheOrNull?.delete(dedupeKey);\n\t\t}\n\t};\n\n\tcallApi.create = createFetchClient;\n\n\treturn callApi;\n};\n\nexport const callApiWithOptions = createFetchClientWithOptions();\n","import type { CallApiResultModeUnion } from \"@/types\";\nimport type { CallApiConfigWithRequiredURL } from \"./types\";\n\nconst defineOptions = <\n\tTData = unknown,\n\tTErrorData = unknown,\n\tTResultMode extends CallApiResultModeUnion = CallApiResultModeUnion,\n>(\n\tconfig: CallApiConfigWithRequiredURL<TData, TErrorData, TResultMode>\n) => {\n\treturn config;\n};\n\nexport { defineOptions };\n"],"mappings":"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","names":["interceptors","callApi","callApi"]}