@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,145 @@
1
+ import { ErrorFactory } from '../exceptions/ZintrustError.js';
2
+ const IDENT_RE = /^[A-Za-z_]\w*$/;
3
+ const INT_TYPES = new Set([
4
+ 'integer',
5
+ 'smallInteger',
6
+ 'tinyInteger',
7
+ 'mediumInteger',
8
+ ]);
9
+ function assertIdentifier(label, value) {
10
+ if (!IDENT_RE.test(value)) {
11
+ throw ErrorFactory.createValidationError(`Invalid ${label} identifier: ${value}`);
12
+ }
13
+ }
14
+ function quoteIdent(driver, ident) {
15
+ assertIdentifier('SQL', ident);
16
+ // MySQL uses backticks; Postgres/SQLite accept double-quotes.
17
+ if (driver === 'mysql')
18
+ return `\`${ident}\``;
19
+ return `"${ident}"`;
20
+ }
21
+ function getAutoIncrementSql(driver, col, type) {
22
+ const isSqlite = driver === 'sqlite' || driver === 'd1' || driver === 'd1-remote';
23
+ if (isSqlite) {
24
+ return `${col} INTEGER PRIMARY KEY AUTOINCREMENT`;
25
+ }
26
+ if (driver === 'postgresql') {
27
+ return `${col} ${type === 'bigInteger' ? 'BIGSERIAL' : 'SERIAL'} PRIMARY KEY`;
28
+ }
29
+ if (driver === 'mysql') {
30
+ const base = type === 'bigInteger' ? 'BIGINT' : 'INT';
31
+ return `${col} ${base} AUTO_INCREMENT PRIMARY KEY`;
32
+ }
33
+ return null;
34
+ }
35
+ function getStringTypeSql(driver, def) {
36
+ const isSqlite = driver === 'sqlite' || driver === 'd1' || driver === 'd1-remote';
37
+ const len = typeof def.length === 'number' && Number.isFinite(def.length) ? def.length : 255;
38
+ return isSqlite ? 'TEXT' : `VARCHAR(${len})`;
39
+ }
40
+ function getDecimalTypeSql(def) {
41
+ const p = typeof def.precision === 'number' ? def.precision : 10;
42
+ const s = typeof def.scale === 'number' ? def.scale : 2;
43
+ return `DECIMAL(${p},${s})`;
44
+ }
45
+ function getDateTimeTypeSql(driver) {
46
+ if (driver === 'mysql')
47
+ return 'DATETIME';
48
+ if (driver === 'postgresql')
49
+ return 'TIMESTAMP';
50
+ return 'TEXT';
51
+ }
52
+ function getIntegerTypeSql(driver, type) {
53
+ if (INT_TYPES.has(type))
54
+ return driver === 'mysql' ? 'INT' : 'INTEGER';
55
+ if (type === 'bigInteger')
56
+ return 'BIGINT';
57
+ return null;
58
+ }
59
+ function getSpecialTypeSql(driver, type) {
60
+ if (type === 'boolean')
61
+ return driver === 'mysql' ? 'TINYINT(1)' : 'BOOLEAN';
62
+ if (type === 'json')
63
+ return driver === 'postgresql' ? 'JSONB' : 'TEXT';
64
+ if (type === 'uuid')
65
+ return driver === 'postgresql' ? 'UUID' : 'TEXT';
66
+ return null;
67
+ }
68
+ function getColumnTypeSql(driver, def) {
69
+ if (def.type === 'string' || def.type === 'char')
70
+ return getStringTypeSql(driver, def);
71
+ if (def.type === 'decimal')
72
+ return getDecimalTypeSql(def);
73
+ if (def.type === 'datetime' || def.type === 'timestamp')
74
+ return getDateTimeTypeSql(driver);
75
+ const intSql = getIntegerTypeSql(driver, def.type);
76
+ if (intSql !== null)
77
+ return intSql;
78
+ const specialSql = getSpecialTypeSql(driver, def.type);
79
+ if (specialSql !== null)
80
+ return specialSql;
81
+ return 'TEXT';
82
+ }
83
+ function getDefaultValueSql(table, def) {
84
+ if (def.default === undefined)
85
+ return null;
86
+ const dv = def.default;
87
+ if (dv === null)
88
+ return 'DEFAULT NULL';
89
+ if (typeof dv === 'number' && Number.isFinite(dv))
90
+ return `DEFAULT ${dv}`;
91
+ if (typeof dv === 'boolean')
92
+ return `DEFAULT ${dv ? 1 : 0}`;
93
+ if (typeof dv === 'string') {
94
+ const escaped = dv.replaceAll("'", "''");
95
+ return `DEFAULT '${escaped}'`;
96
+ }
97
+ throw ErrorFactory.createValidationError(`Unsupported default type for ${table}.${def.name}`);
98
+ }
99
+ function columnSql(driver, table, def) {
100
+ assertIdentifier('table', table);
101
+ assertIdentifier('column', def.name);
102
+ const col = quoteIdent(driver, def.name);
103
+ const isPrimary = def.primary === true;
104
+ if (def.autoIncrement === true && isPrimary) {
105
+ const autoInc = getAutoIncrementSql(driver, col, def.type);
106
+ if (autoInc !== null)
107
+ return autoInc;
108
+ }
109
+ const parts = [`${col} ${getColumnTypeSql(driver, def)}`];
110
+ if (def.nullable !== true)
111
+ parts.push('NOT NULL');
112
+ if (def.unique === true)
113
+ parts.push('UNIQUE');
114
+ if (isPrimary)
115
+ parts.push('PRIMARY KEY');
116
+ const defaultVal = getDefaultValueSql(table, def);
117
+ if (defaultVal !== null)
118
+ parts.push(defaultVal);
119
+ return parts.join(' ');
120
+ }
121
+ function buildCreateTableSql(driver, schema, ifNotExists) {
122
+ const table = schema.getTable();
123
+ assertIdentifier('table', table);
124
+ const tableSql = quoteIdent(driver, table);
125
+ const cols = Array.from(schema.getColumns().values()).map((c) => c.getDefinition());
126
+ if (cols.length === 0) {
127
+ throw ErrorFactory.createValidationError(`Schema for table '${table}' has no columns`);
128
+ }
129
+ const columnLines = cols.map((d) => ` ${columnSql(driver, table, d)}`);
130
+ const ine = ifNotExists ? 'IF NOT EXISTS ' : '';
131
+ return `CREATE TABLE ${ine}${tableSql} (\n${columnLines.join(',\n')}\n)`;
132
+ }
133
+ export const SchemaCompiler = Object.freeze({
134
+ async createTable(db, schema, opts) {
135
+ const driver = db.getType();
136
+ const sql = buildCreateTableSql(driver, schema, opts?.ifNotExists !== false);
137
+ await db.query(sql);
138
+ },
139
+ async dropTable(db, table) {
140
+ const driver = db.getType();
141
+ assertIdentifier('table', table);
142
+ const tableSql = quoteIdent(driver, table);
143
+ await db.query(`DROP TABLE IF EXISTS ${tableSql}`);
144
+ },
145
+ });
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Cloudflare D1 Database Adapter
3
3
  */
