@zayne-labs/callapi 1.3.3 → 1.3.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/error-lBRMiMeF.d.cts +17 -0
- package/dist/cjs/index.cjs +1 -1
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.d.cts +9 -8
- package/dist/cjs/options/index.cjs +1 -1
- package/dist/cjs/options/index.cjs.map +1 -1
- package/dist/cjs/options/index.d.cts +9 -9
- package/dist/cjs/{index-BpNetCiS.d.cts → plugins-Ds-irdHk.d.cts} +114 -124
- package/dist/cjs/utils/index.cjs +1 -1
- package/dist/cjs/utils/index.cjs.map +1 -1
- package/dist/cjs/utils/index.d.cts +9 -1
- package/dist/esm/chunk-G7B7UXHI.js +1 -0
- package/dist/esm/chunk-G7B7UXHI.js.map +1 -0
- package/dist/esm/chunk-VT637KNN.js +1 -0
- package/dist/esm/chunk-VT637KNN.js.map +1 -0
- package/dist/esm/error-lBRMiMeF.d.ts +17 -0
- package/dist/esm/index.d.ts +9 -8
- package/dist/esm/index.js +1 -1
- package/dist/esm/options/index.d.ts +9 -9
- package/dist/esm/options/index.js +1 -1
- package/dist/esm/options/index.js.map +1 -1
- package/dist/esm/{index-BpNetCiS.d.ts → plugins-Ds-irdHk.d.ts} +114 -124
- package/dist/esm/utils/index.d.ts +9 -1
- package/dist/esm/utils/index.js +1 -1
- package/package.json +3 -3
- package/dist/esm/chunk-QDTFT5II.js +0 -1
- package/dist/esm/chunk-QDTFT5II.js.map +0 -1
- package/dist/esm/chunk-SMQCV7OH.js +0 -1
- package/dist/esm/chunk-SMQCV7OH.js.map +0 -1
|
@@ -1,3 +1,18 @@
|
|
|
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
|
+
|
|
1
16
|
type ValueOrFunctionResult<TValue> = TValue | (() => TValue);
|
|
2
17
|
/**
|
|
3
18
|
* Bearer Or Token authentication
|
|
@@ -9,13 +24,13 @@ type ValueOrFunctionResult<TValue> = TValue | (() => TValue);
|
|
|
9
24
|
* `auth: Token some-auth-token`,
|
|
10
25
|
*/
|
|
11
26
|
type BearerOrTokenAuth = {
|
|
12
|
-
type?:
|
|
13
|
-
bearer?: never;
|
|
14
|
-
token?: ValueOrFunctionResult<string | null>;
|
|
15
|
-
} | {
|
|
16
|
-
type?: never;
|
|
27
|
+
type?: "Bearer";
|
|
17
28
|
bearer?: ValueOrFunctionResult<string | null>;
|
|
18
29
|
token?: never;
|
|
30
|
+
} | {
|
|
31
|
+
type?: "Token";
|
|
32
|
+
bearer?: never;
|
|
33
|
+
token?: ValueOrFunctionResult<string | null>;
|
|
19
34
|
};
|
|
20
35
|
/**
|
|
21
36
|
* Basic auth
|
|
@@ -47,64 +62,13 @@ type CustomAuth = {
|
|
|
47
62
|
};
|
|
48
63
|
type Auth = BearerOrTokenAuth | BasicAuth | CustomAuth;
|
|
49
64
|
|
|
50
|
-
type AnyString = string & {
|
|
51
|
-
z_placeholder?: never;
|
|
52
|
-
};
|
|
53
|
-
type AnyNumber = number & {
|
|
54
|
-
z_placeholder?: never;
|
|
55
|
-
};
|
|
56
|
-
type AnyObject = Record<string, any>;
|
|
57
|
-
type AnyFunction<TResult = any> = (...args: any[]) => TResult;
|
|
58
|
-
type UnmaskType<TValue> = {
|
|
59
|
-
_: TValue;
|
|
60
|
-
}["_"];
|
|
61
|
-
type Awaitable<TValue> = Promise<TValue> | TValue;
|
|
62
|
-
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";
|
|
63
|
-
type CommonAuthorizationHeaders = `${"Basic" | "Bearer" | "Token"} ${string}`;
|
|
64
|
-
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";
|
|
65
|
-
|
|
66
|
-
type PluginInitContext<TMoreOptions extends AnyObject = DefaultMoreOptions> = {
|
|
67
|
-
initURL: string;
|
|
68
|
-
options: CombinedCallApiExtraOptions<DefaultDataType, DefaultDataType, ResultModeUnion, TMoreOptions>;
|
|
69
|
-
request: CallApiRequestOptionsForHooks;
|
|
70
|
-
};
|
|
71
|
-
type CreateExtraOptions<TMoreOptions> = (...params: never[]) => TMoreOptions;
|
|
72
|
-
type CallApiPlugin<TMoreOptions extends AnyObject = DefaultMoreOptions> = {
|
|
73
|
-
/**
|
|
74
|
-
* @description Defines additional options that can be passed to callApi
|
|
75
|
-
*/
|
|
76
|
-
createExtraOptions?: CreateExtraOptions<TMoreOptions>;
|
|
77
|
-
/**
|
|
78
|
-
* @description A description for the plugin
|
|
79
|
-
*/
|
|
80
|
-
description?: string;
|
|
81
|
-
/**
|
|
82
|
-
* Hooks / Interceptors for the plugin
|
|
83
|
-
*/
|
|
84
|
-
hooks?: InterceptorsOrInterceptorArray;
|
|
85
|
-
/**
|
|
86
|
-
* @description A unique id for the plugin
|
|
87
|
-
*/
|
|
88
|
-
id: string;
|
|
89
|
-
/**
|
|
90
|
-
* @description A function that will be called when the plugin is
|
|
91
|
-
* initialized. This will be called before the any
|
|
92
|
-
* of the other internal functions.
|
|
93
|
-
*/
|
|
94
|
-
init?: (context: PluginInitContext) => Awaitable<Partial<PluginInitContext>> | Awaitable<void>;
|
|
95
|
-
/**
|
|
96
|
-
* @description A name for the plugin
|
|
97
|
-
*/
|
|
98
|
-
name: string;
|
|
99
|
-
/**
|
|
100
|
-
* @description A version for the plugin
|
|
101
|
-
*/
|
|
102
|
-
version?: string;
|
|
103
|
-
};
|
|
104
|
-
declare const definePlugin: <TMoreOptions extends AnyObject = {}, TPlugin extends AnyFunction<CallApiPlugin<TMoreOptions>> | CallApiPlugin<TMoreOptions> = CallApiPlugin<TMoreOptions>>(plugin: TPlugin) => TPlugin;
|
|
105
|
-
|
|
106
65
|
type RetryCondition<TErrorData> = (context: ErrorContext<TErrorData>) => boolean | Promise<boolean>;
|
|
107
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;
|
|
108
72
|
/**
|
|
109
73
|
* @description Number of allowed retry attempts on HTTP errors
|
|
110
74
|
* @default 0
|
|
@@ -114,10 +78,6 @@ interface RetryOptions<TErrorData> {
|
|
|
114
78
|
* @description Callback whose return value determines if a request should be retried or not
|
|
115
79
|
*/
|
|
116
80
|
retryCondition?: RetryCondition<TErrorData>;
|
|
117
|
-
/**
|
|
118
|
-
* @description Keeps track of the number of times the request has already been retried
|
|
119
|
-
*/
|
|
120
|
-
retryCount?: number;
|
|
121
81
|
/**
|
|
122
82
|
* @description Delay between retries in milliseconds
|
|
123
83
|
* @default 1000
|
|
@@ -145,39 +105,9 @@ interface RetryOptions<TErrorData> {
|
|
|
145
105
|
retryStrategy?: "exponential" | "linear";
|
|
146
106
|
}
|
|
147
107
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
};
|
|
152
|
-
declare const toQueryString: ToQueryStringFn;
|
|
153
|
-
declare const getResponseType: <TResponse>(response: Response, parser?: Required<CallApiExtraOptions>["responseParser"]) => {
|
|
154
|
-
arrayBuffer: () => Promise<TResponse>;
|
|
155
|
-
blob: () => Promise<TResponse>;
|
|
156
|
-
formData: () => Promise<TResponse>;
|
|
157
|
-
json: () => Promise<Record<string, unknown> | TResponse>;
|
|
158
|
-
stream: () => ReadableStream<Uint8Array<ArrayBufferLike>> | null;
|
|
159
|
-
text: () => Promise<TResponse>;
|
|
160
|
-
};
|
|
161
|
-
type ErrorObjectUnion<TErrorData = unknown> = PossibleHTTPError<TErrorData> | PossibleJavaScriptError;
|
|
162
|
-
declare const isHTTPError: <TErrorData>(error: ErrorObjectUnion<TErrorData> | null) => error is PossibleHTTPError<TErrorData>;
|
|
163
|
-
type ErrorDetails<TErrorResponse> = {
|
|
164
|
-
defaultErrorMessage: string;
|
|
165
|
-
errorData: TErrorResponse;
|
|
166
|
-
response: Response;
|
|
167
|
-
};
|
|
168
|
-
type ErrorOptions = {
|
|
169
|
-
cause?: unknown;
|
|
170
|
-
};
|
|
171
|
-
declare class HTTPError<TErrorResponse = Record<string, unknown>> extends Error {
|
|
172
|
-
errorData: ErrorDetails<TErrorResponse>["errorData"];
|
|
173
|
-
isHTTPError: boolean;
|
|
174
|
-
name: "HTTPError";
|
|
175
|
-
response: ErrorDetails<TErrorResponse>["response"];
|
|
176
|
-
constructor(errorDetails: ErrorDetails<TErrorResponse>, errorOptions?: ErrorOptions);
|
|
177
|
-
}
|
|
178
|
-
declare const isHTTPErrorInstance: <TErrorResponse>(error: unknown) => error is HTTPError<TErrorResponse>;
|
|
179
|
-
|
|
180
|
-
declare const fetchSpecificKeys: ("body" | "cache" | "credentials" | "headers" | "integrity" | "keepalive" | "method" | "mode" | "priority" | "redirect" | "referrer" | "referrerPolicy" | "signal" | "window")[];
|
|
108
|
+
declare const fetchSpecificKeys: ("headers" | "body" | "cache" | "credentials" | "integrity" | "keepalive" | "method" | "mode" | "priority" | "redirect" | "referrer" | "referrerPolicy" | "signal" | "window")[];
|
|
109
|
+
declare const defaultRetryMethods: ("GET" | "POST")[];
|
|
110
|
+
declare const defaultRetryStatusCodes: Required<BaseCallApiConfig>["retryStatusCodes"];
|
|
181
111
|
|
|
182
112
|
type FetchSpecificKeysUnion = Exclude<(typeof fetchSpecificKeys)[number], "body" | "headers" | "method">;
|
|
183
113
|
interface CallApiRequestOptions extends Pick<RequestInit, FetchSpecificKeysUnion> {
|
|
@@ -188,60 +118,62 @@ interface CallApiRequestOptions extends Pick<RequestInit, FetchSpecificKeysUnion
|
|
|
188
118
|
/**
|
|
189
119
|
* @description Headers to be used in the request.
|
|
190
120
|
*/
|
|
191
|
-
headers?: Record<"Authorization", CommonAuthorizationHeaders> | Record<"Content-Type", CommonContentTypes> | Record<CommonRequestHeaders |
|
|
121
|
+
headers?: Record<"Authorization", CommonAuthorizationHeaders> | Record<"Content-Type", CommonContentTypes> | Record<CommonRequestHeaders, string | undefined> | Record<string, string | undefined> | RequestInit["headers"];
|
|
192
122
|
/**
|
|
193
123
|
* @description HTTP method for the request.
|
|
194
124
|
* @default "GET"
|
|
195
125
|
*/
|
|
196
126
|
method?: "DELETE" | "GET" | "PATCH" | "POST" | "PUT" | AnyString;
|
|
197
127
|
}
|
|
198
|
-
interface CallApiRequestOptionsForHooks extends CallApiRequestOptions {
|
|
199
|
-
headers?: Record<
|
|
128
|
+
interface CallApiRequestOptionsForHooks extends Omit<CallApiRequestOptions, "headers"> {
|
|
129
|
+
headers?: Record<string, string | undefined>;
|
|
200
130
|
}
|
|
201
131
|
interface Register {
|
|
202
132
|
}
|
|
203
133
|
type DefaultDataType = unknown;
|
|
204
|
-
|
|
134
|
+
type DefaultMoreOptions = NonNullable<unknown>;
|
|
135
|
+
type WithMoreOptions<TMoreOptions = DefaultMoreOptions> = {
|
|
136
|
+
options: CombinedCallApiExtraOptions & Partial<TMoreOptions>;
|
|
137
|
+
};
|
|
138
|
+
interface Interceptors<TData = DefaultDataType, TErrorData = DefaultDataType, TMoreOptions = DefaultMoreOptions> {
|
|
205
139
|
/**
|
|
206
|
-
* @description Interceptor that will be called when any error occurs within the request/response
|
|
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.
|
|
207
141
|
* It is basically a combination of `onRequestError` and `onResponseError` interceptors
|
|
208
142
|
*/
|
|
209
|
-
onError?: (context: ErrorContext<TErrorData>) => Awaitable<unknown>;
|
|
143
|
+
onError?: (context: ErrorContext<TErrorData> & WithMoreOptions<TMoreOptions>) => Awaitable<unknown>;
|
|
210
144
|
/**
|
|
211
145
|
* @description Interceptor that will be called just before the request is made, allowing for modifications or additional operations.
|
|
212
146
|
*/
|
|
213
|
-
onRequest?: (context: RequestContext) => Awaitable<unknown>;
|
|
147
|
+
onRequest?: (context: RequestContext & WithMoreOptions<TMoreOptions>) => Awaitable<unknown>;
|
|
214
148
|
/**
|
|
215
149
|
* @description Interceptor that will be called when an error occurs during the fetch request.
|
|
216
150
|
*/
|
|
217
|
-
onRequestError?: (context: RequestErrorContext) => Awaitable<unknown>;
|
|
151
|
+
onRequestError?: (context: RequestErrorContext & WithMoreOptions<TMoreOptions>) => Awaitable<unknown>;
|
|
218
152
|
/**
|
|
219
153
|
* @description Interceptor that will be called when any response is received from the api, whether successful or not
|
|
220
154
|
*/
|
|
221
|
-
onResponse?: (context: ResponseContext<TData, TErrorData>) => Awaitable<unknown>;
|
|
155
|
+
onResponse?: (context: ResponseContext<TData, TErrorData> & WithMoreOptions<TMoreOptions>) => Awaitable<unknown>;
|
|
222
156
|
/**
|
|
223
157
|
* @description Interceptor that will be called when an error response is received from the api.
|
|
224
158
|
*/
|
|
225
|
-
onResponseError?: (context: ResponseErrorContext<TErrorData>) => Awaitable<unknown>;
|
|
159
|
+
onResponseError?: (context: ResponseErrorContext<TErrorData> & WithMoreOptions<TMoreOptions>) => Awaitable<unknown>;
|
|
226
160
|
/**
|
|
227
161
|
* @description Interceptor that will be called when a request is retried.
|
|
228
162
|
*/
|
|
229
|
-
onRetry?: (response: ErrorContext<TErrorData>) => Awaitable<unknown>;
|
|
163
|
+
onRetry?: (response: ErrorContext<TErrorData> & WithMoreOptions<TMoreOptions>) => Awaitable<unknown>;
|
|
230
164
|
/**
|
|
231
165
|
* @description Interceptor that will be called when a successful response is received from the api.
|
|
232
166
|
*/
|
|
233
|
-
onSuccess?: (context: SuccessContext<TData>) => Awaitable<unknown>;
|
|
167
|
+
onSuccess?: (context: SuccessContext<TData> & WithMoreOptions<TMoreOptions>) => Awaitable<unknown>;
|
|
234
168
|
}
|
|
235
|
-
type InterceptorsOrInterceptorArray<TData = DefaultDataType, TErrorData = DefaultDataType> = {
|
|
236
|
-
[Key in keyof Interceptors<TData, TErrorData>]: Interceptors<TData, TErrorData>[Key] | Array<Interceptors<TData, TErrorData>[Key]>;
|
|
169
|
+
type InterceptorsOrInterceptorArray<TData = DefaultDataType, TErrorData = DefaultDataType, TMoreOptions = DefaultMoreOptions> = {
|
|
170
|
+
[Key in keyof Interceptors<TData, TErrorData, TMoreOptions>]: Interceptors<TData, TErrorData, TMoreOptions>[Key] | Array<Interceptors<TData, TErrorData, TMoreOptions>[Key]>;
|
|
237
171
|
};
|
|
238
172
|
type FetchImpl = UnmaskType<(input: string | Request | URL, init?: RequestInit) => Promise<Response>>;
|
|
239
|
-
type CallApiPluginArray<TMoreOptions extends AnyObject> = Array<CallApiPlugin<TMoreOptions>>;
|
|
240
|
-
type DefaultMoreOptions = NonNullable<unknown>;
|
|
241
173
|
type Meta = Register extends {
|
|
242
174
|
meta?: infer TMeta extends Record<string, unknown>;
|
|
243
175
|
} ? TMeta : never;
|
|
244
|
-
type ExtraOptions<TData = DefaultDataType, TErrorData = DefaultDataType, TResultMode extends ResultModeUnion = ResultModeUnion,
|
|
176
|
+
type ExtraOptions<TData = DefaultDataType, TErrorData = DefaultDataType, TResultMode extends ResultModeUnion = ResultModeUnion, TPluginArray extends CallApiPlugin[] = CallApiPlugin[]> = InterceptorsOrInterceptorArray<TData, TErrorData> & Partial<InferPluginOptions<TPluginArray>> & RetryOptions<TErrorData> & {
|
|
245
177
|
/**
|
|
246
178
|
* @description Authorization header value.
|
|
247
179
|
*/
|
|
@@ -333,7 +265,7 @@ type ExtraOptions<TData = DefaultDataType, TErrorData = DefaultDataType, TResult
|
|
|
333
265
|
/**
|
|
334
266
|
* @description An array of CallApi plugins. It allows you to extend the behavior of the library.
|
|
335
267
|
*/
|
|
336
|
-
plugins?:
|
|
268
|
+
plugins?: TPluginArray | ((context: PluginInitContext) => TPluginArray);
|
|
337
269
|
/**
|
|
338
270
|
* @description Query parameters to append to the URL.
|
|
339
271
|
*/
|
|
@@ -374,18 +306,18 @@ type ExtraOptions<TData = DefaultDataType, TErrorData = DefaultDataType, TResult
|
|
|
374
306
|
timeout?: number;
|
|
375
307
|
};
|
|
376
308
|
declare const optionsEnumToExtendFromBase: "plugins"[];
|
|
377
|
-
type CallApiExtraOptions<TData = DefaultDataType, TErrorData = DefaultDataType, TResultMode extends ResultModeUnion = ResultModeUnion,
|
|
309
|
+
type CallApiExtraOptions<TData = DefaultDataType, TErrorData = DefaultDataType, TResultMode extends ResultModeUnion = ResultModeUnion, TPluginArray extends CallApiPlugin[] = CallApiPlugin[]> = ExtraOptions<TData, TErrorData, TResultMode, TPluginArray> & {
|
|
378
310
|
/**
|
|
379
311
|
* @description Options that should extend the base options.
|
|
380
312
|
*/
|
|
381
|
-
extend?: Pick<ExtraOptions<TData, TErrorData, TResultMode,
|
|
313
|
+
extend?: Pick<ExtraOptions<TData, TErrorData, TResultMode, TPluginArray>, (typeof optionsEnumToExtendFromBase)[number]>;
|
|
382
314
|
};
|
|
383
315
|
declare const optionsEnumToOmitFromBase: ("dedupeKey" | "extend")[];
|
|
384
|
-
type BaseCallApiExtraOptions<TBaseData = DefaultDataType, TBaseErrorData = DefaultDataType, TBaseResultMode extends ResultModeUnion = ResultModeUnion,
|
|
385
|
-
type CombinedCallApiExtraOptions<TData = DefaultDataType, TErrorData = DefaultDataType, TResultMode extends ResultModeUnion = ResultModeUnion,
|
|
386
|
-
type CallApiConfig<TData = DefaultDataType, TErrorData = DefaultDataType, TResultMode extends ResultModeUnion = ResultModeUnion,
|
|
387
|
-
type BaseCallApiConfig<TBaseData = DefaultDataType, TBaseErrorData = DefaultDataType, TBaseResultMode extends ResultModeUnion = ResultModeUnion,
|
|
388
|
-
type CallApiParameters<TData = DefaultDataType, TErrorData = DefaultDataType, TResultMode extends ResultModeUnion = ResultModeUnion,
|
|
316
|
+
type BaseCallApiExtraOptions<TBaseData = DefaultDataType, TBaseErrorData = DefaultDataType, TBaseResultMode extends ResultModeUnion = ResultModeUnion, TBasePluginArray extends CallApiPlugin[] = CallApiPlugin[]> = Omit<CallApiExtraOptions<TBaseData, TBaseErrorData, TBaseResultMode, TBasePluginArray>, (typeof optionsEnumToOmitFromBase)[number]>;
|
|
317
|
+
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;
|
|
320
|
+
type CallApiParameters<TData = DefaultDataType, TErrorData = DefaultDataType, TResultMode extends ResultModeUnion = ResultModeUnion, TPluginArray extends CallApiPlugin[] = CallApiPlugin[]> = [initURL: string, config?: CallApiConfig<TData, TErrorData, TResultMode, TPluginArray>];
|
|
389
321
|
type RequestContext = UnmaskType<{
|
|
390
322
|
options: CombinedCallApiExtraOptions;
|
|
391
323
|
request: CallApiRequestOptionsForHooks;
|
|
@@ -468,4 +400,62 @@ type ResultModeUnion = {
|
|
|
468
400
|
}[keyof ResultModeMap] | undefined;
|
|
469
401
|
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;
|
|
470
402
|
|
|
471
|
-
|
|
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
|
+
};
|
|
416
|
+
|
|
417
|
+
type UnionToIntersection<TUnion> = (TUnion extends unknown ? (param: TUnion) => void : never) extends (param: infer TParam) => void ? TParam : never;
|
|
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 = {
|
|
420
|
+
initURL: string;
|
|
421
|
+
options: CombinedCallApiExtraOptions;
|
|
422
|
+
request: CallApiRequestOptionsForHooks;
|
|
423
|
+
};
|
|
424
|
+
type PluginInitResult = Partial<Omit<PluginInitContext, "request"> & {
|
|
425
|
+
request: CallApiRequestOptions;
|
|
426
|
+
}>;
|
|
427
|
+
type CallApiPlugin = {
|
|
428
|
+
/**
|
|
429
|
+
* @description Defines additional options that can be passed to callApi
|
|
430
|
+
*/
|
|
431
|
+
createExtraOptions?: (...params: never[]) => unknown;
|
|
432
|
+
/**
|
|
433
|
+
* @description A description for the plugin
|
|
434
|
+
*/
|
|
435
|
+
description?: string;
|
|
436
|
+
/**
|
|
437
|
+
* Hooks / Interceptors for the plugin
|
|
438
|
+
*/
|
|
439
|
+
hooks?: InterceptorsOrInterceptorArray;
|
|
440
|
+
/**
|
|
441
|
+
* @description A unique id for the plugin
|
|
442
|
+
*/
|
|
443
|
+
id: string;
|
|
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.
|
|
448
|
+
*/
|
|
449
|
+
init?: (context: PluginInitContext) => Awaitable<PluginInitResult> | Awaitable<void>;
|
|
450
|
+
/**
|
|
451
|
+
* @description A name for the plugin
|
|
452
|
+
*/
|
|
453
|
+
name: string;
|
|
454
|
+
/**
|
|
455
|
+
* @description A version for the plugin
|
|
456
|
+
*/
|
|
457
|
+
version?: string;
|
|
458
|
+
};
|
|
459
|
+
declare const definePlugin: <TPlugin extends CallApiPlugin | AnyFunction<CallApiPlugin> = CallApiPlugin>(plugin: TPlugin) => TPlugin;
|
|
460
|
+
|
|
461
|
+
export { type BaseCallApiConfig as B, type CallApiPlugin as C, type DefaultDataType as D, type ErrorContext as E, type GetCallApiResult as G, type Interceptors as I, type PluginInitContext as P, type ResultModeUnion as R, type SuccessContext as S, type CallApiConfig as a, type BaseCallApiExtraOptions as b, type CallApiExtraOptions as c, definePlugin as d, type PossibleJavaScriptError as e, type PossibleHTTPError as f, type CallApiParameters as g, type CallApiRequestOptions as h, type CallApiRequestOptionsForHooks as i, type CallApiResultErrorVariant as j, type CallApiResultSuccessVariant as k, type CombinedCallApiExtraOptions as l, type InterceptorsOrInterceptorArray as m, type PossibleJavascriptErrorNames as n, type Register as o, type RequestContext as p, type RequestErrorContext as q, type ResponseContext as r, type ResponseErrorContext as s, toQueryString as t, defaultRetryMethods as u, defaultRetryStatusCodes as v };
|
|
@@ -1 +1,9 @@
|
|
|
1
|
-
|
|
1
|
+
import { f as PossibleHTTPError, e as PossibleJavaScriptError } from '../plugins-Ds-irdHk.js';
|
|
2
|
+
export { u as defaultRetryMethods, v as defaultRetryStatusCodes, t as toQueryString } from '../plugins-Ds-irdHk.js';
|
|
3
|
+
import { H as HTTPError } from '../error-lBRMiMeF.js';
|
|
4
|
+
|
|
5
|
+
type ErrorObjectUnion<TErrorData = unknown> = PossibleHTTPError<TErrorData> | PossibleJavaScriptError;
|
|
6
|
+
declare const isHTTPError: <TErrorData>(error: ErrorObjectUnion<TErrorData> | null) => error is PossibleHTTPError<TErrorData>;
|
|
7
|
+
declare const isHTTPErrorInstance: <TErrorResponse>(error: unknown) => error is HTTPError<TErrorResponse>;
|
|
8
|
+
|
|
9
|
+
export { isHTTPError, isHTTPErrorInstance };
|
package/dist/esm/utils/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export{
|
|
1
|
+
export{defaultRetryMethods,defaultRetryStatusCodes,isHTTPError,isHTTPErrorInstance,toQueryString}from"../chunk-G7B7UXHI.js";//# sourceMappingURL=index.js.map
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zayne-labs/callapi",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "1.3.
|
|
4
|
+
"version": "1.3.5",
|
|
5
5
|
"description": "A lightweight wrapper over fetch with quality of life improvements like built-in request cancellation, retries, interceptors and more",
|
|
6
6
|
"author": "Ryan Zayne",
|
|
7
7
|
"license": "MIT",
|
|
@@ -62,7 +62,7 @@
|
|
|
62
62
|
"size-limit": [
|
|
63
63
|
{
|
|
64
64
|
"path": "./src/index.ts",
|
|
65
|
-
"limit": "3.
|
|
65
|
+
"limit": "3.6 kb"
|
|
66
66
|
},
|
|
67
67
|
{
|
|
68
68
|
"path": "./src/options/index.ts",
|
|
@@ -70,7 +70,7 @@
|
|
|
70
70
|
},
|
|
71
71
|
{
|
|
72
72
|
"path": "./src/utils/index.ts",
|
|
73
|
-
"limit": "
|
|
73
|
+
"limit": "600 b"
|
|
74
74
|
}
|
|
75
75
|
],
|
|
76
76
|
"scripts": {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
var e=e=>Array.isArray(e),r=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)},t=e=>"function"==typeof e,o=e=>"string"==typeof e,n=e=>t(e)?e():e,s=e=>{if(void 0!==e){if(o(e)||null===e)return{Authorization:`Bearer ${e}`};switch(e.type){case"Basic":{const r=n(e.username),t=n(e.password);if(void 0===r||void 0===t)return;return{Authorization:`Basic ${globalThis.btoa(`${r}:${t}`)}`}}case"Custom":{const r=n(e.value);if(void 0===r)return;return{Authorization:`${n(e.prefix)} ${r}`}}default:{const r=n(e.bearer),t=n(e.token);return"token"in e&&void 0!==t?{Authorization:`Token ${t}`}:void 0!==r&&{Authorization:`Bearer ${r}`}}}}},a=["extend","dedupeKey"],i=["body","integrity","method","headers","signal","cache","redirect","window","credentials","keepalive","referrer","priority","mode","referrerPolicy"],l={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"},c=["GET","POST"],u=Object.keys(l).map(Number),p=(e,r)=>{const t={},o=new Set(r);for(const[r,n]of Object.entries(e))o.has(r)||(t[r]=n);return t},f=(e,r)=>{const t={},o=new Set(r);for(const[r,n]of Object.entries(e))o.has(r)&&(t[r]=n);return t},d=e=>[f(e,i),p(e,[...i,...a])],y=e=>[f(e,i),p(e,i)],m=e=>!e||r(e)?e:Object.fromEntries(e),h=e=>e?new URLSearchParams(e).toString():(console.error("toQueryString:","No query params provided!"),null),b=e=>{const{auth:t,baseHeaders:n,body:a,headers:i}=e;if(!Boolean(n||i||a||t))return;const l={...s(t),...m(n),...m(i)};return o(c=a)&&c.includes("=")?(l["Content-Type"]="application/x-www-form-urlencoded",l):((r(a)||o(a)&&a.startsWith("{"))&&(l["Content-Type"]="application/json",l.Accept="application/json"),l);var c},T=(r,t)=>e(r)?[r,t].flat():t??r,g=e=>{if(e)return e;if("undefined"!=typeof globalThis&&t(globalThis.fetch))return globalThis.fetch;throw new Error("No fetch implementation found")},E=(...e)=>Promise.all(e),w=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},v=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]},S=e=>{const{defaultErrorMessage:r,error:t,message:o,resultMode:n}=e;let s={data:null,error:{errorData:t,message:o??t.message,name:t.name},response:null};if(P(t)){const{errorData:e,message:o=r,name:n,response:a}=t;s={data:null,error:{errorData:e,message:o,name:n},response:a}}return{apiDetails:s,generalErrorResult:{all:s,onlyError:s.error,onlyResponse:s.response,onlySuccess:s.data,onlySuccessWithException:s.data}[n??"all"],resolveCustomErrorInfo:({message:r})=>S({...e,message:r}).generalErrorResult}},j=e=>r(e)&&"HTTPError"===e.name,O=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)}},P=e=>e instanceof O||r(e)&&"HTTPError"===e.name&&!0===e.isHTTPError,x=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{O as HTTPError,T as combineHooks,c as defaultRetryMethods,u as defaultRetryStatusCodes,E as executeHooks,g as getFetchImpl,w as getResponseData,e as isArray,t as isFunction,j as isHTTPError,P as isHTTPErrorInstance,r as isPlainObject,o as isString,b as mergeAndResolveHeaders,S as resolveErrorResult,v as resolveSuccessResult,d as splitBaseConfig,y as splitConfig,h as toQueryString,x as waitUntil};//# sourceMappingURL=chunk-QDTFT5II.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../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-QDTFT5II.js","sourcesContent":["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","/* 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 & { 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\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","/* 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, PluginInitContext } from \"./plugins\";\nimport type { RetryOptions } from \"./retry\";\nimport type { getResponseType } from \"./utils/common\";\nimport type { fetchSpecificKeys } from \"./utils/constants\";\nimport {\n\ttype AnyObject,\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 * @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<\"Authorization\", CommonAuthorizationHeaders>\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// eslint-disable-next-line perfectionist/sort-union-types -- I need the first one to be first\n\theaders?: Record<CommonRequestHeaders | AnyString, string> | Record<string, 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: Meta\n}\n\nexport type DefaultDataType = unknown;\n\nexport interface Interceptors<TData = DefaultDataType, TErrorData = DefaultDataType> {\n\t/**\n\t * @description Interceptor that will 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 that will 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 that will 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 that will 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 that will 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 that will be called when a request is retried.\n\t */\n\tonRetry?: (response: ErrorContext<TErrorData>) => Awaitable<unknown>;\n\t/**\n\t * @description Interceptor that will be called when a successful response is received from the api.\n\t */\n\tonSuccess?: (context: SuccessContext<TData>) => Awaitable<unknown>;\n}\n\n/* eslint-disable perfectionist/sort-union-types -- I need arrays to be last */\nexport type InterceptorsOrInterceptorArray<TData = DefaultDataType, TErrorData = DefaultDataType> = {\n\t[Key in keyof Interceptors<TData, TErrorData>]:\n\t\t| Interceptors<TData, TErrorData>[Key]\n\t\t| Array<Interceptors<TData, TErrorData>[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\ntype CallApiPluginArray<TMoreOptions extends AnyObject> = Array<CallApiPlugin<TMoreOptions>>;\n\nexport type DefaultMoreOptions = NonNullable<unknown>;\n\nexport type Meta = Register extends { meta?: infer TMeta extends Record<string, unknown> } ? TMeta : never;\n\nexport type ExtraOptions<\n\tTData = DefaultDataType,\n\tTErrorData = DefaultDataType,\n\tTResultMode extends ResultModeUnion = ResultModeUnion,\n\tTMoreOptions extends AnyObject = DefaultMoreOptions,\n> = InterceptorsOrInterceptorArray<TData, TErrorData> &\n\tPartial<TMoreOptions> &\n\tRetryOptions<TErrorData> & {\n\t\t/**\n\t\t * @description Authorization header value.\n\t\t */\n\t\tauth?: string | Auth | null;\n\n\t\t/**\n\t\t * @description Base URL to be prepended to all request URLs\n\t\t */\n\t\tbaseURL?: string;\n\n\t\t/**\n\t\t * @description Custom function to serialize the body object into a string.\n\t\t */\n\t\tbodySerializer?: (bodyData: Record<string, unknown>) => string;\n\n\t\t/**\n\t\t * @description Whether or not to clone the response, so response.json() and the like, can be read again else where.\n\t\t * @see https://developer.mozilla.org/en-US/docs/Web/API/Response/clone\n\t\t * @default false\n\t\t */\n\t\tcloneResponse?: boolean;\n\n\t\t/**\n\t\t * @description Custom fetch implementation\n\t\t */\n\t\tcustomFetchImpl?: FetchImpl;\n\n\t\t/**\n\t\t * @description Custom request key to be used to identify a request in the fetch deduplication strategy.\n\t\t * @default the full request url + string formed from the request options\n\t\t */\n\t\tdedupeKey?: string;\n\n\t\t/**\n\t\t * @description Defines the deduplication strategy for the request, can be set to \"none\" | \"defer\" | \"cancel\".\n\t\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\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\t * - If set to \"none\", deduplication is disabled.\n\t\t * @default \"cancel\"\n\t\t */\n\t\tdedupeStrategy?: \"cancel\" | \"defer\" | \"none\";\n\n\t\t/**\n\t\t * @description Default error message to use if none is provided from a response.\n\t\t * @default \"Failed to fetch data from server!\"\n\t\t */\n\t\tdefaultErrorMessage?: string;\n\n\t\t/**\n\t\t * @description Resolved request URL\n\t\t */\n\t\treadonly fullURL?: string;\n\n\t\t/**\n\t\t * @description URL to be used in the request.\n\t\t */\n\t\treadonly initURL?: string;\n\n\t\t/**\n\t\t * @description Defines the mode in which the merged hooks are executed, can be set to \"parallel\" | \"sequential\".\n\t\t * - If set to \"parallel\", main and plugin hooks will be executed in parallel.\n\t\t * - If set to \"sequential\", the plugin hooks will be executed first, followed by the main hook.\n\t\t * @default \"parallel\"\n\t\t */\n\t\tmergedHooksExecutionMode?: \"parallel\" | \"sequential\";\n\n\t\t/**\n\t\t * @description - Controls what order in which the merged hooks execute\n\t\t * @default \"mainHooksLast\"\n\t\t */\n\t\tmergedHooksExecutionOrder?: \"mainHooksAfterPlugins\" | \"mainHooksBeforePlugins\";\n\n\t\t/**\n\t\t * @description - An optional field you can fill with additional information,\n\t\t * to associate with the request, typically used for logging or tracing.\n\t\t *\n\t\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\t *\n\t\t * @example\n\t\t * ```ts\n\t\t * const callMainApi = callApi.create({\n\t\t * \tbaseURL: \"https://main-api.com\",\n\t\t * \tonResponseError: ({ response, options }) => {\n\t\t * \t\tif (options.meta?.userId) {\n\t\t * \t\t\tconsole.error(`User ${options.meta.userId} made an error`);\n\t\t * \t\t}\n\t\t * \t},\n\t\t * });\n\t\t *\n\t\t * const response = await callMainApi({\n\t\t * \turl: \"https://example.com/api/data\",\n\t\t * \tmeta: { userId: \"123\" },\n\t\t * });\n\t\t * ```\n\t\t */\n\t\tmeta?: Meta;\n\n\t\t/**\n\t\t * @description Params to be appended to the URL (i.e: /:id)\n\t\t */\n\t\t// eslint-disable-next-line perfectionist/sort-union-types -- I need the Record to be first\n\t\tparams?: Record<string, boolean | number | string> | Array<boolean | number | string>;\n\n\t\t/**\n\t\t * @description An array of CallApi plugins. It allows you to extend the behavior of the library.\n\t\t */\n\t\tplugins?:\n\t\t\t| CallApiPluginArray<TMoreOptions>\n\t\t\t| ((context: PluginInitContext) => CallApiPluginArray<TMoreOptions>);\n\n\t\t/**\n\t\t * @description Query parameters to append to the URL.\n\t\t */\n\t\tquery?: Record<string, boolean | number | string>;\n\n\t\t/**\n\t\t * @description Custom function to validate the response error data, stemming from the api.\n\t\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\t */\n\t\tresponseErrorValidator?: (data: unknown) => TErrorData;\n\n\t\t/**\n\t\t * @description Custom function to parse the response string into a object.\n\t\t */\n\t\tresponseParser?: (responseString: string) => Awaitable<Record<string, unknown>>;\n\n\t\t/**\n\t\t * @description Expected response type, affects how response is parsed\n\t\t * @default \"json\"\n\t\t */\n\t\tresponseType?: keyof ReturnType<typeof getResponseType>;\n\n\t\t/**\n\t\t * @description Custom function to validate the response data.\n\t\t */\n\t\tresponseValidator?: (data: unknown) => TData;\n\n\t\t/**\n\t\t * @description Mode of the result, can influence how results are handled or returned.\n\t\t * Can be set to \"all\" | \"onlySuccess\" | \"onlyError\" | \"onlyResponse\".\n\t\t * @default \"all\"\n\t\t */\n\t\tresultMode?: TErrorData extends false ? \"onlySuccessWithException\" : TResultMode | undefined;\n\n\t\t/**\n\t\t * If true or the function returns true, throws errors instead of returning them\n\t\t * The function is passed the error object and can be used to conditionally throw the error\n\t\t * @default false\n\t\t */\n\t\tthrowOnError?: boolean | ((context: ErrorContext<TErrorData>) => boolean);\n\n\t\t/**\n\t\t * @description Request timeout in milliseconds\n\t\t */\n\t\ttimeout?: number;\n\t};\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\tTMoreOptions extends AnyObject = DefaultMoreOptions,\n> = ExtraOptions<TData, TErrorData, TResultMode, TMoreOptions> & {\n\t/**\n\t * @description Options that should extend the base options.\n\t */\n\textend?: Pick<\n\t\tExtraOptions<TData, TErrorData, TResultMode, TMoreOptions>,\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\tTMoreOptions extends AnyObject = DefaultMoreOptions,\n> = Omit<\n\tCallApiExtraOptions<TBaseData, TBaseErrorData, TBaseResultMode, TMoreOptions>,\n\t(typeof optionsEnumToOmitFromBase)[number]\n>;\n\nexport type CombinedCallApiExtraOptions<\n\tTData = DefaultDataType,\n\tTErrorData = DefaultDataType,\n\tTResultMode extends ResultModeUnion = ResultModeUnion,\n\tTMoreOptions extends AnyObject = DefaultMoreOptions,\n> = BaseCallApiExtraOptions<TData, TErrorData, TResultMode, TMoreOptions> &\n\tCallApiExtraOptions<TData, TErrorData, TResultMode, TMoreOptions>;\n\nexport type CallApiConfig<\n\tTData = DefaultDataType,\n\tTErrorData = DefaultDataType,\n\tTResultMode extends ResultModeUnion = ResultModeUnion,\n\tTMoreOptions extends AnyObject = DefaultMoreOptions,\n> = CallApiExtraOptions<TData, TErrorData, TResultMode, TMoreOptions> & CallApiRequestOptions;\n\nexport type BaseCallApiConfig<\n\tTBaseData = DefaultDataType,\n\tTBaseErrorData = DefaultDataType,\n\tTBaseResultMode extends ResultModeUnion = ResultModeUnion,\n\tTBaseMoreOptions extends AnyObject = DefaultMoreOptions,\n> = BaseCallApiExtraOptions<TBaseData, TBaseErrorData, TBaseResultMode, TBaseMoreOptions> &\n\tCallApiRequestOptions;\n\nexport type CallApiParameters<\n\tTData = DefaultDataType,\n\tTErrorData = DefaultDataType,\n\tTResultMode extends ResultModeUnion = ResultModeUnion,\n\tTMoreOptions extends AnyObject = DefaultMoreOptions,\n> = [initURL: string, config?: CallApiConfig<TData, TErrorData, TResultMode, TMoreOptions>];\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 CallApiResultErrorVariant,\n\ttype PossibleHTTPError,\n\ttype PossibleJavaScriptError,\n\ttype PossibleJavascriptErrorNames,\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: 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\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 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\ntype ErrorInfo = {\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 { 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\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\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"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{getFetchImpl as e,splitBaseConfig as r,isFunction as t,isPlainObject as o,isString as s,isArray as n,toQueryString as a,splitConfig as i,combineHooks as l,defaultRetryMethods as u,defaultRetryStatusCodes as c,waitUntil as d,executeHooks as p,mergeAndResolveHeaders as y,getResponseData as f,HTTPError as g,resolveSuccessResult as m,resolveErrorResult as w,isHTTPErrorInstance as R}from"./chunk-QDTFT5II.js";var q=e=>e,E=(e,r)=>async t=>{if("sequential"!==r){if("parallel"===r){const r=[...e];await Promise.all(r.map((e=>e?.(t))))}}else for(const r of e)await(r?.(t))},h={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:r,options:n,request:a}=e,i=structuredClone(h),l=()=>{for(const e of Object.keys(h)){const r=n[e];i[e].add(r)}},u=e=>{for(const r of Object.keys(h)){const t=e[r];i[r].add(t)}};"mainHooksBeforePlugins"===n.mergedHooksExecutionOrder&&l();const c=e=>e?t(e)?e({initURL:r,options:n,request:a}):e:[],d=[...c(n.plugins),...c(n.extend?.plugins)];let p=r,y=n,f=a;const g=async e=>{if(!e)return;const t=await e({initURL:r,options:n,request:a});o(t)&&(s(t.initURL)&&(p=t.initURL),o(t.request)&&(f=t.request),o(t.options)&&(y=t.options))};for(const e of d)await g(e.init),e.hooks&&u(e.hooks);n.mergedHooksExecutionOrder&&"mainHooksAfterPlugins"!==n.mergedHooksExecutionOrder||l();const m={};for(const[e,r]of Object.entries(i)){const t=[...r].flat(),o=E(t,n.mergedHooksExecutionMode);m[e]=o}return{resolvedHooks:m,resolvedOptions:y,resolvedRequestOptions:f,url:p}},b=(e,r,t)=>"cancel"===t.dedupeStrategy||"defer"===t.dedupeStrategy?`${t.fullURL}-${JSON.stringify({options:t,request:r})}`:null,M=(e,r,t)=>{if(t&&"cancel"===r.dedupeStrategy){const e=r.dedupeKey?`Duplicate request detected - Aborting previous request with key '${r.dedupeKey}' as a new request was initiated`:`Duplicate request detected - Aborting previous request to '${r.fullURL}' as a new request with identical options was initiated`,o=new DOMException(e,"AbortError");t.controller.abort(o)}},O=(r,t,o,s)=>{const n=e(t.customFetchImpl);return s&&"defer"===t.dedupeStrategy?s.responsePromise:n(r,o)},k=(e,r)=>{const t=e.retryCount??0;return{getDelay:()=>"exponential"===e.retryStrategy?((e,r)=>{const t=r.retryMaxDelay??1e4,o=(r.retryDelay??1e3)*2**e;return Math.min(o,t)})(t,e):(e=>e.retryDelay??1e3)(e),shouldAttemptRetry:async()=>{const o=await(e.retryCondition?.(r))??!0,s=(e.retryAttempts??0)>t&&o;if("HTTPError"!==r.error.name)return s;const n=!!r.request.method&&e.retryMethods?.includes(r.request.method);return!!r.response?.status&&e.retryStatusCodes?.includes(r.response.status)&&n&&s}}},$=(e,r,t)=>{const o=((e,r)=>{if(!r)return e;let t=e;if(n(r)){const e=t.split("/").filter((e=>e.startsWith(":")));for(const[o,s]of e.entries()){const e=r[o];t=t.replace(s,e)}return t}for(const[e,o]of Object.entries(r))t=t.replace(`:${e}`,String(o));return t})(e,r);return((e,r)=>{if(!r)return e;const t=a(r);return 0===t?.length?e:e.endsWith("?")?`${e}${t}`:e.includes("?")?`${e}&${t}`:`${e}?${t}`})(o,t)},D=(...e)=>AbortSignal.any(e.filter(Boolean)),x=e=>AbortSignal.timeout(e),A=(e={})=>{const[s,n]=r(e),{body:a,headers:q,signal:E,...H}=s,L=new Map,U=async(...e)=>{const[r,s={}]=e,[A,v]=i(s),{body:C=a,headers:P,signal:T=E,...j}=A,I={};for(const e of Object.keys(h)){const r=l(n[e],v[e]);I[e]=r}const F={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:u,retryStatusCodes:c,retryStrategy:"linear",...n,...v,...I},{resolvedHooks:K,resolvedOptions:z,resolvedRequestOptions:B,url:J}=await S({initURL:r,options:F,request:{...H,...j}}),N=`${z.baseURL}${$(J,z.params,z.query)}`,V={...z,...K,fullURL:N,initURL:r},W={body:o(C)?V.bodySerializer(C):C,method:"GET",...B},G=new AbortController,Q=null!=V.timeout?x(V.timeout):null,X=D(G.signal,Q,T),Y={signal:X,...W},Z=V.dedupeKey??b(0,Y,V);null!==Z&&await d(.1);const _=null!==Z?L:null,ee=_?.get(Z);M(0,V,ee);try{await p(V.onRequest({options:V,request:Y})),Y.headers=y({auth:V.auth,baseHeaders:q??P,body:C,headers:Y.headers});const e=O(N,V,Y,ee);_?.set(Z,{controller:G,responsePromise:e});const r=await e,t="defer"===V.dedupeStrategy||V.cloneResponse;if(!r.ok){const e=await f(t?r.clone():r,V.responseType,V.responseParser,V.responseErrorValidator);throw new g({defaultErrorMessage:V.defaultErrorMessage,errorData:e,response:r})}const o=await f(t?r.clone():r,V.responseType,V.responseParser,V.responseValidator);return await p(V.onSuccess({data:o,options:V,request:Y,response:V.cloneResponse?r.clone():r}),V.onResponse({data:o,error:null,options:V,request:Y,response:V.cloneResponse?r.clone():r})),await m({data:o,response:r,resultMode:V.resultMode})}catch(e){const{apiDetails:o,generalErrorResult:n,resolveCustomErrorInfo:a}=w({defaultErrorMessage:V.defaultErrorMessage,error:e,resultMode:V.resultMode}),i={error:o.error,options:V,request:Y,response:o.response},{getDelay:l,shouldAttemptRetry:u}=k(V,i);if(!X.aborted&&await u()){await p(V.onRetry(i));const e=l();await d(e);const t={...s,retryCount:(V.retryCount??0)+1};return await U(r,t)}const c=t(V.throwOnError)?V.throwOnError(i):V.throwOnError,y=()=>{if(c)throw o.error};if(R(e)){const{response:r}=e,t=n.error;return await p(V.onResponseError({error:t,options:V,request:Y,response:V.cloneResponse?r.clone():r}),V.onError({error:t,options:V,request:Y,response:V.cloneResponse?r.clone():r}),V.onResponse({data:null,error:t,options:V,request:Y,response:V.cloneResponse?r.clone():r})),y(),n}if(e instanceof DOMException&&"AbortError"===e.name){const{message:r,name:t}=e;return console.error(`${t}:`,r),y(),n}if(e instanceof DOMException&&"TimeoutError"===e.name){const r=`Request timed out after ${V.timeout}ms`;return console.error(`${e.name}:`,r),y(),a({message:r})}const f=n.error;return await p(V.onRequestError({error:f,options:V,request:Y}),V.onError({error:f,options:V,request:Y,response:null})),y(),n}finally{_?.delete(Z)}};return U.create=A,U},H=A();export{H as callApi,D as createCombinedSignal,A as createFetchClient,k as createRetryStrategy,x as createTimeoutSignal,q as definePlugin,b as generateDedupeKey,M as handleRequestCancelDedupe,O as handleRequestDeferDedupe,h as hooksEnum,S as initializePlugins,$ as mergeUrlWithParamsAndQuery};//# sourceMappingURL=chunk-SMQCV7OH.js.map
|