@zayne-labs/callapi 1.2.1 → 1.3.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.
@@ -48,23 +48,25 @@ type CustomAuth = {
48
48
  type Auth = BearerOrTokenAuth | BasicAuth | CustomAuth;
49
49
 
50
50
  type AnyString = string & {
51
- placeholder?: never;
51
+ z_placeholder?: never;
52
52
  };
53
53
  type AnyNumber = number & {
54
- placeholder?: never;
54
+ z_placeholder?: never;
55
55
  };
56
+ type AnyObject = Record<string, any>;
56
57
  type AnyFunction<TResult = any> = (...args: any[]) => TResult;
57
58
  type UnmaskType<TValue> = {
58
59
  _: TValue;
59
60
  }["_"];
60
61
  type Awaitable<TValue> = Promise<TValue> | TValue;
61
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";
62
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";
63
65
 
64
66
  type PluginInitContext<TData = unknown, TErrorData = unknown> = {
65
67
  initURL: string;
66
68
  options: CombinedCallApiExtraOptions<TData, TErrorData>;
67
- request: Omit<CallApiRequestOptionsForHooks, "fullURL">;
69
+ request: CallApiRequestOptionsForHooks;
68
70
  };
69
71
  type CallApiPlugin<TData = unknown, TErrorData = unknown> = {
70
72
  /**
@@ -107,11 +109,6 @@ interface RetryOptions<TErrorData> {
107
109
  * @default 0
108
110
  */
109
111
  retryAttempts?: number;
110
- /**
111
- * @description HTTP status codes that trigger a retry
112
- * @default [409, 425, 429, 500, 502, 503, 504]
113
- */
114
- retryCodes?: Array<409 | 425 | 429 | 500 | 502 | 503 | 504 | AnyNumber>;
115
112
  /**
116
113
  * @description Callback whose return value determines if a request should be retried or not
117
114
  */
@@ -135,6 +132,11 @@ interface RetryOptions<TErrorData> {
135
132
  * @default ["GET", "POST"]
136
133
  */
137
134
  retryMethods?: Array<"GET" | "POST" | AnyString>;
135
+ /**
136
+ * @description HTTP status codes that trigger a retry
137
+ * @default [409, 425, 429, 500, 502, 503, 504]
138
+ */
139
+ retryStatusCodes?: Array<409 | 425 | 429 | 500 | 502 | 503 | 504 | AnyNumber>;
138
140
  /**
139
141
  * @description Strategy to use when retrying
140
142
  * @default "linear"
@@ -155,6 +157,7 @@ declare const getResponseType: <TResponse>(response: Response, parser?: Required
155
157
  stream: () => ReadableStream<Uint8Array<ArrayBufferLike>> | null;
156
158
  text: () => Promise<TResponse>;
157
159
  };
160
+ type ErrorObjectUnion<TErrorData = unknown> = PossibleHTTPError<TErrorData> | PossibleJavaScriptError;
158
161
  declare const isHTTPError: <TErrorData>(error: ErrorObjectUnion<TErrorData> | null) => error is PossibleHTTPError<TErrorData>;
159
162
  type ErrorDetails<TErrorResponse> = {
160
163
  defaultErrorMessage: string;
@@ -184,7 +187,7 @@ interface CallApiRequestOptions extends Pick<RequestInit, FetchSpecificKeysUnion
184
187
  /**
185
188
  * @description Headers to be used in the request.
186
189
  */
187
- headers?: Record<"Content-Type", CommonContentTypes> | Record<CommonRequestHeaders | AnyString, string> | RequestInit["headers"];
190
+ headers?: Record<"Authorization", CommonAuthorizationHeaders> | Record<"Content-Type", CommonContentTypes> | Record<CommonRequestHeaders | AnyString, string> | RequestInit["headers"];
188
191
  /**
189
192
  * @description HTTP method for the request.
190
193
  * @default "GET"
@@ -196,7 +199,7 @@ interface CallApiRequestOptionsForHooks extends CallApiRequestOptions {
196
199
  }
197
200
  interface Register {
198
201
  }
199
- type R_Meta = Register extends {
202
+ type Meta = Register extends {
200
203
  meta?: infer TMeta extends Record<string, unknown>;
201
204
  } ? TMeta : never;
202
205
  interface Interceptors<TData = unknown, TErrorData = unknown> {
@@ -236,7 +239,7 @@ type InterceptorsArray<TData = unknown, TErrorData = unknown> = {
236
239
  type InterceptorsOrInterceptorsArray<TData, TErrorData> = Interceptors<TData, TErrorData> | InterceptorsArray<TData, TErrorData>;
237
240
  type FetchImpl = UnmaskType<(input: string | Request | URL, init?: RequestInit) => Promise<Response>>;
238
241
  type CallApiPluginArray<TData, TErrorData> = Array<CallApiPlugin<TData, TErrorData>>;
239
- type ExtraOptions<TData = unknown, TErrorData = unknown, TResultMode extends CallApiResultModeUnion = CallApiResultModeUnion> = InterceptorsOrInterceptorsArray<TData, TErrorData> & RetryOptions<TErrorData> & {
242
+ type ExtraOptions<TData = unknown, TErrorData = unknown, TResultMode extends CallApiResultModeUnion = CallApiResultModeUnion, TMoreOptions extends AnyObject = object> = InterceptorsOrInterceptorsArray<TData, TErrorData> & RetryOptions<TErrorData> & TMoreOptions & {
240
243
  /**
241
244
  * @description Authorization header value.
242
245
  */
@@ -266,11 +269,9 @@ type ExtraOptions<TData = unknown, TErrorData = unknown, TResultMode extends Cal
266
269
  dedupeKey?: string;
267
270
  /**
268
271
  * @description Defines the deduplication strategy for the request, can be set to "none" | "defer" | "cancel".
269
- * - If set to "none", deduplication is disabled.
270
- *
271
- * - If set to "cancel"(default), the previous pending request with the same request key will be cancelled and lets the new request through.
272
- *
272
+ * - If set to "cancel", the previous pending request with the same request key will be cancelled and lets the new request through.
273
273
  * - If set to "defer", all new request with the same request key will be share the same response, until the previous one is completed.
274
+ * - If set to "none", deduplication is disabled.
274
275
  * @default "cancel"
275
276
  */
276
277
  dedupeStrategy?: "cancel" | "defer" | "none";
@@ -298,7 +299,7 @@ type ExtraOptions<TData = unknown, TErrorData = unknown, TResultMode extends Cal
298
299
  * @description - Controls what order in which the merged hooks execute
299
300
  * @default "mainHooksLast"
300
301
  */
301
- mergedHooksExecutionOrder?: "mainHooksFirst" | "mainHooksLast";
302
+ mergedHooksExecutionOrder?: "mainHooksAfterPlugins" | "mainHooksBeforePlugins";
302
303
  /**
303
304
  * @description - An optional field you can fill with additional information,
304
305
  * to associate with the request, typically used for logging or tracing.
@@ -322,7 +323,7 @@ type ExtraOptions<TData = unknown, TErrorData = unknown, TResultMode extends Cal
322
323
  * });
323
324
  * ```
324
325
  */
325
- meta?: R_Meta;
326
+ meta?: Meta;
326
327
  /**
327
328
  * @description Params to be appended to the URL (i.e: /:id)
328
329
  */
@@ -370,23 +371,19 @@ type ExtraOptions<TData = unknown, TErrorData = unknown, TResultMode extends Cal
370
371
  */
371
372
  timeout?: number;
372
373
  };
373
- declare const optionsEnumToOmitFromBase: ["extend", "dedupeKey"];
374
- interface BaseCallApiExtraOptions<TBaseData = unknown, TBaseErrorData = unknown, TBaseResultMode extends CallApiResultModeUnion = CallApiResultModeUnion> extends Omit<CallApiExtraOptions<TBaseData, TBaseErrorData, TBaseResultMode>, typeof optionsEnumToOmitFromBase[number]> {
375
- }
376
374
  declare const optionsEnumToExtendFromBase: "plugins"[];
377
- interface CallApiExtraOptions<TData = unknown, TErrorData = unknown, TResultMode extends CallApiResultModeUnion = CallApiResultModeUnion> extends Omit<ExtraOptions<TData, TErrorData, TResultMode>, never> {
375
+ type CallApiExtraOptions<TData = unknown, TErrorData = unknown, TResultMode extends CallApiResultModeUnion = CallApiResultModeUnion, TMoreOptions extends AnyObject = object> = ExtraOptions<TData, TErrorData, TResultMode, TMoreOptions> & {
378
376
  /**
379
377
  * @description Options that should extend the base options.
380
378
  */
381
- extend?: Pick<ExtraOptions<TData, TErrorData, TResultMode>, typeof optionsEnumToExtendFromBase[number]>;
382
- }
383
- interface CombinedCallApiExtraOptions<TData = unknown, TErrorData = unknown, TResultMode extends CallApiResultModeUnion = CallApiResultModeUnion> extends BaseCallApiExtraOptions<TData, TErrorData, TResultMode>, CallApiExtraOptions<TData, TErrorData, TResultMode> {
384
- }
385
- interface BaseCallApiConfig<TBaseData = unknown, TBaseErrorData = unknown, TBaseResultMode extends CallApiResultModeUnion = CallApiResultModeUnion> extends CallApiRequestOptions, BaseCallApiExtraOptions<TBaseData, TBaseErrorData, TBaseResultMode> {
386
- }
387
- interface CallApiConfig<TData = unknown, TErrorData = unknown, TResultMode extends CallApiResultModeUnion = CallApiResultModeUnion> extends CallApiRequestOptions, CallApiExtraOptions<TData, TErrorData, TResultMode> {
388
- }
389
- type CallApiParameters<TData = unknown, TErrorData = unknown, TResultMode extends CallApiResultModeUnion = CallApiResultModeUnion> = [initURL: string, config?: CallApiConfig<TData, TErrorData, TResultMode>];
379
+ extend?: Pick<ExtraOptions<TData, TErrorData, TResultMode, TMoreOptions>, (typeof optionsEnumToExtendFromBase)[number]>;
380
+ };
381
+ declare const optionsEnumToOmitFromBase: ("dedupeKey" | "extend")[];
382
+ type BaseCallApiExtraOptions<TBaseData = unknown, TBaseErrorData = unknown, TBaseResultMode extends CallApiResultModeUnion = CallApiResultModeUnion, TMoreOptions extends AnyObject = object> = Omit<CallApiExtraOptions<TBaseData, TBaseErrorData, TBaseResultMode, TMoreOptions>, (typeof optionsEnumToOmitFromBase)[number]>;
383
+ type CombinedCallApiExtraOptions<TData = unknown, TErrorData = unknown, TResultMode extends CallApiResultModeUnion = CallApiResultModeUnion, TMoreOptions extends AnyObject = object> = BaseCallApiExtraOptions<TData, TErrorData, TResultMode, TMoreOptions> & CallApiExtraOptions<TData, TErrorData, TResultMode, TMoreOptions>;
384
+ type CallApiConfig<TData = unknown, TErrorData = unknown, TResultMode extends CallApiResultModeUnion = CallApiResultModeUnion, TMoreOptions extends AnyObject = object> = CallApiExtraOptions<TData, TErrorData, TResultMode, TMoreOptions> & CallApiRequestOptions;
385
+ type BaseCallApiConfig<TBaseData = unknown, TBaseErrorData = unknown, TBaseResultMode extends CallApiResultModeUnion = CallApiResultModeUnion, TBaseMoreOptions extends AnyObject = object> = BaseCallApiExtraOptions<TBaseData, TBaseErrorData, TBaseResultMode, TBaseMoreOptions> & CallApiRequestOptions;
386
+ type CallApiParameters<TData = unknown, TErrorData = unknown, TResultMode extends CallApiResultModeUnion = CallApiResultModeUnion, TMoreOptions extends AnyObject = object> = [initURL: string, config?: CallApiConfig<TData, TErrorData, TResultMode, TMoreOptions>];
390
387
  type RequestContext = UnmaskType<{
391
388
  options: CombinedCallApiExtraOptions;
392
389
  request: CallApiRequestOptionsForHooks;
@@ -410,6 +407,17 @@ type SuccessContext<TData> = UnmaskType<{
410
407
  request: CallApiRequestOptionsForHooks;
411
408
  response: Response;
412
409
  }>;
410
+ type PossibleJavascriptErrorNames = "AbortError" | "Error" | "SyntaxError" | "TimeoutError" | "TypeError" | (`${string}Error` & {});
411
+ type PossibleJavaScriptError = UnmaskType<{
412
+ errorData: DOMException | Error | SyntaxError | TypeError;
413
+ message: string;
414
+ name: PossibleJavascriptErrorNames;
415
+ }>;
416
+ type PossibleHTTPError<TErrorData> = UnmaskType<{
417
+ errorData: TErrorData;
418
+ message: string;
419
+ name: "HTTPError";
420
+ }>;
413
421
  type RequestErrorContext = UnmaskType<{
414
422
  error: PossibleJavaScriptError;
415
423
  options: CombinedCallApiExtraOptions;
@@ -432,18 +440,6 @@ type ErrorContext<TErrorData> = UnmaskType<{
432
440
  request: CallApiRequestOptionsForHooks;
433
441
  response: null;
434
442
  }>;
435
- type PossibleJavascriptErrorNames = "AbortError" | "Error" | "SyntaxError" | "TimeoutError" | "TypeError" | (`${string}Error` & {});
436
- type PossibleJavaScriptError = UnmaskType<{
437
- errorData: DOMException | Error | SyntaxError | TypeError;
438
- message: string;
439
- name: PossibleJavascriptErrorNames;
440
- }>;
441
- type PossibleHTTPError<TErrorData> = UnmaskType<{
442
- errorData: TErrorData;
443
- message: string;
444
- name: "HTTPError";
445
- }>;
446
- type ErrorObjectUnion<TErrorData = unknown> = PossibleHTTPError<TErrorData> | PossibleJavaScriptError;
447
443
  type CallApiResultSuccessVariant<TData> = {
448
444
  data: TData;
449
445
  error: null;
@@ -1 +1 @@
1
- "use strict";var e,r=Object.defineProperty,t=Object.getOwnPropertyDescriptor,o=Object.getOwnPropertyNames,s=Object.prototype.hasOwnProperty,n={};((e,t)=>{for(var o in t)r(e,o,{get:t[o],enumerable:!0})})(n,{callApi:()=>H,createFetchClient:()=>A,definePlugin:()=>k}),module.exports=(e=n,((e,n,a,i)=>{if(n&&"object"==typeof n||"function"==typeof n)for(let l of o(n))s.call(e,l)||l===a||r(e,l,{get:()=>n[l],enumerable:!(i=t(n,l))||i.enumerable});return e})(r({},"__esModule",{value:!0}),e));var a=e=>Array.isArray(e),i=e=>{if(!(e=>"object"==typeof e&&null!==e)(e))return!1;const r=Object.getPrototypeOf(e);return(null==r||r===Object.prototype||null===Object.getPrototypeOf(r))&&!(Symbol.toStringTag in e)},l=e=>"function"==typeof e,u=e=>"string"==typeof e,c=e=>l(e)?e():e,p=e=>{if(void 0!==e){if(u(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}`}}}}},d=["extend","dedupeKey"],y=["body","integrity","method","headers","signal","cache","redirect","window","credentials","keepalive","referrer","priority","mode","referrerPolicy"],f={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"},m=["GET"],g=Object.keys(f).map(Number),w=(e,r)=>{const t={},o=new Set(r);for(const[r,s]of Object.entries(e))o.has(r)||(t[r]=s);return t},h=(e,r)=>{const t={},o=new Set(r);for(const[r,s]of Object.entries(e))o.has(r)&&(t[r]=s);return t},b=e=>!e||i(e)?e:Object.fromEntries(e),E=e=>{const{auth:r,baseHeaders:t,body:o,headers:s}=e;if(!Boolean(t||s||o||r))return;const n={...p(r),...b(t),...b(s)};return u(a=o)&&a.includes("=")?(n["Content-Type"]="application/x-www-form-urlencoded",n):((i(o)||u(o)&&o.startsWith("{"))&&(n["Content-Type"]="application/json",n.Accept="application/json"),n);var a},R=(...e)=>Promise.all(e),O=async(e,r,t,o)=>{const s=((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(s,r))throw new Error(`Invalid response type: ${r}`);const n=await s[r]();return o?o(n):n},S=e=>{const{defaultErrorMessage:r,error:t,message:o,resultMode:s}=e;let n={data:null,error:{errorData:t,message:o??t.message,name:t.name},response:null};if(v(t)){const{errorData:e,message:o=r,name:s,response:a}=t;n={data:null,error:{errorData:e,message:o,name:s},response:a}}return{apiDetails:n,generalErrorResult:{all:n,onlyError:n.error,onlyResponse:n.response,onlySuccess:n.data,onlySuccessWithException:n.data}[s??"all"],resolveCustomErrorInfo:({message:r})=>S({...e,message:r}).generalErrorResult}},q=class extends Error{errorData;isHTTPError=!0;name="HTTPError";response;constructor(e,r){const{defaultErrorMessage:t,errorData:o,response:s}=e;super(o?.message??t,r),this.errorData=o,this.response=s,Error.captureStackTrace(this,this.constructor)}},v=e=>e instanceof q||i(e)&&"HTTPError"===e.name&&!0===e.isHTTPError,T=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},M=(e,r,t,o)=>{const s=(e=>{if(e)return e;if("undefined"!=typeof globalThis&&l(globalThis.fetch))return globalThis.fetch;throw new Error("No fetch implementation found")})(r.customFetchImpl);return o&&"defer"===r.dedupeStrategy?o.responsePromise:s(e,t)},j=(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))},$={onError:new Set,onRequest:new Set,onRequestError:new Set,onResponse:new Set,onResponseError:new Set,onRetry:new Set,onSuccess:new Set},k=e=>e,D=(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.retryCodes?.includes(r.response.status)&&n&&s}}},x=(e,r)=>{if(!r)return e;const t=(o=r)?new URLSearchParams(o).toString():(console.error("toQueryString:","No query params provided!"),null);var o;return 0===t?.length?e:e.endsWith("?")?`${e}${t}`:e.includes("?")?`${e}&${t}`:`${e}?${t}`},P=(e,r,t)=>{const o=((e,r)=>{if(!r)return e;let t=e;if(a(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 x(o,t)},A=(e={})=>{const[r,t]=(e=>[h(e,y),w(e,[...y,...d])])(e),{body:o,headers:s,signal:n,...c}=r,p=new Map,f=async(...e)=>{const[r,d]=e,[b,k]=(e=>[h(e,y),w(e,y)])(d??{}),{body:x=o,headers:A,signal:H=n,...C}=b,L={};for(const e of Object.keys($)){const r=(U=t[e],B=k[e],a(U)?[U,B].flat():B??U);L[e]=r}var U,B;const z={baseURL:"",bodySerializer:JSON.stringify,dedupeStrategy:"cancel",defaultErrorMessage:"Failed to fetch data from server!",mergedHooksExecutionMode:"parallel",mergedHooksExecutionOrder:"mainHooksLast",responseType:"json",resultMode:"all",retryAttempts:0,retryCodes:g,retryDelay:1e3,retryMaxDelay:1e4,retryMethods:m,retryStrategy:"linear",...t,...k,...L},{resolvedHooks:N,resolvedOptions:I,resolvedRequestOptions:W,url:F}=await(async e=>{const{initURL:r,options:t,request:o}=e,s=structuredClone($),n=()=>{for(const e of Object.keys($)){const r=t[e];s[e].add(r)}},a=e=>{for(const r of Object.keys($)){const t=e[r];s[r].add(t)}};"mainHooksFirst"===t.mergedHooksExecutionOrder&&n();const c=e=>e?l(e)?e({initURL:r,options:t,request:o}):e:[],p=[...c(t.plugins),...c(t.extend?.plugins)];let d=r,y=t,f=o;const m=async e=>{if(!e)return;const s=await e({initURL:r,options:t,request:o});i(s)&&(u(s.url)&&(d=s.url),i(s.request)&&(f=s.request),i(s.options)&&(y=s.options))};for(const e of p)await m(e.init),e.hooks&&a(e.hooks);t.mergedHooksExecutionOrder&&"mainHooksLast"!==t.mergedHooksExecutionOrder||n();const g={};for(const[e,r]of Object.entries(s)){const o=[...r].flat(),s=j(o,t.mergedHooksExecutionMode);g[e]=s}return{resolvedHooks:g,resolvedOptions:y,resolvedRequestOptions:f,url:d}})({initURL:r,options:z,request:{...c,...C}}),G=`${I.baseURL}${P(F,I.params,I.query)}`,K={...I,...N,fullURL:G,initURL:r},J={body:i(x)?K.bodySerializer(x):x,method:"GET",...W},V=new AbortController,_=null!=K.timeout?(Q=K.timeout,AbortSignal.timeout(Q)):null;var Q;const X=((...e)=>AbortSignal.any(e.filter(Boolean)))(V.signal,_,H),Y={...J,signal:X},Z=K.dedupeKey??((e,r,t)=>"cancel"===t.dedupeStrategy||"defer"===t.dedupeStrategy?`${t.fullURL}-${JSON.stringify({options:t,request:r})}`:null)(0,Y,K);null!==Z&&await T(.1);const ee=null!==Z?p:null,re=ee?.get(Z);((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)}})(0,K,re);try{await R(K.onRequest({options:K,request:Y})),Y.headers=E({auth:K.auth,baseHeaders:s??A,body:x,headers:Y.headers});const e=M(G,K,Y,re);ee?.set(Z,{controller:V,responsePromise:e});const r=await e,t="defer"===K.dedupeStrategy||K.cloneResponse;if(!r.ok){const e=await O(t?r.clone():r,K.responseType,K.responseParser,K.responseErrorValidator);throw new q({defaultErrorMessage:K.defaultErrorMessage,errorData:e,response:r})}const o=await O(t?r.clone():r,K.responseType,K.responseParser,K.responseValidator);return await R(K.onSuccess({data:o,options:K,request:Y,response:K.cloneResponse?r.clone():r}),K.onResponse({data:o,error:null,options:K,request:Y,response:K.cloneResponse?r.clone():r})),await(e=>{const{data:r,response:t,resultMode:o}=e,s={data:r,error:null,response:t};return o?{all:s,onlyError:s.error,onlyResponse:s.response,onlySuccess:s.data,onlySuccessWithException:s.data}[o]:s})({data:o,response:r,resultMode:K.resultMode})}catch(e){const{apiDetails:t,generalErrorResult:o,resolveCustomErrorInfo:s}=S({defaultErrorMessage:K.defaultErrorMessage,error:e,resultMode:K.resultMode}),n={error:t.error,options:K,request:Y,response:t.response},{getDelay:a,shouldAttemptRetry:i}=D(K,n);if(!X.aborted&&await i()){await R(K.onRetry(n));const e=a();return await T(e),await f(r,{...d,retryCount:(K.retryCount??0)+1})}const u=l(K.throwOnError)?K.throwOnError(n):K.throwOnError,c=()=>{if(u)throw t.error};if(v(e)){const{response:r}=e,t=o.error;return await R(K.onResponseError({error:t,options:K,request:Y,response:K.cloneResponse?r.clone():r}),K.onError({error:t,options:K,request:Y,response:K.cloneResponse?r.clone():r}),K.onResponse({data:null,error:t,options:K,request:Y,response:K.cloneResponse?r.clone():r})),c(),o}if(e instanceof DOMException&&"AbortError"===e.name){const{message:r,name:t}=e;return console.error(`${t}:`,r),c(),o}if(e instanceof DOMException&&"TimeoutError"===e.name){const r=`Request timed out after ${K.timeout}ms`;return console.error(`${e.name}:`,r),c(),s({message:r})}const p=o.error;return await R(K.onRequestError({error:p,options:K,request:Y}),K.onError({error:p,options:K,request:Y,response:null})),c(),o}finally{ee?.delete(Z)}};return f.create=A,f},H=A();//# sourceMappingURL=index.cjs.map
1
+ "use strict";var e,r=Object.defineProperty,t=Object.getOwnPropertyDescriptor,o=Object.getOwnPropertyNames,s=Object.prototype.hasOwnProperty,n={};((e,t)=>{for(var o in t)r(e,o,{get:t[o],enumerable:!0})})(n,{callApi:()=>H,createFetchClient:()=>A,definePlugin:()=>$}),module.exports=(e=n,((e,n,a,i)=>{if(n&&"object"==typeof n||"function"==typeof n)for(let l of o(n))s.call(e,l)||l===a||r(e,l,{get:()=>n[l],enumerable:!(i=t(n,l))||i.enumerable});return e})(r({},"__esModule",{value:!0}),e));var a=e=>Array.isArray(e),i=e=>{if(!(e=>"object"==typeof e&&null!==e)(e))return!1;const r=Object.getPrototypeOf(e);return(null==r||r===Object.prototype||null===Object.getPrototypeOf(r))&&!(Symbol.toStringTag in e)},l=e=>"function"==typeof e,u=e=>"string"==typeof e,c=e=>l(e)?e():e,p=e=>{if(void 0!==e){if(u(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}`}}}}},d=["extend","dedupeKey"],f=["body","integrity","method","headers","signal","cache","redirect","window","credentials","keepalive","referrer","priority","mode","referrerPolicy"],y={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"},m=["GET","POST"],g=Object.keys(y).map(Number),w=(e,r)=>{const t={},o=new Set(r);for(const[r,s]of Object.entries(e))o.has(r)||(t[r]=s);return t},h=(e,r)=>{const t={},o=new Set(r);for(const[r,s]of Object.entries(e))o.has(r)&&(t[r]=s);return t},b=e=>!e||i(e)?e:Object.fromEntries(e),E=e=>{const{auth:r,baseHeaders:t,body:o,headers:s}=e;if(!Boolean(t||s||o||r))return;const n={...p(r),...b(t),...b(s)};return u(a=o)&&a.includes("=")?(n["Content-Type"]="application/x-www-form-urlencoded",n):((i(o)||u(o)&&o.startsWith("{"))&&(n["Content-Type"]="application/json",n.Accept="application/json"),n);var a},S=(...e)=>Promise.all(e),O=async(e,r,t,o)=>{const s=((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(s,r))throw new Error(`Invalid response type: ${r}`);const n=await s[r]();return o?o(n):n},R=e=>{const{defaultErrorMessage:r,error:t,message:o,resultMode:s}=e;let n={data:null,error:{errorData:t,message:o??t.message,name:t.name},response:null};if(v(t)){const{errorData:e,message:o=r,name:s,response:a}=t;n={data:null,error:{errorData:e,message:o,name:s},response:a}}return{apiDetails:n,generalErrorResult:{all:n,onlyError:n.error,onlyResponse:n.response,onlySuccess:n.data,onlySuccessWithException:n.data}[s??"all"],resolveCustomErrorInfo:({message:r})=>R({...e,message:r}).generalErrorResult}},q=class extends Error{errorData;isHTTPError=!0;name="HTTPError";response;constructor(e,r){const{defaultErrorMessage:t,errorData:o,response:s}=e;super(o?.message??t,r),this.errorData=o,this.response=s,Error.captureStackTrace(this,this.constructor)}},v=e=>e instanceof q||i(e)&&"HTTPError"===e.name&&!0===e.isHTTPError,T=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},M=(e,r,t,o)=>{const s=(e=>{if(e)return e;if("undefined"!=typeof globalThis&&l(globalThis.fetch))return globalThis.fetch;throw new Error("No fetch implementation found")})(r.customFetchImpl);return o&&"defer"===r.dedupeStrategy?o.responsePromise:s(e,t)},j=(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))},P={onError:new Set,onRequest:new Set,onRequestError:new Set,onResponse:new Set,onResponseError:new Set,onRetry:new Set,onSuccess:new Set},$=e=>e,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}}},D=(e,r)=>{if(!r)return e;const t=(o=r)?new URLSearchParams(o).toString():(console.error("toQueryString:","No query params provided!"),null);var o;return 0===t?.length?e:e.endsWith("?")?`${e}${t}`:e.includes("?")?`${e}&${t}`:`${e}?${t}`},x=(e,r,t)=>{const o=((e,r)=>{if(!r)return e;let t=e;if(a(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 D(o,t)},A=(e={})=>{const[r,t]=(e=>[h(e,f),w(e,[...f,...d])])(e),{body:o,headers:s,signal:n,...c}=r,p=new Map,y=async(...e)=>{const[r,d]=e,[b,$]=(e=>[h(e,f),w(e,f)])(d??{}),{body:D=o,headers:A,signal:H=n,...C}=b,U={};for(const e of Object.keys(P)){const r=(L=t[e],B=$[e],a(L)?[L,B].flat():B??L);U[e]=r}var L,B;const z={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:m,retryStatusCodes:g,retryStrategy:"linear",...t,...$,...U},{resolvedHooks:N,resolvedOptions:I,resolvedRequestOptions:W,url:G}=await(async e=>{const{initURL:r,options:t,request:o}=e,s=structuredClone(P),n=()=>{for(const e of Object.keys(P)){const r=t[e];s[e].add(r)}},a=e=>{for(const r of Object.keys(P)){const t=e[r];s[r].add(t)}};"mainHooksBeforePlugins"===t.mergedHooksExecutionOrder&&n();const c=e=>e?l(e)?e({initURL:r,options:t,request:o}):e:[],p=[...c(t.plugins),...c(t.extend?.plugins)];let d=r,f=t,y=o;const m=async e=>{if(!e)return;const s=await e({initURL:r,options:t,request:o});i(s)&&(u(s.url)&&(d=s.url),i(s.request)&&(y=s.request),i(s.options)&&(f=s.options))};for(const e of p)await m(e.init),e.hooks&&a(e.hooks);t.mergedHooksExecutionOrder&&"mainHooksAfterPlugins"!==t.mergedHooksExecutionOrder||n();const g={};for(const[e,r]of Object.entries(s)){const o=[...r].flat(),s=j(o,t.mergedHooksExecutionMode);g[e]=s}return{resolvedHooks:g,resolvedOptions:f,resolvedRequestOptions:y,url:d}})({initURL:r,options:z,request:{...c,...C}}),K=`${I.baseURL}${x(G,I.params,I.query)}`,F={...I,...N,fullURL:K,initURL:r},J={body:i(D)?F.bodySerializer(D):D,method:"GET",...W},V=new AbortController,_=null!=F.timeout?(Q=F.timeout,AbortSignal.timeout(Q)):null;var Q;const X=((...e)=>AbortSignal.any(e.filter(Boolean)))(V.signal,_,H),Y={...J,signal:X},Z=F.dedupeKey??((e,r,t)=>"cancel"===t.dedupeStrategy||"defer"===t.dedupeStrategy?`${t.fullURL}-${JSON.stringify({options:t,request:r})}`:null)(0,Y,F);null!==Z&&await T(.1);const ee=null!==Z?p:null,re=ee?.get(Z);((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)}})(0,F,re);try{await S(F.onRequest({options:F,request:Y})),Y.headers=E({auth:F.auth,baseHeaders:s??A,body:D,headers:Y.headers});const e=M(K,F,Y,re);ee?.set(Z,{controller:V,responsePromise:e});const r=await e,t="defer"===F.dedupeStrategy||F.cloneResponse;if(!r.ok){const e=await O(t?r.clone():r,F.responseType,F.responseParser,F.responseErrorValidator);throw new q({defaultErrorMessage:F.defaultErrorMessage,errorData:e,response:r})}const o=await O(t?r.clone():r,F.responseType,F.responseParser,F.responseValidator);return await S(F.onSuccess({data:o,options:F,request:Y,response:F.cloneResponse?r.clone():r}),F.onResponse({data:o,error:null,options:F,request:Y,response:F.cloneResponse?r.clone():r})),await(e=>{const{data:r,response:t,resultMode:o}=e,s={data:r,error:null,response:t};return o?{all:s,onlyError:s.error,onlyResponse:s.response,onlySuccess:s.data,onlySuccessWithException:s.data}[o]:s})({data:o,response:r,resultMode:F.resultMode})}catch(e){const{apiDetails:t,generalErrorResult:o,resolveCustomErrorInfo:s}=R({defaultErrorMessage:F.defaultErrorMessage,error:e,resultMode:F.resultMode}),n={error:t.error,options:F,request:Y,response:t.response},{getDelay:a,shouldAttemptRetry:i}=k(F,n);if(!X.aborted&&await i()){await S(F.onRetry(n));const e=a();return await T(e),await y(r,{...d,retryCount:(F.retryCount??0)+1})}const u=l(F.throwOnError)?F.throwOnError(n):F.throwOnError,c=()=>{if(u)throw t.error};if(v(e)){const{response:r}=e,t=o.error;return await S(F.onResponseError({error:t,options:F,request:Y,response:F.cloneResponse?r.clone():r}),F.onError({error:t,options:F,request:Y,response:F.cloneResponse?r.clone():r}),F.onResponse({data:null,error:t,options:F,request:Y,response:F.cloneResponse?r.clone():r})),c(),o}if(e instanceof DOMException&&"AbortError"===e.name){const{message:r,name:t}=e;return console.error(`${t}:`,r),c(),o}if(e instanceof DOMException&&"TimeoutError"===e.name){const r=`Request timed out after ${F.timeout}ms`;return console.error(`${e.name}:`,r),c(),s({message:r})}const p=o.error;return await S(F.onRequestError({error:p,options:F,request:Y}),F.onError({error:p,options:F,request:Y,response:null})),c(),o}finally{ee?.delete(Z)}};return y.create=A,y},H=A();//# sourceMappingURL=index.cjs.map