@fragno-dev/db 0.1.15 → 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 (407) hide show
  1. package/.turbo/turbo-build.log +242 -179
  2. package/CHANGELOG.md +23 -0
  3. package/README.md +123 -8
  4. package/dist/adapters/adapters.d.ts +5 -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 -21
  8. package/dist/adapters/drizzle/drizzle-adapter.d.ts.map +1 -1
  9. package/dist/adapters/drizzle/drizzle-adapter.js +7 -54
  10. package/dist/adapters/drizzle/drizzle-adapter.js.map +1 -1
  11. package/dist/adapters/drizzle/generate.d.ts +3 -0
  12. package/dist/adapters/drizzle/generate.d.ts.map +1 -1
  13. package/dist/adapters/drizzle/generate.js +36 -28
  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 -18
  68. package/dist/adapters/kysely/kysely-adapter.d.ts.map +1 -1
  69. package/dist/adapters/kysely/kysely-adapter.js +6 -165
  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} +47 -61
  72. package/dist/adapters/shared/from-unit-of-work-compiler.js.map +1 -0
  73. package/dist/adapters/{drizzle/shared.d.ts → shared/table-name-mapper.d.ts} +2 -4
  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 +53 -19
  80. package/dist/db-fragment-definition-builder.d.ts.map +1 -1
  81. package/dist/db-fragment-definition-builder.js +89 -19
  82. package/dist/db-fragment-definition-builder.js.map +1 -1
  83. package/dist/fragments/internal-fragment.d.ts +39 -5
  84. package/dist/fragments/internal-fragment.d.ts.map +1 -1
  85. package/dist/fragments/internal-fragment.js +82 -10
  86. package/dist/fragments/internal-fragment.js.map +1 -1
  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 +23 -61
  94. package/dist/migration-engine/generation-engine.js.map +1 -1
  95. package/dist/mod.d.ts +34 -10
  96. package/dist/mod.d.ts.map +1 -1
  97. package/dist/mod.js +47 -16
  98. package/dist/mod.js.map +1 -1
  99. package/dist/node_modules/.pnpm/{rou3@0.7.8 → rou3@0.7.10}/node_modules/rou3/dist/index.js +1 -1
  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/fragment-instantiator.js +69 -31
  102. package/dist/packages/fragno/dist/api/fragment-instantiator.js.map +1 -1
  103. package/dist/query/column-defaults.js +27 -0
  104. package/dist/query/column-defaults.js.map +1 -0
  105. package/dist/query/cursor.d.ts +4 -4
  106. package/dist/query/cursor.d.ts.map +1 -1
  107. package/dist/query/cursor.js +8 -6
  108. package/dist/query/cursor.js.map +1 -1
  109. package/dist/query/orm/orm.d.ts +1 -1
  110. package/dist/query/orm/orm.js.map +1 -1
  111. package/dist/query/serialize/create-sql-serializer.js +30 -0
  112. package/dist/query/serialize/create-sql-serializer.js.map +1 -0
  113. package/dist/query/serialize/dialect/mysql-serializer.js +87 -0
  114. package/dist/query/serialize/dialect/mysql-serializer.js.map +1 -0
  115. package/dist/query/serialize/dialect/postgres-serializer.js +80 -0
  116. package/dist/query/serialize/dialect/postgres-serializer.js.map +1 -0
  117. package/dist/query/serialize/dialect/sqlite-serializer.js +93 -0
  118. package/dist/query/serialize/dialect/sqlite-serializer.js.map +1 -0
  119. package/dist/query/serialize/sql-serializer.js +67 -0
  120. package/dist/query/serialize/sql-serializer.js.map +1 -0
  121. package/dist/query/{query.d.ts → simple-query-interface.d.ts} +5 -5
  122. package/dist/query/simple-query-interface.d.ts.map +1 -0
  123. package/dist/query/{execute-unit-of-work.d.ts → unit-of-work/execute-unit-of-work.d.ts} +13 -3
  124. package/dist/query/unit-of-work/execute-unit-of-work.d.ts.map +1 -0
  125. package/dist/query/{execute-unit-of-work.js → unit-of-work/execute-unit-of-work.js} +17 -4
  126. package/dist/query/unit-of-work/execute-unit-of-work.js.map +1 -0
  127. package/dist/query/{retry-policy.d.ts → unit-of-work/retry-policy.d.ts} +1 -1
  128. package/dist/query/unit-of-work/retry-policy.d.ts.map +1 -0
  129. package/dist/query/{retry-policy.js → unit-of-work/retry-policy.js} +1 -1
  130. package/dist/query/unit-of-work/retry-policy.js.map +1 -0
  131. package/dist/query/{unit-of-work.d.ts → unit-of-work/unit-of-work.d.ts} +51 -18
  132. package/dist/query/unit-of-work/unit-of-work.d.ts.map +1 -0
  133. package/dist/query/{unit-of-work.js → unit-of-work/unit-of-work.js} +58 -11
  134. package/dist/query/unit-of-work/unit-of-work.js.map +1 -0
  135. package/dist/query/value-decoding.js +71 -0
  136. package/dist/query/value-decoding.js.map +1 -0
  137. package/dist/query/value-encoding.js +124 -0
  138. package/dist/query/value-encoding.js.map +1 -0
  139. package/dist/schema/create.d.ts +3 -0
  140. package/dist/schema/create.d.ts.map +1 -1
  141. package/dist/schema/create.js +4 -0
  142. package/dist/schema/create.js.map +1 -1
  143. package/dist/schema/type-conversion/create-sql-type-mapper.js +29 -0
  144. package/dist/schema/type-conversion/create-sql-type-mapper.js.map +1 -0
  145. package/dist/schema/type-conversion/dialect/mysql.js +57 -0
  146. package/dist/schema/type-conversion/dialect/mysql.js.map +1 -0
  147. package/dist/schema/type-conversion/dialect/postgres.js +56 -0
  148. package/dist/schema/type-conversion/dialect/postgres.js.map +1 -0
  149. package/dist/schema/type-conversion/dialect/sqlite.js +52 -0
  150. package/dist/schema/type-conversion/dialect/sqlite.js.map +1 -0
  151. package/dist/schema/type-conversion/type-mapping.js +63 -0
  152. package/dist/schema/type-conversion/type-mapping.js.map +1 -0
  153. package/dist/sql-driver/connection/connection-provider.d.ts +13 -0
  154. package/dist/sql-driver/connection/connection-provider.d.ts.map +1 -0
  155. package/dist/sql-driver/connection/connection-provider.js +19 -0
  156. package/dist/sql-driver/connection/connection-provider.js.map +1 -0
  157. package/dist/sql-driver/connection/single-connection-provider.js +23 -0
  158. package/dist/sql-driver/connection/single-connection-provider.js.map +1 -0
  159. package/dist/sql-driver/dialect-adapter/dialect-adapter.d.ts +7 -0
  160. package/dist/sql-driver/dialect-adapter/dialect-adapter.d.ts.map +1 -0
  161. package/dist/sql-driver/dialects/dialects.d.ts +2 -0
  162. package/dist/sql-driver/dialects/dialects.js +3 -0
  163. package/dist/sql-driver/dialects/durable-object-dialect.d.ts +72 -0
  164. package/dist/sql-driver/dialects/durable-object-dialect.d.ts.map +1 -0
  165. package/dist/sql-driver/dialects/durable-object-dialect.js +130 -0
  166. package/dist/sql-driver/dialects/durable-object-dialect.js.map +1 -0
  167. package/dist/sql-driver/driver/runtime-driver.d.ts +23 -0
  168. package/dist/sql-driver/driver/runtime-driver.d.ts.map +1 -0
  169. package/dist/sql-driver/driver/runtime-driver.js +56 -0
  170. package/dist/sql-driver/driver/runtime-driver.js.map +1 -0
  171. package/dist/sql-driver/query-executor/default-query-executor.js +26 -0
  172. package/dist/sql-driver/query-executor/default-query-executor.js.map +1 -0
  173. package/dist/sql-driver/query-executor/plugin.d.ts +17 -0
  174. package/dist/sql-driver/query-executor/plugin.d.ts.map +1 -0
  175. package/dist/sql-driver/query-executor/query-executor-base.js +25 -0
  176. package/dist/sql-driver/query-executor/query-executor-base.js.map +1 -0
  177. package/dist/sql-driver/query-executor/query-executor.d.ts +36 -0
  178. package/dist/sql-driver/query-executor/query-executor.d.ts.map +1 -0
  179. package/dist/sql-driver/sql-driver-adapter.d.ts +29 -0
  180. package/dist/sql-driver/sql-driver-adapter.d.ts.map +1 -0
  181. package/dist/sql-driver/sql-driver-adapter.js +68 -0
  182. package/dist/sql-driver/sql-driver-adapter.js.map +1 -0
  183. package/dist/sql-driver/sql-driver.d.ts +38 -0
  184. package/dist/sql-driver/sql-driver.d.ts.map +1 -0
  185. package/dist/sql-driver/sql-driver.js +1 -0
  186. package/dist/sql-driver/sql.js +50 -0
  187. package/dist/sql-driver/sql.js.map +1 -0
  188. package/dist/with-database.d.ts +6 -2
  189. package/dist/with-database.d.ts.map +1 -1
  190. package/dist/with-database.js +1 -1
  191. package/dist/with-database.js.map +1 -1
  192. package/package.json +37 -10
  193. package/src/adapters/adapters.ts +8 -5
  194. package/src/adapters/drizzle/drizzle-adapter-pglite.test.ts +60 -169
  195. package/src/adapters/drizzle/{drizzle-adapter-sqlite.test.ts → drizzle-adapter-sqlite3.test.ts} +31 -55
  196. package/src/adapters/drizzle/drizzle-adapter.ts +15 -107
  197. package/src/adapters/drizzle/generate.test.ts +2 -2
  198. package/src/adapters/drizzle/generate.ts +78 -34
  199. package/src/adapters/drizzle/migrate-drizzle.test.ts +19 -0
  200. package/src/adapters/drizzle/shared.ts +0 -34
  201. package/src/adapters/drizzle/test-utils.ts +3 -3
  202. package/src/adapters/generic-sql/README.md +14 -0
  203. package/src/adapters/generic-sql/driver-config.ts +144 -0
  204. package/src/adapters/generic-sql/generic-sql-adapter.test.ts +50 -0
  205. package/src/adapters/generic-sql/generic-sql-adapter.ts +146 -0
  206. package/src/adapters/generic-sql/generic-sql-uow-executor.ts +130 -0
  207. package/src/adapters/generic-sql/migration/cold-kysely.ts +55 -0
  208. package/src/adapters/{kysely/migration/execute-mysql.test.ts → generic-sql/migration/dialect/mysql.test.ts} +342 -484
  209. package/src/adapters/generic-sql/migration/dialect/mysql.ts +104 -0
  210. package/src/adapters/generic-sql/migration/dialect/postgres.test.ts +1008 -0
  211. package/src/adapters/generic-sql/migration/dialect/postgres.ts +113 -0
  212. package/src/adapters/{kysely/migration/execute-sqlite.test.ts → generic-sql/migration/dialect/sqlite.test.ts} +307 -510
  213. package/src/adapters/generic-sql/migration/dialect/sqlite.ts +189 -0
  214. package/src/adapters/generic-sql/migration/executor.ts +33 -0
  215. package/src/adapters/generic-sql/migration/prepared-migrations.test.ts +661 -0
  216. package/src/adapters/generic-sql/migration/prepared-migrations.ts +214 -0
  217. package/src/adapters/generic-sql/migration/sql-generator.ts +413 -0
  218. package/src/adapters/generic-sql/query/create-sql-query-compiler.ts +36 -0
  219. package/src/adapters/generic-sql/query/cursor-utils.ts +56 -0
  220. package/src/adapters/generic-sql/query/dialect/mysql.ts +34 -0
  221. package/src/adapters/generic-sql/query/dialect/postgres.ts +32 -0
  222. package/src/adapters/generic-sql/query/dialect/sqlite.ts +32 -0
  223. package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.test.ts +1568 -0
  224. package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.ts +314 -0
  225. package/src/adapters/generic-sql/query/select-builder.test.ts +256 -0
  226. package/src/adapters/generic-sql/query/select-builder.ts +137 -0
  227. package/src/adapters/generic-sql/query/sql-query-compiler.test.ts +195 -0
  228. package/src/adapters/generic-sql/query/sql-query-compiler.ts +367 -0
  229. package/src/adapters/generic-sql/query/where-builder.test.ts +744 -0
  230. package/src/adapters/generic-sql/query/where-builder.ts +211 -0
  231. package/src/adapters/generic-sql/result-interpreter.ts +102 -0
  232. package/src/adapters/generic-sql/test/generic-drizzle-adapter-sqlite3.test.ts +899 -0
  233. package/src/adapters/generic-sql/uow-decoder.test.ts +399 -0
  234. package/src/adapters/generic-sql/uow-decoder.ts +152 -0
  235. package/src/adapters/generic-sql/uow-encoder.test.ts +183 -0
  236. package/src/adapters/generic-sql/uow-encoder.ts +131 -0
  237. package/src/adapters/kysely/kysely-adapter-pglite.test.ts +26 -76
  238. package/src/adapters/kysely/{kysely-adapter-sqlite.test.ts → kysely-adapter-sqlocal.test.ts} +76 -17
  239. package/src/adapters/kysely/kysely-adapter.ts +10 -250
  240. package/src/adapters/{drizzle/drizzle-query.ts → shared/from-unit-of-work-compiler.ts} +110 -104
  241. package/src/adapters/shared/table-name-mapper.ts +50 -0
  242. package/src/adapters/shared/uow-operation-compiler.ts +211 -0
  243. package/src/db-fragment-definition-builder.test.ts +2 -2
  244. package/src/db-fragment-definition-builder.ts +281 -50
  245. package/src/db-fragment-instantiator.test.ts +78 -2
  246. package/src/db-fragment-integration.test.ts +14 -16
  247. package/src/fragments/internal-fragment.test.ts +434 -45
  248. package/src/fragments/internal-fragment.ts +184 -20
  249. package/src/hooks/hooks.test.ts +575 -0
  250. package/src/hooks/hooks.ts +179 -0
  251. package/src/migration-engine/generation-engine.test.ts +44 -54
  252. package/src/migration-engine/generation-engine.ts +48 -94
  253. package/src/mod.ts +117 -29
  254. package/src/query/column-defaults.ts +49 -0
  255. package/src/query/cursor.test.ts +31 -6
  256. package/src/query/cursor.ts +11 -7
  257. package/src/query/orm/orm.ts +1 -1
  258. package/src/query/query-type.test.ts +9 -9
  259. package/src/query/serialize/create-sql-serializer.ts +34 -0
  260. package/src/query/serialize/dialect/mysql-serializer.ts +142 -0
  261. package/src/query/serialize/dialect/postgres-serializer.ts +129 -0
  262. package/src/query/serialize/dialect/sqlite-serializer.test.ts +251 -0
  263. package/src/query/serialize/dialect/sqlite-serializer.ts +156 -0
  264. package/src/query/serialize/sql-serializer.ts +143 -0
  265. package/src/query/{query.ts → simple-query-interface.ts} +2 -2
  266. package/src/query/{execute-unit-of-work.test.ts → unit-of-work/execute-unit-of-work.test.ts} +16 -16
  267. package/src/query/{execute-unit-of-work.ts → unit-of-work/execute-unit-of-work.ts} +49 -8
  268. package/src/query/{unit-of-work-coordinator.test.ts → unit-of-work/unit-of-work-coordinator.test.ts} +41 -43
  269. package/src/query/{unit-of-work-types.test.ts → unit-of-work/unit-of-work-types.test.ts} +5 -3
  270. package/src/query/{unit-of-work.test.ts → unit-of-work/unit-of-work.test.ts} +100 -9
  271. package/src/query/{unit-of-work.ts → unit-of-work/unit-of-work.ts} +135 -32
  272. package/src/query/{result-transform.test.ts → value-decoding.test.ts} +45 -427
  273. package/src/query/value-decoding.ts +113 -0
  274. package/src/query/value-encoding.test.ts +390 -0
  275. package/src/query/value-encoding.ts +168 -0
  276. package/src/schema/create.test.ts +5 -1
  277. package/src/schema/create.ts +5 -0
  278. package/src/schema/serialize.test.ts +165 -407
  279. package/src/schema/type-conversion/create-sql-type-mapper.ts +28 -0
  280. package/src/schema/type-conversion/dialect/mysql.ts +64 -0
  281. package/src/schema/type-conversion/dialect/postgres.ts +62 -0
  282. package/src/schema/type-conversion/dialect/sqlite.ts +63 -0
  283. package/src/schema/type-conversion/type-mapping.test.ts +137 -0
  284. package/src/schema/type-conversion/type-mapping.ts +153 -0
  285. package/src/shared/connection-pool.ts +5 -5
  286. package/src/sql-driver/better-sqlite3.test.ts +126 -0
  287. package/src/sql-driver/connection/connection-provider.ts +27 -0
  288. package/src/sql-driver/connection/single-connection-provider.ts +42 -0
  289. package/src/sql-driver/dialect-adapter/dialect-adapter.ts +9 -0
  290. package/src/sql-driver/dialect-adapter/sqlite-dialect-adapter.ts +7 -0
  291. package/src/sql-driver/dialects/dialects.ts +1 -0
  292. package/src/sql-driver/dialects/durable-object-dialect.ts +260 -0
  293. package/src/sql-driver/driver/runtime-driver.ts +91 -0
  294. package/src/sql-driver/query-executor/default-query-executor.ts +38 -0
  295. package/src/sql-driver/query-executor/plugin.ts +22 -0
  296. package/src/sql-driver/query-executor/query-executor-base.ts +53 -0
  297. package/src/sql-driver/query-executor/query-executor.ts +44 -0
  298. package/src/sql-driver/sql-driver-adapter.ts +96 -0
  299. package/src/sql-driver/sql-driver.ts +53 -0
  300. package/src/sql-driver/sql.ts +57 -0
  301. package/src/sql-driver/sqlocal.test.ts +117 -0
  302. package/src/with-database.ts +35 -23
  303. package/tsdown.config.ts +7 -2
  304. package/dist/adapters/drizzle/drizzle-connection-pool.js +0 -40
  305. package/dist/adapters/drizzle/drizzle-connection-pool.js.map +0 -1
  306. package/dist/adapters/drizzle/drizzle-query.d.ts +0 -23
  307. package/dist/adapters/drizzle/drizzle-query.d.ts.map +0 -1
  308. package/dist/adapters/drizzle/drizzle-query.js.map +0 -1
  309. package/dist/adapters/drizzle/drizzle-uow-compiler.d.ts +0 -10
  310. package/dist/adapters/drizzle/drizzle-uow-compiler.d.ts.map +0 -1
  311. package/dist/adapters/drizzle/drizzle-uow-compiler.js +0 -334
  312. package/dist/adapters/drizzle/drizzle-uow-compiler.js.map +0 -1
  313. package/dist/adapters/drizzle/drizzle-uow-decoder.js +0 -123
  314. package/dist/adapters/drizzle/drizzle-uow-decoder.js.map +0 -1
  315. package/dist/adapters/drizzle/drizzle-uow-executor.js +0 -160
  316. package/dist/adapters/drizzle/drizzle-uow-executor.js.map +0 -1
  317. package/dist/adapters/drizzle/join-column-utils.js +0 -28
  318. package/dist/adapters/drizzle/join-column-utils.js.map +0 -1
  319. package/dist/adapters/drizzle/shared.d.ts.map +0 -1
  320. package/dist/adapters/drizzle/shared.js +0 -35
  321. package/dist/adapters/drizzle/shared.js.map +0 -1
  322. package/dist/adapters/kysely/kysely-connection-pool.js +0 -41
  323. package/dist/adapters/kysely/kysely-connection-pool.js.map +0 -1
  324. package/dist/adapters/kysely/kysely-query-builder.js +0 -321
  325. package/dist/adapters/kysely/kysely-query-builder.js.map +0 -1
  326. package/dist/adapters/kysely/kysely-query-compiler.js +0 -67
  327. package/dist/adapters/kysely/kysely-query-compiler.js.map +0 -1
  328. package/dist/adapters/kysely/kysely-query.d.ts +0 -23
  329. package/dist/adapters/kysely/kysely-query.d.ts.map +0 -1
  330. package/dist/adapters/kysely/kysely-query.js +0 -230
  331. package/dist/adapters/kysely/kysely-query.js.map +0 -1
  332. package/dist/adapters/kysely/kysely-shared.d.ts +0 -14
  333. package/dist/adapters/kysely/kysely-shared.d.ts.map +0 -1
  334. package/dist/adapters/kysely/kysely-shared.js +0 -33
  335. package/dist/adapters/kysely/kysely-shared.js.map +0 -1
  336. package/dist/adapters/kysely/kysely-uow-compiler.js +0 -193
  337. package/dist/adapters/kysely/kysely-uow-compiler.js.map +0 -1
  338. package/dist/adapters/kysely/kysely-uow-executor.js +0 -93
  339. package/dist/adapters/kysely/kysely-uow-executor.js.map +0 -1
  340. package/dist/adapters/kysely/migration/execute-base.js +0 -128
  341. package/dist/adapters/kysely/migration/execute-base.js.map +0 -1
  342. package/dist/adapters/kysely/migration/execute-factory.js +0 -34
  343. package/dist/adapters/kysely/migration/execute-factory.js.map +0 -1
  344. package/dist/adapters/kysely/migration/execute-mssql.js +0 -112
  345. package/dist/adapters/kysely/migration/execute-mssql.js.map +0 -1
  346. package/dist/adapters/kysely/migration/execute-mysql.js +0 -93
  347. package/dist/adapters/kysely/migration/execute-mysql.js.map +0 -1
  348. package/dist/adapters/kysely/migration/execute-postgres.js +0 -104
  349. package/dist/adapters/kysely/migration/execute-postgres.js.map +0 -1
  350. package/dist/adapters/kysely/migration/execute-sqlite.js +0 -123
  351. package/dist/adapters/kysely/migration/execute-sqlite.js.map +0 -1
  352. package/dist/adapters/kysely/migration/execute.js +0 -34
  353. package/dist/adapters/kysely/migration/execute.js.map +0 -1
  354. package/dist/migration-engine/create.d.ts +0 -37
  355. package/dist/migration-engine/create.d.ts.map +0 -1
  356. package/dist/migration-engine/create.js +0 -58
  357. package/dist/migration-engine/create.js.map +0 -1
  358. package/dist/migration-engine/shared.d.ts +0 -112
  359. package/dist/migration-engine/shared.d.ts.map +0 -1
  360. package/dist/node_modules/.pnpm/rou3@0.7.8/node_modules/rou3/dist/index.js.map +0 -1
  361. package/dist/query/execute-unit-of-work.d.ts.map +0 -1
  362. package/dist/query/execute-unit-of-work.js.map +0 -1
  363. package/dist/query/query.d.ts.map +0 -1
  364. package/dist/query/result-transform.js +0 -170
  365. package/dist/query/result-transform.js.map +0 -1
  366. package/dist/query/retry-policy.d.ts.map +0 -1
  367. package/dist/query/retry-policy.js.map +0 -1
  368. package/dist/query/unit-of-work.d.ts.map +0 -1
  369. package/dist/query/unit-of-work.js.map +0 -1
  370. package/dist/schema/serialize.js +0 -111
  371. package/dist/schema/serialize.js.map +0 -1
  372. package/src/adapters/drizzle/drizzle-adapter.test.ts +0 -122
  373. package/src/adapters/drizzle/drizzle-connection-pool.ts +0 -66
  374. package/src/adapters/drizzle/drizzle-query.test.ts +0 -499
  375. package/src/adapters/drizzle/drizzle-uow-compiler-mysql.test.ts +0 -1442
  376. package/src/adapters/drizzle/drizzle-uow-compiler-sqlite.test.ts +0 -1414
  377. package/src/adapters/drizzle/drizzle-uow-compiler.test.ts +0 -1400
  378. package/src/adapters/drizzle/drizzle-uow-compiler.ts +0 -677
  379. package/src/adapters/drizzle/drizzle-uow-decoder.ts +0 -228
  380. package/src/adapters/drizzle/drizzle-uow-executor.ts +0 -309
  381. package/src/adapters/drizzle/join-column-utils.test.ts +0 -79
  382. package/src/adapters/drizzle/join-column-utils.ts +0 -39
  383. package/src/adapters/kysely/kysely-connection-pool.ts +0 -70
  384. package/src/adapters/kysely/kysely-query-builder.test.ts +0 -1344
  385. package/src/adapters/kysely/kysely-query-builder.ts +0 -666
  386. package/src/adapters/kysely/kysely-query-compiler.ts +0 -127
  387. package/src/adapters/kysely/kysely-query.test.ts +0 -498
  388. package/src/adapters/kysely/kysely-query.ts +0 -399
  389. package/src/adapters/kysely/kysely-shared.ts +0 -57
  390. package/src/adapters/kysely/kysely-uow-compiler.test.ts +0 -986
  391. package/src/adapters/kysely/kysely-uow-compiler.ts +0 -350
  392. package/src/adapters/kysely/kysely-uow-executor.ts +0 -164
  393. package/src/adapters/kysely/kysely-uow-joins.test.ts +0 -794
  394. package/src/adapters/kysely/migration/execute-base.ts +0 -256
  395. package/src/adapters/kysely/migration/execute-factory.ts +0 -53
  396. package/src/adapters/kysely/migration/execute-mssql.ts +0 -250
  397. package/src/adapters/kysely/migration/execute-mysql.ts +0 -211
  398. package/src/adapters/kysely/migration/execute-postgres.test.ts +0 -2657
  399. package/src/adapters/kysely/migration/execute-postgres.ts +0 -234
  400. package/src/adapters/kysely/migration/execute-sqlite.ts +0 -247
  401. package/src/adapters/kysely/migration/execute.ts +0 -50
  402. package/src/adapters/kysely/migration/kysely-migrator.test.ts +0 -261
  403. package/src/query/result-transform.ts +0 -274
  404. package/src/schema/serialize.ts +0 -407
  405. /package/dist/query/{query.js → simple-query-interface.js} +0 -0
  406. /package/src/query/{retry-policy.test.ts → unit-of-work/retry-policy.test.ts} +0 -0
  407. /package/src/query/{retry-policy.ts → unit-of-work/retry-policy.ts} +0 -0
