@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/server/index.mjs
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import winston from 'winston';
|
|
2
2
|
import DailyRotateFile from 'winston-daily-rotate-file';
|
|
3
|
-
import
|
|
3
|
+
import path2, { resolve } from 'path';
|
|
4
4
|
import mongoose, { Types } from 'mongoose';
|
|
5
5
|
import jwt from 'jsonwebtoken';
|
|
6
|
-
import { existsSync, readFileSync } from 'fs';
|
|
6
|
+
import fs, { existsSync, readFileSync } from 'fs';
|
|
7
|
+
import os from 'os';
|
|
7
8
|
import rateLimit from 'express-rate-limit';
|
|
8
9
|
|
|
9
10
|
// src/server/enums/status.ts
|
|
@@ -216,7 +217,7 @@ var createLogger = (config = {}) => {
|
|
|
216
217
|
}),
|
|
217
218
|
// Combined logs (all levels)
|
|
218
219
|
new DailyRotateFile({
|
|
219
|
-
filename:
|
|
220
|
+
filename: path2.join(finalConfig.logsDir, "combined-%DATE%.log"),
|
|
220
221
|
datePattern: "YYYY-MM-DD",
|
|
221
222
|
maxSize: finalConfig.maxSize,
|
|
222
223
|
maxFiles: finalConfig.maxFiles,
|
|
@@ -224,7 +225,7 @@ var createLogger = (config = {}) => {
|
|
|
224
225
|
}),
|
|
225
226
|
// Error logs only
|
|
226
227
|
new DailyRotateFile({
|
|
227
|
-
filename:
|
|
228
|
+
filename: path2.join(finalConfig.logsDir, "error-%DATE%.log"),
|
|
228
229
|
datePattern: "YYYY-MM-DD",
|
|
229
230
|
level: "error",
|
|
230
231
|
maxSize: finalConfig.maxSize,
|
|
@@ -685,7 +686,7 @@ function createCrudControllers(config) {
|
|
|
685
686
|
};
|
|
686
687
|
const getById = async (req, res, _next) => {
|
|
687
688
|
try {
|
|
688
|
-
const
|
|
689
|
+
const id = req.params.id;
|
|
689
690
|
if (!id || !Types.ObjectId.isValid(id)) {
|
|
690
691
|
badRequestResponse(res, "Invalid ID format");
|
|
691
692
|
return;
|
|
@@ -760,7 +761,7 @@ function createCrudControllers(config) {
|
|
|
760
761
|
};
|
|
761
762
|
const update = async (req, res, _next) => {
|
|
762
763
|
try {
|
|
763
|
-
const
|
|
764
|
+
const id = req.params.id;
|
|
764
765
|
if (!id || !Types.ObjectId.isValid(id)) {
|
|
765
766
|
badRequestResponse(res, "Invalid ID format");
|
|
766
767
|
return;
|
|
@@ -804,7 +805,7 @@ function createCrudControllers(config) {
|
|
|
804
805
|
};
|
|
805
806
|
const deleteOne = async (req, res, _next) => {
|
|
806
807
|
try {
|
|
807
|
-
const
|
|
808
|
+
const id = req.params.id;
|
|
808
809
|
if (!id || !Types.ObjectId.isValid(id)) {
|
|
809
810
|
badRequestResponse(res, "Invalid ID format");
|
|
810
811
|
return;
|
|
@@ -1333,6 +1334,150 @@ var packageCheckServer = {
|
|
|
1333
1334
|
generateNcuCommand,
|
|
1334
1335
|
print: printPackageCheckSummary
|
|
1335
1336
|
};
|
|
1337
|
+
var serverStartTime = Date.now();
|
|
1338
|
+
function getTimezoneOffset() {
|
|
1339
|
+
const offset = (/* @__PURE__ */ new Date()).getTimezoneOffset();
|
|
1340
|
+
const hours = Math.floor(Math.abs(offset) / 60);
|
|
1341
|
+
const minutes = Math.abs(offset) % 60;
|
|
1342
|
+
const sign = offset <= 0 ? "+" : "-";
|
|
1343
|
+
return `${sign}${hours.toString().padStart(2, "0")}:${minutes.toString().padStart(2, "0")}`;
|
|
1344
|
+
}
|
|
1345
|
+
function getTimezoneName() {
|
|
1346
|
+
try {
|
|
1347
|
+
return Intl.DateTimeFormat().resolvedOptions().timeZone;
|
|
1348
|
+
} catch {
|
|
1349
|
+
return "UTC";
|
|
1350
|
+
}
|
|
1351
|
+
}
|
|
1352
|
+
function getPackageInfo(criticalPackages = []) {
|
|
1353
|
+
try {
|
|
1354
|
+
const possiblePaths = [
|
|
1355
|
+
path2.join(process.cwd(), "package.json"),
|
|
1356
|
+
path2.join(__dirname, "..", "..", "..", "..", "package.json"),
|
|
1357
|
+
path2.join(__dirname, "..", "..", "package.json")
|
|
1358
|
+
];
|
|
1359
|
+
for (const pkgPath of possiblePaths) {
|
|
1360
|
+
if (fs.existsSync(pkgPath)) {
|
|
1361
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf-8"));
|
|
1362
|
+
const deps = pkg.dependencies || {};
|
|
1363
|
+
const devDeps = pkg.devDependencies || {};
|
|
1364
|
+
const total = Object.keys(deps).length + Object.keys(devDeps).length;
|
|
1365
|
+
const critical = {};
|
|
1366
|
+
for (const pkgName of criticalPackages) {
|
|
1367
|
+
if (deps[pkgName]) {
|
|
1368
|
+
critical[pkgName] = deps[pkgName].replace("^", "").replace("~", "");
|
|
1369
|
+
}
|
|
1370
|
+
}
|
|
1371
|
+
return { total, critical };
|
|
1372
|
+
}
|
|
1373
|
+
}
|
|
1374
|
+
} catch {
|
|
1375
|
+
}
|
|
1376
|
+
return { total: 0, critical: {} };
|
|
1377
|
+
}
|
|
1378
|
+
async function generateHealthResponse(config) {
|
|
1379
|
+
const startTime = Date.now();
|
|
1380
|
+
const now = /* @__PURE__ */ new Date();
|
|
1381
|
+
let dependencies = {};
|
|
1382
|
+
if (config.checkDependencies) {
|
|
1383
|
+
try {
|
|
1384
|
+
dependencies = await config.checkDependencies();
|
|
1385
|
+
} catch {
|
|
1386
|
+
dependencies = { error: "DOWN" };
|
|
1387
|
+
}
|
|
1388
|
+
}
|
|
1389
|
+
const hasDownDep = Object.values(dependencies).includes("DOWN");
|
|
1390
|
+
const status = hasDownDep ? "DEGRADED" : "UP";
|
|
1391
|
+
const defaultCriticalPackages = ["express", "mongoose", "cors", "dotenv"];
|
|
1392
|
+
const packageInfo = getPackageInfo(config.criticalPackages || defaultCriticalPackages);
|
|
1393
|
+
const totalMem = os.totalmem();
|
|
1394
|
+
const freeMem = os.freemem();
|
|
1395
|
+
const usedMem = totalMem - freeMem;
|
|
1396
|
+
const isProduction2 = process.env.NODE_ENV === "production";
|
|
1397
|
+
const serverUrl = isProduction2 ? `https://${config.domain}` : `http://localhost:${config.port}`;
|
|
1398
|
+
const response = {
|
|
1399
|
+
status,
|
|
1400
|
+
app: config.name,
|
|
1401
|
+
env: process.env.NODE_ENV || "development",
|
|
1402
|
+
version: config.version,
|
|
1403
|
+
urls: {
|
|
1404
|
+
...config.uiUrl && { ui: config.uiUrl },
|
|
1405
|
+
server: config.serverUrl || serverUrl,
|
|
1406
|
+
health: `${config.serverUrl || serverUrl}/health`
|
|
1407
|
+
},
|
|
1408
|
+
time: {
|
|
1409
|
+
serverTime: now.toISOString(),
|
|
1410
|
+
timezone: getTimezoneName(),
|
|
1411
|
+
offset: getTimezoneOffset(),
|
|
1412
|
+
epoch: Math.floor(now.getTime() / 1e3)
|
|
1413
|
+
},
|
|
1414
|
+
uptimeSec: Math.floor((Date.now() - serverStartTime) / 1e3),
|
|
1415
|
+
node: {
|
|
1416
|
+
version: process.version,
|
|
1417
|
+
platform: os.platform(),
|
|
1418
|
+
arch: os.arch()
|
|
1419
|
+
},
|
|
1420
|
+
system: {
|
|
1421
|
+
hostname: os.hostname(),
|
|
1422
|
+
memoryUsedMB: Math.round(usedMem / 1024 / 1024),
|
|
1423
|
+
memoryTotalMB: Math.round(totalMem / 1024 / 1024),
|
|
1424
|
+
memoryFreePercent: Math.round(freeMem / totalMem * 100),
|
|
1425
|
+
cpuLoad: os.loadavg().map((l) => Math.round(l * 100) / 100),
|
|
1426
|
+
cpuCount: os.cpus().length
|
|
1427
|
+
},
|
|
1428
|
+
packages: {
|
|
1429
|
+
appVersion: config.version,
|
|
1430
|
+
totalDependencies: packageInfo.total,
|
|
1431
|
+
critical: packageInfo.critical
|
|
1432
|
+
},
|
|
1433
|
+
dependencies,
|
|
1434
|
+
...config.infra && { infra: config.infra },
|
|
1435
|
+
responseTimeMs: Date.now() - startTime
|
|
1436
|
+
};
|
|
1437
|
+
return response;
|
|
1438
|
+
}
|
|
1439
|
+
function createHealthHandler(config) {
|
|
1440
|
+
return async (_req, res) => {
|
|
1441
|
+
try {
|
|
1442
|
+
const health = await generateHealthResponse(config);
|
|
1443
|
+
const statusCode2 = health.status === "UP" ? 200 : health.status === "DEGRADED" ? 200 : 503;
|
|
1444
|
+
res.status(statusCode2).json(health);
|
|
1445
|
+
} catch (error) {
|
|
1446
|
+
res.status(503).json({
|
|
1447
|
+
status: "DOWN",
|
|
1448
|
+
app: config.name,
|
|
1449
|
+
env: process.env.NODE_ENV || "development",
|
|
1450
|
+
version: config.version,
|
|
1451
|
+
error: error instanceof Error ? error.message : "Unknown error",
|
|
1452
|
+
time: {
|
|
1453
|
+
serverTime: (/* @__PURE__ */ new Date()).toISOString(),
|
|
1454
|
+
timezone: getTimezoneName(),
|
|
1455
|
+
offset: getTimezoneOffset(),
|
|
1456
|
+
epoch: Math.floor(Date.now() / 1e3)
|
|
1457
|
+
}
|
|
1458
|
+
});
|
|
1459
|
+
}
|
|
1460
|
+
};
|
|
1461
|
+
}
|
|
1462
|
+
function createRootHandler(config) {
|
|
1463
|
+
return async (_req, res) => {
|
|
1464
|
+
try {
|
|
1465
|
+
const health = await generateHealthResponse(config);
|
|
1466
|
+
res.json({
|
|
1467
|
+
message: `Welcome to ${config.name}`,
|
|
1468
|
+
description: config.description || `${config.name} API Server`,
|
|
1469
|
+
...config.endpoints && { endpoints: config.endpoints },
|
|
1470
|
+
...health
|
|
1471
|
+
});
|
|
1472
|
+
} catch (error) {
|
|
1473
|
+
res.status(503).json({
|
|
1474
|
+
status: "DOWN",
|
|
1475
|
+
app: config.name,
|
|
1476
|
+
error: error instanceof Error ? error.message : "Unknown error"
|
|
1477
|
+
});
|
|
1478
|
+
}
|
|
1479
|
+
};
|
|
1480
|
+
}
|
|
1336
1481
|
|
|
1337
1482
|
// src/server/configs/cors.config.ts
|
|
1338
1483
|
var DEFAULT_CORS_CONFIG = {
|
|
@@ -1614,6 +1759,8 @@ var createApiRateLimiter = (config = {}, options = {}) => {
|
|
|
1614
1759
|
});
|
|
1615
1760
|
};
|
|
1616
1761
|
var RateLimiterBuilder = class {
|
|
1762
|
+
config;
|
|
1763
|
+
options;
|
|
1617
1764
|
constructor(preset = "STANDARD") {
|
|
1618
1765
|
const presetConfig = DEFAULT_RATE_LIMIT_TIERS[preset];
|
|
1619
1766
|
this.config = {
|
|
@@ -1815,6 +1962,7 @@ function deepMerge(target, source) {
|
|
|
1815
1962
|
return result;
|
|
1816
1963
|
}
|
|
1817
1964
|
var ConfigBuilder = class {
|
|
1965
|
+
config;
|
|
1818
1966
|
constructor() {
|
|
1819
1967
|
this.config = {
|
|
1820
1968
|
server: { ...DEFAULT_SERVER_CONFIG },
|
|
@@ -1994,6 +2142,6 @@ var getDatabaseOptions = (config) => {
|
|
|
1994
2142
|
};
|
|
1995
2143
|
};
|
|
1996
2144
|
|
|
1997
|
-
export { ConfigBuilder, DEFAULT_AUTH_CONFIG, DEFAULT_CORS_CONFIG, DEFAULT_CORS_ORIGINS, DEFAULT_DATABASE_CONFIG, DEFAULT_LOGGING_CONFIG, DEFAULT_RATE_LIMIT_CONFIG, DEFAULT_RATE_LIMIT_TIERS, DEFAULT_SERVER_CONFIG, EXYCONN_CORS_CONFIG, PERMISSIVE_CORS_CONFIG, RATE_LIMIT_CONFIG, RateLimiterBuilder, STRICT_CORS_CONFIG, StatusCode, StatusMessage, authenticateApiKey, authenticateJWT, badRequestResponse, buildConfig, buildDeleteFilter, buildFilter, buildPagination, buildPaginationMeta, checkPackageServer, conflictResponse, connectDB, corsOptions, createApiKeyGenerator, createApiRateLimiter, createBrandCorsOptions, createBulkDeleteHandler, createConfig, createCorsOptions, createCrudControllers, createDdosRateLimiter, createLogger, createMorganStream, createMultiBrandCorsOptions, createPaginationMiddleware, createPrefixedKeyGenerator, createRateLimiter, createStandardRateLimiter, createStrictRateLimiter, createUserKeyGenerator, createdResponse, ddosProtectionLimiter, defaultKeyGenerator, disconnectDB, errorResponse, extractColumns, extractOrganization, extractSchemaMeta, forbiddenResponse, formatPackageCheckResult, generateNcuCommand, getConnectionStatus, getDatabaseOptions, isDevelopment, isProduction, isTest, logger, noContentResponse, notFoundResponse, omitFields, optionalAuthenticateJWT, packageCheckServer, parseBulkDelete, pickFields, printPackageCheckSummary, queryPagination, queryParser, rateLimitResponse, rateLimiter, requireOrganization, sanitizeDocument, sanitizeUser, simpleLogger, standardRateLimiter, statusCode, statusMessage, stream, strictRateLimiter, successResponse, successResponseArr, unauthorizedResponse, validationErrorResponse };
|
|
2145
|
+
export { ConfigBuilder, DEFAULT_AUTH_CONFIG, DEFAULT_CORS_CONFIG, DEFAULT_CORS_ORIGINS, DEFAULT_DATABASE_CONFIG, DEFAULT_LOGGING_CONFIG, DEFAULT_RATE_LIMIT_CONFIG, DEFAULT_RATE_LIMIT_TIERS, DEFAULT_SERVER_CONFIG, EXYCONN_CORS_CONFIG, PERMISSIVE_CORS_CONFIG, RATE_LIMIT_CONFIG, RateLimiterBuilder, STRICT_CORS_CONFIG, StatusCode, StatusMessage, authenticateApiKey, authenticateJWT, badRequestResponse, buildConfig, buildDeleteFilter, buildFilter, buildPagination, buildPaginationMeta, checkPackageServer, conflictResponse, connectDB, corsOptions, createApiKeyGenerator, createApiRateLimiter, createBrandCorsOptions, createBulkDeleteHandler, createConfig, createCorsOptions, createCrudControllers, createDdosRateLimiter, createHealthHandler, createLogger, createMorganStream, createMultiBrandCorsOptions, createPaginationMiddleware, createPrefixedKeyGenerator, createRateLimiter, createRootHandler, createStandardRateLimiter, createStrictRateLimiter, createUserKeyGenerator, createdResponse, ddosProtectionLimiter, defaultKeyGenerator, disconnectDB, errorResponse, extractColumns, extractOrganization, extractSchemaMeta, forbiddenResponse, formatPackageCheckResult, generateHealthResponse, generateNcuCommand, getConnectionStatus, getDatabaseOptions, isDevelopment, isProduction, isTest, logger, noContentResponse, notFoundResponse, omitFields, optionalAuthenticateJWT, packageCheckServer, parseBulkDelete, pickFields, printPackageCheckSummary, queryPagination, queryParser, rateLimitResponse, rateLimiter, requireOrganization, sanitizeDocument, sanitizeUser, simpleLogger, standardRateLimiter, statusCode, statusMessage, stream, strictRateLimiter, successResponse, successResponseArr, unauthorizedResponse, validationErrorResponse };
|
|
1998
2146
|
//# sourceMappingURL=index.mjs.map
|
|
1999
2147
|
//# sourceMappingURL=index.mjs.map
|