@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
@@ -0,0 +1,428 @@
1
+ /* eslint-disable no-undef */
2
+ /* eslint-disable @typescript-eslint/explicit-function-return-type */
3
+ (() => {
4
+ const storageKey = 'zintrust.theme';
5
+
6
+ const prefersDark = () => {
7
+ try {
8
+ if (typeof globalThis === 'undefined') return false;
9
+ const anyGlobal = globalThis;
10
+ if (typeof anyGlobal.matchMedia !== 'function') return false;
11
+ return anyGlobal.matchMedia('(prefers-color-scheme: dark)').matches;
12
+ } catch {
13
+ return false;
14
+ }
15
+ };
16
+
17
+ const getSaved = () => {
18
+ try {
19
+ return localStorage.getItem(storageKey);
20
+ } catch {
21
+ return null;
22
+ }
23
+ };
24
+
25
+ const setSaved = (value) => {
26
+ try {
27
+ localStorage.setItem(storageKey, value);
28
+ } catch {
29
+ // ignore
30
+ }
31
+ };
32
+
33
+ const apply = (mode) => {
34
+ const html = document.documentElement;
35
+ const isDark = mode === 'dark';
36
+ html.classList.toggle('dark', isDark);
37
+
38
+ const checkbox = document.getElementById('toggle-theme-checkbox');
39
+ if (checkbox && checkbox instanceof HTMLInputElement) {
40
+ checkbox.checked = isDark;
41
+ }
42
+ };
43
+
44
+ const createEl = (tag, className, text) => {
45
+ const el = document.createElement(tag);
46
+ if (className) el.className = className;
47
+ if (typeof text === 'string') el.textContent = text;
48
+ return el;
49
+ };
50
+
51
+ const safeJsonParse = (text) => {
52
+ try {
53
+ if (typeof text !== 'string') return undefined;
54
+ const trimmed = text.trim();
55
+ if (trimmed === '') return undefined;
56
+ return JSON.parse(trimmed);
57
+ } catch {
58
+ return undefined;
59
+ }
60
+ };
61
+
62
+ const copyText = async (text) => {
63
+ try {
64
+ if (!text) return;
65
+ await navigator.clipboard.writeText(text);
66
+ } catch {
67
+ // ignore
68
+ }
69
+ };
70
+
71
+ const replacePanelWithDiv = (panelEl, contentEl, extraClass) => {
72
+ if (!(panelEl instanceof HTMLElement)) return undefined;
73
+ const div = document.createElement('div');
74
+
75
+ // Preserve tab panel wiring.
76
+ div.id = panelEl.id;
77
+ div.className = `${panelEl.className} ${extraClass || ''}`.trim();
78
+ div.hidden = panelEl.hidden;
79
+
80
+ // Preserve attributes used by tabs + a11y.
81
+ const role = panelEl.getAttribute('role');
82
+ if (role) div.setAttribute('role', role);
83
+ const labelledBy = panelEl.getAttribute('aria-labelledby');
84
+ if (labelledBy) div.setAttribute('aria-labelledby', labelledBy);
85
+ if (panelEl.dataset && panelEl.dataset.panel) div.dataset.panel = panelEl.dataset.panel;
86
+
87
+ div.appendChild(contentEl);
88
+ panelEl.replaceWith(div);
89
+ return div;
90
+ };
91
+
92
+ const shortPath = (filePath) => {
93
+ if (typeof filePath !== 'string') return '';
94
+ if (filePath.startsWith('node:')) return filePath;
95
+ const normalized = filePath.replaceAll('\\', '/');
96
+ const parts = normalized.split('/').filter(Boolean);
97
+ if (parts.length <= 3) return normalized;
98
+ return `…/${parts.slice(-3).join('/')}`;
99
+ };
100
+
101
+ const parseStackFrames = (stackText) => {
102
+ const trimmed = typeof stackText === 'string' ? stackText.trim() : '';
103
+ if (!trimmed) return undefined;
104
+
105
+ const lines = trimmed.split('\n').map((l) => l.trimEnd());
106
+ const header = lines[0] || 'Error';
107
+ const frameLines = lines.slice(1).filter((l) => l.trim() !== '');
108
+
109
+ const parseLocation = (location) => {
110
+ if (typeof location !== 'string') return undefined;
111
+ const loc = location.trim();
112
+ if (!loc) return undefined;
113
+
114
+ const lastColon = loc.lastIndexOf(':');
115
+ if (lastColon === -1) return undefined;
116
+
117
+ const colPart = loc.slice(lastColon + 1);
118
+ if (!/^\d+$/.test(colPart)) return undefined;
119
+
120
+ const secondLastColon = loc.lastIndexOf(':', lastColon - 1);
121
+ if (secondLastColon === -1) return undefined;
122
+
123
+ const linePart = loc.slice(secondLastColon + 1, lastColon);
124
+ if (!/^\d+$/.test(linePart)) return undefined;
125
+
126
+ const file = loc.slice(0, secondLastColon);
127
+ if (!file) return undefined;
128
+
129
+ return { file, lineNo: linePart, colNo: colPart };
130
+ };
131
+
132
+ const parseV8Frame = (stackLine) => {
133
+ const trimmedLine = stackLine.trim();
134
+ if (!trimmedLine.startsWith('at ')) return undefined;
135
+
136
+ const afterAt = trimmedLine.slice(3).trim();
137
+
138
+ let fn = '';
139
+ let location = afterAt;
140
+
141
+ // Typical V8 format: "at fn (file:line:col)" or "at file:line:col"
142
+ if (afterAt.endsWith(')')) {
143
+ const openIdx = afterAt.lastIndexOf(' (');
144
+ if (openIdx !== -1) {
145
+ fn = afterAt.slice(0, openIdx).trim();
146
+ location = afterAt.slice(openIdx + 2, -1).trim();
147
+ }
148
+ }
149
+
150
+ const loc = parseLocation(location);
151
+ if (!loc) return undefined;
152
+
153
+ return { fn, ...loc };
154
+ };
155
+
156
+ const frames = frameLines.map((rawLine) => {
157
+ const line = rawLine.trim();
158
+ const parsed = parseV8Frame(line);
159
+
160
+ if (!parsed) {
161
+ return { raw: line };
162
+ }
163
+
164
+ return {
165
+ raw: line,
166
+ fn: parsed.fn || '',
167
+ file: parsed.file || '',
168
+ lineNo: parsed.lineNo || '',
169
+ colNo: parsed.colNo || '',
170
+ };
171
+ });
172
+
173
+ return { header, frames };
174
+ };
175
+
176
+ const buildStackView = (parsed) => {
177
+ const root = createEl('div', 'stack-view');
178
+
179
+ const headerRow = createEl('div', 'stack-header');
180
+ const headerText = createEl('div', 'stack-error');
181
+ headerText.textContent = parsed.header;
182
+
183
+ const controls = createEl('div', 'stack-controls');
184
+ const expandBtn = createEl('button', 'mini-btn', 'Expand all');
185
+ expandBtn.type = 'button';
186
+ const collapseBtn = createEl('button', 'mini-btn', 'Collapse all');
187
+ collapseBtn.type = 'button';
188
+ const copyBtn = createEl('button', 'mini-btn', 'Copy');
189
+ copyBtn.type = 'button';
190
+
191
+ controls.append(expandBtn, collapseBtn, copyBtn);
192
+ headerRow.append(headerText, controls);
193
+ root.appendChild(headerRow);
194
+
195
+ const list = createEl('div', 'stack-list');
196
+
197
+ const detailsEls = [];
198
+ parsed.frames.forEach((frame, idx) => {
199
+ const details = document.createElement('details');
200
+ details.className = 'stack-frame';
201
+ if (idx < 2) details.open = true;
202
+
203
+ const summary = document.createElement('summary');
204
+ summary.className = 'stack-summary';
205
+
206
+ const left = createEl('div', 'stack-left');
207
+ const fnEl = createEl('span', 'stack-fn', frame.fn || '(anonymous)');
208
+ left.appendChild(fnEl);
209
+
210
+ const right = createEl('div', 'stack-right');
211
+ const fileText = frame.file ? shortPath(frame.file) : frame.raw;
212
+ const fileEl = createEl('span', 'stack-file', fileText);
213
+ if (frame.file) fileEl.title = frame.file;
214
+ const loc = frame.lineNo ? `${frame.lineNo}:${frame.colNo || ''}`.replace(/:$/, '') : '';
215
+ const locEl = createEl('span', 'stack-loc', loc);
216
+
217
+ right.appendChild(fileEl);
218
+ if (loc) right.appendChild(locEl);
219
+
220
+ summary.append(left, right);
221
+ details.appendChild(summary);
222
+
223
+ const raw = createEl('pre', 'stack-rawline');
224
+ raw.textContent = frame.raw;
225
+ details.appendChild(raw);
226
+
227
+ detailsEls.push(details);
228
+ list.appendChild(details);
229
+ });
230
+
231
+ expandBtn.addEventListener('click', () => {
232
+ detailsEls.forEach((d) => {
233
+ d.open = true;
234
+ });
235
+ });
236
+
237
+ collapseBtn.addEventListener('click', () => {
238
+ detailsEls.forEach((d) => {
239
+ d.open = false;
240
+ });
241
+ });
242
+
243
+ copyBtn.addEventListener('click', () => {
244
+ copyText(`${parsed.header}\n${parsed.frames.map((f) => f.raw).join('\n')}`);
245
+ });
246
+
247
+ root.appendChild(list);
248
+ return root;
249
+ };
250
+
251
+ const buildRequestView = (requestObj) => {
252
+ const root = createEl('div', 'request-view');
253
+
254
+ const top = createEl('div', 'request-top');
255
+ const left = createEl('div', 'request-top-left');
256
+ const right = createEl('div', 'request-top-right');
257
+
258
+ const method = createEl('span', 'badge badge-method', String(requestObj.method || ''));
259
+ const path = createEl('span', 'badge badge-path', String(requestObj.path || ''));
260
+
261
+ left.append(method, path);
262
+
263
+ const copyBtn = createEl('button', 'mini-btn', 'Copy JSON');
264
+ copyBtn.type = 'button';
265
+ copyBtn.addEventListener('click', () => {
266
+ copyText(JSON.stringify(requestObj, null, 2));
267
+ });
268
+ right.appendChild(copyBtn);
269
+ top.append(left, right);
270
+ root.appendChild(top);
271
+
272
+ const section = (title, bodyEl) => {
273
+ const wrap = createEl('div', 'request-section');
274
+ const h = createEl('div', 'request-section-title', title);
275
+ wrap.appendChild(h);
276
+ wrap.appendChild(bodyEl);
277
+ return wrap;
278
+ };
279
+
280
+ const kvList = (obj) => {
281
+ const wrap = createEl('div', 'kv');
282
+ const entries = obj && typeof obj === 'object' ? Object.entries(obj) : [];
283
+ if (entries.length === 0) {
284
+ wrap.appendChild(createEl('div', 'kv-empty', '—'));
285
+ return wrap;
286
+ }
287
+ entries
288
+ .sort(([a], [b]) => a.localeCompare(b))
289
+ .forEach(([k, v]) => {
290
+ const row = createEl('div', 'kv-row');
291
+ const key = createEl('div', 'kv-key', k);
292
+ const val = createEl('div', 'kv-val');
293
+ const asText = typeof v === 'string' ? v : JSON.stringify(v);
294
+ val.textContent = asText;
295
+ if (asText === '[redacted]') {
296
+ val.classList.add('is-redacted');
297
+ }
298
+ row.append(key, val);
299
+ wrap.appendChild(row);
300
+ });
301
+ return wrap;
302
+ };
303
+
304
+ root.appendChild(section('Headers', kvList(requestObj.headers)));
305
+ root.appendChild(section('Query', kvList(requestObj.query)));
306
+ return root;
307
+ };
308
+
309
+ const initPrettyFormatters = () => {
310
+ // Stack Trace pretty
311
+ const stackPretty = document.getElementById('stack-pretty');
312
+ if (stackPretty instanceof HTMLElement) {
313
+ const parsed = parseStackFrames(stackPretty.textContent || '');
314
+ if (parsed && parsed.frames.length > 0) {
315
+ const view = buildStackView(parsed);
316
+ replacePanelWithDiv(stackPretty, view, 'pretty-panel');
317
+ }
318
+ }
319
+
320
+ // Request pretty (prefer JSON from raw panel)
321
+ const requestRaw = document.getElementById('request-raw');
322
+ const requestPretty = document.getElementById('request-pretty');
323
+ if (requestRaw instanceof HTMLElement && requestPretty instanceof HTMLElement) {
324
+ const obj = safeJsonParse(requestRaw.textContent || '');
325
+ if (obj && typeof obj === 'object') {
326
+ const view = buildRequestView(obj);
327
+ replacePanelWithDiv(requestPretty, view, 'pretty-panel');
328
+ }
329
+ }
330
+ };
331
+
332
+ const initTabset = (tabset) => {
333
+ if (!(tabset instanceof HTMLElement)) return;
334
+
335
+ const card = tabset.closest('.card');
336
+ if (!(card instanceof HTMLElement)) return;
337
+
338
+ const buttons = Array.from(tabset.querySelectorAll('button[data-tab]')).filter(
339
+ (el) => el instanceof HTMLButtonElement
340
+ );
341
+
342
+ const panels = Array.from(card.querySelectorAll('[data-panel]')).filter(
343
+ (el) => el instanceof HTMLElement
344
+ );
345
+
346
+ const setActive = (name) => {
347
+ buttons.forEach((btn) => {
348
+ const isActive = btn.dataset.tab === name;
349
+ btn.setAttribute('aria-selected', isActive ? 'true' : 'false');
350
+ btn.tabIndex = isActive ? 0 : -1;
351
+ });
352
+
353
+ panels.forEach((panel) => {
354
+ panel.hidden = panel.dataset.panel !== name;
355
+ });
356
+ };
357
+
358
+ buttons.forEach((btn) => {
359
+ btn.addEventListener('click', () => {
360
+ const name = btn.dataset.tab;
361
+ if (!name) return;
362
+ setActive(name);
363
+ });
364
+ });
365
+
366
+ setActive('pretty');
367
+ };
368
+
369
+ const initTabsets = () => {
370
+ const tabsets = document.querySelectorAll('[data-tabset]');
371
+ tabsets.forEach((tabset) => initTabset(tabset));
372
+ };
373
+
374
+ const initOptionalSections = () => {
375
+ const optionalSections = document.querySelectorAll('[data-hide-when-empty]');
376
+ optionalSections.forEach((section) => {
377
+ if (!(section instanceof HTMLElement)) return;
378
+
379
+ const selectorList = section.dataset.hideWhenEmpty;
380
+ if (!selectorList) return;
381
+
382
+ const selectors = selectorList
383
+ .split(',')
384
+ .map((s) => s.trim())
385
+ .filter(Boolean);
386
+
387
+ const hasAnyContent = selectors.some((sel) => {
388
+ const el = section.querySelector(sel);
389
+ if (!(el instanceof HTMLElement)) return false;
390
+ return (el.textContent || '').trim().length > 0;
391
+ });
392
+
393
+ if (!hasAnyContent) {
394
+ section.hidden = true;
395
+ }
396
+ });
397
+ };
398
+
399
+ const init = () => {
400
+ const saved = getSaved();
401
+ if (saved === 'dark' || saved === 'light') {
402
+ apply(saved);
403
+ } else {
404
+ apply(prefersDark() ? 'dark' : 'light');
405
+ }
406
+
407
+ const checkbox = document.getElementById('toggle-theme-checkbox');
408
+ if (checkbox && checkbox instanceof HTMLInputElement) {
409
+ checkbox.addEventListener('change', () => {
410
+ const mode = checkbox.checked ? 'dark' : 'light';
411
+ setSaved(mode);
412
+ apply(mode);
413
+ });
414
+ }
415
+
416
+ // Build “Pretty” views first, then wire tabs.
417
+ initPrettyFormatters();
418
+
419
+ initTabsets();
420
+ initOptionalSections();
421
+ };
422
+
423
+ if (document.readyState === 'loading') {
424
+ document.addEventListener('DOMContentLoaded', init, { once: true });
425
+ } else {
426
+ init();
427
+ }
428
+ })();
@@ -0,0 +1,30 @@
1
+ <svg width="120" height="120" viewBox="0 0 100 100" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <defs>
3
+ <linearGradient id="zt-g2d" x1="10" y1="50" x2="90" y2="50" gradientUnits="userSpaceOnUse">
4
+ <stop stop-color="#22c55e" />
5
+ <stop offset="1" stop-color="#38bdf8" />
6
+ </linearGradient>
7
+ </defs>
8
+ <circle cx="50" cy="50" r="34" stroke="rgba(255,255,255,0.16)" stroke-width="4" />
9
+ <ellipse cx="50" cy="50" rx="40" ry="18" stroke="url(#zt-g2d)" stroke-width="4" />
10
+ <ellipse cx="50" cy="50" rx="18" ry="40" stroke="url(#zt-g2d)" stroke-width="4" opacity="0.75" />
11
+ <circle cx="50" cy="50" r="6" fill="url(#zt-g2d)" />
12
+ <path
13
+ d="M40 52C35 52 32 49 32 44C32 39 35 36 40 36H48"
14
+ stroke="white"
15
+ stroke-width="6"
16
+ stroke-linecap="round"
17
+ />
18
+ <path
19
+ d="M60 48C65 48 68 51 68 56C68 61 65 64 60 64H52"
20
+ stroke="white"
21
+ stroke-width="6"
22
+ stroke-linecap="round"
23
+ />
24
+ <path
25
+ d="M44 50H56"
26
+ stroke="rgba(255,255,255,0.22)"
27
+ stroke-width="6"
28
+ stroke-linecap="round"
29
+ />
30
+ </svg>
@@ -1 +1 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../routes/api.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,EAAE,KAAK,OAAO,EAAU,MAAM,iBAAiB,CAAC;AAEvD,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAKpD"}
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../routes/api.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAaH,OAAO,EAAE,KAAK,OAAO,EAAU,MAAM,iBAAiB,CAAC;AAEvD,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAMpD"}
package/routes/api.js CHANGED
@@ -2,16 +2,20 @@
2
2
  * Example Routes
