@zintrust/core 0.1.18 → 0.1.20

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 (558) hide show
  1. package/README.md +16 -10
  2. package/bin/zintrust-main.d.ts.map +1 -1
  3. package/bin/zintrust-main.js +9 -0
  4. package/package.json +11 -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/index.html +1 -1
  10. package/public/zintrust.svg +30 -0
  11. package/routes/api.d.ts +7 -0
  12. package/routes/api.d.ts.map +1 -0
  13. package/routes/api.js +115 -0
  14. package/routes/broadcast.d.ts +9 -0
  15. package/routes/broadcast.d.ts.map +1 -0
  16. package/routes/broadcast.js +27 -0
  17. package/routes/health.d.ts +7 -0
  18. package/routes/health.d.ts.map +1 -0
  19. package/routes/health.js +127 -0
  20. package/routes/metrics.d.ts +9 -0
  21. package/routes/metrics.d.ts.map +1 -0
  22. package/routes/metrics.js +20 -0
  23. package/routes/openapi.d.ts +9 -0
  24. package/routes/openapi.d.ts.map +1 -0
  25. package/routes/openapi.js +76 -0
  26. package/routes/storage.d.ts +4 -0
  27. package/routes/storage.d.ts.map +1 -0
  28. package/routes/storage.js +35 -0
  29. package/src/boot/Application.d.ts +2 -2
  30. package/src/boot/Application.d.ts.map +1 -1
  31. package/src/boot/Application.js +18 -3
  32. package/src/boot/Server.d.ts +3 -2
  33. package/src/boot/Server.d.ts.map +1 -1
  34. package/src/boot/Server.js +39 -165
  35. package/src/boot/bootstrap.js +1 -1
  36. package/src/cache/Cache.d.ts +1 -1
  37. package/src/cache/Cache.d.ts.map +1 -1
  38. package/src/cache/CacheDriver.d.ts +4 -0
  39. package/src/cache/CacheDriver.d.ts.map +1 -1
  40. package/src/cache/drivers/KVDriver.d.ts +1 -1
  41. package/src/cache/drivers/KVDriver.d.ts.map +1 -1
  42. package/src/cache/drivers/MemoryDriver.d.ts +1 -1
  43. package/src/cache/drivers/MemoryDriver.d.ts.map +1 -1
  44. package/src/cache/drivers/MemoryDriver.js +16 -0
  45. package/src/cache/drivers/MongoDriver.d.ts +1 -1
  46. package/src/cache/drivers/MongoDriver.d.ts.map +1 -1
  47. package/src/cache/drivers/RedisDriver.d.ts +1 -1
  48. package/src/cache/drivers/RedisDriver.d.ts.map +1 -1
  49. package/src/cli/CLI.d.ts.map +1 -1
  50. package/src/cli/CLI.js +12 -4
  51. package/src/cli/PromptHelper.d.ts.map +1 -1
  52. package/src/cli/PromptHelper.js +4 -3
  53. package/src/cli/commands/AddCommand.d.ts +2 -2
  54. package/src/cli/commands/AddCommand.d.ts.map +1 -1
  55. package/src/cli/commands/AddCommand.js +135 -58
  56. package/src/cli/commands/ConfigCommand.d.ts +1 -1
  57. package/src/cli/commands/ConfigCommand.d.ts.map +1 -1
  58. package/src/cli/commands/CreateCommand.d.ts +15 -0
  59. package/src/cli/commands/CreateCommand.d.ts.map +1 -0
  60. package/src/cli/commands/CreateCommand.js +143 -0
  61. package/src/cli/commands/D1MigrateCommand.d.ts +1 -1
  62. package/src/cli/commands/D1MigrateCommand.d.ts.map +1 -1
  63. package/src/cli/commands/D1MigrateCommand.js +16 -20
  64. package/src/cli/commands/DbSeedCommand.d.ts +9 -0
  65. package/src/cli/commands/DbSeedCommand.d.ts.map +1 -0
  66. package/src/cli/commands/DbSeedCommand.js +171 -0
  67. package/src/cli/commands/DebugCommand.d.ts +1 -1
  68. package/src/cli/commands/DebugCommand.d.ts.map +1 -1
  69. package/src/cli/commands/FixCommand.d.ts +1 -1
  70. package/src/cli/commands/FixCommand.d.ts.map +1 -1
  71. package/src/cli/commands/JwtDevCommand.d.ts +8 -0
  72. package/src/cli/commands/JwtDevCommand.d.ts.map +1 -0
  73. package/src/cli/commands/JwtDevCommand.js +114 -0
  74. package/src/cli/commands/KeyGenerateCommand.d.ts +1 -1
  75. package/src/cli/commands/KeyGenerateCommand.d.ts.map +1 -1
  76. package/src/cli/commands/LogsCommand.d.ts +2 -2
  77. package/src/cli/commands/LogsCommand.d.ts.map +1 -1
  78. package/src/cli/commands/LogsCommand.js +36 -2
  79. package/src/cli/commands/MakeMailTemplateCommand.d.ts +1 -1
  80. package/src/cli/commands/MakeMailTemplateCommand.d.ts.map +1 -1
  81. package/src/cli/commands/MakeNotificationTemplateCommand.d.ts +1 -1
  82. package/src/cli/commands/MakeNotificationTemplateCommand.d.ts.map +1 -1
  83. package/src/cli/commands/MigrateCommand.d.ts +1 -1
  84. package/src/cli/commands/MigrateCommand.d.ts.map +1 -1
  85. package/src/cli/commands/MigrateCommand.js +291 -35
  86. package/src/cli/commands/NewCommand.d.ts +2 -2
  87. package/src/cli/commands/NewCommand.d.ts.map +1 -1
  88. package/src/cli/commands/NewCommand.js +38 -13
  89. package/src/cli/commands/PluginCommand.d.ts +1 -1
  90. package/src/cli/commands/PluginCommand.d.ts.map +1 -1
  91. package/src/cli/commands/PrepareCommand.d.ts +1 -1
  92. package/src/cli/commands/PrepareCommand.d.ts.map +1 -1
  93. package/src/cli/commands/QACommand.d.ts +2 -2
  94. package/src/cli/commands/QACommand.d.ts.map +1 -1
  95. package/src/cli/commands/RoutesCommand.d.ts +10 -0
  96. package/src/cli/commands/RoutesCommand.d.ts.map +1 -0
  97. package/src/cli/commands/RoutesCommand.js +242 -0
  98. package/src/cli/commands/SimulateCommand.d.ts +1 -1
  99. package/src/cli/commands/SimulateCommand.d.ts.map +1 -1
  100. package/src/cli/commands/SimulateCommand.js +1 -1
  101. package/src/cli/commands/StartCommand.d.ts.map +1 -1
  102. package/src/cli/commands/StartCommand.js +90 -3
  103. package/src/cli/commands/UpgradeCommand.d.ts +16 -0
  104. package/src/cli/commands/UpgradeCommand.d.ts.map +1 -0
  105. package/src/cli/commands/UpgradeCommand.js +107 -0
  106. package/src/cli/commands/index.d.ts +3 -0
  107. package/src/cli/commands/index.d.ts.map +1 -1
  108. package/src/cli/commands/index.js +3 -0
  109. package/src/cli/commands/runner/index.d.ts +3 -0
  110. package/src/cli/commands/runner/index.d.ts.map +1 -0
  111. package/src/cli/commands/runner/index.js +139 -0
  112. package/src/cli/config/ConfigManager.d.ts +1 -1
  113. package/src/cli/config/ConfigManager.d.ts.map +1 -1
  114. package/src/cli/config/ConfigValidator.d.ts +1 -1
  115. package/src/cli/config/ConfigValidator.d.ts.map +1 -1
  116. package/src/cli/config/ConfigValidator.js +1 -1
  117. package/src/cli/d1/D1SqlMigrations.d.ts +20 -0
  118. package/src/cli/d1/D1SqlMigrations.d.ts.map +1 -0
  119. package/src/cli/d1/D1SqlMigrations.js +224 -0
  120. package/src/cli/d1/WranglerConfig.d.ts +4 -0
  121. package/src/cli/d1/WranglerConfig.d.ts.map +1 -0
  122. package/src/cli/d1/WranglerConfig.js +122 -0
  123. package/src/cli/d1/WranglerD1.d.ts +11 -0
  124. package/src/cli/d1/WranglerD1.d.ts.map +1 -0
  125. package/src/cli/d1/WranglerD1.js +16 -0
  126. package/src/cli/env/EnvFileBackfill.d.ts +10 -0
  127. package/src/cli/env/EnvFileBackfill.d.ts.map +1 -0
  128. package/src/cli/env/EnvFileBackfill.js +64 -0
  129. package/src/cli/scaffolding/ControllerGenerator.d.ts.map +1 -1
  130. package/src/cli/scaffolding/ControllerGenerator.js +72 -22
  131. package/src/cli/scaffolding/FactoryGenerator.d.ts.map +1 -1
  132. package/src/cli/scaffolding/FactoryGenerator.js +3 -1
  133. package/src/cli/scaffolding/GovernanceScaffolder.d.ts +23 -0
  134. package/src/cli/scaffolding/GovernanceScaffolder.d.ts.map +1 -0
  135. package/src/cli/scaffolding/GovernanceScaffolder.js +327 -0
  136. package/src/cli/scaffolding/MigrationGenerator.d.ts +10 -0
  137. package/src/cli/scaffolding/MigrationGenerator.d.ts.map +1 -1
  138. package/src/cli/scaffolding/MigrationGenerator.js +137 -51
  139. package/src/cli/scaffolding/ProjectScaffolder.d.ts.map +1 -1
  140. package/src/cli/scaffolding/ProjectScaffolder.js +54 -59
  141. package/src/cli/scaffolding/RouteGenerator.d.ts.map +1 -1
  142. package/src/cli/scaffolding/RouteGenerator.js +79 -43
  143. package/src/cli/scaffolding/SeederGenerator.d.ts +5 -0
  144. package/src/cli/scaffolding/SeederGenerator.d.ts.map +1 -1
  145. package/src/cli/scaffolding/SeederGenerator.js +63 -15
  146. package/src/cli/scaffolding/ServiceScaffolder.d.ts.map +1 -1
  147. package/src/cli/scaffolding/ServiceScaffolder.js +24 -3
  148. package/src/cli/scaffolding/index.d.ts +2 -0
  149. package/src/cli/scaffolding/index.d.ts.map +1 -1
  150. package/src/cli/scaffolding/index.js +1 -0
  151. package/src/cli/utils/DistPackager.d.ts.map +1 -1
  152. package/src/cli/utils/DistPackager.js +8 -0
  153. package/src/common/index.d.ts +8 -0
  154. package/src/common/index.d.ts.map +1 -1
  155. package/src/common/index.js +28 -0
  156. package/src/common/utility.d.ts +38 -0
  157. package/src/common/utility.d.ts.map +1 -0
  158. package/src/common/utility.js +101 -0
  159. package/src/config/FileLogWriter.d.ts +2 -1
  160. package/src/config/FileLogWriter.d.ts.map +1 -1
  161. package/src/config/FileLogWriter.js +83 -2
  162. package/src/config/app.d.ts.map +1 -1
  163. package/src/config/app.js +3 -1
  164. package/src/config/broadcast.d.ts +1 -1
  165. package/src/config/broadcast.d.ts.map +1 -1
  166. package/src/config/broadcast.js +1 -1
  167. package/src/config/cache.d.ts +1 -1
  168. package/src/config/cache.d.ts.map +1 -1
  169. package/src/config/cloudflare.d.ts +1 -1
  170. package/src/config/cloudflare.d.ts.map +1 -1
  171. package/src/config/database.d.ts +7 -1
  172. package/src/config/database.d.ts.map +1 -1
  173. package/src/config/database.js +99 -7
  174. package/src/config/env.d.ts +6 -0
  175. package/src/config/env.d.ts.map +1 -1
  176. package/src/config/env.js +7 -0
  177. package/src/config/index.d.ts +8 -2
  178. package/src/config/index.d.ts.map +1 -1
  179. package/src/config/logging/KvLogger.js +1 -1
  180. package/src/config/logging/SlackLogger.js +2 -2
  181. package/src/config/middleware.d.ts +22 -2
  182. package/src/config/middleware.d.ts.map +1 -1
  183. package/src/config/middleware.js +179 -11
  184. package/src/config/notification.js +1 -1
  185. package/src/config/security.d.ts +1 -1
  186. package/src/config/security.js +1 -1
  187. package/src/config/storage.js +1 -1
  188. package/src/config/type.d.ts +8 -2
  189. package/src/config/type.d.ts.map +1 -1
  190. package/src/events/EventDispatcher.d.ts.map +1 -1
  191. package/src/events/EventDispatcher.js +6 -4
  192. package/src/exceptions/ZintrustError.d.ts +7 -0
  193. package/src/exceptions/ZintrustError.d.ts.map +1 -1
  194. package/src/exceptions/ZintrustError.js +56 -0
  195. package/src/features/Auth.d.ts +1 -1
  196. package/src/features/Auth.d.ts.map +1 -1
  197. package/src/features/Auth.js +3 -3
  198. package/src/features/Queue.js +1 -1
  199. package/src/functions/cloudflare.d.ts.map +1 -1
  200. package/src/functions/cloudflare.js +3 -14
  201. package/src/functions/deno.d.ts.map +1 -1
  202. package/src/functions/deno.js +3 -14
  203. package/src/functions/lambda.d.ts.map +1 -1
  204. package/src/functions/lambda.js +3 -14
  205. package/src/health/StartupHealthChecks.js +1 -1
  206. package/src/http/Controller.d.ts +2 -2
  207. package/src/http/Controller.d.ts.map +1 -1
  208. package/src/http/FileUpload.d.ts +68 -0
  209. package/src/http/FileUpload.d.ts.map +1 -0
  210. package/src/http/FileUpload.js +120 -0
  211. package/src/http/Kernel.d.ts +5 -5
  212. package/src/http/Kernel.d.ts.map +1 -1
  213. package/src/http/Kernel.js +139 -23
  214. package/src/http/Request.d.ts +20 -1
  215. package/src/http/Request.d.ts.map +1 -1
  216. package/src/http/Request.js +23 -0
  217. package/src/http/RequestContext.d.ts +6 -0
  218. package/src/http/RequestContext.d.ts.map +1 -1
  219. package/src/http/RequestContext.js +77 -1
  220. package/src/http/Response.d.ts +1 -1
  221. package/src/http/Response.d.ts.map +1 -1
  222. package/src/http/ValidationHelper.d.ts +78 -0
  223. package/src/http/ValidationHelper.d.ts.map +1 -0
  224. package/src/http/ValidationHelper.js +121 -0
  225. package/src/http/error-pages/ErrorPageRenderer.d.ts +17 -0
  226. package/src/http/error-pages/ErrorPageRenderer.d.ts.map +1 -0
  227. package/src/http/error-pages/ErrorPageRenderer.js +88 -0
  228. package/src/http/middleware/BodyParsingMiddleware.d.ts +12 -0
  229. package/src/http/middleware/BodyParsingMiddleware.d.ts.map +1 -0
  230. package/src/http/middleware/BodyParsingMiddleware.js +251 -0
  231. package/src/http/middleware/FileUploadMiddleware.d.ts +12 -0
  232. package/src/http/middleware/FileUploadMiddleware.d.ts.map +1 -0
  233. package/src/http/middleware/FileUploadMiddleware.js +74 -0
  234. package/src/http/parsers/BodyParsers.d.ts +32 -0
  235. package/src/http/parsers/BodyParsers.d.ts.map +1 -0
  236. package/src/http/parsers/BodyParsers.js +159 -0
  237. package/src/http/parsers/MultipartParser.d.ts +33 -0
  238. package/src/http/parsers/MultipartParser.d.ts.map +1 -0
  239. package/src/http/parsers/MultipartParser.js +129 -0
  240. package/src/http/parsers/MultipartParserRegistry.d.ts +34 -0
  241. package/src/http/parsers/MultipartParserRegistry.d.ts.map +1 -0
  242. package/src/http/parsers/MultipartParserRegistry.js +20 -0
  243. package/src/http/validated.d.ts +12 -0
  244. package/src/http/validated.d.ts.map +1 -0
  245. package/src/http/validated.js +41 -0
  246. package/src/index.d.ts +65 -7
  247. package/src/index.d.ts.map +1 -1
  248. package/src/index.js +59 -5
  249. package/src/microservices/RequestTracingMiddleware.d.ts +2 -2
  250. package/src/microservices/RequestTracingMiddleware.d.ts.map +1 -1
  251. package/src/microservices/RequestTracingMiddleware.js +3 -0
  252. package/src/microservices/ServiceAuthMiddleware.d.ts +2 -2
  253. package/src/microservices/ServiceAuthMiddleware.d.ts.map +1 -1
  254. package/src/middleware/AuthMiddleware.d.ts +10 -0
  255. package/src/middleware/AuthMiddleware.d.ts.map +1 -0
  256. package/src/middleware/AuthMiddleware.js +16 -0
  257. package/src/middleware/CsrfMiddleware.d.ts +11 -1
  258. package/src/middleware/CsrfMiddleware.d.ts.map +1 -1
  259. package/src/middleware/CsrfMiddleware.js +33 -0
  260. package/src/middleware/JwtAuthMiddleware.d.ts +11 -0
  261. package/src/middleware/JwtAuthMiddleware.d.ts.map +1 -0
  262. package/src/middleware/JwtAuthMiddleware.js +73 -0
  263. package/src/middleware/LoggingMiddleware.d.ts.map +1 -1
  264. package/src/middleware/LoggingMiddleware.js +8 -3
  265. package/src/middleware/MiddlewareStack.d.ts +2 -2
  266. package/src/middleware/MiddlewareStack.d.ts.map +1 -1
  267. package/src/middleware/RateLimiter.d.ts +2 -2
  268. package/src/middleware/RateLimiter.d.ts.map +1 -1
  269. package/src/middleware/RateLimiter.js +26 -1
  270. package/src/middleware/SanitizeBodyMiddleware.d.ts +12 -0
  271. package/src/middleware/SanitizeBodyMiddleware.d.ts.map +1 -0
  272. package/src/middleware/SanitizeBodyMiddleware.js +31 -0
  273. package/src/middleware/SecurityMiddleware.d.ts +1 -1
  274. package/src/middleware/SecurityMiddleware.d.ts.map +1 -1
  275. package/src/middleware/SessionMiddleware.d.ts +1 -1
  276. package/src/middleware/SessionMiddleware.d.ts.map +1 -1
  277. package/src/middleware/ValidationMiddleware.d.ts +25 -0
  278. package/src/middleware/ValidationMiddleware.d.ts.map +1 -0
  279. package/src/middleware/ValidationMiddleware.js +251 -0
  280. package/src/migrations/MigrationDiscovery.d.ts +5 -0
  281. package/src/migrations/MigrationDiscovery.d.ts.map +1 -0
  282. package/src/migrations/MigrationDiscovery.js +16 -0
  283. package/src/migrations/MigrationLoader.d.ts +5 -0
  284. package/src/migrations/MigrationLoader.d.ts.map +1 -0
  285. package/src/migrations/MigrationLoader.js +43 -0
  286. package/src/migrations/MigrationLock.d.ts +4 -0
  287. package/src/migrations/MigrationLock.d.ts.map +1 -0
  288. package/src/migrations/MigrationLock.js +33 -0
  289. package/src/migrations/Migrator.d.ts +23 -0
  290. package/src/migrations/Migrator.d.ts.map +1 -0
  291. package/src/migrations/Migrator.js +4 -0
  292. package/src/migrations/MigratorFactory.d.ts +25 -0
  293. package/src/migrations/MigratorFactory.d.ts.map +1 -0
  294. package/src/migrations/MigratorFactory.js +323 -0
  295. package/src/migrations/schema/Blueprint.d.ts +5 -0
  296. package/src/migrations/schema/Blueprint.d.ts.map +1 -0
  297. package/src/migrations/schema/Blueprint.js +189 -0
  298. package/src/migrations/schema/Schema.d.ts +8 -0
  299. package/src/migrations/schema/Schema.d.ts.map +1 -0
  300. package/src/migrations/schema/Schema.js +141 -0
  301. package/src/migrations/schema/SchemaCompiler.d.ts +20 -0
  302. package/src/migrations/schema/SchemaCompiler.d.ts.map +1 -0
  303. package/src/migrations/schema/SchemaCompiler.js +262 -0
  304. package/src/migrations/schema/index.d.ts +5 -0
  305. package/src/migrations/schema/index.d.ts.map +1 -0
  306. package/src/migrations/schema/index.js +3 -0
  307. package/src/migrations/schema/types.d.ts +86 -0
  308. package/src/migrations/schema/types.d.ts.map +1 -0
  309. package/src/migrations/schema/types.js +1 -0
  310. package/src/migrations/types.d.ts +45 -0
  311. package/src/migrations/types.d.ts.map +1 -0
  312. package/src/migrations/types.js +1 -0
  313. package/src/node-singletons/crypto.d.ts +1 -1
  314. package/src/node-singletons/crypto.d.ts.map +1 -1
  315. package/src/node-singletons/crypto.js +1 -1
  316. package/src/node-singletons/fs.d.ts +2 -2
  317. package/src/node-singletons/fs.d.ts.map +1 -1
  318. package/src/node-singletons/fs.js +1 -1
  319. package/src/node-singletons/util.d.ts +6 -0
  320. package/src/node-singletons/util.d.ts.map +1 -0
  321. package/src/node-singletons/util.js +5 -0
  322. package/src/node.d.ts +2 -0
  323. package/src/node.d.ts.map +1 -1
  324. package/src/node.js +7 -0
  325. package/src/observability/OpenTelemetry.d.ts +62 -0
  326. package/src/observability/OpenTelemetry.d.ts.map +1 -0
  327. package/src/observability/OpenTelemetry.js +167 -0
  328. package/src/observability/PrometheusMetrics.d.ts +25 -0
  329. package/src/observability/PrometheusMetrics.d.ts.map +1 -0
  330. package/src/observability/PrometheusMetrics.js +114 -0
  331. package/src/openapi/OpenApiGenerator.d.ts +68 -0
  332. package/src/openapi/OpenApiGenerator.d.ts.map +1 -0
  333. package/src/openapi/OpenApiGenerator.js +287 -0
  334. package/src/orm/Database.d.ts +4 -2
  335. package/src/orm/Database.d.ts.map +1 -1
  336. package/src/orm/Database.js +142 -29
  337. package/src/orm/DatabaseAdapter.d.ts +13 -0
  338. package/src/orm/DatabaseAdapter.d.ts.map +1 -1
  339. package/src/orm/DatabaseAdapterRegistry.d.ts.map +1 -1
  340. package/src/orm/DatabaseAdapterRegistry.js +3 -1
  341. package/src/orm/DatabaseRuntimeRegistration.d.ts.map +1 -1
  342. package/src/orm/DatabaseRuntimeRegistration.js +4 -0
  343. package/src/orm/Model.d.ts +30 -2
  344. package/src/orm/Model.d.ts.map +1 -1
  345. package/src/orm/Model.js +255 -62
  346. package/src/orm/QueryBuilder.d.ts +22 -1
  347. package/src/orm/QueryBuilder.d.ts.map +1 -1
  348. package/src/orm/QueryBuilder.js +405 -95
  349. package/src/orm/Relationships.d.ts +7 -1
  350. package/src/orm/Relationships.d.ts.map +1 -1
  351. package/src/orm/Relationships.js +18 -0
  352. package/src/orm/SchemaCompiler.d.ts +9 -0
  353. package/src/orm/SchemaCompiler.d.ts.map +1 -0
  354. package/src/orm/SchemaCompiler.js +145 -0
  355. package/src/orm/adapters/D1Adapter.d.ts +1 -1
  356. package/src/orm/adapters/D1Adapter.d.ts.map +1 -1
  357. package/src/orm/adapters/MySQLAdapter.d.ts +1 -1
  358. package/src/orm/adapters/MySQLAdapter.d.ts.map +1 -1
  359. package/src/orm/adapters/MySQLAdapter.js +88 -69
  360. package/src/orm/adapters/PostgreSQLAdapter.d.ts +1 -1
  361. package/src/orm/adapters/PostgreSQLAdapter.d.ts.map +1 -1
  362. package/src/orm/adapters/PostgreSQLAdapter.js +88 -69
  363. package/src/orm/adapters/SQLServerAdapter.d.ts +1 -1
  364. package/src/orm/adapters/SQLServerAdapter.d.ts.map +1 -1
  365. package/src/orm/adapters/SQLiteAdapter.d.ts +1 -1
  366. package/src/orm/adapters/SQLiteAdapter.d.ts.map +1 -1
  367. package/src/orm/adapters/SQLiteAdapter.js +63 -3
  368. package/src/orm/maintenance/SqliteMaintenance.d.ts +5 -0
  369. package/src/orm/maintenance/SqliteMaintenance.d.ts.map +1 -0
  370. package/src/orm/maintenance/SqliteMaintenance.js +14 -0
  371. package/src/orm/migrations/MigrationStore.d.ts +38 -0
  372. package/src/orm/migrations/MigrationStore.d.ts.map +1 -0
  373. package/src/orm/migrations/MigrationStore.js +157 -0
  374. package/src/performance/CodeGenerationBenchmark.d.ts.map +1 -1
  375. package/src/performance/Optimizer.d.ts +1 -0
  376. package/src/performance/Optimizer.d.ts.map +1 -1
  377. package/src/performance/Optimizer.js +37 -3
  378. package/src/profiling/MemoryProfiler.d.ts +1 -1
  379. package/src/profiling/MemoryProfiler.d.ts.map +1 -1
  380. package/src/profiling/N1Detector.d.ts +1 -1
  381. package/src/profiling/N1Detector.d.ts.map +1 -1
  382. package/src/profiling/QueryLogger.d.ts +1 -1
  383. package/src/profiling/QueryLogger.d.ts.map +1 -1
  384. package/src/profiling/RequestProfiler.d.ts +3 -3
  385. package/src/profiling/RequestProfiler.d.ts.map +1 -1
  386. package/src/routes/api.d.ts +2 -0
  387. package/src/routes/api.d.ts.map +1 -0
  388. package/src/routes/api.js +1 -0
  389. package/src/routes/broadcast.d.ts +2 -0
  390. package/src/routes/broadcast.d.ts.map +1 -0
  391. package/src/routes/broadcast.js +1 -0
  392. package/src/routes/health.d.ts +2 -0
  393. package/src/routes/health.d.ts.map +1 -0
  394. package/src/routes/health.js +1 -0
  395. package/src/routes/metrics.d.ts +2 -0
  396. package/src/routes/metrics.d.ts.map +1 -0
  397. package/src/routes/metrics.js +1 -0
  398. package/src/routes/storage.d.ts +2 -0
  399. package/src/routes/storage.d.ts.map +1 -0
  400. package/src/routes/storage.js +1 -0
  401. package/src/routing/CoreRoutes.d.ts +12 -0
  402. package/src/routing/CoreRoutes.d.ts.map +1 -0
  403. package/src/routing/CoreRoutes.js +151 -0
  404. package/src/routing/RouteRegistry.d.ts +39 -0
  405. package/src/routing/RouteRegistry.d.ts.map +1 -0
  406. package/src/routing/RouteRegistry.js +44 -0
  407. package/src/routing/Router.d.ts +26 -9
  408. package/src/routing/Router.d.ts.map +1 -1
  409. package/src/routing/Router.js +79 -35
  410. package/src/routing/common.d.ts +15 -0
  411. package/src/routing/common.d.ts.map +1 -0
  412. package/src/routing/common.js +47 -0
  413. package/src/routing/doc.d.ts +28 -0
  414. package/src/routing/doc.d.ts.map +1 -0
  415. package/src/routing/doc.js +95 -0
  416. package/src/routing/error.d.ts +21 -0
  417. package/src/routing/error.d.ts.map +1 -0
  418. package/src/routing/error.js +126 -0
  419. package/src/routing/errorPages.d.ts +14 -0
  420. package/src/routing/errorPages.d.ts.map +1 -0
  421. package/src/routing/errorPages.js +103 -0
  422. package/src/routing/publicRoot.d.ts +18 -0
  423. package/src/routing/publicRoot.d.ts.map +1 -0
  424. package/src/routing/publicRoot.js +49 -0
  425. package/src/runtime/PluginAutoImports.d.ts +21 -0
  426. package/src/runtime/PluginAutoImports.d.ts.map +1 -0
  427. package/src/runtime/PluginAutoImports.js +59 -0
  428. package/src/runtime/PluginManager.d.ts +1 -5
  429. package/src/runtime/PluginManager.d.ts.map +1 -1
  430. package/src/runtime/PluginManager.js +25 -18
  431. package/src/runtime/RuntimeAdapter.d.ts.map +1 -1
  432. package/src/runtime/RuntimeAdapter.js +20 -1
  433. package/src/runtime/RuntimeDetector.d.ts +1 -1
  434. package/src/runtime/RuntimeDetector.d.ts.map +1 -1
  435. package/src/runtime/adapters/CloudflareAdapter.d.ts +1 -1
  436. package/src/runtime/adapters/CloudflareAdapter.d.ts.map +1 -1
  437. package/src/runtime/adapters/CloudflareAdapter.js +1 -1
  438. package/src/runtime/adapters/DenoAdapter.d.ts +1 -1
  439. package/src/runtime/adapters/DenoAdapter.d.ts.map +1 -1
  440. package/src/runtime/adapters/DenoAdapter.js +3 -3
  441. package/src/runtime/adapters/LambdaAdapter.d.ts +1 -1
  442. package/src/runtime/adapters/LambdaAdapter.d.ts.map +1 -1
  443. package/src/runtime/adapters/LambdaAdapter.js +1 -1
  444. package/src/runtime/adapters/NodeServerAdapter.d.ts +1 -1
  445. package/src/runtime/adapters/NodeServerAdapter.d.ts.map +1 -1
  446. package/src/runtime/getKernel.d.ts +9 -0
  447. package/src/runtime/getKernel.d.ts.map +1 -0
  448. package/src/runtime/getKernel.js +27 -0
  449. package/src/scripts/TemplateImportsCheck.js +47 -7
  450. package/src/scripts/TemplateSync.js +92 -20
  451. package/src/security/Encryptor.d.ts.map +1 -1
  452. package/src/security/Encryptor.js +64 -7
  453. package/src/security/JwtManager.d.ts +1 -0
  454. package/src/security/JwtManager.d.ts.map +1 -1
  455. package/src/security/JwtManager.js +33 -0
  456. package/src/security/Sanitizer.d.ts +76 -0
  457. package/src/security/Sanitizer.d.ts.map +1 -0
  458. package/src/security/Sanitizer.js +412 -0
  459. package/src/security/TokenRevocation.d.ts +7 -0
  460. package/src/security/TokenRevocation.d.ts.map +1 -0
  461. package/src/security/TokenRevocation.js +57 -0
  462. package/src/seeders/SeederDiscovery.d.ts +5 -0
  463. package/src/seeders/SeederDiscovery.d.ts.map +1 -0
  464. package/src/seeders/SeederDiscovery.js +21 -0
  465. package/src/seeders/SeederLoader.d.ts +5 -0
  466. package/src/seeders/SeederLoader.d.ts.map +1 -0
  467. package/src/seeders/SeederLoader.js +60 -0
  468. package/src/seeders/types.d.ts +18 -0
  469. package/src/seeders/types.d.ts.map +1 -0
  470. package/src/seeders/types.js +1 -0
  471. package/src/session/SessionManager.js +1 -1
  472. package/src/start.d.ts +21 -0
  473. package/src/start.d.ts.map +1 -0
  474. package/src/start.js +60 -0
  475. package/src/templates/adapters/MySQLAdapter.ts.tpl +109 -85
  476. package/src/templates/adapters/PostgreSQLAdapter.ts.tpl +129 -88
  477. package/src/templates/adapters/SQLServerAdapter.ts.tpl +5 -9
  478. package/src/templates/adapters/SQLiteAdapter.ts.tpl +78 -11
  479. package/src/templates/features/Queue.ts.tpl +2 -2
  480. package/src/templates/project/basic/app/Controllers/AuthController.ts.tpl +217 -0
  481. package/src/templates/project/basic/app/Controllers/UserController.ts.tpl +3 -16
  482. package/src/templates/project/basic/app/Middleware/ProfilerMiddleware.ts.tpl +1 -3
  483. package/src/templates/project/basic/app/Middleware/index.ts.tpl +3 -8
  484. package/src/templates/project/basic/app/Models/Post.ts.tpl +2 -3
  485. package/src/templates/project/basic/app/Models/User.ts.tpl +1 -1
  486. package/src/templates/project/basic/app/Types/controller.ts.tpl +46 -0
  487. package/src/templates/project/basic/config/FileLogWriter.ts.tpl +5 -236
  488. package/src/templates/project/basic/config/SecretsManager.ts.tpl +13 -450
  489. package/src/templates/project/basic/config/StartupConfigValidator.ts.tpl +9 -268
  490. package/src/templates/project/basic/config/app.ts.tpl +13 -153
  491. package/src/templates/project/basic/config/broadcast.ts.tpl +15 -129
  492. package/src/templates/project/basic/config/cache.ts.tpl +15 -92
  493. package/src/templates/project/basic/config/cloudflare.ts.tpl +4 -39
  494. package/src/templates/project/basic/config/constants.ts.tpl +9 -65
  495. package/src/templates/project/basic/config/database.ts.tpl +29 -116
  496. package/src/templates/project/basic/config/env.ts.tpl +5 -169
  497. package/src/templates/project/basic/config/features.ts.tpl +6 -54
  498. package/src/templates/project/basic/config/index.ts.tpl +27 -24
  499. package/src/templates/project/basic/config/logger.ts.tpl +5 -381
  500. package/src/templates/project/basic/config/logging/HttpLogger.ts.tpl +1 -1
  501. package/src/templates/project/basic/config/logging/KvLogger.ts.tpl +2 -2
  502. package/src/templates/project/basic/config/logging/SlackLogger.ts.tpl +1 -1
  503. package/src/templates/project/basic/config/mail.ts.tpl +15 -115
  504. package/src/templates/project/basic/config/microservices.ts.tpl +11 -97
  505. package/src/templates/project/basic/config/middleware.ts.tpl +27 -18
  506. package/src/templates/project/basic/config/notification.ts.tpl +14 -127
  507. package/src/templates/project/basic/config/queue.ts.tpl +16 -79
  508. package/src/templates/project/basic/config/security.ts.tpl +11 -163
  509. package/src/templates/project/basic/config/startup.ts.tpl +10 -21
  510. package/src/templates/project/basic/config/storage.ts.tpl +15 -133
  511. package/src/templates/project/basic/config/type.ts.tpl +33 -441
  512. package/src/templates/project/basic/database/factories/UserFactory.ts.tpl +80 -0
  513. package/src/templates/project/basic/database/migrations/create_tasks_table.ts.tpl +28 -0
  514. package/src/templates/project/basic/database/migrations/create_users_table.ts.tpl +29 -0
  515. package/src/templates/project/basic/database/seeders/DatabaseSeeder.ts.tpl +19 -0
  516. package/src/templates/project/basic/database/seeders/UserSeeder.ts.tpl +18 -0
  517. package/src/templates/project/basic/database/seeders/index.ts.tpl +2 -0
  518. package/src/templates/project/basic/package.json.tpl +1 -1
  519. package/src/templates/project/basic/routes/api.ts.tpl +74 -36
  520. package/src/templates/project/basic/routes/health.ts.tpl +1 -6
  521. package/src/templates/project/basic/routes/metrics.ts.tpl +22 -0
  522. package/src/templates/project/basic/src/index.ts.tpl +7 -80
  523. package/src/templates/project/basic/tsconfig.json.tpl +12 -13
  524. package/src/testing/TestEnvironment.d.ts +40 -0
  525. package/src/testing/TestEnvironment.d.ts.map +1 -0
  526. package/src/testing/TestEnvironment.js +141 -0
  527. package/src/testing/TestHttp.d.ts +29 -0
  528. package/src/testing/TestHttp.d.ts.map +1 -0
  529. package/src/testing/TestHttp.js +96 -0
  530. package/src/testing/index.d.ts +5 -0
  531. package/src/testing/index.d.ts.map +1 -0
  532. package/src/testing/index.js +2 -0
  533. package/src/time/DateTime.d.ts +181 -0
  534. package/src/time/DateTime.d.ts.map +1 -0
  535. package/src/time/DateTime.js +300 -0
  536. package/src/time/index.d.ts +7 -0
  537. package/src/time/index.d.ts.map +1 -0
  538. package/src/time/index.js +5 -0
  539. package/src/tools/http/Http.d.ts.map +1 -1
  540. package/src/tools/http/Http.js +4 -0
  541. package/src/tools/mail/drivers/Smtp.js +1 -1
  542. package/src/tools/queue/drivers/InMemory.d.ts +1 -1
  543. package/src/tools/queue/drivers/InMemory.d.ts.map +1 -1
  544. package/src/tools/queue/drivers/InMemory.js +1 -1
  545. package/src/tools/queue/drivers/Redis.d.ts +1 -1
  546. package/src/tools/queue/drivers/Redis.d.ts.map +1 -1
  547. package/src/tools/queue/drivers/Redis.js +1 -1
  548. package/src/validation/ValidationError.d.ts.map +1 -1
  549. package/src/validation/ValidationError.js +4 -2
  550. package/src/validation/Validator.d.ts +49 -16
  551. package/src/validation/Validator.d.ts.map +1 -1
  552. package/src/validation/Validator.js +307 -5
  553. package/src/common/uuid.d.ts +0 -3
  554. package/src/common/uuid.d.ts.map +0 -1
  555. package/src/common/uuid.js +0 -30
  556. package/src/templates/project/basic/.env.example.tpl +0 -74
  557. package/src/templates/project/basic/.env.tpl +0 -166
  558. package/src/templates/project/basic/database/migrations/index.ts.tpl +0 -2
