@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,22 @@
1
+ /**
2
+ * KV Logger
3
+ * Writes batches of log events to a KV namespace (Cloudflare Workers compatible)
4
+ *
5
+ * Enabled via env:
6
+ * - KV_LOG_ENABLED (default: false)
7
+ * - KV_NAMESPACE (binding name; default: 'CACHE')
8
+ * - KV_LOG_RETENTION_DAYS (default: 30)
9
+ */
10
+ export type KvLogEvent = {
11
+ timestamp: string;
12
+ level: 'debug' | 'info' | 'warn' | 'error' | 'fatal';
13
+ message: string;
14
+ category?: string;
15
+ data?: unknown;
16
+ error?: string;
17
+ };
18
+ export declare const KvLogger: Readonly<{
19
+ enqueue(event: KvLogEvent): Promise<void>;
20
+ }>;
21
+ export default KvLogger;
22
+ //# sourceMappingURL=KvLogger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KvLogger.d.ts","sourceRoot":"","sources":["../../../../src/config/logging/KvLogger.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,MAAM,MAAM,UAAU,GAAG;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;IACrD,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AA2IF,eAAO,MAAM,QAAQ;mBACE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;EAkB/C,CAAC;AAEH,eAAe,QAAQ,CAAC"}
@@ -0,0 +1,143 @@
1
+ /**
2
+ * KV Logger
3
+ * Writes batches of log events to a KV namespace (Cloudflare Workers compatible)
4
+ *
5
+ * Enabled via env:
6
+ * - KV_LOG_ENABLED (default: false)
7
+ * - KV_NAMESPACE (binding name; default: 'CACHE')
8
+ * - KV_LOG_RETENTION_DAYS (default: 30)
9
+ */
10
+ import { Cloudflare } from '../cloudflare';
11
+ import { Env } from '../env';
12
+ const getRetentionTtlSeconds = () => {
13
+ const days = Env.getInt('KV_LOG_RETENTION_DAYS', 30);
14
+ const safeDays = Number.isFinite(days) && days > 0 ? days : 30;
15
+ return safeDays * 24 * 60 * 60;
16
+ };
17
+ const getKvBindingName = () => {
18
+ const name = Env.get('KV_NAMESPACE', 'CACHE').trim();
19
+ return name.length > 0 ? name : 'CACHE';
20
+ };
21
+ const isEnabled = () => Env.getBool('KV_LOG_ENABLED', false);
22
+ const safeRandom = () => {
23
+ try {
24
+ // Prefer crypto if available
25
+ const cryptoObj = globalThis.crypto;
26
+ if (cryptoObj?.getRandomValues) {
27
+ const bytes = new Uint8Array(8);
28
+ cryptoObj.getRandomValues(bytes);
29
+ return Array.from(bytes)
30
+ .map((b) => b.toString(16).padStart(2, '0'))
31
+ .join('');
32
+ }
33
+ }
34
+ catch {
35
+ // fall through
36
+ }
37
+ const generate = Math.random().toString(16).slice(2); // NOSONAR
38
+ const fallback = generate + Math.random().toString(16).slice(2); // NOSONAR this is not used for security
39
+ return fallback;
40
+ };
41
+ const buildKey = (timestampIso) => {
42
+ const date = timestampIso.slice(0, 10);
43
+ const hour = timestampIso.slice(11, 13);
44
+ return `logs:${date}:${hour}:${safeRandom()}`;
45
+ };
46
+ let buffer = [];
47
+ let flushTimer;
48
+ let flushPromise;
49
+ const scheduleFlush = async () => {
50
+ if (flushPromise !== undefined)
51
+ return flushPromise;
52
+ // Fixed small batching window to reduce KV write volume.
53
+ const windowMs = 1000;
54
+ const promise = new Promise((resolve) => {
55
+ const run = async () => {
56
+ try {
57
+ await flushNow();
58
+ }
59
+ finally {
60
+ resolve(undefined);
61
+ }
62
+ };
63
+ if (typeof globalThis.setTimeout !== 'function') {
64
+ // microtask-ish
65
+ void run();
66
+ return;
67
+ }
68
+ flushTimer = globalThis.setTimeout(() => {
69
+ flushTimer = undefined;
70
+ void run();
71
+ }, windowMs);
72
+ });
73
+ flushPromise = promise.finally(() => {
74
+ flushPromise = undefined;
75
+ });
76
+ return flushPromise;
77
+ };
78
+ const getKv = () => {
79
+ const bindingName = getKvBindingName();
80
+ return Cloudflare.getKVBinding(bindingName);
81
+ };
82
+ const putBatch = async (kv, events) => {
83
+ if (events.length === 0)
84
+ return;
85
+ const timestamp = events.at(-1)?.timestamp ?? new Date().toISOString();
86
+ const key = buildKey(timestamp);
87
+ const payload = JSON.stringify({
88
+ version: 1,
89
+ createdAt: new Date().toISOString(),
90
+ count: events.length,
91
+ events,
92
+ });
93
+ const opts = { expirationTtl: getRetentionTtlSeconds() };
94
+ await kv.put(key, payload, opts);
95
+ };
96
+ const flushNow = async () => {
97
+ if (!isEnabled()) {
98
+ buffer = [];
99
+ return;
100
+ }
101
+ const kv = getKv();
102
+ if (kv === null) {
103
+ buffer = [];
104
+ return;
105
+ }
106
+ const toSend = buffer;
107
+ buffer = [];
108
+ try {
109
+ await putBatch(kv, toSend);
110
+ }
111
+ catch {
112
+ // Best-effort: never throw from logging.
113
+ }
114
+ };
115
+ const flushSoon = async () => {
116
+ if (flushPromise !== undefined)
117
+ return flushPromise;
118
+ flushPromise = Promise.resolve()
119
+ .then(async () => flushNow())
120
+ .finally(() => {
121
+ flushPromise = undefined;
122
+ });
123
+ return flushPromise;
124
+ };
125
+ export const KvLogger = Object.freeze({
126
+ async enqueue(event) {
127
+ if (!isEnabled())
128
+ return Promise.resolve();
129
+ buffer.push(event);
130
+ // Basic size guard: flush if it gets too large
131
+ const maxBatch = 100;
132
+ if (buffer.length >= maxBatch) {
133
+ // Cancel scheduled flush and flush immediately
134
+ if (flushTimer !== undefined) {
135
+ globalThis.clearTimeout(flushTimer);
136
+ flushTimer = undefined;
137
+ }
138
+ return flushSoon();
139
+ }
140
+ return scheduleFlush();
141
+ },
142
+ });
143
+ export default KvLogger;
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Slack Notification Logger
3
+ * Sends warn/error/fatal log events to a Slack incoming webhook.
4
+ *
5
+ * Enabled via env:
6
+ * - SLACK_LOG_ENABLED (default: false)
7
+ * - SLACK_LOG_WEBHOOK_URL
8
+ * - SLACK_LOG_LEVELS (comma-separated; default: "warn,error,fatal")
9
+ * - SLACK_LOG_BATCH_WINDOW_MS (default: 5000)
10
+ */
11
+ export type SlackLogEvent = {
12
+ timestamp: string;
13
+ level: 'debug' | 'info' | 'warn' | 'error' | 'fatal';
14
+ message: string;
15
+ category?: string;
16
+ data?: unknown;
17
+ error?: string;
18
+ };
19
+ export declare const SlackLogger: Readonly<{
20
+ enqueue(event: SlackLogEvent): Promise<void>;
21
+ }>;
22
+ export default SlackLogger;
23
+ //# sourceMappingURL=SlackLogger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SlackLogger.d.ts","sourceRoot":"","sources":["../../../../src/config/logging/SlackLogger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,MAAM,MAAM,aAAa,GAAG;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;IACrD,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAoHF,eAAO,MAAM,WAAW;mBACD,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;EAclD,CAAC;AAEH,eAAe,WAAW,CAAC"}
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Slack Notification Logger
3
+ * Sends warn/error/fatal log events to a Slack incoming webhook.
4
+ *
5
+ * Enabled via env:
6
+ * - SLACK_LOG_ENABLED (default: false)
7
+ * - SLACK_LOG_WEBHOOK_URL
8
+ * - SLACK_LOG_LEVELS (comma-separated; default: "warn,error,fatal")
9
+ * - SLACK_LOG_BATCH_WINDOW_MS (default: 5000)
10
+ */
11
+ import { Env } from '../env';
12
+ import { ErrorFactory } from '../../exceptions/ZintrustError';
13
+ import { HttpClient } from '../../tools/http/Http';
14
+ const isEnabled = () => Env.getBool('SLACK_LOG_ENABLED', false);
15
+ const getLevels = () => {
16
+ const raw = Env.get('SLACK_LOG_LEVELS', 'warn,error,fatal');
17
+ return new Set(raw
18
+ .split(',')
19
+ .map((s) => s.trim().toLowerCase())
20
+ .filter((s) => s.length > 0));
21
+ };
22
+ const levelToColor = (level) => {
23
+ if (level === 'fatal' || level === 'error')
24
+ return '#D50200';
25
+ if (level === 'warn')
26
+ return '#D39E00';
27
+ return '#439FE0';
28
+ };
29
+ const formatEventText = (ev) => {
30
+ const header = `*${ev.level.toUpperCase()}* ${ev.message}`;
31
+ const metaParts = [];
32
+ if (ev.category !== undefined)
33
+ metaParts.push(`category=${ev.category}`);
34
+ metaParts.push(`ts=${ev.timestamp}`);
35
+ const meta = metaParts.length > 0 ? `\n_${metaParts.join(' ')}_` : '';
36
+ const err = ev.error === undefined ? '' : `\n*error:* ${String(ev.error)}`;
37
+ const data = ev.data === undefined ? '' : `\n*data:* \`${JSON.stringify(ev.data)}\``;
38
+ return `${header}${meta}${err}${data}`;
39
+ };
40
+ let buffer = [];
41
+ let flushPromise;
42
+ let dedupeKeys = new Set();
43
+ const dedupeKeyFor = (ev) => {
44
+ const base = `${ev.level}:${ev.message}:${ev.error ?? ''}`;
45
+ return base.length > 500 ? base.slice(0, 500) : base;
46
+ };
47
+ const sendBatch = async (events) => {
48
+ const webhookUrl = Env.get('SLACK_LOG_WEBHOOK_URL').trim();
49
+ if (webhookUrl.length === 0) {
50
+ throw ErrorFactory.createConfigError('SLACK_LOG_WEBHOOK_URL is required when Slack logging is enabled');
51
+ }
52
+ const lines = events.map((e) => formatEventText(e)).join('\n\n');
53
+ const payload = {
54
+ attachments: [
55
+ {
56
+ color: levelToColor(events[0]?.level ?? 'warn'),
57
+ text: lines,
58
+ },
59
+ ],
60
+ };
61
+ await HttpClient.post(webhookUrl, payload).send();
62
+ };
63
+ const flushNow = async () => {
64
+ const toSend = buffer;
65
+ buffer = [];
66
+ dedupeKeys = new Set();
67
+ if (!isEnabled())
68
+ return;
69
+ if (toSend.length === 0)
70
+ return;
71
+ try {
72
+ await sendBatch(toSend);
73
+ }
74
+ catch {
75
+ // Best-effort: never throw from logging.
76
+ }
77
+ };
78
+ const scheduleFlush = async () => {
79
+ if (flushPromise !== undefined)
80
+ return flushPromise;
81
+ const windowMs = Math.max(0, Env.getInt('SLACK_LOG_BATCH_WINDOW_MS', 5000));
82
+ const promise = new Promise((resolve) => {
83
+ const run = async () => {
84
+ try {
85
+ await flushNow();
86
+ }
87
+ finally {
88
+ resolve(undefined);
89
+ }
90
+ };
91
+ if (windowMs === 0 || typeof globalThis.setTimeout !== 'function') {
92
+ void run();
93
+ return;
94
+ }
95
+ globalThis.setTimeout(() => {
96
+ void run();
97
+ }, windowMs);
98
+ });
99
+ flushPromise = promise.finally(() => {
100
+ flushPromise = undefined;
101
+ });
102
+ return flushPromise;
103
+ };
104
+ export const SlackLogger = Object.freeze({
105
+ async enqueue(event) {
106
+ if (!isEnabled())
107
+ return Promise.resolve();
108
+ const levels = getLevels();
109
+ if (!levels.has(event.level))
110
+ return Promise.resolve();
111
+ const key = dedupeKeyFor(event);
112
+ if (dedupeKeys.has(key))
113
+ return scheduleFlush();
114
+ dedupeKeys.add(key);
115
+ buffer.push(event);
116
+ return scheduleFlush();
117
+ },
118
+ });
119
+ export default SlackLogger;
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Mail Configuration
3
+ * Runtime mail drivers and settings
4
+ * Sealed namespace for immutability
5
+ */
6
+ export type MailDriverName = 'disabled' | 'sendgrid' | 'smtp' | 'ses' | 'mailgun';
7
+ export type DisabledMailDriverConfig = {
8
+ driver: 'disabled';
9
+ };
10
+ export type SendGridMailDriverConfig = {
11
+ driver: 'sendgrid';
12
+ apiKey: string;
13
+ };
14
+ export type MailgunMailDriverConfig = {
15
+ driver: 'mailgun';
16
+ apiKey: string;
17
+ domain: string;
18
+ baseUrl: string;
19
+ };
20
+ export type SmtpMailDriverConfig = {
21
+ driver: 'smtp';
22
+ host: string;
23
+ port: number;
24
+ username: string;
25
+ password: string;
26
+ secure: boolean | 'starttls';
27
+ };
28
+ export type SesMailDriverConfig = {
29
+ driver: 'ses';
30
+ region: string;
31
+ };
32
+ export type MailDriverConfig = DisabledMailDriverConfig | SendGridMailDriverConfig | MailgunMailDriverConfig | SmtpMailDriverConfig | SesMailDriverConfig;
33
+ export declare const mailConfig: Readonly<{
34
+ /**
35
+ * Default mail driver
36
+ */
37
+ readonly default: MailDriverName;
38
+ /**
39
+ * Default "From" identity
40
+ */
41
+ readonly from: {
42
+ readonly address: string;
43
+ readonly name: string;
44
+ };
45
+ /**
46
+ * Driver configs
47
+ */
48
+ readonly drivers: {
49
+ readonly disabled: {
50
+ readonly driver: "disabled";
51
+ };
52
+ readonly sendgrid: {
53
+ readonly driver: "sendgrid";
54
+ readonly apiKey: string;
55
+ };
56
+ readonly mailgun: {
57
+ readonly driver: "mailgun";
58
+ readonly apiKey: string;
59
+ readonly domain: string;
60
+ readonly baseUrl: string;
61
+ };
62
+ readonly smtp: {
63
+ readonly driver: "smtp";
64
+ readonly host: string;
65
+ readonly port: number;
66
+ readonly username: string;
67
+ readonly password: string;
68
+ readonly secure: boolean | "starttls";
69
+ };
70
+ readonly ses: {
71
+ readonly driver: "ses";
72
+ readonly region: string;
73
+ };
74
+ };
75
+ /**
76
+ * Get selected driver config
77
+ */
78
+ readonly getDriver: () => MailDriverConfig;
79
+ }>;
80
+ export type MailConfig = typeof mailConfig;
81
+ //# sourceMappingURL=mail.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mail.d.ts","sourceRoot":"","sources":["../../../src/config/mail.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,UAAU,GAAG,MAAM,GAAG,KAAK,GAAG,SAAS,CAAC;AAElF,MAAM,MAAM,wBAAwB,GAAG;IACrC,MAAM,EAAE,UAAU,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,MAAM,EAAE,UAAU,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,MAAM,EAAE,SAAS,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAGF,MAAM,MAAM,oBAAoB,GAAG;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,OAAO,GAAG,UAAU,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EAAE,KAAK,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GACxB,wBAAwB,GACxB,wBAAwB,GACxB,uBAAuB,GACvB,oBAAoB,GACpB,mBAAmB,CAAC;AA6FxB,eAAO,MAAM,UAAU;IA9DrB;;OAEG;;IAGH;;OAEG;;;;;IAMH;;OAEG;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAuCH;;OAEG;8BACU,gBAAgB;EAKuB,CAAC;AACvD,MAAM,MAAM,UAAU,GAAG,OAAO,UAAU,CAAC"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Mail Configuration
3
+ * Runtime mail drivers and settings
4
+ * Sealed namespace for immutability
5
+ */
6
+ import { Env } from './env';
7
+ const getMailDriver = (config) => {
8
+ const defaultDriver = config.default;
9
+ if (Object.hasOwn(config.drivers, defaultDriver)) {
10
+ const driverName = defaultDriver;
11
+ return config.drivers[driverName];
12
+ }
13
+ return config.drivers.disabled;
14
+ };
15
+ const mailConfigObj = {
16
+ /**
17
+ * Default mail driver
18
+ */
19
+ default: Env.get('MAIL_DRIVER', 'disabled') ?? 'disabled',
20
+ /**
21
+ * Default "From" identity
22
+ */
23
+ from: {
24
+ address: Env.get('MAIL_FROM_ADDRESS', ''),
25
+ name: Env.get('MAIL_FROM_NAME', ''),
26
+ },
27
+ /**
28
+ * Driver configs
29
+ */
30
+ drivers: {
31
+ disabled: {
32
+ driver: 'disabled',
33
+ },
34
+ sendgrid: {
35
+ driver: 'sendgrid',
36
+ apiKey: Env.get('SENDGRID_API_KEY', ''),
37
+ },
38
+ mailgun: {
39
+ driver: 'mailgun',
40
+ apiKey: Env.get('MAILGUN_API_KEY', ''),
41
+ domain: Env.get('MAILGUN_DOMAIN', ''),
42
+ baseUrl: Env.get('MAILGUN_BASE_URL', 'https://api.mailgun.net').trim(),
43
+ },
44
+ smtp: {
45
+ driver: 'smtp',
46
+ host: Env.get('MAIL_HOST', ''),
47
+ port: Env.getInt('MAIL_PORT', 587),
48
+ username: Env.get('MAIL_USERNAME', ''),
49
+ password: Env.get('MAIL_PASSWORD', ''),
50
+ secure: (() => {
51
+ const raw = Env.get('MAIL_SECURE', '').trim().toLowerCase();
52
+ if (raw === 'starttls')
53
+ return 'starttls';
54
+ if (raw === 'tls' || raw === 'ssl' || raw === 'smtps' || raw === 'implicit')
55
+ return true;
56
+ if (raw === 'none' || raw === 'off' || raw === 'false' || raw === '0')
57
+ return false;
58
+ return Env.getBool('MAIL_SECURE', false);
59
+ })(),
60
+ },
61
+ ses: {
62
+ driver: 'ses',
63
+ region: Env.get('AWS_REGION', 'us-east-1'),
64
+ },
65
+ },
66
+ /**
67
+ * Get selected driver config
68
+ */
69
+ getDriver() {
70
+ return getMailDriver(this);
71
+ },
72
+ };
73
+ export const mailConfig = Object.freeze(mailConfigObj);
@@ -0,0 +1,8 @@
1
+ import type { Middleware } from '../middleware/MiddlewareStack';
2
+ export type MiddlewareConfig = {
3
+ global: Middleware[];
4
+ route: Record<string, Middleware>;
5
+ };
6
+ export declare const middlewareConfig: Readonly<MiddlewareConfig>;
7
+ export default middlewareConfig;
8
+ //# sourceMappingURL=middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../../src/config/middleware.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAI9D,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;CACnC,CAAC;AAeF,eAAO,MAAM,gBAAgB,4BAAqC,CAAC;AACnE,eAAe,gBAAgB,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { CsrfMiddleware } from '../middleware/CsrfMiddleware';
2
+ import { ErrorHandlerMiddleware } from '../middleware/ErrorHandlerMiddleware';
3
+ import { LoggingMiddleware } from '../middleware/LoggingMiddleware';
4
+ import { RateLimiter } from '../middleware/RateLimiter';
5
+ import { SecurityMiddleware } from '../middleware/SecurityMiddleware';
6
+ const shared = Object.freeze({
7
+ log: LoggingMiddleware.create(),
8
+ error: ErrorHandlerMiddleware.create(),
9
+ security: SecurityMiddleware.create(),
10
+ rateLimit: RateLimiter.create(),
11
+ csrf: CsrfMiddleware.create(),
12
+ });
13
+ const middlewareConfigObj = {
14
+ global: [shared.log, shared.error, shared.security, shared.rateLimit, shared.csrf],
15
+ route: shared,
16
+ };
17
+ export const middlewareConfig = Object.freeze(middlewareConfigObj);
18
+ export default middlewareConfig;
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Notification Configuration
3
+ *
4
+ * Config-first mapping of notification providers.
5
+ * Keeps runtime driver selection in one place and uses Env for safe access.
6
+ */
7
+ export type KnownNotificationDriverName = 'console' | 'termii' | 'twilio' | 'slack';
8
+ export type ConsoleNotificationDriverConfig = {
9
+ driver: 'console';
10
+ };
11
+ export type TermiiNotificationDriverConfig = {
12
+ driver: 'termii';
13
+ apiKey: string;
14
+ sender: string;
15
+ endpoint: string;
16
+ };
17
+ export type TwilioNotificationDriverConfig = {
18
+ driver: 'twilio';
19
+ accountSid: string;
20
+ authToken: string;
21
+ fromNumber: string;
22
+ };
23
+ export type SlackNotificationDriverConfig = {
24
+ driver: 'slack';
25
+ webhookUrl: string;
26
+ };
27
+ export type KnownNotificationDriverConfig = ConsoleNotificationDriverConfig | TermiiNotificationDriverConfig | TwilioNotificationDriverConfig | SlackNotificationDriverConfig;
28
+ declare const _default: Readonly<{
29
+ /**
30
+ * Normalized notification driver name.
31
+ *
32
+ * NOTE: This intentionally supports custom driver names (e.g. project-specific drivers),
33
+ * so it returns a string rather than a strict union.
34
+ */
35
+ readonly getDriverName: () => string;
36
+ /**
37
+ * Provider configs.
38
+ */
39
+ readonly providers: {
40
+ console: {
41
+ driver: "console";
42
+ };
43
+ termii: {
44
+ driver: "termii";
45
+ apiKey: string;
46
+ sender: string;
47
+ endpoint: string;
48
+ };
49
+ twilio: {
50
+ driver: "twilio";
51
+ accountSid: string;
52
+ authToken: string;
53
+ fromNumber: string;
54
+ };
55
+ slack: {
56
+ driver: "slack";
57
+ webhookUrl: string;
58
+ };
59
+ };
60
+ }>;
61
+ export default _default;
62
+ //# sourceMappingURL=notification.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notification.d.ts","sourceRoot":"","sources":["../../../src/config/notification.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,MAAM,2BAA2B,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEpF,MAAM,MAAM,+BAA+B,GAAG;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,CAAC;AAEpE,MAAM,MAAM,8BAA8B,GAAG;IAC3C,MAAM,EAAE,QAAQ,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG;IAC3C,MAAM,EAAE,QAAQ,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,6BAA6B,GAAG;IAC1C,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,6BAA6B,GACrC,+BAA+B,GAC/B,8BAA8B,GAC9B,8BAA8B,GAC9B,6BAA6B,CAAC;;IAUhC;;;;;OAKG;kCACc,MAAM;IAIvB;;OAEG;;;;;;;;;;;;;;;;;;;;;;;AA2BL,wBAAoD"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Notification Configuration
3
+ *
4
+ * Config-first mapping of notification providers.
5
+ * Keeps runtime driver selection in one place and uses Env for safe access.
6
+ */
7
+ import { Env } from './env';
8
+ const notificationConfigObj = {
9
+ /**
10
+ * Normalized notification driver name.
11
+ *
12
+ * NOTE: This intentionally supports custom driver names (e.g. project-specific drivers),
13
+ * so it returns a string rather than a strict union.
14
+ */
15
+ getDriverName() {
16
+ return Env.get('NOTIFICATION_DRIVER', 'console').trim().toLowerCase();
17
+ },
18
+ /**
19
+ * Provider configs.
20
+ */
21
+ providers: {
22
+ console: {
23
+ driver: 'console',
24
+ },
25
+ termii: {
26
+ driver: 'termii',
27
+ apiKey: Env.get('TERMII_API_KEY', ''),
28
+ sender: Env.get('TERMII_SENDER', 'Zintrust'),
29
+ endpoint: Env.get('TERMII_ENDPOINT', 'https://api.termii.com/sms/send'),
30
+ },
31
+ twilio: {
32
+ driver: 'twilio',
33
+ accountSid: Env.get('TWILIO_ACCOUNT_SID', ''),
34
+ authToken: Env.get('TWILIO_AUTH_TOKEN', ''),
35
+ fromNumber: Env.get('TWILIO_FROM_NUMBER', ''),
36
+ },
37
+ slack: {
38
+ driver: 'slack',
39
+ webhookUrl: Env.get('SLACK_WEBHOOK_URL', ''),
40
+ },
41
+ },
42
+ };
43
+ export default Object.freeze(notificationConfigObj);
@@ -1 +1 @@
1
- {"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../../src/config/security.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAgJH,eAAO,MAAM,cAAc;IAtHzB;;OAEG;;;yBAGa,MAAM;4BAQ4B,OAAO,GAAG,OAAO,GAAG,OAAO;;;;;;IAO7E;;OAEG;;;;;;;;iCAQ6D,QAAQ,GAAG,KAAK,GAAG,MAAM;;IAGzF;;OAEG;;;;;IAMH;;OAEG;;;;;;IAOH;;OAEG;;;;;;;;;;IAWH;;OAEG;;;;;;;IAQH;;OAEG;;;;;IAMH;;OAEG;;;;;;;;;;IAWH;;OAEG;;;;;;;2BAOmD,QAAQ,GAAG,KAAK,GAAG,MAAM;;IAG/E;;OAEG;;;;;;;;EAUyD,CAAC"}
1
+ {"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../../src/config/security.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA+IH,eAAO,MAAM,cAAc;IAtHzB;;OAEG;;;yBAGa,MAAM;4BAQ4B,OAAO,GAAG,OAAO,GAAG,OAAO;;;;;;IAO7E;;OAEG;;;;;;;;iCAQ6D,QAAQ,GAAG,KAAK,GAAG,MAAM;;IAGzF;;OAEG;;;;;IAMH;;OAEG;;;;;;IAOH;;OAEG;;;;;;;;;;IAWH;;OAEG;;;;;;;IAQH;;OAEG;;;;;IAMH;;OAEG;;;;;;;;;;IAWH;;OAEG;;;;;;;2BAOmD,QAAQ,GAAG,KAAK,GAAG,MAAM;;IAG/E;;OAEG;;;;;;;;EAUyD,CAAC"}
@@ -3,6 +3,7 @@
3
3
  * JWT, CSRF, encryption and other security settings
