@zayne-labs/callapi 1.3.5 → 1.3.7

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,18 +1,3 @@
1
- type AnyString = string & {
2
- z_placeholder?: never;
3
- };
4
- type AnyNumber = number & {
5
- z_placeholder?: never;
6
- };
7
- type AnyFunction<TResult = any> = (...args: any[]) => TResult;
8
- type UnmaskType<TValue> = {
9
- _: TValue;
10
- }["_"];
11
- type Awaitable<TValue> = Promise<TValue> | TValue;
12
- type CommonRequestHeaders = "Access-Control-Allow-Credentials" | "Access-Control-Allow-Headers" | "Access-Control-Allow-Methods" | "Access-Control-Allow-Origin" | "Access-Control-Expose-Headers" | "Access-Control-Max-Age" | "Age" | "Allow" | "Cache-Control" | "Clear-Site-Data" | "Content-Disposition" | "Content-Encoding" | "Content-Language" | "Content-Length" | "Content-Location" | "Content-Range" | "Content-Security-Policy-Report-Only" | "Content-Security-Policy" | "Cookie" | "Cross-Origin-Embedder-Policy" | "Cross-Origin-Opener-Policy" | "Cross-Origin-Resource-Policy" | "Date" | "ETag" | "Expires" | "Last-Modified" | "Location" | "Permissions-Policy" | "Pragma" | "Retry-After" | "Save-Data" | "Sec-CH-Prefers-Color-Scheme" | "Sec-CH-Prefers-Reduced-Motion" | "Sec-CH-UA-Arch" | "Sec-CH-UA-Bitness" | "Sec-CH-UA-Form-Factor" | "Sec-CH-UA-Full-Version-List" | "Sec-CH-UA-Full-Version" | "Sec-CH-UA-Mobile" | "Sec-CH-UA-Model" | "Sec-CH-UA-Platform-Version" | "Sec-CH-UA-Platform" | "Sec-CH-UA-WoW64" | "Sec-CH-UA" | "Sec-Fetch-Dest" | "Sec-Fetch-Mode" | "Sec-Fetch-Site" | "Sec-Fetch-User" | "Sec-GPC" | "Server-Timing" | "Server" | "Service-Worker-Navigation-Preload" | "Set-Cookie" | "Strict-Transport-Security" | "Timing-Allow-Origin" | "Trailer" | "Transfer-Encoding" | "Upgrade" | "Vary" | "Warning" | "WWW-Authenticate" | "X-Content-Type-Options" | "X-DNS-Prefetch-Control" | "X-Frame-Options" | "X-Permitted-Cross-Domain-Policies" | "X-Powered-By" | "X-Robots-Tag" | "X-XSS-Protection" | AnyString;
13
- type CommonAuthorizationHeaders = `${"Basic" | "Bearer" | "Token"} ${string}`;
14
- type CommonContentTypes = "application/epub+zip" | "application/gzip" | "application/json" | "application/ld+json" | "application/octet-stream" | "application/ogg" | "application/pdf" | "application/rtf" | "application/vnd.ms-fontobject" | "application/wasm" | "application/xhtml+xml" | "application/xml" | "application/zip" | "audio/aac" | "audio/mpeg" | "audio/ogg" | "audio/opus" | "audio/webm" | "audio/x-midi" | "font/otf" | "font/ttf" | "font/woff" | "font/woff2" | "image/avif" | "image/bmp" | "image/gif" | "image/jpeg" | "image/png" | "image/svg+xml" | "image/tiff" | "image/webp" | "image/x-icon" | "model/gltf-binary" | "model/gltf+json" | "text/calendar" | "text/css" | "text/csv" | "text/html" | "text/javascript" | "text/plain" | "video/3gpp" | "video/3gpp2" | "video/av1" | "video/mp2t" | "video/mp4" | "video/mpeg" | "video/ogg" | "video/webm" | "video/x-msvideo" | AnyString;
15
-
16
1
  type ValueOrFunctionResult<TValue> = TValue | (() => TValue);
17
2
  /**
18
3
  * Bearer Or Token authentication
@@ -62,48 +47,34 @@ type CustomAuth = {
62
47
  };
63
48
  type Auth = BearerOrTokenAuth | BasicAuth | CustomAuth;
64
49
 
65
- type RetryCondition<TErrorData> = (context: ErrorContext<TErrorData>) => boolean | Promise<boolean>;
66
- interface RetryOptions<TErrorData> {
67
- /**
68
- * @description Keeps track of the number of times the request has already been retried
69
- * @deprecated This property is used internally to track retries. Please abstain from modifying it.
70
- */
71
- readonly "~retryCount"?: number;
72
- /**
73
- * @description Number of allowed retry attempts on HTTP errors
74
- * @default 0
75
- */
76
- retryAttempts?: number;
77
- /**
78
- * @description Callback whose return value determines if a request should be retried or not
79
- */
80
- retryCondition?: RetryCondition<TErrorData>;
81
- /**
82
- * @description Delay between retries in milliseconds
83
- * @default 1000
84
- */
85
- retryDelay?: number;
86
- /**
87
- * @description Maximum delay in milliseconds. Only applies to exponential strategy
88
- * @default 10000
89
- */
90
- retryMaxDelay?: number;
91
- /**
92
- * HTTP methods that are allowed to retry
93
- * @default ["GET", "POST"]
94
- */
95
- retryMethods?: Array<"GET" | "POST" | AnyString>;
96
- /**
97
- * @description HTTP status codes that trigger a retry
98
- * @default [409, 425, 429, 500, 502, 503, 504]
99
- */
100
- retryStatusCodes?: Array<409 | 425 | 429 | 500 | 502 | 503 | 504 | AnyNumber>;
101
- /**
102
- * @description Strategy to use when retrying
103
- * @default "linear"
104
- */
105
- retryStrategy?: "exponential" | "linear";
106
- }
50
+ type AnyString = string & {
51
+ z_placeholder?: never;
52
+ };
53
+ type AnyNumber = number & {
54
+ z_placeholder?: never;
55
+ };
56
+ type AnyFunction<TResult = any> = (...args: any[]) => TResult;
57
+ type UnmaskType<TValue> = {
58
+ _: TValue;
59
+ }["_"];
60
+ type Awaitable<TValue> = Promise<TValue> | TValue;
61
+ type CommonRequestHeaders = "Access-Control-Allow-Credentials" | "Access-Control-Allow-Headers" | "Access-Control-Allow-Methods" | "Access-Control-Allow-Origin" | "Access-Control-Expose-Headers" | "Access-Control-Max-Age" | "Age" | "Allow" | "Cache-Control" | "Clear-Site-Data" | "Content-Disposition" | "Content-Encoding" | "Content-Language" | "Content-Length" | "Content-Location" | "Content-Range" | "Content-Security-Policy-Report-Only" | "Content-Security-Policy" | "Cookie" | "Cross-Origin-Embedder-Policy" | "Cross-Origin-Opener-Policy" | "Cross-Origin-Resource-Policy" | "Date" | "ETag" | "Expires" | "Last-Modified" | "Location" | "Permissions-Policy" | "Pragma" | "Retry-After" | "Save-Data" | "Sec-CH-Prefers-Color-Scheme" | "Sec-CH-Prefers-Reduced-Motion" | "Sec-CH-UA-Arch" | "Sec-CH-UA-Bitness" | "Sec-CH-UA-Form-Factor" | "Sec-CH-UA-Full-Version-List" | "Sec-CH-UA-Full-Version" | "Sec-CH-UA-Mobile" | "Sec-CH-UA-Model" | "Sec-CH-UA-Platform-Version" | "Sec-CH-UA-Platform" | "Sec-CH-UA-WoW64" | "Sec-CH-UA" | "Sec-Fetch-Dest" | "Sec-Fetch-Mode" | "Sec-Fetch-Site" | "Sec-Fetch-User" | "Sec-GPC" | "Server-Timing" | "Server" | "Service-Worker-Navigation-Preload" | "Set-Cookie" | "Strict-Transport-Security" | "Timing-Allow-Origin" | "Trailer" | "Transfer-Encoding" | "Upgrade" | "Vary" | "Warning" | "WWW-Authenticate" | "X-Content-Type-Options" | "X-DNS-Prefetch-Control" | "X-Frame-Options" | "X-Permitted-Cross-Domain-Policies" | "X-Powered-By" | "X-Robots-Tag" | "X-XSS-Protection" | AnyString;
62
+ type CommonAuthorizationHeaders = `${"Basic" | "Bearer" | "Token"} ${string}`;
63
+ type CommonContentTypes = "application/epub+zip" | "application/gzip" | "application/json" | "application/ld+json" | "application/octet-stream" | "application/ogg" | "application/pdf" | "application/rtf" | "application/vnd.ms-fontobject" | "application/wasm" | "application/xhtml+xml" | "application/xml" | "application/zip" | "audio/aac" | "audio/mpeg" | "audio/ogg" | "audio/opus" | "audio/webm" | "audio/x-midi" | "font/otf" | "font/ttf" | "font/woff" | "font/woff2" | "image/avif" | "image/bmp" | "image/gif" | "image/jpeg" | "image/png" | "image/svg+xml" | "image/tiff" | "image/webp" | "image/x-icon" | "model/gltf-binary" | "model/gltf+json" | "text/calendar" | "text/css" | "text/csv" | "text/html" | "text/javascript" | "text/plain" | "video/3gpp" | "video/3gpp2" | "video/av1" | "video/mp2t" | "video/mp4" | "video/mpeg" | "video/ogg" | "video/webm" | "video/x-msvideo" | AnyString;
64
+
65
+ type ToQueryStringFn = {
66
+ (params: CallApiConfig["query"]): string | null;
67
+ (params: Required<CallApiConfig>["query"]): string;
68
+ };
69
+ declare const toQueryString: ToQueryStringFn;
70
+ declare const getResponseType: <TResponse>(response: Response, parser?: Required<CallApiExtraOptions>["responseParser"]) => {
71
+ arrayBuffer: () => Promise<TResponse>;
72
+ blob: () => Promise<TResponse>;
73
+ formData: () => Promise<TResponse>;
74
+ json: () => Promise<Record<string, unknown> | TResponse>;
75
+ stream: () => ReadableStream<Uint8Array<ArrayBufferLike>> | null;
76
+ text: () => Promise<TResponse>;
77
+ };
107
78
 