@@ -0,0 +1,28 @@
1
+ import { Schema as MigrationSchema, type Blueprint } from '@zintrust/core/migrations';
2
+ import type { IDatabase } from '@zintrust/core/orm';
3
+
4
+ export interface Migration {
5
+ up(db: IDatabase): Promise<void>;
6
+ down(db: IDatabase): Promise<void>;
7
+ }
8
+
9
+ export const migration: Migration = {
10
+ async up(db: IDatabase): Promise<void> {
11
+ const schema = MigrationSchema.create(db);
12
+
13
+ await schema.create('tasks', (table: Blueprint) => {
14
+ table.id();
15
+ table.string('title');
16
+ table.text('description').nullable();
17
+ table.string('status').default('pending');
18
+ table.unsignedBigInt('user_id');
19
+ table.foreign('user_id').references('id').on('users').onDelete('CASCADE');
20
+ table.timestamps();
21
+ });
22
+ },
23
+
24
+ async down(db: IDatabase): Promise<void> {
25
+ const schema = MigrationSchema.create(db);
26
+ await schema.dropIfExists('tasks');
27
+ },
28
+ };
@@ -0,0 +1,29 @@
1
+ import { Schema as MigrationSchema, type Blueprint } from '@zintrust/core/migrations';
2
+ import type { IDatabase } from '@zintrust/core/orm';
3
+
4
+ export interface Migration {
5
+ up(db: IDatabase): Promise<void>;
6
+ down(db: IDatabase): Promise<void>;
7
+ }
8
+
9
+ export const migration: Migration = {
10
+ async up(db: IDatabase): Promise<void> {
11
+ const schema = MigrationSchema.create(db);
12
+
13
+ await schema.create('users', (table: Blueprint) => {
14
+ table.id();
15
+ table.string('name');
16
+ table.string('email').unique();
17
+ table.string('password');
18
+ table.timestamp('email_verified_at').nullable();
19
+ table.boolean('active').default(true);
20
+ table.timestamps();
21
+ table.timestamp('deleted_at').nullable();
22
+ });
23
+ },
24
+
25
+ async down(db: IDatabase): Promise<void> {
26
+ const schema = MigrationSchema.create(db);
27
+ await schema.dropIfExists('users');
28
+ },
29
+ };
@@ -0,0 +1,19 @@
1
+ import { SeederDiscovery } from '@zintrust/core/seeders';
2
+ import { SeederLoader } from '@zintrust/core/seeders';
3
+ import { CommonUtils } from '@zintrust/core/common';
4
+ import * as path from 'node:path';
5
+ import type { IDatabase } from '@zintrust/core/orm';
6
+
7
+ export const DatabaseSeeder = Object.freeze({
8
+ async run(db: IDatabase): Promise<void> {
9
+ const dir = CommonUtils.esmDirname(import.meta.url);
10
+ const files = SeederDiscovery.listSeederFiles(dir).filter((filePath) => {
11
+ const base = path.basename(filePath, path.extname(filePath));
12
+ return base !== 'DatabaseSeeder';
13
+ });
14
+
15
+ const seeders = await Promise.all(files.map((filePath) => SeederLoader.load(filePath)));
16
+
17
+ await Promise.all(seeders.map((seeder) => seeder.run(db)));
18
+ },
19
+ });
@@ -0,0 +1,18 @@
1
+ import type { IDatabase } from '@zintrust/core/orm';
2
+
3
+ export interface Seeder {
4
+ run(db: IDatabase): Promise<void>;
5
+ }
6
+
7
+ export const UserSeeder: Seeder = Object.freeze({
8
+ async run(db: IDatabase): Promise<void> {
9
+ // Example: Use UserFactory from ../factories/UserFactory
10
+ // const users = UserFactory.count(5);
11
+ // for (const user of users) {
12
+ // Insert user data into database
13
+ // await db.query('INSERT INTO users (name, email, password, created_at, updated_at) VALUES (?, ?, ?, ?, ?)', [
14
+ // user.name, user.email, user.password, user.created_at, user.updated_at
15
+ // ]);
16
+ // }
17
+ },
18
+ });
@@ -0,0 +1,2 @@
1
+ // Placeholder for seeders
2
+ export const seeders = Object.freeze([] as const);
@@ -11,7 +11,7 @@
11
11
  "type-check": "tsc --noEmit"
