@exyconn/common 2.3.2 → 2.3.3

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 +217 -49
  3. package/dist/client/http/index.d.ts +217 -49
  4. package/dist/client/http/index.js +473 -94
  5. package/dist/client/http/index.js.map +1 -1
  6. package/dist/client/http/index.mjs +441 -84
  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 +481 -319
  11. package/dist/client/index.js.map +1 -1
  12. package/dist/client/index.mjs +449 -290
  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-DuxL84IW.d.mts → index-BZf42T3R.d.mts} +39 -39
  17. package/dist/{index-D9a9oxQy.d.ts → index-CF0D8PGE.d.ts} +39 -39
  18. package/dist/{index-D3yCCjBZ.d.mts → index-Ckhm_HaX.d.mts} +21 -2
  19. package/dist/{index-01hoqibP.d.ts → index-br6POSyA.d.ts} +21 -2
  20. package/dist/index.d.mts +3 -3
  21. package/dist/index.d.ts +3 -3
  22. package/dist/index.js +1122 -329
  23. package/dist/index.js.map +1 -1
  24. package/dist/index.mjs +1134 -341
  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,465 @@ 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();
44
- }
45
- if (status >= 500 && onServerError) {
46
- onServerError(error);
47
- }
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"];
48
207
  }
49
- return Promise.reject(error);
50
208
  }
51
- );
52
- return instance;
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
+ }
53
225
  };
54
- var withFormData = () => ({
55
- headers: {
56
- "Content-Type": "multipart/form-data"
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;
57
241
  }
58
- });
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;
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;
70
249
  }
71
- return null;
72
250
  };
73
- var parseFullResponse = (response) => {
74
- return response.data;
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
+ }
266
+ }
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"];
272
+ }
273
+ }
274
+ }
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
+ }
75
286
  };
76
287
  var parseError = (error) => {
77
- if (error.response?.data?.message) {
78
- return error.response.data.message;
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
+ };
79
337
  }
