@rendomnet/apiservice 1.4.1 → 1.4.2

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/index.d.mts CHANGED
@@ -106,15 +106,6 @@ type TokenService$1 = {
106
106
  refresh?: (refreshToken: string, accountId?: string) => Promise<OAuthToken>;
107
107
  };
108
108
 
109
- declare class FetchError extends Error {
110
- name: string;
111
- status: number;
112
- code: string;
113
- message: string;
114
- data: any;
115
- constructor(response: Response, data?: any, code?: string);
116
- }
117
-
118
109
  /**
119
110
  * Handles caching of API responses
120
111
  */
@@ -288,6 +279,15 @@ declare class BasicAuthProvider implements AuthProvider {
288
279
  getAuthHeaders(): Promise<Record<string, string>>;
289
280
  }
290
281
 
282
+ declare class FetchError extends Error {
283
+ name: string;
284
+ status: number;
285
+ code: string;
286
+ message: string;
287
+ data: any;
288
+ constructor(response: Response, data?: any, code?: string);
289
+ }
290
+
291
291
  /**
292
292
  * ApiService - Core API service for making authenticated API calls
293
293
  * with caching, retry, and hook support.
@@ -299,19 +299,20 @@ declare class ApiService {
299
299
  private cacheManager;
300
300
  private retryManager;
301
301
  private hookManager;
302
- private httpClient;
302
+ protected httpClient: HttpClient;
303
303
  private accountManager;
304
304
  private maxAttempts;
305
305
  constructor();
306
306
  /**
307
307
  * Setup the API service
308
308
  */
