@zayne-labs/callapi 1.3.6 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,17 +1,4 @@
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;
1
+ import { StandardSchemaV1 } from '@standard-schema/spec';
15
2
 
16
3
  type ValueOrFunctionResult<TValue> = TValue | (() => TValue);
17
4
  /**
@@ -62,29 +49,44 @@ type CustomAuth = {
62
49
  };
63
50
  type Auth = BearerOrTokenAuth | BasicAuth | CustomAuth;
64
51
 
52
+ type AnyString = string & {
53
+ z_placeholder?: never;
54
+ };
55
+ type AnyNumber = number & {
56
+ z_placeholder?: never;
57
+ };
58
+ type AnyFunction<TResult = any> = (...args: any[]) => TResult;
59
+ type UnmaskType<TValue> = {
60
+ _: TValue;
61
+ }["_"];
62
+ type Awaitable<TValue> = Promise<TValue> | TValue;
63
+ 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;
64
+ type CommonAuthorizationHeaders = `${"Basic" | "Bearer" | "Token"} ${string}`;
65
+ 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;
66
+
65
67
  type RetryCondition<TErrorData> = (context: ErrorContext<TErrorData>) => boolean | Promise<boolean>;
66
68
  interface RetryOptions<TErrorData> {
67
69
  /**
68
- * @description Keeps track of the number of times the request has already been retried
70
+ * Keeps track of the number of times the request has already been retried
69
71
  * @deprecated This property is used internally to track retries. Please abstain from modifying it.
70
72
  */
71
73
  readonly "~retryCount"?: number;
72
74
  /**
73
- * @description Number of allowed retry attempts on HTTP errors
75
+ * Number of allowed retry attempts on HTTP errors
74
76
  * @default 0
75
77
  */
76
78
  retryAttempts?: number;
77
79
  /**
78
- * @description Callback whose return value determines if a request should be retried or not
80
+ * Callback whose return value determines if a request should be retried or not
79
81
  */
80
82
  retryCondition?: RetryCondition<TErrorData>;
81
83
  /**
82
- * @description Delay between retries in milliseconds
84
+ * Delay between retries in milliseconds
83
85
  * @default 1000
84
86
  */
85
87
  retryDelay?: number;
86
88
  /**
87
- * @description Maximum delay in milliseconds. Only applies to exponential strategy
89
+ * Maximum delay in milliseconds. Only applies to exponential strategy
88
90
  * @default 10000
89
91
  */
90
92
  retryMaxDelay?: number;
@@ -94,17 +96,96 @@ interface RetryOptions<TErrorData> {
94
96
  */
95
97
  retryMethods?: Array<"GET" | "POST" | AnyString>;
96
98
  /**
97
- * @description HTTP status codes that trigger a retry
99
+ * HTTP status codes that trigger a retry
98
100
  * @default [409, 425, 429, 500, 502, 503, 504]
99
101
  */
100
102
  retryStatusCodes?: Array<409 | 425 | 429 | 500 | 502 | 503 | 504 | AnyNumber>;
101
103
  /**
102
- * @description Strategy to use when retrying
104
+ * Strategy to use when retrying
103
105
  * @default "linear"
104
106
  */
105
107
  retryStrategy?: "exponential" | "linear";
106
108
  }
107
109
 