12
12
  },
13
13
  "dependencies": {
14
- "@zintrust/core": "^0.1.4"
14
+ "@zintrust/core": "^{{coreVersion}}"
15
15
  },
16
16
  "devDependencies": {
17
17
  "@types/node": "^25.0.3",
@@ -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';
9
- import { registerBroadcastRoutes } from './broadcast';
10
- import { registerHealthRoutes } from './health';
11
- import { registerStorageRoutes } from './storage';
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';
10
+ import { registerBroadcastRoutes } from '@routes/broadcast';
11
+ import { registerHealthRoutes } from '@routes/health';
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
  });
@@ -3,12 +3,7 @@
3
3
  * Provides health, liveness, and readiness endpoints.
4
4
  */
5
5
 
6
- import { appConfig } from '../config/app';
7
- import { Env } from '../config/env';
8
- import { Logger } from '../config/logger';
9
- import { RuntimeHealthProbes } from '@zintrust/core';
10
- import { useDatabase } from '@zintrust/core';
11
- import { QueryBuilder } from '@zintrust/core';
6
+ import { useDatabase, appConfig, Env , Logger, RuntimeHealthProbes, QueryBuilder} from '@zintrust/core';
12
7
  import { type IRouter, Router } from '@zintrust/core';
13
8
 
