@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
@@ -1,28 +1,37 @@
1
- import { Kysely, MysqlDialect } from "kysely";
2
- import { describe, expect, it, beforeAll } from "vitest";
3
- import { execute } from "./execute";
4
- import type { MigrationOperation } from "../../../migration-engine/shared";
5
- import type { KyselyConfig } from "../kysely-adapter";
6
-
7
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
8
- type KyselyAny = Kysely<any>;
9
-
10
- function assertSingleResult<T>(result: T | T[]): asserts result is T {
11
- if (Array.isArray(result)) {
12
- throw new Error("Expected single result, got array");
1
+ import { describe, expect, it } from "vitest";
2
+ import type { MigrationOperation } from "../../../../migration-engine/shared";
3
+ import { createColdKysely } from "../cold-kysely";
4
+ import { MySQLSQLGenerator } from "./mysql";
5
+
6
+ describe("MySQLSQLGenerator", () => {
7
+ const coldKysely = createColdKysely("mysql");
8
+ const generator = new MySQLSQLGenerator(coldKysely, "mysql");
9
+
10
+ /**
11
+ * Helper to compile a single operation and extract the main SQL statement.
12
+ * MySQL wraps operations with FK checks, so the main statement is at index 1.
13
+ */
14
+ function compileOne(operation: MigrationOperation): string {
15
+ const statements = generator.compile([operation]);
16
+ // MySQL wraps with FK checks: [SET FK=0, ...operations..., SET FK=1]
17
+ expect(statements.length).toBeGreaterThanOrEqual(3);
18
+ expect(statements[0].sql).toBe("SET FOREIGN_KEY_CHECKS = 0");
19
+ expect(statements[statements.length - 1].sql).toBe("SET FOREIGN_KEY_CHECKS = 1");
20
+ return statements[1].sql;
13
21
  }
14
- }
15
22
 
16
- describe("execute() - MySQL", () => {
17
- let db: KyselyAny;
18
- let config: KyselyConfig;
19
-
20
- beforeAll(async () => {
21
- // Create a Kysely instance with a MysqlDialect, but not actually connected to a database
22
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
23
- db = new Kysely({ dialect: new MysqlDialect({} as any) });
24
- config = { db, provider: "mysql" };
25
- });
23
+ /**
24
+ * Helper to compile a single operation and extract all main SQL statements.
25
+ * For alter-table operations that generate multiple statements.
26
+ */
27
+ function compileMany(operation: MigrationOperation): string[] {
28
+ const statements = generator.compile([operation]);
29
+ expect(statements.length).toBeGreaterThanOrEqual(2);
30
+ expect(statements[0].sql).toBe("SET FOREIGN_KEY_CHECKS = 0");
31
+ expect(statements[statements.length - 1].sql).toBe("SET FOREIGN_KEY_CHECKS = 1");
32
+ // Return everything except FK check statements
33
+ return statements.slice(1, -1).map((s) => s.sql);
34
+ }
26
35
 
27
36
  describe("create-table", () => {
28
37
  it("should generate SQL for simple table with columns", () => {
@@ -51,14 +60,8 @@ describe("execute() - MySQL", () => {
51
60
  ],
52
61
  };
53
62
 
54
- const result = execute(operation, config, () => {
55
- throw new Error("No custom operations");
56
- });
57
-
58
- assertSingleResult(result);
59
-
60
- const compiled = result.compile();
61
- expect(compiled.sql).toMatchInlineSnapshot(
63
+ const sql = compileOne(operation);
64
+ expect(sql).toMatchInlineSnapshot(
62
65
  `"create table \`users\` (\`id\` integer not null unique, \`name\` text not null, \`email\` text not null)"`,
63
66
  );
64
67
  });
@@ -80,15 +83,9 @@ describe("execute() - MySQL", () => {
80
83
  ],
81
84
  };
82
85
 
83
- const result = execute(operation, config, () => {
84
- throw new Error("No custom operations");
85
- });
86
-
87
- assertSingleResult(result);
88
-
89
- const compiled = result.compile();
90
- expect(compiled.sql).toMatchInlineSnapshot(
91
- `"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\` longblob not null, \`col_varchar\` varchar(255) not null)"`,
86
+ const sql = compileOne(operation);
87
+ expect(sql).toMatchInlineSnapshot(
88
+ `"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\` datetime not null, \`col_json\` json not null, \`col_binary\` longblob not null, \`col_varchar\` varchar(255) not null)"`,
92
89
  );
93
90
  });
94
91
 
@@ -103,14 +100,8 @@ describe("execute() - MySQL", () => {
103
100
  ],
104
101
  };
105
102
 
106
- const result = execute(operation, config, () => {
107
- throw new Error("No custom operations");
108
- });
109
-
110
- assertSingleResult(result);
111
-
112
- const compiled = result.compile();
113
- expect(compiled.sql).toMatchInlineSnapshot(
103
+ const sql = compileOne(operation);
104
+ expect(sql).toMatchInlineSnapshot(
114
105
  `"create table \`nullable_test\` (\`id\` integer not null unique, \`optional_name\` text, \`optional_age\` integer)"`,
115
106
  );
116
107
  });
@@ -145,14 +136,9 @@ describe("execute() - MySQL", () => {
145
136
  ],
146
137
  };
147
138
 
148
- const result = execute(operation, config, () => {
149
- throw new Error("No custom operations");
150
- });
151
-
152
- assertSingleResult(result);
153
-
154
- const compiled = result.compile();
155
- expect(compiled.sql).toMatchInlineSnapshot(
139
+ const sql = compileOne(operation);
140
+ // Note: MySQL doesn't support defaults on TEXT columns, so 'status' won't have a default
141
+ expect(sql).toMatchInlineSnapshot(
156
142
  `"create table \`defaults_test\` (\`id\` integer not null unique, \`status\` text not null, \`count\` integer default 0 not null, \`is_active\` boolean default true not null)"`,
157
143
  );
158
144
  });
@@ -173,15 +159,9 @@ describe("execute() - MySQL", () => {
173
159
  ],
174
160
  };
175
161
 
176
- const result = execute(operation, config, () => {
177
- throw new Error("No custom operations");
178
- });
179
-
180
- assertSingleResult(result);
181
-
182
- const compiled = result.compile();
183
- expect(compiled.sql).toMatchInlineSnapshot(
184
- `"create table \`timestamps_test\` (\`id\` integer not null unique, \`created_at\` timestamp default CURRENT_TIMESTAMP not null)"`,
162
+ const sql = compileOne(operation);
163
+ expect(sql).toMatchInlineSnapshot(
164
+ `"create table \`timestamps_test\` (\`id\` integer not null unique, \`created_at\` datetime default CURRENT_TIMESTAMP not null)"`,
185
165
  );
186
166
  });
187
167
 
@@ -196,15 +176,25 @@ describe("execute() - MySQL", () => {
196
176
  ],
197
177
  };
198
178
 
199
- const result = execute(operation, config, () => {
200
- throw new Error("No custom operations");
201
- });
179
+ const sql = compileOne(operation);
180
+ expect(sql).toMatchInlineSnapshot(
181
+ `"create table \`posts\` (\`id\` integer not null unique, \`user_id\` integer not null, \`title\` text not null)"`,
182
+ );
183
+ });
202
184
 
203
- assertSingleResult(result);
185
+ it("should generate SQL for table with internal-id column (auto_increment)", () => {
186
+ const operation: MigrationOperation = {
187
+ type: "create-table",
188
+ name: "users",
189
+ columns: [
190
+ { name: "_internalId", type: "bigint", isNullable: false, role: "internal-id" },
191
+ { name: "name", type: "string", isNullable: false, role: "regular" },
192
+ ],
193
+ };
204
194
 
205
- const compiled = result.compile();
206
- expect(compiled.sql).toMatchInlineSnapshot(
207
- `"create table \`posts\` (\`id\` integer not null unique, \`user_id\` integer not null, \`title\` text not null)"`,
195
+ const sql = compileOne(operation);
196
+ expect(sql).toMatchInlineSnapshot(
197
+ `"create table \`users\` (\`_internalId\` bigint not null primary key auto_increment, \`name\` text not null)"`,
208
198
  );
209
199
  });
210
200
  });
@@ -217,16 +207,8 @@ describe("execute() - MySQL", () => {
217
207
  to: "new_name",
218
208
  };
219
209
 
220
- const result = execute(operation, config, () => {
221
- throw new Error("No custom operations");
222
- });
223
-
224
- assertSingleResult(result);
225
-
226
- const compiled = result.compile();
227
- expect(compiled.sql).toMatchInlineSnapshot(
228
- `"alter table \`old_name\` rename to \`new_name\`"`,
229
- );
210
+ const sql = compileOne(operation);
211
+ expect(sql).toMatchInlineSnapshot(`"alter table \`old_name\` rename to \`new_name\`"`);
230
212
  });
