@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,339 @@
1
+ import { Env } from '../config/env.js';
2
+ import { Logger } from '../config/logger.js';
3
+ import { ErrorFactory } from '../exceptions/ZintrustError.js';
4
+ import * as path from '../node-singletons/path.js';
5
+ import { MigrationDiscovery } from '../migrations/MigrationDiscovery.js';
6
+ import { MigrationLoader } from '../migrations/MigrationLoader.js';
7
+ import { MigrationLock } from '../migrations/MigrationLock.js';
8
+ import { SqliteMaintenance } from '../orm/maintenance/SqliteMaintenance.js';
9
+ import { MigrationStore } from '../orm/migrations/MigrationStore.js';
10
+ function nowIso() {
11
+ // MySQL/MariaDB DATETIME does not accept ISO8601 with timezone (e.g. trailing 'Z').
12
+ // Use a portable UTC datetime string.
13
+ return new Date().toISOString().slice(0, 19).replace('T', ' ');
14
+ }
15
+ function createCtx(options) {
16
+ const projectRoot = options.projectRoot;
17
+ const globalDir = MigrationDiscovery.resolveDir(projectRoot, options.globalDir);
18
+ const extension = options.extension;
19
+ const service = typeof options.service === 'string' && options.service.length > 0 ? options.service : null;
20
+ const separateTracking = options.separateTracking === true;
21
+ const includeGlobal = options.includeGlobal !== false;
22
+ const lockFile = options.lockFile ?? path.join(projectRoot, '.zintrust', 'migrate.lock');
23
+ const serviceDir = service === null
24
+ ? null
25
+ : MigrationDiscovery.resolveDir(projectRoot, path.join('services', service, Env.get('MIGRATIONS_SERVICE_DIR', 'database/migrations')));
26
+ return {
27
+ options,
28
+ projectRoot,
29
+ globalDir,
30
+ extension,
31
+ lockFile,
32
+ separateTracking,
33
+ includeGlobal,
34
+ service,
35
+ serviceDir,
36
+ };
37
+ }
38
+ function keyForTarget(t) {
39
+ return `${t.scope}:${t.service}`;
40
+ }
41
+ function getTargets(ctx) {
42
+ if (!ctx.separateTracking)
43
+ return [{ scope: 'global', service: '' }];
44
+ if (ctx.service === null) {
45
+ return [{ scope: 'global', service: '' }];
46
+ }
47
+ const targets = [];
48
+ // Prefer rolling back service migrations before global ones.
49
+ targets.push({ scope: 'service', service: ctx.service });
50
+ if (ctx.includeGlobal)
51
+ targets.push({ scope: 'global', service: '' });
52
+ return targets;
53
+ }
54
+ function getTargetForMigration(ctx, migration) {
55
+ if (!ctx.separateTracking)
56
+ return { scope: 'global', service: '' };
57
+ if (ctx.service === null)
58
+ return { scope: 'global', service: '' };
59
+ const serviceDir = ctx.serviceDir;
60
+ if (serviceDir !== null) {
61
+ const prefix = serviceDir.endsWith(path.sep) ? serviceDir : `${serviceDir}${path.sep}`;
62
+ if (migration.filePath.startsWith(prefix)) {
63
+ return { scope: 'service', service: ctx.service };
64
+ }
65
+ }
66
+ return { scope: 'global', service: '' };
67
+ }
68
+ function getMigrationDirs(ctx) {
69
+ const dirs = [];
70
+ if (ctx.includeGlobal) {
71
+ dirs.push(ctx.globalDir);
72
+ }
73
+ if (ctx.serviceDir !== null) {
74
+ dirs.push(ctx.serviceDir);
75
+ }
76
+ return dirs;
77
+ }
78
+ async function discover(ctx) {
79
+ const files = getMigrationDirs(ctx).flatMap((dir) => MigrationDiscovery.listMigrationFiles(dir, ctx.extension));
80
+ const loaded = [];
81
+ // Build a serial chain to keep ordering without `await` inside a loop.
82
+ let chain = Promise.resolve();
83
+ for (const file of files) {
84
+ chain = chain.then(async () => {
85
+ loaded.push(await MigrationLoader.load(file));
86
+ });
87
+ }
88
+ await chain;
89
+ return loaded.sort((a, b) => a.name.localeCompare(b.name));
90
+ }
91
+ async function runSerial(items, fn) {
92
+ let chain = Promise.resolve();
93
+ for (const item of items) {
94
+ chain = chain.then(async () => fn(item));
95
+ }
96
+ await chain;
97
+ }
98
+ async function withLock(ctx, fn) {
99
+ const release = MigrationLock.acquire(ctx.lockFile);
100
+ try {
101
+ return await fn();
102
+ }
103
+ finally {
104
+ release();
105
+ }
106
+ }
107
+ async function applyOneMigration(params) {
108
+ const { db, migration, scope, service, batch } = params;
109
+ await MigrationStore.insertRunning(db, {
110
+ name: migration.name,
111
+ scope,
112
+ service,
113
+ batch,
114
+ });
115
+ try {
116
+ await db.transaction(async () => {
117
+ await migration.up(db);
118
+ await MigrationStore.markStatus(db, {
119
+ name: migration.name,
120
+ scope,
121
+ service,
122
+ status: 'completed',
123
+ appliedAt: nowIso(),
124
+ });
125
+ });
126
+ }
127
+ catch (error) {
128
+ await MigrationStore.markStatus(db, {
129
+ name: migration.name,
130
+ scope,
131
+ service,
132
+ status: 'failed',
133
+ });
134
+ Logger.error('Migration failed', { migration: migration.name, error });
135
+ throw error;
136
+ }
137
+ }
138
+ async function rollbackOneMigration(params) {
139
+ const { db, name, migrationMap, scope, service, errorLabel } = params;
140
+ const m = migrationMap.get(name);
141
+ if (m === undefined) {
142
+ const label = errorLabel === 'rollback' ? 'rollback' : 'reset';
143
+ throw ErrorFactory.createCliError(`Cannot ${label} '${name}' because its migration file is missing.`);
144
+ }
145
+ await db.transaction(async () => {
146
+ await m.down(db);
147
+ await MigrationStore.deleteRecord(db, { name, scope, service });
148
+ });
149
+ }
150
+ async function rollbackTargetBatch(params) {
151
+ const { db, target, migrationMap, count } = params;
152
+ const last = await MigrationStore.getLastCompletedBatch(db, target.scope, target.service);
153
+ if (last <= 0)
154
+ return 0;
155
+ const targetMinBatch = Math.max(1, last - count + 1);
156
+ const rows = await MigrationStore.listCompletedInBatchesGte(db, {
157
+ scope: target.scope,
158
+ service: target.service,
159
+ minBatch: targetMinBatch,
160
+ });
161
+ const appliedNames = rows.map((r) => r.name);
162
+ if (appliedNames.length === 0)
163
+ return 0;
164
+ let rolledBack = 0;
165
+ await runSerial(appliedNames, async (name) => {
166
+ await rollbackOneMigration({
167
+ db,
168
+ name,
169
+ migrationMap,
170
+ scope: target.scope,
171
+ service: target.service,
172
+ errorLabel: 'rollback',
173
+ });
174
+ rolledBack++;
175
+ });
176
+ return rolledBack;
177
+ }
178
+ async function resetTarget(params) {
179
+ const { db, target, migrationMap } = params;
180
+ const names = await MigrationStore.listAllCompletedNames(db, {
181
+ scope: target.scope,
182
+ service: target.service,
183
+ });
184
+ if (names.length === 0)
185
+ return 0;
186
+ let rolledBack = 0;
187
+ await runSerial(names, async (name) => {
188
+ await rollbackOneMigration({
189
+ db,
190
+ name,
191
+ migrationMap,
192
+ scope: target.scope,
193
+ service: target.service,
194
+ errorLabel: 'reset',
195
+ });
196
+ rolledBack++;
197
+ });
198
+ return rolledBack;
199
+ }
200
+ async function applyPendingMigrations(ctx, db, migrations) {
201
+ const targets = getTargets(ctx);
202
+ const appliedByTarget = new Map();
203
+ const batchByTarget = new Map();
204
+ await Promise.all(targets.map(async (t) => {
205
+ const key = keyForTarget(t);
206
+ appliedByTarget.set(key, await MigrationStore.getAppliedMap(db, t.scope, t.service));
207
+ batchByTarget.set(key, (await MigrationStore.getLastCompletedBatch(db, t.scope, t.service)) + 1);
208
+ }));
209
+ const pending = migrations.filter((m) => {
210
+ const target = getTargetForMigration(ctx, m);
211
+ const appliedMap = appliedByTarget.get(keyForTarget(target));
212
+ const row = appliedMap?.get(m.name);
213
+ if (row?.status === 'completed')
214
+ return false;
215
+ // Check for collision with existing migrations (same identifying suffix)
216
+ // This allows multiple projects to share a DB without re-running shared migrations
217
+ // Use \d+ to support variable timestamp length (default 14, but robust to 15+)
218
+ const match = new RegExp(/^(\d{14,})(_.+)$/).exec(m.name);
219
+ if (match && appliedMap) {
220
+ const suffix = match[2];
221
+ for (const appliedName of appliedMap.keys()) {
222
+ if (appliedName !== m.name && appliedName.endsWith(suffix)) {
223
+ Logger.info(`Skipping migration '${m.name}' — migration '${appliedName}' with the same suffix ('${suffix}') has already been applied`);
224
+ return false;
225
+ }
226
+ }
227
+ }
228
+ return true;
229
+ });
230
+ if (pending.length === 0)
231
+ return { applied: 0, pending: 0, appliedNames: [] };
232
+ let appliedCount = 0;
233
+ const appliedNames = [];
234
+ await runSerial(pending, async (m) => {
235
+ const target = getTargetForMigration(ctx, m);
236
+ const batch = batchByTarget.get(keyForTarget(target)) ?? 1;
237
+ await applyOneMigration({
238
+ db,
239
+ migration: m,
240
+ scope: target.scope,
241
+ service: target.service,
242
+ batch,
243
+ });
244
+ appliedCount++;
245
+ appliedNames.push(m.name);
246
+ });
247
+ return { applied: appliedCount, pending: pending.length - appliedCount, appliedNames };
248
+ }
249
+ function buildStatus(ctx) {
250
+ return async () => {
251
+ const db = ctx.options.db;
252
+ await MigrationStore.ensureTable(db);
253
+ const migrations = await discover(ctx);
254
+ const targets = getTargets(ctx);
255
+ const appliedByTarget = new Map();
256
+ await Promise.all(targets.map(async (t) => {
257
+ appliedByTarget.set(keyForTarget(t), await MigrationStore.getAppliedMap(db, t.scope, t.service));
258
+ }));
259
+ return migrations.map((m) => {
260
+ const target = getTargetForMigration(ctx, m);
261
+ const row = appliedByTarget.get(keyForTarget(target))?.get(m.name);
262
+ return {
263
+ name: m.name,
264
+ applied: row?.status === 'completed',
265
+ batch: typeof row?.batch === 'number' ? row.batch : null,
266
+ status: typeof row?.status === 'string' ? row.status : null,
267
+ appliedAt: typeof row?.appliedAt === 'string' ? row.appliedAt : null,
268
+ };
269
+ });
270
+ };
271
+ }
272
+ function buildMigrate(ctx) {
273
+ return async () => {
274
+ const db = ctx.options.db;
275
+ return withLock(ctx, async () => {
276
+ await MigrationStore.ensureTable(db);
277
+ const migrations = await discover(ctx);
278
+ return applyPendingMigrations(ctx, db, migrations);
279
+ });
280
+ };
281
+ }
282
+ function buildRollback(ctx) {
283
+ return async (steps) => {
284
+ const db = ctx.options.db;
285
+ return withLock(ctx, async () => {
286
+ await MigrationStore.ensureTable(db);
287
+ const targets = getTargets(ctx);
288
+ const count = Math.max(1, steps);
289
+ const discovered = await discover(ctx);
290
+ const migrationMap = new Map(discovered.map((m) => [m.name, m]));
291
+ let rolledBack = 0;
292
+ await runSerial(targets, async (target) => {
293
+ rolledBack += await rollbackTargetBatch({ db, target, migrationMap, count });
294
+ });
295
+ return { rolledBack };
296
+ });
297
+ };
298
+ }
299
+ function buildReset(ctx) {
300
+ return async () => {
301
+ const db = ctx.options.db;
302
+ return withLock(ctx, async () => {
303
+ await MigrationStore.ensureTable(db);
304
+ const targets = getTargets(ctx);
305
+ const discovered = await discover(ctx);
306
+ const migrationMap = new Map(discovered.map((m) => [m.name, m]));
307
+ let rolledBack = 0;
308
+ await runSerial(targets, async (target) => {
309
+ rolledBack += await resetTarget({ db, target, migrationMap });
310
+ });
311
+ return { rolledBack };
312
+ });
313
+ };
314
+ }
315
+ function buildFresh(ctx) {
316
+ return async () => {
317
+ const db = ctx.options.db;
318
+ return withLock(ctx, async () => {
319
+ if (db.getType() === 'sqlite') {
320
+ await SqliteMaintenance.dropAllTables(db);
321
+ }
322
+ await MigrationStore.ensureTable(db);
323
+ const migrations = await discover(ctx);
324
+ return applyPendingMigrations(ctx, db, migrations);
325
+ });
326
+ };
327
+ }
328
+ export const MigratorFactory = Object.freeze({
329
+ create(options) {
330
+ const ctx = createCtx(options);
331
+ return {
332
+ status: buildStatus(ctx),
333
+ migrate: buildMigrate(ctx),
334
+ rollbackLastBatch: buildRollback(ctx),
335
+ resetAll: buildReset(ctx),
336
+ fresh: buildFresh(ctx),
337
+ };
338
+ },
339
+ });
@@ -0,0 +1,5 @@
1
+ import type { Blueprint } from '../../migrations/schema/types';
2
+ export declare const MigrationBlueprint: Readonly<{
3
+ create(tableName: string): Blueprint;
4
+ }>;
5
+ //# sourceMappingURL=Blueprint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Blueprint.d.ts","sourceRoot":"","sources":["../../../../src/migrations/schema/Blueprint.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,SAAS,EASV,MAAM,2BAA2B,CAAC;AA0NnC,eAAO,MAAM,kBAAkB;sBACX,MAAM,GAAG,SAAS;EAMpC,CAAC"}
@@ -0,0 +1,189 @@
1
+ import { ErrorFactory } from '../../exceptions/ZintrustError.js';
2
+ const IDENT_RE = /^[A-Za-z_]\w*$/;
3
+ function assertIdentifier(label, value) {
4
+ if (!IDENT_RE.test(value)) {
5
+ throw ErrorFactory.createValidationError(`Invalid ${label} identifier: ${value}`);
6
+ }
7
+ }
8
+ function createColumnBuilder(def) {
9
+ const builder = {
10
+ nullable() {
11
+ def.nullable = true;
12
+ return builder;
13
+ },
14
+ notNullable() {
15
+ def.nullable = false;
16
+ return builder;
17
+ },
18
+ default(value) {
19
+ def.defaultValue = value;
20
+ return builder;
21
+ },
22
+ unique() {
23
+ def.unique = true;
24
+ return builder;
25
+ },
26
+ primary() {
27
+ def.primary = true;
28
+ def.nullable = false;
29
+ return builder;
30
+ },
31
+ autoIncrement() {
32
+ def.autoIncrement = true;
33
+ def.primary = true;
34
+ def.nullable = false;
35
+ return builder;
36
+ },
37
+ unsigned() {
38
+ def.unsigned = true;
39
+ return builder;
40
+ },
41
+ getDefinition() {
42
+ return { ...def };
43
+ },
44
+ };
45
+ return builder;
46
+ }
47
+ function createForeignKeyBuilder(columns, name) {
48
+ for (const c of columns)
49
+ assertIdentifier('column', c);
50
+ const fk = {
51
+ name: name ?? `fk_${columns.join('_')}`,
52
+ columns,
53
+ };
54
+ const builder = {
55
+ references(cols) {
56
+ const arr = Array.isArray(cols) ? cols : [cols];
57
+ for (const c of arr)
58
+ assertIdentifier('referenced column', c);
59
+ fk.referencedColumns = arr;
60
+ return builder;
61
+ },
62
+ on(table) {
63
+ assertIdentifier('referenced table', table);
64
+ fk.referencedTable = table;
65
+ return builder;
66
+ },
67
+ onDelete(action) {
68
+ fk.onDelete = action;
69
+ return builder;
70
+ },
71
+ onUpdate(action) {
72
+ fk.onUpdate = action;
73
+ return builder;
74
+ },
75
+ getDefinition() {
76
+ if (typeof fk.referencedTable !== 'string' || fk.referencedTable.length === 0) {
77
+ throw ErrorFactory.createValidationError('Foreign key missing referenced table');
78
+ }
79
+ if (!Array.isArray(fk.referencedColumns) || fk.referencedColumns.length === 0) {
80
+ throw ErrorFactory.createValidationError('Foreign key missing referenced columns');
81
+ }
82
+ return fk;
83
+ },
84
+ };
85
+ return builder;
86
+ }
87
+ function createState(tableName) {
88
+ return {
89
+ tableName,
90
+ columns: [],
91
+ indexes: [],
92
+ foreignKeys: [],
93
+ dropColumns: [],
94
+ dropIndexes: [],
95
+ dropForeignKeys: [],
96
+ pendingForeignKeys: [],
97
+ };
98
+ }
99
+ function addColumn(state, name, type, length) {
100
+ assertIdentifier('column', name);
101
+ const def = {
102
+ name,
103
+ type,
104
+ length,
105
+ nullable: false,
106
+ defaultValue: undefined,
107
+ primary: false,
108
+ unique: false,
109
+ autoIncrement: false,
110
+ unsigned: false,
111
+ };
112
+ const builder = createColumnBuilder(def);
113
+ state.columns.push(def);
114
+ return builder;
115
+ }
116
+ function buildDefinition(state) {
117
+ for (const fk of state.pendingForeignKeys)
118
+ state.foreignKeys.push(fk.getDefinition());
119
+ return {
120
+ name: state.tableName,
121
+ columns: [...state.columns],
122
+ indexes: [...state.indexes],
123
+ foreignKeys: [...state.foreignKeys],
124
+ };
125
+ }
126
+ function createBlueprintApi(state) {
127
+ const api = {
128
+ string: (name, length = 255) => addColumn(state, name, 'STRING', length),
129
+ integer: (name) => addColumn(state, name, 'INTEGER'),
130
+ bigInteger: (name) => addColumn(state, name, 'INTEGER').unsigned(),
131
+ real: (name) => addColumn(state, name, 'REAL'),
132
+ boolean: (name) => addColumn(state, name, 'BOOLEAN'),
133
+ text: (name) => addColumn(state, name, 'TEXT'),
134
+ json: (name) => addColumn(state, name, 'JSON'),
135
+ timestamp: (name) => addColumn(state, name, 'TIMESTAMP'),
136
+ blob: (name) => addColumn(state, name, 'BLOB'),
137
+ id: (name = 'id') => addColumn(state, name, 'INTEGER').primary().autoIncrement(),
138
+ timestamps: (createdAt = 'created_at', updatedAt = 'updated_at') => {
139
+ api.timestamp(createdAt).notNullable().default('CURRENT_TIMESTAMP');
140
+ api.timestamp(updatedAt).notNullable().default('CURRENT_TIMESTAMP');
141
+ },
142
+ index: (cols, name) => {
143
+ const arr = Array.isArray(cols) ? cols : [cols];
144
+ for (const c of arr)
145
+ assertIdentifier('column', c);
146
+ const indexName = name ?? `idx_${state.tableName}_${arr.join('_')}`;
147
+ assertIdentifier('index', indexName);
148
+ state.indexes.push({ name: indexName, columns: arr, type: 'INDEX' });
149
+ },
150
+ unique: (cols, name) => {
151
+ const arr = Array.isArray(cols) ? cols : [cols];
152
+ for (const c of arr)
153
+ assertIdentifier('column', c);
154
+ const indexName = name ?? `uniq_${state.tableName}_${arr.join('_')}`;
155
+ assertIdentifier('index', indexName);
156
+ state.indexes.push({ name: indexName, columns: arr, type: 'UNIQUE' });
157
+ },
158
+ foreign: (cols, name) => {
159
+ const arr = Array.isArray(cols) ? cols : [cols];
160
+ const builder = createForeignKeyBuilder(arr, name);
161
+ state.pendingForeignKeys.push(builder);
162
+ return builder;
163
+ },
164
+ dropColumn: (name) => {
165
+ assertIdentifier('column', name);
166
+ state.dropColumns.push(name);
167
+ },
168
+ dropIndex: (name) => {
169
+ assertIdentifier('index', name);
170
+ state.dropIndexes.push(name);
171
+ },
172
+ dropForeign: (name) => {
173
+ assertIdentifier('foreign key', name);
174
+ state.dropForeignKeys.push(name);
175
+ },
176
+ getDefinition: () => buildDefinition(state),
177
+ getDropColumns: () => [...state.dropColumns],
178
+ getDropIndexes: () => [...state.dropIndexes],
179
+ getDropForeignKeys: () => [...state.dropForeignKeys],
180
+ };
181
+ return api;
182
+ }
183
+ export const MigrationBlueprint = Object.freeze({
184
+ create(tableName) {
185
+ assertIdentifier('table', tableName);
186
+ const state = createState(tableName);
187
+ return createBlueprintApi(state);
188
+ },
189
+ });
@@ -0,0 +1,8 @@
1
+ import type { IDatabase } from '../../orm/Database';
2
+ import type { SchemaBuilder } from '../../migrations/schema/types';
3
+ declare function createSchemaBuilder(db: IDatabase): SchemaBuilder;
4
+ export declare const Schema: Readonly<{
5
+ create: typeof createSchemaBuilder;
6
+ }>;
7
+ export {};
8
+ //# sourceMappingURL=Schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Schema.d.ts","sourceRoot":"","sources":["../../../../src/migrations/schema/Schema.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAK/C,OAAO,KAAK,EAAgC,aAAa,EAAE,MAAM,2BAA2B,CAAC;AA6M7F,iBAAS,mBAAmB,CAAC,EAAE,EAAE,SAAS,GAAG,aAAa,CAWzD;AAED,eAAO,MAAM,MAAM;;EAEjB,CAAC"}
@@ -0,0 +1,141 @@
1
+ import { ErrorFactory } from '../../exceptions/ZintrustError.js';
2
+ import { BaseAdapter } from '../../orm/DatabaseAdapter.js';
3
+ import { MigrationBlueprint } from '../../migrations/schema/Blueprint.js';
4
+ import { MigrationSchemaCompiler } from '../../migrations/schema/SchemaCompiler.js';
5
+ const IDENT_RE = /^[A-Za-z_]\w*$/;
6
+ function assertIdentifier(label, value) {
7
+ if (!IDENT_RE.test(value)) {
8
+ throw ErrorFactory.createValidationError(`Invalid ${label} identifier: ${value}`);
9
+ }
10
+ }
11
+ function isRecord(value) {
12
+ return typeof value === 'object' && value !== null;
13
+ }
14
+ function getStringProp(value, key) {
15
+ if (!isRecord(value))
16
+ return null;
17
+ const v = value[key];
18
+ return typeof v === 'string' ? v : null;
19
+ }
20
+ function mapNames(rows) {
21
+ return rows.map((r) => getStringProp(r, 'name') ?? '').filter((name) => name.length > 0);
22
+ }
23
+ function buildParameterized(db, sql, parameters) {
24
+ const adapter = db.getAdapterInstance(false);
25
+ return BaseAdapter.buildParameterizedQuery(sql, parameters, (i) => adapter.getPlaceholder(i));
26
+ }
27
+ async function queryExists(db, sql, parameters) {
28
+ const built = buildParameterized(db, sql, parameters);
29
+ const rows = await db.query(built.sql, built.parameters, true);
30
+ return rows.length > 0;
31
+ }
32
+ async function runStatements(db, statements) {
33
+ await statements
34
+ .filter((sql) => sql.trim() !== '')
35
+ .reduce(async (p, sql) => {
36
+ await p;
37
+ await db.query(sql, []);
38
+ }, Promise.resolve());
39
+ }
40
+ async function schemaCreate(db, tableName, callback) {
41
+ const blueprint = MigrationBlueprint.create(tableName);
42
+ await callback(blueprint);
43
+ const statements = MigrationSchemaCompiler.compileCreateTable(db.getType(), blueprint.getDefinition(), {
44
+ ifNotExists: true,
45
+ });
46
+ await runStatements(db, statements);
47
+ }
48
+ async function schemaTable(db, tableName, callback) {
49
+ const blueprint = MigrationBlueprint.create(tableName);
50
+ await callback(blueprint);
51
+ const def = blueprint.getDefinition();
52
+ const plan = {
53
+ addColumns: def.columns,
54
+ dropColumns: blueprint.getDropColumns(),
55
+ createIndexes: def.indexes,
56
+ dropIndexes: blueprint.getDropIndexes(),
57
+ addForeignKeys: def.foreignKeys,
58
+ dropForeignKeys: blueprint.getDropForeignKeys(),
59
+ };
60
+ const statements = MigrationSchemaCompiler.compileAlterTable(db.getType(), tableName, plan);
61
+ await runStatements(db, statements);
62
+ }
63
+ async function schemaDrop(db, tableName, ifExists) {
64
+ const sql = MigrationSchemaCompiler.compileDropTable(db.getType(), tableName, { ifExists });
65
+ await db.query(sql, []);
66
+ }
67
+ async function schemaHasTable(db, tableName) {
68
+ const t = db.getType();
69
+ if (t === 'sqlite' || t === 'd1' || t === 'd1-remote') {
70
+ return queryExists(db, "SELECT 1 FROM sqlite_master WHERE type='table' AND name=? LIMIT 1", [
71
+ tableName,
72
+ ]);
73
+ }
74
+ if (t === 'postgresql') {
75
+ return queryExists(db, "SELECT 1 FROM information_schema.tables WHERE table_schema='public' AND table_name=? LIMIT 1", [tableName]);
76
+ }
77
+ if (t === 'mysql') {
78
+ return queryExists(db, 'SELECT 1 FROM information_schema.tables WHERE table_schema = DATABASE() AND table_name=? LIMIT 1', [tableName]);
79
+ }
80
+ if (t === 'sqlserver') {
81
+ return queryExists(db, 'SELECT 1 FROM sys.tables WHERE name=?', [tableName]);
82
+ }
83
+ throw ErrorFactory.createCliError(`Unsupported DB driver: ${t}`);
84
+ }
85
+ async function schemaHasColumn(db, tableName, columnName) {
86
+ const t = db.getType();
87
+ if (t === 'sqlite' || t === 'd1' || t === 'd1-remote') {
88
+ assertIdentifier('table', tableName);
89
+ assertIdentifier('column', columnName);
90
+ const rows = await db.query(`PRAGMA table_info("${tableName}")`, [], true);
91
+ return rows.some((r) => getStringProp(r, 'name') === columnName);
92
+ }
93
+ if (t === 'postgresql') {
94
+ return queryExists(db, "SELECT 1 FROM information_schema.columns WHERE table_schema='public' AND table_name=? AND column_name=? LIMIT 1", [tableName, columnName]);
95
+ }
96
+ if (t === 'mysql') {
97
+ return queryExists(db, 'SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name=? AND column_name=? LIMIT 1', [tableName, columnName]);
98
+ }
99
+ if (t === 'sqlserver') {
100
+ return queryExists(db, 'SELECT 1 FROM sys.columns WHERE object_id = OBJECT_ID(?) AND name=?', [
101
+ tableName,
102
+ columnName,
103
+ ]);
104
+ }
105
+ throw ErrorFactory.createCliError(`Unsupported DB driver: ${t}`);
106
+ }
107
+ async function schemaGetAllTables(db) {
108
+ const t = db.getType();
109
+ if (t === 'sqlite' || t === 'd1' || t === 'd1-remote') {
110
+ const rows = await db.query("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'", [], true);
111
+ return mapNames(rows);
112
+ }
113
+ if (t === 'postgresql') {
114
+ const rows = await db.query("SELECT table_name AS name FROM information_schema.tables WHERE table_schema='public'", [], true);
115
+ return mapNames(rows);
116
+ }
117
+ if (t === 'mysql') {
118
+ const rows = await db.query('SELECT table_name AS name FROM information_schema.tables WHERE table_schema = DATABASE()', [], true);
119
+ return mapNames(rows);
120
+ }
121
+ if (t === 'sqlserver') {
122
+ const rows = await db.query('SELECT name FROM sys.tables', [], true);
123
+ return mapNames(rows);
124
+ }
125
+ throw ErrorFactory.createCliError(`Unsupported DB driver: ${t}`);
126
+ }
127
+ function createSchemaBuilder(db) {
128
+ return {
129
+ create: async (tableName, callback) => schemaCreate(db, tableName, callback),
130
+ table: async (tableName, callback) => schemaTable(db, tableName, callback),
131
+ drop: async (tableName) => schemaDrop(db, tableName, false),
132
+ dropIfExists: async (tableName) => schemaDrop(db, tableName, true),
133
+ hasTable: async (tableName) => schemaHasTable(db, tableName),
134
+ hasColumn: async (tableName, columnName) => schemaHasColumn(db, tableName, columnName),
135
+ getAllTables: async () => schemaGetAllTables(db),
136
+ getDb: () => db,
137
+ };
138
+ }
139
+ export const Schema = Object.freeze({
140
+ create: createSchemaBuilder,
141
+ });