@exyconn/common 2.3.2 → 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.
Files changed (40) hide show
  1. package/README.md +117 -12
  2. package/dist/client/http/index.d.mts +280 -49
  3. package/dist/client/http/index.d.ts +280 -49
  4. package/dist/client/http/index.js +564 -90
  5. package/dist/client/http/index.js.map +1 -1
  6. package/dist/client/http/index.mjs +520 -80
  7. package/dist/client/http/index.mjs.map +1 -1
  8. package/dist/client/index.d.mts +3 -3
  9. package/dist/client/index.d.ts +3 -3
  10. package/dist/client/index.js +573 -316
  11. package/dist/client/index.js.map +1 -1
  12. package/dist/client/index.mjs +529 -287
  13. package/dist/client/index.mjs.map +1 -1
  14. package/dist/client/utils/index.d.mts +3 -279
  15. package/dist/client/utils/index.d.ts +3 -279
  16. package/dist/{index-D9a9oxQy.d.ts → index-CdbQ8YPt.d.ts} +51 -39
  17. package/dist/{index-D3yCCjBZ.d.mts → index-Ckhm_HaX.d.mts} +21 -2
  18. package/dist/{index-01hoqibP.d.ts → index-br6POSyA.d.ts} +21 -2
  19. package/dist/{index-DuxL84IW.d.mts → index-guYdqefq.d.mts} +51 -39
  20. package/dist/index.d.mts +3 -3
  21. package/dist/index.d.ts +3 -3
  22. package/dist/index.js +1214 -326
  23. package/dist/index.js.map +1 -1
  24. package/dist/index.mjs +1226 -338
  25. package/dist/index.mjs.map +1 -1
  26. package/dist/packageCheck-B_qfsD6R.d.ts +280 -0
  27. package/dist/packageCheck-C2_FT_Rl.d.mts +280 -0
  28. package/dist/server/index.d.mts +1 -1
  29. package/dist/server/index.d.ts +1 -1
  30. package/dist/server/index.js +631 -0
  31. package/dist/server/index.js.map +1 -1
  32. package/dist/server/index.mjs +625 -2
  33. package/dist/server/index.mjs.map +1 -1
  34. package/dist/server/middleware/index.d.mts +283 -2
  35. package/dist/server/middleware/index.d.ts +283 -2
  36. package/dist/server/middleware/index.js +761 -0
  37. package/dist/server/middleware/index.js.map +1 -1
  38. package/dist/server/middleware/index.mjs +751 -1
  39. package/dist/server/middleware/index.mjs.map +1 -1
  40. package/package.json +1 -1
@@ -4,108 +4,548 @@ import { jsx, jsxs } from 'react/jsx-runtime';
4
4
  import * as Yup from 'yup';
5
5
  import { Formik, Form, Field, ErrorMessage } from 'formik';
6
6
 
