@zintrust/core 0.1.1 → 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 (483) hide show
  1. package/README.md +3 -3
  2. package/bin/zintrust.d.ts.map +1 -1
  3. package/bin/zintrust.js +18 -1
  4. package/package.json +1 -1
  5. package/src/boot/Application.d.ts.map +1 -1
  6. package/src/boot/Application.js +46 -3
  7. package/src/boot/Server.d.ts.map +1 -1
  8. package/src/boot/Server.js +3 -4
  9. package/src/boot/bootstrap.js +77 -6
  10. package/src/builder/BundleOptimizer.d.ts.map +1 -1
  11. package/src/builder/BundleOptimizer.js +6 -4
  12. package/src/cache/drivers/KVDriver.d.ts.map +1 -1
  13. package/src/cache/drivers/KVDriver.js +6 -6
  14. package/src/cache/drivers/RedisDriver.js +1 -1
  15. package/src/cli/BaseCommand.d.ts +2 -2
  16. package/src/cli/BaseCommand.d.ts.map +1 -1
  17. package/src/cli/BaseCommand.js +2 -1
  18. package/src/cli/CLI.d.ts.map +1 -1
  19. package/src/cli/CLI.js +11 -4
  20. package/src/cli/commands/AddCommand.js +1 -1
  21. package/src/cli/commands/ConfigCommand.d.ts.map +1 -1
  22. package/src/cli/commands/ConfigCommand.js +34 -4
  23. package/src/cli/commands/D1MigrateCommand.d.ts +4 -0
  24. package/src/cli/commands/D1MigrateCommand.d.ts.map +1 -1
  25. package/src/cli/commands/D1MigrateCommand.js +4 -3
  26. package/src/cli/commands/FixCommand.d.ts.map +1 -1
  27. package/src/cli/commands/FixCommand.js +3 -16
  28. package/src/cli/commands/LogsCleanupCommand.d.ts +6 -0
  29. package/src/cli/commands/LogsCleanupCommand.d.ts.map +1 -0
  30. package/src/cli/commands/LogsCleanupCommand.js +20 -0
  31. package/src/cli/commands/LogsCommand.d.ts.map +1 -1
  32. package/src/cli/commands/LogsCommand.js +1 -1
  33. package/src/cli/commands/MakeMailTemplateCommand.d.ts +10 -0
  34. package/src/cli/commands/MakeMailTemplateCommand.d.ts.map +1 -0
  35. package/src/cli/commands/MakeMailTemplateCommand.js +74 -0
  36. package/src/cli/commands/MakeNotificationTemplateCommand.d.ts +10 -0
  37. package/src/cli/commands/MakeNotificationTemplateCommand.d.ts.map +1 -0
  38. package/src/cli/commands/MakeNotificationTemplateCommand.js +113 -0
  39. package/src/cli/commands/NewCommand.d.ts +4 -0
  40. package/src/cli/commands/NewCommand.d.ts.map +1 -1
  41. package/src/cli/commands/NewCommand.js +33 -20
  42. package/src/cli/commands/PluginCommand.d.ts.map +1 -1
  43. package/src/cli/commands/PluginCommand.js +8 -4
  44. package/src/cli/commands/PrepareCommand.d.ts.map +1 -1
  45. package/src/cli/commands/PrepareCommand.js +1 -1
  46. package/src/cli/commands/QACommand.d.ts.map +1 -1
  47. package/src/cli/commands/QACommand.js +11 -20
  48. package/src/cli/commands/SecretsCommand.d.ts +16 -0
  49. package/src/cli/commands/SecretsCommand.d.ts.map +1 -0
  50. package/src/cli/commands/SecretsCommand.js +91 -0
  51. package/src/cli/commands/StartCommand.d.ts.map +1 -1
  52. package/src/cli/commands/StartCommand.js +2 -2
  53. package/src/cli/commands/TemplatesCommand.d.ts +3 -0
  54. package/src/cli/commands/TemplatesCommand.d.ts.map +1 -0
  55. package/src/cli/commands/TemplatesCommand.js +65 -0
  56. package/src/cli/commands/index.d.ts +5 -0
  57. package/src/cli/commands/index.d.ts.map +1 -1
  58. package/src/cli/commands/index.js +5 -0
  59. package/src/cli/config/ConfigManager.js +1 -1
  60. package/src/cli/index.d.ts +2 -1
  61. package/src/cli/index.d.ts.map +1 -1
  62. package/src/cli/index.js +2 -1
  63. package/src/cli/scaffolding/ControllerGenerator.js +1 -1
  64. package/src/cli/scaffolding/FeatureScaffolder.js +4 -4
  65. package/src/cli/scaffolding/FileGenerator.js +1 -1
  66. package/src/cli/scaffolding/ModelGenerator.js +1 -1
  67. package/src/cli/scaffolding/ProjectScaffolder.d.ts.map +1 -1
  68. package/src/cli/scaffolding/ProjectScaffolder.js +61 -11
  69. package/src/cli/scaffolding/ResponseFactoryGenerator.d.ts.map +1 -1
  70. package/src/cli/scaffolding/ResponseFactoryGenerator.js +3 -2
  71. package/src/cli/scaffolding/RouteGenerator.js +1 -1
  72. package/src/cli/scaffolding/ServiceIntegrationTestGenerator.js +1 -1
  73. package/src/cli/scaffolding/ServiceScaffolder.js +2 -2
  74. package/src/cli/scaffolding/TemplateGenerator.d.ts +40 -0
  75. package/src/cli/scaffolding/TemplateGenerator.d.ts.map +1 -0
  76. package/src/cli/scaffolding/TemplateGenerator.js +172 -0
  77. package/src/cli/scaffolding/index.d.ts +1 -0
  78. package/src/cli/scaffolding/index.d.ts.map +1 -1
  79. package/src/cli/scaffolding/index.js +1 -0
  80. package/src/cli/utils/spawn.js +1 -1
  81. package/src/common/AwsSigV4.d.ts +41 -0
  82. package/src/common/AwsSigV4.d.ts.map +1 -0
  83. package/src/common/AwsSigV4.js +69 -0
  84. package/src/common/index.d.ts +39 -0
  85. package/src/common/index.d.ts.map +1 -1
  86. package/src/common/index.js +101 -8
  87. package/src/common/uuid.d.ts +3 -0
  88. package/src/common/uuid.d.ts.map +1 -0
  89. package/src/common/uuid.js +30 -0
  90. package/src/config/FileLogWriter.d.ts +22 -0
  91. package/src/config/FileLogWriter.d.ts.map +1 -0
  92. package/src/config/FileLogWriter.js +192 -0
  93. package/src/config/SecretsManager.d.ts.map +1 -1
  94. package/src/config/SecretsManager.js +37 -11
  95. package/src/config/StartupConfigValidator.d.ts +15 -0
  96. package/src/config/StartupConfigValidator.d.ts.map +1 -0
  97. package/src/config/StartupConfigValidator.js +86 -0
  98. package/src/config/app.d.ts +2 -1
  99. package/src/config/app.d.ts.map +1 -1
  100. package/src/config/app.js +65 -15
  101. package/src/config/broadcast.d.ts +47 -0
  102. package/src/config/broadcast.d.ts.map +1 -0
  103. package/src/config/broadcast.js +54 -0
  104. package/src/config/cache.d.ts +13 -17
  105. package/src/config/cache.d.ts.map +1 -1
  106. package/src/config/cache.js +9 -11
  107. package/src/config/cloudflare.d.ts +26 -0
  108. package/src/config/cloudflare.d.ts.map +1 -0
  109. package/src/config/cloudflare.js +38 -0
  110. package/src/config/env.d.ts +6 -0
  111. package/src/config/env.d.ts.map +1 -1
  112. package/src/config/env.js +6 -0
  113. package/src/config/index.d.ts +52 -28
  114. package/src/config/index.d.ts.map +1 -1
  115. package/src/config/index.js +3 -0
  116. package/src/config/logger.d.ts +2 -0
  117. package/src/config/logger.d.ts.map +1 -1
  118. package/src/config/logger.js +270 -11
  119. package/src/config/logging/HttpLogger.d.ts +23 -0
  120. package/src/config/logging/HttpLogger.d.ts.map +1 -0
  121. package/src/config/logging/HttpLogger.js +93 -0
  122. package/src/config/logging/KvLogger.d.ts +22 -0
  123. package/src/config/logging/KvLogger.d.ts.map +1 -0
  124. package/src/config/logging/KvLogger.js +143 -0
  125. package/src/config/logging/SlackLogger.d.ts +23 -0
  126. package/src/config/logging/SlackLogger.d.ts.map +1 -0
  127. package/src/config/logging/SlackLogger.js +119 -0
  128. package/src/config/mail.d.ts +81 -0
  129. package/src/config/mail.d.ts.map +1 -0
  130. package/src/config/mail.js +73 -0
  131. package/src/config/middleware.d.ts +8 -0
  132. package/src/config/middleware.d.ts.map +1 -0
  133. package/src/config/middleware.js +18 -0
  134. package/src/config/notification.d.ts +62 -0
  135. package/src/config/notification.d.ts.map +1 -0
  136. package/src/config/notification.js +43 -0
  137. package/src/config/security.d.ts.map +1 -1
  138. package/src/config/security.js +2 -2
  139. package/src/config/startup.d.ts +23 -0
  140. package/src/config/startup.d.ts.map +1 -0
  141. package/src/config/startup.js +15 -0
  142. package/src/config/storage.d.ts +21 -35
  143. package/src/config/storage.d.ts.map +1 -1
  144. package/src/config/storage.js +57 -37
  145. package/src/database/migrations/index.d.ts +1 -1
  146. package/src/database/migrations/index.d.ts.map +1 -1
  147. package/src/database/migrations/index.js +2 -1
  148. package/src/features/Queue.js +1 -25
  149. package/src/health/RuntimeHealthProbes.d.ts +13 -0
  150. package/src/health/RuntimeHealthProbes.d.ts.map +1 -0
  151. package/src/health/RuntimeHealthProbes.js +62 -0
  152. package/src/health/StartupHealthChecks.d.ts +26 -0
  153. package/src/health/StartupHealthChecks.d.ts.map +1 -0
  154. package/src/health/StartupHealthChecks.js +124 -0
  155. package/src/http/ErrorResponse.d.ts +28 -0
  156. package/src/http/ErrorResponse.d.ts.map +1 -0
  157. package/src/http/ErrorResponse.js +42 -0
  158. package/src/http/Kernel.d.ts +5 -0
  159. package/src/http/Kernel.d.ts.map +1 -1
  160. package/src/http/Kernel.js +96 -30
  161. package/src/http/RequestContext.d.ts +20 -0
  162. package/src/http/RequestContext.d.ts.map +1 -0
  163. package/src/http/RequestContext.js +77 -0
  164. package/src/index.d.ts +9 -1
  165. package/src/index.d.ts.map +1 -1
  166. package/src/index.js +8 -2
  167. package/src/microservices/MicroserviceManager.d.ts.map +1 -1
  168. package/src/microservices/MicroserviceManager.js +9 -6
  169. package/src/microservices/PostgresAdapter.d.ts.map +1 -1
  170. package/src/microservices/PostgresAdapter.js +3 -1
  171. package/src/microservices/ServiceBundler.d.ts.map +1 -1
  172. package/src/microservices/ServiceBundler.js +6 -4
  173. package/src/microservices/ServiceHealthMonitor.js +2 -2
  174. package/src/middleware/CsrfMiddleware.d.ts.map +1 -1
  175. package/src/middleware/CsrfMiddleware.js +2 -19
  176. package/src/middleware/ErrorHandlerMiddleware.d.ts +6 -0
  177. package/src/middleware/ErrorHandlerMiddleware.d.ts.map +1 -0
  178. package/src/middleware/ErrorHandlerMiddleware.js +33 -0
  179. package/src/middleware/LoggingMiddleware.d.ts +9 -0
  180. package/src/middleware/LoggingMiddleware.d.ts.map +1 -0
  181. package/src/middleware/LoggingMiddleware.js +36 -0
  182. package/src/middleware/index.d.ts +2 -0
  183. package/src/middleware/index.d.ts.map +1 -1
  184. package/src/middleware/index.js +2 -0
  185. package/src/node-singletons/async_hooks.d.ts +9 -0
  186. package/src/node-singletons/async_hooks.d.ts.map +1 -0
  187. package/src/node-singletons/async_hooks.js +8 -0
  188. package/src/node-singletons/fs.d.ts +2 -2
  189. package/src/node-singletons/fs.d.ts.map +1 -1
  190. package/src/node-singletons/fs.js +2 -2
  191. package/src/node-singletons/http.d.ts +1 -1
  192. package/src/node-singletons/http.d.ts.map +1 -1
  193. package/src/node-singletons/http.js +1 -1
  194. package/src/node-singletons/index.d.ts +4 -0
  195. package/src/node-singletons/index.d.ts.map +1 -1
  196. package/src/node-singletons/index.js +4 -0
  197. package/src/node-singletons/net.d.ts +9 -0
  198. package/src/node-singletons/net.d.ts.map +1 -0
  199. package/src/node-singletons/net.js +8 -0
  200. package/src/node-singletons/os.d.ts +3 -3
  201. package/src/node-singletons/os.d.ts.map +1 -1
  202. package/src/node-singletons/os.js +3 -4
  203. package/src/node-singletons/path.d.ts +3 -1
  204. package/src/node-singletons/path.d.ts.map +1 -1
  205. package/src/node-singletons/path.js +3 -1
  206. package/src/node-singletons/perf-hooks.d.ts +3 -1
  207. package/src/node-singletons/perf-hooks.d.ts.map +1 -1
  208. package/src/node-singletons/perf-hooks.js +3 -1
  209. package/src/node-singletons/process.d.ts +23 -0
  210. package/src/node-singletons/process.d.ts.map +1 -0
  211. package/src/node-singletons/process.js +8 -0
  212. package/src/node-singletons/readline.d.ts +3 -3
  213. package/src/node-singletons/readline.d.ts.map +1 -1
  214. package/src/node-singletons/readline.js +3 -4
  215. package/src/node-singletons/tls.d.ts +9 -0
  216. package/src/node-singletons/tls.d.ts.map +1 -0
  217. package/src/node-singletons/tls.js +8 -0
  218. package/src/node-singletons/url.d.ts +3 -1
  219. package/src/node-singletons/url.d.ts.map +1 -1
  220. package/src/node-singletons/url.js +3 -1
  221. package/src/orm/ConnectionManager.d.ts +6 -1
  222. package/src/orm/ConnectionManager.d.ts.map +1 -1
  223. package/src/orm/ConnectionManager.js +14 -0
  224. package/src/orm/DatabaseAdapter.d.ts +6 -0
  225. package/src/orm/DatabaseAdapter.d.ts.map +1 -1
  226. package/src/orm/QueryBuilder.d.ts +8 -1
  227. package/src/orm/QueryBuilder.d.ts.map +1 -1
  228. package/src/orm/QueryBuilder.js +188 -28
  229. package/src/orm/adapters/D1Adapter.d.ts.map +1 -1
  230. package/src/orm/adapters/D1Adapter.js +18 -12
  231. package/src/orm/adapters/MySQLAdapter.d.ts.map +1 -1
  232. package/src/orm/adapters/MySQLAdapter.js +4 -0
  233. package/src/orm/adapters/PostgreSQLAdapter.d.ts.map +1 -1
  234. package/src/orm/adapters/PostgreSQLAdapter.js +4 -0
  235. package/src/orm/adapters/SQLServerAdapter.d.ts.map +1 -1
  236. package/src/orm/adapters/SQLServerAdapter.js +4 -0
  237. package/src/orm/adapters/SQLiteAdapter.d.ts.map +1 -1
  238. package/src/orm/adapters/SQLiteAdapter.js +4 -0
  239. package/src/performance/CodeGenerationBenchmark.js +3 -3
  240. package/src/performance/Optimizer.d.ts +1 -1
  241. package/src/performance/Optimizer.d.ts.map +1 -1
  242. package/src/performance/Optimizer.js +150 -75
  243. package/src/performance/establish-baseline.js +3 -3
  244. package/src/runtime/PluginManager.d.ts +3 -1
  245. package/src/runtime/PluginManager.d.ts.map +1 -1
  246. package/src/runtime/PluginManager.js +124 -28
  247. package/src/runtime/RuntimeDetector.d.ts.map +1 -1
  248. package/src/runtime/RuntimeDetector.js +47 -6
  249. package/src/runtime/adapters/CloudflareAdapter.js +2 -2
  250. package/src/runtime/adapters/FargateAdapter.d.ts.map +1 -1
  251. package/src/runtime/adapters/FargateAdapter.js +2 -1
  252. package/src/runtime/adapters/LambdaAdapter.d.ts.map +1 -1
  253. package/src/runtime/adapters/LambdaAdapter.js +4 -2
  254. package/src/runtime/adapters/NodeServerAdapter.d.ts.map +1 -1
  255. package/src/runtime/adapters/NodeServerAdapter.js +2 -1
  256. package/src/scheduler/ScheduleRunner.d.ts +18 -0
  257. package/src/scheduler/ScheduleRunner.d.ts.map +1 -0
  258. package/src/scheduler/ScheduleRunner.js +155 -0
  259. package/src/scheduler/index.d.ts +3 -0
  260. package/src/scheduler/index.d.ts.map +1 -0
  261. package/src/scheduler/index.js +1 -0
  262. package/src/scheduler/types.d.ts +16 -0
  263. package/src/scheduler/types.d.ts.map +1 -0
  264. package/src/scheduler/types.js +4 -0
  265. package/src/schedules/index.d.ts +2 -0
  266. package/src/schedules/index.d.ts.map +1 -0
  267. package/src/schedules/index.js +1 -0
  268. package/src/schedules/log-cleanup.d.ts +4 -0
  269. package/src/schedules/log-cleanup.d.ts.map +1 -0
  270. package/src/schedules/log-cleanup.js +18 -0
  271. package/src/scripts/GenerateEnvArtifacts.d.ts +13 -0
  272. package/src/scripts/GenerateEnvArtifacts.d.ts.map +1 -0
  273. package/src/scripts/GenerateEnvArtifacts.js +171 -0
  274. package/src/scripts/TemplateSync.js +109 -70
  275. package/src/security/CsrfTokenManager.js +1 -1
  276. package/src/security/Encryptor.js +1 -1
  277. package/src/security/Hash.d.ts +14 -0
  278. package/src/security/Hash.d.ts.map +1 -0
  279. package/src/security/Hash.js +81 -0
  280. package/src/security/StartupSecretValidation.d.ts +20 -0
  281. package/src/security/StartupSecretValidation.d.ts.map +1 -0
  282. package/src/security/StartupSecretValidation.js +61 -0
  283. package/src/security/UrlValidator.d.ts +0 -1
  284. package/src/security/UrlValidator.d.ts.map +1 -1
  285. package/src/security/UrlValidator.js +1 -2
  286. package/src/security/Xss.d.ts +14 -0
  287. package/src/security/Xss.d.ts.map +1 -0
  288. package/src/security/Xss.js +57 -0
  289. package/src/security/XssProtection.d.ts.map +1 -1
  290. package/src/security/XssProtection.js +150 -16
  291. package/src/templates/adapters/MySQLAdapter.ts.tpl +5 -0
  292. package/src/templates/adapters/PostgreSQLAdapter.ts.tpl +5 -0
  293. package/src/templates/adapters/SQLServerAdapter.ts.tpl +5 -0
  294. package/src/templates/adapters/SQLiteAdapter.ts.tpl +5 -0
  295. package/src/templates/features/Queue.ts.tpl +1 -29
  296. package/src/templates/project/basic/.env.example.tpl +48 -0
  297. package/src/templates/project/basic/.env.tpl +89 -94
  298. package/src/templates/project/basic/app/Toolkit/Broadcast/sendBroadcast.ts.tpl +7 -0
  299. package/src/templates/project/basic/app/Toolkit/Mail/sendWelcomeEmail.ts.tpl +30 -0
  300. package/src/templates/project/basic/app/Toolkit/Notification/sendSlackNotification.ts.tpl +10 -0
  301. package/src/templates/project/basic/app/Toolkit/Notification/sendSms.ts.tpl +13 -0
  302. package/src/templates/project/basic/config/FileLogWriter.ts.tpl +240 -0
  303. package/src/templates/project/basic/config/SecretsManager.ts.tpl +44 -21
  304. package/src/templates/project/basic/config/StartupConfigValidator.ts.tpl +151 -0
  305. package/src/templates/project/basic/config/app.ts.tpl +84 -15
  306. package/src/templates/project/basic/config/broadcast.ts.tpl +97 -0
  307. package/src/templates/project/basic/config/cache.ts.tpl +19 -23
  308. package/src/templates/project/basic/config/cloudflare.ts.tpl +57 -0
  309. package/src/templates/project/basic/config/env.ts.tpl +7 -1
  310. package/src/templates/project/basic/config/index.ts.tpl +3 -0
  311. package/src/templates/project/basic/config/logger.ts.tpl +301 -11
  312. package/src/templates/project/basic/config/logging/HttpLogger.ts.tpl +121 -0
  313. package/src/templates/project/basic/config/logging/KvLogger.ts.tpl +181 -0
  314. package/src/templates/project/basic/config/logging/SlackLogger.ts.tpl +156 -0
  315. package/src/templates/project/basic/config/mail.ts.tpl +141 -0
  316. package/src/templates/project/basic/config/middleware.ts.tpl +27 -0
  317. package/src/templates/project/basic/config/notification.ts.tpl +86 -0
  318. package/src/templates/project/basic/config/security.ts.tpl +4 -5
  319. package/src/templates/project/basic/config/startup.ts.tpl +27 -0
  320. package/src/templates/project/basic/config/storage.ts.tpl +77 -42
  321. package/src/templates/project/basic/database/migrations/index.ts.tpl +1 -1
  322. package/src/templates/project/basic/package.json.tpl +1 -1
  323. package/src/templates/project/basic/routes/api.ts.tpl +9 -37
  324. package/src/templates/project/basic/routes/broadcast.ts.tpl +32 -0
  325. package/src/templates/project/basic/routes/health.ts.tpl +134 -0
  326. package/src/templates/project/basic/src/index.ts.tpl +38 -11
  327. package/src/templates/project/basic/template.json +3 -0
  328. package/src/toolkit/Secrets/EnvFile.d.ts +15 -0
  329. package/src/toolkit/Secrets/EnvFile.d.ts.map +1 -0
  330. package/src/toolkit/Secrets/EnvFile.js +63 -0
  331. package/src/toolkit/Secrets/Manifest.d.ts +24 -0
  332. package/src/toolkit/Secrets/Manifest.d.ts.map +1 -0
  333. package/src/toolkit/Secrets/Manifest.js +71 -0
  334. package/src/toolkit/Secrets/index.d.ts +42 -0
  335. package/src/toolkit/Secrets/index.d.ts.map +1 -0
  336. package/src/toolkit/Secrets/index.js +119 -0
  337. package/src/toolkit/Secrets/providers/AwsSecretsManager.d.ts +14 -0
  338. package/src/toolkit/Secrets/providers/AwsSecretsManager.d.ts.map +1 -0
  339. package/src/toolkit/Secrets/providers/AwsSecretsManager.js +131 -0
  340. package/src/toolkit/Secrets/providers/CloudflareKv.d.ts +9 -0
  341. package/src/toolkit/Secrets/providers/CloudflareKv.d.ts.map +1 -0
  342. package/src/toolkit/Secrets/providers/CloudflareKv.js +73 -0
  343. package/src/tools/broadcast/Broadcast.d.ts +7 -0
  344. package/src/tools/broadcast/Broadcast.d.ts.map +1 -0
  345. package/src/tools/broadcast/Broadcast.js +37 -0
  346. package/src/tools/broadcast/drivers/BaseDriver.d.ts +5 -0
  347. package/src/tools/broadcast/drivers/BaseDriver.d.ts.map +1 -0
  348. package/src/tools/broadcast/drivers/BaseDriver.js +8 -0
  349. package/src/tools/broadcast/drivers/InMemory.d.ts +18 -0
  350. package/src/tools/broadcast/drivers/InMemory.d.ts.map +1 -0
  351. package/src/tools/broadcast/drivers/InMemory.js +16 -0
  352. package/src/tools/broadcast/drivers/Pusher.d.ts +8 -0
  353. package/src/tools/broadcast/drivers/Pusher.d.ts.map +1 -0
  354. package/src/tools/broadcast/drivers/Pusher.js +75 -0
  355. package/src/tools/broadcast/drivers/Redis.d.ts +19 -0
  356. package/src/tools/broadcast/drivers/Redis.d.ts.map +1 -0
  357. package/src/tools/broadcast/drivers/Redis.js +73 -0
  358. package/src/tools/broadcast/drivers/RedisHttps.d.ts +14 -0
  359. package/src/tools/broadcast/drivers/RedisHttps.d.ts.map +1 -0
  360. package/src/tools/broadcast/drivers/RedisHttps.js +50 -0
  361. package/src/tools/broadcast/index.d.ts +7 -0
  362. package/src/tools/broadcast/index.d.ts.map +1 -0
  363. package/src/tools/broadcast/index.js +6 -0
  364. package/src/tools/http/Http.d.ts +51 -0
  365. package/src/tools/http/Http.d.ts.map +1 -0
  366. package/src/tools/http/Http.js +171 -0
  367. package/src/tools/http/HttpResponse.d.ts +32 -0
  368. package/src/tools/http/HttpResponse.d.ts.map +1 -0
  369. package/src/tools/http/HttpResponse.js +80 -0
  370. package/src/tools/http/index.d.ts +15 -0
  371. package/src/tools/http/index.d.ts.map +1 -0
  372. package/src/tools/http/index.js +9 -0
  373. package/src/tools/mail/Mail.d.ts +22 -0
  374. package/src/tools/mail/Mail.d.ts.map +1 -0
  375. package/src/tools/mail/Mail.js +105 -0
  376. package/src/tools/mail/attachments.d.ts +23 -0
  377. package/src/tools/mail/attachments.d.ts.map +1 -0
  378. package/src/tools/mail/attachments.js +26 -0
  379. package/src/tools/mail/drivers/BaseDriver.d.ts +5 -0
  380. package/src/tools/mail/drivers/BaseDriver.d.ts.map +1 -0
  381. package/src/tools/mail/drivers/BaseDriver.js +8 -0
  382. package/src/tools/mail/drivers/Mailgun.d.ts +31 -0
  383. package/src/tools/mail/drivers/Mailgun.d.ts.map +1 -0
  384. package/src/tools/mail/drivers/Mailgun.js +81 -0
  385. package/src/tools/mail/drivers/SendGrid.d.ts +29 -0
  386. package/src/tools/mail/drivers/SendGrid.d.ts.map +1 -0
  387. package/src/tools/mail/drivers/SendGrid.js +57 -0
  388. package/src/tools/mail/drivers/Ses.d.ts +24 -0
  389. package/src/tools/mail/drivers/Ses.d.ts.map +1 -0
  390. package/src/tools/mail/drivers/Ses.js +116 -0
  391. package/src/tools/mail/drivers/Smtp.d.ts +38 -0
  392. package/src/tools/mail/drivers/Smtp.d.ts.map +1 -0
  393. package/src/tools/mail/drivers/Smtp.js +327 -0
  394. package/src/tools/mail/templates/index.d.ts +27 -0
  395. package/src/tools/mail/templates/index.d.ts.map +1 -0
  396. package/src/tools/mail/templates/index.js +35 -0
  397. package/src/tools/mail/templates/markdown/index.d.ts +17 -0
  398. package/src/tools/mail/templates/markdown/index.d.ts.map +1 -0
  399. package/src/tools/mail/templates/markdown/index.js +49 -0
  400. package/src/tools/mail/templates/markdown/registry.d.ts +15 -0
  401. package/src/tools/mail/templates/markdown/registry.d.ts.map +1 -0
  402. package/src/tools/mail/templates/markdown/registry.js +34 -0
  403. package/src/tools/mail/templates/markdown/validator.d.ts +16 -0
  404. package/src/tools/mail/templates/markdown/validator.d.ts.map +1 -0
  405. package/src/tools/mail/templates/markdown/validator.js +24 -0
  406. package/src/tools/mail/testing.d.ts +41 -0
  407. package/src/tools/mail/testing.d.ts.map +1 -0
  408. package/src/tools/mail/testing.js +34 -0
  409. package/src/tools/notification/Driver.d.ts +11 -0
  410. package/src/tools/notification/Driver.d.ts.map +1 -0
  411. package/src/tools/notification/Driver.js +1 -0
  412. package/src/tools/notification/Notification.d.ts +11 -0
  413. package/src/tools/notification/Notification.d.ts.map +1 -0
  414. package/src/tools/notification/Notification.js +11 -0
  415. package/src/tools/notification/Registry.d.ts +10 -0
  416. package/src/tools/notification/Registry.d.ts.map +1 -0
  417. package/src/tools/notification/Registry.js +22 -0
  418. package/src/tools/notification/Service.d.ts +6 -0
  419. package/src/tools/notification/Service.d.ts.map +1 -0
  420. package/src/tools/notification/Service.js +18 -0
  421. package/src/tools/notification/config.d.ts +5 -0
  422. package/src/tools/notification/config.d.ts.map +1 -0
  423. package/src/tools/notification/config.js +5 -0
  424. package/src/tools/notification/drivers/BaseDriver.d.ts +5 -0
  425. package/src/tools/notification/drivers/BaseDriver.d.ts.map +1 -0
  426. package/src/tools/notification/drivers/BaseDriver.js +8 -0
  427. package/src/tools/notification/drivers/Console.d.ts +7 -0
  428. package/src/tools/notification/drivers/Console.d.ts.map +1 -0
  429. package/src/tools/notification/drivers/Console.js +13 -0
  430. package/src/tools/notification/drivers/Slack.d.ts +16 -0
  431. package/src/tools/notification/drivers/Slack.d.ts.map +1 -0
  432. package/src/tools/notification/drivers/Slack.js +24 -0
  433. package/src/tools/notification/drivers/Termii.d.ts +10 -0
  434. package/src/tools/notification/drivers/Termii.d.ts.map +1 -0
  435. package/src/tools/notification/drivers/Termii.js +47 -0
  436. package/src/tools/notification/drivers/Twilio.d.ts +21 -0
  437. package/src/tools/notification/drivers/Twilio.d.ts.map +1 -0
  438. package/src/tools/notification/drivers/Twilio.js +48 -0
  439. package/src/tools/notification/templates/markdown/index.d.ts +15 -0
  440. package/src/tools/notification/templates/markdown/index.d.ts.map +1 -0
  441. package/src/tools/notification/templates/markdown/index.js +38 -0
  442. package/src/tools/notification/templates/markdown/registry.d.ts +15 -0
  443. package/src/tools/notification/templates/markdown/registry.d.ts.map +1 -0
  444. package/src/tools/notification/templates/markdown/registry.js +36 -0
  445. package/src/tools/notification/testing.d.ts +19 -0
  446. package/src/tools/notification/testing.d.ts.map +1 -0
  447. package/src/tools/notification/testing.js +35 -0
  448. package/src/tools/notification/testingHelpers.d.ts +12 -0
  449. package/src/tools/notification/testingHelpers.d.ts.map +1 -0
  450. package/src/tools/notification/testingHelpers.js +32 -0
  451. package/src/tools/queue/Queue.d.ts +23 -0
  452. package/src/tools/queue/Queue.d.ts.map +1 -0
  453. package/src/tools/queue/Queue.js +38 -0
  454. package/src/tools/queue/drivers/InMemory.d.ts +10 -0
  455. package/src/tools/queue/drivers/InMemory.d.ts.map +1 -0
  456. package/src/tools/queue/drivers/InMemory.js +55 -0
  457. package/src/tools/queue/drivers/Redis.d.ts +10 -0
  458. package/src/tools/queue/drivers/Redis.d.ts.map +1 -0
  459. package/src/tools/queue/drivers/Redis.js +91 -0
  460. package/src/tools/storage/drivers/Gcs.d.ts +20 -0
  461. package/src/tools/storage/drivers/Gcs.d.ts.map +1 -0
  462. package/src/tools/storage/drivers/Gcs.js +152 -0
  463. package/src/tools/storage/drivers/Local.d.ts +17 -0
  464. package/src/tools/storage/drivers/Local.d.ts.map +1 -0
  465. package/src/tools/storage/drivers/Local.js +63 -0
  466. package/src/tools/storage/drivers/R2.d.ts +20 -0
  467. package/src/tools/storage/drivers/R2.d.ts.map +1 -0
  468. package/src/tools/storage/drivers/R2.js +73 -0
  469. package/src/tools/storage/drivers/S3.d.ts +26 -0
  470. package/src/tools/storage/drivers/S3.d.ts.map +1 -0
  471. package/src/tools/storage/drivers/S3.js +258 -0
  472. package/src/tools/storage/index.d.ts +24 -0
  473. package/src/tools/storage/index.d.ts.map +1 -0
  474. package/src/tools/storage/index.js +112 -0
  475. package/src/tools/storage/testing.d.ts +23 -0
  476. package/src/tools/storage/testing.d.ts.map +1 -0
  477. package/src/tools/storage/testing.js +52 -0
  478. package/src/tools/templates/MarkdownRenderer.d.ts +14 -0
  479. package/src/tools/templates/MarkdownRenderer.d.ts.map +1 -0
  480. package/src/tools/templates/MarkdownRenderer.js +300 -0
  481. package/src/tools/templates/index.d.ts +5 -0
  482. package/src/tools/templates/index.d.ts.map +1 -0
  483. package/src/tools/templates/index.js +4 -0
