@zintrust/core 0.1.40 → 0.1.42
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/bin/zintrust-main.d.ts.map +1 -1
- package/bin/zintrust-main.js +22 -1
- package/package.json +24 -4
- package/public/error-pages/404.html +2 -2
- package/src/auth/Auth.js +1 -1
- package/src/boot/Application.d.ts +1 -16
- package/src/boot/Application.d.ts.map +1 -1
- package/src/boot/Application.js +2 -290
- package/src/boot/Server.d.ts +1 -1
- package/src/boot/Server.d.ts.map +1 -1
- package/src/boot/bootstrap.js +50 -16
- package/src/boot/registry/registerRoute.d.ts +6 -0
- package/src/boot/registry/registerRoute.d.ts.map +1 -0
- package/src/boot/registry/registerRoute.js +96 -0
- package/src/boot/registry/runtime.d.ts +15 -0
- package/src/boot/registry/runtime.d.ts.map +1 -0
- package/src/boot/registry/runtime.js +364 -0
- package/src/boot/registry/type.d.ts +25 -0
- package/src/boot/registry/type.d.ts.map +1 -0
- package/src/boot/registry/type.js +1 -0
- package/src/boot/registry/worker.d.ts +6 -0
- package/src/boot/registry/worker.d.ts.map +1 -0
- package/src/boot/registry/worker.js +35 -0
- package/src/cache/drivers/KVRemoteDriver.d.ts.map +1 -1
- package/src/cache/drivers/KVRemoteDriver.js +14 -1
- package/src/cli/CLI.d.ts.map +1 -1
- package/src/cli/CLI.js +94 -34
- package/src/cli/ErrorHandler.js +1 -1
- package/src/cli/commands/ConfigCommand.d.ts.map +1 -1
- package/src/cli/commands/ConfigCommand.js +3 -5
- package/src/cli/commands/ContainerProxiesCommand.d.ts +5 -0
- package/src/cli/commands/ContainerProxiesCommand.d.ts.map +1 -0
- package/src/cli/commands/ContainerProxiesCommand.js +77 -0
- package/src/cli/commands/ContainerWorkersCommand.d.ts +5 -0
- package/src/cli/commands/ContainerWorkersCommand.d.ts.map +1 -0
- package/src/cli/commands/ContainerWorkersCommand.js +57 -0
- package/src/cli/commands/D1LearnCommand.d.ts +9 -0
- package/src/cli/commands/D1LearnCommand.d.ts.map +1 -0
- package/src/cli/commands/D1LearnCommand.js +143 -0
- package/src/cli/commands/D1MigrateCommand.d.ts.map +1 -1
- package/src/cli/commands/D1MigrateCommand.js +55 -16
- package/src/cli/commands/DeployCommand.d.ts +16 -0
- package/src/cli/commands/DeployCommand.d.ts.map +1 -0
- package/src/cli/commands/DeployCommand.js +110 -0
- package/src/cli/commands/DeployContainerProxiesCommand.d.ts +5 -0
- package/src/cli/commands/DeployContainerProxiesCommand.d.ts.map +1 -0
- package/src/cli/commands/DeployContainerProxiesCommand.js +27 -0
- package/src/cli/commands/DeployContainerWorkersCommand.d.ts +5 -0
- package/src/cli/commands/DeployContainerWorkersCommand.d.ts.map +1 -0
- package/src/cli/commands/DeployContainerWorkersCommand.js +27 -0
- package/src/cli/commands/DockerComposeCommandUtils.d.ts +3 -0
- package/src/cli/commands/DockerComposeCommandUtils.d.ts.map +1 -0
- package/src/cli/commands/DockerComposeCommandUtils.js +34 -0
- package/src/cli/commands/DoctorArchitectureCommand.d.ts +5 -0
- package/src/cli/commands/DoctorArchitectureCommand.d.ts.map +1 -0
- package/src/cli/commands/DoctorArchitectureCommand.js +54 -0
- package/src/cli/commands/InitContainerCommand.d.ts +5 -0
- package/src/cli/commands/InitContainerCommand.d.ts.map +1 -0
- package/src/cli/commands/InitContainerCommand.js +231 -0
- package/src/cli/commands/InitEcosystemCommand.d.ts +6 -0
- package/src/cli/commands/InitEcosystemCommand.d.ts.map +1 -0
- package/src/cli/commands/InitEcosystemCommand.js +51 -0
- package/src/cli/commands/InitProducerCommand.d.ts +5 -0
- package/src/cli/commands/InitProducerCommand.d.ts.map +1 -0
- package/src/cli/commands/InitProducerCommand.js +47 -0
- package/src/cli/commands/InitProxyCommand.d.ts +5 -0
- package/src/cli/commands/InitProxyCommand.d.ts.map +1 -0
- package/src/cli/commands/InitProxyCommand.js +442 -0
- package/src/cli/commands/MigrateCommand.d.ts.map +1 -1
- package/src/cli/commands/MigrateCommand.js +78 -36
- package/src/cli/commands/MigrateWorkerCommand.d.ts.map +1 -1
- package/src/cli/commands/MigrateWorkerCommand.js +36 -2
- package/src/cli/commands/MongoDBProxyCommand.d.ts +5 -0
- package/src/cli/commands/MongoDBProxyCommand.d.ts.map +1 -0
- package/src/cli/commands/MongoDBProxyCommand.js +98 -0
- package/src/cli/commands/MySqlProxyCommand.d.ts +6 -0
- package/src/cli/commands/MySqlProxyCommand.d.ts.map +1 -0
- package/src/cli/commands/MySqlProxyCommand.js +32 -0
- package/src/cli/commands/PostgresProxyCommand.d.ts +6 -0
- package/src/cli/commands/PostgresProxyCommand.d.ts.map +1 -0
- package/src/cli/commands/PostgresProxyCommand.js +32 -0
- package/src/cli/commands/ProxyCommand.d.ts +12 -0
- package/src/cli/commands/ProxyCommand.d.ts.map +1 -0
- package/src/cli/commands/ProxyCommand.js +80 -0
- package/src/cli/commands/ProxyCommandUtils.d.ts +6 -0
- package/src/cli/commands/ProxyCommandUtils.d.ts.map +1 -0
- package/src/cli/commands/ProxyCommandUtils.js +38 -0
- package/src/cli/commands/PutCommand.d.ts +6 -0
- package/src/cli/commands/PutCommand.d.ts.map +1 -0
- package/src/cli/commands/PutCommand.js +173 -0
- package/src/cli/commands/QueueRecoveryCommand.d.ts +6 -0
- package/src/cli/commands/QueueRecoveryCommand.d.ts.map +1 -0
- package/src/cli/commands/QueueRecoveryCommand.js +612 -0
- package/src/cli/commands/RedisProxyCommand.d.ts +6 -0
- package/src/cli/commands/RedisProxyCommand.d.ts.map +1 -0
- package/src/cli/commands/RedisProxyCommand.js +53 -0
- package/src/cli/commands/ScheduleListCommand.d.ts +6 -0
- package/src/cli/commands/ScheduleListCommand.d.ts.map +1 -0
- package/src/cli/commands/ScheduleListCommand.js +62 -0
- package/src/cli/commands/ScheduleRunCommand.d.ts +6 -0
- package/src/cli/commands/ScheduleRunCommand.d.ts.map +1 -0
- package/src/cli/commands/ScheduleRunCommand.js +32 -0
- package/src/cli/commands/ScheduleStartCommand.d.ts +6 -0
- package/src/cli/commands/ScheduleStartCommand.d.ts.map +1 -0
- package/src/cli/commands/ScheduleStartCommand.js +40 -0
- package/src/cli/commands/SecretsCommand.d.ts.map +1 -1
- package/src/cli/commands/SecretsCommand.js +2 -2
- package/src/cli/commands/SmtpProxyCommand.d.ts +6 -0
- package/src/cli/commands/SmtpProxyCommand.d.ts.map +1 -0
- package/src/cli/commands/SmtpProxyCommand.js +56 -0
- package/src/cli/commands/SqlProxyCommandUtils.d.ts +46 -0
- package/src/cli/commands/SqlProxyCommandUtils.d.ts.map +1 -0
- package/src/cli/commands/SqlProxyCommandUtils.js +48 -0
- package/src/cli/commands/SqlServerProxyCommand.d.ts +5 -0
- package/src/cli/commands/SqlServerProxyCommand.d.ts.map +1 -0
- package/src/cli/commands/SqlServerProxyCommand.js +85 -0
- package/src/cli/commands/StartCommand.d.ts.map +1 -1
- package/src/cli/commands/StartCommand.js +132 -17
- package/src/cli/commands/WorkerCommands.d.ts +1 -0
- package/src/cli/commands/WorkerCommands.d.ts.map +1 -1
- package/src/cli/commands/WorkerCommands.js +140 -6
- package/src/cli/commands/index.d.ts +2 -0
- package/src/cli/commands/index.d.ts.map +1 -1
- package/src/cli/commands/index.js +2 -0
- package/src/cli/commands/runner/index.d.ts +2 -2
- package/src/cli/commands/runner/index.d.ts.map +1 -1
- package/src/cli/commands/runner/index.js +15 -4
- package/src/cli/commands/schedule/ScheduleCliSupport.d.ts +6 -0
- package/src/cli/commands/schedule/ScheduleCliSupport.d.ts.map +1 -0
- package/src/cli/commands/schedule/ScheduleCliSupport.js +55 -0
- package/src/cli/config/ConfigManager.d.ts.map +1 -1
- package/src/cli/config/ConfigManager.js +8 -1
- package/src/cli/d1/D1SqlMigrations.d.ts.map +1 -1
- package/src/cli/d1/D1SqlMigrations.js +14 -1
- package/src/cli/d1/WranglerConfig.d.ts.map +1 -1
- package/src/cli/d1/WranglerConfig.js +34 -2
- package/src/cli/index.d.ts +4 -0
- package/src/cli/index.d.ts.map +1 -1
- package/src/cli/index.js +4 -0
- package/src/cli/scaffolding/ProjectScaffolder.d.ts.map +1 -1
- package/src/cli/scaffolding/ProjectScaffolder.js +2 -0
- package/src/cli/scaffolding/ServiceScaffolder.d.ts.map +1 -1
- package/src/cli/scaffolding/ServiceScaffolder.js +1 -0
- package/src/cli/services/VersionChecker.d.ts.map +1 -1
- package/src/cli/services/VersionChecker.js +5 -1
- package/src/cli/utils/DatabaseCliUtils.d.ts.map +1 -1
- package/src/cli/utils/DatabaseCliUtils.js +6 -1
- package/src/cli/utils/EnvFileLoader.d.ts.map +1 -1
- package/src/cli/utils/EnvFileLoader.js +35 -15
- package/src/cli/workers/QueueWorkRunner.js +1 -1
- package/src/cli.d.ts +5 -0
- package/src/cli.d.ts.map +1 -0
- package/src/cli.js +4 -0
- package/src/collections/index.d.ts +2 -2
- package/src/collections/index.d.ts.map +1 -1
- package/src/collections/index.js +1 -1
- package/src/common/HealthRoutes.d.ts.map +1 -1
- package/src/common/HealthRoutes.js +50 -2
- package/src/common/RemoteSignedJson.d.ts +1 -0
- package/src/common/RemoteSignedJson.d.ts.map +1 -1
- package/src/common/RemoteSignedJson.js +81 -29
- package/src/common/index.d.ts +1 -0
- package/src/common/index.d.ts.map +1 -1
- package/src/common/index.js +12 -1
- package/src/common/utility.d.ts.map +1 -1
- package/src/common/utility.js +2 -6
- package/src/config/FileLogWriter.d.ts.map +1 -1
- package/src/config/FileLogWriter.js +21 -6
- package/src/config/app.d.ts +4 -0
- package/src/config/app.d.ts.map +1 -1
- package/src/config/app.js +4 -0
- package/src/config/cache.d.ts.map +1 -1
- package/src/config/cache.js +22 -2
- package/src/config/cloudflare.d.ts +5 -1
- package/src/config/cloudflare.d.ts.map +1 -1
- package/src/config/cloudflare.js +67 -8
- package/src/config/database.d.ts.map +1 -1
- package/src/config/database.js +48 -13
- package/src/config/env.d.ts +87 -2
- package/src/config/env.d.ts.map +1 -1
- package/src/config/env.js +158 -19
- package/src/config/index.d.ts +1 -0
- package/src/config/index.d.ts.map +1 -1
- package/src/config/mail.d.ts.map +1 -1
- package/src/config/mail.js +16 -10
- package/src/config/middleware.d.ts +5 -0
- package/src/config/middleware.d.ts.map +1 -1
- package/src/config/middleware.js +19 -1
- package/src/config/queue.d.ts.map +1 -1
- package/src/config/queue.js +70 -9
- package/src/config/redis.d.ts.map +1 -1
- package/src/config/redis.js +48 -13
- package/src/config/storage.d.ts.map +1 -1
- package/src/config/storage.js +1 -0
- package/src/config/type.d.ts +18 -0
- package/src/config/type.d.ts.map +1 -1
- package/src/config/workers.d.ts.map +1 -1
- package/src/config/workers.js +122 -16
- package/src/functions/cloudflare.d.ts.map +1 -1
- package/src/functions/cloudflare.js +55 -1
- package/src/health/StartupHealthChecks.js +1 -1
- package/src/helper/index.d.ts +225 -0
- package/src/helper/index.d.ts.map +1 -0
- package/src/helper/index.js +347 -0
- package/src/http/FileUpload.d.ts +3 -2
- package/src/http/FileUpload.d.ts.map +1 -1
- package/src/http/Kernel.d.ts.map +1 -1
- package/src/http/Kernel.js +2 -1
- package/src/http/error-pages/ErrorPageRenderer.d.ts +4 -0
- package/src/http/error-pages/ErrorPageRenderer.d.ts.map +1 -1
- package/src/http/error-pages/ErrorPageRenderer.js +141 -1
- package/src/http/middleware/BodyParsingMiddleware.d.ts.map +1 -1
- package/src/http/middleware/BodyParsingMiddleware.js +33 -6
- package/src/index.d.ts +26 -57
- package/src/index.d.ts.map +1 -1
- package/src/index.js +32 -18
- package/src/microservices/ServiceAuthMiddleware.d.ts.map +1 -1
- package/src/microservices/ServiceAuthMiddleware.js +12 -4
- package/src/middleware/CsrfMiddleware.d.ts.map +1 -1
- package/src/middleware/CsrfMiddleware.js +30 -16
- package/src/middleware/ErrorHandlerMiddleware.d.ts.map +1 -1
- package/src/middleware/ErrorHandlerMiddleware.js +2 -1
- package/src/migrations/MigrationDiscovery.d.ts.map +1 -1
- package/src/migrations/MigrationDiscovery.js +2 -1
- package/src/migrations/MigrationLoader.js +1 -1
- package/src/migrations/schema/SchemaCompiler.d.ts.map +1 -1
- package/src/migrations/schema/SchemaCompiler.js +6 -3
- package/src/node-singletons/crypto.d.ts +1 -1
- package/src/node-singletons/crypto.d.ts.map +1 -1
- package/src/node-singletons/crypto.js +1 -1
- package/src/node-singletons/fs.d.ts +1 -1
- package/src/node-singletons/fs.d.ts.map +1 -1
- package/src/node-singletons/path.d.ts +1 -1
- package/src/node-singletons/path.d.ts.map +1 -1
- package/src/node-singletons/path.js +1 -1
- package/src/node-singletons/stream.d.ts +11 -0
- package/src/node-singletons/stream.d.ts.map +1 -0
- package/src/node-singletons/stream.js +8 -0
- package/src/observability/OpenTelemetry.d.ts +7 -0
- package/src/observability/OpenTelemetry.d.ts.map +1 -1
- package/src/observability/OpenTelemetry.js +49 -2
- package/src/orm/Database.d.ts +4 -0
- package/src/orm/Database.d.ts.map +1 -1
- package/src/orm/Database.js +80 -9
- package/src/orm/DatabaseAdapter.d.ts +1 -0
- package/src/orm/DatabaseAdapter.d.ts.map +1 -1
- package/src/orm/DatabaseRuntimeRegistration.d.ts.map +1 -1
- package/src/orm/DatabaseRuntimeRegistration.js +2 -0
- package/src/orm/QueryBuilder.d.ts +1 -0
- package/src/orm/QueryBuilder.d.ts.map +1 -1
- package/src/orm/QueryBuilder.js +33 -3
- package/src/orm/SchemaCompiler.d.ts.map +1 -1
- package/src/orm/SchemaCompiler.js +6 -3
- package/src/orm/SchemaStatemenWriter.d.ts +15 -0
- package/src/orm/SchemaStatemenWriter.d.ts.map +1 -0
- package/src/orm/SchemaStatemenWriter.js +78 -0
- package/src/orm/adapters/D1Adapter.d.ts.map +1 -1
- package/src/orm/adapters/D1Adapter.js +52 -2
- package/src/orm/adapters/D1RemoteAdapter.d.ts.map +1 -1
- package/src/orm/adapters/D1RemoteAdapter.js +150 -89
- package/src/orm/adapters/MongoDBProxyAdapter.d.ts +3 -0
- package/src/orm/adapters/MongoDBProxyAdapter.d.ts.map +1 -0
- package/src/orm/adapters/MongoDBProxyAdapter.js +128 -0
- package/src/orm/adapters/MySQLProxyAdapter.d.ts +11 -0
- package/src/orm/adapters/MySQLProxyAdapter.d.ts.map +1 -0
- package/src/orm/adapters/MySQLProxyAdapter.js +162 -0
- package/src/orm/adapters/PostgreSQLProxyAdapter.d.ts +11 -0
- package/src/orm/adapters/PostgreSQLProxyAdapter.d.ts.map +1 -0
- package/src/orm/adapters/PostgreSQLProxyAdapter.js +163 -0
- package/src/orm/adapters/ProxyCache.d.ts +9 -0
- package/src/orm/adapters/ProxyCache.d.ts.map +1 -0
- package/src/orm/adapters/ProxyCache.js +24 -0
- package/src/orm/adapters/ProxySignedRequest.d.ts +11 -0
- package/src/orm/adapters/ProxySignedRequest.d.ts.map +1 -0
- package/src/orm/adapters/ProxySignedRequest.js +30 -0
- package/src/orm/adapters/ProxySigningPath.d.ts +3 -0
- package/src/orm/adapters/ProxySigningPath.d.ts.map +1 -0
- package/src/orm/adapters/ProxySigningPath.js +25 -0
- package/src/orm/adapters/SqlProxyAdapterUtils.d.ts +19 -0
- package/src/orm/adapters/SqlProxyAdapterUtils.d.ts.map +1 -0
- package/src/orm/adapters/SqlProxyAdapterUtils.js +36 -0
- package/src/orm/adapters/SqlProxyRegistryMode.d.ts +12 -0
- package/src/orm/adapters/SqlProxyRegistryMode.d.ts.map +1 -0
- package/src/orm/adapters/SqlProxyRegistryMode.js +24 -0
- package/src/orm/adapters/SqlServerProxyAdapter.d.ts +6 -0
- package/src/orm/adapters/SqlServerProxyAdapter.d.ts.map +1 -0
- package/src/orm/adapters/SqlServerProxyAdapter.js +154 -0
- package/src/orm/migrations/MigrationStore.js +1 -1
- package/src/performance/Optimizer.d.ts +1 -0
- package/src/performance/Optimizer.d.ts.map +1 -1
- package/src/performance/Optimizer.js +21 -8
- package/src/proxy/ErrorHandler.d.ts +11 -0
- package/src/proxy/ErrorHandler.d.ts.map +1 -0
- package/src/proxy/ErrorHandler.js +7 -0
- package/src/proxy/PoolManager.d.ts +8 -0
- package/src/proxy/PoolManager.d.ts.map +1 -0
- package/src/proxy/PoolManager.js +18 -0
- package/src/proxy/ProxyBackend.d.ts +18 -0
- package/src/proxy/ProxyBackend.d.ts.map +1 -0
- package/src/proxy/ProxyBackend.js +1 -0
- package/src/proxy/ProxyConfig.d.ts +12 -0
- package/src/proxy/ProxyConfig.d.ts.map +1 -0
- package/src/proxy/ProxyConfig.js +1 -0
- package/src/proxy/ProxyRegistry.d.ts +10 -0
- package/src/proxy/ProxyRegistry.d.ts.map +1 -0
- package/src/proxy/ProxyRegistry.js +11 -0
- package/src/proxy/ProxyRequestParsing.d.ts +9 -0
- package/src/proxy/ProxyRequestParsing.d.ts.map +1 -0
- package/src/proxy/ProxyRequestParsing.js +16 -0
- package/src/proxy/ProxyServer.d.ts +21 -0
- package/src/proxy/ProxyServer.d.ts.map +1 -0
- package/src/proxy/ProxyServer.js +84 -0
- package/src/proxy/ProxyServerUtils.d.ts +37 -0
- package/src/proxy/ProxyServerUtils.d.ts.map +1 -0
- package/src/proxy/ProxyServerUtils.js +42 -0
- package/src/proxy/ProxySigningConfigResolver.d.ts +22 -0
- package/src/proxy/ProxySigningConfigResolver.d.ts.map +1 -0
- package/src/proxy/ProxySigningConfigResolver.js +24 -0
- package/src/proxy/ProxySigningRequest.d.ts +12 -0
- package/src/proxy/ProxySigningRequest.d.ts.map +1 -0
- package/src/proxy/ProxySigningRequest.js +31 -0
- package/src/proxy/RequestValidator.d.ts +15 -0
- package/src/proxy/RequestValidator.d.ts.map +1 -0
- package/src/proxy/RequestValidator.js +26 -0
- package/src/proxy/SigningService.d.ts +39 -0
- package/src/proxy/SigningService.d.ts.map +1 -0
- package/src/proxy/SigningService.js +107 -0
- package/src/proxy/SqlPayloadValidator.d.ts +13 -0
- package/src/proxy/SqlPayloadValidator.d.ts.map +1 -0
- package/src/proxy/SqlPayloadValidator.js +14 -0
- package/src/proxy/SqlProxyDbOverrides.d.ts +17 -0
- package/src/proxy/SqlProxyDbOverrides.d.ts.map +1 -0
- package/src/proxy/SqlProxyDbOverrides.js +1 -0
- package/src/proxy/SqlProxyServerDeps.d.ts +12 -0
- package/src/proxy/SqlProxyServerDeps.d.ts.map +1 -0
- package/src/proxy/SqlProxyServerDeps.js +9 -0
- package/src/proxy/StatementPayloadValidator.d.ts +13 -0
- package/src/proxy/StatementPayloadValidator.d.ts.map +1 -0
- package/src/proxy/StatementPayloadValidator.js +18 -0
- package/src/proxy/StatementRegistryLoader.d.ts +2 -0
- package/src/proxy/StatementRegistryLoader.d.ts.map +1 -0
- package/src/proxy/StatementRegistryLoader.js +36 -0
- package/src/proxy/StatementRegistryResolver.d.ts +15 -0
- package/src/proxy/StatementRegistryResolver.d.ts.map +1 -0
- package/src/proxy/StatementRegistryResolver.js +34 -0
- package/src/proxy/d1/ZintrustD1Proxy.d.ts +3 -0
- package/src/proxy/d1/ZintrustD1Proxy.d.ts.map +1 -0
- package/src/proxy/d1/ZintrustD1Proxy.js +2 -0
- package/src/proxy/d1/register.d.ts +2 -0
- package/src/proxy/d1/register.d.ts.map +1 -0
- package/src/proxy/d1/register.js +5 -0
- package/src/proxy/isMutatingSql.d.ts +2 -0
- package/src/proxy/isMutatingSql.d.ts.map +1 -0
- package/src/proxy/isMutatingSql.js +12 -0
- package/src/proxy/kv/ZintrustKvProxy.d.ts +3 -0
- package/src/proxy/kv/ZintrustKvProxy.d.ts.map +1 -0
- package/src/proxy/kv/ZintrustKvProxy.js +2 -0
- package/src/proxy/kv/register.d.ts +2 -0
- package/src/proxy/kv/register.d.ts.map +1 -0
- package/src/proxy/kv/register.js +5 -0
- package/src/proxy/mongodb/MongoDBProxyServer.d.ts +33 -0
- package/src/proxy/mongodb/MongoDBProxyServer.d.ts.map +1 -0
- package/src/proxy/mongodb/MongoDBProxyServer.js +202 -0
- package/src/proxy/mongodb/register.d.ts +2 -0
- package/src/proxy/mongodb/register.d.ts.map +1 -0
- package/src/proxy/mongodb/register.js +5 -0
- package/src/proxy/mysql/MySqlProxyServer.d.ts +8 -0
- package/src/proxy/mysql/MySqlProxyServer.d.ts.map +1 -0
- package/src/proxy/mysql/MySqlProxyServer.js +202 -0
- package/src/proxy/mysql/register.d.ts +2 -0
- package/src/proxy/mysql/register.d.ts.map +1 -0
- package/src/proxy/mysql/register.js +5 -0
- package/src/proxy/postgres/PostgresProxyServer.d.ts +8 -0
- package/src/proxy/postgres/PostgresProxyServer.d.ts.map +1 -0
- package/src/proxy/postgres/PostgresProxyServer.js +178 -0
- package/src/proxy/postgres/register.d.ts +2 -0
- package/src/proxy/postgres/register.d.ts.map +1 -0
- package/src/proxy/postgres/register.js +5 -0
- package/src/proxy/redis/RedisProxyServer.d.ts +12 -0
- package/src/proxy/redis/RedisProxyServer.d.ts.map +1 -0
- package/src/proxy/redis/RedisProxyServer.js +192 -0
- package/src/proxy/redis/register.d.ts +2 -0
- package/src/proxy/redis/register.d.ts.map +1 -0
- package/src/proxy/redis/register.js +5 -0
- package/src/proxy/smtp/SmtpProxyServer.d.ts +19 -0
- package/src/proxy/smtp/SmtpProxyServer.d.ts.map +1 -0
- package/src/proxy/smtp/SmtpProxyServer.js +290 -0
- package/src/proxy/smtp/register.d.ts +2 -0
- package/src/proxy/smtp/register.d.ts.map +1 -0
- package/src/proxy/smtp/register.js +5 -0
- package/src/proxy/sqlserver/SqlServerProxyServer.d.ts +8 -0
- package/src/proxy/sqlserver/SqlServerProxyServer.d.ts.map +1 -0
- package/src/proxy/sqlserver/SqlServerProxyServer.js +203 -0
- package/src/proxy/sqlserver/register.d.ts +2 -0
- package/src/proxy/sqlserver/register.d.ts.map +1 -0
- package/src/proxy/sqlserver/register.js +5 -0
- package/src/proxy.d.ts +4 -0
- package/src/proxy.d.ts.map +1 -0
- package/src/proxy.js +3 -0
- package/src/routes/doc.d.ts.map +1 -1
- package/src/routes/doc.js +16 -2
- package/src/routes/error.d.ts +5 -4
- package/src/routes/error.d.ts.map +1 -1
- package/src/routes/error.js +15 -13
- package/src/routes/errorPages.d.ts +2 -0
- package/src/routes/errorPages.d.ts.map +1 -1
- package/src/routes/errorPages.js +144 -4
- package/src/runtime/PluginAutoImports.d.ts +1 -0
- package/src/runtime/PluginAutoImports.d.ts.map +1 -1
- package/src/runtime/PluginAutoImports.js +94 -9
- package/src/runtime/RuntimeAdapter.d.ts +8 -9
- package/src/runtime/RuntimeAdapter.d.ts.map +1 -1
- package/src/runtime/RuntimeAdapter.js +120 -34
- package/src/runtime/RuntimeServices.d.ts +47 -0
- package/src/runtime/RuntimeServices.d.ts.map +1 -0
- package/src/runtime/RuntimeServices.js +164 -0
- package/src/runtime/StartupConfigFileRegistry.d.ts +4 -4
- package/src/runtime/StartupConfigFileRegistry.d.ts.map +1 -1
- package/src/runtime/StartupConfigFileRegistry.js +12 -0
- package/src/runtime/WorkerAdapterImports.d.ts +5 -0
- package/src/runtime/WorkerAdapterImports.d.ts.map +1 -0
- package/src/runtime/WorkerAdapterImports.js +17 -0
- package/src/runtime/WorkersModule.d.ts +6 -0
- package/src/runtime/WorkersModule.d.ts.map +1 -0
- package/src/runtime/WorkersModule.js +278 -0
- package/src/runtime/adapters/CloudflareAdapter.d.ts.map +1 -1
- package/src/runtime/adapters/CloudflareAdapter.js +19 -2
- package/src/runtime/adapters/DenoAdapter.js +1 -0
- package/src/runtime/adapters/FargateAdapter.js +1 -1
- package/src/runtime/adapters/LambdaAdapter.js +1 -1
- package/src/runtime/adapters/NodeServerAdapter.js +1 -1
- package/src/runtime/detectRuntime.d.ts +10 -0
- package/src/runtime/detectRuntime.d.ts.map +1 -0
- package/src/runtime/detectRuntime.js +57 -0
- package/src/runtime/useFileLoader.d.ts.map +1 -1
- package/src/runtime/useFileLoader.js +16 -0
- package/src/scheduler/Schedule.d.ts +36 -0
- package/src/scheduler/Schedule.d.ts.map +1 -0
- package/src/scheduler/Schedule.js +197 -0
- package/src/scheduler/ScheduleHttpGateway.d.ts +8 -0
- package/src/scheduler/ScheduleHttpGateway.d.ts.map +1 -0
- package/src/scheduler/ScheduleHttpGateway.js +196 -0
- package/src/scheduler/ScheduleRunner.d.ts +6 -0
- package/src/scheduler/ScheduleRunner.d.ts.map +1 -1
- package/src/scheduler/ScheduleRunner.js +166 -29
- package/src/scheduler/SchedulerRuntime.d.ts +15 -0
- package/src/scheduler/SchedulerRuntime.d.ts.map +1 -0
- package/src/scheduler/SchedulerRuntime.js +79 -0
- package/src/scheduler/cron/Cron.d.ts +19 -0
- package/src/scheduler/cron/Cron.d.ts.map +1 -0
- package/src/scheduler/cron/Cron.js +200 -0
- package/src/scheduler/leader/SchedulerLeader.d.ts +14 -0
- package/src/scheduler/leader/SchedulerLeader.d.ts.map +1 -0
- package/src/scheduler/leader/SchedulerLeader.js +187 -0
- package/src/scheduler/state/ScheduleStateStore.d.ts +27 -0
- package/src/scheduler/state/ScheduleStateStore.d.ts.map +1 -0
- package/src/scheduler/state/ScheduleStateStore.js +27 -0
- package/src/scheduler/types.d.ts +10 -0
- package/src/scheduler/types.d.ts.map +1 -1
- package/src/schedules/index.d.ts +1 -0
- package/src/schedules/index.d.ts.map +1 -1
- package/src/schedules/index.js +1 -0
- package/src/schedules/job-tracking-cleanup.d.ts +4 -0
- package/src/schedules/job-tracking-cleanup.d.ts.map +1 -0
- package/src/schedules/job-tracking-cleanup.js +116 -0
- package/src/schedules/log-cleanup.d.ts +1 -2
- package/src/schedules/log-cleanup.d.ts.map +1 -1
- package/src/schedules/log-cleanup.js +12 -15
- package/src/scripts/TemplateImportsCheck.js +2 -2
- package/src/scripts/TemplateSync.js +3 -4
- package/src/security/CsrfTokenManager.d.ts.map +1 -1
- package/src/security/CsrfTokenManager.js +12 -0
- package/src/security/Hash.d.ts +1 -1
- package/src/security/Hash.d.ts.map +1 -1
- package/src/security/Hash.js +31 -36
- package/src/security/Sanitizer.d.ts.map +1 -1
- package/src/security/Sanitizer.js +1 -9
- package/src/security/SignedRequest.d.ts.map +1 -1
- package/src/security/SignedRequest.js +2 -2
- package/src/seeders/SeederLoader.js +1 -1
- package/src/session/SessionManager.d.ts +3 -0
- package/src/session/SessionManager.d.ts.map +1 -1
- package/src/session/SessionManager.js +49 -10
- package/src/sockets/CloudflareSocket.d.ts +24 -0
- package/src/sockets/CloudflareSocket.d.ts.map +1 -0
- package/src/sockets/CloudflareSocket.js +259 -0
- package/src/start.d.ts.map +1 -1
- package/src/start.js +1 -8
- package/src/templates/docker/docker-compose.ecosystem.yml.tpl +301 -0
- package/src/templates/docker/docker-compose.schedules.yml.tpl +84 -0
- package/src/templates/project/basic/app/Schedules/index.ts.tpl +0 -0
- package/src/templates/project/basic/config/database.ts.tpl +1 -1
- package/src/templates/project/basic/src/zintrust.plugins.wg.ts.tpl +8 -0
- package/src/toolkit/Secrets/Manifest.d.ts.map +1 -1
- package/src/toolkit/Secrets/Manifest.js +5 -7
- package/src/tools/mail/drivers/Smtp.d.ts.map +1 -1
- package/src/tools/mail/drivers/Smtp.js +229 -18
- package/src/tools/mail/index.d.ts.map +1 -1
- package/src/tools/mail/index.js +5 -4
- package/src/tools/mail/template-loader.d.ts.map +1 -1
- package/src/tools/mail/template-loader.js +197 -29
- package/src/tools/mail/templates/auth-password-reset.d.ts +3 -0
- package/src/tools/mail/templates/auth-password-reset.d.ts.map +1 -0
- package/src/tools/mail/templates/auth-password-reset.js +231 -0
- package/src/tools/mail/templates/auth-welcome.d.ts +3 -0
- package/src/tools/mail/templates/auth-welcome.d.ts.map +1 -0
- package/src/tools/mail/templates/auth-welcome.js +236 -0
- package/src/tools/mail/templates/general.d.ts +3 -0
- package/src/tools/mail/templates/general.d.ts.map +1 -0
- package/src/tools/mail/templates/general.js +109 -0
- package/src/tools/mail/templates/index.js +2 -2
- package/src/tools/mail/templates/job-completed.d.ts +3 -0
- package/src/tools/mail/templates/job-completed.d.ts.map +1 -0
- package/src/tools/mail/templates/job-completed.js +188 -0
- package/src/tools/mail/templates/notifications-new-comment.d.ts +3 -0
- package/src/tools/mail/templates/notifications-new-comment.d.ts.map +1 -0
- package/src/tools/mail/templates/notifications-new-comment.js +228 -0
- package/src/tools/mail/templates/password-reset.d.ts +3 -0
- package/src/tools/mail/templates/password-reset.d.ts.map +1 -0
- package/src/tools/mail/templates/password-reset.js +221 -0
- package/src/tools/mail/templates/performance-report.d.ts +3 -0
- package/src/tools/mail/templates/performance-report.d.ts.map +1 -0
- package/src/tools/mail/templates/performance-report.js +258 -0
- package/src/tools/mail/templates/welcome.d.ts +3 -0
- package/src/tools/mail/templates/welcome.d.ts.map +1 -0
- package/src/tools/mail/templates/welcome.js +187 -0
- package/src/tools/mail/templates/worker-alert.d.ts +3 -0
- package/src/tools/mail/templates/worker-alert.d.ts.map +1 -0
- package/src/tools/mail/templates/worker-alert.js +229 -0
- package/src/tools/notification/Notification.js +1 -1
- package/src/tools/notification/testingHelpers.js +6 -5
- package/src/tools/queue/AdvancedQueue.js +2 -6
- package/src/tools/queue/IdempotencyManager.d.ts +6 -0
- package/src/tools/queue/IdempotencyManager.d.ts.map +1 -0
- package/src/tools/queue/IdempotencyManager.js +36 -0
- package/src/tools/queue/JobHeartbeatStore.d.ts +16 -0
- package/src/tools/queue/JobHeartbeatStore.d.ts.map +1 -0
- package/src/tools/queue/JobHeartbeatStore.js +67 -0
- package/src/tools/queue/JobReconciliationRunner.d.ts +16 -0
- package/src/tools/queue/JobReconciliationRunner.d.ts.map +1 -0
- package/src/tools/queue/JobReconciliationRunner.js +56 -0
- package/src/tools/queue/JobRecoveryDaemon.d.ts +27 -0
- package/src/tools/queue/JobRecoveryDaemon.d.ts.map +1 -0
- package/src/tools/queue/JobRecoveryDaemon.js +303 -0
- package/src/tools/queue/JobStateTracker.d.ts +140 -0
- package/src/tools/queue/JobStateTracker.d.ts.map +1 -0
- package/src/tools/queue/JobStateTracker.js +409 -0
- package/src/tools/queue/JobStateTrackerDbPersistence.d.ts +12 -0
- package/src/tools/queue/JobStateTrackerDbPersistence.d.ts.map +1 -0
- package/src/tools/queue/JobStateTrackerDbPersistence.js +239 -0
- package/src/tools/queue/Queue.d.ts.map +1 -1
- package/src/tools/queue/Queue.js +160 -16
- package/src/tools/queue/QueueDataRedactor.d.ts +6 -0
- package/src/tools/queue/QueueDataRedactor.d.ts.map +1 -0
- package/src/tools/queue/QueueDataRedactor.js +45 -0
- package/src/tools/queue/QueueExtensions.d.ts.map +1 -1
- package/src/tools/queue/QueueExtensions.js +2 -1
- package/src/tools/queue/QueueReliabilityMetrics.d.ts +38 -0
- package/src/tools/queue/QueueReliabilityMetrics.d.ts.map +1 -0
- package/src/tools/queue/QueueReliabilityMetrics.js +131 -0
- package/src/tools/queue/QueueReliabilityOrchestrator.d.ts +7 -0
- package/src/tools/queue/QueueReliabilityOrchestrator.d.ts.map +1 -0
- package/src/tools/queue/QueueReliabilityOrchestrator.js +59 -0
- package/src/tools/queue/QueueRuntimeRegistration.d.ts +1 -9
- package/src/tools/queue/QueueRuntimeRegistration.d.ts.map +1 -1
- package/src/tools/queue/QueueRuntimeRegistration.js +75 -4
- package/src/tools/queue/QueueTracing.d.ts +32 -0
- package/src/tools/queue/QueueTracing.d.ts.map +1 -0
- package/src/tools/queue/QueueTracing.js +151 -0
- package/src/tools/queue/StalledJobMonitor.d.ts +5 -0
- package/src/tools/queue/StalledJobMonitor.d.ts.map +1 -0
- package/src/tools/queue/StalledJobMonitor.js +21 -0
- package/src/tools/queue/TimeoutManager.d.ts +14 -0
- package/src/tools/queue/TimeoutManager.d.ts.map +1 -0
- package/src/tools/queue/TimeoutManager.js +77 -0
- package/src/tools/queue/drivers/Redis.d.ts +1 -0
- package/src/tools/queue/drivers/Redis.d.ts.map +1 -1
- package/src/tools/queue/drivers/Redis.js +1 -0
- package/src/tools/queue/index.d.ts +10 -0
- package/src/tools/queue/index.d.ts.map +1 -1
- package/src/tools/queue/index.js +10 -0
- package/src/tools/storage/drivers/R2.d.ts +13 -0
- package/src/tools/storage/drivers/R2.d.ts.map +1 -1
- package/src/tools/storage/drivers/R2.js +29 -0
- package/src/zintrust.plugins.d.ts +9 -0
- package/src/zintrust.plugins.d.ts.map +1 -0
- package/src/zintrust.plugins.js +7 -0
- package/src/zintrust.plugins.wg.d.ts +9 -0
- package/src/zintrust.plugins.wg.d.ts.map +1 -0
- package/src/zintrust.plugins.wg.js +7 -0
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
import { BaseCommand } from '../BaseCommand.js';
|
|
2
|
+
import { D1SqlMigrations } from '../d1/D1SqlMigrations.js';
|
|
3
|
+
import { WranglerConfig } from '../d1/WranglerConfig.js';
|
|
2
4
|
import { WranglerD1 } from '../d1/WranglerD1.js';
|
|
3
5
|
import { resolveNpmPath } from '../../common/index.js';
|
|
4
6
|
import { appConfig } from '../../config/app.js';
|
|
7
|
+
import { databaseConfig } from '../../config/database.js';
|
|
5
8
|
import { Logger } from '../../config/logger.js';
|
|
6
9
|
import { ErrorFactory } from '../../exceptions/ZintrustError.js';
|
|
10
|
+
import * as path from '../../node-singletons/path.js';
|
|
7
11
|
const RESOLVED_VOID = Promise.resolve();
|
|
8
12
|
const runWrangler = async (cmd, args) => {
|
|
9
13
|
// Back-compat entrypoint for tests; we only use this for D1 migrations apply.
|
|
@@ -13,30 +17,64 @@ const runWrangler = async (cmd, args) => {
|
|
|
13
17
|
await RESOLVED_VOID;
|
|
14
18
|
return WranglerD1.applyMigrations({ cmd, dbName, isLocal });
|
|
15
19
|
};
|
|
16
|
-
const
|
|
20
|
+
const getDbName = (options) => {
|
|
21
|
+
const value = options['database'];
|
|
22
|
+
return typeof value === 'string' && value.trim() !== '' ? value : 'zintrust_db';
|
|
23
|
+
};
|
|
24
|
+
const buildExecutionContext = (options) => {
|
|
25
|
+
const isWorkerCommand = process.argv.includes('d1:migrate:worker');
|
|
17
26
|
const isLocal = options['local'] === true || options['remote'] !== true;
|
|
18
|
-
const dbName =
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
27
|
+
const dbName = getDbName(options);
|
|
28
|
+
const projectRoot = process.cwd();
|
|
29
|
+
const migrationsRelDir = isWorkerCommand
|
|
30
|
+
? path.join('database', 'migrations', 'd1')
|
|
31
|
+
: WranglerConfig.getD1MigrationsDir(projectRoot, dbName);
|
|
32
|
+
const sourceMigrationsDir = isWorkerCommand
|
|
33
|
+
? path.join('packages', 'workers', 'migrations')
|
|
34
|
+
: databaseConfig.migrations.directory;
|
|
35
|
+
return {
|
|
36
|
+
isLocal,
|
|
37
|
+
dbName,
|
|
38
|
+
projectRoot,
|
|
39
|
+
migrationsRelDir,
|
|
40
|
+
sourceMigrationsDir,
|
|
41
|
+
outputDir: path.join(projectRoot, migrationsRelDir),
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
const handleMigrationError = (cmd, error) => {
|
|
45
|
+
Logger.error('D1 Migration failed', error);
|
|
46
|
+
ErrorFactory.createCliError('D1 Migration failed', error);
|
|
47
|
+
const err = error;
|
|
48
|
+
if (err.stdout !== undefined && err.stdout.length > 0)
|
|
49
|
+
cmd.info(err.stdout.toString());
|
|
50
|
+
if (err.stderr !== undefined && err.stderr.length > 0) {
|
|
51
|
+
const stderr = err.stderr.toString();
|
|
52
|
+
Logger.error('Wrangler stderr', stderr);
|
|
53
|
+
ErrorFactory.createCliError('Wrangler stderr', stderr);
|
|
54
|
+
}
|
|
55
|
+
throw error;
|
|
56
|
+
};
|
|
57
|
+
const executeD1Migrate = async (cmd, options) => {
|
|
58
|
+
const ctx = buildExecutionContext(options);
|
|
59
|
+
cmd.info(`Running D1 migrations for ${ctx.dbName} (${ctx.isLocal ? 'local' : 'remote'})...`);
|
|
60
|
+
cmd.info(`Generating D1 SQL migrations into ${ctx.migrationsRelDir}...`);
|
|
22
61
|
await RESOLVED_VOID;
|
|
23
62
|
try {
|
|
24
|
-
const
|
|
63
|
+
const generated = await D1SqlMigrations.compileAndWrite({
|
|
64
|
+
projectRoot: ctx.projectRoot,
|
|
65
|
+
globalDir: ctx.sourceMigrationsDir,
|
|
66
|
+
extension: databaseConfig.migrations.extension,
|
|
67
|
+
includeGlobal: true,
|
|
68
|
+
outputDir: ctx.outputDir,
|
|
69
|
+
});
|
|
70
|
+
cmd.info(`Generated ${generated.length} SQL migration file(s).`);
|
|
71
|
+
const output = WranglerD1.applyMigrations({ cmd, dbName: ctx.dbName, isLocal: ctx.isLocal });
|
|
25
72
|
if (output !== '')
|
|
26
73
|
cmd.info(output);
|
|
27
74
|
cmd.info('✓ D1 migrations completed successfully');
|
|
28
75
|
}
|
|
29
76
|
catch (error) {
|
|
30
|
-
|
|
31
|
-
ErrorFactory.createCliError('D1 Migration failed', error);
|
|
32
|
-
const err = error;
|
|
33
|
-
if (err.stdout !== undefined && err.stdout.length > 0)
|
|
34
|
-
cmd.info(err.stdout.toString());
|
|
35
|
-
if (err.stderr !== undefined && err.stderr.length > 0)
|
|
36
|
-
Logger.error('Wrangler stderr', err.stderr.toString());
|
|
37
|
-
if (err.stderr !== undefined && err.stderr.length > 0)
|
|
38
|
-
ErrorFactory.createCliError('Wrangler stderr', err.stderr.toString());
|
|
39
|
-
throw error;
|
|
77
|
+
handleMigrationError(cmd, error);
|
|
40
78
|
}
|
|
41
79
|
};
|
|
42
80
|
/**
|
|
@@ -60,6 +98,7 @@ export const D1MigrateCommand = Object.freeze({
|
|
|
60
98
|
const cmd = BaseCommand.create({
|
|
61
99
|
name: 'd1:migrate',
|
|
62
100
|
description: 'Run Cloudflare D1 migrations',
|
|
101
|
+
aliases: ['d1:migrate:worker'],
|
|
63
102
|
addOptions,
|
|
64
103
|
execute: async (options) => executeD1Migrate(cmd, options),
|
|
65
104
|
});
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deploy Command - Deploy ZinTrust to Cloudflare Workers
|
|
3
|
+
* Handles deployment of workers and proxies
|
|
4
|
+
*/
|
|
5
|
+
import type { IBaseCommand } from '../BaseCommand';
|
|
6
|
+
/**
|
|
7
|
+
* Deploy Command Factory
|
|
8
|
+
* Sealed namespace for immutability
|
|
9
|
+
*/
|
|
10
|
+
export declare const DeployCommand: Readonly<{
|
|
11
|
+
/**
|
|
12
|
+
* Create a deploy command instance
|
|
13
|
+
*/
|
|
14
|
+
create(): IBaseCommand;
|
|
15
|
+
}>;
|
|
16
|
+
//# sourceMappingURL=DeployCommand.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DeployCommand.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/DeployCommand.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAkB,YAAY,EAAE,MAAM,kBAAkB,CAAC;AA0HrE;;;GAGG;AACH,eAAO,MAAM,aAAa;IACxB;;OAEG;cACO,YAAY;EAGtB,CAAC"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { BaseCommand } from '../BaseCommand.js';
|
|
2
|
+
import { SpawnUtil } from '../utils/spawn.js';
|
|
3
|
+
import { Logger } from '../../config/logger.js';
|
|
4
|
+
import { ErrorFactory } from '../../exceptions/ZintrustError.js';
|
|
5
|
+
import { existsSync } from '../../node-singletons/fs.js';
|
|
6
|
+
import { join } from '../../node-singletons/path.js';
|
|
7
|
+
const runCompose = async (args) => {
|
|
8
|
+
try {
|
|
9
|
+
const exitCode = await SpawnUtil.spawnAndWait({ command: 'docker', args });
|
|
10
|
+
if (exitCode !== 0)
|
|
11
|
+
process.exit(exitCode);
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
catch (error) {
|
|
15
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
16
|
+
if (!message.includes("'docker' not found"))
|
|
17
|
+
throw error;
|
|
18
|
+
}
|
|
19
|
+
Logger.warn("'docker' not found. Falling back to 'docker-compose'.");
|
|
20
|
+
const exitCode = await SpawnUtil.spawnAndWait({
|
|
21
|
+
command: 'docker-compose',
|
|
22
|
+
args: args.slice(1),
|
|
23
|
+
});
|
|
24
|
+
if (exitCode !== 0)
|
|
25
|
+
process.exit(exitCode);
|
|
26
|
+
};
|
|
27
|
+
const deployContainerStack = async (label) => {
|
|
28
|
+
const composeFile = 'docker-compose.workers.yml';
|
|
29
|
+
const composePath = join(process.cwd(), composeFile);
|
|
30
|
+
if (!existsSync(composePath)) {
|
|
31
|
+
throw ErrorFactory.createCliError(`${composeFile} not found. Run \`zin init:cw\` first.`);
|
|
32
|
+
}
|
|
33
|
+
Logger.info(`Deploying ${label}...`);
|
|
34
|
+
await runCompose(['compose', '-f', composePath, 'up', '-d', '--build']);
|
|
35
|
+
Logger.info(`✅ ${label} deployed.`);
|
|
36
|
+
};
|
|
37
|
+
const deployProxyStack = async (label) => {
|
|
38
|
+
const composeFile = 'docker-compose.proxy.yml';
|
|
39
|
+
const composePath = join(process.cwd(), composeFile);
|
|
40
|
+
if (!existsSync(composePath)) {
|
|
41
|
+
throw ErrorFactory.createCliError(`${composeFile} not found.`);
|
|
42
|
+
}
|
|
43
|
+
Logger.info(`Deploying ${label}...`);
|
|
44
|
+
await runCompose(['compose', '-f', composePath, 'up', '-d', '--build']);
|
|
45
|
+
Logger.info(`✅ ${label} deployed.`);
|
|
46
|
+
};
|
|
47
|
+
const runDeploy = async (target, options) => {
|
|
48
|
+
const normalizedTarget = target.trim().toLowerCase();
|
|
49
|
+
if (normalizedTarget === 'cw' || normalizedTarget === 'cwr') {
|
|
50
|
+
const label = normalizedTarget === 'cwr'
|
|
51
|
+
? 'container workers stack (cwr compatibility alias)'
|
|
52
|
+
: 'container workers stack';
|
|
53
|
+
await deployContainerStack(label);
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
if (normalizedTarget === 'cp' || normalizedTarget === 'proxy') {
|
|
57
|
+
const label = normalizedTarget === 'proxy' ? 'proxy stack (proxy compatibility alias)' : 'proxy stack';
|
|
58
|
+
await deployProxyStack(label);
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
const environment = options.env ?? target ?? 'worker';
|
|
62
|
+
Logger.info(`Deploying to Cloudflare environment: ${environment}`);
|
|
63
|
+
const exitCode = await SpawnUtil.spawnAndWait({
|
|
64
|
+
command: 'wrangler',
|
|
65
|
+
args: ['deploy', '--env', environment],
|
|
66
|
+
});
|
|
67
|
+
if (exitCode !== 0) {
|
|
68
|
+
process.exit(exitCode);
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
const createDeployCommand = () => {
|
|
72
|
+
return BaseCommand.create({
|
|
73
|
+
name: 'deploy',
|
|
74
|
+
description: 'Deploy ZinTrust to Cloudflare Workers',
|
|
75
|
+
addOptions: (command) => {
|
|
76
|
+
command
|
|
77
|
+
.argument('[target]', 'Deployment target (worker, d1-proxy, kv-proxy, production, cw, cp)', 'worker')
|
|
78
|
+
.option('-e, --env <env>', 'Wrangler environment (overrides target)');
|
|
79
|
+
},
|
|
80
|
+
execute: async (options) => {
|
|
81
|
+
// Note: BaseCommand.create sets up action handler that calls execute(options).
|
|
82
|
+
// However, since we define arguments '[target]', commander passes them to the action callback
|
|
83
|
+
// BEFORE the options object.
|
|
84
|
+
//
|
|
85
|
+
// The BaseCommand.create generic action handler:
|
|
86
|
+
// command.action(async (...args: unknown[]) => {
|
|
87
|
+
// const options = args.at(-2) as CommandOptions;
|
|
88
|
+
// const commandArgs = args.slice(0, -2) as string[];
|
|
89
|
+
// options.args = commandArgs;
|
|
90
|
+
// await config.execute(options);
|
|
91
|
+
// });
|
|
92
|
+
//
|
|
93
|
+
// So 'target' will be available in options.args[0]
|
|
94
|
+
const target = options.args?.[0] ?? 'worker';
|
|
95
|
+
await runDeploy(target, options);
|
|
96
|
+
},
|
|
97
|
+
});
|
|
98
|
+
};
|
|
99
|
+
/**
|
|
100
|
+
* Deploy Command Factory
|
|
101
|
+
* Sealed namespace for immutability
|
|
102
|
+
*/
|
|
103
|
+
export const DeployCommand = Object.freeze({
|
|
104
|
+
/**
|
|
105
|
+
* Create a deploy command instance
|
|
106
|
+
*/
|
|
107
|
+
create() {
|
|
108
|
+
return createDeployCommand();
|
|
109
|
+
},
|
|
110
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DeployContainerProxiesCommand.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/DeployContainerProxiesCommand.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAcrE,eAAO,MAAM,6BAA6B;cAC9B,YAAY;EAyBtB,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { BaseCommand } from '../BaseCommand.js';
|
|
2
|
+
import { resolveComposePath, runComposeWithFallback, } from '../commands/DockerComposeCommandUtils.js';
|
|
3
|
+
import { Logger } from '../../config/logger.js';
|
|
4
|
+
export const DeployContainerProxiesCommand = Object.freeze({
|
|
5
|
+
create() {
|
|
6
|
+
return BaseCommand.create({
|
|
7
|
+
name: 'deploy:cp',
|
|
8
|
+
aliases: ['deploy:container-proxies', 'deploy:proxy-stack'],
|
|
9
|
+
description: 'Deploy proxy stack (docker-compose.proxy.yml)',
|
|
10
|
+
addOptions: (command) => {
|
|
11
|
+
command.option('--no-build', 'Skip image build before up');
|
|
12
|
+
command.option('--remove-orphans', 'Remove containers for services not defined in compose');
|
|
13
|
+
},
|
|
14
|
+
execute: async (options) => {
|
|
15
|
+
const composePath = resolveComposePath('docker-compose.proxy.yml', 'docker-compose.proxy.yml not found.');
|
|
16
|
+
const args = ['compose', '-f', composePath, 'up', '-d'];
|
|
17
|
+
if (options.noBuild !== true)
|
|
18
|
+
args.push('--build');
|
|
19
|
+
if (options.removeOrphans === true)
|
|
20
|
+
args.push('--remove-orphans');
|
|
21
|
+
Logger.info('Deploying proxy stack...');
|
|
22
|
+
await runComposeWithFallback(args);
|
|
23
|
+
Logger.info('✅ Proxy stack deployed.');
|
|
24
|
+
},
|
|
25
|
+
});
|
|
26
|
+
},
|
|
27
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DeployContainerWorkersCommand.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/DeployContainerWorkersCommand.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAcrE,eAAO,MAAM,6BAA6B;cAC9B,YAAY;EAyBtB,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { BaseCommand } from '../BaseCommand.js';
|
|
2
|
+
import { resolveComposePath, runComposeWithFallback, } from '../commands/DockerComposeCommandUtils.js';
|
|
3
|
+
import { Logger } from '../../config/logger.js';
|
|
4
|
+
export const DeployContainerWorkersCommand = Object.freeze({
|
|
5
|
+
create() {
|
|
6
|
+
return BaseCommand.create({
|
|
7
|
+
name: 'deploy:cw',
|
|
8
|
+
aliases: ['deploy:container-workers', 'deploy:cwr', 'deploy:container-workers-routes'],
|
|
9
|
+
description: 'Deploy Container Workers stack (docker-compose.workers.yml)',
|
|
10
|
+
addOptions: (command) => {
|
|
11
|
+
command.option('--no-build', 'Skip image build before up');
|
|
12
|
+
command.option('--remove-orphans', 'Remove containers for services not defined in compose');
|
|
13
|
+
},
|
|
14
|
+
execute: async (options) => {
|
|
15
|
+
const composePath = resolveComposePath('docker-compose.workers.yml', 'docker-compose.workers.yml not found. Run `zin init:cw` first.');
|
|
16
|
+
const args = ['compose', '-f', composePath, 'up', '-d'];
|
|
17
|
+
if (options.noBuild !== true)
|
|
18
|
+
args.push('--build');
|
|
19
|
+
if (options.removeOrphans === true)
|
|
20
|
+
args.push('--remove-orphans');
|
|
21
|
+
Logger.info('Deploying container workers stack...');
|
|
22
|
+
await runComposeWithFallback(args);
|
|
23
|
+
Logger.info('✅ Container workers deployed.');
|
|
24
|
+
},
|
|
25
|
+
});
|
|
26
|
+
},
|
|
27
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DockerComposeCommandUtils.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/DockerComposeCommandUtils.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,kBAAkB,GAAI,iBAAiB,MAAM,EAAE,gBAAgB,MAAM,KAAG,MAMpF,CAAC;AAEF,eAAO,MAAM,sBAAsB,GAAU,MAAM,MAAM,EAAE,KAAG,OAAO,CAAC,IAAI,CAqBzE,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { SpawnUtil } from '../utils/spawn.js';
|
|
2
|
+
import { Logger } from '../../config/logger.js';
|
|
3
|
+
import { ErrorFactory } from '../../exceptions/ZintrustError.js';
|
|
4
|
+
import { existsSync } from '../../node-singletons/fs.js';
|
|
5
|
+
import { join } from '../../node-singletons/path.js';
|
|
6
|
+
export const resolveComposePath = (composeFileName, missingMessage) => {
|
|
7
|
+
const composePath = join(process.cwd(), composeFileName);
|
|
8
|
+
if (!existsSync(composePath)) {
|
|
9
|
+
throw ErrorFactory.createCliError(missingMessage);
|
|
10
|
+
}
|
|
11
|
+
return composePath;
|
|
12
|
+
};
|
|
13
|
+
export const runComposeWithFallback = async (args) => {
|
|
14
|
+
try {
|
|
15
|
+
const exitCode = await SpawnUtil.spawnAndWait({ command: 'docker', args });
|
|
16
|
+
if (exitCode !== 0)
|
|
17
|
+
process.exit(exitCode);
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
22
|
+
if (!message.includes("'docker' not found")) {
|
|
23
|
+
throw error;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
Logger.warn("'docker' not found. Falling back to 'docker-compose'.");
|
|
27
|
+
const exitCode = await SpawnUtil.spawnAndWait({
|
|
28
|
+
command: 'docker-compose',
|
|
29
|
+
args: args.slice(1),
|
|
30
|
+
});
|
|
31
|
+
if (exitCode !== 0) {
|
|
32
|
+
process.exit(exitCode);
|
|
33
|
+
}
|
|
34
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DoctorArchitectureCommand.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/DoctorArchitectureCommand.ts"],"names":[],"mappings":"AAEA,OAAO,EAAe,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAIlE,eAAO,MAAM,yBAAyB;cAC1B,YAAY;EAgEtB,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { getRuntimeMode } from '../../runtime/detectRuntime.js';
|
|
2
|
+
import { BaseCommand } from '../BaseCommand.js';
|
|
3
|
+
import { Env } from '../../config/env.js';
|
|
4
|
+
import { Logger } from '../../config/logger.js';
|
|
5
|
+
export const DoctorArchitectureCommand = Object.freeze({
|
|
6
|
+
create() {
|
|
7
|
+
return BaseCommand.create({
|
|
8
|
+
name: 'doctor:architecture',
|
|
9
|
+
aliases: ['d'],
|
|
10
|
+
description: 'Validate producer/consumer architecture configuration',
|
|
11
|
+
async execute() {
|
|
12
|
+
Logger.info('🩺 Diagnosing Architecture Configuration...');
|
|
13
|
+
const mode = getRuntimeMode();
|
|
14
|
+
const workerEnabled = Env.getBool('WORKER_ENABLED', true);
|
|
15
|
+
const dockerWorker = Env.getBool('DOCKER_WORKER', false);
|
|
16
|
+
Logger.info('----------------------------------------');
|
|
17
|
+
Logger.info(`Runtime Mode: ${mode}`);
|
|
18
|
+
Logger.info(`Docker Worker: ${dockerWorker}`);
|
|
19
|
+
Logger.info(`Worker Enabled: ${workerEnabled}`);
|
|
20
|
+
Logger.info('----------------------------------------');
|
|
21
|
+
const issues = [];
|
|
22
|
+
// Rule 1: Cloudflare Workers cannot run Consumers
|
|
23
|
+
if (mode === 'cloudflare-workers' && workerEnabled) {
|
|
24
|
+
issues.push('❌ CRITICAL: Cloudflare Workers runtime detected but WORKER_ENABLED=true. Consumers will fail due to connection persistence limits. Set WORKER_ENABLED=false.');
|
|
25
|
+
}
|
|
26
|
+
// Rule 2: Containers should generally run Workers (unless dedicated to API)
|
|
27
|
+
if (mode === 'containers' && !workerEnabled) {
|
|
28
|
+
issues.push('⚠️ WARNING: Container runtime detected but WORKER_ENABLED=false. Are these containers for API only? If attempting to process jobs, enable workers.');
|
|
29
|
+
}
|
|
30
|
+
// Rule 2b: Dedicated Docker worker containers must keep workers enabled
|
|
31
|
+
if (mode === 'containers' && dockerWorker && !workerEnabled) {
|
|
32
|
+
issues.push('❌ CRITICAL: DOCKER_WORKER=true but WORKER_ENABLED=false. Dedicated worker containers must enable workers or unset DOCKER_WORKER.');
|
|
33
|
+
}
|
|
34
|
+
// Rule 3: Proxy requirement for Cloudflare
|
|
35
|
+
if (mode === 'cloudflare-workers') {
|
|
36
|
+
const useProxy = Env.getBool('USE_REDIS_PROXY', false) ||
|
|
37
|
+
Env.getBool('ENABLE_CLOUDFLARE_SOCKETS', false);
|
|
38
|
+
if (!useProxy) {
|
|
39
|
+
issues.push('❌ CRITICAL: Cloudflare runtime requires USE_REDIS_PROXY=true or ENABLE_CLOUDFLARE_SOCKETS=true for Queue producers.');
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if (issues.length > 0) {
|
|
43
|
+
Logger.error('Found configuration issues:');
|
|
44
|
+
issues.forEach((issue) => Logger.error(issue));
|
|
45
|
+
process.exit(1);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
Logger.info('✅ Architecture configuration looks valid for this runtime.');
|
|
49
|
+
}
|
|
50
|
+
await Promise.resolve();
|
|
51
|
+
},
|
|
52
|
+
});
|
|
53
|
+
},
|
|
54
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InitContainerCommand.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/InitContainerCommand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAmOlE,eAAO,MAAM,oBAAoB;cACrB,YAAY;EAkBtB,CAAC"}
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import { BaseCommand } from '../BaseCommand.js';
|
|
2
|
+
import { PromptHelper } from '../PromptHelper.js';
|
|
3
|
+
import { Logger } from '../../config/logger.js';
|
|
4
|
+
import { copyFileSync, existsSync, writeFileSync } from '../../node-singletons/fs.js';
|
|
5
|
+
import { join } from '../../node-singletons/path.js';
|
|
6
|
+
const DOCKER_COMPOSE_WORKERS_TEMPLATE = `name: zintrust-workers
|
|
7
|
+
|
|
8
|
+
services:
|
|
9
|
+
# Workers/Jobs API Service (Port 7772)
|
|
10
|
+
# Exposes the Workers API to create/manage jobs
|
|
11
|
+
workers-api:
|
|
12
|
+
build:
|
|
13
|
+
context: .
|
|
14
|
+
dockerfile: Dockerfile
|
|
15
|
+
command: ["node", "--experimental-specifier-resolution=node", "dist/src/boot/bootstrap.js"]
|
|
16
|
+
environment:
|
|
17
|
+
# Runtime
|
|
18
|
+
- NODE_ENV=\${NODE_ENV:-development}
|
|
19
|
+
- PORT=7772
|
|
20
|
+
- HOST=0.0.0.0
|
|
21
|
+
- RUNTIME_MODE=node-server
|
|
22
|
+
|
|
23
|
+
# Application
|
|
24
|
+
- APP_NAME=\${APP_NAME:-ZinTrust}
|
|
25
|
+
- APP_KEY=\${APP_KEY}
|
|
26
|
+
- ENCRYPTION_CIPHER=\${ENCRYPTION_CIPHER:-aes-256-cbc}
|
|
27
|
+
- LOG_LEVEL=\${LOG_LEVEL:-info}
|
|
28
|
+
- ZINTRUST_PROJECT_ROOT=/app/dist
|
|
29
|
+
|
|
30
|
+
# Workers & Queue
|
|
31
|
+
- WORKER_ENABLED=\${WORKER_ENABLED:-false}
|
|
32
|
+
- WORKER_AUTO_START=\${WORKER_AUTO_START:-false}
|
|
33
|
+
- QUEUE_ENABLED=true
|
|
34
|
+
- QUEUE_MONITOR_ENABLED=\${QUEUE_MONITOR_ENABLED:-false}
|
|
35
|
+
- QUEUE_MONITOR_MIDDLEWARE=\${QUEUE_MONITOR_MIDDLEWARE:-}
|
|
36
|
+
- WORKER_PERSISTENCE_DRIVER=\${WORKER_PERSISTENCE_DRIVER:-redis}
|
|
37
|
+
- WORKER_PERSISTENCE_DB_CONNECTION=\${WORKER_PERSISTENCE_DB_CONNECTION:-mysql}
|
|
38
|
+
- WORKER_PERSISTENCE_REDIS_KEY_PREFIX=\${WORKER_PERSISTENCE_REDIS_KEY_PREFIX}
|
|
39
|
+
- QUEUE_DRIVER=\${QUEUE_DRIVER:-redis}
|
|
40
|
+
- QUEUE_CONNECTION=\${QUEUE_CONNECTION:-redis}
|
|
41
|
+
- CACHE_DRIVER=\${CACHE_DRIVER:-redis}
|
|
42
|
+
|
|
43
|
+
# Redis
|
|
44
|
+
- REDIS_HOST=\${DOCKER_REDIS_HOST:-host.docker.internal}
|
|
45
|
+
- REDIS_PORT=\${REDIS_PORT:-6379}
|
|
46
|
+
- REDIS_PASSWORD=\${REDIS_PASSWORD}
|
|
47
|
+
- REDIS_QUEUE_DB=\${REDIS_QUEUE_DB:-1}
|
|
48
|
+
|
|
49
|
+
# Database
|
|
50
|
+
- DB_CONNECTION=\${DB_CONNECTION:-postgres}
|
|
51
|
+
- DB_HOST=\${DOCKER_DB_HOST:-host.docker.internal}
|
|
52
|
+
- DB_PORT=\${DB_PORT:-3306}
|
|
53
|
+
- DB_DATABASE=\${DB_DATABASE:-zintrust}
|
|
54
|
+
- DB_USERNAME=\${DB_USERNAME:-zintrust}
|
|
55
|
+
- DB_PASSWORD=\${DB_PASSWORD:-secret}
|
|
56
|
+
|
|
57
|
+
# SMTP Mail
|
|
58
|
+
- MAIL_DRIVER=\${MAIL_DRIVER:-smtp}
|
|
59
|
+
- MAIL_CONNECTION=\${MAIL_CONNECTION:-smtp}
|
|
60
|
+
- MAIL_HOST=\${MAIL_HOST}
|
|
61
|
+
- MAIL_PORT=\${MAIL_PORT:-587}
|
|
62
|
+
- MAIL_SECURE=\${MAIL_SECURE:-false}
|
|
63
|
+
- MAIL_USERNAME=\${MAIL_USERNAME}
|
|
64
|
+
- MAIL_PASSWORD=\${MAIL_PASSWORD}
|
|
65
|
+
- MAIL_FROM_ADDRESS=\${MAIL_FROM_ADDRESS}
|
|
66
|
+
- MAIL_FROM_NAME=\${MAIL_FROM_NAME:-ZinTrust}
|
|
67
|
+
|
|
68
|
+
# PostgreSQL
|
|
69
|
+
- DB_PORT_POSTGRESQL=\${DB_PORT_POSTGRESQL:-5432}
|
|
70
|
+
- DB_DATABASE_POSTGRESQL=\${DB_DATABASE_POSTGRESQL:-zintrust}
|
|
71
|
+
- DB_USERNAME_POSTGRESQL=\${DB_USERNAME_POSTGRESQL:-zintrust}
|
|
72
|
+
- DB_PASSWORD_POSTGRESQL=\${DB_PASSWORD_POSTGRESQL:-secret}
|
|
73
|
+
|
|
74
|
+
# MySQL
|
|
75
|
+
- DB_PORT_MYSQL=\${DB_PORT_MYSQL:-3306}
|
|
76
|
+
- DB_DATABASE_MYSQL=\${DB_DATABASE_MYSQL:-zintrust}
|
|
77
|
+
- DB_USERNAME_MYSQL=\${DB_USERNAME_MYSQL:-zintrust}
|
|
78
|
+
- DB_PASSWORD_MYSQL=\${DB_PASSWORD_MYSQL:-secret}
|
|
79
|
+
|
|
80
|
+
# Cloudflare D1
|
|
81
|
+
- D1_DATABASE_ID=\${D1_DATABASE_ID}
|
|
82
|
+
- D1_ACCOUNT_ID=\${D1_ACCOUNT_ID}
|
|
83
|
+
- D1_API_TOKEN=\${D1_API_TOKEN}
|
|
84
|
+
- D1_REMOTE_URL=\${D1_REMOTE_URL}
|
|
85
|
+
- D1_REMOTE_KEY_ID=\${D1_REMOTE_KEY_ID}
|
|
86
|
+
- D1_REMOTE_SECRET=\${D1_REMOTE_SECRET}
|
|
87
|
+
|
|
88
|
+
# Cloudflare KV
|
|
89
|
+
- KV_NAMESPACE_ID=\${KV_NAMESPACE_ID}
|
|
90
|
+
- KV_ACCOUNT_ID=\${KV_ACCOUNT_ID}
|
|
91
|
+
- KV_API_TOKEN=\${KV_API_TOKEN}
|
|
92
|
+
- KV_REMOTE_URL=\${KV_REMOTE_URL}
|
|
93
|
+
- KV_REMOTE_KEY_ID=\${KV_REMOTE_KEY_ID}
|
|
94
|
+
- KV_REMOTE_SECRET=\${KV_REMOTE_SECRET}
|
|
95
|
+
ports:
|
|
96
|
+
- '7772:7772'
|
|
97
|
+
|
|
98
|
+
`;
|
|
99
|
+
const DOCKERFILE_TEMPLATE = String.raw `# syntax=docker/dockerfile:1.6
|
|
100
|
+
# Build Stage - Compile TypeScript
|
|
101
|
+
FROM node:20-alpine AS builder
|
|
102
|
+
|
|
103
|
+
WORKDIR /app
|
|
104
|
+
|
|
105
|
+
# Reuse npm cache across builds (requires BuildKit)
|
|
106
|
+
ENV NPM_CONFIG_CACHE=/root/.npm
|
|
107
|
+
ENV NPM_CONFIG_PREFER_OFFLINE=true
|
|
108
|
+
|
|
109
|
+
# Reuse npm cache across builds (requires BuildKit)
|
|
110
|
+
ENV NPM_CONFIG_CACHE=/root/.npm
|
|
111
|
+
ENV NPM_CONFIG_PREFER_OFFLINE=true
|
|
112
|
+
|
|
113
|
+
# Install build dependencies for native modules (better-sqlite3, bcrypt)
|
|
114
|
+
RUN apk add --no-cache python3 make g++
|
|
115
|
+
|
|
116
|
+
# Copy package files
|
|
117
|
+
COPY package.json package-lock.json ./
|
|
118
|
+
|
|
119
|
+
# Install dependencies (including dev dependencies needed for build)
|
|
120
|
+
RUN --mount=type=cache,target=/root/.npm,id=zintrust-npm-cache,sharing=locked \
|
|
121
|
+
npm config set fetch-retries 5 \
|
|
122
|
+
&& npm config set fetch-retry-mintimeout 20000 \
|
|
123
|
+
&& npm config set fetch-retry-maxtimeout 120000 \
|
|
124
|
+
&& npm ci
|
|
125
|
+
|
|
126
|
+
# Copy source code using COPY . . to handle optional folders automatically
|
|
127
|
+
COPY . .
|
|
128
|
+
|
|
129
|
+
# Build TypeScript to JavaScript
|
|
130
|
+
ARG BUILD_VARIANT=full
|
|
131
|
+
RUN --mount=type=cache,target=/root/.npm,id=zintrust-npm-cache,sharing=locked npm run build:dk
|
|
132
|
+
|
|
133
|
+
# Runtime Stage - Production image
|
|
134
|
+
FROM node:20-alpine AS runtime
|
|
135
|
+
|
|
136
|
+
WORKDIR /app
|
|
137
|
+
|
|
138
|
+
# Set environment variables
|
|
139
|
+
ENV NODE_ENV=production
|
|
140
|
+
ENV PORT=7772
|
|
141
|
+
ENV HOST=0.0.0.0
|
|
142
|
+
|
|
143
|
+
# Create non-root user for security
|
|
144
|
+
RUN addgroup -g 1001 -S nodejs && adduser -S nodejs -u 1001
|
|
145
|
+
|
|
146
|
+
# Copy package files for production dependencies
|
|
147
|
+
COPY package.json package-lock.json ./
|
|
148
|
+
|
|
149
|
+
# Install only production dependencies (requires build tools for native modules)
|
|
150
|
+
RUN --mount=type=cache,target=/root/.npm,id=zintrust-npm-cache,sharing=locked \
|
|
151
|
+
apk add --no-cache --virtual .build-deps python3 make g++ \
|
|
152
|
+
&& npm ci --omit=dev \
|
|
153
|
+
&& apk del .build-deps
|
|
154
|
+
|
|
155
|
+
# Copy compiled code from builder stage
|
|
156
|
+
COPY --from=builder /app/dist ./dist
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
# Change ownership to nodejs user
|
|
160
|
+
RUN chown -R nodejs:nodejs /app
|
|
161
|
+
|
|
162
|
+
# Switch to non-root user
|
|
163
|
+
USER nodejs
|
|
164
|
+
|
|
165
|
+
# Health check
|
|
166
|
+
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
|
|
167
|
+
CMD node -e "require('node:http').get('http://localhost:7772/health', (r) => {if (r.statusCode !== 200) throw new Error(r.statusCode)})"
|
|
168
|
+
|
|
169
|
+
# Expose port
|
|
170
|
+
EXPOSE 7772
|
|
171
|
+
|
|
172
|
+
# Start application (compiled JS; no tsx needed in runtime)
|
|
173
|
+
CMD ["node", "dist/src/boot/bootstrap.js"]
|
|
174
|
+
`;
|
|
175
|
+
const backupSuffix = () => new Date().toISOString().replaceAll(/[:.]/g, '-');
|
|
176
|
+
const backupFileIfExists = (filePath) => {
|
|
177
|
+
if (!existsSync(filePath))
|
|
178
|
+
return;
|
|
179
|
+
const backupPath = `${filePath}.bak.${backupSuffix()}`;
|
|
180
|
+
copyFileSync(filePath, backupPath);
|
|
181
|
+
Logger.info(`🗂️ Backup created: ${backupPath}`);
|
|
182
|
+
};
|
|
183
|
+
async function writeDockerComposeFile(cwd) {
|
|
184
|
+
const composePath = join(cwd, 'docker-compose.workers.yml');
|
|
185
|
+
let shouldWrite = true;
|
|
186
|
+
if (existsSync(composePath)) {
|
|
187
|
+
shouldWrite = await PromptHelper.confirm('docker-compose.workers.yml already exists. Overwrite?', false);
|
|
188
|
+
}
|
|
189
|
+
if (shouldWrite) {
|
|
190
|
+
backupFileIfExists(composePath);
|
|
191
|
+
writeFileSync(composePath, DOCKER_COMPOSE_WORKERS_TEMPLATE);
|
|
192
|
+
Logger.info('✅ Created docker-compose.workers.yml');
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
Logger.info('Skipped docker-compose.workers.yml');
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
async function writeDockerfile(cwd) {
|
|
199
|
+
const dockerfilePath = join(cwd, 'Dockerfile');
|
|
200
|
+
let shouldWrite = true;
|
|
201
|
+
if (existsSync(dockerfilePath)) {
|
|
202
|
+
// Only ask if it's different or just generic confirm? Let's just ask.
|
|
203
|
+
shouldWrite = await PromptHelper.confirm('Dockerfile already exists. Overwrite with standard worker configuration?', false);
|
|
204
|
+
}
|
|
205
|
+
if (shouldWrite) {
|
|
206
|
+
backupFileIfExists(dockerfilePath);
|
|
207
|
+
writeFileSync(dockerfilePath, DOCKERFILE_TEMPLATE);
|
|
208
|
+
Logger.info('✅ Created Dockerfile');
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
Logger.info('Skipped Dockerfile');
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
export const InitContainerCommand = Object.freeze({
|
|
215
|
+
create() {
|
|
216
|
+
return BaseCommand.create({
|
|
217
|
+
name: 'init:container-workers',
|
|
218
|
+
aliases: ['init:cw', 'init:cwr', 'init:container-workers-routes'],
|
|
219
|
+
description: 'Initialize container-based worker infrastructure',
|
|
220
|
+
async execute() {
|
|
221
|
+
Logger.info('Initializing container-based worker infrastructure...');
|
|
222
|
+
const cwd = process.cwd();
|
|
223
|
+
await writeDockerComposeFile(cwd);
|
|
224
|
+
await writeDockerfile(cwd);
|
|
225
|
+
Logger.info('✅ Container worker scaffolding complete.');
|
|
226
|
+
Logger.info('Run with: docker-compose -f docker-compose.workers.yml up');
|
|
227
|
+
await Promise.resolve();
|
|
228
|
+
},
|
|
229
|
+
});
|
|
230
|
+
},
|
|
231
|
+
});
|