4
4
  * Sealed namespace for immutability
5
5
  */
6
+ import { appConfig } from './app';
6
7
  import { Env } from './env';
7
8
  import { Logger } from './logger';
8
9
  import { ErrorFactory } from '../exceptions/ZintrustError';
@@ -12,8 +13,7 @@ import { ErrorFactory } from '../exceptions/ZintrustError';
12
13
  function warnMissingSecret(secretName) {
13
14
  Logger.error(`❌ CRITICAL: ${secretName} environment variable is not set!`);
14
15
  Logger.error('⚠️ Application may not function correctly. Set this in production immediately.');
15
- const nodeEnv = Env.get('NODE_ENV', 'development');
16
- if (nodeEnv === 'production') {
16
+ if (appConfig.isProduction()) {
17
17
  throw ErrorFactory.createConfigError(`Missing required secret: ${secretName}`, { secretName });
18
18
  }
19
19
  // In non-production environments, allow the app/CLI to start while still warning loudly.
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Startup Configuration
3
+ *
4
+ * Startup-only controls (evaluated during Application.boot()).
5
+ */
6
+ export type StartupConfig = {
7
+ healthChecksEnabled: boolean;
8
+ validateSecrets: boolean;
9
+ checkDatabase: boolean;
10
+ checkCache: boolean;
11
+ timeoutMs: number;
12
+ continueOnFailure: boolean;
13
+ };
14
+ export declare const startupConfig: Readonly<{
15
+ healthChecksEnabled: boolean;
16
+ validateSecrets: boolean;
17
+ checkDatabase: boolean;
18
+ checkCache: boolean;
19
+ timeoutMs: number;
20
+ continueOnFailure: boolean;
21
+ }>;
22
+ export default startupConfig;
23
+ //# sourceMappingURL=startup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"startup.d.ts","sourceRoot":"","sources":["../../../src/config/startup.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,MAAM,aAAa,GAAG;IAC1B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,eAAe,EAAE,OAAO,CAAC;IACzB,aAAa,EAAE,OAAO,CAAC;IACvB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,OAAO,CAAC;CAC5B,CAAC;AAEF,eAAO,MAAM,aAAa;;;;;;;EAOA,CAAC;AAE3B,eAAe,aAAa,CAAC"}