231
213
  });
232
214
 
@@ -237,14 +219,8 @@ describe("execute() - MySQL", () => {
237
219
  name: "to_drop",
238
220
  };
239
221
 
240
- const result = execute(operation, config, () => {
241
- throw new Error("No custom operations");
242
- });
243
-
244
- assertSingleResult(result);
245
-
246
- const compiled = result.compile();
247
- expect(compiled.sql).toMatchInlineSnapshot(`"drop table \`to_drop\`"`);
222
+ const sql = compileOne(operation);
223
+ expect(sql).toMatchInlineSnapshot(`"drop table \`to_drop\`"`);
248
224
  });
249
225
  });
250
226
 
@@ -266,17 +242,9 @@ describe("execute() - MySQL", () => {
266
242
  ],
267
243
  };
268
244
 
269
- const results = execute(operation, config, () => {
270
- throw new Error("No custom operations");
271
- });
272
-
273
- if (!Array.isArray(results)) {
274
- throw new Error("Expected array of results");
275
- }
276
-
277
- expect(results).toHaveLength(1);
278
- const compiled = results[0].compile();
279
- expect(compiled.sql).toMatchInlineSnapshot(
245
+ const statements = compileMany(operation);
246
+ expect(statements).toHaveLength(1);
247
+ expect(statements[0]).toMatchInlineSnapshot(
280
248
  `"alter table \`test_table\` add column \`new_column\` text"`,
281
249
  );
282
250
  });
@@ -308,19 +276,12 @@ describe("execute() - MySQL", () => {
308
276
  ],
309
277
  };
310
278
 
