@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":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/tools/notification/templates/markdown/index.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,YAAY,GACvB,MAAM,MAAM,KACX;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;CAuC3D,CAAC;AAEF,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,2CAA2C,CAAC;;yBA1ClF,MAAM,KACX;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE;;AA2C9D,wBAAgC"}
@@ -0,0 +1,38 @@
1
+ import { readFileSync } from '../../../../node-singletons/fs';
2
+ import { join } from '../../../../node-singletons/path';
3
+ export const loadTemplate = (name) => {
4
+ const parts = name.split('/');
5
+ const dir = join(process.cwd(), 'src', 'tools', 'notification', 'templates', 'markdown', ...parts.slice(0, -1));
6
+ const leaf = parts.at(-1) ?? '';
7
+ const filePath = join(dir, `${leaf}.md`);
8
+ const raw = readFileSync(filePath, 'utf-8');
9
+ const meta = {};
10
+ const lines = raw.split(/\r?\n/);
11
+ let i = 0;
12
+ for (; i < lines.length; i++) {
13
+ const line = lines[i].trim();
14
+ // Fast path: must look like an HTML comment and contain a colon separator.
15
+ if (!line.startsWith('<!--') || !line.endsWith('-->'))
16
+ break;
17
+ const inner = line.slice(4, -3).trim();
18
+ const colonIndex = inner.indexOf(':');
19
+ if (colonIndex === -1)
20
+ break;
21
+ const key = inner.slice(0, colonIndex).trim().toLowerCase();
22
+ const val = inner.slice(colonIndex + 1).trim();
23
+ if (!key)
24
+ break;
25
+ if (key === 'subject')
26
+ meta.subject = val;
27
+ if (key === 'variables') {
28
+ meta.variables = val
29
+ .split(',')
30
+ .map((s) => s.trim())
31
+ .filter(Boolean);
32
+ }
33
+ }
34
+ const content = lines.slice(i).join('\n').trim();
35
+ return { content, ...meta };
36
+ };
37
+ export { listTemplates, renderTemplate } from '../../templates/markdown/registry';
38
+ export default { loadTemplate };
@@ -0,0 +1,15 @@
1
+ import { loadTemplate } from '../../templates/markdown';
2
+ export declare const listTemplates: () => string[];
3
+ export declare const renderTemplate: (name: string, vars?: Record<string, unknown>) => {
4
+ html: string;
5
+ meta: ReturnType<typeof loadTemplate>;
6
+ };
7
+ declare const _default: {
8
+ listTemplates: () => string[];
9
+ renderTemplate: (name: string, vars?: Record<string, unknown>) => {
10
+ html: string;
11
+ meta: ReturnType<typeof loadTemplate>;
12
+ };
13
+ };
14
+ export default _default;
15
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../../../../src/tools/notification/templates/markdown/registry.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAwBhE,eAAO,MAAM,aAAa,QAAO,MAAM,EAEtC,CAAC;AAIF,eAAO,MAAM,cAAc,GACzB,MAAM,MAAM,EACZ,OAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,KACjC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,CAAA;CAOvD,CAAC;;yBAhB+B,MAAM,EAAE;2BAOjC,MAAM,SACN,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC5B;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,CAAA;KAAE;;AAS1D,wBAAiD"}
@@ -0,0 +1,36 @@
1
+ import { readdirSync, statSync } from '../../../../node-singletons/fs';
2
+ import { join, relative } from '../../../../node-singletons/path';
3
+ import { loadTemplate } from '../../templates/markdown';
4
+ import { MarkdownRenderer } from '../../../templates';
5
+ const BASE = join(process.cwd(), 'src', 'tools', 'notification', 'templates', 'markdown');
6
+ const walkDir = (dir, base = dir) => {
7
+ const entries = readdirSync(dir);
8
+ let files = [];
9
+ for (const e of entries) {
10
+ const p = join(dir, e);
11
+ const s = statSync(p);
12
+ if (s.isDirectory()) {
13
+ files = files.concat(walkDir(p, base));
14
+ continue;
15
+ }
16
+ if (e.endsWith('.md')) {
17
+ const rel = relative(base, p).replaceAll('\\', '/');
18
+ const withoutExt = rel.toLowerCase().endsWith('.md') ? rel.slice(0, -3) : rel;
19
+ files.push(withoutExt);
20
+ }
21
+ }
22
+ return files;
23
+ };
24
+ export const listTemplates = () => {
25
+ return walkDir(BASE);
26
+ };
27
+ import { ErrorFactory } from '../../../../exceptions/ZintrustError';
28
+ export const renderTemplate = (name, vars = {}) => {
29
+ const tpl = loadTemplate(name);
30
+ // Basic validation: subject required
31
+ if (tpl.subject === null || tpl.subject === undefined || tpl.subject.trim() === '')
32
+ throw ErrorFactory.createValidationError('Notification template missing subject', { name });
33
+ const html = MarkdownRenderer.render(tpl.content, vars);
34
+ return { html, meta: tpl };
35
+ };
36
+ export default { listTemplates, renderTemplate };
@@ -0,0 +1,19 @@
1
+ type SentRecord = {
2
+ provider: string;
3
+ payload: unknown;
4
+ config: unknown;
5
+ };
6
+ export declare const NotificationFake: Readonly<{
7
+ _sent: Array<SentRecord>;
8
+ send(provider: string, config: unknown, payload: unknown): Promise<{
9
+ ok: boolean;
10
+ }>;
11
+ assertSent(predicate: (r: SentRecord) => boolean): void;
12
+ assertNotSent(predicate: (r: SentRecord) => boolean): void;
13
+ assertSentCount(expected: number): void;
14
+ getSent(): Array<SentRecord>;
15
+ lastSent(): SentRecord | undefined;
16
+ reset(): void;
17
+ }>;
18
+ export default NotificationFake;
19
+ //# sourceMappingURL=testing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../../../../src/tools/notification/testing.ts"],"names":[],"mappings":"AAEA,KAAK,UAAU,GAAG;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,eAAO,MAAM,gBAAgB;WACd,KAAK,CAAC,UAAU,CAAC;mBAET,MAAM,UAAU,OAAO,WAAW,OAAO,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAA;KAAE,CAAC;0BAMnE,CAAC,CAAC,EAAE,UAAU,KAAK,OAAO;6BAKvB,CAAC,CAAC,EAAE,UAAU,KAAK,OAAO;8BAKzB,MAAM;eASrB,KAAK,CAAC,UAAU,CAAC;gBAIhB,UAAU,GAAG,SAAS;;EAOlC,CAAC;AAEH,eAAe,gBAAgB,CAAC"}
@@ -0,0 +1,35 @@
1
+ import { ErrorFactory } from '../../exceptions/ZintrustError';
2
+ export const NotificationFake = Object.freeze({
3
+ _sent: [],
4
+ async send(provider, config, payload) {
5
+ this._sent.push({ provider, config, payload });
6
+ await Promise.resolve();
7
+ return { ok: true };
8
+ },
9
+ assertSent(predicate) {
10
+ if (!this._sent.some(predicate))
11
+ throw ErrorFactory.createValidationError('Expected notification to be sent');
12
+ },
13
+ assertNotSent(predicate) {
14
+ if (this._sent.some(predicate))
15
+ throw ErrorFactory.createValidationError('Expected notification to NOT be sent');
16
+ },
17
+ assertSentCount(expected) {
18
+ if (this._sent.length !== expected) {
19
+ throw ErrorFactory.createValidationError('Unexpected notification send count', {
20
+ expected,
21
+ actual: this._sent.length,
22
+ });
23
+ }
24
+ },
25
+ getSent() {
26
+ return [...this._sent];
27
+ },
28
+ lastSent() {
29
+ return this._sent.length > 0 ? this._sent.at(-1) : undefined;
30
+ },
31
+ reset() {
32
+ this._sent.length = 0;
33
+ },
34
+ });
35
+ export default NotificationFake;
@@ -0,0 +1,12 @@
1
+ export declare const useFakeDriver: (name?: string, fake?: unknown) => {
2
+ driverName: string;
3
+ restore: () => void;
4
+ };
5
+ declare const _default: {
6
+ useFakeDriver: (name?: string, fake?: unknown) => {
7
+ driverName: string;
8
+ restore: () => void;
9
+ };
10
+ };
11
+ export default _default;
12
+ //# sourceMappingURL=testingHelpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testingHelpers.d.ts","sourceRoot":"","sources":["../../../../src/tools/notification/testingHelpers.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,aAAa,GACxB,aAA0B,EAC1B,OAAM,OAA0B,KAC/B;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,IAAI,CAAA;CA2B3C,CAAC;;0CA5BM,OAAO,KACZ;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,IAAI,CAAA;KAAE;;AA6B9C,wBAAiC"}
@@ -0,0 +1,32 @@
1
+ import { NotificationRegistry } from './Registry';
2
+ import NotificationFake from './testing';
3
+ export const useFakeDriver = (name = 'notification-fake', fake = NotificationFake) => {
4
+ let previous;
5
+ try {
6
+ previous = NotificationRegistry.get(name);
7
+ }
8
+ catch {
9
+ previous = undefined;
10
+ }
11
+ const fakeDriver = fake;
12
+ NotificationRegistry.register(name, fakeDriver);
13
+ const prevEnv = process.env['NOTIFICATION_DRIVER'];
14
+ process.env['NOTIFICATION_DRIVER'] = name;
15
+ return {
16
+ driverName: name,
17
+ restore() {
18
+ // Restore previous driver if present, otherwise keep fake registered
19
+ if (previous === undefined) {
20
+ NotificationRegistry.register(name, NotificationFake);
21
+ }
22
+ else {
23
+ NotificationRegistry.register(name, previous);
24
+ }
25
+ if (prevEnv === undefined)
26
+ delete process.env['NOTIFICATION_DRIVER'];
27
+ else
28
+ process.env['NOTIFICATION_DRIVER'] = prevEnv;
29
+ },
30
+ };
31
+ };
32
+ export default { useFakeDriver };
@@ -0,0 +1,23 @@
1
+ export type QueueMessage<T = unknown> = {
2
+ id: string;
3
+ payload: T;
4
+ attempts: number;
5
+ };
6
+ interface IQueueDriver {
7
+ enqueue<T = unknown>(queue: string, payload: T): Promise<string>;
8
+ dequeue<T = unknown>(queue: string): Promise<QueueMessage<T> | undefined>;
9
+ ack(queue: string, id: string): Promise<void>;
10
+ length(queue: string): Promise<number>;
11
+ drain(queue: string): Promise<void>;
12
+ }
13
+ export declare const Queue: Readonly<{
14
+ register(name: string, driver: IQueueDriver): void;
15
+ get(name?: string): IQueueDriver;
16
+ enqueue<T = unknown>(queue: string, payload: T, driverName?: string): Promise<string>;
17
+ dequeue<T = unknown>(queue: string, driverName?: string): Promise<QueueMessage<T> | undefined>;
18
+ ack(queue: string, id: string, driverName?: string): Promise<void>;
19
+ length(queue: string, driverName?: string): Promise<number>;
20
+ drain(queue: string, driverName?: string): Promise<void>;
21
+ }>;
22
+ export default Queue;
23
+ //# sourceMappingURL=Queue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Queue.d.ts","sourceRoot":"","sources":["../../../../src/tools/queue/Queue.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,YAAY,CAAC,CAAC,GAAG,OAAO,IAAI;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,CAAC,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAErF,UAAU,YAAY;IACpB,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACjE,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IAC1E,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACvC,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACrC;AAID,eAAO,MAAM,KAAK;mBACD,MAAM,UAAU,YAAY;eAIhC,MAAM,GAAG,YAAY;YAUlB,CAAC,mBAAmB,MAAM,WAAW,CAAC,eAAe,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAK7E,CAAC,mBACN,MAAM,eACA,MAAM,GAClB,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;eAKtB,MAAM,MAAM,MAAM,eAAe,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;kBAKpD,MAAM,eAAe,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;iBAK9C,MAAM,eAAe,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;EAI9D,CAAC;AAEH,eAAe,KAAK,CAAC"}
@@ -0,0 +1,38 @@
1
+ import { ErrorFactory } from '../../exceptions/ZintrustError';
2
+ const drivers = new Map();
3
+ export const Queue = Object.freeze({
4
+ register(name, driver) {
5
+ drivers.set(name.toLowerCase(), driver);
6
+ },
7
+ get(name) {
8
+ const driverName = (name ?? process.env['QUEUE_DRIVER'] ?? 'inmemory')
9
+ .toString()
10
+ .trim()
11
+ .toLowerCase();
12
+ const driver = drivers.get(driverName);
13
+ if (!driver)
14
+ throw ErrorFactory.createConfigError(`Queue driver not registered: ${driverName}`);
15
+ return driver;
16
+ },
17
+ async enqueue(queue, payload, driverName) {
18
+ const driver = Queue.get(driverName);
19
+ return driver.enqueue(queue, payload);
20
+ },
21
+ async dequeue(queue, driverName) {
22
+ const driver = Queue.get(driverName);
23
+ return driver.dequeue(queue);
24
+ },
25
+ async ack(queue, id, driverName) {
26
+ const driver = Queue.get(driverName);
27
+ return driver.ack(queue, id);
28
+ },
29
+ async length(queue, driverName) {
30
+ const driver = Queue.get(driverName);
31
+ return driver.length(queue);
32
+ },
33
+ async drain(queue, driverName) {
34
+ const driver = Queue.get(driverName);
35
+ return driver.drain(queue);
36
+ },
37
+ });
38
+ export default Queue;
@@ -0,0 +1,10 @@
1
+ import { QueueMessage } from '../../queue/Queue';
2
+ export declare const InMemoryQueue: {
3
+ readonly enqueue: <T = unknown>(queue: string, payload: T) => Promise<string>;
4
+ readonly dequeue: <T = unknown>(queue: string) => Promise<QueueMessage<T> | undefined>;
5
+ readonly ack: (_queue: string, _id: string) => Promise<void>;
6
+ readonly length: (queue: string) => Promise<number>;
7
+ readonly drain: (queue: string) => Promise<void>;
8
+ };
9
+ export default InMemoryQueue;
10
+ //# sourceMappingURL=InMemory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InMemory.d.ts","sourceRoot":"","sources":["../../../../../src/tools/queue/drivers/InMemory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAIlD,eAAO,MAAM,aAAa;uBAQR,CAAC,mBAAmB,MAAM,WAAW,CAAC,KAAG,OAAO,CAAC,MAAM,CAAC;uBAmBxD,CAAC,mBAAmB,MAAM,KAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;2BAW7D,MAAM,OAAO,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC;6BAKjC,MAAM,KAAG,OAAO,CAAC,MAAM,CAAC;4BAOzB,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC;CAMzC,CAAC;AAEL,eAAe,aAAa,CAAC"}
@@ -0,0 +1,55 @@
1
+ import { generateUuid } from '../../../common/uuid';
2
+ export const InMemoryQueue = (() => {
3
+ const store = new Map();
4
+ const ensure = (queue) => {
5
+ if (!store.has(queue))
6
+ store.set(queue, []);
7
+ };
8
+ return {
9
+ async enqueue(queue, payload) {
10
+ await Promise.resolve();
11
+ ensure(queue);
12
+ const id = generateUuid();
13
+ const msg = {
14
+ id,
15
+ payload: payload,
16
+ attempts: 0,
17
+ enqueuedAt: Date.now(),
18
+ };
19
+ const arr = store.get(queue);
20
+ if (arr && arr.length > 0) {
21
+ arr.push(msg);
22
+ }
23
+ else {
24
+ store.set(queue, [msg]);
25
+ }
26
+ return id;
27
+ },
28
+ async dequeue(queue) {
29
+ await Promise.resolve();
30
+ ensure(queue);
31
+ const arr = store.get(queue);
32
+ if (arr && arr.length > 0) {
33
+ const msg = arr.shift();
34
+ return msg;
35
+ }
36
+ return undefined;
37
+ },
38
+ async ack(_queue, _id) {
39
+ // in-memory dequeue already removed the message; ack is a no-op
40
+ await Promise.resolve();
41
+ },
42
+ async length(queue) {
43
+ await Promise.resolve();
44
+ ensure(queue);
45
+ const arr = store.get(queue);
46
+ return Array.isArray(arr) ? arr.length : 0;
47
+ },
48
+ async drain(queue) {
49
+ await Promise.resolve();
50
+ ensure(queue);
51
+ store.set(queue, []);
52
+ },
53
+ };
54
+ })();
55
+ export default InMemoryQueue;
@@ -0,0 +1,10 @@
1
+ import { QueueMessage } from '../../queue/Queue';
2
+ export declare const RedisQueue: {
3
+ readonly enqueue: <T = unknown>(queue: string, payload: T) => Promise<string>;
4
+ readonly dequeue: <T = unknown>(queue: string) => Promise<QueueMessage<T> | undefined>;
5
+ readonly ack: (_queue: string, _id: string) => Promise<void>;
6
+ readonly length: (queue: string) => Promise<number>;
7
+ readonly drain: (queue: string) => Promise<void>;
8
+ };
9
+ export default RedisQueue;
10
+ //# sourceMappingURL=Redis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Redis.d.ts","sourceRoot":"","sources":["../../../../../src/tools/queue/drivers/Redis.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAelD,eAAO,MAAM,UAAU;uBAuDL,CAAC,mBAAmB,MAAM,WAAW,CAAC,KAAG,OAAO,CAAC,MAAM,CAAC;uBAQxD,CAAC,mBAAmB,MAAM,KAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;2BAY7D,MAAM,OAAO,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC;6BAMjC,MAAM,KAAG,OAAO,CAAC,MAAM,CAAC;4BAKzB,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC;CAKzC,CAAC;AAEL,eAAe,UAAU,CAAC"}
@@ -0,0 +1,91 @@
1
+ import { generateUuid } from '../../../common/uuid';
2
+ import { ErrorFactory } from '../../../exceptions/ZintrustError';
3
+ const getRedisUrl = () => {
4
+ const url = (process.env['REDIS_URL'] ?? '').trim();
5
+ return url.length > 0 ? url : null;
6
+ };
7
+ export const RedisQueue = (() => {
8
+ let client = null;
9
+ let connected = false;
10
+ const ensureClient = async () => {
11
+ if (connected && client !== null)
12
+ return client;
13
+ const url = getRedisUrl();
14
+ if (url === null)
15
+ throw ErrorFactory.createConfigError('Redis queue driver requires REDIS_URL');
16
+ // Import lazily so package is optional for environments that don't use Redis
17
+ // Prefer real 'redis' package when available, otherwise allow tests to inject a fake client
18
+ try {
19
+ // Dynamically import the redis package if available (optional dependency)
20
+ // Tests can inject a fake client on `globalThis.__fakeRedisClient` if the package is absent.
21
+ // Dynamically import the redis package if available (optional dependency)
22
+ const mod = (await import('redis'));
23
+ const createClient = mod.createClient;
24
+ client = createClient({ url });
25
+ if (typeof client.connect === 'function') {
26
+ try {
27
+ // Await connect to ensure readiness; network errors will be surfaced
28
+ await client.connect();
29
+ connected = true;
30
+ }
31
+ catch (connectionError) {
32
+ connected = false;
33
+ // log non-fatally — operations will surface errors as needed
34
+ // eslint-disable-next-line no-console
35
+ console.warn('Redis client connect failed:', String(connectionError));
36
+ }
37
+ }
38
+ else {
39
+ connected = true;
40
+ }
41
+ }
42
+ catch {
43
+ const globalFake = globalThis
44
+ .__fakeRedisClient;
45
+ if (globalFake === undefined) {
46
+ throw ErrorFactory.createConfigError("Redis queue driver requires the 'redis' package or a test fake client set in globalThis.__fakeRedisClient");
47
+ }
48
+ client = globalFake;
49
+ connected = true;
50
+ }
51
+ if (client === null)
52
+ throw ErrorFactory.createConfigError('Redis client could not be initialized');
53
+ return client;
54
+ };
55
+ return {
56
+ async enqueue(queue, payload) {
57
+ const cli = await ensureClient();
58
+ const id = generateUuid();
59
+ const msg = JSON.stringify({ id, payload, attempts: 0 });
60
+ await cli.rPush(queue, msg);
61
+ return id;
62
+ },
63
+ async dequeue(queue) {
64
+ const cli = await ensureClient();
65
+ const raw = await cli.lPop(queue);
66
+ if (raw === null)
67
+ return undefined;
68
+ try {
69
+ const parsed = JSON.parse(raw);
70
+ return parsed;
71
+ }
72
+ catch (err) {
73
+ throw ErrorFactory.createTryCatchError('Failed to parse queue message', err);
74
+ }
75
+ },
76
+ async ack(_queue, _id) {
77
+ // Simple list-based queue removes on dequeue, so ack is a no-op here.
78
+ // For visibility timeout or retry semantics, implement BRPOPLPUSH and a processing list.
79
+ return Promise.resolve(); // NOSONAR
80
+ },
81
+ async length(queue) {
82
+ const cli = await ensureClient();
83
+ return cli.lLen(queue);
84
+ },
85
+ async drain(queue) {
86
+ const cli = await ensureClient();
87
+ await cli.del(queue);
88
+ },
89
+ };
90
+ })();
91
+ export default RedisQueue;
@@ -0,0 +1,20 @@
1
+ export type GcsConfig = {
2
+ bucket: string;
3
+ projectId?: string;
4
+ keyFile?: string;
5
+ url?: string;
6
+ };
7
+ type TempUrlOptions = {
8
+ expiresIn?: number;
9
+ method?: 'GET' | 'PUT';
10
+ };
11
+ export declare const GcsDriver: Readonly<{
12
+ url(config: GcsConfig, key: string): string | undefined;
13
+ put(config: GcsConfig, key: string, content: string | Buffer): Promise<string>;
14
+ get(config: GcsConfig, key: string): Promise<Buffer>;
15
+ exists(config: GcsConfig, key: string): Promise<boolean>;
16
+ delete(config: GcsConfig, key: string): Promise<void>;
17
+ tempUrl(config: GcsConfig, key: string, options?: TempUrlOptions): Promise<string>;
18
+ }>;
19
+ export default GcsDriver;
20
+ //# sourceMappingURL=Gcs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Gcs.d.ts","sourceRoot":"","sources":["../../../../../src/tools/storage/drivers/Gcs.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,SAAS,GAAG;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,KAAK,cAAc,GAAG;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,KAAK,GAAG,KAAK,CAAA;CAAE,CAAC;AA+ErE,eAAO,MAAM,SAAS;gBACR,SAAS,OAAO,MAAM,GAAG,MAAM,GAAG,SAAS;gBAWrC,SAAS,OAAO,MAAM,WAAW,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;gBAkBlE,SAAS,OAAO,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;mBAiBrC,SAAS,OAAO,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;mBAgBzC,SAAS,OAAO,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;oBAiBrC,SAAS,OAAO,MAAM,YAAY,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC;EA8BxF,CAAC;AAEH,eAAe,SAAS,CAAC"}
@@ -0,0 +1,152 @@
1
+ import { ErrorFactory } from '../../../exceptions/ZintrustError';
2
+ let cachedRealClient;
3
+ const getInjectedStorageModule = () => {
4
+ return globalThis
5
+ .__fakeGoogleCloudStorageModule;
6
+ };
7
+ const getInjectedFakeClient = () => {
8
+ const v = globalThis.__fakeGcsClient;
9
+ return v;
10
+ };
11
+ const loadRealClient = async (config) => {
12
+ if (cachedRealClient !== undefined)
13
+ return cachedRealClient;
14
+ // Avoid a string-literal import so TypeScript doesn't require the module at build time.
15
+ const specifier = '@google-cloud/storage';
16
+ const injected = getInjectedStorageModule();
17
+ let mod;
18
+ try {
19
+ mod = (injected ?? (await import(specifier)));
20
+ }
21
+ catch (err) {
22
+ throw ErrorFactory.createConfigError('GCS: missing optional dependency @google-cloud/storage (install it or inject globalThis.__fakeGcsClient for tests)', { error: err });
23
+ }
24
+ if (typeof mod.Storage !== 'function') {
25
+ throw ErrorFactory.createConfigError('GCS: @google-cloud/storage did not export Storage');
26
+ }
27
+ const opts = {};
28
+ if (typeof config.projectId === 'string' && config.projectId.trim() !== '') {
29
+ opts['projectId'] = config.projectId;
30
+ }
31
+ if (typeof config.keyFile === 'string' && config.keyFile.trim() !== '') {
32
+ opts['keyFilename'] = config.keyFile;
33
+ }
34
+ try {
35
+ cachedRealClient = new mod.Storage(opts);
36
+ return cachedRealClient;
37
+ }
38
+ catch (err) {
39
+ throw ErrorFactory.createConfigError('GCS: failed to initialize Storage client', {
40
+ error: err,
41
+ });
42
+ }
43
+ };
44
+ const getClient = async (config) => {
45
+ const injected = getInjectedFakeClient();
46
+ if (injected !== undefined)
47
+ return injected;
48
+ return loadRealClient(config);
49
+ };
50
+ const encodePathSegments = (key) => key
51
+ .split('/')
52
+ .map((seg) => encodeURIComponent(seg))
53
+ .join('/');
54
+ export const GcsDriver = Object.freeze({
55
+ url(config, key) {
56
+ const bucket = String(config.bucket ?? '').trim();
57
+ if (bucket === '')
58
+ return undefined;
59
+ const base = typeof config.url === 'string' ? config.url.trim() : '';
60
+ if (base !== '')
61
+ return `${base.replace(/\/$/, '')}/${key}`;
62
+ const encodedKey = encodePathSegments(key);
63
+ return `https://storage.googleapis.com/${encodeURIComponent(bucket)}/${encodedKey}`;
64
+ },
65
+ async put(config, key, content) {
66
+ const bucket = String(config.bucket ?? '').trim();
67
+ if (bucket === '')
68
+ throw ErrorFactory.createConfigError('GCS: bucket is not configured');
69
+ const client = await getClient(config);
70
+ const file = client.bucket(bucket).file(key);
71
+ if (typeof file.save !== 'function') {
72
+ throw ErrorFactory.createConfigError('GCS: client is missing file.save()');
73
+ }
74
+ await file.save(content);
75
+ const url = GcsDriver.url(config, key);
76
+ if (url === undefined)
77
+ return '';
78
+ return url;
79
+ },
80
+ async get(config, key) {
81
+ const bucket = String(config.bucket ?? '').trim();
82
+ if (bucket === '')
83
+ throw ErrorFactory.createConfigError('GCS: bucket is not configured');
84
+ const client = await getClient(config);
85
+ const file = client.bucket(bucket).file(key);
86
+ if (typeof file.download !== 'function') {
87
+ throw ErrorFactory.createConfigError('GCS: client is missing file.download()');
88
+ }
89
+ const [data] = await file.download();
90
+ if (Buffer.isBuffer(data))
91
+ return data;
92
+ if (typeof data === 'string')
93
+ return Buffer.from(data);
94
+ return Buffer.from(data);
95
+ },
96
+ async exists(config, key) {
97
+ const bucket = String(config.bucket ?? '').trim();
98
+ if (bucket === '')
99
+ throw ErrorFactory.createConfigError('GCS: bucket is not configured');
100
+ const client = await getClient(config);
101
+ const file = client.bucket(bucket).file(key);
102
+ if (typeof file.exists !== 'function') {
103
+ // if client doesn't support exists, assume true (matches Storage.exists default behavior)
104
+ return true;
105
+ }
106
+ const [exists] = await file.exists();
107
+ return Boolean(exists);
108
+ },
109
+ async delete(config, key) {
110
+ const bucket = String(config.bucket ?? '').trim();
111
+ if (bucket === '')
112
+ throw ErrorFactory.createConfigError('GCS: bucket is not configured');
113
+ const client = await getClient(config);
114
+ const file = client.bucket(bucket).file(key);
115
+ if (typeof file.delete !== 'function')
116
+ return;
117
+ try {
118
+ // google-cloud-storage supports ignoreNotFound, but keep it flexible for fakes
119
+ await file.delete({ ignoreNotFound: true });
120
+ }
121
+ catch (err) {
122
+ void err; // NOSONAR
123
+ }
124
+ },
125
+ async tempUrl(config, key, options) {
126
+ const bucket = String(config.bucket ?? '').trim();
127
+ if (bucket === '')
128
+ throw ErrorFactory.createConfigError('GCS: bucket is not configured');
129
+ const expiresIn = options?.expiresIn ?? 900;
130
+ if (!Number.isFinite(expiresIn) || expiresIn <= 0) {
131
+ throw ErrorFactory.createValidationError('GCS: expiresIn must be a positive number', {
132
+ expiresIn,
133
+ });
134
+ }
135
+ if (expiresIn > 604800) {
136
+ throw ErrorFactory.createValidationError('GCS: expiresIn exceeds 7 days', {
137
+ expiresIn,
138
+ });
139
+ }
140
+ const method = options?.method ?? 'GET';
141
+ const action = method === 'PUT' ? 'write' : 'read';
142
+ const client = await getClient(config);
143
+ const file = client.bucket(bucket).file(key);
144
+ if (typeof file.getSignedUrl !== 'function') {
145
+ throw ErrorFactory.createConfigError('GCS: client is missing file.getSignedUrl()');
146
+ }
147
+ const expires = Date.now() + expiresIn * 1000;
148
+ const [url] = await file.getSignedUrl({ version: 'v4', action, expires });
149
+ return url;
150
+ },
151
+ });
152
+ export default GcsDriver;
@@ -0,0 +1,17 @@
1
+ export type LocalConfig = {
2
+ root: string;
3
+ url?: string;
4
+ };
5
+ export declare const LocalDriver: Readonly<{
6
+ put(config: LocalConfig, key: string, content: string | Buffer): Promise<string>;
7
+ get(config: LocalConfig, key: string): Promise<Buffer>;
8
+ exists(config: LocalConfig, key: string): Promise<boolean>;
9
+ delete(config: LocalConfig, key: string): Promise<void>;
10
+ url(config: LocalConfig, key: string): string | undefined;
11
+ tempUrl(config: LocalConfig, key: string, _options?: {
12
+ expiresIn?: number;
13
+ method?: "GET" | "PUT";
14
+ }): string;
15
+ }>;
16
+ export default LocalDriver;
17
+ //# sourceMappingURL=Local.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Local.d.ts","sourceRoot":"","sources":["../../../../../src/tools/storage/drivers/Local.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,eAAO,MAAM,WAAW;gBACJ,WAAW,OAAO,MAAM,WAAW,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;gBAkBpE,WAAW,OAAO,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;mBASvC,WAAW,OAAO,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;mBAU3C,WAAW,OAAO,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;gBAUjD,WAAW,OAAO,MAAM,GAAG,MAAM,GAAG,SAAS;oBAM/C,WAAW,OACd,MAAM,aACA;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,KAAK,GAAG,KAAK,CAAA;KAAE,GACxD,MAAM;EAST,CAAC;AAEH,eAAe,WAAW,CAAC"}