@zintrust/core 0.1.0 → 0.1.2

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 (518) hide show
  1. package/README.md +214 -0
  2. package/bin/zintrust.d.ts.map +1 -1
  3. package/bin/zintrust.js +18 -1
  4. package/package.json +4 -34
  5. package/public/index.html +535 -0
  6. package/src/boot/Application.d.ts.map +1 -1
  7. package/src/boot/Application.js +46 -3
  8. package/src/boot/Server.d.ts.map +1 -1
  9. package/src/boot/Server.js +3 -4
  10. package/src/boot/bootstrap.js +77 -6
  11. package/src/builder/BundleOptimizer.d.ts.map +1 -1
  12. package/src/builder/BundleOptimizer.js +25 -29
  13. package/src/cache/Cache.d.ts.map +1 -1
  14. package/src/cache/Cache.js +4 -2
  15. package/src/cache/drivers/KVDriver.d.ts.map +1 -1
  16. package/src/cache/drivers/KVDriver.js +8 -7
  17. package/src/cache/drivers/MemoryDriver.d.ts.map +1 -1
  18. package/src/cache/drivers/MemoryDriver.js +5 -0
  19. package/src/cache/drivers/RedisDriver.js +1 -1
  20. package/src/cli/BaseCommand.d.ts +2 -2
  21. package/src/cli/BaseCommand.d.ts.map +1 -1
  22. package/src/cli/BaseCommand.js +2 -1
  23. package/src/cli/CLI.d.ts.map +1 -1
  24. package/src/cli/CLI.js +22 -18
  25. package/src/cli/ErrorHandler.d.ts.map +1 -1
  26. package/src/cli/ErrorHandler.js +2 -4
  27. package/src/cli/commands/AddCommand.d.ts +81 -0
  28. package/src/cli/commands/AddCommand.d.ts.map +1 -1
  29. package/src/cli/commands/AddCommand.js +24 -5
  30. package/src/cli/commands/ConfigCommand.d.ts.map +1 -1
  31. package/src/cli/commands/ConfigCommand.js +59 -25
  32. package/src/cli/commands/D1MigrateCommand.d.ts +4 -0
  33. package/src/cli/commands/D1MigrateCommand.d.ts.map +1 -1
  34. package/src/cli/commands/D1MigrateCommand.js +6 -4
  35. package/src/cli/commands/FixCommand.d.ts.map +1 -1
  36. package/src/cli/commands/FixCommand.js +3 -15
  37. package/src/cli/commands/LogsCleanupCommand.d.ts +6 -0
  38. package/src/cli/commands/LogsCleanupCommand.d.ts.map +1 -0
  39. package/src/cli/commands/LogsCleanupCommand.js +20 -0
  40. package/src/cli/commands/LogsCommand.d.ts.map +1 -1
  41. package/src/cli/commands/LogsCommand.js +4 -6
  42. package/src/cli/commands/MakeMailTemplateCommand.d.ts +10 -0
  43. package/src/cli/commands/MakeMailTemplateCommand.d.ts.map +1 -0
  44. package/src/cli/commands/MakeMailTemplateCommand.js +74 -0
  45. package/src/cli/commands/MakeNotificationTemplateCommand.d.ts +10 -0
  46. package/src/cli/commands/MakeNotificationTemplateCommand.d.ts.map +1 -0
  47. package/src/cli/commands/MakeNotificationTemplateCommand.js +113 -0
  48. package/src/cli/commands/MigrateCommand.d.ts.map +1 -1
  49. package/src/cli/commands/MigrateCommand.js +3 -3
  50. package/src/cli/commands/NewCommand.d.ts +4 -0
  51. package/src/cli/commands/NewCommand.d.ts.map +1 -1
  52. package/src/cli/commands/NewCommand.js +34 -19
  53. package/src/cli/commands/PluginCommand.d.ts.map +1 -1
  54. package/src/cli/commands/PluginCommand.js +8 -4
  55. package/src/cli/commands/PrepareCommand.d.ts.map +1 -1
  56. package/src/cli/commands/PrepareCommand.js +1 -1
  57. package/src/cli/commands/QACommand.d.ts.map +1 -1
  58. package/src/cli/commands/QACommand.js +16 -26
  59. package/src/cli/commands/SecretsCommand.d.ts +16 -0
  60. package/src/cli/commands/SecretsCommand.d.ts.map +1 -0
  61. package/src/cli/commands/SecretsCommand.js +91 -0
  62. package/src/cli/commands/StartCommand.d.ts.map +1 -1
  63. package/src/cli/commands/StartCommand.js +2 -2
  64. package/src/cli/commands/TemplatesCommand.d.ts +3 -0
  65. package/src/cli/commands/TemplatesCommand.d.ts.map +1 -0
  66. package/src/cli/commands/TemplatesCommand.js +65 -0
  67. package/src/cli/commands/index.d.ts +5 -0
  68. package/src/cli/commands/index.d.ts.map +1 -1
  69. package/src/cli/commands/index.js +5 -0
  70. package/src/cli/config/ConfigManager.js +1 -1
  71. package/src/cli/index.d.ts +2 -1
  72. package/src/cli/index.d.ts.map +1 -1
  73. package/src/cli/index.js +2 -1
  74. package/src/cli/scaffolding/ControllerGenerator.d.ts.map +1 -1
  75. package/src/cli/scaffolding/ControllerGenerator.js +11 -10
  76. package/src/cli/scaffolding/FeatureScaffolder.js +4 -4
  77. package/src/cli/scaffolding/FileGenerator.js +1 -1
  78. package/src/cli/scaffolding/MigrationGenerator.d.ts.map +1 -1
  79. package/src/cli/scaffolding/MigrationGenerator.js +10 -9
  80. package/src/cli/scaffolding/ModelGenerator.d.ts.map +1 -1
  81. package/src/cli/scaffolding/ModelGenerator.js +11 -10
  82. package/src/cli/scaffolding/ProjectScaffolder.d.ts.map +1 -1
  83. package/src/cli/scaffolding/ProjectScaffolder.js +61 -11
  84. package/src/cli/scaffolding/ResponseFactoryGenerator.d.ts.map +1 -1
  85. package/src/cli/scaffolding/ResponseFactoryGenerator.js +2 -1
  86. package/src/cli/scaffolding/RouteGenerator.d.ts.map +1 -1
  87. package/src/cli/scaffolding/RouteGenerator.js +15 -14
  88. package/src/cli/scaffolding/SeederGenerator.js +1 -1
  89. package/src/cli/scaffolding/ServiceIntegrationTestGenerator.d.ts.map +1 -1
  90. package/src/cli/scaffolding/ServiceIntegrationTestGenerator.js +7 -6
  91. package/src/cli/scaffolding/ServiceRequestFactoryGenerator.d.ts +1 -1
  92. package/src/cli/scaffolding/ServiceRequestFactoryGenerator.d.ts.map +1 -1
  93. package/src/cli/scaffolding/ServiceRequestFactoryGenerator.js +2 -2
  94. package/src/cli/scaffolding/ServiceScaffolder.d.ts.map +1 -1
  95. package/src/cli/scaffolding/ServiceScaffolder.js +13 -12
  96. package/src/cli/scaffolding/TemplateEngine.d.ts +10 -3
  97. package/src/cli/scaffolding/TemplateEngine.d.ts.map +1 -1
  98. package/src/cli/scaffolding/TemplateEngine.js +15 -285
  99. package/src/cli/scaffolding/TemplateGenerator.d.ts +40 -0
  100. package/src/cli/scaffolding/TemplateGenerator.d.ts.map +1 -0
  101. package/src/cli/scaffolding/TemplateGenerator.js +172 -0
  102. package/src/cli/scaffolding/index.d.ts +1 -0
  103. package/src/cli/scaffolding/index.d.ts.map +1 -1
  104. package/src/cli/scaffolding/index.js +1 -0
  105. package/src/cli/utils/spawn.js +1 -1
  106. package/src/common/AwsSigV4.d.ts +41 -0
  107. package/src/common/AwsSigV4.d.ts.map +1 -0
  108. package/src/common/AwsSigV4.js +69 -0
  109. package/src/common/index.d.ts +39 -0
  110. package/src/common/index.d.ts.map +1 -1
  111. package/src/common/index.js +101 -8
  112. package/src/common/uuid.d.ts +3 -0
  113. package/src/common/uuid.d.ts.map +1 -0
  114. package/src/common/uuid.js +30 -0
  115. package/src/config/FileLogWriter.d.ts +22 -0
  116. package/src/config/FileLogWriter.d.ts.map +1 -0
  117. package/src/config/FileLogWriter.js +192 -0
  118. package/src/config/SecretsManager.d.ts.map +1 -1
  119. package/src/config/SecretsManager.js +26 -0
  120. package/src/config/StartupConfigValidator.d.ts +15 -0
  121. package/src/config/StartupConfigValidator.d.ts.map +1 -0
  122. package/src/config/StartupConfigValidator.js +86 -0
  123. package/src/config/app.d.ts +2 -1
  124. package/src/config/app.d.ts.map +1 -1
  125. package/src/config/app.js +65 -15
  126. package/src/config/broadcast.d.ts +47 -0
  127. package/src/config/broadcast.d.ts.map +1 -0
  128. package/src/config/broadcast.js +54 -0
  129. package/src/config/cache.d.ts +13 -17
  130. package/src/config/cache.d.ts.map +1 -1
  131. package/src/config/cache.js +9 -11
  132. package/src/config/cloudflare.d.ts +26 -0
  133. package/src/config/cloudflare.d.ts.map +1 -0
  134. package/src/config/cloudflare.js +38 -0
  135. package/src/config/env.d.ts +6 -0
  136. package/src/config/env.d.ts.map +1 -1
  137. package/src/config/env.js +6 -0
  138. package/src/config/index.d.ts +52 -28
  139. package/src/config/index.d.ts.map +1 -1
  140. package/src/config/index.js +3 -0
  141. package/src/config/logger.d.ts +2 -0
  142. package/src/config/logger.d.ts.map +1 -1
  143. package/src/config/logger.js +270 -11
  144. package/src/config/logging/HttpLogger.d.ts +23 -0
  145. package/src/config/logging/HttpLogger.d.ts.map +1 -0
  146. package/src/config/logging/HttpLogger.js +93 -0
  147. package/src/config/logging/KvLogger.d.ts +22 -0
  148. package/src/config/logging/KvLogger.d.ts.map +1 -0
  149. package/src/config/logging/KvLogger.js +143 -0
  150. package/src/config/logging/SlackLogger.d.ts +23 -0
  151. package/src/config/logging/SlackLogger.d.ts.map +1 -0
  152. package/src/config/logging/SlackLogger.js +119 -0
  153. package/src/config/mail.d.ts +81 -0
  154. package/src/config/mail.d.ts.map +1 -0
  155. package/src/config/mail.js +73 -0
  156. package/src/config/middleware.d.ts +8 -0
  157. package/src/config/middleware.d.ts.map +1 -0
  158. package/src/config/middleware.js +18 -0
  159. package/src/config/notification.d.ts +62 -0
  160. package/src/config/notification.d.ts.map +1 -0
  161. package/src/config/notification.js +43 -0
  162. package/src/config/security.d.ts.map +1 -1
  163. package/src/config/security.js +2 -2
  164. package/src/config/startup.d.ts +23 -0
  165. package/src/config/startup.d.ts.map +1 -0
  166. package/src/config/startup.js +15 -0
  167. package/src/config/storage.d.ts +21 -35
  168. package/src/config/storage.d.ts.map +1 -1
  169. package/src/config/storage.js +57 -37
  170. package/src/database/migrations/index.d.ts +1 -1
  171. package/src/database/migrations/index.d.ts.map +1 -1
  172. package/src/database/migrations/index.js +2 -1
  173. package/src/features/Queue.js +1 -25
  174. package/src/functions/lambda.d.ts.map +1 -1
  175. package/src/functions/lambda.js +6 -1
  176. package/src/health/RuntimeHealthProbes.d.ts +13 -0
  177. package/src/health/RuntimeHealthProbes.d.ts.map +1 -0
  178. package/src/health/RuntimeHealthProbes.js +62 -0
  179. package/src/health/StartupHealthChecks.d.ts +26 -0
  180. package/src/health/StartupHealthChecks.d.ts.map +1 -0
  181. package/src/health/StartupHealthChecks.js +124 -0
  182. package/src/http/ErrorResponse.d.ts +28 -0
  183. package/src/http/ErrorResponse.d.ts.map +1 -0
  184. package/src/http/ErrorResponse.js +42 -0
  185. package/src/http/Kernel.d.ts +5 -0
  186. package/src/http/Kernel.d.ts.map +1 -1
  187. package/src/http/Kernel.js +96 -30
  188. package/src/http/Request.d.ts +1 -1
  189. package/src/http/Request.d.ts.map +1 -1
  190. package/src/http/RequestContext.d.ts +20 -0
  191. package/src/http/RequestContext.d.ts.map +1 -0
  192. package/src/http/RequestContext.js +77 -0
  193. package/src/index.d.ts +9 -1
  194. package/src/index.d.ts.map +1 -1
  195. package/src/index.js +8 -2
  196. package/src/microservices/MicroserviceBootstrap.d.ts.map +1 -1
  197. package/src/microservices/MicroserviceBootstrap.js +6 -5
  198. package/src/microservices/MicroserviceManager.d.ts.map +1 -1
  199. package/src/microservices/MicroserviceManager.js +7 -5
  200. package/src/microservices/PostgresAdapter.d.ts.map +1 -1
  201. package/src/microservices/PostgresAdapter.js +7 -4
  202. package/src/microservices/ServiceBundler.d.ts.map +1 -1
  203. package/src/microservices/ServiceBundler.js +3 -1
  204. package/src/microservices/ServiceHealthMonitor.d.ts.map +1 -1
  205. package/src/microservices/ServiceHealthMonitor.js +7 -3
  206. package/src/middleware/CsrfMiddleware.d.ts.map +1 -1
  207. package/src/middleware/CsrfMiddleware.js +2 -19
  208. package/src/middleware/ErrorHandlerMiddleware.d.ts +6 -0
  209. package/src/middleware/ErrorHandlerMiddleware.d.ts.map +1 -0
  210. package/src/middleware/ErrorHandlerMiddleware.js +33 -0
  211. package/src/middleware/LoggingMiddleware.d.ts +9 -0
  212. package/src/middleware/LoggingMiddleware.d.ts.map +1 -0
  213. package/src/middleware/LoggingMiddleware.js +36 -0
  214. package/src/middleware/index.d.ts +2 -0
  215. package/src/middleware/index.d.ts.map +1 -1
  216. package/src/middleware/index.js +2 -0
  217. package/src/node-singletons/async_hooks.d.ts +9 -0
  218. package/src/node-singletons/async_hooks.d.ts.map +1 -0
  219. package/src/node-singletons/async_hooks.js +8 -0
  220. package/src/node-singletons/fs.d.ts +2 -2
  221. package/src/node-singletons/fs.d.ts.map +1 -1
  222. package/src/node-singletons/fs.js +2 -2
  223. package/src/node-singletons/http.d.ts +1 -1
  224. package/src/node-singletons/http.d.ts.map +1 -1
  225. package/src/node-singletons/http.js +1 -1
  226. package/src/node-singletons/index.d.ts +4 -0
  227. package/src/node-singletons/index.d.ts.map +1 -1
  228. package/src/node-singletons/index.js +4 -0
  229. package/src/node-singletons/net.d.ts +9 -0
  230. package/src/node-singletons/net.d.ts.map +1 -0
  231. package/src/node-singletons/net.js +8 -0
  232. package/src/node-singletons/os.d.ts +3 -3
  233. package/src/node-singletons/os.d.ts.map +1 -1
  234. package/src/node-singletons/os.js +3 -4
  235. package/src/node-singletons/path.d.ts +3 -1
  236. package/src/node-singletons/path.d.ts.map +1 -1
  237. package/src/node-singletons/path.js +3 -1
  238. package/src/node-singletons/perf-hooks.d.ts +3 -1
  239. package/src/node-singletons/perf-hooks.d.ts.map +1 -1
  240. package/src/node-singletons/perf-hooks.js +3 -1
  241. package/src/node-singletons/process.d.ts +23 -0
  242. package/src/node-singletons/process.d.ts.map +1 -0
  243. package/src/node-singletons/process.js +8 -0
  244. package/src/node-singletons/readline.d.ts +3 -3
  245. package/src/node-singletons/readline.d.ts.map +1 -1
  246. package/src/node-singletons/readline.js +3 -4
  247. package/src/node-singletons/tls.d.ts +9 -0
  248. package/src/node-singletons/tls.d.ts.map +1 -0
  249. package/src/node-singletons/tls.js +8 -0
  250. package/src/node-singletons/url.d.ts +3 -1
  251. package/src/node-singletons/url.d.ts.map +1 -1
  252. package/src/node-singletons/url.js +3 -1
  253. package/src/orm/ConnectionManager.d.ts +6 -1
  254. package/src/orm/ConnectionManager.d.ts.map +1 -1
  255. package/src/orm/ConnectionManager.js +14 -0
  256. package/src/orm/DatabaseAdapter.d.ts +6 -0
  257. package/src/orm/DatabaseAdapter.d.ts.map +1 -1
  258. package/src/orm/QueryBuilder.d.ts +8 -1
  259. package/src/orm/QueryBuilder.d.ts.map +1 -1
  260. package/src/orm/QueryBuilder.js +188 -28
  261. package/src/orm/adapters/D1Adapter.d.ts.map +1 -1
  262. package/src/orm/adapters/D1Adapter.js +18 -12
  263. package/src/orm/adapters/MySQLAdapter.d.ts.map +1 -1
  264. package/src/orm/adapters/MySQLAdapter.js +4 -0
  265. package/src/orm/adapters/PostgreSQLAdapter.d.ts.map +1 -1
  266. package/src/orm/adapters/PostgreSQLAdapter.js +4 -0
  267. package/src/orm/adapters/SQLServerAdapter.d.ts.map +1 -1
  268. package/src/orm/adapters/SQLServerAdapter.js +4 -0
  269. package/src/orm/adapters/SQLiteAdapter.d.ts.map +1 -1
  270. package/src/orm/adapters/SQLiteAdapter.js +4 -0
  271. package/src/performance/Benchmark.d.ts.map +1 -1
  272. package/src/performance/Benchmark.js +3 -0
  273. package/src/performance/CodeGenerationBenchmark.js +3 -3
  274. package/src/performance/Optimizer.d.ts +1 -1
  275. package/src/performance/Optimizer.d.ts.map +1 -1
  276. package/src/performance/Optimizer.js +157 -80
  277. package/src/performance/establish-baseline.js +3 -3
  278. package/src/runtime/PluginManager.d.ts +3 -1
  279. package/src/runtime/PluginManager.d.ts.map +1 -1
  280. package/src/runtime/PluginManager.js +124 -28
  281. package/src/runtime/RuntimeDetector.d.ts.map +1 -1
  282. package/src/runtime/RuntimeDetector.js +47 -5
  283. package/src/runtime/adapters/CloudflareAdapter.js +2 -2
  284. package/src/runtime/adapters/DenoAdapter.js +9 -7
  285. package/src/runtime/adapters/FargateAdapter.d.ts.map +1 -1
  286. package/src/runtime/adapters/FargateAdapter.js +4 -3
  287. package/src/runtime/adapters/LambdaAdapter.d.ts.map +1 -1
  288. package/src/runtime/adapters/LambdaAdapter.js +4 -2
  289. package/src/runtime/adapters/NodeServerAdapter.d.ts.map +1 -1
  290. package/src/runtime/adapters/NodeServerAdapter.js +7 -6
  291. package/src/scheduler/ScheduleRunner.d.ts +18 -0
  292. package/src/scheduler/ScheduleRunner.d.ts.map +1 -0
  293. package/src/scheduler/ScheduleRunner.js +155 -0
  294. package/src/scheduler/index.d.ts +3 -0
  295. package/src/scheduler/index.d.ts.map +1 -0
  296. package/src/scheduler/index.js +1 -0
  297. package/src/scheduler/types.d.ts +16 -0
  298. package/src/scheduler/types.d.ts.map +1 -0
  299. package/src/scheduler/types.js +4 -0
  300. package/src/schedules/index.d.ts +2 -0
  301. package/src/schedules/index.d.ts.map +1 -0
  302. package/src/schedules/index.js +1 -0
  303. package/src/schedules/log-cleanup.d.ts +4 -0
  304. package/src/schedules/log-cleanup.d.ts.map +1 -0
  305. package/src/schedules/log-cleanup.js +18 -0
  306. package/src/scripts/GenerateEnvArtifacts.d.ts +13 -0
  307. package/src/scripts/GenerateEnvArtifacts.d.ts.map +1 -0
  308. package/src/scripts/GenerateEnvArtifacts.js +171 -0
  309. package/src/scripts/TemplateSync.js +109 -70
  310. package/src/security/CsrfTokenManager.js +1 -1
  311. package/src/security/Encryptor.js +1 -1
  312. package/src/security/Hash.d.ts +14 -0
  313. package/src/security/Hash.d.ts.map +1 -0
  314. package/src/security/Hash.js +81 -0
  315. package/src/security/StartupSecretValidation.d.ts +20 -0
  316. package/src/security/StartupSecretValidation.d.ts.map +1 -0
  317. package/src/security/StartupSecretValidation.js +61 -0
  318. package/src/security/UrlValidator.d.ts +0 -1
  319. package/src/security/UrlValidator.d.ts.map +1 -1
  320. package/src/security/UrlValidator.js +1 -2
  321. package/src/security/Xss.d.ts +14 -0
  322. package/src/security/Xss.d.ts.map +1 -0
  323. package/src/security/Xss.js +57 -0
  324. package/src/security/XssProtection.d.ts.map +1 -1
  325. package/src/security/XssProtection.js +150 -16
  326. package/src/templates/adapters/MySQLAdapter.ts.tpl +5 -0
  327. package/src/templates/adapters/PostgreSQLAdapter.ts.tpl +5 -0
  328. package/src/templates/adapters/SQLServerAdapter.ts.tpl +5 -0
  329. package/src/templates/adapters/SQLiteAdapter.ts.tpl +5 -0
  330. package/src/templates/features/Queue.ts.tpl +1 -29
  331. package/src/templates/project/basic/.env.example.tpl +48 -0
  332. package/src/templates/project/basic/.env.tpl +89 -94
  333. package/src/templates/project/basic/app/Toolkit/Broadcast/sendBroadcast.ts.tpl +7 -0
  334. package/src/templates/project/basic/app/Toolkit/Mail/sendWelcomeEmail.ts.tpl +30 -0
  335. package/src/templates/project/basic/app/Toolkit/Notification/sendSlackNotification.ts.tpl +10 -0
  336. package/src/templates/project/basic/app/Toolkit/Notification/sendSms.ts.tpl +13 -0
  337. package/src/templates/project/basic/config/FileLogWriter.ts.tpl +240 -0
  338. package/src/templates/project/basic/config/SecretsManager.ts.tpl +32 -1
  339. package/src/templates/project/basic/config/StartupConfigValidator.ts.tpl +151 -0
  340. package/src/templates/project/basic/config/app.ts.tpl +84 -15
  341. package/src/templates/project/basic/config/broadcast.ts.tpl +97 -0
  342. package/src/templates/project/basic/config/cache.ts.tpl +19 -23
  343. package/src/templates/project/basic/config/cloudflare.ts.tpl +57 -0
  344. package/src/templates/project/basic/config/env.ts.tpl +7 -1
  345. package/src/templates/project/basic/config/index.ts.tpl +3 -0
  346. package/src/templates/project/basic/config/logger.ts.tpl +301 -11
  347. package/src/templates/project/basic/config/logging/HttpLogger.ts.tpl +121 -0
  348. package/src/templates/project/basic/config/logging/KvLogger.ts.tpl +181 -0
  349. package/src/templates/project/basic/config/logging/SlackLogger.ts.tpl +156 -0
  350. package/src/templates/project/basic/config/mail.ts.tpl +141 -0
  351. package/src/templates/project/basic/config/middleware.ts.tpl +27 -0
  352. package/src/templates/project/basic/config/notification.ts.tpl +86 -0
  353. package/src/templates/project/basic/config/security.ts.tpl +4 -5
  354. package/src/templates/project/basic/config/startup.ts.tpl +27 -0
  355. package/src/templates/project/basic/config/storage.ts.tpl +77 -42
  356. package/src/templates/project/basic/database/migrations/index.ts.tpl +1 -1
  357. package/src/templates/project/basic/package.json.tpl +1 -1
  358. package/src/templates/project/basic/routes/api.ts.tpl +9 -37
  359. package/src/templates/project/basic/routes/broadcast.ts.tpl +32 -0
  360. package/src/templates/project/basic/routes/health.ts.tpl +134 -0
  361. package/src/templates/project/basic/src/index.ts.tpl +38 -11
  362. package/src/templates/project/basic/template.json +3 -0
  363. package/src/toolkit/Secrets/EnvFile.d.ts +15 -0
  364. package/src/toolkit/Secrets/EnvFile.d.ts.map +1 -0
  365. package/src/toolkit/Secrets/EnvFile.js +63 -0
  366. package/src/toolkit/Secrets/Manifest.d.ts +24 -0
  367. package/src/toolkit/Secrets/Manifest.d.ts.map +1 -0
  368. package/src/toolkit/Secrets/Manifest.js +71 -0
  369. package/src/toolkit/Secrets/index.d.ts +42 -0
  370. package/src/toolkit/Secrets/index.d.ts.map +1 -0
  371. package/src/toolkit/Secrets/index.js +119 -0
  372. package/src/toolkit/Secrets/providers/AwsSecretsManager.d.ts +14 -0
  373. package/src/toolkit/Secrets/providers/AwsSecretsManager.d.ts.map +1 -0
  374. package/src/toolkit/Secrets/providers/AwsSecretsManager.js +131 -0
  375. package/src/toolkit/Secrets/providers/CloudflareKv.d.ts +9 -0
  376. package/src/toolkit/Secrets/providers/CloudflareKv.d.ts.map +1 -0
  377. package/src/toolkit/Secrets/providers/CloudflareKv.js +73 -0
  378. package/src/tools/broadcast/Broadcast.d.ts +7 -0
  379. package/src/tools/broadcast/Broadcast.d.ts.map +1 -0
  380. package/src/tools/broadcast/Broadcast.js +37 -0
  381. package/src/tools/broadcast/drivers/BaseDriver.d.ts +5 -0
  382. package/src/tools/broadcast/drivers/BaseDriver.d.ts.map +1 -0
  383. package/src/tools/broadcast/drivers/BaseDriver.js +8 -0
  384. package/src/tools/broadcast/drivers/InMemory.d.ts +18 -0
  385. package/src/tools/broadcast/drivers/InMemory.d.ts.map +1 -0
  386. package/src/tools/broadcast/drivers/InMemory.js +16 -0
  387. package/src/tools/broadcast/drivers/Pusher.d.ts +8 -0
  388. package/src/tools/broadcast/drivers/Pusher.d.ts.map +1 -0
  389. package/src/tools/broadcast/drivers/Pusher.js +75 -0
  390. package/src/tools/broadcast/drivers/Redis.d.ts +19 -0
  391. package/src/tools/broadcast/drivers/Redis.d.ts.map +1 -0
  392. package/src/tools/broadcast/drivers/Redis.js +73 -0
  393. package/src/tools/broadcast/drivers/RedisHttps.d.ts +14 -0
  394. package/src/tools/broadcast/drivers/RedisHttps.d.ts.map +1 -0
  395. package/src/tools/broadcast/drivers/RedisHttps.js +50 -0
  396. package/src/tools/broadcast/index.d.ts +7 -0
  397. package/src/tools/broadcast/index.d.ts.map +1 -0
  398. package/src/tools/broadcast/index.js +6 -0
  399. package/src/tools/http/Http.d.ts +51 -0
  400. package/src/tools/http/Http.d.ts.map +1 -0
  401. package/src/tools/http/Http.js +171 -0
  402. package/src/tools/http/HttpResponse.d.ts +32 -0
  403. package/src/tools/http/HttpResponse.d.ts.map +1 -0
  404. package/src/tools/http/HttpResponse.js +80 -0
  405. package/src/tools/http/index.d.ts +15 -0
  406. package/src/tools/http/index.d.ts.map +1 -0
  407. package/src/tools/http/index.js +9 -0
  408. package/src/tools/mail/Mail.d.ts +22 -0
  409. package/src/tools/mail/Mail.d.ts.map +1 -0
  410. package/src/tools/mail/Mail.js +105 -0
  411. package/src/tools/mail/attachments.d.ts +23 -0
  412. package/src/tools/mail/attachments.d.ts.map +1 -0
  413. package/src/tools/mail/attachments.js +26 -0
  414. package/src/tools/mail/drivers/BaseDriver.d.ts +5 -0
  415. package/src/tools/mail/drivers/BaseDriver.d.ts.map +1 -0
  416. package/src/tools/mail/drivers/BaseDriver.js +8 -0
  417. package/src/tools/mail/drivers/Mailgun.d.ts +31 -0
  418. package/src/tools/mail/drivers/Mailgun.d.ts.map +1 -0
  419. package/src/tools/mail/drivers/Mailgun.js +81 -0
  420. package/src/tools/mail/drivers/SendGrid.d.ts +29 -0
  421. package/src/tools/mail/drivers/SendGrid.d.ts.map +1 -0
  422. package/src/tools/mail/drivers/SendGrid.js +57 -0
  423. package/src/tools/mail/drivers/Ses.d.ts +24 -0
  424. package/src/tools/mail/drivers/Ses.d.ts.map +1 -0
  425. package/src/tools/mail/drivers/Ses.js +116 -0
  426. package/src/tools/mail/drivers/Smtp.d.ts +38 -0
  427. package/src/tools/mail/drivers/Smtp.d.ts.map +1 -0
  428. package/src/tools/mail/drivers/Smtp.js +327 -0
  429. package/src/tools/mail/templates/index.d.ts +27 -0
  430. package/src/tools/mail/templates/index.d.ts.map +1 -0
  431. package/src/tools/mail/templates/index.js +35 -0
  432. package/src/tools/mail/templates/markdown/index.d.ts +17 -0
  433. package/src/tools/mail/templates/markdown/index.d.ts.map +1 -0
  434. package/src/tools/mail/templates/markdown/index.js +49 -0
  435. package/src/tools/mail/templates/markdown/registry.d.ts +15 -0
  436. package/src/tools/mail/templates/markdown/registry.d.ts.map +1 -0
  437. package/src/tools/mail/templates/markdown/registry.js +34 -0
  438. package/src/tools/mail/templates/markdown/validator.d.ts +16 -0
  439. package/src/tools/mail/templates/markdown/validator.d.ts.map +1 -0
  440. package/src/tools/mail/templates/markdown/validator.js +24 -0
  441. package/src/tools/mail/testing.d.ts +41 -0
  442. package/src/tools/mail/testing.d.ts.map +1 -0
  443. package/src/tools/mail/testing.js +34 -0
  444. package/src/tools/notification/Driver.d.ts +11 -0
  445. package/src/tools/notification/Driver.d.ts.map +1 -0
  446. package/src/tools/notification/Driver.js +1 -0
  447. package/src/tools/notification/Notification.d.ts +11 -0
  448. package/src/tools/notification/Notification.d.ts.map +1 -0
  449. package/src/tools/notification/Notification.js +11 -0
  450. package/src/tools/notification/Registry.d.ts +10 -0
  451. package/src/tools/notification/Registry.d.ts.map +1 -0
  452. package/src/tools/notification/Registry.js +22 -0
  453. package/src/tools/notification/Service.d.ts +6 -0
  454. package/src/tools/notification/Service.d.ts.map +1 -0
  455. package/src/tools/notification/Service.js +18 -0
  456. package/src/tools/notification/config.d.ts +5 -0
  457. package/src/tools/notification/config.d.ts.map +1 -0
  458. package/src/tools/notification/config.js +5 -0
  459. package/src/tools/notification/drivers/BaseDriver.d.ts +5 -0
  460. package/src/tools/notification/drivers/BaseDriver.d.ts.map +1 -0
  461. package/src/tools/notification/drivers/BaseDriver.js +8 -0
  462. package/src/tools/notification/drivers/Console.d.ts +7 -0
  463. package/src/tools/notification/drivers/Console.d.ts.map +1 -0
  464. package/src/tools/notification/drivers/Console.js +13 -0
  465. package/src/tools/notification/drivers/Slack.d.ts +16 -0
  466. package/src/tools/notification/drivers/Slack.d.ts.map +1 -0
  467. package/src/tools/notification/drivers/Slack.js +24 -0
  468. package/src/tools/notification/drivers/Termii.d.ts +10 -0
  469. package/src/tools/notification/drivers/Termii.d.ts.map +1 -0
  470. package/src/tools/notification/drivers/Termii.js +47 -0
  471. package/src/tools/notification/drivers/Twilio.d.ts +21 -0
  472. package/src/tools/notification/drivers/Twilio.d.ts.map +1 -0
  473. package/src/tools/notification/drivers/Twilio.js +48 -0
  474. package/src/tools/notification/templates/markdown/index.d.ts +15 -0
  475. package/src/tools/notification/templates/markdown/index.d.ts.map +1 -0
  476. package/src/tools/notification/templates/markdown/index.js +38 -0
  477. package/src/tools/notification/templates/markdown/registry.d.ts +15 -0
  478. package/src/tools/notification/templates/markdown/registry.d.ts.map +1 -0
  479. package/src/tools/notification/templates/markdown/registry.js +36 -0
  480. package/src/tools/notification/testing.d.ts +19 -0
  481. package/src/tools/notification/testing.d.ts.map +1 -0
  482. package/src/tools/notification/testing.js +35 -0
  483. package/src/tools/notification/testingHelpers.d.ts +12 -0
  484. package/src/tools/notification/testingHelpers.d.ts.map +1 -0
  485. package/src/tools/notification/testingHelpers.js +32 -0
  486. package/src/tools/queue/Queue.d.ts +23 -0
  487. package/src/tools/queue/Queue.d.ts.map +1 -0
  488. package/src/tools/queue/Queue.js +38 -0
  489. package/src/tools/queue/drivers/InMemory.d.ts +10 -0
  490. package/src/tools/queue/drivers/InMemory.d.ts.map +1 -0
  491. package/src/tools/queue/drivers/InMemory.js +55 -0
  492. package/src/tools/queue/drivers/Redis.d.ts +10 -0
  493. package/src/tools/queue/drivers/Redis.d.ts.map +1 -0
  494. package/src/tools/queue/drivers/Redis.js +91 -0
  495. package/src/tools/storage/drivers/Gcs.d.ts +20 -0
  496. package/src/tools/storage/drivers/Gcs.d.ts.map +1 -0
  497. package/src/tools/storage/drivers/Gcs.js +152 -0
  498. package/src/tools/storage/drivers/Local.d.ts +17 -0
  499. package/src/tools/storage/drivers/Local.d.ts.map +1 -0
  500. package/src/tools/storage/drivers/Local.js +63 -0
  501. package/src/tools/storage/drivers/R2.d.ts +20 -0
  502. package/src/tools/storage/drivers/R2.d.ts.map +1 -0
  503. package/src/tools/storage/drivers/R2.js +73 -0
  504. package/src/tools/storage/drivers/S3.d.ts +26 -0
  505. package/src/tools/storage/drivers/S3.d.ts.map +1 -0
  506. package/src/tools/storage/drivers/S3.js +258 -0
  507. package/src/tools/storage/index.d.ts +24 -0
  508. package/src/tools/storage/index.d.ts.map +1 -0
  509. package/src/tools/storage/index.js +112 -0
  510. package/src/tools/storage/testing.d.ts +23 -0
  511. package/src/tools/storage/testing.d.ts.map +1 -0
  512. package/src/tools/storage/testing.js +52 -0
  513. package/src/tools/templates/MarkdownRenderer.d.ts +14 -0
  514. package/src/tools/templates/MarkdownRenderer.d.ts.map +1 -0
  515. package/src/tools/templates/MarkdownRenderer.js +300 -0
  516. package/src/tools/templates/index.d.ts +5 -0
  517. package/src/tools/templates/index.d.ts.map +1 -0
  518. package/src/tools/templates/index.js +4 -0
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Broadcast Configuration
3
+ *
4
+ * Centralizes broadcast driver selection and provider env mappings.
5
+ * Driver selection must be dynamic (tests may mutate process.env).
6
+ */
7
+
8
+ import { Env } from '@config/env';
9
+
10
+ export type KnownBroadcastDriverName = 'inmemory' | 'pusher' | 'redis' | 'redishttps';
11
+
12
+ export type InMemoryBroadcastDriverConfig = {
13
+ driver: 'inmemory';
14
+ };
15
+
16
+ export type PusherBroadcastDriverConfig = {
17
+ driver: 'pusher';
18
+ appId: string;
19
+ key: string;
20
+ secret: string;
21
+ cluster: string;
22
+ useTLS: boolean;
23
+ };
24
+
25
+ export type RedisBroadcastDriverConfig = {
26
+ driver: 'redis';
27
+ host: string;
28
+ port: number;
29
+ password: string;
30
+ channelPrefix: string;
31
+ };
32
+
33
+ export type RedisHttpsBroadcastDriverConfig = {
34
+ driver: 'redishttps';
35
+ endpoint: string;
36
+ token: string;
37
+ channelPrefix: string;
38
+ };
39
+
40
+ export type KnownBroadcastDriverConfig =
41
+ | InMemoryBroadcastDriverConfig
42
+ | PusherBroadcastDriverConfig
43
+ | RedisBroadcastDriverConfig
44
+ | RedisHttpsBroadcastDriverConfig;
45
+
46
+ const normalizeDriverName = (value: string): string => value.trim().toLowerCase();
47
+
48
+ const getPusherConfig = (): PusherBroadcastDriverConfig => ({
49
+ driver: 'pusher',
50
+ appId: Env.get('PUSHER_APP_ID', ''),
51
+ key: Env.get('PUSHER_APP_KEY', ''),
52
+ secret: Env.get('PUSHER_APP_SECRET', ''),
53
+ cluster: Env.get('PUSHER_APP_CLUSTER', ''),
54
+ useTLS: Env.getBool('PUSHER_USE_TLS', true),
55
+ });
56
+
57
+ const getRedisConfig = (): RedisBroadcastDriverConfig => ({
58
+ driver: 'redis',
59
+ host: Env.get('BROADCAST_REDIS_HOST', Env.get('REDIS_HOST', 'localhost')),
60
+ port: Env.getInt('BROADCAST_REDIS_PORT', Env.getInt('REDIS_PORT', 6379)),
61
+ password: Env.get('BROADCAST_REDIS_PASSWORD', Env.get('REDIS_PASSWORD', '')),
62
+ channelPrefix: Env.get('BROADCAST_CHANNEL_PREFIX', 'broadcast:'),
63
+ });
64
+
65
+ const getRedisHttpsConfig = (): RedisHttpsBroadcastDriverConfig => ({
66
+ driver: 'redishttps',
67
+ endpoint: Env.get('REDIS_HTTPS_ENDPOINT', ''),
68
+ token: Env.get('REDIS_HTTPS_TOKEN', ''),
69
+ channelPrefix: Env.get('BROADCAST_CHANNEL_PREFIX', 'broadcast:'),
70
+ });
71
+
72
+ const broadcastConfigObj = {
73
+ /**
74
+ * Normalized broadcast driver name.
75
+ *
76
+ * NOTE: Allows custom driver names (project-specific drivers), so returns string.
77
+ */
78
+ getDriverName(): string {
79
+ return normalizeDriverName(Env.get('BROADCAST_DRIVER', 'inmemory'));
80
+ },
81
+
82
+ /**
83
+ * Get a config object for the currently selected driver.
84
+ * Defaults to inmemory for unknown/unsupported names.
85
+ */
86
+ getDriverConfig(): KnownBroadcastDriverConfig {
87
+ const driver = this.getDriverName();
88
+
89
+ if (driver === 'pusher') return getPusherConfig();
90
+ if (driver === 'redis') return getRedisConfig();
91
+ if (driver === 'redishttps') return getRedisHttpsConfig();
92
+
93
+ return { driver: 'inmemory' };
94
+ },
95
+ } as const;
96
+
97
+ export default Object.freeze(broadcastConfigObj);
@@ -15,34 +15,32 @@ type RedisCacheDriverConfig = {
15
15
  driver: 'redis';
16
16
  host: string;
17
17
  port: number;
18
- password: string | undefined;
19
- database: number;
20
18
  ttl: number;
21
19
  };