108
79
  declare const fetchSpecificKeys: ("headers" | "body" | "cache" | "credentials" | "integrity" | "keepalive" | "method" | "mode" | "priority" | "redirect" | "referrer" | "referrerPolicy" | "signal" | "window")[];
109
80
  declare const defaultRetryMethods: ("GET" | "POST")[];
@@ -112,15 +83,15 @@ declare const defaultRetryStatusCodes: Required<BaseCallApiConfig>["retryStatusC
112
83
  type FetchSpecificKeysUnion = Exclude<(typeof fetchSpecificKeys)[number], "body" | "headers" | "method">;
113
84
  interface CallApiRequestOptions extends Pick<RequestInit, FetchSpecificKeysUnion> {
114
85
  /**
115
- * @description Optional body of the request, can be a object or any other supported body type.
86
+ * Optional body of the request, can be a object or any other supported body type.
116
87
  */
117
88
  body?: Record<string, unknown> | RequestInit["body"];
118
89
  /**
119
- * @description Headers to be used in the request.
90
+ * Headers to be used in the request.
120
91
  */
121
92
  headers?: Record<"Authorization", CommonAuthorizationHeaders> | Record<"Content-Type", CommonContentTypes> | Record<CommonRequestHeaders, string | undefined> | Record<string, string | undefined> | RequestInit["headers"];
122
93
  /**
123
- * @description HTTP method for the request.
94
+ * HTTP method for the request.
124
95
  * @default "GET"
125
96
  */
126
97
  method?: "DELETE" | "GET" | "PATCH" | "POST" | "PUT" | AnyString;
@@ -137,32 +108,32 @@ type WithMoreOptions<TMoreOptions = DefaultMoreOptions> = {
137
108
  };
138
109
  interface Interceptors<TData = DefaultDataType, TErrorData = DefaultDataType, TMoreOptions = DefaultMoreOptions> {
139
110
  /**
140
- * @description Interceptor that will be called when any error occurs within the request/response lifecycle, regardless of whether the error is from the api or not.
111
+ * Interceptor that will be called when any error occurs within the request/response lifecycle, regardless of whether the error is from the api or not.
141
112
  * It is basically a combination of `onRequestError` and `onResponseError` interceptors
142
113
  */
143
114
  onError?: (context: ErrorContext<TErrorData> & WithMoreOptions<TMoreOptions>) => Awaitable<unknown>;
144
115
  /**
145
- * @description Interceptor that will be called just before the request is made, allowing for modifications or additional operations.
116
+ * Interceptor that will be called just before the request is made, allowing for modifications or additional operations.
146
117
  */
147
118
  onRequest?: (context: RequestContext & WithMoreOptions<TMoreOptions>) => Awaitable<unknown>;
148
119
  /**
149
- * @description Interceptor that will be called when an error occurs during the fetch request.
120
+ * Interceptor that will be called when an error occurs during the fetch request.
150
121
  */
151
122
  onRequestError?: (context: RequestErrorContext & WithMoreOptions<TMoreOptions>) => Awaitable<unknown>;
152
123
  /**
153
- * @description Interceptor that will be called when any response is received from the api, whether successful or not
124
+ * Interceptor that will be called when any response is received from the api, whether successful or not
154
125
  */
155
126
  onResponse?: (context: ResponseContext<TData, TErrorData> & WithMoreOptions<TMoreOptions>) => Awaitable<unknown>;
156
127
  /**
157
- * @description Interceptor that will be called when an error response is received from the api.
128
+ * Interceptor that will be called when an error response is received from the api.
158
129
  */
159
130
  onResponseError?: (context: ResponseErrorContext<TErrorData> & WithMoreOptions<TMoreOptions>) => Awaitable<unknown>;
160
131
  /**
161
- * @description Interceptor that will be called when a request is retried.
132
+ * Interceptor that will be called when a request is retried.
162
133
  */
163
134
  onRetry?: (response: ErrorContext<TErrorData> & WithMoreOptions<TMoreOptions>) => Awaitable<unknown>;
164
135
  /**
165
- * @description Interceptor that will be called when a successful response is received from the api.
136
+ * Interceptor that will be called when a successful response is received from the api.
166
137
  */
167
138
  onSuccess?: (context: SuccessContext<TData> & WithMoreOptions<TMoreOptions>) => Awaitable<unknown>;
168
139
  }
@@ -173,36 +144,36 @@ type FetchImpl = UnmaskType<(input: string | Request | URL, init?: RequestInit)
173
144
  type Meta = Register extends {
174
145
  meta?: infer TMeta extends Record<string, unknown>;
175
146
  } ? TMeta : never;
176
- type ExtraOptions<TData = DefaultDataType, TErrorData = DefaultDataType, TResultMode extends ResultModeUnion = ResultModeUnion, TPluginArray extends CallApiPlugin[] = CallApiPlugin[]> = InterceptorsOrInterceptorArray<TData, TErrorData> & Partial<InferPluginOptions<TPluginArray>> & RetryOptions<TErrorData> & {
147
+ type ExtraOptions<TData = DefaultDataType, TErrorData = DefaultDataType, TResultMode extends ResultModeUnion = ResultModeUnion, TPluginArray extends CallApiPlugin[] = CallApiPlugin[]> = {
177
148
  /**
178
- * @description Authorization header value.
149
+ * Authorization header value.
179
150
  */
180
151
  auth?: string | Auth | null;
181
152
  /**
182
- * @description Base URL to be prepended to all request URLs
153
+ * Base URL to be prepended to all request URLs
183
154
  */
184
155
  baseURL?: string;
185
156
  /**
186
- * @description Custom function to serialize the body object into a string.
157
+ * Custom function to serialize the body object into a string.
187
158
  */
188
159
  bodySerializer?: (bodyData: Record<string, unknown>) => string;
189
160
  /**
190
- * @description Whether or not to clone the response, so response.json() and the like, can be read again else where.
161
+ * Whether or not to clone the response, so response.json() and the like, can be read again else where.
191
162
  * @see https://developer.mozilla.org/en-US/docs/Web/API/Response/clone
192
163
  * @default false
193
164
  */
194
165
  cloneResponse?: boolean;
195
166
  /**
196
- * @description Custom fetch implementation
167
+ * Custom fetch implementation
197
168
  */
198
169
  customFetchImpl?: FetchImpl;
199
170
  /**
200
- * @description Custom request key to be used to identify a request in the fetch deduplication strategy.
171
+ * Custom request key to be used to identify a request in the fetch deduplication strategy.
201
172
  * @default the full request url + string formed from the request options
202
173
  */
203
174
  dedupeKey?: string;
204
175
  /**
205
- * @description Defines the deduplication strategy for the request, can be set to "none" | "defer" | "cancel".
176
+ * Defines the deduplication strategy for the request, can be set to "none" | "defer" | "cancel".
206
177
  * - If set to "cancel", the previous pending request with the same request key will be cancelled and lets the new request through.
207
178
  * - If set to "defer", all new request with the same request key will be share the same response, until the previous one is completed.
208
179
  * - If set to "none", deduplication is disabled.
@@ -210,32 +181,32 @@ type ExtraOptions<TData = DefaultDataType, TErrorData = DefaultDataType, TResult
210
181
  */
211
182
  dedupeStrategy?: "cancel" | "defer" | "none";
212
183
  /**
213
- * @description Default error message to use if none is provided from a response.
184
+ * Default error message to use if none is provided from a response.
214
185
  * @default "Failed to fetch data from server!"
215
186
  */
216
187
  defaultErrorMessage?: string;
217
188
  /**
218
- * @description Resolved request URL
189
+ * Resolved request URL
219
190
  */
220
191
  readonly fullURL?: string;
221
192
  /**
222
- * @description URL to be used in the request.
193
+ * URL to be used in the request.
223
194
  */
224
195
  readonly initURL?: string;
225
196
  /**
226
- * @description Defines the mode in which the merged hooks are executed, can be set to "parallel" | "sequential".
197
+ * Defines the mode in which the merged hooks are executed, can be set to "parallel" | "sequential".
227
198
  * - If set to "parallel", main and plugin hooks will be executed in parallel.
228
199
  * - If set to "sequential", the plugin hooks will be executed first, followed by the main hook.
229
200
  * @default "parallel"
230
201
  */
231
202
  mergedHooksExecutionMode?: "parallel" | "sequential";
232
203
  /**
233
- * @description - Controls what order in which the merged hooks execute
204
+ * - Controls what order in which the merged hooks execute
234
205
  * @default "mainHooksLast"
235
206
  */
236
207
  mergedHooksExecutionOrder?: "mainHooksAfterPlugins" | "mainHooksBeforePlugins";
237
208
  /**
238
- * @description - An optional field you can fill with additional information,
209
+ * - An optional field you can fill with additional information,
239
210
  * to associate with the request, typically used for logging or tracing.
240
211
  *
241
212
  * - A good use case for this, would be to use the info to handle specific cases in any of the shared interceptors.
@@ -259,37 +230,37 @@ type ExtraOptions<TData = DefaultDataType, TErrorData = DefaultDataType, TResult
259
230
  */
260
231
  meta?: Meta;
261
232
  /**
262
- * @description Params to be appended to the URL (i.e: /:id)
233
+ * Params to be appended to the URL (i.e: /:id)
263
234
  */
264
235
  params?: Record<string, boolean | number | string> | Array<boolean | number | string>;
265
236
  /**
266
- * @description An array of CallApi plugins. It allows you to extend the behavior of the library.
237
+ * An array of CallApi plugins. It allows you to extend the behavior of the library.
267
238
  */
268
239
  plugins?: TPluginArray | ((context: PluginInitContext) => TPluginArray);
269
240
  /**
270
- * @description Query parameters to append to the URL.
241
+ * Query parameters to append to the URL.
271
242
  */
272
243
  query?: Record<string, boolean | number | string>;
273
244
  /**
274
- * @description Custom function to validate the response error data, stemming from the api.
245
+ * Custom function to validate the response error data, stemming from the api.
275
246
  * 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.
276
247
  */
277
248
  responseErrorValidator?: (data: unknown) => TErrorData;
278
249
  /**
279
- * @description Custom function to parse the response string into a object.
250
+ * Custom function to parse the response string into a object.
280
251
  */
281
252
  responseParser?: (responseString: string) => Awaitable<Record<string, unknown>>;
282
253
  /**
283
- * @description Expected response type, affects how response is parsed
254
+ * Expected response type, affects how response is parsed
284
255
  * @default "json"
285
256
  */
286
257
  responseType?: keyof ReturnType<typeof getResponseType>;
287
258
  /**
288
- * @description Custom function to validate the response data.
259
+ * Custom function to validate the response data.
289
260
  */
290
261
  responseValidator?: (data: unknown) => TData;
291
262
  /**
292
- * @description Mode of the result, can influence how results are handled or returned.
263
+ * Mode of the result, can influence how results are handled or returned.
293
264
  * Can be set to "all" | "onlySuccess" | "onlyError" | "onlyResponse".
294
265
  * @default "all"
295
266
  */
@@ -301,22 +272,22 @@ type ExtraOptions<TData = DefaultDataType, TErrorData = DefaultDataType, TResult
301
272
  */
302
273
  throwOnError?: boolean | ((context: ErrorContext<TErrorData>) => boolean);
303
274
  /**
304
- * @description Request timeout in milliseconds
275
+ * Request timeout in milliseconds
305
276
  */
306
277
  timeout?: number;
307
- };
278
+ } & InterceptorsOrInterceptorArray<TData, TErrorData> & Partial<InferPluginOptions<TPluginArray>> & RetryOptions<TErrorData>;
308
279
  declare const optionsEnumToExtendFromBase: "plugins"[];
309
280
  type CallApiExtraOptions<TData = DefaultDataType, TErrorData = DefaultDataType, TResultMode extends ResultModeUnion = ResultModeUnion, TPluginArray extends CallApiPlugin[] = CallApiPlugin[]> = ExtraOptions<TData, TErrorData, TResultMode, TPluginArray> & {
310
281
  /**
311
- * @description Options that should extend the base options.
282
+ * Options that should extend the base options.
312
283
  */
313
284
  extend?: Pick<ExtraOptions<TData, TErrorData, TResultMode, TPluginArray>, (typeof optionsEnumToExtendFromBase)[number]>;
314
285
  };
315
286
  declare const optionsEnumToOmitFromBase: ("dedupeKey" | "extend")[];
316
287
  type BaseCallApiExtraOptions<TBaseData = DefaultDataType, TBaseErrorData = DefaultDataType, TBaseResultMode extends ResultModeUnion = ResultModeUnion, TBasePluginArray extends CallApiPlugin[] = CallApiPlugin[]> = Omit<CallApiExtraOptions<TBaseData, TBaseErrorData, TBaseResultMode, TBasePluginArray>, (typeof optionsEnumToOmitFromBase)[number]>;
317
288
  type CombinedCallApiExtraOptions<TData = DefaultDataType, TErrorData = DefaultDataType, TResultMode extends ResultModeUnion = ResultModeUnion, TPluginArray extends CallApiPlugin[] = CallApiPlugin[]> = BaseCallApiExtraOptions<TData, TErrorData, TResultMode, TPluginArray> & CallApiExtraOptions<TData, TErrorData, TResultMode, TPluginArray>;
318
- type CallApiConfig<TData = DefaultDataType, TErrorData = DefaultDataType, TResultMode extends ResultModeUnion = ResultModeUnion, TPluginArray extends CallApiPlugin[] = CallApiPlugin[]> = CallApiExtraOptions<TData, TErrorData, TResultMode, TPluginArray> & CallApiRequestOptions;
319
- type BaseCallApiConfig<TBaseData = DefaultDataType, TBaseErrorData = DefaultDataType, TBaseResultMode extends ResultModeUnion = ResultModeUnion, TBasePluginArray extends CallApiPlugin[] = CallApiPlugin[]> = BaseCallApiExtraOptions<TBaseData, TBaseErrorData, TBaseResultMode, TBasePluginArray> & CallApiRequestOptions;
289
+ type CallApiConfig<TData = DefaultDataType, TErrorData = DefaultDataType, TResultMode extends ResultModeUnion = ResultModeUnion, TPluginArray extends CallApiPlugin[] = CallApiPlugin[]> = CallApiRequestOptions & CallApiExtraOptions<TData, TErrorData, TResultMode, TPluginArray>;
290
+ type BaseCallApiConfig<TBaseData = DefaultDataType, TBaseErrorData = DefaultDataType, TBaseResultMode extends ResultModeUnion = ResultModeUnion, TBasePluginArray extends CallApiPlugin[] = CallApiPlugin[]> = CallApiRequestOptions & BaseCallApiExtraOptions<TBaseData, TBaseErrorData, TBaseResultMode, TBasePluginArray>;
320
291
  type CallApiParameters<TData = DefaultDataType, TErrorData = DefaultDataType, TResultMode extends ResultModeUnion = ResultModeUnion, TPluginArray extends CallApiPlugin[] = CallApiPlugin[]> = [initURL: string, config?: CallApiConfig<TData, TErrorData, TResultMode, TPluginArray>];
321
292
  type RequestContext = UnmaskType<{
322
293
  options: CombinedCallApiExtraOptions;
@@ -400,23 +371,52 @@ type ResultModeUnion = {
400
371
  }[keyof ResultModeMap] | undefined;
401
372
  type GetCallApiResult<TData, TErrorData, TResultMode> = TErrorData extends false ? ResultModeMap<TData, TErrorData>["onlySuccessWithException"] : undefined extends TResultMode ? ResultModeMap<TData, TErrorData>["all"] : TResultMode extends NonNullable<ResultModeUnion> ? ResultModeMap<TData, TErrorData>[TResultMode] : never;
402
373
 
403
- type ToQueryStringFn = {
404
- (params: CallApiConfig["query"]): string | null;
405
- (params: Required<CallApiConfig>["query"]): string;
406
- };
407
- declare const toQueryString: ToQueryStringFn;
408
- declare const getResponseType: <TResponse>(response: Response, parser?: Required<CallApiExtraOptions>["responseParser"]) => {
409
- arrayBuffer: () => Promise<TResponse>;
410
- blob: () => Promise<TResponse>;
411
- formData: () => Promise<TResponse>;
412
- json: () => Promise<Record<string, unknown> | TResponse>;
413
- stream: () => ReadableStream<Uint8Array<ArrayBufferLike>> | null;
414
- text: () => Promise<TResponse>;
415
- };
374
+ type RetryCondition<TErrorData> = (context: ErrorContext<TErrorData>) => boolean | Promise<boolean>;
375
+ interface RetryOptions<TErrorData> {
376
+ /**
377
+ * Keeps track of the number of times the request has already been retried
378
+ * @deprecated This property is used internally to track retries. Please abstain from modifying it.
379
+ */
380
+ readonly "~retryCount"?: number;
381
+ /**
382
+ * Number of allowed retry attempts on HTTP errors
383
+ * @default 0
384
+ */
385
+ retryAttempts?: number;
386
+ /**
387
+ * Callback whose return value determines if a request should be retried or not
388
+ */
389
+ retryCondition?: RetryCondition<TErrorData>;
390
+ /**
391
+ * Delay between retries in milliseconds
392
+ * @default 1000
393
+ */
394
+ retryDelay?: number;
395
+ /**
396
+ * Maximum delay in milliseconds. Only applies to exponential strategy
397
+ * @default 10000
398
+ */
399
+ retryMaxDelay?: number;
400
+ /**
401
+ * HTTP methods that are allowed to retry
402
+ * @default ["GET", "POST"]
403
+ */
404
+ retryMethods?: Array<"GET" | "POST" | AnyString>;
405
+ /**
406
+ * HTTP status codes that trigger a retry
407
+ * @default [409, 425, 429, 500, 502, 503, 504]
408
+ */
409
+ retryStatusCodes?: Array<409 | 425 | 429 | 500 | 502 | 503 | 504 | AnyNumber>;
410
+ /**
411
+ * Strategy to use when retrying
412
+ * @default "linear"
413
+ */
414
+ retryStrategy?: "exponential" | "linear";
415
+ }
416
416
 
417
417
  type UnionToIntersection<TUnion> = (TUnion extends unknown ? (param: TUnion) => void : never) extends (param: infer TParam) => void ? TParam : never;
418
418
  type InferPluginOptions<TPluginArray extends CallApiPlugin[]> = TPluginArray extends Array<infer TPlugin extends CallApiPlugin> ? TPlugin["createExtraOptions"] extends (...params: never[]) => infer TResult ? UnionToIntersection<TResult> : NonNullable<unknown> : NonNullable<unknown>;
419
- type PluginInitContext = {
419
+ type PluginInitContext<TMoreOptions = DefaultMoreOptions> = WithMoreOptions<TMoreOptions> & {
420
420
  initURL: string;
421
421
  options: CombinedCallApiExtraOptions;
422
422
  request: CallApiRequestOptionsForHooks;
@@ -426,11 +426,11 @@ type PluginInitResult = Partial<Omit<PluginInitContext, "request"> & {
426
426
  }>;
427
427
  type CallApiPlugin = {
428
428
  /**
429
- * @description Defines additional options that can be passed to callApi
429
+ * Defines additional options that can be passed to callApi
430
430
  */
431
431
  createExtraOptions?: (...params: never[]) => unknown;
432
432
  /**
433
- * @description A description for the plugin
433
+ * A description for the plugin
434
434
  */
435
435
  description?: string;
436
436
  /**
@@ -438,21 +438,19 @@ type CallApiPlugin = {
438
438
  */
439
439
  hooks?: InterceptorsOrInterceptorArray;
440
440
  /**
441
- * @description A unique id for the plugin
441
+ * A unique id for the plugin
442
442
  */
443
443
  id: string;
444
444
  /**
445
- * @description A function that will be called when the plugin is
446
- * initialized. This will be called before the any
447
- * of the other internal functions.
445
+ * A function that will be called when the plugin is initialized. This will be called before the any of the other internal functions.
448
446
  */
449
447
  init?: (context: PluginInitContext) => Awaitable<PluginInitResult> | Awaitable<void>;
450
448
  /**
451
- * @description A name for the plugin
449
+ * A name for the plugin
452
450
  */
453
451
  name: string;
454
452
  /**
455
- * @description A version for the plugin
453
+ * A version for the plugin
456
454
  */
457
455
  version?: string;
458
456
  };
@@ -1,5 +1,5 @@
1
- import { f as PossibleHTTPError, e as PossibleJavaScriptError } from '../plugins-Ds-irdHk.cjs';
2
- export { u as defaultRetryMethods, v as defaultRetryStatusCodes, t as toQueryString } from '../plugins-Ds-irdHk.cjs';
1
+ import { f as PossibleHTTPError, e as PossibleJavaScriptError } from '../plugins-jILLQxo1.cjs';
2
+ export { u as defaultRetryMethods, v as defaultRetryStatusCodes, t as toQueryString } from '../plugins-jILLQxo1.cjs';
3
3
  import { H as HTTPError } from '../error-lBRMiMeF.cjs';
4
4
 
5
5
  type ErrorObjectUnion<TErrorData = unknown> = PossibleHTTPError<TErrorData> | PossibleJavaScriptError;
@@ -1 +1 @@
1
- var e=e=>{const{cloneResponse:r,defaultErrorMessage:t,error:n,message:a,resultMode:i}=e;let l={data:null,error:{errorData:n,message:a??n.message,name:n.name},response:null};if(o(n)){const{errorData:e,message:o=t,name:s,response:a}=n;l={data:null,error:{errorData:e,message:o,name:s},response:r?a.clone():a}}const c={all:l,onlyError:l.error,onlyResponse:l.response,onlySuccess:l.data,onlySuccessWithException:l.data};return{errorVariantDetails:l,getErrorResult:e=>{const r=c[i??"all"];return s(e)?{...r,...e}:r}}},r=class extends Error{errorData;isHTTPError=!0;name="HTTPError";response;constructor(e,r){const{defaultErrorMessage:t,errorData:o,response:n}=e;super(o?.message??t,r),this.errorData=o,this.response=n,Error.captureStackTrace(this,this.constructor)}},t=e=>a(e)&&"HTTPError"===e.name,o=e=>e instanceof r||a(e)&&"HTTPError"===e.name&&!0===e.isHTTPError,n=e=>Array.isArray(e),s=e=>"object"==typeof e&&null!==e,a=e=>{if(!s(e))return!1;const r=Object.getPrototypeOf(e);return(null==r||r===Object.prototype||null===Object.getPrototypeOf(r))&&!(Symbol.toStringTag in e)},i=e=>"function"==typeof e,l=e=>"string"==typeof e,c=e=>i(e)?e():e,u=e=>{if(void 0!==e){if(l(e)||null===e)return{Authorization:`Bearer ${e}`};switch(e.type){case"Basic":{const r=c(e.username),t=c(e.password);if(void 0===r||void 0===t)return;return{Authorization:`Basic ${globalThis.btoa(`${r}:${t}`)}`}}case"Custom":{const r=c(e.value);if(void 0===r)return;return{Authorization:`${c(e.prefix)} ${r}`}}default:{const r=c(e.bearer),t=c(e.token);return"token"in e&&void 0!==t?{Authorization:`Token ${t}`}:void 0!==r&&{Authorization:`Bearer ${r}`}}}}},p=["extend","dedupeKey"],f=["body","integrity","method","headers","signal","cache","redirect","window","credentials","keepalive","referrer","priority","mode","referrerPolicy"],d={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"},y=["GET","POST"],m=Object.keys(d).map(Number),h=(e,r)=>{const t={},o=new Set(r);for(const[r,n]of Object.entries(e))o.has(r)||(t[r]=n);return t},b=(e,r)=>{const t={},o=new Set(r);for(const[r,n]of Object.entries(e))o.has(r)&&(t[r]=n);return t},T=e=>[b(e,f),h(e,[...f,...p])],g=e=>[b(e,f),h(e,f)],w=e=>!e||a(e)?e:Object.fromEntries(e),E=e=>e?new URLSearchParams(e).toString():(console.error("toQueryString:","No query params provided!"),null),v=e=>{const{auth:r,baseHeaders:t,body:o,headers:n}=e;if(!Boolean(t||n||o||r))return;const s={...u(r),...w(t),...w(n)};return l(i=o)&&i.includes("=")?(s["Content-Type"]="application/x-www-form-urlencoded",s):((a(o)||l(o)&&o.startsWith("{"))&&(s["Content-Type"]="application/json",s.Accept="application/json"),s);var i},S=(e,r)=>n(e)?[e,r].flat():r??e,j=e=>{if(e)return e;if("undefined"!=typeof globalThis&&i(globalThis.fetch))return globalThis.fetch;throw new Error("No fetch implementation found")},O=(...e)=>Promise.all(e),P=async(e,r,t,o)=>{const n=((e,r)=>({arrayBuffer:()=>e.arrayBuffer(),blob:()=>e.blob(),formData:()=>e.formData(),json:async()=>{if(r){const t=await e.text();return r(t)}return e.json()},stream:()=>e.body,text:()=>e.text()}))(e,t);if(!Object.hasOwn(n,r))throw new Error(`Invalid response type: ${r}`);const s=await n[r]();return o?o(s):s},x=e=>{const{data:r,response:t,resultMode:o}=e,n={data:r,error:null,response:t};if(!o)return n;return{all:n,onlyError:n.error,onlyResponse:n.response,onlySuccess:n.data,onlySuccessWithException:n.data}[o]},D=e=>{if(0===e)return;const{promise:r,resolve:t}=(()=>{let e,r;return{promise:new Promise(((t,o)=>{r=t,e=o})),reject:e,resolve:r}})();return setTimeout(t,e),r};export{r as HTTPError,S as combineHooks,y as defaultRetryMethods,m as defaultRetryStatusCodes,O as executeHooks,j as getFetchImpl,P as getResponseData,n as isArray,i as isFunction,t as isHTTPError,o as isHTTPErrorInstance,a as isPlainObject,l as isString,v as mergeAndResolveHeaders,e as resolveErrorResult,x as resolveSuccessResult,T as splitBaseConfig,g as splitConfig,E as toQueryString,D as waitUntil};//# sourceMappingURL=chunk-G7B7UXHI.js.map
1
+ var e=e=>{const{cloneResponse:r,defaultErrorMessage:t,error:n,message:a,resultMode:i}=e;let l={data:null,error:{errorData:n,message:a??n.message,name:n.name},response:null};if(o(n)){const{errorData:e,message:o=t,name:s,response:a}=n;l={data:null,error:{errorData:e,message:o,name:s},response:r?a.clone():a}}const c={all:l,onlyError:l.error,onlyResponse:l.response,onlySuccess:l.data,onlySuccessWithException:l.data};return{errorVariantDetails:l,getErrorResult:e=>{const r=c[i??"all"];return s(e)?{...r,...e}:r}}},r=class extends Error{errorData;isHTTPError=!0;name="HTTPError";response;constructor(e,r){const{defaultErrorMessage:t,errorData:o,response:n}=e;super(o?.message??t,r),this.errorData=o,this.response=n,Error.captureStackTrace(this,this.constructor)}},t=e=>a(e)&&"HTTPError"===e.name,o=e=>e instanceof r||a(e)&&"HTTPError"===e.name&&!0===e.isHTTPError,n=e=>Array.isArray(e),s=e=>"object"==typeof e&&null!==e,a=e=>{if(!s(e))return!1;const r=Object.getPrototypeOf(e);return(null==r||r===Object.prototype||null===Object.getPrototypeOf(r))&&!(Symbol.toStringTag in e)},i=e=>"function"==typeof e,l=e=>"string"==typeof e,c=e=>i(e)?e():e,u=e=>{if(void 0!==e){if(l(e)||null===e)return{Authorization:`Bearer ${e}`};switch(e.type){case"Basic":{const r=c(e.username),t=c(e.password);if(void 0===r||void 0===t)return;return{Authorization:`Basic ${globalThis.btoa(`${r}:${t}`)}`}}case"Custom":{const r=c(e.value);if(void 0===r)return;return{Authorization:`${c(e.prefix)} ${r}`}}default:{const r=c(e.bearer),t=c(e.token);return"token"in e&&void 0!==t?{Authorization:`Token ${t}`}:void 0!==r&&{Authorization:`Bearer ${r}`}}}}},p=["extend","dedupeKey"],f=["body","integrity","method","headers","signal","cache","redirect","window","credentials","keepalive","referrer","priority","mode","referrerPolicy"],d={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"},y=["GET","POST"],m=Object.keys(d).map(Number),h=(e,r)=>{const t={},o=new Set(r);for(const[r,n]of Object.entries(e))o.has(r)||(t[r]=n);return t},b=(e,r)=>{const t={},o=new Set(r);for(const[r,n]of Object.entries(e))o.has(r)&&(t[r]=n);return t},T=e=>[b(e,f),h(e,[...f,...p])],g=e=>[b(e,f),h(e,f)],w=e=>!e||a(e)?e:Object.fromEntries(e),E=e=>e?new URLSearchParams(e).toString():(console.error("toQueryString:","No query params provided!"),null),v=e=>{const{auth:r,baseHeaders:t,body:o,headers:n}=e;if(!Boolean(t||n||o||r))return;const s={...u(r),...w(t),...w(n)};return l(i=o)&&i.includes("=")?(s["Content-Type"]="application/x-www-form-urlencoded",s):((a(o)||l(o)&&o.startsWith("{"))&&(s["Content-Type"]="application/json",s.Accept="application/json"),s);var i},S=(e,r)=>n(e)?[e,r].flat():r??e,j=e=>{if(e)return e;if("undefined"!=typeof globalThis&&i(globalThis.fetch))return globalThis.fetch;throw new Error("No fetch implementation found")},O=(...e)=>Promise.all(e),P=async(e,r,t,o)=>{const n=((e,r)=>({arrayBuffer:()=>e.arrayBuffer(),blob:()=>e.blob(),formData:()=>e.formData(),json:async()=>{if(r){const t=await e.text();return r(t)}return e.json()},stream:()=>e.body,text:()=>e.text()}))(e,t);if(!Object.hasOwn(n,r))throw new Error(`Invalid response type: ${r}`);const s=await n[r]();return o?o(s):s},x=e=>{const{data:r,response:t,resultMode:o}=e,n={data:r,error:null,response:t};if(!o)return n;return{all:n,onlyError:n.error,onlyResponse:n.response,onlySuccess:n.data,onlySuccessWithException:n.data}[o]},D=e=>{if(0===e)return;const{promise:r,resolve:t}=(()=>{let e,r;return{promise:new Promise(((t,o)=>{r=t,e=o})),reject:e,resolve:r}})();return setTimeout(t,e),r};export{r as HTTPError,S as combineHooks,y as defaultRetryMethods,m as defaultRetryStatusCodes,O as executeHooks,j as getFetchImpl,P as getResponseData,n as isArray,i as isFunction,t as isHTTPError,o as isHTTPErrorInstance,a as isPlainObject,l as isString,v as mergeAndResolveHeaders,e as resolveErrorResult,x as resolveSuccessResult,T as splitBaseConfig,g as splitConfig,E as toQueryString,D as waitUntil};//# sourceMappingURL=chunk-36I75IJA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/error.ts","../../src/utils/type-guards.ts","../../src/auth.ts","../../src/utils/type-helpers.ts","../../src/types.ts","../../src/utils/constants.ts","../../src/utils/common.ts"],"names":[],"mappings":"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","file":"chunk-36I75IJA.js","sourcesContent":["import type {\n\tCallApiExtraOptions,\n\tCallApiResultErrorVariant,\n\tPossibleJavascriptErrorNames,\n\tResultModeMap,\n} from \"./types\";\nimport { isHTTPErrorInstance, isObject } from \"./utils/type-guards\";\n\ntype ErrorInfo = {\n\tcloneResponse: CallApiExtraOptions[\"cloneResponse\"];\n\tdefaultErrorMessage: Required<CallApiExtraOptions>[\"defaultErrorMessage\"];\n\terror?: unknown;\n\tmessage?: string;\n\tresultMode: CallApiExtraOptions[\"resultMode\"];\n};\n\nexport const resolveErrorResult = <TCallApiResult = never>(info: ErrorInfo) => {\n\tconst { cloneResponse, defaultErrorMessage, error, message: customErrorMessage, resultMode } = info;\n\n\tlet errorVariantDetails: 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\terrorVariantDetails = {\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: cloneResponse ? response.clone() : response,\n\t\t};\n\t}\n\n\tconst resultModeMap: ResultModeMap = {\n\t\tall: errorVariantDetails,\n\t\tonlyError: errorVariantDetails.error,\n\t\tonlyResponse: errorVariantDetails.response,\n\t\tonlySuccess: errorVariantDetails.data,\n\t\tonlySuccessWithException: errorVariantDetails.data,\n\t};\n\n\tconst getErrorResult = (customInfo?: Pick<ErrorInfo, \"message\">) => {\n\t\tconst errorResult = resultModeMap[resultMode ?? \"all\"] as TCallApiResult;\n\n\t\treturn isObject(customInfo) ? { ...errorResult, ...customInfo } : errorResult;\n\t};\n\n\treturn { errorVariantDetails, getErrorResult };\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","import { HTTPError } from \"@/error\";\nimport type { PossibleHTTPError, PossibleJavaScriptError } from \"@/types\";\nimport type { AnyFunction } from \"./type-helpers\";\n\ntype ErrorObjectUnion<TErrorData = unknown> = PossibleHTTPError<TErrorData> | PossibleJavaScriptError;\n\nexport const isHTTPError = <TErrorData>(\n\terror: ErrorObjectUnion<TErrorData> | null\n): error is PossibleHTTPError<TErrorData> => {\n\treturn isPlainObject(error) && error.name === \"HTTPError\";\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\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","/* 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?: \"Bearer\";\n\t\t\tbearer?: ValueOrFunctionResult<string | null>;\n\t\t\ttoken?: never;\n\t }\n\t| {\n\t\t\ttype?: \"Token\";\n\t\t\tbearer?: never;\n\t\t\ttoken?: ValueOrFunctionResult<string | null>;\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 & { z_placeholder?: never };\nexport type AnyNumber = number & { z_placeholder?: never };\n\n// eslint-disable-next-line ts-eslint/no-explicit-any -- Any is fine here\nexport type AnyObject = Record<string, any>;\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\t| AnyString;\n\nexport type CommonAuthorizationHeaders = `${\"Basic\" | \"Bearer\" | \"Token\"} ${string}`;\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\t| AnyString;\n","/* eslint-disable ts-eslint/consistent-type-definitions -- I need to use interfaces for the sake of user overrides */\n\nimport type { Auth } from \"./auth\";\nimport type { CallApiPlugin, InferPluginOptions, PluginInitContext } from \"./plugins\";\nimport type { RetryOptions } from \"./retry\";\nimport type { getResponseType } from \"./utils/common\";\nimport type { fetchSpecificKeys } from \"./utils/constants\";\nimport {\n\ttype AnyString,\n\ttype Awaitable,\n\ttype CommonAuthorizationHeaders,\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 * 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 * Headers to be used in the request.\n\t */\n\theaders?:\n\t\t| Record<\"Authorization\", CommonAuthorizationHeaders>\n\t\t| Record<\"Content-Type\", CommonContentTypes>\n\t\t| Record<CommonRequestHeaders, string | undefined>\n\t\t| Record<string, string | undefined>\n\t\t| RequestInit[\"headers\"];\n\n\t/**\n\t * 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 Omit<CallApiRequestOptions, \"headers\"> {\n\theaders?: Record<string, string | undefined>;\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: Meta\n}\nexport type DefaultDataType = unknown;\nexport type DefaultMoreOptions = NonNullable<unknown>;\n\nexport type WithMoreOptions<TMoreOptions = DefaultMoreOptions> = {\n\toptions: CombinedCallApiExtraOptions & Partial<TMoreOptions>;\n};\n\nexport interface Interceptors<\n\tTData = DefaultDataType,\n\tTErrorData = DefaultDataType,\n\tTMoreOptions = DefaultMoreOptions,\n> {\n\t/**\n\t * Interceptor that will be called when any error occurs within the request/response lifecycle, regardless of whether the error is from the api or not.\n\t * It is basically a combination of `onRequestError` and `onResponseError` interceptors\n\t */\n\tonError?: (context: ErrorContext<TErrorData> & WithMoreOptions<TMoreOptions>) => Awaitable<unknown>;\n\n\t/**\n\t * Interceptor that will be called just before the request is made, allowing for modifications or additional operations.\n\t */\n\tonRequest?: (context: RequestContext & WithMoreOptions<TMoreOptions>) => Awaitable<unknown>;\n\n\t/**\n\t * Interceptor that will be called when an error occurs during the fetch request.\n\t */\n\tonRequestError?: (context: RequestErrorContext & WithMoreOptions<TMoreOptions>) => Awaitable<unknown>;\n\n\t/**\n\t * Interceptor that will be called when any response is received from the api, whether successful or not\n\t */\n\tonResponse?: (\n\t\tcontext: ResponseContext<TData, TErrorData> & WithMoreOptions<TMoreOptions>\n\t) => Awaitable<unknown>;\n\n\t/**\n\t * Interceptor that will be called when an error response is received from the api.\n\t */\n\tonResponseError?: (\n\t\tcontext: ResponseErrorContext<TErrorData> & WithMoreOptions<TMoreOptions>\n\t) => Awaitable<unknown>;\n\n\t/**\n\t * Interceptor that will be called when a request is retried.\n\t */\n\tonRetry?: (response: ErrorContext<TErrorData> & WithMoreOptions<TMoreOptions>) => Awaitable<unknown>;\n\t/**\n\t * Interceptor that will be called when a successful response is received from the api.\n\t */\n\tonSuccess?: (context: SuccessContext<TData> & WithMoreOptions<TMoreOptions>) => Awaitable<unknown>;\n}\n\n/* eslint-disable perfectionist/sort-union-types -- I need arrays to be last */\nexport type InterceptorsOrInterceptorArray<\n\tTData = DefaultDataType,\n\tTErrorData = DefaultDataType,\n\tTMoreOptions = DefaultMoreOptions,\n> = {\n\t[Key in keyof Interceptors<TData, TErrorData, TMoreOptions>]:\n\t\t| Interceptors<TData, TErrorData, TMoreOptions>[Key]\n\t\t| Array<Interceptors<TData, TErrorData, TMoreOptions>[Key]>;\n};\n/* eslint-enable perfectionist/sort-union-types -- I need arrays to be last */\n\ntype FetchImpl = UnmaskType<(input: string | Request | URL, init?: RequestInit) => Promise<Response>>;\n\nexport type Meta = Register extends { meta?: infer TMeta extends Record<string, unknown> } ? TMeta : never;\n\n// Helper type to extract plugin options\n\n// Helper type to merge all plugin options into a single type\n\nexport type ExtraOptions<\n\tTData = DefaultDataType,\n\tTErrorData = DefaultDataType,\n\tTResultMode extends ResultModeUnion = ResultModeUnion,\n\tTPluginArray extends CallApiPlugin[] = CallApiPlugin[],\n> = {\n\t/**\n\t * Authorization header value.\n\t */\n\tauth?: string | Auth | null;\n\n\t/**\n\t * Base URL to be prepended to all request URLs\n\t */\n\tbaseURL?: string;\n\n\t/**\n\t * Custom function to serialize the body object into a string.\n\t */\n\tbodySerializer?: (bodyData: Record<string, unknown>) => string;\n\n\t/**\n\t * 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 * Custom fetch implementation\n\t */\n\tcustomFetchImpl?: FetchImpl;\n\n\t/**\n\t * 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 * Defines the deduplication strategy for the request, can be set to \"none\" | \"defer\" | \"cancel\".\n\t * - If set to \"cancel\", the previous pending request with the same request key will be cancelled and lets the new request through.\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 * - If set to \"none\", deduplication is disabled.\n\t * @default \"cancel\"\n\t */\n\tdedupeStrategy?: \"cancel\" | \"defer\" | \"none\";\n\n\t/**\n\t * 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 * Resolved request URL\n\t */\n\treadonly fullURL?: string;\n\n\t/**\n\t * URL to be used in the request.\n\t */\n\treadonly initURL?: string;\n\n\t/**\n\t * Defines the mode in which the merged hooks are executed, can be set to \"parallel\" | \"sequential\".\n\t * - If set to \"parallel\", main and plugin hooks will be executed in parallel.\n\t * - If set to \"sequential\", the plugin hooks will be executed first, followed by the main hook.\n\t * @default \"parallel\"\n\t */\n\tmergedHooksExecutionMode?: \"parallel\" | \"sequential\";\n\n\t/**\n\t * - Controls what order in which the merged hooks execute\n\t * @default \"mainHooksLast\"\n\t */\n\tmergedHooksExecutionOrder?: \"mainHooksAfterPlugins\" | \"mainHooksBeforePlugins\";\n\n\t/**\n\t * - 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?: Meta;\n\n\t/**\n\t * 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 * An array of CallApi plugins. It allows you to extend the behavior of the library.\n\t */\n\tplugins?: TPluginArray | ((context: PluginInitContext) => TPluginArray);\n\n\t/**\n\t * Query parameters to append to the URL.\n\t */\n\tquery?: Record<string, boolean | number | string>;\n\n\t/**\n\t * Custom function to validate the response error data, stemming from the api.\n\t * This only runs if the api actually sends back error status codes, else it will be ignored, in which case you should only use the `responseValidator` option.\n\t */\n\tresponseErrorValidator?: (data: unknown) => TErrorData;\n\n\t/**\n\t * 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 * 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 * Custom function to validate the response data.\n\t */\n\tresponseValidator?: (data: unknown) => TData;\n\n\t/**\n\t * 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?: TErrorData extends false ? \"onlySuccessWithException\" : TResultMode | undefined;\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 * Request timeout in milliseconds\n\t */\n\ttimeout?: number;\n\t/* eslint-disable perfectionist/sort-intersection-types -- Allow these to be last for the sake of docs */\n} & InterceptorsOrInterceptorArray<TData, TErrorData> &\n\tPartial<InferPluginOptions<TPluginArray>> &\n\tRetryOptions<TErrorData>;\n/* eslint-enable perfectionist/sort-intersection-types -- Allow these to be last for the sake of docs */\n\nexport const optionsEnumToExtendFromBase = defineEnum([\"plugins\"] satisfies Array<keyof ExtraOptions>);\n\nexport type CallApiExtraOptions<\n\tTData = DefaultDataType,\n\tTErrorData = DefaultDataType,\n\tTResultMode extends ResultModeUnion = ResultModeUnion,\n\tTPluginArray extends CallApiPlugin[] = CallApiPlugin[],\n> = ExtraOptions<TData, TErrorData, TResultMode, TPluginArray> & {\n\t/**\n\t * Options that should extend the base options.\n\t */\n\textend?: Pick<\n\t\tExtraOptions<TData, TErrorData, TResultMode, TPluginArray>,\n\t\t(typeof optionsEnumToExtendFromBase)[number]\n\t>;\n};\n\nexport const optionsEnumToOmitFromBase = defineEnum([\"extend\", \"dedupeKey\"] satisfies Array<\n\tkeyof CallApiExtraOptions\n>);\n\nexport type BaseCallApiExtraOptions<\n\tTBaseData = DefaultDataType,\n\tTBaseErrorData = DefaultDataType,\n\tTBaseResultMode extends ResultModeUnion = ResultModeUnion,\n\tTBasePluginArray extends CallApiPlugin[] = CallApiPlugin[],\n> = Omit<\n\tCallApiExtraOptions<TBaseData, TBaseErrorData, TBaseResultMode, TBasePluginArray>,\n\t(typeof optionsEnumToOmitFromBase)[number]\n>;\n\nexport type CombinedCallApiExtraOptions<\n\tTData = DefaultDataType,\n\tTErrorData = DefaultDataType,\n\tTResultMode extends ResultModeUnion = ResultModeUnion,\n\tTPluginArray extends CallApiPlugin[] = CallApiPlugin[],\n> = BaseCallApiExtraOptions<TData, TErrorData, TResultMode, TPluginArray> &\n\tCallApiExtraOptions<TData, TErrorData, TResultMode, TPluginArray>;\n\nexport type CallApiConfig<\n\tTData = DefaultDataType,\n\tTErrorData = DefaultDataType,\n\tTResultMode extends ResultModeUnion = ResultModeUnion,\n\tTPluginArray extends CallApiPlugin[] = CallApiPlugin[],\n\t// eslint-disable-next-line perfectionist/sort-intersection-types -- Allow request options to be first due to docs\n> = CallApiRequestOptions & CallApiExtraOptions<TData, TErrorData, TResultMode, TPluginArray>;\n\nexport type BaseCallApiConfig<\n\tTBaseData = DefaultDataType,\n\tTBaseErrorData = DefaultDataType,\n\tTBaseResultMode extends ResultModeUnion = ResultModeUnion,\n\tTBasePluginArray extends CallApiPlugin[] = CallApiPlugin[],\n> = CallApiRequestOptions &\n\t// eslint-disable-next-line perfectionist/sort-intersection-types -- Allow request options to be first due to docs\n\tBaseCallApiExtraOptions<TBaseData, TBaseErrorData, TBaseResultMode, TBasePluginArray>;\n\nexport type CallApiParameters<\n\tTData = DefaultDataType,\n\tTErrorData = DefaultDataType,\n\tTResultMode extends ResultModeUnion = ResultModeUnion,\n\tTPluginArray extends CallApiPlugin[] = CallApiPlugin[],\n> = [initURL: string, config?: CallApiConfig<TData, TErrorData, TResultMode, TPluginArray>];\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 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 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 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 = DefaultDataType, TErrorData = DefaultDataType> = {\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\"] | CallApiResultSuccessVariant<TData>[\"error\"];\n\tonlyResponse:\n\t\t| CallApiResultErrorVariant<TErrorData>[\"response\"]\n\t\t| CallApiResultSuccessVariant<TData>[\"response\"];\n\tonlySuccess: CallApiResultErrorVariant<TErrorData>[\"data\"] | CallApiResultSuccessVariant<TData>[\"data\"];\n\tonlySuccessWithException: CallApiResultSuccessVariant<TData>[\"data\"];\n};\n\nexport type ResultModeUnion = { [Key in keyof ResultModeMap]: Key }[keyof ResultModeMap] | 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<ResultModeUnion>\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 retryStatusCodesLookup = 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\", \"POST\"] satisfies BaseCallApiConfig[\"retryMethods\"];\n\n// prettier-ignore\nexport const defaultRetryStatusCodes = Object.keys(retryStatusCodesLookup).map(Number) as Required<BaseCallApiConfig>[\"retryStatusCodes\"];\n","import { getAuthHeader } from \"@/auth\";\nimport {\n\ttype BaseCallApiExtraOptions,\n\ttype CallApiConfig,\n\ttype CallApiExtraOptions,\n\ttype CallApiRequestOptions,\n\ttype ResultModeMap,\n\toptionsEnumToOmitFromBase,\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) as CallApiExtraOptions,\n\t] as const;\n\nexport const objectifyHeaders = (headers: CallApiRequestOptions[\"headers\"]) => {\n\tif (!headers || isPlainObject(headers)) {\n\t\treturn headers;\n\t}\n\n\treturn Object.fromEntries(headers);\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 | undefined> = {\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 combineHooks = <\n\tTInterceptor extends\n\t\t| AnyFunction<Awaitable<unknown>>\n\t\t| Array<AnyFunction<Awaitable<unknown>> | undefined>,\n>(\n\tbaseInterceptor: TInterceptor | 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 = <TCallApiResult>(info: SuccessInfo): TCallApiResult => {\n\tconst { data, response, resultMode } = info;\n\n\tconst apiDetails = { data, error: null, response };\n\n\tif (!resultMode) {\n\t\treturn apiDetails as TCallApiResult;\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 TCallApiResult;\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"]}
@@ -0,0 +1 @@
1
+ import{splitBaseConfig as e,splitConfig as t,combineHooks as r,mergeAndResolveHeaders as o,isPlainObject as s,defaultRetryStatusCodes as n,defaultRetryMethods as a,executeHooks as i,getResponseData as u,HTTPError as l,resolveSuccessResult as d,resolveErrorResult as c,waitUntil as p,isFunction as y,isHTTPErrorInstance as f,isString as g,isArray as h,toQueryString as m,getFetchImpl as w}from"./chunk-36I75IJA.js";var R=e=>e,q=(e,t)=>async r=>{if("sequential"!==t){if("parallel"===t){const t=[...e];await Promise.all(t.map((e=>e?.(r))))}}else for(const t of e)await(t?.(r))},E={onError:new Set,onRequest:new Set,onRequestError:new Set,onResponse:new Set,onResponseError:new Set,onRetry:new Set,onSuccess:new Set},S=async e=>{const{initURL:t,options:r,request:o}=e,n=structuredClone(E),a=()=>{for(const e of Object.keys(E)){const t=r[e];n[e].add(t)}},i=e=>{for(const t of Object.keys(E)){const r=e[t];n[t].add(r)}};"mainHooksBeforePlugins"===r.mergedHooksExecutionOrder&&a();const u=e=>e?y(e)?e({initURL:t,options:r,request:o}):e:[],l=[...u(r.plugins),...u(r.extend?.plugins)];let d=t,c=r,p=o;const f=async e=>{if(!e)return;const n=await e({initURL:t,options:r,request:o});s(n)&&(g(n.initURL)&&(d=n.initURL),s(n.request)&&(p=n.request),s(n.options)&&(c=n.options))};for(const e of l)await f(e.init),e.hooks&&i(e.hooks);r.mergedHooksExecutionOrder&&"mainHooksAfterPlugins"!==r.mergedHooksExecutionOrder||a();const h={};for(const[e,t]of Object.entries(n)){const o=[...t].flat(),s=q(o,r.mergedHooksExecutionMode);h[e]=s}return{resolvedHooks:h,resolvedOptions:c,resolvedRequestOptions:p,url:d}},b=async e=>{const{$RequestInfoCache:t,newFetchController:r,options:o,request:s}=e,n=o.dedupeKey??("cancel"===o.dedupeStrategy||"defer"===o.dedupeStrategy?`${o.fullURL}-${JSON.stringify({options:o,request:s})}`:null),a=null!==n?t:null;null!==n&&await p(.1);const i=a?.get(n);return{handleRequestCancelDedupeStrategy:()=>{if(i&&"cancel"===o.dedupeStrategy){const e=o.dedupeKey?`Duplicate request detected - Aborting previous request with key '${o.dedupeKey}' as a new request was initiated`:`Duplicate request detected - Aborting previous request to '${o.fullURL}' as a new request with identical options was initiated`,t=new DOMException(e,"AbortError");i.controller.abort(t)}},handleRequestDeferDedupeStrategy:()=>{const e=w(o.customFetchImpl),t=i&&"defer"===o.dedupeStrategy?i.responsePromise:e(o.fullURL,s);return a?.set(n,{controller:r,responsePromise:t}),t},removeDedupeKeyFromCache:()=>a?.delete(n)}},D=(e,t)=>{const r=e["~retryCount"]??0;return{getDelay:()=>"exponential"===e.retryStrategy?((e,t)=>{const r=t.retryMaxDelay??1e4,o=(t.retryDelay??1e3)*2**e;return Math.min(o,r)})(r,e):(e=>e.retryDelay??1e3)(e),shouldAttemptRetry:async()=>{const o=await(e.retryCondition?.(t))??!0,s=(e.retryAttempts??0)>r&&o;if("HTTPError"!==t.error.name)return s;const n=!!t.request.method&&e.retryMethods?.includes(t.request.method);return!!t.response?.status&&e.retryStatusCodes?.includes(t.response.status)&&n&&s}}},M=(e,t,r)=>{const o=((e,t)=>{if(!t)return e;let r=e;if(h(t)){const e=r.split("/").filter((e=>e.startsWith(":")));for(const[o,s]of e.entries()){const e=t[o];r=r.replace(s,e)}return r}for(const[e,o]of Object.entries(t))r=r.replace(`:${e}`,String(o));return r})(e,t);return((e,t)=>{if(!t)return e;const r=m(t);return 0===r?.length?e:e.endsWith("?")?`${e}${r}`:e.includes("?")?`${e}&${r}`:`${e}?${r}`})(o,r)},O=(...e)=>AbortSignal.any(e.filter(Boolean)),k=e=>AbortSignal.timeout(e),$=g=>{const[h,m]=e(g??{}),w=new Map,R=async(...e)=>{const[g,q={}]=e,[$,C]=t(q),x={};for(const e of Object.keys(E)){const t=r(m[e],C[e]);x[e]=t}const A={baseURL:"",bodySerializer:JSON.stringify,dedupeStrategy:"cancel",defaultErrorMessage:"Failed to fetch data from server!",mergedHooksExecutionMode:"parallel",mergedHooksExecutionOrder:"mainHooksAfterPlugins",responseType:"json",resultMode:"all",retryAttempts:0,retryDelay:1e3,retryMaxDelay:1e4,retryMethods:a,retryStatusCodes:n,retryStrategy:"linear",...m,...C,...x},H=$.body??h.body,L={body:s(H)?A.bodySerializer(H):H,method:"GET",...h,...$,headers:o({auth:A.auth,baseHeaders:h.headers,body:H,headers:$.headers}),signal:$.signal??h.signal},{resolvedHooks:U,resolvedOptions:v,resolvedRequestOptions:P,url:j}=await S({initURL:g,options:A,request:L}),T=`${v.baseURL}${M(j,v.params,v.query)}`,F={...v,...U,fullURL:T,initURL:g},I=new AbortController,K=null!=F.timeout?k(F.timeout):null,J=O(P.signal,K,I.signal),V={...P,signal:J},{handleRequestCancelDedupeStrategy:z,handleRequestDeferDedupeStrategy:B,removeDedupeKeyFromCache:N}=await b({$RequestInfoCache:w,newFetchController:I,options:F,request:V});z();try{await i(F.onRequest({options:F,request:V})),V.headers=o({auth:F.auth,baseHeaders:h.headers,body:H,headers:V.headers});const e=await B(),t="defer"===F.dedupeStrategy||F.cloneResponse;if(!e.ok){const r=await u(t?e.clone():e,F.responseType,F.responseParser,F.responseErrorValidator);throw new l({defaultErrorMessage:F.defaultErrorMessage,errorData:r,response:e})}const r={data:await u(t?e.clone():e,F.responseType,F.responseParser,F.responseValidator),options:F,request:V,response:F.cloneResponse?e.clone():e};return await i(F.onSuccess(r),F.onResponse({...r,error:null})),await d({data:r.data,response:r.response,resultMode:F.resultMode})}catch(e){const{errorVariantDetails:t,getErrorResult:r}=c({cloneResponse:F.cloneResponse,defaultErrorMessage:F.defaultErrorMessage,error:e,resultMode:F.resultMode}),o={error:t.error,options:F,request:V},s={...o,response:t.response},{getDelay:n,shouldAttemptRetry:a}=D(F,s);if(!J.aborted&&await a()){await i(F.onRetry(s));const e=n();await p(e);const t={...q,"~retryCount":(F["~retryCount"]??0)+1};return await R(g,t)}const u=y(F.throwOnError)?F.throwOnError(s):F.throwOnError,l=()=>{if(u)throw t.error};if(f(e))return await i(F.onResponseError(s),F.onError(s),F.onResponse({...s,data:null})),l(),r();if(e instanceof DOMException&&"AbortError"===e.name){const{message:t,name:o}=e;return console.error(`${o}:`,t),l(),r()}if(e instanceof DOMException&&"TimeoutError"===e.name){const t=`Request timed out after ${F.timeout}ms`;return console.error(`${e.name}:`,t),l(),r({message:t})}return await i(F.onRequestError(o),F.onError(s)),l(),r()}finally{N()}};return R.create=$,R},C=$({});export{C as callApi,O as createCombinedSignal,b as createDedupeStrategy,$ as createFetchClient,D as createRetryStrategy,k as createTimeoutSignal,R as definePlugin,E as hooksEnum,S as initializePlugins,M as mergeUrlWithParamsAndQuery};//# sourceMappingURL=chunk-YWY7SE3F.js.map