@zintrust/core 0.1.19 → 0.1.21

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 (528) hide show
  1. package/README.md +10 -10
  2. package/bin/zintrust-main.d.ts.map +1 -1
  3. package/bin/zintrust-main.js +9 -0
  4. package/package.json +3 -2
  5. package/public/error-pages/404.html +145 -0
  6. package/public/error-pages/500.html +266 -0
  7. package/public/error-pages/error.css +628 -0
  8. package/public/error-pages/error.js +428 -0
  9. package/public/zintrust.svg +30 -0
  10. package/routes/api.d.ts.map +1 -1
  11. package/routes/api.js +41 -17
  12. package/routes/metrics.d.ts +9 -0
  13. package/routes/metrics.d.ts.map +1 -0
  14. package/routes/metrics.js +20 -0
  15. package/routes/openapi.d.ts +9 -0
  16. package/routes/openapi.d.ts.map +1 -0
  17. package/routes/openapi.js +76 -0
  18. package/src/boot/Application.d.ts +2 -2
  19. package/src/boot/Application.d.ts.map +1 -1
  20. package/src/boot/Application.js +66 -13
  21. package/src/boot/Server.d.ts +3 -2
  22. package/src/boot/Server.d.ts.map +1 -1
  23. package/src/boot/Server.js +39 -165
  24. package/src/boot/bootstrap.js +2 -0
  25. package/src/cache/Cache.d.ts +1 -1
  26. package/src/cache/Cache.d.ts.map +1 -1
  27. package/src/cache/CacheDriver.d.ts +4 -0
  28. package/src/cache/CacheDriver.d.ts.map +1 -1
  29. package/src/cache/drivers/KVDriver.d.ts +1 -1
  30. package/src/cache/drivers/KVDriver.d.ts.map +1 -1
  31. package/src/cache/drivers/MemoryDriver.d.ts +1 -1
  32. package/src/cache/drivers/MemoryDriver.d.ts.map +1 -1
  33. package/src/cache/drivers/MemoryDriver.js +16 -0
  34. package/src/cache/drivers/MongoDriver.d.ts +1 -1
  35. package/src/cache/drivers/MongoDriver.d.ts.map +1 -1
  36. package/src/cache/drivers/RedisDriver.d.ts +1 -1
  37. package/src/cache/drivers/RedisDriver.d.ts.map +1 -1
  38. package/src/cli/CLI.d.ts.map +1 -1
  39. package/src/cli/CLI.js +10 -4
  40. package/src/cli/commands/AddCommand.d.ts +2 -2
  41. package/src/cli/commands/AddCommand.d.ts.map +1 -1
  42. package/src/cli/commands/AddCommand.js +135 -58
  43. package/src/cli/commands/ConfigCommand.d.ts +1 -1
  44. package/src/cli/commands/ConfigCommand.d.ts.map +1 -1
  45. package/src/cli/commands/CreateCommand.d.ts +15 -0
  46. package/src/cli/commands/CreateCommand.d.ts.map +1 -0
  47. package/src/cli/commands/CreateCommand.js +143 -0
  48. package/src/cli/commands/D1MigrateCommand.d.ts +1 -1
  49. package/src/cli/commands/D1MigrateCommand.d.ts.map +1 -1
  50. package/src/cli/commands/D1MigrateCommand.js +16 -20
  51. package/src/cli/commands/DbSeedCommand.d.ts +9 -0
  52. package/src/cli/commands/DbSeedCommand.d.ts.map +1 -0
  53. package/src/cli/commands/DbSeedCommand.js +171 -0
  54. package/src/cli/commands/DebugCommand.d.ts +1 -1
  55. package/src/cli/commands/DebugCommand.d.ts.map +1 -1
  56. package/src/cli/commands/FixCommand.d.ts +1 -1
  57. package/src/cli/commands/FixCommand.d.ts.map +1 -1
  58. package/src/cli/commands/JwtDevCommand.d.ts +8 -0
  59. package/src/cli/commands/JwtDevCommand.d.ts.map +1 -0
  60. package/src/cli/commands/JwtDevCommand.js +114 -0
  61. package/src/cli/commands/KeyGenerateCommand.d.ts +1 -1
  62. package/src/cli/commands/KeyGenerateCommand.d.ts.map +1 -1
  63. package/src/cli/commands/LogsCommand.d.ts +2 -2
  64. package/src/cli/commands/LogsCommand.d.ts.map +1 -1
  65. package/src/cli/commands/LogsCommand.js +36 -2
  66. package/src/cli/commands/MakeMailTemplateCommand.d.ts +1 -1
  67. package/src/cli/commands/MakeMailTemplateCommand.d.ts.map +1 -1
  68. package/src/cli/commands/MakeNotificationTemplateCommand.d.ts +1 -1
  69. package/src/cli/commands/MakeNotificationTemplateCommand.d.ts.map +1 -1
  70. package/src/cli/commands/MigrateCommand.d.ts +1 -1
  71. package/src/cli/commands/MigrateCommand.d.ts.map +1 -1
  72. package/src/cli/commands/MigrateCommand.js +324 -35
  73. package/src/cli/commands/NewCommand.d.ts +1 -1
  74. package/src/cli/commands/NewCommand.d.ts.map +1 -1
  75. package/src/cli/commands/NewCommand.js +12 -4
  76. package/src/cli/commands/PluginCommand.d.ts +1 -1
  77. package/src/cli/commands/PluginCommand.d.ts.map +1 -1
  78. package/src/cli/commands/PrepareCommand.d.ts +1 -1
  79. package/src/cli/commands/PrepareCommand.d.ts.map +1 -1
  80. package/src/cli/commands/QACommand.d.ts +2 -2
  81. package/src/cli/commands/QACommand.d.ts.map +1 -1
  82. package/src/cli/commands/RoutesCommand.d.ts +10 -0
  83. package/src/cli/commands/RoutesCommand.d.ts.map +1 -0
  84. package/src/cli/commands/RoutesCommand.js +242 -0
  85. package/src/cli/commands/SimulateCommand.d.ts +1 -1
  86. package/src/cli/commands/SimulateCommand.d.ts.map +1 -1
  87. package/src/cli/commands/index.d.ts +3 -0
  88. package/src/cli/commands/index.d.ts.map +1 -1
  89. package/src/cli/commands/index.js +3 -0
  90. package/src/cli/config/ConfigManager.d.ts +1 -1
  91. package/src/cli/config/ConfigManager.d.ts.map +1 -1
  92. package/src/cli/config/ConfigValidator.d.ts +1 -1
  93. package/src/cli/config/ConfigValidator.d.ts.map +1 -1
  94. package/src/cli/config/ConfigValidator.js +1 -1
  95. package/src/cli/d1/D1SqlMigrations.d.ts +20 -0
  96. package/src/cli/d1/D1SqlMigrations.d.ts.map +1 -0
  97. package/src/cli/d1/D1SqlMigrations.js +229 -0
  98. package/src/cli/d1/WranglerConfig.d.ts +4 -0
  99. package/src/cli/d1/WranglerConfig.d.ts.map +1 -0
  100. package/src/cli/d1/WranglerConfig.js +122 -0
  101. package/src/cli/d1/WranglerD1.d.ts +11 -0
  102. package/src/cli/d1/WranglerD1.d.ts.map +1 -0
  103. package/src/cli/d1/WranglerD1.js +16 -0
  104. package/src/cli/scaffolding/ControllerGenerator.d.ts.map +1 -1
  105. package/src/cli/scaffolding/ControllerGenerator.js +76 -26
  106. package/src/cli/scaffolding/FactoryGenerator.d.ts.map +1 -1
  107. package/src/cli/scaffolding/FactoryGenerator.js +3 -1
  108. package/src/cli/scaffolding/GovernanceScaffolder.d.ts +23 -0
  109. package/src/cli/scaffolding/GovernanceScaffolder.d.ts.map +1 -0
  110. package/src/cli/scaffolding/GovernanceScaffolder.js +327 -0
  111. package/src/cli/scaffolding/MigrationGenerator.d.ts +10 -0
  112. package/src/cli/scaffolding/MigrationGenerator.d.ts.map +1 -1
  113. package/src/cli/scaffolding/MigrationGenerator.js +137 -51
  114. package/src/cli/scaffolding/ModelGenerator.js +1 -1
  115. package/src/cli/scaffolding/ProjectScaffolder.d.ts.map +1 -1
  116. package/src/cli/scaffolding/ProjectScaffolder.js +36 -4
  117. package/src/cli/scaffolding/RouteGenerator.d.ts.map +1 -1
  118. package/src/cli/scaffolding/RouteGenerator.js +79 -43
  119. package/src/cli/scaffolding/SeederGenerator.d.ts +5 -0
  120. package/src/cli/scaffolding/SeederGenerator.d.ts.map +1 -1
  121. package/src/cli/scaffolding/SeederGenerator.js +63 -15
  122. package/src/cli/scaffolding/ServiceScaffolder.d.ts.map +1 -1
  123. package/src/cli/scaffolding/ServiceScaffolder.js +28 -7
  124. package/src/cli/scaffolding/index.d.ts +2 -0
  125. package/src/cli/scaffolding/index.d.ts.map +1 -1
  126. package/src/cli/scaffolding/index.js +1 -0
  127. package/src/common/index.d.ts +8 -0
  128. package/src/common/index.d.ts.map +1 -1
  129. package/src/common/index.js +28 -0
  130. package/src/common/utility.d.ts +38 -0
  131. package/src/common/utility.d.ts.map +1 -0
  132. package/src/common/utility.js +101 -0
  133. package/src/config/FileLogWriter.d.ts +2 -1
  134. package/src/config/FileLogWriter.d.ts.map +1 -1
  135. package/src/config/FileLogWriter.js +83 -2
  136. package/src/config/app.d.ts.map +1 -1
  137. package/src/config/app.js +3 -1
  138. package/src/config/broadcast.d.ts +14 -28
  139. package/src/config/broadcast.d.ts.map +1 -1
  140. package/src/config/broadcast.js +69 -35
  141. package/src/config/cache.d.ts +13 -45
  142. package/src/config/cache.d.ts.map +1 -1
  143. package/src/config/cache.js +69 -25
  144. package/src/config/cloudflare.d.ts +1 -1
  145. package/src/config/cloudflare.d.ts.map +1 -1
  146. package/src/config/database.d.ts +22 -64
  147. package/src/config/database.d.ts.map +1 -1
  148. package/src/config/database.js +191 -37
  149. package/src/config/env.d.ts +12 -0
  150. package/src/config/env.d.ts.map +1 -1
  151. package/src/config/env.js +14 -0
  152. package/src/config/index.d.ts +33 -137
  153. package/src/config/index.d.ts.map +1 -1
  154. package/src/config/logging/KvLogger.js +1 -1
  155. package/src/config/logging/SlackLogger.js +2 -2
  156. package/src/config/mail.d.ts +19 -55
  157. package/src/config/mail.d.ts.map +1 -1
  158. package/src/config/mail.js +63 -21
  159. package/src/config/middleware.d.ts +44 -1
  160. package/src/config/middleware.d.ts.map +1 -1
  161. package/src/config/middleware.js +157 -5
  162. package/src/config/notification.d.ts +14 -27
  163. package/src/config/notification.d.ts.map +1 -1
  164. package/src/config/notification.js +82 -36
  165. package/src/config/queue.d.ts +21 -51
  166. package/src/config/queue.d.ts.map +1 -1
  167. package/src/config/queue.js +72 -27
  168. package/src/config/security.d.ts +1 -1
  169. package/src/config/security.js +1 -1
  170. package/src/config/storage.d.ts +27 -34
  171. package/src/config/storage.d.ts.map +1 -1
  172. package/src/config/storage.js +97 -56
  173. package/src/config/type.d.ts +13 -2
  174. package/src/config/type.d.ts.map +1 -1
  175. package/src/events/EventDispatcher.d.ts.map +1 -1
  176. package/src/events/EventDispatcher.js +6 -4
  177. package/src/exceptions/ZintrustError.d.ts +7 -0
  178. package/src/exceptions/ZintrustError.d.ts.map +1 -1
  179. package/src/exceptions/ZintrustError.js +56 -0
  180. package/src/features/Auth.d.ts +1 -1
  181. package/src/features/Auth.d.ts.map +1 -1
  182. package/src/features/Auth.js +3 -3
  183. package/src/features/Queue.js +1 -1
  184. package/src/functions/cloudflare.d.ts.map +1 -1
  185. package/src/functions/cloudflare.js +3 -14
  186. package/src/functions/deno.d.ts.map +1 -1
  187. package/src/functions/deno.js +3 -14
  188. package/src/functions/lambda.d.ts.map +1 -1
  189. package/src/functions/lambda.js +3 -14
  190. package/src/health/StartupHealthChecks.js +1 -1
  191. package/src/http/Controller.d.ts +2 -2
  192. package/src/http/Controller.d.ts.map +1 -1
  193. package/src/http/FileUpload.d.ts +68 -0
  194. package/src/http/FileUpload.d.ts.map +1 -0
  195. package/src/http/FileUpload.js +120 -0
  196. package/src/http/Kernel.d.ts +5 -5
  197. package/src/http/Kernel.d.ts.map +1 -1
  198. package/src/http/Kernel.js +139 -23
  199. package/src/http/Request.d.ts +20 -1
  200. package/src/http/Request.d.ts.map +1 -1
  201. package/src/http/Request.js +23 -0
  202. package/src/http/RequestContext.d.ts +6 -0
  203. package/src/http/RequestContext.d.ts.map +1 -1
  204. package/src/http/RequestContext.js +77 -1
  205. package/src/http/Response.d.ts +1 -1
  206. package/src/http/Response.d.ts.map +1 -1
  207. package/src/http/ValidationHelper.d.ts +78 -0
  208. package/src/http/ValidationHelper.d.ts.map +1 -0
  209. package/src/http/ValidationHelper.js +121 -0
  210. package/src/http/error-pages/ErrorPageRenderer.d.ts +17 -0
  211. package/src/http/error-pages/ErrorPageRenderer.d.ts.map +1 -0
  212. package/src/http/error-pages/ErrorPageRenderer.js +88 -0
  213. package/src/http/middleware/BodyParsingMiddleware.d.ts +12 -0
  214. package/src/http/middleware/BodyParsingMiddleware.d.ts.map +1 -0
  215. package/src/http/middleware/BodyParsingMiddleware.js +251 -0
  216. package/src/http/middleware/FileUploadMiddleware.d.ts +12 -0
  217. package/src/http/middleware/FileUploadMiddleware.d.ts.map +1 -0
  218. package/src/http/middleware/FileUploadMiddleware.js +74 -0
  219. package/src/http/parsers/BodyParsers.d.ts +32 -0
  220. package/src/http/parsers/BodyParsers.d.ts.map +1 -0
  221. package/src/http/parsers/BodyParsers.js +159 -0
  222. package/src/http/parsers/MultipartParser.d.ts +33 -0
  223. package/src/http/parsers/MultipartParser.d.ts.map +1 -0
  224. package/src/http/parsers/MultipartParser.js +156 -0
  225. package/src/http/parsers/MultipartParserRegistry.d.ts +34 -0
  226. package/src/http/parsers/MultipartParserRegistry.d.ts.map +1 -0
  227. package/src/http/parsers/MultipartParserRegistry.js +20 -0
  228. package/src/http/validated.d.ts +12 -0
  229. package/src/http/validated.d.ts.map +1 -0
  230. package/src/http/validated.js +41 -0
  231. package/src/index.d.ts +73 -12
  232. package/src/index.d.ts.map +1 -1
  233. package/src/index.js +60 -5
  234. package/src/microservices/PostgresAdapter.d.ts.map +1 -1
  235. package/src/microservices/PostgresAdapter.js +0 -1
  236. package/src/microservices/RequestTracingMiddleware.d.ts +2 -2
  237. package/src/microservices/RequestTracingMiddleware.d.ts.map +1 -1
  238. package/src/microservices/RequestTracingMiddleware.js +3 -0
  239. package/src/microservices/ServiceAuthMiddleware.d.ts +2 -2
  240. package/src/microservices/ServiceAuthMiddleware.d.ts.map +1 -1
  241. package/src/middleware/AuthMiddleware.d.ts +10 -0
  242. package/src/middleware/AuthMiddleware.d.ts.map +1 -0
  243. package/src/middleware/AuthMiddleware.js +16 -0
  244. package/src/middleware/CsrfMiddleware.d.ts +11 -1
  245. package/src/middleware/CsrfMiddleware.d.ts.map +1 -1
  246. package/src/middleware/CsrfMiddleware.js +33 -0
  247. package/src/middleware/JwtAuthMiddleware.d.ts +11 -0
  248. package/src/middleware/JwtAuthMiddleware.d.ts.map +1 -0
  249. package/src/middleware/JwtAuthMiddleware.js +73 -0
  250. package/src/middleware/LoggingMiddleware.d.ts.map +1 -1
  251. package/src/middleware/LoggingMiddleware.js +8 -3
  252. package/src/middleware/MiddlewareStack.d.ts +2 -2
  253. package/src/middleware/MiddlewareStack.d.ts.map +1 -1
  254. package/src/middleware/RateLimiter.d.ts +2 -2
  255. package/src/middleware/RateLimiter.d.ts.map +1 -1
  256. package/src/middleware/SanitizeBodyMiddleware.d.ts +12 -0
  257. package/src/middleware/SanitizeBodyMiddleware.d.ts.map +1 -0
  258. package/src/middleware/SanitizeBodyMiddleware.js +31 -0
  259. package/src/middleware/SecurityMiddleware.d.ts +1 -1
  260. package/src/middleware/SecurityMiddleware.d.ts.map +1 -1
  261. package/src/middleware/SessionMiddleware.d.ts +1 -1
  262. package/src/middleware/SessionMiddleware.d.ts.map +1 -1
  263. package/src/middleware/ValidationMiddleware.d.ts +25 -0
  264. package/src/middleware/ValidationMiddleware.d.ts.map +1 -0
  265. package/src/middleware/ValidationMiddleware.js +251 -0
  266. package/src/migrations/MigrationDiscovery.d.ts +5 -0
  267. package/src/migrations/MigrationDiscovery.d.ts.map +1 -0
  268. package/src/migrations/MigrationDiscovery.js +16 -0
  269. package/src/migrations/MigrationLoader.d.ts +5 -0
  270. package/src/migrations/MigrationLoader.d.ts.map +1 -0
  271. package/src/migrations/MigrationLoader.js +43 -0
  272. package/src/migrations/MigrationLock.d.ts +4 -0
  273. package/src/migrations/MigrationLock.d.ts.map +1 -0
  274. package/src/migrations/MigrationLock.js +33 -0
  275. package/src/migrations/Migrator.d.ts +23 -0
  276. package/src/migrations/Migrator.d.ts.map +1 -0
  277. package/src/migrations/Migrator.js +4 -0
  278. package/src/migrations/MigratorFactory.d.ts +25 -0
  279. package/src/migrations/MigratorFactory.d.ts.map +1 -0
  280. package/src/migrations/MigratorFactory.js +339 -0
  281. package/src/migrations/schema/Blueprint.d.ts +5 -0
  282. package/src/migrations/schema/Blueprint.d.ts.map +1 -0
  283. package/src/migrations/schema/Blueprint.js +189 -0
  284. package/src/migrations/schema/Schema.d.ts +8 -0
  285. package/src/migrations/schema/Schema.d.ts.map +1 -0
  286. package/src/migrations/schema/Schema.js +141 -0
  287. package/src/migrations/schema/SchemaCompiler.d.ts +20 -0
  288. package/src/migrations/schema/SchemaCompiler.d.ts.map +1 -0
  289. package/src/migrations/schema/SchemaCompiler.js +262 -0
  290. package/src/migrations/schema/index.d.ts +5 -0
  291. package/src/migrations/schema/index.d.ts.map +1 -0
  292. package/src/migrations/schema/index.js +3 -0
  293. package/src/migrations/schema/types.d.ts +86 -0
  294. package/src/migrations/schema/types.d.ts.map +1 -0
  295. package/src/migrations/schema/types.js +1 -0
  296. package/src/migrations/types.d.ts +45 -0
  297. package/src/migrations/types.d.ts.map +1 -0
  298. package/src/migrations/types.js +1 -0
  299. package/src/node-singletons/crypto.d.ts +1 -1
  300. package/src/node-singletons/crypto.d.ts.map +1 -1
  301. package/src/node-singletons/crypto.js +1 -1
  302. package/src/node-singletons/fs.d.ts +2 -2
  303. package/src/node-singletons/fs.d.ts.map +1 -1
  304. package/src/node-singletons/fs.js +1 -1
  305. package/src/node-singletons/util.d.ts +6 -0
  306. package/src/node-singletons/util.d.ts.map +1 -0
  307. package/src/node-singletons/util.js +5 -0
  308. package/src/node.d.ts +3 -1
  309. package/src/node.d.ts.map +1 -1
  310. package/src/node.js +6 -2
  311. package/src/observability/OpenTelemetry.d.ts +62 -0
  312. package/src/observability/OpenTelemetry.d.ts.map +1 -0
  313. package/src/observability/OpenTelemetry.js +167 -0
  314. package/src/observability/PrometheusMetrics.d.ts +25 -0
  315. package/src/observability/PrometheusMetrics.d.ts.map +1 -0
  316. package/src/observability/PrometheusMetrics.js +114 -0
  317. package/src/openapi/OpenApiGenerator.d.ts +68 -0
  318. package/src/openapi/OpenApiGenerator.d.ts.map +1 -0
  319. package/src/openapi/OpenApiGenerator.js +287 -0
  320. package/src/orm/Database.d.ts +5 -2
  321. package/src/orm/Database.d.ts.map +1 -1
  322. package/src/orm/Database.js +219 -63
  323. package/src/orm/DatabaseAdapter.d.ts +14 -0
  324. package/src/orm/DatabaseAdapter.d.ts.map +1 -1
  325. package/src/orm/DatabaseAdapterRegistry.d.ts.map +1 -1
  326. package/src/orm/DatabaseAdapterRegistry.js +3 -1
  327. package/src/orm/DatabaseRuntimeRegistration.d.ts.map +1 -1
  328. package/src/orm/DatabaseRuntimeRegistration.js +12 -0
  329. package/src/orm/Model.d.ts +30 -2
  330. package/src/orm/Model.d.ts.map +1 -1
  331. package/src/orm/Model.js +255 -62
  332. package/src/orm/QueryBuilder.d.ts +22 -1
  333. package/src/orm/QueryBuilder.d.ts.map +1 -1
  334. package/src/orm/QueryBuilder.js +406 -99
  335. package/src/orm/Relationships.d.ts +7 -1
  336. package/src/orm/Relationships.d.ts.map +1 -1
  337. package/src/orm/Relationships.js +18 -0
  338. package/src/orm/SchemaCompiler.d.ts +9 -0
  339. package/src/orm/SchemaCompiler.d.ts.map +1 -0
  340. package/src/orm/SchemaCompiler.js +145 -0
  341. package/src/orm/adapters/D1Adapter.d.ts +1 -1
  342. package/src/orm/adapters/D1Adapter.d.ts.map +1 -1
  343. package/src/orm/adapters/MySQLAdapter.d.ts +1 -1
  344. package/src/orm/adapters/MySQLAdapter.d.ts.map +1 -1
  345. package/src/orm/adapters/MySQLAdapter.js +88 -69
  346. package/src/orm/adapters/PostgreSQLAdapter.d.ts +1 -1
  347. package/src/orm/adapters/PostgreSQLAdapter.d.ts.map +1 -1
  348. package/src/orm/adapters/PostgreSQLAdapter.js +88 -69
  349. package/src/orm/adapters/SQLServerAdapter.d.ts +1 -1
  350. package/src/orm/adapters/SQLServerAdapter.d.ts.map +1 -1
  351. package/src/orm/adapters/SQLiteAdapter.d.ts +1 -1
  352. package/src/orm/adapters/SQLiteAdapter.d.ts.map +1 -1
  353. package/src/orm/adapters/SQLiteAdapter.js +59 -3
  354. package/src/orm/maintenance/SqliteMaintenance.d.ts +5 -0
  355. package/src/orm/maintenance/SqliteMaintenance.d.ts.map +1 -0
  356. package/src/orm/maintenance/SqliteMaintenance.js +14 -0
  357. package/src/orm/migrations/MigrationStore.d.ts +38 -0
  358. package/src/orm/migrations/MigrationStore.d.ts.map +1 -0
  359. package/src/orm/migrations/MigrationStore.js +157 -0
  360. package/src/performance/CodeGenerationBenchmark.d.ts.map +1 -1
  361. package/src/performance/Optimizer.d.ts +7 -6
  362. package/src/performance/Optimizer.d.ts.map +1 -1
  363. package/src/performance/Optimizer.js +170 -55
  364. package/src/profiling/MemoryProfiler.d.ts +1 -1
  365. package/src/profiling/MemoryProfiler.d.ts.map +1 -1
  366. package/src/profiling/N1Detector.d.ts +1 -1
  367. package/src/profiling/N1Detector.d.ts.map +1 -1
  368. package/src/profiling/QueryLogger.d.ts +1 -1
  369. package/src/profiling/QueryLogger.d.ts.map +1 -1
  370. package/src/profiling/RequestProfiler.d.ts +3 -3
  371. package/src/profiling/RequestProfiler.d.ts.map +1 -1
  372. package/src/routes/metrics.d.ts +2 -0
  373. package/src/routes/metrics.d.ts.map +1 -0
  374. package/src/routes/metrics.js +1 -0
  375. package/src/routing/CoreRoutes.d.ts +12 -0
  376. package/src/routing/CoreRoutes.d.ts.map +1 -0
  377. package/src/routing/CoreRoutes.js +151 -0
  378. package/src/routing/RouteRegistry.d.ts +39 -0
  379. package/src/routing/RouteRegistry.d.ts.map +1 -0
  380. package/src/routing/RouteRegistry.js +44 -0
  381. package/src/routing/Router.d.ts +26 -9
  382. package/src/routing/Router.d.ts.map +1 -1
  383. package/src/routing/Router.js +79 -35
  384. package/src/routing/common.d.ts +15 -0
  385. package/src/routing/common.d.ts.map +1 -0
  386. package/src/routing/common.js +47 -0
  387. package/src/routing/doc.d.ts +27 -0
  388. package/src/routing/doc.d.ts.map +1 -0
  389. package/src/routing/doc.js +110 -0
  390. package/src/routing/error.d.ts +21 -0
  391. package/src/routing/error.d.ts.map +1 -0
  392. package/src/routing/error.js +126 -0
  393. package/src/routing/errorPages.d.ts +14 -0
  394. package/src/routing/errorPages.d.ts.map +1 -0
  395. package/src/routing/errorPages.js +103 -0
  396. package/src/routing/publicRoot.d.ts +27 -0
  397. package/src/routing/publicRoot.d.ts.map +1 -0
  398. package/src/routing/publicRoot.js +110 -0
  399. package/src/runtime/PluginAutoImports.d.ts +21 -0
  400. package/src/runtime/PluginAutoImports.d.ts.map +1 -0
  401. package/src/runtime/PluginAutoImports.js +59 -0
  402. package/src/runtime/PluginManager.d.ts +1 -5
  403. package/src/runtime/PluginManager.d.ts.map +1 -1
  404. package/src/runtime/PluginManager.js +25 -18
  405. package/src/runtime/RuntimeDetector.d.ts +1 -1
  406. package/src/runtime/RuntimeDetector.d.ts.map +1 -1
  407. package/src/runtime/StartupConfigFileRegistry.d.ts +20 -0
  408. package/src/runtime/StartupConfigFileRegistry.d.ts.map +1 -0
  409. package/src/runtime/StartupConfigFileRegistry.js +44 -0
  410. package/src/runtime/adapters/CloudflareAdapter.d.ts +1 -1
  411. package/src/runtime/adapters/CloudflareAdapter.d.ts.map +1 -1
  412. package/src/runtime/adapters/CloudflareAdapter.js +1 -1
  413. package/src/runtime/adapters/DenoAdapter.d.ts +1 -1
  414. package/src/runtime/adapters/DenoAdapter.d.ts.map +1 -1
  415. package/src/runtime/adapters/DenoAdapter.js +1 -1
  416. package/src/runtime/adapters/LambdaAdapter.d.ts +1 -1
  417. package/src/runtime/adapters/LambdaAdapter.d.ts.map +1 -1
  418. package/src/runtime/adapters/LambdaAdapter.js +1 -1
  419. package/src/runtime/adapters/NodeServerAdapter.d.ts +1 -1
  420. package/src/runtime/adapters/NodeServerAdapter.d.ts.map +1 -1
  421. package/src/runtime/getKernel.d.ts +9 -0
  422. package/src/runtime/getKernel.d.ts.map +1 -0
  423. package/src/runtime/getKernel.js +27 -0
  424. package/src/runtime/useFileLoader.d.ts +26 -0
  425. package/src/runtime/useFileLoader.d.ts.map +1 -0
  426. package/src/runtime/useFileLoader.js +188 -0
  427. package/src/scripts/TemplateImportsCheck.js +40 -0
  428. package/src/scripts/TemplateSync.js +90 -24
  429. package/src/security/Encryptor.d.ts.map +1 -1
  430. package/src/security/Encryptor.js +64 -7
  431. package/src/security/JwtManager.d.ts +1 -0
  432. package/src/security/JwtManager.d.ts.map +1 -1
  433. package/src/security/JwtManager.js +33 -0
  434. package/src/security/Sanitizer.d.ts +76 -0
  435. package/src/security/Sanitizer.d.ts.map +1 -0
  436. package/src/security/Sanitizer.js +412 -0
  437. package/src/security/TokenRevocation.d.ts +7 -0
  438. package/src/security/TokenRevocation.d.ts.map +1 -0
  439. package/src/security/TokenRevocation.js +57 -0
  440. package/src/security/XssProtection.d.ts.map +1 -1
  441. package/src/security/XssProtection.js +62 -14
  442. package/src/seeders/SeederDiscovery.d.ts +5 -0
  443. package/src/seeders/SeederDiscovery.d.ts.map +1 -0
  444. package/src/seeders/SeederDiscovery.js +21 -0
  445. package/src/seeders/SeederLoader.d.ts +5 -0
  446. package/src/seeders/SeederLoader.d.ts.map +1 -0
  447. package/src/seeders/SeederLoader.js +60 -0
  448. package/src/seeders/types.d.ts +18 -0
  449. package/src/seeders/types.d.ts.map +1 -0
  450. package/src/seeders/types.js +1 -0
  451. package/src/session/SessionManager.js +1 -1
  452. package/src/templates/adapters/MySQLAdapter.ts.tpl +109 -85
  453. package/src/templates/adapters/PostgreSQLAdapter.ts.tpl +129 -88
  454. package/src/templates/adapters/SQLServerAdapter.ts.tpl +5 -9
  455. package/src/templates/adapters/SQLiteAdapter.ts.tpl +78 -11
  456. package/src/templates/features/Queue.ts.tpl +3 -2
  457. package/src/templates/project/basic/app/Controllers/AuthController.ts.tpl +217 -0
  458. package/src/templates/project/basic/app/Controllers/UserController.ts.tpl +1 -12
  459. package/src/templates/project/basic/app/Types/controller.ts.tpl +46 -0
  460. package/src/templates/project/basic/config/FileLogWriter.ts.tpl +5 -236
  461. package/src/templates/project/basic/config/SecretsManager.ts.tpl +10 -447
  462. package/src/templates/project/basic/config/StartupConfigValidator.ts.tpl +9 -268
  463. package/src/templates/project/basic/config/app.ts.tpl +13 -153
  464. package/src/templates/project/basic/config/broadcast.ts.tpl +29 -126
  465. package/src/templates/project/basic/config/cache.ts.tpl +12 -70
  466. package/src/templates/project/basic/config/cloudflare.ts.tpl +4 -39
  467. package/src/templates/project/basic/config/constants.ts.tpl +9 -65
  468. package/src/templates/project/basic/config/database.ts.tpl +66 -123
  469. package/src/templates/project/basic/config/env.ts.tpl +5 -169
  470. package/src/templates/project/basic/config/features.ts.tpl +6 -54
  471. package/src/templates/project/basic/config/index.ts.tpl +8 -23
  472. package/src/templates/project/basic/config/logging/HttpLogger.ts.tpl +7 -114
  473. package/src/templates/project/basic/config/mail.ts.tpl +9 -62
  474. package/src/templates/project/basic/config/microservices.ts.tpl +11 -97
  475. package/src/templates/project/basic/config/middleware.ts.tpl +25 -43
  476. package/src/templates/project/basic/config/notification.ts.tpl +13 -114
  477. package/src/templates/project/basic/config/queue.ts.tpl +9 -40
  478. package/src/templates/project/basic/config/security.ts.tpl +11 -163
  479. package/src/templates/project/basic/config/startup.ts.tpl +10 -21
  480. package/src/templates/project/basic/config/storage.ts.tpl +57 -137
  481. package/src/templates/project/basic/config/type.ts.tpl +32 -451
  482. package/src/templates/project/basic/database/factories/UserFactory.ts.tpl +80 -0
  483. package/src/templates/project/basic/database/migrations/create_tasks_table.ts.tpl +28 -0
  484. package/src/templates/project/basic/database/migrations/create_users_table.ts.tpl +29 -0
  485. package/src/templates/project/basic/database/seeders/DatabaseSeeder.ts.tpl +19 -0
  486. package/src/templates/project/basic/database/seeders/UserSeeder.ts.tpl +18 -0
  487. package/src/templates/project/basic/database/seeders/index.ts.tpl +2 -0
  488. package/src/templates/project/basic/routes/api.ts.tpl +71 -33
  489. package/src/templates/project/basic/routes/metrics.ts.tpl +22 -0
  490. package/src/templates/project/basic/src/index.ts.tpl +3 -0
  491. package/src/templates/project/basic/tsconfig.json.tpl +12 -11
  492. package/src/testing/TestEnvironment.d.ts +40 -0
  493. package/src/testing/TestEnvironment.d.ts.map +1 -0
  494. package/src/testing/TestEnvironment.js +141 -0
  495. package/src/testing/TestHttp.d.ts +29 -0
  496. package/src/testing/TestHttp.d.ts.map +1 -0
  497. package/src/testing/TestHttp.js +96 -0
  498. package/src/testing/index.d.ts +5 -0
  499. package/src/testing/index.d.ts.map +1 -0
  500. package/src/testing/index.js +2 -0
  501. package/src/time/DateTime.d.ts +181 -0
  502. package/src/time/DateTime.d.ts.map +1 -0
  503. package/src/time/DateTime.js +300 -0
  504. package/src/time/index.d.ts +7 -0
  505. package/src/time/index.d.ts.map +1 -0
  506. package/src/time/index.js +5 -0
  507. package/src/tools/http/Http.d.ts.map +1 -1
  508. package/src/tools/http/Http.js +4 -0
  509. package/src/tools/mail/drivers/Smtp.js +1 -1
  510. package/src/tools/queue/drivers/InMemory.d.ts +1 -1
  511. package/src/tools/queue/drivers/InMemory.d.ts.map +1 -1
  512. package/src/tools/queue/drivers/InMemory.js +1 -1
  513. package/src/tools/queue/drivers/Redis.d.ts +1 -1
  514. package/src/tools/queue/drivers/Redis.d.ts.map +1 -1
  515. package/src/tools/queue/drivers/Redis.js +1 -1
  516. package/src/validation/ValidationError.d.ts.map +1 -1
  517. package/src/validation/ValidationError.js +4 -2
  518. package/src/validation/Validator.d.ts +49 -16
  519. package/src/validation/Validator.d.ts.map +1 -1
  520. package/src/validation/Validator.js +307 -5
  521. package/src/common/uuid.d.ts +0 -3
  522. package/src/common/uuid.d.ts.map +0 -1
  523. package/src/common/uuid.js +0 -30
  524. package/src/templates/project/basic/.env.example.tpl +0 -74
  525. package/src/templates/project/basic/.env.tpl +0 -166
  526. package/src/templates/project/basic/config/logging/KvLogger.ts.tpl +0 -181
  527. package/src/templates/project/basic/config/logging/SlackLogger.ts.tpl +0 -156
  528. package/src/templates/project/basic/database/migrations/index.ts.tpl +0 -2
