@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
@@ -1,193 +0,0 @@
1
- import { buildCondition } from "../../query/condition-builder.js";
2
- import { decodeCursor, serializeCursorValues } from "../../query/cursor.js";
3
- import { buildWhere, createKyselyQueryBuilder } from "./kysely-query-builder.js";
4
- import { createKysely, createTableNameMapper } from "./kysely-shared.js";
5
- import { createKyselyQueryCompiler } from "./kysely-query-compiler.js";
6
- import { sql } from "kysely";
7
-
8
- //#region src/adapters/kysely/kysely-uow-compiler.ts
9
- /**
10
- * Create a Kysely-specific Unit of Work compiler
11
- *
12
- * This compiler translates UOW operations into Kysely CompiledQuery objects
13
- * that can be executed as a batch/transaction.
14
- *
15
- * @param pool - Connection pool for acquiring database connections
16
- * @param provider - SQL provider (postgresql, mysql, sqlite, etc.)
17
- * @param mapper - Optional table name mapper for namespace prefixing (fallback for operations without explicit namespace)
18
- * @returns A UOWCompiler instance for Kysely
19
- */
20
- function createKyselyUOWCompiler(provider, mapper) {
21
- const kysely = createKysely(provider);
22
- /**
23
- * Get the mapper for a specific operation
24
- * Uses operation's namespace if provided, otherwise falls back to the default mapper
25
- */
26
- function getMapperForOperation(namespace) {
27
- if (namespace) return createTableNameMapper(namespace);
28
- return mapper;
29
- }
30
- const compilerCache = /* @__PURE__ */ new Map();
31
- const builderCache = /* @__PURE__ */ new Map();
32
- function getQueryCompiler(schema, namespace) {
33
- const cacheKey = namespace;
34
- let compiler = compilerCache.get(cacheKey);
35
- if (!compiler) {
36
- compiler = createKyselyQueryCompiler(schema, provider, getMapperForOperation(namespace));
37
- compilerCache.set(cacheKey, compiler);
38
- }
39
- return compiler;
40
- }
41
- function getQueryBuilder(namespace) {
42
- const cacheKey = namespace;
43
- let builder = builderCache.get(cacheKey);
44
- if (!builder) {
45
- builder = createKyselyQueryBuilder(kysely, provider, getMapperForOperation(namespace));
46
- builderCache.set(cacheKey, builder);
47
- }
48
- return builder;
49
- }
50
- function toTable(schema, name) {
51
- const table = schema.tables[name];
52
- if (!table) throw new Error(`Invalid table name ${name}.`);
53
- return table;
54
- }
55
- return {
56
- compileRetrievalOperation(op) {
57
- const queryCompiler = getQueryCompiler(op.schema, op.namespace);
58
- switch (op.type) {
59
- case "count": return queryCompiler.count(op.table.name, { where: op.options.where });
60
- case "find": {
61
- const { useIndex: _useIndex, orderByIndex, joins: join, after, before, pageSize,...findManyOptions } = op.options;
62
- let indexColumns = [];
63
- let orderDirection = "asc";
64
- if (orderByIndex) {
65
- const index = op.table.indexes[orderByIndex.indexName];
66
- orderDirection = orderByIndex.direction;
67
- if (!index) if (orderByIndex.indexName === "_primary") indexColumns = [op.table.getIdColumn()];
68
- else throw new Error(`Index "${orderByIndex.indexName}" not found on table "${op.table.name}"`);
69
- else indexColumns = index.columns;
70
- }
71
- let orderBy;
72
- if (indexColumns.length > 0) orderBy = indexColumns.map((col) => [col, orderDirection]);
73
- let cursorCondition;
74
- if ((after || before) && indexColumns.length > 0) {
75
- const cursor = after || before;
76
- const serializedValues = serializeCursorValues(typeof cursor === "string" ? decodeCursor(cursor) : cursor, indexColumns, provider);
77
- const isAfter = !!after;
78
- const useGreaterThan = isAfter && orderDirection === "asc" || !isAfter && orderDirection === "desc";
79
- if (indexColumns.length === 1) {
80
- const col = indexColumns[0];
81
- const val = serializedValues[col.ormName];
82
- cursorCondition = {
83
- type: "compare",
84
- a: col,
85
- operator: useGreaterThan ? ">" : "<",
86
- b: val
87
- };
88
- } else throw new Error("Multi-column cursor pagination is not yet supported in Kysely Unit of Work implementation");
89
- }
90
- let combinedWhere;
91
- if (findManyOptions.where) {
92
- const whereResult = buildCondition(op.table.columns, findManyOptions.where);
93
- if (whereResult === true) combinedWhere = void 0;
94
- else if (whereResult === false) return null;
95
- else combinedWhere = whereResult;
96
- }
97
- if (cursorCondition) if (combinedWhere) combinedWhere = {
98
- type: "and",
99
- items: [combinedWhere, cursorCondition]
100
- };
101
- else combinedWhere = cursorCondition;
102
- const effectiveLimit = pageSize && op.withCursor ? pageSize + 1 : pageSize;
103
- if (join && join.length > 0) return getQueryBuilder(op.namespace).findMany(op.table, {
104
- select: findManyOptions.select ?? true,
105
- where: combinedWhere,
106
- orderBy,
107
- limit: effectiveLimit,
108
- join
109
- });
110
- return queryCompiler.findMany(op.table.name, {
111
- ...findManyOptions,
112
- where: combinedWhere ? () => combinedWhere : void 0,
113
- orderBy: orderBy?.map(([col, dir]) => [col.ormName, dir]),
114
- limit: effectiveLimit
115
- });
116
- }
117
- }
118
- },
119
- compileMutationOperation(op) {
120
- const queryCompiler = getQueryCompiler(op.schema, op.namespace);
121
- switch (op.type) {
122
- case "create": return {
123
- query: queryCompiler.create(op.table, op.values),
124
- expectedAffectedRows: null,
125
- expectedReturnedRows: null
126
- };
127
- case "update": {
128
- const table = toTable(op.schema, op.table);
129
- const idColumn = table.getIdColumn();
130
- const versionColumn = table.getVersionColumn();
131
- const externalId = typeof op.id === "string" ? op.id : op.id.externalId;
132
- const versionToCheck = getVersionToCheck(op.id, op.checkVersion);
133
- const whereClause = versionToCheck !== void 0 ? () => buildCondition(table.columns, (eb) => eb.and(eb(idColumn.ormName, "=", externalId), eb(versionColumn.ormName, "=", versionToCheck))) : () => buildCondition(table.columns, (eb) => eb(idColumn.ormName, "=", externalId));
134
- const query = queryCompiler.updateMany(op.table, {
135
- where: whereClause,
136
- set: op.set
137
- });
138
- return query ? {
139
- query,
140
- expectedAffectedRows: op.checkVersion ? 1 : null,
141
- expectedReturnedRows: null
142
- } : null;
143
- }
144
- case "delete": {
145
- const table = toTable(op.schema, op.table);
146
- const idColumn = table.getIdColumn();
147
- const versionColumn = table.getVersionColumn();
148
- const externalId = typeof op.id === "string" ? op.id : op.id.externalId;
149
- const versionToCheck = getVersionToCheck(op.id, op.checkVersion);
150
- const whereClause = versionToCheck !== void 0 ? () => buildCondition(table.columns, (eb) => eb.and(eb(idColumn.ormName, "=", externalId), eb(versionColumn.ormName, "=", versionToCheck))) : () => buildCondition(table.columns, (eb) => eb(idColumn.ormName, "=", externalId));
151
- const query = queryCompiler.deleteMany(op.table, { where: whereClause });
152
- return query ? {
153
- query,
154
- expectedAffectedRows: op.checkVersion ? 1 : null,
155
- expectedReturnedRows: null
156
- } : null;
157
- }
158
- case "check": {
159
- const table = toTable(op.schema, op.table);
160
- const idColumn = table.getIdColumn();
161
- const versionColumn = table.getVersionColumn();
162
- const mapper$1 = getMapperForOperation(op.namespace);
163
- const tableName = mapper$1 ? mapper$1.toPhysical(op.table) : op.table;
164
- const externalId = op.id.externalId;
165
- const version = op.id.version;
166
- const condition = buildCondition(table.columns, (eb) => eb.and(eb(idColumn.ormName, "=", externalId), eb(versionColumn.ormName, "=", version)));
167
- let query = kysely.selectFrom(tableName).select(sql`1`.as("exists"));
168
- if (typeof condition === "boolean") throw new Error("Condition is a boolean, but should be a condition object.");
169
- query = query.where((eb) => buildWhere(condition, eb, provider, mapper$1, table)).limit(1);
170
- return {
171
- query: query.compile(),
172
- expectedAffectedRows: null,
173
- expectedReturnedRows: 1
174
- };
175
- }
176
- }
177
- }
178
- };
179
- }
180
- /**
181
- * Get the version to check for a given ID and checkVersion flag.
182
- * @returns The version to check or undefined if no check is required.
183
- * @throws Error if the ID is a string and checkVersion is true.
184
- */
185
- function getVersionToCheck(id, checkVersion) {
186
- if (!checkVersion) return;
187
- if (typeof id === "string") throw new Error(`Cannot use checkVersion with a string ID. Version checking requires a FragnoId with version information.`);
188
- return id.version;
189
- }
190
-
191
- //#endregion
192
- export { createKyselyUOWCompiler };
193
- //# sourceMappingURL=kysely-uow-compiler.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"kysely-uow-compiler.js","names":["indexColumns: AnyColumn[]","orderDirection: \"asc\" | \"desc\"","orderBy: [AnyColumn, \"asc\" | \"desc\"][] | undefined","cursorCondition: Condition | undefined","combinedWhere: Condition | undefined","mapper"],"sources":["../../../src/adapters/kysely/kysely-uow-compiler.ts"],"sourcesContent":["import { type CompiledQuery, sql } from \"kysely\";\nimport type { AnyColumn, AnySchema, FragnoId } from \"../../schema/create\";\nimport type {\n CompiledMutation,\n MutationOperation,\n RetrievalOperation,\n UOWCompiler,\n} from \"../../query/unit-of-work\";\nimport { createKyselyQueryCompiler } from \"./kysely-query-compiler\";\nimport { createKyselyQueryBuilder, buildWhere } from \"./kysely-query-builder\";\nimport { buildCondition, type Condition } from \"../../query/condition-builder\";\nimport { decodeCursor, serializeCursorValues } from \"../../query/cursor\";\nimport type { AnySelectClause } from \"../../query/query\";\nimport { type TableNameMapper, createKysely, createTableNameMapper } from \"./kysely-shared\";\nimport type { SQLProvider } from \"../../shared/providers\";\n\n/**\n * Create a Kysely-specific Unit of Work compiler\n *\n * This compiler translates UOW operations into Kysely CompiledQuery objects\n * that can be executed as a batch/transaction.\n *\n * @param pool - Connection pool for acquiring database connections\n * @param provider - SQL provider (postgresql, mysql, sqlite, etc.)\n * @param mapper - Optional table name mapper for namespace prefixing (fallback for operations without explicit namespace)\n * @returns A UOWCompiler instance for Kysely\n */\nexport function createKyselyUOWCompiler(\n provider: SQLProvider,\n mapper?: TableNameMapper,\n): UOWCompiler<CompiledQuery> {\n // Get kysely instance for query building (compilation doesn't execute, just builds SQL)\n const kysely = createKysely(provider);\n\n /**\n * Get the mapper for a specific operation\n * Uses operation's namespace if provided, otherwise falls back to the default mapper\n */\n function getMapperForOperation(namespace: string | undefined): TableNameMapper | undefined {\n if (namespace) {\n return createTableNameMapper(namespace);\n }\n return mapper;\n }\n\n // Cache query compilers and builders by namespace for performance\n const compilerCache = new Map<string | undefined, ReturnType<typeof createKyselyQueryCompiler>>();\n const builderCache = new Map<string | undefined, ReturnType<typeof createKyselyQueryBuilder>>();\n\n function getQueryCompiler(schema: AnySchema, namespace: string | undefined) {\n const cacheKey = namespace;\n let compiler = compilerCache.get(cacheKey);\n if (!compiler) {\n const opMapper = getMapperForOperation(namespace);\n compiler = createKyselyQueryCompiler(schema, provider, opMapper);\n compilerCache.set(cacheKey, compiler);\n }\n return compiler;\n }\n\n function getQueryBuilder(namespace: string | undefined) {\n const cacheKey = namespace;\n let builder = builderCache.get(cacheKey);\n if (!builder) {\n const opMapper = getMapperForOperation(namespace);\n builder = createKyselyQueryBuilder(kysely, provider, opMapper);\n builderCache.set(cacheKey, builder);\n }\n return builder;\n }\n\n function toTable(schema: AnySchema, name: unknown) {\n const table = schema.tables[name as string];\n if (!table) {\n throw new Error(`Invalid table name ${name}.`);\n }\n return table;\n }\n\n return {\n compileRetrievalOperation(op: RetrievalOperation<AnySchema>): CompiledQuery | null {\n const queryCompiler = getQueryCompiler(op.schema, op.namespace);\n switch (op.type) {\n case \"count\": {\n return queryCompiler.count(op.table.name, {\n where: op.options.where,\n });\n }\n\n case \"find\": {\n // Map UOW FindOptions to query compiler's FindManyOptions\n const {\n useIndex: _useIndex,\n orderByIndex,\n joins: join,\n after,\n before,\n pageSize,\n ...findManyOptions\n } = op.options;\n\n // Get index columns for ordering and cursor pagination\n let indexColumns: AnyColumn[] = [];\n let orderDirection: \"asc\" | \"desc\" = \"asc\";\n\n if (orderByIndex) {\n const index = op.table.indexes[orderByIndex.indexName];\n orderDirection = orderByIndex.direction;\n\n if (!index) {\n // If _primary index doesn't exist, fall back to internal ID column\n // (which is the actual primary key and maintains insertion order)\n if (orderByIndex.indexName === \"_primary\") {\n indexColumns = [op.table.getIdColumn()];\n } else {\n throw new Error(\n `Index \"${orderByIndex.indexName}\" not found on table \"${op.table.name}\"`,\n );\n }\n } else {\n // Order by all columns in the index with the specified direction\n indexColumns = index.columns;\n }\n }\n\n // Convert orderByIndex to orderBy format\n let orderBy: [AnyColumn, \"asc\" | \"desc\"][] | undefined;\n if (indexColumns.length > 0) {\n orderBy = indexColumns.map((col) => [col, orderDirection]);\n }\n\n // Handle cursor pagination - build a cursor condition\n let cursorCondition: Condition | undefined;\n\n if ((after || before) && indexColumns.length > 0) {\n const cursor = after || before;\n // Decode cursor if it's a string, otherwise use it as-is\n const cursorObj = typeof cursor === \"string\" ? decodeCursor(cursor!) : cursor!;\n const serializedValues = serializeCursorValues(cursorObj, indexColumns, provider);\n\n // Build tuple comparison for cursor pagination\n // For \"after\" with \"asc\": (col1, col2, ...) > (val1, val2, ...)\n // For \"before\" with \"desc\": reverse the comparison\n const isAfter = !!after;\n const useGreaterThan =\n (isAfter && orderDirection === \"asc\") || (!isAfter && orderDirection === \"desc\");\n\n if (indexColumns.length === 1) {\n // Simple single-column case\n const col = indexColumns[0]!;\n const val = serializedValues[col.ormName];\n const operator = useGreaterThan ? \">\" : \"<\";\n cursorCondition = {\n type: \"compare\",\n a: col,\n operator,\n b: val,\n };\n } else {\n // Multi-column tuple comparison - not yet supported for Kysely\n throw new Error(\n \"Multi-column cursor pagination is not yet supported in Kysely Unit of Work implementation\",\n );\n }\n }\n\n // Combine user where clause with cursor condition\n let combinedWhere: Condition | undefined;\n if (findManyOptions.where) {\n const whereResult = buildCondition(op.table.columns, findManyOptions.where);\n if (whereResult === true) {\n combinedWhere = undefined;\n } else if (whereResult === false) {\n return null;\n } else {\n combinedWhere = whereResult;\n }\n }\n\n if (cursorCondition) {\n if (combinedWhere) {\n combinedWhere = {\n type: \"and\",\n items: [combinedWhere, cursorCondition],\n };\n } else {\n combinedWhere = cursorCondition;\n }\n }\n\n // For cursor pagination, fetch one extra item to determine if there's a next page\n // Only apply this when using the high-level findWithCursor() API (op.withCursor === true)\n const effectiveLimit = pageSize && op.withCursor ? pageSize + 1 : pageSize;\n\n // When we have joins or need to bypass buildFindOptions, use operation-specific queryBuilder\n if (join && join.length > 0) {\n const queryBuilder = getQueryBuilder(op.namespace);\n return queryBuilder.findMany(op.table, {\n // Safe cast: select from UOW matches SimplifyFindOptions requirement\n select: (findManyOptions.select ?? true) as AnySelectClause,\n where: combinedWhere,\n orderBy,\n limit: effectiveLimit,\n join,\n });\n }\n\n return queryCompiler.findMany(op.table.name, {\n ...findManyOptions,\n where: combinedWhere ? () => combinedWhere! : undefined,\n orderBy: orderBy?.map(([col, dir]) => [col.ormName, dir]),\n limit: effectiveLimit,\n });\n }\n }\n },\n\n compileMutationOperation(\n op: MutationOperation<AnySchema>,\n ): CompiledMutation<CompiledQuery> | null {\n const queryCompiler = getQueryCompiler(op.schema, op.namespace);\n switch (op.type) {\n case \"create\":\n // queryCompiler.create() calls encodeValues() which handles runtime defaults\n return {\n query: queryCompiler.create(op.table, op.values),\n expectedAffectedRows: null, // creates don't need affected row checks\n expectedReturnedRows: null,\n };\n\n case \"update\": {\n const table = toTable(op.schema, op.table);\n const idColumn = table.getIdColumn();\n const versionColumn = table.getVersionColumn();\n\n const externalId = typeof op.id === \"string\" ? op.id : op.id.externalId;\n const versionToCheck = getVersionToCheck(op.id, op.checkVersion);\n\n // Build WHERE clause that filters by ID and optionally by version\n const whereClause =\n versionToCheck !== undefined\n ? () =>\n buildCondition(table.columns, (eb) =>\n eb.and(\n eb(idColumn.ormName, \"=\", externalId),\n eb(versionColumn.ormName, \"=\", versionToCheck),\n ),\n )\n : () => buildCondition(table.columns, (eb) => eb(idColumn.ormName, \"=\", externalId));\n\n const query = queryCompiler.updateMany(op.table, {\n where: whereClause,\n set: op.set,\n });\n\n return query\n ? {\n query,\n expectedAffectedRows: op.checkVersion ? 1 : null,\n expectedReturnedRows: null,\n }\n : null;\n }\n\n case \"delete\": {\n const table = toTable(op.schema, op.table);\n const idColumn = table.getIdColumn();\n const versionColumn = table.getVersionColumn();\n\n // Extract external ID based on whether op.id is FragnoId or string\n const externalId = typeof op.id === \"string\" ? op.id : op.id.externalId;\n const versionToCheck = getVersionToCheck(op.id, op.checkVersion);\n\n // Build WHERE clause that filters by ID and optionally by version\n const whereClause =\n versionToCheck !== undefined\n ? () =>\n buildCondition(table.columns, (eb) =>\n eb.and(\n eb(idColumn.ormName, \"=\", externalId),\n eb(versionColumn.ormName, \"=\", versionToCheck),\n ),\n )\n : () => buildCondition(table.columns, (eb) => eb(idColumn.ormName, \"=\", externalId));\n\n const query = queryCompiler.deleteMany(op.table, {\n where: whereClause,\n });\n\n return query\n ? {\n query,\n expectedAffectedRows: op.checkVersion ? 1 : null,\n expectedReturnedRows: null,\n }\n : null;\n }\n\n case \"check\": {\n const table = toTable(op.schema, op.table);\n const idColumn = table.getIdColumn();\n const versionColumn = table.getVersionColumn();\n const mapper = getMapperForOperation(op.namespace);\n const tableName = mapper ? mapper.toPhysical(op.table) : op.table;\n\n const externalId = op.id.externalId;\n const version = op.id.version;\n\n // Build a SELECT 1 query to check if the row exists with the correct version\n const condition = buildCondition(table.columns, (eb) =>\n eb.and(eb(idColumn.ormName, \"=\", externalId), eb(versionColumn.ormName, \"=\", version)),\n );\n\n let query = kysely.selectFrom(tableName).select(sql<number>`1`.as(\"exists\"));\n\n if (typeof condition === \"boolean\") {\n throw new Error(\"Condition is a boolean, but should be a condition object.\");\n }\n\n query = query.where((eb) => buildWhere(condition, eb, provider, mapper, table)).limit(1);\n\n return {\n query: query.compile(),\n expectedAffectedRows: null,\n expectedReturnedRows: 1, // Check that exactly 1 row was returned\n };\n }\n }\n },\n };\n}\n\n/**\n * Get the version to check for a given ID and checkVersion flag.\n * @returns The version to check or undefined if no check is required.\n * @throws Error if the ID is a string and checkVersion is true.\n */\nfunction getVersionToCheck(id: FragnoId | string, checkVersion: boolean): number | undefined {\n if (!checkVersion) {\n return undefined;\n }\n\n if (typeof id === \"string\") {\n throw new Error(\n `Cannot use checkVersion with a string ID. Version checking requires a FragnoId with version information.`,\n );\n }\n\n return id.version;\n}\n"],"mappings":"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"}
@@ -1,93 +0,0 @@
1
- //#region src/adapters/kysely/kysely-uow-executor.ts
2
- function getAffectedRows(result) {
3
- const affectedRows = result.numAffectedRows ?? result.numChangedRows ?? ("affectedRows" in result && (typeof result["affectedRows"] === "number" || typeof result["affectedRows"] === "bigint") ? result["affectedRows"] : void 0) ?? ("numUpdatedRows" in result && (typeof result["numUpdatedRows"] === "number" || typeof result["numUpdatedRows"] === "bigint") ? result["numUpdatedRows"] : void 0);
4
- if (affectedRows === void 0) throw new Error(`No affected rows found: ${JSON.stringify(result)}`);
5
- if (typeof affectedRows === "bigint" && affectedRows > Number.MAX_SAFE_INTEGER) throw new Error(`affectedRows BigInt value ${affectedRows.toString()} exceeds JS safe integer range`);
6
- return Number(affectedRows);
7
- }
8
- /**
9
- * Execute the retrieval phase of a Unit of Work using Kysely
10
- *
11
- * All retrieval queries are executed inside a single transaction to ensure
12
- * snapshot isolation - all reads see a consistent view of the database.
13
- *
14
- * @param kysely - The Kysely database instance
15
- * @param retrievalBatch - Array of compiled retrieval queries
16
- * @returns Array of query results matching the retrieval operations order
17
- *
18
- * @example
19
- * ```ts
20
- * const retrievalResults = await executeKyselyRetrievalPhase(kysely, compiled.retrievalBatch);
21
- * const [users, posts] = retrievalResults;
22
- * ```
23
- */
24
- async function executeKyselyRetrievalPhase(kysely, retrievalBatch) {
25
- if (retrievalBatch.length === 0) return [];
26
- const retrievalResults = [];
27
- await kysely.transaction().execute(async (tx) => {
28
- for (const compiledQuery of retrievalBatch) {
29
- const result = await tx.executeQuery(compiledQuery);
30
- retrievalResults.push(result.rows);
31
- }
32
- });
33
- return retrievalResults;
34
- }
35
- /**
36
- * Execute the mutation phase of a Unit of Work using Kysely
37
- *
38
- * All mutation queries are executed in a transaction with optimistic locking.
39
- * If any version check fails, the entire transaction is rolled back and
40
- * success=false is returned.
41
- *
42
- * @param kysely - The Kysely database instance
43
- * @param mutationBatch - Array of compiled mutation queries with expected affected rows
44
- * @returns Object with success flag and internal IDs from create operations
45
- *
46
- * @example
47
- * ```ts
48
- * const { success, createdInternalIds } = await executeKyselyMutationPhase(kysely, compiled.mutationBatch);
49
- * if (!success) {
50
- * console.log("Version conflict detected, retrying...");
51
- * }
52
- * ```
53
- */
54
- async function executeKyselyMutationPhase(kysely, mutationBatch) {
55
- if (mutationBatch.length === 0) return {
56
- success: true,
57
- createdInternalIds: []
58
- };
59
- const createdInternalIds = [];
60
- try {
61
- await kysely.transaction().execute(async (tx) => {
62
- for (const compiledMutation of mutationBatch) {
63
- const result = await tx.executeQuery(compiledMutation.query);
64
- if (compiledMutation.expectedAffectedRows === null) if (Array.isArray(result.rows) && result.rows.length > 0) {
65
- const row = result.rows[0];
66
- if ("_internalId" in row || "_internal_id" in row) {
67
- const internalId = row["_internalId"] ?? row["_internal_id"];
68
- createdInternalIds.push(internalId);
69
- } else createdInternalIds.push(null);
70
- } else createdInternalIds.push(null);
71
- else if (compiledMutation.expectedAffectedRows !== null) {
72
- const affectedRows = getAffectedRows(result);
73
- if (affectedRows !== compiledMutation.expectedAffectedRows) throw new Error(`Version conflict: expected ${compiledMutation.expectedAffectedRows} rows affected, but got ${affectedRows}`);
74
- }
75
- if (compiledMutation.expectedReturnedRows !== null) {
76
- const rowCount = Array.isArray(result.rows) ? result.rows.length : 0;
77
- if (rowCount !== compiledMutation.expectedReturnedRows) throw new Error(`Version conflict: expected ${compiledMutation.expectedReturnedRows} rows returned, but got ${rowCount}`);
78
- }
79
- }
80
- });
81
- return {
82
- success: true,
83
- createdInternalIds
84
- };
85
- } catch (error) {
86
- if (error instanceof Error && error.message.includes("Version conflict")) return { success: false };
87
- throw error;
88
- }
89
- }
90
-
91
- //#endregion
92
- export { executeKyselyMutationPhase, executeKyselyRetrievalPhase };
93
- //# sourceMappingURL=kysely-uow-executor.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"kysely-uow-executor.js","names":["retrievalResults: unknown[]","createdInternalIds: (bigint | null)[]"],"sources":["../../../src/adapters/kysely/kysely-uow-executor.ts"],"sourcesContent":["import type { CompiledQuery, Kysely, QueryResult } from \"kysely\";\nimport type { CompiledMutation, MutationResult } from \"../../query/unit-of-work\";\n\nfunction getAffectedRows(result: QueryResult<unknown>): number {\n const affectedRows =\n result.numAffectedRows ??\n result.numChangedRows ??\n // PGLite returns `affectedRows` instead of `numAffectedRows` or `numChangedRows`\n (\"affectedRows\" in result &&\n (typeof result[\"affectedRows\"] === \"number\" || typeof result[\"affectedRows\"] === \"bigint\")\n ? result[\"affectedRows\"]\n : undefined) ??\n // SQLite via SQLocal returns `numUpdatedRows` as BigInt\n (\"numUpdatedRows\" in result &&\n (typeof result[\"numUpdatedRows\"] === \"number\" || typeof result[\"numUpdatedRows\"] === \"bigint\")\n ? result[\"numUpdatedRows\"]\n : undefined);\n\n if (affectedRows === undefined) {\n throw new Error(`No affected rows found: ${JSON.stringify(result)}`);\n }\n\n if (typeof affectedRows === \"bigint\" && affectedRows > Number.MAX_SAFE_INTEGER) {\n throw new Error(\n `affectedRows BigInt value ${affectedRows.toString()} exceeds JS safe integer range`,\n );\n }\n\n return Number(affectedRows);\n}\n\n/**\n * Execute the retrieval phase of a Unit of Work using Kysely\n *\n * All retrieval queries are executed inside a single transaction to ensure\n * snapshot isolation - all reads see a consistent view of the database.\n *\n * @param kysely - The Kysely database instance\n * @param retrievalBatch - Array of compiled retrieval queries\n * @returns Array of query results matching the retrieval operations order\n *\n * @example\n * ```ts\n * const retrievalResults = await executeKyselyRetrievalPhase(kysely, compiled.retrievalBatch);\n * const [users, posts] = retrievalResults;\n * ```\n */\nexport async function executeKyselyRetrievalPhase(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n kysely: Kysely<any>,\n retrievalBatch: CompiledQuery[],\n): Promise<unknown[]> {\n // If no retrieval operations, return empty array immediately\n if (retrievalBatch.length === 0) {\n return [];\n }\n\n const retrievalResults: unknown[] = [];\n\n // Execute all retrieval queries inside a transaction for snapshot isolation\n await kysely.transaction().execute(async (tx) => {\n for (const compiledQuery of retrievalBatch) {\n const result = await tx.executeQuery(compiledQuery);\n retrievalResults.push(result.rows);\n }\n });\n\n return retrievalResults;\n}\n\n/**\n * Execute the mutation phase of a Unit of Work using Kysely\n *\n * All mutation queries are executed in a transaction with optimistic locking.\n * If any version check fails, the entire transaction is rolled back and\n * success=false is returned.\n *\n * @param kysely - The Kysely database instance\n * @param mutationBatch - Array of compiled mutation queries with expected affected rows\n * @returns Object with success flag and internal IDs from create operations\n *\n * @example\n * ```ts\n * const { success, createdInternalIds } = await executeKyselyMutationPhase(kysely, compiled.mutationBatch);\n * if (!success) {\n * console.log(\"Version conflict detected, retrying...\");\n * }\n * ```\n */\nexport async function executeKyselyMutationPhase(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n kysely: Kysely<any>,\n mutationBatch: CompiledMutation<CompiledQuery>[],\n): Promise<MutationResult> {\n // If there are no mutations, return success immediately\n if (mutationBatch.length === 0) {\n return { success: true, createdInternalIds: [] };\n }\n\n const createdInternalIds: (bigint | null)[] = [];\n\n // Execute mutation batch in a transaction\n try {\n await kysely.transaction().execute(async (tx) => {\n for (const compiledMutation of mutationBatch) {\n const result = await tx.executeQuery(compiledMutation.query);\n\n // Best-effort extraction: Try to get internal ID if available\n // This is optional - the system works without it by using subqueries for references\n if (compiledMutation.expectedAffectedRows === null) {\n if (Array.isArray(result.rows) && result.rows.length > 0) {\n const row = result.rows[0] as Record<string, unknown>;\n if (\"_internalId\" in row || \"_internal_id\" in row) {\n const internalId = (row[\"_internalId\"] ?? row[\"_internal_id\"]) as bigint;\n createdInternalIds.push(internalId);\n } else {\n // RETURNING supported but _internalId not found - that's okay\n createdInternalIds.push(null);\n }\n } else {\n // No rows returned (no RETURNING clause, or SQLite via executeQuery)\n // This is fine - references will use subqueries based on external IDs\n createdInternalIds.push(null);\n }\n } else if (compiledMutation.expectedAffectedRows !== null) {\n // Check affected rows for updates/deletes\n const affectedRows = getAffectedRows(result);\n\n if (affectedRows !== compiledMutation.expectedAffectedRows) {\n // Version conflict detected - the UPDATE/DELETE didn't affect the expected number of rows\n // This means either the row doesn't exist or the version has changed\n throw new Error(\n `Version conflict: expected ${compiledMutation.expectedAffectedRows} rows affected, but got ${affectedRows}`,\n );\n }\n }\n\n if (compiledMutation.expectedReturnedRows !== null) {\n // For SELECT queries (check operations), verify row count\n const rowCount = Array.isArray(result.rows) ? result.rows.length : 0;\n\n if (rowCount !== compiledMutation.expectedReturnedRows) {\n // Version conflict detected - the SELECT didn't return the expected number of rows\n // This means either the row doesn't exist or the version has changed\n throw new Error(\n `Version conflict: expected ${compiledMutation.expectedReturnedRows} rows returned, but got ${rowCount}`,\n );\n }\n }\n }\n });\n\n return { success: true, createdInternalIds };\n } catch (error) {\n // Transaction failed - could be version conflict or other constraint violation\n // Return success=false to indicate the UOW should be retried\n if (error instanceof Error && error.message.includes(\"Version conflict\")) {\n return { success: false };\n }\n\n // Other database errors should be thrown\n throw error;\n }\n}\n"],"mappings":";AAGA,SAAS,gBAAgB,QAAsC;CAC7D,MAAM,eACJ,OAAO,mBACP,OAAO,mBAEN,kBAAkB,WAClB,OAAO,OAAO,oBAAoB,YAAY,OAAO,OAAO,oBAAoB,YAC7E,OAAO,kBACP,YAEH,oBAAoB,WACpB,OAAO,OAAO,sBAAsB,YAAY,OAAO,OAAO,sBAAsB,YACjF,OAAO,oBACP;AAEN,KAAI,iBAAiB,OACnB,OAAM,IAAI,MAAM,2BAA2B,KAAK,UAAU,OAAO,GAAG;AAGtE,KAAI,OAAO,iBAAiB,YAAY,eAAe,OAAO,iBAC5D,OAAM,IAAI,MACR,6BAA6B,aAAa,UAAU,CAAC,gCACtD;AAGH,QAAO,OAAO,aAAa;;;;;;;;;;;;;;;;;;AAmB7B,eAAsB,4BAEpB,QACA,gBACoB;AAEpB,KAAI,eAAe,WAAW,EAC5B,QAAO,EAAE;CAGX,MAAMA,mBAA8B,EAAE;AAGtC,OAAM,OAAO,aAAa,CAAC,QAAQ,OAAO,OAAO;AAC/C,OAAK,MAAM,iBAAiB,gBAAgB;GAC1C,MAAM,SAAS,MAAM,GAAG,aAAa,cAAc;AACnD,oBAAiB,KAAK,OAAO,KAAK;;GAEpC;AAEF,QAAO;;;;;;;;;;;;;;;;;;;;;AAsBT,eAAsB,2BAEpB,QACA,eACyB;AAEzB,KAAI,cAAc,WAAW,EAC3B,QAAO;EAAE,SAAS;EAAM,oBAAoB,EAAE;EAAE;CAGlD,MAAMC,qBAAwC,EAAE;AAGhD,KAAI;AACF,QAAM,OAAO,aAAa,CAAC,QAAQ,OAAO,OAAO;AAC/C,QAAK,MAAM,oBAAoB,eAAe;IAC5C,MAAM,SAAS,MAAM,GAAG,aAAa,iBAAiB,MAAM;AAI5D,QAAI,iBAAiB,yBAAyB,KAC5C,KAAI,MAAM,QAAQ,OAAO,KAAK,IAAI,OAAO,KAAK,SAAS,GAAG;KACxD,MAAM,MAAM,OAAO,KAAK;AACxB,SAAI,iBAAiB,OAAO,kBAAkB,KAAK;MACjD,MAAM,aAAc,IAAI,kBAAkB,IAAI;AAC9C,yBAAmB,KAAK,WAAW;WAGnC,oBAAmB,KAAK,KAAK;UAK/B,oBAAmB,KAAK,KAAK;aAEtB,iBAAiB,yBAAyB,MAAM;KAEzD,MAAM,eAAe,gBAAgB,OAAO;AAE5C,SAAI,iBAAiB,iBAAiB,qBAGpC,OAAM,IAAI,MACR,8BAA8B,iBAAiB,qBAAqB,0BAA0B,eAC/F;;AAIL,QAAI,iBAAiB,yBAAyB,MAAM;KAElD,MAAM,WAAW,MAAM,QAAQ,OAAO,KAAK,GAAG,OAAO,KAAK,SAAS;AAEnE,SAAI,aAAa,iBAAiB,qBAGhC,OAAM,IAAI,MACR,8BAA8B,iBAAiB,qBAAqB,0BAA0B,WAC/F;;;IAIP;AAEF,SAAO;GAAE,SAAS;GAAM;GAAoB;UACrC,OAAO;AAGd,MAAI,iBAAiB,SAAS,MAAM,QAAQ,SAAS,mBAAmB,CACtE,QAAO,EAAE,SAAS,OAAO;AAI3B,QAAM"}
@@ -1,128 +0,0 @@
1
- import { schemaToDBType } from "../../../schema/serialize.js";
2
- import { SETTINGS_TABLE_NAME } from "../../../fragments/internal-fragment.js";
3
- import { sql } from "kysely";
4
-
5
- //#region src/adapters/kysely/migration/execute-base.ts
6
- /**
7
- * Base migration executor with common functionality.
8
- * Provider-specific executors should extend this class.
9
- */
10
- var BaseMigrationExecutor = class {
11
- constructor(db, provider) {
12
- this.db = db;
13
- this.provider = provider;
14
- }
15
- /**
16
- * Default implementation: no preprocessing, no metadata.
17
- * Providers can override to transform operations.
18
- */
19
- preprocessOperations(operations) {
20
- return operations;
21
- }
22
- /**
23
- * Get table name, applying namespace mapping if provided.
24
- * Settings table is never namespaced.
25
- */
26
- getTableName(tableName, mapper) {
27
- return tableName === SETTINGS_TABLE_NAME ? tableName : mapper ? mapper.toPhysical(tableName) : tableName;
28
- }
29
- /**
30
- * Get column builder callback for creating/altering columns.
31
- */
32
- getColumnBuilderCallback(col) {
33
- return (build) => {
34
- if (!col.isNullable) build = build.notNull();
35
- if (col.role === "internal-id") {
36
- build = build.primaryKey();
37
- if (this.provider === "postgresql" || this.provider === "cockroachdb") {} else if (this.provider === "mysql") build = build.autoIncrement();
38
- else if (this.provider === "sqlite") build = build.autoIncrement();
39
- else if (this.provider === "mssql") build = build.identity();
40
- }
41
- if (col.role === "external-id") build = build.unique();
42
- const defaultValue = this.defaultValueToDB(col);
43
- if (defaultValue) build = build.defaultTo(defaultValue);
44
- return build;
45
- };
46
- }
47
- /**
48
- * Convert column default value to database representation.
49
- */
50
- defaultValueToDB(column) {
51
- const value = column.default;
52
- if (!value) return;
53
- if (this.provider === "mysql" && column.type === "string") return;
54
- if ("value" in value && value.value !== void 0) return sql.lit(value.value);
55
- if ("dbSpecial" in value && value.dbSpecial === "now") return sql`CURRENT_TIMESTAMP`;
56
- if ("runtime" in value) return;
57
- }
58
- /**
59
- * Wrap a raw SQL builder in an ExecuteNode.
60
- */
61
- rawToNode(raw) {
62
- return {
63
- compile: () => raw.compile(this.db),
64
- execute: () => raw.execute(this.db)
65
- };
66
- }
67
- /**
68
- * Get the database type string for a column.
69
- */
70
- getDBType(col) {
71
- return schemaToDBType(col, this.provider);
72
- }
73
- };
74
- /**
75
- * Returns the appropriate foreign key action based on the provider.
76
- * MSSQL doesn't support RESTRICT, so we use NO ACTION (functionally equivalent).
77
- */
78
- function getForeignKeyAction(provider) {
79
- return provider === "mssql" ? "no action" : "restrict";
80
- }
81
- /**
82
- * Generates MSSQL default constraint name following the DF_tableName_columnName pattern.
83
- */
84
- function getMssqlDefaultConstraintName(tableName, columnName) {
85
- return `DF_${tableName}_${columnName}`;
86
- }
87
- /**
88
- * Generate SQL to drop MSSQL default constraint.
89
- */
90
- function mssqlDropDefaultConstraint(tableName, columnName) {
91
- return sql`
92
- DECLARE @ConstraintName NVARCHAR(200);
93
-
94
- SELECT @ConstraintName = dc.name
95
- FROM sys.default_constraints dc
96
- JOIN sys.columns c ON dc.parent_object_id = c.object_id AND dc.parent_column_id = c.column_id
97
- JOIN sys.tables t ON t.object_id = c.object_id
98
- JOIN sys.schemas s ON t.schema_id = s.schema_id
99
- WHERE s.name = 'dbo' AND t.name = ${sql.lit(tableName)} AND c.name = ${sql.lit(columnName)};
100
-
101
- IF @ConstraintName IS NOT NULL
102
- BEGIN
103
- EXEC('ALTER TABLE [dbo].[' + ${sql.lit(tableName)} + '] DROP CONSTRAINT [' + @ConstraintName + ']');
104
- END`;
105
- }
106
- /**
107
- * Create a unique index with provider-specific handling.
108
- */
109
- function createUniqueIndex(db, name, tableName, cols, provider) {
110
- const query = db.schema.createIndex(name).on(tableName).columns(cols).unique();
111
- if (provider === "mssql") return query.where((b) => {
112
- return b.and(cols.map((col) => b(col, "is not", null)));
113
- });
114
- return query;
115
- }
116
- /**
117
- * Drop a unique index with provider-specific handling.
118
- */
119
- function dropUniqueIndex(db, name, tableName, provider) {
120
- let query = db.schema.dropIndex(name).ifExists();
121
- if (provider === "cockroachdb") query = query.cascade();
122
- if (provider === "mssql") query = query.on(tableName);
123
- return query;
124
- }
125
-
126
- //#endregion
127
- export { BaseMigrationExecutor, createUniqueIndex, dropUniqueIndex, getForeignKeyAction, getMssqlDefaultConstraintName, mssqlDropDefaultConstraint };
128
- //# sourceMappingURL=execute-base.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"execute-base.js","names":["db: KyselyAny","provider: SQLProvider"],"sources":["../../../../src/adapters/kysely/migration/execute-base.ts"],"sourcesContent":["import { type ColumnBuilderCallback, type Kysely, type RawBuilder, sql } from \"kysely\";\nimport type {\n ColumnInfo,\n MigrationOperation,\n MigrationOperationMetadata,\n} from \"../../../migration-engine/shared\";\nimport type { SQLProvider } from \"../../../shared/providers\";\nimport { schemaToDBType } from \"../../../schema/serialize\";\nimport type { TableNameMapper } from \"../kysely-shared\";\nimport { SETTINGS_TABLE_NAME } from \"../../../fragments/internal-fragment\";\n\nexport type ExecuteNode = {\n compile(): { sql: string; parameters: readonly unknown[] };\n execute(): Promise<unknown>;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype KyselyAny = Kysely<any>;\n\n/**\n * Migration executor interface.\n * Each provider implements this to handle database-specific migration execution.\n */\nexport interface MigrationExecutor<\n TMeta extends MigrationOperationMetadata = MigrationOperationMetadata,\n> {\n /**\n * Preprocess operations before execution.\n * Allows executors to combine, split, or transform operations based on provider capabilities.\n *\n * For example, SQLite can merge add-foreign-key operations into create-table operations.\n */\n preprocessOperations(operations: MigrationOperation[]): MigrationOperation<TMeta>[];\n\n /**\n * Execute a single migration operation.\n */\n executeOperation(\n operation: MigrationOperation<TMeta>,\n mapper?: TableNameMapper,\n ): ExecuteNode | ExecuteNode[];\n}\n\n/**\n * Base migration executor with common functionality.\n * Provider-specific executors should extend this class.\n */\nexport abstract class BaseMigrationExecutor<\n TMeta extends MigrationOperationMetadata = MigrationOperationMetadata,\n> implements MigrationExecutor<TMeta>\n{\n constructor(\n protected readonly db: KyselyAny,\n protected readonly provider: SQLProvider,\n ) {}\n\n /**\n * Default implementation: no preprocessing, no metadata.\n * Providers can override to transform operations.\n */\n preprocessOperations(operations: MigrationOperation[]): MigrationOperation<TMeta>[] {\n return operations as MigrationOperation<TMeta>[];\n }\n\n /**\n * Execute a single migration operation.\n * Must be implemented by provider-specific executors.\n */\n abstract executeOperation(\n operation: MigrationOperation<TMeta>,\n mapper?: TableNameMapper,\n ): ExecuteNode | ExecuteNode[];\n\n /**\n * Get table name, applying namespace mapping if provided.\n * Settings table is never namespaced.\n */\n protected getTableName(tableName: string, mapper?: TableNameMapper): string {\n return tableName === SETTINGS_TABLE_NAME\n ? tableName\n : mapper\n ? mapper.toPhysical(tableName)\n : tableName;\n }\n\n /**\n * Get column builder callback for creating/altering columns.\n */\n protected getColumnBuilderCallback(col: ColumnInfo): ColumnBuilderCallback {\n return (build) => {\n if (!col.isNullable) {\n build = build.notNull();\n }\n\n // Internal ID is the primary key with auto-increment\n if (col.role === \"internal-id\") {\n build = build.primaryKey();\n // Auto-increment for internal ID\n if (this.provider === \"postgresql\" || this.provider === \"cockroachdb\") {\n // SERIAL/BIGSERIAL handles auto-increment\n // Already handled in schemaToDBType\n } else if (this.provider === \"mysql\") {\n build = build.autoIncrement();\n } else if (this.provider === \"sqlite\") {\n build = build.autoIncrement();\n } else if (this.provider === \"mssql\") {\n build = build.identity();\n }\n }\n\n // External ID must be unique\n if (col.role === \"external-id\") {\n build = build.unique();\n }\n\n const defaultValue = this.defaultValueToDB(col);\n if (defaultValue) {\n build = build.defaultTo(defaultValue);\n }\n return build;\n };\n }\n\n /**\n * Convert column default value to database representation.\n */\n protected defaultValueToDB(column: ColumnInfo): RawBuilder<unknown> | undefined {\n const value = column.default;\n if (!value) {\n return undefined;\n }\n\n // MySQL doesn't support default values for TEXT columns\n if (this.provider === \"mysql\" && column.type === \"string\") {\n return undefined;\n }\n\n // Static default values: defaultTo(value)\n if (\"value\" in value && value.value !== undefined) {\n return sql.lit(value.value);\n }\n\n // Database-level special functions: defaultTo(b => b.now())\n if (\"dbSpecial\" in value && value.dbSpecial === \"now\") {\n return sql`CURRENT_TIMESTAMP`;\n }\n\n // Runtime defaults (defaultTo$) are NOT generated in SQL - they're handled in application code\n if (\"runtime\" in value) {\n return undefined;\n }\n\n return undefined;\n }\n\n /**\n * Wrap a raw SQL builder in an ExecuteNode.\n */\n protected rawToNode(raw: RawBuilder<unknown>): ExecuteNode {\n return {\n compile: () => raw.compile(this.db),\n execute: () => raw.execute(this.db),\n };\n }\n\n /**\n * Get the database type string for a column.\n */\n protected getDBType(col: ColumnInfo): string {\n return schemaToDBType(col, this.provider);\n }\n}\n\n// ============================================================================\n// Provider-Specific Helper Functions\n// ============================================================================\n\n/**\n * Returns the appropriate foreign key action based on the provider.\n * MSSQL doesn't support RESTRICT, so we use NO ACTION (functionally equivalent).\n */\nexport function getForeignKeyAction(provider: SQLProvider): \"restrict\" | \"no action\" {\n return provider === \"mssql\" ? \"no action\" : \"restrict\";\n}\n\n/**\n * Generates MSSQL default constraint name following the DF_tableName_columnName pattern.\n */\nexport function getMssqlDefaultConstraintName(tableName: string, columnName: string): string {\n const MSSQL_DEFAULT_CONSTRAINT_PREFIX = \"DF\" as const;\n return `${MSSQL_DEFAULT_CONSTRAINT_PREFIX}_${tableName}_${columnName}`;\n}\n\n/**\n * Generate SQL to drop MSSQL default constraint.\n */\nexport function mssqlDropDefaultConstraint(tableName: string, columnName: string) {\n return sql`\nDECLARE @ConstraintName NVARCHAR(200);\n\nSELECT @ConstraintName = dc.name\nFROM sys.default_constraints dc\nJOIN sys.columns c ON dc.parent_object_id = c.object_id AND dc.parent_column_id = c.column_id\nJOIN sys.tables t ON t.object_id = c.object_id\nJOIN sys.schemas s ON t.schema_id = s.schema_id\nWHERE s.name = 'dbo' AND t.name = ${sql.lit(tableName)} AND c.name = ${sql.lit(columnName)};\n\nIF @ConstraintName IS NOT NULL\nBEGIN\n EXEC('ALTER TABLE [dbo].[' + ${sql.lit(tableName)} + '] DROP CONSTRAINT [' + @ConstraintName + ']');\nEND`;\n}\n\n/**\n * Create a unique index with provider-specific handling.\n */\nexport function createUniqueIndex(\n db: KyselyAny,\n name: string,\n tableName: string,\n cols: string[],\n provider: SQLProvider,\n) {\n const query = db.schema.createIndex(name).on(tableName).columns(cols).unique();\n\n if (provider === \"mssql\") {\n // MSSQL: ignore null values in unique indexes by default\n return query.where((b) => {\n return b.and(cols.map((col) => b(col, \"is not\", null)));\n });\n }\n\n return query;\n}\n\n/**\n * Drop a unique index with provider-specific handling.\n */\nexport function dropUniqueIndex(\n db: KyselyAny,\n name: string,\n tableName: string,\n provider: SQLProvider,\n) {\n let query = db.schema.dropIndex(name).ifExists();\n\n if (provider === \"cockroachdb\") {\n query = query.cascade();\n }\n\n if (provider === \"mssql\") {\n query = query.on(tableName);\n }\n\n return query;\n}\n"],"mappings":";;;;;;;;;AA+CA,IAAsB,wBAAtB,MAGA;CACE,YACE,AAAmBA,IACnB,AAAmBC,UACnB;EAFmB;EACA;;;;;;CAOrB,qBAAqB,YAA+D;AAClF,SAAO;;;;;;CAgBT,AAAU,aAAa,WAAmB,QAAkC;AAC1E,SAAO,cAAc,sBACjB,YACA,SACE,OAAO,WAAW,UAAU,GAC5B;;;;;CAMR,AAAU,yBAAyB,KAAwC;AACzE,UAAQ,UAAU;AAChB,OAAI,CAAC,IAAI,WACP,SAAQ,MAAM,SAAS;AAIzB,OAAI,IAAI,SAAS,eAAe;AAC9B,YAAQ,MAAM,YAAY;AAE1B,QAAI,KAAK,aAAa,gBAAgB,KAAK,aAAa,eAAe,YAG5D,KAAK,aAAa,QAC3B,SAAQ,MAAM,eAAe;aACpB,KAAK,aAAa,SAC3B,SAAQ,MAAM,eAAe;aACpB,KAAK,aAAa,QAC3B,SAAQ,MAAM,UAAU;;AAK5B,OAAI,IAAI,SAAS,cACf,SAAQ,MAAM,QAAQ;GAGxB,MAAM,eAAe,KAAK,iBAAiB,IAAI;AAC/C,OAAI,aACF,SAAQ,MAAM,UAAU,aAAa;AAEvC,UAAO;;;;;;CAOX,AAAU,iBAAiB,QAAqD;EAC9E,MAAM,QAAQ,OAAO;AACrB,MAAI,CAAC,MACH;AAIF,MAAI,KAAK,aAAa,WAAW,OAAO,SAAS,SAC/C;AAIF,MAAI,WAAW,SAAS,MAAM,UAAU,OACtC,QAAO,IAAI,IAAI,MAAM,MAAM;AAI7B,MAAI,eAAe,SAAS,MAAM,cAAc,MAC9C,QAAO,GAAG;AAIZ,MAAI,aAAa,MACf;;;;;CASJ,AAAU,UAAU,KAAuC;AACzD,SAAO;GACL,eAAe,IAAI,QAAQ,KAAK,GAAG;GACnC,eAAe,IAAI,QAAQ,KAAK,GAAG;GACpC;;;;;CAMH,AAAU,UAAU,KAAyB;AAC3C,SAAO,eAAe,KAAK,KAAK,SAAS;;;;;;;AAY7C,SAAgB,oBAAoB,UAAiD;AACnF,QAAO,aAAa,UAAU,cAAc;;;;;AAM9C,SAAgB,8BAA8B,WAAmB,YAA4B;AAE3F,QAAO,MAAsC,UAAU,GAAG;;;;;AAM5D,SAAgB,2BAA2B,WAAmB,YAAoB;AAChF,QAAO,GAAG;;;;;;;;oCAQwB,IAAI,IAAI,UAAU,CAAC,gBAAgB,IAAI,IAAI,WAAW,CAAC;;;;mCAIxD,IAAI,IAAI,UAAU,CAAC;;;;;;AAOtD,SAAgB,kBACd,IACA,MACA,WACA,MACA,UACA;CACA,MAAM,QAAQ,GAAG,OAAO,YAAY,KAAK,CAAC,GAAG,UAAU,CAAC,QAAQ,KAAK,CAAC,QAAQ;AAE9E,KAAI,aAAa,QAEf,QAAO,MAAM,OAAO,MAAM;AACxB,SAAO,EAAE,IAAI,KAAK,KAAK,QAAQ,EAAE,KAAK,UAAU,KAAK,CAAC,CAAC;GACvD;AAGJ,QAAO;;;;;AAMT,SAAgB,gBACd,IACA,MACA,WACA,UACA;CACA,IAAI,QAAQ,GAAG,OAAO,UAAU,KAAK,CAAC,UAAU;AAEhD,KAAI,aAAa,cACf,SAAQ,MAAM,SAAS;AAGzB,KAAI,aAAa,QACf,SAAQ,MAAM,GAAG,UAAU;AAG7B,QAAO"}
@@ -1,34 +0,0 @@
1
- import { SqliteMigrationExecutor } from "./execute-sqlite.js";
2
- import { PostgresMigrationExecutor } from "./execute-postgres.js";
3
- import { MysqlMigrationExecutor } from "./execute-mysql.js";
4
- import { MssqlMigrationExecutor } from "./execute-mssql.js";
5
-
6
- //#region src/adapters/kysely/migration/execute-factory.ts
7
- /**
8
- * Create a provider-specific migration executor.
9
- */
10
- function createMigrationExecutor(config) {
11
- const { provider } = config;
12
- const dbOrFactory = config.db;
13
- let kysely;
14
- if (typeof dbOrFactory === "function") {
15
- const result = dbOrFactory();
16
- if (result && typeof result.then === "function") throw new Error("Cannot create migration executor with async database factory. Database must be initialized before calling preprocessOperations.");
17
- kysely = result;
18
- } else kysely = dbOrFactory;
19
- switch (provider) {
20
- case "sqlite": return new SqliteMigrationExecutor(kysely, provider);
21
- case "postgresql":
22
- case "cockroachdb": return new PostgresMigrationExecutor(kysely, provider);
23
- case "mysql": return new MysqlMigrationExecutor(kysely, provider);
24
- case "mssql": return new MssqlMigrationExecutor(kysely, provider);
25
- default: {
26
- const _exhaustive = provider;
27
- throw new Error(`Unsupported provider: ${_exhaustive}`);
28
- }
29
- }
30
- }
31
-
32
- //#endregion
33
- export { createMigrationExecutor };
34
- //# sourceMappingURL=execute-factory.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"execute-factory.js","names":["kysely: KyselyAny","_exhaustive: never"],"sources":["../../../../src/adapters/kysely/migration/execute-factory.ts"],"sourcesContent":["import type { Kysely } from \"kysely\";\nimport type { KyselyConfig } from \"../kysely-adapter\";\nimport type { MigrationExecutor } from \"./execute-base\";\nimport { SqliteMigrationExecutor } from \"./execute-sqlite\";\nimport { PostgresMigrationExecutor } from \"./execute-postgres\";\nimport { MysqlMigrationExecutor } from \"./execute-mysql\";\nimport { MssqlMigrationExecutor } from \"./execute-mssql\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype KyselyAny = Kysely<any>;\n\n/**\n * Create a provider-specific migration executor.\n */\nexport function createMigrationExecutor(config: KyselyConfig): MigrationExecutor {\n const { provider } = config;\n // Resolve db instance synchronously\n // Safe cast: This is only called from synchronous contexts where the db must be available\n const dbOrFactory = config.db;\n let kysely: KyselyAny;\n\n if (typeof dbOrFactory === \"function\") {\n const result = dbOrFactory();\n // Check if it's a Promise - if so, this is an error in usage\n if (result && typeof (result as Promise<unknown>).then === \"function\") {\n throw new Error(\n \"Cannot create migration executor with async database factory. \" +\n \"Database must be initialized before calling preprocessOperations.\",\n );\n }\n // Safe cast: We've verified it's not a Promise\n kysely = result as KyselyAny;\n } else {\n kysely = dbOrFactory;\n }\n\n switch (provider) {\n case \"sqlite\":\n return new SqliteMigrationExecutor(kysely, provider);\n case \"postgresql\":\n case \"cockroachdb\":\n return new PostgresMigrationExecutor(kysely, provider);\n case \"mysql\":\n return new MysqlMigrationExecutor(kysely, provider);\n case \"mssql\":\n return new MssqlMigrationExecutor(kysely, provider);\n default: {\n // Ensure exhaustive switch\n const _exhaustive: never = provider;\n throw new Error(`Unsupported provider: ${_exhaustive}`);\n }\n }\n}\n"],"mappings":";;;;;;;;;AAcA,SAAgB,wBAAwB,QAAyC;CAC/E,MAAM,EAAE,aAAa;CAGrB,MAAM,cAAc,OAAO;CAC3B,IAAIA;AAEJ,KAAI,OAAO,gBAAgB,YAAY;EACrC,MAAM,SAAS,aAAa;AAE5B,MAAI,UAAU,OAAQ,OAA4B,SAAS,WACzD,OAAM,IAAI,MACR,kIAED;AAGH,WAAS;OAET,UAAS;AAGX,SAAQ,UAAR;EACE,KAAK,SACH,QAAO,IAAI,wBAAwB,QAAQ,SAAS;EACtD,KAAK;EACL,KAAK,cACH,QAAO,IAAI,0BAA0B,QAAQ,SAAS;EACxD,KAAK,QACH,QAAO,IAAI,uBAAuB,QAAQ,SAAS;EACrD,KAAK,QACH,QAAO,IAAI,uBAAuB,QAAQ,SAAS;EACrD,SAAS;GAEP,MAAMC,cAAqB;AAC3B,SAAM,IAAI,MAAM,yBAAyB,cAAc"}