@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.
- package/dist/client/http/index.js +1 -3
- package/dist/client/http/index.js.map +1 -1
- package/dist/client/http/index.mjs +1 -3
- package/dist/client/http/index.mjs.map +1 -1
- package/dist/client/index.js +4 -4
- package/dist/client/index.js.map +1 -1
- package/dist/client/index.mjs +4 -4
- package/dist/client/index.mjs.map +1 -1
- package/dist/client/logger/index.js +3 -1
- package/dist/client/logger/index.js.map +1 -1
- package/dist/client/logger/index.mjs +3 -1
- package/dist/client/logger/index.mjs.map +1 -1
- package/dist/client/utils/index.js +3 -3
- package/dist/client/utils/index.js.map +1 -1
- package/dist/client/utils/index.mjs +3 -3
- package/dist/client/utils/index.mjs.map +1 -1
- package/dist/{index-Ckhm_HaX.d.mts → index-B8O4iu6q.d.mts} +7 -2
- package/dist/{index-br6POSyA.d.ts → index-MpV0UNTq.d.ts} +7 -2
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +171 -18
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +168 -17
- package/dist/index.mjs.map +1 -1
- package/dist/server/configs/index.js +3 -0
- package/dist/server/configs/index.js.map +1 -1
- package/dist/server/configs/index.mjs +3 -0
- package/dist/server/configs/index.mjs.map +1 -1
- package/dist/server/index.d.mts +1 -1
- package/dist/server/index.d.ts +1 -1
- package/dist/server/index.js +161 -8
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +156 -8
- package/dist/server/index.mjs.map +1 -1
- package/dist/server/middleware/index.js +3 -3
- package/dist/server/middleware/index.js.map +1 -1
- package/dist/server/middleware/index.mjs +3 -3
- package/dist/server/middleware/index.mjs.map +1 -1
- package/dist/server/utils/index.d.mts +99 -1
- package/dist/server/utils/index.d.ts +99 -1
- package/dist/server/utils/index.js +154 -0
- package/dist/server/utils/index.js.map +1 -1
- package/dist/server/utils/index.mjs +148 -3
- package/dist/server/utils/index.mjs.map +1 -1
- 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
|
|
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
|
|
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:
|
|
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:
|
|
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
|
|
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
|
|
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
|
|
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 =
|
|
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
|
-
|
|
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,
|
|
2681
|
+
var extractNestedData = (response, path3, fallback = null) => {
|
|
2531
2682
|
try {
|
|
2532
|
-
const keys =
|
|
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,
|
|
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 = [...
|
|
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(
|
|
6929
|
-
return `var(${prefix}-${
|
|
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();
|