311
- const results = execute(operation, config, () => {
312
- throw new Error("No custom operations");
313
- });
314
-
315
- if (!Array.isArray(results)) {
316
- throw new Error("Expected array of results");
317
- }
318
-
319
- expect(results).toHaveLength(2);
320
- expect(results[0].compile().sql).toMatchInlineSnapshot(
279
+ const statements = compileMany(operation);
280
+ expect(statements).toHaveLength(2);
281
+ expect(statements[0]).toMatchInlineSnapshot(
321
282
  `"alter table \`test_table\` add column \`col1\` text"`,
322
283
  );
323
- expect(results[1].compile().sql).toMatchInlineSnapshot(
284
+ expect(statements[1]).toMatchInlineSnapshot(
324
285
  `"alter table \`test_table\` add column \`col2\` integer default 0 not null"`,
325
286
  );
326
287
  });
@@ -340,17 +301,9 @@ describe("execute() - MySQL", () => {
340
301
  ],
341
302
  };
342
303
 
343
- const results = execute(operation, config, () => {
344
- throw new Error("No custom operations");
345
- });
346
-
347
- if (!Array.isArray(results)) {
348
- throw new Error("Expected array of results");
349
- }
350
-
351
- expect(results).toHaveLength(1);
352
- const compiled = results[0].compile();
353
- expect(compiled.sql).toMatchInlineSnapshot(
304
+ const statements = compileMany(operation);
305
+ expect(statements).toHaveLength(1);
306
+ expect(statements[0]).toMatchInlineSnapshot(
354
307
  `"alter table \`test_table\` rename column \`old_name\` to \`new_name\`"`,
355
308
  );
356
309
  });
@@ -369,24 +322,16 @@ describe("execute() - MySQL", () => {
369
322
  ],
370
323
  };
371
324
 
372
- const results = execute(operation, config, () => {
373
- throw new Error("No custom operations");
374
- });
375
-
376
- if (!Array.isArray(results)) {
377
- throw new Error("Expected array of results");
378
- }
379
-
380
- expect(results).toHaveLength(1);
381
- const compiled = results[0].compile();
382
- expect(compiled.sql).toMatchInlineSnapshot(
325
+ const statements = compileMany(operation);
326
+ expect(statements).toHaveLength(1);
327
+ expect(statements[0]).toMatchInlineSnapshot(
383
328
  `"alter table \`test_table\` drop column \`to_drop\`"`,
384
329
  );
385
330
  });
386
331
  });
387
332
 
388
333
  describe("alter-table - update-column", () => {
389
- it("should generate SQL to update column data type (MySQL doesn't use USING clause)", () => {
334
+ it("should generate SQL to update column data type (MySQL uses MODIFY COLUMN)", () => {
390
335
  const operation: MigrationOperation = {
391
336
  type: "alter-table",
392
337
  name: "test_table",
@@ -407,17 +352,9 @@ describe("execute() - MySQL", () => {
407
352
  ],
408
353
  };
409
354
 
410
- const results = execute(operation, config, () => {
411
- throw new Error("No custom operations");
412
- });
413
-
414
- if (!Array.isArray(results)) {
415
- throw new Error("Expected array of results");
416
- }
417
-
418
- expect(results).toHaveLength(1);
419
- const compiled = results[0].compile();
420
- expect(compiled.sql).toMatchInlineSnapshot(
355
+ const statements = compileMany(operation);
356
+ expect(statements).toHaveLength(1);
357
+ expect(statements[0]).toMatchInlineSnapshot(
421
358
  `"alter table \`test_table\` modify column \`test_col\` integer"`,
422
359
  );
423
360
  });
@@ -443,17 +380,9 @@ describe("execute() - MySQL", () => {
443
380
  ],
444
381
  };
445
382
 
446
- const results = execute(operation, config, () => {
447
- throw new Error("No custom operations");
448
- });
449
-
450
- if (!Array.isArray(results)) {
451
- throw new Error("Expected array of results");
452
- }
453
-
454
- expect(results).toHaveLength(1);
455
- const compiled = results[0].compile();
456
- expect(compiled.sql).toMatchInlineSnapshot(
383
+ const statements = compileMany(operation);
384
+ expect(statements).toHaveLength(1);
385
+ expect(statements[0]).toMatchInlineSnapshot(
457
386
  `"alter table \`test_table\` modify column \`test_col\` text not null"`,
458
387
  );
459
388
  });
@@ -479,17 +408,9 @@ describe("execute() - MySQL", () => {
479
408
  ],
480
409
  };
481
410
 
482
- const results = execute(operation, config, () => {
483
- throw new Error("No custom operations");
484
- });
485
-
486
- if (!Array.isArray(results)) {
487
- throw new Error("Expected array of results");
488
- }
489
-
490
- expect(results).toHaveLength(1);
491
- const compiled = results[0].compile();
492
- expect(compiled.sql).toMatchInlineSnapshot(
411
+ const statements = compileMany(operation);
412
+ expect(statements).toHaveLength(1);
413
+ expect(statements[0]).toMatchInlineSnapshot(
493
414
  `"alter table \`test_table\` modify column \`test_col\` text"`,
494
415
  );
495
416
  });
@@ -516,17 +437,10 @@ describe("execute() - MySQL", () => {
516
437
  ],
517
438
  };
518
439
 
519
- const results = execute(operation, config, () => {
520
- throw new Error("No custom operations");
521
- });
522
-
523
- if (!Array.isArray(results)) {
524
- throw new Error("Expected array of results");
525
- }
526
-
527
- expect(results).toHaveLength(1);
528
- const compiled = results[0].compile();
529
- expect(compiled.sql).toMatchInlineSnapshot(
440
+ const statements = compileMany(operation);
441
+ expect(statements).toHaveLength(1);
442
+ // Note: MySQL doesn't support defaults on TEXT columns
443
+ expect(statements[0]).toMatchInlineSnapshot(
530
444
  `"alter table \`test_table\` modify column \`test_col\` text not null"`,
531
445
  );
532
446
  });
@@ -552,17 +466,9 @@ describe("execute() - MySQL", () => {
552
466
  ],
553
467
  };
554
468
 
555
- const results = execute(operation, config, () => {
556
- throw new Error("No custom operations");
557
- });
558
-
559
- if (!Array.isArray(results)) {
560
- throw new Error("Expected array of results");
561
- }
562
-
563
- expect(results).toHaveLength(1);
564
- const compiled = results[0].compile();
565
- expect(compiled.sql).toMatchInlineSnapshot(
469
+ const statements = compileMany(operation);
470
+ expect(statements).toHaveLength(1);
471
+ expect(statements[0]).toMatchInlineSnapshot(
566
472
  `"alter table \`test_table\` modify column \`test_col\` text"`,
567
473
  );
568
474
  });
@@ -589,16 +495,9 @@ describe("execute() - MySQL", () => {
589
495
  ],
590
496
  };
591
497
 
592
- const results = execute(operation, config, () => {
593
- throw new Error("No custom operations");
594
- });
595
-
596
- if (!Array.isArray(results)) {
597
- throw new Error("Expected array of results");
598
- }
599
-
600
- expect(results).toHaveLength(1);
601
- expect(results[0].compile().sql).toMatchInlineSnapshot(
498
+ const statements = compileMany(operation);
499
+ expect(statements).toHaveLength(1);
500
+ expect(statements[0]).toMatchInlineSnapshot(
602
501
  `"alter table \`test_table\` modify column \`test_col\` integer default 0 not null"`,
603
502
  );
604
503
  });
@@ -624,11 +523,7 @@ describe("execute() - MySQL", () => {
624
523
  ],
625
524
  };
626
525
 
627
- expect(() => {
628
- execute(operation, config, () => {
629
- throw new Error("No custom operations");
630
- });
631
- }).toThrow(
526
+ expect(() => generator.compile([operation])).toThrow(
632
527
  "ID columns cannot be updated. Not every database supports updating primary keys and often requires workarounds.",
633
528
  );
634
529
  });