110
+ interface Schemas {
111
+ /**
112
+ * The schema to use for validating the response data.
113
+ */
114
+ data?: StandardSchemaV1;
115
+ /**
116
+ * The schema to use for validating the response error data.
117
+ */
118
+ errorData?: StandardSchemaV1;
119
+ }
120
+ interface Validators<TData = unknown, TErrorData = unknown> {
121
+ /**
122
+ * Custom function to validate the response data.
123
+ */
124
+ data?: (data: unknown) => TData;
125
+ /**
126
+ * Custom function to validate the response error data, stemming from the api.
127
+ * 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.
128
+ */
129
+ errorData?: (data: unknown) => TErrorData;
130
+ }
131
+ type InferSchemaResult<TSchema extends StandardSchemaV1 | undefined, TData> = TSchema extends StandardSchemaV1 ? StandardSchemaV1.InferOutput<TSchema> : TData;
132
+
133
+ type ToQueryStringFn = {
134
+ (params: CallApiConfig["query"]): string | null;
135
+ (params: Required<CallApiConfig>["query"]): string;
136
+ };
137
+ declare const toQueryString: ToQueryStringFn;
138
+ declare const getResponseType: <TResponse>(response: Response, parser?: Required<CallApiExtraOptions>["responseParser"]) => {
139
+ arrayBuffer: () => Promise<TResponse>;
140
+ blob: () => Promise<TResponse>;
141
+ formData: () => Promise<TResponse>;
142
+ json: () => Promise<Record<string, unknown> | TResponse>;
143
+ stream: () => ReadableStream<Uint8Array<ArrayBufferLike>> | null;
144
+ text: () => Promise<TResponse>;
145
+ };
146
+
147
+ type UnionToIntersection<TUnion> = (TUnion extends unknown ? (param: TUnion) => void : never) extends (param: infer TParam) => void ? TParam : never;
148
+ 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>;
149
+ type PluginInitContext<TMoreOptions = DefaultMoreOptions> = WithMoreOptions<TMoreOptions> & {
150
+ initURL: string;
151
+ options: CombinedCallApiExtraOptions;
152
+ request: CallApiRequestOptionsForHooks;
153
+ };
154
+ type PluginInitResult = Partial<Omit<PluginInitContext, "request"> & {
155
+ request: CallApiRequestOptions;
156
+ }>;
157
+ type CallApiPlugin = {
158
+ /**
159
+ * Defines additional options that can be passed to callApi
160
+ */
161
+ createExtraOptions?: (...params: never[]) => unknown;
162
+ /**
163
+ * A description for the plugin
164
+ */
165
+ description?: string;
166
+ /**
167
+ * Hooks / Interceptors for the plugin
168
+ */
169
+ hooks?: InterceptorsOrInterceptorArray;
170
+ /**
171
+ * A unique id for the plugin
172
+ */
173
+ id: string;
174
+ /**
175
+ * A function that will be called when the plugin is initialized. This will be called before the any of the other internal functions.
176
+ */
177
+ init?: (context: PluginInitContext) => Awaitable<PluginInitResult> | Awaitable<void>;
178
+ /**
179
+ * A name for the plugin
180
+ */
181
+ name: string;
182
+ /**
183
+ * A version for the plugin
184
+ */
185
+ version?: string;
186
+ };
187
+ declare const definePlugin: <TPlugin extends CallApiPlugin | AnyFunction<CallApiPlugin> = CallApiPlugin>(plugin: TPlugin) => TPlugin;
188
+
108
189
  declare const fetchSpecificKeys: ("headers" | "body" | "cache" | "credentials" | "integrity" | "keepalive" | "method" | "mode" | "priority" | "redirect" | "referrer" | "referrerPolicy" | "signal" | "window")[];
109
190
  declare const defaultRetryMethods: ("GET" | "POST")[];
110
191
  declare const defaultRetryStatusCodes: Required<BaseCallApiConfig>["retryStatusCodes"];