@@ -37,14 +37,58 @@ const sanitizeHtml = (html) => {
37
37
  sanitized = sanitized.replaceAll(/<(?:iframe|object|embed|base)\b[\s\S]*?>/gi, '');
38
38
  sanitized = sanitized.replaceAll(/<\/(?:iframe|object|embed|base)>/gi, '');
39
39
  // Remove event handlers (on*)
40
- sanitized = sanitized.replaceAll(/\bon\w+\s*=\s*(?:'[^']*'|"[^"]*"|[^\s>]*)/gi, '');
41
- // Remove javascript: and data: URIs in attributes
42
- sanitized = sanitized.replaceAll(/\b(?:href|src|action|formaction|xlink:href)\s*=\s*['"]\s*(?:javascript|data):[\s\S]*?['"]/gi, // NOSONAR: S1523 - We are removing javascript: and data: protocols to prevent XSS
43
- '');
44
- sanitized = sanitized.replaceAll(/\b(?:href|src|action|formaction|xlink:href)\s*=\s*(?:javascript|data):[^\s>]*?(\s|>|$)/gi, // NOSONAR: S1523 - We are removing javascript: and data: protocols to prevent XSS
45
- '');
40
+ sanitized = sanitized.replaceAll(/\bon\w+\s*=\s*(?:'[^']*'|"[^"]*"|`[^`]*`|[^\s>]*)/gi, '');
41
+ // Remove dangerous protocols in URL-bearing attributes.
42
+ // This uses the same protocol normalization logic as encodeHref to prevent obfuscations like:
43
+ // href="jav&#x61;script:..." or href="java\nscript:..." or href="%6a%61..."
44
+ sanitized = sanitized.replaceAll(/(\s)(href|src|action|formaction|xlink:href)\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s>]+))/gi, (match, _leadingWhitespace, _attributeName, doubleQuotedValue, singleQuotedValue, unquotedValue) => {
45
+ const rawValue = doubleQuotedValue ?? singleQuotedValue ?? unquotedValue ?? '';
46
+ const protocolCheck = normalizeHrefForProtocolCheck(rawValue);
47
+ // Allow relative URLs and fragments.
48
+ if (protocolCheck.startsWith('/') ||
49
+ protocolCheck.startsWith('#') ||
50
+ protocolCheck.startsWith('./') ||
51
+ protocolCheck.startsWith('../') ||
52
+ protocolCheck.startsWith('//')) {
53
+ return match;
54
+ }
55
+ // Allow-list a narrow set of data:image/* URLs for common raster formats.
56
+ if (protocolCheck.startsWith('data:')) {
57
+ const allowedDataImagePrefixes = [
58
+ 'data:image/png',
59
+ 'data:image/jpeg',
60
+ 'data:image/jpg',
61
+ 'data:image/gif',
62
+ 'data:image/webp',
63
+ 'data:image/avif',
64
+ ];
65
+ if (allowedDataImagePrefixes.some((p) => protocolCheck.startsWith(p))) {
66
+ return match;
67
+ }
68
+ return '';
69
+ }
70
+ const blockedProtocols = ['javascript:', 'vbscript:']; // NOSONAR: S1523 - Explicit protocol blocking to prevent XSS
71
+ if (blockedProtocols.some((p) => protocolCheck.startsWith(p))) {
72
+ return '';
73
+ }
74
+ // If a scheme is present, allowlist it.
75
+ const schemeMatch = new RegExp(/^([a-z][a-z0-9+.-]*):/i).exec(protocolCheck);
76
+ if (schemeMatch) {
77
+ const scheme = schemeMatch[1].toLowerCase();
78
+ const allowedSchemes = new Set(['http', 'https', 'mailto', 'tel']);
79
+ if (!allowedSchemes.has(scheme)) {
80
+ return '';
81
+ }
82
+ }
83
+ // Otherwise, keep the attribute (e.g. relative-like values without a scheme).
84
+ return match;
85
+ });
46
86
  // Remove style tags and style attributes with potentially dangerous content
47
- sanitized = sanitized.replaceAll(/<style\b[\s\S]*?<\/style>/gi, '');
87
+ let prevSanitized;
88
+ do {
89
+ prevSanitized = sanitized;
90
+ sanitized = sanitized.replaceAll(/<style\b[\s\S]*?<\/style>/gi, '');
91
+ } while (sanitized !== prevSanitized);
48
92
  sanitized = sanitized.replaceAll(/\bstyle\s*=\s*(?:'[^']*'|"[^"]*"|[^\s>]*)/gi, '');
49
93
  // Remove form elements
50
94
  sanitized = sanitized.replaceAll(/<form\b[\s\S]*?<\/form>/gi, '');
@@ -70,23 +114,109 @@ const encodeUri = (uri) => {
70
114
  /**
71
115
  * Encode URI for use in href attribute
72
116
  */
117
+ function decodeHtmlEntitiesForProtocolCheck(input) {
118
+ // Decode numeric HTML entities so obfuscations like "jav&#x61;script:" are caught.
119
+ // This is intentionally minimal and only used for protocol detection (not output rendering).
120
+ const decodeCodePoint = (codePoint) => {
121
+ if (!Number.isFinite(codePoint) || codePoint < 0 || codePoint > 0x10ffff) {
122
+ return '';
123
+ }
124
+ try {
125
+ return String.fromCodePoint(codePoint);
126
+ }
127
+ catch {
128
+ return '';
129
+ }
130
+ };
131
+ // Decode a small set of named entities commonly used for obfuscation.
132
+ const namedDecoded = input.replaceAll(/&([a-z]+);?/gi, (m, name) => {
133
+ const key = String(name).toLowerCase();
134
+ if (key === 'colon')
135
+ return ':';
136
+ if (key === 'tab')
137
+ return '\t';
138
+ if (key === 'newline')
139
+ return '\n';
140
+ if (key === 'nbsp')
141
+ return ' ';
142
+ return m;
143
+ });
144
+ return namedDecoded
145
+ .replaceAll(/&#(\d+);?/g, (_m, dec) => {
146
+ const decStr = typeof dec === 'string' ? dec : String(dec);
147
+ return decodeCodePoint(Number.parseInt(decStr, 10)) || _m;
148
+ })
149
+ .replaceAll(/&#x([0-9a-f]+);?/gi, (_m, hex) => {
150
+ const hexStr = typeof hex === 'string' ? hex : String(hex);
151
+ return decodeCodePoint(Number.parseInt(hexStr, 16)) || _m;
152
+ });
153
+ }
154
+ function tryDecodePercentEncoding(input, rounds = 2) {
155
+ let out = input;
156
+ for (let i = 0; i < rounds; i += 1) {
157
+ try {
158
+ const decoded = decodeURIComponent(out);
159
+ if (decoded === out) {
160
+ break;
161
+ }
162
+ out = decoded;
163
+ }
164
+ catch {
165
+ break;
166
+ }
167
+ }
168
+ return out;
169
+ }
170
+ function normalizeHrefForProtocolCheck(href) {
171
+ // Decode common obfuscations before protocol checks.
172
+ const entityDecoded = decodeHtmlEntitiesForProtocolCheck(href);
173
+ const percentDecoded = tryDecodePercentEncoding(entityDecoded, 2);
174
+ // Remove control characters and whitespace to prevent "java\nscript:" bypasses.
175
+ // eslint-disable-next-line no-control-regex
176
+ return percentDecoded.replaceAll(/[\x00-\x20\x7f\u00a0]/g, '').toLowerCase();
177
+ }
73
178
  const encodeHref = (href) => {
74
179
  if (typeof href !== 'string') {
75
180
  return '';
76
181
  }
77
- // Prevent javascript: protocol (including obfuscated versions)
78
- // We remove control characters and whitespace for the check
79
- // eslint-disable-next-line no-control-regex
80
- const protocolCheck = href.replaceAll(/[\x00-\x20]/g, '').toLowerCase();
81
- const jsProtocol = 'javascript:'; // NOSONAR: S1523 - We are explicitly blocking javascript: protocol to prevent XSS
82
- if (protocolCheck.startsWith(jsProtocol)) {
182
+ const protocolCheck = normalizeHrefForProtocolCheck(href);
183
+ // Allow relative URLs and fragments.
184
+ if (protocolCheck.startsWith('/') ||
185
+ protocolCheck.startsWith('#') ||
186
+ protocolCheck.startsWith('./') ||
187
+ protocolCheck.startsWith('../') ||
188
+ protocolCheck.startsWith('//')) {
189
+ return escapeHtml(href);
190
+ }
191
+ // Explicitly block common dangerous protocols (including obfuscated versions).
192
+ // Allow-list a narrow set of data:image/* URLs for common raster formats.
193
+ if (protocolCheck.startsWith('data:')) {
194
+ const allowedDataImagePrefixes = [
195
+ 'data:image/png',
196
+ 'data:image/jpeg',
197
+ 'data:image/jpg',
198
+ 'data:image/gif',
199
+ 'data:image/webp',
200
+ 'data:image/avif',
201
+ ];
202
+ if (allowedDataImagePrefixes.some((p) => protocolCheck.startsWith(p))) {
203
+ return escapeHtml(href);
204
+ }
83
205
  return '';
84
206
  }
85
- // Prevent data: protocol (unless explicitly allowed)
86
- if (protocolCheck.startsWith('data:text/html')) {
87
- // NOSONAR: S1523 - We are explicitly blocking data: protocol to prevent XSS
207
+ const blockedProtocols = ['javascript:', 'vbscript:']; // NOSONAR: S1523 - Explicit protocol blocking to prevent XSS
208
+ if (blockedProtocols.some((p) => protocolCheck.startsWith(p))) {
88
209
  return '';
89
210
  }
211
+ // If a scheme is present, allowlist it.
212
+ const schemeMatch = new RegExp(/^([a-z][a-z0-9+.-]*):/i).exec(protocolCheck);
213
+ if (schemeMatch) {
214
+ const scheme = schemeMatch[1].toLowerCase();
215
+ const allowedSchemes = new Set(['http', 'https', 'mailto', 'tel']);
216
+ if (!allowedSchemes.has(scheme)) {
217
+ return '';
218
+ }
219
+ }
90
220
  return escapeHtml(href);
91
221
  };
92
222
  /**
@@ -105,6 +235,10 @@ const isSafeUrl = (url) => {
105
235
  if (trimmed.startsWith('http://') || trimmed.startsWith('https://')) {
106
236
  return true;
107
237
  }
238
+ // Allow common safe schemes
239
+ if (trimmed.startsWith('mailto:') || trimmed.startsWith('tel:')) {
240
+ return true;
241
+ }
108
242
  // Block dangerous protocols
109
243
  if (/^\w+:/.test(trimmed)) {
110
244
  return false;
@@ -8,6 +8,7 @@ import { FeatureFlags } from '@config/features';
8
8
  import { Logger } from '@config/logger';
9
9
  import { ErrorFactory } from '@exceptions/ZintrustError';
10
10
  import { DatabaseConfig, IDatabaseAdapter, QueryResult } from '@orm/DatabaseAdapter';
11
+ import { QueryBuilder } from '@orm/QueryBuilder';
11
12
 
12
13
  /**
13
14
  * MySQL adapter implementation
@@ -47,6 +48,10 @@ export const MySQLAdapter = Object.freeze({
47
48
  return result.rows[0] ?? null;
48
49
  },
49
50
 
51
+ async ping(): Promise<void> {
52
+ await this.query(QueryBuilder.create('').select('1').toSQL(), []);
53
+ },
54
+
50
55
  async transaction<T>(callback: (adapter: IDatabaseAdapter) => Promise<T>): Promise<T> {
51
56
  if (!connected) throw ErrorFactory.createConnectionError('Database not connected');
52
57
  try {
@@ -8,6 +8,7 @@ import { FeatureFlags } from '@config/features';
8
8
  import { Logger } from '@config/logger';
9
9
  import { ErrorFactory } from '@exceptions/ZintrustError';
10
10
  import { DatabaseConfig, IDatabaseAdapter, QueryResult } from '@orm/DatabaseAdapter';
11
+ import { QueryBuilder } from '@orm/QueryBuilder';
11
12
 
12
13
  /**
13
14
  * PostgreSQL adapter implementation
@@ -47,6 +48,10 @@ export const PostgreSQLAdapter = Object.freeze({
47
48
  return result.rows[0] ?? null;
48
49
  },
49
50
 
51
+ async ping(): Promise<void> {
52
+ await this.query(QueryBuilder.create('').select('1').toSQL(), []);
53
+ },
54
+
50
55
  async transaction<T>(callback: (adapter: IDatabaseAdapter) => Promise<T>): Promise<T> {
51
56
  if (!connected) throw ErrorFactory.createConnectionError('Database not connected');
52
57
  try {
@@ -8,6 +8,7 @@ import { FeatureFlags } from '@config/features';
8
8
  import { Logger } from '@config/logger';
9
9
  import { ErrorFactory } from '@exceptions/ZintrustError';
10
10
  import { DatabaseConfig, IDatabaseAdapter, QueryResult } from '@orm/DatabaseAdapter';
11
+ import { QueryBuilder } from '@orm/QueryBuilder';
11
12
 
12
13
  /**
13
14
  * SQL Server adapter implementation
@@ -47,6 +48,10 @@ export const SQLServerAdapter = Object.freeze({
47
48
  return result.rows[0] ?? null;
48
49
  },
49
50
 
51
+ async ping(): Promise<void> {
52
+ await this.query(QueryBuilder.create('').select('1').toSQL(), []);
53
+ },
54
+
50
55
  async transaction<T>(callback: (adapter: IDatabaseAdapter) => Promise<T>): Promise<T> {
51
56
  try {
52
57
  return await callback(this);
@@ -10,6 +10,7 @@ import { Logger } from '@config/logger';
10
10
  import { ErrorFactory } from '@exceptions/ZintrustError';
11
11
  import { performance } from '@node-singletons/perf-hooks';
12
12
  import { DatabaseConfig, IDatabaseAdapter, QueryResult } from '@orm/DatabaseAdapter';
13
+ import { QueryBuilder } from '@orm/QueryBuilder';
13
14
  import Database from 'better-sqlite3';
14
15
 
15
16
  function normalizeFilename(database: string | null | undefined): string {
@@ -157,6 +158,10 @@ function createSQLiteAdapter(config: DatabaseConfig): IDatabaseAdapter {
157
158
  return result.rows[0] ?? null;
158
159
  },
159
160
 
161
+ async ping(): Promise<void> {
162
+ await adapter.query(QueryBuilder.create('').select('1').toSQL(), []);
163
+ },
164
+
160
165
  async transaction<T>(
161
166
  callback: (adapter: IDatabaseAdapter, db: Database.Database) => Promise<T>
162
167
  ): Promise<T> {
@@ -1,7 +1,7 @@
1
1
  // TEMPLATE_START
2
2
 
3
+ import { generateSecureJobId } from '@common/uuid';
3
4
  import { Logger } from '@config/logger';
4
- import { ErrorFactory } from '@exceptions/ZintrustError';
5
5
 
6
6
  export interface QueueJob {
7
7
  id: string;
@@ -44,32 +44,4 @@ export const Queue = Object.freeze({
44
44
  },
45
45
  });
46
46
 
47
- async function generateSecureJobId(): Promise<string> {
48
- if (typeof globalThis.crypto?.randomUUID === 'function') {
49
- return globalThis.crypto.randomUUID();
50
- }
51
-
52
- if (typeof globalThis.crypto?.getRandomValues === 'function') {
53
- const bytes = new Uint8Array(16);
54
- globalThis.crypto.getRandomValues(bytes);
55
- return bytesToHex(bytes);
56
- }
57
-
58
- // Node fallback for environments without Web Crypto
59
- try {
60
- const nodeCrypto = await import('node:crypto');
61
- return nodeCrypto.randomBytes(16).toString('hex');
62
- } catch (error) {
63
- throw ErrorFactory.createTryCatchError(
64
- 'Secure crypto API not available to generate a job id.',
65
- error
66
- );
67
- }
68
- }
69
-
70
- function bytesToHex(bytes: Uint8Array): string {
71
- let out = '';
72
- for (const b of bytes) out += b.toString(16).padStart(2, '0');
73
- return out;
74
- }
75
47
  // TEMPLATE_END
@@ -9,6 +9,25 @@ DB_DATABASE=./database.sqlite
9
9
 
10
10
  LOG_LEVEL=debug
11
11
  LOG_CHANNEL=file
12
+ LOG_FORMAT=text
13
+
14
+ # Cloud logging backends (optional)
15
+ # KV logger (Cloudflare Workers KV)
16
+ KV_LOG_ENABLED=false
17
+ KV_NAMESPACE=CACHE
18
+ KV_LOG_RETENTION_DAYS=30
19
+
20
+ # Slack logger (Slack incoming webhook)
21
+ SLACK_LOG_ENABLED=false
22
+ SLACK_LOG_WEBHOOK_URL=
23
+ SLACK_LOG_LEVELS=warn,error,fatal
24
+ SLACK_LOG_BATCH_WINDOW_MS=5000
25
+
26
+ # HTTP endpoint logger
27
+ HTTP_LOG_ENABLED=false
28
+ HTTP_LOG_ENDPOINT_URL=
29
+ HTTP_LOG_BATCH_SIZE=50
30
+ HTTP_LOG_AUTH_TOKEN=
12
31
 
13
32
  JWT_SECRET=
14
33
  JWT_EXPIRES_IN=1h
@@ -24,3 +43,32 @@ MAIL_USERNAME=
24
43
  MAIL_PASSWORD=
25
44
  MAIL_FROM_ADDRESS=
26
45
  MAIL_FROM_NAME=
46
+
47
+ # Storage
48
+ STORAGE_DRIVER=local
49
+ STORAGE_PATH=storage
50
+ STORAGE_URL=/storage
51
+ STORAGE_VISIBILITY=private
52
+
53
+ # AWS S3
54
+ AWS_ACCESS_KEY_ID=
55
+ AWS_SECRET_ACCESS_KEY=
56
+ AWS_REGION=us-east-1
57
+ AWS_S3_BUCKET=
58
+ AWS_S3_URL=
59
+ AWS_S3_ENDPOINT=
60
+ AWS_S3_USE_PATH_STYLE_URL=false
61
+
62
+ # Cloudflare R2
63
+ R2_ACCESS_KEY_ID=
64
+ R2_SECRET_ACCESS_KEY=
65
+ R2_REGION=
66
+ R2_BUCKET=
67
+ R2_ENDPOINT=
68
+ R2_URL=
69
+
70
+ # Google Cloud Storage (requires optional dependency @google-cloud/storage)
71
+ GCS_PROJECT_ID=
72
+ GCS_KEY_FILE=
73
+ GCS_BUCKET=
74
+ GCS_URL=
@@ -1,7 +1,5 @@
1
- # ============================================================================
2
1
  # Zintrust Framework - Environment Configuration
3
- # Generated from src/config/env.ts - All available configuration keys
4
- # ============================================================================
2
+ # Copy this file to .env and configure for your environment
5
3
 
6
4
  # ============================================================================
7
5
  # APPLICATION
@@ -11,21 +9,8 @@
11
9
  NODE_ENV=development
12
10
 
13
11
  # Server Configuration
14
- HOST=127.0.0.1
15
- APP_PORT=7777
16
- APP_NAME={{projectName}}
17
- APP_KEY=
18
-
19
-
20
- # ============================================================================
21
- # LOGGING
22
- # ============================================================================
23
-
24
- # Log Level: debug | info | warn | error
25
- LOG_LEVEL=debug
26
- DISABLE_LOGGING=true
27
- LOG_CHANNEL=file
28
-
12
+ HOST=
13
+ PORT=
29
14
 
30
15
  # ============================================================================
31
16
  # DATABASE
@@ -33,132 +18,142 @@ LOG_CHANNEL=file
33
18
 
34
19
  # Database Connection Driver
35
20
  # Options: sqlite | postgresql | mysql | sqlserver | d1
36
- DB_CONNECTION=sqlite
21
+ DB_CONNECTION=
22
+
23
+ # SQLite (default for development)
24
+ DB_PATH=
25
+
26
+ # PostgreSQL
27
+ # DB_HOST=localhost
28
+ # DB_PORT=5432
29
+ # DB_DATABASE=zintrust
30
+ # DB_USERNAME=postgres
31
+ # DB_PASSWORD=postgres
37
32
 
38
- # SQLite Configuration
39
- DB_PATH=./storage/db.sqlite
33
+ # MySQL
34
+ # DB_HOST=localhost
35
+ # DB_PORT=3306
36
+ # DB_DATABASE=zintrust
37
+ # DB_USERNAME=root
38
+ # DB_PASSWORD=password
40
39
 
41
- # PostgreSQL Configuration
42
- DB_HOST=localhost
43
- DB_PORT=5432
44
- DB_DATABASE=zintrust
45
- DB_USERNAME=postgres
46
- DB_PASSWORD=
47
- DB_READ_HOSTS=
40
+ # SQL Server
41
+ # DB_HOST=localhost
42
+ # DB_PORT=1433
43
+ # DB_DATABASE=zintrust
44
+ # DB_USERNAME=sa
45
+ # DB_PASSWORD=Password123
48
46
 
49
47
  # ============================================================================
50
- # CLOUDFLARE
48
+ # ADVANCED DATABASE FEATURES
51
49
  # ============================================================================
52
50
 
53
- D1_DATABASE_ID=
54
- KV_NAMESPACE_ID=
51
+ # Raw SQL Query Support
52
+ # WARNING: Only enable in development. Bypasses QueryBuilder safety.
53
+ # This is checked once at application bootstrap, cached in memory.
54
+ # Feature flag is initialized at startup - no runtime changes possible.
55
+ USE_RAW_QRY=
55
56
 
56
57
  # ============================================================================
57
58
  # CACHE
58
59
  # ============================================================================
59
60
 
60
- # Cache Driver: memory | redis | memcached
61
- CACHE_DRIVER=memory
61
+ # Cache Driver: memory | redis | mongodb | kv
62
+ # - kv: Cloudflare Workers only (requires a KV binding named "CACHE")
63
+ CACHE_DRIVER=
62
64
 
63
- # Redis Configuration
64
- REDIS_HOST=localhost
65
- REDIS_PORT=6379
66
- REDIS_PASSWORD=
65
+ # Redis Configuration (if using Redis)
66
+ # REDIS_HOST=localhost
67
+ # REDIS_PORT=6379
67
68
 
68
- # MongoDB Cache Configuration
69
- MONGO_URI=
70
- MONGO_DB=zintrust_cache
69
+ # MongoDB Cache (if using mongodb)
70
+ # Uses MongoDB Atlas Data API (HTTPS)
71
+ # MONGO_URI=https://data.mongodb-api.com/app/<app-id>/endpoint/data/v1
72
+ # MONGO_DB=zintrust_cache
71
73
 
72
74
  # ============================================================================
73
- # AWS
75
+ # LOGGING
74
76
  # ============================================================================
75
77
 
76
- AWS_REGION=us-east-1
77
- AWS_LAMBDA_FUNCTION_NAME=
78
- AWS_LAMBDA_FUNCTION_VERSION=
79
- AWS_EXECUTION_ENV=
80
- LAMBDA_TASK_ROOT=
81
-
82
- # ============================================================================
83
- # MICROSERVICES
84
- # ============================================================================
78
+ # Log Level: debug | info | warn | error
79
+ LOG_LEVEL=
85
80
 
86
- MICROSERVICES=
87
- SERVICES=
88
- MICROSERVICES_TRACING=false
89
- MICROSERVICES_TRACING_RATE=1.0
90
- DATABASE_ISOLATION=shared
91
- SERVICE_API_KEY=
92
- SERVICE_JWT_SECRET=
81
+ # Log Channel: console | file | all
82
+ LOG_CHANNEL=
93
83
 
94
84
  # ============================================================================
95
85
  # SECURITY
96
86
  # ============================================================================
97
87
 
98
- DEBUG=false
99
- ENABLE_MICROSERVICES=false
100
- TOKEN_TTL=3600000
101
- TOKEN_LENGTH=32
102
-
103
88
  # JWT Secret for authentication
104
89
  JWT_SECRET=
105
90
 
106
91
  # Session Configuration
107
- SESSION_DRIVER=cookie
108
- SESSION_LIFETIME=7200
92
+ SESSION_DRIVER=
93
+ SESSION_LIFETIME=
109
94
 
110
95
  # CORS Configuration
111
- CORS_ORIGINS=http://localhost:3000,http://localhost:5173
96
+ CORS_ORIGINS=
112
97
 
113
98
  # ============================================================================
114
- # DEPLOYMENT
99
+ # MICROSERVICES
115
100
  # ============================================================================
116
101
 
117
- ENVIRONMENT=development
118
- REQUEST_TIMEOUT=30000
119
- MAX_BODY_SIZE=10485760
102
+ # Enable Microservices
103
+ MICROSERVICES=
120
104
 
105
+ # Comma-separated list of services to load
106
+ SERVICES=
107
+
108
+ # Service Discovery
109
+ SERVICE_DISCOVERY=
110
+
111
+ # Request Tracing
112
+ MICROSERVICES_TRACING=
113
+ MICROSERVICES_TRACING_RATE=
121
114
 
122
115
  # ============================================================================
123
- # EXTERNAL SERVICES & CREDENTIALS
116
+ # SONARQUBE / SONARCLOUD
124
117
  # ============================================================================
125
118
 
126
- SONAR_ORGANIZATION="zintrust"
127
- SONAR_PROJECT_ID="ZinTrust_ZinTrust"
128
- SONAR_HOST_URL="https://sonarcloud.io"
129
- SONAR_TOKEN=
119
+ # SonarQube Server
120
+ SONAR_HOST_URL=
130
121
 
131
- # Cloudflare Workspace-Specific Credentials
132
- CLOUDFLARE_API_TOKEN=
133
- CLOUDFLARE_ACCOUNT_ID=""
122
+ # SonarCloud
123
+ # SONAR_HOST_URL=https://sonarcloud.io
124
+ # SONAR_TOKEN=your_token
125
+ # SONAR_ORGANIZATION=your-organization
134
126
 
135
- CODECOV_TOKEN=
127
+ # ============================================================================
128
+ # EXTERNAL SERVICES
129
+ # ============================================================================
136
130
 
137
- # Security Scanning
138
- SNYK_TOKEN=
131
+ # Snyk Security Token
132
+ # SNYK_TOKEN=your_token
139
133
 
140
- # Email (SendGrid)
141
- SENDGRID_API_KEY=
134
+ # SendGrid (Email)
135
+ # SENDGRID_API_KEY=your_api_key
142
136
 
143
- # Payments (Stripe)
144
- STRIPE_SECRET_KEY=
145
- STRIPE_PUBLIC_KEY=
137
+ # Stripe (Payments)
138
+ # STRIPE_SECRET_KEY=your_secret_key
139
+ # STRIPE_PUBLIC_KEY=your_public_key
146
140
 
147
- # Cloud Storage (AWS S3)
148
- AWS_ACCESS_KEY_ID=
149
- AWS_SECRET_ACCESS_KEY=
150
- AWS_BUCKET=
141
+ # AWS S3 (File Storage)
142
+ # AWS_ACCESS_KEY_ID=your_access_key
143
+ # AWS_SECRET_ACCESS_KEY=your_secret_key
144
+ # AWS_REGION=us-east-1
145
+ # AWS_BUCKET=your_bucket_name
151
146
 
152
147
  # ============================================================================
153
148
  # DEVELOPMENT
154
149
  # ============================================================================
155
150
 
151
+ # Debug Mode
152
+ DEBUG=
153
+
156
154
  # Database Synchronization (auto-migrate on startup)
157
- DB_SYNCHRONIZE=true
155
+ DB_SYNCHRONIZE=
158
156
 
159
157
  # Database Logging
160
- DB_LOGGING=false
158
+ DB_LOGGING=
161
159
 
162
- # Raw SQL Query Support (development only)
163
- # WARNING: Only enable in development. Bypasses QueryBuilder safety.
164
- USE_RAW_QRY=false
@@ -0,0 +1,7 @@
1
+ import { Broadcast } from '@broadcast/Broadcast';
2
+
3
+ export async function sendBroadcast(channel: string, event: string, data: unknown): Promise<void> {
4
+ await Broadcast.send(channel, event, data);
5
+ }
6
+
7
+ export default Object.freeze({ sendBroadcast });
@@ -0,0 +1,30 @@
1
+ import { Mail } from '@mail/Mail';
2
+
3
+ export async function sendWelcomeEmail(
4
+ to: string,
5
+ name: string,
6
+ attachmentDisk?: string,
7
+ attachmentPath?: string
8
+ ): Promise<void> {
9
+ const subject = `Welcome, ${name}`;
10
+ const text = `Hello ${name}, welcome.`;
11
+
12
+ const attachments =
13
+ attachmentDisk !== null &&
14
+ attachmentDisk !== undefined &&
15
+ attachmentDisk.trim() !== '' &&
16
+ attachmentPath !== null &&
17
+ attachmentPath !== undefined &&
18
+ attachmentPath.trim() !== ''
19
+ ? [{ disk: attachmentDisk, path: attachmentPath }]
20
+ : undefined;
21
+
22
+ await Mail.send({
23
+ to,
24
+ subject,
25
+ text,
26
+ attachments,
27
+ });
28
+ }
29
+
30
+ export default Object.freeze({ sendWelcomeEmail });
@@ -0,0 +1,10 @@
1
+ import { sendSlackWebhook } from '@notification/drivers/Slack';
2
+
3
+ export async function sendSlackNotification(
4
+ webhookUrl: string,
5
+ message: { text: string }
6
+ ): Promise<void> {
7
+ await sendSlackWebhook({ webhookUrl }, message);
8
+ }
9
+
10
+ export default Object.freeze({ sendSlackNotification });