@@ -654,16 +549,9 @@ describe("execute() - MySQL", () => {
654
549
  ],
655
550
  };
656
551
 
657
- const results = execute(operation, config, () => {
658
- throw new Error("No custom operations");
659
- });
660
-
661
- if (!Array.isArray(results)) {
662
- throw new Error("Expected array of results");
663
- }
664
-
665
- // No-op should return empty array
666
- expect(results).toHaveLength(0);
552
+ const statements = compileMany(operation);
553
+ // No-op should return empty array (only FK check statements remain)
554
+ expect(statements).toHaveLength(0);
667
555
  });
668
556
 
669
557
  it("should generate SQL for timestamp default", () => {
@@ -688,18 +576,10 @@ describe("execute() - MySQL", () => {
688
576
  ],
689
577
  };
690
578
 
691
- const results = execute(operation, config, () => {
692
- throw new Error("No custom operations");
693
- });
694
-
695
- if (!Array.isArray(results)) {
696
- throw new Error("Expected array of results");
697
- }
698
-
699
- expect(results).toHaveLength(1);
700
- const compiled = results[0].compile();
701
- expect(compiled.sql).toMatchInlineSnapshot(
702
- `"alter table \`test_table\` modify column \`updated_at\` timestamp default CURRENT_TIMESTAMP not null"`,
579
+ const statements = compileMany(operation);
580
+ expect(statements).toHaveLength(1);
581
+ expect(statements[0]).toMatchInlineSnapshot(
582
+ `"alter table \`test_table\` modify column \`updated_at\` datetime default CURRENT_TIMESTAMP not null"`,
703
583
  );
704
584
  });
705
585
  });
@@ -717,14 +597,8 @@ describe("execute() - MySQL", () => {
717
597
  },
718
598
  };
719
599
 
720
- const result = execute(operation, config, () => {
721
- throw new Error("No custom operations");
722
- });
723
-
724
- assertSingleResult(result);
725
-
726
- const compiled = result.compile();
727
- expect(compiled.sql).toMatchInlineSnapshot(
600
+ const sql = compileOne(operation);
601
+ expect(sql).toMatchInlineSnapshot(
728
602
  `"alter table \`posts\` add constraint \`posts_user_id_fk\` foreign key (\`user_id\`) references \`users\` (\`id\`) on delete restrict on update restrict"`,
729
603
  );
730
604
  });
@@ -741,14 +615,8 @@ describe("execute() - MySQL", () => {
741
615
  },
742
616
  };
743
617
 
744
- const result = execute(operation, config, () => {
745
- throw new Error("No custom operations");
746
- });
747
-
748
- assertSingleResult(result);
749
-
750
- const compiled = result.compile();
751
- expect(compiled.sql).toMatchInlineSnapshot(
618
+ const sql = compileOne(operation);
619
+ expect(sql).toMatchInlineSnapshot(
752
620
  `"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"`,
753
621
  );
754
622
  });