309
- setup({ provider, authProvider, hooks, cacheTime, baseUrl, }: {
309
+ setup({ provider, authProvider, hooks, cacheTime, baseUrl, httpClient, }: {
310
310
  provider: string;
311
311
  authProvider: AuthProvider;
312
312
  hooks?: Record<StatusCode, HookSettings | null>;
313
313
  cacheTime: number;
314
314
  baseUrl?: string;
315
+ httpClient?: HttpClient;
315
316
  }): void;
316
317
  /**
317
318
  * Create a default handler for 401 (Unauthorized) errors
@@ -355,4 +356,4 @@ declare class ApiService {
355
356
  clearCache(): void;
356
357
  }
357
358
 
358
- export { type AccountData, AccountManager, type ApiCallParams, ApiKeyAuthProvider, type ApiKeyAuthProviderOptions, type AuthProvider, BasicAuthProvider, type BasicAuthProviderOptions, CacheManager, type DelayStrategy, FetchError, HookManager, type HookSettings, HttpClient, type OAuthToken, RetryManager, type StatusCode, type Token, TokenAuthProvider, type TokenService$1 as TokenService, ApiService as default };
359
+ export { type AccountData, AccountManager, type ApiCallParams, ApiKeyAuthProvider, type ApiKeyAuthProviderOptions, ApiService, type AuthProvider, BasicAuthProvider, type BasicAuthProviderOptions, CacheManager, type DelayStrategy, FetchError, HookManager, type HookSettings, HttpClient, type OAuthToken, RetryManager, type StatusCode, type Token, TokenAuthProvider, type TokenService$1 as TokenService, ApiService as default };
package/dist/index.d.ts CHANGED
@@ -106,15 +106,6 @@ type TokenService$1 = {
106
106
  refresh?: (refreshToken: string, accountId?: string) => Promise<OAuthToken>;
107
107
  };
108
108
 
109
- declare class FetchError extends Error {
110
- name: string;
111
- status: number;
112
- code: string;
113
- message: string;
114
- data: any;
115
- constructor(response: Response, data?: any, code?: string);
116
- }
117
-
118
109
  /**
119
110
  * Handles caching of API responses
120
111
  */
@@ -288,6 +279,15 @@ declare class BasicAuthProvider implements AuthProvider {
288
279
  getAuthHeaders(): Promise<Record<string, string>>;
289
280
  }
290
281
 
282
+ declare class FetchError extends Error {
283
+ name: string;
284
+ status: number;
285
+ code: string;
286
+ message: string;
287
+ data: any;
288
+ constructor(response: Response, data?: any, code?: string);
289
+ }
290
+
291
291
  /**
292
292
  * ApiService - Core API service for making authenticated API calls
293
293
  * with caching, retry, and hook support.
@@ -299,19 +299,20 @@ declare class ApiService {
299
299
  private cacheManager;
300
300
  private retryManager;
301
301
  private hookManager;
302
- private httpClient;
302
+ protected httpClient: HttpClient;
303
303
  private accountManager;
304
304
  private maxAttempts;
305
305
  constructor();
306
306
  /**
307
307
  * Setup the API service
308
308
  */
309
- setup({ provider, authProvider, hooks, cacheTime, baseUrl, }: {
309
+ setup({ provider, authProvider, hooks, cacheTime, baseUrl, httpClient, }: {
310
310
  provider: string;
311
311
  authProvider: AuthProvider;
312
312
  hooks?: Record<StatusCode, HookSettings | null>;
313
313
  cacheTime: number;
314
314
  baseUrl?: string;
315
+ httpClient?: HttpClient;
315
316
  }): void;
316
317
  /**
317
318
  * Create a default handler for 401 (Unauthorized) errors
@@ -355,4 +356,4 @@ declare class ApiService {
355
356
  clearCache(): void;
356
357
  }
357
358
 
358
- export { type AccountData, AccountManager, type ApiCallParams, ApiKeyAuthProvider, type ApiKeyAuthProviderOptions, type AuthProvider, BasicAuthProvider, type BasicAuthProviderOptions, CacheManager, type DelayStrategy, FetchError, HookManager, type HookSettings, HttpClient, type OAuthToken, RetryManager, type StatusCode, type Token, TokenAuthProvider, type TokenService$1 as TokenService, ApiService as default };
359
+ export { type AccountData, AccountManager, type ApiCallParams, ApiKeyAuthProvider, type ApiKeyAuthProviderOptions, ApiService, type AuthProvider, BasicAuthProvider, type BasicAuthProviderOptions, CacheManager, type DelayStrategy, FetchError, HookManager, type HookSettings, HttpClient, type OAuthToken, RetryManager, type StatusCode, type Token, TokenAuthProvider, type TokenService$1 as TokenService, ApiService as default };
package/dist/index.js CHANGED
@@ -32,6 +32,7 @@ var index_exports = {};
32
32
  __export(index_exports, {
33
33
  AccountManager: () => AccountManager,
34
34
  ApiKeyAuthProvider: () => ApiKeyAuthProvider,
35
+ ApiService: () => ApiService,
35
36
  BasicAuthProvider: () => BasicAuthProvider,
36
37
  CacheManager: () => CacheManager,
37
38
  FetchError: () => FetchError,
@@ -554,11 +555,15 @@ var ApiService = class {
554
555
  authProvider,
555
556
  hooks = {},
556
557
  cacheTime,
557
- baseUrl = ""
558
+ baseUrl = "",
559
+ httpClient
558
560
  }) {
559
561
  this.provider = provider;
560
562
  this.authProvider = authProvider;
561
563
  this.baseUrl = baseUrl;
564
+ if (httpClient) {
565
+ this.httpClient = httpClient;
566
+ }
562
567
  const finalHooks = {};
563
568
  if (hooks[401] === void 0 && typeof this.authProvider.refresh === "function") {
564
569
  finalHooks[401] = this.createDefaultAuthRefreshHandler();
@@ -730,6 +735,7 @@ var index_default = ApiService;
730
735
  0 && (module.exports = {
731
736
  AccountManager,
732
737
  ApiKeyAuthProvider,
738
+ ApiService,
733
739
  BasicAuthProvider,
734
740
  CacheManager,
735
741
  FetchError,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/ApiKeyAuthProvider.ts","../src/CacheManager.ts","../src/RetryManager.ts","../src/HookManager.ts","../src/HttpClient.ts","../src/FetchError.ts","../src/form.ts","../src/AccountManager.ts","../src/TokenAuthProvider.ts","../src/BasicAuthProvider.ts"],"sourcesContent":["import { \n AuthProvider,\n ApiCallParams,\n HookSettings,\n StatusCode,\n Token,\n OAuthToken\n} from './types';\nimport { ApiKeyAuthProvider } from './ApiKeyAuthProvider';\nimport {\n CacheManager,\n RetryManager,\n HookManager,\n HttpClient,\n AccountManager\n} from './components';\n\n/**\n * ApiService - Core API service for making authenticated API calls\n * with caching, retry, and hook support.\n */\nclass ApiService {\n public provider: string; // Service provider name\n private authProvider: AuthProvider;\n private baseUrl: string = ''; // Default base URL\n \n // Component managers\n private cacheManager: CacheManager;\n private retryManager: RetryManager;\n private hookManager: HookManager;\n private httpClient: HttpClient;\n private accountManager: AccountManager;\n \n // Default max attempts for API calls\n private maxAttempts = 10;\n\n constructor() {\n this.provider = '';\n this.authProvider = {} as AuthProvider;\n \n // Initialize component managers\n this.cacheManager = new CacheManager();\n this.retryManager = new RetryManager();\n this.hookManager = new HookManager();\n this.httpClient = new HttpClient();\n this.accountManager = new AccountManager();\n }\n\n /**\n * Setup the API service\n */\n public setup({\n provider,\n authProvider,\n hooks = {},\n cacheTime,\n baseUrl = '',\n }: {\n provider: string;\n authProvider: AuthProvider;\n hooks?: Record<StatusCode, HookSettings | null>;\n cacheTime: number;\n baseUrl?: string;\n }) {\n this.provider = provider;\n this.authProvider = authProvider;\n this.baseUrl = baseUrl;\n \n // Create a copy of hooks to avoid modifying the input\n const finalHooks: Record<StatusCode, HookSettings> = {};\n \n // Apply default 401 handler if:\n // 1. No 401 hook is explicitly defined (or is explicitly null)\n // 2. AuthProvider has a refresh method\n if (hooks[401] === undefined && typeof this.authProvider.refresh === 'function') {\n finalHooks[401] = this.createDefaultAuthRefreshHandler();\n }\n \n // Add user-defined hooks (skipping null/undefined values)\n for (const [statusCode, hook] of Object.entries(hooks)) {\n if (hook) {\n finalHooks[statusCode] = hook;\n }\n }\n \n // Set the hooks if we have any\n if (Object.keys(finalHooks).length > 0) {\n this.hookManager.setHooks(finalHooks);\n }\n \n if (typeof cacheTime !== 'undefined') {\n this.cacheManager.setCacheTime(cacheTime);\n }\n }\n \n /**\n * Create a default handler for 401 (Unauthorized) errors\n * that implements standard credential refresh behavior\n */\n private createDefaultAuthRefreshHandler(): HookSettings {\n return {\n shouldRetry: true,\n useRetryDelay: true,\n preventConcurrentCalls: true,\n maxRetries: 1,\n handler: async (accountId) => {\n try {\n console.log(`🔄 Using default auth refresh handler for ${accountId}`);\n if (!this.authProvider.refresh) {\n throw new Error('No refresh method available on auth provider');\n }\n // You may want to store refresh token in account data or pass it in another way\n // For now, assume refresh token is managed internally by the provider\n await this.authProvider.refresh(accountId);\n return {};\n } catch (error) {\n console.error(`Auth refresh failed for ${accountId}:`, error);\n throw error;\n }\n },\n onMaxRetriesExceeded: async (accountId, error) => {\n console.error(`Authentication failed after refresh attempt for ${accountId}:`, error);\n }\n };\n }\n \n /**\n * Set the maximum number of retry attempts\n */\n public setMaxAttempts(attempts: number): void {\n this.maxAttempts = attempts;\n }\n\n /**\n * Update account data\n */\n public updateAccountData(accountId: string, data: Partial<Record<string, any>>): void {\n this.accountManager.updateAccountData(accountId, data);\n }\n\n /**\n * Make an API call with all features (caching, retry, hooks)\n */\n public async call(apiCallParams: Omit<ApiCallParams, 'accountId'> & { accountId?: string; abortSignal?: AbortSignal }): Promise<any> {\n // Use 'default' as fallback if accountId is not provided\n // and use default baseUrl if not provided\n const params: ApiCallParams = {\n ...apiCallParams,\n accountId: apiCallParams.accountId || 'default',\n base: apiCallParams.base || this.baseUrl,\n };\n\n // If using ApiKeyAuthProvider with queryParamName, add API key to queryParams\n if (\n this.authProvider instanceof ApiKeyAuthProvider &&\n (this.authProvider as any).queryParamName\n ) {\n const queryParamName = (this.authProvider as any).queryParamName;\n const apiKey = (this.authProvider as any).apiKey;\n const urlParams = params.queryParams ? new URLSearchParams(params.queryParams) : new URLSearchParams();\n urlParams.set(queryParamName, apiKey);\n params.queryParams = urlParams;\n }\n\n console.log('🔄 API call', this.provider, params.accountId, params.method, params.route);\n \n // Check cache first\n const cachedData = this.cacheManager.getFromCache(params);\n if (cachedData) return cachedData;\n\n // Make the API call with retry capability\n const result = await this.makeRequestWithRetry(params);\n \n // Cache the result\n this.cacheManager.saveToCache(params, result);\n \n return result;\n }\n\n /**\n * Legacy method for backward compatibility\n * @deprecated Use call() instead\n */\n public async makeApiCall(apiCallParams: Omit<ApiCallParams, 'accountId'> & { accountId?: string; abortSignal?: AbortSignal }): Promise<any> {\n return this.call(apiCallParams);\n }\n\n /**\n * Make a request with retry capability\n */\n private async makeRequestWithRetry(apiCallParams: ApiCallParams): Promise<any> {\n const { accountId, abortSignal } = apiCallParams;\n let attempts = 0;\n const statusRetries: Record<StatusCode, number> = {};\n let currentParams = { ...apiCallParams };\n // If using ApiKeyAuthProvider with queryParamName, add API key to queryParams\n if (\n this.authProvider instanceof ApiKeyAuthProvider &&\n (this.authProvider as any).queryParamName\n ) {\n const queryParamName = (this.authProvider as any).queryParamName;\n const apiKey = (this.authProvider as any).apiKey;\n const urlParams = currentParams.queryParams ? new URLSearchParams(currentParams.queryParams) : new URLSearchParams();\n urlParams.set(queryParamName, apiKey);\n currentParams.queryParams = urlParams;\n }\n // Main retry loop\n while (attempts < this.maxAttempts) {\n if (abortSignal?.aborted) {\n throw new Error('Request aborted');\n }\n attempts++;\n \n try {\n // Get authentication headers if needed\n const authHeaders: Record<string, string> = apiCallParams.useAuth !== false\n ? await this.authProvider.getAuthHeaders(accountId)\n : {};\n // Merge auth headers into params.headers\n currentParams.headers = {\n ...(currentParams.headers || {}),\n ...authHeaders,\n };\n \n // Verify we have authentication if required\n if (\n apiCallParams.useAuth !== false &&\n Object.keys(authHeaders).length === 0 &&\n !(\n this.authProvider instanceof ApiKeyAuthProvider &&\n (this.authProvider as any).queryParamName\n )\n ) {\n throw new Error(`${this.provider} credentials not found for account ID ${accountId}`);\n }\n \n // Make the actual API call\n const response = await this.httpClient.makeRequest(currentParams, {});\n \n // Success - update account status and return result\n this.accountManager.setLastRequestFailed(accountId, false);\n return response;\n } \n catch (error: any) {\n const status = error?.status;\n \n // If no hook exists for this error, or we shouldn't retry, throw\n if (!this.hookManager.shouldRetry(status)) {\n throw error;\n }\n \n // Track retries for this status code\n statusRetries[status] = (statusRetries[status] || 0) + 1;\n const activeHook = this.hookManager.getHook(status);\n const maxRetries = activeHook?.maxRetries ?? this.retryManager.getDefaultMaxRetries();\n \n // Check if we've exceeded retries for this status\n if (statusRetries[status] > maxRetries) {\n await this.hookManager.handleRetryFailure(accountId, status, error);\n this.accountManager.setLastRequestFailed(accountId, true);\n throw error;\n }\n \n // Process the hook to get updated params\n try {\n const hookResult = await this.hookManager.processHook(accountId, status, error);\n if (hookResult) {\n currentParams = { ...currentParams, ...hookResult };\n }\n } \n catch (hookError) {\n this.accountManager.setLastRequestFailed(accountId, true);\n throw hookError;\n }\n \n // Wait before retrying if needed\n if (activeHook?.useRetryDelay) {\n await this.retryManager.calculateAndDelay({\n attempt: statusRetries[status],\n response: error.response,\n hook: activeHook,\n });\n }\n }\n }\n \n // If we've reached here, we've exceeded our maximum attempts\n this.accountManager.setLastRequestFailed(accountId, true);\n throw new Error(`Exceeded maximum attempts (${this.maxAttempts}) for API call to ${accountId}`);\n }\n\n /**\n * Set the cache time in milliseconds\n */\n public setCacheTime(milliseconds: number): void {\n this.cacheManager.setCacheTime(milliseconds);\n }\n\n /**\n * Clear the cache\n */\n public clearCache(): void {\n this.cacheManager.clearCache();\n }\n}\n\nexport * from './types';\nexport * from './FetchError';\nexport * from './components';\n\nexport default ApiService;\n","import { AuthProvider, ApiKeyAuthProviderOptions } from './types';\n\nexport class ApiKeyAuthProvider implements AuthProvider {\n private apiKey: string;\n private headerName?: string;\n private queryParamName?: string;\n\n constructor(options: ApiKeyAuthProviderOptions) {\n this.apiKey = options.apiKey;\n this.headerName = options.headerName;\n this.queryParamName = options.queryParamName;\n }\n\n async getAuthHeaders(): Promise<Record<string, string>> {\n if (this.headerName) {\n return { [this.headerName]: this.apiKey };\n }\n // If using query param, return empty headers (handled elsewhere)\n return {};\n }\n\n // For API key, refresh is not supported\n} ","import { ApiCallParams } from './types';\n\n/**\n * Handles caching of API responses\n */\nexport class CacheManager {\n private cache: Map<string, { data: any; timestamp: number }> = new Map();\n private cacheTime = 20000; // Default cache time of 20 seconds\n\n /**\n * Get data from cache if available and not expired\n */\n public getFromCache(apiCallParams: ApiCallParams): any {\n const requestKey = this.getRequestKey(apiCallParams);\n const currentCacheTime = apiCallParams.cacheTime ?? this.cacheTime;\n const cached = this.cache.get(requestKey);\n \n if (cached && (Date.now() - cached.timestamp < currentCacheTime)) {\n return cached.data;\n }\n \n return null;\n }\n\n /**\n * Save data to cache\n */\n public saveToCache(apiCallParams: ApiCallParams, data: any): void {\n const requestKey = this.getRequestKey(apiCallParams);\n this.cache.set(requestKey, { \n data, \n timestamp: Date.now() \n });\n }\n\n /**\n * Generate a unique key for caching based on request parameters\n */\n private getRequestKey(apiCallParams: ApiCallParams): string {\n const { accountId, method, route, base, queryParams, body, data } = apiCallParams;\n return JSON.stringify({\n accountId,\n method,\n route,\n base,\n queryParams,\n body: body || data,\n });\n }\n\n /**\n * Set the default cache time in milliseconds\n */\n public setCacheTime(milliseconds: number): void {\n this.cacheTime = milliseconds;\n }\n\n /**\n * Clear the entire cache\n */\n public clearCache(): void {\n this.cache.clear();\n }\n} ","import { DelayStrategy, HookSettings } from './types';\n\n/**\n * Handles retry logic and delay strategies for failed API calls\n */\nexport class RetryManager {\n private defaultMaxDelay = 60000; // Default max delay of 1 minute\n private defaultMaxRetries = 4;\n\n /**\n * Default exponential backoff strategy with full jitter\n */\n private defaultDelayStrategy: DelayStrategy = {\n calculate: (attempt: number, response?: any) => {\n // Check for Retry-After header\n const retryAfter = this.getRetryAfterValue(response);\n if (retryAfter) return retryAfter;\n \n // Exponential backoff with full jitter\n const baseDelay = 1000; // 1 second\n const exponentialDelay = baseDelay * Math.pow(2, attempt - 1);\n return Math.floor(Math.random() * exponentialDelay);\n },\n };\n\n /**\n * Calculate and wait for appropriate delay time before retry\n */\n public async calculateAndDelay(params: {\n attempt: number;\n response?: any;\n hook: HookSettings;\n }): Promise<void> {\n const { attempt, response, hook } = params;\n const delayStrategy = hook.delayStrategy || this.defaultDelayStrategy;\n const maxDelay = hook.maxDelay || this.defaultMaxDelay;\n\n const calculatedDelay = delayStrategy.calculate(attempt, response);\n const finalDelay = Math.min(calculatedDelay, maxDelay);\n\n console.log(`🔄 Waiting for ${finalDelay / 1000} seconds before retrying.`);\n await new Promise(resolve => setTimeout(resolve, finalDelay));\n }\n\n /**\n * Extract retry-after value from response\n */\n private getRetryAfterValue(response?: any): number | null {\n if (!response?.headers?.get) return null;\n \n const retryAfter = response.headers.get('Retry-After');\n if (!retryAfter) return null;\n \n // Handle numeric retry-after\n const parsedDelay = parseInt(retryAfter, 10);\n if (!isNaN(parsedDelay)) {\n return parsedDelay * 1000;\n }\n \n // Handle date retry-after\n const date = new Date(retryAfter).getTime();\n const now = Date.now();\n if (date > now) {\n return date - now;\n }\n \n return null;\n }\n \n /**\n * Get the default maximum number of retries\n */\n public getDefaultMaxRetries(): number {\n return this.defaultMaxRetries;\n }\n \n /**\n * Set the default maximum number of retries\n */\n public setDefaultMaxRetries(maxRetries: number): void {\n this.defaultMaxRetries = maxRetries;\n }\n \n /**\n * Set the default maximum delay between retries\n */\n public setDefaultMaxDelay(maxDelay: number): void {\n this.defaultMaxDelay = maxDelay;\n }\n} ","import { HookSettings, StatusCode } from './types';\n\n/**\n * Manages hooks for different status codes and their processing\n */\nexport class HookManager {\n private hooks: Record<StatusCode, HookSettings> = {};\n private hookPromises: Record<string, Promise<object>> = {};\n\n /**\n * Set hooks for different status codes\n */\n public setHooks(hooks: Record<StatusCode, HookSettings>): void {\n this.hooks = { ...this.hooks, ...hooks };\n }\n\n /**\n * Get a hook for a specific status code\n */\n public getHook(status: StatusCode): HookSettings | undefined {\n return this.hooks[status];\n }\n\n /**\n * Process a hook for a specific status code\n */\n public async processHook(\n accountId: string,\n status: StatusCode,\n error: any\n ): Promise<Record<string, any> | null> {\n const hook = this.hooks[status];\n if (!hook || !hook.handler) return null;\n \n const hookKey = `${accountId || 'default'}-${status}`;\n \n try {\n // Handle waiting for existing hook call if needed\n if (hook.preventConcurrentCalls) {\n if (!this.hookPromises[hookKey]) {\n this.hookPromises[hookKey] = Promise.resolve(\n hook.handler(accountId, error.response) || {}\n );\n }\n \n const result = await this.hookPromises[hookKey];\n delete this.hookPromises[hookKey];\n return result;\n } \n \n // Otherwise just call the hook directly\n return await hook.handler(accountId, error.response) || {};\n } \n catch (hookError) {\n console.error(`Hook handler failed for status ${status}:`, hookError);\n \n if (hook.onHandlerError) {\n await hook.onHandlerError(accountId, hookError);\n }\n \n throw hookError;\n }\n }\n\n /**\n * Handle a retry failure with the appropriate hook\n */\n public async handleRetryFailure(accountId: string, status: StatusCode, error: any): Promise<void> {\n const hook = this.hooks[status];\n if (hook?.onMaxRetriesExceeded) {\n await hook.onMaxRetriesExceeded(accountId, error);\n }\n }\n\n /**\n * Check if a hook exists and should retry for a given status\n */\n public shouldRetry(status: StatusCode): boolean {\n const hook = this.hooks[status];\n return !!hook && !!hook.shouldRetry;\n }\n} ","import qs from 'qs';\nimport { ApiCallParams, Token } from './types';\nimport { FetchError } from './FetchError';\nimport { deserializeForm } from './form';\n\n/**\n * Handles HTTP requests to external APIs\n */\nexport class HttpClient {\n /**\n * Make an HTTP request\n */\n public async makeRequest(apiParams: ApiCallParams, authToken: Token | Record<string, any>): Promise<any> {\n const {\n accountId,\n method,\n route,\n base,\n body,\n data,\n headers,\n queryParams,\n contentType = 'application/json',\n accessToken: forcedAccessToken,\n useAuth = true,\n files,\n abortSignal,\n } = apiParams;\n \n // Build URL and request body\n const normalizedMethod = method?.toUpperCase() as 'GET' | 'POST' | 'PUT' | 'DELETE';\n \n // Process query params\n let finalQueryParams: Record<string, any> = {};\n \n // Handle existing query params (support both URLSearchParams and object)\n if (queryParams) {\n if (queryParams instanceof URLSearchParams) {\n queryParams.forEach((val, key) => {\n finalQueryParams[key] = val;\n });\n } else {\n finalQueryParams = { ...(queryParams as any) };\n }\n }\n \n // For GET requests, merge body/data into query params\n if (normalizedMethod === 'GET') {\n if (body) {\n finalQueryParams = { ...finalQueryParams, ...body };\n }\n if (data) {\n finalQueryParams = { ...finalQueryParams, ...data };\n }\n }\n\n const url = this.buildUrl(base, route, finalQueryParams);\n const requestBody = body || data;\n \n // Handle file uploads\n const formData = this.prepareFormData(files);\n \n // Create fetch options\n const fetchOptions = this.buildFetchOptions({\n method: normalizedMethod,\n body: requestBody,\n formData,\n contentType,\n authToken,\n forcedAccessToken,\n useAuth,\n headers,\n abortSignal,\n });\n\n // Make the request\n try {\n console.log(`🔄 Making API call to ${url}`);\n const response = await fetch(url, fetchOptions);\n return await this.handleResponse(response);\n } catch (error: any) {\n // also console log error code such as 401 ....\n console.error('🔄 Error making API call:', error, 'status:', error?.status);\n throw error;\n }\n }\n\n /**\n * Build URL with query parameters\n */\n private buildUrl(base: string | undefined, route?: string, queryParams?: any): string {\n const baseUrl = base || '';\n let url = `${baseUrl}${route || ''}`;\n if (queryParams && Object.keys(queryParams).length > 0) {\n url += `?${qs.stringify(queryParams)}`;\n }\n return url;\n }\n\n /**\n * Prepare form data for file uploads\n */\n private prepareFormData(files?: File[]): FormData | null {\n if (!files) return null;\n \n const formData = deserializeForm(files);\n // Use a workaround for TypeScript FormData entries() issue\n const entries = formData as any;\n for (let [key, value] of entries.entries()) {\n console.log(`formdata ${key}:`, value);\n }\n return formData;\n }\n\n /**\n * Build fetch options for request\n */\n private buildFetchOptions({\n method,\n body,\n formData,\n contentType,\n authToken,\n forcedAccessToken,\n useAuth,\n headers,\n abortSignal,\n }: {\n method: string;\n body: any;\n formData: FormData | null;\n contentType: string;\n authToken: any;\n forcedAccessToken?: string;\n useAuth: boolean;\n headers?: Record<string, string>;\n abortSignal?: AbortSignal;\n }): RequestInit {\n const allowedMethods = ['POST', 'PUT', 'PATCH'];\n \n return {\n method,\n signal: abortSignal,\n headers: {\n ...(useAuth && { \n Authorization: `Bearer ${forcedAccessToken || authToken.access_token}` \n }),\n ...(!formData && { 'content-type': contentType }),\n ...(headers || {}),\n },\n body: body && allowedMethods.includes(method) \n ? JSON.stringify(body) \n : (formData || null),\n };\n }\n\n /**\n * Handle API response\n */\n private async handleResponse(response: Response): Promise<any> {\n let data = null;\n try {\n data = await response.json();\n console.log('🔄 Response data:', data);\n } catch (error) {\n // Response wasn't JSON, continue with null data\n }\n \n if (!response.ok) {\n throw new FetchError(response, data);\n }\n \n return data;\n }\n} ","export class FetchError extends Error {\n name: string = 'FetchError';\n status: number;\n code: string;\n message: string;\n data: any;\n\n constructor(response: Response, data: any = {}, code: string = 'FETCH_ERROR') {\n super();\n const defaultMessage = 'An unspecified error occurred';\n\n const getMessage = (data: any, locations: string[]): string | null =>\n locations\n .map((item) => {\n const parts = item.split('.');\n let value = data;\n for (const part of parts) {\n value = value?.[part];\n }\n return value;\n })\n .find((message) => typeof message === 'string') || null;\n\n const messageFromData = getMessage(data, [\n 'error.errors.0.message',\n 'error.message',\n 'error',\n 'message',\n ]);\n\n this.message = messageFromData || response.statusText || defaultMessage;\n this.status = response.status;\n this.code = code;\n this.data = data;\n this.message = this.message || defaultMessage;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","export function deserializeForm(src: any): FormData {\n const fd = new FormData();\n switch (src.cls) {\n case 'FormData': {\n for (const [key, items] of src.value) {\n for (const item of items) {\n let deserializedItem = deserializeForm(item);\n if (deserializedItem instanceof FormData) {\n // Use a workaround for TypeScript FormData entries() issue\n const entries = deserializedItem as any;\n for (const [subKey, subValue] of entries.entries()) {\n fd.append(`${key}[${subKey}]`, subValue);\n }\n } else {\n fd.append(key, deserializedItem);\n }\n }\n }\n break;\n }\n case 'Blob':\n case 'File': {\n const { type, name, lastModified } = src;\n const binStr = atob(src.value);\n const arr = new Uint8Array(binStr.length);\n for (let i = 0; i < binStr.length; i++) arr[i] = binStr.charCodeAt(i);\n const data = [arr.buffer];\n const fileOrBlob =\n src.cls === 'File'\n ? new File(data, name, { type, lastModified })\n : new Blob(data, { type });\n fd.append('file', fileOrBlob);\n break;\n }\n case 'json': {\n fd.append('json', JSON.stringify(JSON.parse(src.value)));\n break;\n }\n default:\n throw new Error('Unsupported type for deserialization');\n }\n return fd;\n}\n","import { AccountData } from './types';\n\n/**\n * Manages account data and state\n */\nexport class AccountManager {\n private accounts: Record<string, AccountData> = {};\n private readonly DEFAULT_ACCOUNT = 'default';\n\n /**\n * Update account data for a specific account\n */\n public updateAccountData(accountId: string = this.DEFAULT_ACCOUNT, data: Partial<AccountData>): void {\n this.accounts[accountId] = { \n ...this.accounts[accountId], \n ...data \n };\n }\n\n /**\n * Get account data for a specific account\n */\n public getAccountData(accountId: string = this.DEFAULT_ACCOUNT): AccountData {\n return this.accounts[accountId] || {};\n }\n\n /**\n * Check if an account's last request failed\n */\n public didLastRequestFail(accountId: string = this.DEFAULT_ACCOUNT): boolean {\n return !!this.accounts[accountId]?.lastFailed;\n }\n\n /**\n * Set account's last request as failed\n */\n public setLastRequestFailed(accountId: string = this.DEFAULT_ACCOUNT, failed: boolean = true): void {\n this.updateAccountData(accountId, { lastFailed: failed });\n }\n\n /**\n * Update the last request time for an account\n */\n public updateLastRequestTime(accountId: string = this.DEFAULT_ACCOUNT): void {\n this.updateAccountData(accountId, { lastRequestTime: Date.now() });\n }\n} ","import { AuthProvider, Token, OAuthToken } from './types';\n\nexport type TokenService = {\n get: (accountId?: string) => Promise<Token>;\n set: (token: Partial<Token>, accountId?: string) => Promise<void>;\n refresh?: (refreshToken: string, accountId?: string) => Promise<OAuthToken>;\n};\n\nexport class TokenAuthProvider implements AuthProvider {\n private tokenService: TokenService;\n constructor(tokenService: TokenService) {\n this.tokenService = tokenService;\n }\n async getAuthHeaders(accountId?: string): Promise<Record<string, string>> {\n const token = await this.tokenService.get(accountId);\n if (!token?.access_token) return {};\n return { Authorization: `Bearer ${token.access_token}` };\n }\n public async refresh(accountId: string): Promise<void> {\n if (!this.tokenService.refresh) {\n throw new Error('Refresh not supported');\n }\n const token = await this.tokenService.get(accountId);\n if (!token?.refresh_token) {\n throw new Error('No refresh token available');\n }\n const newTokens = await this.tokenService.refresh(token.refresh_token, accountId);\n await this.tokenService.set(newTokens, accountId);\n }\n}","import { AuthProvider, BasicAuthProviderOptions } from './types';\n\nexport class BasicAuthProvider implements AuthProvider {\n private username: string;\n private password: string;\n\n constructor(options: BasicAuthProviderOptions) {\n this.username = options.username;\n this.password = options.password;\n }\n\n async getAuthHeaders(): Promise<Record<string, string>> {\n const encoded = Buffer.from(`${this.username}:${this.password}`).toString('base64');\n return { Authorization: `Basic ${encoded}` };\n }\n\n // No refresh for basic auth\n} "],"mappings":"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","names":["data","qs"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/ApiKeyAuthProvider.ts","../src/CacheManager.ts","../src/RetryManager.ts","../src/HookManager.ts","../src/HttpClient.ts","../src/FetchError.ts","../src/form.ts","../src/AccountManager.ts","../src/TokenAuthProvider.ts","../src/BasicAuthProvider.ts"],"sourcesContent":["import { \n AuthProvider,\n ApiCallParams,\n HookSettings,\n StatusCode,\n Token,\n OAuthToken\n} from './types';\nimport { ApiKeyAuthProvider } from './ApiKeyAuthProvider';\nimport {\n CacheManager,\n RetryManager,\n HookManager,\n HttpClient,\n AccountManager\n} from './components';\n\n/**\n * ApiService - Core API service for making authenticated API calls\n * with caching, retry, and hook support.\n */\nclass ApiService {\n public provider: string; // Service provider name\n private authProvider: AuthProvider;\n private baseUrl: string = ''; // Default base URL\n \n // Component managers\n private cacheManager: CacheManager;\n private retryManager: RetryManager;\n private hookManager: HookManager;\n protected httpClient: HttpClient;\n private accountManager: AccountManager;\n \n // Default max attempts for API calls\n private maxAttempts = 10;\n\n constructor() {\n this.provider = '';\n this.authProvider = {} as AuthProvider;\n \n // Initialize component managers\n this.cacheManager = new CacheManager();\n this.retryManager = new RetryManager();\n this.hookManager = new HookManager();\n this.httpClient = new HttpClient();\n this.accountManager = new AccountManager();\n }\n\n /**\n * Setup the API service\n */\n public setup({\n provider,\n authProvider,\n hooks = {},\n cacheTime,\n baseUrl = '',\n httpClient,\n }: {\n provider: string;\n authProvider: AuthProvider;\n hooks?: Record<StatusCode, HookSettings | null>;\n cacheTime: number;\n baseUrl?: string;\n httpClient?: HttpClient;\n }) {\n this.provider = provider;\n this.authProvider = authProvider;\n this.baseUrl = baseUrl;\n \n if (httpClient) {\n this.httpClient = httpClient;\n }\n \n // Create a copy of hooks to avoid modifying the input\n const finalHooks: Record<StatusCode, HookSettings> = {};\n \n // Apply default 401 handler if:\n // 1. No 401 hook is explicitly defined (or is explicitly null)\n // 2. AuthProvider has a refresh method\n if (hooks[401] === undefined && typeof this.authProvider.refresh === 'function') {\n finalHooks[401] = this.createDefaultAuthRefreshHandler();\n }\n \n // Add user-defined hooks (skipping null/undefined values)\n for (const [statusCode, hook] of Object.entries(hooks)) {\n if (hook) {\n finalHooks[statusCode] = hook;\n }\n }\n \n // Set the hooks if we have any\n if (Object.keys(finalHooks).length > 0) {\n this.hookManager.setHooks(finalHooks);\n }\n \n if (typeof cacheTime !== 'undefined') {\n this.cacheManager.setCacheTime(cacheTime);\n }\n }\n \n /**\n * Create a default handler for 401 (Unauthorized) errors\n * that implements standard credential refresh behavior\n */\n private createDefaultAuthRefreshHandler(): HookSettings {\n return {\n shouldRetry: true,\n useRetryDelay: true,\n preventConcurrentCalls: true,\n maxRetries: 1,\n handler: async (accountId) => {\n try {\n console.log(`🔄 Using default auth refresh handler for ${accountId}`);\n if (!this.authProvider.refresh) {\n throw new Error('No refresh method available on auth provider');\n }\n // You may want to store refresh token in account data or pass it in another way\n // For now, assume refresh token is managed internally by the provider\n await this.authProvider.refresh(accountId);\n return {};\n } catch (error) {\n console.error(`Auth refresh failed for ${accountId}:`, error);\n throw error;\n }\n },\n onMaxRetriesExceeded: async (accountId, error) => {\n console.error(`Authentication failed after refresh attempt for ${accountId}:`, error);\n }\n };\n }\n \n /**\n * Set the maximum number of retry attempts\n */\n public setMaxAttempts(attempts: number): void {\n this.maxAttempts = attempts;\n }\n\n /**\n * Update account data\n */\n public updateAccountData(accountId: string, data: Partial<Record<string, any>>): void {\n this.accountManager.updateAccountData(accountId, data);\n }\n\n /**\n * Make an API call with all features (caching, retry, hooks)\n */\n public async call(apiCallParams: Omit<ApiCallParams, 'accountId'> & { accountId?: string; abortSignal?: AbortSignal }): Promise<any> {\n // Use 'default' as fallback if accountId is not provided\n // and use default baseUrl if not provided\n const params: ApiCallParams = {\n ...apiCallParams,\n accountId: apiCallParams.accountId || 'default',\n base: apiCallParams.base || this.baseUrl,\n };\n\n // If using ApiKeyAuthProvider with queryParamName, add API key to queryParams\n if (\n this.authProvider instanceof ApiKeyAuthProvider &&\n (this.authProvider as any).queryParamName\n ) {\n const queryParamName = (this.authProvider as any).queryParamName;\n const apiKey = (this.authProvider as any).apiKey;\n const urlParams = params.queryParams ? new URLSearchParams(params.queryParams) : new URLSearchParams();\n urlParams.set(queryParamName, apiKey);\n params.queryParams = urlParams;\n }\n\n console.log('🔄 API call', this.provider, params.accountId, params.method, params.route);\n \n // Check cache first\n const cachedData = this.cacheManager.getFromCache(params);\n if (cachedData) return cachedData;\n\n // Make the API call with retry capability\n const result = await this.makeRequestWithRetry(params);\n \n // Cache the result\n this.cacheManager.saveToCache(params, result);\n \n return result;\n }\n\n /**\n * Legacy method for backward compatibility\n * @deprecated Use call() instead\n */\n public async makeApiCall(apiCallParams: Omit<ApiCallParams, 'accountId'> & { accountId?: string; abortSignal?: AbortSignal }): Promise<any> {\n return this.call(apiCallParams);\n }\n\n /**\n * Make a request with retry capability\n */\n private async makeRequestWithRetry(apiCallParams: ApiCallParams): Promise<any> {\n const { accountId, abortSignal } = apiCallParams;\n let attempts = 0;\n const statusRetries: Record<StatusCode, number> = {};\n let currentParams = { ...apiCallParams };\n // If using ApiKeyAuthProvider with queryParamName, add API key to queryParams\n if (\n this.authProvider instanceof ApiKeyAuthProvider &&\n (this.authProvider as any).queryParamName\n ) {\n const queryParamName = (this.authProvider as any).queryParamName;\n const apiKey = (this.authProvider as any).apiKey;\n const urlParams = currentParams.queryParams ? new URLSearchParams(currentParams.queryParams) : new URLSearchParams();\n urlParams.set(queryParamName, apiKey);\n currentParams.queryParams = urlParams;\n }\n // Main retry loop\n while (attempts < this.maxAttempts) {\n if (abortSignal?.aborted) {\n throw new Error('Request aborted');\n }\n attempts++;\n \n try {\n // Get authentication headers if needed\n const authHeaders: Record<string, string> = apiCallParams.useAuth !== false\n ? await this.authProvider.getAuthHeaders(accountId)\n : {};\n // Merge auth headers into params.headers\n currentParams.headers = {\n ...(currentParams.headers || {}),\n ...authHeaders,\n };\n \n // Verify we have authentication if required\n if (\n apiCallParams.useAuth !== false &&\n Object.keys(authHeaders).length === 0 &&\n !(\n this.authProvider instanceof ApiKeyAuthProvider &&\n (this.authProvider as any).queryParamName\n )\n ) {\n throw new Error(`${this.provider} credentials not found for account ID ${accountId}`);\n }\n \n // Make the actual API call\n const response = await this.httpClient.makeRequest(currentParams, {});\n \n // Success - update account status and return result\n this.accountManager.setLastRequestFailed(accountId, false);\n return response;\n } \n catch (error: any) {\n const status = error?.status;\n \n // If no hook exists for this error, or we shouldn't retry, throw\n if (!this.hookManager.shouldRetry(status)) {\n throw error;\n }\n \n // Track retries for this status code\n statusRetries[status] = (statusRetries[status] || 0) + 1;\n const activeHook = this.hookManager.getHook(status);\n const maxRetries = activeHook?.maxRetries ?? this.retryManager.getDefaultMaxRetries();\n \n // Check if we've exceeded retries for this status\n if (statusRetries[status] > maxRetries) {\n await this.hookManager.handleRetryFailure(accountId, status, error);\n this.accountManager.setLastRequestFailed(accountId, true);\n throw error;\n }\n \n // Process the hook to get updated params\n try {\n const hookResult = await this.hookManager.processHook(accountId, status, error);\n if (hookResult) {\n currentParams = { ...currentParams, ...hookResult };\n }\n } \n catch (hookError) {\n this.accountManager.setLastRequestFailed(accountId, true);\n throw hookError;\n }\n \n // Wait before retrying if needed\n if (activeHook?.useRetryDelay) {\n await this.retryManager.calculateAndDelay({\n attempt: statusRetries[status],\n response: error.response,\n hook: activeHook,\n });\n }\n }\n }\n \n // If we've reached here, we've exceeded our maximum attempts\n this.accountManager.setLastRequestFailed(accountId, true);\n throw new Error(`Exceeded maximum attempts (${this.maxAttempts}) for API call to ${accountId}`);\n }\n\n /**\n * Set the cache time in milliseconds\n */\n public setCacheTime(milliseconds: number): void {\n this.cacheManager.setCacheTime(milliseconds);\n }\n\n /**\n * Clear the cache\n */\n public clearCache(): void {\n this.cacheManager.clearCache();\n }\n}\n\nexport * from './types';\nexport * from './FetchError';\nexport * from './components';\n\nexport { ApiService };\nexport default ApiService;\n","import { AuthProvider, ApiKeyAuthProviderOptions } from './types';\n\nexport class ApiKeyAuthProvider implements AuthProvider {\n private apiKey: string;\n private headerName?: string;\n private queryParamName?: string;\n\n constructor(options: ApiKeyAuthProviderOptions) {\n this.apiKey = options.apiKey;\n this.headerName = options.headerName;\n this.queryParamName = options.queryParamName;\n }\n\n async getAuthHeaders(): Promise<Record<string, string>> {\n if (this.headerName) {\n return { [this.headerName]: this.apiKey };\n }\n // If using query param, return empty headers (handled elsewhere)\n return {};\n }\n\n // For API key, refresh is not supported\n} ","import { ApiCallParams } from './types';\n\n/**\n * Handles caching of API responses\n */\nexport class CacheManager {\n private cache: Map<string, { data: any; timestamp: number }> = new Map();\n private cacheTime = 20000; // Default cache time of 20 seconds\n\n /**\n * Get data from cache if available and not expired\n */\n public getFromCache(apiCallParams: ApiCallParams): any {\n const requestKey = this.getRequestKey(apiCallParams);\n const currentCacheTime = apiCallParams.cacheTime ?? this.cacheTime;\n const cached = this.cache.get(requestKey);\n \n if (cached && (Date.now() - cached.timestamp < currentCacheTime)) {\n return cached.data;\n }\n \n return null;\n }\n\n /**\n * Save data to cache\n */\n public saveToCache(apiCallParams: ApiCallParams, data: any): void {\n const requestKey = this.getRequestKey(apiCallParams);\n this.cache.set(requestKey, { \n data, \n timestamp: Date.now() \n });\n }\n\n /**\n * Generate a unique key for caching based on request parameters\n */\n private getRequestKey(apiCallParams: ApiCallParams): string {\n const { accountId, method, route, base, queryParams, body, data } = apiCallParams;\n return JSON.stringify({\n accountId,\n method,\n route,\n base,\n queryParams,\n body: body || data,\n });\n }\n\n /**\n * Set the default cache time in milliseconds\n */\n public setCacheTime(milliseconds: number): void {\n this.cacheTime = milliseconds;\n }\n\n /**\n * Clear the entire cache\n */\n public clearCache(): void {\n this.cache.clear();\n }\n} ","import { DelayStrategy, HookSettings } from './types';\n\n/**\n * Handles retry logic and delay strategies for failed API calls\n */\nexport class RetryManager {\n private defaultMaxDelay = 60000; // Default max delay of 1 minute\n private defaultMaxRetries = 4;\n\n /**\n * Default exponential backoff strategy with full jitter\n */\n private defaultDelayStrategy: DelayStrategy = {\n calculate: (attempt: number, response?: any) => {\n // Check for Retry-After header\n const retryAfter = this.getRetryAfterValue(response);\n if (retryAfter) return retryAfter;\n \n // Exponential backoff with full jitter\n const baseDelay = 1000; // 1 second\n const exponentialDelay = baseDelay * Math.pow(2, attempt - 1);\n return Math.floor(Math.random() * exponentialDelay);\n },\n };\n\n /**\n * Calculate and wait for appropriate delay time before retry\n */\n public async calculateAndDelay(params: {\n attempt: number;\n response?: any;\n hook: HookSettings;\n }): Promise<void> {\n const { attempt, response, hook } = params;\n const delayStrategy = hook.delayStrategy || this.defaultDelayStrategy;\n const maxDelay = hook.maxDelay || this.defaultMaxDelay;\n\n const calculatedDelay = delayStrategy.calculate(attempt, response);\n const finalDelay = Math.min(calculatedDelay, maxDelay);\n\n console.log(`🔄 Waiting for ${finalDelay / 1000} seconds before retrying.`);\n await new Promise(resolve => setTimeout(resolve, finalDelay));\n }\n\n /**\n * Extract retry-after value from response\n */\n private getRetryAfterValue(response?: any): number | null {\n if (!response?.headers?.get) return null;\n \n const retryAfter = response.headers.get('Retry-After');\n if (!retryAfter) return null;\n \n // Handle numeric retry-after\n const parsedDelay = parseInt(retryAfter, 10);\n if (!isNaN(parsedDelay)) {\n return parsedDelay * 1000;\n }\n \n // Handle date retry-after\n const date = new Date(retryAfter).getTime();\n const now = Date.now();\n if (date > now) {\n return date - now;\n }\n \n return null;\n }\n \n /**\n * Get the default maximum number of retries\n */\n public getDefaultMaxRetries(): number {\n return this.defaultMaxRetries;\n }\n \n /**\n * Set the default maximum number of retries\n */\n public setDefaultMaxRetries(maxRetries: number): void {\n this.defaultMaxRetries = maxRetries;\n }\n \n /**\n * Set the default maximum delay between retries\n */\n public setDefaultMaxDelay(maxDelay: number): void {\n this.defaultMaxDelay = maxDelay;\n }\n} ","import { HookSettings, StatusCode } from './types';\n\n/**\n * Manages hooks for different status codes and their processing\n */\nexport class HookManager {\n private hooks: Record<StatusCode, HookSettings> = {};\n private hookPromises: Record<string, Promise<object>> = {};\n\n /**\n * Set hooks for different status codes\n */\n public setHooks(hooks: Record<StatusCode, HookSettings>): void {\n this.hooks = { ...this.hooks, ...hooks };\n }\n\n /**\n * Get a hook for a specific status code\n */\n public getHook(status: StatusCode): HookSettings | undefined {\n return this.hooks[status];\n }\n\n /**\n * Process a hook for a specific status code\n */\n public async processHook(\n accountId: string,\n status: StatusCode,\n error: any\n ): Promise<Record<string, any> | null> {\n const hook = this.hooks[status];\n if (!hook || !hook.handler) return null;\n \n const hookKey = `${accountId || 'default'}-${status}`;\n \n try {\n // Handle waiting for existing hook call if needed\n if (hook.preventConcurrentCalls) {\n if (!this.hookPromises[hookKey]) {\n this.hookPromises[hookKey] = Promise.resolve(\n hook.handler(accountId, error.response) || {}\n );\n }\n \n const result = await this.hookPromises[hookKey];\n delete this.hookPromises[hookKey];\n return result;\n } \n \n // Otherwise just call the hook directly\n return await hook.handler(accountId, error.response) || {};\n } \n catch (hookError) {\n console.error(`Hook handler failed for status ${status}:`, hookError);\n \n if (hook.onHandlerError) {\n await hook.onHandlerError(accountId, hookError);\n }\n \n throw hookError;\n }\n }\n\n /**\n * Handle a retry failure with the appropriate hook\n */\n public async handleRetryFailure(accountId: string, status: StatusCode, error: any): Promise<void> {\n const hook = this.hooks[status];\n if (hook?.onMaxRetriesExceeded) {\n await hook.onMaxRetriesExceeded(accountId, error);\n }\n }\n\n /**\n * Check if a hook exists and should retry for a given status\n */\n public shouldRetry(status: StatusCode): boolean {\n const hook = this.hooks[status];\n return !!hook && !!hook.shouldRetry;\n }\n} ","import qs from 'qs';\nimport { ApiCallParams, Token } from './types';\nimport { FetchError } from './FetchError';\nimport { deserializeForm } from './form';\n\n/**\n * Handles HTTP requests to external APIs\n */\nexport class HttpClient {\n /**\n * Make an HTTP request\n */\n public async makeRequest(apiParams: ApiCallParams, authToken: Token | Record<string, any>): Promise<any> {\n const {\n accountId,\n method,\n route,\n base,\n body,\n data,\n headers,\n queryParams,\n contentType = 'application/json',\n accessToken: forcedAccessToken,\n useAuth = true,\n files,\n abortSignal,\n } = apiParams;\n \n // Build URL and request body\n const normalizedMethod = method?.toUpperCase() as 'GET' | 'POST' | 'PUT' | 'DELETE';\n \n // Process query params\n let finalQueryParams: Record<string, any> = {};\n \n // Handle existing query params (support both URLSearchParams and object)\n if (queryParams) {\n if (queryParams instanceof URLSearchParams) {\n queryParams.forEach((val, key) => {\n finalQueryParams[key] = val;\n });\n } else {\n finalQueryParams = { ...(queryParams as any) };\n }\n }\n \n // For GET requests, merge body/data into query params\n if (normalizedMethod === 'GET') {\n if (body) {\n finalQueryParams = { ...finalQueryParams, ...body };\n }\n if (data) {\n finalQueryParams = { ...finalQueryParams, ...data };\n }\n }\n\n const url = this.buildUrl(base, route, finalQueryParams);\n const requestBody = body || data;\n \n // Handle file uploads\n const formData = this.prepareFormData(files);\n \n // Create fetch options\n const fetchOptions = this.buildFetchOptions({\n method: normalizedMethod,\n body: requestBody,\n formData,\n contentType,\n authToken,\n forcedAccessToken,\n useAuth,\n headers,\n abortSignal,\n });\n\n // Make the request\n try {\n console.log(`🔄 Making API call to ${url}`);\n const response = await fetch(url, fetchOptions);\n return await this.handleResponse(response);\n } catch (error: any) {\n // also console log error code such as 401 ....\n console.error('🔄 Error making API call:', error, 'status:', error?.status);\n throw error;\n }\n }\n\n /**\n * Build URL with query parameters\n */\n private buildUrl(base: string | undefined, route?: string, queryParams?: any): string {\n const baseUrl = base || '';\n let url = `${baseUrl}${route || ''}`;\n if (queryParams && Object.keys(queryParams).length > 0) {\n url += `?${qs.stringify(queryParams)}`;\n }\n return url;\n }\n\n /**\n * Prepare form data for file uploads\n */\n private prepareFormData(files?: File[]): FormData | null {\n if (!files) return null;\n \n const formData = deserializeForm(files);\n // Use a workaround for TypeScript FormData entries() issue\n const entries = formData as any;\n for (let [key, value] of entries.entries()) {\n console.log(`formdata ${key}:`, value);\n }\n return formData;\n }\n\n /**\n * Build fetch options for request\n */\n private buildFetchOptions({\n method,\n body,\n formData,\n contentType,\n authToken,\n forcedAccessToken,\n useAuth,\n headers,\n abortSignal,\n }: {\n method: string;\n body: any;\n formData: FormData | null;\n contentType: string;\n authToken: any;\n forcedAccessToken?: string;\n useAuth: boolean;\n headers?: Record<string, string>;\n abortSignal?: AbortSignal;\n }): RequestInit {\n const allowedMethods = ['POST', 'PUT', 'PATCH'];\n \n return {\n method,\n signal: abortSignal,\n headers: {\n ...(useAuth && { \n Authorization: `Bearer ${forcedAccessToken || authToken.access_token}` \n }),\n ...(!formData && { 'content-type': contentType }),\n ...(headers || {}),\n },\n body: body && allowedMethods.includes(method) \n ? JSON.stringify(body) \n : (formData || null),\n };\n }\n\n /**\n * Handle API response\n */\n private async handleResponse(response: Response): Promise<any> {\n let data = null;\n try {\n data = await response.json();\n console.log('🔄 Response data:', data);\n } catch (error) {\n // Response wasn't JSON, continue with null data\n }\n \n if (!response.ok) {\n throw new FetchError(response, data);\n }\n \n return data;\n }\n} ","export class FetchError extends Error {\n name: string = 'FetchError';\n status: number;\n code: string;\n message: string;\n data: any;\n\n constructor(response: Response, data: any = {}, code: string = 'FETCH_ERROR') {\n super();\n const defaultMessage = 'An unspecified error occurred';\n\n const getMessage = (data: any, locations: string[]): string | null =>\n locations\n .map((item) => {\n const parts = item.split('.');\n let value = data;\n for (const part of parts) {\n value = value?.[part];\n }\n return value;\n })\n .find((message) => typeof message === 'string') || null;\n\n const messageFromData = getMessage(data, [\n 'error.errors.0.message',\n 'error.message',\n 'error',\n 'message',\n ]);\n\n this.message = messageFromData || response.statusText || defaultMessage;\n this.status = response.status;\n this.code = code;\n this.data = data;\n this.message = this.message || defaultMessage;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","export function deserializeForm(src: any): FormData {\n const fd = new FormData();\n switch (src.cls) {\n case 'FormData': {\n for (const [key, items] of src.value) {\n for (const item of items) {\n let deserializedItem = deserializeForm(item);\n if (deserializedItem instanceof FormData) {\n // Use a workaround for TypeScript FormData entries() issue\n const entries = deserializedItem as any;\n for (const [subKey, subValue] of entries.entries()) {\n fd.append(`${key}[${subKey}]`, subValue);\n }\n } else {\n fd.append(key, deserializedItem);\n }\n }\n }\n break;\n }\n case 'Blob':\n case 'File': {\n const { type, name, lastModified } = src;\n const binStr = atob(src.value);\n const arr = new Uint8Array(binStr.length);\n for (let i = 0; i < binStr.length; i++) arr[i] = binStr.charCodeAt(i);\n const data = [arr.buffer];\n const fileOrBlob =\n src.cls === 'File'\n ? new File(data, name, { type, lastModified })\n : new Blob(data, { type });\n fd.append('file', fileOrBlob);\n break;\n }\n case 'json': {\n fd.append('json', JSON.stringify(JSON.parse(src.value)));\n break;\n }\n default:\n throw new Error('Unsupported type for deserialization');\n }\n return fd;\n}\n","import { AccountData } from './types';\n\n/**\n * Manages account data and state\n */\nexport class AccountManager {\n private accounts: Record<string, AccountData> = {};\n private readonly DEFAULT_ACCOUNT = 'default';\n\n /**\n * Update account data for a specific account\n */\n public updateAccountData(accountId: string = this.DEFAULT_ACCOUNT, data: Partial<AccountData>): void {\n this.accounts[accountId] = { \n ...this.accounts[accountId], \n ...data \n };\n }\n\n /**\n * Get account data for a specific account\n */\n public getAccountData(accountId: string = this.DEFAULT_ACCOUNT): AccountData {\n return this.accounts[accountId] || {};\n }\n\n /**\n * Check if an account's last request failed\n */\n public didLastRequestFail(accountId: string = this.DEFAULT_ACCOUNT): boolean {\n return !!this.accounts[accountId]?.lastFailed;\n }\n\n /**\n * Set account's last request as failed\n */\n public setLastRequestFailed(accountId: string = this.DEFAULT_ACCOUNT, failed: boolean = true): void {\n this.updateAccountData(accountId, { lastFailed: failed });\n }\n\n /**\n * Update the last request time for an account\n */\n public updateLastRequestTime(accountId: string = this.DEFAULT_ACCOUNT): void {\n this.updateAccountData(accountId, { lastRequestTime: Date.now() });\n }\n} ","import { AuthProvider, Token, OAuthToken } from './types';\n\nexport type TokenService = {\n get: (accountId?: string) => Promise<Token>;\n set: (token: Partial<Token>, accountId?: string) => Promise<void>;\n refresh?: (refreshToken: string, accountId?: string) => Promise<OAuthToken>;\n};\n\nexport class TokenAuthProvider implements AuthProvider {\n private tokenService: TokenService;\n constructor(tokenService: TokenService) {\n this.tokenService = tokenService;\n }\n async getAuthHeaders(accountId?: string): Promise<Record<string, string>> {\n const token = await this.tokenService.get(accountId);\n if (!token?.access_token) return {};\n return { Authorization: `Bearer ${token.access_token}` };\n }\n public async refresh(accountId: string): Promise<void> {\n if (!this.tokenService.refresh) {\n throw new Error('Refresh not supported');\n }\n const token = await this.tokenService.get(accountId);\n if (!token?.refresh_token) {\n throw new Error('No refresh token available');\n }\n const newTokens = await this.tokenService.refresh(token.refresh_token, accountId);\n await this.tokenService.set(newTokens, accountId);\n }\n}","import { AuthProvider, BasicAuthProviderOptions } from './types';\n\nexport class BasicAuthProvider implements AuthProvider {\n private username: string;\n private password: string;\n\n constructor(options: BasicAuthProviderOptions) {\n this.username = options.username;\n this.password = options.password;\n }\n\n async getAuthHeaders(): Promise<Record<string, string>> {\n const encoded = Buffer.from(`${this.username}:${this.password}`).toString('base64');\n return { Authorization: `Basic ${encoded}` };\n }\n\n // No refresh for basic auth\n} "],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEO,IAAM,qBAAN,MAAiD;AAAA,EAKtD,YAAY,SAAoC;AAC9C,SAAK,SAAS,QAAQ;AACtB,SAAK,aAAa,QAAQ;AAC1B,SAAK,iBAAiB,QAAQ;AAAA,EAChC;AAAA,EAEA,MAAM,iBAAkD;AACtD,QAAI,KAAK,YAAY;AACnB,aAAO,EAAE,CAAC,KAAK,UAAU,GAAG,KAAK,OAAO;AAAA,IAC1C;AAEA,WAAO,CAAC;AAAA,EACV;AAAA;AAGF;;;ACjBO,IAAM,eAAN,MAAmB;AAAA,EAAnB;AACL,SAAQ,QAAuD,oBAAI,IAAI;AACvE,SAAQ,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKb,aAAa,eAAmC;AAZzD;AAaI,UAAM,aAAa,KAAK,cAAc,aAAa;AACnD,UAAM,oBAAmB,mBAAc,cAAd,YAA2B,KAAK;AACzD,UAAM,SAAS,KAAK,MAAM,IAAI,UAAU;AAExC,QAAI,UAAW,KAAK,IAAI,IAAI,OAAO,YAAY,kBAAmB;AAChE,aAAO,OAAO;AAAA,IAChB;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKO,YAAY,eAA8B,MAAiB;AAChE,UAAM,aAAa,KAAK,cAAc,aAAa;AACnD,SAAK,MAAM,IAAI,YAAY;AAAA,MACzB;AAAA,MACA,WAAW,KAAK,IAAI;AAAA,IACtB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAc,eAAsC;AAC1D,UAAM,EAAE,WAAW,QAAQ,OAAO,MAAM,aAAa,MAAM,KAAK,IAAI;AACpE,WAAO,KAAK,UAAU;AAAA,MACpB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM,QAAQ;AAAA,IAChB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKO,aAAa,cAA4B;AAC9C,SAAK,YAAY;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKO,aAAmB;AACxB,SAAK,MAAM,MAAM;AAAA,EACnB;AACF;;;AC1DO,IAAM,eAAN,MAAmB;AAAA,EAAnB;AACL,SAAQ,kBAAkB;AAC1B;AAAA,SAAQ,oBAAoB;AAK5B;AAAA;AAAA;AAAA,SAAQ,uBAAsC;AAAA,MAC5C,WAAW,CAAC,SAAiB,aAAmB;AAE9C,cAAM,aAAa,KAAK,mBAAmB,QAAQ;AACnD,YAAI,WAAY,QAAO;AAGvB,cAAM,YAAY;AAClB,cAAM,mBAAmB,YAAY,KAAK,IAAI,GAAG,UAAU,CAAC;AAC5D,eAAO,KAAK,MAAM,KAAK,OAAO,IAAI,gBAAgB;AAAA,MACpD;AAAA,IACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,kBAAkB,QAIb;AAChB,UAAM,EAAE,SAAS,UAAU,KAAK,IAAI;AACpC,UAAM,gBAAgB,KAAK,iBAAiB,KAAK;AACjD,UAAM,WAAW,KAAK,YAAY,KAAK;AAEvC,UAAM,kBAAkB,cAAc,UAAU,SAAS,QAAQ;AACjE,UAAM,aAAa,KAAK,IAAI,iBAAiB,QAAQ;AAErD,YAAQ,IAAI,yBAAkB,aAAa,GAAI,2BAA2B;AAC1E,UAAM,IAAI,QAAQ,aAAW,WAAW,SAAS,UAAU,CAAC;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAmB,UAA+B;AA/C5D;AAgDI,QAAI,GAAC,0CAAU,YAAV,mBAAmB,KAAK,QAAO;AAEpC,UAAM,aAAa,SAAS,QAAQ,IAAI,aAAa;AACrD,QAAI,CAAC,WAAY,QAAO;AAGxB,UAAM,cAAc,SAAS,YAAY,EAAE;AAC3C,QAAI,CAAC,MAAM,WAAW,GAAG;AACvB,aAAO,cAAc;AAAA,IACvB;AAGA,UAAM,OAAO,IAAI,KAAK,UAAU,EAAE,QAAQ;AAC1C,UAAM,MAAM,KAAK,IAAI;AACrB,QAAI,OAAO,KAAK;AACd,aAAO,OAAO;AAAA,IAChB;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKO,uBAA+B;AACpC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKO,qBAAqB,YAA0B;AACpD,SAAK,oBAAoB;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKO,mBAAmB,UAAwB;AAChD,SAAK,kBAAkB;AAAA,EACzB;AACF;;;ACpFO,IAAM,cAAN,MAAkB;AAAA,EAAlB;AACL,SAAQ,QAA0C,CAAC;AACnD,SAAQ,eAAgD,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,EAKlD,SAAS,OAA+C;AAC7D,SAAK,QAAQ,EAAE,GAAG,KAAK,OAAO,GAAG,MAAM;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKO,QAAQ,QAA8C;AAC3D,WAAO,KAAK,MAAM,MAAM;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,YACX,WACA,QACA,OACqC;AACrC,UAAM,OAAO,KAAK,MAAM,MAAM;AAC9B,QAAI,CAAC,QAAQ,CAAC,KAAK,QAAS,QAAO;AAEnC,UAAM,UAAU,GAAG,aAAa,SAAS,IAAI,MAAM;AAEnD,QAAI;AAEF,UAAI,KAAK,wBAAwB;AAC/B,YAAI,CAAC,KAAK,aAAa,OAAO,GAAG;AAC/B,eAAK,aAAa,OAAO,IAAI,QAAQ;AAAA,YACnC,KAAK,QAAQ,WAAW,MAAM,QAAQ,KAAK,CAAC;AAAA,UAC9C;AAAA,QACF;AAEA,cAAM,SAAS,MAAM,KAAK,aAAa,OAAO;AAC9C,eAAO,KAAK,aAAa,OAAO;AAChC,eAAO;AAAA,MACT;AAGA,aAAO,MAAM,KAAK,QAAQ,WAAW,MAAM,QAAQ,KAAK,CAAC;AAAA,IAC3D,SACO,WAAW;AAChB,cAAQ,MAAM,kCAAkC,MAAM,KAAK,SAAS;AAEpE,UAAI,KAAK,gBAAgB;AACvB,cAAM,KAAK,eAAe,WAAW,SAAS;AAAA,MAChD;AAEA,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,mBAAmB,WAAmB,QAAoB,OAA2B;AAChG,UAAM,OAAO,KAAK,MAAM,MAAM;AAC9B,QAAI,6BAAM,sBAAsB;AAC9B,YAAM,KAAK,qBAAqB,WAAW,KAAK;AAAA,IAClD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKO,YAAY,QAA6B;AAC9C,UAAM,OAAO,KAAK,MAAM,MAAM;AAC9B,WAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK;AAAA,EAC1B;AACF;;;ACjFA,gBAAe;;;ACAR,IAAM,aAAN,cAAyB,MAAM;AAAA,EAOpC,YAAY,UAAoB,OAAY,CAAC,GAAG,OAAe,eAAe;AAC5E,UAAM;AAPR,gBAAe;AAQb,UAAM,iBAAiB;AAEvB,UAAM,aAAa,CAACA,OAAW,cAC7B,UACG,IAAI,CAAC,SAAS;AACb,YAAM,QAAQ,KAAK,MAAM,GAAG;AAC5B,UAAI,QAAQA;AACZ,iBAAW,QAAQ,OAAO;AACxB,gBAAQ,+BAAQ;AAAA,MAClB;AACA,aAAO;AAAA,IACT,CAAC,EACA,KAAK,CAAC,YAAY,OAAO,YAAY,QAAQ,KAAK;AAEvD,UAAM,kBAAkB,WAAW,MAAM;AAAA,MACvC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAED,SAAK,UAAU,mBAAmB,SAAS,cAAc;AACzD,SAAK,SAAS,SAAS;AACvB,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,SAAK,UAAU,KAAK,WAAW;AAC/B,WAAO,eAAe,MAAM,WAAW,SAAS;AAAA,EAClD;AACF;;;ACrCO,SAAS,gBAAgB,KAAoB;AAClD,QAAM,KAAK,IAAI,SAAS;AACxB,UAAQ,IAAI,KAAK;AAAA,IACf,KAAK,YAAY;AACf,iBAAW,CAAC,KAAK,KAAK,KAAK,IAAI,OAAO;AACpC,mBAAW,QAAQ,OAAO;AACxB,cAAI,mBAAmB,gBAAgB,IAAI;AAC3C,cAAI,4BAA4B,UAAU;AAExC,kBAAM,UAAU;AAChB,uBAAW,CAAC,QAAQ,QAAQ,KAAK,QAAQ,QAAQ,GAAG;AAClD,iBAAG,OAAO,GAAG,GAAG,IAAI,MAAM,KAAK,QAAQ;AAAA,YACzC;AAAA,UACF,OAAO;AACL,eAAG,OAAO,KAAK,gBAAgB;AAAA,UACjC;AAAA,QACF;AAAA,MACF;AACA;AAAA,IACF;AAAA,IACA,KAAK;AAAA,IACL,KAAK,QAAQ;AACX,YAAM,EAAE,MAAM,MAAM,aAAa,IAAI;AACrC,YAAM,SAAS,KAAK,IAAI,KAAK;AAC7B,YAAM,MAAM,IAAI,WAAW,OAAO,MAAM;AACxC,eAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,IAAK,KAAI,CAAC,IAAI,OAAO,WAAW,CAAC;AACpE,YAAM,OAAO,CAAC,IAAI,MAAM;AACxB,YAAM,aACJ,IAAI,QAAQ,SACR,IAAI,KAAK,MAAM,MAAM,EAAE,MAAM,aAAa,CAAC,IAC3C,IAAI,KAAK,MAAM,EAAE,KAAK,CAAC;AAC7B,SAAG,OAAO,QAAQ,UAAU;AAC5B;AAAA,IACF;AAAA,IACA,KAAK,QAAQ;AACX,SAAG,OAAO,QAAQ,KAAK,UAAU,KAAK,MAAM,IAAI,KAAK,CAAC,CAAC;AACvD;AAAA,IACF;AAAA,IACA;AACE,YAAM,IAAI,MAAM,sCAAsC;AAAA,EAC1D;AACA,SAAO;AACT;;;AFlCO,IAAM,aAAN,MAAiB;AAAA;AAAA;AAAA;AAAA,EAItB,MAAa,YAAY,WAA0B,WAAsD;AACvG,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAc;AAAA,MACd,aAAa;AAAA,MACb,UAAU;AAAA,MACV;AAAA,MACA;AAAA,IACF,IAAI;AAGJ,UAAM,mBAAmB,iCAAQ;AAGjC,QAAI,mBAAwC,CAAC;AAG7C,QAAI,aAAa;AACf,UAAI,uBAAuB,iBAAiB;AAC1C,oBAAY,QAAQ,CAAC,KAAK,QAAQ;AAChC,2BAAiB,GAAG,IAAI;AAAA,QAC1B,CAAC;AAAA,MACH,OAAO;AACL,2BAAmB,EAAE,GAAI,YAAoB;AAAA,MAC/C;AAAA,IACF;AAGA,QAAI,qBAAqB,OAAO;AAC9B,UAAI,MAAM;AACR,2BAAmB,EAAE,GAAG,kBAAkB,GAAG,KAAK;AAAA,MACpD;AACA,UAAI,MAAM;AACR,2BAAmB,EAAE,GAAG,kBAAkB,GAAG,KAAK;AAAA,MACpD;AAAA,IACF;AAEA,UAAM,MAAM,KAAK,SAAS,MAAM,OAAO,gBAAgB;AACvD,UAAM,cAAc,QAAQ;AAG5B,UAAM,WAAW,KAAK,gBAAgB,KAAK;AAG3C,UAAM,eAAe,KAAK,kBAAkB;AAAA,MAC1C,QAAQ;AAAA,MACR,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAGD,QAAI;AACF,cAAQ,IAAI,gCAAyB,GAAG,EAAE;AAC1C,YAAM,WAAW,MAAM,MAAM,KAAK,YAAY;AAC9C,aAAO,MAAM,KAAK,eAAe,QAAQ;AAAA,IAC3C,SAAS,OAAY;AAEnB,cAAQ,MAAM,oCAA6B,OAAO,WAAW,+BAAO,MAAM;AAC1E,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,SAAS,MAA0B,OAAgB,aAA2B;AACpF,UAAM,UAAU,QAAQ;AACxB,QAAI,MAAM,GAAG,OAAO,GAAG,SAAS,EAAE;AAClC,QAAI,eAAe,OAAO,KAAK,WAAW,EAAE,SAAS,GAAG;AACtD,aAAO,IAAI,UAAAC,QAAG,UAAU,WAAW,CAAC;AAAA,IACtC;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAgB,OAAiC;AACvD,QAAI,CAAC,MAAO,QAAO;AAEnB,UAAM,WAAW,gBAAgB,KAAK;AAEtC,UAAM,UAAU;AAChB,aAAS,CAAC,KAAK,KAAK,KAAK,QAAQ,QAAQ,GAAG;AAC1C,cAAQ,IAAI,YAAY,GAAG,KAAK,KAAK;AAAA,IACvC;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAUgB;AACd,UAAM,iBAAiB,CAAC,QAAQ,OAAO,OAAO;AAE9C,WAAO;AAAA,MACL;AAAA,MACA,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,GAAI,WAAW;AAAA,UACb,eAAe,UAAU,qBAAqB,UAAU,YAAY;AAAA,QACtE;AAAA,QACA,GAAI,CAAC,YAAY,EAAE,gBAAgB,YAAY;AAAA,QAC/C,GAAI,WAAW,CAAC;AAAA,MAClB;AAAA,MACA,MAAM,QAAQ,eAAe,SAAS,MAAM,IACxC,KAAK,UAAU,IAAI,IAClB,YAAY;AAAA,IACnB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,eAAe,UAAkC;AAC7D,QAAI,OAAO;AACX,QAAI;AACF,aAAO,MAAM,SAAS,KAAK;AAC3B,cAAQ,IAAI,4BAAqB,IAAI;AAAA,IACvC,SAAS,OAAO;AAAA,IAEhB;AAEA,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI,WAAW,UAAU,IAAI;AAAA,IACrC;AAEA,WAAO;AAAA,EACT;AACF;;;AGzKO,IAAM,iBAAN,MAAqB;AAAA,EAArB;AACL,SAAQ,WAAwC,CAAC;AACjD,SAAiB,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA,EAK5B,kBAAkB,YAAoB,KAAK,iBAAiB,MAAkC;AACnG,SAAK,SAAS,SAAS,IAAI;AAAA,MACzB,GAAG,KAAK,SAAS,SAAS;AAAA,MAC1B,GAAG;AAAA,IACL;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKO,eAAe,YAAoB,KAAK,iBAA8B;AAC3E,WAAO,KAAK,SAAS,SAAS,KAAK,CAAC;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKO,mBAAmB,YAAoB,KAAK,iBAA0B;AA7B/E;AA8BI,WAAO,CAAC,GAAC,UAAK,SAAS,SAAS,MAAvB,mBAA0B;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKO,qBAAqB,YAAoB,KAAK,iBAAiB,SAAkB,MAAY;AAClG,SAAK,kBAAkB,WAAW,EAAE,YAAY,OAAO,CAAC;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA,EAKO,sBAAsB,YAAoB,KAAK,iBAAuB;AAC3E,SAAK,kBAAkB,WAAW,EAAE,iBAAiB,KAAK,IAAI,EAAE,CAAC;AAAA,EACnE;AACF;;;ACtCO,IAAM,oBAAN,MAAgD;AAAA,EAErD,YAAY,cAA4B;AACtC,SAAK,eAAe;AAAA,EACtB;AAAA,EACA,MAAM,eAAe,WAAqD;AACxE,UAAM,QAAQ,MAAM,KAAK,aAAa,IAAI,SAAS;AACnD,QAAI,EAAC,+BAAO,cAAc,QAAO,CAAC;AAClC,WAAO,EAAE,eAAe,UAAU,MAAM,YAAY,GAAG;AAAA,EACzD;AAAA,EACA,MAAa,QAAQ,WAAkC;AACrD,QAAI,CAAC,KAAK,aAAa,SAAS;AAC9B,YAAM,IAAI,MAAM,uBAAuB;AAAA,IACzC;AACA,UAAM,QAAQ,MAAM,KAAK,aAAa,IAAI,SAAS;AACnD,QAAI,EAAC,+BAAO,gBAAe;AACzB,YAAM,IAAI,MAAM,4BAA4B;AAAA,IAC9C;AACA,UAAM,YAAY,MAAM,KAAK,aAAa,QAAQ,MAAM,eAAe,SAAS;AAChF,UAAM,KAAK,aAAa,IAAI,WAAW,SAAS;AAAA,EAClD;AACF;;;AC3BO,IAAM,oBAAN,MAAgD;AAAA,EAIrD,YAAY,SAAmC;AAC7C,SAAK,WAAW,QAAQ;AACxB,SAAK,WAAW,QAAQ;AAAA,EAC1B;AAAA,EAEA,MAAM,iBAAkD;AACtD,UAAM,UAAU,OAAO,KAAK,GAAG,KAAK,QAAQ,IAAI,KAAK,QAAQ,EAAE,EAAE,SAAS,QAAQ;AAClF,WAAO,EAAE,eAAe,SAAS,OAAO,GAAG;AAAA,EAC7C;AAAA;AAGF;;;AVIA,IAAM,aAAN,MAAiB;AAAA,EAef,cAAc;AAZd,SAAQ,UAAkB;AAU1B;AAAA,SAAQ,cAAc;AAGpB,SAAK,WAAW;AAChB,SAAK,eAAe,CAAC;AAGrB,SAAK,eAAe,IAAI,aAAa;AACrC,SAAK,eAAe,IAAI,aAAa;AACrC,SAAK,cAAc,IAAI,YAAY;AACnC,SAAK,aAAa,IAAI,WAAW;AACjC,SAAK,iBAAiB,IAAI,eAAe;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKO,MAAM;AAAA,IACX;AAAA,IACA;AAAA,IACA,QAAQ,CAAC;AAAA,IACT;AAAA,IACA,UAAU;AAAA,IACV;AAAA,EACF,GAOG;AACD,SAAK,WAAW;AAChB,SAAK,eAAe;AACpB,SAAK,UAAU;AAEf,QAAI,YAAY;AACd,WAAK,aAAa;AAAA,IACpB;AAGA,UAAM,aAA+C,CAAC;AAKtD,QAAI,MAAM,GAAG,MAAM,UAAa,OAAO,KAAK,aAAa,YAAY,YAAY;AAC/E,iBAAW,GAAG,IAAI,KAAK,gCAAgC;AAAA,IACzD;AAGA,eAAW,CAAC,YAAY,IAAI,KAAK,OAAO,QAAQ,KAAK,GAAG;AACtD,UAAI,MAAM;AACR,mBAAW,UAAU,IAAI;AAAA,MAC3B;AAAA,IACF;AAGA,QAAI,OAAO,KAAK,UAAU,EAAE,SAAS,GAAG;AACtC,WAAK,YAAY,SAAS,UAAU;AAAA,IACtC;AAEA,QAAI,OAAO,cAAc,aAAa;AACpC,WAAK,aAAa,aAAa,SAAS;AAAA,IAC1C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,kCAAgD;AACtD,WAAO;AAAA,MACL,aAAa;AAAA,MACb,eAAe;AAAA,MACf,wBAAwB;AAAA,MACxB,YAAY;AAAA,MACZ,SAAS,OAAO,cAAc;AAC5B,YAAI;AACF,kBAAQ,IAAI,oDAA6C,SAAS,EAAE;AACpE,cAAI,CAAC,KAAK,aAAa,SAAS;AAC9B,kBAAM,IAAI,MAAM,8CAA8C;AAAA,UAChE;AAGA,gBAAM,KAAK,aAAa,QAAQ,SAAS;AACzC,iBAAO,CAAC;AAAA,QACV,SAAS,OAAO;AACd,kBAAQ,MAAM,2BAA2B,SAAS,KAAK,KAAK;AAC5D,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA,sBAAsB,OAAO,WAAW,UAAU;AAChD,gBAAQ,MAAM,mDAAmD,SAAS,KAAK,KAAK;AAAA,MACtF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKO,eAAe,UAAwB;AAC5C,SAAK,cAAc;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKO,kBAAkB,WAAmB,MAA0C;AACpF,SAAK,eAAe,kBAAkB,WAAW,IAAI;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,KAAK,eAAmH;AAGnI,UAAM,SAAwB;AAAA,MAC5B,GAAG;AAAA,MACH,WAAW,cAAc,aAAa;AAAA,MACtC,MAAM,cAAc,QAAQ,KAAK;AAAA,IACnC;AAGA,QACE,KAAK,wBAAwB,sBAC5B,KAAK,aAAqB,gBAC3B;AACA,YAAM,iBAAkB,KAAK,aAAqB;AAClD,YAAM,SAAU,KAAK,aAAqB;AAC1C,YAAM,YAAY,OAAO,cAAc,IAAI,gBAAgB,OAAO,WAAW,IAAI,IAAI,gBAAgB;AACrG,gBAAU,IAAI,gBAAgB,MAAM;AACpC,aAAO,cAAc;AAAA,IACvB;AAEA,YAAQ,IAAI,sBAAe,KAAK,UAAU,OAAO,WAAW,OAAO,QAAQ,OAAO,KAAK;AAGvF,UAAM,aAAa,KAAK,aAAa,aAAa,MAAM;AACxD,QAAI,WAAY,QAAO;AAGvB,UAAM,SAAS,MAAM,KAAK,qBAAqB,MAAM;AAGrD,SAAK,aAAa,YAAY,QAAQ,MAAM;AAE5C,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,YAAY,eAAmH;AAC1I,WAAO,KAAK,KAAK,aAAa;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,qBAAqB,eAA4C;AApMjF;AAqMI,UAAM,EAAE,WAAW,YAAY,IAAI;AACnC,QAAI,WAAW;AACf,UAAM,gBAA4C,CAAC;AACnD,QAAI,gBAAgB,EAAE,GAAG,cAAc;AAEvC,QACE,KAAK,wBAAwB,sBAC5B,KAAK,aAAqB,gBAC3B;AACA,YAAM,iBAAkB,KAAK,aAAqB;AAClD,YAAM,SAAU,KAAK,aAAqB;AAC1C,YAAM,YAAY,cAAc,cAAc,IAAI,gBAAgB,cAAc,WAAW,IAAI,IAAI,gBAAgB;AACnH,gBAAU,IAAI,gBAAgB,MAAM;AACpC,oBAAc,cAAc;AAAA,IAC9B;AAEA,WAAO,WAAW,KAAK,aAAa;AAClC,UAAI,2CAAa,SAAS;AACxB,cAAM,IAAI,MAAM,iBAAiB;AAAA,MACnC;AACA;AAEA,UAAI;AAEF,cAAM,cAAsC,cAAc,YAAY,QAClE,MAAM,KAAK,aAAa,eAAe,SAAS,IAChD,CAAC;AAEL,sBAAc,UAAU;AAAA,UACtB,GAAI,cAAc,WAAW,CAAC;AAAA,UAC9B,GAAG;AAAA,QACL;AAGA,YACE,cAAc,YAAY,SAC1B,OAAO,KAAK,WAAW,EAAE,WAAW,KACpC,EACE,KAAK,wBAAwB,sBAC5B,KAAK,aAAqB,iBAE7B;AACA,gBAAM,IAAI,MAAM,GAAG,KAAK,QAAQ,yCAAyC,SAAS,EAAE;AAAA,QACtF;AAGA,cAAM,WAAW,MAAM,KAAK,WAAW,YAAY,eAAe,CAAC,CAAC;AAGpE,aAAK,eAAe,qBAAqB,WAAW,KAAK;AACzD,eAAO;AAAA,MACT,SACO,OAAY;AACjB,cAAM,SAAS,+BAAO;AAGtB,YAAI,CAAC,KAAK,YAAY,YAAY,MAAM,GAAG;AACzC,gBAAM;AAAA,QACR;AAGA,sBAAc,MAAM,KAAK,cAAc,MAAM,KAAK,KAAK;AACvD,cAAM,aAAa,KAAK,YAAY,QAAQ,MAAM;AAClD,cAAM,cAAa,8CAAY,eAAZ,YAA0B,KAAK,aAAa,qBAAqB;AAGpF,YAAI,cAAc,MAAM,IAAI,YAAY;AACtC,gBAAM,KAAK,YAAY,mBAAmB,WAAW,QAAQ,KAAK;AAClE,eAAK,eAAe,qBAAqB,WAAW,IAAI;AACxD,gBAAM;AAAA,QACR;AAGA,YAAI;AACF,gBAAM,aAAa,MAAM,KAAK,YAAY,YAAY,WAAW,QAAQ,KAAK;AAC9E,cAAI,YAAY;AACd,4BAAgB,EAAE,GAAG,eAAe,GAAG,WAAW;AAAA,UACpD;AAAA,QACF,SACO,WAAW;AAChB,eAAK,eAAe,qBAAqB,WAAW,IAAI;AACxD,gBAAM;AAAA,QACR;AAGA,YAAI,yCAAY,eAAe;AAC7B,gBAAM,KAAK,aAAa,kBAAkB;AAAA,YACxC,SAAS,cAAc,MAAM;AAAA,YAC7B,UAAU,MAAM;AAAA,YAChB,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAGA,SAAK,eAAe,qBAAqB,WAAW,IAAI;AACxD,UAAM,IAAI,MAAM,8BAA8B,KAAK,WAAW,qBAAqB,SAAS,EAAE;AAAA,EAChG;AAAA;AAAA;AAAA;AAAA,EAKO,aAAa,cAA4B;AAC9C,SAAK,aAAa,aAAa,YAAY;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKO,aAAmB;AACxB,SAAK,aAAa,WAAW;AAAA,EAC/B;AACF;AAOA,IAAO,gBAAQ;","names":["data","qs"]}
package/dist/index.mjs CHANGED
@@ -509,11 +509,15 @@ var ApiService = class {
509
509
  authProvider,
510
510
  hooks = {},
511
511
  cacheTime,
512
- baseUrl = ""
512
+ baseUrl = "",
513
+ httpClient
513
514
  }) {
514
515
  this.provider = provider;
515
516
  this.authProvider = authProvider;
516
517
  this.baseUrl = baseUrl;
518
+ if (httpClient) {
519
+ this.httpClient = httpClient;
520
+ }
517
521
  const finalHooks = {};
518
522
  if (hooks[401] === void 0 && typeof this.authProvider.refresh === "function") {
519
523
  finalHooks[401] = this.createDefaultAuthRefreshHandler();
@@ -684,6 +688,7 @@ var index_default = ApiService;
684
688
  export {
685
689
  AccountManager,
686
690
  ApiKeyAuthProvider,
691
+ ApiService,
687
692
  BasicAuthProvider,
688
693
  CacheManager,
689
694
  FetchError,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ApiKeyAuthProvider.ts","../src/CacheManager.ts","../src/RetryManager.ts","../src/HookManager.ts","../src/HttpClient.ts","../src/FetchError.ts","../src/form.ts","../src/AccountManager.ts","../src/TokenAuthProvider.ts","../src/BasicAuthProvider.ts","../src/index.ts"],"sourcesContent":["import { AuthProvider, ApiKeyAuthProviderOptions } from './types';\n\nexport class ApiKeyAuthProvider implements AuthProvider {\n private apiKey: string;\n private headerName?: string;\n private queryParamName?: string;\n\n constructor(options: ApiKeyAuthProviderOptions) {\n this.apiKey = options.apiKey;\n this.headerName = options.headerName;\n this.queryParamName = options.queryParamName;\n }\n\n async getAuthHeaders(): Promise<Record<string, string>> {\n if (this.headerName) {\n return { [this.headerName]: this.apiKey };\n }\n // If using query param, return empty headers (handled elsewhere)\n return {};\n }\n\n // For API key, refresh is not supported\n} ","import { ApiCallParams } from './types';\n\n/**\n * Handles caching of API responses\n */\nexport class CacheManager {\n private cache: Map<string, { data: any; timestamp: number }> = new Map();\n private cacheTime = 20000; // Default cache time of 20 seconds\n\n /**\n * Get data from cache if available and not expired\n */\n public getFromCache(apiCallParams: ApiCallParams): any {\n const requestKey = this.getRequestKey(apiCallParams);\n const currentCacheTime = apiCallParams.cacheTime ?? this.cacheTime;\n const cached = this.cache.get(requestKey);\n \n if (cached && (Date.now() - cached.timestamp < currentCacheTime)) {\n return cached.data;\n }\n \n return null;\n }\n\n /**\n * Save data to cache\n */\n public saveToCache(apiCallParams: ApiCallParams, data: any): void {\n const requestKey = this.getRequestKey(apiCallParams);\n this.cache.set(requestKey, { \n data, \n timestamp: Date.now() \n });\n }\n\n /**\n * Generate a unique key for caching based on request parameters\n */\n private getRequestKey(apiCallParams: ApiCallParams): string {\n const { accountId, method, route, base, queryParams, body, data } = apiCallParams;\n return JSON.stringify({\n accountId,\n method,\n route,\n base,\n queryParams,\n body: body || data,\n });\n }\n\n /**\n * Set the default cache time in milliseconds\n */\n public setCacheTime(milliseconds: number): void {\n this.cacheTime = milliseconds;\n }\n\n /**\n * Clear the entire cache\n */\n public clearCache(): void {\n this.cache.clear();\n }\n} ","import { DelayStrategy, HookSettings } from './types';\n\n/**\n * Handles retry logic and delay strategies for failed API calls\n */\nexport class RetryManager {\n private defaultMaxDelay = 60000; // Default max delay of 1 minute\n private defaultMaxRetries = 4;\n\n /**\n * Default exponential backoff strategy with full jitter\n */\n private defaultDelayStrategy: DelayStrategy = {\n calculate: (attempt: number, response?: any) => {\n // Check for Retry-After header\n const retryAfter = this.getRetryAfterValue(response);\n if (retryAfter) return retryAfter;\n \n // Exponential backoff with full jitter\n const baseDelay = 1000; // 1 second\n const exponentialDelay = baseDelay * Math.pow(2, attempt - 1);\n return Math.floor(Math.random() * exponentialDelay);\n },\n };\n\n /**\n * Calculate and wait for appropriate delay time before retry\n */\n public async calculateAndDelay(params: {\n attempt: number;\n response?: any;\n hook: HookSettings;\n }): Promise<void> {\n const { attempt, response, hook } = params;\n const delayStrategy = hook.delayStrategy || this.defaultDelayStrategy;\n const maxDelay = hook.maxDelay || this.defaultMaxDelay;\n\n const calculatedDelay = delayStrategy.calculate(attempt, response);\n const finalDelay = Math.min(calculatedDelay, maxDelay);\n\n console.log(`🔄 Waiting for ${finalDelay / 1000} seconds before retrying.`);\n await new Promise(resolve => setTimeout(resolve, finalDelay));\n }\n\n /**\n * Extract retry-after value from response\n */\n private getRetryAfterValue(response?: any): number | null {\n if (!response?.headers?.get) return null;\n \n const retryAfter = response.headers.get('Retry-After');\n if (!retryAfter) return null;\n \n // Handle numeric retry-after\n const parsedDelay = parseInt(retryAfter, 10);\n if (!isNaN(parsedDelay)) {\n return parsedDelay * 1000;\n }\n \n // Handle date retry-after\n const date = new Date(retryAfter).getTime();\n const now = Date.now();\n if (date > now) {\n return date - now;\n }\n \n return null;\n }\n \n /**\n * Get the default maximum number of retries\n */\n public getDefaultMaxRetries(): number {\n return this.defaultMaxRetries;\n }\n \n /**\n * Set the default maximum number of retries\n */\n public setDefaultMaxRetries(maxRetries: number): void {\n this.defaultMaxRetries = maxRetries;\n }\n \n /**\n * Set the default maximum delay between retries\n */\n public setDefaultMaxDelay(maxDelay: number): void {\n this.defaultMaxDelay = maxDelay;\n }\n} ","import { HookSettings, StatusCode } from './types';\n\n/**\n * Manages hooks for different status codes and their processing\n */\nexport class HookManager {\n private hooks: Record<StatusCode, HookSettings> = {};\n private hookPromises: Record<string, Promise<object>> = {};\n\n /**\n * Set hooks for different status codes\n */\n public setHooks(hooks: Record<StatusCode, HookSettings>): void {\n this.hooks = { ...this.hooks, ...hooks };\n }\n\n /**\n * Get a hook for a specific status code\n */\n public getHook(status: StatusCode): HookSettings | undefined {\n return this.hooks[status];\n }\n\n /**\n * Process a hook for a specific status code\n */\n public async processHook(\n accountId: string,\n status: StatusCode,\n error: any\n ): Promise<Record<string, any> | null> {\n const hook = this.hooks[status];\n if (!hook || !hook.handler) return null;\n \n const hookKey = `${accountId || 'default'}-${status}`;\n \n try {\n // Handle waiting for existing hook call if needed\n if (hook.preventConcurrentCalls) {\n if (!this.hookPromises[hookKey]) {\n this.hookPromises[hookKey] = Promise.resolve(\n hook.handler(accountId, error.response) || {}\n );\n }\n \n const result = await this.hookPromises[hookKey];\n delete this.hookPromises[hookKey];\n return result;\n } \n \n // Otherwise just call the hook directly\n return await hook.handler(accountId, error.response) || {};\n } \n catch (hookError) {\n console.error(`Hook handler failed for status ${status}:`, hookError);\n \n if (hook.onHandlerError) {\n await hook.onHandlerError(accountId, hookError);\n }\n \n throw hookError;\n }\n }\n\n /**\n * Handle a retry failure with the appropriate hook\n */\n public async handleRetryFailure(accountId: string, status: StatusCode, error: any): Promise<void> {\n const hook = this.hooks[status];\n if (hook?.onMaxRetriesExceeded) {\n await hook.onMaxRetriesExceeded(accountId, error);\n }\n }\n\n /**\n * Check if a hook exists and should retry for a given status\n */\n public shouldRetry(status: StatusCode): boolean {\n const hook = this.hooks[status];\n return !!hook && !!hook.shouldRetry;\n }\n} ","import qs from 'qs';\nimport { ApiCallParams, Token } from './types';\nimport { FetchError } from './FetchError';\nimport { deserializeForm } from './form';\n\n/**\n * Handles HTTP requests to external APIs\n */\nexport class HttpClient {\n /**\n * Make an HTTP request\n */\n public async makeRequest(apiParams: ApiCallParams, authToken: Token | Record<string, any>): Promise<any> {\n const {\n accountId,\n method,\n route,\n base,\n body,\n data,\n headers,\n queryParams,\n contentType = 'application/json',\n accessToken: forcedAccessToken,\n useAuth = true,\n files,\n abortSignal,\n } = apiParams;\n \n // Build URL and request body\n const normalizedMethod = method?.toUpperCase() as 'GET' | 'POST' | 'PUT' | 'DELETE';\n \n // Process query params\n let finalQueryParams: Record<string, any> = {};\n \n // Handle existing query params (support both URLSearchParams and object)\n if (queryParams) {\n if (queryParams instanceof URLSearchParams) {\n queryParams.forEach((val, key) => {\n finalQueryParams[key] = val;\n });\n } else {\n finalQueryParams = { ...(queryParams as any) };\n }\n }\n \n // For GET requests, merge body/data into query params\n if (normalizedMethod === 'GET') {\n if (body) {\n finalQueryParams = { ...finalQueryParams, ...body };\n }\n if (data) {\n finalQueryParams = { ...finalQueryParams, ...data };\n }\n }\n\n const url = this.buildUrl(base, route, finalQueryParams);\n const requestBody = body || data;\n \n // Handle file uploads\n const formData = this.prepareFormData(files);\n \n // Create fetch options\n const fetchOptions = this.buildFetchOptions({\n method: normalizedMethod,\n body: requestBody,\n formData,\n contentType,\n authToken,\n forcedAccessToken,\n useAuth,\n headers,\n abortSignal,\n });\n\n // Make the request\n try {\n console.log(`🔄 Making API call to ${url}`);\n const response = await fetch(url, fetchOptions);\n return await this.handleResponse(response);\n } catch (error: any) {\n // also console log error code such as 401 ....\n console.error('🔄 Error making API call:', error, 'status:', error?.status);\n throw error;\n }\n }\n\n /**\n * Build URL with query parameters\n */\n private buildUrl(base: string | undefined, route?: string, queryParams?: any): string {\n const baseUrl = base || '';\n let url = `${baseUrl}${route || ''}`;\n if (queryParams && Object.keys(queryParams).length > 0) {\n url += `?${qs.stringify(queryParams)}`;\n }\n return url;\n }\n\n /**\n * Prepare form data for file uploads\n */\n private prepareFormData(files?: File[]): FormData | null {\n if (!files) return null;\n \n const formData = deserializeForm(files);\n // Use a workaround for TypeScript FormData entries() issue\n const entries = formData as any;\n for (let [key, value] of entries.entries()) {\n console.log(`formdata ${key}:`, value);\n }\n return formData;\n }\n\n /**\n * Build fetch options for request\n */\n private buildFetchOptions({\n method,\n body,\n formData,\n contentType,\n authToken,\n forcedAccessToken,\n useAuth,\n headers,\n abortSignal,\n }: {\n method: string;\n body: any;\n formData: FormData | null;\n contentType: string;\n authToken: any;\n forcedAccessToken?: string;\n useAuth: boolean;\n headers?: Record<string, string>;\n abortSignal?: AbortSignal;\n }): RequestInit {\n const allowedMethods = ['POST', 'PUT', 'PATCH'];\n \n return {\n method,\n signal: abortSignal,\n headers: {\n ...(useAuth && { \n Authorization: `Bearer ${forcedAccessToken || authToken.access_token}` \n }),\n ...(!formData && { 'content-type': contentType }),\n ...(headers || {}),\n },\n body: body && allowedMethods.includes(method) \n ? JSON.stringify(body) \n : (formData || null),\n };\n }\n\n /**\n * Handle API response\n */\n private async handleResponse(response: Response): Promise<any> {\n let data = null;\n try {\n data = await response.json();\n console.log('🔄 Response data:', data);\n } catch (error) {\n // Response wasn't JSON, continue with null data\n }\n \n if (!response.ok) {\n throw new FetchError(response, data);\n }\n \n return data;\n }\n} ","export class FetchError extends Error {\n name: string = 'FetchError';\n status: number;\n code: string;\n message: string;\n data: any;\n\n constructor(response: Response, data: any = {}, code: string = 'FETCH_ERROR') {\n super();\n const defaultMessage = 'An unspecified error occurred';\n\n const getMessage = (data: any, locations: string[]): string | null =>\n locations\n .map((item) => {\n const parts = item.split('.');\n let value = data;\n for (const part of parts) {\n value = value?.[part];\n }\n return value;\n })\n .find((message) => typeof message === 'string') || null;\n\n const messageFromData = getMessage(data, [\n 'error.errors.0.message',\n 'error.message',\n 'error',\n 'message',\n ]);\n\n this.message = messageFromData || response.statusText || defaultMessage;\n this.status = response.status;\n this.code = code;\n this.data = data;\n this.message = this.message || defaultMessage;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","export function deserializeForm(src: any): FormData {\n const fd = new FormData();\n switch (src.cls) {\n case 'FormData': {\n for (const [key, items] of src.value) {\n for (const item of items) {\n let deserializedItem = deserializeForm(item);\n if (deserializedItem instanceof FormData) {\n // Use a workaround for TypeScript FormData entries() issue\n const entries = deserializedItem as any;\n for (const [subKey, subValue] of entries.entries()) {\n fd.append(`${key}[${subKey}]`, subValue);\n }\n } else {\n fd.append(key, deserializedItem);\n }\n }\n }\n break;\n }\n case 'Blob':\n case 'File': {\n const { type, name, lastModified } = src;\n const binStr = atob(src.value);\n const arr = new Uint8Array(binStr.length);\n for (let i = 0; i < binStr.length; i++) arr[i] = binStr.charCodeAt(i);\n const data = [arr.buffer];\n const fileOrBlob =\n src.cls === 'File'\n ? new File(data, name, { type, lastModified })\n : new Blob(data, { type });\n fd.append('file', fileOrBlob);\n break;\n }\n case 'json': {\n fd.append('json', JSON.stringify(JSON.parse(src.value)));\n break;\n }\n default:\n throw new Error('Unsupported type for deserialization');\n }\n return fd;\n}\n","import { AccountData } from './types';\n\n/**\n * Manages account data and state\n */\nexport class AccountManager {\n private accounts: Record<string, AccountData> = {};\n private readonly DEFAULT_ACCOUNT = 'default';\n\n /**\n * Update account data for a specific account\n */\n public updateAccountData(accountId: string = this.DEFAULT_ACCOUNT, data: Partial<AccountData>): void {\n this.accounts[accountId] = { \n ...this.accounts[accountId], \n ...data \n };\n }\n\n /**\n * Get account data for a specific account\n */\n public getAccountData(accountId: string = this.DEFAULT_ACCOUNT): AccountData {\n return this.accounts[accountId] || {};\n }\n\n /**\n * Check if an account's last request failed\n */\n public didLastRequestFail(accountId: string = this.DEFAULT_ACCOUNT): boolean {\n return !!this.accounts[accountId]?.lastFailed;\n }\n\n /**\n * Set account's last request as failed\n */\n public setLastRequestFailed(accountId: string = this.DEFAULT_ACCOUNT, failed: boolean = true): void {\n this.updateAccountData(accountId, { lastFailed: failed });\n }\n\n /**\n * Update the last request time for an account\n */\n public updateLastRequestTime(accountId: string = this.DEFAULT_ACCOUNT): void {\n this.updateAccountData(accountId, { lastRequestTime: Date.now() });\n }\n} ","import { AuthProvider, Token, OAuthToken } from './types';\n\nexport type TokenService = {\n get: (accountId?: string) => Promise<Token>;\n set: (token: Partial<Token>, accountId?: string) => Promise<void>;\n refresh?: (refreshToken: string, accountId?: string) => Promise<OAuthToken>;\n};\n\nexport class TokenAuthProvider implements AuthProvider {\n private tokenService: TokenService;\n constructor(tokenService: TokenService) {\n this.tokenService = tokenService;\n }\n async getAuthHeaders(accountId?: string): Promise<Record<string, string>> {\n const token = await this.tokenService.get(accountId);\n if (!token?.access_token) return {};\n return { Authorization: `Bearer ${token.access_token}` };\n }\n public async refresh(accountId: string): Promise<void> {\n if (!this.tokenService.refresh) {\n throw new Error('Refresh not supported');\n }\n const token = await this.tokenService.get(accountId);\n if (!token?.refresh_token) {\n throw new Error('No refresh token available');\n }\n const newTokens = await this.tokenService.refresh(token.refresh_token, accountId);\n await this.tokenService.set(newTokens, accountId);\n }\n}","import { AuthProvider, BasicAuthProviderOptions } from './types';\n\nexport class BasicAuthProvider implements AuthProvider {\n private username: string;\n private password: string;\n\n constructor(options: BasicAuthProviderOptions) {\n this.username = options.username;\n this.password = options.password;\n }\n\n async getAuthHeaders(): Promise<Record<string, string>> {\n const encoded = Buffer.from(`${this.username}:${this.password}`).toString('base64');\n return { Authorization: `Basic ${encoded}` };\n }\n\n // No refresh for basic auth\n} ","import { \n AuthProvider,\n ApiCallParams,\n HookSettings,\n StatusCode,\n Token,\n OAuthToken\n} from './types';\nimport { ApiKeyAuthProvider } from './ApiKeyAuthProvider';\nimport {\n CacheManager,\n RetryManager,\n HookManager,\n HttpClient,\n AccountManager\n} from './components';\n\n/**\n * ApiService - Core API service for making authenticated API calls\n * with caching, retry, and hook support.\n */\nclass ApiService {\n public provider: string; // Service provider name\n private authProvider: AuthProvider;\n private baseUrl: string = ''; // Default base URL\n \n // Component managers\n private cacheManager: CacheManager;\n private retryManager: RetryManager;\n private hookManager: HookManager;\n private httpClient: HttpClient;\n private accountManager: AccountManager;\n \n // Default max attempts for API calls\n private maxAttempts = 10;\n\n constructor() {\n this.provider = '';\n this.authProvider = {} as AuthProvider;\n \n // Initialize component managers\n this.cacheManager = new CacheManager();\n this.retryManager = new RetryManager();\n this.hookManager = new HookManager();\n this.httpClient = new HttpClient();\n this.accountManager = new AccountManager();\n }\n\n /**\n * Setup the API service\n */\n public setup({\n provider,\n authProvider,\n hooks = {},\n cacheTime,\n baseUrl = '',\n }: {\n provider: string;\n authProvider: AuthProvider;\n hooks?: Record<StatusCode, HookSettings | null>;\n cacheTime: number;\n baseUrl?: string;\n }) {\n this.provider = provider;\n this.authProvider = authProvider;\n this.baseUrl = baseUrl;\n \n // Create a copy of hooks to avoid modifying the input\n const finalHooks: Record<StatusCode, HookSettings> = {};\n \n // Apply default 401 handler if:\n // 1. No 401 hook is explicitly defined (or is explicitly null)\n // 2. AuthProvider has a refresh method\n if (hooks[401] === undefined && typeof this.authProvider.refresh === 'function') {\n finalHooks[401] = this.createDefaultAuthRefreshHandler();\n }\n \n // Add user-defined hooks (skipping null/undefined values)\n for (const [statusCode, hook] of Object.entries(hooks)) {\n if (hook) {\n finalHooks[statusCode] = hook;\n }\n }\n \n // Set the hooks if we have any\n if (Object.keys(finalHooks).length > 0) {\n this.hookManager.setHooks(finalHooks);\n }\n \n if (typeof cacheTime !== 'undefined') {\n this.cacheManager.setCacheTime(cacheTime);\n }\n }\n \n /**\n * Create a default handler for 401 (Unauthorized) errors\n * that implements standard credential refresh behavior\n */\n private createDefaultAuthRefreshHandler(): HookSettings {\n return {\n shouldRetry: true,\n useRetryDelay: true,\n preventConcurrentCalls: true,\n maxRetries: 1,\n handler: async (accountId) => {\n try {\n console.log(`🔄 Using default auth refresh handler for ${accountId}`);\n if (!this.authProvider.refresh) {\n throw new Error('No refresh method available on auth provider');\n }\n // You may want to store refresh token in account data or pass it in another way\n // For now, assume refresh token is managed internally by the provider\n await this.authProvider.refresh(accountId);\n return {};\n } catch (error) {\n console.error(`Auth refresh failed for ${accountId}:`, error);\n throw error;\n }\n },\n onMaxRetriesExceeded: async (accountId, error) => {\n console.error(`Authentication failed after refresh attempt for ${accountId}:`, error);\n }\n };\n }\n \n /**\n * Set the maximum number of retry attempts\n */\n public setMaxAttempts(attempts: number): void {\n this.maxAttempts = attempts;\n }\n\n /**\n * Update account data\n */\n public updateAccountData(accountId: string, data: Partial<Record<string, any>>): void {\n this.accountManager.updateAccountData(accountId, data);\n }\n\n /**\n * Make an API call with all features (caching, retry, hooks)\n */\n public async call(apiCallParams: Omit<ApiCallParams, 'accountId'> & { accountId?: string; abortSignal?: AbortSignal }): Promise<any> {\n // Use 'default' as fallback if accountId is not provided\n // and use default baseUrl if not provided\n const params: ApiCallParams = {\n ...apiCallParams,\n accountId: apiCallParams.accountId || 'default',\n base: apiCallParams.base || this.baseUrl,\n };\n\n // If using ApiKeyAuthProvider with queryParamName, add API key to queryParams\n if (\n this.authProvider instanceof ApiKeyAuthProvider &&\n (this.authProvider as any).queryParamName\n ) {\n const queryParamName = (this.authProvider as any).queryParamName;\n const apiKey = (this.authProvider as any).apiKey;\n const urlParams = params.queryParams ? new URLSearchParams(params.queryParams) : new URLSearchParams();\n urlParams.set(queryParamName, apiKey);\n params.queryParams = urlParams;\n }\n\n console.log('🔄 API call', this.provider, params.accountId, params.method, params.route);\n \n // Check cache first\n const cachedData = this.cacheManager.getFromCache(params);\n if (cachedData) return cachedData;\n\n // Make the API call with retry capability\n const result = await this.makeRequestWithRetry(params);\n \n // Cache the result\n this.cacheManager.saveToCache(params, result);\n \n return result;\n }\n\n /**\n * Legacy method for backward compatibility\n * @deprecated Use call() instead\n */\n public async makeApiCall(apiCallParams: Omit<ApiCallParams, 'accountId'> & { accountId?: string; abortSignal?: AbortSignal }): Promise<any> {\n return this.call(apiCallParams);\n }\n\n /**\n * Make a request with retry capability\n */\n private async makeRequestWithRetry(apiCallParams: ApiCallParams): Promise<any> {\n const { accountId, abortSignal } = apiCallParams;\n let attempts = 0;\n const statusRetries: Record<StatusCode, number> = {};\n let currentParams = { ...apiCallParams };\n // If using ApiKeyAuthProvider with queryParamName, add API key to queryParams\n if (\n this.authProvider instanceof ApiKeyAuthProvider &&\n (this.authProvider as any).queryParamName\n ) {\n const queryParamName = (this.authProvider as any).queryParamName;\n const apiKey = (this.authProvider as any).apiKey;\n const urlParams = currentParams.queryParams ? new URLSearchParams(currentParams.queryParams) : new URLSearchParams();\n urlParams.set(queryParamName, apiKey);\n currentParams.queryParams = urlParams;\n }\n // Main retry loop\n while (attempts < this.maxAttempts) {\n if (abortSignal?.aborted) {\n throw new Error('Request aborted');\n }\n attempts++;\n \n try {\n // Get authentication headers if needed\n const authHeaders: Record<string, string> = apiCallParams.useAuth !== false\n ? await this.authProvider.getAuthHeaders(accountId)\n : {};\n // Merge auth headers into params.headers\n currentParams.headers = {\n ...(currentParams.headers || {}),\n ...authHeaders,\n };\n \n // Verify we have authentication if required\n if (\n apiCallParams.useAuth !== false &&\n Object.keys(authHeaders).length === 0 &&\n !(\n this.authProvider instanceof ApiKeyAuthProvider &&\n (this.authProvider as any).queryParamName\n )\n ) {\n throw new Error(`${this.provider} credentials not found for account ID ${accountId}`);\n }\n \n // Make the actual API call\n const response = await this.httpClient.makeRequest(currentParams, {});\n \n // Success - update account status and return result\n this.accountManager.setLastRequestFailed(accountId, false);\n return response;\n } \n catch (error: any) {\n const status = error?.status;\n \n // If no hook exists for this error, or we shouldn't retry, throw\n if (!this.hookManager.shouldRetry(status)) {\n throw error;\n }\n \n // Track retries for this status code\n statusRetries[status] = (statusRetries[status] || 0) + 1;\n const activeHook = this.hookManager.getHook(status);\n const maxRetries = activeHook?.maxRetries ?? this.retryManager.getDefaultMaxRetries();\n \n // Check if we've exceeded retries for this status\n if (statusRetries[status] > maxRetries) {\n await this.hookManager.handleRetryFailure(accountId, status, error);\n this.accountManager.setLastRequestFailed(accountId, true);\n throw error;\n }\n \n // Process the hook to get updated params\n try {\n const hookResult = await this.hookManager.processHook(accountId, status, error);\n if (hookResult) {\n currentParams = { ...currentParams, ...hookResult };\n }\n } \n catch (hookError) {\n this.accountManager.setLastRequestFailed(accountId, true);\n throw hookError;\n }\n \n // Wait before retrying if needed\n if (activeHook?.useRetryDelay) {\n await this.retryManager.calculateAndDelay({\n attempt: statusRetries[status],\n response: error.response,\n hook: activeHook,\n });\n }\n }\n }\n \n // If we've reached here, we've exceeded our maximum attempts\n this.accountManager.setLastRequestFailed(accountId, true);\n throw new Error(`Exceeded maximum attempts (${this.maxAttempts}) for API call to ${accountId}`);\n }\n\n /**\n * Set the cache time in milliseconds\n */\n public setCacheTime(milliseconds: number): void {\n this.cacheManager.setCacheTime(milliseconds);\n }\n\n /**\n * Clear the cache\n */\n public clearCache(): void {\n this.cacheManager.clearCache();\n }\n}\n\nexport * from './types';\nexport * from './FetchError';\nexport * from './components';\n\nexport default ApiService;\n"],"mappings":"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","names":["data"]}
1
+ {"version":3,"sources":["../src/ApiKeyAuthProvider.ts","../src/CacheManager.ts","../src/RetryManager.ts","../src/HookManager.ts","../src/HttpClient.ts","../src/FetchError.ts","../src/form.ts","../src/AccountManager.ts","../src/TokenAuthProvider.ts","../src/BasicAuthProvider.ts","../src/index.ts"],"sourcesContent":["import { AuthProvider, ApiKeyAuthProviderOptions } from './types';\n\nexport class ApiKeyAuthProvider implements AuthProvider {\n private apiKey: string;\n private headerName?: string;\n private queryParamName?: string;\n\n constructor(options: ApiKeyAuthProviderOptions) {\n this.apiKey = options.apiKey;\n this.headerName = options.headerName;\n this.queryParamName = options.queryParamName;\n }\n\n async getAuthHeaders(): Promise<Record<string, string>> {\n if (this.headerName) {\n return { [this.headerName]: this.apiKey };\n }\n // If using query param, return empty headers (handled elsewhere)\n return {};\n }\n\n // For API key, refresh is not supported\n} ","import { ApiCallParams } from './types';\n\n/**\n * Handles caching of API responses\n */\nexport class CacheManager {\n private cache: Map<string, { data: any; timestamp: number }> = new Map();\n private cacheTime = 20000; // Default cache time of 20 seconds\n\n /**\n * Get data from cache if available and not expired\n */\n public getFromCache(apiCallParams: ApiCallParams): any {\n const requestKey = this.getRequestKey(apiCallParams);\n const currentCacheTime = apiCallParams.cacheTime ?? this.cacheTime;\n const cached = this.cache.get(requestKey);\n \n if (cached && (Date.now() - cached.timestamp < currentCacheTime)) {\n return cached.data;\n }\n \n return null;\n }\n\n /**\n * Save data to cache\n */\n public saveToCache(apiCallParams: ApiCallParams, data: any): void {\n const requestKey = this.getRequestKey(apiCallParams);\n this.cache.set(requestKey, { \n data, \n timestamp: Date.now() \n });\n }\n\n /**\n * Generate a unique key for caching based on request parameters\n */\n private getRequestKey(apiCallParams: ApiCallParams): string {\n const { accountId, method, route, base, queryParams, body, data } = apiCallParams;\n return JSON.stringify({\n accountId,\n method,\n route,\n base,\n queryParams,\n body: body || data,\n });\n }\n\n /**\n * Set the default cache time in milliseconds\n */\n public setCacheTime(milliseconds: number): void {\n this.cacheTime = milliseconds;\n }\n\n /**\n * Clear the entire cache\n */\n public clearCache(): void {\n this.cache.clear();\n }\n} ","import { DelayStrategy, HookSettings } from './types';\n\n/**\n * Handles retry logic and delay strategies for failed API calls\n */\nexport class RetryManager {\n private defaultMaxDelay = 60000; // Default max delay of 1 minute\n private defaultMaxRetries = 4;\n\n /**\n * Default exponential backoff strategy with full jitter\n */\n private defaultDelayStrategy: DelayStrategy = {\n calculate: (attempt: number, response?: any) => {\n // Check for Retry-After header\n const retryAfter = this.getRetryAfterValue(response);\n if (retryAfter) return retryAfter;\n \n // Exponential backoff with full jitter\n const baseDelay = 1000; // 1 second\n const exponentialDelay = baseDelay * Math.pow(2, attempt - 1);\n return Math.floor(Math.random() * exponentialDelay);\n },\n };\n\n /**\n * Calculate and wait for appropriate delay time before retry\n */\n public async calculateAndDelay(params: {\n attempt: number;\n response?: any;\n hook: HookSettings;\n }): Promise<void> {\n const { attempt, response, hook } = params;\n const delayStrategy = hook.delayStrategy || this.defaultDelayStrategy;\n const maxDelay = hook.maxDelay || this.defaultMaxDelay;\n\n const calculatedDelay = delayStrategy.calculate(attempt, response);\n const finalDelay = Math.min(calculatedDelay, maxDelay);\n\n console.log(`🔄 Waiting for ${finalDelay / 1000} seconds before retrying.`);\n await new Promise(resolve => setTimeout(resolve, finalDelay));\n }\n\n /**\n * Extract retry-after value from response\n */\n private getRetryAfterValue(response?: any): number | null {\n if (!response?.headers?.get) return null;\n \n const retryAfter = response.headers.get('Retry-After');\n if (!retryAfter) return null;\n \n // Handle numeric retry-after\n const parsedDelay = parseInt(retryAfter, 10);\n if (!isNaN(parsedDelay)) {\n return parsedDelay * 1000;\n }\n \n // Handle date retry-after\n const date = new Date(retryAfter).getTime();\n const now = Date.now();\n if (date > now) {\n return date - now;\n }\n \n return null;\n }\n \n /**\n * Get the default maximum number of retries\n */\n public getDefaultMaxRetries(): number {\n return this.defaultMaxRetries;\n }\n \n /**\n * Set the default maximum number of retries\n */\n public setDefaultMaxRetries(maxRetries: number): void {\n this.defaultMaxRetries = maxRetries;\n }\n \n /**\n * Set the default maximum delay between retries\n */\n public setDefaultMaxDelay(maxDelay: number): void {\n this.defaultMaxDelay = maxDelay;\n }\n} ","import { HookSettings, StatusCode } from './types';\n\n/**\n * Manages hooks for different status codes and their processing\n */\nexport class HookManager {\n private hooks: Record<StatusCode, HookSettings> = {};\n private hookPromises: Record<string, Promise<object>> = {};\n\n /**\n * Set hooks for different status codes\n */\n public setHooks(hooks: Record<StatusCode, HookSettings>): void {\n this.hooks = { ...this.hooks, ...hooks };\n }\n\n /**\n * Get a hook for a specific status code\n */\n public getHook(status: StatusCode): HookSettings | undefined {\n return this.hooks[status];\n }\n\n /**\n * Process a hook for a specific status code\n */\n public async processHook(\n accountId: string,\n status: StatusCode,\n error: any\n ): Promise<Record<string, any> | null> {\n const hook = this.hooks[status];\n if (!hook || !hook.handler) return null;\n \n const hookKey = `${accountId || 'default'}-${status}`;\n \n try {\n // Handle waiting for existing hook call if needed\n if (hook.preventConcurrentCalls) {\n if (!this.hookPromises[hookKey]) {\n this.hookPromises[hookKey] = Promise.resolve(\n hook.handler(accountId, error.response) || {}\n );\n }\n \n const result = await this.hookPromises[hookKey];\n delete this.hookPromises[hookKey];\n return result;\n } \n \n // Otherwise just call the hook directly\n return await hook.handler(accountId, error.response) || {};\n } \n catch (hookError) {\n console.error(`Hook handler failed for status ${status}:`, hookError);\n \n if (hook.onHandlerError) {\n await hook.onHandlerError(accountId, hookError);\n }\n \n throw hookError;\n }\n }\n\n /**\n * Handle a retry failure with the appropriate hook\n */\n public async handleRetryFailure(accountId: string, status: StatusCode, error: any): Promise<void> {\n const hook = this.hooks[status];\n if (hook?.onMaxRetriesExceeded) {\n await hook.onMaxRetriesExceeded(accountId, error);\n }\n }\n\n /**\n * Check if a hook exists and should retry for a given status\n */\n public shouldRetry(status: StatusCode): boolean {\n const hook = this.hooks[status];\n return !!hook && !!hook.shouldRetry;\n }\n} ","import qs from 'qs';\nimport { ApiCallParams, Token } from './types';\nimport { FetchError } from './FetchError';\nimport { deserializeForm } from './form';\n\n/**\n * Handles HTTP requests to external APIs\n */\nexport class HttpClient {\n /**\n * Make an HTTP request\n */\n public async makeRequest(apiParams: ApiCallParams, authToken: Token | Record<string, any>): Promise<any> {\n const {\n accountId,\n method,\n route,\n base,\n body,\n data,\n headers,\n queryParams,\n contentType = 'application/json',\n accessToken: forcedAccessToken,\n useAuth = true,\n files,\n abortSignal,\n } = apiParams;\n \n // Build URL and request body\n const normalizedMethod = method?.toUpperCase() as 'GET' | 'POST' | 'PUT' | 'DELETE';\n \n // Process query params\n let finalQueryParams: Record<string, any> = {};\n \n // Handle existing query params (support both URLSearchParams and object)\n if (queryParams) {\n if (queryParams instanceof URLSearchParams) {\n queryParams.forEach((val, key) => {\n finalQueryParams[key] = val;\n });\n } else {\n finalQueryParams = { ...(queryParams as any) };\n }\n }\n \n // For GET requests, merge body/data into query params\n if (normalizedMethod === 'GET') {\n if (body) {\n finalQueryParams = { ...finalQueryParams, ...body };\n }\n if (data) {\n finalQueryParams = { ...finalQueryParams, ...data };\n }\n }\n\n const url = this.buildUrl(base, route, finalQueryParams);\n const requestBody = body || data;\n \n // Handle file uploads\n const formData = this.prepareFormData(files);\n \n // Create fetch options\n const fetchOptions = this.buildFetchOptions({\n method: normalizedMethod,\n body: requestBody,\n formData,\n contentType,\n authToken,\n forcedAccessToken,\n useAuth,\n headers,\n abortSignal,\n });\n\n // Make the request\n try {\n console.log(`🔄 Making API call to ${url}`);\n const response = await fetch(url, fetchOptions);\n return await this.handleResponse(response);\n } catch (error: any) {\n // also console log error code such as 401 ....\n console.error('🔄 Error making API call:', error, 'status:', error?.status);\n throw error;\n }\n }\n\n /**\n * Build URL with query parameters\n */\n private buildUrl(base: string | undefined, route?: string, queryParams?: any): string {\n const baseUrl = base || '';\n let url = `${baseUrl}${route || ''}`;\n if (queryParams && Object.keys(queryParams).length > 0) {\n url += `?${qs.stringify(queryParams)}`;\n }\n return url;\n }\n\n /**\n * Prepare form data for file uploads\n */\n private prepareFormData(files?: File[]): FormData | null {\n if (!files) return null;\n \n const formData = deserializeForm(files);\n // Use a workaround for TypeScript FormData entries() issue\n const entries = formData as any;\n for (let [key, value] of entries.entries()) {\n console.log(`formdata ${key}:`, value);\n }\n return formData;\n }\n\n /**\n * Build fetch options for request\n */\n private buildFetchOptions({\n method,\n body,\n formData,\n contentType,\n authToken,\n forcedAccessToken,\n useAuth,\n headers,\n abortSignal,\n }: {\n method: string;\n body: any;\n formData: FormData | null;\n contentType: string;\n authToken: any;\n forcedAccessToken?: string;\n useAuth: boolean;\n headers?: Record<string, string>;\n abortSignal?: AbortSignal;\n }): RequestInit {\n const allowedMethods = ['POST', 'PUT', 'PATCH'];\n \n return {\n method,\n signal: abortSignal,\n headers: {\n ...(useAuth && { \n Authorization: `Bearer ${forcedAccessToken || authToken.access_token}` \n }),\n ...(!formData && { 'content-type': contentType }),\n ...(headers || {}),\n },\n body: body && allowedMethods.includes(method) \n ? JSON.stringify(body) \n : (formData || null),\n };\n }\n\n /**\n * Handle API response\n */\n private async handleResponse(response: Response): Promise<any> {\n let data = null;\n try {\n data = await response.json();\n console.log('🔄 Response data:', data);\n } catch (error) {\n // Response wasn't JSON, continue with null data\n }\n \n if (!response.ok) {\n throw new FetchError(response, data);\n }\n \n return data;\n }\n} ","export class FetchError extends Error {\n name: string = 'FetchError';\n status: number;\n code: string;\n message: string;\n data: any;\n\n constructor(response: Response, data: any = {}, code: string = 'FETCH_ERROR') {\n super();\n const defaultMessage = 'An unspecified error occurred';\n\n const getMessage = (data: any, locations: string[]): string | null =>\n locations\n .map((item) => {\n const parts = item.split('.');\n let value = data;\n for (const part of parts) {\n value = value?.[part];\n }\n return value;\n })\n .find((message) => typeof message === 'string') || null;\n\n const messageFromData = getMessage(data, [\n 'error.errors.0.message',\n 'error.message',\n 'error',\n 'message',\n ]);\n\n this.message = messageFromData || response.statusText || defaultMessage;\n this.status = response.status;\n this.code = code;\n this.data = data;\n this.message = this.message || defaultMessage;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","export function deserializeForm(src: any): FormData {\n const fd = new FormData();\n switch (src.cls) {\n case 'FormData': {\n for (const [key, items] of src.value) {\n for (const item of items) {\n let deserializedItem = deserializeForm(item);\n if (deserializedItem instanceof FormData) {\n // Use a workaround for TypeScript FormData entries() issue\n const entries = deserializedItem as any;\n for (const [subKey, subValue] of entries.entries()) {\n fd.append(`${key}[${subKey}]`, subValue);\n }\n } else {\n fd.append(key, deserializedItem);\n }\n }\n }\n break;\n }\n case 'Blob':\n case 'File': {\n const { type, name, lastModified } = src;\n const binStr = atob(src.value);\n const arr = new Uint8Array(binStr.length);\n for (let i = 0; i < binStr.length; i++) arr[i] = binStr.charCodeAt(i);\n const data = [arr.buffer];\n const fileOrBlob =\n src.cls === 'File'\n ? new File(data, name, { type, lastModified })\n : new Blob(data, { type });\n fd.append('file', fileOrBlob);\n break;\n }\n case 'json': {\n fd.append('json', JSON.stringify(JSON.parse(src.value)));\n break;\n }\n default:\n throw new Error('Unsupported type for deserialization');\n }\n return fd;\n}\n","import { AccountData } from './types';\n\n/**\n * Manages account data and state\n */\nexport class AccountManager {\n private accounts: Record<string, AccountData> = {};\n private readonly DEFAULT_ACCOUNT = 'default';\n\n /**\n * Update account data for a specific account\n */\n public updateAccountData(accountId: string = this.DEFAULT_ACCOUNT, data: Partial<AccountData>): void {\n this.accounts[accountId] = { \n ...this.accounts[accountId], \n ...data \n };\n }\n\n /**\n * Get account data for a specific account\n */\n public getAccountData(accountId: string = this.DEFAULT_ACCOUNT): AccountData {\n return this.accounts[accountId] || {};\n }\n\n /**\n * Check if an account's last request failed\n */\n public didLastRequestFail(accountId: string = this.DEFAULT_ACCOUNT): boolean {\n return !!this.accounts[accountId]?.lastFailed;\n }\n\n /**\n * Set account's last request as failed\n */\n public setLastRequestFailed(accountId: string = this.DEFAULT_ACCOUNT, failed: boolean = true): void {\n this.updateAccountData(accountId, { lastFailed: failed });\n }\n\n /**\n * Update the last request time for an account\n */\n public updateLastRequestTime(accountId: string = this.DEFAULT_ACCOUNT): void {\n this.updateAccountData(accountId, { lastRequestTime: Date.now() });\n }\n} ","import { AuthProvider, Token, OAuthToken } from './types';\n\nexport type TokenService = {\n get: (accountId?: string) => Promise<Token>;\n set: (token: Partial<Token>, accountId?: string) => Promise<void>;\n refresh?: (refreshToken: string, accountId?: string) => Promise<OAuthToken>;\n};\n\nexport class TokenAuthProvider implements AuthProvider {\n private tokenService: TokenService;\n constructor(tokenService: TokenService) {\n this.tokenService = tokenService;\n }\n async getAuthHeaders(accountId?: string): Promise<Record<string, string>> {\n const token = await this.tokenService.get(accountId);\n if (!token?.access_token) return {};\n return { Authorization: `Bearer ${token.access_token}` };\n }\n public async refresh(accountId: string): Promise<void> {\n if (!this.tokenService.refresh) {\n throw new Error('Refresh not supported');\n }\n const token = await this.tokenService.get(accountId);\n if (!token?.refresh_token) {\n throw new Error('No refresh token available');\n }\n const newTokens = await this.tokenService.refresh(token.refresh_token, accountId);\n await this.tokenService.set(newTokens, accountId);\n }\n}","import { AuthProvider, BasicAuthProviderOptions } from './types';\n\nexport class BasicAuthProvider implements AuthProvider {\n private username: string;\n private password: string;\n\n constructor(options: BasicAuthProviderOptions) {\n this.username = options.username;\n this.password = options.password;\n }\n\n async getAuthHeaders(): Promise<Record<string, string>> {\n const encoded = Buffer.from(`${this.username}:${this.password}`).toString('base64');\n return { Authorization: `Basic ${encoded}` };\n }\n\n // No refresh for basic auth\n} ","import { \n AuthProvider,\n ApiCallParams,\n HookSettings,\n StatusCode,\n Token,\n OAuthToken\n} from './types';\nimport { ApiKeyAuthProvider } from './ApiKeyAuthProvider';\nimport {\n CacheManager,\n RetryManager,\n HookManager,\n HttpClient,\n AccountManager\n} from './components';\n\n/**\n * ApiService - Core API service for making authenticated API calls\n * with caching, retry, and hook support.\n */\nclass ApiService {\n public provider: string; // Service provider name\n private authProvider: AuthProvider;\n private baseUrl: string = ''; // Default base URL\n \n // Component managers\n private cacheManager: CacheManager;\n private retryManager: RetryManager;\n private hookManager: HookManager;\n protected httpClient: HttpClient;\n private accountManager: AccountManager;\n \n // Default max attempts for API calls\n private maxAttempts = 10;\n\n constructor() {\n this.provider = '';\n this.authProvider = {} as AuthProvider;\n \n // Initialize component managers\n this.cacheManager = new CacheManager();\n this.retryManager = new RetryManager();\n this.hookManager = new HookManager();\n this.httpClient = new HttpClient();\n this.accountManager = new AccountManager();\n }\n\n /**\n * Setup the API service\n */\n public setup({\n provider,\n authProvider,\n hooks = {},\n cacheTime,\n baseUrl = '',\n httpClient,\n }: {\n provider: string;\n authProvider: AuthProvider;\n hooks?: Record<StatusCode, HookSettings | null>;\n cacheTime: number;\n baseUrl?: string;\n httpClient?: HttpClient;\n }) {\n this.provider = provider;\n this.authProvider = authProvider;\n this.baseUrl = baseUrl;\n \n if (httpClient) {\n this.httpClient = httpClient;\n }\n \n // Create a copy of hooks to avoid modifying the input\n const finalHooks: Record<StatusCode, HookSettings> = {};\n \n // Apply default 401 handler if:\n // 1. No 401 hook is explicitly defined (or is explicitly null)\n // 2. AuthProvider has a refresh method\n if (hooks[401] === undefined && typeof this.authProvider.refresh === 'function') {\n finalHooks[401] = this.createDefaultAuthRefreshHandler();\n }\n \n // Add user-defined hooks (skipping null/undefined values)\n for (const [statusCode, hook] of Object.entries(hooks)) {\n if (hook) {\n finalHooks[statusCode] = hook;\n }\n }\n \n // Set the hooks if we have any\n if (Object.keys(finalHooks).length > 0) {\n this.hookManager.setHooks(finalHooks);\n }\n \n if (typeof cacheTime !== 'undefined') {\n this.cacheManager.setCacheTime(cacheTime);\n }\n }\n \n /**\n * Create a default handler for 401 (Unauthorized) errors\n * that implements standard credential refresh behavior\n */\n private createDefaultAuthRefreshHandler(): HookSettings {\n return {\n shouldRetry: true,\n useRetryDelay: true,\n preventConcurrentCalls: true,\n maxRetries: 1,\n handler: async (accountId) => {\n try {\n console.log(`🔄 Using default auth refresh handler for ${accountId}`);\n if (!this.authProvider.refresh) {\n throw new Error('No refresh method available on auth provider');\n }\n // You may want to store refresh token in account data or pass it in another way\n // For now, assume refresh token is managed internally by the provider\n await this.authProvider.refresh(accountId);\n return {};\n } catch (error) {\n console.error(`Auth refresh failed for ${accountId}:`, error);\n throw error;\n }\n },\n onMaxRetriesExceeded: async (accountId, error) => {\n console.error(`Authentication failed after refresh attempt for ${accountId}:`, error);\n }\n };\n }\n \n /**\n * Set the maximum number of retry attempts\n */\n public setMaxAttempts(attempts: number): void {\n this.maxAttempts = attempts;\n }\n\n /**\n * Update account data\n */\n public updateAccountData(accountId: string, data: Partial<Record<string, any>>): void {\n this.accountManager.updateAccountData(accountId, data);\n }\n\n /**\n * Make an API call with all features (caching, retry, hooks)\n */\n public async call(apiCallParams: Omit<ApiCallParams, 'accountId'> & { accountId?: string; abortSignal?: AbortSignal }): Promise<any> {\n // Use 'default' as fallback if accountId is not provided\n // and use default baseUrl if not provided\n const params: ApiCallParams = {\n ...apiCallParams,\n accountId: apiCallParams.accountId || 'default',\n base: apiCallParams.base || this.baseUrl,\n };\n\n // If using ApiKeyAuthProvider with queryParamName, add API key to queryParams\n if (\n this.authProvider instanceof ApiKeyAuthProvider &&\n (this.authProvider as any).queryParamName\n ) {\n const queryParamName = (this.authProvider as any).queryParamName;\n const apiKey = (this.authProvider as any).apiKey;\n const urlParams = params.queryParams ? new URLSearchParams(params.queryParams) : new URLSearchParams();\n urlParams.set(queryParamName, apiKey);\n params.queryParams = urlParams;\n }\n\n console.log('🔄 API call', this.provider, params.accountId, params.method, params.route);\n \n // Check cache first\n const cachedData = this.cacheManager.getFromCache(params);\n if (cachedData) return cachedData;\n\n // Make the API call with retry capability\n const result = await this.makeRequestWithRetry(params);\n \n // Cache the result\n this.cacheManager.saveToCache(params, result);\n \n return result;\n }\n\n /**\n * Legacy method for backward compatibility\n * @deprecated Use call() instead\n */\n public async makeApiCall(apiCallParams: Omit<ApiCallParams, 'accountId'> & { accountId?: string; abortSignal?: AbortSignal }): Promise<any> {\n return this.call(apiCallParams);\n }\n\n /**\n * Make a request with retry capability\n */\n private async makeRequestWithRetry(apiCallParams: ApiCallParams): Promise<any> {\n const { accountId, abortSignal } = apiCallParams;\n let attempts = 0;\n const statusRetries: Record<StatusCode, number> = {};\n let currentParams = { ...apiCallParams };\n // If using ApiKeyAuthProvider with queryParamName, add API key to queryParams\n if (\n this.authProvider instanceof ApiKeyAuthProvider &&\n (this.authProvider as any).queryParamName\n ) {\n const queryParamName = (this.authProvider as any).queryParamName;\n const apiKey = (this.authProvider as any).apiKey;\n const urlParams = currentParams.queryParams ? new URLSearchParams(currentParams.queryParams) : new URLSearchParams();\n urlParams.set(queryParamName, apiKey);\n currentParams.queryParams = urlParams;\n }\n // Main retry loop\n while (attempts < this.maxAttempts) {\n if (abortSignal?.aborted) {\n throw new Error('Request aborted');\n }\n attempts++;\n \n try {\n // Get authentication headers if needed\n const authHeaders: Record<string, string> = apiCallParams.useAuth !== false\n ? await this.authProvider.getAuthHeaders(accountId)\n : {};\n // Merge auth headers into params.headers\n currentParams.headers = {\n ...(currentParams.headers || {}),\n ...authHeaders,\n };\n \n // Verify we have authentication if required\n if (\n apiCallParams.useAuth !== false &&\n Object.keys(authHeaders).length === 0 &&\n !(\n this.authProvider instanceof ApiKeyAuthProvider &&\n (this.authProvider as any).queryParamName\n )\n ) {\n throw new Error(`${this.provider} credentials not found for account ID ${accountId}`);\n }\n \n // Make the actual API call\n const response = await this.httpClient.makeRequest(currentParams, {});\n \n // Success - update account status and return result\n this.accountManager.setLastRequestFailed(accountId, false);\n return response;\n } \n catch (error: any) {\n const status = error?.status;\n \n // If no hook exists for this error, or we shouldn't retry, throw\n if (!this.hookManager.shouldRetry(status)) {\n throw error;\n }\n \n // Track retries for this status code\n statusRetries[status] = (statusRetries[status] || 0) + 1;\n const activeHook = this.hookManager.getHook(status);\n const maxRetries = activeHook?.maxRetries ?? this.retryManager.getDefaultMaxRetries();\n \n // Check if we've exceeded retries for this status\n if (statusRetries[status] > maxRetries) {\n await this.hookManager.handleRetryFailure(accountId, status, error);\n this.accountManager.setLastRequestFailed(accountId, true);\n throw error;\n }\n \n // Process the hook to get updated params\n try {\n const hookResult = await this.hookManager.processHook(accountId, status, error);\n if (hookResult) {\n currentParams = { ...currentParams, ...hookResult };\n }\n } \n catch (hookError) {\n this.accountManager.setLastRequestFailed(accountId, true);\n throw hookError;\n }\n \n // Wait before retrying if needed\n if (activeHook?.useRetryDelay) {\n await this.retryManager.calculateAndDelay({\n attempt: statusRetries[status],\n response: error.response,\n hook: activeHook,\n });\n }\n }\n }\n \n // If we've reached here, we've exceeded our maximum attempts\n this.accountManager.setLastRequestFailed(accountId, true);\n throw new Error(`Exceeded maximum attempts (${this.maxAttempts}) for API call to ${accountId}`);\n }\n\n /**\n * Set the cache time in milliseconds\n */\n public setCacheTime(milliseconds: number): void {\n this.cacheManager.setCacheTime(milliseconds);\n }\n\n /**\n * Clear the cache\n */\n public clearCache(): void {\n this.cacheManager.clearCache();\n }\n}\n\nexport * from './types';\nexport * from './FetchError';\nexport * from './components';\n\nexport { ApiService };\nexport default ApiService;\n"],"mappings":";AAEO,IAAM,qBAAN,MAAiD;AAAA,EAKtD,YAAY,SAAoC;AAC9C,SAAK,SAAS,QAAQ;AACtB,SAAK,aAAa,QAAQ;AAC1B,SAAK,iBAAiB,QAAQ;AAAA,EAChC;AAAA,EAEA,MAAM,iBAAkD;AACtD,QAAI,KAAK,YAAY;AACnB,aAAO,EAAE,CAAC,KAAK,UAAU,GAAG,KAAK,OAAO;AAAA,IAC1C;AAEA,WAAO,CAAC;AAAA,EACV;AAAA;AAGF;;;ACjBO,IAAM,eAAN,MAAmB;AAAA,EAAnB;AACL,SAAQ,QAAuD,oBAAI,IAAI;AACvE,SAAQ,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKb,aAAa,eAAmC;AAZzD;AAaI,UAAM,aAAa,KAAK,cAAc,aAAa;AACnD,UAAM,oBAAmB,mBAAc,cAAd,YAA2B,KAAK;AACzD,UAAM,SAAS,KAAK,MAAM,IAAI,UAAU;AAExC,QAAI,UAAW,KAAK,IAAI,IAAI,OAAO,YAAY,kBAAmB;AAChE,aAAO,OAAO;AAAA,IAChB;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKO,YAAY,eAA8B,MAAiB;AAChE,UAAM,aAAa,KAAK,cAAc,aAAa;AACnD,SAAK,MAAM,IAAI,YAAY;AAAA,MACzB;AAAA,MACA,WAAW,KAAK,IAAI;AAAA,IACtB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAc,eAAsC;AAC1D,UAAM,EAAE,WAAW,QAAQ,OAAO,MAAM,aAAa,MAAM,KAAK,IAAI;AACpE,WAAO,KAAK,UAAU;AAAA,MACpB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM,QAAQ;AAAA,IAChB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKO,aAAa,cAA4B;AAC9C,SAAK,YAAY;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKO,aAAmB;AACxB,SAAK,MAAM,MAAM;AAAA,EACnB;AACF;;;AC1DO,IAAM,eAAN,MAAmB;AAAA,EAAnB;AACL,SAAQ,kBAAkB;AAC1B;AAAA,SAAQ,oBAAoB;AAK5B;AAAA;AAAA;AAAA,SAAQ,uBAAsC;AAAA,MAC5C,WAAW,CAAC,SAAiB,aAAmB;AAE9C,cAAM,aAAa,KAAK,mBAAmB,QAAQ;AACnD,YAAI,WAAY,QAAO;AAGvB,cAAM,YAAY;AAClB,cAAM,mBAAmB,YAAY,KAAK,IAAI,GAAG,UAAU,CAAC;AAC5D,eAAO,KAAK,MAAM,KAAK,OAAO,IAAI,gBAAgB;AAAA,MACpD;AAAA,IACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,kBAAkB,QAIb;AAChB,UAAM,EAAE,SAAS,UAAU,KAAK,IAAI;AACpC,UAAM,gBAAgB,KAAK,iBAAiB,KAAK;AACjD,UAAM,WAAW,KAAK,YAAY,KAAK;AAEvC,UAAM,kBAAkB,cAAc,UAAU,SAAS,QAAQ;AACjE,UAAM,aAAa,KAAK,IAAI,iBAAiB,QAAQ;AAErD,YAAQ,IAAI,yBAAkB,aAAa,GAAI,2BAA2B;AAC1E,UAAM,IAAI,QAAQ,aAAW,WAAW,SAAS,UAAU,CAAC;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAmB,UAA+B;AA/C5D;AAgDI,QAAI,GAAC,0CAAU,YAAV,mBAAmB,KAAK,QAAO;AAEpC,UAAM,aAAa,SAAS,QAAQ,IAAI,aAAa;AACrD,QAAI,CAAC,WAAY,QAAO;AAGxB,UAAM,cAAc,SAAS,YAAY,EAAE;AAC3C,QAAI,CAAC,MAAM,WAAW,GAAG;AACvB,aAAO,cAAc;AAAA,IACvB;AAGA,UAAM,OAAO,IAAI,KAAK,UAAU,EAAE,QAAQ;AAC1C,UAAM,MAAM,KAAK,IAAI;AACrB,QAAI,OAAO,KAAK;AACd,aAAO,OAAO;AAAA,IAChB;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKO,uBAA+B;AACpC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKO,qBAAqB,YAA0B;AACpD,SAAK,oBAAoB;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKO,mBAAmB,UAAwB;AAChD,SAAK,kBAAkB;AAAA,EACzB;AACF;;;ACpFO,IAAM,cAAN,MAAkB;AAAA,EAAlB;AACL,SAAQ,QAA0C,CAAC;AACnD,SAAQ,eAAgD,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,EAKlD,SAAS,OAA+C;AAC7D,SAAK,QAAQ,EAAE,GAAG,KAAK,OAAO,GAAG,MAAM;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKO,QAAQ,QAA8C;AAC3D,WAAO,KAAK,MAAM,MAAM;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,YACX,WACA,QACA,OACqC;AACrC,UAAM,OAAO,KAAK,MAAM,MAAM;AAC9B,QAAI,CAAC,QAAQ,CAAC,KAAK,QAAS,QAAO;AAEnC,UAAM,UAAU,GAAG,aAAa,SAAS,IAAI,MAAM;AAEnD,QAAI;AAEF,UAAI,KAAK,wBAAwB;AAC/B,YAAI,CAAC,KAAK,aAAa,OAAO,GAAG;AAC/B,eAAK,aAAa,OAAO,IAAI,QAAQ;AAAA,YACnC,KAAK,QAAQ,WAAW,MAAM,QAAQ,KAAK,CAAC;AAAA,UAC9C;AAAA,QACF;AAEA,cAAM,SAAS,MAAM,KAAK,aAAa,OAAO;AAC9C,eAAO,KAAK,aAAa,OAAO;AAChC,eAAO;AAAA,MACT;AAGA,aAAO,MAAM,KAAK,QAAQ,WAAW,MAAM,QAAQ,KAAK,CAAC;AAAA,IAC3D,SACO,WAAW;AAChB,cAAQ,MAAM,kCAAkC,MAAM,KAAK,SAAS;AAEpE,UAAI,KAAK,gBAAgB;AACvB,cAAM,KAAK,eAAe,WAAW,SAAS;AAAA,MAChD;AAEA,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,mBAAmB,WAAmB,QAAoB,OAA2B;AAChG,UAAM,OAAO,KAAK,MAAM,MAAM;AAC9B,QAAI,6BAAM,sBAAsB;AAC9B,YAAM,KAAK,qBAAqB,WAAW,KAAK;AAAA,IAClD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKO,YAAY,QAA6B;AAC9C,UAAM,OAAO,KAAK,MAAM,MAAM;AAC9B,WAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK;AAAA,EAC1B;AACF;;;ACjFA,OAAO,QAAQ;;;ACAR,IAAM,aAAN,cAAyB,MAAM;AAAA,EAOpC,YAAY,UAAoB,OAAY,CAAC,GAAG,OAAe,eAAe;AAC5E,UAAM;AAPR,gBAAe;AAQb,UAAM,iBAAiB;AAEvB,UAAM,aAAa,CAACA,OAAW,cAC7B,UACG,IAAI,CAAC,SAAS;AACb,YAAM,QAAQ,KAAK,MAAM,GAAG;AAC5B,UAAI,QAAQA;AACZ,iBAAW,QAAQ,OAAO;AACxB,gBAAQ,+BAAQ;AAAA,MAClB;AACA,aAAO;AAAA,IACT,CAAC,EACA,KAAK,CAAC,YAAY,OAAO,YAAY,QAAQ,KAAK;AAEvD,UAAM,kBAAkB,WAAW,MAAM;AAAA,MACvC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAED,SAAK,UAAU,mBAAmB,SAAS,cAAc;AACzD,SAAK,SAAS,SAAS;AACvB,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,SAAK,UAAU,KAAK,WAAW;AAC/B,WAAO,eAAe,MAAM,WAAW,SAAS;AAAA,EAClD;AACF;;;ACrCO,SAAS,gBAAgB,KAAoB;AAClD,QAAM,KAAK,IAAI,SAAS;AACxB,UAAQ,IAAI,KAAK;AAAA,IACf,KAAK,YAAY;AACf,iBAAW,CAAC,KAAK,KAAK,KAAK,IAAI,OAAO;AACpC,mBAAW,QAAQ,OAAO;AACxB,cAAI,mBAAmB,gBAAgB,IAAI;AAC3C,cAAI,4BAA4B,UAAU;AAExC,kBAAM,UAAU;AAChB,uBAAW,CAAC,QAAQ,QAAQ,KAAK,QAAQ,QAAQ,GAAG;AAClD,iBAAG,OAAO,GAAG,GAAG,IAAI,MAAM,KAAK,QAAQ;AAAA,YACzC;AAAA,UACF,OAAO;AACL,eAAG,OAAO,KAAK,gBAAgB;AAAA,UACjC;AAAA,QACF;AAAA,MACF;AACA;AAAA,IACF;AAAA,IACA,KAAK;AAAA,IACL,KAAK,QAAQ;AACX,YAAM,EAAE,MAAM,MAAM,aAAa,IAAI;AACrC,YAAM,SAAS,KAAK,IAAI,KAAK;AAC7B,YAAM,MAAM,IAAI,WAAW,OAAO,MAAM;AACxC,eAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,IAAK,KAAI,CAAC,IAAI,OAAO,WAAW,CAAC;AACpE,YAAM,OAAO,CAAC,IAAI,MAAM;AACxB,YAAM,aACJ,IAAI,QAAQ,SACR,IAAI,KAAK,MAAM,MAAM,EAAE,MAAM,aAAa,CAAC,IAC3C,IAAI,KAAK,MAAM,EAAE,KAAK,CAAC;AAC7B,SAAG,OAAO,QAAQ,UAAU;AAC5B;AAAA,IACF;AAAA,IACA,KAAK,QAAQ;AACX,SAAG,OAAO,QAAQ,KAAK,UAAU,KAAK,MAAM,IAAI,KAAK,CAAC,CAAC;AACvD;AAAA,IACF;AAAA,IACA;AACE,YAAM,IAAI,MAAM,sCAAsC;AAAA,EAC1D;AACA,SAAO;AACT;;;AFlCO,IAAM,aAAN,MAAiB;AAAA;AAAA;AAAA;AAAA,EAItB,MAAa,YAAY,WAA0B,WAAsD;AACvG,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAc;AAAA,MACd,aAAa;AAAA,MACb,UAAU;AAAA,MACV;AAAA,MACA;AAAA,IACF,IAAI;AAGJ,UAAM,mBAAmB,iCAAQ;AAGjC,QAAI,mBAAwC,CAAC;AAG7C,QAAI,aAAa;AACf,UAAI,uBAAuB,iBAAiB;AAC1C,oBAAY,QAAQ,CAAC,KAAK,QAAQ;AAChC,2BAAiB,GAAG,IAAI;AAAA,QAC1B,CAAC;AAAA,MACH,OAAO;AACL,2BAAmB,EAAE,GAAI,YAAoB;AAAA,MAC/C;AAAA,IACF;AAGA,QAAI,qBAAqB,OAAO;AAC9B,UAAI,MAAM;AACR,2BAAmB,EAAE,GAAG,kBAAkB,GAAG,KAAK;AAAA,MACpD;AACA,UAAI,MAAM;AACR,2BAAmB,EAAE,GAAG,kBAAkB,GAAG,KAAK;AAAA,MACpD;AAAA,IACF;AAEA,UAAM,MAAM,KAAK,SAAS,MAAM,OAAO,gBAAgB;AACvD,UAAM,cAAc,QAAQ;AAG5B,UAAM,WAAW,KAAK,gBAAgB,KAAK;AAG3C,UAAM,eAAe,KAAK,kBAAkB;AAAA,MAC1C,QAAQ;AAAA,MACR,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAGD,QAAI;AACF,cAAQ,IAAI,gCAAyB,GAAG,EAAE;AAC1C,YAAM,WAAW,MAAM,MAAM,KAAK,YAAY;AAC9C,aAAO,MAAM,KAAK,eAAe,QAAQ;AAAA,IAC3C,SAAS,OAAY;AAEnB,cAAQ,MAAM,oCAA6B,OAAO,WAAW,+BAAO,MAAM;AAC1E,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,SAAS,MAA0B,OAAgB,aAA2B;AACpF,UAAM,UAAU,QAAQ;AACxB,QAAI,MAAM,GAAG,OAAO,GAAG,SAAS,EAAE;AAClC,QAAI,eAAe,OAAO,KAAK,WAAW,EAAE,SAAS,GAAG;AACtD,aAAO,IAAI,GAAG,UAAU,WAAW,CAAC;AAAA,IACtC;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAgB,OAAiC;AACvD,QAAI,CAAC,MAAO,QAAO;AAEnB,UAAM,WAAW,gBAAgB,KAAK;AAEtC,UAAM,UAAU;AAChB,aAAS,CAAC,KAAK,KAAK,KAAK,QAAQ,QAAQ,GAAG;AAC1C,cAAQ,IAAI,YAAY,GAAG,KAAK,KAAK;AAAA,IACvC;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAUgB;AACd,UAAM,iBAAiB,CAAC,QAAQ,OAAO,OAAO;AAE9C,WAAO;AAAA,MACL;AAAA,MACA,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,GAAI,WAAW;AAAA,UACb,eAAe,UAAU,qBAAqB,UAAU,YAAY;AAAA,QACtE;AAAA,QACA,GAAI,CAAC,YAAY,EAAE,gBAAgB,YAAY;AAAA,QAC/C,GAAI,WAAW,CAAC;AAAA,MAClB;AAAA,MACA,MAAM,QAAQ,eAAe,SAAS,MAAM,IACxC,KAAK,UAAU,IAAI,IAClB,YAAY;AAAA,IACnB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,eAAe,UAAkC;AAC7D,QAAI,OAAO;AACX,QAAI;AACF,aAAO,MAAM,SAAS,KAAK;AAC3B,cAAQ,IAAI,4BAAqB,IAAI;AAAA,IACvC,SAAS,OAAO;AAAA,IAEhB;AAEA,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI,WAAW,UAAU,IAAI;AAAA,IACrC;AAEA,WAAO;AAAA,EACT;AACF;;;AGzKO,IAAM,iBAAN,MAAqB;AAAA,EAArB;AACL,SAAQ,WAAwC,CAAC;AACjD,SAAiB,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA,EAK5B,kBAAkB,YAAoB,KAAK,iBAAiB,MAAkC;AACnG,SAAK,SAAS,SAAS,IAAI;AAAA,MACzB,GAAG,KAAK,SAAS,SAAS;AAAA,MAC1B,GAAG;AAAA,IACL;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKO,eAAe,YAAoB,KAAK,iBAA8B;AAC3E,WAAO,KAAK,SAAS,SAAS,KAAK,CAAC;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKO,mBAAmB,YAAoB,KAAK,iBAA0B;AA7B/E;AA8BI,WAAO,CAAC,GAAC,UAAK,SAAS,SAAS,MAAvB,mBAA0B;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKO,qBAAqB,YAAoB,KAAK,iBAAiB,SAAkB,MAAY;AAClG,SAAK,kBAAkB,WAAW,EAAE,YAAY,OAAO,CAAC;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA,EAKO,sBAAsB,YAAoB,KAAK,iBAAuB;AAC3E,SAAK,kBAAkB,WAAW,EAAE,iBAAiB,KAAK,IAAI,EAAE,CAAC;AAAA,EACnE;AACF;;;ACtCO,IAAM,oBAAN,MAAgD;AAAA,EAErD,YAAY,cAA4B;AACtC,SAAK,eAAe;AAAA,EACtB;AAAA,EACA,MAAM,eAAe,WAAqD;AACxE,UAAM,QAAQ,MAAM,KAAK,aAAa,IAAI,SAAS;AACnD,QAAI,EAAC,+BAAO,cAAc,QAAO,CAAC;AAClC,WAAO,EAAE,eAAe,UAAU,MAAM,YAAY,GAAG;AAAA,EACzD;AAAA,EACA,MAAa,QAAQ,WAAkC;AACrD,QAAI,CAAC,KAAK,aAAa,SAAS;AAC9B,YAAM,IAAI,MAAM,uBAAuB;AAAA,IACzC;AACA,UAAM,QAAQ,MAAM,KAAK,aAAa,IAAI,SAAS;AACnD,QAAI,EAAC,+BAAO,gBAAe;AACzB,YAAM,IAAI,MAAM,4BAA4B;AAAA,IAC9C;AACA,UAAM,YAAY,MAAM,KAAK,aAAa,QAAQ,MAAM,eAAe,SAAS;AAChF,UAAM,KAAK,aAAa,IAAI,WAAW,SAAS;AAAA,EAClD;AACF;;;AC3BO,IAAM,oBAAN,MAAgD;AAAA,EAIrD,YAAY,SAAmC;AAC7C,SAAK,WAAW,QAAQ;AACxB,SAAK,WAAW,QAAQ;AAAA,EAC1B;AAAA,EAEA,MAAM,iBAAkD;AACtD,UAAM,UAAU,OAAO,KAAK,GAAG,KAAK,QAAQ,IAAI,KAAK,QAAQ,EAAE,EAAE,SAAS,QAAQ;AAClF,WAAO,EAAE,eAAe,SAAS,OAAO,GAAG;AAAA,EAC7C;AAAA;AAGF;;;ACIA,IAAM,aAAN,MAAiB;AAAA,EAef,cAAc;AAZd,SAAQ,UAAkB;AAU1B;AAAA,SAAQ,cAAc;AAGpB,SAAK,WAAW;AAChB,SAAK,eAAe,CAAC;AAGrB,SAAK,eAAe,IAAI,aAAa;AACrC,SAAK,eAAe,IAAI,aAAa;AACrC,SAAK,cAAc,IAAI,YAAY;AACnC,SAAK,aAAa,IAAI,WAAW;AACjC,SAAK,iBAAiB,IAAI,eAAe;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKO,MAAM;AAAA,IACX;AAAA,IACA;AAAA,IACA,QAAQ,CAAC;AAAA,IACT;AAAA,IACA,UAAU;AAAA,IACV;AAAA,EACF,GAOG;AACD,SAAK,WAAW;AAChB,SAAK,eAAe;AACpB,SAAK,UAAU;AAEf,QAAI,YAAY;AACd,WAAK,aAAa;AAAA,IACpB;AAGA,UAAM,aAA+C,CAAC;AAKtD,QAAI,MAAM,GAAG,MAAM,UAAa,OAAO,KAAK,aAAa,YAAY,YAAY;AAC/E,iBAAW,GAAG,IAAI,KAAK,gCAAgC;AAAA,IACzD;AAGA,eAAW,CAAC,YAAY,IAAI,KAAK,OAAO,QAAQ,KAAK,GAAG;AACtD,UAAI,MAAM;AACR,mBAAW,UAAU,IAAI;AAAA,MAC3B;AAAA,IACF;AAGA,QAAI,OAAO,KAAK,UAAU,EAAE,SAAS,GAAG;AACtC,WAAK,YAAY,SAAS,UAAU;AAAA,IACtC;AAEA,QAAI,OAAO,cAAc,aAAa;AACpC,WAAK,aAAa,aAAa,SAAS;AAAA,IAC1C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,kCAAgD;AACtD,WAAO;AAAA,MACL,aAAa;AAAA,MACb,eAAe;AAAA,MACf,wBAAwB;AAAA,MACxB,YAAY;AAAA,MACZ,SAAS,OAAO,cAAc;AAC5B,YAAI;AACF,kBAAQ,IAAI,oDAA6C,SAAS,EAAE;AACpE,cAAI,CAAC,KAAK,aAAa,SAAS;AAC9B,kBAAM,IAAI,MAAM,8CAA8C;AAAA,UAChE;AAGA,gBAAM,KAAK,aAAa,QAAQ,SAAS;AACzC,iBAAO,CAAC;AAAA,QACV,SAAS,OAAO;AACd,kBAAQ,MAAM,2BAA2B,SAAS,KAAK,KAAK;AAC5D,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA,sBAAsB,OAAO,WAAW,UAAU;AAChD,gBAAQ,MAAM,mDAAmD,SAAS,KAAK,KAAK;AAAA,MACtF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKO,eAAe,UAAwB;AAC5C,SAAK,cAAc;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKO,kBAAkB,WAAmB,MAA0C;AACpF,SAAK,eAAe,kBAAkB,WAAW,IAAI;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,KAAK,eAAmH;AAGnI,UAAM,SAAwB;AAAA,MAC5B,GAAG;AAAA,MACH,WAAW,cAAc,aAAa;AAAA,MACtC,MAAM,cAAc,QAAQ,KAAK;AAAA,IACnC;AAGA,QACE,KAAK,wBAAwB,sBAC5B,KAAK,aAAqB,gBAC3B;AACA,YAAM,iBAAkB,KAAK,aAAqB;AAClD,YAAM,SAAU,KAAK,aAAqB;AAC1C,YAAM,YAAY,OAAO,cAAc,IAAI,gBAAgB,OAAO,WAAW,IAAI,IAAI,gBAAgB;AACrG,gBAAU,IAAI,gBAAgB,MAAM;AACpC,aAAO,cAAc;AAAA,IACvB;AAEA,YAAQ,IAAI,sBAAe,KAAK,UAAU,OAAO,WAAW,OAAO,QAAQ,OAAO,KAAK;AAGvF,UAAM,aAAa,KAAK,aAAa,aAAa,MAAM;AACxD,QAAI,WAAY,QAAO;AAGvB,UAAM,SAAS,MAAM,KAAK,qBAAqB,MAAM;AAGrD,SAAK,aAAa,YAAY,QAAQ,MAAM;AAE5C,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,YAAY,eAAmH;AAC1I,WAAO,KAAK,KAAK,aAAa;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,qBAAqB,eAA4C;AApMjF;AAqMI,UAAM,EAAE,WAAW,YAAY,IAAI;AACnC,QAAI,WAAW;AACf,UAAM,gBAA4C,CAAC;AACnD,QAAI,gBAAgB,EAAE,GAAG,cAAc;AAEvC,QACE,KAAK,wBAAwB,sBAC5B,KAAK,aAAqB,gBAC3B;AACA,YAAM,iBAAkB,KAAK,aAAqB;AAClD,YAAM,SAAU,KAAK,aAAqB;AAC1C,YAAM,YAAY,cAAc,cAAc,IAAI,gBAAgB,cAAc,WAAW,IAAI,IAAI,gBAAgB;AACnH,gBAAU,IAAI,gBAAgB,MAAM;AACpC,oBAAc,cAAc;AAAA,IAC9B;AAEA,WAAO,WAAW,KAAK,aAAa;AAClC,UAAI,2CAAa,SAAS;AACxB,cAAM,IAAI,MAAM,iBAAiB;AAAA,MACnC;AACA;AAEA,UAAI;AAEF,cAAM,cAAsC,cAAc,YAAY,QAClE,MAAM,KAAK,aAAa,eAAe,SAAS,IAChD,CAAC;AAEL,sBAAc,UAAU;AAAA,UACtB,GAAI,cAAc,WAAW,CAAC;AAAA,UAC9B,GAAG;AAAA,QACL;AAGA,YACE,cAAc,YAAY,SAC1B,OAAO,KAAK,WAAW,EAAE,WAAW,KACpC,EACE,KAAK,wBAAwB,sBAC5B,KAAK,aAAqB,iBAE7B;AACA,gBAAM,IAAI,MAAM,GAAG,KAAK,QAAQ,yCAAyC,SAAS,EAAE;AAAA,QACtF;AAGA,cAAM,WAAW,MAAM,KAAK,WAAW,YAAY,eAAe,CAAC,CAAC;AAGpE,aAAK,eAAe,qBAAqB,WAAW,KAAK;AACzD,eAAO;AAAA,MACT,SACO,OAAY;AACjB,cAAM,SAAS,+BAAO;AAGtB,YAAI,CAAC,KAAK,YAAY,YAAY,MAAM,GAAG;AACzC,gBAAM;AAAA,QACR;AAGA,sBAAc,MAAM,KAAK,cAAc,MAAM,KAAK,KAAK;AACvD,cAAM,aAAa,KAAK,YAAY,QAAQ,MAAM;AAClD,cAAM,cAAa,8CAAY,eAAZ,YAA0B,KAAK,aAAa,qBAAqB;AAGpF,YAAI,cAAc,MAAM,IAAI,YAAY;AACtC,gBAAM,KAAK,YAAY,mBAAmB,WAAW,QAAQ,KAAK;AAClE,eAAK,eAAe,qBAAqB,WAAW,IAAI;AACxD,gBAAM;AAAA,QACR;AAGA,YAAI;AACF,gBAAM,aAAa,MAAM,KAAK,YAAY,YAAY,WAAW,QAAQ,KAAK;AAC9E,cAAI,YAAY;AACd,4BAAgB,EAAE,GAAG,eAAe,GAAG,WAAW;AAAA,UACpD;AAAA,QACF,SACO,WAAW;AAChB,eAAK,eAAe,qBAAqB,WAAW,IAAI;AACxD,gBAAM;AAAA,QACR;AAGA,YAAI,yCAAY,eAAe;AAC7B,gBAAM,KAAK,aAAa,kBAAkB;AAAA,YACxC,SAAS,cAAc,MAAM;AAAA,YAC7B,UAAU,MAAM;AAAA,YAChB,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAGA,SAAK,eAAe,qBAAqB,WAAW,IAAI;AACxD,UAAM,IAAI,MAAM,8BAA8B,KAAK,WAAW,qBAAqB,SAAS,EAAE;AAAA,EAChG;AAAA;AAAA;AAAA;AAAA,EAKO,aAAa,cAA4B;AAC9C,SAAK,aAAa,aAAa,YAAY;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKO,aAAmB;AACxB,SAAK,aAAa,WAAW;AAAA,EAC/B;AACF;AAOA,IAAO,gBAAQ;","names":["data"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rendomnet/apiservice",
3
- "version": "1.4.1",
3
+ "version": "1.4.2",
4
4
  "description": "A robust TypeScript API service framework for making authenticated API calls",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
@@ -10,6 +10,11 @@
10
10
  "types": "./dist/index.d.ts",
11
11
  "require": "./dist/index.js",
12
12
  "import": "./dist/index.mjs"
13
+ },
14
+ "./dist/*": {
15
+ "types": "./dist/index.d.ts",
16
+ "require": "./dist/index.js",
17
+ "import": "./dist/index.mjs"
13
18
  }
14
19
  },
15
20
  "files": [