@scpxl/nodejs-framework 1.0.49 → 1.0.56
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/README.md +12 -7
- package/dist/api-requester/api-requester.js +1 -1
- package/dist/api-requester/api-requester.js.map +2 -2
- package/dist/api-requester/index.d.ts +1 -1
- package/dist/api-requester/index.d.ts.map +1 -1
- package/dist/api-requester/index.js.map +2 -2
- package/dist/application/base-application.d.ts +6 -5
- package/dist/application/base-application.d.ts.map +1 -1
- package/dist/application/base-application.interface.d.ts +2 -4
- package/dist/application/base-application.interface.d.ts.map +1 -1
- package/dist/application/base-application.js +23 -14
- package/dist/application/base-application.js.map +2 -2
- package/dist/application/command-application.d.ts.map +1 -1
- package/dist/application/command-application.js +2 -2
- package/dist/application/command-application.js.map +2 -2
- package/dist/application/index.d.ts +3 -3
- package/dist/application/index.d.ts.map +1 -1
- package/dist/application/index.js +4 -4
- package/dist/application/index.js.map +2 -2
- package/dist/application/web-application.d.ts +5 -5
- package/dist/application/web-application.d.ts.map +1 -1
- package/dist/application/web-application.js +6 -7
- package/dist/application/web-application.js.map +2 -2
- package/dist/application/worker-application.d.ts +2 -2
- package/dist/application/worker-application.d.ts.map +1 -1
- package/dist/application/worker-application.js +2 -2
- package/dist/application/worker-application.js.map +2 -2
- package/dist/auth/jwt.d.ts.map +1 -1
- package/dist/auth/jwt.js +2 -2
- package/dist/auth/jwt.js.map +2 -2
- package/dist/cache/manager.d.ts.map +1 -1
- package/dist/cache/manager.js.map +2 -2
- package/dist/cli/index.js +192 -7029
- package/dist/cli/index.js.map +4 -4
- package/dist/cluster/cluster-manager.d.ts.map +1 -1
- package/dist/cluster/cluster-manager.js +1 -1
- package/dist/cluster/cluster-manager.js.map +2 -2
- package/dist/command/command.d.ts +1 -1
- package/dist/command/command.d.ts.map +1 -1
- package/dist/command/command.js.map +2 -2
- package/dist/config/env.d.ts +1 -1
- package/dist/config/env.d.ts.map +1 -1
- package/dist/config/env.js.map +1 -1
- package/dist/config/index.d.ts +1 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +1 -1
- package/dist/config/index.js.map +1 -1
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +1 -1
- package/dist/config/schema.js.map +2 -2
- package/dist/database/dynamic-entity.js +9 -9
- package/dist/database/dynamic-entity.js.map +2 -2
- package/dist/database/index.d.ts +3 -3
- package/dist/database/index.d.ts.map +1 -1
- package/dist/database/index.js +5 -5
- package/dist/database/index.js.map +2 -2
- package/dist/database/instance.d.ts +3 -3
- package/dist/database/instance.js +3 -3
- package/dist/database/instance.js.map +1 -1
- package/dist/database/manager.d.ts +1 -0
- package/dist/database/manager.d.ts.map +1 -1
- package/dist/database/manager.js +16 -3
- package/dist/database/manager.js.map +2 -2
- package/dist/error/error-reporter.js +1 -1
- package/dist/error/error-reporter.js.map +2 -2
- package/dist/error/index.d.ts +2 -3
- package/dist/error/index.d.ts.map +1 -1
- package/dist/error/index.js +8 -9
- package/dist/error/index.js.map +2 -2
- package/dist/event/controller/base.d.ts +2 -2
- package/dist/event/controller/base.d.ts.map +1 -1
- package/dist/event/controller/base.js +2 -2
- package/dist/event/controller/base.js.map +2 -2
- package/dist/event/index.d.ts +3 -3
- package/dist/event/index.d.ts.map +1 -1
- package/dist/event/index.js +5 -5
- package/dist/event/index.js.map +2 -2
- package/dist/event/manager.d.ts.map +1 -1
- package/dist/event/manager.interface.d.ts +2 -3
- package/dist/event/manager.interface.d.ts.map +1 -1
- package/dist/event/manager.js.map +2 -2
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +2 -2
- package/dist/lifecycle/index.d.ts +3 -3
- package/dist/lifecycle/index.d.ts.map +1 -1
- package/dist/lifecycle/index.js +1 -1
- package/dist/lifecycle/index.js.map +2 -2
- package/dist/lifecycle/lifecycle-manager.d.ts +6 -0
- package/dist/lifecycle/lifecycle-manager.d.ts.map +1 -1
- package/dist/lifecycle/lifecycle-manager.js +28 -0
- package/dist/lifecycle/lifecycle-manager.js.map +2 -2
- package/dist/logger/logger.d.ts +20 -1
- package/dist/logger/logger.d.ts.map +1 -1
- package/dist/logger/logger.js +68 -96
- package/dist/logger/logger.js.map +2 -2
- package/dist/performance/cache-performance.d.ts.map +1 -1
- package/dist/performance/cache-performance.js +1 -1
- package/dist/performance/cache-performance.js.map +2 -2
- package/dist/performance/database-performance.d.ts.map +1 -1
- package/dist/performance/database-performance.js +1 -1
- package/dist/performance/database-performance.js.map +2 -2
- package/dist/performance/index.d.ts +3 -3
- package/dist/performance/index.d.ts.map +1 -1
- package/dist/performance/index.js +3 -3
- package/dist/performance/index.js.map +1 -1
- package/dist/performance/performance-monitor.js +2 -2
- package/dist/performance/performance-monitor.js.map +2 -2
- package/dist/performance/performance-monitor.plugin.d.ts.map +1 -1
- package/dist/performance/performance-monitor.plugin.js +1 -1
- package/dist/performance/performance-monitor.plugin.js.map +2 -2
- package/dist/performance/queue-performance.d.ts.map +1 -1
- package/dist/performance/queue-performance.js +1 -1
- package/dist/performance/queue-performance.js.map +2 -2
- package/dist/performance/webserver-performance.d.ts.map +1 -1
- package/dist/performance/webserver-performance.js +1 -1
- package/dist/performance/webserver-performance.js.map +2 -2
- package/dist/performance/websocket-performance.d.ts.map +1 -1
- package/dist/performance/websocket-performance.js +1 -1
- package/dist/performance/websocket-performance.js.map +2 -2
- package/dist/queue/index.d.ts +2 -2
- package/dist/queue/index.d.ts.map +1 -1
- package/dist/queue/index.interface.d.ts +1 -1
- package/dist/queue/index.interface.d.ts.map +1 -1
- package/dist/queue/index.js.map +2 -2
- package/dist/queue/manager.d.ts +9 -2
- package/dist/queue/manager.d.ts.map +1 -1
- package/dist/queue/manager.js +44 -6
- package/dist/queue/manager.js.map +2 -2
- package/dist/queue/processor/base.d.ts +5 -5
- package/dist/queue/processor/base.d.ts.map +1 -1
- package/dist/queue/processor/base.js +2 -2
- package/dist/queue/processor/base.js.map +2 -2
- package/dist/queue/processor/processor.interface.d.ts +3 -3
- package/dist/queue/processor/processor.interface.d.ts.map +1 -1
- package/dist/queue/worker.d.ts +5 -0
- package/dist/queue/worker.d.ts.map +1 -1
- package/dist/queue/worker.interface.d.ts +1 -1
- package/dist/queue/worker.interface.d.ts.map +1 -1
- package/dist/queue/worker.js +9 -1
- package/dist/queue/worker.js.map +2 -2
- package/dist/redis/index.d.ts +1 -1
- package/dist/redis/index.d.ts.map +1 -1
- package/dist/redis/index.js +5 -4
- package/dist/redis/index.js.map +2 -2
- package/dist/redis/instance.js +1 -1
- package/dist/redis/instance.js.map +2 -2
- package/dist/redis/manager.d.ts +7 -1
- package/dist/redis/manager.d.ts.map +1 -1
- package/dist/redis/manager.js +20 -4
- package/dist/redis/manager.js.map +2 -2
- package/dist/request-context/index.d.ts +1 -1
- package/dist/request-context/index.d.ts.map +1 -1
- package/dist/request-context/index.js +5 -5
- package/dist/request-context/index.js.map +1 -1
- package/dist/schemas/entity-builder.d.ts +3 -3
- package/dist/schemas/entity-builder.d.ts.map +1 -1
- package/dist/schemas/entity-builder.js.map +1 -1
- package/dist/services/aws/s3.d.ts.map +1 -1
- package/dist/services/aws/s3.js +7 -10
- package/dist/services/aws/s3.js.map +2 -2
- package/dist/util/file.d.ts +13 -8
- package/dist/util/file.d.ts.map +1 -1
- package/dist/util/file.js +6 -28
- package/dist/util/file.js.map +2 -2
- package/dist/util/helper.js +2 -2
- package/dist/util/helper.js.map +2 -2
- package/dist/util/index.d.ts +2 -2
- package/dist/util/index.d.ts.map +1 -1
- package/dist/util/index.js +18 -18
- package/dist/util/index.js.map +2 -2
- package/dist/util/loader.js +3 -3
- package/dist/util/loader.js.map +2 -2
- package/dist/util/os.js +2 -2
- package/dist/util/os.js.map +2 -2
- package/dist/webserver/controller/auth-middleware.d.ts +1 -1
- package/dist/webserver/controller/auth-middleware.d.ts.map +1 -1
- package/dist/webserver/controller/auth-middleware.js +1 -1
- package/dist/webserver/controller/auth-middleware.js.map +2 -2
- package/dist/webserver/controller/base.d.ts +6 -6
- package/dist/webserver/controller/base.d.ts.map +1 -1
- package/dist/webserver/controller/base.interface.d.ts +1 -1
- package/dist/webserver/controller/base.interface.d.ts.map +1 -1
- package/dist/webserver/controller/base.js +4 -4
- package/dist/webserver/controller/base.js.map +2 -2
- package/dist/webserver/controller/entity.d.ts +4 -3
- package/dist/webserver/controller/entity.d.ts.map +1 -1
- package/dist/webserver/controller/entity.js +26 -17
- package/dist/webserver/controller/entity.js.map +2 -2
- package/dist/webserver/controller/example-auth.d.ts.map +1 -1
- package/dist/webserver/controller/example-auth.js +1 -1
- package/dist/webserver/controller/example-auth.js.map +2 -2
- package/dist/webserver/controller/health.d.ts.map +1 -1
- package/dist/webserver/controller/health.js +1 -1
- package/dist/webserver/controller/health.js.map +2 -2
- package/dist/webserver/define-action.d.ts +1 -1
- package/dist/webserver/define-action.d.ts.map +1 -1
- package/dist/webserver/define-action.js.map +1 -1
- package/dist/webserver/define-route.d.ts +1 -1
- package/dist/webserver/define-route.d.ts.map +1 -1
- package/dist/webserver/define-route.js.map +2 -2
- package/dist/webserver/index.d.ts +9 -9
- package/dist/webserver/index.d.ts.map +1 -1
- package/dist/webserver/index.js +14 -14
- package/dist/webserver/index.js.map +2 -2
- package/dist/webserver/webserver.d.ts +3 -3
- package/dist/webserver/webserver.d.ts.map +1 -1
- package/dist/webserver/webserver.interface.d.ts +5 -5
- package/dist/webserver/webserver.interface.d.ts.map +1 -1
- package/dist/webserver/webserver.interface.js.map +1 -1
- package/dist/webserver/webserver.js +9 -9
- package/dist/webserver/webserver.js.map +2 -2
- package/dist/websocket/controller/server/base.d.ts +2 -2
- package/dist/websocket/controller/server/base.js.map +1 -1
- package/dist/websocket/controllers/server/system.d.ts.map +1 -1
- package/dist/websocket/controllers/server/system.js +1 -1
- package/dist/websocket/controllers/server/system.js.map +2 -2
- package/dist/websocket/index.d.ts +9 -11
- package/dist/websocket/index.d.ts.map +1 -1
- package/dist/websocket/index.js +22 -22
- package/dist/websocket/index.js.map +2 -2
- package/dist/websocket/subscriber-middleware.d.ts.map +1 -1
- package/dist/websocket/subscriber-middleware.js.map +2 -2
- package/dist/websocket/subscriber-utils.d.ts.map +1 -1
- package/dist/websocket/subscriber-utils.js.map +2 -2
- package/dist/websocket/utils.d.ts.map +1 -1
- package/dist/websocket/utils.js +4 -2
- package/dist/websocket/utils.js.map +2 -2
- package/dist/websocket/websocket-auth.d.ts.map +1 -1
- package/dist/websocket/websocket-auth.js +3 -3
- package/dist/websocket/websocket-auth.js.map +2 -2
- package/dist/websocket/websocket-base.d.ts +2 -2
- package/dist/websocket/websocket-base.d.ts.map +1 -1
- package/dist/websocket/websocket-base.js +1 -1
- package/dist/websocket/websocket-base.js.map +2 -2
- package/dist/websocket/websocket-client-manager.d.ts +2 -0
- package/dist/websocket/websocket-client-manager.d.ts.map +1 -1
- package/dist/websocket/websocket-client-manager.js +11 -4
- package/dist/websocket/websocket-client-manager.js.map +2 -2
- package/dist/websocket/websocket-client.d.ts +10 -5
- package/dist/websocket/websocket-client.d.ts.map +1 -1
- package/dist/websocket/websocket-client.js +27 -5
- package/dist/websocket/websocket-client.js.map +2 -2
- package/dist/websocket/websocket-room-manager.js +1 -1
- package/dist/websocket/websocket-room-manager.js.map +1 -1
- package/dist/websocket/websocket-server.d.ts +7 -7
- package/dist/websocket/websocket-server.d.ts.map +1 -1
- package/dist/websocket/websocket-server.js +25 -20
- package/dist/websocket/websocket-server.js.map +2 -2
- package/dist/websocket/websocket-service.d.ts +2 -2
- package/dist/websocket/websocket-service.d.ts.map +1 -1
- package/dist/websocket/websocket-service.js +1 -1
- package/dist/websocket/websocket-service.js.map +2 -2
- package/dist/websocket/websocket.interface.d.ts +3 -5
- package/dist/websocket/websocket.interface.d.ts.map +1 -1
- package/dist/websocket/websocket.interface.js.map +2 -2
- package/package.json +68 -64
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cluster-manager.d.ts","sourceRoot":"","sources":["../../src/cluster/cluster-manager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cluster-manager.d.ts","sourceRoot":"","sources":["../../src/cluster/cluster-manager.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAEV,mBAAmB,EAEpB,MAAM,gCAAgC,CAAC;AAExC,MAAM,CAAC,OAAO,OAAO,cAAc;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuB;IAE9C,OAAO,CAAC,wBAAwB,CAAsB;IACtD,OAAO,CAAC,uBAAuB,CAAsB;IAErD,OAAO,CAAC,eAAe,CAA2C;IAClE,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,kBAAkB,CAAK;IAC/B,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,aAAa,CAAC,CAAiB;gBAE3B,EAAE,MAAM,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,EAAE,mBAAmB;IAOvF,KAAK,IAAI,IAAI;IAUpB,OAAO,CAAC,YAAY;YAiDN,WAAW;IAkBzB,OAAO,CAAC,cAAc;YAMR,gBAAgB;CA2D/B"}
|
|
@@ -2,8 +2,8 @@ var __defProp = Object.defineProperty;
|
|
|
2
2
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
3
|
import cluster from "node:cluster";
|
|
4
4
|
import { cpus } from "node:os";
|
|
5
|
-
import { Logger } from "../logger/index.js";
|
|
6
5
|
import { requestExit } from "../lifecycle/exit.js";
|
|
6
|
+
import { Logger } from "../logger/index.js";
|
|
7
7
|
class ClusterManager {
|
|
8
8
|
static {
|
|
9
9
|
__name(this, "ClusterManager");
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/cluster/cluster-manager.ts"],
|
|
4
|
-
"sourcesContent": ["import cluster from 'node:cluster';\nimport { cpus } from 'node:os';\nimport
|
|
5
|
-
"mappings": ";;AAAA,OAAO,aAAa;AACpB,SAAS,YAAY;
|
|
4
|
+
"sourcesContent": ["import cluster from 'node:cluster';\nimport { cpus } from 'node:os';\nimport { requestExit } from '../lifecycle/exit.js';\nimport { Logger } from '../logger/index.js';\nimport type {\n ClusterManagerConfig,\n ClusterManagerProps,\n ClusterManagerWorkerModeManualConfig,\n} from './cluster-manager.interface.js';\n\nexport default class ClusterManager {\n private readonly config: ClusterManagerConfig;\n\n private startApplicationCallback: () => Promise<void>;\n private stopApplicationCallback: () => Promise<void>;\n\n private shutdownSignals: NodeJS.Signals[] = ['SIGTERM', 'SIGINT'];\n private isShuttingDown = false;\n private initialWorkerCount = 0;\n private shutdownTimeout = 30000; // 30 seconds\n private shutdownTimer?: NodeJS.Timeout;\n\n constructor({ config, startApplicationCallback, stopApplicationCallback }: ClusterManagerProps) {\n this.config = config;\n\n this.startApplicationCallback = startApplicationCallback;\n this.stopApplicationCallback = stopApplicationCallback;\n }\n\n public start(): void {\n if (cluster.isPrimary) {\n this.setupPrimary();\n } else {\n this.setupWorker();\n }\n\n this.handleShutdown();\n }\n\n private setupPrimary(): void {\n const numCPUs: number = cpus().length;\n\n const numClusterWorkers =\n this.config.workerMode === 'auto' ? numCPUs : (this.config as ClusterManagerWorkerModeManualConfig).workerCount;\n\n // Track initial worker count for shutdown\n this.initialWorkerCount = numClusterWorkers;\n\n for (let workerIndex = 0; workerIndex < numClusterWorkers; workerIndex++) {\n cluster.fork();\n }\n\n cluster.on('online', worker => {\n Logger.debug({\n message: 'Started cluster worker',\n meta: {\n ID: worker.id,\n PID: worker.process.pid,\n },\n });\n });\n\n cluster.on('exit', (worker, code, signal) => {\n if (!this.isShuttingDown) {\n // Restart worker on unexpected exit\n Logger.warn({\n message: 'Cluster worker died unexpectedly, restarting',\n meta: {\n ID: worker.id,\n PID: worker.process.pid,\n exitCode: code,\n signal,\n },\n });\n cluster.fork();\n }\n });\n\n Logger.debug({\n message: 'Started cluster master',\n meta: {\n Mode: this.config.workerMode,\n 'Worker Count': numClusterWorkers,\n CPUs: numCPUs,\n },\n });\n }\n\n private async setupWorker(): Promise<void> {\n await this.startApplicationCallback();\n\n process.on('message', async message => {\n if (message === 'shutdown') {\n Logger.debug({\n message: 'Worker received shutdown message, stopping...',\n meta: {\n PID: process.pid,\n },\n });\n\n // Stop application\n await this.stopApplicationCallback();\n }\n });\n }\n\n private handleShutdown(): void {\n this.shutdownSignals.forEach(signal => {\n process.on(signal, async () => await this.initiateShutdown());\n });\n }\n\n private async initiateShutdown(): Promise<void> {\n if (this.isShuttingDown) {\n return;\n }\n\n this.isShuttingDown = true;\n\n if (cluster.isPrimary) {\n Logger.info({\n message: 'Initiating cluster shutdown',\n meta: { workerCount: this.initialWorkerCount },\n });\n\n let exitedWorkers = 0;\n\n // Set up exit handler BEFORE sending shutdown messages to avoid race condition\n const exitHandler = () => {\n exitedWorkers++;\n\n Logger.debug({\n message: 'Cluster worker exited during shutdown',\n meta: { exitedWorkers, totalWorkers: this.initialWorkerCount },\n });\n\n if (exitedWorkers === this.initialWorkerCount) {\n if (this.shutdownTimer) {\n clearTimeout(this.shutdownTimer);\n }\n Logger.info({ message: 'All cluster workers exited gracefully' });\n requestExit({ code: 0, reason: 'cluster-workers-exited' });\n }\n };\n\n // Attach exit listener first\n cluster.on('exit', exitHandler);\n\n // Set shutdown timeout\n this.shutdownTimer = setTimeout(() => {\n Logger.warn({\n message: 'Cluster shutdown timeout reached, forcing exit',\n meta: {\n exitedWorkers,\n totalWorkers: this.initialWorkerCount,\n timeoutMs: this.shutdownTimeout,\n },\n });\n requestExit({ code: 1, reason: 'cluster-shutdown-timeout' });\n }, this.shutdownTimeout);\n\n // Now send shutdown messages to all workers\n Object.values(cluster.workers ?? {}).forEach(worker => {\n if (worker) {\n worker.send('shutdown');\n }\n });\n } else {\n await this.stopApplicationCallback();\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import type { ApplicationConfig } from '../application/base-application.interface.js';
|
|
2
2
|
import type DatabaseInstance from '../database/instance.js';
|
|
3
|
+
import { Logger } from '../logger/index.js';
|
|
3
4
|
import type { QueueManager } from '../queue/index.js';
|
|
4
5
|
import type RedisInstance from '../redis/instance.js';
|
|
5
6
|
import type { CommandConstructorParams } from './command.interface.js';
|
|
6
|
-
import { Logger } from '../logger/index.js';
|
|
7
7
|
export default abstract class Command {
|
|
8
8
|
/** Command name */
|
|
9
9
|
abstract name: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/command/command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8CAA8C,CAAC;AACtF,OAAO,KAAK,gBAAgB,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,aAAa,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/command/command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8CAA8C,CAAC;AACtF,OAAO,KAAK,gBAAgB,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,aAAa,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAEvE,MAAM,CAAC,OAAO,CAAC,QAAQ,OAAO,OAAO;IACnC,mBAAmB;IACnB,SAAgB,IAAI,EAAE,MAAM,CAAC;IAE7B,0BAA0B;IAC1B,SAAgB,WAAW,EAAE,MAAM,CAAC;IAEpC,SAAS,CAAC,iBAAiB,EAAE,iBAAiB,CAAC;IAE/C,SAAS,CAAC,aAAa,EAAE,aAAa,CAAC;IACvC,SAAS,CAAC,YAAY,EAAE,YAAY,CAAC;IACrC,SAAS,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;IAE7C,SAAS,CAAC,MAAM,EAAE,OAAO,MAAM,CAAC;gBAEpB,EAAE,iBAAiB,EAAE,aAAa,EAAE,YAAY,EAAE,gBAAgB,EAAE,EAAE,wBAAwB;IAU1G;;OAEG;aACa,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAElD;;OAEG;IACI,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;CAUlE"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/command/command.ts"],
|
|
4
|
-
"sourcesContent": ["import type { ApplicationConfig } from '../application/base-application.interface.js';\nimport type DatabaseInstance from '../database/instance.js';\nimport type { QueueManager } from '../queue/index.js';\nimport type RedisInstance from '../redis/instance.js';\nimport type { CommandConstructorParams } from './command.interface.js';\
|
|
5
|
-
"mappings": ";;
|
|
4
|
+
"sourcesContent": ["import type { ApplicationConfig } from '../application/base-application.interface.js';\nimport type DatabaseInstance from '../database/instance.js';\nimport { Logger } from '../logger/index.js';\nimport type { QueueManager } from '../queue/index.js';\nimport type RedisInstance from '../redis/instance.js';\nimport type { CommandConstructorParams } from './command.interface.js';\n\nexport default abstract class Command {\n /** Command name */\n public abstract name: string;\n\n /** Command description */\n public abstract description: string;\n\n protected applicationConfig: ApplicationConfig;\n\n protected redisInstance: RedisInstance;\n protected queueManager: QueueManager;\n protected databaseInstance: DatabaseInstance;\n\n protected logger: typeof Logger;\n\n constructor({ applicationConfig, redisInstance, queueManager, databaseInstance }: CommandConstructorParams) {\n this.applicationConfig = applicationConfig;\n\n this.redisInstance = redisInstance;\n this.queueManager = queueManager;\n this.databaseInstance = databaseInstance;\n\n this.logger = Logger;\n }\n\n /**\n * Run command\n */\n public abstract run(argv?: unknown): Promise<void>;\n\n /**\n * Log command message\n */\n public log(message: string, meta?: Record<string, unknown>): void {\n this.logger.custom({\n level: 'command',\n message,\n meta: {\n Command: this.name,\n ...meta,\n },\n });\n }\n}\n"],
|
|
5
|
+
"mappings": ";;AAEA,SAAS,cAAc;AAKvB,MAAO,QAA+B;AAAA,EAPtC,OAOsC;AAAA;AAAA;AAAA,EAO1B;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EAEV,YAAY,EAAE,mBAAmB,eAAe,cAAc,iBAAiB,GAA6B;AAC1G,SAAK,oBAAoB;AAEzB,SAAK,gBAAgB;AACrB,SAAK,eAAe;AACpB,SAAK,mBAAmB;AAExB,SAAK,SAAS;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAUO,IAAI,SAAiB,MAAsC;AAChE,SAAK,OAAO,OAAO;AAAA,MACjB,OAAO;AAAA,MACP;AAAA,MACA,MAAM;AAAA,QACJ,SAAS,KAAK;AAAA,QACd,GAAG;AAAA,MACL;AAAA,IACF,CAAC;AAAA,EACH;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/config/env.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { InferFrameworkConfig } from './schema.js';
|
|
2
2
|
/**
|
|
3
3
|
* Load a partial framework configuration from environment variables. This is intentionally
|
|
4
4
|
* conservative: only widely useful primitives are supported. Complex structures (e.g. routes)
|
package/dist/config/env.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/config/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/config/env.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAsBxD;;;;;;GAMG;AACH,wBAAgB,0BAA0B,IAAI,OAAO,CAAC,oBAAoB,CAAC,CA6F1E;AAED,iEAAiE"}
|
package/dist/config/env.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/config/env.ts"],
|
|
4
|
-
"sourcesContent": ["import {
|
|
4
|
+
"sourcesContent": ["import type { InferFrameworkConfig } from './schema.js';\n\n// Helper to parse booleans like 'true', '1', 'yes'\nfunction parseBool(v: string | undefined): boolean | undefined {\n if (v == null) return undefined;\n return /^(true|1|yes|on)$/i.test(v);\n}\n\nfunction parseIntEnv(v: string | undefined): number | undefined {\n if (v == null) return undefined;\n const n = Number(v);\n return Number.isFinite(n) ? n : undefined;\n}\n\nfunction splitCsv(v: string | undefined): string[] | undefined {\n if (!v) return undefined;\n return v\n .split(',')\n .map(s => s.trim())\n .filter(Boolean);\n}\n\n/**\n * Load a partial framework configuration from environment variables. This is intentionally\n * conservative: only widely useful primitives are supported. Complex structures (e.g. routes)\n * should be defined in code and merged before validation.\n *\n * Naming convention: PXL_<SECTION>_<FIELD>\n */\nexport function loadFrameworkConfigFromEnv(): Partial<InferFrameworkConfig> {\n const env = process.env;\n\n const redis = {\n host: env.PXL_REDIS_HOST,\n port: parseIntEnv(env.PXL_REDIS_PORT),\n password: env.PXL_REDIS_PASSWORD,\n };\n if (!redis.host) delete (redis as any).host; // allow omission\n if (!redis.port) delete (redis as any).port;\n if (!redis.password) delete (redis as any).password;\n\n const databaseEnabled = parseBool(env.PXL_DB_ENABLED);\n const database = {\n enabled: databaseEnabled,\n host: env.PXL_DB_HOST,\n port: parseIntEnv(env.PXL_DB_PORT),\n username: env.PXL_DB_USERNAME,\n password: env.PXL_DB_PASSWORD,\n databaseName: env.PXL_DB_NAME,\n entitiesDirectory: env.PXL_DB_ENTITIES_DIR,\n };\n // prune undefined fields so Zod defaults/optionals apply\n const databaseFinal = {\n ...(database.enabled !== undefined ? { enabled: database.enabled } : {}),\n ...(database.host ? { host: database.host } : {}),\n ...(database.port !== undefined ? { port: database.port } : {}),\n ...(database.username ? { username: database.username } : {}),\n ...(database.password ? { password: database.password } : {}),\n ...(database.databaseName ? { databaseName: database.databaseName } : {}),\n ...(database.entitiesDirectory ? { entitiesDirectory: database.entitiesDirectory } : {}),\n } as any;\n const hasDatabaseConfig = Object.keys(databaseFinal).length > 0;\n\n const queueProcessorsDirectory = env.PXL_QUEUE_PROCESSORS_DIR;\n const queueQueues = splitCsv(env.PXL_QUEUE_QUEUES)?.map(name => ({ name, jobs: [] }));\n const queue: any = {};\n if (queueProcessorsDirectory) queue.processorsDirectory = queueProcessorsDirectory;\n if (queueQueues) queue.queues = queueQueues;\n\n const webEnabled = parseBool(env.PXL_WEB_ENABLED);\n const webCorsEnabled = parseBool(env.PXL_WEB_CORS_ENABLED);\n const webCorsUrls = splitCsv(env.PXL_WEB_CORS_URLS);\n const webBodyLimit = parseIntEnv(env.PXL_WEB_BODY_LIMIT);\n const webPort = parseIntEnv(env.PXL_WEB_PORT);\n const web: any = {};\n if (webEnabled !== undefined) web.enabled = webEnabled;\n if (env.PXL_WEB_HOST) web.host = env.PXL_WEB_HOST;\n if (webPort !== undefined) web.port = webPort;\n if (webBodyLimit !== undefined) web.bodyLimit = webBodyLimit;\n if (webCorsEnabled || (webCorsUrls && webCorsUrls.length > 0)) {\n web.cors = { enabled: webCorsEnabled ?? true, urls: webCorsUrls ?? [] };\n }\n\n const auth: any = {};\n if (env.PXL_AUTH_JWT_SECRET_KEY) auth.jwtSecretKey = env.PXL_AUTH_JWT_SECRET_KEY;\n\n const cluster: any = {};\n const clusterEnabled = parseBool(env.PXL_CLUSTER_ENABLED);\n if (clusterEnabled !== undefined) cluster.enabled = clusterEnabled;\n const clusterWorkers = parseIntEnv(env.PXL_CLUSTER_WORKERS);\n if (clusterWorkers !== undefined) cluster.workers = clusterWorkers;\n if (Object.keys(cluster).length === 0) {\n // leave cluster undefined later\n }\n\n const performanceMonitoring: any = {};\n const perfEnabled = parseBool(env.PXL_PERF_ENABLED);\n if (perfEnabled !== undefined) performanceMonitoring.enabled = perfEnabled;\n const perfInterval = parseIntEnv(env.PXL_PERF_REPORT_INTERVAL_MS);\n if (perfInterval !== undefined) performanceMonitoring.reportInterval = perfInterval;\n if (Object.keys(performanceMonitoring).length === 0) {\n // leave undefined later\n }\n\n const name = env.PXL_NAME;\n const instanceId = env.PXL_INSTANCE_ID;\n const rootDirectory = env.PXL_ROOT_DIR;\n\n // assemble partial, removing empty objects\n const partial: Partial<InferFrameworkConfig> = {};\n if (name) partial.name = name;\n if (instanceId) partial.instanceId = instanceId;\n if (rootDirectory) partial.rootDirectory = rootDirectory;\n if (redis.host || redis.port || redis.password) partial.redis = redis as any;\n if (hasDatabaseConfig) partial.database = databaseFinal;\n if (Object.keys(queue).length > 0) partial.queue = queue;\n if (Object.keys(web).length > 0) partial.web = web;\n if (Object.keys(auth).length > 0) partial.auth = auth;\n if (Object.keys(cluster).length > 0) partial.cluster = cluster;\n if (Object.keys(performanceMonitoring).length > 0) partial.performanceMonitoring = performanceMonitoring;\n\n return partial;\n}\n\n/** Deep merge helper (shallow for primitives & plain objects) */\n// mergeConfig intentionally removed (security lint). If needed later, implement with explicit key lists.\n"],
|
|
5
5
|
"mappings": "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",
|
|
6
6
|
"names": ["name"]
|
|
7
7
|
}
|
package/dist/config/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC"}
|
package/dist/config/index.js
CHANGED
package/dist/config/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/config/index.ts"],
|
|
4
|
-
"sourcesContent": ["export * from './
|
|
4
|
+
"sourcesContent": ["export * from './env.js';\nexport * from './schema.js';\n"],
|
|
5
5
|
"mappings": "AAAA,cAAc;AACd,cAAc;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,iBAAiB;;;;iBAI5B,CAAC;AAGH,eAAO,MAAM,oBAAoB;;;;;;;;iBAUM,CAAC;AAGxC,eAAO,MAAM,oBAAoB;;;;;;;kBASpB,CAAC;AAEd,eAAO,MAAM,cAAc;;;iBAGzB,CAAC;AAEH,eAAO,MAAM,eAAe;;;;;;;iBAI1B,CAAC;AAEH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;iBAI5B,CAAC;AAGH,eAAO,MAAM,qBAAqB;;iBAEhC,CAAC;AAEH,eAAO,MAAM,iBAAiB;;;;;;iBAI5B,CAAC;AAGH,eAAO,MAAM,eAAe;;;kBAKf,CAAC;AAGd,eAAO,MAAM,2BAA2B;;;;;;iBAQ5B,CAAC;AAEb,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;iBAe5B,CAAC;AAGb,eAAO,MAAM,gBAAgB;;kBAIhB,CAAC;AAGd,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;kBA+BpB,CAAC;AAGd,eAAO,MAAM,oBAAoB;;;;;;;;;;iBAYjB,CAAC;AAEjB,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAgCwE,CAAC;AAG3G,eAAO,MAAM,oBAAoB;;;;;iBAK/B,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;iBAYtB,CAAC;AAGb,eAAO,MAAM,mBAAmB;;;iBAKpB,CAAC;AAGb,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAgBhC,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEzE,MAAM,WAAW,qBAAqB;IACpC,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,qBAAsB,SAAQ,KAAK;IACvC,MAAM,EAAE,qBAAqB,EAAE,CAAC;gBAC3B,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,qBAAqB,EAAE;CAK7D;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,OAAO,EAAE,QAAQ,GAAE,qBAA0B,GAAG,oBAAoB,CAUhH;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,qBAAqB,EAAE,GAAG,MAAM,CAE1E;AAED,eAAe,qBAAqB,CAAC"}
|
package/dist/config/schema.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
var __defProp = Object.defineProperty;
|
|
2
2
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
|
-
import { z } from "zod";
|
|
4
3
|
import crypto from "node:crypto";
|
|
4
|
+
import { z } from "zod";
|
|
5
5
|
const RedisConfigSchema = z.object({
|
|
6
6
|
host: z.string().min(1, "redis.host required"),
|
|
7
7
|
port: z.number().int().positive().default(6379),
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/config/schema.ts"],
|
|
4
|
-
"sourcesContent": ["import
|
|
5
|
-
"mappings": ";;AAAA,
|
|
4
|
+
"sourcesContent": ["import crypto from 'node:crypto';\nimport { z } from 'zod';\n\n// Redis configuration schema\nexport const RedisConfigSchema = z.object({\n host: z.string().min(1, 'redis.host required'),\n port: z.number().int().positive().default(6379),\n password: z.string().min(1).optional(),\n});\n\n// Database configuration schema\nexport const DatabaseConfigSchema = z\n .object({\n enabled: z.boolean().default(false),\n host: z.string().min(1, 'database.host required'),\n port: z.number().int().positive().default(5432),\n username: z.string().min(1, 'database.username required'),\n password: z.string().min(1, 'database.password required'),\n databaseName: z.string().min(1, 'database.databaseName required'),\n entitiesDirectory: z.string().min(1).optional(),\n })\n .partial({ entitiesDirectory: true });\n\n// Queue configuration schema\nexport const QueueLogConfigSchema = z\n .object({\n jobRegistered: z.boolean().optional(),\n jobAdded: z.boolean().optional(),\n jobCompleted: z.boolean().optional(),\n queueRegistered: z.boolean().optional(),\n queuesRegistered: z.boolean().optional(),\n queueWaiting: z.boolean().optional(),\n })\n .optional();\n\nexport const QueueJobSchema = z.object({\n id: z.string().min(1),\n maxConcurrency: z.number().int().positive().optional(),\n});\n\nexport const QueueItemSchema = z.object({\n name: z.string(),\n isExternal: z.boolean().optional(),\n jobs: z.array(QueueJobSchema).default([]),\n});\n\nexport const QueueConfigSchema = z.object({\n queues: z.array(QueueItemSchema).default([]),\n processorsDirectory: z.string().min(1, 'queue.processorsDirectory required'),\n log: QueueLogConfigSchema,\n});\n\n// Event configuration schema\nexport const EventDefinitionSchema = z.object({\n name: z.string().min(1),\n});\n\nexport const EventConfigSchema = z.object({\n enabled: z.boolean().default(false),\n controllersDirectory: z.string().min(1),\n events: z.array(EventDefinitionSchema).default([]),\n});\n\n// Log configuration schema\nexport const LogConfigSchema = z\n .object({\n startUp: z.boolean().optional(),\n shutdown: z.boolean().optional(),\n })\n .optional();\n\n// Performance monitoring schema\nexport const PerformanceThresholdsSchema = z\n .object({\n httpMs: z.number().int().positive().optional(),\n dbMs: z.number().int().positive().optional(),\n queueMs: z.number().int().positive().optional(),\n cacheMs: z.number().int().positive().optional(),\n wsMs: z.number().int().positive().optional(),\n })\n .partial();\n\nexport const PerformanceMonitoringSchema = z\n .object({\n enabled: z.boolean().default(false),\n thresholds: PerformanceThresholdsSchema.optional(),\n maxMetricsHistory: z.number().int().positive().optional(),\n logSlowOperations: z.boolean().optional(),\n logAllOperations: z.boolean().optional(),\n monitorHttpRequests: z.boolean().default(true).optional(),\n monitorDatabaseOperations: z.boolean().default(true).optional(),\n monitorWebSocketOperations: z.boolean().default(true).optional(),\n monitorQueueOperations: z.boolean().default(true).optional(),\n monitorCacheOperations: z.boolean().default(true).optional(),\n reportInterval: z.number().int().positive().default(60_000).optional(),\n reportFormat: z.enum(['simple', 'detailed']).default('simple').optional(),\n })\n .partial();\n\n// Auth configuration schema\nexport const AuthConfigSchema = z\n .object({\n jwtSecretKey: z.string().min(1, 'auth.jwtSecretKey required'),\n })\n .optional();\n\n// Security configuration schema\nexport const SecurityConfigSchema = z\n .object({\n helmet: z\n .object({\n enabled: z.boolean().optional(),\n contentSecurityPolicy: z.boolean().optional(),\n crossOriginEmbedderPolicy: z.boolean().optional(),\n crossOriginOpenerPolicy: z.boolean().optional(),\n crossOriginResourcePolicy: z.boolean().optional(),\n dnsPrefetchControl: z.boolean().optional(),\n frameguard: z.boolean().optional(),\n hidePoweredBy: z.boolean().optional(),\n hsts: z.boolean().optional(),\n ieNoOpen: z.boolean().optional(),\n noSniff: z.boolean().optional(),\n originAgentCluster: z.boolean().optional(),\n permittedCrossDomainPolicies: z.boolean().optional(),\n referrerPolicy: z.boolean().optional(),\n xssFilter: z.boolean().optional(),\n })\n .optional(),\n rateLimit: z\n .object({\n enabled: z.boolean().optional(),\n max: z.number().int().positive().optional(),\n timeWindow: z.string().optional(),\n ban: z.number().int().optional(),\n cache: z.number().int().optional(),\n })\n .optional(),\n })\n .optional();\n\n// Web server configuration schema\nexport const WebServerRouteSchema = z\n .object({\n type: z.string().optional(),\n method: z.union([z.string(), z.array(z.string())]).optional(),\n path: z.string(),\n controller: z.unknown().optional(), // Controller class reference\n controllerName: z.string().optional(),\n action: z.string().optional(),\n entityName: z.string().optional(),\n handler: z.unknown().optional(),\n schema: z.unknown().optional(),\n })\n .passthrough(); // Allow additional properties to pass through\n\nexport const WebServerConfigSchema = z\n .object({\n enabled: z.boolean().default(false),\n host: z.string().default('0.0.0.0'),\n port: z.number().int().positive().default(3001),\n bodyLimit: z\n .number()\n .int()\n .positive()\n .default(25 * 1024 * 1024), // 25MB default (was 100MB)\n connectionTimeout: z\n .number()\n .int()\n .positive()\n .default(10 * 1000), // 10s default (was 30s)\n routes: z.array(WebServerRouteSchema).optional(),\n controllersDirectory: z.string().optional(), // Controllers directory path\n routesDirectory: z.string().optional(),\n cors: z\n .object({\n enabled: z.boolean().default(false),\n urls: z.array(z.string()).default([]),\n })\n .optional(),\n security: SecurityConfigSchema.optional(),\n debug: z\n .object({\n logAllRegisteredRoutes: z.boolean().optional(),\n })\n .default({})\n .optional(),\n })\n .partial({ cors: true, debug: true, controllersDirectory: true, routesDirectory: true, security: true });\n\n// WebSocket configuration schema\nexport const WebSocketRouteSchema = z.object({\n type: z.string().min(1, 'webSocket.routes.type required'),\n controllerName: z.string().min(1, 'webSocket.routes.controllerName required'),\n action: z.string().min(1, 'webSocket.routes.action required'),\n controller: z.unknown().optional(), // Controller class reference\n});\n\nexport const WebSocketConfigSchema = z\n .object({\n type: z.string().default('native'),\n enabled: z.boolean().default(false),\n routes: z.array(WebSocketRouteSchema).default([]),\n subscriberHandlers: z\n .object({\n directory: z.string().optional(),\n handlers: z.array(z.any()).optional(),\n })\n .optional(),\n })\n .partial();\n\n// Cluster configuration schema\nexport const ClusterConfigSchema = z\n .object({\n enabled: z.boolean().default(false),\n workers: z.number().int().positive().optional(),\n })\n .partial();\n\n// Top-level framework configuration schema\nexport const FrameworkConfigSchema = z.object({\n name: z.string().min(1, 'name required'),\n instanceId: z.string().default(() => crypto.randomUUID()),\n rootDirectory: z.string().min(1, 'rootDirectory required'),\n cluster: ClusterConfigSchema.optional(),\n redis: RedisConfigSchema,\n cache: z.object({}).optional(),\n database: DatabaseConfigSchema.optional(),\n queue: QueueConfigSchema,\n event: EventConfigSchema.optional(),\n log: LogConfigSchema,\n performanceMonitoring: PerformanceMonitoringSchema.optional(),\n email: z.object({}).optional(),\n auth: AuthConfigSchema,\n web: WebServerConfigSchema.optional(),\n webSocket: WebSocketConfigSchema.optional(),\n});\n\nexport type InferFrameworkConfig = z.infer<typeof FrameworkConfigSchema>;\n\nexport interface ValidateConfigOptions {\n collectAllErrors?: boolean; // Reserved for future use; Zod currently throws aggregate anyway\n}\n\nexport interface ValidationIssueDetail {\n path: string;\n message: string;\n}\n\nexport class ConfigValidationError extends Error {\n public issues: ValidationIssueDetail[];\n constructor(message: string, issues: ValidationIssueDetail[]) {\n super(message);\n this.name = 'ConfigValidationError';\n this.issues = issues;\n }\n}\n\nexport function validateFrameworkConfig(raw: unknown, _options: ValidateConfigOptions = {}): InferFrameworkConfig {\n const result = FrameworkConfigSchema.safeParse(raw);\n if (!result.success) {\n const issues: ValidationIssueDetail[] = result.error.issues.map(i => ({\n path: i.path.join('.') || '(root)',\n message: i.message,\n }));\n throw new ConfigValidationError('Invalid framework configuration', issues);\n }\n return result.data;\n}\n\nexport function formatConfigIssues(issues: ValidationIssueDetail[]): string {\n return issues.map(i => ` - ${i.path}: ${i.message}`).join('\\n');\n}\n\nexport default FrameworkConfigSchema;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -20,20 +20,20 @@ class DynamicEntity extends BaseEntity {
|
|
|
20
20
|
return "Items";
|
|
21
21
|
}
|
|
22
22
|
static get singularNameLowerCase() {
|
|
23
|
-
return
|
|
23
|
+
return DynamicEntity.singularName.toLowerCase();
|
|
24
24
|
}
|
|
25
25
|
static get pluralNameLowerCase() {
|
|
26
|
-
return
|
|
26
|
+
return DynamicEntity.pluralName.toLowerCase();
|
|
27
27
|
}
|
|
28
28
|
static get singularNameCapitalized() {
|
|
29
|
-
return
|
|
29
|
+
return DynamicEntity.singularName.charAt(0).toUpperCase() + DynamicEntity.singularName.slice(1).toLowerCase();
|
|
30
30
|
}
|
|
31
31
|
static get pluralNameCapitalized() {
|
|
32
|
-
return
|
|
32
|
+
return DynamicEntity.pluralName.charAt(0).toUpperCase() + DynamicEntity.pluralName.slice(1).toLowerCase();
|
|
33
33
|
}
|
|
34
34
|
static validateCreate(item) {
|
|
35
35
|
try {
|
|
36
|
-
return { value:
|
|
36
|
+
return { value: DynamicEntity.createSchema.parse(item) };
|
|
37
37
|
} catch (err) {
|
|
38
38
|
if (err instanceof z.ZodError) {
|
|
39
39
|
return { error: new Error(err.issues.map((i) => `${i.path.join(".")}: ${i.message}`).join(", ")) };
|
|
@@ -43,7 +43,7 @@ class DynamicEntity extends BaseEntity {
|
|
|
43
43
|
}
|
|
44
44
|
static validateUpdate(item) {
|
|
45
45
|
try {
|
|
46
|
-
return { value:
|
|
46
|
+
return { value: DynamicEntity.updateSchema.parse(item) };
|
|
47
47
|
} catch (err) {
|
|
48
48
|
if (err instanceof z.ZodError) {
|
|
49
49
|
return { error: new Error(err.issues.map((i) => `${i.path.join(".")}: ${i.message}`).join(", ")) };
|
|
@@ -62,10 +62,10 @@ class DynamicEntity extends BaseEntity {
|
|
|
62
62
|
requireAtLeastOneOnUpdate,
|
|
63
63
|
readAugment
|
|
64
64
|
});
|
|
65
|
-
|
|
66
|
-
|
|
65
|
+
DynamicEntity.createSchema = schemas.create;
|
|
66
|
+
DynamicEntity.updateSchema = schemas.update;
|
|
67
67
|
if (readAugment) {
|
|
68
|
-
|
|
68
|
+
DynamicEntity.readSchema = schemas.read;
|
|
69
69
|
}
|
|
70
70
|
}
|
|
71
71
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/database/dynamic-entity.ts"],
|
|
4
|
-
"sourcesContent": ["import { BaseEntity } from '@mikro-orm/core';\nimport { z } from 'zod';\nimport { buildEntitySchemas } from '../schemas/entity-builder.js';\n\nexport abstract class DynamicEntity extends BaseEntity {\n /** Required fields for creating a new entity */\n public static createSchema: z.ZodSchema;\n /** Allowed (partial) fields for updating an entity */\n public static updateSchema: z.ZodSchema;\n /** Optional projection/read schema (includes persistence augment) */\n public static readSchema?: z.ZodSchema;\n\n public static get singularName(): string {\n return 'Item';\n }\n\n public static get pluralName(): string {\n return 'Items';\n }\n\n public static get singularNameLowerCase(): string {\n return
|
|
5
|
-
"mappings": ";;AAAA,SAAS,kBAAkB;AAC3B,SAAS,SAAS;AAClB,SAAS,0BAA0B;AAE5B,MAAe,sBAAsB,WAAW;AAAA,EAJvD,OAIuD;AAAA;AAAA;AAAA;AAAA,EAErD,OAAc;AAAA;AAAA,EAEd,OAAc;AAAA;AAAA,EAEd,OAAc;AAAA,EAEd,WAAkB,eAAuB;AACvC,WAAO;AAAA,EACT;AAAA,EAEA,WAAkB,aAAqB;AACrC,WAAO;AAAA,EACT;AAAA,EAEA,WAAkB,wBAAgC;AAChD,WAAO,
|
|
4
|
+
"sourcesContent": ["import { BaseEntity } from '@mikro-orm/core';\nimport { z } from 'zod';\nimport { buildEntitySchemas } from '../schemas/entity-builder.js';\n\nexport abstract class DynamicEntity extends BaseEntity {\n /** Required fields for creating a new entity */\n public static createSchema: z.ZodSchema;\n /** Allowed (partial) fields for updating an entity */\n public static updateSchema: z.ZodSchema;\n /** Optional projection/read schema (includes persistence augment) */\n public static readSchema?: z.ZodSchema;\n\n public static get singularName(): string {\n return 'Item';\n }\n\n public static get pluralName(): string {\n return 'Items';\n }\n\n public static get singularNameLowerCase(): string {\n return DynamicEntity.singularName.toLowerCase();\n }\n\n public static get pluralNameLowerCase(): string {\n return DynamicEntity.pluralName.toLowerCase();\n }\n\n public static get singularNameCapitalized(): string {\n return DynamicEntity.singularName.charAt(0).toUpperCase() + DynamicEntity.singularName.slice(1).toLowerCase();\n }\n\n public static get pluralNameCapitalized(): string {\n return DynamicEntity.pluralName.charAt(0).toUpperCase() + DynamicEntity.pluralName.slice(1).toLowerCase();\n }\n\n public static validateCreate<T>(item: unknown): { error?: Error; value?: T } {\n try {\n return { value: DynamicEntity.createSchema.parse(item) as T };\n } catch (err) {\n if (err instanceof z.ZodError) {\n return { error: new Error(err.issues.map(i => `${i.path.join('.')}: ${i.message}`).join(', ')) };\n }\n return { error: err as Error };\n }\n }\n\n public static validateUpdate<T>(item: unknown): { error?: Error; value?: T } {\n try {\n return { value: DynamicEntity.updateSchema.parse(item) as T };\n } catch (err) {\n if (err instanceof z.ZodError) {\n return { error: new Error(err.issues.map(i => `${i.path.join('.')}: ${i.message}`).join(', ')) };\n }\n return { error: err as Error };\n }\n }\n\n public static getSearchFields(): string[] {\n return [];\n }\n\n public static defineSchemas<Shape extends z.ZodRawShape, Updatable extends readonly (keyof Shape)[]>(options: {\n shape: Shape;\n updatableFields?: Updatable;\n requireAtLeastOneOnUpdate?: boolean;\n readAugment?: z.ZodRawShape;\n }): void {\n const { shape, updatableFields, requireAtLeastOneOnUpdate = true, readAugment } = options;\n const schemas = buildEntitySchemas({\n shape,\n updatableFields: updatableFields as any,\n requireAtLeastOneOnUpdate,\n readAugment,\n });\n DynamicEntity.createSchema = schemas.create;\n DynamicEntity.updateSchema = schemas.update;\n if (readAugment) {\n DynamicEntity.readSchema = schemas.read;\n }\n }\n}\n"],
|
|
5
|
+
"mappings": ";;AAAA,SAAS,kBAAkB;AAC3B,SAAS,SAAS;AAClB,SAAS,0BAA0B;AAE5B,MAAe,sBAAsB,WAAW;AAAA,EAJvD,OAIuD;AAAA;AAAA;AAAA;AAAA,EAErD,OAAc;AAAA;AAAA,EAEd,OAAc;AAAA;AAAA,EAEd,OAAc;AAAA,EAEd,WAAkB,eAAuB;AACvC,WAAO;AAAA,EACT;AAAA,EAEA,WAAkB,aAAqB;AACrC,WAAO;AAAA,EACT;AAAA,EAEA,WAAkB,wBAAgC;AAChD,WAAO,cAAc,aAAa,YAAY;AAAA,EAChD;AAAA,EAEA,WAAkB,sBAA8B;AAC9C,WAAO,cAAc,WAAW,YAAY;AAAA,EAC9C;AAAA,EAEA,WAAkB,0BAAkC;AAClD,WAAO,cAAc,aAAa,OAAO,CAAC,EAAE,YAAY,IAAI,cAAc,aAAa,MAAM,CAAC,EAAE,YAAY;AAAA,EAC9G;AAAA,EAEA,WAAkB,wBAAgC;AAChD,WAAO,cAAc,WAAW,OAAO,CAAC,EAAE,YAAY,IAAI,cAAc,WAAW,MAAM,CAAC,EAAE,YAAY;AAAA,EAC1G;AAAA,EAEA,OAAc,eAAkB,MAA6C;AAC3E,QAAI;AACF,aAAO,EAAE,OAAO,cAAc,aAAa,MAAM,IAAI,EAAO;AAAA,IAC9D,SAAS,KAAK;AACZ,UAAI,eAAe,EAAE,UAAU;AAC7B,eAAO,EAAE,OAAO,IAAI,MAAM,IAAI,OAAO,IAAI,OAAK,GAAG,EAAE,KAAK,KAAK,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,MACjG;AACA,aAAO,EAAE,OAAO,IAAa;AAAA,IAC/B;AAAA,EACF;AAAA,EAEA,OAAc,eAAkB,MAA6C;AAC3E,QAAI;AACF,aAAO,EAAE,OAAO,cAAc,aAAa,MAAM,IAAI,EAAO;AAAA,IAC9D,SAAS,KAAK;AACZ,UAAI,eAAe,EAAE,UAAU;AAC7B,eAAO,EAAE,OAAO,IAAI,MAAM,IAAI,OAAO,IAAI,OAAK,GAAG,EAAE,KAAK,KAAK,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,MACjG;AACA,aAAO,EAAE,OAAO,IAAa;AAAA,IAC/B;AAAA,EACF;AAAA,EAEA,OAAc,kBAA4B;AACxC,WAAO,CAAC;AAAA,EACV;AAAA,EAEA,OAAc,cAAuF,SAK5F;AACP,UAAM,EAAE,OAAO,iBAAiB,4BAA4B,MAAM,YAAY,IAAI;AAClF,UAAM,UAAU,mBAAmB;AAAA,MACjC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AACD,kBAAc,eAAe,QAAQ;AACrC,kBAAc,eAAe,QAAQ;AACrC,QAAI,aAAa;AACf,oBAAc,aAAa,QAAQ;AAAA,IACrC;AAAA,EACF;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/database/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { default as DatabaseManager } from './manager.js';
|
|
2
|
-
export { default as DatabaseInstance } from './instance.js';
|
|
3
|
-
export { FormField, FormFieldType } from './dynamic-entity-form-decorators.js';
|
|
4
1
|
export { DynamicEntity } from './dynamic-entity.js';
|
|
2
|
+
export { FormField, FormFieldType } from './dynamic-entity-form-decorators.js';
|
|
3
|
+
export { default as DatabaseInstance } from './instance.js';
|
|
4
|
+
export { default as DatabaseManager } from './manager.js';
|
|
5
5
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/database/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/database/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AAC/E,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/database/index.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { default as default2 } from "./manager.js";
|
|
2
|
-
import { default as default3 } from "./instance.js";
|
|
3
|
-
import { FormField, FormFieldType } from "./dynamic-entity-form-decorators.js";
|
|
4
1
|
import { DynamicEntity } from "./dynamic-entity.js";
|
|
2
|
+
import { FormField, FormFieldType } from "./dynamic-entity-form-decorators.js";
|
|
3
|
+
import { default as default2 } from "./instance.js";
|
|
4
|
+
import { default as default3 } from "./manager.js";
|
|
5
5
|
export {
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
default2 as DatabaseInstance,
|
|
7
|
+
default3 as DatabaseManager,
|
|
8
8
|
DynamicEntity,
|
|
9
9
|
FormField,
|
|
10
10
|
FormFieldType
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/database/index.ts"],
|
|
4
|
-
"sourcesContent": ["export {
|
|
5
|
-
"mappings": "AAAA,
|
|
4
|
+
"sourcesContent": ["export { DynamicEntity } from './dynamic-entity.js';\nexport { FormField, FormFieldType } from './dynamic-entity-form-decorators.js';\nexport { default as DatabaseInstance } from './instance.js';\nexport { default as DatabaseManager } from './manager.js';\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,qBAAqB;AAC9B,SAAS,WAAW,qBAAqB;AACzC,SAAoB,WAAXA,gBAAmC;AAC5C,SAAoB,WAAXA,gBAAkC;",
|
|
6
6
|
"names": ["default"]
|
|
7
7
|
}
|
|
@@ -40,7 +40,7 @@ export default class DatabaseInstance {
|
|
|
40
40
|
*
|
|
41
41
|
* @example
|
|
42
42
|
* await databaseInstance.withEntityManager(async (em) => {
|
|
43
|
-
* const user = await em.findOne(
|
|
43
|
+
* const user = await em.findOne(User, { id: 1 });
|
|
44
44
|
* return user;
|
|
45
45
|
* });
|
|
46
46
|
*/
|
|
@@ -51,8 +51,8 @@ export default class DatabaseInstance {
|
|
|
51
51
|
*
|
|
52
52
|
* @example
|
|
53
53
|
* await databaseInstance.withTransaction(async (em) => {
|
|
54
|
-
* const user = em.create(
|
|
55
|
-
* await em.
|
|
54
|
+
* const user = em.create(User, { name: 'John' });
|
|
55
|
+
* await em.persist(user).flush();
|
|
56
56
|
* return user;
|
|
57
57
|
* });
|
|
58
58
|
*/
|
|
@@ -47,7 +47,7 @@ class DatabaseInstance {
|
|
|
47
47
|
*
|
|
48
48
|
* @example
|
|
49
49
|
* await databaseInstance.withEntityManager(async (em) => {
|
|
50
|
-
* const user = await em.findOne(
|
|
50
|
+
* const user = await em.findOne(User, { id: 1 });
|
|
51
51
|
* return user;
|
|
52
52
|
* });
|
|
53
53
|
*/
|
|
@@ -65,8 +65,8 @@ class DatabaseInstance {
|
|
|
65
65
|
*
|
|
66
66
|
* @example
|
|
67
67
|
* await databaseInstance.withTransaction(async (em) => {
|
|
68
|
-
* const user = em.create(
|
|
69
|
-
* await em.
|
|
68
|
+
* const user = em.create(User, { name: 'John' });
|
|
69
|
+
* await em.persist(user).flush();
|
|
70
70
|
* return user;
|
|
71
71
|
* });
|
|
72
72
|
*/
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/database/instance.ts"],
|
|
4
|
-
"sourcesContent": ["import type { EntityManager, MikroORM } from '@mikro-orm/postgresql';\nimport type { ApplicationConfig } from '../application/base-application.interface.js';\nimport type DatabaseManager from './manager.js';\n\n/**\n * Database Instance\n */\nexport default class DatabaseInstance {\n /** Database manager */\n private databaseManager: DatabaseManager;\n\n /** Application config */\n private applicationConfig: ApplicationConfig;\n\n /** MikroORM instance */\n private orm: MikroORM;\n\n /**\n * Database Instance constructor\n * @param orm MikroORM instance\n */\n constructor({\n databaseManager,\n applicationConfig,\n orm,\n }: {\n databaseManager: DatabaseManager;\n applicationConfig: ApplicationConfig;\n orm: MikroORM;\n }) {\n this.databaseManager = databaseManager;\n this.applicationConfig = applicationConfig;\n this.orm = orm;\n }\n\n /**\n * Check if database is connected\n */\n public isConnected(): Promise<boolean> {\n return this.orm.isConnected();\n }\n\n /**\n * Get EntityManager\n *\n * Fork and return a new EntityManager instance\n * WARNING: You MUST call em.clear() when done to prevent memory leaks\n * Consider using withEntityManager() instead for automatic cleanup\n *\n * @deprecated Use withEntityManager() for automatic cleanup\n */\n public getEntityManager(): EntityManager {\n return this.orm.em.fork();\n }\n\n /**\n * Execute a function with a fresh EntityManager that is automatically cleaned up\n * This is the recommended pattern for short-lived operations (HTTP requests, queue jobs, etc.)\n *\n * @example\n * await databaseInstance.withEntityManager(async (em) => {\n * const user = await em.findOne(
|
|
4
|
+
"sourcesContent": ["import type { EntityManager, MikroORM } from '@mikro-orm/postgresql';\nimport type { ApplicationConfig } from '../application/base-application.interface.js';\nimport type DatabaseManager from './manager.js';\n\n/**\n * Database Instance\n */\nexport default class DatabaseInstance {\n /** Database manager */\n private databaseManager: DatabaseManager;\n\n /** Application config */\n private applicationConfig: ApplicationConfig;\n\n /** MikroORM instance */\n private orm: MikroORM;\n\n /**\n * Database Instance constructor\n * @param orm MikroORM instance\n */\n constructor({\n databaseManager,\n applicationConfig,\n orm,\n }: {\n databaseManager: DatabaseManager;\n applicationConfig: ApplicationConfig;\n orm: MikroORM;\n }) {\n this.databaseManager = databaseManager;\n this.applicationConfig = applicationConfig;\n this.orm = orm;\n }\n\n /**\n * Check if database is connected\n */\n public isConnected(): Promise<boolean> {\n return this.orm.isConnected();\n }\n\n /**\n * Get EntityManager\n *\n * Fork and return a new EntityManager instance\n * WARNING: You MUST call em.clear() when done to prevent memory leaks\n * Consider using withEntityManager() instead for automatic cleanup\n *\n * @deprecated Use withEntityManager() for automatic cleanup\n */\n public getEntityManager(): EntityManager {\n return this.orm.em.fork();\n }\n\n /**\n * Execute a function with a fresh EntityManager that is automatically cleaned up\n * This is the recommended pattern for short-lived operations (HTTP requests, queue jobs, etc.)\n *\n * @example\n * await databaseInstance.withEntityManager(async (em) => {\n * const user = await em.findOne(User, { id: 1 });\n * return user;\n * });\n */\n public async withEntityManager<T>(callback: (em: EntityManager) => Promise<T>): Promise<T> {\n const em = this.orm.em.fork();\n try {\n return await callback(em);\n } finally {\n em.clear();\n }\n }\n\n /**\n * Execute a function with a fresh EntityManager that supports transactions\n * The EntityManager is automatically cleaned up after the transaction\n *\n * @example\n * await databaseInstance.withTransaction(async (em) => {\n * const user = em.create(User, { name: 'John' });\n * await em.persist(user).flush();\n * return user;\n * });\n */\n public async withTransaction<T>(callback: (em: EntityManager) => Promise<T>): Promise<T> {\n const em = this.orm.em.fork();\n try {\n return await em.transactional(async transactionalEm => {\n return await callback(transactionalEm);\n });\n } finally {\n em.clear();\n }\n }\n\n /**\n * Disconnect\n */\n public async disconnect(): Promise<void> {\n await this.orm.close();\n\n this.databaseManager.log('Disconnected');\n }\n}\n"],
|
|
5
5
|
"mappings": ";;AAOA,MAAO,iBAA+B;AAAA,EAPtC,OAOsC;AAAA;AAAA;AAAA;AAAA,EAE5B;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMR,YAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAIG;AACD,SAAK,kBAAkB;AACvB,SAAK,oBAAoB;AACzB,SAAK,MAAM;AAAA,EACb;AAAA;AAAA;AAAA;AAAA,EAKO,cAAgC;AACrC,WAAO,KAAK,IAAI,YAAY;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWO,mBAAkC;AACvC,WAAO,KAAK,IAAI,GAAG,KAAK;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAa,kBAAqB,UAAyD;AACzF,UAAM,KAAK,KAAK,IAAI,GAAG,KAAK;AAC5B,QAAI;AACF,aAAO,MAAM,SAAS,EAAE;AAAA,IAC1B,UAAE;AACA,SAAG,MAAM;AAAA,IACX;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAa,gBAAmB,UAAyD;AACvF,UAAM,KAAK,KAAK,IAAI,GAAG,KAAK;AAC5B,QAAI;AACF,aAAO,MAAM,GAAG,cAAc,OAAM,oBAAmB;AACrD,eAAO,MAAM,SAAS,eAAe;AAAA,MACvC,CAAC;AAAA,IACH,UAAE;AACA,SAAG,MAAM;AAAA,IACX;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,aAA4B;AACvC,UAAM,KAAK,IAAI,MAAM;AAErB,SAAK,gBAAgB,IAAI,cAAc;AAAA,EACzC;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/database/manager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/database/manager.ts"],"names":[],"mappings":"AAIA,OAAO,gBAAgB,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AAEzE;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,eAAe;IAClC,OAAO,CAAC,MAAM,CAAyB;IAEvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6B;IAErD,OAAO,CAAC,SAAS,CAA0B;IAE3C;;OAEG;gBACS,OAAO,EAAE,0BAA0B;IAI/C;;OAEG;IACU,OAAO,IAAI,OAAO,CAAC,gBAAgB,CAAC;IA2DjD;;OAEG;IACU,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA2CxC;;OAEG;IACI,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAI3D,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7C"}
|
package/dist/database/manager.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
var __defProp = Object.defineProperty;
|
|
2
2
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
3
|
import { MikroORM } from "@mikro-orm/postgresql";
|
|
4
|
-
import
|
|
4
|
+
import { safeSerializeError } from "../error/error-reporter.js";
|
|
5
5
|
import { Logger } from "../logger/index.js";
|
|
6
6
|
import { DatabasePerformanceWrapper } from "../performance/index.js";
|
|
7
|
-
import
|
|
7
|
+
import DatabaseInstance from "./instance.js";
|
|
8
8
|
class DatabaseManager {
|
|
9
9
|
static {
|
|
10
10
|
__name(this, "DatabaseManager");
|
|
@@ -25,7 +25,17 @@ class DatabaseManager {
|
|
|
25
25
|
return DatabasePerformanceWrapper.monitorConnection("connect", async () => {
|
|
26
26
|
const startTime = performance.now();
|
|
27
27
|
try {
|
|
28
|
-
const orm = await MikroORM.init(
|
|
28
|
+
const orm = await MikroORM.init({
|
|
29
|
+
host: this.options.host,
|
|
30
|
+
port: this.options.port,
|
|
31
|
+
user: this.options.username,
|
|
32
|
+
password: this.options.password,
|
|
33
|
+
dbName: this.options.databaseName,
|
|
34
|
+
entities: [this.options.entitiesDirectory],
|
|
35
|
+
discovery: {
|
|
36
|
+
warnWhenNoEntities: false
|
|
37
|
+
}
|
|
38
|
+
});
|
|
29
39
|
const databaseInstance = new DatabaseInstance({
|
|
30
40
|
databaseManager: this,
|
|
31
41
|
applicationConfig: this.options.applicationConfig,
|
|
@@ -105,6 +115,9 @@ class DatabaseManager {
|
|
|
105
115
|
log(message, meta) {
|
|
106
116
|
this.logger.custom({ level: "database", message, meta });
|
|
107
117
|
}
|
|
118
|
+
async [Symbol.asyncDispose]() {
|
|
119
|
+
await this.disconnect();
|
|
120
|
+
}
|
|
108
121
|
}
|
|
109
122
|
export {
|
|
110
123
|
DatabaseManager as default
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/database/manager.ts"],
|
|
4
|
-
"sourcesContent": ["import { MikroORM } from '@mikro-orm/postgresql';\nimport
|
|
5
|
-
"mappings": ";;AAAA,SAAS,gBAAgB;AACzB,
|
|
4
|
+
"sourcesContent": ["import { MikroORM } from '@mikro-orm/postgresql';\nimport { safeSerializeError } from '../error/error-reporter.js';\nimport { Logger } from '../logger/index.js';\nimport { DatabasePerformanceWrapper } from '../performance/index.js';\nimport DatabaseInstance from './instance.js';\nimport type { ApplicationDatabaseOptions } from './manager.interface.js';\n\n/**\n * Database manager\n */\nexport default class DatabaseManager {\n private logger: typeof Logger = Logger;\n\n private readonly options: ApplicationDatabaseOptions;\n\n private instances: DatabaseInstance[] = [];\n\n /**\n * Database manager constructor\n */\n constructor(options: ApplicationDatabaseOptions) {\n this.options = options;\n }\n\n /**\n * Connect to database\n */\n public async connect(): Promise<DatabaseInstance> {\n return DatabasePerformanceWrapper.monitorConnection('connect', async () => {\n const startTime = performance.now();\n\n try {\n const orm = await MikroORM.init({\n host: this.options.host,\n port: this.options.port,\n user: this.options.username,\n password: this.options.password,\n dbName: this.options.databaseName,\n entities: [this.options.entitiesDirectory],\n discovery: {\n warnWhenNoEntities: false,\n },\n });\n\n const databaseInstance = new DatabaseInstance({\n databaseManager: this,\n applicationConfig: this.options.applicationConfig,\n orm,\n });\n\n this.instances.push(databaseInstance);\n\n const duration = performance.now() - startTime;\n const ormConfig = typeof orm.config?.getAll === 'function' ? orm.config.getAll() : undefined;\n const logMeta = {\n Host: ormConfig?.host ?? this.options.host,\n User: ormConfig?.user ?? this.options.username,\n Database: ormConfig?.dbName ?? this.options.databaseName,\n Duration: `${duration.toFixed(2)}ms`,\n };\n\n if (this.options.applicationConfig.log?.startUp) {\n this.log('Connected', logMeta);\n } else {\n this.logger.debug({ message: 'Database connected', meta: logMeta });\n }\n\n return databaseInstance;\n } catch (error) {\n const duration = performance.now() - startTime;\n\n this.logger.error({\n error: error instanceof Error ? error : new Error(safeSerializeError(error)),\n message: 'Database connection failed',\n meta: {\n Host: this.options.host,\n Database: this.options.databaseName,\n Duration: `${duration.toFixed(2)}ms`,\n },\n });\n\n throw error;\n }\n });\n }\n\n /**\n * Disconnect from database\n */\n public async disconnect(): Promise<void> {\n await DatabasePerformanceWrapper.monitorConnection('disconnect', async () => {\n const startTime = performance.now();\n const instanceCount = this.instances.length;\n\n try {\n await Promise.all(this.instances.map(instance => instance.disconnect()));\n\n const duration = performance.now() - startTime;\n\n if (instanceCount > 0) {\n const meta = {\n Host: this.options.host,\n Instances: instanceCount,\n Duration: `${duration.toFixed(2)}ms`,\n };\n\n if (this.options.applicationConfig.log?.startUp) {\n this.log('Disconnected all database instances', meta);\n } else {\n this.logger.debug({ message: 'Database instances disconnected', meta });\n }\n }\n\n this.instances = [];\n } catch (error) {\n const duration = performance.now() - startTime;\n\n this.logger.error({\n error: error instanceof Error ? error : new Error(safeSerializeError(error)),\n message: 'Database disconnection failed',\n meta: {\n Host: this.options.host,\n Duration: `${duration.toFixed(2)}ms`,\n Instances: instanceCount,\n },\n });\n\n throw error;\n }\n });\n }\n\n /**\n * Log database message\n */\n public log(message: string, meta?: Record<string, unknown>): void {\n this.logger.custom({ level: 'database', message, meta });\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.disconnect();\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
var __defProp = Object.defineProperty;
|
|
2
2
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
3
|
import * as Sentry from "@sentry/node";
|
|
4
|
-
import { getRequestId } from "../request-context/index.js";
|
|
5
4
|
import Logger from "../logger/logger.js";
|
|
5
|
+
import { getRequestId } from "../request-context/index.js";
|
|
6
6
|
import { ErrorCode, ErrorSeverity } from "./error.interface.js";
|
|
7
7
|
import { FrameworkError } from "./framework-errors.js";
|
|
8
8
|
function safeSerializeError(error) {
|