@@ -762,14 +630,8 @@ describe("execute() - MySQL", () => {
762
630
  name: "posts_user_id_fk",
763
631
  };
764
632
 
765
- const result = execute(operation, config, () => {
766
- throw new Error("No custom operations");
767
- });
768
-
769
- assertSingleResult(result);
770
-
771
- const compiled = result.compile();
772
- expect(compiled.sql).toMatchInlineSnapshot(
633
+ const sql = compileOne(operation);
634
+ expect(sql).toMatchInlineSnapshot(
773
635
  `"alter table \`posts\` drop constraint \`posts_user_id_fk\`"`,
774
636
  );
775
637
  });
@@ -785,14 +647,8 @@ describe("execute() - MySQL", () => {
785
647
  unique: false,
786
648
  };
787
649
 
788
- const result = execute(operation, config, () => {
789
- throw new Error("No custom operations");
790
- });
791
-
792
- assertSingleResult(result);
793
-
794
- const compiled = result.compile();
795
- expect(compiled.sql).toMatchInlineSnapshot(
650
+ const sql = compileOne(operation);
651
+ expect(sql).toMatchInlineSnapshot(
796
652
  `"create index \`idx_email\` on \`test_table\` (\`email\`)"`,
797
653
  );
798
654
  });
@@ -806,14 +662,8 @@ describe("execute() - MySQL", () => {
806
662
  unique: true,
807
663
  };
808
664
 
809
- const result = execute(operation, config, () => {
810
- throw new Error("No custom operations");
811
- });
812
-
813
- assertSingleResult(result);
814
-
815
- const compiled = result.compile();
816
- expect(compiled.sql).toMatchInlineSnapshot(
665
+ const sql = compileOne(operation);
666
+ expect(sql).toMatchInlineSnapshot(
817
667
  `"create unique index \`idx_unique_email\` on \`test_table\` (\`email\`)"`,
818
668
  );
819
669
  });
@@ -827,14 +677,8 @@ describe("execute() - MySQL", () => {
827
677
  unique: false,
828
678
  };
829
679
 
830
- const result = execute(operation, config, () => {
831
- throw new Error("No custom operations");
832
- });
833
-
834
- assertSingleResult(result);
835
-
836
- const compiled = result.compile();
837
- expect(compiled.sql).toMatchInlineSnapshot(
680
+ const sql = compileOne(operation);
681
+ expect(sql).toMatchInlineSnapshot(
838
682
  `"create index \`idx_email_name\` on \`test_table\` (\`email\`, \`name\`)"`,
839
683
  );
840
684
  });
@@ -848,14 +692,8 @@ describe("execute() - MySQL", () => {
848
692
  unique: true,
849
693
  };
850
694
 
851
- const result = execute(operation, config, () => {
852
- throw new Error("No custom operations");
853
- });
854
-
855
- assertSingleResult(result);
856
-
857
- const compiled = result.compile();
858
- expect(compiled.sql).toMatchInlineSnapshot(
695
+ const sql = compileOne(operation);
696
+ expect(sql).toMatchInlineSnapshot(
859
697
  `"create unique index \`idx_unique_email_name\` on \`test_table\` (\`email\`, \`name\`)"`,
860
698
  );
861
699
  });
@@ -869,192 +707,99 @@ describe("execute() - MySQL", () => {
869
707
  name: "idx_email",
870
708
  };
871
709
 
872
- const result = execute(operation, config, () => {
873
- throw new Error("No custom operations");
874
- });
875
-
876
- assertSingleResult(result);
877
-
878
- const compiled = result.compile();
879
- expect(compiled.sql).toMatchInlineSnapshot(`"drop index if exists \`idx_email\`"`);
710
+ const sql = compileOne(operation);
711
+ expect(sql).toMatchInlineSnapshot(`"drop index if exists \`idx_email\` on \`test_table\`"`);
880
712
  });
881
713
  });
882
714
 
