@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Http.d.ts","sourceRoot":"","sources":["../../../../src/tools/http/Http.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,EAAsB,KAAK,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAElF,YAAY,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE9D;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,YAAY,CAAC;IACtD,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,YAAY,CAAC;IAC3D,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,YAAY,CAAC;IACnE,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,YAAY,CAAC;IAChE,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,CAAC;IACtC,MAAM,IAAI,YAAY,CAAC;IACvB,MAAM,IAAI,YAAY,CAAC;IACvB,IAAI,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC;CAChC;AAiJD;;;GAGG;AACH,eAAO,MAAM,UAAU;IACrB;;OAEG;aACM,MAAM,GAAG,YAAY;IAI9B;;OAEG;cACO,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,YAAY;IAQ/D;;OAEG;aACM,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,YAAY;IAQ9D;;OAEG;eACQ,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,YAAY;IAQhE;;OAEG;gBACS,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,YAAY;EAOjE,CAAC;AAEH,eAAe,UAAU,CAAC"}
@@ -0,0 +1,171 @@
1
+ /**
2
+ * Http Client - Fluent HTTP request builder
3
+ * Laravel-style HTTP client for making authenticated requests
4
+ *
5
+ * Usage:
6
+ * await HttpClient.get('https://api.example.com/users').withAuth(token).send();
7
+ * await HttpClient.post('https://api.example.com/users', data).withTimeout(5000).send();
8
+ */
9
+ import { Env } from '../../config/env';
10
+ import { Logger } from '../../config/logger';
11
+ import { ErrorFactory } from '../../exceptions/ZintrustError';
12
+ import { createHttpResponse } from './HttpResponse';
13
+ /**
14
+ * Perform the actual request for a given state. Separated to keep the builder small
15
+ */
16
+ async function performRequest(state) {
17
+ const timeout = state.timeout ?? Env.getInt('HTTP_TIMEOUT', 30000);
18
+ const controller = new AbortController();
19
+ let timeoutId;
20
+ if (timeout > 0) {
21
+ timeoutId = globalThis.setTimeout(() => controller.abort(), timeout);
22
+ }
23
+ const buildInit = () => {
24
+ const init = {
25
+ method: state.method,
26
+ headers: state.headers,
27
+ signal: controller.signal,
28
+ };
29
+ if (state.body !== undefined &&
30
+ state.body !== null &&
31
+ ['POST', 'PUT', 'PATCH'].includes(state.method)) {
32
+ init.body = state.body;
33
+ }
34
+ return init;
35
+ };
36
+ try {
37
+ const init = buildInit();
38
+ const startTime = Date.now();
39
+ const response = await globalThis.fetch(state.url, init);
40
+ const responseBody = await response.text();
41
+ const duration = Date.now() - startTime;
42
+ Logger.debug(`HTTP ${state.method} ${state.url}`, {
43
+ status: response.status,
44
+ duration: `${duration}ms`,
45
+ size: responseBody.length,
46
+ });
47
+ return createHttpResponse(response, responseBody);
48
+ }
49
+ catch (error) {
50
+ if (error instanceof Error && error.name === 'AbortError') {
51
+ throw ErrorFactory.createConnectionError(`HTTP request timeout after ${timeout}ms`, {
52
+ url: state.url,
53
+ method: state.method,
54
+ timeout,
55
+ });
56
+ }
57
+ throw ErrorFactory.createTryCatchError(`HTTP request failed: ${error.message}`, {
58
+ url: state.url,
59
+ method: state.method,
60
+ error: error instanceof Error ? error.message : String(error),
61
+ });
62
+ }
63
+ finally {
64
+ if (timeoutId !== undefined) {
65
+ globalThis.clearTimeout(timeoutId);
66
+ }
67
+ }
68
+ }
69
+ /**
70
+ * Create request builder with fluent API
71
+ */
72
+ const createRequestBuilder = (method, url, initialBody) => {
73
+ const state = {
74
+ method,
75
+ url,
76
+ headers: {
77
+ 'User-Agent': 'Zintrust/1.0',
78
+ },
79
+ body: initialBody ? JSON.stringify(initialBody) : undefined,
80
+ };
81
+ const self = {
82
+ withHeader(name, value) {
83
+ state.headers[name] = value;
84
+ return self;
85
+ },
86
+ withHeaders(headers) {
87
+ Object.assign(state.headers, headers);
88
+ return self;
89
+ },
90
+ withAuth(token, scheme = 'Bearer') {
91
+ state.headers['Authorization'] = `${scheme} ${token}`;
92
+ return self;
93
+ },
94
+ withBasicAuth(username, password) {
95
+ const credentials = Buffer.from(`${username}:${password}`).toString('base64');
96
+ state.headers['Authorization'] = `Basic ${credentials}`;
97
+ return self;
98
+ },
99
+ withTimeout(ms) {
100
+ state.timeout = ms;
101
+ return self;
102
+ },
103
+ asJson() {
104
+ state.contentType = 'json';
105
+ state.headers['Content-Type'] = 'application/json';
106
+ return self;
107
+ },
108
+ asForm() {
109
+ state.contentType = 'form';
110
+ state.headers['Content-Type'] = 'application/x-www-form-urlencoded';
111
+ return self;
112
+ },
113
+ async send() {
114
+ return performRequest(state);
115
+ },
116
+ };
117
+ return self;
118
+ };
119
+ /**
120
+ * HTTP Client - Sealed namespace for making HTTP requests
121
+ * Provides Laravel-style fluent API
122
+ */
123
+ export const HttpClient = Object.freeze({
124
+ /**
125
+ * Make GET request
126
+ */
127
+ get(url) {
128
+ return createRequestBuilder('GET', url);
129
+ },
130
+ /**
131
+ * Make POST request
132
+ */
133
+ post(url, data) {
134
+ const builder = createRequestBuilder('POST', url, data);
135
+ if (data) {
136
+ builder.asJson();
137
+ }
138
+ return builder;
139
+ },
140
+ /**
141
+ * Make PUT request
142
+ */
143
+ put(url, data) {
144
+ const builder = createRequestBuilder('PUT', url, data);
145
+ if (data) {
146
+ builder.asJson();
147
+ }
148
+ return builder;
149
+ },
150
+ /**
151
+ * Make PATCH request
152
+ */
153
+ patch(url, data) {
154
+ const builder = createRequestBuilder('PATCH', url, data);
155
+ if (data) {
156
+ builder.asJson();
157
+ }
158
+ return builder;
159
+ },
160
+ /**
161
+ * Make DELETE request
162
+ */
163
+ delete(url, data) {
164
+ const builder = createRequestBuilder('DELETE', url, data);
165
+ if (data) {
166
+ builder.asJson();
167
+ }
168
+ return builder;
169
+ },
170
+ });
171
+ export default HttpClient;
@@ -0,0 +1,32 @@
1
+ /**
2
+ * HttpResponse - Response wrapper with utility methods
3
+ * Provides convenient access to response status, headers, body, and parsed JSON
4
+ */
5
+ /**
6
+ * HTTP Response interface for convenience methods
7
+ */
8
+ export interface IHttpResponse {
9
+ status: number;
10
+ headers: Record<string, string>;
11
+ body: string;
12
+ json<T = unknown>(): T;
13
+ text(): string;
14
+ ok: boolean;
15
+ successful: boolean;
16
+ failed: boolean;
17
+ serverError: boolean;
18
+ clientError: boolean;
19
+ header(name: string): string | undefined;
20
+ hasHeader(name: string): boolean;
21
+ throwIfServerError(): IHttpResponse;
22
+ throwIfClientError(): IHttpResponse;
23
+ }
24
+ /**
25
+ * Create HTTP response from fetch Response
26
+ */
27
+ export declare const createHttpResponse: (response: Response, body: string) => IHttpResponse;
28
+ declare const _default: {
29
+ createHttpResponse: (response: Response, body: string) => IHttpResponse;
30
+ };
31
+ export default _default;
32
+ //# sourceMappingURL=HttpResponse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HttpResponse.d.ts","sourceRoot":"","sources":["../../../../src/tools/http/HttpResponse.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,CAAC,GAAG,OAAO,KAAK,CAAC,CAAC;IACvB,IAAI,IAAI,MAAM,CAAC;IACf,EAAE,EAAE,OAAO,CAAC;IACZ,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IACzC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IACjC,kBAAkB,IAAI,aAAa,CAAC;IACpC,kBAAkB,IAAI,aAAa,CAAC;CACrC;AAED;;GAEG;AACH,eAAO,MAAM,kBAAkB,GAAI,UAAU,QAAQ,EAAE,MAAM,MAAM,KAAG,aAmFrE,CAAC;;mCAnF2C,QAAQ,QAAQ,MAAM,KAAG,aAAa;;AAqFnF,wBAEE"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * HttpResponse - Response wrapper with utility methods
3
+ * Provides convenient access to response status, headers, body, and parsed JSON
4
+ */
5
+ import { ErrorFactory } from '../../exceptions/ZintrustError';
6
+ /**
7
+ * Create HTTP response from fetch Response
8
+ */
9
+ export const createHttpResponse = (response, body) => {
10
+ const statusCode = response.status;
11
+ const headers = Object.fromEntries(response.headers.entries());
12
+ const lowerHeaders = Object.fromEntries(Object.entries(headers).map(([key, value]) => [key.toLowerCase(), value]));
13
+ return {
14
+ get status() {
15
+ return statusCode;
16
+ },
17
+ get headers() {
18
+ return headers;
19
+ },
20
+ get body() {
21
+ return body;
22
+ },
23
+ json() {
24
+ try {
25
+ return JSON.parse(body);
26
+ }
27
+ catch (error) {
28
+ throw ErrorFactory.createValidationError('Failed to parse JSON response', {
29
+ body: body.substring(0, 200), // Truncate for logging
30
+ error: error instanceof Error ? error.message : String(error),
31
+ });
32
+ }
33
+ },
34
+ text() {
35
+ return body;
36
+ },
37
+ get ok() {
38
+ return response.ok;
39
+ },
40
+ get successful() {
41
+ return statusCode >= 200 && statusCode < 300;
42
+ },
43
+ get failed() {
44
+ return !this.successful;
45
+ },
46
+ get serverError() {
47
+ return statusCode >= 500;
48
+ },
49
+ get clientError() {
50
+ return statusCode >= 400 && statusCode < 500;
51
+ },
52
+ header(name) {
53
+ return lowerHeaders[name.toLowerCase()];
54
+ },
55
+ hasHeader(name) {
56
+ return name.toLowerCase() in lowerHeaders;
57
+ },
58
+ throwIfServerError() {
59
+ if (this.serverError) {
60
+ throw ErrorFactory.createTryCatchError(`HTTP server error: ${this.status}`, {
61
+ status: this.status,
62
+ body: this.body.substring(0, 200),
63
+ });
64
+ }
65
+ return this;
66
+ },
67
+ throwIfClientError() {
68
+ if (this.clientError) {
69
+ throw ErrorFactory.createTryCatchError(`HTTP client error: ${this.status}`, {
70
+ status: this.status,
71
+ body: this.body.substring(0, 200),
72
+ });
73
+ }
74
+ return this;
75
+ },
76
+ };
77
+ };
78
+ export default {
79
+ createHttpResponse,
80
+ };
@@ -0,0 +1,15 @@
1
+ /**
2
+ * HTTP Client Tools - Export all HTTP utilities
3
+ */
4
+ declare const _default: Readonly<{
5
+ HttpClient: Readonly<{
6
+ get(url: string): import("./Http").IHttpRequest;
7
+ post(url: string, data?: Record<string, unknown>): import("./Http").IHttpRequest;
8
+ put(url: string, data?: Record<string, unknown>): import("./Http").IHttpRequest;
9
+ patch(url: string, data?: Record<string, unknown>): import("./Http").IHttpRequest;
10
+ delete(url: string, data?: Record<string, unknown>): import("./Http").IHttpRequest;
11
+ }>;
12
+ createHttpResponse: (response: Response, body: string) => import("./HttpResponse").IHttpResponse;
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/http/index.ts"],"names":[],"mappings":"AAAA;;GAEG;;;;;;;;;;;AAKH,wBAGG"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * HTTP Client Tools - Export all HTTP utilities
3
+ */
4
+ import { HttpClient } from './Http';
5
+ import { createHttpResponse } from './HttpResponse';
6
+ export default Object.freeze({
7
+ HttpClient,
8
+ createHttpResponse,
9
+ });
@@ -0,0 +1,22 @@
1
+ import { type AttachmentInput } from './attachments';
2
+ export type SendMailInput = {
3
+ to: string | string[];
4
+ subject: string;
5
+ text: string;
6
+ html?: string;
7
+ from?: {
8
+ address?: string;
9
+ name?: string;
10
+ };
11
+ attachments?: AttachmentInput[];
12
+ };
13
+ export type SendMailResult = {
14
+ ok: boolean;
15
+ driver: 'sendgrid' | 'disabled' | 'smtp' | 'ses' | 'mailgun';
16
+ messageId?: string;
17
+ };
18
+ export declare const Mail: Readonly<{
19
+ send(input: SendMailInput): Promise<SendMailResult>;
20
+ }>;
21
+ export default Mail;
22
+ //# sourceMappingURL=Mail.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Mail.d.ts","sourceRoot":"","sources":["../../../../src/tools/mail/Mail.ts"],"names":[],"mappings":"AAQA,OAAO,EAAsB,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAG7E,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE;QACL,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IACF,WAAW,CAAC,EAAE,eAAe,EAAE,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,UAAU,GAAG,UAAU,GAAG,MAAM,GAAG,KAAK,GAAG,SAAS,CAAC;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAkIF,eAAO,MAAM,IAAI;gBACG,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;EAqBzD,CAAC;AAEH,eAAe,IAAI,CAAC"}
@@ -0,0 +1,105 @@
1
+ import { mailConfig } from '../../config/mail';
2
+ import { ErrorFactory } from '../../exceptions/ZintrustError';
3
+ import { MailgunDriver } from './drivers/Mailgun';
4
+ import { SendGridDriver } from './drivers/SendGrid';
5
+ import { SesDriver } from './drivers/Ses';
6
+ import { SmtpDriver } from './drivers/Smtp';
7
+ import { resolveAttachments } from './attachments';
8
+ import { Storage } from '../storage';
9
+ const resolveFrom = (input) => {
10
+ const address = input?.address ?? mailConfig.from.address;
11
+ const name = input?.name ?? mailConfig.from.name;
12
+ if (address.trim() === '') {
13
+ const err = ErrorFactory.createConfigError('Mail: missing from address (set MAIL_FROM_ADDRESS or pass from.address)');
14
+ throw err;
15
+ }
16
+ return { email: address, name: name.trim() === '' ? undefined : name };
17
+ };
18
+ function assertStorageDiskLike(value) {
19
+ if (typeof value !== 'object' || value === null) {
20
+ const err = ErrorFactory.createConfigError('Storage disk is invalid (expected object)');
21
+ throw err;
22
+ }
23
+ const v = value;
24
+ const driver = v['driver'];
25
+ if (typeof driver !== 'object' || driver === null) {
26
+ const err = ErrorFactory.createConfigError('Storage disk driver is invalid (expected object)');
27
+ throw err;
28
+ }
29
+ const d = driver;
30
+ if (typeof d['get'] !== 'function') {
31
+ const err = ErrorFactory.createConfigError('Storage disk driver is missing get()');
32
+ throw err;
33
+ }
34
+ if (typeof d['exists'] !== 'function') {
35
+ const err = ErrorFactory.createConfigError('Storage disk driver is missing exists()');
36
+ throw err;
37
+ }
38
+ }
39
+ const getDiskSafe = (disk) => {
40
+ const diskValue = Storage.getDisk(disk);
41
+ assertStorageDiskLike(diskValue);
42
+ return diskValue;
43
+ };
44
+ const createStorageWrapper = () => ({
45
+ async get(disk, path) {
46
+ const d = getDiskSafe(disk);
47
+ const result = await Promise.resolve(d.driver.get(d.config, path));
48
+ return result;
49
+ },
50
+ async exists(disk, path) {
51
+ const d = getDiskSafe(disk);
52
+ const result = await Promise.resolve(d.driver.exists(d.config, path));
53
+ return Boolean(result);
54
+ },
55
+ });
56
+ const sendWithDriver = async (driver, message) => {
57
+ if (driver.driver === 'sendgrid') {
58
+ const result = await SendGridDriver.send({ apiKey: driver.apiKey }, message);
59
+ return { ok: result.ok, driver: 'sendgrid', messageId: result.messageId };
60
+ }
61
+ if (driver.driver === 'mailgun') {
62
+ const result = await MailgunDriver.send({ apiKey: driver.apiKey, domain: driver.domain, baseUrl: driver.baseUrl }, message);
63
+ return { ok: result.ok, driver: 'mailgun', messageId: result.messageId };
64
+ }
65
+ if (driver.driver === 'smtp') {
66
+ const result = await SmtpDriver.send({
67
+ host: driver.host,
68
+ port: driver.port,
69
+ username: driver.username,
70
+ password: driver.password,
71
+ secure: driver.secure,
72
+ }, message);
73
+ return { ok: result.ok, driver: 'smtp', messageId: result.messageId };
74
+ }
75
+ if (driver.driver === 'ses') {
76
+ const result = await SesDriver.send({ region: driver.region }, message);
77
+ return { ok: result.ok, driver: 'ses', messageId: result.messageId };
78
+ }
79
+ // Config exists for future drivers, but implementations are intentionally CLI/runtime-safe and added incrementally.
80
+ {
81
+ const err = ErrorFactory.createConfigError(`Mail driver not implemented: ${mailConfig.default}`);
82
+ throw err;
83
+ }
84
+ };
85
+ export const Mail = Object.freeze({
86
+ async send(input) {
87
+ const driver = mailConfig.getDriver();
88
+ if (driver.driver === 'disabled') {
89
+ const err = ErrorFactory.createConfigError('Mail driver is disabled (set MAIL_DRIVER)');
90
+ throw err;
91
+ }
92
+ const from = resolveFrom(input.from);
93
+ const storage = createStorageWrapper();
94
+ const attachments = await resolveAttachments(input.attachments, { storage });
95
+ return sendWithDriver(driver, {
96
+ to: input.to,
97
+ from,
98
+ subject: input.subject,
99
+ text: input.text,
100
+ html: input.html,
101
+ attachments,
102
+ });
103
+ },
104
+ });
105
+ export default Mail;
@@ -0,0 +1,23 @@
1
+ export type DiskAttachment = {
2
+ disk: string;
3
+ path: string;
4
+ filename?: string;
5
+ };
6
+ export type InlineAttachment = {
7
+ content: Buffer | string;
8
+ filename: string;
9
+ };
10
+ export type AttachmentInput = DiskAttachment | InlineAttachment;
11
+ export type ResolvedAttachment = {
12
+ filename: string;
13
+ content: Buffer;
14
+ };
15
+ export type StorageLike = {
16
+ get: (disk: string, path: string) => Promise<Buffer> | Buffer;
17
+ exists?: (disk: string, path: string) => Promise<boolean> | boolean;
18
+ url?: (disk: string, path: string) => string;
19
+ };
20
+ export declare function resolveAttachments(attachments: Array<AttachmentInput> | undefined, options?: {
21
+ storage?: StorageLike;
22
+ }): Promise<ResolvedAttachment[]>;
23
+ //# sourceMappingURL=attachments.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachments.d.ts","sourceRoot":"","sources":["../../../../src/tools/mail/attachments.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,cAAc,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAC/E,MAAM,MAAM,gBAAgB,GAAG;IAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAC9E,MAAM,MAAM,eAAe,GAAG,cAAc,GAAG,gBAAgB,CAAC;AAEhE,MAAM,MAAM,kBAAkB,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvE,MAAM,MAAM,WAAW,GAAG;IACxB,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;IAC9D,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IACpE,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CAC9C,CAAC;AAEF,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,KAAK,CAAC,eAAe,CAAC,GAAG,SAAS,EAC/C,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,WAAW,CAAA;CAAO,GACtC,OAAO,CAAC,kBAAkB,EAAE,CAAC,CA6B/B"}
@@ -0,0 +1,26 @@
1
+ import { ErrorFactory } from '../../exceptions/ZintrustError';
2
+ export async function resolveAttachments(attachments, options = {}) {
3
+ if (!attachments || attachments.length === 0)
4
+ return [];
5
+ const storage = options.storage;
6
+ const resolveOne = async (att) => {
7
+ if ('content' in att) {
8
+ const a = att;
9
+ const content = typeof a.content === 'string' ? Buffer.from(a.content) : a.content;
10
+ return { filename: a.filename, content };
11
+ }
12
+ // Disk-based attachment
13
+ const d = att;
14
+ if (!storage) {
15
+ throw ErrorFactory.createValidationError('Storage is required to resolve disk attachments');
16
+ }
17
+ const exists = storage.exists ? await Promise.resolve(storage.exists(d.disk, d.path)) : true;
18
+ if (!exists) {
19
+ throw ErrorFactory.createNotFoundError(`Attachment not found: ${d.disk}:${d.path}`);
20
+ }
21
+ const content = await Promise.resolve(storage.get(d.disk, d.path));
22
+ const filename = d.filename ?? d.path.split('/').pop() ?? 'attachment';
23
+ return { filename, content };
24
+ };
25
+ return Promise.all(attachments.map(resolveOne));
26
+ }
@@ -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/mail/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('Mail driver must implement send()');
6
+ },
7
+ });
8
+ export default BaseDriver;
@@ -0,0 +1,31 @@
1
+ export type MailgunConfig = {
2
+ apiKey: string;
3
+ domain: string;
4
+ baseUrl?: string;
5
+ };
6
+ export type MailAddress = {
7
+ email: string;
8
+ name?: string;
9
+ };
10
+ export type MailAttachment = {
11
+ filename: string;
12
+ content: Buffer;
13
+ };
14
+ export type MailMessage = {
15
+ to: string | string[];
16
+ from: MailAddress;
17
+ subject: string;
18
+ text: string;
19
+ html?: string;
20
+ attachments?: MailAttachment[];
21
+ };
22
+ export type SendResult = {
23
+ ok: boolean;
24
+ provider: 'mailgun';
25
+ messageId?: string;
26
+ };
27
+ export declare const MailgunDriver: Readonly<{
28
+ send(config: MailgunConfig, message: MailMessage): Promise<SendResult>;
29
+ }>;
30
+ export default MailgunDriver;
31
+ //# sourceMappingURL=Mailgun.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Mailgun.d.ts","sourceRoot":"","sources":["../../../../../src/tools/mail/drivers/Mailgun.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnE,MAAM,MAAM,WAAW,GAAG;IACxB,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACtB,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,EAAE,EAAE,OAAO,CAAC;IACZ,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AA2CF,eAAO,MAAM,aAAa;iBACL,aAAa,WAAW,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;EAuD5E,CAAC;AAEH,eAAe,aAAa,CAAC"}
@@ -0,0 +1,81 @@
1
+ import { ErrorFactory } from '../../../exceptions/ZintrustError';
2
+ const normalizeRecipients = (to) => (Array.isArray(to) ? to : [to]);
3
+ const base64 = (value) => Buffer.from(value, 'utf8').toString('base64');
4
+ const toArrayBuffer = (buf) => {
5
+ const ab = new ArrayBuffer(buf.byteLength);
6
+ new Uint8Array(ab).set(buf);
7
+ return ab;
8
+ };
9
+ const normalizeBaseUrl = (value) => {
10
+ let v = (value ?? '').trim();
11
+ if (v === '')
12
+ return 'https://api.mailgun.net';
13
+ // Avoid regex backtracking (Sonar S5852) by trimming trailing slashes in linear time.
14
+ while (v.endsWith('/'))
15
+ v = v.slice(0, -1);
16
+ return v;
17
+ };
18
+ const ensureConfig = (config) => {
19
+ const apiKey = (config.apiKey ?? '').trim();
20
+ const domain = (config.domain ?? '').trim();
21
+ const baseUrl = normalizeBaseUrl(config.baseUrl);
22
+ if (apiKey === '')
23
+ throw ErrorFactory.createConfigError('Mailgun: missing MAILGUN_API_KEY');
24
+ if (domain === '')
25
+ throw ErrorFactory.createConfigError('Mailgun: missing MAILGUN_DOMAIN');
26
+ return { apiKey, domain, baseUrl };
27
+ };
28
+ const ensureMessage = (message) => {
29
+ if (message.from.email.trim() === '') {
30
+ throw ErrorFactory.createConfigError('Mail: missing from.email');
31
+ }
32
+ };
33
+ export const MailgunDriver = Object.freeze({
34
+ async send(config, message) {
35
+ const { apiKey, domain, baseUrl } = ensureConfig(config);
36
+ ensureMessage(message);
37
+ const url = `${baseUrl}/v3/${encodeURIComponent(domain)}/messages`;
38
+ const form = new FormData();
39
+ const fromName = (message.from.name ?? '').trim();
40
+ const from = fromName === '' ? message.from.email : `${fromName} <${message.from.email}>`;
41
+ form.set('from', from);
42
+ form.set('to', normalizeRecipients(message.to).join(','));
43
+ form.set('subject', message.subject);
44
+ form.set('text', message.text);
45
+ if (typeof message.html === 'string' && message.html !== '') {
46
+ form.set('html', message.html);
47
+ }
48
+ if (message.attachments && message.attachments.length > 0) {
49
+ for (const a of message.attachments) {
50
+ // In Node.js, Buffer is a Uint8Array, which works as a BlobPart.
51
+ // In other runtimes, callers typically won't supply Buffer attachments.
52
+ const blob = new Blob([toArrayBuffer(a.content)]);
53
+ form.append('attachment', blob, a.filename);
54
+ }
55
+ }
56
+ const auth = `Basic ${base64('api:' + apiKey)}`;
57
+ const res = await fetch(url, {
58
+ method: 'POST',
59
+ headers: {
60
+ Authorization: auth,
61
+ },
62
+ body: form,
63
+ });
64
+ if (res.ok) {
65
+ try {
66
+ const json = (await res.json());
67
+ const id = typeof json?.['id'] === 'string' ? json['id'] : undefined;
68
+ return { ok: true, provider: 'mailgun', messageId: id };
69
+ }
70
+ catch {
71
+ return { ok: true, provider: 'mailgun' };
72
+ }
73
+ }
74
+ const text = await res.text();
75
+ throw ErrorFactory.createConnectionError(`Mailgun send failed (${res.status})`, {
76
+ status: res.status,
77
+ body: text,
78
+ });
79
+ },
80
+ });
81
+ export default MailgunDriver;