@fragno-dev/db 0.1.14 → 0.2.0

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 (445) hide show
  1. package/.turbo/turbo-build.log +242 -139
  2. package/CHANGELOG.md +47 -0
  3. package/README.md +123 -8
  4. package/dist/adapters/adapters.d.ts +19 -5
  5. package/dist/adapters/adapters.d.ts.map +1 -1
  6. package/dist/adapters/adapters.js.map +1 -1
  7. package/dist/adapters/drizzle/drizzle-adapter.d.ts +6 -19
  8. package/dist/adapters/drizzle/drizzle-adapter.d.ts.map +1 -1
  9. package/dist/adapters/drizzle/drizzle-adapter.js +7 -47
  10. package/dist/adapters/drizzle/drizzle-adapter.js.map +1 -1
  11. package/dist/adapters/drizzle/generate.d.ts +7 -1
  12. package/dist/adapters/drizzle/generate.d.ts.map +1 -1
  13. package/dist/adapters/drizzle/generate.js +46 -45
  14. package/dist/adapters/drizzle/generate.js.map +1 -1
  15. package/dist/adapters/generic-sql/driver-config.d.ts +74 -0
  16. package/dist/adapters/generic-sql/driver-config.d.ts.map +1 -0
  17. package/dist/adapters/generic-sql/driver-config.js +94 -0
  18. package/dist/adapters/generic-sql/driver-config.js.map +1 -0
  19. package/dist/adapters/generic-sql/generic-sql-adapter.d.ts +43 -0
  20. package/dist/adapters/generic-sql/generic-sql-adapter.d.ts.map +1 -0
  21. package/dist/adapters/generic-sql/generic-sql-adapter.js +87 -0
  22. package/dist/adapters/generic-sql/generic-sql-adapter.js.map +1 -0
  23. package/dist/adapters/generic-sql/generic-sql-uow-executor.js +67 -0
  24. package/dist/adapters/generic-sql/generic-sql-uow-executor.js.map +1 -0
  25. package/dist/adapters/generic-sql/migration/cold-kysely.js +33 -0
  26. package/dist/adapters/generic-sql/migration/cold-kysely.js.map +1 -0
  27. package/dist/adapters/generic-sql/migration/dialect/mysql.js +60 -0
  28. package/dist/adapters/generic-sql/migration/dialect/mysql.js.map +1 -0
  29. package/dist/adapters/generic-sql/migration/dialect/postgres.js +59 -0
  30. package/dist/adapters/generic-sql/migration/dialect/postgres.js.map +1 -0
  31. package/dist/adapters/generic-sql/migration/dialect/sqlite.js +96 -0
  32. package/dist/adapters/generic-sql/migration/dialect/sqlite.js.map +1 -0
  33. package/dist/adapters/generic-sql/migration/executor.d.ts +15 -0
  34. package/dist/adapters/generic-sql/migration/executor.d.ts.map +1 -0
  35. package/dist/adapters/generic-sql/migration/executor.js +18 -0
  36. package/dist/adapters/generic-sql/migration/executor.js.map +1 -0
  37. package/dist/adapters/generic-sql/migration/prepared-migrations.d.ts +66 -0
  38. package/dist/adapters/generic-sql/migration/prepared-migrations.d.ts.map +1 -0
  39. package/dist/adapters/generic-sql/migration/prepared-migrations.js +68 -0
  40. package/dist/adapters/generic-sql/migration/prepared-migrations.js.map +1 -0
  41. package/dist/adapters/generic-sql/migration/sql-generator.js +212 -0
  42. package/dist/adapters/generic-sql/migration/sql-generator.js.map +1 -0
  43. package/dist/adapters/generic-sql/query/create-sql-query-compiler.js +32 -0
  44. package/dist/adapters/generic-sql/query/create-sql-query-compiler.js.map +1 -0
  45. package/dist/adapters/generic-sql/query/cursor-utils.js +37 -0
  46. package/dist/adapters/generic-sql/query/cursor-utils.js.map +1 -0
  47. package/dist/adapters/generic-sql/query/dialect/mysql.js +33 -0
  48. package/dist/adapters/generic-sql/query/dialect/mysql.js.map +1 -0
  49. package/dist/adapters/generic-sql/query/dialect/postgres.js +32 -0
  50. package/dist/adapters/generic-sql/query/dialect/postgres.js.map +1 -0
  51. package/dist/adapters/generic-sql/query/dialect/sqlite.js +32 -0
  52. package/dist/adapters/generic-sql/query/dialect/sqlite.js.map +1 -0
  53. package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js +152 -0
  54. package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js.map +1 -0
  55. package/dist/adapters/generic-sql/query/select-builder.js +69 -0
  56. package/dist/adapters/generic-sql/query/select-builder.js.map +1 -0
  57. package/dist/adapters/generic-sql/query/sql-query-compiler.js +145 -0
  58. package/dist/adapters/generic-sql/query/sql-query-compiler.js.map +1 -0
  59. package/dist/adapters/generic-sql/query/where-builder.js +129 -0
  60. package/dist/adapters/generic-sql/query/where-builder.js.map +1 -0
  61. package/dist/adapters/generic-sql/result-interpreter.js +74 -0
  62. package/dist/adapters/generic-sql/result-interpreter.js.map +1 -0
  63. package/dist/adapters/generic-sql/uow-decoder.js +105 -0
  64. package/dist/adapters/generic-sql/uow-decoder.js.map +1 -0
  65. package/dist/adapters/generic-sql/uow-encoder.js +93 -0
  66. package/dist/adapters/generic-sql/uow-encoder.js.map +1 -0
  67. package/dist/adapters/kysely/kysely-adapter.d.ts +5 -16
  68. package/dist/adapters/kysely/kysely-adapter.d.ts.map +1 -1
  69. package/dist/adapters/kysely/kysely-adapter.js +6 -159
  70. package/dist/adapters/kysely/kysely-adapter.js.map +1 -1
  71. package/dist/adapters/{drizzle/drizzle-query.js → shared/from-unit-of-work-compiler.js} +48 -62
  72. package/dist/adapters/shared/from-unit-of-work-compiler.js.map +1 -0
  73. package/dist/adapters/{kysely/kysely-shared.d.ts → shared/table-name-mapper.d.ts} +3 -2
  74. package/dist/adapters/shared/table-name-mapper.d.ts.map +1 -0
  75. package/dist/adapters/shared/table-name-mapper.js +43 -0
  76. package/dist/adapters/shared/table-name-mapper.js.map +1 -0
  77. package/dist/adapters/shared/uow-operation-compiler.js +105 -0
  78. package/dist/adapters/shared/uow-operation-compiler.js.map +1 -0
  79. package/dist/db-fragment-definition-builder.d.ts +186 -0
  80. package/dist/db-fragment-definition-builder.d.ts.map +1 -0
  81. package/dist/db-fragment-definition-builder.js +207 -0
  82. package/dist/db-fragment-definition-builder.js.map +1 -0
  83. package/dist/fragments/internal-fragment.d.ts +53 -0
  84. package/dist/fragments/internal-fragment.d.ts.map +1 -0
  85. package/dist/fragments/internal-fragment.js +111 -0
  86. package/dist/fragments/internal-fragment.js.map +1 -0
  87. package/dist/hooks/hooks.d.ts +51 -0
  88. package/dist/hooks/hooks.d.ts.map +1 -0
  89. package/dist/hooks/hooks.js +88 -0
  90. package/dist/hooks/hooks.js.map +1 -0
  91. package/dist/migration-engine/generation-engine.d.ts +0 -2
  92. package/dist/migration-engine/generation-engine.d.ts.map +1 -1
  93. package/dist/migration-engine/generation-engine.js +38 -56
  94. package/dist/migration-engine/generation-engine.js.map +1 -1
  95. package/dist/mod.d.ts +35 -23
  96. package/dist/mod.d.ts.map +1 -1
  97. package/dist/mod.js +48 -45
  98. package/dist/mod.js.map +1 -1
  99. package/dist/node_modules/.pnpm/rou3@0.7.10/node_modules/rou3/dist/index.js +165 -0
  100. package/dist/node_modules/.pnpm/rou3@0.7.10/node_modules/rou3/dist/index.js.map +1 -0
  101. package/dist/packages/fragno/dist/api/bind-services.js +20 -0
  102. package/dist/packages/fragno/dist/api/bind-services.js.map +1 -0
  103. package/dist/packages/fragno/dist/api/error.js +48 -0
  104. package/dist/packages/fragno/dist/api/error.js.map +1 -0
  105. package/dist/packages/fragno/dist/api/fragment-definition-builder.js +320 -0
  106. package/dist/packages/fragno/dist/api/fragment-definition-builder.js.map +1 -0
  107. package/dist/packages/fragno/dist/api/fragment-instantiator.js +525 -0
  108. package/dist/packages/fragno/dist/api/fragment-instantiator.js.map +1 -0
  109. package/dist/packages/fragno/dist/api/fragno-response.js +73 -0
  110. package/dist/packages/fragno/dist/api/fragno-response.js.map +1 -0
  111. package/dist/packages/fragno/dist/api/internal/response-stream.js +81 -0
  112. package/dist/packages/fragno/dist/api/internal/response-stream.js.map +1 -0
  113. package/dist/packages/fragno/dist/api/internal/route.js +10 -0
  114. package/dist/packages/fragno/dist/api/internal/route.js.map +1 -0
  115. package/dist/packages/fragno/dist/api/mutable-request-state.js +97 -0
  116. package/dist/packages/fragno/dist/api/mutable-request-state.js.map +1 -0
  117. package/dist/packages/fragno/dist/api/request-context-storage.js +43 -0
  118. package/dist/packages/fragno/dist/api/request-context-storage.js.map +1 -0
  119. package/dist/packages/fragno/dist/api/request-input-context.js +118 -0
  120. package/dist/packages/fragno/dist/api/request-input-context.js.map +1 -0
  121. package/dist/packages/fragno/dist/api/request-middleware.js +83 -0
  122. package/dist/packages/fragno/dist/api/request-middleware.js.map +1 -0
  123. package/dist/packages/fragno/dist/api/request-output-context.js +119 -0
  124. package/dist/packages/fragno/dist/api/request-output-context.js.map +1 -0
  125. package/dist/packages/fragno/dist/api/route.js +17 -0
  126. package/dist/packages/fragno/dist/api/route.js.map +1 -0
  127. package/dist/packages/fragno/dist/internal/symbols.js +10 -0
  128. package/dist/packages/fragno/dist/internal/symbols.js.map +1 -0
  129. package/dist/query/column-defaults.js +27 -0
  130. package/dist/query/column-defaults.js.map +1 -0
  131. package/dist/query/cursor.d.ts +14 -6
  132. package/dist/query/cursor.d.ts.map +1 -1
  133. package/dist/query/cursor.js +16 -7
  134. package/dist/query/cursor.js.map +1 -1
  135. package/dist/query/orm/orm.d.ts +1 -1
  136. package/dist/query/orm/orm.js.map +1 -1
  137. package/dist/query/serialize/create-sql-serializer.js +30 -0
  138. package/dist/query/serialize/create-sql-serializer.js.map +1 -0
  139. package/dist/query/serialize/dialect/mysql-serializer.js +87 -0
  140. package/dist/query/serialize/dialect/mysql-serializer.js.map +1 -0
  141. package/dist/query/serialize/dialect/postgres-serializer.js +80 -0
  142. package/dist/query/serialize/dialect/postgres-serializer.js.map +1 -0
  143. package/dist/query/serialize/dialect/sqlite-serializer.js +93 -0
  144. package/dist/query/serialize/dialect/sqlite-serializer.js.map +1 -0
  145. package/dist/query/serialize/sql-serializer.js +67 -0
  146. package/dist/query/serialize/sql-serializer.js.map +1 -0
  147. package/dist/query/{query.d.ts → simple-query-interface.d.ts} +6 -6
  148. package/dist/query/simple-query-interface.d.ts.map +1 -0
  149. package/dist/query/unit-of-work/execute-unit-of-work.d.ts +133 -0
  150. package/dist/query/unit-of-work/execute-unit-of-work.d.ts.map +1 -0
  151. package/dist/query/unit-of-work/execute-unit-of-work.js +197 -0
  152. package/dist/query/unit-of-work/execute-unit-of-work.js.map +1 -0
  153. package/dist/query/unit-of-work/retry-policy.d.ts +88 -0
  154. package/dist/query/unit-of-work/retry-policy.d.ts.map +1 -0
  155. package/dist/query/unit-of-work/retry-policy.js +61 -0
  156. package/dist/query/unit-of-work/retry-policy.js.map +1 -0
  157. package/dist/query/{unit-of-work.d.ts → unit-of-work/unit-of-work.d.ts} +145 -58
  158. package/dist/query/unit-of-work/unit-of-work.d.ts.map +1 -0
  159. package/dist/query/{unit-of-work.js → unit-of-work/unit-of-work.js} +435 -198
  160. package/dist/query/unit-of-work/unit-of-work.js.map +1 -0
  161. package/dist/query/value-decoding.js +71 -0
  162. package/dist/query/value-decoding.js.map +1 -0
  163. package/dist/query/value-encoding.js +124 -0
  164. package/dist/query/value-encoding.js.map +1 -0
  165. package/dist/schema/create.d.ts +3 -0
  166. package/dist/schema/create.d.ts.map +1 -1
  167. package/dist/schema/create.js +4 -0
  168. package/dist/schema/create.js.map +1 -1
  169. package/dist/schema/type-conversion/create-sql-type-mapper.js +29 -0
  170. package/dist/schema/type-conversion/create-sql-type-mapper.js.map +1 -0
  171. package/dist/schema/type-conversion/dialect/mysql.js +57 -0
  172. package/dist/schema/type-conversion/dialect/mysql.js.map +1 -0
  173. package/dist/schema/type-conversion/dialect/postgres.js +56 -0
  174. package/dist/schema/type-conversion/dialect/postgres.js.map +1 -0
  175. package/dist/schema/type-conversion/dialect/sqlite.js +52 -0
  176. package/dist/schema/type-conversion/dialect/sqlite.js.map +1 -0
  177. package/dist/schema/type-conversion/type-mapping.js +63 -0
  178. package/dist/schema/type-conversion/type-mapping.js.map +1 -0
  179. package/dist/sql-driver/connection/connection-provider.d.ts +13 -0
  180. package/dist/sql-driver/connection/connection-provider.d.ts.map +1 -0
  181. package/dist/sql-driver/connection/connection-provider.js +19 -0
  182. package/dist/sql-driver/connection/connection-provider.js.map +1 -0
  183. package/dist/sql-driver/connection/single-connection-provider.js +23 -0
  184. package/dist/sql-driver/connection/single-connection-provider.js.map +1 -0
  185. package/dist/sql-driver/dialect-adapter/dialect-adapter.d.ts +7 -0
  186. package/dist/sql-driver/dialect-adapter/dialect-adapter.d.ts.map +1 -0
  187. package/dist/sql-driver/dialects/dialects.d.ts +2 -0
  188. package/dist/sql-driver/dialects/dialects.js +3 -0
  189. package/dist/sql-driver/dialects/durable-object-dialect.d.ts +72 -0
  190. package/dist/sql-driver/dialects/durable-object-dialect.d.ts.map +1 -0
  191. package/dist/sql-driver/dialects/durable-object-dialect.js +130 -0
  192. package/dist/sql-driver/dialects/durable-object-dialect.js.map +1 -0
  193. package/dist/sql-driver/driver/runtime-driver.d.ts +23 -0
  194. package/dist/sql-driver/driver/runtime-driver.d.ts.map +1 -0
  195. package/dist/sql-driver/driver/runtime-driver.js +56 -0
  196. package/dist/sql-driver/driver/runtime-driver.js.map +1 -0
  197. package/dist/sql-driver/query-executor/default-query-executor.js +26 -0
  198. package/dist/sql-driver/query-executor/default-query-executor.js.map +1 -0
  199. package/dist/sql-driver/query-executor/plugin.d.ts +17 -0
  200. package/dist/sql-driver/query-executor/plugin.d.ts.map +1 -0
  201. package/dist/sql-driver/query-executor/query-executor-base.js +25 -0
  202. package/dist/sql-driver/query-executor/query-executor-base.js.map +1 -0
  203. package/dist/sql-driver/query-executor/query-executor.d.ts +36 -0
  204. package/dist/sql-driver/query-executor/query-executor.d.ts.map +1 -0
  205. package/dist/sql-driver/sql-driver-adapter.d.ts +29 -0
  206. package/dist/sql-driver/sql-driver-adapter.d.ts.map +1 -0
  207. package/dist/sql-driver/sql-driver-adapter.js +68 -0
  208. package/dist/sql-driver/sql-driver-adapter.js.map +1 -0
  209. package/dist/sql-driver/sql-driver.d.ts +38 -0
  210. package/dist/sql-driver/sql-driver.d.ts.map +1 -0
  211. package/dist/sql-driver/sql-driver.js +1 -0
  212. package/dist/sql-driver/sql.js +50 -0
  213. package/dist/sql-driver/sql.js.map +1 -0
  214. package/dist/with-database.d.ts +32 -0
  215. package/dist/with-database.d.ts.map +1 -0
  216. package/dist/with-database.js +34 -0
  217. package/dist/with-database.js.map +1 -0
  218. package/package.json +43 -9
  219. package/src/adapters/adapters.ts +23 -4
  220. package/src/adapters/drizzle/drizzle-adapter-pglite.test.ts +140 -185
  221. package/src/adapters/drizzle/{drizzle-adapter-sqlite.test.ts → drizzle-adapter-sqlite3.test.ts} +187 -55
  222. package/src/adapters/drizzle/drizzle-adapter.ts +14 -93
  223. package/src/adapters/drizzle/generate.test.ts +102 -269
  224. package/src/adapters/drizzle/generate.ts +89 -63
  225. package/src/adapters/drizzle/migrate-drizzle.test.ts +19 -0
  226. package/src/adapters/drizzle/shared.ts +0 -34
  227. package/src/adapters/drizzle/test-utils.ts +36 -5
  228. package/src/adapters/generic-sql/README.md +14 -0
  229. package/src/adapters/generic-sql/driver-config.ts +144 -0
  230. package/src/adapters/generic-sql/generic-sql-adapter.test.ts +50 -0
  231. package/src/adapters/generic-sql/generic-sql-adapter.ts +146 -0
  232. package/src/adapters/generic-sql/generic-sql-uow-executor.ts +130 -0
  233. package/src/adapters/generic-sql/migration/cold-kysely.ts +55 -0
  234. package/src/adapters/{kysely/migration/execute-mysql.test.ts → generic-sql/migration/dialect/mysql.test.ts} +342 -484
  235. package/src/adapters/generic-sql/migration/dialect/mysql.ts +104 -0
  236. package/src/adapters/generic-sql/migration/dialect/postgres.test.ts +1008 -0
  237. package/src/adapters/generic-sql/migration/dialect/postgres.ts +113 -0
  238. package/src/adapters/{kysely/migration/execute-sqlite.test.ts → generic-sql/migration/dialect/sqlite.test.ts} +307 -510
  239. package/src/adapters/generic-sql/migration/dialect/sqlite.ts +189 -0
  240. package/src/adapters/generic-sql/migration/executor.ts +33 -0
  241. package/src/adapters/generic-sql/migration/prepared-migrations.test.ts +661 -0
  242. package/src/adapters/generic-sql/migration/prepared-migrations.ts +214 -0
  243. package/src/adapters/generic-sql/migration/sql-generator.ts +413 -0
  244. package/src/adapters/generic-sql/query/create-sql-query-compiler.ts +36 -0
  245. package/src/adapters/generic-sql/query/cursor-utils.ts +56 -0
  246. package/src/adapters/generic-sql/query/dialect/mysql.ts +34 -0
  247. package/src/adapters/generic-sql/query/dialect/postgres.ts +32 -0
  248. package/src/adapters/generic-sql/query/dialect/sqlite.ts +32 -0
  249. package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.test.ts +1568 -0
  250. package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.ts +314 -0
  251. package/src/adapters/generic-sql/query/select-builder.test.ts +256 -0
  252. package/src/adapters/generic-sql/query/select-builder.ts +137 -0
  253. package/src/adapters/generic-sql/query/sql-query-compiler.test.ts +195 -0
  254. package/src/adapters/generic-sql/query/sql-query-compiler.ts +367 -0
  255. package/src/adapters/generic-sql/query/where-builder.test.ts +744 -0
  256. package/src/adapters/generic-sql/query/where-builder.ts +211 -0
  257. package/src/adapters/generic-sql/result-interpreter.ts +102 -0
  258. package/src/adapters/generic-sql/test/generic-drizzle-adapter-sqlite3.test.ts +899 -0
  259. package/src/adapters/generic-sql/uow-decoder.test.ts +399 -0
  260. package/src/adapters/generic-sql/uow-decoder.ts +152 -0
  261. package/src/adapters/generic-sql/uow-encoder.test.ts +183 -0
  262. package/src/adapters/generic-sql/uow-encoder.ts +131 -0
  263. package/src/adapters/kysely/kysely-adapter-pglite.test.ts +90 -96
  264. package/src/adapters/kysely/kysely-adapter-sqlocal.test.ts +215 -0
  265. package/src/adapters/kysely/kysely-adapter.ts +10 -242
  266. package/src/adapters/{drizzle/drizzle-query.ts → shared/from-unit-of-work-compiler.ts} +111 -106
  267. package/src/adapters/shared/table-name-mapper.ts +50 -0
  268. package/src/adapters/shared/uow-operation-compiler.ts +211 -0
  269. package/src/db-fragment-definition-builder.test.ts +887 -0
  270. package/src/db-fragment-definition-builder.ts +737 -0
  271. package/src/db-fragment-instantiator.test.ts +543 -0
  272. package/src/db-fragment-integration.test.ts +406 -0
  273. package/src/fragments/internal-fragment.test.ts +549 -0
  274. package/src/fragments/internal-fragment.ts +249 -0
  275. package/src/hooks/hooks.test.ts +575 -0
  276. package/src/hooks/hooks.ts +179 -0
  277. package/src/migration-engine/generation-engine.test.ts +60 -27
  278. package/src/migration-engine/generation-engine.ts +99 -92
  279. package/src/mod.ts +139 -78
  280. package/src/query/column-defaults.ts +49 -0
  281. package/src/query/cursor.test.ts +147 -3
  282. package/src/query/cursor.ts +25 -8
  283. package/src/query/orm/orm.ts +1 -1
  284. package/src/query/query-type.test.ts +9 -9
  285. package/src/query/serialize/create-sql-serializer.ts +34 -0
  286. package/src/query/serialize/dialect/mysql-serializer.ts +142 -0
  287. package/src/query/serialize/dialect/postgres-serializer.ts +129 -0
  288. package/src/query/serialize/dialect/sqlite-serializer.test.ts +251 -0
  289. package/src/query/serialize/dialect/sqlite-serializer.ts +156 -0
  290. package/src/query/serialize/sql-serializer.ts +143 -0
  291. package/src/query/{query.ts → simple-query-interface.ts} +4 -4
  292. package/src/query/unit-of-work/execute-unit-of-work.test.ts +1310 -0
  293. package/src/query/unit-of-work/execute-unit-of-work.ts +504 -0
  294. package/src/query/unit-of-work/retry-policy.test.ts +217 -0
  295. package/src/query/unit-of-work/retry-policy.ts +141 -0
  296. package/src/query/unit-of-work/unit-of-work-coordinator.test.ts +831 -0
  297. package/src/query/{unit-of-work-types.test.ts → unit-of-work/unit-of-work-types.test.ts} +7 -5
  298. package/src/query/unit-of-work/unit-of-work.test.ts +1716 -0
  299. package/src/query/{unit-of-work.ts → unit-of-work/unit-of-work.ts} +716 -420
  300. package/src/query/{result-transform.test.ts → value-decoding.test.ts} +45 -298
  301. package/src/query/value-decoding.ts +113 -0
  302. package/src/query/value-encoding.test.ts +390 -0
  303. package/src/query/value-encoding.ts +168 -0
  304. package/src/schema/create.test.ts +5 -1
  305. package/src/schema/create.ts +5 -0
  306. package/src/schema/serialize.test.ts +165 -407
  307. package/src/schema/type-conversion/create-sql-type-mapper.ts +28 -0
  308. package/src/schema/type-conversion/dialect/mysql.ts +64 -0
  309. package/src/schema/type-conversion/dialect/postgres.ts +62 -0
  310. package/src/schema/type-conversion/dialect/sqlite.ts +63 -0
  311. package/src/schema/type-conversion/type-mapping.test.ts +137 -0
  312. package/src/schema/type-conversion/type-mapping.ts +153 -0
  313. package/src/shared/connection-pool.ts +5 -5
  314. package/src/sql-driver/better-sqlite3.test.ts +126 -0
  315. package/src/sql-driver/connection/connection-provider.ts +27 -0
  316. package/src/sql-driver/connection/single-connection-provider.ts +42 -0
  317. package/src/sql-driver/dialect-adapter/dialect-adapter.ts +9 -0
  318. package/src/sql-driver/dialect-adapter/sqlite-dialect-adapter.ts +7 -0
  319. package/src/sql-driver/dialects/dialects.ts +1 -0
  320. package/src/sql-driver/dialects/durable-object-dialect.ts +260 -0
  321. package/src/sql-driver/driver/runtime-driver.ts +91 -0
  322. package/src/sql-driver/query-executor/default-query-executor.ts +38 -0
  323. package/src/sql-driver/query-executor/plugin.ts +22 -0
  324. package/src/sql-driver/query-executor/query-executor-base.ts +53 -0
  325. package/src/sql-driver/query-executor/query-executor.ts +44 -0
  326. package/src/sql-driver/sql-driver-adapter.ts +96 -0
  327. package/src/sql-driver/sql-driver.ts +53 -0
  328. package/src/sql-driver/sql.ts +57 -0
  329. package/src/sql-driver/sqlocal.test.ts +117 -0
  330. package/src/with-database.ts +152 -0
  331. package/tsdown.config.ts +8 -2
  332. package/dist/adapters/drizzle/drizzle-connection-pool.js +0 -40
  333. package/dist/adapters/drizzle/drizzle-connection-pool.js.map +0 -1
  334. package/dist/adapters/drizzle/drizzle-query.d.ts +0 -23
  335. package/dist/adapters/drizzle/drizzle-query.d.ts.map +0 -1
  336. package/dist/adapters/drizzle/drizzle-query.js.map +0 -1
  337. package/dist/adapters/drizzle/drizzle-uow-compiler.d.ts +0 -10
  338. package/dist/adapters/drizzle/drizzle-uow-compiler.d.ts.map +0 -1
  339. package/dist/adapters/drizzle/drizzle-uow-compiler.js +0 -315
  340. package/dist/adapters/drizzle/drizzle-uow-compiler.js.map +0 -1
  341. package/dist/adapters/drizzle/drizzle-uow-decoder.js +0 -116
  342. package/dist/adapters/drizzle/drizzle-uow-decoder.js.map +0 -1
  343. package/dist/adapters/drizzle/drizzle-uow-executor.js +0 -149
  344. package/dist/adapters/drizzle/drizzle-uow-executor.js.map +0 -1
  345. package/dist/adapters/drizzle/join-column-utils.js +0 -28
  346. package/dist/adapters/drizzle/join-column-utils.js.map +0 -1
  347. package/dist/adapters/drizzle/shared.d.ts +0 -14
  348. package/dist/adapters/drizzle/shared.d.ts.map +0 -1
  349. package/dist/adapters/drizzle/shared.js +0 -35
  350. package/dist/adapters/drizzle/shared.js.map +0 -1
  351. package/dist/adapters/kysely/kysely-connection-pool.js +0 -41
  352. package/dist/adapters/kysely/kysely-connection-pool.js.map +0 -1
  353. package/dist/adapters/kysely/kysely-query-builder.js +0 -321
  354. package/dist/adapters/kysely/kysely-query-builder.js.map +0 -1
  355. package/dist/adapters/kysely/kysely-query-compiler.js +0 -66
  356. package/dist/adapters/kysely/kysely-query-compiler.js.map +0 -1
  357. package/dist/adapters/kysely/kysely-query.d.ts +0 -22
  358. package/dist/adapters/kysely/kysely-query.d.ts.map +0 -1
  359. package/dist/adapters/kysely/kysely-query.js +0 -223
  360. package/dist/adapters/kysely/kysely-query.js.map +0 -1
  361. package/dist/adapters/kysely/kysely-shared.d.ts.map +0 -1
  362. package/dist/adapters/kysely/kysely-shared.js +0 -18
  363. package/dist/adapters/kysely/kysely-shared.js.map +0 -1
  364. package/dist/adapters/kysely/kysely-uow-compiler.js +0 -170
  365. package/dist/adapters/kysely/kysely-uow-compiler.js.map +0 -1
  366. package/dist/adapters/kysely/kysely-uow-executor.js +0 -89
  367. package/dist/adapters/kysely/kysely-uow-executor.js.map +0 -1
  368. package/dist/adapters/kysely/migration/execute-base.js +0 -128
  369. package/dist/adapters/kysely/migration/execute-base.js.map +0 -1
  370. package/dist/adapters/kysely/migration/execute-factory.js +0 -34
  371. package/dist/adapters/kysely/migration/execute-factory.js.map +0 -1
  372. package/dist/adapters/kysely/migration/execute-mssql.js +0 -112
  373. package/dist/adapters/kysely/migration/execute-mssql.js.map +0 -1
  374. package/dist/adapters/kysely/migration/execute-mysql.js +0 -93
  375. package/dist/adapters/kysely/migration/execute-mysql.js.map +0 -1
  376. package/dist/adapters/kysely/migration/execute-postgres.js +0 -104
  377. package/dist/adapters/kysely/migration/execute-postgres.js.map +0 -1
  378. package/dist/adapters/kysely/migration/execute-sqlite.js +0 -123
  379. package/dist/adapters/kysely/migration/execute-sqlite.js.map +0 -1
  380. package/dist/adapters/kysely/migration/execute.js +0 -34
  381. package/dist/adapters/kysely/migration/execute.js.map +0 -1
  382. package/dist/bind-services.d.ts +0 -7
  383. package/dist/bind-services.d.ts.map +0 -1
  384. package/dist/bind-services.js +0 -14
  385. package/dist/bind-services.js.map +0 -1
  386. package/dist/fragment.d.ts +0 -173
  387. package/dist/fragment.d.ts.map +0 -1
  388. package/dist/fragment.js +0 -191
  389. package/dist/fragment.js.map +0 -1
  390. package/dist/migration-engine/create.d.ts +0 -37
  391. package/dist/migration-engine/create.d.ts.map +0 -1
  392. package/dist/migration-engine/create.js +0 -58
  393. package/dist/migration-engine/create.js.map +0 -1
  394. package/dist/migration-engine/shared.d.ts +0 -112
  395. package/dist/migration-engine/shared.d.ts.map +0 -1
  396. package/dist/query/query.d.ts.map +0 -1
  397. package/dist/query/result-transform.js +0 -168
  398. package/dist/query/result-transform.js.map +0 -1
  399. package/dist/query/unit-of-work.d.ts.map +0 -1
  400. package/dist/query/unit-of-work.js.map +0 -1
  401. package/dist/schema/serialize.js +0 -106
  402. package/dist/schema/serialize.js.map +0 -1
  403. package/dist/shared/settings-schema.js +0 -36
  404. package/dist/shared/settings-schema.js.map +0 -1
  405. package/src/adapters/drizzle/drizzle-adapter.test.ts +0 -170
  406. package/src/adapters/drizzle/drizzle-connection-pool.ts +0 -66
  407. package/src/adapters/drizzle/drizzle-query.test.ts +0 -499
  408. package/src/adapters/drizzle/drizzle-uow-compiler.test.ts +0 -1383
  409. package/src/adapters/drizzle/drizzle-uow-compiler.ts +0 -636
  410. package/src/adapters/drizzle/drizzle-uow-decoder.ts +0 -218
  411. package/src/adapters/drizzle/drizzle-uow-executor.ts +0 -276
  412. package/src/adapters/drizzle/join-column-utils.test.ts +0 -79
  413. package/src/adapters/drizzle/join-column-utils.ts +0 -39
  414. package/src/adapters/kysely/kysely-connection-pool.ts +0 -70
  415. package/src/adapters/kysely/kysely-query-builder.test.ts +0 -1344
  416. package/src/adapters/kysely/kysely-query-builder.ts +0 -666
  417. package/src/adapters/kysely/kysely-query-compiler.ts +0 -132
  418. package/src/adapters/kysely/kysely-query.test.ts +0 -498
  419. package/src/adapters/kysely/kysely-query.ts +0 -390
  420. package/src/adapters/kysely/kysely-shared.ts +0 -23
  421. package/src/adapters/kysely/kysely-uow-compiler.test.ts +0 -998
  422. package/src/adapters/kysely/kysely-uow-compiler.ts +0 -318
  423. package/src/adapters/kysely/kysely-uow-executor.ts +0 -145
  424. package/src/adapters/kysely/kysely-uow-joins.test.ts +0 -811
  425. package/src/adapters/kysely/migration/execute-base.ts +0 -256
  426. package/src/adapters/kysely/migration/execute-factory.ts +0 -53
  427. package/src/adapters/kysely/migration/execute-mssql.ts +0 -250
  428. package/src/adapters/kysely/migration/execute-mysql.ts +0 -211
  429. package/src/adapters/kysely/migration/execute-postgres.test.ts +0 -2657
  430. package/src/adapters/kysely/migration/execute-postgres.ts +0 -234
  431. package/src/adapters/kysely/migration/execute-sqlite.ts +0 -247
  432. package/src/adapters/kysely/migration/execute.ts +0 -50
  433. package/src/adapters/kysely/migration/kysely-migrator.test.ts +0 -261
  434. package/src/bind-services.test.ts +0 -214
  435. package/src/bind-services.ts +0 -37
  436. package/src/db-fragment.test.ts +0 -800
  437. package/src/fragment.ts +0 -727
  438. package/src/query/result-transform.ts +0 -271
  439. package/src/query/unit-of-work-multi-schema.test.ts +0 -64
  440. package/src/query/unit-of-work.test.ts +0 -943
  441. package/src/schema/serialize.ts +0 -396
  442. package/src/shared/settings-schema.ts +0 -61
  443. package/src/uow-context-integration.test.ts +0 -102
  444. package/src/uow-context.test.ts +0 -182
  445. /package/dist/query/{query.js → simple-query-interface.js} +0 -0