4
- import { DatabaseConfig, IDatabaseAdapter } from '../DatabaseAdapter';
4
+ import type { DatabaseConfig, IDatabaseAdapter } from '../DatabaseAdapter';
5
5
  /**
6
6
  * D1 adapter implementation
7
7
  */
@@ -1 +1 @@
1
- {"version":3,"file":"D1Adapter.d.ts","sourceRoot":"","sources":["../../../../src/orm/adapters/D1Adapter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,EAAE,cAAc,EAAe,gBAAgB,EAAe,MAAM,sBAAsB,CAAC;AAUlG;;GAEG;AACH,eAAO,MAAM,SAAS;IACpB;;OAEG;oBAEa,cAAc,GAAG,gBAAgB;EAkHjD,CAAC;AAEH,eAAe,SAAS,CAAC"}
1
+ {"version":3,"file":"D1Adapter.d.ts","sourceRoot":"","sources":["../../../../src/orm/adapters/D1Adapter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,KAAK,EAAE,cAAc,EAAe,gBAAgB,EAAe,MAAM,sBAAsB,CAAC;AAUvG;;GAEG;AACH,eAAO,MAAM,SAAS;IACpB;;OAEG;oBAEa,cAAc,GAAG,gBAAgB;EAkHjD,CAAC;AAEH,eAAe,SAAS,CAAC"}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * MySQL Database Adapter
3
3
  */
4
- import { DatabaseConfig, IDatabaseAdapter } from '../DatabaseAdapter';
4
+ import type { DatabaseConfig, IDatabaseAdapter } from '../DatabaseAdapter';
5
5
  /**
6
6
  * MySQL adapter implementation
7
7
  * Sealed namespace for immutability
@@ -1 +1 @@
1
- {"version":3,"file":"MySQLAdapter.d.ts","sourceRoot":"","sources":["../../../../src/orm/adapters/MySQLAdapter.ts"],"names":[],"mappings":"AACA;;GAEG;AAKH,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAe,MAAM,sBAAsB,CAAC;AAGrF;;;GAGG;AACH,eAAO,MAAM,YAAY;IACvB;;OAEG;mBACY,cAAc,GAAG,gBAAgB;EA8EhD,CAAC;AAEH,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"MySQLAdapter.d.ts","sourceRoot":"","sources":["../../../../src/orm/adapters/MySQLAdapter.ts"],"names":[],"mappings":"AACA;;GAEG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAe,MAAM,sBAAsB,CAAC;AAyG1F;;;GAGG;AACH,eAAO,MAAM,YAAY;IACvB;;OAEG;mBACY,cAAc,GAAG,gBAAgB;EAIhD,CAAC;AAEH,eAAe,YAAY,CAAC"}
@@ -6,6 +6,92 @@ import { FeatureFlags } from '../../config/features.js';
6
6
  import { Logger } from '../../config/logger.js';
7
7
  import { ErrorFactory } from '../../exceptions/ZintrustError.js';
8
8
  import { QueryBuilder } from '../QueryBuilder.js';
9
+ function createRawQuery(state) {
10
+ return async function rawQuery(sql, parameters) {
11
+ if (!FeatureFlags.isRawQueryEnabled()) {
12
+ throw ErrorFactory.createConfigError('Raw SQL queries are disabled');
13
+ }
14
+ if (!state.connected) {
15
+ throw ErrorFactory.createConnectionError('Database not connected');
16
+ }
17
+ try {
18
+ Logger.warn(`Raw SQL Query executed: ${sql}`, { parameters });
19
+ // Mock implementation for tests
20
+ if (sql.includes('INVALID')) {
21
+ throw ErrorFactory.createDatabaseError('Invalid SQL syntax');
22
+ }
23
+ return [];
24
+ }
25
+ catch (error) {
26
+ throw ErrorFactory.createTryCatchError(`Raw SQL query failed: ${sql}`, error);
27
+ }
28
+ };
29
+ }
30
+ function createMySQLAdapterInstance(config, state) {
31
+ return {
32
+ async connect() {
33
+ if (config.host === 'error') {
34
+ throw ErrorFactory.createConnectionError('Failed to connect to MySQL: Error: Connection failed');
35
+ }
36
+ state.connected = true;
37
+ Logger.info(`✓ MySQL connected (${config.host}:${config.port})`);
38
+ },
39
+ async disconnect() {
40
+ state.connected = false;
41
+ Logger.info('✓ MySQL disconnected');
42
+ },
43
+ async query(_sql, _parameters) {
44
+ if (!state.connected)
45
+ throw ErrorFactory.createConnectionError('Database not connected');
46
+ // Mock implementation
47
+ return { rows: [], rowCount: 0 };
48
+ },
49
+ async queryOne(sql, parameters) {
50
+ const result = await this.query(sql, parameters);
51
+ return result.rows[0] ?? null;
52
+ },
53
+ async ping() {
54
+ await this.query(QueryBuilder.create('').select('1').toSQL(), []);
55
+ },
56
+ async transaction(callback) {
57
+ if (!state.connected)
58
+ throw ErrorFactory.createConnectionError('Database not connected');
59
+ try {
60
+ await this.query('START TRANSACTION', []);
61
+ const result = await callback(this);
62
+ await this.query('COMMIT', []);
63
+ return result;
64
+ }
65
+ catch (error) {
66
+ await this.query('ROLLBACK', []);
67
+ throw ErrorFactory.createTryCatchError('MySQL transaction failed', error);
68
+ }
69
+ },
70
+ getType() {
71
+ return 'mysql';
72
+ },
73
+ isConnected() {
74
+ return state.connected;
75
+ },
76
+ rawQuery: createRawQuery(state),
77
+ getPlaceholder(_index) {
78
+ return '?';
79
+ },
80
+ async ensureMigrationsTable() {
81
+ await this.query(`CREATE TABLE IF NOT EXISTS migrations (
82
+ id INTEGER PRIMARY KEY AUTO_INCREMENT,
83
+ name VARCHAR(255) NOT NULL,
84
+ scope VARCHAR(255) NOT NULL DEFAULT 'global',
85
+ service VARCHAR(255) NOT NULL DEFAULT '',
86
+ batch INTEGER NOT NULL,
87
+ status VARCHAR(255) NOT NULL,
88
+ applied_at DATETIME NULL,
89
+ created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
90
+ UNIQUE(name, scope, service)
91
+ )`, []);
92
+ },
93
+ };
94
+ }
9
95
  /**
10
96
  * MySQL adapter implementation
11
97
  * Sealed namespace for immutability
@@ -15,75 +101,8 @@ export const MySQLAdapter = Object.freeze({
15
101
  * Create a new MySQL adapter instance
16
102
  */
17
103
  create(config) {
18
- let connected = false;
19
- return {
20
- async connect() {
21
- if (config.host === 'error') {
22
- throw ErrorFactory.createConnectionError('Failed to connect to MySQL: Error: Connection failed');
23
- }
24
- connected = true;
25
- Logger.info(`✓ MySQL connected (${config.host}:${config.port})`);
26
- },
27
- async disconnect() {
28
- connected = false;
29
- Logger.info('✓ MySQL disconnected');
30
- },
31
- async query(_sql, _parameters) {
32
- if (!connected)
33
- throw ErrorFactory.createConnectionError('Database not connected');
34
- // Mock implementation
35
- return { rows: [], rowCount: 0 };
36
- },
37
- async queryOne(sql, parameters) {
38
- const result = await this.query(sql, parameters);
39
- return result.rows[0] ?? null;
40
- },
41
- async ping() {
42
- await this.query(QueryBuilder.create('').select('1').toSQL(), []);
43
- },
44
- async transaction(callback) {
45
- if (!connected)
46
- throw ErrorFactory.createConnectionError('Database not connected');
47
- try {
48
- await this.query('START TRANSACTION', []);
49
- const result = await callback(this);
50
- await this.query('COMMIT', []);
51
- return result;
52
- }
53
- catch (error) {
54
- await this.query('ROLLBACK', []);
55
- throw ErrorFactory.createTryCatchError('MySQL transaction failed', error);
56
- }
57
- },
58
- getType() {
59
- return 'mysql';
60
- },
61
- isConnected() {
62
- return connected;
63
- },
64
- async rawQuery(sql, parameters) {
65
- if (!FeatureFlags.isRawQueryEnabled()) {
66
- throw ErrorFactory.createConfigError('Raw SQL queries are disabled');
67
- }
68
- if (!connected) {
69
- throw ErrorFactory.createConnectionError('Database not connected');
70
- }
71
- try {
72
- Logger.warn(`Raw SQL Query executed: ${sql}`, { parameters });
73
- // Mock implementation for tests
74
- if (sql.includes('INVALID')) {
75
- throw ErrorFactory.createDatabaseError('Invalid SQL syntax');
76
- }
77
- return [];
78
- }
79
- catch (error) {
80
- throw ErrorFactory.createTryCatchError(`Raw SQL query failed: ${sql}`, error);
81
- }
82
- },
83
- getPlaceholder(_index) {
84
- return '?';
85
- },
86
- };
104
+ const state = { connected: false };
105
+ return createMySQLAdapterInstance(config, state);
87
106
  },
88
107
  });
