@exyconn/common 2.3.3 → 2.3.4

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.
@@ -343,17 +343,97 @@ var simpleParseDualDataResponse = (response) => {
343
343
  };
344
344
 
345
345
  // src/client/http/http.ts
346
- var isDevelopment = typeof window !== "undefined" && window.location.hostname === "localhost";
347
- var API_BASE_URL = isDevelopment ? "http://localhost:4002" : "https://service-api.exyconn.com";
348
- var API_PREFIX = "/v1/api";
349
- var axiosInstance = axios.create({
350
- baseURL: API_BASE_URL,
346
+ var defaultConfig = {
347
+ baseUrl: typeof window !== "undefined" && window.location.hostname === "localhost" ? "http://localhost:4002" : "https://service-api.exyconn.com",
348
+ apiPrefix: "/v1/api",
351
349
  timeout: 3e4,
352
- // 30 seconds
350
+ defaultHeaders: {}
351
+ };
352
+ var currentConfig = { ...defaultConfig };
353
+ var axiosInstance = axios.create({
354
+ baseURL: defaultConfig.baseUrl,
355
+ timeout: defaultConfig.timeout,
353
356
  headers: {
354
357
  "Content-Type": "application/json"
355
358
  }
356
359
  });
360
+ var getApiBaseUrl = () => {
361
+ return currentConfig.baseUrl || defaultConfig.baseUrl;
362
+ };
363
+ var setApiBaseUrl = (baseUrl) => {
364
+ currentConfig.baseUrl = baseUrl;
365
+ axiosInstance.defaults.baseURL = baseUrl;
366
+ logger.info(`API Base URL updated to: ${baseUrl}`);
367
+ };
368
+ var getApiPrefix = () => {
369
+ return currentConfig.apiPrefix || defaultConfig.apiPrefix;
370
+ };
371
+ var setApiPrefix = (prefix) => {
372
+ currentConfig.apiPrefix = prefix;
373
+ logger.info(`API Prefix updated to: ${prefix}`);
374
+ };
375
+ var getCustomHeaders = () => {
376
+ return { ...currentConfig.defaultHeaders };
377
+ };
378
+ var setCustomHeader = (key, value) => {
379
+ if (!currentConfig.defaultHeaders) {
380
+ currentConfig.defaultHeaders = {};
381
+ }
382
+ currentConfig.defaultHeaders[key] = value;
383
+ axiosInstance.defaults.headers.common[key] = value;
384
+ logger.info(`Custom header added: ${key}`);
385
+ };
386
+ var removeCustomHeader = (key) => {
387
+ if (currentConfig.defaultHeaders) {
388
+ delete currentConfig.defaultHeaders[key];
389
+ }
390
+ delete axiosInstance.defaults.headers.common[key];
391
+ logger.info(`Custom header removed: ${key}`);
392
+ };
393
+ var setCustomHeaders = (headers) => {
394
+ currentConfig.defaultHeaders = { ...currentConfig.defaultHeaders, ...headers };
395
+ Object.entries(headers).forEach(([key, value]) => {
396
+ axiosInstance.defaults.headers.common[key] = value;
397
+ });
398
+ logger.info(`Multiple custom headers added: ${Object.keys(headers).join(", ")}`);
399
+ };
400
+ var clearCustomHeaders = () => {
401
+ if (currentConfig.defaultHeaders) {
402
+ Object.keys(currentConfig.defaultHeaders).forEach((key) => {
403
+ delete axiosInstance.defaults.headers.common[key];
404
+ });
405
+ }
406
+ currentConfig.defaultHeaders = {};
407
+ logger.info("All custom headers cleared");
408
+ };
409
+ var configureHttp = (config) => {
410
+ if (config.baseUrl) {
411
+ setApiBaseUrl(config.baseUrl);
412
+ }
413
+ if (config.apiPrefix) {
414
+ setApiPrefix(config.apiPrefix);
415
+ }
416
+ if (config.timeout !== void 0) {
417
+ currentConfig.timeout = config.timeout;
418
+ axiosInstance.defaults.timeout = config.timeout;
419
+ }
420
+ if (config.defaultHeaders) {
421
+ setCustomHeaders(config.defaultHeaders);
422
+ }
423
+ logger.info("HTTP client configured successfully");
424
+ };
425
+ var getHttpConfig = () => {
426
+ return { ...currentConfig };
427
+ };
428
+ var resetHttpConfig = () => {
429
+ currentConfig = { ...defaultConfig };
430
+ axiosInstance.defaults.baseURL = defaultConfig.baseUrl;
431
+ axiosInstance.defaults.timeout = defaultConfig.timeout;
432
+ clearCustomHeaders();
433
+ logger.info("HTTP configuration reset to defaults");
434
+ };
435
+ var API_BASE_URL = getApiBaseUrl();
436
+ var API_PREFIX = getApiPrefix();
357
437
  axiosInstance.interceptors.request.use(
358
438
  (config) => {
359
439
  try {
@@ -386,7 +466,10 @@ axiosInstance.interceptors.response.use(
386
466
  var buildHeaders = (customHeaders) => {
387
467
  const headers = {
388
468
  "Content-Type": "application/json",
469
+ ...currentConfig.defaultHeaders,
470
+ // Add global custom headers
389
471
  ...customHeaders
472
+ // Request-specific headers override global ones
390
473
  };
391
474
  return headers;
392
475
  };
@@ -461,6 +544,6 @@ var generateSnakeSlug = (text) => {
461
544
  return text.trim().toLowerCase().replace(/[^\w\s]/g, "").replace(/\s+/g, "_").replace(/_+/g, "_").replace(/^_|_$/g, "");
462
545
  };
463
546
 
464
- export { API_BASE_URL, API_PREFIX, ERROR_CODES, STATUS_CODES, STATUS_MESSAGES, SUCCESS_CODES, axiosInstance as axios, deleteRequest, extractData, extractMessage, extractNestedData, extractPaginatedData, generateSlug, generateSnakeSlug, generateUrlSlug, getRequest, isErrorResponse, isSuccess, isSuccessResponse, logger, parseAxiosErrorMessage, parseError, parsePaginatedResponse, parseResponseData, parseResponseMessage, parseResponseStatus, parseResponseStatusMessage, patchRequest, postRequest, putRequest, safeJsonParse, simpleMetaParseResponse, simpleParseDualDataResponse, simpleParseResponse, uploadFile };
547
+ export { API_BASE_URL, API_PREFIX, ERROR_CODES, STATUS_CODES, STATUS_MESSAGES, SUCCESS_CODES, axiosInstance as axios, clearCustomHeaders, configureHttp, deleteRequest, extractData, extractMessage, extractNestedData, extractPaginatedData, generateSlug, generateSnakeSlug, generateUrlSlug, getApiBaseUrl, getApiPrefix, getCustomHeaders, getHttpConfig, getRequest, isErrorResponse, isSuccess, isSuccessResponse, logger, parseAxiosErrorMessage, parseError, parsePaginatedResponse, parseResponseData, parseResponseMessage, parseResponseStatus, parseResponseStatusMessage, patchRequest, postRequest, putRequest, removeCustomHeader, resetHttpConfig, safeJsonParse, setApiBaseUrl, setApiPrefix, setCustomHeader, setCustomHeaders, simpleMetaParseResponse, simpleParseDualDataResponse, simpleParseResponse, uploadFile };
465
548
  //# sourceMappingURL=index.mjs.map
466
549
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/client/http/logger.ts","../../../src/client/http/response-parser.ts","../../../src/client/http/http.ts","../../../src/client/http/slug.ts"],"names":["parseError"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\r\n * Client Logger Utility\r\n *\r\n * Centralized logging utility that:\r\n * - Only logs in development mode\r\n * - Can be extended to send logs to external services (Sentry, LogRocket, etc.)\r\n * - Provides consistent logging interface\r\n */\r\n\r\ninterface LogOptions {\r\n context?: string;\r\n metadata?: Record<string, unknown>;\r\n}\r\n\r\nclass Logger {\r\n private isDevelopment =\r\n typeof window !== 'undefined' && window.location.hostname === 'localhost';\r\n\r\n /**\r\n * Log informational messages\r\n */\r\n info(message: string, data?: unknown, options?: LogOptions): void {\r\n if (this.isDevelopment) {\r\n const prefix = options?.context ? `[${options.context}]` : '';\r\n console.log(`${prefix} ${message}`, data ?? '');\r\n }\r\n }\r\n\r\n /**\r\n * Log warning messages\r\n */\r\n warn(message: string, data?: unknown, options?: LogOptions): void {\r\n if (this.isDevelopment) {\r\n const prefix = options?.context ? `[${options.context}]` : '';\r\n console.warn(`${prefix} ${message}`, data ?? '');\r\n }\r\n // TODO: Send to monitoring service in production\r\n }\r\n\r\n /**\r\n * Log error messages\r\n */\r\n error(message: string, error?: unknown, options?: LogOptions): void {\r\n const prefix = options?.context ? `[${options.context}]` : '';\r\n\r\n if (this.isDevelopment) {\r\n console.error(`${prefix} ${message}`, error, options?.metadata || '');\r\n }\r\n\r\n // TODO: Send to error tracking service (Sentry, etc.) in production\r\n }\r\n\r\n /**\r\n * Log debug messages (only in development)\r\n */\r\n debug(message: string, data?: unknown, options?: LogOptions): void {\r\n if (this.isDevelopment) {\r\n const prefix = options?.context ? `[${options.context}]` : '';\r\n console.debug(`${prefix} ${message}`, data || '');\r\n }\r\n }\r\n\r\n /**\r\n * Log API errors with structured information\r\n */\r\n apiError(endpoint: string, error: unknown, metadata?: Record<string, unknown>): void {\r\n this.error(`API Error: ${endpoint}`, error, {\r\n context: 'API',\r\n metadata: {\r\n endpoint,\r\n ...metadata,\r\n },\r\n });\r\n }\r\n}\r\n\r\n// Export singleton instance\r\nexport const logger = new Logger();\r\n\r\n// Export default for easier imports\r\nexport default logger;\r\n","/**\r\n * Response Parser Utility\r\n *\r\n * Comprehensive response parsing utilities for API responses.\r\n * Aligned with server-side response structures.\r\n */\r\n\r\nimport { logger } from './logger';\r\n\r\n/**\r\n * Standard API response structure from server\r\n */\r\nexport interface ApiResponse<T = unknown> {\r\n message: string;\r\n data: T | null;\r\n status: string;\r\n statusCode: number;\r\n paginationData?: PaginationData;\r\n columns?: ColumnMetadata[];\r\n}\r\n\r\n/**\r\n * Pagination metadata structure\r\n */\r\nexport interface PaginationData {\r\n total?: number;\r\n page?: number;\r\n limit?: number;\r\n totalPages?: number;\r\n}\r\n\r\n/**\r\n * Column metadata from server\r\n */\r\nexport interface ColumnMetadata {\r\n name: string;\r\n required: boolean;\r\n datatype: string;\r\n}\r\n\r\n/**\r\n * Status codes aligned with backend\r\n */\r\nexport const STATUS_CODES = {\r\n SUCCESS: 200,\r\n CREATED: 201,\r\n NO_CONTENT: 204,\r\n BAD_REQUEST: 400,\r\n UNAUTHORIZED: 401,\r\n FORBIDDEN: 403,\r\n NOT_FOUND: 404,\r\n CONFLICT: 409,\r\n ERROR: 500,\r\n} as const;\r\n\r\n/**\r\n * Status messages aligned with backend\r\n */\r\nexport const STATUS_MESSAGES = {\r\n SUCCESS: 'success',\r\n CREATED: 'created',\r\n NO_CONTENT: 'no_content',\r\n BAD_REQUEST: 'bad_request',\r\n UNAUTHORIZED: 'unauthorized',\r\n FORBIDDEN: 'forbidden',\r\n NOT_FOUND: 'not_found',\r\n CONFLICT: 'conflict',\r\n ERROR: 'error',\r\n};\r\n\r\n// Success status codes\r\nexport const SUCCESS_CODES = [200, 201, 204];\r\nexport const ERROR_CODES = [400, 401, 403, 404, 409, 500];\r\n\r\n/**\r\n * Safely extracts data from API response\r\n */\r\nexport const parseResponseData = <T = unknown>(\r\n response: unknown,\r\n fallback: T | null = null\r\n): T | null => {\r\n try {\r\n if (!response || typeof response !== 'object') {\r\n return fallback;\r\n }\r\n\r\n const resp = response as Record<string, unknown>;\r\n\r\n // Standard backend response has data property\r\n if ('data' in resp) {\r\n return (resp['data'] as T) ?? fallback;\r\n }\r\n\r\n // Fallback: return the response itself\r\n return response as T;\r\n } catch (error) {\r\n logger.error('Error parsing response data', error);\r\n return fallback;\r\n }\r\n};\r\n\r\n/**\r\n * Extracts message from response\r\n */\r\nexport const parseResponseMessage = (response: unknown, fallback = ''): string => {\r\n try {\r\n if (!response || typeof response !== 'object') {\r\n return fallback;\r\n }\r\n\r\n const resp = response as Record<string, unknown>;\r\n\r\n if ('message' in resp && typeof resp['message'] === 'string') {\r\n return resp['message'];\r\n }\r\n\r\n return fallback;\r\n } catch (error) {\r\n logger.error('Error parsing response message', error);\r\n return fallback;\r\n }\r\n};\r\n\r\n/**\r\n * Extracts status code from response\r\n */\r\nexport const parseResponseStatus = (response: unknown): number | null => {\r\n try {\r\n if (!response || typeof response !== 'object') {\r\n return null;\r\n }\r\n\r\n const resp = response as Record<string, unknown>;\r\n\r\n if ('statusCode' in resp && typeof resp['statusCode'] === 'number') {\r\n return resp['statusCode'];\r\n }\r\n\r\n if ('status' in resp && typeof resp['status'] === 'number') {\r\n return resp['status'];\r\n }\r\n\r\n return null;\r\n } catch (error) {\r\n logger.error('Error parsing response status', error);\r\n return null;\r\n }\r\n};\r\n\r\n/**\r\n * Extracts status message from response\r\n */\r\nexport const parseResponseStatusMessage = (response: unknown, fallback = ''): string => {\r\n try {\r\n if (!response || typeof response !== 'object') {\r\n return fallback;\r\n }\r\n\r\n const resp = response as Record<string, unknown>;\r\n\r\n if ('status' in resp && typeof resp['status'] === 'string') {\r\n return resp['status'];\r\n }\r\n\r\n return fallback;\r\n } catch (error) {\r\n logger.error('Error parsing response status message', error);\r\n return fallback;\r\n }\r\n};\r\n\r\n/**\r\n * Checks if response indicates success\r\n */\r\nexport const isSuccessResponse = (response: unknown): boolean => {\r\n try {\r\n const statusCode = parseResponseStatus(response);\r\n if (statusCode !== null) {\r\n return SUCCESS_CODES.includes(statusCode);\r\n }\r\n\r\n const status = parseResponseStatusMessage(response);\r\n return [STATUS_MESSAGES.SUCCESS, STATUS_MESSAGES.CREATED, STATUS_MESSAGES.NO_CONTENT].includes(\r\n status\r\n );\r\n } catch (error) {\r\n logger.error('Error checking response success', error);\r\n return false;\r\n }\r\n};\r\n\r\n/**\r\n * Checks if response indicates error\r\n */\r\nexport const isErrorResponse = (response: unknown): boolean => {\r\n try {\r\n const statusCode = parseResponseStatus(response);\r\n if (statusCode !== null) {\r\n return ERROR_CODES.includes(statusCode);\r\n }\r\n return false;\r\n } catch (error) {\r\n logger.error('Error checking response error', error);\r\n return false;\r\n }\r\n};\r\n\r\n/**\r\n * Paginated response structure\r\n */\r\nexport interface PaginatedResponse<T> {\r\n items: T[];\r\n total: number;\r\n page: number;\r\n limit: number;\r\n totalPages?: number;\r\n columns?: ColumnMetadata[];\r\n}\r\n\r\n/**\r\n * Parses paginated response from backend\r\n */\r\nexport const parsePaginatedResponse = <T = unknown>(response: unknown): PaginatedResponse<T> => {\r\n try {\r\n if (!response || typeof response !== 'object') {\r\n return { items: [], total: 0, page: 1, limit: 10 };\r\n }\r\n\r\n const resp = response as Record<string, unknown>;\r\n\r\n // Extract data array\r\n let items: T[] = [];\r\n if ('data' in resp && Array.isArray(resp['data'])) {\r\n items = resp['data'] as T[];\r\n }\r\n\r\n // Extract pagination data\r\n let total = items.length;\r\n let page = 1;\r\n let limit = 10;\r\n let totalPages: number | undefined;\r\n\r\n if (\r\n 'paginationData' in resp &&\r\n resp['paginationData'] &&\r\n typeof resp['paginationData'] === 'object'\r\n ) {\r\n const paginationData = resp['paginationData'] as Record<string, unknown>;\r\n\r\n if ('total' in paginationData && typeof paginationData['total'] === 'number') {\r\n total = paginationData['total'];\r\n }\r\n if ('page' in paginationData && typeof paginationData['page'] === 'number') {\r\n page = paginationData['page'];\r\n }\r\n if ('limit' in paginationData && typeof paginationData['limit'] === 'number') {\r\n limit = paginationData['limit'];\r\n }\r\n if ('totalPages' in paginationData && typeof paginationData['totalPages'] === 'number') {\r\n totalPages = paginationData['totalPages'];\r\n }\r\n }\r\n\r\n // Extract columns metadata\r\n let columns: ColumnMetadata[] | undefined;\r\n if ('columns' in resp && Array.isArray(resp['columns'])) {\r\n columns = resp['columns'] as ColumnMetadata[];\r\n }\r\n\r\n return {\r\n items,\r\n total,\r\n page,\r\n limit,\r\n ...(totalPages !== undefined && { totalPages }),\r\n ...(columns !== undefined && { columns }),\r\n };\r\n } catch (error) {\r\n logger.error('Error parsing paginated response', error);\r\n return { items: [], total: 0, page: 1, limit: 10 };\r\n }\r\n};\r\n\r\n/**\r\n * Extracts specific nested data with path\r\n */\r\nexport const extractNestedData = <T = unknown>(\r\n response: unknown,\r\n path: string,\r\n fallback: T | null = null\r\n): T | null => {\r\n try {\r\n const keys = path.split('.');\r\n let current: unknown = response;\r\n\r\n for (const key of keys) {\r\n if (current && typeof current === 'object' && key in current) {\r\n current = (current as Record<string, unknown>)[key];\r\n } else {\r\n return fallback;\r\n }\r\n }\r\n\r\n return current as T;\r\n } catch (error) {\r\n logger.error('Error extracting nested data', error);\r\n return fallback;\r\n }\r\n};\r\n\r\n/**\r\n * Safe JSON parse with fallback\r\n */\r\nexport const safeJsonParse = <T = unknown>(json: string, fallback: T | null = null): T | null => {\r\n try {\r\n return JSON.parse(json) as T;\r\n } catch (error) {\r\n logger.error('Error parsing JSON', error);\r\n return fallback;\r\n }\r\n};\r\n\r\n/**\r\n * Extracts error message from axios error response\r\n */\r\nexport const parseAxiosErrorMessage = (error: unknown): string => {\r\n try {\r\n if (!error || typeof error !== 'object') {\r\n return 'An unexpected error occurred';\r\n }\r\n\r\n const err = error as Record<string, unknown>;\r\n\r\n // Check for axios response structure\r\n if ('response' in err && err['response'] && typeof err['response'] === 'object') {\r\n const response = err['response'] as Record<string, unknown>;\r\n\r\n if ('data' in response && response['data'] && typeof response['data'] === 'object') {\r\n const data = response['data'] as Record<string, unknown>;\r\n\r\n // Check for nested data.message (ImageKit and other external APIs)\r\n if ('data' in data && data['data'] && typeof data['data'] === 'object') {\r\n const nestedData = data['data'] as Record<string, unknown>;\r\n if ('message' in nestedData && typeof nestedData['message'] === 'string') {\r\n return nestedData['message'];\r\n }\r\n }\r\n // Check for message in response data (backend standard)\r\n if ('message' in data && typeof data['message'] === 'string') {\r\n return data['message'];\r\n }\r\n // Check for error property\r\n if ('error' in data && typeof data['error'] === 'string') {\r\n return data['error'];\r\n }\r\n }\r\n }\r\n\r\n // Check for direct error message\r\n if ('message' in err && typeof err['message'] === 'string') {\r\n return err['message'];\r\n }\r\n\r\n // Check for string error\r\n if (typeof error === 'string') {\r\n return error;\r\n }\r\n\r\n return 'An unexpected error occurred';\r\n } catch (parseError) {\r\n logger.error('Error parsing axios error message', parseError);\r\n return 'An unexpected error occurred';\r\n }\r\n};\r\n\r\n/**\r\n * Standardized error object\r\n */\r\nexport interface ParsedError {\r\n message: string;\r\n statusCode: number | null;\r\n data: unknown;\r\n status?: string;\r\n}\r\n\r\n/**\r\n * Parses error into standardized format\r\n */\r\nexport const parseError = (error: unknown): ParsedError => {\r\n try {\r\n if (!error || typeof error !== 'object') {\r\n return {\r\n message: 'An unexpected error occurred',\r\n statusCode: null,\r\n data: null,\r\n };\r\n }\r\n\r\n const err = error as Record<string, unknown>;\r\n let statusCode: number | null = null;\r\n let data: unknown = null;\r\n let status: string | undefined;\r\n\r\n // Extract from axios response structure\r\n if ('response' in err && err['response'] && typeof err['response'] === 'object') {\r\n const response = err['response'] as Record<string, unknown>;\r\n\r\n if ('status' in response && typeof response['status'] === 'number') {\r\n statusCode = response['status'];\r\n }\r\n\r\n if ('data' in response && response['data'] !== undefined) {\r\n data = response['data'];\r\n\r\n if (data && typeof data === 'object' && 'status' in data) {\r\n const dataObj = data as Record<string, unknown>;\r\n if (typeof dataObj['status'] === 'string') {\r\n status = dataObj['status'];\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Fallback to direct properties\r\n if (statusCode === null && 'statusCode' in err && typeof err['statusCode'] === 'number') {\r\n statusCode = err['statusCode'];\r\n }\r\n\r\n if (data === null && 'data' in err && err['data'] !== undefined) {\r\n data = err['data'];\r\n }\r\n\r\n if (!status && 'status' in err && typeof err['status'] === 'string') {\r\n status = err['status'];\r\n }\r\n\r\n return {\r\n message: parseAxiosErrorMessage(error),\r\n statusCode,\r\n data,\r\n ...(status !== undefined && { status }),\r\n };\r\n } catch (err) {\r\n logger.error('Error parsing error object', err);\r\n return {\r\n message: 'An unexpected error occurred',\r\n statusCode: null,\r\n data: null,\r\n };\r\n }\r\n};\r\n\r\n// ==================== Simple Parse Helpers ====================\r\n\r\ninterface SimpleApiResponse {\r\n data?: {\r\n data?: {\r\n data?: unknown;\r\n meta?: Record<string, unknown>;\r\n };\r\n };\r\n}\r\n\r\nexport const simpleParseResponse = (response: SimpleApiResponse) => {\r\n return response?.data?.data?.data;\r\n};\r\n\r\nexport const simpleMetaParseResponse = (response: SimpleApiResponse) => {\r\n return response?.data?.data?.meta;\r\n};\r\n\r\nexport const simpleParseDualDataResponse = (response: SimpleApiResponse) => {\r\n return response?.data?.data;\r\n};\r\n\r\nexport default {\r\n parseResponseData,\r\n parseResponseMessage,\r\n parseResponseStatus,\r\n parseResponseStatusMessage,\r\n isSuccessResponse,\r\n isErrorResponse,\r\n parsePaginatedResponse,\r\n extractNestedData,\r\n safeJsonParse,\r\n parseAxiosErrorMessage,\r\n parseError,\r\n simpleParseResponse,\r\n simpleMetaParseResponse,\r\n simpleParseDualDataResponse,\r\n STATUS_CODES,\r\n STATUS_MESSAGES,\r\n SUCCESS_CODES,\r\n ERROR_CODES,\r\n};\r\n","/**\r\n * HTTP Client Module\r\n *\r\n * Unified HTTP utilities combining axios-based requests with response parsing.\r\n * Provides consistent API calls with standardized error handling.\r\n *\r\n * Features:\r\n * - Pre-configured axios instance\r\n * - Automatic organization header injection\r\n * - Response parsing utilities\r\n * - Error handling with standardized format\r\n * - File upload support\r\n * - Pagination support\r\n */\r\n\r\nimport axios from 'axios';\r\nimport type { AxiosRequestConfig, AxiosResponse, AxiosError } from 'axios';\r\nimport {\r\n parseResponseData,\r\n parseResponseMessage,\r\n parseError,\r\n parsePaginatedResponse,\r\n type ApiResponse,\r\n type PaginatedResponse,\r\n} from './response-parser';\r\nimport { logger } from './logger';\r\n\r\n// ==================== API Configuration ====================\r\n\r\n/**\r\n * API Base URL and Prefix Configuration\r\n * Automatically switches between development and production URLs\r\n */\r\nconst isDevelopment =\r\n typeof window !== 'undefined' && window.location.hostname === 'localhost';\r\n\r\nexport const API_BASE_URL = isDevelopment\r\n ? 'http://localhost:4002'\r\n : 'https://service-api.exyconn.com';\r\n\r\nexport const API_PREFIX = '/v1/api';\r\n\r\n// Configure axios defaults\r\nconst axiosInstance = axios.create({\r\n baseURL: API_BASE_URL,\r\n timeout: 30000, // 30 seconds\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n});\r\n\r\n// Request interceptor - Add organization header automatically\r\naxiosInstance.interceptors.request.use(\r\n config => {\r\n // Add organization header if available in localStorage\r\n try {\r\n if (typeof window !== 'undefined' && window.localStorage) {\r\n const selectedOrg = localStorage.getItem('selectedOrganization');\r\n if (selectedOrg) {\r\n const org = JSON.parse(selectedOrg);\r\n if (org && org._id) {\r\n config.headers['x-organization-id'] = org._id;\r\n }\r\n }\r\n }\r\n } catch (error) {\r\n // Silently ignore localStorage errors\r\n logger.warn('Failed to read organization from localStorage', error);\r\n }\r\n\r\n return config;\r\n },\r\n error => {\r\n return Promise.reject(error);\r\n }\r\n);\r\n\r\n// Response interceptor - Standardize error handling\r\naxiosInstance.interceptors.response.use(\r\n response => response,\r\n (error: AxiosError) => {\r\n const parsedError = parseError(error);\r\n logger.error('API Error', parsedError);\r\n return Promise.reject(parsedError);\r\n }\r\n);\r\n\r\n// ==================== Helper Functions ====================\r\n\r\n/**\r\n * Build request headers\r\n */\r\nconst buildHeaders = (customHeaders?: Record<string, string>): Record<string, string> => {\r\n const headers: Record<string, string> = {\r\n 'Content-Type': 'application/json',\r\n ...customHeaders,\r\n };\r\n return headers;\r\n};\r\n\r\n/**\r\n * Build axios config with headers and params\r\n */\r\nconst buildConfig = (\r\n params?: Record<string, unknown>,\r\n customHeaders?: Record<string, string>\r\n): AxiosRequestConfig => {\r\n const config: AxiosRequestConfig = {\r\n headers: buildHeaders(customHeaders),\r\n };\r\n\r\n if (params) {\r\n config.params = params;\r\n }\r\n\r\n return config;\r\n};\r\n\r\n// ==================== HTTP Methods ====================\r\n\r\n/**\r\n * GET request\r\n */\r\nexport const getRequest = async <T = unknown>(\r\n url: string,\r\n params?: Record<string, unknown>,\r\n customHeaders?: Record<string, string>\r\n): Promise<AxiosResponse<T>> => {\r\n const config = buildConfig(params, customHeaders);\r\n return axiosInstance.get<T>(url, config);\r\n};\r\n\r\n/**\r\n * POST request\r\n */\r\nexport const postRequest = async <T = unknown>(\r\n url: string,\r\n data?: unknown,\r\n customHeaders?: Record<string, string>\r\n): Promise<AxiosResponse<T>> => {\r\n const config = buildConfig(undefined, customHeaders);\r\n return axiosInstance.post<T>(url, data, config);\r\n};\r\n\r\n/**\r\n * PUT request\r\n */\r\nexport const putRequest = async <T = unknown>(\r\n url: string,\r\n data?: unknown,\r\n customHeaders?: Record<string, string>\r\n): Promise<AxiosResponse<T>> => {\r\n const config = buildConfig(undefined, customHeaders);\r\n return axiosInstance.put<T>(url, data, config);\r\n};\r\n\r\n/**\r\n * PATCH request\r\n */\r\nexport const patchRequest = async <T = unknown>(\r\n url: string,\r\n data?: unknown,\r\n customHeaders?: Record<string, string>\r\n): Promise<AxiosResponse<T>> => {\r\n const config = buildConfig(undefined, customHeaders);\r\n return axiosInstance.patch<T>(url, data, config);\r\n};\r\n\r\n/**\r\n * DELETE request\r\n */\r\nexport const deleteRequest = async <T = unknown>(\r\n url: string,\r\n params?: Record<string, unknown>,\r\n customHeaders?: Record<string, string>\r\n): Promise<AxiosResponse<T>> => {\r\n const config = buildConfig(params, customHeaders);\r\n return axiosInstance.delete<T>(url, config);\r\n};\r\n\r\n/**\r\n * File upload with FormData\r\n */\r\nexport const uploadFile = async <T = unknown>(\r\n url: string,\r\n file: File,\r\n additionalData?: Record<string, unknown>\r\n): Promise<AxiosResponse<T>> => {\r\n const formData = new FormData();\r\n formData.append('file', file);\r\n\r\n // Add additional form fields if provided\r\n if (additionalData) {\r\n Object.entries(additionalData).forEach(([key, value]) => {\r\n formData.append(key, String(value));\r\n });\r\n }\r\n\r\n const config: AxiosRequestConfig = {\r\n headers: {\r\n 'Content-Type': 'multipart/form-data',\r\n },\r\n };\r\n\r\n return axiosInstance.post<T>(url, formData, config);\r\n};\r\n\r\n// ==================== Utility Functions ====================\r\n\r\n/**\r\n * Extract data from response using response-parser\r\n */\r\nexport const extractData = <T = unknown>(response: AxiosResponse): T | null => {\r\n return parseResponseData<T>(response.data);\r\n};\r\n\r\n/**\r\n * Extract message from response\r\n */\r\nexport const extractMessage = (response: unknown): string => {\r\n return parseResponseMessage(response, '');\r\n};\r\n\r\n/**\r\n * Check if response is successful\r\n */\r\nexport const isSuccess = (response: AxiosResponse): boolean => {\r\n return response.status >= 200 && response.status < 300;\r\n};\r\n\r\n/**\r\n * Extract paginated data from response\r\n */\r\nexport const extractPaginatedData = <T = unknown>(\r\n response: AxiosResponse\r\n): PaginatedResponse<T> => {\r\n return parsePaginatedResponse<T>(response.data);\r\n};\r\n\r\n// ==================== Export Axios Instance ====================\r\n\r\n/**\r\n * Export axios instance for advanced use cases\r\n */\r\nexport { axiosInstance as axios };\r\n\r\n/**\r\n * Re-export types and utilities from response-parser\r\n */\r\nexport type { ApiResponse, PaginatedResponse, AxiosResponse, AxiosError };\r\nexport {\r\n parseResponseData,\r\n parseResponseMessage,\r\n parseResponseStatus,\r\n parseResponseStatusMessage,\r\n isSuccessResponse,\r\n isErrorResponse,\r\n parseError,\r\n parseAxiosErrorMessage,\r\n parsePaginatedResponse,\r\n extractNestedData,\r\n safeJsonParse,\r\n simpleParseResponse,\r\n simpleMetaParseResponse,\r\n simpleParseDualDataResponse,\r\n STATUS_CODES,\r\n STATUS_MESSAGES,\r\n SUCCESS_CODES,\r\n ERROR_CODES,\r\n} from './response-parser';\r\nexport type { ParsedError, PaginationData, ColumnMetadata } from './response-parser';\r\n","/**\r\n * Slug Utility\r\n *\r\n * Generates slugs from text for use in URLs and object properties.\r\n */\r\n\r\n/**\r\n * Generates a camelCase slug from a given text for use in object properties\r\n * @param text - The text to convert to camelCase slug\r\n * @returns The generated camelCase slug\r\n */\r\nexport const generateSlug = (text: string): string => {\r\n if (!text) return '';\r\n\r\n return text\r\n .trim()\r\n .replace(/[^\\w\\s]/g, '') // Remove special characters except alphanumeric and spaces\r\n .replace(/\\s+(.)/g, (_, char) => char.toUpperCase()) // Convert to camelCase\r\n .replace(/\\s+/g, '') // Remove remaining spaces\r\n .replace(/^(.)/, (_, char) => char.toLowerCase()); // Ensure first char is lowercase\r\n};\r\n\r\n/**\r\n * Generates a kebab-case slug from a given text for use in URLs\r\n * @param text - The text to convert to kebab-case slug\r\n * @returns The generated kebab-case slug\r\n */\r\nexport const generateUrlSlug = (text: string): string => {\r\n if (!text) return '';\r\n\r\n return text\r\n .trim()\r\n .toLowerCase()\r\n .replace(/[^\\w\\s-]/g, '') // Remove special characters except alphanumeric, spaces and hyphens\r\n .replace(/\\s+/g, '-') // Replace spaces with hyphens\r\n .replace(/-+/g, '-') // Replace multiple hyphens with single hyphen\r\n .replace(/^-|-$/g, ''); // Remove leading/trailing hyphens\r\n};\r\n\r\n/**\r\n * Generates a snake_case slug from a given text\r\n * @param text - The text to convert to snake_case slug\r\n * @returns The generated snake_case slug\r\n */\r\nexport const generateSnakeSlug = (text: string): string => {\r\n if (!text) return '';\r\n\r\n return text\r\n .trim()\r\n .toLowerCase()\r\n .replace(/[^\\w\\s]/g, '') // Remove special characters except alphanumeric and spaces\r\n .replace(/\\s+/g, '_') // Replace spaces with underscores\r\n .replace(/_+/g, '_') // Replace multiple underscores with single underscore\r\n .replace(/^_|_$/g, ''); // Remove leading/trailing underscores\r\n};\r\n\r\nexport default {\r\n generateSlug,\r\n generateUrlSlug,\r\n generateSnakeSlug,\r\n};\r\n"]}
1
+ {"version":3,"sources":["../../../src/client/http/logger.ts","../../../src/client/http/response-parser.ts","../../../src/client/http/http.ts","../../../src/client/http/slug.ts"],"names":["parseError"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\r\n * Client Logger Utility\r\n *\r\n * Centralized logging utility that:\r\n * - Only logs in development mode\r\n * - Can be extended to send logs to external services (Sentry, LogRocket, etc.)\r\n * - Provides consistent logging interface\r\n */\r\n\r\ninterface LogOptions {\r\n context?: string;\r\n metadata?: Record<string, unknown>;\r\n}\r\n\r\nclass Logger {\r\n private isDevelopment =\r\n typeof window !== 'undefined' && window.location.hostname === 'localhost';\r\n\r\n /**\r\n * Log informational messages\r\n */\r\n info(message: string, data?: unknown, options?: LogOptions): void {\r\n if (this.isDevelopment) {\r\n const prefix = options?.context ? `[${options.context}]` : '';\r\n console.log(`${prefix} ${message}`, data ?? '');\r\n }\r\n }\r\n\r\n /**\r\n * Log warning messages\r\n */\r\n warn(message: string, data?: unknown, options?: LogOptions): void {\r\n if (this.isDevelopment) {\r\n const prefix = options?.context ? `[${options.context}]` : '';\r\n console.warn(`${prefix} ${message}`, data ?? '');\r\n }\r\n // TODO: Send to monitoring service in production\r\n }\r\n\r\n /**\r\n * Log error messages\r\n */\r\n error(message: string, error?: unknown, options?: LogOptions): void {\r\n const prefix = options?.context ? `[${options.context}]` : '';\r\n\r\n if (this.isDevelopment) {\r\n console.error(`${prefix} ${message}`, error, options?.metadata || '');\r\n }\r\n\r\n // TODO: Send to error tracking service (Sentry, etc.) in production\r\n }\r\n\r\n /**\r\n * Log debug messages (only in development)\r\n */\r\n debug(message: string, data?: unknown, options?: LogOptions): void {\r\n if (this.isDevelopment) {\r\n const prefix = options?.context ? `[${options.context}]` : '';\r\n console.debug(`${prefix} ${message}`, data || '');\r\n }\r\n }\r\n\r\n /**\r\n * Log API errors with structured information\r\n */\r\n apiError(endpoint: string, error: unknown, metadata?: Record<string, unknown>): void {\r\n this.error(`API Error: ${endpoint}`, error, {\r\n context: 'API',\r\n metadata: {\r\n endpoint,\r\n ...metadata,\r\n },\r\n });\r\n }\r\n}\r\n\r\n// Export singleton instance\r\nexport const logger = new Logger();\r\n\r\n// Export default for easier imports\r\nexport default logger;\r\n","/**\r\n * Response Parser Utility\r\n *\r\n * Comprehensive response parsing utilities for API responses.\r\n * Aligned with server-side response structures.\r\n */\r\n\r\nimport { logger } from './logger';\r\n\r\n/**\r\n * Standard API response structure from server\r\n */\r\nexport interface ApiResponse<T = unknown> {\r\n message: string;\r\n data: T | null;\r\n status: string;\r\n statusCode: number;\r\n paginationData?: PaginationData;\r\n columns?: ColumnMetadata[];\r\n}\r\n\r\n/**\r\n * Pagination metadata structure\r\n */\r\nexport interface PaginationData {\r\n total?: number;\r\n page?: number;\r\n limit?: number;\r\n totalPages?: number;\r\n}\r\n\r\n/**\r\n * Column metadata from server\r\n */\r\nexport interface ColumnMetadata {\r\n name: string;\r\n required: boolean;\r\n datatype: string;\r\n}\r\n\r\n/**\r\n * Status codes aligned with backend\r\n */\r\nexport const STATUS_CODES = {\r\n SUCCESS: 200,\r\n CREATED: 201,\r\n NO_CONTENT: 204,\r\n BAD_REQUEST: 400,\r\n UNAUTHORIZED: 401,\r\n FORBIDDEN: 403,\r\n NOT_FOUND: 404,\r\n CONFLICT: 409,\r\n ERROR: 500,\r\n} as const;\r\n\r\n/**\r\n * Status messages aligned with backend\r\n */\r\nexport const STATUS_MESSAGES = {\r\n SUCCESS: 'success',\r\n CREATED: 'created',\r\n NO_CONTENT: 'no_content',\r\n BAD_REQUEST: 'bad_request',\r\n UNAUTHORIZED: 'unauthorized',\r\n FORBIDDEN: 'forbidden',\r\n NOT_FOUND: 'not_found',\r\n CONFLICT: 'conflict',\r\n ERROR: 'error',\r\n};\r\n\r\n// Success status codes\r\nexport const SUCCESS_CODES = [200, 201, 204];\r\nexport const ERROR_CODES = [400, 401, 403, 404, 409, 500];\r\n\r\n/**\r\n * Safely extracts data from API response\r\n */\r\nexport const parseResponseData = <T = unknown>(\r\n response: unknown,\r\n fallback: T | null = null\r\n): T | null => {\r\n try {\r\n if (!response || typeof response !== 'object') {\r\n return fallback;\r\n }\r\n\r\n const resp = response as Record<string, unknown>;\r\n\r\n // Standard backend response has data property\r\n if ('data' in resp) {\r\n return (resp['data'] as T) ?? fallback;\r\n }\r\n\r\n // Fallback: return the response itself\r\n return response as T;\r\n } catch (error) {\r\n logger.error('Error parsing response data', error);\r\n return fallback;\r\n }\r\n};\r\n\r\n/**\r\n * Extracts message from response\r\n */\r\nexport const parseResponseMessage = (response: unknown, fallback = ''): string => {\r\n try {\r\n if (!response || typeof response !== 'object') {\r\n return fallback;\r\n }\r\n\r\n const resp = response as Record<string, unknown>;\r\n\r\n if ('message' in resp && typeof resp['message'] === 'string') {\r\n return resp['message'];\r\n }\r\n\r\n return fallback;\r\n } catch (error) {\r\n logger.error('Error parsing response message', error);\r\n return fallback;\r\n }\r\n};\r\n\r\n/**\r\n * Extracts status code from response\r\n */\r\nexport const parseResponseStatus = (response: unknown): number | null => {\r\n try {\r\n if (!response || typeof response !== 'object') {\r\n return null;\r\n }\r\n\r\n const resp = response as Record<string, unknown>;\r\n\r\n if ('statusCode' in resp && typeof resp['statusCode'] === 'number') {\r\n return resp['statusCode'];\r\n }\r\n\r\n if ('status' in resp && typeof resp['status'] === 'number') {\r\n return resp['status'];\r\n }\r\n\r\n return null;\r\n } catch (error) {\r\n logger.error('Error parsing response status', error);\r\n return null;\r\n }\r\n};\r\n\r\n/**\r\n * Extracts status message from response\r\n */\r\nexport const parseResponseStatusMessage = (response: unknown, fallback = ''): string => {\r\n try {\r\n if (!response || typeof response !== 'object') {\r\n return fallback;\r\n }\r\n\r\n const resp = response as Record<string, unknown>;\r\n\r\n if ('status' in resp && typeof resp['status'] === 'string') {\r\n return resp['status'];\r\n }\r\n\r\n return fallback;\r\n } catch (error) {\r\n logger.error('Error parsing response status message', error);\r\n return fallback;\r\n }\r\n};\r\n\r\n/**\r\n * Checks if response indicates success\r\n */\r\nexport const isSuccessResponse = (response: unknown): boolean => {\r\n try {\r\n const statusCode = parseResponseStatus(response);\r\n if (statusCode !== null) {\r\n return SUCCESS_CODES.includes(statusCode);\r\n }\r\n\r\n const status = parseResponseStatusMessage(response);\r\n return [STATUS_MESSAGES.SUCCESS, STATUS_MESSAGES.CREATED, STATUS_MESSAGES.NO_CONTENT].includes(\r\n status\r\n );\r\n } catch (error) {\r\n logger.error('Error checking response success', error);\r\n return false;\r\n }\r\n};\r\n\r\n/**\r\n * Checks if response indicates error\r\n */\r\nexport const isErrorResponse = (response: unknown): boolean => {\r\n try {\r\n const statusCode = parseResponseStatus(response);\r\n if (statusCode !== null) {\r\n return ERROR_CODES.includes(statusCode);\r\n }\r\n return false;\r\n } catch (error) {\r\n logger.error('Error checking response error', error);\r\n return false;\r\n }\r\n};\r\n\r\n/**\r\n * Paginated response structure\r\n */\r\nexport interface PaginatedResponse<T> {\r\n items: T[];\r\n total: number;\r\n page: number;\r\n limit: number;\r\n totalPages?: number;\r\n columns?: ColumnMetadata[];\r\n}\r\n\r\n/**\r\n * Parses paginated response from backend\r\n */\r\nexport const parsePaginatedResponse = <T = unknown>(response: unknown): PaginatedResponse<T> => {\r\n try {\r\n if (!response || typeof response !== 'object') {\r\n return { items: [], total: 0, page: 1, limit: 10 };\r\n }\r\n\r\n const resp = response as Record<string, unknown>;\r\n\r\n // Extract data array\r\n let items: T[] = [];\r\n if ('data' in resp && Array.isArray(resp['data'])) {\r\n items = resp['data'] as T[];\r\n }\r\n\r\n // Extract pagination data\r\n let total = items.length;\r\n let page = 1;\r\n let limit = 10;\r\n let totalPages: number | undefined;\r\n\r\n if (\r\n 'paginationData' in resp &&\r\n resp['paginationData'] &&\r\n typeof resp['paginationData'] === 'object'\r\n ) {\r\n const paginationData = resp['paginationData'] as Record<string, unknown>;\r\n\r\n if ('total' in paginationData && typeof paginationData['total'] === 'number') {\r\n total = paginationData['total'];\r\n }\r\n if ('page' in paginationData && typeof paginationData['page'] === 'number') {\r\n page = paginationData['page'];\r\n }\r\n if ('limit' in paginationData && typeof paginationData['limit'] === 'number') {\r\n limit = paginationData['limit'];\r\n }\r\n if ('totalPages' in paginationData && typeof paginationData['totalPages'] === 'number') {\r\n totalPages = paginationData['totalPages'];\r\n }\r\n }\r\n\r\n // Extract columns metadata\r\n let columns: ColumnMetadata[] | undefined;\r\n if ('columns' in resp && Array.isArray(resp['columns'])) {\r\n columns = resp['columns'] as ColumnMetadata[];\r\n }\r\n\r\n return {\r\n items,\r\n total,\r\n page,\r\n limit,\r\n ...(totalPages !== undefined && { totalPages }),\r\n ...(columns !== undefined && { columns }),\r\n };\r\n } catch (error) {\r\n logger.error('Error parsing paginated response', error);\r\n return { items: [], total: 0, page: 1, limit: 10 };\r\n }\r\n};\r\n\r\n/**\r\n * Extracts specific nested data with path\r\n */\r\nexport const extractNestedData = <T = unknown>(\r\n response: unknown,\r\n path: string,\r\n fallback: T | null = null\r\n): T | null => {\r\n try {\r\n const keys = path.split('.');\r\n let current: unknown = response;\r\n\r\n for (const key of keys) {\r\n if (current && typeof current === 'object' && key in current) {\r\n current = (current as Record<string, unknown>)[key];\r\n } else {\r\n return fallback;\r\n }\r\n }\r\n\r\n return current as T;\r\n } catch (error) {\r\n logger.error('Error extracting nested data', error);\r\n return fallback;\r\n }\r\n};\r\n\r\n/**\r\n * Safe JSON parse with fallback\r\n */\r\nexport const safeJsonParse = <T = unknown>(json: string, fallback: T | null = null): T | null => {\r\n try {\r\n return JSON.parse(json) as T;\r\n } catch (error) {\r\n logger.error('Error parsing JSON', error);\r\n return fallback;\r\n }\r\n};\r\n\r\n/**\r\n * Extracts error message from axios error response\r\n */\r\nexport const parseAxiosErrorMessage = (error: unknown): string => {\r\n try {\r\n if (!error || typeof error !== 'object') {\r\n return 'An unexpected error occurred';\r\n }\r\n\r\n const err = error as Record<string, unknown>;\r\n\r\n // Check for axios response structure\r\n if ('response' in err && err['response'] && typeof err['response'] === 'object') {\r\n const response = err['response'] as Record<string, unknown>;\r\n\r\n if ('data' in response && response['data'] && typeof response['data'] === 'object') {\r\n const data = response['data'] as Record<string, unknown>;\r\n\r\n // Check for nested data.message (ImageKit and other external APIs)\r\n if ('data' in data && data['data'] && typeof data['data'] === 'object') {\r\n const nestedData = data['data'] as Record<string, unknown>;\r\n if ('message' in nestedData && typeof nestedData['message'] === 'string') {\r\n return nestedData['message'];\r\n }\r\n }\r\n // Check for message in response data (backend standard)\r\n if ('message' in data && typeof data['message'] === 'string') {\r\n return data['message'];\r\n }\r\n // Check for error property\r\n if ('error' in data && typeof data['error'] === 'string') {\r\n return data['error'];\r\n }\r\n }\r\n }\r\n\r\n // Check for direct error message\r\n if ('message' in err && typeof err['message'] === 'string') {\r\n return err['message'];\r\n }\r\n\r\n // Check for string error\r\n if (typeof error === 'string') {\r\n return error;\r\n }\r\n\r\n return 'An unexpected error occurred';\r\n } catch (parseError) {\r\n logger.error('Error parsing axios error message', parseError);\r\n return 'An unexpected error occurred';\r\n }\r\n};\r\n\r\n/**\r\n * Standardized error object\r\n */\r\nexport interface ParsedError {\r\n message: string;\r\n statusCode: number | null;\r\n data: unknown;\r\n status?: string;\r\n}\r\n\r\n/**\r\n * Parses error into standardized format\r\n */\r\nexport const parseError = (error: unknown): ParsedError => {\r\n try {\r\n if (!error || typeof error !== 'object') {\r\n return {\r\n message: 'An unexpected error occurred',\r\n statusCode: null,\r\n data: null,\r\n };\r\n }\r\n\r\n const err = error as Record<string, unknown>;\r\n let statusCode: number | null = null;\r\n let data: unknown = null;\r\n let status: string | undefined;\r\n\r\n // Extract from axios response structure\r\n if ('response' in err && err['response'] && typeof err['response'] === 'object') {\r\n const response = err['response'] as Record<string, unknown>;\r\n\r\n if ('status' in response && typeof response['status'] === 'number') {\r\n statusCode = response['status'];\r\n }\r\n\r\n if ('data' in response && response['data'] !== undefined) {\r\n data = response['data'];\r\n\r\n if (data && typeof data === 'object' && 'status' in data) {\r\n const dataObj = data as Record<string, unknown>;\r\n if (typeof dataObj['status'] === 'string') {\r\n status = dataObj['status'];\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Fallback to direct properties\r\n if (statusCode === null && 'statusCode' in err && typeof err['statusCode'] === 'number') {\r\n statusCode = err['statusCode'];\r\n }\r\n\r\n if (data === null && 'data' in err && err['data'] !== undefined) {\r\n data = err['data'];\r\n }\r\n\r\n if (!status && 'status' in err && typeof err['status'] === 'string') {\r\n status = err['status'];\r\n }\r\n\r\n return {\r\n message: parseAxiosErrorMessage(error),\r\n statusCode,\r\n data,\r\n ...(status !== undefined && { status }),\r\n };\r\n } catch (err) {\r\n logger.error('Error parsing error object', err);\r\n return {\r\n message: 'An unexpected error occurred',\r\n statusCode: null,\r\n data: null,\r\n };\r\n }\r\n};\r\n\r\n// ==================== Simple Parse Helpers ====================\r\n\r\ninterface SimpleApiResponse {\r\n data?: {\r\n data?: {\r\n data?: unknown;\r\n meta?: Record<string, unknown>;\r\n };\r\n };\r\n}\r\n\r\nexport const simpleParseResponse = (response: SimpleApiResponse) => {\r\n return response?.data?.data?.data;\r\n};\r\n\r\nexport const simpleMetaParseResponse = (response: SimpleApiResponse) => {\r\n return response?.data?.data?.meta;\r\n};\r\n\r\nexport const simpleParseDualDataResponse = (response: SimpleApiResponse) => {\r\n return response?.data?.data;\r\n};\r\n\r\nexport default {\r\n parseResponseData,\r\n parseResponseMessage,\r\n parseResponseStatus,\r\n parseResponseStatusMessage,\r\n isSuccessResponse,\r\n isErrorResponse,\r\n parsePaginatedResponse,\r\n extractNestedData,\r\n safeJsonParse,\r\n parseAxiosErrorMessage,\r\n parseError,\r\n simpleParseResponse,\r\n simpleMetaParseResponse,\r\n simpleParseDualDataResponse,\r\n STATUS_CODES,\r\n STATUS_MESSAGES,\r\n SUCCESS_CODES,\r\n ERROR_CODES,\r\n};\r\n","/**\r\n * HTTP Client Module\r\n *\r\n * Unified HTTP utilities combining axios-based requests with response parsing.\r\n * Provides consistent API calls with standardized error handling.\r\n *\r\n * Features:\r\n * - Pre-configured axios instance\r\n * - Automatic organization header injection\r\n * - Response parsing utilities\r\n * - Error handling with standardized format\r\n * - File upload support\r\n * - Pagination support\r\n */\r\n\r\nimport axios from 'axios';\r\nimport type { AxiosRequestConfig, AxiosResponse, AxiosError } from 'axios';\r\nimport {\r\n parseResponseData,\r\n parseResponseMessage,\r\n parseError,\r\n parsePaginatedResponse,\r\n type ApiResponse,\r\n type PaginatedResponse,\r\n} from './response-parser';\r\nimport { logger } from './logger';\r\n\r\n// ==================== API Configuration ====================\r\n\r\n/**\r\n * HTTP Configuration Interface\r\n */\r\ninterface HttpConfig {\r\n baseUrl?: string;\r\n apiPrefix?: string;\r\n timeout?: number;\r\n defaultHeaders?: Record<string, string>;\r\n}\r\n\r\n/**\r\n * Default configuration\r\n */\r\nconst defaultConfig: HttpConfig = {\r\n baseUrl: typeof window !== 'undefined' && window.location.hostname === 'localhost'\r\n ? 'http://localhost:4002'\r\n : 'https://service-api.exyconn.com',\r\n apiPrefix: '/v1/api',\r\n timeout: 30000,\r\n defaultHeaders: {},\r\n};\r\n\r\n/**\r\n * Current HTTP configuration\r\n */\r\nlet currentConfig: HttpConfig = { ...defaultConfig };\r\n\r\n// Configure axios instance\r\nconst axiosInstance = axios.create({\r\n baseURL: defaultConfig.baseUrl,\r\n timeout: defaultConfig.timeout,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n});\r\n\r\n/**\r\n * Get current API Base URL\r\n */\r\nexport const getApiBaseUrl = (): string => {\r\n return currentConfig.baseUrl || defaultConfig.baseUrl!;\r\n};\r\n\r\n/**\r\n * Set API Base URL\r\n */\r\nexport const setApiBaseUrl = (baseUrl: string): void => {\r\n currentConfig.baseUrl = baseUrl;\r\n axiosInstance.defaults.baseURL = baseUrl;\r\n logger.info(`API Base URL updated to: ${baseUrl}`);\r\n};\r\n\r\n/**\r\n * Get current API Prefix\r\n */\r\nexport const getApiPrefix = (): string => {\r\n return currentConfig.apiPrefix || defaultConfig.apiPrefix!;\r\n};\r\n\r\n/**\r\n * Set API Prefix\r\n */\r\nexport const setApiPrefix = (prefix: string): void => {\r\n currentConfig.apiPrefix = prefix;\r\n logger.info(`API Prefix updated to: ${prefix}`);\r\n};\r\n\r\n/**\r\n * Get all custom headers\r\n */\r\nexport const getCustomHeaders = (): Record<string, string> => {\r\n return { ...currentConfig.defaultHeaders };\r\n};\r\n\r\n/**\r\n * Set a custom header globally\r\n */\r\nexport const setCustomHeader = (key: string, value: string): void => {\r\n if (!currentConfig.defaultHeaders) {\r\n currentConfig.defaultHeaders = {};\r\n }\r\n currentConfig.defaultHeaders[key] = value;\r\n axiosInstance.defaults.headers.common[key] = value;\r\n logger.info(`Custom header added: ${key}`);\r\n};\r\n\r\n/**\r\n * Remove a custom header\r\n */\r\nexport const removeCustomHeader = (key: string): void => {\r\n if (currentConfig.defaultHeaders) {\r\n delete currentConfig.defaultHeaders[key];\r\n }\r\n delete axiosInstance.defaults.headers.common[key];\r\n logger.info(`Custom header removed: ${key}`);\r\n};\r\n\r\n/**\r\n * Set multiple custom headers at once\r\n */\r\nexport const setCustomHeaders = (headers: Record<string, string>): void => {\r\n currentConfig.defaultHeaders = { ...currentConfig.defaultHeaders, ...headers };\r\n Object.entries(headers).forEach(([key, value]) => {\r\n axiosInstance.defaults.headers.common[key] = value;\r\n });\r\n logger.info(`Multiple custom headers added: ${Object.keys(headers).join(', ')}`);\r\n};\r\n\r\n/**\r\n * Clear all custom headers\r\n */\r\nexport const clearCustomHeaders = (): void => {\r\n if (currentConfig.defaultHeaders) {\r\n Object.keys(currentConfig.defaultHeaders).forEach(key => {\r\n delete axiosInstance.defaults.headers.common[key];\r\n });\r\n }\r\n currentConfig.defaultHeaders = {};\r\n logger.info('All custom headers cleared');\r\n};\r\n\r\n/**\r\n * Configure HTTP client with custom settings\r\n */\r\nexport const configureHttp = (config: HttpConfig): void => {\r\n if (config.baseUrl) {\r\n setApiBaseUrl(config.baseUrl);\r\n }\r\n if (config.apiPrefix) {\r\n setApiPrefix(config.apiPrefix);\r\n }\r\n if (config.timeout !== undefined) {\r\n currentConfig.timeout = config.timeout;\r\n axiosInstance.defaults.timeout = config.timeout;\r\n }\r\n if (config.defaultHeaders) {\r\n setCustomHeaders(config.defaultHeaders);\r\n }\r\n logger.info('HTTP client configured successfully');\r\n};\r\n\r\n/**\r\n * Get current HTTP configuration\r\n */\r\nexport const getHttpConfig = (): Readonly<HttpConfig> => {\r\n return { ...currentConfig };\r\n};\r\n\r\n/**\r\n * Reset HTTP configuration to defaults\r\n */\r\nexport const resetHttpConfig = (): void => {\r\n currentConfig = { ...defaultConfig };\r\n axiosInstance.defaults.baseURL = defaultConfig.baseUrl;\r\n axiosInstance.defaults.timeout = defaultConfig.timeout;\r\n clearCustomHeaders();\r\n logger.info('HTTP configuration reset to defaults');\r\n};\r\n\r\n/**\r\n * @deprecated Use getApiBaseUrl() instead\r\n */\r\nexport const API_BASE_URL = getApiBaseUrl();\r\n\r\n/**\r\n * @deprecated Use getApiPrefix() instead\r\n */\r\nexport const API_PREFIX = getApiPrefix();\r\n\r\n// Request interceptor - Add organization header automatically\r\naxiosInstance.interceptors.request.use(\r\n config => {\r\n // Add organization header if available in localStorage\r\n try {\r\n if (typeof window !== 'undefined' && window.localStorage) {\r\n const selectedOrg = localStorage.getItem('selectedOrganization');\r\n if (selectedOrg) {\r\n const org = JSON.parse(selectedOrg);\r\n if (org && org._id) {\r\n config.headers['x-organization-id'] = org._id;\r\n }\r\n }\r\n }\r\n } catch (error) {\r\n // Silently ignore localStorage errors\r\n logger.warn('Failed to read organization from localStorage', error);\r\n }\r\n\r\n return config;\r\n },\r\n error => {\r\n return Promise.reject(error);\r\n }\r\n);\r\n\r\n// Response interceptor - Standardize error handling\r\naxiosInstance.interceptors.response.use(\r\n response => response,\r\n (error: AxiosError) => {\r\n const parsedError = parseError(error);\r\n logger.error('API Error', parsedError);\r\n return Promise.reject(parsedError);\r\n }\r\n);\r\n\r\n// ==================== Helper Functions ====================\r\n\r\n/**\r\n * Build request headers\r\n * Merges global custom headers with request-specific headers\r\n */\r\nconst buildHeaders = (customHeaders?: Record<string, string>): Record<string, string> => {\r\n const headers: Record<string, string> = {\r\n 'Content-Type': 'application/json',\r\n ...currentConfig.defaultHeaders, // Add global custom headers\r\n ...customHeaders, // Request-specific headers override global ones\r\n };\r\n return headers;\r\n};\r\n\r\n/**\r\n * Build axios config with headers and params\r\n */\r\nconst buildConfig = (\r\n params?: Record<string, unknown>,\r\n customHeaders?: Record<string, string>\r\n): AxiosRequestConfig => {\r\n const config: AxiosRequestConfig = {\r\n headers: buildHeaders(customHeaders),\r\n };\r\n\r\n if (params) {\r\n config.params = params;\r\n }\r\n\r\n return config;\r\n};\r\n\r\n// ==================== HTTP Methods ====================\r\n\r\n/**\r\n * GET request\r\n */\r\nexport const getRequest = async <T = unknown>(\r\n url: string,\r\n params?: Record<string, unknown>,\r\n customHeaders?: Record<string, string>\r\n): Promise<AxiosResponse<T>> => {\r\n const config = buildConfig(params, customHeaders);\r\n return axiosInstance.get<T>(url, config);\r\n};\r\n\r\n/**\r\n * POST request\r\n */\r\nexport const postRequest = async <T = unknown>(\r\n url: string,\r\n data?: unknown,\r\n customHeaders?: Record<string, string>\r\n): Promise<AxiosResponse<T>> => {\r\n const config = buildConfig(undefined, customHeaders);\r\n return axiosInstance.post<T>(url, data, config);\r\n};\r\n\r\n/**\r\n * PUT request\r\n */\r\nexport const putRequest = async <T = unknown>(\r\n url: string,\r\n data?: unknown,\r\n customHeaders?: Record<string, string>\r\n): Promise<AxiosResponse<T>> => {\r\n const config = buildConfig(undefined, customHeaders);\r\n return axiosInstance.put<T>(url, data, config);\r\n};\r\n\r\n/**\r\n * PATCH request\r\n */\r\nexport const patchRequest = async <T = unknown>(\r\n url: string,\r\n data?: unknown,\r\n customHeaders?: Record<string, string>\r\n): Promise<AxiosResponse<T>> => {\r\n const config = buildConfig(undefined, customHeaders);\r\n return axiosInstance.patch<T>(url, data, config);\r\n};\r\n\r\n/**\r\n * DELETE request\r\n */\r\nexport const deleteRequest = async <T = unknown>(\r\n url: string,\r\n params?: Record<string, unknown>,\r\n customHeaders?: Record<string, string>\r\n): Promise<AxiosResponse<T>> => {\r\n const config = buildConfig(params, customHeaders);\r\n return axiosInstance.delete<T>(url, config);\r\n};\r\n\r\n/**\r\n * File upload with FormData\r\n */\r\nexport const uploadFile = async <T = unknown>(\r\n url: string,\r\n file: File,\r\n additionalData?: Record<string, unknown>\r\n): Promise<AxiosResponse<T>> => {\r\n const formData = new FormData();\r\n formData.append('file', file);\r\n\r\n // Add additional form fields if provided\r\n if (additionalData) {\r\n Object.entries(additionalData).forEach(([key, value]) => {\r\n formData.append(key, String(value));\r\n });\r\n }\r\n\r\n const config: AxiosRequestConfig = {\r\n headers: {\r\n 'Content-Type': 'multipart/form-data',\r\n },\r\n };\r\n\r\n return axiosInstance.post<T>(url, formData, config);\r\n};\r\n\r\n// ==================== Utility Functions ====================\r\n\r\n/**\r\n * Extract data from response using response-parser\r\n */\r\nexport const extractData = <T = unknown>(response: AxiosResponse): T | null => {\r\n return parseResponseData<T>(response.data);\r\n};\r\n\r\n/**\r\n * Extract message from response\r\n */\r\nexport const extractMessage = (response: unknown): string => {\r\n return parseResponseMessage(response, '');\r\n};\r\n\r\n/**\r\n * Check if response is successful\r\n */\r\nexport const isSuccess = (response: AxiosResponse): boolean => {\r\n return response.status >= 200 && response.status < 300;\r\n};\r\n\r\n/**\r\n * Extract paginated data from response\r\n */\r\nexport const extractPaginatedData = <T = unknown>(\r\n response: AxiosResponse\r\n): PaginatedResponse<T> => {\r\n return parsePaginatedResponse<T>(response.data);\r\n};\r\n\r\n// ==================== Export Axios Instance ====================\r\n\r\n/**\r\n * Export axios instance for advanced use cases\r\n */\r\nexport { axiosInstance as axios };\r\n\r\n/**\r\n * Re-export types and utilities from response-parser\r\n */\r\nexport type { ApiResponse, PaginatedResponse, AxiosResponse, AxiosError };\r\nexport {\r\n parseResponseData,\r\n parseResponseMessage,\r\n parseResponseStatus,\r\n parseResponseStatusMessage,\r\n isSuccessResponse,\r\n isErrorResponse,\r\n parseError,\r\n parseAxiosErrorMessage,\r\n parsePaginatedResponse,\r\n extractNestedData,\r\n safeJsonParse,\r\n simpleParseResponse,\r\n simpleMetaParseResponse,\r\n simpleParseDualDataResponse,\r\n STATUS_CODES,\r\n STATUS_MESSAGES,\r\n SUCCESS_CODES,\r\n ERROR_CODES,\r\n} from './response-parser';\r\nexport type { ParsedError, PaginationData, ColumnMetadata } from './response-parser';\r\n","/**\r\n * Slug Utility\r\n *\r\n * Generates slugs from text for use in URLs and object properties.\r\n */\r\n\r\n/**\r\n * Generates a camelCase slug from a given text for use in object properties\r\n * @param text - The text to convert to camelCase slug\r\n * @returns The generated camelCase slug\r\n */\r\nexport const generateSlug = (text: string): string => {\r\n if (!text) return '';\r\n\r\n return text\r\n .trim()\r\n .replace(/[^\\w\\s]/g, '') // Remove special characters except alphanumeric and spaces\r\n .replace(/\\s+(.)/g, (_, char) => char.toUpperCase()) // Convert to camelCase\r\n .replace(/\\s+/g, '') // Remove remaining spaces\r\n .replace(/^(.)/, (_, char) => char.toLowerCase()); // Ensure first char is lowercase\r\n};\r\n\r\n/**\r\n * Generates a kebab-case slug from a given text for use in URLs\r\n * @param text - The text to convert to kebab-case slug\r\n * @returns The generated kebab-case slug\r\n */\r\nexport const generateUrlSlug = (text: string): string => {\r\n if (!text) return '';\r\n\r\n return text\r\n .trim()\r\n .toLowerCase()\r\n .replace(/[^\\w\\s-]/g, '') // Remove special characters except alphanumeric, spaces and hyphens\r\n .replace(/\\s+/g, '-') // Replace spaces with hyphens\r\n .replace(/-+/g, '-') // Replace multiple hyphens with single hyphen\r\n .replace(/^-|-$/g, ''); // Remove leading/trailing hyphens\r\n};\r\n\r\n/**\r\n * Generates a snake_case slug from a given text\r\n * @param text - The text to convert to snake_case slug\r\n * @returns The generated snake_case slug\r\n */\r\nexport const generateSnakeSlug = (text: string): string => {\r\n if (!text) return '';\r\n\r\n return text\r\n .trim()\r\n .toLowerCase()\r\n .replace(/[^\\w\\s]/g, '') // Remove special characters except alphanumeric and spaces\r\n .replace(/\\s+/g, '_') // Replace spaces with underscores\r\n .replace(/_+/g, '_') // Replace multiple underscores with single underscore\r\n .replace(/^_|_$/g, ''); // Remove leading/trailing underscores\r\n};\r\n\r\nexport default {\r\n generateSlug,\r\n generateUrlSlug,\r\n generateSnakeSlug,\r\n};\r\n"]}
@@ -1,4 +1,4 @@
1
- export { API_BASE_URL, API_PREFIX, ApiResponse, ColumnMetadata, ERROR_CODES, PaginatedResponse, PaginationData, ParsedError, STATUS_CODES, STATUS_MESSAGES, SUCCESS_CODES, axios, deleteRequest, extractData, extractMessage, extractNestedData, extractPaginatedData, generateSlug, generateSnakeSlug, generateUrlSlug, getRequest, isErrorResponse, isSuccess, isSuccessResponse, logger, parseAxiosErrorMessage, parseError, parsePaginatedResponse, parseResponseData, parseResponseMessage, parseResponseStatus, parseResponseStatusMessage, patchRequest, postRequest, putRequest, safeJsonParse, simpleMetaParseResponse, simpleParseDualDataResponse, simpleParseResponse, uploadFile } from './http/index.mjs';
1
+ export { API_BASE_URL, API_PREFIX, ApiResponse, ColumnMetadata, ERROR_CODES, PaginatedResponse, PaginationData, ParsedError, STATUS_CODES, STATUS_MESSAGES, SUCCESS_CODES, axios, clearCustomHeaders, configureHttp, deleteRequest, extractData, extractMessage, extractNestedData, extractPaginatedData, generateSlug, generateSnakeSlug, generateUrlSlug, getApiBaseUrl, getApiPrefix, getCustomHeaders, getHttpConfig, getRequest, isErrorResponse, isSuccess, isSuccessResponse, logger, parseAxiosErrorMessage, parseError, parsePaginatedResponse, parseResponseData, parseResponseMessage, parseResponseStatus, parseResponseStatusMessage, patchRequest, postRequest, putRequest, removeCustomHeader, resetHttpConfig, safeJsonParse, setApiBaseUrl, setApiPrefix, setCustomHeader, setCustomHeaders, simpleMetaParseResponse, simpleParseDualDataResponse, simpleParseResponse, uploadFile } from './http/index.mjs';
2
2
  export { ClientLogger, ClientLoggerConfig, LogLevel, clientLogger, createClientLogger } from './logger/index.mjs';
3
3
  export { c as camelToKebab, a as capitalize, b as capitalizeWords, d as copyToClipboard, e as createEmptyPaginationMeta, f as createErrorResponse, g as createSuccessResponse, h as formatDate, i as formatDateTime, j as formatRelativeTime, k as getErrorMessage, l as getNextPage, m as getPrevPage, n as getResponseData, o as hasData, p as hasMorePages, q as isUtilErrorResponse, r as isUtilSuccessResponse, s as kebabToCamel, t as packageCheck, u as slugify, v as slugifyUnique, w as truncate, x as truncateWords, y as unslugify } from '../packageCheck-C2_FT_Rl.mjs';
4
4
  export { BatteryState, Dimensions, GeolocationState, MousePosition, NetworkState, ObjectStateUpdate, OrientationState, RenderInfo, ScriptStatus, SetValue, SnackbarSeverity, SnackbarState, ThemeMode, UseContinuousRetryOptions, UseContinuousRetryReturn, UseCopyToClipboardReturn, UseCountdownOptions, UseCountdownReturn, UseCounterOptions, UseCounterReturn, UseDocumentTitleOptions, UseFetchOptions, UseFetchReturn, UseGeolocationOptions, UseGeolocationReturn, UseHistoryStateOptions, UseHistoryStateReturn, UseHoverReturn, UseIdleOptions, UseIdleReturn, UseIntersectionObserverOptions, UseIntersectionObserverReturn, UseKeyPressOptions, UseKeyPressReturn, UseListReturn, UseLocalStorageOptions, UseLoggerOptions, UseLongPressOptions, UseLongPressReturn, UseMapReturn, UseMeasureReturn, UseMouseOptions, UseMouseReturn, UseObjectStateReturn, UsePageLeaveOptions, UsePageTitleOptions, UsePreferredLanguageReturn, UseQueueReturn, UseScriptOptions, UseScriptReturn, UseSessionStorageOptions, UseSetReturn, UseSnackbarReturn, UseTimeoutReturn, UseToggleReturn, UseVisibilityChangeReturn, UseWindowScrollReturn, WindowScrollPosition, WindowSize, useBattery, useClickAway, useContinuousRetry, useCopyToClipboard, useCountdown, useCounter, useDebounce, useDefault, useDocumentTitle, useEventListener, useFavicon, useFetch, useGeolocation, useHistoryState, useHover, useIdle, useIntersectionObserver, useInterval, useIntervalWhen, useIsClient, useIsDesktop, useIsFirstRender, useIsMobile, useIsMobileOrTablet, useIsTablet, useKeyPress, useList, useLocalStorage, useLockBodyScroll, useLogger, useLongPress, useMap, useMeasure, useMediaQuery, useMouse, useNetworkState, useObjectState, useOnClickOutside, useOrientation, usePageLeave, usePageTitle, usePreferredLanguage, usePrevious, useQueue, useRandomInterval, useRenderCount, useRenderInfo, useScript, useSessionStorage, useSet, useSnackbar, useThemeDetector, useThrottle, useTimeout, useToggle, useVisibilityChange, useWindowScroll, useWindowSize } from './hooks/index.mjs';
@@ -1,4 +1,4 @@
1
- export { API_BASE_URL, API_PREFIX, ApiResponse, ColumnMetadata, ERROR_CODES, PaginatedResponse, PaginationData, ParsedError, STATUS_CODES, STATUS_MESSAGES, SUCCESS_CODES, axios, deleteRequest, extractData, extractMessage, extractNestedData, extractPaginatedData, generateSlug, generateSnakeSlug, generateUrlSlug, getRequest, isErrorResponse, isSuccess, isSuccessResponse, logger, parseAxiosErrorMessage, parseError, parsePaginatedResponse, parseResponseData, parseResponseMessage, parseResponseStatus, parseResponseStatusMessage, patchRequest, postRequest, putRequest, safeJsonParse, simpleMetaParseResponse, simpleParseDualDataResponse, simpleParseResponse, uploadFile } from './http/index.js';
1
+ export { API_BASE_URL, API_PREFIX, ApiResponse, ColumnMetadata, ERROR_CODES, PaginatedResponse, PaginationData, ParsedError, STATUS_CODES, STATUS_MESSAGES, SUCCESS_CODES, axios, clearCustomHeaders, configureHttp, deleteRequest, extractData, extractMessage, extractNestedData, extractPaginatedData, generateSlug, generateSnakeSlug, generateUrlSlug, getApiBaseUrl, getApiPrefix, getCustomHeaders, getHttpConfig, getRequest, isErrorResponse, isSuccess, isSuccessResponse, logger, parseAxiosErrorMessage, parseError, parsePaginatedResponse, parseResponseData, parseResponseMessage, parseResponseStatus, parseResponseStatusMessage, patchRequest, postRequest, putRequest, removeCustomHeader, resetHttpConfig, safeJsonParse, setApiBaseUrl, setApiPrefix, setCustomHeader, setCustomHeaders, simpleMetaParseResponse, simpleParseDualDataResponse, simpleParseResponse, uploadFile } from './http/index.js';
2
2
  export { ClientLogger, ClientLoggerConfig, LogLevel, clientLogger, createClientLogger } from './logger/index.js';
3
3
  export { c as camelToKebab, a as capitalize, b as capitalizeWords, d as copyToClipboard, e as createEmptyPaginationMeta, f as createErrorResponse, g as createSuccessResponse, h as formatDate, i as formatDateTime, j as formatRelativeTime, k as getErrorMessage, l as getNextPage, m as getPrevPage, n as getResponseData, o as hasData, p as hasMorePages, q as isUtilErrorResponse, r as isUtilSuccessResponse, s as kebabToCamel, t as packageCheck, u as slugify, v as slugifyUnique, w as truncate, x as truncateWords, y as unslugify } from '../packageCheck-B_qfsD6R.js';
4
4
  export { BatteryState, Dimensions, GeolocationState, MousePosition, NetworkState, ObjectStateUpdate, OrientationState, RenderInfo, ScriptStatus, SetValue, SnackbarSeverity, SnackbarState, ThemeMode, UseContinuousRetryOptions, UseContinuousRetryReturn, UseCopyToClipboardReturn, UseCountdownOptions, UseCountdownReturn, UseCounterOptions, UseCounterReturn, UseDocumentTitleOptions, UseFetchOptions, UseFetchReturn, UseGeolocationOptions, UseGeolocationReturn, UseHistoryStateOptions, UseHistoryStateReturn, UseHoverReturn, UseIdleOptions, UseIdleReturn, UseIntersectionObserverOptions, UseIntersectionObserverReturn, UseKeyPressOptions, UseKeyPressReturn, UseListReturn, UseLocalStorageOptions, UseLoggerOptions, UseLongPressOptions, UseLongPressReturn, UseMapReturn, UseMeasureReturn, UseMouseOptions, UseMouseReturn, UseObjectStateReturn, UsePageLeaveOptions, UsePageTitleOptions, UsePreferredLanguageReturn, UseQueueReturn, UseScriptOptions, UseScriptReturn, UseSessionStorageOptions, UseSetReturn, UseSnackbarReturn, UseTimeoutReturn, UseToggleReturn, UseVisibilityChangeReturn, UseWindowScrollReturn, WindowScrollPosition, WindowSize, useBattery, useClickAway, useContinuousRetry, useCopyToClipboard, useCountdown, useCounter, useDebounce, useDefault, useDocumentTitle, useEventListener, useFavicon, useFetch, useGeolocation, useHistoryState, useHover, useIdle, useIntersectionObserver, useInterval, useIntervalWhen, useIsClient, useIsDesktop, useIsFirstRender, useIsMobile, useIsMobileOrTablet, useIsTablet, useKeyPress, useList, useLocalStorage, useLockBodyScroll, useLogger, useLongPress, useMap, useMeasure, useMediaQuery, useMouse, useNetworkState, useObjectState, useOnClickOutside, useOrientation, usePageLeave, usePageTitle, usePreferredLanguage, usePrevious, useQueue, useRandomInterval, useRenderCount, useRenderInfo, useScript, useSessionStorage, useSet, useSnackbar, useThemeDetector, useThrottle, useTimeout, useToggle, useVisibilityChange, useWindowScroll, useWindowSize } from './hooks/index.js';
@@ -372,17 +372,97 @@ var simpleParseDualDataResponse = (response) => {
372
372
  };
373
373
 
374
374
  // src/client/http/http.ts
375
- var isDevelopment = typeof window !== "undefined" && window.location.hostname === "localhost";
376
- var API_BASE_URL = isDevelopment ? "http://localhost:4002" : "https://service-api.exyconn.com";
377
- var API_PREFIX = "/v1/api";
378
- var axiosInstance = axios__default.default.create({
379
- baseURL: API_BASE_URL,
375
+ var defaultConfig = {
376
+ baseUrl: typeof window !== "undefined" && window.location.hostname === "localhost" ? "http://localhost:4002" : "https://service-api.exyconn.com",
377
+ apiPrefix: "/v1/api",
380
378
  timeout: 3e4,
381
- // 30 seconds
379
+ defaultHeaders: {}
380
+ };
381
+ var currentConfig = { ...defaultConfig };
382
+ var axiosInstance = axios__default.default.create({
383
+ baseURL: defaultConfig.baseUrl,
384
+ timeout: defaultConfig.timeout,
382
385
  headers: {
383
386
  "Content-Type": "application/json"
384
387
  }
385
388
  });
389
+ var getApiBaseUrl = () => {
390
+ return currentConfig.baseUrl || defaultConfig.baseUrl;
391
+ };
392
+ var setApiBaseUrl = (baseUrl) => {
393
+ currentConfig.baseUrl = baseUrl;
394
+ axiosInstance.defaults.baseURL = baseUrl;
395
+ logger.info(`API Base URL updated to: ${baseUrl}`);
396
+ };
397
+ var getApiPrefix = () => {
398
+ return currentConfig.apiPrefix || defaultConfig.apiPrefix;
399
+ };
400
+ var setApiPrefix = (prefix) => {
401
+ currentConfig.apiPrefix = prefix;
402
+ logger.info(`API Prefix updated to: ${prefix}`);
403
+ };
404
+ var getCustomHeaders = () => {
405
+ return { ...currentConfig.defaultHeaders };
406
+ };
407
+ var setCustomHeader = (key, value) => {
408
+ if (!currentConfig.defaultHeaders) {
409
+ currentConfig.defaultHeaders = {};
410
+ }
411
+ currentConfig.defaultHeaders[key] = value;
412
+ axiosInstance.defaults.headers.common[key] = value;
413
+ logger.info(`Custom header added: ${key}`);
414
+ };
415
+ var removeCustomHeader = (key) => {
416
+ if (currentConfig.defaultHeaders) {
417
+ delete currentConfig.defaultHeaders[key];
418
+ }
419
+ delete axiosInstance.defaults.headers.common[key];
420
+ logger.info(`Custom header removed: ${key}`);
421
+ };
422
+ var setCustomHeaders = (headers) => {
423
+ currentConfig.defaultHeaders = { ...currentConfig.defaultHeaders, ...headers };
424
+ Object.entries(headers).forEach(([key, value]) => {
425
+ axiosInstance.defaults.headers.common[key] = value;
426
+ });
427
+ logger.info(`Multiple custom headers added: ${Object.keys(headers).join(", ")}`);
428
+ };
429
+ var clearCustomHeaders = () => {
430
+ if (currentConfig.defaultHeaders) {
431
+ Object.keys(currentConfig.defaultHeaders).forEach((key) => {
432
+ delete axiosInstance.defaults.headers.common[key];
433
+ });
434
+ }
435
+ currentConfig.defaultHeaders = {};
436
+ logger.info("All custom headers cleared");
437
+ };
438
+ var configureHttp = (config) => {
439
+ if (config.baseUrl) {
440
+ setApiBaseUrl(config.baseUrl);
441
+ }
442
+ if (config.apiPrefix) {
443
+ setApiPrefix(config.apiPrefix);
444
+ }
445
+ if (config.timeout !== void 0) {
446
+ currentConfig.timeout = config.timeout;
447
+ axiosInstance.defaults.timeout = config.timeout;
448
+ }
449
+ if (config.defaultHeaders) {
450
+ setCustomHeaders(config.defaultHeaders);
451
+ }
452
+ logger.info("HTTP client configured successfully");
453
+ };
454
+ var getHttpConfig = () => {
455
+ return { ...currentConfig };
456
+ };
457
+ var resetHttpConfig = () => {
458
+ currentConfig = { ...defaultConfig };
459
+ axiosInstance.defaults.baseURL = defaultConfig.baseUrl;
460
+ axiosInstance.defaults.timeout = defaultConfig.timeout;
461
+ clearCustomHeaders();
462
+ logger.info("HTTP configuration reset to defaults");
463
+ };
464
+ var API_BASE_URL = getApiBaseUrl();
465
+ var API_PREFIX = getApiPrefix();
386
466
  axiosInstance.interceptors.request.use(
387
467
  (config) => {
388
468
  try {
@@ -415,7 +495,10 @@ axiosInstance.interceptors.response.use(
415
495
  var buildHeaders = (customHeaders) => {
416
496
  const headers = {
417
497
  "Content-Type": "application/json",
498
+ ...currentConfig.defaultHeaders,
499
+ // Add global custom headers
418
500
  ...customHeaders
501
+ // Request-specific headers override global ones
419
502
  };
420
503
  return headers;
421
504
  };
@@ -5807,7 +5890,9 @@ exports.axios = axiosInstance;
5807
5890
  exports.camelToKebab = camelToKebab;
5808
5891
  exports.capitalize = capitalize;
5809
5892
  exports.capitalizeWords = capitalizeWords;
5893
+ exports.clearCustomHeaders = clearCustomHeaders;
5810
5894
  exports.clientLogger = clientLogger;
5895
+ exports.configureHttp = configureHttp;
5811
5896
  exports.contactFormSchema = contactFormSchema;
5812
5897
  exports.copyToClipboard = copyToClipboard;
5813
5898
  exports.createClientLogger = createClientLogger;
@@ -5842,8 +5927,12 @@ exports.generateCssVars = generateCssVars;
5842
5927
  exports.generateSlug = generateSlug;
5843
5928
  exports.generateSnakeSlug = generateSnakeSlug;
5844
5929
  exports.generateUrlSlug = generateUrlSlug;
5930
+ exports.getApiBaseUrl = getApiBaseUrl;
5931
+ exports.getApiPrefix = getApiPrefix;
5845
5932
  exports.getContrastColor = getContrastColor;
5933
+ exports.getCustomHeaders = getCustomHeaders;
5846
5934
  exports.getErrorMessage = getErrorMessage;
5935
+ exports.getHttpConfig = getHttpConfig;
5847
5936
  exports.getNextPage = getNextPage;
5848
5937
  exports.getPrevPage = getPrevPage;
5849
5938
  exports.getRequest = getRequest;
@@ -5878,9 +5967,15 @@ exports.postRequest = postRequest;
5878
5967
  exports.putRequest = putRequest;
5879
5968
  exports.registerFormSchema = registerFormSchema;
5880
5969
  exports.removeCssVars = removeCssVars;
5970
+ exports.removeCustomHeader = removeCustomHeader;
5971
+ exports.resetHttpConfig = resetHttpConfig;
5881
5972
  exports.resolveThemeMode = resolveThemeMode;
5882
5973
  exports.safeJsonParse = safeJsonParse;
5883
5974
  exports.saveThemeMode = saveThemeMode;
5975
+ exports.setApiBaseUrl = setApiBaseUrl;
5976
+ exports.setApiPrefix = setApiPrefix;
5977
+ exports.setCustomHeader = setCustomHeader;
5978
+ exports.setCustomHeaders = setCustomHeaders;
5884
5979
  exports.simpleMetaParseResponse = simpleMetaParseResponse;
5885
5980
  exports.simpleParseDualDataResponse = simpleParseDualDataResponse;
5886
5981
  exports.simpleParseResponse = simpleParseResponse;