@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,1008 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import type { MigrationOperation } from "../../../../migration-engine/shared";
3
+ import { createColdKysely } from "../cold-kysely";
4
+ import { PostgresSQLGenerator } from "./postgres";
5
+
6
+ describe("PostgresSQLGenerator", () => {
7
+ const coldKysely = createColdKysely("postgresql");
8
+ const generator = new PostgresSQLGenerator(coldKysely, "postgresql");
9
+
10
+ /**
11
+ * Helper to compile a single operation and extract the SQL statement.
12
+ * PostgreSQL doesn't wrap operations, so we get direct results.
13
+ */
14
+ function compileOne(operation: MigrationOperation): string {
15
+ const statements = generator.compile([operation]);
16
+ expect(statements.length).toBe(1);
17
+ return statements[0].sql;
18
+ }
19
+
20
+ /**
21
+ * Helper to compile a single operation and extract all SQL statements.
22
+ * For alter-table operations that generate multiple statements.
23
+ */
24
+ function compileMany(operation: MigrationOperation): string[] {
25
+ const statements = generator.compile([operation]);
26
+ return statements.map((s) => s.sql);
27
+ }
28
+
29
+ describe("create-table", () => {
30
+ it("should generate SQL for simple table with columns", () => {
31
+ const operation: MigrationOperation = {
32
+ type: "create-table",
33
+ name: "users",
34
+ columns: [
35
+ {
36
+ name: "id",
37
+ type: "integer",
38
+ isNullable: false,
39
+ role: "external-id",
40
+ },
41
+ {
42
+ name: "name",
43
+ type: "string",
44
+ isNullable: false,
45
+ role: "regular",
46
+ },
47
+ {
48
+ name: "email",
49
+ type: "string",
50
+ isNullable: false,
51
+ role: "regular",
52
+ },
53
+ ],
54
+ };
55
+
56
+ const sql = compileOne(operation);
57
+ expect(sql).toMatchInlineSnapshot(
58
+ `"create table "users" ("id" integer not null unique, "name" text not null, "email" text not null)"`,
59
+ );
60
+ });
61
+
62
+ it("should generate SQL for table with id column with runtime default", () => {
63
+ const operation: MigrationOperation = {
64
+ type: "create-table",
65
+ name: "users",
66
+ columns: [
67
+ {
68
+ name: "id",
69
+ type: "varchar(30)",
70
+ isNullable: false,
71
+ role: "external-id",
72
+ default: { runtime: "cuid" },
73
+ },
74
+ ],
75
+ };
76
+
77
+ const sql = compileOne(operation);
78
+ expect(sql).toMatchInlineSnapshot(
79
+ `"create table "users" ("id" varchar(30) not null unique)"`,
80
+ );
81
+ });
82
+
83
+ it("should generate SQL for table with various column types", () => {
84
+ const operation: MigrationOperation = {
85
+ type: "create-table",
86
+ name: "test_types",
87
+ columns: [
88
+ { name: "col_int", type: "integer", isNullable: false, role: "external-id" },
89
+ { name: "col_bigint", type: "bigint", isNullable: false, role: "regular" },
90
+ { name: "col_decimal", type: "decimal", isNullable: false, role: "regular" },
91
+ { name: "col_bool", type: "bool", isNullable: false, role: "regular" },
92
+ { name: "col_date", type: "date", isNullable: false, role: "regular" },
93
+ { name: "col_timestamp", type: "timestamp", isNullable: false, role: "regular" },
94
+ { name: "col_json", type: "json", isNullable: false, role: "regular" },
95
+ { name: "col_binary", type: "binary", isNullable: false, role: "regular" },
96
+ { name: "col_varchar", type: "varchar(255)", isNullable: false, role: "regular" },
97
+ ],
98
+ };
99
+
100
+ const sql = compileOne(operation);
101
+ expect(sql).toMatchInlineSnapshot(
102
+ `"create table "test_types" ("col_int" integer not null unique, "col_bigint" bigint not null, "col_decimal" decimal not null, "col_bool" boolean not null, "col_date" date not null, "col_timestamp" timestamp not null, "col_json" json not null, "col_binary" bytea not null, "col_varchar" varchar(255) not null)"`,
103
+ );
104
+ });
105
+
106
+ it("should generate SQL for table with nullable columns", () => {
107
+ const operation: MigrationOperation = {
108
+ type: "create-table",
109
+ name: "nullable_test",
110
+ columns: [
111
+ { name: "id", type: "integer", isNullable: false, role: "external-id" },
112
+ { name: "optional_name", type: "string", isNullable: true, role: "regular" },
113
+ { name: "optional_age", type: "integer", isNullable: true, role: "regular" },
114
+ ],
115
+ };
116
+
117
+ const sql = compileOne(operation);
118
+ expect(sql).toMatchInlineSnapshot(
119
+ `"create table "nullable_test" ("id" integer not null unique, "optional_name" text, "optional_age" integer)"`,
120
+ );
121
+ });
122
+
123
+ it("should generate SQL for table with default values", () => {
124
+ const operation: MigrationOperation = {
125
+ type: "create-table",
126
+ name: "defaults_test",
127
+ columns: [
128
+ { name: "id", type: "integer", isNullable: false, role: "external-id" },
129
+ {
130
+ name: "status",
131
+ type: "string",
132
+ isNullable: false,
133
+ role: "regular",
134
+ default: { value: "pending" },
135
+ },
136
+ {
137
+ name: "count",
138
+ type: "integer",
139
+ isNullable: false,
140
+ role: "regular",
141
+ default: { value: 0 },
142
+ },
143
+ {
144
+ name: "is_active",
145
+ type: "bool",
146
+ isNullable: false,
147
+ role: "regular",
148
+ default: { value: true },
149
+ },
150
+ ],
151
+ };
152
+
153
+ const sql = compileOne(operation);
154
+ expect(sql).toMatchInlineSnapshot(
155
+ `"create table "defaults_test" ("id" integer not null unique, "status" text default 'pending' not null, "count" integer default 0 not null, "is_active" boolean default true not null)"`,
156
+ );
157
+ });
158
+
159
+ it("should generate SQL for table with timestamp default to CURRENT_TIMESTAMP", () => {
160
+ const operation: MigrationOperation = {
161
+ type: "create-table",
162
+ name: "timestamps_test",
163
+ columns: [
164
+ { name: "id", type: "integer", isNullable: false, role: "external-id" },
165
+ {
166
+ name: "created_at",
167
+ type: "timestamp",
168
+ isNullable: false,
169
+ role: "regular",
170
+ default: { dbSpecial: "now" },
171
+ },
172
+ ],
173
+ };
174
+
175
+ const sql = compileOne(operation);
176
+ expect(sql).toMatchInlineSnapshot(
177
+ `"create table "timestamps_test" ("id" integer not null unique, "created_at" timestamp default CURRENT_TIMESTAMP not null)"`,
178
+ );
179
+ });
180
+
181
+ it("should generate SQL for table with reference column", () => {
182
+ const operation: MigrationOperation = {
183
+ type: "create-table",
184
+ name: "posts",
185
+ columns: [
186
+ { name: "id", type: "integer", isNullable: false, role: "external-id" },
187
+ { name: "user_id", type: "integer", isNullable: false, role: "reference" },
188
+ { name: "title", type: "string", isNullable: false, role: "regular" },
189
+ ],
190
+ };
191
+
192
+ const sql = compileOne(operation);
193
+ expect(sql).toMatchInlineSnapshot(
194
+ `"create table "posts" ("id" integer not null unique, "user_id" integer not null, "title" text not null)"`,
195
+ );
196
+ });
197
+
198
+ it("should generate SQL for table with internal-id column (bigserial)", () => {
199
+ const operation: MigrationOperation = {
200
+ type: "create-table",
201
+ name: "users",
202
+ columns: [
203
+ { name: "_internalId", type: "bigint", isNullable: false, role: "internal-id" },
204
+ { name: "name", type: "string", isNullable: false, role: "regular" },
205
+ ],
206
+ };
207
+
208
+ const sql = compileOne(operation);
209
+ expect(sql).toMatchInlineSnapshot(
210
+ `"create table "users" ("_internalId" bigserial not null primary key, "name" text not null)"`,
211
+ );
212
+ });
213
+ });
214
+
215
+ describe("rename-table", () => {
216
+ it("should generate SQL for PostgreSQL rename", () => {
217
+ const operation: MigrationOperation = {
218
+ type: "rename-table",
219
+ from: "old_name",
220
+ to: "new_name",
221
+ };
222
+
223
+ const sql = compileOne(operation);
224
+ expect(sql).toMatchInlineSnapshot(`"alter table "old_name" rename to "new_name""`);
225
+ });
226
+ });
227
+
228
+ describe("drop-table", () => {
229
+ it("should generate SQL to drop table", () => {
230
+ const operation: MigrationOperation = {
231
+ type: "drop-table",
232
+ name: "to_drop",
233
+ };
234
+
235
+ const sql = compileOne(operation);
236
+ expect(sql).toMatchInlineSnapshot(`"drop table "to_drop""`);
237
+ });
238
+ });
239
+
240
+ describe("alter-table - create-column", () => {
241
+ it("should generate SQL to add a new column", () => {
242
+ const operation: MigrationOperation = {
243
+ type: "alter-table",
244
+ name: "test_table",
245
+ value: [
246
+ {
247
+ type: "create-column",
248
+ value: {
249
+ name: "new_column",
250
+ type: "string",
251
+ isNullable: true,
252
+ role: "regular",
253
+ },
254
+ },
255
+ ],
256
+ };
257
+
258
+ const statements = compileMany(operation);
259
+ expect(statements).toHaveLength(1);
260
+ expect(statements[0]).toMatchInlineSnapshot(
261
+ `"alter table "test_table" add column "new_column" text"`,
262
+ );
263
+ });
264
+
265
+ it("should generate SQL for multiple columns", () => {
266
+ const operation: MigrationOperation = {
267
+ type: "alter-table",
268
+ name: "test_table",
269
+ value: [
270
+ {
271
+ type: "create-column",
272
+ value: {
273
+ name: "col1",
274
+ type: "string",
275
+ isNullable: true,
276
+ role: "regular",
277
+ },
278
+ },
279
+ {
280
+ type: "create-column",
281
+ value: {
282
+ name: "col2",
283
+ type: "integer",
284
+ isNullable: false,
285
+ role: "regular",
286
+ default: { value: 0 },
287
+ },
288
+ },
289
+ ],
290
+ };
291
+
292
+ const statements = compileMany(operation);
293
+ expect(statements).toHaveLength(2);
294
+ expect(statements[0]).toMatchInlineSnapshot(
295
+ `"alter table "test_table" add column "col1" text"`,
296
+ );
297
+ expect(statements[1]).toMatchInlineSnapshot(
298
+ `"alter table "test_table" add column "col2" integer default 0 not null"`,
299
+ );
300
+ });
301
+ });
302
+
303
+ describe("alter-table - rename-column", () => {
304
+ it("should generate SQL to rename a column", () => {
305
+ const operation: MigrationOperation = {
306
+ type: "alter-table",
307
+ name: "test_table",
308
+ value: [
309
+ {
310
+ type: "rename-column",
311
+ from: "old_name",
312
+ to: "new_name",
313
+ },
314
+ ],
315
+ };
316
+
317
+ const statements = compileMany(operation);
318
+ expect(statements).toHaveLength(1);
319
+ expect(statements[0]).toMatchInlineSnapshot(
320
+ `"alter table "test_table" rename column "old_name" to "new_name""`,
321
+ );
322
+ });
323
+ });
324
+
325
+ describe("alter-table - drop-column", () => {
326
+ it("should generate SQL to drop a column", () => {
327
+ const operation: MigrationOperation = {
328
+ type: "alter-table",
329
+ name: "test_table",
330
+ value: [
331
+ {
332
+ type: "drop-column",
333
+ name: "to_drop",
334
+ },
335
+ ],
336
+ };
337
+
338
+ const statements = compileMany(operation);
339
+ expect(statements).toHaveLength(1);
340
+ expect(statements[0]).toMatchInlineSnapshot(
341
+ `"alter table "test_table" drop column "to_drop""`,
342
+ );
343
+ });
344
+ });
345
+
346
+ describe("alter-table - update-column", () => {
347
+ it("should generate SQL to update column data type (PostgreSQL uses USING clause)", () => {
348
+ const operation: MigrationOperation = {
349
+ type: "alter-table",
350
+ name: "test_table",
351
+ value: [
352
+ {
353
+ type: "update-column",
354
+ name: "test_col",
355
+ value: {
356
+ name: "test_col",
357
+ type: "integer",
358
+ isNullable: true,
359
+ role: "regular",
360
+ },
361
+ updateDataType: true,
362
+ updateNullable: false,
363
+ updateDefault: false,
364
+ },
365
+ ],
366
+ };
367
+
368
+ const statements = compileMany(operation);
369
+ expect(statements).toHaveLength(1);
370
+ expect(statements[0]).toMatchInlineSnapshot(
371
+ `"ALTER TABLE "test_table" ALTER COLUMN "test_col" TYPE integer USING ("test_col"::integer)"`,
372
+ );
373
+ });
374
+
375
+ it("should generate SQL to set column NOT NULL", () => {
376
+ const operation: MigrationOperation = {
377
+ type: "alter-table",
378
+ name: "test_table",
379
+ value: [
380
+ {
381
+ type: "update-column",
382
+ name: "test_col",
383
+ value: {
384
+ name: "test_col",
385
+ type: "string",
386
+ isNullable: false,
387
+ role: "regular",
388
+ },
389
+ updateDataType: false,
390
+ updateNullable: true,
391
+ updateDefault: false,
392
+ },
393
+ ],
394
+ };
395
+
396
+ const statements = compileMany(operation);
397
+ expect(statements).toHaveLength(1);
398
+ expect(statements[0]).toMatchInlineSnapshot(
399
+ `"alter table "test_table" alter column "test_col" set not null"`,
400
+ );
401
+ });
402
+
403
+ it("should generate SQL to drop NOT NULL constraint", () => {
404
+ const operation: MigrationOperation = {
405
+ type: "alter-table",
406
+ name: "test_table",
407
+ value: [
408
+ {
409
+ type: "update-column",
410
+ name: "test_col",
411
+ value: {
412
+ name: "test_col",
413
+ type: "string",
414
+ isNullable: true,
415
+ role: "regular",
416
+ },
417
+ updateDataType: false,
418
+ updateNullable: true,
419
+ updateDefault: false,
420
+ },
421
+ ],
422
+ };
423
+
424
+ const statements = compileMany(operation);
425
+ expect(statements).toHaveLength(1);
426
+ expect(statements[0]).toMatchInlineSnapshot(
427
+ `"alter table "test_table" alter column "test_col" drop not null"`,
428
+ );
429
+ });
430
+
431
+ it("should generate SQL to set default value", () => {
432
+ const operation: MigrationOperation = {
433
+ type: "alter-table",
434
+ name: "test_table",
435
+ value: [
436
+ {
437
+ type: "update-column",
438
+ name: "test_col",
439
+ value: {
440
+ name: "test_col",
441
+ type: "string",
442
+ isNullable: false,
443
+ role: "regular",
444
+ default: { value: "default_value" },
445
+ },
446
+ updateDataType: false,
447
+ updateNullable: false,
448
+ updateDefault: true,
449
+ },
450
+ ],
451
+ };
452
+
453
+ const statements = compileMany(operation);
454
+ expect(statements).toHaveLength(1);
455
+ expect(statements[0]).toMatchInlineSnapshot(
456
+ `"alter table "test_table" alter column "test_col" set default 'default_value'"`,
457
+ );
458
+ });
459
+
460
+ it("should generate SQL to drop default value", () => {
461
+ const operation: MigrationOperation = {
462
+ type: "alter-table",
463
+ name: "test_table",
464
+ value: [
465
+ {
466
+ type: "update-column",
467
+ name: "test_col",
468
+ value: {
469
+ name: "test_col",
470
+ type: "string",
471
+ isNullable: true,
472
+ role: "regular",
473
+ },
474
+ updateDataType: false,
475
+ updateNullable: false,
476
+ updateDefault: true,
477
+ },
478
+ ],
479
+ };
480
+
481
+ const statements = compileMany(operation);
482
+ expect(statements).toHaveLength(1);
483
+ expect(statements[0]).toMatchInlineSnapshot(
484
+ `"alter table "test_table" alter column "test_col" drop default"`,
485
+ );
486
+ });
487
+
488
+ it("should generate SQL to update multiple properties at once", () => {
489
+ const operation: MigrationOperation = {
490
+ type: "alter-table",
491
+ name: "test_table",
492
+ value: [
493
+ {
494
+ type: "update-column",
495
+ name: "test_col",
496
+ value: {
497
+ name: "test_col",
498
+ type: "integer",
499
+ isNullable: false,
500
+ role: "regular",
501
+ default: { value: 0 },
502
+ },
503
+ updateDataType: true,
504
+ updateNullable: true,
505
+ updateDefault: true,
506
+ },
507
+ ],
508
+ };
509
+
510
+ const statements = compileMany(operation);
511
+ expect(statements).toHaveLength(3);
512
+ expect(statements[0]).toMatchInlineSnapshot(
513
+ `"ALTER TABLE "test_table" ALTER COLUMN "test_col" TYPE integer USING ("test_col"::integer)"`,
514
+ );
515
+ expect(statements[1]).toMatchInlineSnapshot(
516
+ `"alter table "test_table" alter column "test_col" set not null"`,
517
+ );
518
+ expect(statements[2]).toMatchInlineSnapshot(
519
+ `"alter table "test_table" alter column "test_col" set default 0"`,
520
+ );
521
+ });
522
+
523
+ it("should throw error when trying to update ID column", () => {
524
+ const operation: MigrationOperation = {
525
+ type: "alter-table",
526
+ name: "test_table",
527
+ value: [
528
+ {
529
+ type: "update-column",
530
+ name: "id",
531
+ value: {
532
+ name: "id",
533
+ type: "bigint",
534
+ isNullable: false,
535
+ role: "external-id",
536
+ },
537
+ updateDataType: true,
538
+ updateNullable: false,
539
+ updateDefault: false,
540
+ },
541
+ ],
542
+ };
543
+
544
+ expect(() => generator.compile([operation])).toThrow(
545
+ "ID columns cannot be updated. Not every database supports updating primary keys and often requires workarounds.",
546
+ );
547
+ });
548
+
549
+ it("should handle no-op update-column (no flags set)", () => {
550
+ const operation: MigrationOperation = {
551
+ type: "alter-table",
552
+ name: "test_table",
553
+ value: [
554
+ {
555
+ type: "update-column",
556
+ name: "test_col",
557
+ value: {
558
+ name: "test_col",
559
+ type: "string",
560
+ isNullable: true,
561
+ role: "regular",
562
+ },
563
+ updateDataType: false,
564
+ updateNullable: false,
565
+ updateDefault: false,
566
+ },
567
+ ],
568
+ };
569
+
570
+ const statements = compileMany(operation);
571
+ // No-op should return empty array
572
+ expect(statements).toHaveLength(0);
573
+ });
574
+
575
+ it("should generate SQL for timestamp default", () => {
576
+ const operation: MigrationOperation = {
577
+ type: "alter-table",
578
+ name: "test_table",
579
+ value: [
580
+ {
581
+ type: "update-column",
582
+ name: "updated_at",
583
+ value: {
584
+ name: "updated_at",
585
+ type: "timestamp",
586
+ isNullable: false,
587
+ role: "regular",
588
+ default: { dbSpecial: "now" },
589
+ },
590
+ updateDataType: false,
591
+ updateNullable: false,
592
+ updateDefault: true,
593
+ },
594
+ ],
595
+ };
596
+
597
+ const statements = compileMany(operation);
598
+ expect(statements).toHaveLength(1);
599
+ expect(statements[0]).toMatchInlineSnapshot(
600
+ `"alter table "test_table" alter column "updated_at" set default CURRENT_TIMESTAMP"`,
601
+ );
602
+ });
603
+ });
604
+
605
+ describe("add-foreign-key", () => {
606
+ it("should generate SQL for foreign key constraint", () => {
607
+ const operation: MigrationOperation = {
608
+ type: "add-foreign-key",
609
+ table: "posts",
610
+ value: {
611
+ name: "posts_user_id_fk",
612
+ columns: ["user_id"],
613
+ referencedTable: "users",
614
+ referencedColumns: ["id"],
615
+ },
616
+ };
617
+
618
+ const sql = compileOne(operation);
619
+ expect(sql).toMatchInlineSnapshot(
620
+ `"alter table "posts" add constraint "posts_user_id_fk" foreign key ("user_id") references "users" ("id") on delete restrict on update restrict"`,
621
+ );
622
+ });
623
+
624
+ it("should generate SQL for composite foreign key", () => {
625
+ const operation: MigrationOperation = {
626
+ type: "add-foreign-key",
627
+ table: "posts",
628
+ value: {
629
+ name: "posts_user_fk",
630
+ columns: ["org_id", "user_id"],
631
+ referencedTable: "users",
632
+ referencedColumns: ["org_id", "user_id"],
633
+ },
634
+ };
635
+
636
+ const sql = compileOne(operation);
637
+ expect(sql).toMatchInlineSnapshot(
638
+ `"alter table "posts" add constraint "posts_user_fk" foreign key ("org_id", "user_id") references "users" ("org_id", "user_id") on delete restrict on update restrict"`,
639
+ );
640
+ });
641
+ });
642
+
643
+ describe("drop-foreign-key", () => {
644
+ it("should generate SQL to drop foreign key constraint", () => {
645
+ const operation: MigrationOperation = {
646
+ type: "drop-foreign-key",
647
+ table: "posts",
648
+ name: "posts_user_id_fk",
649
+ };
650
+
651
+ const sql = compileOne(operation);
652
+ expect(sql).toMatchInlineSnapshot(
653
+ `"alter table "posts" drop constraint if exists "posts_user_id_fk""`,
654
+ );
655
+ });
656
+ });
657
+
658
+ describe("add-index", () => {
659
+ it("should generate SQL for regular index", () => {
660
+ const operation: MigrationOperation = {
661
+ type: "add-index",
662
+ table: "test_table",
663
+ columns: ["email"],
664
+ name: "idx_email",
665
+ unique: false,
666
+ };
667
+
668
+ const sql = compileOne(operation);
669
+ expect(sql).toMatchInlineSnapshot(`"create index "idx_email" on "test_table" ("email")"`);
670
+ });
671
+
672
+ it("should generate SQL for unique index", () => {
673
+ const operation: MigrationOperation = {
674
+ type: "add-index",
675
+ table: "test_table",
676
+ columns: ["email"],
677
+ name: "idx_unique_email",
678
+ unique: true,
679
+ };
680
+
681
+ const sql = compileOne(operation);
682
+ expect(sql).toMatchInlineSnapshot(
683
+ `"create unique index "idx_unique_email" on "test_table" ("email")"`,
684
+ );
685
+ });
686
+
687
+ it("should generate SQL for composite index", () => {
688
+ const operation: MigrationOperation = {
689
+ type: "add-index",
690
+ table: "test_table",
691
+ columns: ["email", "name"],
692
+ name: "idx_email_name",
693
+ unique: false,
694
+ };
695
+
696
+ const sql = compileOne(operation);
697
+ expect(sql).toMatchInlineSnapshot(
698
+ `"create index "idx_email_name" on "test_table" ("email", "name")"`,
699
+ );
700
+ });
701
+
702
+ it("should generate SQL for unique composite index", () => {
703
+ const operation: MigrationOperation = {
704
+ type: "add-index",
705
+ table: "test_table",
706
+ columns: ["email", "name"],
707
+ name: "idx_unique_email_name",
708
+ unique: true,
709
+ };
710
+
711
+ const sql = compileOne(operation);
712
+ expect(sql).toMatchInlineSnapshot(
713
+ `"create unique index "idx_unique_email_name" on "test_table" ("email", "name")"`,
714
+ );
715
+ });
716
+ });
717
+
718
+ describe("drop-index", () => {
719
+ it("should generate SQL to drop index", () => {
720
+ const operation: MigrationOperation = {
721
+ type: "drop-index",
722
+ table: "test_table",
723
+ name: "idx_email",
724
+ };
725
+
726
+ const sql = compileOne(operation);
727
+ expect(sql).toMatchInlineSnapshot(`"drop index if exists "idx_email" on "test_table""`);
728
+ });
729
+ });
730
+
731
+ describe("complex migration scenarios", () => {
732
+ it("should generate correct SQL for full schema migration", () => {
733
+ const operations: MigrationOperation[] = [
734
+ {
735
+ type: "create-table",
736
+ name: "users",
737
+ columns: [
738
+ { name: "id", type: "integer", isNullable: false, role: "external-id" },
739
+ { name: "email", type: "string", isNullable: false, role: "regular" },
740
+ { name: "name", type: "string", isNullable: false, role: "regular" },
741
+ ],
742
+ },
743
+ {
744
+ type: "add-index",
745
+ table: "users",
746
+ columns: ["email"],
747
+ name: "idx_unique_email",
748
+ unique: true,
749
+ },
750
+ {
751
+ type: "create-table",
752
+ name: "posts",
753
+ columns: [
754
+ { name: "id", type: "integer", isNullable: false, role: "external-id" },
755
+ { name: "user_id", type: "integer", isNullable: false, role: "reference" },
756
+ { name: "title", type: "string", isNullable: false, role: "regular" },
757
+ { name: "content", type: "string", isNullable: false, role: "regular" },
758
+ ],
759
+ },
760
+ {
761
+ type: "add-foreign-key",
762
+ table: "posts",
763
+ value: {
764
+ name: "posts_user_id_fk",
765
+ columns: ["user_id"],
766
+ referencedTable: "users",
767
+ referencedColumns: ["id"],
768
+ },
769
+ },
770
+ {
771
+ type: "alter-table",
772
+ name: "posts",
773
+ value: [
774
+ {
775
+ type: "create-column",
776
+ value: {
777
+ name: "published",
778
+ type: "bool",
779
+ isNullable: false,
780
+ role: "regular",
781
+ default: { value: false },
782
+ },
783
+ },
784
+ ],
785
+ },
786
+ ];
787
+
788
+ const statements = generator.compile(operations);
789
+ expect(statements).toHaveLength(5);
790
+ expect(statements[0].sql).toMatchInlineSnapshot(
791
+ `"create table "users" ("id" integer not null unique, "email" text not null, "name" text not null)"`,
792
+ );
793
+ expect(statements[1].sql).toMatchInlineSnapshot(
794
+ `"create unique index "idx_unique_email" on "users" ("email")"`,
795
+ );
796
+ expect(statements[2].sql).toMatchInlineSnapshot(
797
+ `"create table "posts" ("id" integer not null unique, "user_id" integer not null, "title" text not null, "content" text not null)"`,
798
+ );
799
+ expect(statements[3].sql).toMatchInlineSnapshot(
800
+ `"alter table "posts" add constraint "posts_user_id_fk" foreign key ("user_id") references "users" ("id") on delete restrict on update restrict"`,
801
+ );
802
+ expect(statements[4].sql).toMatchInlineSnapshot(
803
+ `"alter table "posts" add column "published" boolean default false not null"`,
804
+ );
805
+ });
806
+
807
+ it("should handle multiple alter-table operations", () => {
808
+ const operation: MigrationOperation = {
809
+ type: "alter-table",
810
+ name: "users",
811
+ value: [
812
+ {
813
+ type: "create-column",
814
+ value: {
815
+ name: "age",
816
+ type: "integer",
817
+ isNullable: true,
818
+ role: "regular",
819
+ },
820
+ },
821
+ {
822
+ type: "rename-column",
823
+ from: "name",
824
+ to: "full_name",
825
+ },
826
+ {
827
+ type: "drop-column",
828
+ name: "old_field",
829
+ },
830
+ ],
831
+ };
832
+
833
+ const statements = compileMany(operation);
834
+ expect(statements).toHaveLength(3);
835
+ expect(statements[0]).toMatchInlineSnapshot(`"alter table "users" add column "age" integer"`);
836
+ expect(statements[1]).toMatchInlineSnapshot(
837
+ `"alter table "users" rename column "name" to "full_name""`,
838
+ );
839
+ expect(statements[2]).toMatchInlineSnapshot(`"alter table "users" drop column "old_field""`);
840
+ });
841
+ });
842
+
843
+ describe("edge cases", () => {
844
+ it("should handle table names with special characters", () => {
845
+ const operation: MigrationOperation = {
846
+ type: "create-table",
847
+ name: "user-profiles",
848
+ columns: [{ name: "id", type: "integer", isNullable: false, role: "external-id" }],
849
+ };
850
+
851
+ const sql = compileOne(operation);
852
+ expect(sql).toContain('"user-profiles"');
853
+ });
854
+
855
+ it("should handle column names with special characters", () => {
856
+ const operation: MigrationOperation = {
857
+ type: "create-table",
858
+ name: "test",
859
+ columns: [
860
+ { name: "id", type: "integer", isNullable: false, role: "external-id" },
861
+ { name: "user-name", type: "string", isNullable: false, role: "regular" },
862
+ ],
863
+ };
864
+
865
+ const sql = compileOne(operation);
866
+ expect(sql).toContain('"user-name"');
867
+ });
868
+
869
+ it("should properly escape string default values", () => {
870
+ const operation: MigrationOperation = {
871
+ type: "create-table",
872
+ name: "test",
873
+ columns: [
874
+ { name: "id", type: "integer", isNullable: false, role: "external-id" },
875
+ {
876
+ name: "status",
877
+ type: "string",
878
+ isNullable: false,
879
+ role: "regular",
880
+ default: { value: "it's pending" },
881
+ },
882
+ ],
883
+ };
884
+
885
+ const sql = compileOne(operation);
886
+ expect(sql).toMatchInlineSnapshot(
887
+ `"create table "test" ("id" integer not null unique, "status" text default 'it''s pending' not null)"`,
888
+ );
889
+ });
890
+ });
891
+
892
+ describe("table name mapping", () => {
893
+ const mapper = {
894
+ toPhysical: (name: string) => `prefix_${name}`,
895
+ toLogical: (name: string) => name.replace("prefix_", ""),
896
+ };
897
+
898
+ it("should apply table name mapping to create-table", () => {
899
+ const operation: MigrationOperation = {
900
+ type: "create-table",
901
+ name: "users",
902
+ columns: [{ name: "id", type: "integer", isNullable: false, role: "external-id" }],
903
+ };
904
+
905
+ const statements = generator.compile([operation], mapper);
906
+ expect(statements[0].sql).toMatchInlineSnapshot(
907
+ `"create table "prefix_users" ("id" integer not null unique)"`,
908
+ );
909
+ });
910
+
911
+ it("should apply table name mapping to foreign keys", () => {
912
+ const operation: MigrationOperation = {
913
+ type: "add-foreign-key",
914
+ table: "posts",
915
+ value: {
916
+ name: "posts_user_id_fk",
917
+ columns: ["user_id"],
918
+ referencedTable: "users",
919
+ referencedColumns: ["id"],
920
+ },
921
+ };
922
+
923
+ const statements = generator.compile([operation], mapper);
924
+ expect(statements[0].sql).toMatchInlineSnapshot(
925
+ `"alter table "prefix_posts" add constraint "posts_user_id_fk" foreign key ("user_id") references "prefix_users" ("id") on delete restrict on update restrict"`,
926
+ );
927
+ });
928
+
929
+ it("should apply table name mapping to indexes", () => {
930
+ const operation: MigrationOperation = {
931
+ type: "add-index",
932
+ table: "users",
933
+ columns: ["email"],
934
+ name: "idx_email",
935
+ unique: true,
936
+ };
937
+
938
+ const statements = generator.compile([operation], mapper);
939
+ expect(statements[0].sql).toMatchInlineSnapshot(
940
+ `"create unique index "idx_email_prefix_users" on "prefix_users" ("email")"`,
941
+ );
942
+ });
943
+ });
944
+
945
+ describe("preprocessing", () => {
946
+ it("should not modify operations (PostgreSQL doesn't need preprocessing)", () => {
947
+ const operations: MigrationOperation[] = [
948
+ {
949
+ type: "create-table",
950
+ name: "users",
951
+ columns: [{ name: "id", type: "string", isNullable: false, role: "external-id" }],
952
+ },
953
+ ];
954
+
955
+ const preprocessed = generator.preprocess(operations);
956
+ expect(preprocessed).toEqual(operations);
957
+ });
958
+ });
959
+
960
+ describe("getDefaultValue", () => {
961
+ it("should return literal value for all column types", () => {
962
+ const defaultValue = generator.getDefaultValue({
963
+ name: "status",
964
+ type: "string",
965
+ isNullable: false,
966
+ role: "regular",
967
+ default: { value: "active" },
968
+ });
969
+
970
+ expect(defaultValue).toBeDefined();
971
+ });
972
+
973
+ it("should return CURRENT_TIMESTAMP for dbSpecial: now", () => {
974
+ const defaultValue = generator.getDefaultValue({
975
+ name: "created_at",
976
+ type: "timestamp",
977
+ isNullable: false,
978
+ role: "regular",
979
+ default: { dbSpecial: "now" },
980
+ });
981
+
982
+ expect(defaultValue).toBeDefined();
983
+ });
984
+
985
+ it("should return undefined for runtime defaults", () => {
986
+ const defaultValue = generator.getDefaultValue({
987
+ name: "id",
988
+ type: "string",
989
+ isNullable: false,
990
+ role: "regular",
991
+ default: { runtime: "cuid" },
992
+ });
993
+
994
+ expect(defaultValue).toBeUndefined();
995
+ });
996
+
997
+ it("should return undefined when no default is set", () => {
998
+ const defaultValue = generator.getDefaultValue({
999
+ name: "name",
1000
+ type: "string",
1001
+ isNullable: false,
1002
+ role: "regular",
1003
+ });
1004
+
1005
+ expect(defaultValue).toBeUndefined();
1006
+ });
1007
+ });
1008
+ });