89
108
  export default MySQLAdapter;
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * PostgreSQL Database Adapter
3
3
  */
4
- import { DatabaseConfig, IDatabaseAdapter } from '../DatabaseAdapter';
4
+ import type { DatabaseConfig, IDatabaseAdapter } from '../DatabaseAdapter';
5
5
  /**
6
6
  * PostgreSQL adapter implementation
7
7
  * Sealed namespace for immutability
@@ -1 +1 @@
1
- {"version":3,"file":"PostgreSQLAdapter.d.ts","sourceRoot":"","sources":["../../../../src/orm/adapters/PostgreSQLAdapter.ts"],"names":[],"mappings":"AACA;;GAEG;AAKH,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAe,MAAM,sBAAsB,CAAC;AAGrF;;;GAGG;AACH,eAAO,MAAM,iBAAiB;IAC5B;;OAEG;mBACY,cAAc,GAAG,gBAAgB;EAiFhD,CAAC;AAEH,eAAe,iBAAiB,CAAC"}
1
+ {"version":3,"file":"PostgreSQLAdapter.d.ts","sourceRoot":"","sources":["../../../../src/orm/adapters/PostgreSQLAdapter.ts"],"names":[],"mappings":"AACA;;GAEG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAe,MAAM,sBAAsB,CAAC;AA6H1F;;;GAGG;AACH,eAAO,MAAM,iBAAiB;IAC5B;;OAEG;mBACY,cAAc,GAAG,gBAAgB;EAIhD,CAAC;AAEH,eAAe,iBAAiB,CAAC"}
@@ -6,6 +6,92 @@ import { FeatureFlags } from '../../config/features.js';
6
6
  import { Logger } from '../../config/logger.js';
7
7
  import { ErrorFactory } from '../../exceptions/ZintrustError.js';
8
8
  import { QueryBuilder } from '../QueryBuilder.js';
9
+ function assertConnected(state) {
10
+ if (!state.connected)
11
+ throw ErrorFactory.createConnectionError('Database not connected');
12
+ }
13
+ async function pgConnect(config, state) {
14
+ if (config.host === 'error') {
15
+ throw ErrorFactory.createConnectionError('Failed to connect to PostgreSQL: Connection failed');
16
+ }
17
+ state.connected = true;
18
+ Logger.info(`✓ PostgreSQL connected (${config.host}:${config.port})`);
19
+ }
20
+ async function pgDisconnect(state) {
21
+ state.connected = false;
22
+ Logger.info('✓ PostgreSQL disconnected');
23
+ }
24
+ async function pgQuery(state, _sql, _parameters) {
25
+ assertConnected(state);
26
+ // Mock implementation
27
+ return { rows: [], rowCount: 0 };
28
+ }
29
+ async function pgQueryOne(adapter, sql, parameters) {
30
+ const result = await adapter.query(sql, parameters);
31
+ return result.rows[0] ?? null;
32
+ }
33
+ async function pgPing(adapter) {
34
+ await adapter.query(QueryBuilder.create('').select('1').toSQL(), []);
35
+ }
36
+ async function pgTransaction(state, adapter, callback) {
37
+ assertConnected(state);
38
+ try {
39
+ await adapter.query('BEGIN', []);
40
+ const result = await callback(adapter);
41
+ await adapter.query('COMMIT', []);
42
+ return result;
43
+ }
44
+ catch (error) {
45
+ await adapter.query('ROLLBACK', []);
46
+ throw ErrorFactory.createTryCatchError('PostgreSQL transaction failed', error);
47
+ }
48
+ }
49
+ async function pgRawQuery(state, sql, parameters) {
50
+ if (!FeatureFlags.isRawQueryEnabled()) {
51
+ throw ErrorFactory.createConfigError('Raw SQL queries are disabled. Set USE_RAW_QRY=true environment variable to enable.');
52
+ }
53
+ assertConnected(state);
54
+ Logger.warn(`Raw SQL Query executed: ${sql}`, { parameters });
55
+ try {
56
+ if (sql.toUpperCase().includes('INVALID')) {
57
+ throw ErrorFactory.createDatabaseError('Invalid SQL syntax');
58
+ }
59
+ // Mock implementation
60
+ return [];
61
+ }
62
+ catch (error) {
63
+ throw ErrorFactory.createTryCatchError('Raw SQL Query failed', error);
64
+ }
65
+ }
66
+ async function pgEnsureMigrationsTable(adapter) {
67
+ await adapter.query(`CREATE TABLE IF NOT EXISTS migrations (
68
+ id SERIAL PRIMARY KEY,
69
+ name VARCHAR(255) NOT NULL,
70
+ scope VARCHAR(255) NOT NULL DEFAULT 'global',
71
+ service VARCHAR(255) NOT NULL DEFAULT '',
72
+ batch INTEGER NOT NULL,
73
+ status VARCHAR(255) NOT NULL,
74
+ applied_at TIMESTAMP NULL,
75
+ created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
76
+ UNIQUE(name, scope, service)
77
+ )`, []);
78
+ }
79
+ function createAdapter(config, state) {
80
+ const adapter = {
81
+ connect: async () => pgConnect(config, state),
82
+ disconnect: async () => pgDisconnect(state),
83
+ query: async (sql, parameters) => pgQuery(state, sql, parameters),
84
+ queryOne: async (sql, parameters) => pgQueryOne(adapter, sql, parameters),
85
+ ping: async () => pgPing(adapter),
86
+ transaction: async (callback) => pgTransaction(state, adapter, callback),
87
+ getType: () => 'postgresql',
88
+ isConnected: () => state.connected,
89
+ rawQuery: async (sql, parameters) => pgRawQuery(state, sql, parameters),
90
+ getPlaceholder: (index) => `$${index}`,
91
+ ensureMigrationsTable: async () => pgEnsureMigrationsTable(adapter),
92
+ };
93
+ return adapter;
94
+ }
9
95
  /**
10
96
  * PostgreSQL adapter implementation
11
97
  * Sealed namespace for immutability
@@ -15,75 +101,8 @@ export const PostgreSQLAdapter = Object.freeze({
15
101
  * Create a new PostgreSQL adapter instance
16
102
  */
