@zintrust/core 0.1.1 → 0.1.3

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 (487) 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 +15 -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 +155 -17
  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 +11 -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/routes/storage.ts.tpl +42 -0
  327. package/src/templates/project/basic/src/index.ts.tpl +38 -11
  328. package/src/templates/project/basic/template.json +3 -0
  329. package/src/toolkit/Secrets/EnvFile.d.ts +15 -0
  330. package/src/toolkit/Secrets/EnvFile.d.ts.map +1 -0
  331. package/src/toolkit/Secrets/EnvFile.js +63 -0
  332. package/src/toolkit/Secrets/Manifest.d.ts +24 -0
  333. package/src/toolkit/Secrets/Manifest.d.ts.map +1 -0
  334. package/src/toolkit/Secrets/Manifest.js +71 -0
  335. package/src/toolkit/Secrets/index.d.ts +42 -0
  336. package/src/toolkit/Secrets/index.d.ts.map +1 -0
  337. package/src/toolkit/Secrets/index.js +119 -0
  338. package/src/toolkit/Secrets/providers/AwsSecretsManager.d.ts +14 -0
  339. package/src/toolkit/Secrets/providers/AwsSecretsManager.d.ts.map +1 -0
  340. package/src/toolkit/Secrets/providers/AwsSecretsManager.js +131 -0
  341. package/src/toolkit/Secrets/providers/CloudflareKv.d.ts +9 -0
  342. package/src/toolkit/Secrets/providers/CloudflareKv.d.ts.map +1 -0
  343. package/src/toolkit/Secrets/providers/CloudflareKv.js +73 -0
  344. package/src/tools/broadcast/Broadcast.d.ts +7 -0
  345. package/src/tools/broadcast/Broadcast.d.ts.map +1 -0
  346. package/src/tools/broadcast/Broadcast.js +37 -0
  347. package/src/tools/broadcast/drivers/BaseDriver.d.ts +5 -0
  348. package/src/tools/broadcast/drivers/BaseDriver.d.ts.map +1 -0
  349. package/src/tools/broadcast/drivers/BaseDriver.js +8 -0
  350. package/src/tools/broadcast/drivers/InMemory.d.ts +18 -0
  351. package/src/tools/broadcast/drivers/InMemory.d.ts.map +1 -0
  352. package/src/tools/broadcast/drivers/InMemory.js +16 -0
  353. package/src/tools/broadcast/drivers/Pusher.d.ts +8 -0
  354. package/src/tools/broadcast/drivers/Pusher.d.ts.map +1 -0
  355. package/src/tools/broadcast/drivers/Pusher.js +75 -0
  356. package/src/tools/broadcast/drivers/Redis.d.ts +19 -0
  357. package/src/tools/broadcast/drivers/Redis.d.ts.map +1 -0
  358. package/src/tools/broadcast/drivers/Redis.js +73 -0
  359. package/src/tools/broadcast/drivers/RedisHttps.d.ts +14 -0
  360. package/src/tools/broadcast/drivers/RedisHttps.d.ts.map +1 -0
  361. package/src/tools/broadcast/drivers/RedisHttps.js +50 -0
  362. package/src/tools/broadcast/index.d.ts +7 -0
  363. package/src/tools/broadcast/index.d.ts.map +1 -0
  364. package/src/tools/broadcast/index.js +6 -0
  365. package/src/tools/http/Http.d.ts +49 -0
  366. package/src/tools/http/Http.d.ts.map +1 -0
  367. package/src/tools/http/Http.js +169 -0
  368. package/src/tools/http/HttpResponse.d.ts +32 -0
  369. package/src/tools/http/HttpResponse.d.ts.map +1 -0
  370. package/src/tools/http/HttpResponse.js +80 -0
  371. package/src/tools/http/index.d.ts +15 -0
  372. package/src/tools/http/index.d.ts.map +1 -0
  373. package/src/tools/http/index.js +9 -0
  374. package/src/tools/mail/Mail.d.ts +22 -0
  375. package/src/tools/mail/Mail.d.ts.map +1 -0
  376. package/src/tools/mail/Mail.js +105 -0
  377. package/src/tools/mail/attachments.d.ts +23 -0
  378. package/src/tools/mail/attachments.d.ts.map +1 -0
  379. package/src/tools/mail/attachments.js +26 -0
  380. package/src/tools/mail/drivers/BaseDriver.d.ts +5 -0
  381. package/src/tools/mail/drivers/BaseDriver.d.ts.map +1 -0
  382. package/src/tools/mail/drivers/BaseDriver.js +8 -0
  383. package/src/tools/mail/drivers/Mailgun.d.ts +31 -0
  384. package/src/tools/mail/drivers/Mailgun.d.ts.map +1 -0
  385. package/src/tools/mail/drivers/Mailgun.js +81 -0
  386. package/src/tools/mail/drivers/SendGrid.d.ts +29 -0
  387. package/src/tools/mail/drivers/SendGrid.d.ts.map +1 -0
  388. package/src/tools/mail/drivers/SendGrid.js +57 -0
  389. package/src/tools/mail/drivers/Ses.d.ts +24 -0
  390. package/src/tools/mail/drivers/Ses.d.ts.map +1 -0
  391. package/src/tools/mail/drivers/Ses.js +116 -0
  392. package/src/tools/mail/drivers/Smtp.d.ts +38 -0
  393. package/src/tools/mail/drivers/Smtp.d.ts.map +1 -0
  394. package/src/tools/mail/drivers/Smtp.js +327 -0
  395. package/src/tools/mail/templates/index.d.ts +27 -0
  396. package/src/tools/mail/templates/index.d.ts.map +1 -0
  397. package/src/tools/mail/templates/index.js +35 -0
  398. package/src/tools/mail/templates/markdown/index.d.ts +17 -0
  399. package/src/tools/mail/templates/markdown/index.d.ts.map +1 -0
  400. package/src/tools/mail/templates/markdown/index.js +49 -0
  401. package/src/tools/mail/templates/markdown/registry.d.ts +15 -0
  402. package/src/tools/mail/templates/markdown/registry.d.ts.map +1 -0
  403. package/src/tools/mail/templates/markdown/registry.js +34 -0
  404. package/src/tools/mail/templates/markdown/validator.d.ts +16 -0
  405. package/src/tools/mail/templates/markdown/validator.d.ts.map +1 -0
  406. package/src/tools/mail/templates/markdown/validator.js +24 -0
  407. package/src/tools/mail/testing.d.ts +41 -0
  408. package/src/tools/mail/testing.d.ts.map +1 -0
  409. package/src/tools/mail/testing.js +34 -0
  410. package/src/tools/notification/Driver.d.ts +11 -0
  411. package/src/tools/notification/Driver.d.ts.map +1 -0
  412. package/src/tools/notification/Driver.js +1 -0
  413. package/src/tools/notification/Notification.d.ts +11 -0
  414. package/src/tools/notification/Notification.d.ts.map +1 -0
  415. package/src/tools/notification/Notification.js +11 -0
  416. package/src/tools/notification/Registry.d.ts +10 -0
  417. package/src/tools/notification/Registry.d.ts.map +1 -0
  418. package/src/tools/notification/Registry.js +22 -0
  419. package/src/tools/notification/Service.d.ts +6 -0
  420. package/src/tools/notification/Service.d.ts.map +1 -0
  421. package/src/tools/notification/Service.js +18 -0
  422. package/src/tools/notification/config.d.ts +5 -0
  423. package/src/tools/notification/config.d.ts.map +1 -0
  424. package/src/tools/notification/config.js +5 -0
  425. package/src/tools/notification/drivers/BaseDriver.d.ts +5 -0
  426. package/src/tools/notification/drivers/BaseDriver.d.ts.map +1 -0
  427. package/src/tools/notification/drivers/BaseDriver.js +8 -0
  428. package/src/tools/notification/drivers/Console.d.ts +7 -0
  429. package/src/tools/notification/drivers/Console.d.ts.map +1 -0
  430. package/src/tools/notification/drivers/Console.js +13 -0
  431. package/src/tools/notification/drivers/Slack.d.ts +16 -0
  432. package/src/tools/notification/drivers/Slack.d.ts.map +1 -0
  433. package/src/tools/notification/drivers/Slack.js +24 -0
  434. package/src/tools/notification/drivers/Termii.d.ts +10 -0
  435. package/src/tools/notification/drivers/Termii.d.ts.map +1 -0
  436. package/src/tools/notification/drivers/Termii.js +47 -0
  437. package/src/tools/notification/drivers/Twilio.d.ts +21 -0
  438. package/src/tools/notification/drivers/Twilio.d.ts.map +1 -0
  439. package/src/tools/notification/drivers/Twilio.js +48 -0
  440. package/src/tools/notification/templates/markdown/index.d.ts +15 -0
  441. package/src/tools/notification/templates/markdown/index.d.ts.map +1 -0
  442. package/src/tools/notification/templates/markdown/index.js +38 -0
  443. package/src/tools/notification/templates/markdown/registry.d.ts +15 -0
  444. package/src/tools/notification/templates/markdown/registry.d.ts.map +1 -0
  445. package/src/tools/notification/templates/markdown/registry.js +36 -0
  446. package/src/tools/notification/testing.d.ts +19 -0
  447. package/src/tools/notification/testing.d.ts.map +1 -0
  448. package/src/tools/notification/testing.js +35 -0
  449. package/src/tools/notification/testingHelpers.d.ts +12 -0
  450. package/src/tools/notification/testingHelpers.d.ts.map +1 -0
  451. package/src/tools/notification/testingHelpers.js +32 -0
  452. package/src/tools/queue/Queue.d.ts +23 -0
  453. package/src/tools/queue/Queue.d.ts.map +1 -0
  454. package/src/tools/queue/Queue.js +38 -0
  455. package/src/tools/queue/drivers/InMemory.d.ts +10 -0
  456. package/src/tools/queue/drivers/InMemory.d.ts.map +1 -0
  457. package/src/tools/queue/drivers/InMemory.js +55 -0
  458. package/src/tools/queue/drivers/Redis.d.ts +10 -0
  459. package/src/tools/queue/drivers/Redis.d.ts.map +1 -0
  460. package/src/tools/queue/drivers/Redis.js +91 -0
  461. package/src/tools/storage/LocalSignedUrl.d.ts +12 -0
  462. package/src/tools/storage/LocalSignedUrl.d.ts.map +1 -0
  463. package/src/tools/storage/LocalSignedUrl.js +108 -0
  464. package/src/tools/storage/drivers/Gcs.d.ts +20 -0
  465. package/src/tools/storage/drivers/Gcs.d.ts.map +1 -0
  466. package/src/tools/storage/drivers/Gcs.js +152 -0
  467. package/src/tools/storage/drivers/Local.d.ts +18 -0
  468. package/src/tools/storage/drivers/Local.d.ts.map +1 -0
  469. package/src/tools/storage/drivers/Local.js +89 -0
  470. package/src/tools/storage/drivers/R2.d.ts +20 -0
  471. package/src/tools/storage/drivers/R2.d.ts.map +1 -0
  472. package/src/tools/storage/drivers/R2.js +73 -0
  473. package/src/tools/storage/drivers/S3.d.ts +26 -0
  474. package/src/tools/storage/drivers/S3.d.ts.map +1 -0
  475. package/src/tools/storage/drivers/S3.js +258 -0
  476. package/src/tools/storage/index.d.ts +24 -0
  477. package/src/tools/storage/index.d.ts.map +1 -0
  478. package/src/tools/storage/index.js +111 -0
  479. package/src/tools/storage/testing.d.ts +23 -0
  480. package/src/tools/storage/testing.d.ts.map +1 -0
  481. package/src/tools/storage/testing.js +52 -0
  482. package/src/tools/templates/MarkdownRenderer.d.ts +14 -0
  483. package/src/tools/templates/MarkdownRenderer.d.ts.map +1 -0
  484. package/src/tools/templates/MarkdownRenderer.js +300 -0
  485. package/src/tools/templates/index.d.ts +5 -0
  486. package/src/tools/templates/index.d.ts.map +1 -0
  487. package/src/tools/templates/index.js +4 -0
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Notification - Public API entry point
3
+ *
4
+ * A small wrapper over NotificationService to provide the expected module name.
5
+ */
6
+ export declare const Notification: Readonly<{
7
+ send: (recipient: string, message: string, options?: Record<string, unknown>) => Promise<unknown>;
8
+ listDrivers: () => string[];
9
+ }>;
10
+ export default Notification;
11
+ //# sourceMappingURL=Notification.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Notification.d.ts","sourceRoot":"","sources":["../../../../src/tools/notification/Notification.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,eAAO,MAAM,YAAY;;;EAGvB,CAAC;AAEH,eAAe,YAAY,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Notification - Public API entry point
3
+ *
4
+ * A small wrapper over NotificationService to provide the expected module name.
5
+ */
6
+ import { NotificationService } from './Service';
7
+ export const Notification = Object.freeze({
8
+ send: NotificationService.send,
9
+ listDrivers: NotificationService.listDrivers,
10
+ });
11
+ export default Notification;
@@ -0,0 +1,10 @@
1
+ type DriverLike = {
2
+ send(recipient: string, message: string, options?: Record<string, unknown>): Promise<unknown>;
3
+ };
4
+ export declare const NotificationRegistry: Readonly<{
5
+ register(name: string, driver: DriverLike): void;
6
+ get(name: string): DriverLike;
7
+ list(): string[];
8
+ }>;
9
+ export default NotificationRegistry;
10
+ //# sourceMappingURL=Registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Registry.d.ts","sourceRoot":"","sources":["../../../../src/tools/notification/Registry.ts"],"names":[],"mappings":"AAIA,KAAK,UAAU,GAAG;IAChB,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC/F,CAAC;AAOF,eAAO,MAAM,oBAAoB;mBAChB,MAAM,UAAU,UAAU;cAI/B,MAAM,GAAG,UAAU;YAOrB,MAAM,EAAE;EAGhB,CAAC;AAEH,eAAe,oBAAoB,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { ErrorFactory } from '../../exceptions/ZintrustError';
2
+ import { ConsoleDriver } from './drivers/Console';
3
+ import { TermiiDriver } from './drivers/Termii';
4
+ const drivers = new Map();
5
+ drivers.set('termii', TermiiDriver);
6
+ drivers.set('console', ConsoleDriver);
7
+ export const NotificationRegistry = Object.freeze({
8
+ register(name, driver) {
9
+ drivers.set(name.toLowerCase(), driver);
10
+ },
11
+ get(name) {
12
+ const key = (name ?? '').toString().trim().toLowerCase();
13
+ const drv = drivers.get(key);
14
+ if (!drv)
15
+ throw ErrorFactory.createConfigError(`Notification driver not registered: ${name}`);
16
+ return drv;
17
+ },
18
+ list() {
19
+ return Array.from(drivers.keys()).sort((a, b) => a.localeCompare(b));
20
+ },
21
+ });
22
+ export default NotificationRegistry;
@@ -0,0 +1,6 @@
1
+ export declare const NotificationService: Readonly<{
2
+ send(recipient: string, message: string, options?: Record<string, unknown>): Promise<unknown>;
3
+ listDrivers(): string[];
4
+ }>;
5
+ export default NotificationService;
6
+ //# sourceMappingURL=Service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Service.d.ts","sourceRoot":"","sources":["../../../../src/tools/notification/Service.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,mBAAmB;oBACR,MAAM,WAAW,MAAM,YAAW,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;mBAYhE,MAAM,EAAE;EAGvB,CAAC;AAEH,eAAe,mBAAmB,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { ErrorFactory } from '../../exceptions/ZintrustError';
2
+ import { NotificationConfig } from './config';
3
+ import { NotificationRegistry } from './Registry';
4
+ export const NotificationService = Object.freeze({
5
+ async send(recipient, message, options = {}) {
6
+ if (!recipient || typeof recipient !== 'string')
7
+ throw ErrorFactory.createValidationError('Recipient required');
8
+ if (!message || typeof message !== 'string')
9
+ throw ErrorFactory.createValidationError('Message required');
10
+ const driverName = NotificationConfig.getDriver();
11
+ const driver = NotificationRegistry.get(driverName);
12
+ return driver.send(recipient, message, options);
13
+ },
14
+ listDrivers() {
15
+ return NotificationRegistry.list();
16
+ },
17
+ });
18
+ export default NotificationService;
@@ -0,0 +1,5 @@
1
+ export declare const NotificationConfig: Readonly<{
2
+ getDriver: () => string;
3
+ }>;
4
+ export default NotificationConfig;
5
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../src/tools/notification/config.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,kBAAkB;qBACd,MAAM;EACrB,CAAC;AAEH,eAAe,kBAAkB,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { Env } from '../../config/env';
2
+ export const NotificationConfig = Object.freeze({
3
+ getDriver: () => Env.get('NOTIFICATION_DRIVER', 'console').trim().toLowerCase(),
4
+ });
5
+ export default NotificationConfig;
@@ -0,0 +1,5 @@
1
+ export declare const BaseDriver: Readonly<{
2
+ send(): Promise<unknown>;
3
+ }>;
4
+ export default BaseDriver;
5
+ //# sourceMappingURL=BaseDriver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseDriver.d.ts","sourceRoot":"","sources":["../../../../../src/tools/notification/drivers/BaseDriver.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,UAAU;YACP,OAAO,CAAC,OAAO,CAAC;EAI9B,CAAC;AAEH,eAAe,UAAU,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { ErrorFactory } from '../../../exceptions/ZintrustError';
2
+ export const BaseDriver = Object.freeze({
3
+ async send() {
4
+ await Promise.resolve();
5
+ throw ErrorFactory.createConfigError('Notification driver must implement send()');
6
+ },
7
+ });
8
+ export default BaseDriver;
@@ -0,0 +1,7 @@
1
+ export declare const ConsoleDriver: Readonly<{
2
+ send(_recipient: string, _message: string, _options?: Record<string, unknown>): Promise<{
3
+ ok: boolean;
4
+ }>;
5
+ }>;
6
+ export default ConsoleDriver;
7
+ //# sourceMappingURL=Console.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Console.d.ts","sourceRoot":"","sources":["../../../../../src/tools/notification/drivers/Console.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,aAAa;qBAEV,MAAM,YACR,MAAM,aACN,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAA;KAAE,CAAC;EAU3B,CAAC;AAEH,eAAe,aAAa,CAAC"}
@@ -0,0 +1,13 @@
1
+ export const ConsoleDriver = Object.freeze({
2
+ async send(_recipient, _message, _options = {}) {
3
+ // Console driver is for development & simple systems — it should not throw
4
+ // Keep implementation minimal and synchronous-friendly
5
+ // Use out of band logging via ErrorHandler/Logger if required by callers
6
+ // Here we simply return a small payload indicating success
7
+ // Example: { ok: true }
8
+ // NOTE: keep body small to avoid leaking test runner logs
9
+ await Promise.resolve();
10
+ return { ok: true };
11
+ },
12
+ });
13
+ export default ConsoleDriver;
@@ -0,0 +1,16 @@
1
+ export type SlackConfig = {
2
+ webhookUrl: string;
3
+ };
4
+ export type SlackMessage = Record<string, unknown>;
5
+ export declare const SlackDriver: Readonly<{
6
+ send(config: SlackConfig, payload: SlackMessage): Promise<{
7
+ ok: boolean;
8
+ status?: number;
9
+ }>;
10
+ }>;
11
+ export declare const sendSlackWebhook: (config: SlackConfig, payload: SlackMessage) => Promise<{
12
+ ok: boolean;
13
+ status?: number;
14
+ }>;
15
+ export default SlackDriver;
16
+ //# sourceMappingURL=Slack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Slack.d.ts","sourceRoot":"","sources":["../../../../../src/tools/notification/drivers/Slack.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,WAAW,GAAG;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEnD,eAAO,MAAM,WAAW;iBAEZ,WAAW,WACV,YAAY,GACpB,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;EAsB5C,CAAC;AAEH,eAAO,MAAM,gBAAgB,GAC3B,QAAQ,WAAW,EACnB,SAAS,YAAY,KACpB,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAsC,CAAC;AAElF,eAAe,WAAW,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { ErrorFactory } from '../../../exceptions/ZintrustError';
2
+ export const SlackDriver = Object.freeze({
3
+ async send(config, payload) {
4
+ const url = config.webhookUrl ?? '';
5
+ if (typeof url !== 'string' || url.trim() === '') {
6
+ throw ErrorFactory.createConfigError('Slack: missing webhook URL');
7
+ }
8
+ const res = await fetch(url, {
9
+ method: 'POST',
10
+ headers: { 'content-type': 'application/json' },
11
+ body: JSON.stringify(payload),
12
+ });
13
+ if (!res.ok) {
14
+ const text = await res.text();
15
+ throw ErrorFactory.createConnectionError(`Slack webhook failed (${res.status})`, {
16
+ status: res.status,
17
+ body: text,
18
+ });
19
+ }
20
+ return { ok: true, status: res.status };
21
+ },
22
+ });
23
+ export const sendSlackWebhook = async (config, payload) => SlackDriver.send(config, payload);
24
+ export default SlackDriver;
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Termii SMS Driver (skeleton)
3
+ * - Reads TERMII_API_KEY and TERMII_SENDER from env
4
+ * - POSTs to Termii API endpoint
5
+ */
6
+ export declare const TermiiDriver: Readonly<{
7
+ send(recipient: string, message: string, options?: Record<string, unknown>): Promise<unknown>;
8
+ }>;
9
+ export default TermiiDriver;
10
+ //# sourceMappingURL=Termii.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Termii.d.ts","sourceRoot":"","sources":["../../../../../src/tools/notification/drivers/Termii.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,eAAO,MAAM,YAAY;oBACD,MAAM,WAAW,MAAM,YAAW,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;EA6C/E,CAAC;AAEH,eAAe,YAAY,CAAC"}
@@ -0,0 +1,47 @@
1
+ import { ErrorFactory } from '../../../exceptions/ZintrustError';
2
+ /**
3
+ * Termii SMS Driver (skeleton)
4
+ * - Reads TERMII_API_KEY and TERMII_SENDER from env
5
+ * - POSTs to Termii API endpoint
6
+ */
7
+ export const TermiiDriver = Object.freeze({
8
+ async send(recipient, message, options = {}) {
9
+ if (!recipient || typeof recipient !== 'string') {
10
+ throw ErrorFactory.createValidationError('Recipient phone number is required');
11
+ }
12
+ if (!message || typeof message !== 'string') {
13
+ throw ErrorFactory.createValidationError('Message body is required');
14
+ }
15
+ const apiKey = process.env['TERMII_API_KEY'] ?? '';
16
+ const sender = process.env['TERMII_SENDER'] ?? 'Zintrust';
17
+ if (!apiKey) {
18
+ throw ErrorFactory.createConfigError('TERMII_API_KEY is not configured');
19
+ }
20
+ const payload = {
21
+ to: recipient,
22
+ from: sender,
23
+ sms: message,
24
+ api_key: apiKey,
25
+ ...options,
26
+ };
27
+ // Use global fetch — tests will mock this
28
+ const url = 'https://api.termii.com/sms/send';
29
+ const res = await globalThis.fetch(url, {
30
+ method: 'POST',
31
+ headers: {
32
+ 'Content-Type': 'application/json',
33
+ },
34
+ body: JSON.stringify(payload),
35
+ });
36
+ if (!res.ok) {
37
+ const txt = await res.text().catch(() => '');
38
+ throw ErrorFactory.createTryCatchError(`Termii request failed (${res.status})`, {
39
+ status: res.status,
40
+ body: txt,
41
+ });
42
+ }
43
+ const json = await res.json().catch(() => ({}));
44
+ return json;
45
+ },
46
+ });
47
+ export default TermiiDriver;
@@ -0,0 +1,21 @@
1
+ export type TwilioConfig = {
2
+ accountSid: string;
3
+ authToken: string;
4
+ from: string;
5
+ };
6
+ export type TwilioMessage = {
7
+ to: string;
8
+ body: string;
9
+ };
10
+ export declare const TwilioDriver: Readonly<{
11
+ send(config: TwilioConfig, payload: TwilioMessage): Promise<{
12
+ ok: boolean;
13
+ status?: number;
14
+ }>;
15
+ }>;
16
+ export declare const sendSms: (config: TwilioConfig, payload: TwilioMessage) => Promise<{
17
+ ok: boolean;
18
+ status?: number;
19
+ }>;
20
+ export default TwilioDriver;
21
+ //# sourceMappingURL=Twilio.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Twilio.d.ts","sourceRoot":"","sources":["../../../../../src/tools/notification/drivers/Twilio.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,YAAY,GAAG;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAOF,eAAO,MAAM,YAAY;iBAEb,YAAY,WACX,aAAa,GACrB,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;EA+C5C,CAAC;AAEH,eAAO,MAAM,OAAO,GAClB,QAAQ,YAAY,EACpB,SAAS,aAAa,KACrB,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAuC,CAAC;AAEnF,eAAe,YAAY,CAAC"}
@@ -0,0 +1,48 @@
1
+ import { ErrorFactory } from '../../../exceptions/ZintrustError';
2
+ const buildUrl = (accountSid) => {
3
+ const base = 'https://api.twilio.com/2010-04-01/Accounts/';
4
+ return `${base}${accountSid}/Messages.json`;
5
+ };
6
+ export const TwilioDriver = Object.freeze({
7
+ async send(config, payload) {
8
+ const accountSid = config.accountSid ?? '';
9
+ const authToken = config.authToken ?? '';
10
+ const from = config.from ?? '';
11
+ if (typeof accountSid !== 'string' || accountSid.trim() === '') {
12
+ throw ErrorFactory.createConfigError('Twilio: missing accountSid');
13
+ }
14
+ if (typeof authToken !== 'string' || authToken.trim() === '') {
15
+ throw ErrorFactory.createConfigError('Twilio: missing authToken');
16
+ }
17
+ if (typeof from !== 'string' || from.trim() === '') {
18
+ throw ErrorFactory.createConfigError('Twilio: missing from number');
19
+ }
20
+ if (typeof payload.to !== 'string' || payload.to.trim() === '') {
21
+ throw ErrorFactory.createValidationError('Twilio: missing to number');
22
+ }
23
+ const url = buildUrl(accountSid);
24
+ const params = new URLSearchParams();
25
+ params.append('To', payload.to);
26
+ params.append('From', from);
27
+ params.append('Body', payload.body);
28
+ const basic = Buffer.from(`${accountSid}:${authToken}`).toString('base64');
29
+ const res = await fetch(url, {
30
+ method: 'POST',
31
+ headers: {
32
+ Authorization: `Basic ${basic}`,
33
+ 'content-type': 'application/x-www-form-urlencoded',
34
+ },
35
+ body: params.toString(),
36
+ });
37
+ if (!res.ok) {
38
+ const body = await res.text();
39
+ throw ErrorFactory.createConnectionError(`Twilio API failed (${res.status})`, {
40
+ status: res.status,
41
+ body,
42
+ });
43
+ }
44
+ return { ok: true, status: res.status };
45
+ },
46
+ });
47
+ export const sendSms = async (config, payload) => TwilioDriver.send(config, payload);
48
+ export default TwilioDriver;
@@ -0,0 +1,15 @@
1
+ export declare const loadTemplate: (name: string) => {
2
+ subject?: string;
3
+ content: string;
4
+ variables?: string[];
5
+ };
6
+ export { listTemplates, renderTemplate } from '../../templates/markdown/registry';
7
+ declare const _default: {
8
+ loadTemplate: (name: string) => {
9
+ subject?: string;
10
+ content: string;
11
+ variables?: string[];
12
+ };
13
+ };
14
+ export default _default;
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/tools/notification/templates/markdown/index.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,YAAY,GACvB,MAAM,MAAM,KACX;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;CAuC3D,CAAC;AAEF,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,2CAA2C,CAAC;;yBA1ClF,MAAM,KACX;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE;;AA2C9D,wBAAgC"}
@@ -0,0 +1,38 @@
1
+ import { readFileSync } from '../../../../node-singletons/fs';
2
+ import { join } from '../../../../node-singletons/path';
3
+ export const loadTemplate = (name) => {
4
+ const parts = name.split('/');
5
+ const dir = join(process.cwd(), 'src', 'tools', 'notification', 'templates', 'markdown', ...parts.slice(0, -1));
6
+ const leaf = parts.at(-1) ?? '';
7
+ const filePath = join(dir, `${leaf}.md`);
8
+ const raw = readFileSync(filePath, 'utf-8');
9
+ const meta = {};
10
+ const lines = raw.split(/\r?\n/);
11
+ let i = 0;
12
+ for (; i < lines.length; i++) {
13
+ const line = lines[i].trim();
14
+ // Fast path: must look like an HTML comment and contain a colon separator.
15
+ if (!line.startsWith('<!--') || !line.endsWith('-->'))
16
+ break;
17
+ const inner = line.slice(4, -3).trim();
18
+ const colonIndex = inner.indexOf(':');
19
+ if (colonIndex === -1)
20
+ break;
21
+ const key = inner.slice(0, colonIndex).trim().toLowerCase();
22
+ const val = inner.slice(colonIndex + 1).trim();
23
+ if (!key)
24
+ break;
25
+ if (key === 'subject')
26
+ meta.subject = val;
27
+ if (key === 'variables') {
28
+ meta.variables = val
29
+ .split(',')
30
+ .map((s) => s.trim())
31
+ .filter(Boolean);
32
+ }
33
+ }
34
+ const content = lines.slice(i).join('\n').trim();
35
+ return { content, ...meta };
36
+ };
37
+ export { listTemplates, renderTemplate } from '../../templates/markdown/registry';
38
+ export default { loadTemplate };
@@ -0,0 +1,15 @@
1
+ import { loadTemplate } from '../../templates/markdown';
2
+ export declare const listTemplates: () => string[];
3
+ export declare const renderTemplate: (name: string, vars?: Record<string, unknown>) => {
4
+ html: string;
5
+ meta: ReturnType<typeof loadTemplate>;
6
+ };
7
+ declare const _default: {
8
+ listTemplates: () => string[];
9
+ renderTemplate: (name: string, vars?: Record<string, unknown>) => {
10
+ html: string;
11
+ meta: ReturnType<typeof loadTemplate>;
12
+ };
13
+ };
14
+ export default _default;
15
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../../../../src/tools/notification/templates/markdown/registry.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAwBhE,eAAO,MAAM,aAAa,QAAO,MAAM,EAEtC,CAAC;AAIF,eAAO,MAAM,cAAc,GACzB,MAAM,MAAM,EACZ,OAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,KACjC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,CAAA;CAOvD,CAAC;;yBAhB+B,MAAM,EAAE;2BAOjC,MAAM,SACN,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC5B;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,CAAA;KAAE;;AAS1D,wBAAiD"}
@@ -0,0 +1,36 @@
1
+ import { readdirSync, statSync } from '../../../../node-singletons/fs';
2
+ import { join, relative } from '../../../../node-singletons/path';
3
+ import { loadTemplate } from '../../templates/markdown';
4
+ import { MarkdownRenderer } from '../../../templates';
5
+ const BASE = join(process.cwd(), 'src', 'tools', 'notification', 'templates', 'markdown');
6
+ const walkDir = (dir, base = dir) => {
7
+ const entries = readdirSync(dir);
8
+ let files = [];
9
+ for (const e of entries) {
10
+ const p = join(dir, e);
11
+ const s = statSync(p);
12
+ if (s.isDirectory()) {
13
+ files = files.concat(walkDir(p, base));
14
+ continue;
15
+ }
16
+ if (e.endsWith('.md')) {
17
+ const rel = relative(base, p).replaceAll('\\', '/');
18
+ const withoutExt = rel.toLowerCase().endsWith('.md') ? rel.slice(0, -3) : rel;
19
+ files.push(withoutExt);
20
+ }
21
+ }
22
+ return files;
23
+ };
24
+ export const listTemplates = () => {
25
+ return walkDir(BASE);
26
+ };
27
+ import { ErrorFactory } from '../../../../exceptions/ZintrustError';
28
+ export const renderTemplate = (name, vars = {}) => {
29
+ const tpl = loadTemplate(name);
30
+ // Basic validation: subject required
31
+ if (tpl.subject === null || tpl.subject === undefined || tpl.subject.trim() === '')
32
+ throw ErrorFactory.createValidationError('Notification template missing subject', { name });
33
+ const html = MarkdownRenderer.render(tpl.content, vars);
34
+ return { html, meta: tpl };
35
+ };
36
+ export default { listTemplates, renderTemplate };
@@ -0,0 +1,19 @@
1
+ type SentRecord = {
2
+ provider: string;
3
+ payload: unknown;
4
+ config: unknown;
5
+ };
6
+ export declare const NotificationFake: Readonly<{
7
+ _sent: Array<SentRecord>;
8
+ send(provider: string, config: unknown, payload: unknown): Promise<{
9
+ ok: boolean;
10
+ }>;
11
+ assertSent(predicate: (r: SentRecord) => boolean): void;
12
+ assertNotSent(predicate: (r: SentRecord) => boolean): void;
13
+ assertSentCount(expected: number): void;
14
+ getSent(): Array<SentRecord>;
15
+ lastSent(): SentRecord | undefined;
16
+ reset(): void;
17
+ }>;
18
+ export default NotificationFake;
19
+ //# sourceMappingURL=testing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../../../../src/tools/notification/testing.ts"],"names":[],"mappings":"AAEA,KAAK,UAAU,GAAG;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,eAAO,MAAM,gBAAgB;WACd,KAAK,CAAC,UAAU,CAAC;mBAET,MAAM,UAAU,OAAO,WAAW,OAAO,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAA;KAAE,CAAC;0BAMnE,CAAC,CAAC,EAAE,UAAU,KAAK,OAAO;6BAKvB,CAAC,CAAC,EAAE,UAAU,KAAK,OAAO;8BAKzB,MAAM;eASrB,KAAK,CAAC,UAAU,CAAC;gBAIhB,UAAU,GAAG,SAAS;;EAOlC,CAAC;AAEH,eAAe,gBAAgB,CAAC"}
@@ -0,0 +1,35 @@
1
+ import { ErrorFactory } from '../../exceptions/ZintrustError';
2
+ export const NotificationFake = Object.freeze({
3
+ _sent: [],
4
+ async send(provider, config, payload) {
5
+ this._sent.push({ provider, config, payload });
6
+ await Promise.resolve();
7
+ return { ok: true };
8
+ },
9
+ assertSent(predicate) {
10
+ if (!this._sent.some(predicate))
11
+ throw ErrorFactory.createValidationError('Expected notification to be sent');
12
+ },
13
+ assertNotSent(predicate) {
14
+ if (this._sent.some(predicate))
15
+ throw ErrorFactory.createValidationError('Expected notification to NOT be sent');
16
+ },
17
+ assertSentCount(expected) {
18
+ if (this._sent.length !== expected) {
19
+ throw ErrorFactory.createValidationError('Unexpected notification send count', {
20
+ expected,
21
+ actual: this._sent.length,
22
+ });
23
+ }
24
+ },
25
+ getSent() {
26
+ return [...this._sent];
27
+ },
28
+ lastSent() {
29
+ return this._sent.length > 0 ? this._sent.at(-1) : undefined;
30
+ },
31
+ reset() {
32
+ this._sent.length = 0;
33
+ },
34
+ });
35
+ export default NotificationFake;
@@ -0,0 +1,12 @@
1
+ export declare const useFakeDriver: (name?: string, fake?: unknown) => {
2
+ driverName: string;
3
+ restore: () => void;
4
+ };
5
+ declare const _default: {
6
+ useFakeDriver: (name?: string, fake?: unknown) => {
7
+ driverName: string;
8
+ restore: () => void;
9
+ };
10
+ };
11
+ export default _default;
12
+ //# sourceMappingURL=testingHelpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testingHelpers.d.ts","sourceRoot":"","sources":["../../../../src/tools/notification/testingHelpers.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,aAAa,GACxB,aAA0B,EAC1B,OAAM,OAA0B,KAC/B;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,IAAI,CAAA;CA2B3C,CAAC;;0CA5BM,OAAO,KACZ;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,IAAI,CAAA;KAAE;;AA6B9C,wBAAiC"}
@@ -0,0 +1,32 @@
1
+ import { NotificationRegistry } from './Registry';
2
+ import NotificationFake from './testing';
3
+ export const useFakeDriver = (name = 'notification-fake', fake = NotificationFake) => {
4
+ let previous;
5
+ try {
6
+ previous = NotificationRegistry.get(name);
7
+ }
8
+ catch {
9
+ previous = undefined;
10
+ }
11
+ const fakeDriver = fake;
12
+ NotificationRegistry.register(name, fakeDriver);
13
+ const prevEnv = process.env['NOTIFICATION_DRIVER'];
14
+ process.env['NOTIFICATION_DRIVER'] = name;
15
+ return {
16
+ driverName: name,
17
+ restore() {
18
+ // Restore previous driver if present, otherwise keep fake registered
19
+ if (previous === undefined) {
20
+ NotificationRegistry.register(name, NotificationFake);
21
+ }
22
+ else {
23
+ NotificationRegistry.register(name, previous);
24
+ }
25
+ if (prevEnv === undefined)
26
+ delete process.env['NOTIFICATION_DRIVER'];
27
+ else
28
+ process.env['NOTIFICATION_DRIVER'] = prevEnv;
29
+ },
30
+ };
31
+ };
32
+ export default { useFakeDriver };
@@ -0,0 +1,23 @@
1
+ export type QueueMessage<T = unknown> = {
2
+ id: string;
3
+ payload: T;
4
+ attempts: number;
5
+ };
6
+ interface IQueueDriver {
7
+ enqueue<T = unknown>(queue: string, payload: T): Promise<string>;
8
+ dequeue<T = unknown>(queue: string): Promise<QueueMessage<T> | undefined>;
9
+ ack(queue: string, id: string): Promise<void>;
10
+ length(queue: string): Promise<number>;
11
+ drain(queue: string): Promise<void>;
12
+ }
13
+ export declare const Queue: Readonly<{
14
+ register(name: string, driver: IQueueDriver): void;
15
+ get(name?: string): IQueueDriver;
16
+ enqueue<T = unknown>(queue: string, payload: T, driverName?: string): Promise<string>;
17
+ dequeue<T = unknown>(queue: string, driverName?: string): Promise<QueueMessage<T> | undefined>;
18
+ ack(queue: string, id: string, driverName?: string): Promise<void>;
19
+ length(queue: string, driverName?: string): Promise<number>;
20
+ drain(queue: string, driverName?: string): Promise<void>;
21
+ }>;
22
+ export default Queue;
23
+ //# sourceMappingURL=Queue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Queue.d.ts","sourceRoot":"","sources":["../../../../src/tools/queue/Queue.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,YAAY,CAAC,CAAC,GAAG,OAAO,IAAI;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,CAAC,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAErF,UAAU,YAAY;IACpB,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACjE,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IAC1E,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACvC,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACrC;AAID,eAAO,MAAM,KAAK;mBACD,MAAM,UAAU,YAAY;eAIhC,MAAM,GAAG,YAAY;YAUlB,CAAC,mBAAmB,MAAM,WAAW,CAAC,eAAe,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAK7E,CAAC,mBACN,MAAM,eACA,MAAM,GAClB,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;eAKtB,MAAM,MAAM,MAAM,eAAe,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;kBAKpD,MAAM,eAAe,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;iBAK9C,MAAM,eAAe,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;EAI9D,CAAC;AAEH,eAAe,KAAK,CAAC"}