@exyconn/common 2.3.4 → 2.3.6

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 (45) hide show
  1. package/dist/client/http/index.js +1 -3
  2. package/dist/client/http/index.js.map +1 -1
  3. package/dist/client/http/index.mjs +1 -3
  4. package/dist/client/http/index.mjs.map +1 -1
  5. package/dist/client/index.js +4 -4
  6. package/dist/client/index.js.map +1 -1
  7. package/dist/client/index.mjs +4 -4
  8. package/dist/client/index.mjs.map +1 -1
  9. package/dist/client/logger/index.js +3 -1
  10. package/dist/client/logger/index.js.map +1 -1
  11. package/dist/client/logger/index.mjs +3 -1
  12. package/dist/client/logger/index.mjs.map +1 -1
  13. package/dist/client/utils/index.js +3 -3
  14. package/dist/client/utils/index.js.map +1 -1
  15. package/dist/client/utils/index.mjs +3 -3
  16. package/dist/client/utils/index.mjs.map +1 -1
  17. package/dist/{index-Ckhm_HaX.d.mts → index-B8O4iu6q.d.mts} +7 -2
  18. package/dist/{index-br6POSyA.d.ts → index-MpV0UNTq.d.ts} +7 -2
  19. package/dist/index.d.mts +1 -1
  20. package/dist/index.d.ts +1 -1
  21. package/dist/index.js +171 -18
  22. package/dist/index.js.map +1 -1
  23. package/dist/index.mjs +168 -17
  24. package/dist/index.mjs.map +1 -1
  25. package/dist/server/configs/index.js +3 -0
  26. package/dist/server/configs/index.js.map +1 -1
  27. package/dist/server/configs/index.mjs +3 -0
  28. package/dist/server/configs/index.mjs.map +1 -1
  29. package/dist/server/index.d.mts +1 -1
  30. package/dist/server/index.d.ts +1 -1
  31. package/dist/server/index.js +161 -8
  32. package/dist/server/index.js.map +1 -1
  33. package/dist/server/index.mjs +156 -8
  34. package/dist/server/index.mjs.map +1 -1
  35. package/dist/server/middleware/index.js +3 -3
  36. package/dist/server/middleware/index.js.map +1 -1
  37. package/dist/server/middleware/index.mjs +3 -3
  38. package/dist/server/middleware/index.mjs.map +1 -1
  39. package/dist/server/utils/index.d.mts +99 -1
  40. package/dist/server/utils/index.d.ts +99 -1
  41. package/dist/server/utils/index.js +154 -0
  42. package/dist/server/utils/index.js.map +1 -1
  43. package/dist/server/utils/index.mjs +148 -3
  44. package/dist/server/utils/index.mjs.map +1 -1
  45. package/package.json +25 -25
package/dist/index.js CHANGED
@@ -2,10 +2,11 @@
2
2
 
3
3
  var winston = require('winston');
4
4
  var DailyRotateFile = require('winston-daily-rotate-file');
5
- var path = require('path');
5
+ var path2 = require('path');
6
6
  var mongoose = require('mongoose');
7
7
  var jwt = require('jsonwebtoken');
8
8
  var fs = require('fs');
9
+ var os = require('os');
9
10
  var rateLimit = require('express-rate-limit');
10
11
  var axios = require('axios');
11
12
  var react = require('react');