17
103
  create(config) {
18
- let connected = false;
19
- return {
20
- async connect() {
21
- if (config.host === 'error') {
22
- throw ErrorFactory.createConnectionError('Failed to connect to PostgreSQL: Connection failed');
23
- }
24
- connected = true;
25
- Logger.info(`✓ PostgreSQL connected (${config.host}:${config.port})`);
26
- },
27
- async disconnect() {
28
- connected = false;
29
- Logger.info('✓ PostgreSQL disconnected');
30
- },
31
- async query(_sql, _parameters) {
32
- if (!connected)
33
- throw ErrorFactory.createConnectionError('Database not connected');
34
- // Mock implementation
35
- return { rows: [], rowCount: 0 };
36
- },
37
- async queryOne(sql, parameters) {
38
- const result = await this.query(sql, parameters);
39
- return result.rows[0] ?? null;
40
- },
41
- async ping() {
42
- await this.query(QueryBuilder.create('').select('1').toSQL(), []);
43
- },
44
- async transaction(callback) {
45
- if (!connected)
46
- throw ErrorFactory.createConnectionError('Database not connected');
47
- try {
48
- await this.query('BEGIN', []);
49
- const result = await callback(this);
50
- await this.query('COMMIT', []);
51
- return result;
52
- }
53
- catch (error) {
54
- await this.query('ROLLBACK', []);
55
- throw ErrorFactory.createTryCatchError('PostgreSQL transaction failed', error);
56
- }
57
- },
58
- getType() {
59
- return 'postgresql';
60
- },
61
- isConnected() {
62
- return connected;
63
- },
64
- async rawQuery(sql, parameters) {
65
- if (!FeatureFlags.isRawQueryEnabled()) {
66
- throw ErrorFactory.createConfigError('Raw SQL queries are disabled. Set USE_RAW_QRY=true environment variable to enable.');
67
- }
68
- if (!connected) {
69
- throw ErrorFactory.createConnectionError('Database not connected');
70
- }
71
- Logger.warn(`Raw SQL Query executed: ${sql}`, { parameters });
72
- try {
73
- if (sql.toUpperCase().includes('INVALID')) {
74
- throw ErrorFactory.createDatabaseError('Invalid SQL syntax');
75
- }
76
- // Mock implementation
77
- return [];
78
- }
79
- catch (error) {
80
- throw ErrorFactory.createTryCatchError('Raw SQL Query failed', error);
81
- }
82
- },
83
- getPlaceholder(index) {
84
- return `$${index}`;
85
- },
86
- };
104
+ const state = { connected: false };
105
+ return createAdapter(config, state);
87
106
  },
