@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,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
+ }