@@ -3,17 +3,19 @@
3
3
  * Demonstrates routing patterns
4
4
  */
5
5
 
6
- import { Env, type IRouter, Router } from '@zintrust/core';
7
-
8
- import { UserController } from '@app/Controllers/UserController';
6
+ import { AuthController } from '@app/Controllers/AuthController';
7
+ import { UserQueryBuilderController } from '@app/Controllers/UserQueryBuilderController';
8
+ import { Env , Router } from '@zintrust/core';
9
+ import type { MiddlewareKey , IRouter , IResponse, IRequest} from '@zintrust/core';
9
10
  import { registerBroadcastRoutes } from '@routes/broadcast';
10
11
  import { registerHealthRoutes } from '@routes/health';
11
12
  import { registerStorageRoutes } from '@routes/storage';
12
13
 
13
14
  export function registerRoutes(router: IRouter): void {
14
- const userController = UserController.create();
15
+ const authController = AuthController.create();
16
+ const userController = UserQueryBuilderController.create();
15
17
  registerPublicRoutes(router);
16
- registerApiV1Routes(router, userController);
18
+ registerApiV1Routes(router, authController, userController);
17
19
  registerAdminRoutes(router);
18
20
  }
19
21
 
@@ -28,7 +30,7 @@ function registerPublicRoutes(router: IRouter): void {
28
30
  }