22
20
 
23
- type MemcachedCacheDriverConfig = {
24
- driver: 'memcached';
25
- servers: string[];
21
+ type MongoCacheDriverConfig = {
22
+ driver: 'mongodb';
23
+ uri: string;
24
+ db: string;
26
25
  ttl: number;
27
26
  };
28
27
 
29
- type FileCacheDriverConfig = {
30
- driver: 'file';
31
- path: string;
28
+ type KvCacheDriverConfig = {
29
+ driver: 'kv';
32
30
  ttl: number;
33
31
  };
34
32
 
35
33
  type CacheDriverConfig =
36
34
  | MemoryCacheDriverConfig
37
35
  | RedisCacheDriverConfig
38
- | MemcachedCacheDriverConfig
39
- | FileCacheDriverConfig;
36
+ | MongoCacheDriverConfig
37
+ | KvCacheDriverConfig;
40
38
 
41
39
  type CacheDrivers = {
42
40
  memory: MemoryCacheDriverConfig;
43
41
  redis: RedisCacheDriverConfig;
44
- memcached: MemcachedCacheDriverConfig;
45
- file: FileCacheDriverConfig;
42
+ mongodb: MongoCacheDriverConfig;
43
+ kv: KvCacheDriverConfig;
46
44
  };
47
45
 
48
46
  type CacheConfigInput = {
@@ -53,7 +51,7 @@ type CacheConfigInput = {
53
51
  const getCacheDriver = (config: CacheConfigInput): CacheDriverConfig => {
54
52
  const defaultDriver = config.default;
55
53
 
56
- if (Object.prototype.hasOwnProperty.call(config.drivers, defaultDriver)) {
54
+ if (Object.hasOwn(config.drivers, defaultDriver)) {
57
55
  const driverName = defaultDriver as keyof CacheDrivers;
58
56
  return config.drivers[driverName];
59
57
  }
@@ -79,19 +77,17 @@ const cacheConfigObj = {
79
77
  driver: 'redis' as const,
80
78
  host: Env.get('REDIS_HOST', 'localhost'),
81
79
  port: Env.getInt('REDIS_PORT', 6379),
82
- password: Env.get('REDIS_PASSWORD'),
83
- database: Env.getInt('REDIS_DB', 0),
84
80
  ttl: Env.getInt('CACHE_REDIS_TTL', 3600),
85
81
  },
86
- memcached: {
87
- driver: 'memcached' as const,
88
- servers: Env.get('MEMCACHED_SERVERS', 'localhost:11211').split(','),
89
- ttl: Env.getInt('CACHE_MEMCACHED_TTL', 3600),
82
+ mongodb: {
83
+ driver: 'mongodb' as const,
84
+ uri: Env.get('MONGO_URI'),
85
+ db: Env.get('MONGO_DB', 'zintrust_cache'),
86
+ ttl: Env.getInt('CACHE_MONGO_TTL', 3600),
90
87
  },
91
- file: {
92
- driver: 'file' as const,
93
- path: Env.get('CACHE_FILE_PATH', 'storage/cache'),
94
- ttl: Env.getInt('CACHE_FILE_TTL', 3600),
88
+ kv: {
89
+ driver: 'kv' as const,
90
+ ttl: Env.getInt('CACHE_KV_TTL', 3600),
95
91
  },
96
92
  },
97
93
 
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Cloudflare Workers Environment Access
3
+ *
4
+ * Centralizes access to Workers bindings via globalThis.env.
5
+ * This keeps runtime-specific globals out of adapters/drivers.
6
+ */
7
+
8
+ import type { DatabaseConfig, ID1Database } from '@orm/DatabaseAdapter';
9
+
10
+ export type WorkersEnv = Record<string, unknown>;
11
+
12
+ type KVNamespace = {
13
+ get(
14
+ key: string,
15
+ options?: { type: 'text' | 'json' | 'arrayBuffer' | 'stream' }
16
+ ): Promise<unknown>;
17
+ put(
18
+ key: string,
19
+ value: string | ReadableStream | ArrayBuffer | FormData,
20
+ options?: { expiration?: number; expirationTtl?: number; metadata?: unknown }
21
+ ): Promise<void>;
22
+ delete(key: string): Promise<void>;
23
+ };
24
+
25
+ const getWorkersEnv = (): WorkersEnv | null => {
26
+ const env = (globalThis as unknown as { env?: unknown }).env;
27
+ if (env === undefined || env === null) return null;
28
+ if (typeof env !== 'object') return null;
29
+ return env as WorkersEnv;
30
+ };
31
+
32
+ const getD1Binding = (config: DatabaseConfig): ID1Database | null => {
33
+ if (config.d1 !== undefined && config.d1 !== null) return config.d1;
34
+
35
+ const env = getWorkersEnv();
36
+ const envDb = env === null ? undefined : (env['DB'] as ID1Database | undefined);
37
+ if (envDb !== undefined) return envDb;
38
+
39
+ const globalDb = (globalThis as unknown as { DB?: ID1Database }).DB;
40
+ if (globalDb !== undefined) return globalDb;
41
+
42
+ return null;
43
+ };
44
+
45
+ const getKVBinding = (bindingName = 'CACHE'): KVNamespace | null => {
46
+ const env = getWorkersEnv();
47
+ if (env === null) return null;
48
+
49
+ const kv = env[bindingName] as KVNamespace | undefined;
50
+ return kv ?? null;
51
+ };
52
+
53
+ export const Cloudflare = Object.freeze({
54
+ getWorkersEnv,
55
+ getD1Binding,
56
+ getKVBinding,
57
+ });
@@ -71,7 +71,7 @@ export const Env = Object.freeze({
71
71
  DB_CONNECTION: get('DB_CONNECTION', 'sqlite'),
72
72
  DB_HOST: get('DB_HOST', 'localhost'),
73
73
  DB_PORT: getInt('DB_PORT', 5432),
74
- DB_DATABASE: get('DB_DATABASE', '@zintrust/core'),
74
+ DB_DATABASE: get('DB_DATABASE', 'zintrust'),
75
75
  DB_USERNAME: get('DB_USERNAME', 'postgres'),
76
76
  DB_PASSWORD: get('DB_PASSWORD', ''),
77
77
  DB_READ_HOSTS: get('DB_READ_HOSTS', ''),
@@ -114,10 +114,16 @@ export const Env = Object.freeze({
114
114
  ENVIRONMENT: get('ENVIRONMENT', 'development'),
115
115
  REQUEST_TIMEOUT: getInt('REQUEST_TIMEOUT', 30000),
116
116
  MAX_BODY_SIZE: getInt('MAX_BODY_SIZE', 10485760),
117
+ SHUTDOWN_TIMEOUT: getInt('SHUTDOWN_TIMEOUT', 10000),
117
118
 
118
119
  // Logging
119
120
  LOG_LEVEL: get('LOG_LEVEL', getDefaultLogLevel()) as 'debug' | 'info' | 'warn' | 'error',
121
+ LOG_FORMAT: get('LOG_FORMAT', 'text'),
120
122
  DISABLE_LOGGING: getBool('DISABLE_LOGGING', false),
123
+ LOG_HTTP_REQUEST: getBool('LOG_HTTP_REQUEST', false),
124
+ LOG_TO_FILE: getBool('LOG_TO_FILE', false),
125
+ LOG_ROTATION_SIZE: getInt('LOG_ROTATION_SIZE', 10485760),
126
+ LOG_ROTATION_DAYS: getInt('LOG_ROTATION_DAYS', 7),
121
127
 
122
128
  // Paths (safely constructed for Node.js environments)
123
129
  NODE_BIN_DIR: (() => {
@@ -7,6 +7,7 @@ import { appConfig } from '@config/app';
7
7
  import { cacheConfig } from '@config/cache';
8
8
  import { databaseConfig } from '@config/database';
9
9
  import { microservicesConfig } from '@config/microservices';
10
+ import { middlewareConfig } from '@config/middleware';
10
11
  import { queueConfig } from '@config/queue';
11
12
  import { securityConfig } from '@config/security';
12
13
  import { storageConfig } from '@config/storage';
@@ -15,6 +16,7 @@ export { appConfig, type AppConfig } from '@config/app';
15
16
  export { cacheConfig, type CacheConfig } from '@config/cache';
16
17
  export { databaseConfig, type DatabaseConfig } from '@config/database';
17
18
  export { microservicesConfig, type MicroservicesConfig } from '@config/microservices';
19
+ export { middlewareConfig, type MiddlewareConfig } from '@config/middleware';
18
20
  export { queueConfig, type QueueConfig } from '@config/queue';
19
21
  export { securityConfig } from '@config/security';
20
22
  export { storageConfig, type StorageConfig } from '@config/storage';
@@ -28,6 +30,7 @@ export const config = Object.freeze({
28
30
  database: databaseConfig,
29
31
  storage: storageConfig,
30
32
  security: securityConfig,
33
+ middleware: middlewareConfig,
31
34
  microservices: microservicesConfig,
32
35
  cache: cacheConfig,
33
36
  queue: queueConfig,
@@ -3,6 +3,7 @@
3
3
  * Sealed namespace pattern - all exports through Logger namespace
4
4
  * Replaces console.* calls throughout the codebase
5
5
  */
6
+ import { appConfig } from '@config/app';
6
7
  import { Env } from '@config/env';
7
8
 
8
9
  interface ILogger {
@@ -13,8 +14,146 @@ interface ILogger {
13
14
  fatal(message: string, error?: unknown, category?: string): void;
14
15
  }
15
16
 
16
- const isDevelopment = Env.NODE_ENV === 'development' || Env.NODE_ENV === undefined;
17
- const isProduction = Env.NODE_ENV === 'production';
17
+ const isDevelopment = (): boolean => appConfig.isDevelopment();
18
+ const isProduction = (): boolean => appConfig.isProduction();
19
+
20
+ const getLogFormat = (): string => Env.get('LOG_FORMAT', 'text');
21
+ const isJsonFormat = (value: unknown): value is 'json' => value === 'json';
22
+
23
+ const SENSITIVE_FIELDS = new Set<string>([
24
+ 'password',
25
+ 'token',
26
+ 'authorization',
27
+ 'secret',
28
+ 'apikey',
29
+ 'api_key',
30
+ 'jwt',
31
+ 'bearer',
32
+ ]);
33
+
34
+ const redactSensitiveData = (data: unknown): unknown => {
35
+ const seen = new WeakSet<object>();
36
+
37
+ const walk = (value: unknown): unknown => {
38
+ if (Array.isArray(value)) {
39
+ if (seen.has(value)) return '[Circular]';
40
+ seen.add(value);
41
+ return value.map((v) => walk(v));
42
+ }
43
+
44
+ if (typeof value === 'object' && value !== null) {
45
+ const asObj = value as Record<string, unknown>;
46
+ if (seen.has(asObj)) return '[Circular]';
47
+ seen.add(asObj);
48
+
49
+ const out: Record<string, unknown> = {};
50
+ for (const [key, inner] of Object.entries(asObj)) {
51
+ if (SENSITIVE_FIELDS.has(key.toLowerCase())) {
52
+ out[key] = '[REDACTED]';
53
+ } else {
54
+ out[key] = walk(inner);
55
+ }
56
+ }
57
+ return out;
58
+ }
59
+
60
+ return value;
61
+ };
62
+
63
+ return walk(data);
64
+ };
65
+
66
+ const safeStringify = (obj: unknown, indent: boolean = false): string => {
67
+ const seen = new WeakSet<object>();
68
+ return JSON.stringify(
69
+ obj,
70
+ (_key: string, value: unknown) => {
71
+ if (typeof value === 'object' && value !== null) {
72
+ const asObj = value;
73
+ if (seen.has(asObj)) return '[Circular]';
74
+ seen.add(asObj);
75
+ }
76
+ return value;
77
+ },
78
+ indent ? 2 : 0
79
+ );
80
+ };
81
+
82
+ type FileWriterModule = { FileLogWriter: { write: (line: string) => void } };
83
+
84
+ let fileWriterPromise: Promise<FileWriterModule> | undefined;
85
+ let fileWriter: FileWriterModule['FileLogWriter'] | undefined;
86
+
87
+ const getFileWriter = (): void => {
88
+ if (fileWriter !== undefined) return;
89
+ if (fileWriterPromise !== undefined) return;
90
+ fileWriterPromise = import('@config/FileLogWriter')
91
+ .then((mod) => {
92
+ fileWriter = mod.FileLogWriter;
93
+ return mod;
94
+ })
95
+ .catch(() => {
96
+ fileWriterPromise = undefined;
97
+ return { FileLogWriter: { write: (_line: string) => undefined } };
98
+ });
99
+ };
100
+
101
+ const shouldLogToFile = (): boolean => {
102
+ // Prefer dynamic lookup so late-bound env (tests, some runtimes) is respected.
103
+ if (!Env.getBool('LOG_TO_FILE', false)) return false;
104
+ if (typeof process === 'undefined') return false;
105
+ return true;
106
+ };
107
+
108
+ const buildFileLine = (params: {
109
+ formatted: string;
110
+ data?: unknown;
111
+ errorMessage?: string;
112
+ }): string => {
113
+ if (isJsonFormat(getLogFormat())) return params.formatted;
114
+
115
+ let line = params.formatted;
116
+ if (typeof params.errorMessage === 'string' && params.errorMessage.length > 0) {
117
+ line = `${line} ${params.errorMessage}`;
118
+ } else if (params.data !== undefined && params.data !== '') {
119
+ line = `${line} ${safeStringify(redactSensitiveData(params.data))}`;
120
+ }
121
+ return line;
122
+ };
123
+
124
+ const writeToFile = (line: string): void => {
125
+ if (!shouldLogToFile()) return;
126
+
127
+ if (fileWriter !== undefined) {
128
+ fileWriter.write(line);
129
+ return;
130
+ }
131
+
132
+ getFileWriter();
133
+ fileWriterPromise?.then((mod) => mod.FileLogWriter.write(line));
134
+ };
135
+
136
+ const formatLogMessage = (params: {
137
+ level: 'debug' | 'info' | 'warn' | 'error' | 'fatal';
138
+ message: string;
139
+ data?: unknown;
140
+ category?: string;
141
+ errorMessage?: string;
142
+ }): string => {
143
+ if (isJsonFormat(getLogFormat())) {
144
+ return safeStringify({
145
+ timestamp: new Date().toISOString(),
146
+ level: params.level,
147
+ message: params.message,
148
+ category: params.category,
149
+ data: redactSensitiveData(params.data),
150
+ error: params.errorMessage,
151
+ });
152
+ }
153
+
154
+ // text format
155
+ return `[${params.level.toUpperCase()}] ${params.message}`;
156
+ };
18
157
 
19
158
  /**
20
159
  * Helper to extract error message from unknown error type
@@ -26,38 +165,174 @@ const getErrorMessage = (error?: unknown): string => {
26
165
  if (error instanceof Error) {
27
166
  return error.message;
28
167
  }
29
- return String(error);
168
+
169
+ if (typeof error === 'string') return error;
170
+ if (typeof error === 'number' || typeof error === 'bigint') return error.toString();
171
+ if (typeof error === 'boolean') return error ? 'true' : 'false';
172
+ if (typeof error === 'symbol') return error.toString();
173
+ if (typeof error === 'function') return '[Function]';
174
+
175
+ try {
176
+ return safeStringify(error);
177
+ } catch {
178
+ return '[Unserializable error]';
179
+ }
180
+ };
181
+
182
+ type CloudLogEvent = {
183
+ timestamp: string;
184
+ level: 'debug' | 'info' | 'warn' | 'error' | 'fatal';
185
+ message: string;
186
+ category?: string;
187
+ data?: unknown;
188
+ error?: string;
189
+ };
190
+
191
+ const emitCloudLogs = (event: CloudLogEvent): void => {
192
+ // Lazy-load to avoid cycles and avoid cost when disabled.
193
+ void (async (): Promise<void> => {
194
+ try {
195
+ if (event.level === 'error' || event.level === 'fatal') {
196
+ const mod = await import('@config/logging/KvLogger');
197
+ void mod.KvLogger.enqueue(event);
198
+ }
199
+ } catch {
200
+ // best-effort
201
+ }
202
+
203
+ try {
204
+ if (event.level === 'warn' || event.level === 'error' || event.level === 'fatal') {
205
+ const mod = await import('@config/logging/SlackLogger');
206
+ void mod.SlackLogger.enqueue(event);
207
+ }
208
+ } catch {
209
+ // best-effort
210
+ }
211
+
212
+ try {
213
+ const mod = await import('@config/logging/HttpLogger');
214
+ void mod.HttpLogger.enqueue(event);
215
+ } catch {
216
+ // best-effort
217
+ }
218
+ })();
30
219
  };
31
220
 
32
221
  // Private helper functions
33
222
  const logDebug = (message: string, data?: unknown, category?: string): void => {
34
223
  String(category);
35
- if (isDevelopment) {
36
- console.debug(`[DEBUG] ${message}`, data ?? ''); // eslint-disable-line no-console
224
+ if (isDevelopment()) {
225
+ const timestamp = new Date().toISOString();
226
+ const out = formatLogMessage({ level: 'debug', message, data, category });
227
+ writeToFile(buildFileLine({ formatted: out, data }));
228
+ if (isJsonFormat(getLogFormat())) {
229
+ console.debug(out); // eslint-disable-line no-console
230
+ return;
231
+ }
232
+ console.debug(out, data ?? ''); // eslint-disable-line no-console
233
+
234
+ emitCloudLogs({
235
+ timestamp,
236
+ level: 'debug',
237
+ message,
238
+ category,
239
+ data: redactSensitiveData(data),
240
+ });
37
241
  }
38
242
  };
39
243
 
40
244
  const logInfo = (message: string, data?: unknown, category?: string): void => {
41
245
  String(category);
42
- console.log(`[INFO] ${message}`, data ?? ''); // eslint-disable-line no-console
246
+ const timestamp = new Date().toISOString();
247
+ const out = formatLogMessage({ level: 'info', message, data, category });
248
+ writeToFile(buildFileLine({ formatted: out, data }));
249
+ if (isJsonFormat(getLogFormat())) {
250
+ console.log(out); // eslint-disable-line no-console
251
+ } else {
252
+ console.log(out, data ?? ''); // eslint-disable-line no-console
253
+ }
254
+
255
+ emitCloudLogs({
256
+ timestamp,
257
+ level: 'info',
258
+ message,
259
+ category,
260
+ data: redactSensitiveData(data),
261
+ });
43
262
  };
44
263
 
45
264
  const logWarn = (message: string, data?: unknown, category?: string): void => {
46
265
  String(category);
47
- console.warn(`[WARN] ${message}`, data ?? ''); // eslint-disable-line no-console
266
+ const timestamp = new Date().toISOString();
267
+ const out = formatLogMessage({ level: 'warn', message, data, category });
268
+ writeToFile(buildFileLine({ formatted: out, data }));
269
+ if (isJsonFormat(getLogFormat())) {
270
+ console.warn(out); // eslint-disable-line no-console
271
+ } else {
272
+ console.warn(out, data ?? ''); // eslint-disable-line no-console
273
+ }
274
+
275
+ emitCloudLogs({
276
+ timestamp,
277
+ level: 'warn',
278
+ message,
279
+ category,
280
+ data: redactSensitiveData(data),
281
+ });
48
282
  };
49
283
 
50
284
  const logError = (message: string, error?: unknown, category?: string): void => {
51
285
  const errorMessage = getErrorMessage(error);
52
286
  String(category);
53
- console.error(`[ERROR] ${message}`, errorMessage); // eslint-disable-line no-console
287
+ const timestamp = new Date().toISOString();
288
+ const out = formatLogMessage({
289
+ level: 'error',
290
+ message,
291
+ category,
292
+ errorMessage,
293
+ });
294
+ writeToFile(buildFileLine({ formatted: out, errorMessage }));
295
+ if (isJsonFormat(getLogFormat())) {
296
+ console.error(out); // eslint-disable-line no-console
297
+ } else {
298
+ console.error(out, errorMessage); // eslint-disable-line no-console
299
+ }
300
+
301
+ emitCloudLogs({
302
+ timestamp,
303
+ level: 'error',
304
+ message,
305
+ category,
306
+ error: errorMessage,
307
+ });
54
308
  };
55
309
 
56
310
  const logFatal = (message: string, error?: unknown, category?: string): void => {
57
311
  const errorMessage = getErrorMessage(error);
58
312
  String(category);
59
- console.error(`[FATAL] ${message}`, errorMessage); // eslint-disable-line no-console
60
- if (isProduction && typeof process !== 'undefined') {
313
+ const timestamp = new Date().toISOString();
314
+ const out = formatLogMessage({
315
+ level: 'fatal',
316
+ message,
317
+ category,
318
+ errorMessage,
319
+ });
320
+ writeToFile(buildFileLine({ formatted: out, errorMessage }));
321
+ if (isJsonFormat(getLogFormat())) {
322
+ console.error(out); // eslint-disable-line no-console
323
+ } else {
324
+ console.error(out, errorMessage); // eslint-disable-line no-console
325
+ }
326
+
327
+ emitCloudLogs({
328
+ timestamp,
329
+ level: 'fatal',
330
+ message,
331
+ category,
332
+ error: errorMessage,
333
+ });
334
+
335
+ if (isProduction() && typeof process !== 'undefined') {
61
336
  process.exit(1);
62
337
  }
63
338
  };
@@ -82,13 +357,28 @@ const createLoggerScope = (scope: string): ILogger => {
82
357
  };
83
358
  };
84
359
 
85
- // Sealed namespace with all logger functionality
360
+ // Expose log cleanup API and sealed namespace with all logger functionality
361
+ export const cleanLogsOnce = async (): Promise<string[]> => {
362
+ if (!shouldLogToFile()) return [];
363
+
364
+ try {
365
+ const mod = await import('@config/FileLogWriter');
366
+ const deleted = mod.cleanOnce();
367
+ logInfo('Log cleanup executed', { deletedCount: deleted.length });
368
+ return deleted;
369
+ } catch (err: unknown) {
370
+ logError('Log cleanup failed', err as Error);
371
+ return [];
372
+ }
373
+ };
374
+
86
375
  export const Logger = Object.freeze({
87
376
  debug: logDebug,
88
377
  info: logInfo,
89
378
  warn: logWarn,
90
379
  error: logError,
91
380
  fatal: logFatal,
381
+ cleanLogsOnce,
92
382
  scope: createLoggerScope,
93
383
  });
94
384