@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.
- package/dist/client/http/index.d.mts +66 -3
- package/dist/client/http/index.d.ts +66 -3
- package/dist/client/http/index.js +101 -6
- package/dist/client/http/index.js.map +1 -1
- package/dist/client/http/index.mjs +90 -7
- package/dist/client/http/index.mjs.map +1 -1
- package/dist/client/index.d.mts +1 -1
- package/dist/client/index.d.ts +1 -1
- package/dist/client/index.js +101 -6
- package/dist/client/index.js.map +1 -1
- package/dist/client/index.mjs +90 -7
- package/dist/client/index.mjs.map +1 -1
- package/dist/{index-CF0D8PGE.d.ts → index-CdbQ8YPt.d.ts} +14 -2
- package/dist/{index-BZf42T3R.d.mts → index-guYdqefq.d.mts} +14 -2
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +101 -6
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +101 -6
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -145,9 +145,72 @@ declare const simpleParseDualDataResponse: (response: SimpleApiResponse) => {
|
|
|
145
145
|
meta?: Record<string, unknown>;
|
|
146
146
|
} | undefined;
|
|
147
147
|
|
|
148
|
-
|
|
149
|
-
|
|
148
|
+
/**
|
|
149
|
+
* HTTP Configuration Interface
|
|
150
|
+
*/
|
|
151
|
+
interface HttpConfig {
|
|
152
|
+
baseUrl?: string;
|
|
153
|
+
apiPrefix?: string;
|
|
154
|
+
timeout?: number;
|
|
155
|
+
defaultHeaders?: Record<string, string>;
|
|
156
|
+
}
|
|
150
157
|
declare const axiosInstance: axios.AxiosInstance;
|
|
158
|
+
/**
|
|
159
|
+
* Get current API Base URL
|
|
160
|
+
*/
|
|
161
|
+
declare const getApiBaseUrl: () => string;
|
|
162
|
+
/**
|
|
163
|
+
* Set API Base URL
|
|
164
|
+
*/
|
|
165
|
+
declare const setApiBaseUrl: (baseUrl: string) => void;
|
|
166
|
+
/**
|
|
167
|
+
* Get current API Prefix
|
|
168
|
+
*/
|
|
169
|
+
declare const getApiPrefix: () => string;
|
|
170
|
+
/**
|
|
171
|
+
* Set API Prefix
|
|
172
|
+
*/
|
|
173
|
+
declare const setApiPrefix: (prefix: string) => void;
|
|
174
|
+
/**
|
|
175
|
+
* Get all custom headers
|
|
176
|
+
*/
|
|
177
|
+
declare const getCustomHeaders: () => Record<string, string>;
|
|
178
|
+
/**
|
|
179
|
+
* Set a custom header globally
|
|
180
|
+
*/
|
|
181
|
+
declare const setCustomHeader: (key: string, value: string) => void;
|
|
182
|
+
/**
|
|
183
|
+
* Remove a custom header
|
|
184
|
+
*/
|
|
185
|
+
declare const removeCustomHeader: (key: string) => void;
|
|
186
|
+
/**
|
|
187
|
+
* Set multiple custom headers at once
|
|
188
|
+
*/
|
|
189
|
+
declare const setCustomHeaders: (headers: Record<string, string>) => void;
|
|
190
|
+
/**
|
|
191
|
+
* Clear all custom headers
|
|
192
|
+
*/
|
|
193
|
+
declare const clearCustomHeaders: () => void;
|
|
194
|
+
/**
|
|
195
|
+
* Configure HTTP client with custom settings
|
|
196
|
+
*/
|
|
197
|
+
declare const configureHttp: (config: HttpConfig) => void;
|
|
198
|
+
/**
|
|
199
|
+
* Get current HTTP configuration
|
|
200
|
+
*/
|
|
201
|
+
declare const getHttpConfig: () => Readonly<HttpConfig>;
|
|
202
|
+
/**
|
|
203
|
+
* Reset HTTP configuration to defaults
|
|
204
|
+
*/
|
|
205
|
+
declare const resetHttpConfig: () => void;
|
|
206
|
+
/**
|
|
207
|
+
* @deprecated Use getApiBaseUrl() instead
|
|
208
|
+
*/
|
|
209
|
+
declare const API_BASE_URL: string;
|
|
210
|
+
/**
|
|
211
|
+
* @deprecated Use getApiPrefix() instead
|
|
212
|
+
*/
|
|
213
|
+
declare const API_PREFIX: string;
|
|
151
214
|
/**
|
|
152
215
|
* GET request
|
|
153
216
|
*/
|
|
@@ -250,4 +313,4 @@ declare class Logger {
|
|
|
250
313
|
}
|
|
251
314
|
declare const logger: Logger;
|
|
252
315
|
|
|
253
|
-
export { API_BASE_URL, API_PREFIX, type ApiResponse, type ColumnMetadata, ERROR_CODES, type PaginatedResponse, type PaginationData, type ParsedError, 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 };
|
|
316
|
+
export { API_BASE_URL, API_PREFIX, type ApiResponse, type ColumnMetadata, ERROR_CODES, type PaginatedResponse, type PaginationData, type ParsedError, 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 };
|
|
@@ -145,9 +145,72 @@ declare const simpleParseDualDataResponse: (response: SimpleApiResponse) => {
|
|
|
145
145
|
meta?: Record<string, unknown>;
|
|
146
146
|
} | undefined;
|
|
147
147
|
|
|
148
|
-
|
|
149
|
-
|
|
148
|
+
/**
|
|
149
|
+
* HTTP Configuration Interface
|
|
150
|
+
*/
|
|
151
|
+
interface HttpConfig {
|
|
152
|
+
baseUrl?: string;
|
|
153
|
+
apiPrefix?: string;
|
|
154
|
+
timeout?: number;
|
|
155
|
+
defaultHeaders?: Record<string, string>;
|
|
156
|
+
}
|
|
150
157
|
declare const axiosInstance: axios.AxiosInstance;
|
|
158
|
+
/**
|
|
159
|
+
* Get current API Base URL
|
|
160
|
+
*/
|
|
161
|
+
declare const getApiBaseUrl: () => string;
|
|
162
|
+
/**
|
|
163
|
+
* Set API Base URL
|
|
164
|
+
*/
|
|
165
|
+
declare const setApiBaseUrl: (baseUrl: string) => void;
|
|
166
|
+
/**
|
|
167
|
+
* Get current API Prefix
|
|
168
|
+
*/
|
|
169
|
+
declare const getApiPrefix: () => string;
|
|
170
|
+
/**
|
|
171
|
+
* Set API Prefix
|
|
172
|
+
*/
|
|
173
|
+
declare const setApiPrefix: (prefix: string) => void;
|
|
174
|
+
/**
|
|
175
|
+
* Get all custom headers
|
|
176
|
+
*/
|
|
177
|
+
declare const getCustomHeaders: () => Record<string, string>;
|
|
178
|
+
/**
|
|
179
|
+
* Set a custom header globally
|
|
180
|
+
*/
|
|
181
|
+
declare const setCustomHeader: (key: string, value: string) => void;
|
|
182
|
+
/**
|
|
183
|
+
* Remove a custom header
|
|
184
|
+
*/
|
|
185
|
+
declare const removeCustomHeader: (key: string) => void;
|
|
186
|
+
/**
|
|
187
|
+
* Set multiple custom headers at once
|
|
188
|
+
*/
|
|
189
|
+
declare const setCustomHeaders: (headers: Record<string, string>) => void;
|
|
190
|
+
/**
|
|
191
|
+
* Clear all custom headers
|
|
192
|
+
*/
|
|
193
|
+
declare const clearCustomHeaders: () => void;
|
|
194
|
+
/**
|
|
195
|
+
* Configure HTTP client with custom settings
|
|
196
|
+
*/
|
|
197
|
+
declare const configureHttp: (config: HttpConfig) => void;
|
|
198
|
+
/**
|
|
199
|
+
* Get current HTTP configuration
|
|
200
|
+
*/
|
|
201
|
+
declare const getHttpConfig: () => Readonly<HttpConfig>;
|
|
202
|
+
/**
|
|
203
|
+
* Reset HTTP configuration to defaults
|
|
204
|
+
*/
|
|
205
|
+
declare const resetHttpConfig: () => void;
|
|
206
|
+
/**
|
|
207
|
+
* @deprecated Use getApiBaseUrl() instead
|
|
208
|
+
*/
|
|
209
|
+
declare const API_BASE_URL: string;
|
|
210
|
+
/**
|
|
211
|
+
* @deprecated Use getApiPrefix() instead
|
|
212
|
+
*/
|
|
213
|
+
declare const API_PREFIX: string;
|
|
151
214
|
/**
|
|
152
215
|
* GET request
|
|
153
216
|
*/
|
|
@@ -250,4 +313,4 @@ declare class Logger {
|
|
|
250
313
|
}
|
|
251
314
|
declare const logger: Logger;
|
|
252
315
|
|
|
253
|
-
export { API_BASE_URL, API_PREFIX, type ApiResponse, type ColumnMetadata, ERROR_CODES, type PaginatedResponse, type PaginationData, type ParsedError, 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 };
|
|
316
|
+
export { API_BASE_URL, API_PREFIX, type ApiResponse, type ColumnMetadata, ERROR_CODES, type PaginatedResponse, type PaginationData, type ParsedError, 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 };
|
|
@@ -349,17 +349,97 @@ var simpleParseDualDataResponse = (response) => {
|
|
|
349
349
|
};
|
|
350
350
|
|
|
351
351
|
// src/client/http/http.ts
|
|
352
|
-
var
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
var axiosInstance = axios__default.default.create({
|
|
356
|
-
baseURL: API_BASE_URL,
|
|
352
|
+
var defaultConfig = {
|
|
353
|
+
baseUrl: typeof window !== "undefined" && window.location.hostname === "localhost" ? "http://localhost:4002" : "https://service-api.exyconn.com",
|
|
354
|
+
apiPrefix: "/v1/api",
|
|
357
355
|
timeout: 3e4,
|
|
358
|
-
|
|
356
|
+
defaultHeaders: {}
|
|
357
|
+
};
|
|
358
|
+
var currentConfig = { ...defaultConfig };
|
|
359
|
+
var axiosInstance = axios__default.default.create({
|
|
360
|
+
baseURL: defaultConfig.baseUrl,
|
|
361
|
+
timeout: defaultConfig.timeout,
|
|
359
362
|
headers: {
|
|
360
363
|
"Content-Type": "application/json"
|
|
361
364
|
}
|
|
362
365
|
});
|
|
366
|
+
var getApiBaseUrl = () => {
|
|
367
|
+
return currentConfig.baseUrl || defaultConfig.baseUrl;
|
|
368
|
+
};
|
|
369
|
+
var setApiBaseUrl = (baseUrl) => {
|
|
370
|
+
currentConfig.baseUrl = baseUrl;
|
|
371
|
+
axiosInstance.defaults.baseURL = baseUrl;
|
|
372
|
+
logger.info(`API Base URL updated to: ${baseUrl}`);
|
|
373
|
+
};
|
|
374
|
+
var getApiPrefix = () => {
|
|
375
|
+
return currentConfig.apiPrefix || defaultConfig.apiPrefix;
|
|
376
|
+
};
|
|
377
|
+
var setApiPrefix = (prefix) => {
|
|
378
|
+
currentConfig.apiPrefix = prefix;
|
|
379
|
+
logger.info(`API Prefix updated to: ${prefix}`);
|
|
380
|
+
};
|
|
381
|
+
var getCustomHeaders = () => {
|
|
382
|
+
return { ...currentConfig.defaultHeaders };
|
|
383
|
+
};
|
|
384
|
+
var setCustomHeader = (key, value) => {
|
|
385
|
+
if (!currentConfig.defaultHeaders) {
|
|
386
|
+
currentConfig.defaultHeaders = {};
|
|
387
|
+
}
|
|
388
|
+
currentConfig.defaultHeaders[key] = value;
|
|
389
|
+
axiosInstance.defaults.headers.common[key] = value;
|
|
390
|
+
logger.info(`Custom header added: ${key}`);
|
|
391
|
+
};
|
|
392
|
+
var removeCustomHeader = (key) => {
|
|
393
|
+
if (currentConfig.defaultHeaders) {
|
|
394
|
+
delete currentConfig.defaultHeaders[key];
|
|
395
|
+
}
|
|
396
|
+
delete axiosInstance.defaults.headers.common[key];
|
|
397
|
+
logger.info(`Custom header removed: ${key}`);
|
|
398
|
+
};
|
|
399
|
+
var setCustomHeaders = (headers) => {
|
|
400
|
+
currentConfig.defaultHeaders = { ...currentConfig.defaultHeaders, ...headers };
|
|
401
|
+
Object.entries(headers).forEach(([key, value]) => {
|
|
402
|
+
axiosInstance.defaults.headers.common[key] = value;
|
|
403
|
+
});
|
|
404
|
+
logger.info(`Multiple custom headers added: ${Object.keys(headers).join(", ")}`);
|
|
405
|
+
};
|
|
406
|
+
var clearCustomHeaders = () => {
|
|
407
|
+
if (currentConfig.defaultHeaders) {
|
|
408
|
+
Object.keys(currentConfig.defaultHeaders).forEach((key) => {
|
|
409
|
+
delete axiosInstance.defaults.headers.common[key];
|
|
410
|
+
});
|
|
411
|
+
}
|
|
412
|
+
currentConfig.defaultHeaders = {};
|
|
413
|
+
logger.info("All custom headers cleared");
|
|
414
|
+
};
|
|
415
|
+
var configureHttp = (config) => {
|
|
416
|
+
if (config.baseUrl) {
|
|
417
|
+
setApiBaseUrl(config.baseUrl);
|
|
418
|
+
}
|
|
419
|
+
if (config.apiPrefix) {
|
|
420
|
+
setApiPrefix(config.apiPrefix);
|
|
421
|
+
}
|
|
422
|
+
if (config.timeout !== void 0) {
|
|
423
|
+
currentConfig.timeout = config.timeout;
|
|
424
|
+
axiosInstance.defaults.timeout = config.timeout;
|
|
425
|
+
}
|
|
426
|
+
if (config.defaultHeaders) {
|
|
427
|
+
setCustomHeaders(config.defaultHeaders);
|
|
428
|
+
}
|
|
429
|
+
logger.info("HTTP client configured successfully");
|
|
430
|
+
};
|
|
431
|
+
var getHttpConfig = () => {
|
|
432
|
+
return { ...currentConfig };
|
|
433
|
+
};
|
|
434
|
+
var resetHttpConfig = () => {
|
|
435
|
+
currentConfig = { ...defaultConfig };
|
|
436
|
+
axiosInstance.defaults.baseURL = defaultConfig.baseUrl;
|
|
437
|
+
axiosInstance.defaults.timeout = defaultConfig.timeout;
|
|
438
|
+
clearCustomHeaders();
|
|
439
|
+
logger.info("HTTP configuration reset to defaults");
|
|
440
|
+
};
|
|
441
|
+
var API_BASE_URL = getApiBaseUrl();
|
|
442
|
+
var API_PREFIX = getApiPrefix();
|
|
363
443
|
axiosInstance.interceptors.request.use(
|
|
364
444
|
(config) => {
|
|
365
445
|
try {
|
|
@@ -392,7 +472,10 @@ axiosInstance.interceptors.response.use(
|
|
|
392
472
|
var buildHeaders = (customHeaders) => {
|
|
393
473
|
const headers = {
|
|
394
474
|
"Content-Type": "application/json",
|
|
475
|
+
...currentConfig.defaultHeaders,
|
|
476
|
+
// Add global custom headers
|
|
395
477
|
...customHeaders
|
|
478
|
+
// Request-specific headers override global ones
|
|
396
479
|
};
|
|
397
480
|
return headers;
|
|
398
481
|
};
|
|
@@ -474,6 +557,8 @@ exports.STATUS_CODES = STATUS_CODES;
|
|
|
474
557
|
exports.STATUS_MESSAGES = STATUS_MESSAGES;
|
|
475
558
|
exports.SUCCESS_CODES = SUCCESS_CODES;
|
|
476
559
|
exports.axios = axiosInstance;
|
|
560
|
+
exports.clearCustomHeaders = clearCustomHeaders;
|
|
561
|
+
exports.configureHttp = configureHttp;
|
|
477
562
|
exports.deleteRequest = deleteRequest;
|
|
478
563
|
exports.extractData = extractData;
|
|
479
564
|
exports.extractMessage = extractMessage;
|
|
@@ -482,6 +567,10 @@ exports.extractPaginatedData = extractPaginatedData;
|
|
|
482
567
|
exports.generateSlug = generateSlug;
|
|
483
568
|
exports.generateSnakeSlug = generateSnakeSlug;
|
|
484
569
|
exports.generateUrlSlug = generateUrlSlug;
|
|
570
|
+
exports.getApiBaseUrl = getApiBaseUrl;
|
|
571
|
+
exports.getApiPrefix = getApiPrefix;
|
|
572
|
+
exports.getCustomHeaders = getCustomHeaders;
|
|
573
|
+
exports.getHttpConfig = getHttpConfig;
|
|
485
574
|
exports.getRequest = getRequest;
|
|
486
575
|
exports.isErrorResponse = isErrorResponse;
|
|
487
576
|
exports.isSuccess = isSuccess;
|
|
@@ -497,7 +586,13 @@ exports.parseResponseStatusMessage = parseResponseStatusMessage;
|
|
|
497
586
|
exports.patchRequest = patchRequest;
|
|
498
587
|
exports.postRequest = postRequest;
|
|
499
588
|
exports.putRequest = putRequest;
|
|
589
|
+
exports.removeCustomHeader = removeCustomHeader;
|
|
590
|
+
exports.resetHttpConfig = resetHttpConfig;
|
|
500
591
|
exports.safeJsonParse = safeJsonParse;
|
|
592
|
+
exports.setApiBaseUrl = setApiBaseUrl;
|
|
593
|
+
exports.setApiPrefix = setApiPrefix;
|
|
594
|
+
exports.setCustomHeader = setCustomHeader;
|
|
595
|
+
exports.setCustomHeaders = setCustomHeaders;
|
|
501
596
|
exports.simpleMetaParseResponse = simpleMetaParseResponse;
|
|
502
597
|
exports.simpleParseDualDataResponse = simpleParseDualDataResponse;
|
|
503
598
|
exports.simpleParseResponse = simpleParseResponse;
|
|
@@ -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","axios"],"mappings":"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","file":"index.js","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","axios"],"mappings":"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","file":"index.js","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"]}
|