88
107
  });
89
108
  export default PostgreSQLAdapter;
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * SQL Server Database Adapter
3
3
  */
4
- import { DatabaseConfig, IDatabaseAdapter } from '../DatabaseAdapter';
4
+ import type { DatabaseConfig, IDatabaseAdapter } from '../DatabaseAdapter';
5
5
  /**
6
6
  * SQL Server adapter implementation
7
7
  * Sealed namespace for immutability
@@ -1 +1 @@
1
- {"version":3,"file":"SQLServerAdapter.d.ts","sourceRoot":"","sources":["../../../../src/orm/adapters/SQLServerAdapter.ts"],"names":[],"mappings":"AACA;;GAEG;AAKH,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAe,MAAM,sBAAsB,CAAC;AAGrF;;;GAGG;AACH,eAAO,MAAM,gBAAgB;IAC3B;;OAEG;mBACY,cAAc,GAAG,gBAAgB;EA4EhD,CAAC;AAEH,eAAe,gBAAgB,CAAC"}
1
+ {"version":3,"file":"SQLServerAdapter.d.ts","sourceRoot":"","sources":["../../../../src/orm/adapters/SQLServerAdapter.ts"],"names":[],"mappings":"AACA;;GAEG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAe,MAAM,sBAAsB,CAAC;AAG1F;;;GAGG;AACH,eAAO,MAAM,gBAAgB;IAC3B;;OAEG;mBACY,cAAc,GAAG,gBAAgB;EA4EhD,CAAC;AAEH,eAAe,gBAAgB,CAAC"}
@@ -2,7 +2,7 @@
2
2
  * SQLite Database Adapter
3
3
  * Production Implementation
4
4
  */