14
9
  export function registerHealthRoutes(router: IRouter): void {
@@ -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;
@@ -1,86 +1,13 @@
1
1
  /**
2
- * test-app - Zintrust Application Entry Point
2
+ * Zintrust Application Entry Point
3
3
  */
4
4
 
5
- import { Application, Env, Logger, Server } from '@zintrust/core';
6
- import process from '@zintrust/core/node';
7
- // Optional adapters/drivers registered via `zin plugin install`
8
- import './zintrust.plugins.js';
5
+ import { isNodeMain, start } from '@zintrust/core/start';
9
6
 
10
- type AppInstance = ReturnType<typeof Application.create>;
11
- type ServerInstance = ReturnType<typeof Server.create>;
7
+ // Cloudflare Workers entry.
8
+ export { default } from '@zintrust/core/start';
12
9
 
13
- function withTimeout<T>(promise: Promise<T>, ms: number, timeoutMessage = 'Shutdown timed out'): Promise<T> {
14
- if (!Number.isFinite(ms) || ms <= 0) return promise;
15
-
16
- let timer: ReturnType<typeof setTimeout> | undefined;
17
-
18
- const timeout = new Promise<never>((_, reject) => {
19
- timer = setTimeout(() => reject(new globalThis.Error(timeoutMessage)), ms);
20
- });
21
-
22
- return Promise.race([promise, timeout]).finally(() => {
23
- if (timer) clearTimeout(timer);
24
- }) as Promise<T>;
25
- }
26
-
27
- async function stopServices(server: ServerInstance, app: AppInstance): Promise<void> {
28
- await server.close();
29
- await app.shutdown();
30
- }
31
-
32
- async function shutdownGracefully(signal: string, server: ServerInstance, app: AppInstance): Promise<void> {
33
- Logger.info(`${signal} received, shutting down gracefully...`);
34
-
35
- const timeoutMs = Env.getInt('SHUTDOWN_TIMEOUT', 1500);
36
- const forceExitMs = Env.getInt('SHUTDOWN_FORCE_EXIT_MS', 2500);
37
-
38
- const forceExitTimer = globalThis.setTimeout(() => {
39
- process.exit(0);
40
- }, forceExitMs);
41
-
42
- (forceExitTimer as unknown as { unref?: () => void }).unref?.();
43
-
44
- try {
45
- await withTimeout(stopServices(server, app), timeoutMs);
46
- globalThis.clearTimeout(forceExitTimer);
47
- process.exit(0);
48
- } catch (error) {
49
- Logger.error('Graceful shutdown failed:', error);
50
- process.exit(1);
51
- }
10
+ // Node entry (when executed as `node src/index.ts` / `tsx src/index.ts` etc.).
11
+ if (isNodeMain(import.meta.url)) {
12
+ await start();
52
13
  }
53
-
54
- /**
55
- * Start the application
56
- */
57
- async function start() {
58
- try {
59
- // Create application instance
60
- const app = Application.create();
61
-
62
- // Boot application
63
- await app.boot();
64
-
65
- // Get port and host from environment
66
- const port = Env.getInt('APP_PORT', 3000);
67
- const host = Env.get('HOST', 'localhost');
68
-
69
- // Create and start server
70
- const server = Server.create(app, port, host);
71
-
72
- // Start listening
73
- await server.listen();
74
-
75
- Logger.info(`Server running at http://${host}:${port}`);
76
-
77
- process.on('SIGTERM', () => void shutdownGracefully('SIGTERM', server, app));
78
- process.on('SIGINT', () => void shutdownGracefully('SIGINT', server, app));
79
- } catch (error) {
80
- Logger.error('Failed to start application:', error);
81
- process.exit(1);
82
- }
83
- }
84
-
85
- // Run start
86
- await start();
@@ -1,5 +1,6 @@
1
1
  {
2
2
  "compilerOptions": {
3
+ "ignoreDeprecations": "6.0",
3
4
  "baseUrl": ".",
4
5
  "outDir": "./dist",
5
6
  "rootDir": "./",
@@ -13,22 +14,20 @@
13
14
  "@app/*": ["./app/*"],
14
15
  "@toolkit/*": ["./app/Toolkit/*"],
15
16
  "@config/*": ["./config/*"],
16
- "@app/*": ["./app/*"],
17
- "@toolkit/*": ["./app/Toolkit/*"],
18
17
  "@routes/*": ["./routes/*"],
19
18
  "@database/*": ["./database/*"],
20
19
 
21
- "@tools/*": ["./src/tools/*"],
22
- "@httpClient/*": ["./src/tools/http/*"],
23
- "@templates": ["./src/tools/templates/index.ts"],
24
- "@templates/*": ["./src/tools/templates/*"],
25
- "@mail/*": ["./src/tools/mail/*"],
26
- "@storage": ["./src/tools/storage/index.ts"],
27
- "@storage/*": ["./src/tools/storage/*"],
28
- "@drivers/*": ["./src/tools/storage/drivers/*"],
29
- "@notification/*": ["./src/tools/notification/*"],
30
- "@broadcast/*": ["./src/tools/broadcast/*"],
31
- "@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/*"]
32
31
  }
33
32
  },
34
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