3
3
  * Demonstrates routing patterns
4
4
  */
5
- import { UserController } from '../app/Controllers/UserController.js';
5
+ import { AuthController } from '../app/Controllers/AuthController.js';
6
+ import { UserQueryBuilderController } from '../app/Controllers/UserQueryBuilderController.js';
6
7
  import { Env } from '../src/config/env.js';
7
8
  import { registerBroadcastRoutes } from './broadcast.js';
8
9
  import { registerHealthRoutes } from './health.js';
10
+ import { registerMetricsRoutes } from './metrics.js';
11
+ import { registerOpenApiRoutes } from './openapi.js';
9
12
  import { registerStorageRoutes } from './storage.js';
10
13
  import { Router } from '../src/routing/Router.js';
11
14
  export function registerRoutes(router) {
12
- const userController = UserController.create();
15
+ const authController = AuthController.create();
16
+ const userController = UserQueryBuilderController.create();
13
17
  registerPublicRoutes(router);
14
- registerApiV1Routes(router, userController);
18
+ registerApiV1Routes(router, authController, userController);
15
19
  registerAdminRoutes(router);
16
20
  }
17
21
  /**
@@ -20,7 +24,9 @@ export function registerRoutes(router) {
20
24
  function registerPublicRoutes(router) {
21
25
  registerRootRoute(router);
22
26
  registerHealthRoutes(router);
27
+ registerMetricsRoutes(router);
23
28
  registerBroadcastRoutes(router);
29
+ registerOpenApiRoutes(router);
24
30
  registerStorageRoutes(router);
25
31
  }
26
32
  function registerRootRoute(router) {
@@ -37,16 +43,22 @@ function registerRootRoute(router) {
37
43
  /**
38
44
  * Register API V1 routes
39
45
  */
