@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,29 @@
1
+ export type SendGridConfig = {
2
+ apiKey: string;
3
+ };
4
+ export type MailAddress = {
5
+ email: string;
6
+ name?: string;
7
+ };
8
+ export type MailAttachment = {
9
+ filename: string;
10
+ content: Buffer;
11
+ };
12
+ export type MailMessage = {
13
+ to: string | string[];
14
+ from: MailAddress;
15
+ subject: string;
16
+ text: string;
17
+ html?: string;
18
+ attachments?: MailAttachment[];
19
+ };
20
+ export type SendResult = {
21
+ ok: boolean;
22
+ provider: 'sendgrid';
23
+ messageId?: string;
24
+ };
25
+ export declare const SendGridDriver: Readonly<{
26
+ send(config: SendGridConfig, message: MailMessage): Promise<SendResult>;
27
+ }>;
28
+ export default SendGridDriver;
29
+ //# sourceMappingURL=SendGrid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SendGrid.d.ts","sourceRoot":"","sources":["../../../../../src/tools/mail/drivers/SendGrid.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,MAAM,CAAC;CAChB,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,UAAU,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAIF,eAAO,MAAM,cAAc;iBACN,cAAc,WAAW,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;EAoE7E,CAAC;AAEH,eAAe,cAAc,CAAC"}
@@ -0,0 +1,57 @@
1
+ import { ErrorFactory } from '../../../exceptions/ZintrustError';
2
+ const normalizeRecipients = (to) => (Array.isArray(to) ? to : [to]);
3
+ export const SendGridDriver = Object.freeze({
4
+ async send(config, message) {
5
+ if (config.apiKey.trim() === '') {
6
+ throw ErrorFactory.createConfigError('SendGrid: missing SENDGRID_API_KEY');
7
+ }
8
+ if (message.from.email.trim() === '') {
9
+ throw ErrorFactory.createConfigError('Mail: missing from.email');
10
+ }
11
+ const personalizations = [
12
+ {
13
+ to: normalizeRecipients(message.to).map((email) => ({ email })),
14
+ },
15
+ ];
16
+ const content = [
17
+ { type: 'text/plain', value: message.text },
18
+ ];
19
+ if (typeof message.html === 'string' && message.html !== '') {
20
+ content.push({ type: 'text/html', value: message.html });
21
+ }
22
+ const body = {
23
+ personalizations,
24
+ from: {
25
+ email: message.from.email,
26
+ name: message.from.name?.trim() === '' ? undefined : message.from.name,
27
+ },
28
+ subject: message.subject,
29
+ content,
30
+ };
31
+ if (message.attachments && message.attachments.length > 0) {
32
+ body.attachments = message.attachments.map((a) => ({
33
+ content: a.content.toString('base64'),
34
+ filename: a.filename,
35
+ }));
36
+ }
37
+ const res = await fetch('https://api.sendgrid.com/v3/mail/send', {
38
+ method: 'POST',
39
+ headers: {
40
+ Authorization: `Bearer ${config.apiKey}`,
41
+ 'content-type': 'application/json',
42
+ },
43
+ body: JSON.stringify(body),
44
+ });
45
+ // SendGrid typically returns 202 for success.
46
+ if (res.status === 202) {
47
+ const messageId = res.headers.get('x-message-id') ?? undefined;
48
+ return { ok: true, provider: 'sendgrid', messageId };
49
+ }
50
+ const text = await res.text();
51
+ throw ErrorFactory.createConnectionError(`SendGrid send failed (${res.status})`, {
52
+ status: res.status,
53
+ body: text,
54
+ });
55
+ },
56
+ });
57
+ export default SendGridDriver;
@@ -0,0 +1,24 @@
1
+ export type SesConfig = {
2
+ region: string;
3
+ };
4
+ export type MailAddress = {
5
+ email: string;
6
+ name?: string;
7
+ };
8
+ export type MailMessage = {
9
+ to: string | string[];
10
+ from: MailAddress;
11
+ subject: string;
12
+ text: string;
13
+ html?: string;
14
+ };
15
+ export type SendResult = {
16
+ ok: boolean;
17
+ provider: 'ses';
18
+ messageId?: string;
19
+ };
20
+ export declare const SesDriver: Readonly<{
21
+ send(config: SesConfig, message: MailMessage): Promise<SendResult>;
22
+ }>;
23
+ export default SesDriver;
24
+ //# sourceMappingURL=Ses.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Ses.d.ts","sourceRoot":"","sources":["../../../../../src/tools/mail/drivers/Ses.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,SAAS,GAAG;IACtB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,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;CACf,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,EAAE,EAAE,OAAO,CAAC;IACZ,QAAQ,EAAE,KAAK,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAsGF,eAAO,MAAM,SAAS;iBACD,SAAS,WAAW,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;EAgDxE,CAAC;AAEH,eAAe,SAAS,CAAC"}
@@ -0,0 +1,116 @@
1
+ import { AwsSigV4 } from '../../../common/index';
2
+ import { ErrorFactory } from '../../../exceptions/ZintrustError';
3
+ const sha256Hex = (data) => AwsSigV4.sha256Hex(data);
4
+ const buildAuthorization = (params) => {
5
+ const canonicalUri = params.path;
6
+ const canonicalQueryString = '';
7
+ const headers = {
8
+ 'content-type': 'application/json',
9
+ host: params.host,
10
+ 'x-amz-date': params.amzDate,
11
+ };
12
+ if (params.credentials.sessionToken !== null && params.credentials.sessionToken !== undefined) {
13
+ headers['x-amz-security-token'] = params.credentials.sessionToken;
14
+ }
15
+ const payloadHash = sha256Hex(params.body);
16
+ return AwsSigV4.buildAuthorization({
17
+ method: params.method,
18
+ canonicalUri,
19
+ canonicalQueryString,
20
+ headers,
21
+ payloadHash,
22
+ region: params.region,
23
+ service: 'ses',
24
+ amzDate: params.amzDate,
25
+ dateStamp: params.dateStamp,
26
+ credentials: params.credentials,
27
+ });
28
+ };
29
+ const ensureRegion = (config) => {
30
+ const region = typeof config.region === 'string' ? config.region.trim() : '';
31
+ if (region === '')
32
+ throw ErrorFactory.createConfigError('SES: missing region in config');
33
+ return region;
34
+ };
35
+ const ensureCredentials = () => {
36
+ const accessKeyId = process.env['AWS_ACCESS_KEY_ID'] ?? '';
37
+ const secretAccessKey = process.env['AWS_SECRET_ACCESS_KEY'] ?? '';
38
+ const sessionToken = process.env['AWS_SESSION_TOKEN'] ?? undefined;
39
+ if (accessKeyId.trim() === '' || secretAccessKey.trim() === '') {
40
+ throw ErrorFactory.createConfigError('SES: missing AWS credentials (set AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY)');
41
+ }
42
+ return { accessKeyId, secretAccessKey, sessionToken };
43
+ };
44
+ const buildBody = (message) => {
45
+ const toAddresses = Array.isArray(message.to) ? message.to : [message.to];
46
+ const body = {
47
+ FromEmailAddress: message.from.email,
48
+ Destination: { ToAddresses: toAddresses },
49
+ Content: {
50
+ Simple: {
51
+ Subject: { Data: message.subject },
52
+ Body: {
53
+ Text: { Data: message.text },
54
+ ...(typeof message.html === 'string' && message.html !== ''
55
+ ? { Html: { Data: message.html } }
56
+ : {}),
57
+ },
58
+ },
59
+ },
60
+ };
61
+ return JSON.stringify(body);
62
+ };
63
+ const buildHeaders = (amzDate, authorization, sessionToken) => {
64
+ const headers = {
65
+ 'content-type': 'application/json',
66
+ 'x-amz-date': amzDate,
67
+ Authorization: authorization,
68
+ };
69
+ if (typeof sessionToken === 'string' && sessionToken !== '')
70
+ headers['x-amz-security-token'] = sessionToken;
71
+ return headers;
72
+ };
73
+ export const SesDriver = Object.freeze({
74
+ async send(config, message) {
75
+ const region = ensureRegion(config);
76
+ const { accessKeyId, secretAccessKey, sessionToken } = ensureCredentials();
77
+ const bodyJson = buildBody(message);
78
+ const host = `email.${region}.amazonaws.com`;
79
+ const path = '/v2/email/outbound-emails';
80
+ const url = `https://${host}${path}`;
81
+ const now = new Date();
82
+ const { amzDate, dateStamp } = AwsSigV4.toAmzDate(now);
83
+ const { authorization } = buildAuthorization({
84
+ method: 'POST',
85
+ host: host,
86
+ region,
87
+ amzDate,
88
+ dateStamp,
89
+ credentials: { accessKeyId, secretAccessKey, sessionToken },
90
+ body: bodyJson,
91
+ path,
92
+ });
93
+ const headers = buildHeaders(amzDate, authorization, sessionToken);
94
+ const res = await fetch(url, {
95
+ method: 'POST',
96
+ headers,
97
+ body: bodyJson,
98
+ });
99
+ if (res.ok) {
100
+ try {
101
+ const json = (await res.json());
102
+ const messageId = typeof json?.['MessageId'] === 'string' ? json['MessageId'] : undefined;
103
+ return { ok: true, provider: 'ses', messageId };
104
+ }
105
+ catch {
106
+ return { ok: true, provider: 'ses' };
107
+ }
108
+ }
109
+ const text = await res.text();
110
+ throw ErrorFactory.createConnectionError(`SES send failed (${res.status})`, {
111
+ status: res.status,
112
+ body: text,
113
+ });
114
+ },
115
+ });
116
+ export default SesDriver;
@@ -0,0 +1,38 @@
1
+ export type SmtpConfig = {
2
+ host: string;
3
+ port: number;
4
+ username?: string;
5
+ password?: string;
6
+ secure?: boolean | 'starttls';
7
+ };
8
+ export type MailAddress = {
9
+ email: string;
10
+ name?: string;
11
+ };
12
+ export type MailAttachment = {
13
+ filename: string;
14
+ content: Buffer;
15
+ };
16
+ export type MailMessage = {
17
+ to: string | string[];
18
+ from: MailAddress;
19
+ subject: string;
20
+ text: string;
21
+ html?: string;
22
+ attachments?: MailAttachment[];
23
+ };
24
+ export type SendResult = {
25
+ ok: boolean;
26
+ provider: 'smtp';
27
+ messageId?: string;
28
+ };
29
+ export declare const SmtpDriver: Readonly<{
30
+ /**
31
+ * NOTE: This is a minimal SMTP implementation intended for Node.js runtimes.
32
+ * - `secure=true` means TLS from the start (SMTPS).
33
+ * - `secure='starttls'` performs STARTTLS after EHLO.
34
+ */
35
+ send(config: SmtpConfig, message: MailMessage): Promise<SendResult>;
36
+ }>;
37
+ export default SmtpDriver;
38
+ //# sourceMappingURL=Smtp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Smtp.d.ts","sourceRoot":"","sources":["../../../../../src/tools/mail/drivers/Smtp.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;CAC/B,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,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AA0XF,eAAO,MAAM,UAAU;IACrB;;;;OAIG;iBACgB,UAAU,WAAW,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;EAgDzE,CAAC;AAEH,eAAe,UAAU,CAAC"}
@@ -0,0 +1,327 @@
1
+ import { generateUuid } from '../../../common/uuid';
2
+ import { ErrorFactory } from '../../../exceptions/ZintrustError';
3
+ import * as net from '../../../node-singletons/net';
4
+ import * as tls from '../../../node-singletons/tls';
5
+ const normalizeRecipients = (to) => (Array.isArray(to) ? to : [to]);
6
+ const toBase64 = (value) => Buffer.from(value, 'utf8').toString('base64');
7
+ const isNodeRuntime = () => typeof process !== 'undefined' && typeof process.versions?.node === 'string';
8
+ const validateConfig = (config) => {
9
+ if (!isNodeRuntime()) {
10
+ throw ErrorFactory.createConfigError('SMTP driver requires Node.js runtime');
11
+ }
12
+ if (config.host.trim() === '') {
13
+ throw ErrorFactory.createConfigError('SMTP: missing MAIL_HOST');
14
+ }
15
+ if (!Number.isFinite(config.port) || config.port <= 0) {
16
+ throw ErrorFactory.createConfigError('SMTP: invalid MAIL_PORT');
17
+ }
18
+ };
19
+ const createSocket = async (config, implicitTls) => {
20
+ validateConfig(config);
21
+ return new Promise((resolve, reject) => {
22
+ const onError = (err) => {
23
+ reject(ErrorFactory.createConnectionError('SMTP connection failed', {
24
+ host: config.host,
25
+ port: config.port,
26
+ secure: implicitTls,
27
+ error: err,
28
+ }));
29
+ };
30
+ const socket = implicitTls
31
+ ? tls.connect({
32
+ host: config.host,
33
+ port: config.port,
34
+ servername: config.host,
35
+ })
36
+ : net.connect({ host: config.host, port: config.port });
37
+ if (implicitTls) {
38
+ socket.once('secureConnect', () => resolve(socket));
39
+ }
40
+ else {
41
+ socket.once('connect', () => resolve(socket));
42
+ }
43
+ socket.once('error', onError);
44
+ });
45
+ };
46
+ const upgradeToStartTls = async (socket, host) => {
47
+ return new Promise((resolve, reject) => {
48
+ const tlsSocket = tls.connect({ socket, servername: host });
49
+ tlsSocket.once('secureConnect', () => {
50
+ resolve(tlsSocket);
51
+ });
52
+ tlsSocket.once('error', (err) => {
53
+ reject(ErrorFactory.createConnectionError('SMTP STARTTLS upgrade failed', {
54
+ host,
55
+ error: err,
56
+ }));
57
+ });
58
+ });
59
+ };
60
+ const createLineReader = (socket) => {
61
+ let buffer = '';
62
+ const waiters = [];
63
+ const wake = () => {
64
+ while (waiters.length > 0) {
65
+ const w = waiters.shift();
66
+ if (w)
67
+ w();
68
+ }
69
+ };
70
+ const onData = (data) => {
71
+ buffer += data.toString('utf8');
72
+ wake();
73
+ };
74
+ socket.on('data', onData);
75
+ const tryReadLineFromBuffer = () => {
76
+ const idx = buffer.indexOf('\n');
77
+ if (idx < 0)
78
+ return undefined;
79
+ const line = buffer.slice(0, idx + 1);
80
+ buffer = buffer.slice(idx + 1);
81
+ return line.replaceAll(/\r?\n$/, '');
82
+ };
83
+ const readLine = async () => {
84
+ const immediate = tryReadLineFromBuffer();
85
+ if (typeof immediate === 'string')
86
+ return immediate;
87
+ await new Promise((resolve) => waiters.push(resolve));
88
+ return readLine();
89
+ };
90
+ const readMultiline = async (code, message) => {
91
+ const line = await readLine();
92
+ const nextCodeStr = line.slice(0, 3);
93
+ const nextCode = Number.parseInt(nextCodeStr, 10);
94
+ const nextMsg = line.length > 4 ? line.slice(4) : '';
95
+ const nextMessage = `${message}\n${nextMsg}`.trim();
96
+ if (Number.isFinite(nextCode) && nextCode === code && line[3] === ' ')
97
+ return nextMessage;
98
+ return readMultiline(code, nextMessage);
99
+ };
100
+ const readResponse = async () => {
101
+ const first = await readLine();
102
+ const codeStr = first.slice(0, 3);
103
+ const code = Number.parseInt(codeStr, 10);
104
+ if (!Number.isFinite(code)) {
105
+ throw ErrorFactory.createConnectionError('SMTP: invalid response code', { first });
106
+ }
107
+ let message = first.length > 4 ? first.slice(4) : '';
108
+ // Multiline response: "250-..." then "250 ..."
109
+ if (first[3] === '-') {
110
+ message = await readMultiline(code, message);
111
+ }
112
+ return { code, message };
113
+ };
114
+ const close = () => {
115
+ socket.off('data', onData);
116
+ };
117
+ return { readResponse, close };
118
+ };
119
+ const writeLine = async (socket, line) => {
120
+ return new Promise((resolve, reject) => {
121
+ socket.write(`${line}\r\n`, (err) => {
122
+ if (err)
123
+ reject(err);
124
+ else
125
+ resolve();
126
+ });
127
+ });
128
+ };
129
+ const assertCode = (res, expected, context) => {
130
+ const allowed = Array.isArray(expected) ? expected : [expected];
131
+ if (!allowed.includes(res.code)) {
132
+ throw ErrorFactory.createConnectionError(`SMTP: unexpected response for ${context}`, {
133
+ expected: allowed,
134
+ got: res.code,
135
+ message: res.message,
136
+ });
137
+ }
138
+ };
139
+ const hasCapability = (res, capability) => {
140
+ const cap = capability.trim().toUpperCase();
141
+ if (cap === '')
142
+ return false;
143
+ return res.message
144
+ .split('\n')
145
+ .some((line) => line.trim().toUpperCase().startsWith(cap) || line.trim().toUpperCase().includes(cap));
146
+ };
147
+ const doEhlo = async (socket, reader) => {
148
+ await writeLine(socket, 'EHLO zintrust');
149
+ const res = await reader.readResponse();
150
+ assertCode(res, 250, 'EHLO');
151
+ return res;
152
+ };
153
+ const doAuthLoginIfNeeded = async (socket, reader, config) => {
154
+ const username = config.username ?? '';
155
+ const password = config.password ?? '';
156
+ const wantsAuth = username.trim() !== '' || password.trim() !== '';
157
+ if (!wantsAuth)
158
+ return;
159
+ if (username.trim() === '' || password.trim() === '') {
160
+ throw ErrorFactory.createConfigError('SMTP: both MAIL_USERNAME and MAIL_PASSWORD are required');
161
+ }
162
+ await writeLine(socket, 'AUTH LOGIN');
163
+ const auth1 = await reader.readResponse();
164
+ assertCode(auth1, 334, 'AUTH LOGIN');
165
+ await writeLine(socket, toBase64(username));
166
+ const auth2 = await reader.readResponse();
167
+ assertCode(auth2, 334, 'AUTH username');
168
+ await writeLine(socket, toBase64(password));
169
+ const auth3 = await reader.readResponse();
170
+ assertCode(auth3, 235, 'AUTH password');
171
+ };
172
+ const doMailFrom = async (socket, reader, fromEmail) => {
173
+ await writeLine(socket, `MAIL FROM:<${fromEmail}>`);
174
+ const mailFrom = await reader.readResponse();
175
+ assertCode(mailFrom, [250, 251], 'MAIL FROM');
176
+ };
177
+ const doRcptToAll = async (socket, reader, recipients) => {
178
+ if (recipients.length === 0) {
179
+ throw ErrorFactory.createValidationError('SMTP: missing recipients');
180
+ }
181
+ await recipients.reduce(async (prev, rcpt) => {
182
+ await prev;
183
+ await writeLine(socket, `RCPT TO:<${rcpt}>`);
184
+ const rcptRes = await reader.readResponse();
185
+ assertCode(rcptRes, [250, 251], 'RCPT TO');
186
+ }, Promise.resolve());
187
+ };
188
+ const doData = async (socket, reader, message) => {
189
+ await writeLine(socket, 'DATA');
190
+ const dataRes = await reader.readResponse();
191
+ assertCode(dataRes, 354, 'DATA');
192
+ const raw = buildRfc2822Message(message);
193
+ const stuffed = dotStuff(raw);
194
+ await new Promise((resolve, reject) => {
195
+ socket.write(`${stuffed}\r\n.\r\n`, (err) => {
196
+ if (err)
197
+ reject(err);
198
+ else
199
+ resolve();
200
+ });
201
+ });
202
+ const queued = await reader.readResponse();
203
+ assertCode(queued, 250, 'message body');
204
+ };
205
+ const doQuit = async (socket, reader) => {
206
+ await writeLine(socket, 'QUIT');
207
+ const quit = await reader.readResponse();
208
+ assertCode(quit, [221, 250], 'QUIT');
209
+ };
210
+ const buildRfc2822Message = (msg) => {
211
+ const toList = normalizeRecipients(msg.to);
212
+ const fromNameRaw = msg.from.name;
213
+ const fromName = typeof fromNameRaw === 'string' ? fromNameRaw.trim() : '';
214
+ const fromHeader = fromName === '' ? msg.from.email : `${fromName} <${msg.from.email}>`;
215
+ const toHeader = toList.join(', ');
216
+ const subject = msg.subject;
217
+ const headers = [
218
+ `From: ${fromHeader}`,
219
+ `To: ${toHeader}`,
220
+ `Subject: ${subject}`,
221
+ 'MIME-Version: 1.0',
222
+ ];
223
+ const attachParts = (attachments, innerBody) => {
224
+ const mixedBoundary = `mixed_${generateUuid().replaceAll('-', '')}`;
225
+ const lines = [];
226
+ lines.push(`Content-Type: multipart/mixed; boundary="${mixedBoundary}"`, '', `--${mixedBoundary}`, innerBody);
227
+ // attachments
228
+ for (const a of attachments) {
229
+ const b64 = a.content.toString('base64');
230
+ lines.push(`--${mixedBoundary}`, `Content-Type: application/octet-stream; name="${a.filename}"`, 'Content-Transfer-Encoding: base64', `Content-Disposition: attachment; filename="${a.filename}"`, '');
231
+ // break base64 into 76 char lines per RFC
232
+ for (let i = 0; i < b64.length; i += 76) {
233
+ lines.push(b64.slice(i, i + 76));
234
+ }
235
+ }
236
+ lines.push(`--${mixedBoundary}--`, '');
237
+ return lines.join('\r\n');
238
+ };
239
+ if (typeof msg.html === 'string' && msg.html !== '') {
240
+ const boundary = `zintrust_${generateUuid().replaceAll('-', '')}`;
241
+ headers.push(`Content-Type: multipart/alternative; boundary="${boundary}"`);
242
+ const parts = [
243
+ `--${boundary}`,
244
+ 'Content-Type: text/plain; charset=utf-8',
245
+ 'Content-Transfer-Encoding: 7bit',
246
+ '',
247
+ msg.text,
248
+ `--${boundary}`,
249
+ 'Content-Type: text/html; charset=utf-8',
250
+ 'Content-Transfer-Encoding: 7bit',
251
+ '',
252
+ msg.html,
253
+ `--${boundary}--`,
254
+ '',
255
+ ];
256
+ const inner = `${parts.join('\r\n')}`;
257
+ if (msg.attachments && msg.attachments.length > 0) {
258
+ // wrap in multipart/mixed
259
+ const mixed = attachParts(msg.attachments, inner);
260
+ return `${headers.join('\r\n')}\r\n\r\n${mixed}`;
261
+ }
262
+ return `${headers.join('\r\n')}\r\n\r\n${inner}`;
263
+ }
264
+ // plain text
265
+ if (msg.attachments && msg.attachments.length > 0) {
266
+ const inner = ['Content-Type: text/plain; charset=utf-8', '', msg.text, ''].join('\r\n');
267
+ const mixed = attachParts(msg.attachments, inner);
268
+ return `${headers.join('\r\n')}\r\n\r\n${mixed}`;
269
+ }
270
+ headers.push('Content-Type: text/plain; charset=utf-8');
271
+ return `${headers.join('\r\n')}\r\n\r\n${msg.text}\r\n`;
272
+ };
273
+ const dotStuff = (data) => data
274
+ .replaceAll(/\r?\n/g, '\r\n')
275
+ .split('\r\n')
276
+ .map((line) => (line.startsWith('.') ? `.${line}` : line))
277
+ .join('\r\n');
278
+ export const SmtpDriver = Object.freeze({
279
+ /**
280
+ * NOTE: This is a minimal SMTP implementation intended for Node.js runtimes.
281
+ * - `secure=true` means TLS from the start (SMTPS).
282
+ * - `secure='starttls'` performs STARTTLS after EHLO.
283
+ */
284
+ async send(config, message) {
285
+ let mode = 'none';
286
+ if (config.secure === true)
287
+ mode = 'tls';
288
+ if (config.secure === 'starttls')
289
+ mode = 'starttls';
290
+ let socket = await createSocket(config, mode === 'tls');
291
+ let reader = createLineReader(socket);
292
+ try {
293
+ const greeting = await reader.readResponse();
294
+ assertCode(greeting, 220, 'greeting');
295
+ const ehlo = await doEhlo(socket, reader);
296
+ if (mode === 'starttls') {
297
+ const supportsStartTls = hasCapability(ehlo, 'STARTTLS');
298
+ if (!supportsStartTls) {
299
+ throw ErrorFactory.createConnectionError('SMTP server does not support STARTTLS');
300
+ }
301
+ await writeLine(socket, 'STARTTLS');
302
+ const startTls = await reader.readResponse();
303
+ assertCode(startTls, 220, 'STARTTLS');
304
+ // Swap reader/socket to the upgraded TLS stream
305
+ reader.close();
306
+ socket = await upgradeToStartTls(socket, config.host);
307
+ reader = createLineReader(socket);
308
+ // RFC: EHLO again after STARTTLS
309
+ await doEhlo(socket, reader);
310
+ }
311
+ await doAuthLoginIfNeeded(socket, reader, config);
312
+ await doMailFrom(socket, reader, message.from.email);
313
+ await doRcptToAll(socket, reader, normalizeRecipients(message.to));
314
+ await doData(socket, reader, message);
315
+ await doQuit(socket, reader);
316
+ return { ok: true, provider: 'smtp' };
317
+ }
318
+ catch (err) {
319
+ throw ErrorFactory.createConnectionError('SMTP send failed', { error: err });
320
+ }
321
+ finally {
322
+ reader.close();
323
+ socket.end();
324
+ }
325
+ },
326
+ });
327
+ export default SmtpDriver;
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Mail Templates (Core)
3
+ *
4
+ * This folder contains reusable email templates used by core mail tooling.
5
+ * Templates may be organized into subfolders (e.g., `auth/`, `orders/`) with
6
+ * both rich HTML and plain-text variants.
7
+ */
8
+ export type MailTemplate = {
9
+ subject: string;
10
+ text: string;
11
+ html?: string;
12
+ };
13
+ export type MailTemplateRegistry = Record<string, unknown>;
14
+ export declare const MailTemplateRenderer: Readonly<{
15
+ renderString: (template: string, data: Record<string, unknown>) => string;
16
+ render(template: MailTemplate, data: Record<string, unknown>): MailTemplate;
17
+ }>;
18
+ export declare const MailTemplates: Readonly<{
19
+ auth: Readonly<{
20
+ welcome: Readonly<{
21
+ subject: string;
22
+ text: string;
23
+ html: string;
24
+ }>;
25
+ }>;
26
+ }>;
27
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/tools/mail/templates/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAW3D,eAAO,MAAM,oBAAoB;6BATD,MAAM,QAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,MAAM;qBAY3D,YAAY,QAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,YAAY;EAO3E,CAAC;AAEH,eAAO,MAAM,aAAa;;;;;;;;EASO,CAAC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Mail Templates (Core)
3
+ *
4
+ * This folder contains reusable email templates used by core mail tooling.
5
+ * Templates may be organized into subfolders (e.g., `auth/`, `orders/`) with
6
+ * both rich HTML and plain-text variants.
7
+ */
8
+ const renderString = (template, data) => {
9
+ let out = template;
10
+ for (const [key, value] of Object.entries(data)) {
11
+ const replacement = value === null || value === undefined ? '' : String(value);
12
+ out = out.replaceAll(new RegExp(String.raw `{{\s*${key}\s*}}`, 'g'), replacement);
13
+ }
14
+ return out;
15
+ };
16
+ export const MailTemplateRenderer = Object.freeze({
17
+ renderString,
18
+ render(template, data) {
19
+ return {
20
+ subject: renderString(template.subject, data),
21
+ text: renderString(template.text, data),
22
+ html: typeof template.html === 'string' ? renderString(template.html, data) : undefined,
23
+ };
24
+ },
25
+ });
26
+ export const MailTemplates = Object.freeze({
27
+ auth: Object.freeze({
28
+ // Example template. Apps can add their own workflows under app/Toolkit/Mail.
29
+ welcome: Object.freeze({
30
+ subject: 'Welcome, {{name}}!',
31
+ text: 'Hi {{name}},\n\nWelcome to Zintrust.',
32
+ html: '<p>Hi {{name}},</p><p>Welcome to Zintrust.</p>',
33
+ }),
34
+ }),
35
+ });