883
- describe("custom operations", () => {
884
- it("should handle custom operations via callback", () => {
885
- const operation: MigrationOperation = {
886
- type: "custom",
887
- customType: "test-operation",
888
- data: "test-data",
715
+ describe("complex migration scenarios", () => {
716
+ it("should generate correct SQL for full schema migration", () => {
717
+ // Create multiple operations in sequence
718
+ const createUsersOp: MigrationOperation = {
719
+ type: "create-table",
720
+ name: "users",
721
+ columns: [
722
+ { name: "id", type: "integer", isNullable: false, role: "external-id" },
723
+ { name: "email", type: "string", isNullable: false, role: "regular" },
724
+ { name: "name", type: "string", isNullable: false, role: "regular" },
725
+ ],
889
726
  };
890
727
 
891
- let customCallbackCalled = false;
892
-
893
- const result = execute(operation, config, (op) => {
894
- customCallbackCalled = true;
895
- expect(op).toEqual(operation);
896
-
897
- // Return a kysely query
898
- return db.schema.createTable("custom_table").addColumn("id", "integer");
899
- });
900
-
901
- expect(customCallbackCalled).toBe(true);
902
-
903
- assertSingleResult(result);
904
-
905
- const compiled = result.compile();
906
- expect(compiled.sql).toContain("create table");
907
- expect(compiled.sql).toContain("custom_table");
908
- });
909
-
910
- it("should support custom operations returning array of nodes", () => {
911
- const operation: MigrationOperation = {
912
- type: "custom",
913
- customType: "multi-operation",
728
+ const addIndexOp: MigrationOperation = {
729
+ type: "add-index",
730
+ table: "users",
731
+ columns: ["email"],
732
+ name: "idx_unique_email",
733
+ unique: true,
914
734
  };
915
735
 
916
- const results = execute(operation, config, () => {
917
- return [
918
- db.schema.createTable("table1").addColumn("id", "integer"),
919
- db.schema.createTable("table2").addColumn("id", "integer"),
920
- ];
921
- });
922
-
923
- if (!Array.isArray(results)) {
924
- throw new Error("Expected array of results");
925
- }
926
-
927
- expect(results).toHaveLength(2);
928
- expect(results[0].compile().sql).toContain("table1");
929
- expect(results[1].compile().sql).toContain("table2");
930
- });
931
- });
736
+ const createPostsOp: MigrationOperation = {
737
+ type: "create-table",
738
+ name: "posts",
739
+ columns: [
740
+ { name: "id", type: "integer", isNullable: false, role: "external-id" },
741
+ { name: "user_id", type: "integer", isNullable: false, role: "reference" },
742
+ { name: "title", type: "string", isNullable: false, role: "regular" },
743
+ { name: "content", type: "string", isNullable: false, role: "regular" },
744
+ ],
745
+ };
932
746
 
933
- describe("complex migration scenarios", () => {
934
- it("should generate correct SQL for full schema migration", () => {
935
- // 1. Create users table
936
- const createUsers = execute(
937
- {
938
- type: "create-table",
939
- name: "users",
940
- columns: [
941
- { name: "id", type: "integer", isNullable: false, role: "external-id" },
942
- { name: "email", type: "string", isNullable: false, role: "regular" },
943
- { name: "name", type: "string", isNullable: false, role: "regular" },
944
- ],
945
- },
946
- config,
947
- () => {
948
- throw new Error("No custom operations");
747
+ const addFkOp: MigrationOperation = {
748
+ type: "add-foreign-key",
749
+ table: "posts",
750
+ value: {
751
+ name: "posts_user_id_fk",
752
+ columns: ["user_id"],
753
+ referencedTable: "users",
754
+ referencedColumns: ["id"],
949
755
  },
950
- );
756
+ };
951
757
 
952
- assertSingleResult(createUsers);
758
+ const alterPostsOp: MigrationOperation = {
759
+ type: "alter-table",
760
+ name: "posts",
761
+ value: [
762
+ {
763
+ type: "create-column",
764
+ value: {
765
+ name: "published",
766
+ type: "bool",
767
+ isNullable: false,
768
+ role: "regular",
769
+ default: { value: false },
770
+ },
771
+ },
772
+ ],
773
+ };
953
774
 
954
- expect(createUsers.compile().sql).toMatchInlineSnapshot(
775
+ // Compile all operations together
776
+ const statements = generator.compile([
777
+ createUsersOp,
778
+ addIndexOp,
779
+ createPostsOp,
780
+ addFkOp,
781
+ alterPostsOp,
782
+ ]);
783
+
784
+ // Should have FK check wrapper + 5 operations
785
+ expect(statements.length).toBe(7);
786
+ expect(statements[0].sql).toBe("SET FOREIGN_KEY_CHECKS = 0");
787
+ expect(statements[1].sql).toMatchInlineSnapshot(
955
788
  `"create table \`users\` (\`id\` integer not null unique, \`email\` text not null, \`name\` text not null)"`,
956
789
  );
957
-
958
- // 2. Add unique index on email
959
- const addIndex = execute(
960
- {
961
- type: "add-index",
962
- table: "users",
963
- columns: ["email"],
964
- name: "idx_unique_email",
965
- unique: true,
966
- },
967
- config,
968
- () => {
969
- throw new Error("No custom operations");
970
- },
971
- );
972
-
973
- assertSingleResult(addIndex);
974
-
975
- expect(addIndex.compile().sql).toMatchInlineSnapshot(
790
+ expect(statements[2].sql).toMatchInlineSnapshot(
976
791
  `"create unique index \`idx_unique_email\` on \`users\` (\`email\`)"`,
977
792
  );
978
-
979
- // 3. Create posts table
980
- const createPosts = execute(
981
- {
982
- type: "create-table",
983
- name: "posts",
984
- columns: [
985
- { name: "id", type: "integer", isNullable: false, role: "external-id" },
986
- { name: "user_id", type: "integer", isNullable: false, role: "reference" },
987
- { name: "title", type: "string", isNullable: false, role: "regular" },
988
- { name: "content", type: "string", isNullable: false, role: "regular" },
989
- ],
990
- },
991
- config,
992
- () => {
993
- throw new Error("No custom operations");
994
- },
995
- );
996
-
997
- assertSingleResult(createPosts);
998
-
999
- expect(createPosts.compile().sql).toMatchInlineSnapshot(
793
+ expect(statements[3].sql).toMatchInlineSnapshot(
1000
794
  `"create table \`posts\` (\`id\` integer not null unique, \`user_id\` integer not null, \`title\` text not null, \`content\` text not null)"`,
1001
795
  );
1002
-
1003
- // 4. Add foreign key
1004
- const addFk = execute(
1005
- {
1006
- type: "add-foreign-key",
1007
- table: "posts",
1008
- value: {
1009
- name: "posts_user_id_fk",
1010
- columns: ["user_id"],
1011
- referencedTable: "users",
1012
- referencedColumns: ["id"],
1013
- },
1014
- },
1015
- config,
1016
- () => {
1017
- throw new Error("No custom operations");
1018
- },
1019
- );
1020
-
1021
- assertSingleResult(addFk);
1022
-
1023
- expect(addFk.compile().sql).toMatchInlineSnapshot(
796
+ expect(statements[4].sql).toMatchInlineSnapshot(
1024
797
  `"alter table \`posts\` add constraint \`posts_user_id_fk\` foreign key (\`user_id\`) references \`users\` (\`id\`) on delete restrict on update restrict"`,
1025
798
  );
1026
-
1027
- // 5. Alter posts table to add a new column
1028
- const alterResults = execute(
1029
- {
1030
- type: "alter-table",
1031
- name: "posts",
1032
- value: [
1033
- {
1034
- type: "create-column",
1035
- value: {
1036
- name: "published",
1037
- type: "bool",
1038
- isNullable: false,
1039
- role: "regular",
1040
- default: { value: false },
1041
- },
1042
- },
1043
- ],
1044
- },
1045
- config,
1046
- () => {
1047
- throw new Error("No custom operations");
1048
- },
1049
- );
1050
-
1051
- if (!Array.isArray(alterResults)) {
1052
- throw new Error("Expected array of results");
1053
- }
1054
-
1055
- expect(alterResults[0].compile().sql).toMatchInlineSnapshot(
799
+ expect(statements[5].sql).toMatchInlineSnapshot(
1056
800
  `"alter table \`posts\` add column \`published\` boolean default false not null"`,
1057
801
  );
802
+ expect(statements[6].sql).toBe("SET FOREIGN_KEY_CHECKS = 1");
1058
803
  });
1059
804
 
1060
805
  it("should handle multiple alter-table operations", () => {
@@ -1083,22 +828,15 @@ describe("execute() - MySQL", () => {
1083
828
  ],
1084
829
  };
1085
830
 
1086
- const results = execute(operation, config, () => {
1087
- throw new Error("No custom operations");
1088
- });
1089
-
1090
- if (!Array.isArray(results)) {
1091
- throw new Error("Expected array of results");
1092
- }
1093
-
1094
- expect(results).toHaveLength(3);
1095
- expect(results[0].compile().sql).toMatchInlineSnapshot(
831
+ const statements = compileMany(operation);
832
+ expect(statements).toHaveLength(3);
833
+ expect(statements[0]).toMatchInlineSnapshot(
1096
834
  `"alter table \`users\` add column \`age\` integer"`,
1097
835
  );
1098
- expect(results[1].compile().sql).toMatchInlineSnapshot(
836
+ expect(statements[1]).toMatchInlineSnapshot(
1099
837
  `"alter table \`users\` rename column \`name\` to \`full_name\`"`,
1100
838
  );
1101
- expect(results[2].compile().sql).toMatchInlineSnapshot(
839
+ expect(statements[2]).toMatchInlineSnapshot(
1102
840
  `"alter table \`users\` drop column \`old_field\`"`,
1103
841
  );
1104
842
  });
@@ -1112,14 +850,8 @@ describe("execute() - MySQL", () => {
1112
850
  columns: [{ name: "id", type: "integer", isNullable: false, role: "external-id" }],
1113
851
  };
1114
852
 
1115
- const result = execute(operation, config, () => {
1116
- throw new Error("No custom operations");
1117
- });
1118
-
1119
- assertSingleResult(result);
1120
-
1121
- const compiled = result.compile();
1122
- expect(compiled.sql).toContain("`user-profiles`");
853
+ const sql = compileOne(operation);
854
+ expect(sql).toContain("`user-profiles`");
1123
855
  });
1124
856
 
1125
857
  it("should handle column names with special characters", () => {
@@ -1132,17 +864,11 @@ describe("execute() - MySQL", () => {
1132
864
  ],
1133
865
  };
1134
866
 
1135
- const result = execute(operation, config, () => {
1136
- throw new Error("No custom operations");
1137
- });
1138
-
1139
- assertSingleResult(result);
1140
-
1141
- const compiled = result.compile();
1142
- expect(compiled.sql).toContain("`user-name`");
867
+ const sql = compileOne(operation);
868
+ expect(sql).toContain("`user-name`");
1143
869
  });
1144
870
 
1145
- it("should properly escape string default values", () => {
871
+ it("should properly handle string default values (not applied for TEXT columns)", () => {
1146
872
  const operation: MigrationOperation = {
1147
873
  type: "create-table",
1148
874
  name: "test",
@@ -1158,16 +884,148 @@ describe("execute() - MySQL", () => {
1158
884
  ],
1159
885
  };
1160
886
 
1161
- const result = execute(operation, config, () => {
1162
- throw new Error("No custom operations");
1163
- });
887
+ const sql = compileOne(operation);
888
+ // MySQL doesn't support defaults on TEXT columns, so the default is not applied
889
+ expect(sql).toMatchInlineSnapshot(
890
+ `"create table \`test\` (\`id\` integer not null unique, \`status\` text not null)"`,
891
+ );
892
+ });
893
+ });
1164
894
 
1165
- assertSingleResult(result);
895
+ describe("table name mapping", () => {
896
+ const mapper = {
897
+ toPhysical: (name: string) => `prefix_${name}`,
898
+ toLogical: (name: string) => name.replace("prefix_", ""),
899
+ };
1166
900
 
1167
- const compiled = result.compile();
1168
- expect(compiled.sql).toMatchInlineSnapshot(
1169
- `"create table \`test\` (\`id\` integer not null unique, \`status\` text not null)"`,
901
+ it("should apply table name mapping to create-table", () => {
902
+ const operation: MigrationOperation = {
903
+ type: "create-table",
904
+ name: "users",
905
+ columns: [{ name: "id", type: "integer", isNullable: false, role: "external-id" }],
906
+ };
907
+
908
+ const statements = generator.compile([operation], mapper);
909
+ expect(statements[1].sql).toMatchInlineSnapshot(
910
+ `"create table \`prefix_users\` (\`id\` integer not null unique)"`,
911
+ );
912
+ });
913
+
914
+ it("should apply table name mapping to foreign keys", () => {
915
+ const operation: MigrationOperation = {
916
+ type: "add-foreign-key",
917
+ table: "posts",
918
+ value: {
919
+ name: "posts_user_id_fk",
920
+ columns: ["user_id"],
921
+ referencedTable: "users",
922
+ referencedColumns: ["id"],
923
+ },
924
+ };
925
+
926
+ const statements = generator.compile([operation], mapper);
927
+ expect(statements[1].sql).toMatchInlineSnapshot(
928
+ `"alter table \`prefix_posts\` add constraint \`posts_user_id_fk\` foreign key (\`user_id\`) references \`prefix_users\` (\`id\`) on delete restrict on update restrict"`,
929
+ );
930
+ });
931
+
932
+ it("should apply table name mapping to indexes", () => {
933
+ const operation: MigrationOperation = {
934
+ type: "add-index",
935
+ table: "users",
936
+ columns: ["email"],
937
+ name: "idx_email",
938
+ unique: true,
939
+ };
940
+
941
+ const statements = generator.compile([operation], mapper);
942
+ expect(statements[1].sql).toMatchInlineSnapshot(
943
+ `"create unique index \`idx_email_prefix_users\` on \`prefix_users\` (\`email\`)"`,
1170
944
  );
1171
945
  });
1172
946
  });
947
+
948
+ describe("preprocessing", () => {
949
+ it("should wrap operations with FK checks disabled", () => {
950
+ const operations: MigrationOperation[] = [
951
+ {
952
+ type: "create-table",
953
+ name: "users",
954
+ columns: [{ name: "id", type: "string", isNullable: false, role: "external-id" }],
955
+ },
956
+ ];
957
+
958
+ const preprocessed = generator.preprocess(operations);
959
+ expect(preprocessed.length).toBe(3);
960
+ expect(preprocessed[0]).toEqual({ type: "custom", sql: "SET FOREIGN_KEY_CHECKS = 0" });
961
+ expect(preprocessed[1]).toEqual(operations[0]);
962
+ expect(preprocessed[2]).toEqual({ type: "custom", sql: "SET FOREIGN_KEY_CHECKS = 1" });
963
+ });
964
+
965
+ it("should return empty array for empty operations", () => {
966
+ const preprocessed = generator.preprocess([]);
967
+ expect(preprocessed).toHaveLength(0);
968
+ });
969
+ });
970
+
971
+ describe("getDefaultValue", () => {
972
+ it("should return undefined for TEXT column defaults", () => {
973
+ const defaultValue = generator.getDefaultValue({
974
+ name: "description",
975
+ type: "string",
976
+ isNullable: true,
977
+ role: "regular",
978
+ default: { value: "default text" },
979
+ });
980
+
981
+ expect(defaultValue).toBeUndefined();
982
+ });
983
+
984
+ it("should return literal value for non-TEXT columns", () => {
985
+ const defaultValue = generator.getDefaultValue({
986
+ name: "count",
987
+ type: "integer",
988
+ isNullable: false,
989
+ role: "regular",
990
+ default: { value: 42 },
991
+ });
992
+
993
+ expect(defaultValue).toBeDefined();
994
+ });
995
+
996
+ it("should return CURRENT_TIMESTAMP for dbSpecial: now", () => {
997
+ const defaultValue = generator.getDefaultValue({
998
+ name: "created_at",
999
+ type: "timestamp",
1000
+ isNullable: false,
1001
+ role: "regular",
1002
+ default: { dbSpecial: "now" },
1003
+ });
1004
+
1005
+ expect(defaultValue).toBeDefined();
1006
+ });
1007
+
1008
+ it("should return undefined for runtime defaults", () => {
1009
+ const defaultValue = generator.getDefaultValue({
1010
+ name: "id",
1011
+ type: "string",
1012
+ isNullable: false,
1013
+ role: "regular",
1014
+ default: { runtime: "cuid" },
1015
+ });
1016
+
1017
+ expect(defaultValue).toBeUndefined();
1018
+ });
1019
+
1020
+ it("should return undefined when no default is set", () => {
1021
+ const defaultValue = generator.getDefaultValue({
1022
+ name: "name",
1023
+ type: "string",
1024
+ isNullable: false,
1025
+ role: "regular",
1026
+ });
1027
+
1028
+ expect(defaultValue).toBeUndefined();
1029
+ });
1030
+ });
1173
1031
  });