5
- import { DatabaseConfig, IDatabaseAdapter } from '../DatabaseAdapter';
5
+ import type { DatabaseConfig, IDatabaseAdapter } from '../DatabaseAdapter';
6
6
  declare function createSQLiteAdapter(config: DatabaseConfig): IDatabaseAdapter;
7
7
  export declare const SQLiteAdapter: Readonly<{
8
8
  create: typeof createSQLiteAdapter;
@@ -1 +1 @@
1
- {"version":3,"file":"SQLiteAdapter.d.ts","sourceRoot":"","sources":["../../../../src/orm/adapters/SQLiteAdapter.ts"],"names":[],"mappings":"AACA;;;GAGG;AAMH,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAe,MAAM,sBAAsB,CAAC;AA6KrF,iBAAS,mBAAmB,CAAC,MAAM,EAAE,cAAc,GAAG,gBAAgB,CAoDrE;AAED,eAAO,MAAM,aAAa;;EAExB,CAAC"}
1
+ {"version":3,"file":"SQLiteAdapter.d.ts","sourceRoot":"","sources":["../../../../src/orm/adapters/SQLiteAdapter.ts"],"names":[],"mappings":"AACA;;;GAGG;AASH,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAe,MAAM,sBAAsB,CAAC;AA6M1F,iBAAS,mBAAmB,CAAC,MAAM,EAAE,cAAc,GAAG,gBAAgB,CA0FrE;AAED,eAAO,MAAM,aAAa;;EAExB,CAAC"}
@@ -3,11 +3,25 @@
3
3
  * SQLite Database Adapter
4
4
  * Production Implementation
5
5
  */
6
+ import { databaseConfig } from '../../config/database.js';
6
7
  import { FeatureFlags } from '../../config/features.js';
7
8
  import { Logger } from '../../config/logger.js';
8
9
  import { ErrorFactory } from '../../exceptions/ZintrustError.js';
10
+ import fs from '../../node-singletons/fs.js';
11
+ import * as path from '../../node-singletons/path.js';
9
12
  import { performance } from '../../node-singletons/perf-hooks.js';
10
13
  import { QueryBuilder } from '../QueryBuilder.js';
14
+ const SAFE_SQLITE_IDENTIFIER = /^[A-Za-z_]\w*$/;
15
+ const toSqliteIdentifier = (value) => {
16
+ if (!SAFE_SQLITE_IDENTIFIER.test(value)) {
17
+ throw ErrorFactory.createDatabaseError('Unsafe sqlite identifier');
18
+ }
19
+ return value;
20
+ };
21
+ const quoteSqliteIdentifier = (id) => {
22
+ // Safe due to SAFE_SQLITE_IDENTIFIER allowlist.
23
+ return `"${id}"`;
24
+ };
11
25
  function isMissingEsmPackage(error, packageName) {
12
26
  if (typeof error !== 'object' || error === null)
13
27
  return false;
@@ -60,12 +74,16 @@ function executeQuery(db, sql, parameters) {
60
74
  const stmt = db.prepare(sql);
61
75
  if (isSelectQuery(sql)) {
62
76
  const rows = stmt.all(parameters);
63
- Logger.debug('SQLite query executed', { durationMs: performance.now() - start, sql });
77
+ if (databaseConfig.logging.enabled) {
78
+ Logger.debug('SQLite query executed', { durationMs: performance.now() - start, sql });
79
+ }
64
80
  return { rows, rowCount: rows.length };
65
81
  }
66
82
  const info = stmt.run(parameters);
67
- Logger.debug('SQLite query executed', { durationMs: performance.now() - start, sql });
68
- return { rows: [], rowCount: info.changes };
83
+ if (databaseConfig.logging.enabled) {
84
+ Logger.debug('SQLite query executed', { durationMs: performance.now() - start, sql });
85
+ }
86
+ return { rows: [], rowCount: info.changes, lastInsertId: info.lastInsertRowid };
69
87
  }
70
88
  function executeRawQuery(db, sql, parameters) {
71
89
  const stmt = db.prepare(sql);
@@ -78,6 +96,18 @@ async function connectSQLite(state) {
78
96
  if (state.db !== null)
79
97
  return;
80
98
  const filename = normalizeFilename(state.config.database);
99
+ // Ensure file-backed sqlite DB directories exist (e.g. .zintrust/dbs/*.sqlite).
100
+ if (filename !== ':memory:') {
101
+ try {
102
+ fs.mkdirSync(path.dirname(filename), { recursive: true });
103
+ }
104
+ catch (error) {
105
+ throw ErrorFactory.createTryCatchError('Failed to create SQLite database directory', {
106
+ filename,
107
+ cause: error,
108
+ });
109
+ }
110
+ }
81
111
  const SqliteDatabaseCtor = await importSqliteDatabaseConstructor();
82
112
  state.db = new SqliteDatabaseCtor(filename);
83
113
  // Enable WAL mode for better concurrency
@@ -151,6 +181,32 @@ function createSQLiteAdapter(config) {
151
181
  async rawQuery(sql, parameters = []) {
152
182
  return rawQuerySQLite(state, sql, parameters);
153
183
  },
184
+ async ensureMigrationsTable() {
185
+ await adapter.query(`CREATE TABLE IF NOT EXISTS migrations (
186
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
187
+ name TEXT NOT NULL,
188
+ scope TEXT NOT NULL DEFAULT 'global',
189
+ service TEXT NOT NULL DEFAULT '',
190
+ batch INTEGER NOT NULL,
191
+ status TEXT NOT NULL,
192
+ applied_at TEXT NULL,
193
+ created_at TEXT NOT NULL,
194
+ UNIQUE(name, scope, service)
195
+ )`, []);
196
+ },
197
+ async resetSchema() {
198
+ // Best-effort for SQLite.
199
+ await adapter.query('PRAGMA foreign_keys = OFF', []);
200
+ const tables = (await adapter.query("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'", []));
201
+ await Promise.all(tables.rows.map(async (t) => {
202
+ const name = typeof t.name === 'string' ? t.name : '';
203
+ if (name.length === 0)
204
+ return;
205
+ const tableName = toSqliteIdentifier(name);
206
+ await adapter.query(`DROP TABLE IF EXISTS ${quoteSqliteIdentifier(tableName)}`, []);
207
+ }));
208
+ await adapter.query('PRAGMA foreign_keys = ON', []);
209
+ },
154
210
  getType() {
155
211
  return 'sqlite';
156
212
  },
@@ -0,0 +1,5 @@
1
+ import type { IDatabase } from '../Database';
2
+ export declare const SqliteMaintenance: Readonly<{
3
+ dropAllTables(db: IDatabase): Promise<void>;
4
+ }>;
5
+ //# sourceMappingURL=SqliteMaintenance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SqliteMaintenance.d.ts","sourceRoot":"","sources":["../../../../src/orm/maintenance/SqliteMaintenance.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAQ/C,eAAO,MAAM,iBAAiB;sBACJ,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;EAWjD,CAAC"}