@@ -0,0 +1,33 @@
1
+ import { DummyDriver, Kysely, MysqlAdapter, MysqlIntrospector, MysqlQueryCompiler, PostgresAdapter, PostgresIntrospector, PostgresQueryCompiler, SqliteAdapter, SqliteIntrospector, SqliteQueryCompiler } from "kysely";
2
+
3
+ //#region src/adapters/generic-sql/migration/cold-kysely.ts
4
+ /**
5
+ * Creates a Kysely instance that can only build queries, not execute them.
6
+ * This is used for SQL generation without requiring a database connection.
7
+ */
8
+ function createColdKysely(database) {
9
+ switch (database) {
10
+ case "postgresql": return new Kysely({ dialect: {
11
+ createAdapter: () => new PostgresAdapter(),
12
+ createDriver: () => new DummyDriver(),
13
+ createIntrospector: (db) => new PostgresIntrospector(db),
14
+ createQueryCompiler: () => new PostgresQueryCompiler()
15
+ } });
16
+ case "mysql": return new Kysely({ dialect: {
17
+ createAdapter: () => new MysqlAdapter(),
18
+ createDriver: () => new DummyDriver(),
19
+ createIntrospector: (db) => new MysqlIntrospector(db),
20
+ createQueryCompiler: () => new MysqlQueryCompiler()
21
+ } });
22
+ case "sqlite": return new Kysely({ dialect: {
23
+ createAdapter: () => new SqliteAdapter(),
24
+ createDriver: () => new DummyDriver(),
25
+ createIntrospector: (db) => new SqliteIntrospector(db),
26
+ createQueryCompiler: () => new SqliteQueryCompiler()
27
+ } });
28
+ }
29
+ }
30
+
31
+ //#endregion
32
+ export { createColdKysely };
33
+ //# sourceMappingURL=cold-kysely.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cold-kysely.js","names":[],"sources":["../../../../src/adapters/generic-sql/migration/cold-kysely.ts"],"sourcesContent":["import {\n DummyDriver,\n Kysely,\n MysqlAdapter,\n MysqlIntrospector,\n MysqlQueryCompiler,\n PostgresAdapter,\n PostgresIntrospector,\n PostgresQueryCompiler,\n SqliteAdapter,\n SqliteIntrospector,\n SqliteQueryCompiler,\n} from \"kysely\";\nimport type { SupportedDatabase } from \"../driver-config\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype KyselyAny = Kysely<any>;\n\n/**\n * Creates a Kysely instance that can only build queries, not execute them.\n * This is used for SQL generation without requiring a database connection.\n */\nexport function createColdKysely(database: SupportedDatabase): KyselyAny {\n switch (database) {\n case \"postgresql\":\n return new Kysely({\n dialect: {\n createAdapter: () => new PostgresAdapter(),\n createDriver: () => new DummyDriver(),\n createIntrospector: (db) => new PostgresIntrospector(db),\n createQueryCompiler: () => new PostgresQueryCompiler(),\n },\n });\n\n case \"mysql\":\n return new Kysely({\n dialect: {\n createAdapter: () => new MysqlAdapter(),\n createDriver: () => new DummyDriver(),\n createIntrospector: (db) => new MysqlIntrospector(db),\n createQueryCompiler: () => new MysqlQueryCompiler(),\n },\n });\n\n case \"sqlite\":\n return new Kysely({\n dialect: {\n createAdapter: () => new SqliteAdapter(),\n createDriver: () => new DummyDriver(),\n createIntrospector: (db) => new SqliteIntrospector(db),\n createQueryCompiler: () => new SqliteQueryCompiler(),\n },\n });\n }\n}\n"],"mappings":";;;;;;;AAsBA,SAAgB,iBAAiB,UAAwC;AACvE,SAAQ,UAAR;EACE,KAAK,aACH,QAAO,IAAI,OAAO,EAChB,SAAS;GACP,qBAAqB,IAAI,iBAAiB;GAC1C,oBAAoB,IAAI,aAAa;GACrC,qBAAqB,OAAO,IAAI,qBAAqB,GAAG;GACxD,2BAA2B,IAAI,uBAAuB;GACvD,EACF,CAAC;EAEJ,KAAK,QACH,QAAO,IAAI,OAAO,EAChB,SAAS;GACP,qBAAqB,IAAI,cAAc;GACvC,oBAAoB,IAAI,aAAa;GACrC,qBAAqB,OAAO,IAAI,kBAAkB,GAAG;GACrD,2BAA2B,IAAI,oBAAoB;GACpD,EACF,CAAC;EAEJ,KAAK,SACH,QAAO,IAAI,OAAO,EAChB,SAAS;GACP,qBAAqB,IAAI,eAAe;GACxC,oBAAoB,IAAI,aAAa;GACrC,qBAAqB,OAAO,IAAI,mBAAmB,GAAG;GACtD,2BAA2B,IAAI,qBAAqB;GACrD,EACF,CAAC"}
@@ -0,0 +1,60 @@
1
+ import { SQLGenerator } from "../sql-generator.js";
2
+ import { isUpdated } from "../../../../migration-engine/shared.js";
3
+ import { sql } from "kysely";
4
+
5
+ //#region src/adapters/generic-sql/migration/dialect/mysql.ts
6
+ const errors = { IdColumnUpdate: "ID columns cannot be updated. Not every database supports updating primary keys and often requires workarounds." };
7
+ /**
8
+ * MySQL-specific SQL generator.
9
+ * Uses modifyColumn for updates and wraps migrations with FK checks disabled.
10
+ */
11
+ var MySQLSQLGenerator = class extends SQLGenerator {
12
+ /**
13
+ * MySQL preprocessing: wrap operations with SET FOREIGN_KEY_CHECKS = 0/1.
14
+ */
15
+ preprocess(operations) {
16
+ if (operations.length === 0) return operations;
17
+ return [
18
+ {
19
+ type: "custom",
20
+ sql: "SET FOREIGN_KEY_CHECKS = 0"
21
+ },
22
+ ...operations,
23
+ {
24
+ type: "custom",
25
+ sql: "SET FOREIGN_KEY_CHECKS = 1"
26
+ }
27
+ ];
28
+ }
29
+ applyAutoIncrement(builder) {
30
+ return builder.autoIncrement();
31
+ }
32
+ getDefaultValue(column) {
33
+ const value = column.default;
34
+ if (!value) return;
35
+ if (column.type === "string") return;
36
+ if ("value" in value && value.value !== void 0) return sql.lit(value.value);
37
+ if ("dbSpecial" in value && value.dbSpecial === "now") return sql`CURRENT_TIMESTAMP`;
38
+ if ("runtime" in value) return;
39
+ }
40
+ /**
41
+ * MySQL update-column uses modifyColumn which requires the full column definition.
42
+ */
43
+ compileUpdateColumn(tableName, operation) {
44
+ const col = operation.value;
45
+ if (col.role === "external-id" || col.role === "internal-id") throw new Error(errors.IdColumnUpdate);
46
+ if (!isUpdated(operation)) return [];
47
+ return this.db.schema.alterTable(tableName).modifyColumn(operation.name, sql.raw(this.getDBType(col)), (b) => this.buildColumn(col, b)).compile();
48
+ }
49
+ /**
50
+ * MySQL doesn't support IF EXISTS for dropping constraints.
51
+ */
52
+ compileDropForeignKey(operation, mapper) {
53
+ const { table, name } = operation;
54
+ return this.db.schema.alterTable(this.getTableName(table, mapper)).dropConstraint(name).compile();
55
+ }
56
+ };
57
+
58
+ //#endregion
59
+ export { MySQLSQLGenerator };
60
+ //# sourceMappingURL=mysql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mysql.js","names":[],"sources":["../../../../../src/adapters/generic-sql/migration/dialect/mysql.ts"],"sourcesContent":["import { type ColumnDefinitionBuilder, type CompiledQuery, type RawBuilder, sql } from \"kysely\";\nimport type {\n ColumnInfo,\n ColumnOperation,\n MigrationOperation,\n} from \"../../../../migration-engine/shared\";\nimport { isUpdated } from \"../../../../migration-engine/shared\";\nimport type { TableNameMapper } from \"../../../shared/table-name-mapper\";\nimport { SQLGenerator } from \"../sql-generator\";\n\nconst errors = {\n IdColumnUpdate:\n \"ID columns cannot be updated. Not every database supports updating primary keys and often requires workarounds.\",\n} as const;\n\n/**\n * MySQL-specific SQL generator.\n * Uses modifyColumn for updates and wraps migrations with FK checks disabled.\n */\nexport class MySQLSQLGenerator extends SQLGenerator {\n /**\n * MySQL preprocessing: wrap operations with SET FOREIGN_KEY_CHECKS = 0/1.\n */\n override preprocess(operations: MigrationOperation[]): MigrationOperation[] {\n if (operations.length === 0) {\n return operations;\n }\n\n return [\n { type: \"custom\", sql: \"SET FOREIGN_KEY_CHECKS = 0\" },\n ...operations,\n { type: \"custom\", sql: \"SET FOREIGN_KEY_CHECKS = 1\" },\n ];\n }\n\n override applyAutoIncrement(builder: ColumnDefinitionBuilder): ColumnDefinitionBuilder {\n return builder.autoIncrement();\n }\n\n override getDefaultValue(column: ColumnInfo): RawBuilder<unknown> | undefined {\n const value = column.default;\n if (!value) {\n return undefined;\n }\n\n // MySQL doesn't support default values for TEXT columns\n if (column.type === \"string\") {\n return undefined;\n }\n\n if (\"value\" in value && value.value !== undefined) {\n return sql.lit(value.value);\n }\n\n if (\"dbSpecial\" in value && value.dbSpecial === \"now\") {\n return sql`CURRENT_TIMESTAMP`;\n }\n\n // Runtime defaults are handled in application code, not SQL\n if (\"runtime\" in value) {\n return undefined;\n }\n\n return undefined;\n }\n\n /**\n * MySQL update-column uses modifyColumn which requires the full column definition.\n */\n protected override compileUpdateColumn(\n tableName: string,\n operation: Extract<ColumnOperation, { type: \"update-column\" }>,\n ): CompiledQuery | CompiledQuery[] {\n const col = operation.value;\n\n if (col.role === \"external-id\" || col.role === \"internal-id\") {\n throw new Error(errors.IdColumnUpdate);\n }\n\n if (!isUpdated(operation)) {\n return [];\n }\n\n // MySQL: Use modifyColumn which requires the full column definition\n return this.db.schema\n .alterTable(tableName)\n .modifyColumn(operation.name, sql.raw(this.getDBType(col)), (b) => this.buildColumn(col, b))\n .compile();\n }\n\n /**\n * MySQL doesn't support IF EXISTS for dropping constraints.\n */\n protected override compileDropForeignKey(\n operation: Extract<MigrationOperation, { type: \"drop-foreign-key\" }>,\n mapper?: TableNameMapper,\n ): CompiledQuery {\n const { table, name } = operation;\n return this.db.schema\n .alterTable(this.getTableName(table, mapper))\n .dropConstraint(name)\n .compile();\n }\n}\n"],"mappings":";;;;;AAUA,MAAM,SAAS,EACb,gBACE,mHACH;;;;;AAMD,IAAa,oBAAb,cAAuC,aAAa;;;;CAIlD,AAAS,WAAW,YAAwD;AAC1E,MAAI,WAAW,WAAW,EACxB,QAAO;AAGT,SAAO;GACL;IAAE,MAAM;IAAU,KAAK;IAA8B;GACrD,GAAG;GACH;IAAE,MAAM;IAAU,KAAK;IAA8B;GACtD;;CAGH,AAAS,mBAAmB,SAA2D;AACrF,SAAO,QAAQ,eAAe;;CAGhC,AAAS,gBAAgB,QAAqD;EAC5E,MAAM,QAAQ,OAAO;AACrB,MAAI,CAAC,MACH;AAIF,MAAI,OAAO,SAAS,SAClB;AAGF,MAAI,WAAW,SAAS,MAAM,UAAU,OACtC,QAAO,IAAI,IAAI,MAAM,MAAM;AAG7B,MAAI,eAAe,SAAS,MAAM,cAAc,MAC9C,QAAO,GAAG;AAIZ,MAAI,aAAa,MACf;;;;;CASJ,AAAmB,oBACjB,WACA,WACiC;EACjC,MAAM,MAAM,UAAU;AAEtB,MAAI,IAAI,SAAS,iBAAiB,IAAI,SAAS,cAC7C,OAAM,IAAI,MAAM,OAAO,eAAe;AAGxC,MAAI,CAAC,UAAU,UAAU,CACvB,QAAO,EAAE;AAIX,SAAO,KAAK,GAAG,OACZ,WAAW,UAAU,CACrB,aAAa,UAAU,MAAM,IAAI,IAAI,KAAK,UAAU,IAAI,CAAC,GAAG,MAAM,KAAK,YAAY,KAAK,EAAE,CAAC,CAC3F,SAAS;;;;;CAMd,AAAmB,sBACjB,WACA,QACe;EACf,MAAM,EAAE,OAAO,SAAS;AACxB,SAAO,KAAK,GAAG,OACZ,WAAW,KAAK,aAAa,OAAO,OAAO,CAAC,CAC5C,eAAe,KAAK,CACpB,SAAS"}
@@ -0,0 +1,59 @@
1
+ import { SQLGenerator } from "../sql-generator.js";
2
+ import { isUpdated } from "../../../../migration-engine/shared.js";
3
+ import { sql } from "kysely";
4
+
5
+ //#region src/adapters/generic-sql/migration/dialect/postgres.ts
6
+ const errors = { IdColumnUpdate: "ID columns cannot be updated. Not every database supports updating primary keys and often requires workarounds." };
7
+ /**
8
+ * PostgreSQL-specific SQL generator.
9
+ * Uses USING clauses for type conversion and SERIAL for auto-increment.
10
+ */
11
+ var PostgresSQLGenerator = class extends SQLGenerator {
12
+ /**
13
+ * PostgreSQL doesn't need preprocessing - it handles FKs normally.
14
+ */
15
+ preprocess(operations) {
16
+ return operations;
17
+ }
18
+ /**
19
+ * PostgreSQL uses SERIAL/BIGSERIAL types for auto-increment,
20
+ * which is already handled in PostgreSQLTypeMapper. No builder modification needed.
21
+ */
22
+ applyAutoIncrement(builder) {
23
+ return builder;
24
+ }
25
+ getDefaultValue(column) {
26
+ const value = column.default;
27
+ if (!value) return;
28
+ if ("value" in value && value.value !== void 0) return sql.lit(value.value);
29
+ if ("dbSpecial" in value && value.dbSpecial === "now") return sql`CURRENT_TIMESTAMP`;
30
+ if ("runtime" in value) return;
31
+ }
32
+ /**
33
+ * PostgreSQL update-column uses USING clause for type conversion.
34
+ */
35
+ compileUpdateColumn(tableName, operation) {
36
+ const col = operation.value;
37
+ if (col.role === "external-id" || col.role === "internal-id") throw new Error(errors.IdColumnUpdate);
38
+ if (!isUpdated(operation)) return [];
39
+ const queries = [];
40
+ const alter = () => this.db.schema.alterTable(tableName);
41
+ if (operation.updateDataType) {
42
+ const dbType = sql.raw(this.getDBType(col));
43
+ queries.push(sql`ALTER TABLE ${sql.ref(tableName)} ALTER COLUMN ${sql.ref(operation.name)} TYPE ${dbType} USING (${sql.ref(operation.name)}::${dbType})`.compile(this.db));
44
+ }
45
+ if (operation.updateNullable) queries.push(alter().alterColumn(operation.name, (build) => col.isNullable ? build.dropNotNull() : build.setNotNull()).compile());
46
+ if (operation.updateDefault) {
47
+ const defaultValue = this.getDefaultValue(col);
48
+ queries.push(alter().alterColumn(operation.name, (build) => {
49
+ if (!defaultValue) return build.dropDefault();
50
+ return build.setDefault(defaultValue);
51
+ }).compile());
52
+ }
53
+ return queries;
54
+ }
55
+ };
56
+
57
+ //#endregion
58
+ export { PostgresSQLGenerator };
59
+ //# sourceMappingURL=postgres.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres.js","names":["queries: CompiledQuery[]"],"sources":["../../../../../src/adapters/generic-sql/migration/dialect/postgres.ts"],"sourcesContent":["import { type ColumnDefinitionBuilder, type CompiledQuery, type RawBuilder, sql } from \"kysely\";\nimport type {\n ColumnInfo,\n ColumnOperation,\n MigrationOperation,\n} from \"../../../../migration-engine/shared\";\nimport { isUpdated } from \"../../../../migration-engine/shared\";\nimport { SQLGenerator } from \"../sql-generator\";\n\nconst errors = {\n IdColumnUpdate:\n \"ID columns cannot be updated. Not every database supports updating primary keys and often requires workarounds.\",\n} as const;\n\n/**\n * PostgreSQL-specific SQL generator.\n * Uses USING clauses for type conversion and SERIAL for auto-increment.\n */\nexport class PostgresSQLGenerator extends SQLGenerator {\n /**\n * PostgreSQL doesn't need preprocessing - it handles FKs normally.\n */\n override preprocess(operations: MigrationOperation[]): MigrationOperation[] {\n return operations;\n }\n\n /**\n * PostgreSQL uses SERIAL/BIGSERIAL types for auto-increment,\n * which is already handled in PostgreSQLTypeMapper. No builder modification needed.\n */\n override applyAutoIncrement(builder: ColumnDefinitionBuilder): ColumnDefinitionBuilder {\n return builder;\n }\n\n override getDefaultValue(column: ColumnInfo): RawBuilder<unknown> | undefined {\n const value = column.default;\n if (!value) {\n return undefined;\n }\n\n if (\"value\" in value && value.value !== undefined) {\n return sql.lit(value.value);\n }\n\n if (\"dbSpecial\" in value && value.dbSpecial === \"now\") {\n return sql`CURRENT_TIMESTAMP`;\n }\n\n // Runtime defaults are handled in application code, not SQL\n if (\"runtime\" in value) {\n return undefined;\n }\n\n return undefined;\n }\n\n /**\n * PostgreSQL update-column uses USING clause for type conversion.\n */\n protected override compileUpdateColumn(\n tableName: string,\n operation: Extract<ColumnOperation, { type: \"update-column\" }>,\n ): CompiledQuery | CompiledQuery[] {\n const col = operation.value;\n\n if (col.role === \"external-id\" || col.role === \"internal-id\") {\n throw new Error(errors.IdColumnUpdate);\n }\n\n if (!isUpdated(operation)) {\n return [];\n }\n\n const queries: CompiledQuery[] = [];\n const alter = () => this.db.schema.alterTable(tableName);\n\n // PostgreSQL: Use explicit USING clause for type conversion\n if (operation.updateDataType) {\n const dbType = sql.raw(this.getDBType(col));\n queries.push(\n sql`ALTER TABLE ${sql.ref(tableName)} ALTER COLUMN ${sql.ref(operation.name)} TYPE ${dbType} USING (${sql.ref(operation.name)}::${dbType})`.compile(\n this.db,\n ),\n );\n }\n\n if (operation.updateNullable) {\n queries.push(\n alter()\n .alterColumn(operation.name, (build) =>\n col.isNullable ? build.dropNotNull() : build.setNotNull(),\n )\n .compile(),\n );\n }\n\n if (operation.updateDefault) {\n const defaultValue = this.getDefaultValue(col);\n queries.push(\n alter()\n .alterColumn(operation.name, (build) => {\n if (!defaultValue) {\n return build.dropDefault();\n }\n return build.setDefault(defaultValue);\n })\n .compile(),\n );\n }\n\n return queries;\n }\n}\n"],"mappings":";;;;;AASA,MAAM,SAAS,EACb,gBACE,mHACH;;;;;AAMD,IAAa,uBAAb,cAA0C,aAAa;;;;CAIrD,AAAS,WAAW,YAAwD;AAC1E,SAAO;;;;;;CAOT,AAAS,mBAAmB,SAA2D;AACrF,SAAO;;CAGT,AAAS,gBAAgB,QAAqD;EAC5E,MAAM,QAAQ,OAAO;AACrB,MAAI,CAAC,MACH;AAGF,MAAI,WAAW,SAAS,MAAM,UAAU,OACtC,QAAO,IAAI,IAAI,MAAM,MAAM;AAG7B,MAAI,eAAe,SAAS,MAAM,cAAc,MAC9C,QAAO,GAAG;AAIZ,MAAI,aAAa,MACf;;;;;CASJ,AAAmB,oBACjB,WACA,WACiC;EACjC,MAAM,MAAM,UAAU;AAEtB,MAAI,IAAI,SAAS,iBAAiB,IAAI,SAAS,cAC7C,OAAM,IAAI,MAAM,OAAO,eAAe;AAGxC,MAAI,CAAC,UAAU,UAAU,CACvB,QAAO,EAAE;EAGX,MAAMA,UAA2B,EAAE;EACnC,MAAM,cAAc,KAAK,GAAG,OAAO,WAAW,UAAU;AAGxD,MAAI,UAAU,gBAAgB;GAC5B,MAAM,SAAS,IAAI,IAAI,KAAK,UAAU,IAAI,CAAC;AAC3C,WAAQ,KACN,GAAG,eAAe,IAAI,IAAI,UAAU,CAAC,gBAAgB,IAAI,IAAI,UAAU,KAAK,CAAC,QAAQ,OAAO,UAAU,IAAI,IAAI,UAAU,KAAK,CAAC,IAAI,OAAO,GAAG,QAC1I,KAAK,GACN,CACF;;AAGH,MAAI,UAAU,eACZ,SAAQ,KACN,OAAO,CACJ,YAAY,UAAU,OAAO,UAC5B,IAAI,aAAa,MAAM,aAAa,GAAG,MAAM,YAAY,CAC1D,CACA,SAAS,CACb;AAGH,MAAI,UAAU,eAAe;GAC3B,MAAM,eAAe,KAAK,gBAAgB,IAAI;AAC9C,WAAQ,KACN,OAAO,CACJ,YAAY,UAAU,OAAO,UAAU;AACtC,QAAI,CAAC,aACH,QAAO,MAAM,aAAa;AAE5B,WAAO,MAAM,WAAW,aAAa;KACrC,CACD,SAAS,CACb;;AAGH,SAAO"}
@@ -0,0 +1,96 @@
1
+ import { SQLGenerator } from "../sql-generator.js";
2
+ import { sql } from "kysely";
3
+
4
+ //#region src/adapters/generic-sql/migration/dialect/sqlite.ts
5
+ const errors = {
6
+ IdColumnUpdate: "ID columns cannot be updated. Not every database supports updating primary keys and often requires workarounds.",
7
+ SQLiteUpdateColumn: "SQLite doesn't support updating columns. Recreate the table instead.",
8
+ SQLiteUpdateForeignKeys: "SQLite doesn't support modifying foreign keys directly. Use `recreate-table` instead."
9
+ };
10
+ /**
11
+ * SQLite-specific SQL generator.
12
+ * Handles SQLite's limitations around foreign keys and column updates.
13
+ */
14
+ var SQLiteSQLGenerator = class extends SQLGenerator {
15
+ /**
16
+ * SQLite preprocessing: merge add-foreign-key operations into create-table operations
17
+ * when both exist in the same batch, and add pragma for deferred foreign keys.
18
+ *
19
+ * SQLite requires foreign keys to be defined at table creation time.
20
+ */
21
+ preprocess(operations) {
22
+ if (operations.length === 0) return operations;
23
+ const result = [];
24
+ const createTableIndices = /* @__PURE__ */ new Map();
25
+ const foreignKeysByTable = /* @__PURE__ */ new Map();
26
+ for (const op of operations) if (op.type === "create-table") {
27
+ createTableIndices.set(op.name, result.length);
28
+ result.push(op);
29
+ } else if (op.type === "add-foreign-key") {
30
+ if (!foreignKeysByTable.has(op.table)) foreignKeysByTable.set(op.table, []);
31
+ foreignKeysByTable.get(op.table).push(op);
32
+ } else result.push(op);
33
+ for (const [tableName, fkOps] of foreignKeysByTable.entries()) {
34
+ const createTableIdx = createTableIndices.get(tableName);
35
+ if (createTableIdx !== void 0) {
36
+ const createOp = result[createTableIdx];
37
+ if (createOp.type === "create-table") {
38
+ const metadata = { inlineForeignKeys: fkOps.map((fkOp) => fkOp.value) };
39
+ result[createTableIdx] = {
40
+ ...createOp,
41
+ metadata
42
+ };
43
+ }
44
+ } else result.push(...fkOps);
45
+ }
46
+ return [{
47
+ type: "custom",
48
+ sql: "PRAGMA defer_foreign_keys = ON"
49
+ }, ...result];
50
+ }
51
+ applyAutoIncrement(builder) {
52
+ return builder.autoIncrement();
53
+ }
54
+ getDefaultValue(column) {
55
+ const value = column.default;
56
+ if (!value) return;
57
+ if ("value" in value && value.value !== void 0) return sql.lit(value.value);
58
+ if ("dbSpecial" in value && value.dbSpecial === "now") return sql`CURRENT_TIMESTAMP`;
59
+ if ("runtime" in value) return;
60
+ }
61
+ /**
62
+ * Override create-table to add inline foreign keys from metadata.
63
+ */
64
+ compileCreateTable(operation, mapper) {
65
+ const tableName = this.getTableName(operation.name, mapper);
66
+ let builder = this.db.schema.createTable(tableName);
67
+ for (const col of operation.columns) builder = builder.addColumn(col.name, sql.raw(this.getDBType(col)), (b) => this.buildColumn(col, b));
68
+ const metadata = operation.metadata;
69
+ if (metadata?.inlineForeignKeys) for (const fk of metadata.inlineForeignKeys) builder = builder.addForeignKeyConstraint(fk.name, fk.columns, this.getTableName(fk.referencedTable, mapper), fk.referencedColumns, (cb) => cb.onUpdate("restrict").onDelete("restrict"));
70
+ return builder.compile();
71
+ }
72
+ /**
73
+ * SQLite doesn't support adding foreign keys to existing tables.
74
+ */
75
+ compileAddForeignKey(_operation, _mapper) {
76
+ throw new Error(errors.SQLiteUpdateForeignKeys);
77
+ }
78
+ /**
79
+ * SQLite doesn't support dropping foreign keys.
80
+ */
81
+ compileDropForeignKey(_operation, _mapper) {
82
+ throw new Error(errors.SQLiteUpdateForeignKeys);
83
+ }
84
+ /**
85
+ * SQLite doesn't support updating columns.
86
+ */
87
+ compileUpdateColumn(_tableName, operation) {
88
+ const col = operation.value;
89
+ if (col.role === "external-id" || col.role === "internal-id") throw new Error(errors.IdColumnUpdate);
90
+ throw new Error(errors.SQLiteUpdateColumn);
91
+ }
92
+ };
93
+
94
+ //#endregion
95
+ export { SQLiteSQLGenerator };
96
+ //# sourceMappingURL=sqlite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite.js","names":["result: MigrationOperation[]","metadata: SqliteCreateTableMetadata","builder: CreateTableBuilderAny"],"sources":["../../../../../src/adapters/generic-sql/migration/dialect/sqlite.ts"],"sourcesContent":["import { type ColumnDefinitionBuilder, type CompiledQuery, type RawBuilder, sql } from \"kysely\";\nimport type {\n ColumnInfo,\n ColumnOperation,\n ForeignKeyInfo,\n MigrationOperation,\n} from \"../../../../migration-engine/shared\";\nimport type { TableNameMapper } from \"../../../shared/table-name-mapper\";\nimport { SQLGenerator } from \"../sql-generator\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype CreateTableBuilderAny = any;\n\n/**\n * Metadata attached to create-table operations for inline foreign keys.\n */\ninterface SqliteCreateTableMetadata {\n [key: string]: unknown;\n inlineForeignKeys?: ForeignKeyInfo[];\n}\n\nconst errors = {\n IdColumnUpdate:\n \"ID columns cannot be updated. Not every database supports updating primary keys and often requires workarounds.\",\n SQLiteUpdateColumn: \"SQLite doesn't support updating columns. Recreate the table instead.\",\n SQLiteUpdateForeignKeys:\n \"SQLite doesn't support modifying foreign keys directly. Use `recreate-table` instead.\",\n} as const;\n\n/**\n * SQLite-specific SQL generator.\n * Handles SQLite's limitations around foreign keys and column updates.\n */\nexport class SQLiteSQLGenerator extends SQLGenerator {\n /**\n * SQLite preprocessing: merge add-foreign-key operations into create-table operations\n * when both exist in the same batch, and add pragma for deferred foreign keys.\n *\n * SQLite requires foreign keys to be defined at table creation time.\n */\n override preprocess(operations: MigrationOperation[]): MigrationOperation[] {\n if (operations.length === 0) {\n return operations;\n }\n\n const result: MigrationOperation[] = [];\n const createTableIndices = new Map<string, number>();\n const foreignKeysByTable = new Map<\n string,\n Extract<MigrationOperation, { type: \"add-foreign-key\" }>[]\n >();\n\n // First pass: identify create-table operations and collect foreign keys\n for (const op of operations) {\n if (op.type === \"create-table\") {\n createTableIndices.set(op.name, result.length);\n result.push(op);\n } else if (op.type === \"add-foreign-key\") {\n if (!foreignKeysByTable.has(op.table)) {\n foreignKeysByTable.set(op.table, []);\n }\n foreignKeysByTable.get(op.table)!.push(op);\n } else {\n result.push(op);\n }\n }\n\n // Second pass: attach foreign keys as metadata to create-table ops\n for (const [tableName, fkOps] of foreignKeysByTable.entries()) {\n const createTableIdx = createTableIndices.get(tableName);\n\n if (createTableIdx !== undefined) {\n const createOp = result[createTableIdx];\n if (createOp.type === \"create-table\") {\n const metadata: SqliteCreateTableMetadata = {\n inlineForeignKeys: fkOps.map((fkOp) => fkOp.value),\n };\n result[createTableIdx] = {\n ...createOp,\n metadata,\n };\n }\n } else {\n // Table already exists - keep add-foreign-key operations (will throw error during compile)\n result.push(...fkOps);\n }\n }\n\n // Add pragma at the beginning for deferred foreign key checking\n return [{ type: \"custom\", sql: \"PRAGMA defer_foreign_keys = ON\" }, ...result];\n }\n\n override applyAutoIncrement(builder: ColumnDefinitionBuilder): ColumnDefinitionBuilder {\n return builder.autoIncrement();\n }\n\n override getDefaultValue(column: ColumnInfo): RawBuilder<unknown> | undefined {\n const value = column.default;\n if (!value) {\n return undefined;\n }\n\n if (\"value\" in value && value.value !== undefined) {\n return sql.lit(value.value);\n }\n\n if (\"dbSpecial\" in value && value.dbSpecial === \"now\") {\n return sql`CURRENT_TIMESTAMP`;\n }\n\n // Runtime defaults are handled in application code, not SQL\n if (\"runtime\" in value) {\n return undefined;\n }\n\n return undefined;\n }\n\n /**\n * Override create-table to add inline foreign keys from metadata.\n */\n protected override compileCreateTable(\n operation: Extract<MigrationOperation, { type: \"create-table\" }>,\n mapper?: TableNameMapper,\n ): CompiledQuery {\n const tableName = this.getTableName(operation.name, mapper);\n let builder: CreateTableBuilderAny = this.db.schema.createTable(tableName);\n\n // Add columns\n for (const col of operation.columns) {\n builder = builder.addColumn(\n col.name,\n sql.raw(this.getDBType(col)),\n (b: ColumnDefinitionBuilder) => this.buildColumn(col, b),\n );\n }\n\n // Add inline foreign keys from metadata\n const metadata = operation.metadata as SqliteCreateTableMetadata | undefined;\n if (metadata?.inlineForeignKeys) {\n for (const fk of metadata.inlineForeignKeys) {\n builder = builder.addForeignKeyConstraint(\n fk.name,\n fk.columns,\n this.getTableName(fk.referencedTable, mapper),\n fk.referencedColumns,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (cb: any) => cb.onUpdate(\"restrict\").onDelete(\"restrict\"),\n );\n }\n }\n\n return builder.compile();\n }\n\n /**\n * SQLite doesn't support adding foreign keys to existing tables.\n */\n protected override compileAddForeignKey(\n _operation: Extract<MigrationOperation, { type: \"add-foreign-key\" }>,\n _mapper?: TableNameMapper,\n ): CompiledQuery {\n throw new Error(errors.SQLiteUpdateForeignKeys);\n }\n\n /**\n * SQLite doesn't support dropping foreign keys.\n */\n protected override compileDropForeignKey(\n _operation: Extract<MigrationOperation, { type: \"drop-foreign-key\" }>,\n _mapper?: TableNameMapper,\n ): CompiledQuery {\n throw new Error(errors.SQLiteUpdateForeignKeys);\n }\n\n /**\n * SQLite doesn't support updating columns.\n */\n protected override compileUpdateColumn(\n _tableName: string,\n operation: Extract<ColumnOperation, { type: \"update-column\" }>,\n ): CompiledQuery | CompiledQuery[] {\n const col = operation.value;\n if (col.role === \"external-id\" || col.role === \"internal-id\") {\n throw new Error(errors.IdColumnUpdate);\n }\n throw new Error(errors.SQLiteUpdateColumn);\n }\n}\n"],"mappings":";;;;AAqBA,MAAM,SAAS;CACb,gBACE;CACF,oBAAoB;CACpB,yBACE;CACH;;;;;AAMD,IAAa,qBAAb,cAAwC,aAAa;;;;;;;CAOnD,AAAS,WAAW,YAAwD;AAC1E,MAAI,WAAW,WAAW,EACxB,QAAO;EAGT,MAAMA,SAA+B,EAAE;EACvC,MAAM,qCAAqB,IAAI,KAAqB;EACpD,MAAM,qCAAqB,IAAI,KAG5B;AAGH,OAAK,MAAM,MAAM,WACf,KAAI,GAAG,SAAS,gBAAgB;AAC9B,sBAAmB,IAAI,GAAG,MAAM,OAAO,OAAO;AAC9C,UAAO,KAAK,GAAG;aACN,GAAG,SAAS,mBAAmB;AACxC,OAAI,CAAC,mBAAmB,IAAI,GAAG,MAAM,CACnC,oBAAmB,IAAI,GAAG,OAAO,EAAE,CAAC;AAEtC,sBAAmB,IAAI,GAAG,MAAM,CAAE,KAAK,GAAG;QAE1C,QAAO,KAAK,GAAG;AAKnB,OAAK,MAAM,CAAC,WAAW,UAAU,mBAAmB,SAAS,EAAE;GAC7D,MAAM,iBAAiB,mBAAmB,IAAI,UAAU;AAExD,OAAI,mBAAmB,QAAW;IAChC,MAAM,WAAW,OAAO;AACxB,QAAI,SAAS,SAAS,gBAAgB;KACpC,MAAMC,WAAsC,EAC1C,mBAAmB,MAAM,KAAK,SAAS,KAAK,MAAM,EACnD;AACD,YAAO,kBAAkB;MACvB,GAAG;MACH;MACD;;SAIH,QAAO,KAAK,GAAG,MAAM;;AAKzB,SAAO,CAAC;GAAE,MAAM;GAAU,KAAK;GAAkC,EAAE,GAAG,OAAO;;CAG/E,AAAS,mBAAmB,SAA2D;AACrF,SAAO,QAAQ,eAAe;;CAGhC,AAAS,gBAAgB,QAAqD;EAC5E,MAAM,QAAQ,OAAO;AACrB,MAAI,CAAC,MACH;AAGF,MAAI,WAAW,SAAS,MAAM,UAAU,OACtC,QAAO,IAAI,IAAI,MAAM,MAAM;AAG7B,MAAI,eAAe,SAAS,MAAM,cAAc,MAC9C,QAAO,GAAG;AAIZ,MAAI,aAAa,MACf;;;;;CASJ,AAAmB,mBACjB,WACA,QACe;EACf,MAAM,YAAY,KAAK,aAAa,UAAU,MAAM,OAAO;EAC3D,IAAIC,UAAiC,KAAK,GAAG,OAAO,YAAY,UAAU;AAG1E,OAAK,MAAM,OAAO,UAAU,QAC1B,WAAU,QAAQ,UAChB,IAAI,MACJ,IAAI,IAAI,KAAK,UAAU,IAAI,CAAC,GAC3B,MAA+B,KAAK,YAAY,KAAK,EAAE,CACzD;EAIH,MAAM,WAAW,UAAU;AAC3B,MAAI,UAAU,kBACZ,MAAK,MAAM,MAAM,SAAS,kBACxB,WAAU,QAAQ,wBAChB,GAAG,MACH,GAAG,SACH,KAAK,aAAa,GAAG,iBAAiB,OAAO,EAC7C,GAAG,oBAEF,OAAY,GAAG,SAAS,WAAW,CAAC,SAAS,WAAW,CAC1D;AAIL,SAAO,QAAQ,SAAS;;;;;CAM1B,AAAmB,qBACjB,YACA,SACe;AACf,QAAM,IAAI,MAAM,OAAO,wBAAwB;;;;;CAMjD,AAAmB,sBACjB,YACA,SACe;AACf,QAAM,IAAI,MAAM,OAAO,wBAAwB;;;;;CAMjD,AAAmB,oBACjB,YACA,WACiC;EACjC,MAAM,MAAM,UAAU;AACtB,MAAI,IAAI,SAAS,iBAAiB,IAAI,SAAS,cAC7C,OAAM,IAAI,MAAM,OAAO,eAAe;AAExC,QAAM,IAAI,MAAM,OAAO,mBAAmB"}
@@ -0,0 +1,15 @@
1
+ import { CompiledQuery } from "kysely";
2
+
3
+ //#region src/adapters/generic-sql/migration/executor.d.ts
4
+
5
+ /**
6
+ * Compiled migration containing all SQL statements to execute.
7
+ */
8
+ interface CompiledMigration {
9
+ statements: CompiledQuery[];
10
+ fromVersion: number;
11
+ toVersion: number;
12
+ }
13
+ //#endregion
14
+ export { CompiledMigration };
15
+ //# sourceMappingURL=executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.d.ts","names":[],"sources":["../../../../src/adapters/generic-sql/migration/executor.ts"],"sourcesContent":[],"mappings":";;;;;AAMA;;UAAiB,iBAAA;cACH"}
@@ -0,0 +1,18 @@
1
+ //#region src/adapters/generic-sql/migration/executor.ts
2
+ /**
3
+ * Execute a compiled migration using the provided driver adapter.
4
+ * All statements are executed within a single transaction.
5
+ *
6
+ * @param driver - The SQL driver adapter to execute queries
7
+ * @param migration - The compiled migration containing SQL statements
8
+ */
9
+ async function executeMigration(driver, migration) {
10
+ if (migration.statements.length === 0) return;
11
+ await driver.transaction(async (tx) => {
12
+ for (const statement of migration.statements) await tx.executeQuery(statement);
13
+ });
14
+ }
15
+
16
+ //#endregion
17
+ export { executeMigration };
18
+ //# sourceMappingURL=executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.js","names":[],"sources":["../../../../src/adapters/generic-sql/migration/executor.ts"],"sourcesContent":["import type { CompiledQuery } from \"kysely\";\nimport type { SqlDriverAdapter } from \"../../../sql-driver/sql-driver-adapter\";\n\n/**\n * Compiled migration containing all SQL statements to execute.\n */\nexport interface CompiledMigration {\n statements: CompiledQuery[];\n fromVersion: number;\n toVersion: number;\n}\n\n/**\n * Execute a compiled migration using the provided driver adapter.\n * All statements are executed within a single transaction.\n *\n * @param driver - The SQL driver adapter to execute queries\n * @param migration - The compiled migration containing SQL statements\n */\nexport async function executeMigration(\n driver: SqlDriverAdapter,\n migration: CompiledMigration,\n): Promise<void> {\n if (migration.statements.length === 0) {\n return;\n }\n\n await driver.transaction(async (tx) => {\n for (const statement of migration.statements) {\n await tx.executeQuery(statement);\n }\n });\n}\n"],"mappings":";;;;;;;;AAmBA,eAAsB,iBACpB,QACA,WACe;AACf,KAAI,UAAU,WAAW,WAAW,EAClC;AAGF,OAAM,OAAO,YAAY,OAAO,OAAO;AACrC,OAAK,MAAM,aAAa,UAAU,WAChC,OAAM,GAAG,aAAa,UAAU;GAElC"}
@@ -0,0 +1,66 @@
1
+ import { SqlDriverAdapter } from "../../../sql-driver/sql-driver-adapter.js";
2
+ import { CompiledMigration } from "./executor.js";
3
+
4
+ //#region src/adapters/generic-sql/migration/prepared-migrations.d.ts
5
+
6
+ /**
7
+ * Options for executing a migration.
8
+ */
9
+ interface ExecuteOptions {
10
+ /**
11
+ * Whether to automatically update the schema version in the database after migration.
12
+ * If not specified, uses the value from PreparedMigrationsConfig.
13
+ */
14
+ updateVersionInMigration?: boolean;
15
+ }
16
+ /**
17
+ * Interface for preparing and executing migrations.
18
+ * Provides a clean separation between compilation (SQL generation) and execution.
19
+ */
20
+ interface PreparedMigrations {
21
+ /**
22
+ * Execute migration from one version to another.
23
+ * This performs all three phases:
24
+ * - Phase 1: schema → operations
25
+ * - Phase 2: operations → SQL
26
+ * - Phase 3: SQL → database
27
+ *
28
+ * @param fromVersion - Current database version (0 for new database)
29
+ * @param toVersion - Target schema version (defaults to schema.version)
30
+ * @param options - Optional execution options (overrides config defaults)
31
+ */
32
+ execute(fromVersion: number, toVersion?: number, options?: ExecuteOptions): Promise<void>;
33
+ /**
34
+ * Execute migration using a specific driver.
35
+ * Useful for testing or when you need to use a different driver than the one provided in config.
36
+ *
37
+ * @param driver - SQL driver to use for execution
38
+ * @param fromVersion - Current database version (0 for new database)
39
+ * @param toVersion - Target schema version (defaults to schema.version)
40
+ * @param options - Optional execution options (overrides config defaults)
41
+ */
42
+ executeWithDriver(driver: SqlDriverAdapter, fromVersion: number, toVersion?: number, options?: ExecuteOptions): Promise<void>;
43
+ /**
44
+ * Get the SQL for a migration from one version to another without executing it.
45
+ * Useful for generating migration files or previewing changes.
46
+ *
47
+ * @param fromVersion - Current database version (0 for new database)
48
+ * @param toVersion - Target schema version (defaults to schema.version)
49
+ * @param options - Optional execution options (affects version update SQL)
50
+ * @returns SQL string for the migration
51
+ */
52
+ getSQL(fromVersion: number, toVersion?: number, options?: ExecuteOptions): string;
53
+ /**
54
+ * Get the compiled migration for a version range.
55
+ * Returns both the SQL statements and the version information.
56
+ *
57
+ * @param fromVersion - Current database version (0 for new database)
58
+ * @param toVersion - Target schema version (defaults to schema.version)
59
+ * @param options - Optional execution options (affects version update SQL)
60
+ * @returns Compiled migration with statements and version info
61
+ */
62
+ compile(fromVersion: number, toVersion?: number, options?: ExecuteOptions): CompiledMigration;
63
+ }
64
+ //#endregion
65
+ export { PreparedMigrations };
66
+ //# sourceMappingURL=prepared-migrations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prepared-migrations.d.ts","names":[],"sources":["../../../../src/adapters/generic-sql/migration/prepared-migrations.ts"],"sourcesContent":[],"mappings":";;;;;AA2BA;;;AAwBY,UApCK,cAAA,CAoCL;EAGE;;;;EAuBgE,wBAAA,CAAA,EAAA,OAAA;;;;;;UAlD7D,kBAAA;;;;;;;;;;;;6DAY4C,iBAAiB;;;;;;;;;;4BAYlE,qEAGE,iBACT;;;;;;;;;;4DAWuD;;;;;;;;;;6DAWC,iBAAiB"}
@@ -0,0 +1,68 @@
1
+ import { generateMigrationFromSchema } from "../../../migration-engine/auto-from-schema.js";
2
+ import { createColdKysely } from "./cold-kysely.js";
3
+ import "./sql-generator.js";
4
+ import { SQLiteSQLGenerator } from "./dialect/sqlite.js";
5
+ import { PostgresSQLGenerator } from "./dialect/postgres.js";
6
+ import { MySQLSQLGenerator } from "./dialect/mysql.js";
7
+ import { executeMigration } from "./executor.js";
8
+
9
+ //#region src/adapters/generic-sql/migration/prepared-migrations.ts
10
+ /**
11
+ * Create a PreparedMigrations instance for a schema and namespace.
12
+ */
13
+ function createPreparedMigrations(config) {
14
+ const { schema, namespace, database, driver, updateVersionInMigration: defaultUpdateVersion = true } = config;
15
+ const generator = createSQLGenerator(database, createColdKysely(database));
16
+ /**
17
+ * Internal method to compile a migration for a given version range.
18
+ */
19
+ function compile(fromVersion, toVersion, updateVersionInMigration) {
20
+ if (fromVersion < 0) throw new Error(`fromVersion cannot be negative: ${fromVersion}`);
21
+ if (toVersion < 0) throw new Error(`toVersion cannot be negative: ${toVersion}`);
22
+ if (toVersion < fromVersion) throw new Error(`Cannot migrate backwards: fromVersion (${fromVersion}) > toVersion (${toVersion})`);
23
+ if (toVersion > schema.version) throw new Error(`toVersion (${toVersion}) exceeds schema version (${schema.version})`);
24
+ const operations = generateMigrationFromSchema(schema, fromVersion, toVersion);
25
+ const statements = generator.compile(operations, config.mapper);
26
+ if (updateVersionInMigration && toVersion !== fromVersion) {
27
+ const versionUpdate = generator.generateVersionUpdateSQL(namespace, fromVersion, toVersion);
28
+ statements.push(versionUpdate);
29
+ }
30
+ return {
31
+ statements,
32
+ fromVersion,
33
+ toVersion
34
+ };
35
+ }
36
+ return {
37
+ async execute(fromVersion, toVersion, options) {
38
+ if (!driver) throw new Error("Driver not provided. Cannot execute migration. Use `executeWithDriver` instead.");
39
+ return this.executeWithDriver(driver, fromVersion, toVersion, options);
40
+ },
41
+ async executeWithDriver(driverToUse, fromVersion, toVersion, options) {
42
+ const updateVersionInMigration = options?.updateVersionInMigration ?? defaultUpdateVersion;
43
+ await executeMigration(driverToUse, compile(fromVersion, toVersion ?? schema.version, updateVersionInMigration));
44
+ },
45
+ getSQL(fromVersion, toVersion, options) {
46
+ const updateVersionInMigration = options?.updateVersionInMigration ?? defaultUpdateVersion;
47
+ return compile(fromVersion, toVersion ?? schema.version, updateVersionInMigration).statements.map((stmt) => stmt.sql + ";").join("\n\n");
48
+ },
49
+ compile(fromVersion, toVersion, options) {
50
+ const updateVersionInMigration = options?.updateVersionInMigration ?? defaultUpdateVersion;
51
+ return compile(fromVersion, toVersion ?? schema.version, updateVersionInMigration);
52
+ }
53
+ };
54
+ }
55
+ /**
56
+ * Create the appropriate SQL generator for a database type.
57
+ */
58
+ function createSQLGenerator(database, coldKysely) {
59
+ switch (database) {
60
+ case "sqlite": return new SQLiteSQLGenerator(coldKysely, database);
61
+ case "postgresql": return new PostgresSQLGenerator(coldKysely, database);
62
+ case "mysql": return new MySQLSQLGenerator(coldKysely, database);
63
+ }
64
+ }
65
+
66
+ //#endregion
67
+ export { createPreparedMigrations };
68
+ //# sourceMappingURL=prepared-migrations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prepared-migrations.js","names":[],"sources":["../../../../src/adapters/generic-sql/migration/prepared-migrations.ts"],"sourcesContent":["import type { AnySchema } from \"../../../schema/create\";\nimport type { SqlDriverAdapter } from \"../../../sql-driver/sql-driver-adapter\";\nimport type { TableNameMapper } from \"../../shared/table-name-mapper\";\nimport { generateMigrationFromSchema } from \"../../../migration-engine/auto-from-schema\";\nimport { createColdKysely } from \"./cold-kysely\";\nimport { type SQLGenerator } from \"./sql-generator\";\nimport { SQLiteSQLGenerator } from \"./dialect/sqlite\";\nimport { PostgresSQLGenerator } from \"./dialect/postgres\";\nimport { MySQLSQLGenerator } from \"./dialect/mysql\";\nimport { executeMigration, type CompiledMigration } from \"./executor\";\nimport type { SupportedDatabase } from \"../driver-config\";\nimport type { Kysely } from \"kysely\";\n/**\n * Options for executing a migration.\n */\nexport interface ExecuteOptions {\n /**\n * Whether to automatically update the schema version in the database after migration.\n * If not specified, uses the value from PreparedMigrationsConfig.\n */\n updateVersionInMigration?: boolean;\n}\n\n/**\n * Interface for preparing and executing migrations.\n * Provides a clean separation between compilation (SQL generation) and execution.\n */\nexport interface PreparedMigrations {\n /**\n * Execute migration from one version to another.\n * This performs all three phases:\n * - Phase 1: schema → operations\n * - Phase 2: operations → SQL\n * - Phase 3: SQL → database\n *\n * @param fromVersion - Current database version (0 for new database)\n * @param toVersion - Target schema version (defaults to schema.version)\n * @param options - Optional execution options (overrides config defaults)\n */\n execute(fromVersion: number, toVersion?: number, options?: ExecuteOptions): Promise<void>;\n\n /**\n * Execute migration using a specific driver.\n * Useful for testing or when you need to use a different driver than the one provided in config.\n *\n * @param driver - SQL driver to use for execution\n * @param fromVersion - Current database version (0 for new database)\n * @param toVersion - Target schema version (defaults to schema.version)\n * @param options - Optional execution options (overrides config defaults)\n */\n executeWithDriver(\n driver: SqlDriverAdapter,\n fromVersion: number,\n toVersion?: number,\n options?: ExecuteOptions,\n ): Promise<void>;\n\n /**\n * Get the SQL for a migration from one version to another without executing it.\n * Useful for generating migration files or previewing changes.\n *\n * @param fromVersion - Current database version (0 for new database)\n * @param toVersion - Target schema version (defaults to schema.version)\n * @param options - Optional execution options (affects version update SQL)\n * @returns SQL string for the migration\n */\n getSQL(fromVersion: number, toVersion?: number, options?: ExecuteOptions): string;\n\n /**\n * Get the compiled migration for a version range.\n * Returns both the SQL statements and the version information.\n *\n * @param fromVersion - Current database version (0 for new database)\n * @param toVersion - Target schema version (defaults to schema.version)\n * @param options - Optional execution options (affects version update SQL)\n * @returns Compiled migration with statements and version info\n */\n compile(fromVersion: number, toVersion?: number, options?: ExecuteOptions): CompiledMigration;\n}\n\n/**\n * Configuration for creating a PreparedMigrations instance.\n */\nexport interface PreparedMigrationsConfig {\n schema: AnySchema;\n namespace: string;\n database: SupportedDatabase;\n mapper?: TableNameMapper;\n driver?: SqlDriverAdapter;\n /**\n * Whether to automatically update the schema version in the database after migration.\n * Defaults to true. Can be overridden per execution via ExecuteOptions.\n */\n updateVersionInMigration?: boolean;\n}\n\n/**\n * Create a PreparedMigrations instance for a schema and namespace.\n */\nexport function createPreparedMigrations(config: PreparedMigrationsConfig): PreparedMigrations {\n const {\n schema,\n namespace,\n database,\n driver,\n updateVersionInMigration: defaultUpdateVersion = true,\n } = config;\n\n // Create the cold Kysely instance for SQL generation\n const coldKysely = createColdKysely(database);\n\n // Create the appropriate SQL generator for the database\n const generator = createSQLGenerator(database, coldKysely);\n\n /**\n * Internal method to compile a migration for a given version range.\n */\n function compile(\n fromVersion: number,\n toVersion: number,\n updateVersionInMigration: boolean,\n ): CompiledMigration {\n // Validate version numbers\n if (fromVersion < 0) {\n throw new Error(`fromVersion cannot be negative: ${fromVersion}`);\n }\n if (toVersion < 0) {\n throw new Error(`toVersion cannot be negative: ${toVersion}`);\n }\n if (toVersion < fromVersion) {\n throw new Error(\n `Cannot migrate backwards: fromVersion (${fromVersion}) > toVersion (${toVersion})`,\n );\n }\n if (toVersion > schema.version) {\n throw new Error(`toVersion (${toVersion}) exceeds schema version (${schema.version})`);\n }\n\n // Phase 1: Generate migration operations from schema\n const operations = generateMigrationFromSchema(schema, fromVersion, toVersion);\n\n // Phase 2: Compile operations to SQL\n const statements = generator.compile(operations, config.mapper);\n\n // Add version update SQL if requested\n if (updateVersionInMigration && toVersion !== fromVersion) {\n const versionUpdate = generator.generateVersionUpdateSQL(namespace, fromVersion, toVersion);\n statements.push(versionUpdate);\n }\n\n return {\n statements,\n fromVersion,\n toVersion,\n };\n }\n\n return {\n async execute(fromVersion, toVersion, options) {\n if (!driver) {\n throw new Error(\n \"Driver not provided. Cannot execute migration. Use `executeWithDriver` instead.\",\n );\n }\n\n return this.executeWithDriver(driver, fromVersion, toVersion, options);\n },\n\n async executeWithDriver(driverToUse, fromVersion, toVersion, options) {\n // Use option if provided, otherwise use config default\n const updateVersionInMigration = options?.updateVersionInMigration ?? defaultUpdateVersion;\n const targetVersion = toVersion ?? schema.version;\n\n // Compile the migration (this will validate the version numbers)\n const migration = compile(fromVersion, targetVersion, updateVersionInMigration);\n\n // Execute the migration\n await executeMigration(driverToUse, migration);\n },\n\n getSQL(fromVersion, toVersion, options) {\n const updateVersionInMigration = options?.updateVersionInMigration ?? defaultUpdateVersion;\n const targetVersion = toVersion ?? schema.version;\n\n const migration = compile(fromVersion, targetVersion, updateVersionInMigration);\n return migration.statements.map((stmt) => stmt.sql + \";\").join(\"\\n\\n\");\n },\n\n compile(fromVersion, toVersion, options) {\n const updateVersionInMigration = options?.updateVersionInMigration ?? defaultUpdateVersion;\n const targetVersion = toVersion ?? schema.version;\n\n return compile(fromVersion, targetVersion, updateVersionInMigration);\n },\n };\n}\n\n/**\n * Create the appropriate SQL generator for a database type.\n */\nfunction createSQLGenerator(\n database: SupportedDatabase,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n coldKysely: Kysely<any>,\n): SQLGenerator {\n switch (database) {\n case \"sqlite\":\n return new SQLiteSQLGenerator(coldKysely, database);\n case \"postgresql\":\n return new PostgresSQLGenerator(coldKysely, database);\n case \"mysql\":\n return new MySQLSQLGenerator(coldKysely, database);\n }\n}\n"],"mappings":";;;;;;;;;;;;AAmGA,SAAgB,yBAAyB,QAAsD;CAC7F,MAAM,EACJ,QACA,WACA,UACA,QACA,0BAA0B,uBAAuB,SAC/C;CAMJ,MAAM,YAAY,mBAAmB,UAHlB,iBAAiB,SAAS,CAGa;;;;CAK1D,SAAS,QACP,aACA,WACA,0BACmB;AAEnB,MAAI,cAAc,EAChB,OAAM,IAAI,MAAM,mCAAmC,cAAc;AAEnE,MAAI,YAAY,EACd,OAAM,IAAI,MAAM,iCAAiC,YAAY;AAE/D,MAAI,YAAY,YACd,OAAM,IAAI,MACR,0CAA0C,YAAY,iBAAiB,UAAU,GAClF;AAEH,MAAI,YAAY,OAAO,QACrB,OAAM,IAAI,MAAM,cAAc,UAAU,4BAA4B,OAAO,QAAQ,GAAG;EAIxF,MAAM,aAAa,4BAA4B,QAAQ,aAAa,UAAU;EAG9E,MAAM,aAAa,UAAU,QAAQ,YAAY,OAAO,OAAO;AAG/D,MAAI,4BAA4B,cAAc,aAAa;GACzD,MAAM,gBAAgB,UAAU,yBAAyB,WAAW,aAAa,UAAU;AAC3F,cAAW,KAAK,cAAc;;AAGhC,SAAO;GACL;GACA;GACA;GACD;;AAGH,QAAO;EACL,MAAM,QAAQ,aAAa,WAAW,SAAS;AAC7C,OAAI,CAAC,OACH,OAAM,IAAI,MACR,kFACD;AAGH,UAAO,KAAK,kBAAkB,QAAQ,aAAa,WAAW,QAAQ;;EAGxE,MAAM,kBAAkB,aAAa,aAAa,WAAW,SAAS;GAEpE,MAAM,2BAA2B,SAAS,4BAA4B;AAOtE,SAAM,iBAAiB,aAHL,QAAQ,aAHJ,aAAa,OAAO,SAGY,yBAAyB,CAGjC;;EAGhD,OAAO,aAAa,WAAW,SAAS;GACtC,MAAM,2BAA2B,SAAS,4BAA4B;AAItE,UADkB,QAAQ,aAFJ,aAAa,OAAO,SAEY,yBAAyB,CAC9D,WAAW,KAAK,SAAS,KAAK,MAAM,IAAI,CAAC,KAAK,OAAO;;EAGxE,QAAQ,aAAa,WAAW,SAAS;GACvC,MAAM,2BAA2B,SAAS,4BAA4B;AAGtE,UAAO,QAAQ,aAFO,aAAa,OAAO,SAEC,yBAAyB;;EAEvE;;;;;AAMH,SAAS,mBACP,UAEA,YACc;AACd,SAAQ,UAAR;EACE,KAAK,SACH,QAAO,IAAI,mBAAmB,YAAY,SAAS;EACrD,KAAK,aACH,QAAO,IAAI,qBAAqB,YAAY,SAAS;EACvD,KAAK,QACH,QAAO,IAAI,kBAAkB,YAAY,SAAS"}