80
- if (error.response?.data?.error) {
81
- return error.response.data.error;
338
+ };
339
+ var simpleParseResponse = (response) => {
340
+ return response?.data?.data?.data;
341
+ };
342
+ var simpleMetaParseResponse = (response) => {
343
+ return response?.data?.data?.meta;
344
+ };
345
+ var simpleParseDualDataResponse = (response) => {
346
+ return response?.data?.data;
347
+ };
348
+
349
+ // src/client/http/http.ts
350
+ var isDevelopment = typeof window !== "undefined" && window.location.hostname === "localhost";
351
+ var API_BASE_URL = isDevelopment ? "http://localhost:4002" : "https://service-api.exyconn.com";
352
+ var API_PREFIX = "/v1/api";
353
+ var axiosInstance = axios.create({
354
+ baseURL: API_BASE_URL,
355
+ timeout: 3e4,
356
+ // 30 seconds
357
+ headers: {
358
+ "Content-Type": "application/json"
82
359
  }
83
- if (error.code === "ERR_NETWORK") {
84
- return "Network error. Please check your connection.";
360
+ });
361
+ axiosInstance.interceptors.request.use(
362
+ (config) => {
363
+ try {
364
+ if (typeof window !== "undefined" && window.localStorage) {
365
+ const selectedOrg = localStorage.getItem("selectedOrganization");
366
+ if (selectedOrg) {
367
+ const org = JSON.parse(selectedOrg);
368
+ if (org && org._id) {
369
+ config.headers["x-organization-id"] = org._id;
370
+ }
371
+ }
372
+ }
373
+ } catch (error) {
374
+ logger.warn("Failed to read organization from localStorage", error);
375
+ }
376
+ return config;
377
+ },
378
+ (error) => {
379
+ return Promise.reject(error);
85
380
  }
86
- if (error.code === "ECONNABORTED") {
87
- return "Request timed out. Please try again.";
381
+ );
382
+ axiosInstance.interceptors.response.use(
383
+ (response) => response,
384
+ (error) => {
385
+ const parsedError = parseError(error);
386
+ logger.error("API Error", parsedError);
387
+ return Promise.reject(parsedError);
88
388
  }
89
- return error.message || "An unexpected error occurred.";
389
+ );
390
+ var buildHeaders = (customHeaders) => {
391
+ const headers = {
392
+ "Content-Type": "application/json",
393
+ ...customHeaders
394
+ };
395
+ return headers;
90
396
  };
91
- var isSuccess = (response) => {
92
- return response.data?.success === true;
397
+ var buildConfig = (params, customHeaders) => {
398
+ const config = {
399
+ headers: buildHeaders(customHeaders)
400
+ };
401
+ if (params) {
402
+ config.params = params;
403
+ }
404
+ return config;
93
405
  };
94
- var isStatusError = (error, statusCode) => {
95
- return error.response?.status === statusCode;
406
+ var getRequest = async (url, params, customHeaders) => {
407
+ const config = buildConfig(params, customHeaders);
408
+ return axiosInstance.get(url, config);
96
409
  };
97
- var isUnauthorized = (error) => {
98
- return isStatusError(error, 401);
410
+ var postRequest = async (url, data, customHeaders) => {
411
+ const config = buildConfig(void 0, customHeaders);
412
+ return axiosInstance.post(url, data, config);
99
413
  };
100
- var isForbidden = (error) => {
101
- return isStatusError(error, 403);
414
+ var putRequest = async (url, data, customHeaders) => {
415
+ const config = buildConfig(void 0, customHeaders);
416
+ return axiosInstance.put(url, data, config);
102
417
  };
103
- var isNotFound = (error) => {
104
- return isStatusError(error, 404);
418
+ var patchRequest = async (url, data, customHeaders) => {
419
+ const config = buildConfig(void 0, customHeaders);
420
+ return axiosInstance.patch(url, data, config);
105
421
  };
106
- var isServerError = (error) => {
107
- const status = error.response?.status;
108
- return status !== void 0 && status >= 500;
422
+ var deleteRequest = async (url, params, customHeaders) => {
423
+ const config = buildConfig(params, customHeaders);
424
+ return axiosInstance.delete(url, config);
425
+ };
426
+ var uploadFile = async (url, file, additionalData) => {
427
+ const formData = new FormData();
428
+ formData.append("file", file);
429
+ if (additionalData) {
430
+ Object.entries(additionalData).forEach(([key, value]) => {
431
+ formData.append(key, String(value));
432
+ });
433
+ }
434
+ const config = {
435
+ headers: {
436
+ "Content-Type": "multipart/form-data"
437
+ }
438
+ };
439
+ return axiosInstance.post(url, formData, config);
440
+ };
441
+ var extractData = (response) => {
442
+ return parseResponseData(response.data);
443
+ };
444
+ var extractMessage = (response) => {
445
+ return parseResponseMessage(response, "");
446
+ };
447
+ var isSuccess = (response) => {
448
+ return response.status >= 200 && response.status < 300;
449
+ };
450
+ var extractPaginatedData = (response) => {
451
+ return parsePaginatedResponse(response.data);
452
+ };
453
+
454
+ // src/client/http/slug.ts
455
+ var generateSlug = (text) => {
456
+ if (!text) return "";
457
+ return text.trim().replace(/[^\w\s]/g, "").replace(/\s+(.)/g, (_, char) => char.toUpperCase()).replace(/\s+/g, "").replace(/^(.)/, (_, char) => char.toLowerCase());
458
+ };
459
+ var generateUrlSlug = (text) => {
460
+ if (!text) return "";
461
+ return text.trim().toLowerCase().replace(/[^\w\s-]/g, "").replace(/\s+/g, "-").replace(/-+/g, "-").replace(/^-|-$/g, "");
462
+ };
463
+ var generateSnakeSlug = (text) => {
464
+ if (!text) return "";
465
+ return text.trim().toLowerCase().replace(/[^\w\s]/g, "").replace(/\s+/g, "_").replace(/_+/g, "_").replace(/^_|_$/g, "");
109
466
  };
110
467
 
111
468
  // src/client/logger/client-logger.ts
@@ -261,40 +618,6 @@ var formatRelativeTime = (date) => {
261
618
  }
262
619
  return "just now";
263
620
  };
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
621
 
299
622
  // src/client/utils/clipboard.ts
300
623
  var copyToClipboard = async (text) => {
@@ -319,20 +642,6 @@ var copyToClipboard = async (text) => {
319
642
  return false;
320
643
  }
321
644
  };
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
645
 
337
646
  // src/client/utils/slug.ts
338
647
  var slugify = (text) => {
@@ -369,165 +678,15 @@ var kebabToCamel = (text) => {
369
678
  return text.replace(/-([a-z])/g, (_, char) => char.toUpperCase());
370
679
  };
371
680
 
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
681
  // src/client/utils/response-parser.ts
523
- var isSuccessResponse = (response) => {
682
+ var isSuccessResponse2 = (response) => {
524
683
  return response.success === true;
525
684
  };
526
- var isErrorResponse = (response) => {
685
+ var isErrorResponse2 = (response) => {
527
686
  return response.success === false;
528
687
  };
529
688
  var getResponseData = (response, defaultValue) => {
530
- if (isSuccessResponse(response) && response.data !== void 0) {
689
+ if (isSuccessResponse2(response) && response.data !== void 0) {
531
690
  return response.data;
532
691
  }
533
692
  return defaultValue;
@@ -2768,18 +2927,18 @@ function useLogger(componentName, props, options = {}) {
2768
2927
  const {
2769
2928
  logProps = true,
2770
2929
  logLifecycle = true,
2771
- logger = console.log
2930
+ logger: logger2 = console.log
2772
2931
  } = options;
2773
2932
  const previousProps = useRef(props);
2774
2933
  const renderCount = useRef(0);
2775
2934
  renderCount.current++;
2776
2935
  useEffect(() => {
2777
2936
  if (logLifecycle) {
2778
- logger(`[${componentName}] Mounted`);
2937
+ logger2(`[${componentName}] Mounted`);
2779
2938
  }
2780
2939
  return () => {
2781
2940
  if (logLifecycle) {
2782
- logger(`[${componentName}] Unmounted (rendered ${renderCount.current} times)`);
2941
+ logger2(`[${componentName}] Unmounted (rendered ${renderCount.current} times)`);
2783
2942
  }
2784
2943
  };
2785
2944
  }, []);
@@ -2811,12 +2970,12 @@ function useLogger(componentName, props, options = {}) {
2811
2970
  });
2812
2971
  }
2813
2972
  if (hasChanges) {
2814
- logger(`[${componentName}] Props changed:`, changedProps);
2973
+ logger2(`[${componentName}] Props changed:`, changedProps);
2815
2974
  }
2816
2975
  previousProps.current = props;
2817
- }, [componentName, props, logProps, logger]);
2976
+ }, [componentName, props, logProps, logger2]);
2818
2977
  if (process.env.NODE_ENV === "development") {
2819
- logger(`[${componentName}] Render #${renderCount.current}`);
2978
+ logger2(`[${componentName}] Render #${renderCount.current}`);
2820
2979
  }
2821
2980
  }
2822
2981
  var useLogger_default = useLogger;
@@ -5603,6 +5762,6 @@ function RegisterForm({
5603
5762
  ) });
5604
5763
  }
5605
5764
 
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 };
5765
+ 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, clientLogger, 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, getContrastColor, getErrorMessage, 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, resolveThemeMode, safeJsonParse, saveThemeMode, 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
5766
  //# sourceMappingURL=index.mjs.map
5608
5767
  //# sourceMappingURL=index.mjs.map