40
- function registerApiV1Routes(router, userController) {
46
+ function registerApiV1Routes(router, authController, userController) {
41
47
  Router.group(router, '/api/v1', (r) => {
42
48
  // Auth routes
43
- Router.post(r, '/auth/login', async (_req, res) => {
44
- res.json({ message: 'Login endpoint' });
49
+ Router.post(r, '/auth/login', authController.login, {
50
+ middleware: ['authRateLimit', 'validateLogin'],
45
51
  });
46
- Router.post(r, '/auth/register', async (_req, res) => {
47
- res.json({ message: 'Register endpoint' });
52
+ Router.post(r, '/auth/register', authController.register, {
53
+ middleware: ['authRateLimit', 'validateRegister'],
48
54
  });
49
- // Protected routes (middleware is not modeled in Router.ts yet)
55
+ Router.post(r, '/auth/logout', authController.logout, {
56
+ middleware: ['auth', 'jwt'],
57
+ });
58
+ Router.post(r, '/auth/refresh', authController.refresh, {
59
+ middleware: ['auth', 'jwt'],
60
+ });
61
+ // Protected routes (Router supports per-route middleware metadata)
50
62
  const pr = r;
51
63
  // User resource (REST-ish)
52
64
  Router.resource(pr, '/users', {
@@ -55,17 +67,29 @@ function registerApiV1Routes(router, userController) {
55
67
  show: userController.show,
56
68
  update: userController.update,
57
69
  destroy: userController.destroy,
70
+ }, {
71
+ middleware: ['auth', 'jwt'],
72
+ store: { middleware: ['auth', 'jwt', 'userMutationRateLimit', 'validateUserStore'] },
73
+ update: { middleware: ['auth', 'jwt', 'userMutationRateLimit', 'validateUserUpdate'] },
74
+ destroy: { middleware: ['auth', 'jwt', 'userMutationRateLimit'] },
75
+ });
76
+ Router.post(pr, '/users/fill', userController.fill, {
77
+ middleware: ['auth', 'jwt', 'fillRateLimit', 'validateUserFill'],
58
78
  });
59
79
  // If the controller exposes create/edit, wire them explicitly.
60
- Router.get(pr, '/users/create', userController.create);
61
- Router.get(pr, '/users/:id/edit', userController.edit);
80
+ Router.get(pr, '/users/create', userController.create, {
81
+ middleware: ['auth', 'jwt'],
82
+ });
83
+ Router.get(pr, '/users/:id/edit', userController.edit, {
84
+ middleware: ['auth', 'jwt'],
85
+ });
62
86
  // Custom user routes
63
- Router.get(pr, '/profile', async (_req, res) => {
87
+ Router.get(pr, '/profile', async (__req, res) => {
64
88
  res.json({ message: 'Get user profile' });
65
- });
66
- Router.put(pr, '/profile', async (_req, res) => {
89
+ }, { middleware: ['auth', 'jwt'] });
90
+ Router.put(pr, '/profile', async (__req, res) => {
67
91
  res.json({ message: 'Update user profile' });
68
- });
92
+ }, { middleware: ['auth', 'jwt'] });
69
93
  // Posts resource
70
94
  Router.get(r, '/posts', async (_req, res) => {
71
95
  res.json({ data: [] });
@@ -81,10 +105,10 @@ function registerApiV1Routes(router, userController) {
81
105
  */
82
106
  function registerAdminRoutes(router) {
83
107
  Router.group(router, '/admin', (r) => {
84
- Router.get(r, '/dashboard', async (_req, res) => {
108
+ Router.get(r, '/dashboard', async (__req, res) => {
85
109
  res.json({ message: 'Admin dashboard' });
86
110
  });
87
- Router.get(r, '/users', async (_req, res) => {
111
+ Router.get(r, '/users', async (__req, res) => {
88
112
  res.json({ data: [] });
89
113
  });
90
114
  });
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Metrics Routes
3
+ *
4
+ * Exposes Prometheus metrics when enabled.
5
+ */
6
+ import { type IRouter } from '../src/routing/Router';
7
+ export declare function registerMetricsRoutes(router: IRouter): void;
8
+ export default registerMetricsRoutes;
9
+ //# sourceMappingURL=metrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../routes/metrics.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,KAAK,OAAO,EAAU,MAAM,iBAAiB,CAAC;AAEvD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAW3D;AAED,eAAe,qBAAqB,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Metrics Routes
3
+ *
4
+ * Exposes Prometheus metrics when enabled.
5
+ */
6
+ import { PrometheusMetrics } from '../src/observability/PrometheusMetrics.js';
7
+ import { Env } from '../src/config/env.js';
8
+ import { Router } from '../src/routing/Router.js';
9
+ export function registerMetricsRoutes(router) {
10
+ if (Env.getBool('METRICS_ENABLED', false) === false)
11
+ return;
12
+ const pathFromEnv = Env.get('METRICS_PATH', '/metrics').trim();
13
+ const path = pathFromEnv === '' ? '/metrics' : pathFromEnv;
14
+ Router.get(router, path, async (_req, res) => {
15
+ const { contentType, body } = await PrometheusMetrics.getMetricsText();
16
+ res.setHeader('Content-Type', contentType);
17
+ res.send(body);
18
+ });
19
+ }
20
+ export default registerMetricsRoutes;
@@ -0,0 +1,9 @@
1
+ /**
2
+ * OpenAPI Routes
3
+ *
4
+ * Serves a generated OpenAPI spec from the in-memory RouteRegistry.
5
+ */
6
+ import { type IRouter } from '../src/routing/Router';
7
+ export declare function registerOpenApiRoutes(router: IRouter): void;
8
+ export default registerOpenApiRoutes;
9
+ //# sourceMappingURL=openapi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openapi.d.ts","sourceRoot":"","sources":["../../routes/openapi.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,KAAK,OAAO,EAAU,MAAM,iBAAiB,CAAC;AA2CvD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAuC3D;AAED,eAAe,qBAAqB,CAAC"}