@exyconn/common 2.3.3 → 2.3.5

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.
@@ -1,9 +1,10 @@
1
1
  import winston from 'winston';
2
2
  import DailyRotateFile from 'winston-daily-rotate-file';
3
- import path, { resolve } from 'path';
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: path.join(finalConfig.logsDir, "combined-%DATE%.log"),
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: path.join(finalConfig.logsDir, "error-%DATE%.log"),
228
+ filename: path2.join(finalConfig.logsDir, "error-%DATE%.log"),
228
229
  datePattern: "YYYY-MM-DD",
229
230
  level: "error",
230
231
  maxSize: finalConfig.maxSize,
@@ -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 = {
@@ -1994,6 +2139,6 @@ var getDatabaseOptions = (config) => {
1994
2139
  };
1995
2140
  };
1996
2141
 
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 };
2142
+ 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
2143
  //# sourceMappingURL=index.mjs.map
1999
2144
  //# sourceMappingURL=index.mjs.map