@@ -112,18 +193,18 @@ declare const defaultRetryStatusCodes: Required<BaseCallApiConfig>["retryStatusC
112
193
  type FetchSpecificKeysUnion = Exclude<(typeof fetchSpecificKeys)[number], "body" | "headers" | "method">;
113
194
  interface CallApiRequestOptions extends Pick<RequestInit, FetchSpecificKeysUnion> {
114
195
  /**
115
- * @description Optional body of the request, can be a object or any other supported body type.
196
+ * Optional body of the request, can be a object or any other supported body type.
116
197
  */
117
198
  body?: Record<string, unknown> | RequestInit["body"];
118
199
  /**
119
- * @description Headers to be used in the request.
200
+ * Headers to be used in the request.
120
201
  */
121
202
  headers?: Record<"Authorization", CommonAuthorizationHeaders> | Record<"Content-Type", CommonContentTypes> | Record<CommonRequestHeaders, string | undefined> | Record<string, string | undefined> | RequestInit["headers"];
122
203
  /**
123
- * @description HTTP method for the request.
204
+ * HTTP method for the request.
124
205
  * @default "GET"
125
206
  */
126
- method?: "DELETE" | "GET" | "PATCH" | "POST" | "PUT" | AnyString;
207
+ method?: "CONNECT" | "DELETE" | "GET" | "HEAD" | "OPTIONS" | "PATCH" | "POST" | "PUT" | "TRACE" | AnyString;
127
208
  }
128
209
  interface CallApiRequestOptionsForHooks extends Omit<CallApiRequestOptions, "headers"> {
129
210
  headers?: Record<string, string | undefined>;
@@ -137,32 +218,32 @@ type WithMoreOptions<TMoreOptions = DefaultMoreOptions> = {
137
218
  };
138
219
  interface Interceptors<TData = DefaultDataType, TErrorData = DefaultDataType, TMoreOptions = DefaultMoreOptions> {
139
220
  /**
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.
221
+ * 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
222
  * It is basically a combination of `onRequestError` and `onResponseError` interceptors
142
223
  */
143
224
  onError?: (context: ErrorContext<TErrorData> & WithMoreOptions<TMoreOptions>) => Awaitable<unknown>;
144
225
  /**
145
- * @description Interceptor that will be called just before the request is made, allowing for modifications or additional operations.
226
+ * Interceptor that will be called just before the request is made, allowing for modifications or additional operations.
146
227
  */
147
228
  onRequest?: (context: RequestContext & WithMoreOptions<TMoreOptions>) => Awaitable<unknown>;
148
229
  /**
149
- * @description Interceptor that will be called when an error occurs during the fetch request.
230
+ * Interceptor that will be called when an error occurs during the fetch request.
150
231
  */
151
232
  onRequestError?: (context: RequestErrorContext & WithMoreOptions<TMoreOptions>) => Awaitable<unknown>;
152
233
  /**
153
- * @description Interceptor that will be called when any response is received from the api, whether successful or not
234
+ * Interceptor that will be called when any response is received from the api, whether successful or not
154
235
  */
155
236
  onResponse?: (context: ResponseContext<TData, TErrorData> & WithMoreOptions<TMoreOptions>) => Awaitable<unknown>;
156
237
  /**
157
- * @description Interceptor that will be called when an error response is received from the api.
238
+ * Interceptor that will be called when an error response is received from the api.
158
239
  */
159
240
  onResponseError?: (context: ResponseErrorContext<TErrorData> & WithMoreOptions<TMoreOptions>) => Awaitable<unknown>;
160
241
  /**
161
- * @description Interceptor that will be called when a request is retried.
242
+ * Interceptor that will be called when a request is retried.
162
243
  */
163
244
  onRetry?: (response: ErrorContext<TErrorData> & WithMoreOptions<TMoreOptions>) => Awaitable<unknown>;
164
245
  /**
165
- * @description Interceptor that will be called when a successful response is received from the api.
246
+ * Interceptor that will be called when a successful response is received from the api.
166
247
  */
167
248
  onSuccess?: (context: SuccessContext<TData> & WithMoreOptions<TMoreOptions>) => Awaitable<unknown>;
168
249
  }
@@ -173,36 +254,36 @@ type FetchImpl = UnmaskType<(input: string | Request | URL, init?: RequestInit)
173
254
  type Meta = Register extends {
174
255
  meta?: infer TMeta extends Record<string, unknown>;
175
256
  } ? 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> & {
257
+ type ExtraOptions<TData = DefaultDataType, TErrorData = DefaultDataType, TResultMode extends ResultModeUnion = ResultModeUnion, TPluginArray extends CallApiPlugin[] = never[], TSchemas extends Schemas = DefaultMoreOptions> = {
177
258
  /**
178
- * @description Authorization header value.
259
+ * Authorization header value.
179
260
  */
180
261
  auth?: string | Auth | null;
181
262
  /**
182
- * @description Base URL to be prepended to all request URLs
263
+ * Base URL to be prepended to all request URLs
183
264
  */
184
265
  baseURL?: string;
185
266
  /**
186
- * @description Custom function to serialize the body object into a string.
267
+ * Custom function to serialize the body object into a string.
187
268
  */
188
269
  bodySerializer?: (bodyData: Record<string, unknown>) => string;
189
270
  /**
190
- * @description Whether or not to clone the response, so response.json() and the like, can be read again else where.
271
+ * Whether or not to clone the response, so response.json() and the like, can be read again else where.
191
272
  * @see https://developer.mozilla.org/en-US/docs/Web/API/Response/clone
192
273
  * @default false
193
274
  */
194
275
  cloneResponse?: boolean;
195
276
  /**
196
- * @description Custom fetch implementation
277
+ * Custom fetch implementation
197
278
  */
198
279
  customFetchImpl?: FetchImpl;
199
280
  /**
200
- * @description Custom request key to be used to identify a request in the fetch deduplication strategy.
281
+ * Custom request key to be used to identify a request in the fetch deduplication strategy.
201
282
  * @default the full request url + string formed from the request options
202
283
  */
203
284
  dedupeKey?: string;
204
285
  /**
205
- * @description Defines the deduplication strategy for the request, can be set to "none" | "defer" | "cancel".
286
+ * Defines the deduplication strategy for the request, can be set to "none" | "defer" | "cancel".
206
287
  * - If set to "cancel", the previous pending request with the same request key will be cancelled and lets the new request through.
207
288
  * - 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
289
  * - If set to "none", deduplication is disabled.
@@ -210,32 +291,32 @@ type ExtraOptions<TData = DefaultDataType, TErrorData = DefaultDataType, TResult
210
291
  */
211
292
  dedupeStrategy?: "cancel" | "defer" | "none";
212
293
  /**
213
- * @description Default error message to use if none is provided from a response.
294
+ * Default error message to use if none is provided from a response.
214
295
  * @default "Failed to fetch data from server!"
215
296
  */
216
297
  defaultErrorMessage?: string;
217
298
  /**
218
- * @description Resolved request URL
299
+ * Resolved request URL
219
300
  */
220
301
  readonly fullURL?: string;
221
302
  /**
222
- * @description URL to be used in the request.
303
+ * URL to be used in the request.
223
304
  */
224
305
  readonly initURL?: string;
225
306
  /**
226
- * @description Defines the mode in which the merged hooks are executed, can be set to "parallel" | "sequential".
307
+ * Defines the mode in which the merged hooks are executed, can be set to "parallel" | "sequential".
227
308
  * - If set to "parallel", main and plugin hooks will be executed in parallel.
228
309
  * - If set to "sequential", the plugin hooks will be executed first, followed by the main hook.
229
310
  * @default "parallel"
230
311
  */
231
312
  mergedHooksExecutionMode?: "parallel" | "sequential";
232
313
  /**
233
- * @description - Controls what order in which the merged hooks execute
314
+ * - Controls what order in which the merged hooks execute
234
315
  * @default "mainHooksLast"
235
316
  */
236
317
  mergedHooksExecutionOrder?: "mainHooksAfterPlugins" | "mainHooksBeforePlugins";
237
318
  /**
238
- * @description - An optional field you can fill with additional information,
319
+ * - An optional field you can fill with additional information,
239
320
  * to associate with the request, typically used for logging or tracing.
240
321
  *
241
322
  * - A good use case for this, would be to use the info to handle specific cases in any of the shared interceptors.
@@ -259,41 +340,33 @@ type ExtraOptions<TData = DefaultDataType, TErrorData = DefaultDataType, TResult
259
340
  */
260
341
  meta?: Meta;
261
342
  /**
262
- * @description Params to be appended to the URL (i.e: /:id)
343
+ * Params to be appended to the URL (i.e: /:id)
263
344
  */
264
345
  params?: Record<string, boolean | number | string> | Array<boolean | number | string>;
265
346
  /**
266
- * @description An array of CallApi plugins. It allows you to extend the behavior of the library.
347
+ * An array of CallApi plugins. It allows you to extend the behavior of the library.
267
348
  */
268
349
  plugins?: TPluginArray | ((context: PluginInitContext) => TPluginArray);
269
350
  /**
270
- * @description Query parameters to append to the URL.
351
+ * Query parameters to append to the URL.
271
352
  */
272
353
  query?: Record<string, boolean | number | string>;
273
354
  /**
274
- * @description Custom function to validate the response error data, stemming from the api.
275
- * 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
- */
277
- responseErrorValidator?: (data: unknown) => TErrorData;
278
- /**
279
- * @description Custom function to parse the response string into a object.
355
+ * Custom function to parse the response string into a object.
280
356
  */
281
357
  responseParser?: (responseString: string) => Awaitable<Record<string, unknown>>;
282
358
  /**
283
- * @description Expected response type, affects how response is parsed
359
+ * Expected response type, affects how response is parsed
284
360
  * @default "json"
285
361
  */
286
362
  responseType?: keyof ReturnType<typeof getResponseType>;
287
363
  /**
288
- * @description Custom function to validate the response data.
289
- */
290
- responseValidator?: (data: unknown) => TData;
291
- /**
292
- * @description Mode of the result, can influence how results are handled or returned.
364
+ * Mode of the result, can influence how results are handled or returned.
293
365
  * Can be set to "all" | "onlySuccess" | "onlyError" | "onlyResponse".
294
366
  * @default "all"
295
367
  */
296
368
  resultMode?: TErrorData extends false ? "onlySuccessWithException" : TResultMode | undefined;
369
+ schemas?: TSchemas;
297
370
  /**
298
371
  * If true or the function returns true, throws errors instead of returning them
299
372
  * The function is passed the error object and can be used to conditionally throw the error
@@ -301,23 +374,24 @@ type ExtraOptions<TData = DefaultDataType, TErrorData = DefaultDataType, TResult
301
374
  */
302
375
  throwOnError?: boolean | ((context: ErrorContext<TErrorData>) => boolean);
303
376
  /**
304
- * @description Request timeout in milliseconds
377
+ * Request timeout in milliseconds
305
378
  */
306
379
  timeout?: number;
307
- };
308
- declare const optionsEnumToExtendFromBase: "plugins"[];
309
- type CallApiExtraOptions<TData = DefaultDataType, TErrorData = DefaultDataType, TResultMode extends ResultModeUnion = ResultModeUnion, TPluginArray extends CallApiPlugin[] = CallApiPlugin[]> = ExtraOptions<TData, TErrorData, TResultMode, TPluginArray> & {
380
+ validators?: Validators<TData, TErrorData>;
381
+ } & InterceptorsOrInterceptorArray<TData, TErrorData> & Partial<InferPluginOptions<TPluginArray>> & RetryOptions<TErrorData>;
382
+ declare const optionsEnumToExtendFromBase: ("plugins" | "schemas" | "validators")[];
383
+ type CallApiExtraOptions<TData = DefaultDataType, TErrorData = DefaultDataType, TResultMode extends ResultModeUnion = ResultModeUnion, TPluginArray extends CallApiPlugin[] = never[], TSchemas extends Schemas = DefaultMoreOptions> = ExtraOptions<TData, TErrorData, TResultMode, TPluginArray, TSchemas> & {
310
384
  /**
311
- * @description Options that should extend the base options.
385
+ * Options that should extend the base options.
312
386
  */
313
- extend?: Pick<ExtraOptions<TData, TErrorData, TResultMode, TPluginArray>, (typeof optionsEnumToExtendFromBase)[number]>;
387
+ extend?: Pick<ExtraOptions<TData, TErrorData, TResultMode, TPluginArray, TSchemas>, (typeof optionsEnumToExtendFromBase)[number]>;
314
388
  };
315
389
  declare const optionsEnumToOmitFromBase: ("dedupeKey" | "extend")[];
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>];
390
+ type BaseCallApiExtraOptions<TBaseData = DefaultDataType, TBaseErrorData = DefaultDataType, TBaseResultMode extends ResultModeUnion = ResultModeUnion, TBasePluginArray extends CallApiPlugin[] = never[], TBaseSchemas extends Schemas = DefaultMoreOptions> = Omit<CallApiExtraOptions<TBaseData, TBaseErrorData, TBaseResultMode, TBasePluginArray, TBaseSchemas>, (typeof optionsEnumToOmitFromBase)[number]>;
391
+ type CombinedCallApiExtraOptions<TData = DefaultDataType, TErrorData = DefaultDataType, TResultMode extends ResultModeUnion = ResultModeUnion, TPluginArray extends CallApiPlugin[] = never[], TSchemas extends Schemas = DefaultMoreOptions> = BaseCallApiExtraOptions<TData, TErrorData, TResultMode, TPluginArray, TSchemas> & CallApiExtraOptions<TData, TErrorData, TResultMode, TPluginArray, TSchemas>;
392
+ type CallApiConfig<TData = DefaultDataType, TErrorData = DefaultDataType, TResultMode extends ResultModeUnion = ResultModeUnion, TPluginArray extends CallApiPlugin[] = never[], TSchemas extends Schemas = DefaultMoreOptions> = CallApiRequestOptions & CallApiExtraOptions<TData, TErrorData, TResultMode, TPluginArray, TSchemas>;
393
+ type BaseCallApiConfig<TBaseData = DefaultDataType, TBaseErrorData = DefaultDataType, TBaseResultMode extends ResultModeUnion = ResultModeUnion, TBasePluginArray extends CallApiPlugin[] = never[], TBaseSchemas extends Schemas = DefaultMoreOptions> = CallApiRequestOptions & BaseCallApiExtraOptions<TBaseData, TBaseErrorData, TBaseResultMode, TBasePluginArray, TBaseSchemas>;
394
+ type CallApiParameters<TData = DefaultDataType, TErrorData = DefaultDataType, TResultMode extends ResultModeUnion = ResultModeUnion, TPluginArray extends CallApiPlugin[] = never[], TSchemas extends Schemas = DefaultMoreOptions> = [initURL: string, config?: CallApiConfig<TData, TErrorData, TResultMode, TPluginArray, TSchemas>];
321
395
  type RequestContext = UnmaskType<{
322
396
  options: CombinedCallApiExtraOptions;
323
397
  request: CallApiRequestOptionsForHooks;
@@ -341,7 +415,7 @@ type SuccessContext<TData> = UnmaskType<{
341
415
  request: CallApiRequestOptionsForHooks;
342
416
  response: Response;
343
417
  }>;
344
- type PossibleJavascriptErrorNames = "AbortError" | "Error" | "SyntaxError" | "TimeoutError" | "TypeError" | (`${string}Error` & {});
418
+ type PossibleJavascriptErrorNames = "AbortError" | "Error" | "SyntaxError" | "TimeoutError" | "TypeError" | (`${string}Error` & DefaultMoreOptions);
345
419
  type PossibleJavaScriptError = UnmaskType<{
346
420
  errorData: DOMException | Error | SyntaxError | TypeError;
347
421
  message: string;
@@ -400,62 +474,4 @@ type ResultModeUnion = {
400
474
  }[keyof ResultModeMap] | undefined;
401
475
  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
476
 
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<TMoreOptions = DefaultMoreOptions> = WithMoreOptions<TMoreOptions> & {
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 };
477
+ export { type BaseCallApiConfig as B, type CallApiPlugin as C, type DefaultDataType as D, type ErrorContext as E, type GetCallApiResult as G, type InferSchemaResult as I, type PluginInitContext as P, type ResultModeUnion as R, type Schemas 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 Interceptors as m, type InterceptorsOrInterceptorArray as n, type PossibleJavascriptErrorNames as o, type Register as p, type RequestContext as q, type RequestErrorContext as r, type ResponseContext as s, type ResponseErrorContext as t, type SuccessContext as u, toQueryString as v, defaultRetryMethods as w, defaultRetryStatusCodes as x };
@@ -1,6 +1,7 @@
1
- import { f as PossibleHTTPError, e as PossibleJavaScriptError } from '../plugins-DXl13OeA.js';
2
- export { u as defaultRetryMethods, v as defaultRetryStatusCodes, t as toQueryString } from '../plugins-DXl13OeA.js';
1
+ import { f as PossibleHTTPError, e as PossibleJavaScriptError } from '../types-CNYLI9wS.js';
2
+ export { w as defaultRetryMethods, x as defaultRetryStatusCodes, v as toQueryString } from '../types-CNYLI9wS.js';
3
3
  import { H as HTTPError } from '../error-lBRMiMeF.js';
4
+ import '@standard-schema/spec';
4
5
 
5
6
  type ErrorObjectUnion<TErrorData = unknown> = PossibleHTTPError<TErrorData> | PossibleJavaScriptError;
6
7
  declare const isHTTPError: <TErrorData>(error: ErrorObjectUnion<TErrorData> | null) => error is PossibleHTTPError<TErrorData>;
@@ -1 +1 @@
1
- export{defaultRetryMethods,defaultRetryStatusCodes,isHTTPError,isHTTPErrorInstance,toQueryString}from"../chunk-5YQFYNEZ.js";//# sourceMappingURL=index.js.map
1
+ export{defaultRetryMethods,defaultRetryStatusCodes,isHTTPError,isHTTPErrorInstance,toQueryString}from"../chunk-KABMV5OF.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.6",
4
+ "version": "1.4.0",
5
5
  "description": "A lightweight wrapper over fetch with quality of life improvements like built-in request cancellation, retries, interceptors and more",
6
6
  "author": "Ryan Zayne",
7
7
  "license": "MIT",
@@ -44,6 +44,7 @@
44
44
  "@arethetypeswrong/cli": "0.17.3",
45
45
  "@size-limit/esbuild-why": "11.1.6",
46
46
  "@size-limit/preset-small-lib": "11.1.6",
47
+ "@standard-schema/spec": "^1.0.0",
47
48
  "@total-typescript/ts-reset": "0.6.1",
48
49
  "@zayne-labs/tsconfig": "0.2.1",
49
50
  "concurrently": "^9.0.1",
@@ -1 +0,0 @@
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-5YQFYNEZ.js.map