@@ -0,0 +1,214 @@
1
+ import type { AnySchema } from "../../../schema/create";
2
+ import type { SqlDriverAdapter } from "../../../sql-driver/sql-driver-adapter";
3
+ import type { TableNameMapper } from "../../shared/table-name-mapper";
4
+ import { generateMigrationFromSchema } from "../../../migration-engine/auto-from-schema";
5
+ import { createColdKysely } from "./cold-kysely";
6
+ import { type SQLGenerator } from "./sql-generator";
7
+ import { SQLiteSQLGenerator } from "./dialect/sqlite";
8
+ import { PostgresSQLGenerator } from "./dialect/postgres";
9
+ import { MySQLSQLGenerator } from "./dialect/mysql";
10
+ import { executeMigration, type CompiledMigration } from "./executor";
11
+ import type { SupportedDatabase } from "../driver-config";
12
+ import type { Kysely } from "kysely";
13
+ /**
14
+ * Options for executing a migration.
15
+ */
16
+ export interface ExecuteOptions {
17
+ /**
18
+ * Whether to automatically update the schema version in the database after migration.
19
+ * If not specified, uses the value from PreparedMigrationsConfig.
20
+ */
21
+ updateVersionInMigration?: boolean;
22
+ }
23
+
24
+ /**
25
+ * Interface for preparing and executing migrations.
26
+ * Provides a clean separation between compilation (SQL generation) and execution.
27
+ */
28
+ export interface PreparedMigrations {
29
+ /**
30
+ * Execute migration from one version to another.
31
+ * This performs all three phases:
32
+ * - Phase 1: schema → operations
33
+ * - Phase 2: operations → SQL
34
+ * - Phase 3: SQL → database
35
+ *
36
+ * @param fromVersion - Current database version (0 for new database)
37
+ * @param toVersion - Target schema version (defaults to schema.version)
38
+ * @param options - Optional execution options (overrides config defaults)
39
+ */
40
+ execute(fromVersion: number, toVersion?: number, options?: ExecuteOptions): Promise<void>;
41
+
42
+ /**
43
+ * Execute migration using a specific driver.
44
+ * Useful for testing or when you need to use a different driver than the one provided in config.
45
+ *
46
+ * @param driver - SQL driver to use for execution
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 (overrides config defaults)
50
+ */
51
+ executeWithDriver(
52
+ driver: SqlDriverAdapter,
53
+ fromVersion: number,
54
+ toVersion?: number,
55
+ options?: ExecuteOptions,
56
+ ): Promise<void>;
57
+
58
+ /**
59
+ * Get the SQL for a migration from one version to another without executing it.
60
+ * Useful for generating migration files or previewing changes.
61
+ *
62
+ * @param fromVersion - Current database version (0 for new database)
63
+ * @param toVersion - Target schema version (defaults to schema.version)
64
+ * @param options - Optional execution options (affects version update SQL)
65
+ * @returns SQL string for the migration
66
+ */
67
+ getSQL(fromVersion: number, toVersion?: number, options?: ExecuteOptions): string;
68
+
69
+ /**
70
+ * Get the compiled migration for a version range.
71
+ * Returns both the SQL statements and the version information.
72
+ *
73
+ * @param fromVersion - Current database version (0 for new database)
74
+ * @param toVersion - Target schema version (defaults to schema.version)
75
+ * @param options - Optional execution options (affects version update SQL)
76
+ * @returns Compiled migration with statements and version info
77
+ */
78
+ compile(fromVersion: number, toVersion?: number, options?: ExecuteOptions): CompiledMigration;
79
+ }
80
+
81
+ /**
82
+ * Configuration for creating a PreparedMigrations instance.
83
+ */
84
+ export interface PreparedMigrationsConfig {
85
+ schema: AnySchema;
86
+ namespace: string;
87
+ database: SupportedDatabase;
88
+ mapper?: TableNameMapper;
89
+ driver?: SqlDriverAdapter;
90
+ /**
91
+ * Whether to automatically update the schema version in the database after migration.
92
+ * Defaults to true. Can be overridden per execution via ExecuteOptions.
93
+ */
94
+ updateVersionInMigration?: boolean;
95
+ }
96
+
97
+ /**
98
+ * Create a PreparedMigrations instance for a schema and namespace.
99
+ */
100
+ export function createPreparedMigrations(config: PreparedMigrationsConfig): PreparedMigrations {
101
+ const {
102
+ schema,
103
+ namespace,
104
+ database,
105
+ driver,
106
+ updateVersionInMigration: defaultUpdateVersion = true,
107
+ } = config;
108
+
109
+ // Create the cold Kysely instance for SQL generation
110
+ const coldKysely = createColdKysely(database);
111
+
112
+ // Create the appropriate SQL generator for the database
113
+ const generator = createSQLGenerator(database, coldKysely);
114
+
115
+ /**
116
+ * Internal method to compile a migration for a given version range.
117
+ */
118
+ function compile(
119
+ fromVersion: number,
120
+ toVersion: number,
121
+ updateVersionInMigration: boolean,
122
+ ): CompiledMigration {
123
+ // Validate version numbers
124
+ if (fromVersion < 0) {
125
+ throw new Error(`fromVersion cannot be negative: ${fromVersion}`);
126
+ }
127
+ if (toVersion < 0) {
128
+ throw new Error(`toVersion cannot be negative: ${toVersion}`);
129
+ }
130
+ if (toVersion < fromVersion) {
131
+ throw new Error(
132
+ `Cannot migrate backwards: fromVersion (${fromVersion}) > toVersion (${toVersion})`,
133
+ );
134
+ }
135
+ if (toVersion > schema.version) {
136
+ throw new Error(`toVersion (${toVersion}) exceeds schema version (${schema.version})`);
137
+ }
138
+
139
+ // Phase 1: Generate migration operations from schema
140
+ const operations = generateMigrationFromSchema(schema, fromVersion, toVersion);
141
+
142
+ // Phase 2: Compile operations to SQL
143
+ const statements = generator.compile(operations, config.mapper);
144
+
145
+ // Add version update SQL if requested
146
+ if (updateVersionInMigration && toVersion !== fromVersion) {
147
+ const versionUpdate = generator.generateVersionUpdateSQL(namespace, fromVersion, toVersion);
148
+ statements.push(versionUpdate);
149
+ }
150
+
151
+ return {
152
+ statements,
153
+ fromVersion,
154
+ toVersion,
155
+ };
156
+ }
157
+
158
+ return {
159
+ async execute(fromVersion, toVersion, options) {
160
+ if (!driver) {
161
+ throw new Error(
162
+ "Driver not provided. Cannot execute migration. Use `executeWithDriver` instead.",
163
+ );
164
+ }
165
+
166
+ return this.executeWithDriver(driver, fromVersion, toVersion, options);
167
+ },
168
+
169
+ async executeWithDriver(driverToUse, fromVersion, toVersion, options) {
170
+ // Use option if provided, otherwise use config default
171
+ const updateVersionInMigration = options?.updateVersionInMigration ?? defaultUpdateVersion;
172
+ const targetVersion = toVersion ?? schema.version;
173
+
174
+ // Compile the migration (this will validate the version numbers)
175
+ const migration = compile(fromVersion, targetVersion, updateVersionInMigration);
176
+
177
+ // Execute the migration
178
+ await executeMigration(driverToUse, migration);
179
+ },
180
+
181
+ getSQL(fromVersion, toVersion, options) {
182
+ const updateVersionInMigration = options?.updateVersionInMigration ?? defaultUpdateVersion;
183
+ const targetVersion = toVersion ?? schema.version;
184
+
185
+ const migration = compile(fromVersion, targetVersion, updateVersionInMigration);
186
+ return migration.statements.map((stmt) => stmt.sql + ";").join("\n\n");
187
+ },
188
+
189
+ compile(fromVersion, toVersion, options) {
190
+ const updateVersionInMigration = options?.updateVersionInMigration ?? defaultUpdateVersion;
191
+ const targetVersion = toVersion ?? schema.version;
192
+
193
+ return compile(fromVersion, targetVersion, updateVersionInMigration);
194
+ },
195
+ };
196
+ }
197
+
198
+ /**
199
+ * Create the appropriate SQL generator for a database type.
200
+ */
201
+ function createSQLGenerator(
202
+ database: SupportedDatabase,
203
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
204
+ coldKysely: Kysely<any>,
205
+ ): SQLGenerator {
206
+ switch (database) {
207
+ case "sqlite":
208
+ return new SQLiteSQLGenerator(coldKysely, database);
209
+ case "postgresql":
210
+ return new PostgresSQLGenerator(coldKysely, database);
211
+ case "mysql":
212
+ return new MySQLSQLGenerator(coldKysely, database);
213
+ }
214
+ }
@@ -0,0 +1,413 @@
1
+ import {
2
+ type ColumnDefinitionBuilder,
3
+ type CompiledQuery,
4
+ type CreateTableBuilder,
5
+ type Kysely,
6
+ type RawBuilder,
7
+ sql,
8
+ } from "kysely";
9
+ import { createHash } from "node:crypto";
10
+ import type {
11
+ ColumnInfo,
12
+ ColumnOperation,
13
+ MigrationOperation,
14
+ } from "../../../migration-engine/shared";
15
+ import { SETTINGS_TABLE_NAME } from "../../../fragments/internal-fragment";
16
+ import type { TableNameMapper } from "../../shared/table-name-mapper";
17
+ import type { SupportedDatabase } from "../driver-config";
18
+ import { createSQLTypeMapper } from "../../../schema/type-conversion/create-sql-type-mapper";
19
+
20
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
21
+ type KyselyAny = Kysely<any>;
22
+
23
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
24
+ type CreateTableBuilderAny = CreateTableBuilder<any, any>;
25
+
26
+ /**
27
+ * Interface for compiling migration operations to SQL.
28
+ */
29
+ export interface CompilableQuery {
30
+ compile(): CompiledQuery;
31
+ }
32
+
33
+ /**
34
+ * Abstract base class for SQL generation from migration operations.
35
+ * Each database dialect extends this class and implements the abstract methods.
36
+ */
37
+ export abstract class SQLGenerator {
38
+ protected readonly db: KyselyAny;
39
+ protected readonly database: SupportedDatabase;
40
+ protected readonly typeMapper: ReturnType<typeof createSQLTypeMapper>;
41
+
42
+ constructor(db: KyselyAny, database: SupportedDatabase) {
43
+ this.db = db;
44
+ this.database = database;
45
+ this.typeMapper = createSQLTypeMapper(database);
46
+ }
47
+
48
+ /**
49
+ * Preprocess operations before SQL generation.
50
+ * Dialects can override to transform operations based on database capabilities.
51
+ * For example, SQLite merges FK operations into create-table operations.
52
+ */
53
+ abstract preprocess(operations: MigrationOperation[]): MigrationOperation[];
54
+
55
+ /**
56
+ * Apply auto-increment to a column builder.
57
+ * PostgreSQL uses SERIAL types so this is a no-op there.
58
+ */
59
+ abstract applyAutoIncrement(builder: ColumnDefinitionBuilder): ColumnDefinitionBuilder;
60
+
61
+ /**
62
+ * Get the default value for a column, or undefined if not supported.
63
+ * MySQL returns undefined for TEXT columns since it doesn't support defaults there.
64
+ */
65
+ abstract getDefaultValue(column: ColumnInfo): RawBuilder<unknown> | undefined;
66
+
67
+ /**
68
+ * Generate SQL for updating the schema version in the settings table.
69
+ * This is the same across all databases.
70
+ */
71
+ generateVersionUpdateSQL(
72
+ namespace: string,
73
+ fromVersion: number,
74
+ toVersion: number,
75
+ ): CompiledQuery {
76
+ const key = `${namespace}.schema_version`;
77
+
78
+ if (fromVersion === 0) {
79
+ // Insert new version record
80
+ const id = createHash("md5").update(key).digest("base64url").replace(/=/g, "");
81
+ return this.db
82
+ .insertInto(SETTINGS_TABLE_NAME)
83
+ .values({
84
+ id: sql.lit(id),
85
+ key: sql.lit(key),
86
+ value: sql.lit(toVersion.toString()),
87
+ })
88
+ .compile();
89
+ } else {
90
+ // Update existing version record
91
+ return this.db
92
+ .updateTable(SETTINGS_TABLE_NAME)
93
+ .set({
94
+ value: sql.lit(toVersion.toString()),
95
+ })
96
+ .where("key", "=", sql.lit(key))
97
+ .compile();
98
+ }
99
+ }
100
+
101
+ /**
102
+ * Compile migration operations to SQL statements.
103
+ * This is the main entry point for SQL generation.
104
+ */
105
+ compile(operations: MigrationOperation[], mapper?: TableNameMapper): CompiledQuery[] {
106
+ const preprocessed = this.preprocess(operations);
107
+ const queries: CompiledQuery[] = [];
108
+
109
+ for (const operation of preprocessed) {
110
+ const compiled = this.compileOperation(operation, mapper);
111
+ if (Array.isArray(compiled)) {
112
+ queries.push(...compiled);
113
+ } else {
114
+ queries.push(compiled);
115
+ }
116
+ }
117
+
118
+ return queries;
119
+ }
120
+
121
+ /**
122
+ * Compile a single migration operation to SQL.
123
+ */
124
+ protected compileOperation(
125
+ operation: MigrationOperation,
126
+ mapper?: TableNameMapper,
127
+ ): CompiledQuery | CompiledQuery[] {
128
+ switch (operation.type) {
129
+ case "create-table":
130
+ return this.compileCreateTable(operation, mapper);
131
+ case "rename-table":
132
+ return this.compileRenameTable(operation, mapper);
133
+ case "alter-table":
134
+ return this.compileAlterTable(operation, mapper);
135
+ case "drop-table":
136
+ return this.compileDropTable(operation, mapper);
137
+ case "add-foreign-key":
138
+ return this.compileAddForeignKey(operation, mapper);
139
+ case "drop-foreign-key":
140
+ return this.compileDropForeignKey(operation, mapper);
141
+ case "add-index":
142
+ return this.compileAddIndex(operation, mapper);
143
+ case "drop-index":
144
+ return this.compileDropIndex(operation, mapper);
145
+ case "custom":
146
+ return this.compileCustom(operation);
147
+ }
148
+ }
149
+
150
+ /**
151
+ * Compile a create-table operation.
152
+ * Subclasses can override to add FK constraints inline (e.g., SQLite).
153
+ */
154
+ protected compileCreateTable(
155
+ operation: Extract<MigrationOperation, { type: "create-table" }>,
156
+ mapper?: TableNameMapper,
157
+ ): CompiledQuery {
158
+ const tableName = this.getTableName(operation.name, mapper);
159
+ let builder: CreateTableBuilderAny = this.db.schema.createTable(tableName);
160
+
161
+ for (const col of operation.columns) {
162
+ builder = builder.addColumn(col.name, sql.raw(this.getDBType(col)), (b) =>
163
+ this.buildColumn(col, b),
164
+ );
165
+ }
166
+
167
+ // Allow subclasses to add inline foreign keys
168
+ builder = this.addInlineForeignKeys(builder, operation, mapper);
169
+
170
+ return builder.compile();
171
+ }
172
+
173
+ /**
174
+ * Hook for subclasses to add inline foreign keys to create-table.
175
+ * SQLite overrides this to add FKs at table creation time.
176
+ */
177
+ protected addInlineForeignKeys(
178
+ builder: CreateTableBuilderAny,
179
+ _operation: Extract<MigrationOperation, { type: "create-table" }>,
180
+ _mapper?: TableNameMapper,
181
+ ): CreateTableBuilderAny {
182
+ return builder;
183
+ }
184
+
185
+ /**
186
+ * Compile a rename-table operation.
187
+ */
188
+ protected compileRenameTable(
189
+ operation: Extract<MigrationOperation, { type: "rename-table" }>,
190
+ mapper?: TableNameMapper,
191
+ ): CompiledQuery {
192
+ return this.db.schema
193
+ .alterTable(this.getTableName(operation.from, mapper))
194
+ .renameTo(this.getTableName(operation.to, mapper))
195
+ .compile();
196
+ }
197
+
198
+ /**
199
+ * Compile an alter-table operation.
200
+ */
201
+ protected compileAlterTable(
202
+ operation: Extract<MigrationOperation, { type: "alter-table" }>,
203
+ mapper?: TableNameMapper,
204
+ ): CompiledQuery[] {
205
+ const queries: CompiledQuery[] = [];
206
+ const tableName = this.getTableName(operation.name, mapper);
207
+
208
+ for (const columnOp of operation.value) {
209
+ const compiled = this.compileColumnOperation(tableName, columnOp);
210
+ if (Array.isArray(compiled)) {
211
+ queries.push(...compiled);
212
+ } else {
213
+ queries.push(compiled);
214
+ }
215
+ }
216
+
217
+ return queries;
218
+ }
219
+
220
+ /**
221
+ * Compile a column operation within an alter-table.
222
+ * Subclasses override for database-specific handling (e.g., MySQL's modifyColumn).
223
+ */
224
+ protected compileColumnOperation(
225
+ tableName: string,
226
+ operation: ColumnOperation,
227
+ ): CompiledQuery | CompiledQuery[] {
228
+ const alter = () => this.db.schema.alterTable(tableName);
229
+
230
+ switch (operation.type) {
231
+ case "rename-column":
232
+ return alter().renameColumn(operation.from, operation.to).compile();
233
+
234
+ case "drop-column":
235
+ return alter().dropColumn(operation.name).compile();
236
+
237
+ case "create-column": {
238
+ const col = operation.value;
239
+ return alter()
240
+ .addColumn(col.name, sql.raw(this.getDBType(col)), (b) => this.buildColumn(col, b))
241
+ .compile();
242
+ }
243
+
244
+ case "update-column":
245
+ return this.compileUpdateColumn(tableName, operation);
246
+ }
247
+ }
248
+
249
+ /**
250
+ * Compile an update-column operation.
251
+ * Must be implemented by subclasses since each database handles this differently.
252
+ */
253
+ protected abstract compileUpdateColumn(
254
+ tableName: string,
255
+ operation: Extract<ColumnOperation, { type: "update-column" }>,
256
+ ): CompiledQuery | CompiledQuery[];
257
+
258
+ /**
259
+ * Compile a drop-table operation.
260
+ */
261
+ protected compileDropTable(
262
+ operation: Extract<MigrationOperation, { type: "drop-table" }>,
263
+ mapper?: TableNameMapper,
264
+ ): CompiledQuery {
265
+ return this.db.schema.dropTable(this.getTableName(operation.name, mapper)).compile();
266
+ }
267
+
268
+ /**
269
+ * Compile an add-foreign-key operation.
270
+ * Subclasses can throw if not supported (e.g., SQLite).
271
+ */
272
+ protected compileAddForeignKey(
273
+ operation: Extract<MigrationOperation, { type: "add-foreign-key" }>,
274
+ mapper?: TableNameMapper,
275
+ ): CompiledQuery {
276
+ const { table, value } = operation;
277
+ return this.db.schema
278
+ .alterTable(this.getTableName(table, mapper))
279
+ .addForeignKeyConstraint(
280
+ value.name,
281
+ value.columns,
282
+ this.getTableName(value.referencedTable, mapper),
283
+ value.referencedColumns,
284
+ (b) => b.onUpdate("restrict").onDelete("restrict"),
285
+ )
286
+ .compile();
287
+ }
288
+
289
+ /**
290
+ * Compile a drop-foreign-key operation.
291
+ * Subclasses can throw if not supported (e.g., SQLite).
292
+ */
293
+ protected compileDropForeignKey(
294
+ operation: Extract<MigrationOperation, { type: "drop-foreign-key" }>,
295
+ mapper?: TableNameMapper,
296
+ ): CompiledQuery {
297
+ const { table, name } = operation;
298
+ return this.db.schema
299
+ .alterTable(this.getTableName(table, mapper))
300
+ .dropConstraint(name)
301
+ .ifExists()
302
+ .compile();
303
+ }
304
+
305
+ /**
306
+ * Compile an add-index operation.
307
+ */
308
+ protected compileAddIndex(
309
+ operation: Extract<MigrationOperation, { type: "add-index" }>,
310
+ mapper?: TableNameMapper,
311
+ ): CompiledQuery {
312
+ const tableName = this.getTableName(operation.table, mapper);
313
+ const indexName = this.getIndexName(operation.name, operation.table, mapper);
314
+ let builder = this.db.schema.createIndex(indexName).on(tableName).columns(operation.columns);
315
+
316
+ if (operation.unique) {
317
+ builder = builder.unique();
318
+ }
319
+
320
+ return builder.compile();
321
+ }
322
+
323
+ /**
324
+ * Compile a drop-index operation.
325
+ */
326
+ protected compileDropIndex(
327
+ operation: Extract<MigrationOperation, { type: "drop-index" }>,
328
+ mapper?: TableNameMapper,
329
+ ): CompiledQuery {
330
+ const tableName = this.getTableName(operation.table, mapper);
331
+ const indexName = this.getIndexName(operation.name, operation.table, mapper);
332
+ return this.db.schema.dropIndex(indexName).ifExists().on(tableName).compile();
333
+ }
334
+
335
+ /**
336
+ * Compile a custom SQL operation.
337
+ */
338
+ protected compileCustom(
339
+ operation: Extract<MigrationOperation, { type: "custom" }>,
340
+ ): CompiledQuery {
341
+ // Custom operations have a 'sql' property with raw SQL
342
+ const rawSql = operation["sql"] as string;
343
+ return sql.raw(rawSql).compile(this.db);
344
+ }
345
+
346
+ /**
347
+ * Build a column with all its constraints.
348
+ */
349
+ protected buildColumn(
350
+ col: ColumnInfo,
351
+ builder: ColumnDefinitionBuilder,
352
+ ): ColumnDefinitionBuilder {
353
+ if (!col.isNullable) {
354
+ builder = builder.notNull();
355
+ }
356
+
357
+ if (col.role === "internal-id") {
358
+ builder = builder.primaryKey();
359
+ builder = this.applyAutoIncrement(builder);
360
+ }
361
+
362
+ if (col.role === "external-id") {
363
+ builder = builder.unique();
364
+ }
365
+
366
+ const defaultValue = this.getDefaultValue(col);
367
+ if (defaultValue) {
368
+ builder = builder.defaultTo(defaultValue);
369
+ }
370
+
371
+ return builder;
372
+ }
373
+
374
+ /**
375
+ * Get table name, applying namespace mapping if provided.
376
+ * Settings table is never namespaced.
377
+ */
378
+ protected getTableName(tableName: string, mapper?: TableNameMapper): string {
379
+ if (tableName === SETTINGS_TABLE_NAME) {
380
+ return tableName;
381
+ }
382
+ return mapper ? mapper.toPhysical(tableName) : tableName;
383
+ }
384
+
385
+ /**
386
+ * Get the physical index name, applying namespace if a mapper is provided.
387
+ * Index names must be globally unique in most databases, so we namespace them
388
+ * to avoid collisions when multiple fragments use the same logical index names.
389
+ */
390
+ protected getIndexName(indexName: string, tableName: string, mapper?: TableNameMapper): string {
391
+ if (!mapper) {
392
+ return indexName;
393
+ }
394
+ // Create a unique index name by including the physical table name
395
+ // This ensures index names are unique across namespaces
396
+ const physicalTable = mapper.toPhysical(tableName);
397
+ return `${indexName}_${physicalTable}`;
398
+ }
399
+
400
+ /**
401
+ * Get the database type string for a column.
402
+ */
403
+ protected getDBType(col: ColumnInfo): string {
404
+ return this.typeMapper.getDatabaseType(col);
405
+ }
406
+
407
+ /**
408
+ * Compile raw SQL to a CompiledQuery.
409
+ */
410
+ protected compileRaw(raw: RawBuilder<unknown>): CompiledQuery {
411
+ return raw.compile(this.db);
412
+ }
413
+ }
@@ -0,0 +1,36 @@
1
+ import type { DriverConfig } from "../driver-config";
2
+ import type { TableNameMapper } from "../../shared/table-name-mapper";
3
+ import { SQLQueryCompiler, type AnyKysely } from "./sql-query-compiler";
4
+ import { PostgreSQLQueryCompiler } from "./dialect/postgres";
5
+ import { MySQLQueryCompiler } from "./dialect/mysql";
6
+ import { SQLiteQueryCompiler } from "./dialect/sqlite";
7
+
8
+ /**
9
+ * Factory function to create a dialect-specific SQL query compiler.
10
+ *
11
+ * Based on the database type in DriverConfig, returns the appropriate
12
+ * compiler implementation (PostgreSQL, MySQL, or SQLite).
13
+ *
14
+ * @param db - Kysely database instance
15
+ * @param driverConfig - Driver configuration with database type and capabilities
16
+ * @param mapper - Optional table name mapper for namespace prefixing
17
+ * @returns Dialect-specific SQLQueryCompiler instance
18
+ */
19
+ export function createSQLQueryCompiler(
20
+ db: AnyKysely,
21
+ driverConfig: DriverConfig,
22
+ mapper?: TableNameMapper,
23
+ ): SQLQueryCompiler {
24
+ switch (driverConfig.databaseType) {
25
+ case "postgresql":
26
+ return new PostgreSQLQueryCompiler(db, driverConfig, mapper);
27
+ case "mysql":
28
+ return new MySQLQueryCompiler(db, driverConfig, mapper);
29
+ case "sqlite":
30
+ return new SQLiteQueryCompiler(db, driverConfig, mapper);
31
+ default: {
32
+ const exhaustiveCheck: never = driverConfig.databaseType;
33
+ throw new Error(`Unsupported database type: ${exhaustiveCheck}`);
34
+ }
35
+ }
36
+ }