@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.
Files changed (590) hide show
  1. package/bin/zintrust-main.d.ts.map +1 -1
  2. package/bin/zintrust-main.js +22 -1
  3. package/package.json +24 -4
  4. package/public/error-pages/404.html +2 -2
  5. package/src/auth/Auth.js +1 -1
  6. package/src/boot/Application.d.ts +1 -16
  7. package/src/boot/Application.d.ts.map +1 -1
  8. package/src/boot/Application.js +2 -290
  9. package/src/boot/Server.d.ts +1 -1
  10. package/src/boot/Server.d.ts.map +1 -1
  11. package/src/boot/bootstrap.js +50 -16
  12. package/src/boot/registry/registerRoute.d.ts +6 -0
  13. package/src/boot/registry/registerRoute.d.ts.map +1 -0
  14. package/src/boot/registry/registerRoute.js +96 -0
  15. package/src/boot/registry/runtime.d.ts +15 -0
  16. package/src/boot/registry/runtime.d.ts.map +1 -0
  17. package/src/boot/registry/runtime.js +364 -0
  18. package/src/boot/registry/type.d.ts +25 -0
  19. package/src/boot/registry/type.d.ts.map +1 -0
  20. package/src/boot/registry/type.js +1 -0
  21. package/src/boot/registry/worker.d.ts +6 -0
  22. package/src/boot/registry/worker.d.ts.map +1 -0
  23. package/src/boot/registry/worker.js +35 -0
  24. package/src/cache/drivers/KVRemoteDriver.d.ts.map +1 -1
  25. package/src/cache/drivers/KVRemoteDriver.js +14 -1
  26. package/src/cli/CLI.d.ts.map +1 -1
  27. package/src/cli/CLI.js +94 -34
  28. package/src/cli/ErrorHandler.js +1 -1
  29. package/src/cli/commands/ConfigCommand.d.ts.map +1 -1
  30. package/src/cli/commands/ConfigCommand.js +3 -5
  31. package/src/cli/commands/ContainerProxiesCommand.d.ts +5 -0
  32. package/src/cli/commands/ContainerProxiesCommand.d.ts.map +1 -0
  33. package/src/cli/commands/ContainerProxiesCommand.js +77 -0
  34. package/src/cli/commands/ContainerWorkersCommand.d.ts +5 -0
  35. package/src/cli/commands/ContainerWorkersCommand.d.ts.map +1 -0
  36. package/src/cli/commands/ContainerWorkersCommand.js +57 -0
  37. package/src/cli/commands/D1LearnCommand.d.ts +9 -0
  38. package/src/cli/commands/D1LearnCommand.d.ts.map +1 -0
  39. package/src/cli/commands/D1LearnCommand.js +143 -0
  40. package/src/cli/commands/D1MigrateCommand.d.ts.map +1 -1
  41. package/src/cli/commands/D1MigrateCommand.js +55 -16
  42. package/src/cli/commands/DeployCommand.d.ts +16 -0
  43. package/src/cli/commands/DeployCommand.d.ts.map +1 -0
  44. package/src/cli/commands/DeployCommand.js +110 -0
  45. package/src/cli/commands/DeployContainerProxiesCommand.d.ts +5 -0
  46. package/src/cli/commands/DeployContainerProxiesCommand.d.ts.map +1 -0
  47. package/src/cli/commands/DeployContainerProxiesCommand.js +27 -0
  48. package/src/cli/commands/DeployContainerWorkersCommand.d.ts +5 -0
  49. package/src/cli/commands/DeployContainerWorkersCommand.d.ts.map +1 -0
  50. package/src/cli/commands/DeployContainerWorkersCommand.js +27 -0
  51. package/src/cli/commands/DockerComposeCommandUtils.d.ts +3 -0
  52. package/src/cli/commands/DockerComposeCommandUtils.d.ts.map +1 -0
  53. package/src/cli/commands/DockerComposeCommandUtils.js +34 -0
  54. package/src/cli/commands/DoctorArchitectureCommand.d.ts +5 -0
  55. package/src/cli/commands/DoctorArchitectureCommand.d.ts.map +1 -0
  56. package/src/cli/commands/DoctorArchitectureCommand.js +54 -0
  57. package/src/cli/commands/InitContainerCommand.d.ts +5 -0
  58. package/src/cli/commands/InitContainerCommand.d.ts.map +1 -0
  59. package/src/cli/commands/InitContainerCommand.js +231 -0
  60. package/src/cli/commands/InitEcosystemCommand.d.ts +6 -0
  61. package/src/cli/commands/InitEcosystemCommand.d.ts.map +1 -0
  62. package/src/cli/commands/InitEcosystemCommand.js +51 -0
  63. package/src/cli/commands/InitProducerCommand.d.ts +5 -0
  64. package/src/cli/commands/InitProducerCommand.d.ts.map +1 -0
  65. package/src/cli/commands/InitProducerCommand.js +47 -0
  66. package/src/cli/commands/InitProxyCommand.d.ts +5 -0
  67. package/src/cli/commands/InitProxyCommand.d.ts.map +1 -0
  68. package/src/cli/commands/InitProxyCommand.js +442 -0
  69. package/src/cli/commands/MigrateCommand.d.ts.map +1 -1
  70. package/src/cli/commands/MigrateCommand.js +78 -36
  71. package/src/cli/commands/MigrateWorkerCommand.d.ts.map +1 -1
  72. package/src/cli/commands/MigrateWorkerCommand.js +36 -2
  73. package/src/cli/commands/MongoDBProxyCommand.d.ts +5 -0
  74. package/src/cli/commands/MongoDBProxyCommand.d.ts.map +1 -0
  75. package/src/cli/commands/MongoDBProxyCommand.js +98 -0
  76. package/src/cli/commands/MySqlProxyCommand.d.ts +6 -0
  77. package/src/cli/commands/MySqlProxyCommand.d.ts.map +1 -0
  78. package/src/cli/commands/MySqlProxyCommand.js +32 -0
  79. package/src/cli/commands/PostgresProxyCommand.d.ts +6 -0
  80. package/src/cli/commands/PostgresProxyCommand.d.ts.map +1 -0
  81. package/src/cli/commands/PostgresProxyCommand.js +32 -0
  82. package/src/cli/commands/ProxyCommand.d.ts +12 -0
  83. package/src/cli/commands/ProxyCommand.d.ts.map +1 -0
  84. package/src/cli/commands/ProxyCommand.js +80 -0
  85. package/src/cli/commands/ProxyCommandUtils.d.ts +6 -0
  86. package/src/cli/commands/ProxyCommandUtils.d.ts.map +1 -0
  87. package/src/cli/commands/ProxyCommandUtils.js +38 -0
  88. package/src/cli/commands/PutCommand.d.ts +6 -0
  89. package/src/cli/commands/PutCommand.d.ts.map +1 -0
  90. package/src/cli/commands/PutCommand.js +173 -0
  91. package/src/cli/commands/QueueRecoveryCommand.d.ts +6 -0
  92. package/src/cli/commands/QueueRecoveryCommand.d.ts.map +1 -0
  93. package/src/cli/commands/QueueRecoveryCommand.js +612 -0
  94. package/src/cli/commands/RedisProxyCommand.d.ts +6 -0
  95. package/src/cli/commands/RedisProxyCommand.d.ts.map +1 -0
  96. package/src/cli/commands/RedisProxyCommand.js +53 -0
  97. package/src/cli/commands/ScheduleListCommand.d.ts +6 -0
  98. package/src/cli/commands/ScheduleListCommand.d.ts.map +1 -0
  99. package/src/cli/commands/ScheduleListCommand.js +62 -0
  100. package/src/cli/commands/ScheduleRunCommand.d.ts +6 -0
  101. package/src/cli/commands/ScheduleRunCommand.d.ts.map +1 -0
  102. package/src/cli/commands/ScheduleRunCommand.js +32 -0
  103. package/src/cli/commands/ScheduleStartCommand.d.ts +6 -0
  104. package/src/cli/commands/ScheduleStartCommand.d.ts.map +1 -0
  105. package/src/cli/commands/ScheduleStartCommand.js +40 -0
  106. package/src/cli/commands/SecretsCommand.d.ts.map +1 -1
  107. package/src/cli/commands/SecretsCommand.js +2 -2
  108. package/src/cli/commands/SmtpProxyCommand.d.ts +6 -0
  109. package/src/cli/commands/SmtpProxyCommand.d.ts.map +1 -0
  110. package/src/cli/commands/SmtpProxyCommand.js +56 -0
  111. package/src/cli/commands/SqlProxyCommandUtils.d.ts +46 -0
  112. package/src/cli/commands/SqlProxyCommandUtils.d.ts.map +1 -0
  113. package/src/cli/commands/SqlProxyCommandUtils.js +48 -0
  114. package/src/cli/commands/SqlServerProxyCommand.d.ts +5 -0
  115. package/src/cli/commands/SqlServerProxyCommand.d.ts.map +1 -0
  116. package/src/cli/commands/SqlServerProxyCommand.js +85 -0
  117. package/src/cli/commands/StartCommand.d.ts.map +1 -1
  118. package/src/cli/commands/StartCommand.js +132 -17
  119. package/src/cli/commands/WorkerCommands.d.ts +1 -0
  120. package/src/cli/commands/WorkerCommands.d.ts.map +1 -1
  121. package/src/cli/commands/WorkerCommands.js +140 -6
  122. package/src/cli/commands/index.d.ts +2 -0
  123. package/src/cli/commands/index.d.ts.map +1 -1
  124. package/src/cli/commands/index.js +2 -0
  125. package/src/cli/commands/runner/index.d.ts +2 -2
  126. package/src/cli/commands/runner/index.d.ts.map +1 -1
  127. package/src/cli/commands/runner/index.js +15 -4
  128. package/src/cli/commands/schedule/ScheduleCliSupport.d.ts +6 -0
  129. package/src/cli/commands/schedule/ScheduleCliSupport.d.ts.map +1 -0
  130. package/src/cli/commands/schedule/ScheduleCliSupport.js +55 -0
  131. package/src/cli/config/ConfigManager.d.ts.map +1 -1
  132. package/src/cli/config/ConfigManager.js +8 -1
  133. package/src/cli/d1/D1SqlMigrations.d.ts.map +1 -1
  134. package/src/cli/d1/D1SqlMigrations.js +14 -1
  135. package/src/cli/d1/WranglerConfig.d.ts.map +1 -1
  136. package/src/cli/d1/WranglerConfig.js +34 -2
  137. package/src/cli/index.d.ts +4 -0
  138. package/src/cli/index.d.ts.map +1 -1
  139. package/src/cli/index.js +4 -0
  140. package/src/cli/scaffolding/ProjectScaffolder.d.ts.map +1 -1
  141. package/src/cli/scaffolding/ProjectScaffolder.js +2 -0
  142. package/src/cli/scaffolding/ServiceScaffolder.d.ts.map +1 -1
  143. package/src/cli/scaffolding/ServiceScaffolder.js +1 -0
  144. package/src/cli/services/VersionChecker.d.ts.map +1 -1
  145. package/src/cli/services/VersionChecker.js +5 -1
  146. package/src/cli/utils/DatabaseCliUtils.d.ts.map +1 -1
  147. package/src/cli/utils/DatabaseCliUtils.js +6 -1
  148. package/src/cli/utils/EnvFileLoader.d.ts.map +1 -1
  149. package/src/cli/utils/EnvFileLoader.js +35 -15
  150. package/src/cli/workers/QueueWorkRunner.js +1 -1
  151. package/src/cli.d.ts +5 -0
  152. package/src/cli.d.ts.map +1 -0
  153. package/src/cli.js +4 -0
  154. package/src/collections/index.d.ts +2 -2
  155. package/src/collections/index.d.ts.map +1 -1
  156. package/src/collections/index.js +1 -1
  157. package/src/common/HealthRoutes.d.ts.map +1 -1
  158. package/src/common/HealthRoutes.js +50 -2
  159. package/src/common/RemoteSignedJson.d.ts +1 -0
  160. package/src/common/RemoteSignedJson.d.ts.map +1 -1
  161. package/src/common/RemoteSignedJson.js +81 -29
  162. package/src/common/index.d.ts +1 -0
  163. package/src/common/index.d.ts.map +1 -1
  164. package/src/common/index.js +12 -1
  165. package/src/common/utility.d.ts.map +1 -1
  166. package/src/common/utility.js +2 -6
  167. package/src/config/FileLogWriter.d.ts.map +1 -1
  168. package/src/config/FileLogWriter.js +21 -6
  169. package/src/config/app.d.ts +4 -0
  170. package/src/config/app.d.ts.map +1 -1
  171. package/src/config/app.js +4 -0
  172. package/src/config/cache.d.ts.map +1 -1
  173. package/src/config/cache.js +22 -2
  174. package/src/config/cloudflare.d.ts +5 -1
  175. package/src/config/cloudflare.d.ts.map +1 -1
  176. package/src/config/cloudflare.js +67 -8
  177. package/src/config/database.d.ts.map +1 -1
  178. package/src/config/database.js +48 -13
  179. package/src/config/env.d.ts +87 -2
  180. package/src/config/env.d.ts.map +1 -1
  181. package/src/config/env.js +158 -19
  182. package/src/config/index.d.ts +1 -0
  183. package/src/config/index.d.ts.map +1 -1
  184. package/src/config/mail.d.ts.map +1 -1
  185. package/src/config/mail.js +16 -10
  186. package/src/config/middleware.d.ts +5 -0
  187. package/src/config/middleware.d.ts.map +1 -1
  188. package/src/config/middleware.js +19 -1
  189. package/src/config/queue.d.ts.map +1 -1
  190. package/src/config/queue.js +70 -9
  191. package/src/config/redis.d.ts.map +1 -1
  192. package/src/config/redis.js +48 -13
  193. package/src/config/storage.d.ts.map +1 -1
  194. package/src/config/storage.js +1 -0
  195. package/src/config/type.d.ts +18 -0
  196. package/src/config/type.d.ts.map +1 -1
  197. package/src/config/workers.d.ts.map +1 -1
  198. package/src/config/workers.js +122 -16
  199. package/src/functions/cloudflare.d.ts.map +1 -1
  200. package/src/functions/cloudflare.js +55 -1
  201. package/src/health/StartupHealthChecks.js +1 -1
  202. package/src/helper/index.d.ts +225 -0
  203. package/src/helper/index.d.ts.map +1 -0
  204. package/src/helper/index.js +347 -0
  205. package/src/http/FileUpload.d.ts +3 -2
  206. package/src/http/FileUpload.d.ts.map +1 -1
  207. package/src/http/Kernel.d.ts.map +1 -1
  208. package/src/http/Kernel.js +2 -1
  209. package/src/http/error-pages/ErrorPageRenderer.d.ts +4 -0
  210. package/src/http/error-pages/ErrorPageRenderer.d.ts.map +1 -1
  211. package/src/http/error-pages/ErrorPageRenderer.js +141 -1
  212. package/src/http/middleware/BodyParsingMiddleware.d.ts.map +1 -1
  213. package/src/http/middleware/BodyParsingMiddleware.js +33 -6
  214. package/src/index.d.ts +26 -57
  215. package/src/index.d.ts.map +1 -1
  216. package/src/index.js +32 -18
  217. package/src/microservices/ServiceAuthMiddleware.d.ts.map +1 -1
  218. package/src/microservices/ServiceAuthMiddleware.js +12 -4
  219. package/src/middleware/CsrfMiddleware.d.ts.map +1 -1
  220. package/src/middleware/CsrfMiddleware.js +30 -16
  221. package/src/middleware/ErrorHandlerMiddleware.d.ts.map +1 -1
  222. package/src/middleware/ErrorHandlerMiddleware.js +2 -1
  223. package/src/migrations/MigrationDiscovery.d.ts.map +1 -1
  224. package/src/migrations/MigrationDiscovery.js +2 -1
  225. package/src/migrations/MigrationLoader.js +1 -1
  226. package/src/migrations/schema/SchemaCompiler.d.ts.map +1 -1
  227. package/src/migrations/schema/SchemaCompiler.js +6 -3
  228. package/src/node-singletons/crypto.d.ts +1 -1
  229. package/src/node-singletons/crypto.d.ts.map +1 -1
  230. package/src/node-singletons/crypto.js +1 -1
  231. package/src/node-singletons/fs.d.ts +1 -1
  232. package/src/node-singletons/fs.d.ts.map +1 -1
  233. package/src/node-singletons/path.d.ts +1 -1
  234. package/src/node-singletons/path.d.ts.map +1 -1
  235. package/src/node-singletons/path.js +1 -1
  236. package/src/node-singletons/stream.d.ts +11 -0
  237. package/src/node-singletons/stream.d.ts.map +1 -0
  238. package/src/node-singletons/stream.js +8 -0
  239. package/src/observability/OpenTelemetry.d.ts +7 -0
  240. package/src/observability/OpenTelemetry.d.ts.map +1 -1
  241. package/src/observability/OpenTelemetry.js +49 -2
  242. package/src/orm/Database.d.ts +4 -0
  243. package/src/orm/Database.d.ts.map +1 -1
  244. package/src/orm/Database.js +80 -9
  245. package/src/orm/DatabaseAdapter.d.ts +1 -0
  246. package/src/orm/DatabaseAdapter.d.ts.map +1 -1
  247. package/src/orm/DatabaseRuntimeRegistration.d.ts.map +1 -1
  248. package/src/orm/DatabaseRuntimeRegistration.js +2 -0
  249. package/src/orm/QueryBuilder.d.ts +1 -0
  250. package/src/orm/QueryBuilder.d.ts.map +1 -1
  251. package/src/orm/QueryBuilder.js +33 -3
  252. package/src/orm/SchemaCompiler.d.ts.map +1 -1
  253. package/src/orm/SchemaCompiler.js +6 -3
  254. package/src/orm/SchemaStatemenWriter.d.ts +15 -0
  255. package/src/orm/SchemaStatemenWriter.d.ts.map +1 -0
  256. package/src/orm/SchemaStatemenWriter.js +78 -0
  257. package/src/orm/adapters/D1Adapter.d.ts.map +1 -1
  258. package/src/orm/adapters/D1Adapter.js +52 -2
  259. package/src/orm/adapters/D1RemoteAdapter.d.ts.map +1 -1
  260. package/src/orm/adapters/D1RemoteAdapter.js +150 -89
  261. package/src/orm/adapters/MongoDBProxyAdapter.d.ts +3 -0
  262. package/src/orm/adapters/MongoDBProxyAdapter.d.ts.map +1 -0
  263. package/src/orm/adapters/MongoDBProxyAdapter.js +128 -0
  264. package/src/orm/adapters/MySQLProxyAdapter.d.ts +11 -0
  265. package/src/orm/adapters/MySQLProxyAdapter.d.ts.map +1 -0
  266. package/src/orm/adapters/MySQLProxyAdapter.js +162 -0
  267. package/src/orm/adapters/PostgreSQLProxyAdapter.d.ts +11 -0
  268. package/src/orm/adapters/PostgreSQLProxyAdapter.d.ts.map +1 -0
  269. package/src/orm/adapters/PostgreSQLProxyAdapter.js +163 -0
  270. package/src/orm/adapters/ProxyCache.d.ts +9 -0
  271. package/src/orm/adapters/ProxyCache.d.ts.map +1 -0
  272. package/src/orm/adapters/ProxyCache.js +24 -0
  273. package/src/orm/adapters/ProxySignedRequest.d.ts +11 -0
  274. package/src/orm/adapters/ProxySignedRequest.d.ts.map +1 -0
  275. package/src/orm/adapters/ProxySignedRequest.js +30 -0
  276. package/src/orm/adapters/ProxySigningPath.d.ts +3 -0
  277. package/src/orm/adapters/ProxySigningPath.d.ts.map +1 -0
  278. package/src/orm/adapters/ProxySigningPath.js +25 -0
  279. package/src/orm/adapters/SqlProxyAdapterUtils.d.ts +19 -0
  280. package/src/orm/adapters/SqlProxyAdapterUtils.d.ts.map +1 -0
  281. package/src/orm/adapters/SqlProxyAdapterUtils.js +36 -0
  282. package/src/orm/adapters/SqlProxyRegistryMode.d.ts +12 -0
  283. package/src/orm/adapters/SqlProxyRegistryMode.d.ts.map +1 -0
  284. package/src/orm/adapters/SqlProxyRegistryMode.js +24 -0
  285. package/src/orm/adapters/SqlServerProxyAdapter.d.ts +6 -0
  286. package/src/orm/adapters/SqlServerProxyAdapter.d.ts.map +1 -0
  287. package/src/orm/adapters/SqlServerProxyAdapter.js +154 -0
  288. package/src/orm/migrations/MigrationStore.js +1 -1
  289. package/src/performance/Optimizer.d.ts +1 -0
  290. package/src/performance/Optimizer.d.ts.map +1 -1
  291. package/src/performance/Optimizer.js +21 -8
  292. package/src/proxy/ErrorHandler.d.ts +11 -0
  293. package/src/proxy/ErrorHandler.d.ts.map +1 -0
  294. package/src/proxy/ErrorHandler.js +7 -0
  295. package/src/proxy/PoolManager.d.ts +8 -0
  296. package/src/proxy/PoolManager.d.ts.map +1 -0
  297. package/src/proxy/PoolManager.js +18 -0
  298. package/src/proxy/ProxyBackend.d.ts +18 -0
  299. package/src/proxy/ProxyBackend.d.ts.map +1 -0
  300. package/src/proxy/ProxyBackend.js +1 -0
  301. package/src/proxy/ProxyConfig.d.ts +12 -0
  302. package/src/proxy/ProxyConfig.d.ts.map +1 -0
  303. package/src/proxy/ProxyConfig.js +1 -0
  304. package/src/proxy/ProxyRegistry.d.ts +10 -0
  305. package/src/proxy/ProxyRegistry.d.ts.map +1 -0
  306. package/src/proxy/ProxyRegistry.js +11 -0
  307. package/src/proxy/ProxyRequestParsing.d.ts +9 -0
  308. package/src/proxy/ProxyRequestParsing.d.ts.map +1 -0
  309. package/src/proxy/ProxyRequestParsing.js +16 -0
  310. package/src/proxy/ProxyServer.d.ts +21 -0
  311. package/src/proxy/ProxyServer.d.ts.map +1 -0
  312. package/src/proxy/ProxyServer.js +84 -0
  313. package/src/proxy/ProxyServerUtils.d.ts +37 -0
  314. package/src/proxy/ProxyServerUtils.d.ts.map +1 -0
  315. package/src/proxy/ProxyServerUtils.js +42 -0
  316. package/src/proxy/ProxySigningConfigResolver.d.ts +22 -0
  317. package/src/proxy/ProxySigningConfigResolver.d.ts.map +1 -0
  318. package/src/proxy/ProxySigningConfigResolver.js +24 -0
  319. package/src/proxy/ProxySigningRequest.d.ts +12 -0
  320. package/src/proxy/ProxySigningRequest.d.ts.map +1 -0
  321. package/src/proxy/ProxySigningRequest.js +31 -0
  322. package/src/proxy/RequestValidator.d.ts +15 -0
  323. package/src/proxy/RequestValidator.d.ts.map +1 -0
  324. package/src/proxy/RequestValidator.js +26 -0
  325. package/src/proxy/SigningService.d.ts +39 -0
  326. package/src/proxy/SigningService.d.ts.map +1 -0
  327. package/src/proxy/SigningService.js +107 -0
  328. package/src/proxy/SqlPayloadValidator.d.ts +13 -0
  329. package/src/proxy/SqlPayloadValidator.d.ts.map +1 -0
  330. package/src/proxy/SqlPayloadValidator.js +14 -0
  331. package/src/proxy/SqlProxyDbOverrides.d.ts +17 -0
  332. package/src/proxy/SqlProxyDbOverrides.d.ts.map +1 -0
  333. package/src/proxy/SqlProxyDbOverrides.js +1 -0
  334. package/src/proxy/SqlProxyServerDeps.d.ts +12 -0
  335. package/src/proxy/SqlProxyServerDeps.d.ts.map +1 -0
  336. package/src/proxy/SqlProxyServerDeps.js +9 -0
  337. package/src/proxy/StatementPayloadValidator.d.ts +13 -0
  338. package/src/proxy/StatementPayloadValidator.d.ts.map +1 -0
  339. package/src/proxy/StatementPayloadValidator.js +18 -0
  340. package/src/proxy/StatementRegistryLoader.d.ts +2 -0
  341. package/src/proxy/StatementRegistryLoader.d.ts.map +1 -0
  342. package/src/proxy/StatementRegistryLoader.js +36 -0
  343. package/src/proxy/StatementRegistryResolver.d.ts +15 -0
  344. package/src/proxy/StatementRegistryResolver.d.ts.map +1 -0
  345. package/src/proxy/StatementRegistryResolver.js +34 -0
  346. package/src/proxy/d1/ZintrustD1Proxy.d.ts +3 -0
  347. package/src/proxy/d1/ZintrustD1Proxy.d.ts.map +1 -0
  348. package/src/proxy/d1/ZintrustD1Proxy.js +2 -0
  349. package/src/proxy/d1/register.d.ts +2 -0
  350. package/src/proxy/d1/register.d.ts.map +1 -0
  351. package/src/proxy/d1/register.js +5 -0
  352. package/src/proxy/isMutatingSql.d.ts +2 -0
  353. package/src/proxy/isMutatingSql.d.ts.map +1 -0
  354. package/src/proxy/isMutatingSql.js +12 -0
  355. package/src/proxy/kv/ZintrustKvProxy.d.ts +3 -0
  356. package/src/proxy/kv/ZintrustKvProxy.d.ts.map +1 -0
  357. package/src/proxy/kv/ZintrustKvProxy.js +2 -0
  358. package/src/proxy/kv/register.d.ts +2 -0
  359. package/src/proxy/kv/register.d.ts.map +1 -0
  360. package/src/proxy/kv/register.js +5 -0
  361. package/src/proxy/mongodb/MongoDBProxyServer.d.ts +33 -0
  362. package/src/proxy/mongodb/MongoDBProxyServer.d.ts.map +1 -0
  363. package/src/proxy/mongodb/MongoDBProxyServer.js +202 -0
  364. package/src/proxy/mongodb/register.d.ts +2 -0
  365. package/src/proxy/mongodb/register.d.ts.map +1 -0
  366. package/src/proxy/mongodb/register.js +5 -0
  367. package/src/proxy/mysql/MySqlProxyServer.d.ts +8 -0
  368. package/src/proxy/mysql/MySqlProxyServer.d.ts.map +1 -0
  369. package/src/proxy/mysql/MySqlProxyServer.js +202 -0
  370. package/src/proxy/mysql/register.d.ts +2 -0
  371. package/src/proxy/mysql/register.d.ts.map +1 -0
  372. package/src/proxy/mysql/register.js +5 -0
  373. package/src/proxy/postgres/PostgresProxyServer.d.ts +8 -0
  374. package/src/proxy/postgres/PostgresProxyServer.d.ts.map +1 -0
  375. package/src/proxy/postgres/PostgresProxyServer.js +178 -0
  376. package/src/proxy/postgres/register.d.ts +2 -0
  377. package/src/proxy/postgres/register.d.ts.map +1 -0
  378. package/src/proxy/postgres/register.js +5 -0
  379. package/src/proxy/redis/RedisProxyServer.d.ts +12 -0
  380. package/src/proxy/redis/RedisProxyServer.d.ts.map +1 -0
  381. package/src/proxy/redis/RedisProxyServer.js +192 -0
  382. package/src/proxy/redis/register.d.ts +2 -0
  383. package/src/proxy/redis/register.d.ts.map +1 -0
  384. package/src/proxy/redis/register.js +5 -0
  385. package/src/proxy/smtp/SmtpProxyServer.d.ts +19 -0
  386. package/src/proxy/smtp/SmtpProxyServer.d.ts.map +1 -0
  387. package/src/proxy/smtp/SmtpProxyServer.js +290 -0
  388. package/src/proxy/smtp/register.d.ts +2 -0
  389. package/src/proxy/smtp/register.d.ts.map +1 -0
  390. package/src/proxy/smtp/register.js +5 -0
  391. package/src/proxy/sqlserver/SqlServerProxyServer.d.ts +8 -0
  392. package/src/proxy/sqlserver/SqlServerProxyServer.d.ts.map +1 -0
  393. package/src/proxy/sqlserver/SqlServerProxyServer.js +203 -0
  394. package/src/proxy/sqlserver/register.d.ts +2 -0
  395. package/src/proxy/sqlserver/register.d.ts.map +1 -0
  396. package/src/proxy/sqlserver/register.js +5 -0
  397. package/src/proxy.d.ts +4 -0
  398. package/src/proxy.d.ts.map +1 -0
  399. package/src/proxy.js +3 -0
  400. package/src/routes/doc.d.ts.map +1 -1
  401. package/src/routes/doc.js +16 -2
  402. package/src/routes/error.d.ts +5 -4
  403. package/src/routes/error.d.ts.map +1 -1
  404. package/src/routes/error.js +15 -13
  405. package/src/routes/errorPages.d.ts +2 -0
  406. package/src/routes/errorPages.d.ts.map +1 -1
  407. package/src/routes/errorPages.js +144 -4
  408. package/src/runtime/PluginAutoImports.d.ts +1 -0
  409. package/src/runtime/PluginAutoImports.d.ts.map +1 -1
  410. package/src/runtime/PluginAutoImports.js +94 -9
  411. package/src/runtime/RuntimeAdapter.d.ts +8 -9
  412. package/src/runtime/RuntimeAdapter.d.ts.map +1 -1
  413. package/src/runtime/RuntimeAdapter.js +120 -34
  414. package/src/runtime/RuntimeServices.d.ts +47 -0
  415. package/src/runtime/RuntimeServices.d.ts.map +1 -0
  416. package/src/runtime/RuntimeServices.js +164 -0
  417. package/src/runtime/StartupConfigFileRegistry.d.ts +4 -4
  418. package/src/runtime/StartupConfigFileRegistry.d.ts.map +1 -1
  419. package/src/runtime/StartupConfigFileRegistry.js +12 -0
  420. package/src/runtime/WorkerAdapterImports.d.ts +5 -0
  421. package/src/runtime/WorkerAdapterImports.d.ts.map +1 -0
  422. package/src/runtime/WorkerAdapterImports.js +17 -0
  423. package/src/runtime/WorkersModule.d.ts +6 -0
  424. package/src/runtime/WorkersModule.d.ts.map +1 -0
  425. package/src/runtime/WorkersModule.js +278 -0
  426. package/src/runtime/adapters/CloudflareAdapter.d.ts.map +1 -1
  427. package/src/runtime/adapters/CloudflareAdapter.js +19 -2
  428. package/src/runtime/adapters/DenoAdapter.js +1 -0
  429. package/src/runtime/adapters/FargateAdapter.js +1 -1
  430. package/src/runtime/adapters/LambdaAdapter.js +1 -1
  431. package/src/runtime/adapters/NodeServerAdapter.js +1 -1
  432. package/src/runtime/detectRuntime.d.ts +10 -0
  433. package/src/runtime/detectRuntime.d.ts.map +1 -0
  434. package/src/runtime/detectRuntime.js +57 -0
  435. package/src/runtime/useFileLoader.d.ts.map +1 -1
  436. package/src/runtime/useFileLoader.js +16 -0
  437. package/src/scheduler/Schedule.d.ts +36 -0
  438. package/src/scheduler/Schedule.d.ts.map +1 -0
  439. package/src/scheduler/Schedule.js +197 -0
  440. package/src/scheduler/ScheduleHttpGateway.d.ts +8 -0
  441. package/src/scheduler/ScheduleHttpGateway.d.ts.map +1 -0
  442. package/src/scheduler/ScheduleHttpGateway.js +196 -0
  443. package/src/scheduler/ScheduleRunner.d.ts +6 -0
  444. package/src/scheduler/ScheduleRunner.d.ts.map +1 -1
  445. package/src/scheduler/ScheduleRunner.js +166 -29
  446. package/src/scheduler/SchedulerRuntime.d.ts +15 -0
  447. package/src/scheduler/SchedulerRuntime.d.ts.map +1 -0
  448. package/src/scheduler/SchedulerRuntime.js +79 -0
  449. package/src/scheduler/cron/Cron.d.ts +19 -0
  450. package/src/scheduler/cron/Cron.d.ts.map +1 -0
  451. package/src/scheduler/cron/Cron.js +200 -0
  452. package/src/scheduler/leader/SchedulerLeader.d.ts +14 -0
  453. package/src/scheduler/leader/SchedulerLeader.d.ts.map +1 -0
  454. package/src/scheduler/leader/SchedulerLeader.js +187 -0
  455. package/src/scheduler/state/ScheduleStateStore.d.ts +27 -0
  456. package/src/scheduler/state/ScheduleStateStore.d.ts.map +1 -0
  457. package/src/scheduler/state/ScheduleStateStore.js +27 -0
  458. package/src/scheduler/types.d.ts +10 -0
  459. package/src/scheduler/types.d.ts.map +1 -1
  460. package/src/schedules/index.d.ts +1 -0
  461. package/src/schedules/index.d.ts.map +1 -1
  462. package/src/schedules/index.js +1 -0
  463. package/src/schedules/job-tracking-cleanup.d.ts +4 -0
  464. package/src/schedules/job-tracking-cleanup.d.ts.map +1 -0
  465. package/src/schedules/job-tracking-cleanup.js +116 -0
  466. package/src/schedules/log-cleanup.d.ts +1 -2
  467. package/src/schedules/log-cleanup.d.ts.map +1 -1
  468. package/src/schedules/log-cleanup.js +12 -15
  469. package/src/scripts/TemplateImportsCheck.js +2 -2
  470. package/src/scripts/TemplateSync.js +3 -4
  471. package/src/security/CsrfTokenManager.d.ts.map +1 -1
  472. package/src/security/CsrfTokenManager.js +12 -0
  473. package/src/security/Hash.d.ts +1 -1
  474. package/src/security/Hash.d.ts.map +1 -1
  475. package/src/security/Hash.js +31 -36
  476. package/src/security/Sanitizer.d.ts.map +1 -1
  477. package/src/security/Sanitizer.js +1 -9
  478. package/src/security/SignedRequest.d.ts.map +1 -1
  479. package/src/security/SignedRequest.js +2 -2
  480. package/src/seeders/SeederLoader.js +1 -1
  481. package/src/session/SessionManager.d.ts +3 -0
  482. package/src/session/SessionManager.d.ts.map +1 -1
  483. package/src/session/SessionManager.js +49 -10
  484. package/src/sockets/CloudflareSocket.d.ts +24 -0
  485. package/src/sockets/CloudflareSocket.d.ts.map +1 -0
  486. package/src/sockets/CloudflareSocket.js +259 -0
  487. package/src/start.d.ts.map +1 -1
  488. package/src/start.js +1 -8
  489. package/src/templates/docker/docker-compose.ecosystem.yml.tpl +301 -0
  490. package/src/templates/docker/docker-compose.schedules.yml.tpl +84 -0
  491. package/src/templates/project/basic/app/Schedules/index.ts.tpl +0 -0
  492. package/src/templates/project/basic/config/database.ts.tpl +1 -1
  493. package/src/templates/project/basic/src/zintrust.plugins.wg.ts.tpl +8 -0
  494. package/src/toolkit/Secrets/Manifest.d.ts.map +1 -1
  495. package/src/toolkit/Secrets/Manifest.js +5 -7
  496. package/src/tools/mail/drivers/Smtp.d.ts.map +1 -1
  497. package/src/tools/mail/drivers/Smtp.js +229 -18
  498. package/src/tools/mail/index.d.ts.map +1 -1
  499. package/src/tools/mail/index.js +5 -4
  500. package/src/tools/mail/template-loader.d.ts.map +1 -1
  501. package/src/tools/mail/template-loader.js +197 -29
  502. package/src/tools/mail/templates/auth-password-reset.d.ts +3 -0
  503. package/src/tools/mail/templates/auth-password-reset.d.ts.map +1 -0
  504. package/src/tools/mail/templates/auth-password-reset.js +231 -0
  505. package/src/tools/mail/templates/auth-welcome.d.ts +3 -0
  506. package/src/tools/mail/templates/auth-welcome.d.ts.map +1 -0
  507. package/src/tools/mail/templates/auth-welcome.js +236 -0
  508. package/src/tools/mail/templates/general.d.ts +3 -0
  509. package/src/tools/mail/templates/general.d.ts.map +1 -0
  510. package/src/tools/mail/templates/general.js +109 -0
  511. package/src/tools/mail/templates/index.js +2 -2
  512. package/src/tools/mail/templates/job-completed.d.ts +3 -0
  513. package/src/tools/mail/templates/job-completed.d.ts.map +1 -0
  514. package/src/tools/mail/templates/job-completed.js +188 -0
  515. package/src/tools/mail/templates/notifications-new-comment.d.ts +3 -0
  516. package/src/tools/mail/templates/notifications-new-comment.d.ts.map +1 -0
  517. package/src/tools/mail/templates/notifications-new-comment.js +228 -0
  518. package/src/tools/mail/templates/password-reset.d.ts +3 -0
  519. package/src/tools/mail/templates/password-reset.d.ts.map +1 -0
  520. package/src/tools/mail/templates/password-reset.js +221 -0
  521. package/src/tools/mail/templates/performance-report.d.ts +3 -0
  522. package/src/tools/mail/templates/performance-report.d.ts.map +1 -0
  523. package/src/tools/mail/templates/performance-report.js +258 -0
  524. package/src/tools/mail/templates/welcome.d.ts +3 -0
  525. package/src/tools/mail/templates/welcome.d.ts.map +1 -0
  526. package/src/tools/mail/templates/welcome.js +187 -0
  527. package/src/tools/mail/templates/worker-alert.d.ts +3 -0
  528. package/src/tools/mail/templates/worker-alert.d.ts.map +1 -0
  529. package/src/tools/mail/templates/worker-alert.js +229 -0
  530. package/src/tools/notification/Notification.js +1 -1
  531. package/src/tools/notification/testingHelpers.js +6 -5
  532. package/src/tools/queue/AdvancedQueue.js +2 -6
  533. package/src/tools/queue/IdempotencyManager.d.ts +6 -0
  534. package/src/tools/queue/IdempotencyManager.d.ts.map +1 -0
  535. package/src/tools/queue/IdempotencyManager.js +36 -0
  536. package/src/tools/queue/JobHeartbeatStore.d.ts +16 -0
  537. package/src/tools/queue/JobHeartbeatStore.d.ts.map +1 -0
  538. package/src/tools/queue/JobHeartbeatStore.js +67 -0
  539. package/src/tools/queue/JobReconciliationRunner.d.ts +16 -0
  540. package/src/tools/queue/JobReconciliationRunner.d.ts.map +1 -0
  541. package/src/tools/queue/JobReconciliationRunner.js +56 -0
  542. package/src/tools/queue/JobRecoveryDaemon.d.ts +27 -0
  543. package/src/tools/queue/JobRecoveryDaemon.d.ts.map +1 -0
  544. package/src/tools/queue/JobRecoveryDaemon.js +303 -0
  545. package/src/tools/queue/JobStateTracker.d.ts +140 -0
  546. package/src/tools/queue/JobStateTracker.d.ts.map +1 -0
  547. package/src/tools/queue/JobStateTracker.js +409 -0
  548. package/src/tools/queue/JobStateTrackerDbPersistence.d.ts +12 -0
  549. package/src/tools/queue/JobStateTrackerDbPersistence.d.ts.map +1 -0
  550. package/src/tools/queue/JobStateTrackerDbPersistence.js +239 -0
  551. package/src/tools/queue/Queue.d.ts.map +1 -1
  552. package/src/tools/queue/Queue.js +160 -16
  553. package/src/tools/queue/QueueDataRedactor.d.ts +6 -0
  554. package/src/tools/queue/QueueDataRedactor.d.ts.map +1 -0
  555. package/src/tools/queue/QueueDataRedactor.js +45 -0
  556. package/src/tools/queue/QueueExtensions.d.ts.map +1 -1
  557. package/src/tools/queue/QueueExtensions.js +2 -1
  558. package/src/tools/queue/QueueReliabilityMetrics.d.ts +38 -0
  559. package/src/tools/queue/QueueReliabilityMetrics.d.ts.map +1 -0
  560. package/src/tools/queue/QueueReliabilityMetrics.js +131 -0
  561. package/src/tools/queue/QueueReliabilityOrchestrator.d.ts +7 -0
  562. package/src/tools/queue/QueueReliabilityOrchestrator.d.ts.map +1 -0
  563. package/src/tools/queue/QueueReliabilityOrchestrator.js +59 -0
  564. package/src/tools/queue/QueueRuntimeRegistration.d.ts +1 -9
  565. package/src/tools/queue/QueueRuntimeRegistration.d.ts.map +1 -1
  566. package/src/tools/queue/QueueRuntimeRegistration.js +75 -4
  567. package/src/tools/queue/QueueTracing.d.ts +32 -0
  568. package/src/tools/queue/QueueTracing.d.ts.map +1 -0
  569. package/src/tools/queue/QueueTracing.js +151 -0
  570. package/src/tools/queue/StalledJobMonitor.d.ts +5 -0
  571. package/src/tools/queue/StalledJobMonitor.d.ts.map +1 -0
  572. package/src/tools/queue/StalledJobMonitor.js +21 -0
  573. package/src/tools/queue/TimeoutManager.d.ts +14 -0
  574. package/src/tools/queue/TimeoutManager.d.ts.map +1 -0
  575. package/src/tools/queue/TimeoutManager.js +77 -0
  576. package/src/tools/queue/drivers/Redis.d.ts +1 -0
  577. package/src/tools/queue/drivers/Redis.d.ts.map +1 -1
  578. package/src/tools/queue/drivers/Redis.js +1 -0
  579. package/src/tools/queue/index.d.ts +10 -0
  580. package/src/tools/queue/index.d.ts.map +1 -1
  581. package/src/tools/queue/index.js +10 -0
  582. package/src/tools/storage/drivers/R2.d.ts +13 -0
  583. package/src/tools/storage/drivers/R2.d.ts.map +1 -1
  584. package/src/tools/storage/drivers/R2.js +29 -0
  585. package/src/zintrust.plugins.d.ts +9 -0
  586. package/src/zintrust.plugins.d.ts.map +1 -0
  587. package/src/zintrust.plugins.js +7 -0
  588. package/src/zintrust.plugins.wg.d.ts +9 -0
  589. package/src/zintrust.plugins.wg.d.ts.map +1 -0
  590. 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 executeD1Migrate = async (cmd, options) => {
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 = typeof options['database'] === 'string' && options['database'].trim() !== ''
19
- ? options['database']
20
- : 'zintrust_db';
21
- cmd.info(`Running D1 migrations for ${dbName} (${isLocal ? 'local' : 'remote'})...`);
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 output = WranglerD1.applyMigrations({ cmd, dbName, isLocal });
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
- Logger.error('D1 Migration failed', error);
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,5 @@
1
+ import type { IBaseCommand } from '../BaseCommand';
2
+ export declare const DeployContainerProxiesCommand: Readonly<{
3
+ create(): IBaseCommand;
4
+ }>;
5
+ //# sourceMappingURL=DeployContainerProxiesCommand.d.ts.map
@@ -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,5 @@
1
+ import type { IBaseCommand } from '../BaseCommand';
2
+ export declare const DeployContainerWorkersCommand: Readonly<{
3
+ create(): IBaseCommand;
4
+ }>;
5
+ //# sourceMappingURL=DeployContainerWorkersCommand.d.ts.map
@@ -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,3 @@
1
+ export declare const resolveComposePath: (composeFileName: string, missingMessage: string) => string;
2
+ export declare const runComposeWithFallback: (args: string[]) => Promise<void>;
3
+ //# sourceMappingURL=DockerComposeCommandUtils.d.ts.map
@@ -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,5 @@
1
+ import { type IBaseCommand } from '../BaseCommand';
2
+ export declare const DoctorArchitectureCommand: Readonly<{
3
+ create(): IBaseCommand;
4
+ }>;
5
+ //# sourceMappingURL=DoctorArchitectureCommand.d.ts.map
@@ -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,5 @@
1
+ import { type IBaseCommand } from '../BaseCommand';
2
+ export declare const InitContainerCommand: Readonly<{
3
+ create(): IBaseCommand;
4
+ }>;
5
+ //# sourceMappingURL=InitContainerCommand.d.ts.map
@@ -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
+ });