@@ -37,9 +38,11 @@ function _interopNamespace(e) {
37
38
 
38
39
  var winston__default = /*#__PURE__*/_interopDefault(winston);
39
40
  var DailyRotateFile__default = /*#__PURE__*/_interopDefault(DailyRotateFile);
40
- var path__default = /*#__PURE__*/_interopDefault(path);
41
+ var path2__default = /*#__PURE__*/_interopDefault(path2);
41
42
  var mongoose__default = /*#__PURE__*/_interopDefault(mongoose);
42
43
  var jwt__default = /*#__PURE__*/_interopDefault(jwt);
44
+ var fs__default = /*#__PURE__*/_interopDefault(fs);
45
+ var os__default = /*#__PURE__*/_interopDefault(os);
43
46
  var rateLimit__default = /*#__PURE__*/_interopDefault(rateLimit);
44
47
  var axios__default = /*#__PURE__*/_interopDefault(axios);
45
48
  var Yup__namespace = /*#__PURE__*/_interopNamespace(Yup);
@@ -89,12 +92,14 @@ __export(server_exports, {
89
92
  createCorsOptions: () => createCorsOptions,
90
93
  createCrudControllers: () => createCrudControllers,
91
94
  createDdosRateLimiter: () => createDdosRateLimiter,
95
+ createHealthHandler: () => createHealthHandler,
92
96
  createLogger: () => createLogger,
93
97
  createMorganStream: () => createMorganStream,
94
98
  createMultiBrandCorsOptions: () => createMultiBrandCorsOptions,
95
99
  createPaginationMiddleware: () => createPaginationMiddleware,
96
100
  createPrefixedKeyGenerator: () => createPrefixedKeyGenerator,
97
101
  createRateLimiter: () => createRateLimiter,
102
+ createRootHandler: () => createRootHandler,
98
103
  createStandardRateLimiter: () => createStandardRateLimiter,
99
104
  createStrictRateLimiter: () => createStrictRateLimiter,
100
105
  createUserKeyGenerator: () => createUserKeyGenerator,
@@ -108,6 +113,7 @@ __export(server_exports, {
108
113
  extractSchemaMeta: () => extractSchemaMeta,
109
114
  forbiddenResponse: () => forbiddenResponse,
110
115
  formatPackageCheckResult: () => formatPackageCheckResult,
116
+ generateHealthResponse: () => generateHealthResponse,
111
117
  generateNcuCommand: () => generateNcuCommand,
112
118
  getConnectionStatus: () => getConnectionStatus,
113
119
  getDatabaseOptions: () => getDatabaseOptions,
@@ -352,7 +358,7 @@ var createLogger = (config = {}) => {
352
358
  }),
353
359
  // Combined logs (all levels)
354
360
  new DailyRotateFile__default.default({
355
- filename: path__default.default.join(finalConfig.logsDir, "combined-%DATE%.log"),
361
+ filename: path2__default.default.join(finalConfig.logsDir, "combined-%DATE%.log"),
356
362
  datePattern: "YYYY-MM-DD",
357
363
  maxSize: finalConfig.maxSize,
358
364
  maxFiles: finalConfig.maxFiles,
@@ -360,7 +366,7 @@ var createLogger = (config = {}) => {
360
366
  }),
361
367
  // Error logs only
362
368
  new DailyRotateFile__default.default({
363
- filename: path__default.default.join(finalConfig.logsDir, "error-%DATE%.log"),
369
+ filename: path2__default.default.join(finalConfig.logsDir, "error-%DATE%.log"),
364
370
  datePattern: "YYYY-MM-DD",
365
371
  level: "error",
366
372
  maxSize: finalConfig.maxSize,
@@ -821,7 +827,7 @@ function createCrudControllers(config) {
821
827
  };
822
828
  const getById = async (req, res, _next) => {
823
829
  try {
824
- const { id } = req.params;
830
+ const id = req.params.id;
825
831
  if (!id || !mongoose.Types.ObjectId.isValid(id)) {
826
832
  badRequestResponse(res, "Invalid ID format");
827
833
  return;
@@ -896,7 +902,7 @@ function createCrudControllers(config) {
896
902
  };
897
903
  const update = async (req, res, _next) => {
898
904
  try {
899
- const { id } = req.params;
905
+ const id = req.params.id;
900
906
  if (!id || !mongoose.Types.ObjectId.isValid(id)) {
901
907
  badRequestResponse(res, "Invalid ID format");
902
908
  return;
@@ -940,7 +946,7 @@ function createCrudControllers(config) {
940
946
  };
941
947
  const deleteOne = async (req, res, _next) => {
942
948
  try {
943
- const { id } = req.params;
949
+ const id = req.params.id;
944
950
  if (!id || !mongoose.Types.ObjectId.isValid(id)) {
945
951
  badRequestResponse(res, "Invalid ID format");
946
952
  return;
@@ -1315,7 +1321,7 @@ async function loadPackageJson(source) {
1315
1321
  }
1316
1322
  return response.json();
1317
1323
  }
1318
- const filePath = path.resolve(source);
1324
+ const filePath = path2.resolve(source);
1319
1325
  if (!fs.existsSync(filePath)) {
1320
1326
  throw new Error(`File not found: ${filePath}`);
1321
1327
  }
@@ -1469,6 +1475,150 @@ var packageCheckServer = {
1469
1475
  generateNcuCommand,
1470
1476
  print: printPackageCheckSummary
1471
1477
  };
1478
+ var serverStartTime = Date.now();
1479
+ function getTimezoneOffset() {
1480
+ const offset = (/* @__PURE__ */ new Date()).getTimezoneOffset();
1481
+ const hours = Math.floor(Math.abs(offset) / 60);
1482
+ const minutes = Math.abs(offset) % 60;
1483
+ const sign = offset <= 0 ? "+" : "-";
1484
+ return `${sign}${hours.toString().padStart(2, "0")}:${minutes.toString().padStart(2, "0")}`;
1485
+ }
1486
+ function getTimezoneName() {
1487
+ try {
1488
+ return Intl.DateTimeFormat().resolvedOptions().timeZone;
1489
+ } catch {
1490
+ return "UTC";
1491
+ }
1492
+ }
1493
+ function getPackageInfo(criticalPackages = []) {
1494
+ try {
1495
+ const possiblePaths = [
1496
+ path2__default.default.join(process.cwd(), "package.json"),
1497
+ path2__default.default.join(__dirname, "..", "..", "..", "..", "package.json"),
1498
+ path2__default.default.join(__dirname, "..", "..", "package.json")
1499
+ ];
1500
+ for (const pkgPath of possiblePaths) {
1501
+ if (fs__default.default.existsSync(pkgPath)) {
1502
+ const pkg = JSON.parse(fs__default.default.readFileSync(pkgPath, "utf-8"));
1503
+ const deps = pkg.dependencies || {};
1504
+ const devDeps = pkg.devDependencies || {};
1505
+ const total = Object.keys(deps).length + Object.keys(devDeps).length;
1506
+ const critical = {};
1507
+ for (const pkgName of criticalPackages) {
1508
+ if (deps[pkgName]) {
1509
+ critical[pkgName] = deps[pkgName].replace("^", "").replace("~", "");
1510
+ }
1511
+ }
1512
+ return { total, critical };
1513
+ }
1514
+ }
1515
+ } catch {
1516
+ }
1517
+ return { total: 0, critical: {} };
1518
+ }
1519
+ async function generateHealthResponse(config) {
1520
+ const startTime = Date.now();
1521
+ const now = /* @__PURE__ */ new Date();
1522
+ let dependencies = {};
1523
+ if (config.checkDependencies) {
1524
+ try {
1525
+ dependencies = await config.checkDependencies();
1526
+ } catch {
1527
+ dependencies = { error: "DOWN" };
1528
+ }
1529
+ }
1530
+ const hasDownDep = Object.values(dependencies).includes("DOWN");
1531
+ const status = hasDownDep ? "DEGRADED" : "UP";
1532
+ const defaultCriticalPackages = ["express", "mongoose", "cors", "dotenv"];
1533
+ const packageInfo = getPackageInfo(config.criticalPackages || defaultCriticalPackages);
1534
+ const totalMem = os__default.default.totalmem();
1535
+ const freeMem = os__default.default.freemem();
1536
+ const usedMem = totalMem - freeMem;
1537
+ const isProduction2 = process.env.NODE_ENV === "production";
1538
+ const serverUrl = isProduction2 ? `https://${config.domain}` : `http://localhost:${config.port}`;
1539
+ const response = {
1540
+ status,
1541
+ app: config.name,
1542
+ env: process.env.NODE_ENV || "development",
1543
+ version: config.version,
1544
+ urls: {
1545
+ ...config.uiUrl && { ui: config.uiUrl },
1546
+ server: config.serverUrl || serverUrl,
1547
+ health: `${config.serverUrl || serverUrl}/health`
1548
+ },
1549
+ time: {
1550
+ serverTime: now.toISOString(),
1551
+ timezone: getTimezoneName(),
1552
+ offset: getTimezoneOffset(),
1553
+ epoch: Math.floor(now.getTime() / 1e3)
1554
+ },
1555
+ uptimeSec: Math.floor((Date.now() - serverStartTime) / 1e3),
1556
+ node: {
1557
+ version: process.version,
1558
+ platform: os__default.default.platform(),
1559
+ arch: os__default.default.arch()
1560
+ },
1561
+ system: {
1562
+ hostname: os__default.default.hostname(),
1563
+ memoryUsedMB: Math.round(usedMem / 1024 / 1024),
1564
+ memoryTotalMB: Math.round(totalMem / 1024 / 1024),
1565
+ memoryFreePercent: Math.round(freeMem / totalMem * 100),
1566
+ cpuLoad: os__default.default.loadavg().map((l) => Math.round(l * 100) / 100),
1567
+ cpuCount: os__default.default.cpus().length
1568
+ },
1569
+ packages: {
1570
+ appVersion: config.version,
1571
+ totalDependencies: packageInfo.total,
1572
+ critical: packageInfo.critical
1573
+ },
1574
+ dependencies,
1575
+ ...config.infra && { infra: config.infra },
1576
+ responseTimeMs: Date.now() - startTime
1577
+ };
1578
+ return response;
1579
+ }
1580
+ function createHealthHandler(config) {
1581
+ return async (_req, res) => {
1582
+ try {
1583
+ const health = await generateHealthResponse(config);
1584
+ const statusCode2 = health.status === "UP" ? 200 : health.status === "DEGRADED" ? 200 : 503;
1585
+ res.status(statusCode2).json(health);
1586
+ } catch (error) {
1587
+ res.status(503).json({
1588
+ status: "DOWN",
1589
+ app: config.name,
1590
+ env: process.env.NODE_ENV || "development",
1591
+ version: config.version,
1592
+ error: error instanceof Error ? error.message : "Unknown error",
1593
+ time: {
1594
+ serverTime: (/* @__PURE__ */ new Date()).toISOString(),
1595
+ timezone: getTimezoneName(),
1596
+ offset: getTimezoneOffset(),
1597
+ epoch: Math.floor(Date.now() / 1e3)
1598
+ }
1599
+ });
1600
+ }
1601
+ };
1602
+ }
1603
+ function createRootHandler(config) {
1604
+ return async (_req, res) => {
1605
+ try {
1606
+ const health = await generateHealthResponse(config);
1607
+ res.json({
1608
+ message: `Welcome to ${config.name}`,
1609
+ description: config.description || `${config.name} API Server`,
1610
+ ...config.endpoints && { endpoints: config.endpoints },
1611
+ ...health
1612
+ });
1613
+ } catch (error) {
1614
+ res.status(503).json({
1615
+ status: "DOWN",
1616
+ app: config.name,
1617
+ error: error instanceof Error ? error.message : "Unknown error"
1618
+ });
1619
+ }
1620
+ };
1621
+ }
1472
1622
 
1473
1623
  // src/server/configs/cors.config.ts
1474
1624
  var DEFAULT_CORS_CONFIG = {
@@ -1750,6 +1900,8 @@ var createApiRateLimiter = (config = {}, options = {}) => {
1750
1900
  });
1751
1901
  };
1752
1902
  var RateLimiterBuilder = class {
1903
+ config;
1904
+ options;
1753
1905
  constructor(preset = "STANDARD") {
1754
1906
  const presetConfig = DEFAULT_RATE_LIMIT_TIERS[preset];
1755
1907
  this.config = {
@@ -1951,6 +2103,7 @@ function deepMerge(target, source) {
1951
2103
  return result;
1952
2104
  }
1953
2105
  var ConfigBuilder = class {
2106
+ config;
1954
2107
  constructor() {
1955
2108
  this.config = {
1956
2109
  server: { ...DEFAULT_SERVER_CONFIG },
@@ -2312,9 +2465,7 @@ __export(client_exports, {
2312
2465
 
2313
2466
  // src/client/http/logger.ts
2314
2467
  var Logger = class {
2315
- constructor() {
2316
- this.isDevelopment = typeof window !== "undefined" && window.location.hostname === "localhost";
2317
- }
2468
+ isDevelopment = typeof window !== "undefined" && window.location.hostname === "localhost";
2318
2469
  /**
2319
2470
  * Log informational messages
2320
2471
  */
@@ -2527,9 +2678,9 @@ var parsePaginatedResponse = (response) => {
2527
2678
  return { items: [], total: 0, page: 1, limit: 10 };
2528
2679
  }
2529
2680
  };
2530
- var extractNestedData = (response, path2, fallback = null) => {
2681
+ var extractNestedData = (response, path3, fallback = null) => {
2531
2682
  try {
2532
- const keys = path2.split(".");
2683
+ const keys = path3.split(".");
2533
2684
  let current = response;
2534
2685
  for (const key of keys) {
2535
2686
  if (current && typeof current === "object" && key in current) {
@@ -2860,8 +3011,10 @@ var LOG_LEVELS = {
2860
3011
  error: 3
2861
3012
  };
2862
3013
  var ClientLogger = class {
3014
+ config;
3015
+ buffer = [];
3016
+ flushTimer;
2863
3017
  constructor(config = {}) {
2864
- this.buffer = [];
2865
3018
  this.config = {
2866
3019
  enabled: config.enabled ?? process.env.NODE_ENV !== "production",
2867
3020
  minLevel: config.minLevel ?? "debug",
@@ -6663,11 +6816,11 @@ function getContrastColor(hex) {
6663
6816
  }
6664
6817
  function flattenToCssVars(obj, prefix = "--ec") {
6665
6818
  const result = {};
6666
- function flatten(current, path2 = []) {
6819
+ function flatten(current, path3 = []) {
6667
6820
  for (const key in current) {
6668
6821
  if (Object.prototype.hasOwnProperty.call(current, key)) {
6669
6822
  const value = current[key];
6670
- const newPath = [...path2, key];
6823
+ const newPath = [...path3, key];
6671
6824
  const varName = `${prefix}-${newPath.join("-")}`;
6672
6825
  if (value && typeof value === "object" && !Array.isArray(value)) {
6673
6826
  flatten(value, newPath);
@@ -6925,8 +7078,8 @@ function ThemeProvider({
6925
7078
  );
6926
7079
  return /* @__PURE__ */ jsxRuntime.jsx(ThemeContext.Provider, { value: contextValue, children });
6927
7080
  }
6928
- function cssVar(path2, prefix = "--ec") {
6929
- return `var(${prefix}-${path2.replace(/\./g, "-")})`;
7081
+ function cssVar(path3, prefix = "--ec") {
7082
+ return `var(${prefix}-${path3.replace(/\./g, "-")})`;
6930
7083
  }
6931
7084
  function useThemeValue(selector) {
6932
7085
  const { theme } = useTheme();