@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,350 +0,0 @@
1
- import { type CompiledQuery, sql } from "kysely";
2
- import type { AnyColumn, AnySchema, FragnoId } from "../../schema/create";
3
- import type {
4
- CompiledMutation,
5
- MutationOperation,
6
- RetrievalOperation,
7
- UOWCompiler,
8
- } from "../../query/unit-of-work";
9
- import { createKyselyQueryCompiler } from "./kysely-query-compiler";
10
- import { createKyselyQueryBuilder, buildWhere } from "./kysely-query-builder";
11
- import { buildCondition, type Condition } from "../../query/condition-builder";
12
- import { decodeCursor, serializeCursorValues } from "../../query/cursor";
13
- import type { AnySelectClause } from "../../query/query";
14
- import { type TableNameMapper, createKysely, createTableNameMapper } from "./kysely-shared";
15
- import type { SQLProvider } from "../../shared/providers";
16
-
17
- /**
18
- * Create a Kysely-specific Unit of Work compiler
19
- *
20
- * This compiler translates UOW operations into Kysely CompiledQuery objects
21
- * that can be executed as a batch/transaction.
22
- *
23
- * @param pool - Connection pool for acquiring database connections
24
- * @param provider - SQL provider (postgresql, mysql, sqlite, etc.)
25
- * @param mapper - Optional table name mapper for namespace prefixing (fallback for operations without explicit namespace)
26
- * @returns A UOWCompiler instance for Kysely
27
- */
28
- export function createKyselyUOWCompiler(
29
- provider: SQLProvider,
30
- mapper?: TableNameMapper,
31
- ): UOWCompiler<CompiledQuery> {
32
- // Get kysely instance for query building (compilation doesn't execute, just builds SQL)
33
- const kysely = createKysely(provider);
34
-
35
- /**
36
- * Get the mapper for a specific operation
37
- * Uses operation's namespace if provided, otherwise falls back to the default mapper
38
- */
39
- function getMapperForOperation(namespace: string | undefined): TableNameMapper | undefined {
40
- if (namespace) {
41
- return createTableNameMapper(namespace);
42
- }
43
- return mapper;
44
- }
45
-
46
- // Cache query compilers and builders by namespace for performance
47
- const compilerCache = new Map<string | undefined, ReturnType<typeof createKyselyQueryCompiler>>();
48
- const builderCache = new Map<string | undefined, ReturnType<typeof createKyselyQueryBuilder>>();
49
-
50
- function getQueryCompiler(schema: AnySchema, namespace: string | undefined) {
51
- const cacheKey = namespace;
52
- let compiler = compilerCache.get(cacheKey);
53
- if (!compiler) {
54
- const opMapper = getMapperForOperation(namespace);
55
- compiler = createKyselyQueryCompiler(schema, provider, opMapper);
56
- compilerCache.set(cacheKey, compiler);
57
- }
58
- return compiler;
59
- }
60
-
61
- function getQueryBuilder(namespace: string | undefined) {
62
- const cacheKey = namespace;
63
- let builder = builderCache.get(cacheKey);
64
- if (!builder) {
65
- const opMapper = getMapperForOperation(namespace);
66
- builder = createKyselyQueryBuilder(kysely, provider, opMapper);
67
- builderCache.set(cacheKey, builder);
68
- }
69
- return builder;
70
- }
71
-
72
- function toTable(schema: AnySchema, name: unknown) {
73
- const table = schema.tables[name as string];
74
- if (!table) {
75
- throw new Error(`Invalid table name ${name}.`);
76
- }
77
- return table;
78
- }
79
-
80
- return {
81
- compileRetrievalOperation(op: RetrievalOperation<AnySchema>): CompiledQuery | null {
82
- const queryCompiler = getQueryCompiler(op.schema, op.namespace);
83
- switch (op.type) {
84
- case "count": {
85
- return queryCompiler.count(op.table.name, {
86
- where: op.options.where,
87
- });
88
- }
89
-
90
- case "find": {
91
- // Map UOW FindOptions to query compiler's FindManyOptions
92
- const {
93
- useIndex: _useIndex,
94
- orderByIndex,
95
- joins: join,
96
- after,
97
- before,
98
- pageSize,
99
- ...findManyOptions
100
- } = op.options;
101
-
102
- // Get index columns for ordering and cursor pagination
103
- let indexColumns: AnyColumn[] = [];
104
- let orderDirection: "asc" | "desc" = "asc";
105
-
106
- if (orderByIndex) {
107
- const index = op.table.indexes[orderByIndex.indexName];
108
- orderDirection = orderByIndex.direction;
109
-
110
- if (!index) {
111
- // If _primary index doesn't exist, fall back to internal ID column
112
- // (which is the actual primary key and maintains insertion order)
113
- if (orderByIndex.indexName === "_primary") {
114
- indexColumns = [op.table.getIdColumn()];
115
- } else {
116
- throw new Error(
117
- `Index "${orderByIndex.indexName}" not found on table "${op.table.name}"`,
118
- );
119
- }
120
- } else {
121
- // Order by all columns in the index with the specified direction
122
- indexColumns = index.columns;
123
- }
124
- }
125
-
126
- // Convert orderByIndex to orderBy format
127
- let orderBy: [AnyColumn, "asc" | "desc"][] | undefined;
128
- if (indexColumns.length > 0) {
129
- orderBy = indexColumns.map((col) => [col, orderDirection]);
130
- }
131
-
132
- // Handle cursor pagination - build a cursor condition
133
- let cursorCondition: Condition | undefined;
134
-
135
- if ((after || before) && indexColumns.length > 0) {
136
- const cursor = after || before;
137
- // Decode cursor if it's a string, otherwise use it as-is
138
- const cursorObj = typeof cursor === "string" ? decodeCursor(cursor!) : cursor!;
139
- const serializedValues = serializeCursorValues(cursorObj, indexColumns, provider);
140
-
141
- // Build tuple comparison for cursor pagination
142
- // For "after" with "asc": (col1, col2, ...) > (val1, val2, ...)
143
- // For "before" with "desc": reverse the comparison
144
- const isAfter = !!after;
145
- const useGreaterThan =
146
- (isAfter && orderDirection === "asc") || (!isAfter && orderDirection === "desc");
147
-
148
- if (indexColumns.length === 1) {
149
- // Simple single-column case
150
- const col = indexColumns[0]!;
151
- const val = serializedValues[col.ormName];
152
- const operator = useGreaterThan ? ">" : "<";
153
- cursorCondition = {
154
- type: "compare",
155
- a: col,
156
- operator,
157
- b: val,
158
- };
159
- } else {
160
- // Multi-column tuple comparison - not yet supported for Kysely
161
- throw new Error(
162
- "Multi-column cursor pagination is not yet supported in Kysely Unit of Work implementation",
163
- );
164
- }
165
- }
166
-
167
- // Combine user where clause with cursor condition
168
- let combinedWhere: Condition | undefined;
169
- if (findManyOptions.where) {
170
- const whereResult = buildCondition(op.table.columns, findManyOptions.where);
171
- if (whereResult === true) {
172
- combinedWhere = undefined;
173
- } else if (whereResult === false) {
174
- return null;
175
- } else {
176
- combinedWhere = whereResult;
177
- }
178
- }
179
-
180
- if (cursorCondition) {
181
- if (combinedWhere) {
182
- combinedWhere = {
183
- type: "and",
184
- items: [combinedWhere, cursorCondition],
185
- };
186
- } else {
187
- combinedWhere = cursorCondition;
188
- }
189
- }
190
-
191
- // For cursor pagination, fetch one extra item to determine if there's a next page
192
- // Only apply this when using the high-level findWithCursor() API (op.withCursor === true)
193
- const effectiveLimit = pageSize && op.withCursor ? pageSize + 1 : pageSize;
194
-
195
- // When we have joins or need to bypass buildFindOptions, use operation-specific queryBuilder
196
- if (join && join.length > 0) {
197
- const queryBuilder = getQueryBuilder(op.namespace);
198
- return queryBuilder.findMany(op.table, {
199
- // Safe cast: select from UOW matches SimplifyFindOptions requirement
200
- select: (findManyOptions.select ?? true) as AnySelectClause,
201
- where: combinedWhere,
202
- orderBy,
203
- limit: effectiveLimit,
204
- join,
205
- });
206
- }
207
-
208
- return queryCompiler.findMany(op.table.name, {
209
- ...findManyOptions,
210
- where: combinedWhere ? () => combinedWhere! : undefined,
211
- orderBy: orderBy?.map(([col, dir]) => [col.ormName, dir]),
212
- limit: effectiveLimit,
213
- });
214
- }
215
- }
216
- },
217
-
218
- compileMutationOperation(
219
- op: MutationOperation<AnySchema>,
220
- ): CompiledMutation<CompiledQuery> | null {
221
- const queryCompiler = getQueryCompiler(op.schema, op.namespace);
222
- switch (op.type) {
223
- case "create":
224
- // queryCompiler.create() calls encodeValues() which handles runtime defaults
225
- return {
226
- query: queryCompiler.create(op.table, op.values),
227
- expectedAffectedRows: null, // creates don't need affected row checks
228
- expectedReturnedRows: null,
229
- };
230
-
231
- case "update": {
232
- const table = toTable(op.schema, op.table);
233
- const idColumn = table.getIdColumn();
234
- const versionColumn = table.getVersionColumn();
235
-
236
- const externalId = typeof op.id === "string" ? op.id : op.id.externalId;
237
- const versionToCheck = getVersionToCheck(op.id, op.checkVersion);
238
-
239
- // Build WHERE clause that filters by ID and optionally by version
240
- const whereClause =
241
- versionToCheck !== undefined
242
- ? () =>
243
- buildCondition(table.columns, (eb) =>
244
- eb.and(
245
- eb(idColumn.ormName, "=", externalId),
246
- eb(versionColumn.ormName, "=", versionToCheck),
247
- ),
248
- )
249
- : () => buildCondition(table.columns, (eb) => eb(idColumn.ormName, "=", externalId));
250
-
251
- const query = queryCompiler.updateMany(op.table, {
252
- where: whereClause,
253
- set: op.set,
254
- });
255
-
256
- return query
257
- ? {
258
- query,
259
- expectedAffectedRows: op.checkVersion ? 1 : null,
260
- expectedReturnedRows: null,
261
- }
262
- : null;
263
- }
264
-
265
- case "delete": {
266
- const table = toTable(op.schema, op.table);
267
- const idColumn = table.getIdColumn();
268
- const versionColumn = table.getVersionColumn();
269
-
270
- // Extract external ID based on whether op.id is FragnoId or string
271
- const externalId = typeof op.id === "string" ? op.id : op.id.externalId;
272
- const versionToCheck = getVersionToCheck(op.id, op.checkVersion);
273
-
274
- // Build WHERE clause that filters by ID and optionally by version
275
- const whereClause =
276
- versionToCheck !== undefined
277
- ? () =>
278
- buildCondition(table.columns, (eb) =>
279
- eb.and(
280
- eb(idColumn.ormName, "=", externalId),
281
- eb(versionColumn.ormName, "=", versionToCheck),
282
- ),
283
- )
284
- : () => buildCondition(table.columns, (eb) => eb(idColumn.ormName, "=", externalId));
285
-
286
- const query = queryCompiler.deleteMany(op.table, {
287
- where: whereClause,
288
- });
289
-
290
- return query
291
- ? {
292
- query,
293
- expectedAffectedRows: op.checkVersion ? 1 : null,
294
- expectedReturnedRows: null,
295
- }
296
- : null;
297
- }
298
-
299
- case "check": {
300
- const table = toTable(op.schema, op.table);
301
- const idColumn = table.getIdColumn();
302
- const versionColumn = table.getVersionColumn();
303
- const mapper = getMapperForOperation(op.namespace);
304
- const tableName = mapper ? mapper.toPhysical(op.table) : op.table;
305
-
306
- const externalId = op.id.externalId;
307
- const version = op.id.version;
308
-
309
- // Build a SELECT 1 query to check if the row exists with the correct version
310
- const condition = buildCondition(table.columns, (eb) =>
311
- eb.and(eb(idColumn.ormName, "=", externalId), eb(versionColumn.ormName, "=", version)),
312
- );
313
-
314
- let query = kysely.selectFrom(tableName).select(sql<number>`1`.as("exists"));
315
-
316
- if (typeof condition === "boolean") {
317
- throw new Error("Condition is a boolean, but should be a condition object.");
318
- }
319
-
320
- query = query.where((eb) => buildWhere(condition, eb, provider, mapper, table)).limit(1);
321
-
322
- return {
323
- query: query.compile(),
324
- expectedAffectedRows: null,
325
- expectedReturnedRows: 1, // Check that exactly 1 row was returned
326
- };
327
- }
328
- }
329
- },
330
- };
331
- }
332
-
333
- /**
334
- * Get the version to check for a given ID and checkVersion flag.
335
- * @returns The version to check or undefined if no check is required.
336
- * @throws Error if the ID is a string and checkVersion is true.
337
- */
338
- function getVersionToCheck(id: FragnoId | string, checkVersion: boolean): number | undefined {
339
- if (!checkVersion) {
340
- return undefined;
341
- }
342
-
343
- if (typeof id === "string") {
344
- throw new Error(
345
- `Cannot use checkVersion with a string ID. Version checking requires a FragnoId with version information.`,
346
- );
347
- }
348
-
349
- return id.version;
350
- }
@@ -1,164 +0,0 @@
1
- import type { CompiledQuery, Kysely, QueryResult } from "kysely";
2
- import type { CompiledMutation, MutationResult } from "../../query/unit-of-work";
3
-
4
- function getAffectedRows(result: QueryResult<unknown>): number {
5
- const affectedRows =
6
- result.numAffectedRows ??
7
- result.numChangedRows ??
8
- // PGLite returns `affectedRows` instead of `numAffectedRows` or `numChangedRows`
9
- ("affectedRows" in result &&
10
- (typeof result["affectedRows"] === "number" || typeof result["affectedRows"] === "bigint")
11
- ? result["affectedRows"]
12
- : undefined) ??
13
- // SQLite via SQLocal returns `numUpdatedRows` as BigInt
14
- ("numUpdatedRows" in result &&
15
- (typeof result["numUpdatedRows"] === "number" || typeof result["numUpdatedRows"] === "bigint")
16
- ? result["numUpdatedRows"]
17
- : undefined);
18
-
19
- if (affectedRows === undefined) {
20
- throw new Error(`No affected rows found: ${JSON.stringify(result)}`);
21
- }
22
-
23
- if (typeof affectedRows === "bigint" && affectedRows > Number.MAX_SAFE_INTEGER) {
24
- throw new Error(
25
- `affectedRows BigInt value ${affectedRows.toString()} exceeds JS safe integer range`,
26
- );
27
- }
28
-
29
- return Number(affectedRows);
30
- }
31
-
32
- /**
33
- * Execute the retrieval phase of a Unit of Work using Kysely
34
- *
35
- * All retrieval queries are executed inside a single transaction to ensure
36
- * snapshot isolation - all reads see a consistent view of the database.
37
- *
38
- * @param kysely - The Kysely database instance
39
- * @param retrievalBatch - Array of compiled retrieval queries
40
- * @returns Array of query results matching the retrieval operations order
41
- *
42
- * @example
43
- * ```ts
44
- * const retrievalResults = await executeKyselyRetrievalPhase(kysely, compiled.retrievalBatch);
45
- * const [users, posts] = retrievalResults;
46
- * ```
47
- */
48
- export async function executeKyselyRetrievalPhase(
49
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
50
- kysely: Kysely<any>,
51
- retrievalBatch: CompiledQuery[],
52
- ): Promise<unknown[]> {
53
- // If no retrieval operations, return empty array immediately
54
- if (retrievalBatch.length === 0) {
55
- return [];
56
- }
57
-
58
- const retrievalResults: unknown[] = [];
59
-
60
- // Execute all retrieval queries inside a transaction for snapshot isolation
61
- await kysely.transaction().execute(async (tx) => {
62
- for (const compiledQuery of retrievalBatch) {
63
- const result = await tx.executeQuery(compiledQuery);
64
- retrievalResults.push(result.rows);
65
- }
66
- });
67
-
68
- return retrievalResults;
69
- }
70
-
71
- /**
72
- * Execute the mutation phase of a Unit of Work using Kysely
73
- *
74
- * All mutation queries are executed in a transaction with optimistic locking.
75
- * If any version check fails, the entire transaction is rolled back and
76
- * success=false is returned.
77
- *
78
- * @param kysely - The Kysely database instance
79
- * @param mutationBatch - Array of compiled mutation queries with expected affected rows
80
- * @returns Object with success flag and internal IDs from create operations
81
- *
82
- * @example
83
- * ```ts
84
- * const { success, createdInternalIds } = await executeKyselyMutationPhase(kysely, compiled.mutationBatch);
85
- * if (!success) {
86
- * console.log("Version conflict detected, retrying...");
87
- * }
88
- * ```
89
- */
90
- export async function executeKyselyMutationPhase(
91
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
92
- kysely: Kysely<any>,
93
- mutationBatch: CompiledMutation<CompiledQuery>[],
94
- ): Promise<MutationResult> {
95
- // If there are no mutations, return success immediately
96
- if (mutationBatch.length === 0) {
97
- return { success: true, createdInternalIds: [] };
98
- }
99
-
100
- const createdInternalIds: (bigint | null)[] = [];
101
-
102
- // Execute mutation batch in a transaction
103
- try {
104
- await kysely.transaction().execute(async (tx) => {
105
- for (const compiledMutation of mutationBatch) {
106
- const result = await tx.executeQuery(compiledMutation.query);
107
-
108
- // Best-effort extraction: Try to get internal ID if available
109
- // This is optional - the system works without it by using subqueries for references
110
- if (compiledMutation.expectedAffectedRows === null) {
111
- if (Array.isArray(result.rows) && result.rows.length > 0) {
112
- const row = result.rows[0] as Record<string, unknown>;
113
- if ("_internalId" in row || "_internal_id" in row) {
114
- const internalId = (row["_internalId"] ?? row["_internal_id"]) as bigint;
115
- createdInternalIds.push(internalId);
116
- } else {
117
- // RETURNING supported but _internalId not found - that's okay
118
- createdInternalIds.push(null);
119
- }
120
- } else {
121
- // No rows returned (no RETURNING clause, or SQLite via executeQuery)
122
- // This is fine - references will use subqueries based on external IDs
123
- createdInternalIds.push(null);
124
- }
125
- } else if (compiledMutation.expectedAffectedRows !== null) {
126
- // Check affected rows for updates/deletes
127
- const affectedRows = getAffectedRows(result);
128
-
129
- if (affectedRows !== compiledMutation.expectedAffectedRows) {
130
- // Version conflict detected - the UPDATE/DELETE didn't affect the expected number of rows
131
- // This means either the row doesn't exist or the version has changed
132
- throw new Error(
133
- `Version conflict: expected ${compiledMutation.expectedAffectedRows} rows affected, but got ${affectedRows}`,
134
- );
135
- }
136
- }
137
-
138
- if (compiledMutation.expectedReturnedRows !== null) {
139
- // For SELECT queries (check operations), verify row count
140
- const rowCount = Array.isArray(result.rows) ? result.rows.length : 0;
141
-
142
- if (rowCount !== compiledMutation.expectedReturnedRows) {
143
- // Version conflict detected - the SELECT didn't return the expected number of rows
144
- // This means either the row doesn't exist or the version has changed
145
- throw new Error(
146
- `Version conflict: expected ${compiledMutation.expectedReturnedRows} rows returned, but got ${rowCount}`,
147
- );
148
- }
149
- }
150
- }
151
- });
152
-
153
- return { success: true, createdInternalIds };
154
- } catch (error) {
155
- // Transaction failed - could be version conflict or other constraint violation
156
- // Return success=false to indicate the UOW should be retried
157
- if (error instanceof Error && error.message.includes("Version conflict")) {
158
- return { success: false };
159
- }
160
-
161
- // Other database errors should be thrown
162
- throw error;
163
- }
164
- }