7
- // src/client/http/axios-instance.ts
8
- var createHttpClient = (options) => {
9
- const {
10
- baseURL,
11
- timeout = 3e4,
12
- withCredentials = true,
13
- getAuthToken,
14
- onUnauthorized,
15
- onServerError
16
- } = options;
17
- const instance = axios.create({
18
- baseURL,
19
- timeout,
20
- withCredentials,
21
- headers: {
22
- "Content-Type": "application/json"
7
+ // src/client/http/http.ts
8
+
9
+ // src/client/http/logger.ts
10
+ var Logger = class {
11
+ constructor() {
12
+ this.isDevelopment = typeof window !== "undefined" && window.location.hostname === "localhost";
13
+ }
14
+ /**
15
+ * Log informational messages
16
+ */
17
+ info(message, data, options) {
18
+ if (this.isDevelopment) {
19
+ const prefix = options?.context ? `[${options.context}]` : "";
20
+ console.log(`${prefix} ${message}`, data ?? "");
23
21
  }
24
- });
25
- instance.interceptors.request.use(
26
- (config) => {
27
- if (getAuthToken) {
28
- const token = getAuthToken();
29
- if (token && config.headers) {
30
- config.headers.Authorization = `Bearer ${token}`;
31
- }
22
+ }
23
+ /**
24
+ * Log warning messages
25
+ */
26
+ warn(message, data, options) {
27
+ if (this.isDevelopment) {
28
+ const prefix = options?.context ? `[${options.context}]` : "";
29
+ console.warn(`${prefix} ${message}`, data ?? "");
30
+ }
31
+ }
32
+ /**
33
+ * Log error messages
34
+ */
35
+ error(message, error, options) {
36
+ const prefix = options?.context ? `[${options.context}]` : "";
37
+ if (this.isDevelopment) {
38
+ console.error(`${prefix} ${message}`, error, options?.metadata || "");
39
+ }
40
+ }
41
+ /**
42
+ * Log debug messages (only in development)
43
+ */
44
+ debug(message, data, options) {
45
+ if (this.isDevelopment) {
46
+ const prefix = options?.context ? `[${options.context}]` : "";
47
+ console.debug(`${prefix} ${message}`, data || "");
48
+ }
49
+ }
50
+ /**
51
+ * Log API errors with structured information
52
+ */
53
+ apiError(endpoint, error, metadata) {
54
+ this.error(`API Error: ${endpoint}`, error, {
55
+ context: "API",
56
+ metadata: {
57
+ endpoint,
58
+ ...metadata
32
59
  }
33
- return config;
34
- },
35
- (error) => Promise.reject(error)
36
- );
37
- instance.interceptors.response.use(
38
- (response) => response,
39
- (error) => {
40
- if (error.response) {
41
- const status = error.response.status;
42
- if (status === 401 && onUnauthorized) {
43
- onUnauthorized();
60
+ });
61
+ }
62
+ };
63
+ var logger = new Logger();
64
+
65
+ // src/client/http/response-parser.ts
66
+ var STATUS_CODES = {
67
+ SUCCESS: 200,
68
+ CREATED: 201,
69
+ NO_CONTENT: 204,
70
+ BAD_REQUEST: 400,
71
+ UNAUTHORIZED: 401,
72
+ FORBIDDEN: 403,
73
+ NOT_FOUND: 404,
74
+ CONFLICT: 409,
75
+ ERROR: 500
76
+ };
77
+ var STATUS_MESSAGES = {
78
+ SUCCESS: "success",
79
+ CREATED: "created",
80
+ NO_CONTENT: "no_content",
81
+ BAD_REQUEST: "bad_request",
82
+ UNAUTHORIZED: "unauthorized",
83
+ FORBIDDEN: "forbidden",
84
+ NOT_FOUND: "not_found",
85
+ CONFLICT: "conflict",
86
+ ERROR: "error"
87
+ };
88
+ var SUCCESS_CODES = [200, 201, 204];
89
+ var ERROR_CODES = [400, 401, 403, 404, 409, 500];
90
+ var parseResponseData = (response, fallback = null) => {
91
+ try {
92
+ if (!response || typeof response !== "object") {
93
+ return fallback;
94
+ }
95
+ const resp = response;
96
+ if ("data" in resp) {
97
+ return resp["data"] ?? fallback;
98
+ }
99
+ return response;
100
+ } catch (error) {
101
+ logger.error("Error parsing response data", error);
102
+ return fallback;
103
+ }
104
+ };
105
+ var parseResponseMessage = (response, fallback = "") => {
106
+ try {
107
+ if (!response || typeof response !== "object") {
108
+ return fallback;
109
+ }
110
+ const resp = response;
111
+ if ("message" in resp && typeof resp["message"] === "string") {
112
+ return resp["message"];
113
+ }
114
+ return fallback;
115
+ } catch (error) {
116
+ logger.error("Error parsing response message", error);
117
+ return fallback;
118
+ }
119
+ };
120
+ var parseResponseStatus = (response) => {
121
+ try {
122
+ if (!response || typeof response !== "object") {
123
+ return null;
124
+ }
125
+ const resp = response;
126
+ if ("statusCode" in resp && typeof resp["statusCode"] === "number") {
127
+ return resp["statusCode"];
128
+ }
129
+ if ("status" in resp && typeof resp["status"] === "number") {
130
+ return resp["status"];
131
+ }
132
+ return null;
133
+ } catch (error) {
134
+ logger.error("Error parsing response status", error);
135
+ return null;
136
+ }
137
+ };
138
+ var parseResponseStatusMessage = (response, fallback = "") => {
139
+ try {
140
+ if (!response || typeof response !== "object") {
141
+ return fallback;
142
+ }
143
+ const resp = response;
144
+ if ("status" in resp && typeof resp["status"] === "string") {
145
+ return resp["status"];
146
+ }
147
+ return fallback;
148
+ } catch (error) {
149
+ logger.error("Error parsing response status message", error);
150
+ return fallback;
151
+ }
152
+ };
153
+ var isSuccessResponse = (response) => {
154
+ try {
155
+ const statusCode = parseResponseStatus(response);
156
+ if (statusCode !== null) {
157
+ return SUCCESS_CODES.includes(statusCode);
158
+ }
159
+ const status = parseResponseStatusMessage(response);
160
+ return [STATUS_MESSAGES.SUCCESS, STATUS_MESSAGES.CREATED, STATUS_MESSAGES.NO_CONTENT].includes(
161
+ status
162
+ );
163
+ } catch (error) {
164
+ logger.error("Error checking response success", error);
165
+ return false;
166
+ }
167
+ };
168
+ var isErrorResponse = (response) => {
169
+ try {
170
+ const statusCode = parseResponseStatus(response);
171
+ if (statusCode !== null) {
172
+ return ERROR_CODES.includes(statusCode);
173
+ }
174
+ return false;
175
+ } catch (error) {
176
+ logger.error("Error checking response error", error);
177
+ return false;
178
+ }
179
+ };
180
+ var parsePaginatedResponse = (response) => {
181
+ try {
182
+ if (!response || typeof response !== "object") {
183
+ return { items: [], total: 0, page: 1, limit: 10 };
184
+ }
185
+ const resp = response;
186
+ let items = [];
187
+ if ("data" in resp && Array.isArray(resp["data"])) {
188
+ items = resp["data"];
189
+ }
190
+ let total = items.length;
191
+ let page = 1;
192
+ let limit = 10;
193
+ let totalPages;
194
+ if ("paginationData" in resp && resp["paginationData"] && typeof resp["paginationData"] === "object") {
195
+ const paginationData = resp["paginationData"];
196
+ if ("total" in paginationData && typeof paginationData["total"] === "number") {
197
+ total = paginationData["total"];
198
+ }
199
+ if ("page" in paginationData && typeof paginationData["page"] === "number") {
200
+ page = paginationData["page"];
201
+ }
202
+ if ("limit" in paginationData && typeof paginationData["limit"] === "number") {
203
+ limit = paginationData["limit"];
204
+ }
205
+ if ("totalPages" in paginationData && typeof paginationData["totalPages"] === "number") {
206
+ totalPages = paginationData["totalPages"];
207
+ }
208
+ }
209
+ let columns;
210
+ if ("columns" in resp && Array.isArray(resp["columns"])) {
211
+ columns = resp["columns"];
212
+ }
213
+ return {
214
+ items,
215
+ total,
216
+ page,
217
+ limit,
218
+ ...totalPages !== void 0 && { totalPages },
219
+ ...columns !== void 0 && { columns }
220
+ };
221
+ } catch (error) {
222
+ logger.error("Error parsing paginated response", error);
223
+ return { items: [], total: 0, page: 1, limit: 10 };
224
+ }
225
+ };
226
+ var extractNestedData = (response, path, fallback = null) => {
227
+ try {
228
+ const keys = path.split(".");
229
+ let current = response;
230
+ for (const key of keys) {
231
+ if (current && typeof current === "object" && key in current) {
232
+ current = current[key];
233
+ } else {
234
+ return fallback;
235
+ }
236
+ }
237
+ return current;
238
+ } catch (error) {
239
+ logger.error("Error extracting nested data", error);
240
+ return fallback;
241
+ }
242
+ };
243
+ var safeJsonParse = (json, fallback = null) => {
244
+ try {
245
+ return JSON.parse(json);
246
+ } catch (error) {
247
+ logger.error("Error parsing JSON", error);
248
+ return fallback;
249
+ }
250
+ };
251
+ var parseAxiosErrorMessage = (error) => {
252
+ try {
253
+ if (!error || typeof error !== "object") {
254
+ return "An unexpected error occurred";
255
+ }
256
+ const err = error;
257
+ if ("response" in err && err["response"] && typeof err["response"] === "object") {
258
+ const response = err["response"];
259
+ if ("data" in response && response["data"] && typeof response["data"] === "object") {
260
+ const data = response["data"];
261
+ if ("data" in data && data["data"] && typeof data["data"] === "object") {
262
+ const nestedData = data["data"];
263
+ if ("message" in nestedData && typeof nestedData["message"] === "string") {
264
+ return nestedData["message"];
265
+ }
44
266
  }
45
- if (status >= 500 && onServerError) {
46
- onServerError(error);
267
+ if ("message" in data && typeof data["message"] === "string") {
268
+ return data["message"];
269
+ }
270
+ if ("error" in data && typeof data["error"] === "string") {
271
+ return data["error"];
47
272
  }
48
273
  }
49
- return Promise.reject(error);
50
274
  }
51
- );
52
- return instance;
275
+ if ("message" in err && typeof err["message"] === "string") {
276
+ return err["message"];
277
+ }
278
+ if (typeof error === "string") {
279
+ return error;
280
+ }
281
+ return "An unexpected error occurred";
282
+ } catch (parseError2) {
283
+ logger.error("Error parsing axios error message", parseError2);
284
+ return "An unexpected error occurred";
285
+ }
286
+ };
287
+ var parseError = (error) => {
288
+ try {
289
+ if (!error || typeof error !== "object") {
290
+ return {
291
+ message: "An unexpected error occurred",
292
+ statusCode: null,
293
+ data: null
294
+ };
295
+ }
296
+ const err = error;
297
+ let statusCode = null;
298
+ let data = null;
299
+ let status;
300
+ if ("response" in err && err["response"] && typeof err["response"] === "object") {
301
+ const response = err["response"];
302
+ if ("status" in response && typeof response["status"] === "number") {
303
+ statusCode = response["status"];
304
+ }
305
+ if ("data" in response && response["data"] !== void 0) {
306
+ data = response["data"];
307
+ if (data && typeof data === "object" && "status" in data) {
308
+ const dataObj = data;
309
+ if (typeof dataObj["status"] === "string") {
310
+ status = dataObj["status"];
311
+ }
312
+ }
313
+ }
314
+ }
315
+ if (statusCode === null && "statusCode" in err && typeof err["statusCode"] === "number") {
316
+ statusCode = err["statusCode"];
317
+ }
318
+ if (data === null && "data" in err && err["data"] !== void 0) {
319
+ data = err["data"];
320
+ }
321
+ if (!status && "status" in err && typeof err["status"] === "string") {
322
+ status = err["status"];
323
+ }
324
+ return {
325
+ message: parseAxiosErrorMessage(error),
326
+ statusCode,
327
+ data,
328
+ ...status !== void 0 && { status }
329
+ };
330
+ } catch (err) {
331
+ logger.error("Error parsing error object", err);
332
+ return {
333
+ message: "An unexpected error occurred",
334
+ statusCode: null,
335
+ data: null
336
+ };
337
+ }
338
+ };
339
+ var simpleParseResponse = (response) => {
340
+ return response?.data?.data?.data;
341
+ };
342
+ var simpleMetaParseResponse = (response) => {
343
+ return response?.data?.data?.meta;
53
344
  };
54
- var withFormData = () => ({
345
+ var simpleParseDualDataResponse = (response) => {
346
+ return response?.data?.data;
347
+ };
348
+
349
+ // src/client/http/http.ts
350
+ var defaultConfig = {
351
+ baseUrl: typeof window !== "undefined" && window.location.hostname === "localhost" ? "http://localhost:4002" : "https://service-api.exyconn.com",
352
+ apiPrefix: "/v1/api",
353
+ timeout: 3e4,
354
+ defaultHeaders: {}
355
+ };
356
+ var currentConfig = { ...defaultConfig };
357
+ var axiosInstance = axios.create({
358
+ baseURL: defaultConfig.baseUrl,
359
+ timeout: defaultConfig.timeout,
55
360
  headers: {
56
- "Content-Type": "multipart/form-data"
361
+ "Content-Type": "application/json"
57
362
  }
58
363
  });
59
- var withTimeout = (ms) => ({
60
- timeout: ms
61
- });
62
- var withAbortSignal = (signal) => ({
63
- signal
64
- });
65
-
66
- // src/client/http/response-parser.ts
67
- var parseResponse = (response) => {
68
- if (response.data?.success && response.data?.data !== void 0) {
69
- return response.data.data;
364
+ var getApiBaseUrl = () => {
365
+ return currentConfig.baseUrl || defaultConfig.baseUrl;
366
+ };
367
+ var setApiBaseUrl = (baseUrl) => {
368
+ currentConfig.baseUrl = baseUrl;
369
+ axiosInstance.defaults.baseURL = baseUrl;
370
+ logger.info(`API Base URL updated to: ${baseUrl}`);
371
+ };
372
+ var getApiPrefix = () => {
373
+ return currentConfig.apiPrefix || defaultConfig.apiPrefix;
374
+ };
375
+ var setApiPrefix = (prefix) => {
376
+ currentConfig.apiPrefix = prefix;
377
+ logger.info(`API Prefix updated to: ${prefix}`);
378
+ };
379
+ var getCustomHeaders = () => {
380
+ return { ...currentConfig.defaultHeaders };
381
+ };
382
+ var setCustomHeader = (key, value) => {
383
+ if (!currentConfig.defaultHeaders) {
384
+ currentConfig.defaultHeaders = {};
70
385
  }
71
- return null;
386
+ currentConfig.defaultHeaders[key] = value;
387
+ axiosInstance.defaults.headers.common[key] = value;
388
+ logger.info(`Custom header added: ${key}`);
72
389
  };
73
- var parseFullResponse = (response) => {
74
- return response.data;
390
+ var removeCustomHeader = (key) => {
391
+ if (currentConfig.defaultHeaders) {
392
+ delete currentConfig.defaultHeaders[key];
393
+ }
394
+ delete axiosInstance.defaults.headers.common[key];
395
+ logger.info(`Custom header removed: ${key}`);
75
396
  };
76
- var parseError = (error) => {
77
- if (error.response?.data?.message) {
78
- return error.response.data.message;
397
+ var setCustomHeaders = (headers) => {
398
+ currentConfig.defaultHeaders = { ...currentConfig.defaultHeaders, ...headers };
399
+ Object.entries(headers).forEach(([key, value]) => {
400
+ axiosInstance.defaults.headers.common[key] = value;
401
+ });
402
+ logger.info(`Multiple custom headers added: ${Object.keys(headers).join(", ")}`);
403
+ };
404
+ var clearCustomHeaders = () => {
405
+ if (currentConfig.defaultHeaders) {
406
+ Object.keys(currentConfig.defaultHeaders).forEach((key) => {
407
+ delete axiosInstance.defaults.headers.common[key];
408
+ });
409
+ }
410
+ currentConfig.defaultHeaders = {};
411
+ logger.info("All custom headers cleared");
412
+ };
413
+ var configureHttp = (config) => {
414
+ if (config.baseUrl) {
415
+ setApiBaseUrl(config.baseUrl);
79
416
  }
80
- if (error.response?.data?.error) {
81
- return error.response.data.error;
417
+ if (config.apiPrefix) {
418
+ setApiPrefix(config.apiPrefix);
82
419
  }
83
- if (error.code === "ERR_NETWORK") {
84
- return "Network error. Please check your connection.";
420
+ if (config.timeout !== void 0) {
421
+ currentConfig.timeout = config.timeout;
422
+ axiosInstance.defaults.timeout = config.timeout;
85
423
  }
86
- if (error.code === "ECONNABORTED") {
87
- return "Request timed out. Please try again.";
424
+ if (config.defaultHeaders) {
425
+ setCustomHeaders(config.defaultHeaders);
88
426
  }
89
- return error.message || "An unexpected error occurred.";
427
+ logger.info("HTTP client configured successfully");
90
428
  };
91
- var isSuccess = (response) => {
92
- return response.data?.success === true;
429
+ var getHttpConfig = () => {
430
+ return { ...currentConfig };
93
431
  };
94
- var isStatusError = (error, statusCode) => {
95
- return error.response?.status === statusCode;
432
+ var resetHttpConfig = () => {
433
+ currentConfig = { ...defaultConfig };
434
+ axiosInstance.defaults.baseURL = defaultConfig.baseUrl;
435
+ axiosInstance.defaults.timeout = defaultConfig.timeout;
436
+ clearCustomHeaders();
437
+ logger.info("HTTP configuration reset to defaults");
96
438
  };
97
- var isUnauthorized = (error) => {
98
- return isStatusError(error, 401);
439
+ var API_BASE_URL = getApiBaseUrl();
440
+ var API_PREFIX = getApiPrefix();
441
+ axiosInstance.interceptors.request.use(
442
+ (config) => {
443
+ try {
444
+ if (typeof window !== "undefined" && window.localStorage) {
445
+ const selectedOrg = localStorage.getItem("selectedOrganization");
446
+ if (selectedOrg) {
447
+ const org = JSON.parse(selectedOrg);
448
+ if (org && org._id) {
449
+ config.headers["x-organization-id"] = org._id;
450
+ }
451
+ }
452
+ }
453
+ } catch (error) {
454
+ logger.warn("Failed to read organization from localStorage", error);
455
+ }
456
+ return config;
457
+ },
458
+ (error) => {
459
+ return Promise.reject(error);
460
+ }
461
+ );
462
+ axiosInstance.interceptors.response.use(
463
+ (response) => response,
464
+ (error) => {
465
+ const parsedError = parseError(error);
466
+ logger.error("API Error", parsedError);
467
+ return Promise.reject(parsedError);
468
+ }
469
+ );
470
+ var buildHeaders = (customHeaders) => {
471
+ const headers = {
472
+ "Content-Type": "application/json",
473
+ ...currentConfig.defaultHeaders,
474
+ // Add global custom headers
475
+ ...customHeaders
476
+ // Request-specific headers override global ones
477
+ };
478
+ return headers;
479
+ };
480
+ var buildConfig = (params, customHeaders) => {
481
+ const config = {
482
+ headers: buildHeaders(customHeaders)
483
+ };
484
+ if (params) {
485
+ config.params = params;
486
+ }
487
+ return config;
99
488
  };
100
- var isForbidden = (error) => {
101
- return isStatusError(error, 403);
489
+ var getRequest = async (url, params, customHeaders) => {
490
+ const config = buildConfig(params, customHeaders);
491
+ return axiosInstance.get(url, config);
102
492
  };
103
- var isNotFound = (error) => {
104
- return isStatusError(error, 404);
493
+ var postRequest = async (url, data, customHeaders) => {
494
+ const config = buildConfig(void 0, customHeaders);
495
+ return axiosInstance.post(url, data, config);
105
496
  };
106
- var isServerError = (error) => {
107
- const status = error.response?.status;
108
- return status !== void 0 && status >= 500;
497
+ var putRequest = async (url, data, customHeaders) => {
498
+ const config = buildConfig(void 0, customHeaders);
499
+ return axiosInstance.put(url, data, config);
500
+ };
501
+ var patchRequest = async (url, data, customHeaders) => {
502
+ const config = buildConfig(void 0, customHeaders);
503
+ return axiosInstance.patch(url, data, config);
504
+ };
505
+ var deleteRequest = async (url, params, customHeaders) => {
506
+ const config = buildConfig(params, customHeaders);
507
+ return axiosInstance.delete(url, config);
508
+ };
509
+ var uploadFile = async (url, file, additionalData) => {
510
+ const formData = new FormData();
511
+ formData.append("file", file);
512
+ if (additionalData) {
513
+ Object.entries(additionalData).forEach(([key, value]) => {
514
+ formData.append(key, String(value));
515
+ });
516
+ }
517
+ const config = {
518
+ headers: {
519
+ "Content-Type": "multipart/form-data"
520
+ }
521
+ };
522
+ return axiosInstance.post(url, formData, config);
523
+ };
524
+ var extractData = (response) => {
525
+ return parseResponseData(response.data);
526
+ };
527
+ var extractMessage = (response) => {
528
+ return parseResponseMessage(response, "");
529
+ };
530
+ var isSuccess = (response) => {
531
+ return response.status >= 200 && response.status < 300;
532
+ };
533
+ var extractPaginatedData = (response) => {
534
+ return parsePaginatedResponse(response.data);
535
+ };
536
+
537
+ // src/client/http/slug.ts
538
+ var generateSlug = (text) => {
539
+ if (!text) return "";
540
+ return text.trim().replace(/[^\w\s]/g, "").replace(/\s+(.)/g, (_, char) => char.toUpperCase()).replace(/\s+/g, "").replace(/^(.)/, (_, char) => char.toLowerCase());
541
+ };
542
+ var generateUrlSlug = (text) => {
543
+ if (!text) return "";
544
+ return text.trim().toLowerCase().replace(/[^\w\s-]/g, "").replace(/\s+/g, "-").replace(/-+/g, "-").replace(/^-|-$/g, "");
545
+ };
546
+ var generateSnakeSlug = (text) => {
547
+ if (!text) return "";
548
+ return text.trim().toLowerCase().replace(/[^\w\s]/g, "").replace(/\s+/g, "_").replace(/_+/g, "_").replace(/^_|_$/g, "");
109
549
  };
110
550
 
111
551
  // src/client/logger/client-logger.ts
@@ -261,40 +701,6 @@ var formatRelativeTime = (date) => {
261
701
  }
262
702
  return "just now";
263
703
  };
264
- var formatDateForInput = (date) => {
265
- const dateObj = new Date(date);
266
- return dateObj.toISOString().split("T")[0];
267
- };
268
- var formatDateTimeForInput = (date) => {
269
- const dateObj = new Date(date);
270
- return dateObj.toISOString().slice(0, 16);
271
- };
272
- var isToday = (date) => {
273
- const dateObj = new Date(date);
274
- const today = /* @__PURE__ */ new Date();
275
- return dateObj.getDate() === today.getDate() && dateObj.getMonth() === today.getMonth() && dateObj.getFullYear() === today.getFullYear();
276
- };
277
- var isPast = (date) => {
278
- return new Date(date).getTime() < Date.now();
279
- };
280
- var isFuture = (date) => {
281
- return new Date(date).getTime() > Date.now();
282
- };
283
- var addDays = (date, days) => {
284
- const dateObj = new Date(date);
285
- dateObj.setDate(dateObj.getDate() + days);
286
- return dateObj;
287
- };
288
- var startOfDay = (date) => {
289
- const dateObj = new Date(date);
290
- dateObj.setHours(0, 0, 0, 0);
291
- return dateObj;
292
- };
293
- var endOfDay = (date) => {
294
- const dateObj = new Date(date);
295
- dateObj.setHours(23, 59, 59, 999);
296
- return dateObj;
297
- };
298
704
 
299
705
  // src/client/utils/clipboard.ts
300
706
  var copyToClipboard = async (text) => {
@@ -319,20 +725,6 @@ var copyToClipboard = async (text) => {
319
725
  return false;
320
726
  }
321
727
  };
322
- var readFromClipboard = async () => {
323
- try {
324
- if (navigator.clipboard && window.isSecureContext) {
325
- return await navigator.clipboard.readText();
326
- }
327
- return null;
328
- } catch (error) {
329
- console.error("Failed to read from clipboard:", error);
330
- return null;
331
- }
332
- };
333
- var isClipboardAvailable = () => {
334
- return !!(navigator.clipboard && window.isSecureContext);
335
- };
336
728
 
337
729
  // src/client/utils/slug.ts
338
730
  var slugify = (text) => {
@@ -369,165 +761,15 @@ var kebabToCamel = (text) => {
369
761
  return text.replace(/-([a-z])/g, (_, char) => char.toUpperCase());
370
762
  };
371
763
 
372
- // src/client/utils/events.ts
373
- var EventEmitter = class {
374
- constructor() {
375
- this.handlers = /* @__PURE__ */ new Map();
376
- }
377
- /**
378
- * Subscribe to an event
379
- * @returns Unsubscribe function
380
- */
381
- on(event, handler) {
382
- if (!this.handlers.has(event)) {
383
- this.handlers.set(event, /* @__PURE__ */ new Set());
384
- }
385
- this.handlers.get(event).add(handler);
386
- return () => this.off(event, handler);
387
- }
388
- /**
389
- * Subscribe to an event once
390
- */
391
- once(event, handler) {
392
- const wrappedHandler = (data) => {
393
- this.off(event, wrappedHandler);
394
- handler(data);
395
- };
396
- return this.on(event, wrappedHandler);
397
- }
398
- /**
399
- * Unsubscribe from an event
400
- */
401
- off(event, handler) {
402
- const eventHandlers = this.handlers.get(event);
403
- if (eventHandlers) {
404
- eventHandlers.delete(handler);
405
- }
406
- }
407
- /**
408
- * Emit an event
409
- */
410
- emit(event, data) {
411
- const eventHandlers = this.handlers.get(event);
412
- if (eventHandlers) {
413
- eventHandlers.forEach((handler) => {
414
- try {
415
- handler(data);
416
- } catch (error) {
417
- console.error(`Error in event handler for "${String(event)}":`, error);
418
- }
419
- });
420
- }
421
- }
422
- /**
423
- * Remove all handlers for an event (or all events)
424
- */
425
- removeAllListeners(event) {
426
- if (event) {
427
- this.handlers.delete(event);
428
- } else {
429
- this.handlers.clear();
430
- }
431
- }
432
- /**
433
- * Get count of listeners for an event
434
- */
435
- listenerCount(event) {
436
- return this.handlers.get(event)?.size ?? 0;
437
- }
438
- };
439
- var createEventEmitter = () => {
440
- return new EventEmitter();
441
- };
442
- var appEvents = new EventEmitter();
443
-
444
- // src/client/utils/api-urls.ts
445
- var ApiUrlBuilder = class {
446
- constructor(config) {
447
- this.baseUrl = config.baseUrl.replace(/\/$/, "");
448
- this.version = config.version || "";
449
- }
450
- /**
451
- * Build full URL from path
452
- */
453
- build(path) {
454
- const normalizedPath = path.startsWith("/") ? path : `/${path}`;
455
- const versionPath = this.version ? `/${this.version}` : "";
456
- return `${this.baseUrl}${versionPath}${normalizedPath}`;
457
- }
458
- /**
459
- * Build URL with query parameters
460
- */
461
- buildWithParams(path, params) {
462
- const url = this.build(path);
463
- const filteredParams = Object.entries(params).filter(([, value]) => value !== void 0).map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`).join("&");
464
- return filteredParams ? `${url}?${filteredParams}` : url;
465
- }
466
- /**
467
- * Build URL with path parameters
468
- */
469
- buildWithPathParams(template, params) {
470
- let path = template;
471
- Object.entries(params).forEach(([key, value]) => {
472
- path = path.replace(`:${key}`, String(value));
473
- path = path.replace(`{${key}}`, String(value));
474
- });
475
- return this.build(path);
476
- }
477
- /**
478
- * Get base URL
479
- */
480
- getBaseUrl() {
481
- return this.baseUrl;
482
- }
483
- /**
484
- * Set new base URL
485
- */
486
- setBaseUrl(baseUrl) {
487
- this.baseUrl = baseUrl.replace(/\/$/, "");
488
- }
489
- };
490
- var createApiUrlBuilder = (config) => {
491
- return new ApiUrlBuilder(config);
492
- };
493
- var createApiEndpoints = (builder) => ({
494
- // Auth endpoints
495
- auth: {
496
- login: () => builder.build("/auth/login"),
497
- register: () => builder.build("/auth/register"),
498
- logout: () => builder.build("/auth/logout"),
499
- refresh: () => builder.build("/auth/refresh"),
500
- me: () => builder.build("/auth/me"),
501
- forgotPassword: () => builder.build("/auth/forgot-password"),
502
- resetPassword: () => builder.build("/auth/reset-password")
503
- },
504
- // User endpoints
505
- users: {
506
- list: () => builder.build("/users"),
507
- get: (id) => builder.buildWithPathParams("/users/:id", { id }),
508
- create: () => builder.build("/users"),
509
- update: (id) => builder.buildWithPathParams("/users/:id", { id }),
510
- delete: (id) => builder.buildWithPathParams("/users/:id", { id })
511
- },
512
- // Generic CRUD factory
513
- crud: (resource) => ({
514
- list: () => builder.build(`/${resource}`),
515
- get: (id) => builder.buildWithPathParams(`/${resource}/:id`, { id }),
516
- create: () => builder.build(`/${resource}`),
517
- update: (id) => builder.buildWithPathParams(`/${resource}/:id`, { id }),
518
- delete: (id) => builder.buildWithPathParams(`/${resource}/:id`, { id })
519
- })
520
- });
521
-
522
764
  // src/client/utils/response-parser.ts
523
- var isSuccessResponse = (response) => {
765
+ var isSuccessResponse2 = (response) => {
524
766
  return response.success === true;
525
767
  };
526
- var isErrorResponse = (response) => {
768
+ var isErrorResponse2 = (response) => {
527
769
  return response.success === false;
528
770
  };
529
771
  var getResponseData = (response, defaultValue) => {
530
- if (isSuccessResponse(response) && response.data !== void 0) {
772
+ if (isSuccessResponse2(response) && response.data !== void 0) {
531
773
  return response.data;
532
774
  }
533
775
  return defaultValue;
@@ -2768,18 +3010,18 @@ function useLogger(componentName, props, options = {}) {
2768
3010
  const {
2769
3011
  logProps = true,
2770
3012
  logLifecycle = true,
2771
- logger = console.log
3013
+ logger: logger2 = console.log
2772
3014
  } = options;
2773
3015
  const previousProps = useRef(props);
2774
3016
  const renderCount = useRef(0);
2775
3017
  renderCount.current++;
2776
3018
  useEffect(() => {
2777
3019
  if (logLifecycle) {
2778
- logger(`[${componentName}] Mounted`);
3020
+ logger2(`[${componentName}] Mounted`);
2779
3021
  }
2780
3022
  return () => {
2781
3023
  if (logLifecycle) {
2782
- logger(`[${componentName}] Unmounted (rendered ${renderCount.current} times)`);
3024
+ logger2(`[${componentName}] Unmounted (rendered ${renderCount.current} times)`);
2783
3025
  }
2784
3026
  };
2785
3027
  }, []);
@@ -2811,12 +3053,12 @@ function useLogger(componentName, props, options = {}) {
2811
3053
  });
2812
3054
  }
2813
3055
  if (hasChanges) {
2814
- logger(`[${componentName}] Props changed:`, changedProps);
3056
+ logger2(`[${componentName}] Props changed:`, changedProps);
2815
3057
  }
2816
3058
  previousProps.current = props;
2817
- }, [componentName, props, logProps, logger]);
3059
+ }, [componentName, props, logProps, logger2]);
2818
3060
  if (process.env.NODE_ENV === "development") {
2819
- logger(`[${componentName}] Render #${renderCount.current}`);
3061
+ logger2(`[${componentName}] Render #${renderCount.current}`);
2820
3062
  }
2821
3063
  }
2822
3064
  var useLogger_default = useLogger;
@@ -5603,6 +5845,6 @@ function RegisterForm({
5603
5845
  ) });
5604
5846
  }
5605
5847
 
5606
- export { ApiUrlBuilder, ClientLogger, ContactForm, EventEmitter, LoginForm, NewsletterForm, RegisterForm, ThemeContext, ThemeProvider, ThemeToggle, VALIDATION_MESSAGES, addDays, adjustColor, appEvents, camelToKebab, capitalize, capitalizeWords, checkPackage, clientLogger, contactFormSchema, copyToClipboard, createApiEndpoints, createApiUrlBuilder, createClientLogger, createEmptyPaginationMeta, createErrorResponse, createEventEmitter, createHttpClient, createRegisterFormSchema, createSuccessResponse, createTheme, createThemeFromBrand, cssVar, deepMerge, defaultDarkTheme, defaultLightTheme, dummyBannerData, dummyFaqItems, dummyFeatures, dummyFooterData, dummyHeaderData, dummyImage, dummyPricingPlans, dummyTestimonials, endOfDay, flattenToCssVars, formatDate, formatDateForInput, formatDateTime, formatDateTimeForInput, formatPackageCheckResult, formatRelativeTime, generateCssVars, generateNcuCommand, getContrastColor, getErrorMessage, getNextPage, getPrevPage, getResponseData, getSystemColorScheme, hasData, hasMorePages, hexToRgba, injectCssVars, isClipboardAvailable, isErrorResponse, isForbidden, isFuture, isNotFound, isPast, isServerError, isStatusError, isSuccess, isSuccessResponse, isToday, isUnauthorized, kebabToCamel, loadThemeFromUrl, loadThemeMode, loginFormSchema, loremIpsum, newsletterFormSchema, packageCheck, parseError, parseFullResponse, parseResponse, readFromClipboard, registerFormSchema, removeCssVars, resolveThemeMode, saveThemeMode, slugify, slugifyUnique, startOfDay, truncate, truncateWords, unslugify, useBattery_default as useBattery, useClickAway_default as useClickAway, useContinuousRetry_default as useContinuousRetry, useCopyToClipboard_default as useCopyToClipboard, useCountdown_default as useCountdown, useCounter_default as useCounter, useDebounce_default as useDebounce, useDefault_default as useDefault, useDocumentTitle_default as useDocumentTitle, useEventListener_default as useEventListener, useFavicon_default as useFavicon, useFetch_default as useFetch, useGeolocation_default as useGeolocation, useHistoryState_default as useHistoryState, useHover_default as useHover, useIdle_default as useIdle, useIntersectionObserver_default as useIntersectionObserver, useInterval_default as useInterval, useIntervalWhen_default as useIntervalWhen, useIsClient_default as useIsClient, useIsDesktop, useIsFirstRender_default as useIsFirstRender, useIsMobile, useIsMobileOrTablet, useIsTablet, useKeyPress_default as useKeyPress, useList_default as useList, useLocalStorage_default as useLocalStorage, useLockBodyScroll_default as useLockBodyScroll, useLogger_default as useLogger, useLongPress_default as useLongPress, useMap_default as useMap, useMeasure_default as useMeasure, useMediaQuery_default as useMediaQuery, useMouse_default as useMouse, useNetworkState_default as useNetworkState, useObjectState_default as useObjectState, useOnClickOutside_default as useOnClickOutside, useOrientation_default as useOrientation, usePageLeave_default as usePageLeave, usePageTitle_default as usePageTitle, usePreferredLanguage_default as usePreferredLanguage, usePrevious_default as usePrevious, useQueue_default as useQueue, useRandomInterval_default as useRandomInterval, useRenderCount_default as useRenderCount, useRenderInfo_default as useRenderInfo, useScript_default as useScript, useSessionStorage_default as useSessionStorage, useSet_default as useSet, useSnackbar_default as useSnackbar, useTheme, useThemeDetector_default as useThemeDetector, useThemeValue, useThrottle_default as useThrottle, useTimeout_default as useTimeout, useToggle_default as useToggle, useVisibilityChange_default as useVisibilityChange, useWindowScroll_default as useWindowScroll, useWindowSize_default as useWindowSize, withAbortSignal, withFormData, withTimeout };
5848
+ export { API_BASE_URL, API_PREFIX, ClientLogger, ContactForm, ERROR_CODES, LoginForm, NewsletterForm, RegisterForm, STATUS_CODES, STATUS_MESSAGES, SUCCESS_CODES, ThemeContext, ThemeProvider, ThemeToggle, VALIDATION_MESSAGES, adjustColor, axiosInstance as axios, camelToKebab, capitalize, capitalizeWords, clearCustomHeaders, clientLogger, configureHttp, contactFormSchema, copyToClipboard, createClientLogger, createEmptyPaginationMeta, createErrorResponse, createRegisterFormSchema, createSuccessResponse, createTheme, createThemeFromBrand, cssVar, deepMerge, defaultDarkTheme, defaultLightTheme, deleteRequest, dummyBannerData, dummyFaqItems, dummyFeatures, dummyFooterData, dummyHeaderData, dummyImage, dummyPricingPlans, dummyTestimonials, extractData, extractMessage, extractNestedData, extractPaginatedData, flattenToCssVars, formatDate, formatDateTime, formatRelativeTime, generateCssVars, generateSlug, generateSnakeSlug, generateUrlSlug, getApiBaseUrl, getApiPrefix, getContrastColor, getCustomHeaders, getErrorMessage, getHttpConfig, getNextPage, getPrevPage, getRequest, getResponseData, getSystemColorScheme, hasData, hasMorePages, hexToRgba, injectCssVars, isErrorResponse, isSuccess, isSuccessResponse, isErrorResponse2 as isUtilErrorResponse, isSuccessResponse2 as isUtilSuccessResponse, kebabToCamel, loadThemeFromUrl, loadThemeMode, logger, loginFormSchema, loremIpsum, newsletterFormSchema, packageCheck, parseAxiosErrorMessage, parseError, parsePaginatedResponse, parseResponseData, parseResponseMessage, parseResponseStatus, parseResponseStatusMessage, patchRequest, postRequest, putRequest, registerFormSchema, removeCssVars, removeCustomHeader, resetHttpConfig, resolveThemeMode, safeJsonParse, saveThemeMode, setApiBaseUrl, setApiPrefix, setCustomHeader, setCustomHeaders, simpleMetaParseResponse, simpleParseDualDataResponse, simpleParseResponse, slugify, slugifyUnique, truncate, truncateWords, unslugify, uploadFile, useBattery_default as useBattery, useClickAway_default as useClickAway, useContinuousRetry_default as useContinuousRetry, useCopyToClipboard_default as useCopyToClipboard, useCountdown_default as useCountdown, useCounter_default as useCounter, useDebounce_default as useDebounce, useDefault_default as useDefault, useDocumentTitle_default as useDocumentTitle, useEventListener_default as useEventListener, useFavicon_default as useFavicon, useFetch_default as useFetch, useGeolocation_default as useGeolocation, useHistoryState_default as useHistoryState, useHover_default as useHover, useIdle_default as useIdle, useIntersectionObserver_default as useIntersectionObserver, useInterval_default as useInterval, useIntervalWhen_default as useIntervalWhen, useIsClient_default as useIsClient, useIsDesktop, useIsFirstRender_default as useIsFirstRender, useIsMobile, useIsMobileOrTablet, useIsTablet, useKeyPress_default as useKeyPress, useList_default as useList, useLocalStorage_default as useLocalStorage, useLockBodyScroll_default as useLockBodyScroll, useLogger_default as useLogger, useLongPress_default as useLongPress, useMap_default as useMap, useMeasure_default as useMeasure, useMediaQuery_default as useMediaQuery, useMouse_default as useMouse, useNetworkState_default as useNetworkState, useObjectState_default as useObjectState, useOnClickOutside_default as useOnClickOutside, useOrientation_default as useOrientation, usePageLeave_default as usePageLeave, usePageTitle_default as usePageTitle, usePreferredLanguage_default as usePreferredLanguage, usePrevious_default as usePrevious, useQueue_default as useQueue, useRandomInterval_default as useRandomInterval, useRenderCount_default as useRenderCount, useRenderInfo_default as useRenderInfo, useScript_default as useScript, useSessionStorage_default as useSessionStorage, useSet_default as useSet, useSnackbar_default as useSnackbar, useTheme, useThemeDetector_default as useThemeDetector, useThemeValue, useThrottle_default as useThrottle, useTimeout_default as useTimeout, useToggle_default as useToggle, useVisibilityChange_default as useVisibilityChange, useWindowScroll_default as useWindowScroll, useWindowSize_default as useWindowSize };
5607
5849
  //# sourceMappingURL=index.mjs.map
5608
5850
  //# sourceMappingURL=index.mjs.map