29
31
 
30
32
  function registerRootRoute(router: IRouter): void {
31
- Router.get(router, '/', async (_req, res) => {
33
+ Router.get(router, '/', async (_req: IRequest, res:IResponse) => {
32
34
  res.json({
33
35
  framework: 'Zintrust Framework',
34
36
  app_name: Env.APP_NAME,
@@ -44,49 +46,85 @@ function registerRootRoute(router: IRouter): void {
44
46
  */
45
47
  function registerApiV1Routes(
46
48
  router: IRouter,
47
- userController: ReturnType<typeof UserController.create>
49
+ authController: ReturnType<typeof AuthController.create>,
50
+ userController: ReturnType<typeof UserQueryBuilderController.create>
48
51
  ): void {
49
- Router.group(router, '/api/v1', (r) => {
52
+ Router.group(router, '/api/v1', (r:IRouter) => {
50
53
  // Auth routes
51
- Router.post(r, '/auth/login', async (_req, res) => {
52
- res.json({ message: 'Login endpoint' });
54
+ Router.post<MiddlewareKey>(r, '/auth/login', authController.login, {
55
+ middleware: ['authRateLimit', 'validateLogin'],
53
56
  });
54
57
 
55
- Router.post(r, '/auth/register', async (_req, res) => {
56
- res.json({ message: 'Register endpoint' });
58
+ Router.post<MiddlewareKey>(r, '/auth/register', authController.register, {
59
+ middleware: ['authRateLimit', 'validateRegister'],
57
60
  });
58
61
 
59
- // Protected routes (middleware is not modeled in Router.ts yet)
62
+ Router.post<MiddlewareKey>(r, '/auth/logout', authController.logout, {
63
+ middleware: ['auth', 'jwt'],
64
+ });
65
+ Router.post<MiddlewareKey>(r, '/auth/refresh', authController.refresh, {
66
+ middleware: ['auth', 'jwt'],
67
+ });
68
+
69
+ // Protected routes (Router supports per-route middleware metadata)
60
70
  const pr = r;
61
71
 
62
72
  // User resource (REST-ish)
63
- Router.resource(pr, '/users', {
64
- index: userController.index,
65
- store: userController.store,
66
- show: userController.show,
67
- update: userController.update,
68
- destroy: userController.destroy,
73
+ Router.resource<MiddlewareKey>(
74
+ pr,
75
+ '/users',
76
+ {
77
+ index: userController.index,
78
+ store: userController.store,
79
+ show: userController.show,
80
+ update: userController.update,
81
+ destroy: userController.destroy,
82
+ },
83
+ {
84
+ middleware: ['auth', 'jwt'],
85
+ store: { middleware: ['auth', 'jwt', 'userMutationRateLimit', 'validateUserStore'] },
86
+ update: { middleware: ['auth', 'jwt', 'userMutationRateLimit', 'validateUserUpdate'] },
87
+ destroy: { middleware: ['auth', 'jwt', 'userMutationRateLimit'] },
88
+ }
89
+ );
90
+
91
+ Router.post<MiddlewareKey>(pr, '/users/fill', userController.fill, {
92
+ middleware: ['auth', 'jwt', 'fillRateLimit', 'validateUserFill'],
69
93
  });
70
94
 
71
95
  // If the controller exposes create/edit, wire them explicitly.
72
- Router.get(pr, '/users/create', userController.create);
73
- Router.get(pr, '/users/:id/edit', userController.edit);
74
-
75
- // Custom user routes
76
- Router.get(pr, '/profile', async (_req, res) => {
77
- res.json({ message: 'Get user profile' });
96
+ Router.get<MiddlewareKey>(pr, '/users/create', userController.create, {
97
+ middleware: ['auth', 'jwt'],
78
98
  });
79
-
80
- Router.put(pr, '/profile', async (_req, res) => {
81
- res.json({ message: 'Update user profile' });
99
+ Router.get<MiddlewareKey>(pr, '/users/:id/edit', userController.edit, {
100
+ middleware: ['auth', 'jwt'],
82
101
  });
83
102
 
103
+ // Custom user routes
104
+ Router.get<MiddlewareKey>(
105
+ pr,
106
+ '/profile',
107
+ async (_req: IRequest, res:IResponse) => {
108
+ res.json({ message: 'Get user profile' });
109
+ },
110
+ { middleware: ['auth', 'jwt'] }
111
+ );
112
+
113
+ Router.put<MiddlewareKey>(
114
+ pr,
115
+ '/profile',
116
+ async (_req: IRequest, res:IResponse) => {
117
+ res.json({ message: 'Update user profile' });
118
+ },
119
+ { middleware: ['auth', 'jwt'] }
120
+ );
121
+
84
122
  // Posts resource
85
- Router.get(r, '/posts', async (_req, res) => {
123
+ Router.get(r, '/posts', async (_req: IRequest, res:IResponse) => {
86
124
  res.json({ data: [] });
87
125
  });
88
126
 
89
- Router.get(r, '/posts/:id', async (req, res) => {
127
+ Router.get(r, '/posts/:id', async (req: IRequest, res:IResponse) => {
90
128
  const id = req.getParam('id');
91
129
  res.json({ data: { id } });
92
130
  });
@@ -97,12 +135,12 @@ function registerApiV1Routes(
97
135
  * Register admin routes
98
136
  */
99
137
  function registerAdminRoutes(router: IRouter): void {
100
- Router.group(router, '/admin', (r) => {
101
- Router.get(r, '/dashboard', async (_req, res) => {
138
+ Router.group(router, '/admin', (r:IRouter) => {
139
+ Router.get(r, '/dashboard', async (_req: IRequest, res:IResponse) => {
102
140
  res.json({ message: 'Admin dashboard' });
103
141
  });
104
142
 
105
- Router.get(r, '/users', async (_req, res) => {
143
+ Router.get(r, '/users', async (_req: IRequest, res:IResponse) => {
106
144
  res.json({ data: [] });
107
145
  });
108
146
  });
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Metrics Routes
3
+ *
4
+ * Exposes Prometheus metrics when enabled.
5
+ */
6
+
7
+ import { Env, PrometheusMetrics, type IRouter, Router } from '@zintrust/core';
8
+
9
+ export function registerMetricsRoutes(router: IRouter): void {
10
+ if (Env.getBool('METRICS_ENABLED', false) === false) return;
11
+
12
+ const pathFromEnv = Env.get('METRICS_PATH', '/metrics').trim();
13
+ const path = pathFromEnv === '' ? '/metrics' : pathFromEnv;
14
+
15
+ Router.get(router, path, async (_req, res) => {
16
+ const { contentType, body } = await PrometheusMetrics.getMetricsText();
17
+ res.setHeader('Content-Type', contentType);
18
+ res.send(body);
19
+ });
20
+ }
21
+
22
+ export default registerMetricsRoutes;
@@ -4,6 +4,9 @@
4
4
 
5
5
  import { isNodeMain, start } from '@zintrust/core/start';
6
6
 
7
+ // Register plugins (side-effects)
8
+ import './zintrust.plugins';
9
+
7
10
  // Cloudflare Workers entry.
8
11
  export { default } from '@zintrust/core/start';
9
12
 
@@ -1,5 +1,6 @@
1
1
  {
2
2
  "compilerOptions": {
3
+ "ignoreDeprecations": "6.0",
3
4
  "baseUrl": ".",
4
5
  "outDir": "./dist",
5
6
  "rootDir": "./",
@@ -16,17 +17,17 @@
16
17
  "@routes/*": ["./routes/*"],
17
18
  "@database/*": ["./database/*"],
18
19
 
19
- "@tools/*": ["./src/tools/*"],
20
- "@httpClient/*": ["./src/tools/http/*"],
21
- "@templates": ["./src/tools/templates/index.ts"],
22
- "@templates/*": ["./src/tools/templates/*"],
23
- "@mail/*": ["./src/tools/mail/*"],
24
- "@storage": ["./src/tools/storage/index.ts"],
25
- "@storage/*": ["./src/tools/storage/*"],
26
- "@drivers/*": ["./src/tools/storage/drivers/*"],
27
- "@notification/*": ["./src/tools/notification/*"],
28
- "@broadcast/*": ["./src/tools/broadcast/*"],
29
- "@queue/*": ["./src/tools/queue/*"]
20
+ "@tools/*": ["app/Tools/*"],
21
+ "@httpClient/*": ["app/Tools/http/*"],
22
+ "@templates": ["app/Tools/templates/index.ts"],
23
+ "@templates/*": ["app/Tools/templates/*"],
24
+ "@mail/*": ["app/Tools/mail/*"],
25
+ "@storage": ["app/Tools/storage/index.ts"],
26
+ "@storage/*": ["app/Tools/storage/*"],
27
+ "@drivers/*": ["app/Tools/storage/drivers/*"],
28
+ "@notification/*": ["app/Tools/notification/*"],
29
+ "@broadcast/*": ["app/Tools/broadcast/*"],
30
+ "@queue/*": ["app/Tools/queue/*"]
30
31
  }
31
32
  },
32
33
  "include": ["src/**/*", "app/**/*", "routes/**/*", "database/**/*"],
@@ -0,0 +1,40 @@
1
+ import { type IServiceContainer } from '../container/ServiceContainer';
2
+ import { type IKernel } from '../http/Kernel';
3
+ import { type IRouter } from '../routing/Router';
4
+ export type TestHeaders = Record<string, string>;
5
+ export type TestRequestInput = {
6
+ method: string;
7
+ path: string;
8
+ headers?: TestHeaders;
9
+ body?: unknown;
10
+ validated?: {
11
+ body?: unknown;
12
+ query?: unknown;
13
+ params?: unknown;
14
+ headers?: unknown;
15
+ };
16
+ };
17
+ export type TestResponse = {
18
+ status: number;
19
+ headers: Record<string, string | string[]>;
20
+ bodyText: string;
21
+ json: unknown;
22
+ cookies: Record<string, string>;
23
+ };
24
+ export type TestEnvironmentOptions = {
25
+ router?: IRouter;
26
+ container?: IServiceContainer;
27
+ registerRoutes?: (router: IRouter) => void;
28
+ };
29
+ export interface ITestEnvironment {
30
+ router: IRouter;
31
+ container: IServiceContainer;
32
+ kernel: IKernel;
33
+ request(input: TestRequestInput): Promise<TestResponse>;
34
+ swapSingleton<T>(key: string, instance: T): () => void;
35
+ swapFactory<T>(key: string, factory: () => T): () => void;
36
+ }
37
+ export declare const TestEnvironment: Readonly<{
38
+ create(options?: TestEnvironmentOptions): ITestEnvironment;
39
+ }>;
40
+ //# sourceMappingURL=TestEnvironment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TestEnvironment.d.ts","sourceRoot":"","sources":["../../../src/testing/TestEnvironment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACxF,OAAO,EAAU,KAAK,OAAO,EAAE,MAAM,eAAe,CAAC;AAGrD,OAAO,EAAU,KAAK,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAGxD,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEjD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE;QACV,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,iBAAiB,CAAC;IAC9B,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;CAC5C,CAAC;AA2HF,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,iBAAiB,CAAC;IAC7B,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IACxD,aAAa,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,MAAM,IAAI,CAAC;IACvD,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC;CAC3D;AAED,eAAO,MAAM,eAAe;qBACV,sBAAsB,GAAQ,gBAAgB;EA6C9D,CAAC"}
@@ -0,0 +1,141 @@
1
+ import { ServiceContainer } from '../container/ServiceContainer.js';
2
+ import { Kernel } from '../http/Kernel.js';
3
+ import { Request } from '../http/Request.js';
4
+ import { Response } from '../http/Response.js';
5
+ import { Router } from '../routing/Router.js';
6
+ const lowerCaseHeaders = (headers) => {
7
+ if (!headers)
8
+ return {};
9
+ const out = {};
10
+ for (const [k, v] of Object.entries(headers))
11
+ out[k.toLowerCase()] = v;
12
+ return out;
13
+ };
14
+ const createNodeResStub = () => {
15
+ const headers = {};
16
+ let body = '';
17
+ const raw = {
18
+ statusCode: 200,
19
+ writableEnded: false,
20
+ setHeader(name, value) {
21
+ headers[name] = value;
22
+ },
23
+ end(data) {
24
+ raw.writableEnded = true;
25
+ if (data === undefined)
26
+ return;
27
+ body += Buffer.isBuffer(data) ? data.toString('utf8') : String(data);
28
+ },
29
+ };
30
+ return { raw, headers, getBody: () => body };
31
+ };
32
+ const parseJsonBody = (raw) => {
33
+ try {
34
+ return JSON.parse(raw);
35
+ }
36
+ catch {
37
+ return raw;
38
+ }
39
+ };
40
+ const cookiesFromSetCookieHeader = (setCookie) => {
41
+ const values = [];
42
+ if (Array.isArray(setCookie)) {
43
+ values.push(...setCookie.map(String));
44
+ }
45
+ else if (setCookie !== undefined && setCookie !== null) {
46
+ values.push(String(setCookie));
47
+ }
48
+ const result = {};
49
+ for (const cookie of values) {
50
+ const firstPart = cookie.split(';')[0] ?? '';
51
+ const idx = firstPart.indexOf('=');
52
+ if (idx <= 0)
53
+ continue;
54
+ const name = firstPart.slice(0, idx).trim();
55
+ const value = firstPart.slice(idx + 1).trim();
56
+ if (name !== '')
57
+ result[name] = value;
58
+ }
59
+ return result;
60
+ };
61
+ const createOverridableContainer = (base) => {
62
+ const overrides = new Map();
63
+ const swapSingleton = (key, instance) => {
64
+ overrides.set(key, { kind: 'singleton', value: instance });
65
+ return () => {
66
+ overrides.delete(key);
67
+ };
68
+ };
69
+ const swapFactory = (key, factory) => {
70
+ overrides.set(key, { kind: 'factory', factory });
71
+ return () => {
72
+ overrides.delete(key);
73
+ };
74
+ };
75
+ return {
76
+ bind: (key, factory) => base.bind(key, factory),
77
+ singleton: (key, factoryOrInstance) => base.singleton(key, factoryOrInstance),
78
+ resolve: (key) => {
79
+ const override = overrides.get(key);
80
+ if (override) {
81
+ return (override.kind === 'singleton' ? override.value : override.factory());
82
+ }
83
+ return base.resolve(key);
84
+ },
85
+ has: (key) => overrides.has(key) || base.has(key),
86
+ get: (key) => {
87
+ const override = overrides.get(key);
88
+ if (override) {
89
+ return (override.kind === 'singleton' ? override.value : override.factory());
90
+ }
91
+ return base.get(key);
92
+ },
93
+ flush: () => {
94
+ overrides.clear();
95
+ base.flush();
96
+ },
97
+ swapSingleton,
98
+ swapFactory,
99
+ };
100
+ };
101
+ export const TestEnvironment = Object.freeze({
102
+ create(options = {}) {
103
+ const router = options.router ?? Router.createRouter();
104
+ if (typeof options.registerRoutes === 'function')
105
+ options.registerRoutes(router);
106
+ const baseContainer = options.container ?? ServiceContainer.create();
107
+ const container = createOverridableContainer(baseContainer);
108
+ const kernel = Kernel.create(router, container);
109
+ return {
110
+ router,
111
+ container,
112
+ kernel,
113
+ async request(input) {
114
+ const nodeReq = {
115
+ method: input.method,
116
+ url: input.path,
117
+ headers: lowerCaseHeaders(input.headers),
118
+ };
119
+ const nodeRes = createNodeResStub();
120
+ const req = Request.create(nodeReq);
121
+ if (input.body !== undefined)
122
+ req.setBody(input.body);
123
+ if (input.validated !== undefined)
124
+ req.validated = input.validated;
125
+ const res = Response.create(nodeRes.raw);
126
+ await kernel.handleRequest(req, res);
127
+ const bodyText = nodeRes.getBody();
128
+ const headers = nodeRes.headers;
129
+ return {
130
+ status: nodeRes.raw.statusCode,
131
+ headers,
132
+ bodyText,
133
+ json: parseJsonBody(bodyText),
134
+ cookies: cookiesFromSetCookieHeader(headers['Set-Cookie']),
135
+ };
136
+ },
137
+ swapSingleton: container.swapSingleton,
138
+ swapFactory: container.swapFactory,
139
+ };
140
+ },
141
+ });
@@ -0,0 +1,29 @@
1
+ import { type IRequest, type ValidatedRequest } from '../http/Request';
2
+ import type { IResponse } from '../http/Response';
3
+ export type TestHttpRequestInput = {
4
+ method?: string;
5
+ path?: string;
6
+ headers?: Record<string, string>;
7
+ body?: unknown;
8
+ params?: Record<string, string>;
9
+ validated?: IRequest['validated'];
10
+ context?: Record<string, unknown>;
11
+ };
12
+ export type TestHttpResponseRecorder = IResponse & {
13
+ getBodyText: () => string;
14
+ getJson: () => unknown;
15
+ getHeaders: () => Record<string, string | string[]>;
16
+ };
17
+ export declare const TestHttp: Readonly<{
18
+ createRequest(input?: TestHttpRequestInput): IRequest;
19
+ createValidatedRequest<TBody = unknown, TQuery = unknown, TParams = unknown, THeaders = unknown>(input: Omit<TestHttpRequestInput, "validated"> & {
20
+ validated: {
21
+ body: TBody;
22
+ query: TQuery;
23
+ params: TParams;
24
+ headers: THeaders;
25
+ };
26
+ }): ValidatedRequest<TBody, TQuery, TParams, THeaders>;
27
+ createResponseRecorder(): TestHttpResponseRecorder;
28
+ }>;
29
+ //# sourceMappingURL=TestHttp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TestHttp.d.ts","sourceRoot":"","sources":["../../../src/testing/TestHttp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,KAAK,QAAQ,EAAE,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC/E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAGjD,MAAM,MAAM,oBAAoB,GAAG;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,SAAS,CAAC,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG,SAAS,GAAG;IACjD,WAAW,EAAE,MAAM,MAAM,CAAC;IAC1B,OAAO,EAAE,MAAM,OAAO,CAAC;IACvB,UAAU,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;CACrD,CAAC;AAWF,eAAO,MAAM,QAAQ;0BACE,oBAAoB,GAAQ,QAAQ;2BAoBlC,KAAK,YAAY,MAAM,YAAY,OAAO,YAAY,QAAQ,mBAC5E,IAAI,CAAC,oBAAoB,EAAE,WAAW,CAAC,GAAG;QAC/C,SAAS,EAAE;YACT,IAAI,EAAE,KAAK,CAAC;YACZ,KAAK,EAAE,MAAM,CAAC;YACd,MAAM,EAAE,OAAO,CAAC;YAChB,OAAO,EAAE,QAAQ,CAAC;SACnB,CAAC;KACH,GACA,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC;8BAS3B,wBAAwB;EAiElD,CAAC"}
@@ -0,0 +1,96 @@
1
+ import { Request } from '../http/Request.js';
2
+ const lowerCaseHeaders = (headers) => {
3
+ if (!headers)
4
+ return {};
5
+ const out = {};
6
+ for (const [k, v] of Object.entries(headers))
7
+ out[k.toLowerCase()] = v;
8
+ return out;
9
+ };
10
+ const isError = (v) => v instanceof Error;
11
+ export const TestHttp = Object.freeze({
12
+ createRequest(input = {}) {
13
+ const nodeReq = {
14
+ method: input.method ?? 'GET',
15
+ url: input.path ?? '/',
16
+ headers: lowerCaseHeaders(input.headers),
17
+ };
18
+ const req = Request.create(nodeReq);
19
+ if (input.body !== undefined)
20
+ req.setBody(input.body);
21
+ if (input.params !== undefined)
22
+ req.setParams(input.params);
23
+ const validated = input.validated;
24
+ if (validated !== undefined && validated !== null && !isError(validated)) {
25
+ req.validated = validated;
26
+ }
27
+ if (input.context !== undefined)
28
+ req.context = input.context;
29
+ return req;
30
+ },
31
+ createValidatedRequest(input) {
32
+ const req = this.createRequest({
33
+ ...input,
34
+ validated: input.validated,
35
+ });
36
+ return req;
37
+ },
38
+ createResponseRecorder() {
39
+ let statusCodeValue = 200;
40
+ let bodyText = '';
41
+ let jsonBody;
42
+ const headers = {};
43
+ const raw = {
44
+ statusCode: statusCodeValue,
45
+ writableEnded: false,
46
+ setHeader: (name, value) => {
47
+ headers[name] = value;
48
+ },
49
+ end: (data) => {
50
+ raw.writableEnded = true;
51
+ if (data === undefined)
52
+ return;
53
+ bodyText += Buffer.isBuffer(data) ? data.toString('utf8') : String(data);
54
+ },
55
+ };
56
+ const res = {
57
+ locals: {},
58
+ status: (code) => res.setStatus(code),
59
+ setStatus: (code) => {
60
+ statusCodeValue = code;
61
+ raw.statusCode = code;
62
+ return res;
63
+ },
64
+ getStatus: () => statusCodeValue,
65
+ get statusCode() {
66
+ return statusCodeValue;
67
+ },
68
+ setHeader: (name, value) => {
69
+ headers[name] = value;
70
+ return res;
71
+ },
72
+ getHeader: (name) => headers[name],
73
+ json: (data) => {
74
+ jsonBody = data;
75
+ bodyText = JSON.stringify(data);
76
+ },
77
+ text: (text) => {
78
+ bodyText = text;
79
+ },
80
+ html: (html) => {
81
+ bodyText = html;
82
+ },
83
+ send: (data) => {
84
+ bodyText = Buffer.isBuffer(data) ? data.toString('utf8') : String(data);
85
+ },
86
+ redirect: (_url, code = 302) => {
87
+ statusCodeValue = code;
88
+ },
89
+ getRaw: () => raw,
90
+ getBodyText: () => bodyText,
91
+ getJson: () => jsonBody,
92
+ getHeaders: () => ({ ...headers }),
93
+ };
94
+ return res;
95
+ },
96
+ });
@@ -0,0 +1,5 @@
1
+ export { TestEnvironment } from '../testing/TestEnvironment';
2
+ export type { ITestEnvironment, TestEnvironmentOptions, TestHeaders, TestRequestInput, TestResponse, } from '../testing/TestEnvironment';
3
+ export { TestHttp } from '../testing/TestHttp';
4
+ export type { TestHttpRequestInput, TestHttpResponseRecorder } from '../testing/TestHttp';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/testing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,YAAY,EACV,gBAAgB,EAChB,sBAAsB,EACtB,WAAW,EACX,gBAAgB,EAChB,YAAY,GACb,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,YAAY,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { TestEnvironment } from '../testing/TestEnvironment.js';
2
+ export { TestHttp } from '../testing/TestHttp.js';