@zintrust/core 0.1.0 → 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 (518) hide show
  1. package/README.md +214 -0
  2. package/bin/zintrust.d.ts.map +1 -1
  3. package/bin/zintrust.js +18 -1
  4. package/package.json +4 -34
  5. package/public/index.html +535 -0
  6. package/src/boot/Application.d.ts.map +1 -1
  7. package/src/boot/Application.js +46 -3
  8. package/src/boot/Server.d.ts.map +1 -1
  9. package/src/boot/Server.js +3 -4
  10. package/src/boot/bootstrap.js +77 -6
  11. package/src/builder/BundleOptimizer.d.ts.map +1 -1
  12. package/src/builder/BundleOptimizer.js +25 -29
  13. package/src/cache/Cache.d.ts.map +1 -1
  14. package/src/cache/Cache.js +4 -2
  15. package/src/cache/drivers/KVDriver.d.ts.map +1 -1
  16. package/src/cache/drivers/KVDriver.js +8 -7
  17. package/src/cache/drivers/MemoryDriver.d.ts.map +1 -1
  18. package/src/cache/drivers/MemoryDriver.js +5 -0
  19. package/src/cache/drivers/RedisDriver.js +1 -1
  20. package/src/cli/BaseCommand.d.ts +2 -2
  21. package/src/cli/BaseCommand.d.ts.map +1 -1
  22. package/src/cli/BaseCommand.js +2 -1
  23. package/src/cli/CLI.d.ts.map +1 -1
  24. package/src/cli/CLI.js +22 -18
  25. package/src/cli/ErrorHandler.d.ts.map +1 -1
  26. package/src/cli/ErrorHandler.js +2 -4
  27. package/src/cli/commands/AddCommand.d.ts +81 -0
  28. package/src/cli/commands/AddCommand.d.ts.map +1 -1
  29. package/src/cli/commands/AddCommand.js +24 -5
  30. package/src/cli/commands/ConfigCommand.d.ts.map +1 -1
  31. package/src/cli/commands/ConfigCommand.js +59 -25
  32. package/src/cli/commands/D1MigrateCommand.d.ts +4 -0
  33. package/src/cli/commands/D1MigrateCommand.d.ts.map +1 -1
  34. package/src/cli/commands/D1MigrateCommand.js +6 -4
  35. package/src/cli/commands/FixCommand.d.ts.map +1 -1
  36. package/src/cli/commands/FixCommand.js +3 -15
  37. package/src/cli/commands/LogsCleanupCommand.d.ts +6 -0
  38. package/src/cli/commands/LogsCleanupCommand.d.ts.map +1 -0
  39. package/src/cli/commands/LogsCleanupCommand.js +20 -0
  40. package/src/cli/commands/LogsCommand.d.ts.map +1 -1
  41. package/src/cli/commands/LogsCommand.js +4 -6
  42. package/src/cli/commands/MakeMailTemplateCommand.d.ts +10 -0
  43. package/src/cli/commands/MakeMailTemplateCommand.d.ts.map +1 -0
  44. package/src/cli/commands/MakeMailTemplateCommand.js +74 -0
  45. package/src/cli/commands/MakeNotificationTemplateCommand.d.ts +10 -0
  46. package/src/cli/commands/MakeNotificationTemplateCommand.d.ts.map +1 -0
  47. package/src/cli/commands/MakeNotificationTemplateCommand.js +113 -0
  48. package/src/cli/commands/MigrateCommand.d.ts.map +1 -1
  49. package/src/cli/commands/MigrateCommand.js +3 -3
  50. package/src/cli/commands/NewCommand.d.ts +4 -0
  51. package/src/cli/commands/NewCommand.d.ts.map +1 -1
  52. package/src/cli/commands/NewCommand.js +34 -19
  53. package/src/cli/commands/PluginCommand.d.ts.map +1 -1
  54. package/src/cli/commands/PluginCommand.js +8 -4
  55. package/src/cli/commands/PrepareCommand.d.ts.map +1 -1
  56. package/src/cli/commands/PrepareCommand.js +1 -1
  57. package/src/cli/commands/QACommand.d.ts.map +1 -1
  58. package/src/cli/commands/QACommand.js +16 -26
  59. package/src/cli/commands/SecretsCommand.d.ts +16 -0
  60. package/src/cli/commands/SecretsCommand.d.ts.map +1 -0
  61. package/src/cli/commands/SecretsCommand.js +91 -0
  62. package/src/cli/commands/StartCommand.d.ts.map +1 -1
  63. package/src/cli/commands/StartCommand.js +2 -2
  64. package/src/cli/commands/TemplatesCommand.d.ts +3 -0
  65. package/src/cli/commands/TemplatesCommand.d.ts.map +1 -0
  66. package/src/cli/commands/TemplatesCommand.js +65 -0
  67. package/src/cli/commands/index.d.ts +5 -0
  68. package/src/cli/commands/index.d.ts.map +1 -1
  69. package/src/cli/commands/index.js +5 -0
  70. package/src/cli/config/ConfigManager.js +1 -1
  71. package/src/cli/index.d.ts +2 -1
  72. package/src/cli/index.d.ts.map +1 -1
  73. package/src/cli/index.js +2 -1
  74. package/src/cli/scaffolding/ControllerGenerator.d.ts.map +1 -1
  75. package/src/cli/scaffolding/ControllerGenerator.js +11 -10
  76. package/src/cli/scaffolding/FeatureScaffolder.js +4 -4
  77. package/src/cli/scaffolding/FileGenerator.js +1 -1
  78. package/src/cli/scaffolding/MigrationGenerator.d.ts.map +1 -1
  79. package/src/cli/scaffolding/MigrationGenerator.js +10 -9
  80. package/src/cli/scaffolding/ModelGenerator.d.ts.map +1 -1
  81. package/src/cli/scaffolding/ModelGenerator.js +11 -10
  82. package/src/cli/scaffolding/ProjectScaffolder.d.ts.map +1 -1
  83. package/src/cli/scaffolding/ProjectScaffolder.js +61 -11
  84. package/src/cli/scaffolding/ResponseFactoryGenerator.d.ts.map +1 -1
  85. package/src/cli/scaffolding/ResponseFactoryGenerator.js +2 -1
  86. package/src/cli/scaffolding/RouteGenerator.d.ts.map +1 -1
  87. package/src/cli/scaffolding/RouteGenerator.js +15 -14
  88. package/src/cli/scaffolding/SeederGenerator.js +1 -1
  89. package/src/cli/scaffolding/ServiceIntegrationTestGenerator.d.ts.map +1 -1
  90. package/src/cli/scaffolding/ServiceIntegrationTestGenerator.js +7 -6
  91. package/src/cli/scaffolding/ServiceRequestFactoryGenerator.d.ts +1 -1
  92. package/src/cli/scaffolding/ServiceRequestFactoryGenerator.d.ts.map +1 -1
  93. package/src/cli/scaffolding/ServiceRequestFactoryGenerator.js +2 -2
  94. package/src/cli/scaffolding/ServiceScaffolder.d.ts.map +1 -1
  95. package/src/cli/scaffolding/ServiceScaffolder.js +13 -12
  96. package/src/cli/scaffolding/TemplateEngine.d.ts +10 -3
  97. package/src/cli/scaffolding/TemplateEngine.d.ts.map +1 -1
  98. package/src/cli/scaffolding/TemplateEngine.js +15 -285
  99. package/src/cli/scaffolding/TemplateGenerator.d.ts +40 -0
  100. package/src/cli/scaffolding/TemplateGenerator.d.ts.map +1 -0
  101. package/src/cli/scaffolding/TemplateGenerator.js +172 -0
  102. package/src/cli/scaffolding/index.d.ts +1 -0
  103. package/src/cli/scaffolding/index.d.ts.map +1 -1
  104. package/src/cli/scaffolding/index.js +1 -0
  105. package/src/cli/utils/spawn.js +1 -1
  106. package/src/common/AwsSigV4.d.ts +41 -0
  107. package/src/common/AwsSigV4.d.ts.map +1 -0
  108. package/src/common/AwsSigV4.js +69 -0
  109. package/src/common/index.d.ts +39 -0
  110. package/src/common/index.d.ts.map +1 -1
  111. package/src/common/index.js +101 -8
  112. package/src/common/uuid.d.ts +3 -0
  113. package/src/common/uuid.d.ts.map +1 -0
  114. package/src/common/uuid.js +30 -0
  115. package/src/config/FileLogWriter.d.ts +22 -0
  116. package/src/config/FileLogWriter.d.ts.map +1 -0
  117. package/src/config/FileLogWriter.js +192 -0
  118. package/src/config/SecretsManager.d.ts.map +1 -1
  119. package/src/config/SecretsManager.js +26 -0
  120. package/src/config/StartupConfigValidator.d.ts +15 -0
  121. package/src/config/StartupConfigValidator.d.ts.map +1 -0
  122. package/src/config/StartupConfigValidator.js +86 -0
  123. package/src/config/app.d.ts +2 -1
  124. package/src/config/app.d.ts.map +1 -1
  125. package/src/config/app.js +65 -15
  126. package/src/config/broadcast.d.ts +47 -0
  127. package/src/config/broadcast.d.ts.map +1 -0
  128. package/src/config/broadcast.js +54 -0
  129. package/src/config/cache.d.ts +13 -17
  130. package/src/config/cache.d.ts.map +1 -1
  131. package/src/config/cache.js +9 -11
  132. package/src/config/cloudflare.d.ts +26 -0
  133. package/src/config/cloudflare.d.ts.map +1 -0
  134. package/src/config/cloudflare.js +38 -0
  135. package/src/config/env.d.ts +6 -0
  136. package/src/config/env.d.ts.map +1 -1
  137. package/src/config/env.js +6 -0
  138. package/src/config/index.d.ts +52 -28
  139. package/src/config/index.d.ts.map +1 -1
  140. package/src/config/index.js +3 -0
  141. package/src/config/logger.d.ts +2 -0
  142. package/src/config/logger.d.ts.map +1 -1
  143. package/src/config/logger.js +270 -11
  144. package/src/config/logging/HttpLogger.d.ts +23 -0
  145. package/src/config/logging/HttpLogger.d.ts.map +1 -0
  146. package/src/config/logging/HttpLogger.js +93 -0
  147. package/src/config/logging/KvLogger.d.ts +22 -0
  148. package/src/config/logging/KvLogger.d.ts.map +1 -0
  149. package/src/config/logging/KvLogger.js +143 -0
  150. package/src/config/logging/SlackLogger.d.ts +23 -0
  151. package/src/config/logging/SlackLogger.d.ts.map +1 -0
  152. package/src/config/logging/SlackLogger.js +119 -0
  153. package/src/config/mail.d.ts +81 -0
  154. package/src/config/mail.d.ts.map +1 -0
  155. package/src/config/mail.js +73 -0
  156. package/src/config/middleware.d.ts +8 -0
  157. package/src/config/middleware.d.ts.map +1 -0
  158. package/src/config/middleware.js +18 -0
  159. package/src/config/notification.d.ts +62 -0
  160. package/src/config/notification.d.ts.map +1 -0
  161. package/src/config/notification.js +43 -0
  162. package/src/config/security.d.ts.map +1 -1
  163. package/src/config/security.js +2 -2
  164. package/src/config/startup.d.ts +23 -0
  165. package/src/config/startup.d.ts.map +1 -0
  166. package/src/config/startup.js +15 -0
  167. package/src/config/storage.d.ts +21 -35
  168. package/src/config/storage.d.ts.map +1 -1
  169. package/src/config/storage.js +57 -37
  170. package/src/database/migrations/index.d.ts +1 -1
  171. package/src/database/migrations/index.d.ts.map +1 -1
  172. package/src/database/migrations/index.js +2 -1
  173. package/src/features/Queue.js +1 -25
  174. package/src/functions/lambda.d.ts.map +1 -1
  175. package/src/functions/lambda.js +6 -1
  176. package/src/health/RuntimeHealthProbes.d.ts +13 -0
  177. package/src/health/RuntimeHealthProbes.d.ts.map +1 -0
  178. package/src/health/RuntimeHealthProbes.js +62 -0
  179. package/src/health/StartupHealthChecks.d.ts +26 -0
  180. package/src/health/StartupHealthChecks.d.ts.map +1 -0
  181. package/src/health/StartupHealthChecks.js +124 -0
  182. package/src/http/ErrorResponse.d.ts +28 -0
  183. package/src/http/ErrorResponse.d.ts.map +1 -0
  184. package/src/http/ErrorResponse.js +42 -0
  185. package/src/http/Kernel.d.ts +5 -0
  186. package/src/http/Kernel.d.ts.map +1 -1
  187. package/src/http/Kernel.js +96 -30
  188. package/src/http/Request.d.ts +1 -1
  189. package/src/http/Request.d.ts.map +1 -1
  190. package/src/http/RequestContext.d.ts +20 -0
  191. package/src/http/RequestContext.d.ts.map +1 -0
  192. package/src/http/RequestContext.js +77 -0
  193. package/src/index.d.ts +9 -1
  194. package/src/index.d.ts.map +1 -1
  195. package/src/index.js +8 -2
  196. package/src/microservices/MicroserviceBootstrap.d.ts.map +1 -1
  197. package/src/microservices/MicroserviceBootstrap.js +6 -5
  198. package/src/microservices/MicroserviceManager.d.ts.map +1 -1
  199. package/src/microservices/MicroserviceManager.js +7 -5
  200. package/src/microservices/PostgresAdapter.d.ts.map +1 -1
  201. package/src/microservices/PostgresAdapter.js +7 -4
  202. package/src/microservices/ServiceBundler.d.ts.map +1 -1
  203. package/src/microservices/ServiceBundler.js +3 -1
  204. package/src/microservices/ServiceHealthMonitor.d.ts.map +1 -1
  205. package/src/microservices/ServiceHealthMonitor.js +7 -3
  206. package/src/middleware/CsrfMiddleware.d.ts.map +1 -1
  207. package/src/middleware/CsrfMiddleware.js +2 -19
  208. package/src/middleware/ErrorHandlerMiddleware.d.ts +6 -0
  209. package/src/middleware/ErrorHandlerMiddleware.d.ts.map +1 -0
  210. package/src/middleware/ErrorHandlerMiddleware.js +33 -0
  211. package/src/middleware/LoggingMiddleware.d.ts +9 -0
  212. package/src/middleware/LoggingMiddleware.d.ts.map +1 -0
  213. package/src/middleware/LoggingMiddleware.js +36 -0
  214. package/src/middleware/index.d.ts +2 -0
  215. package/src/middleware/index.d.ts.map +1 -1
  216. package/src/middleware/index.js +2 -0
  217. package/src/node-singletons/async_hooks.d.ts +9 -0
  218. package/src/node-singletons/async_hooks.d.ts.map +1 -0
  219. package/src/node-singletons/async_hooks.js +8 -0
  220. package/src/node-singletons/fs.d.ts +2 -2
  221. package/src/node-singletons/fs.d.ts.map +1 -1
  222. package/src/node-singletons/fs.js +2 -2
  223. package/src/node-singletons/http.d.ts +1 -1
  224. package/src/node-singletons/http.d.ts.map +1 -1
  225. package/src/node-singletons/http.js +1 -1
  226. package/src/node-singletons/index.d.ts +4 -0
  227. package/src/node-singletons/index.d.ts.map +1 -1
  228. package/src/node-singletons/index.js +4 -0
  229. package/src/node-singletons/net.d.ts +9 -0
  230. package/src/node-singletons/net.d.ts.map +1 -0
  231. package/src/node-singletons/net.js +8 -0
  232. package/src/node-singletons/os.d.ts +3 -3
  233. package/src/node-singletons/os.d.ts.map +1 -1
  234. package/src/node-singletons/os.js +3 -4
  235. package/src/node-singletons/path.d.ts +3 -1
  236. package/src/node-singletons/path.d.ts.map +1 -1
  237. package/src/node-singletons/path.js +3 -1
  238. package/src/node-singletons/perf-hooks.d.ts +3 -1
  239. package/src/node-singletons/perf-hooks.d.ts.map +1 -1
  240. package/src/node-singletons/perf-hooks.js +3 -1
  241. package/src/node-singletons/process.d.ts +23 -0
  242. package/src/node-singletons/process.d.ts.map +1 -0
  243. package/src/node-singletons/process.js +8 -0
  244. package/src/node-singletons/readline.d.ts +3 -3
  245. package/src/node-singletons/readline.d.ts.map +1 -1
  246. package/src/node-singletons/readline.js +3 -4
  247. package/src/node-singletons/tls.d.ts +9 -0
  248. package/src/node-singletons/tls.d.ts.map +1 -0
  249. package/src/node-singletons/tls.js +8 -0
  250. package/src/node-singletons/url.d.ts +3 -1
  251. package/src/node-singletons/url.d.ts.map +1 -1
  252. package/src/node-singletons/url.js +3 -1
  253. package/src/orm/ConnectionManager.d.ts +6 -1
  254. package/src/orm/ConnectionManager.d.ts.map +1 -1
  255. package/src/orm/ConnectionManager.js +14 -0
  256. package/src/orm/DatabaseAdapter.d.ts +6 -0
  257. package/src/orm/DatabaseAdapter.d.ts.map +1 -1
  258. package/src/orm/QueryBuilder.d.ts +8 -1
  259. package/src/orm/QueryBuilder.d.ts.map +1 -1
  260. package/src/orm/QueryBuilder.js +188 -28
  261. package/src/orm/adapters/D1Adapter.d.ts.map +1 -1
  262. package/src/orm/adapters/D1Adapter.js +18 -12
  263. package/src/orm/adapters/MySQLAdapter.d.ts.map +1 -1
  264. package/src/orm/adapters/MySQLAdapter.js +4 -0
  265. package/src/orm/adapters/PostgreSQLAdapter.d.ts.map +1 -1
  266. package/src/orm/adapters/PostgreSQLAdapter.js +4 -0
  267. package/src/orm/adapters/SQLServerAdapter.d.ts.map +1 -1
  268. package/src/orm/adapters/SQLServerAdapter.js +4 -0
  269. package/src/orm/adapters/SQLiteAdapter.d.ts.map +1 -1
  270. package/src/orm/adapters/SQLiteAdapter.js +4 -0
  271. package/src/performance/Benchmark.d.ts.map +1 -1
  272. package/src/performance/Benchmark.js +3 -0
  273. package/src/performance/CodeGenerationBenchmark.js +3 -3
  274. package/src/performance/Optimizer.d.ts +1 -1
  275. package/src/performance/Optimizer.d.ts.map +1 -1
  276. package/src/performance/Optimizer.js +157 -80
  277. package/src/performance/establish-baseline.js +3 -3
  278. package/src/runtime/PluginManager.d.ts +3 -1
  279. package/src/runtime/PluginManager.d.ts.map +1 -1
  280. package/src/runtime/PluginManager.js +124 -28
  281. package/src/runtime/RuntimeDetector.d.ts.map +1 -1
  282. package/src/runtime/RuntimeDetector.js +47 -5
  283. package/src/runtime/adapters/CloudflareAdapter.js +2 -2
  284. package/src/runtime/adapters/DenoAdapter.js +9 -7
  285. package/src/runtime/adapters/FargateAdapter.d.ts.map +1 -1
  286. package/src/runtime/adapters/FargateAdapter.js +4 -3
  287. package/src/runtime/adapters/LambdaAdapter.d.ts.map +1 -1
  288. package/src/runtime/adapters/LambdaAdapter.js +4 -2
  289. package/src/runtime/adapters/NodeServerAdapter.d.ts.map +1 -1
  290. package/src/runtime/adapters/NodeServerAdapter.js +7 -6
  291. package/src/scheduler/ScheduleRunner.d.ts +18 -0
  292. package/src/scheduler/ScheduleRunner.d.ts.map +1 -0
  293. package/src/scheduler/ScheduleRunner.js +155 -0
  294. package/src/scheduler/index.d.ts +3 -0
  295. package/src/scheduler/index.d.ts.map +1 -0
  296. package/src/scheduler/index.js +1 -0
  297. package/src/scheduler/types.d.ts +16 -0
  298. package/src/scheduler/types.d.ts.map +1 -0
  299. package/src/scheduler/types.js +4 -0
  300. package/src/schedules/index.d.ts +2 -0
  301. package/src/schedules/index.d.ts.map +1 -0
  302. package/src/schedules/index.js +1 -0
  303. package/src/schedules/log-cleanup.d.ts +4 -0
  304. package/src/schedules/log-cleanup.d.ts.map +1 -0
  305. package/src/schedules/log-cleanup.js +18 -0
  306. package/src/scripts/GenerateEnvArtifacts.d.ts +13 -0
  307. package/src/scripts/GenerateEnvArtifacts.d.ts.map +1 -0
  308. package/src/scripts/GenerateEnvArtifacts.js +171 -0
  309. package/src/scripts/TemplateSync.js +109 -70
  310. package/src/security/CsrfTokenManager.js +1 -1
  311. package/src/security/Encryptor.js +1 -1
  312. package/src/security/Hash.d.ts +14 -0
  313. package/src/security/Hash.d.ts.map +1 -0
  314. package/src/security/Hash.js +81 -0
  315. package/src/security/StartupSecretValidation.d.ts +20 -0
  316. package/src/security/StartupSecretValidation.d.ts.map +1 -0
  317. package/src/security/StartupSecretValidation.js +61 -0
  318. package/src/security/UrlValidator.d.ts +0 -1
  319. package/src/security/UrlValidator.d.ts.map +1 -1
  320. package/src/security/UrlValidator.js +1 -2
  321. package/src/security/Xss.d.ts +14 -0
  322. package/src/security/Xss.d.ts.map +1 -0
  323. package/src/security/Xss.js +57 -0
  324. package/src/security/XssProtection.d.ts.map +1 -1
  325. package/src/security/XssProtection.js +150 -16
  326. package/src/templates/adapters/MySQLAdapter.ts.tpl +5 -0
  327. package/src/templates/adapters/PostgreSQLAdapter.ts.tpl +5 -0
  328. package/src/templates/adapters/SQLServerAdapter.ts.tpl +5 -0
  329. package/src/templates/adapters/SQLiteAdapter.ts.tpl +5 -0
  330. package/src/templates/features/Queue.ts.tpl +1 -29
  331. package/src/templates/project/basic/.env.example.tpl +48 -0
  332. package/src/templates/project/basic/.env.tpl +89 -94
  333. package/src/templates/project/basic/app/Toolkit/Broadcast/sendBroadcast.ts.tpl +7 -0
  334. package/src/templates/project/basic/app/Toolkit/Mail/sendWelcomeEmail.ts.tpl +30 -0
  335. package/src/templates/project/basic/app/Toolkit/Notification/sendSlackNotification.ts.tpl +10 -0
  336. package/src/templates/project/basic/app/Toolkit/Notification/sendSms.ts.tpl +13 -0
  337. package/src/templates/project/basic/config/FileLogWriter.ts.tpl +240 -0
  338. package/src/templates/project/basic/config/SecretsManager.ts.tpl +32 -1
  339. package/src/templates/project/basic/config/StartupConfigValidator.ts.tpl +151 -0
  340. package/src/templates/project/basic/config/app.ts.tpl +84 -15
  341. package/src/templates/project/basic/config/broadcast.ts.tpl +97 -0
  342. package/src/templates/project/basic/config/cache.ts.tpl +19 -23
  343. package/src/templates/project/basic/config/cloudflare.ts.tpl +57 -0
  344. package/src/templates/project/basic/config/env.ts.tpl +7 -1
  345. package/src/templates/project/basic/config/index.ts.tpl +3 -0
  346. package/src/templates/project/basic/config/logger.ts.tpl +301 -11
  347. package/src/templates/project/basic/config/logging/HttpLogger.ts.tpl +121 -0
  348. package/src/templates/project/basic/config/logging/KvLogger.ts.tpl +181 -0
  349. package/src/templates/project/basic/config/logging/SlackLogger.ts.tpl +156 -0
  350. package/src/templates/project/basic/config/mail.ts.tpl +141 -0
  351. package/src/templates/project/basic/config/middleware.ts.tpl +27 -0
  352. package/src/templates/project/basic/config/notification.ts.tpl +86 -0
  353. package/src/templates/project/basic/config/security.ts.tpl +4 -5
  354. package/src/templates/project/basic/config/startup.ts.tpl +27 -0
  355. package/src/templates/project/basic/config/storage.ts.tpl +77 -42
  356. package/src/templates/project/basic/database/migrations/index.ts.tpl +1 -1
  357. package/src/templates/project/basic/package.json.tpl +1 -1
  358. package/src/templates/project/basic/routes/api.ts.tpl +9 -37
  359. package/src/templates/project/basic/routes/broadcast.ts.tpl +32 -0
  360. package/src/templates/project/basic/routes/health.ts.tpl +134 -0
  361. package/src/templates/project/basic/src/index.ts.tpl +38 -11
  362. package/src/templates/project/basic/template.json +3 -0
  363. package/src/toolkit/Secrets/EnvFile.d.ts +15 -0
  364. package/src/toolkit/Secrets/EnvFile.d.ts.map +1 -0
  365. package/src/toolkit/Secrets/EnvFile.js +63 -0
  366. package/src/toolkit/Secrets/Manifest.d.ts +24 -0
  367. package/src/toolkit/Secrets/Manifest.d.ts.map +1 -0
  368. package/src/toolkit/Secrets/Manifest.js +71 -0
  369. package/src/toolkit/Secrets/index.d.ts +42 -0
  370. package/src/toolkit/Secrets/index.d.ts.map +1 -0
  371. package/src/toolkit/Secrets/index.js +119 -0
  372. package/src/toolkit/Secrets/providers/AwsSecretsManager.d.ts +14 -0
  373. package/src/toolkit/Secrets/providers/AwsSecretsManager.d.ts.map +1 -0
  374. package/src/toolkit/Secrets/providers/AwsSecretsManager.js +131 -0
  375. package/src/toolkit/Secrets/providers/CloudflareKv.d.ts +9 -0
  376. package/src/toolkit/Secrets/providers/CloudflareKv.d.ts.map +1 -0
  377. package/src/toolkit/Secrets/providers/CloudflareKv.js +73 -0
  378. package/src/tools/broadcast/Broadcast.d.ts +7 -0
  379. package/src/tools/broadcast/Broadcast.d.ts.map +1 -0
  380. package/src/tools/broadcast/Broadcast.js +37 -0
  381. package/src/tools/broadcast/drivers/BaseDriver.d.ts +5 -0
  382. package/src/tools/broadcast/drivers/BaseDriver.d.ts.map +1 -0
  383. package/src/tools/broadcast/drivers/BaseDriver.js +8 -0
  384. package/src/tools/broadcast/drivers/InMemory.d.ts +18 -0
  385. package/src/tools/broadcast/drivers/InMemory.d.ts.map +1 -0
  386. package/src/tools/broadcast/drivers/InMemory.js +16 -0
  387. package/src/tools/broadcast/drivers/Pusher.d.ts +8 -0
  388. package/src/tools/broadcast/drivers/Pusher.d.ts.map +1 -0
  389. package/src/tools/broadcast/drivers/Pusher.js +75 -0
  390. package/src/tools/broadcast/drivers/Redis.d.ts +19 -0
  391. package/src/tools/broadcast/drivers/Redis.d.ts.map +1 -0
  392. package/src/tools/broadcast/drivers/Redis.js +73 -0
  393. package/src/tools/broadcast/drivers/RedisHttps.d.ts +14 -0
  394. package/src/tools/broadcast/drivers/RedisHttps.d.ts.map +1 -0
  395. package/src/tools/broadcast/drivers/RedisHttps.js +50 -0
  396. package/src/tools/broadcast/index.d.ts +7 -0
  397. package/src/tools/broadcast/index.d.ts.map +1 -0
  398. package/src/tools/broadcast/index.js +6 -0
  399. package/src/tools/http/Http.d.ts +51 -0
  400. package/src/tools/http/Http.d.ts.map +1 -0
  401. package/src/tools/http/Http.js +171 -0
  402. package/src/tools/http/HttpResponse.d.ts +32 -0
  403. package/src/tools/http/HttpResponse.d.ts.map +1 -0
  404. package/src/tools/http/HttpResponse.js +80 -0
  405. package/src/tools/http/index.d.ts +15 -0
  406. package/src/tools/http/index.d.ts.map +1 -0
  407. package/src/tools/http/index.js +9 -0
  408. package/src/tools/mail/Mail.d.ts +22 -0
  409. package/src/tools/mail/Mail.d.ts.map +1 -0
  410. package/src/tools/mail/Mail.js +105 -0
  411. package/src/tools/mail/attachments.d.ts +23 -0
  412. package/src/tools/mail/attachments.d.ts.map +1 -0
  413. package/src/tools/mail/attachments.js +26 -0
  414. package/src/tools/mail/drivers/BaseDriver.d.ts +5 -0
  415. package/src/tools/mail/drivers/BaseDriver.d.ts.map +1 -0
  416. package/src/tools/mail/drivers/BaseDriver.js +8 -0
  417. package/src/tools/mail/drivers/Mailgun.d.ts +31 -0
  418. package/src/tools/mail/drivers/Mailgun.d.ts.map +1 -0
  419. package/src/tools/mail/drivers/Mailgun.js +81 -0
  420. package/src/tools/mail/drivers/SendGrid.d.ts +29 -0
  421. package/src/tools/mail/drivers/SendGrid.d.ts.map +1 -0
  422. package/src/tools/mail/drivers/SendGrid.js +57 -0
  423. package/src/tools/mail/drivers/Ses.d.ts +24 -0
  424. package/src/tools/mail/drivers/Ses.d.ts.map +1 -0
  425. package/src/tools/mail/drivers/Ses.js +116 -0
  426. package/src/tools/mail/drivers/Smtp.d.ts +38 -0
  427. package/src/tools/mail/drivers/Smtp.d.ts.map +1 -0
  428. package/src/tools/mail/drivers/Smtp.js +327 -0
  429. package/src/tools/mail/templates/index.d.ts +27 -0
  430. package/src/tools/mail/templates/index.d.ts.map +1 -0
  431. package/src/tools/mail/templates/index.js +35 -0
  432. package/src/tools/mail/templates/markdown/index.d.ts +17 -0
  433. package/src/tools/mail/templates/markdown/index.d.ts.map +1 -0
  434. package/src/tools/mail/templates/markdown/index.js +49 -0
  435. package/src/tools/mail/templates/markdown/registry.d.ts +15 -0
  436. package/src/tools/mail/templates/markdown/registry.d.ts.map +1 -0
  437. package/src/tools/mail/templates/markdown/registry.js +34 -0
  438. package/src/tools/mail/templates/markdown/validator.d.ts +16 -0
  439. package/src/tools/mail/templates/markdown/validator.d.ts.map +1 -0
  440. package/src/tools/mail/templates/markdown/validator.js +24 -0
  441. package/src/tools/mail/testing.d.ts +41 -0
  442. package/src/tools/mail/testing.d.ts.map +1 -0
  443. package/src/tools/mail/testing.js +34 -0
  444. package/src/tools/notification/Driver.d.ts +11 -0
  445. package/src/tools/notification/Driver.d.ts.map +1 -0
  446. package/src/tools/notification/Driver.js +1 -0
  447. package/src/tools/notification/Notification.d.ts +11 -0
  448. package/src/tools/notification/Notification.d.ts.map +1 -0
  449. package/src/tools/notification/Notification.js +11 -0
  450. package/src/tools/notification/Registry.d.ts +10 -0
  451. package/src/tools/notification/Registry.d.ts.map +1 -0
  452. package/src/tools/notification/Registry.js +22 -0
  453. package/src/tools/notification/Service.d.ts +6 -0
  454. package/src/tools/notification/Service.d.ts.map +1 -0
  455. package/src/tools/notification/Service.js +18 -0
  456. package/src/tools/notification/config.d.ts +5 -0
  457. package/src/tools/notification/config.d.ts.map +1 -0
  458. package/src/tools/notification/config.js +5 -0
  459. package/src/tools/notification/drivers/BaseDriver.d.ts +5 -0
  460. package/src/tools/notification/drivers/BaseDriver.d.ts.map +1 -0
  461. package/src/tools/notification/drivers/BaseDriver.js +8 -0
  462. package/src/tools/notification/drivers/Console.d.ts +7 -0
  463. package/src/tools/notification/drivers/Console.d.ts.map +1 -0
  464. package/src/tools/notification/drivers/Console.js +13 -0
  465. package/src/tools/notification/drivers/Slack.d.ts +16 -0
  466. package/src/tools/notification/drivers/Slack.d.ts.map +1 -0
  467. package/src/tools/notification/drivers/Slack.js +24 -0
  468. package/src/tools/notification/drivers/Termii.d.ts +10 -0
  469. package/src/tools/notification/drivers/Termii.d.ts.map +1 -0
  470. package/src/tools/notification/drivers/Termii.js +47 -0
  471. package/src/tools/notification/drivers/Twilio.d.ts +21 -0
  472. package/src/tools/notification/drivers/Twilio.d.ts.map +1 -0
  473. package/src/tools/notification/drivers/Twilio.js +48 -0
  474. package/src/tools/notification/templates/markdown/index.d.ts +15 -0
  475. package/src/tools/notification/templates/markdown/index.d.ts.map +1 -0
  476. package/src/tools/notification/templates/markdown/index.js +38 -0
  477. package/src/tools/notification/templates/markdown/registry.d.ts +15 -0
  478. package/src/tools/notification/templates/markdown/registry.d.ts.map +1 -0
  479. package/src/tools/notification/templates/markdown/registry.js +36 -0
  480. package/src/tools/notification/testing.d.ts +19 -0
  481. package/src/tools/notification/testing.d.ts.map +1 -0
  482. package/src/tools/notification/testing.js +35 -0
  483. package/src/tools/notification/testingHelpers.d.ts +12 -0
  484. package/src/tools/notification/testingHelpers.d.ts.map +1 -0
  485. package/src/tools/notification/testingHelpers.js +32 -0
  486. package/src/tools/queue/Queue.d.ts +23 -0
  487. package/src/tools/queue/Queue.d.ts.map +1 -0
  488. package/src/tools/queue/Queue.js +38 -0
  489. package/src/tools/queue/drivers/InMemory.d.ts +10 -0
  490. package/src/tools/queue/drivers/InMemory.d.ts.map +1 -0
  491. package/src/tools/queue/drivers/InMemory.js +55 -0
  492. package/src/tools/queue/drivers/Redis.d.ts +10 -0
  493. package/src/tools/queue/drivers/Redis.d.ts.map +1 -0
  494. package/src/tools/queue/drivers/Redis.js +91 -0
  495. package/src/tools/storage/drivers/Gcs.d.ts +20 -0
  496. package/src/tools/storage/drivers/Gcs.d.ts.map +1 -0
  497. package/src/tools/storage/drivers/Gcs.js +152 -0
  498. package/src/tools/storage/drivers/Local.d.ts +17 -0
  499. package/src/tools/storage/drivers/Local.d.ts.map +1 -0
  500. package/src/tools/storage/drivers/Local.js +63 -0
  501. package/src/tools/storage/drivers/R2.d.ts +20 -0
  502. package/src/tools/storage/drivers/R2.d.ts.map +1 -0
  503. package/src/tools/storage/drivers/R2.js +73 -0
  504. package/src/tools/storage/drivers/S3.d.ts +26 -0
  505. package/src/tools/storage/drivers/S3.d.ts.map +1 -0
  506. package/src/tools/storage/drivers/S3.js +258 -0
  507. package/src/tools/storage/index.d.ts +24 -0
  508. package/src/tools/storage/index.d.ts.map +1 -0
  509. package/src/tools/storage/index.js +112 -0
  510. package/src/tools/storage/testing.d.ts +23 -0
  511. package/src/tools/storage/testing.d.ts.map +1 -0
  512. package/src/tools/storage/testing.js +52 -0
  513. package/src/tools/templates/MarkdownRenderer.d.ts +14 -0
  514. package/src/tools/templates/MarkdownRenderer.d.ts.map +1 -0
  515. package/src/tools/templates/MarkdownRenderer.js +300 -0
  516. package/src/tools/templates/index.d.ts +5 -0
  517. package/src/tools/templates/index.d.ts.map +1 -0
  518. package/src/tools/templates/index.js +4 -0
@@ -4,14 +4,13 @@
4
4
  * Runs during npm run build
5
5
  */
6
6
  import { TemplateRegistry } from '../templates/TemplateRegistry.js';
7
+ import { ensureDir, esmDirname } from '../common/index';
7
8
  import { Logger } from '../config/logger';
8
9
  import { ErrorFactory } from '../exceptions/ZintrustError';
9
10
  import * as crypto from '../node-singletons/crypto';
10
11
  import fs from '../node-singletons/fs';
11
- import { fileURLToPath } from '../node-singletons/url';
12
- import * as path from 'node:path';
13
- const __filename = fileURLToPath(import.meta.url);
14
- const __dirname = path.dirname(__filename);
12
+ import * as path from '../node-singletons/path';
13
+ const __dirname = esmDirname(import.meta.url);
15
14
  const ROOT_DIR = path.resolve(__dirname, '../../');
16
15
  /**
17
16
  * Calculate SHA1 hash of file content
@@ -48,14 +47,6 @@ function extractTemplateContent(filePath) {
48
47
  throw ErrorFactory.createTryCatchError(`Failed to extract template from: ${filePath}`, error);
49
48
  }
50
49
  }
51
- /**
52
- * Ensure directory exists, create if needed
53
- */
54
- function ensureDir(dirPath) {
55
- if (!fs.existsSync(dirPath)) {
56
- fs.mkdirSync(dirPath, { recursive: true });
57
- }
58
- }
59
50
  const shouldSkipEntry = (name) => {
60
51
  return (name === 'node_modules' ||
61
52
  name === 'dist' ||
@@ -117,64 +108,28 @@ const syncProjectTemplateDir = (params) => {
117
108
  }
118
109
  return { updated, skipped, total: files.length };
119
110
  };
120
- /**
121
- * Load existing checksums from JSON file
122
- */
123
- function loadChecksums() {
124
- const checksumPath = path.join(ROOT_DIR, '.template-checksums.json');
125
- if (fs.existsSync(checksumPath)) {
126
- try {
127
- const content = fs.readFileSync(checksumPath, 'utf8');
128
- return JSON.parse(content);
129
- }
130
- catch (error) {
131
- Logger.error('Could not parse .template-checksums.json, starting fresh', error);
132
- return {};
133
- }
134
- }
135
- return {};
136
- }
137
- /**
138
- * Save checksums to JSON file
139
- */
140
- function saveChecksums(checksums) {
141
- const checksumPath = path.join(ROOT_DIR, '.template-checksums.json');
142
- fs.writeFileSync(checksumPath, JSON.stringify(checksums, null, 2));
143
- }
144
- /**
145
- * Main sync function
146
- */
147
- // eslint-disable-next-line @typescript-eslint/require-await
148
- async function syncTemplates() {
149
- Logger.info('🔄 Syncing templates...\n');
150
- const checksums = loadChecksums();
151
- const mappings = TemplateRegistry.getMappings();
111
+ const syncRegistryMappings = (params) => {
152
112
  let updated = 0;
153
113
  let skipped = 0;
154
- for (const mapping of mappings) {
114
+ for (const mapping of params.mappings) {
155
115
  const basePath = path.join(ROOT_DIR, mapping.basePath);
156
116
  const templatePath = path.join(ROOT_DIR, mapping.templatePath);
157
- // Check if base file exists
158
117
  if (!fs.existsSync(basePath)) {
159
118
  Logger.warn(`⚠️ Base file not found: ${mapping.basePath}`);
160
119
  continue;
161
120
  }
162
- // Calculate current hash
163
121
  const currentHash = hashFile(basePath);
164
- const storedHash = checksums[mapping.basePath];
165
- // Check if update is needed
122
+ const storedHash = params.checksums[mapping.basePath];
166
123
  if (currentHash === storedHash && fs.existsSync(templatePath)) {
167
124
  Logger.info(`✓ ${mapping.description} (in sync)`);
168
125
  skipped++;
169
126
  continue;
170
127
  }
171
- // Extract and write template
172
128
  try {
173
129
  const templateContent = extractTemplateContent(basePath);
174
130
  ensureDir(path.dirname(templatePath));
175
131
  fs.writeFileSync(templatePath, templateContent, 'utf8');
176
- // Update checksum
177
- checksums[mapping.basePath] = currentHash;
132
+ params.checksums[mapping.basePath] = currentHash;
178
133
  Logger.info(`✓ Updated: ${mapping.description}`);
179
134
  updated++;
180
135
  }
@@ -183,46 +138,130 @@ async function syncTemplates() {
183
138
  process.exit(1);
184
139
  }
185
140
  }
186
- // Sync starter project templates (basic) from base framework folders.
187
- // Spec: app/* -> app/*, src/config/* -> config/*, src/database/* -> database/*, routes/* -> routes/*
188
- // plus .env (generated from .env.example with sensitive values blanked).
189
- Logger.info('');
190
- Logger.info('🔄 Syncing starter project templates (basic)...');
191
- const projectRoot = 'src/templates/project/basic';
141
+ return { updated, skipped };
142
+ };
143
+ const syncStarterEnvTemplate = (params) => {
144
+ const envExampleAbs = fs.existsSync(path.join(ROOT_DIR, '.env.example'))
145
+ ? path.join(ROOT_DIR, '.env.example')
146
+ : path.join(ROOT_DIR, '.env.example.generated');
147
+ const envTemplateAbs = path.join(ROOT_DIR, params.projectRoot, '.env.tpl');
148
+ const envChecksumKey = 'starter/.env';
149
+ if (!fs.existsSync(envExampleAbs)) {
150
+ Logger.warn('⚠️ .env.example not found; skipping starter .env template generation');
151
+ return { updated: 0, skipped: 0, total: 1 };
152
+ }
153
+ const currentHash = hashFile(envExampleAbs);
154
+ const storedHash = params.checksums[envChecksumKey];
155
+ if (currentHash === storedHash && fs.existsSync(envTemplateAbs)) {
156
+ return { updated: 0, skipped: 1, total: 1 };
157
+ }
158
+ const raw = fs.readFileSync(envExampleAbs, 'utf8');
159
+ const lines = raw.split(/\r?\n/);
160
+ const rendered = lines
161
+ .map((line) => {
162
+ if (line.trim() === '' || line.startsWith('#'))
163
+ return line;
164
+ const eq = line.indexOf('=');
165
+ if (eq === -1)
166
+ return line;
167
+ const key = line.slice(0, eq).trim();
168
+ if (key === '')
169
+ return line;
170
+ if (key === 'NODE_ENV')
171
+ return 'NODE_ENV=development';
172
+ return `${key}=`;
173
+ })
174
+ .join('\n') + '\n';
175
+ ensureDir(path.dirname(envTemplateAbs));
176
+ fs.writeFileSync(envTemplateAbs, rendered, 'utf8');
177
+ params.checksums[envChecksumKey] = currentHash;
178
+ Logger.info('✓ Starter project .env (generated)');
179
+ return { updated: 1, skipped: 0, total: 1 };
180
+ };
181
+ const syncStarterProjectTemplates = (params) => {
192
182
  const s1 = syncProjectTemplateDir({
193
- checksums,
183
+ checksums: params.checksums,
194
184
  baseDirRel: 'app',
195
- templateDirRel: `${projectRoot}/app`,
185
+ templateDirRel: `${params.projectRoot}/app`,
196
186
  description: 'Starter project app/*',
197
187
  });
198
188
  const s2 = syncProjectTemplateDir({
199
- checksums,
189
+ checksums: params.checksums,
200
190
  baseDirRel: 'src/config',
201
- templateDirRel: `${projectRoot}/config`,
191
+ templateDirRel: `${params.projectRoot}/config`,
202
192
  description: 'Starter project config/* (from src/config/*)',
203
193
  });
204
194
  const s3 = syncProjectTemplateDir({
205
- checksums,
195
+ checksums: params.checksums,
206
196
  baseDirRel: 'src/database',
207
- templateDirRel: `${projectRoot}/database`,
197
+ templateDirRel: `${params.projectRoot}/database`,
208
198
  description: 'Starter project database/* (from src/database/*)',
209
199
  });
210
200
  const s4 = syncProjectTemplateDir({
211
- checksums,
201
+ checksums: params.checksums,
212
202
  baseDirRel: 'routes',
213
- templateDirRel: `${projectRoot}/routes`,
203
+ templateDirRel: `${params.projectRoot}/routes`,
214
204
  description: 'Starter project routes/*',
215
205
  });
216
- const s5 = { updated: 0, skipped: 0 };
217
- updated += s1.updated + s2.updated + s3.updated + s4.updated + s5.updated;
218
- skipped += s1.skipped + s2.skipped + s3.skipped + s4.skipped + s5.skipped;
206
+ const s5 = syncStarterEnvTemplate({
207
+ checksums: params.checksums,
208
+ projectRoot: params.projectRoot,
209
+ });
210
+ return {
211
+ updated: s1.updated + s2.updated + s3.updated + s4.updated + s5.updated,
212
+ skipped: s1.skipped + s2.skipped + s3.skipped + s4.skipped + s5.skipped,
213
+ total: s1.total + s2.total + s3.total + s4.total + s5.total,
214
+ };
215
+ };
216
+ /**
217
+ * Load existing checksums from JSON file
218
+ */
219
+ function loadChecksums() {
220
+ const checksumPath = path.join(ROOT_DIR, '.template-checksums.json');
221
+ if (fs.existsSync(checksumPath)) {
222
+ try {
223
+ const content = fs.readFileSync(checksumPath, 'utf8');
224
+ return JSON.parse(content);
225
+ }
226
+ catch (error) {
227
+ Logger.error('Could not parse .template-checksums.json, starting fresh', error);
228
+ return {};
229
+ }
230
+ }
231
+ return {};
232
+ }
233
+ /**
234
+ * Save checksums to JSON file
235
+ */
236
+ function saveChecksums(checksums) {
237
+ const checksumPath = path.join(ROOT_DIR, '.template-checksums.json');
238
+ fs.writeFileSync(checksumPath, JSON.stringify(checksums, null, 2));
239
+ }
240
+ /**
241
+ * Main sync function
242
+ */
243
+ // eslint-disable-next-line @typescript-eslint/require-await
244
+ async function syncTemplates() {
245
+ Logger.info('🔄 Syncing templates...\n');
246
+ const checksums = loadChecksums();
247
+ const mappings = TemplateRegistry.getMappings();
248
+ const registry = syncRegistryMappings({ checksums, mappings });
249
+ // Sync starter project templates (basic) from base framework folders.
250
+ // Spec: app/* -> app/*, src/config/* -> config/*, src/database/* -> database/*, routes/* -> routes/*
251
+ // plus .env (generated from .env.example with sensitive values blanked).
252
+ Logger.info('');
253
+ Logger.info('🔄 Syncing starter project templates (basic)...');
254
+ const projectRoot = 'src/templates/project/basic';
255
+ const starter = syncStarterProjectTemplates({ checksums, projectRoot });
219
256
  // Save updated checksums
220
257
  saveChecksums(checksums);
221
258
  // Summary
259
+ const updated = registry.updated + starter.updated;
260
+ const skipped = registry.skipped + starter.skipped;
222
261
  Logger.info(`\n📦 Template sync complete`);
223
262
  Logger.info(` Updated: ${updated}`);
224
263
  Logger.info(` Skipped: ${skipped}`);
225
- Logger.info(` Total: ${mappings.length + s1.total + s2.total + s3.total + s4.total}\n`);
264
+ Logger.info(` Total: ${mappings.length + starter.total}\n`);
226
265
  }
227
266
  // Run sync
228
267
  try {
@@ -3,7 +3,7 @@
3
3
  * Generate, validate, and bind CSRF tokens to sessions
4
4
  */
5
5
  import { Env } from '../config/env';
6
- import { randomBytes } from 'node:crypto';
6
+ import { randomBytes } from '../node-singletons/crypto';
7
7
  /**
8
8
  * Create a new CSRF token manager instance
9
9
  */
@@ -4,7 +4,7 @@
4
4
  */
5
5
  import { Logger } from '../config/logger';
6
6
  import { ErrorFactory } from '../exceptions/ZintrustError';
7
- import { pbkdf2Sync, randomBytes } from 'node:crypto';
7
+ import { pbkdf2Sync, randomBytes } from '../node-singletons/crypto';
8
8
  function isBcryptModule(value) {
9
9
  if (typeof value !== 'object' || value === null)
10
10
  return false;
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Hash
3
+ * bcrypt-based password hashing utility.
4
+ *
5
+ * Runtime-aware: uses dynamic import for bcrypt.
6
+ */
7
+ export declare const Hash: Readonly<{
8
+ isValidHash(hash: string): boolean;
9
+ hash(plaintext: string): Promise<string>;
10
+ hashWithRounds(plaintext: string, rounds: number): Promise<string>;
11
+ verify(plaintext: string, hashed: string): Promise<boolean>;
12
+ }>;
13
+ export default Hash;
14
+ //# sourceMappingURL=Hash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Hash.d.ts","sourceRoot":"","sources":["../../../src/security/Hash.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA+CH,eAAO,MAAM,IAAI;sBACG,MAAM,GAAG,OAAO;oBAIZ,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;8BAUd,MAAM,UAAU,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;sBAgBhD,MAAM,UAAU,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;EAWjE,CAAC;AAEH,eAAe,IAAI,CAAC"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Hash
3
+ * bcrypt-based password hashing utility.
4
+ *
5
+ * Runtime-aware: uses dynamic import for bcrypt.
6
+ */
7
+ import { Logger } from '../config/logger';
8
+ import { ErrorFactory } from '../exceptions/ZintrustError';
9
+ function isBcryptModule(value) {
10
+ if (typeof value !== 'object' || value === null)
11
+ return false;
12
+ const record = value;
13
+ return typeof record['hash'] === 'function' && typeof record['compare'] === 'function';
14
+ }
15
+ let bcrypt;
16
+ let loadingPromise;
17
+ async function loadBcrypt() {
18
+ const imported = await import('bcrypt');
19
+ const module = imported;
20
+ const candidate = module.default ?? module;
21
+ if (!isBcryptModule(candidate)) {
22
+ throw ErrorFactory.createConfigError('Invalid bcrypt module shape');
23
+ }
24
+ bcrypt = candidate;
25
+ }
26
+ async function ensureBcrypt() {
27
+ if (bcrypt !== undefined)
28
+ return bcrypt;
29
+ loadingPromise ??= loadBcrypt().catch((error) => {
30
+ Logger.error('bcrypt unavailable', error);
31
+ throw ErrorFactory.createConfigError('bcrypt unavailable', error);
32
+ });
33
+ await loadingPromise;
34
+ if (bcrypt === undefined) {
35
+ throw ErrorFactory.createConfigError('bcrypt unavailable');
36
+ }
37
+ return bcrypt;
38
+ }
39
+ const BCRYPT_HASH_RE = /^\$2[aby]\$\d{2}\$[./A-Za-z0-9]{53}$/;
40
+ export const Hash = Object.freeze({
41
+ isValidHash(hash) {
42
+ return BCRYPT_HASH_RE.test(hash);
43
+ },
44
+ async hash(plaintext) {
45
+ const bcryptModule = await ensureBcrypt();
46
+ try {
47
+ return await bcryptModule.hash(plaintext, 12);
48
+ }
49
+ catch (error) {
50
+ Logger.error('Password hashing failed', error);
51
+ throw ErrorFactory.createSecurityError('Password hashing failed', error);
52
+ }
53
+ },
54
+ async hashWithRounds(plaintext, rounds) {
55
+ const bcryptModule = await ensureBcrypt();
56
+ const normalizedRounds = Number.isFinite(rounds) ? Math.trunc(rounds) : 0;
57
+ if (normalizedRounds <= 0) {
58
+ throw ErrorFactory.createConfigError('Invalid bcrypt rounds', { rounds });
59
+ }
60
+ try {
61
+ return await bcryptModule.hash(plaintext, normalizedRounds);
62
+ }
63
+ catch (error) {
64
+ Logger.error('Password hashing failed', error);
65
+ throw ErrorFactory.createSecurityError('Password hashing failed', error);
66
+ }
67
+ },
68
+ async verify(plaintext, hashed) {
69
+ if (!Hash.isValidHash(hashed))
70
+ return false;
71
+ try {
72
+ const bcryptModule = await ensureBcrypt();
73
+ return await bcryptModule.compare(plaintext, hashed);
74
+ }
75
+ catch (error) {
76
+ Logger.error('Password verify failed', error);
77
+ return false;
78
+ }
79
+ },
80
+ });
81
+ export default Hash;
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Startup Secret Validation
3
+ *
4
+ * Validates critical secrets early at boot time so production misconfiguration
5
+ * fails fast and predictably.
6
+ */
7
+ export type StartupSecretValidationError = {
8
+ key: string;
9
+ message: string;
10
+ };
11
+ export type StartupSecretValidationResult = {
12
+ valid: boolean;
13
+ errors: StartupSecretValidationError[];
14
+ };
15
+ export declare const StartupSecretValidation: Readonly<{
16
+ validate(): StartupSecretValidationResult;
17
+ assertValid(): void;
18
+ }>;
19
+ export default StartupSecretValidation;
20
+ //# sourceMappingURL=StartupSecretValidation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StartupSecretValidation.d.ts","sourceRoot":"","sources":["../../../src/security/StartupSecretValidation.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,MAAM,MAAM,4BAA4B,GAAG;IACzC,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,6BAA6B,GAAG;IAC1C,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,4BAA4B,EAAE,CAAC;CACxC,CAAC;AA6BF,eAAO,MAAM,uBAAuB;gBACtB,6BAA6B;mBAe1B,IAAI;EAQnB,CAAC;AAEH,eAAe,uBAAuB,CAAC"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Startup Secret Validation
3
+ *
4
+ * Validates critical secrets early at boot time so production misconfiguration
5
+ * fails fast and predictably.
6
+ */
7
+ import { appConfig } from '../config/app';
8
+ import { securityConfig } from '../config/security';
9
+ import { startupConfig } from '../config/startup';
10
+ import { ErrorFactory } from '../exceptions/ZintrustError';
11
+ const validateApiKeySecret = () => {
12
+ if (!securityConfig.apiKey.enabled)
13
+ return null;
14
+ const secret = (securityConfig.apiKey.secret ?? '').trim();
15
+ if (secret.length > 0)
16
+ return null;
17
+ return {
18
+ key: 'API_KEY_SECRET',
19
+ message: 'API_KEY_SECRET must be set when API key auth is enabled',
20
+ };
21
+ };
22
+ const validateJwtSecret = () => {
23
+ if (!securityConfig.jwt.enabled)
24
+ return null;
25
+ try {
26
+ const secret = securityConfig.jwt.secret.trim();
27
+ if (secret.length === 0) {
28
+ return { key: 'JWT_SECRET', message: 'JWT_SECRET must be set when JWT is enabled' };
29
+ }
30
+ return null;
31
+ }
32
+ catch (error) {
33
+ const message = error instanceof Error ? error.message : 'Unknown error';
34
+ return { key: 'JWT_SECRET', message };
35
+ }
36
+ };
37
+ export const StartupSecretValidation = Object.freeze({
38
+ validate() {
39
+ if (!startupConfig.validateSecrets)
40
+ return { valid: true, errors: [] };
41
+ if (!appConfig.isProduction())
42
+ return { valid: true, errors: [] };
43
+ const errors = [];
44
+ const jwtError = validateJwtSecret();
45
+ if (jwtError !== null)
46
+ errors.push(jwtError);
47
+ const apiKeyError = validateApiKeySecret();
48
+ if (apiKeyError !== null)
49
+ errors.push(apiKeyError);
50
+ return { valid: errors.length === 0, errors };
51
+ },
52
+ assertValid() {
53
+ const result = StartupSecretValidation.validate();
54
+ if (result.valid)
55
+ return;
56
+ throw ErrorFactory.createConfigError('Invalid startup secret configuration', {
57
+ errors: result.errors,
58
+ });
59
+ },
60
+ });
61
+ export default StartupSecretValidation;
@@ -3,7 +3,6 @@
3
3
  * Mitigates SSRF (SonarQube S5144)
4
4
  */
5
5
  export interface IUrlValidator {
6
- validate(url: string, allowedDomains?: string[]): void;
7
6
  validateUrl(url: string, allowedDomains?: string[]): void;
8
7
  }
9
8
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"UrlValidator.d.ts","sourceRoot":"","sources":["../../../src/security/UrlValidator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACvD,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;CAC3D;AAED;;;GAGG;AACH,QAAA,MAAM,QAAQ,GAAI,KAAK,MAAM,EAAE,iBAAgB,MAAM,EAA+B,KAAG,IAyBtF,CAAC;AAEF,QAAA,MAAM,WAAW,GAAI,KAAK,MAAM,EAAE,iBAAiB,MAAM,EAAE,KAAG,IAE7D,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,aAGzB,CAAC;AAGH,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC"}
1
+ {"version":3,"file":"UrlValidator.d.ts","sourceRoot":"","sources":["../../../src/security/UrlValidator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,WAAW,aAAa;IAC5B,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;CAC3D;AAED;;;GAGG;AACH,QAAA,MAAM,QAAQ,GAAI,KAAK,MAAM,EAAE,iBAAgB,MAAM,EAA+B,KAAG,IAyBtF,CAAC;AAEF,QAAA,MAAM,WAAW,GAAI,KAAK,MAAM,EAAE,iBAAiB,MAAM,EAAE,KAAG,IAE7D,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,aAGzB,CAAC;AAGH,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC"}
@@ -2,7 +2,6 @@
2
2
  * Security Utilities
3
3
  * Mitigates SSRF (SonarQube S5144)
4
4
  */
5
- import { Env } from '../config/env';
6
5
  import { ErrorFactory } from '../exceptions/ZintrustError';
7
6
  /**
8
7
  * Validate URL for SSRF protection
@@ -15,7 +14,7 @@ const validate = (url, allowedDomains = ['localhost', '127.0.0.1']) => {
15
14
  // In a real microservices environment, we would check against a service registry
16
15
  // For now, we allow localhost and any domain in the allowed list
17
16
  const isAllowed = allowedDomains.some((domain) => hostname === domain || hostname.endsWith(`.${domain}`));
18
- if (!isAllowed && Env.NODE_ENV === 'production') {
17
+ if (!isAllowed) {
19
18
  throw ErrorFactory.createValidationError(`URL hostname '${hostname}' is not allowed (SSRF Protection)`, { hostname });
20
19
  }
21
20
  }
@@ -0,0 +1,14 @@
1
+ /**
2
+ * XSS Sanitizer
3
+ * Recursive, zero-dependency input sanitization utility.
4
+ *
5
+ * This is intentionally conservative:
6
+ * - Strings: strip tags, then escape HTML entities.
7
+ * - Arrays/Objects: sanitize recursively.
8
+ */
9
+ export interface IXss {
10
+ sanitize(input: unknown): unknown;
11
+ }
12
+ export declare const Xss: IXss;
13
+ export default Xss;
14
+ //# sourceMappingURL=Xss.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Xss.d.ts","sourceRoot":"","sources":["../../../src/security/Xss.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAwDH,MAAM,WAAW,IAAI;IACnB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC;CACnC;AAED,eAAO,MAAM,GAAG,EAAE,IAIhB,CAAC;AAEH,eAAe,GAAG,CAAC"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * XSS Sanitizer
3
+ * Recursive, zero-dependency input sanitization utility.
4
+ *
5
+ * This is intentionally conservative:
6
+ * - Strings: strip tags, then escape HTML entities.
7
+ * - Arrays/Objects: sanitize recursively.
8
+ */
9
+ import { XssProtection } from './XssProtection';
10
+ const stripTags = (value) => {
11
+ // Remove all HTML tags in linear time (no regex backtracking / ReDoS risk).
12
+ let out = '';
13
+ let inTag = false;
14
+ for (const element of value) {
15
+ const ch = element;
16
+ if (ch === '<') {
17
+ inTag = true;
18
+ continue;
19
+ }
20
+ if (inTag) {
21
+ if (ch === '>')
22
+ inTag = false;
23
+ continue;
24
+ }
25
+ out += ch;
26
+ }
27
+ return out;
28
+ };
29
+ const sanitizeRecursive = (input, seen) => {
30
+ if (typeof input === 'string') {
31
+ return XssProtection.escape(stripTags(input));
32
+ }
33
+ if (Array.isArray(input)) {
34
+ if (seen.has(input))
35
+ return input;
36
+ seen.add(input);
37
+ return input.map((item) => sanitizeRecursive(item, seen));
38
+ }
39
+ if (typeof input === 'object' && input !== null) {
40
+ const obj = input;
41
+ if (seen.has(obj))
42
+ return input;
43
+ seen.add(obj);
44
+ const out = {};
45
+ for (const [key, value] of Object.entries(obj)) {
46
+ out[key] = sanitizeRecursive(value, seen);
47
+ }
48
+ return out;
49
+ }
50
+ return input;
51
+ };
52
+ export const Xss = Object.freeze({
53
+ sanitize(input) {
54
+ return sanitizeRecursive(input, new WeakSet());
55
+ },
56
+ });
57
+ export default Xss;
@@ -1 +1 @@
1
- {"version":3,"file":"XssProtection.d.ts","sourceRoot":"","sources":["../../../src/security/XssProtection.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAyIH;;GAEG;AACH,eAAO,MAAM,UAAU,GAAI,KAAK,OAAO,KAAG,MAGzC,CAAC;AAEF,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAC/B,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;IAC/B,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACjC,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAChC,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAAC;CAClC;AAED;;;;GAIG;AACH,eAAO,MAAM,aAAa,EAAE,cAO1B,CAAC"}
1
+ {"version":3,"file":"XssProtection.d.ts","sourceRoot":"","sources":["../../../src/security/XssProtection.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAoSH;;GAEG;AACH,eAAO,MAAM,UAAU,GAAI,KAAK,OAAO,KAAG,MAGzC,CAAC;AAEF,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAC/B,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;IAC/B,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACjC,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAChC,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAAC;CAClC;AAED;;;;GAIG;AACH,eAAO,MAAM,aAAa,EAAE,cAO1B,CAAC"}