@fragno-dev/db 0.1.14 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (445) hide show
  1. package/.turbo/turbo-build.log +242 -139
  2. package/CHANGELOG.md +47 -0
  3. package/README.md +123 -8
  4. package/dist/adapters/adapters.d.ts +19 -5
  5. package/dist/adapters/adapters.d.ts.map +1 -1
  6. package/dist/adapters/adapters.js.map +1 -1
  7. package/dist/adapters/drizzle/drizzle-adapter.d.ts +6 -19
  8. package/dist/adapters/drizzle/drizzle-adapter.d.ts.map +1 -1
  9. package/dist/adapters/drizzle/drizzle-adapter.js +7 -47
  10. package/dist/adapters/drizzle/drizzle-adapter.js.map +1 -1
  11. package/dist/adapters/drizzle/generate.d.ts +7 -1
  12. package/dist/adapters/drizzle/generate.d.ts.map +1 -1
  13. package/dist/adapters/drizzle/generate.js +46 -45
  14. package/dist/adapters/drizzle/generate.js.map +1 -1
  15. package/dist/adapters/generic-sql/driver-config.d.ts +74 -0
  16. package/dist/adapters/generic-sql/driver-config.d.ts.map +1 -0
  17. package/dist/adapters/generic-sql/driver-config.js +94 -0
  18. package/dist/adapters/generic-sql/driver-config.js.map +1 -0
  19. package/dist/adapters/generic-sql/generic-sql-adapter.d.ts +43 -0
  20. package/dist/adapters/generic-sql/generic-sql-adapter.d.ts.map +1 -0
  21. package/dist/adapters/generic-sql/generic-sql-adapter.js +87 -0
  22. package/dist/adapters/generic-sql/generic-sql-adapter.js.map +1 -0
  23. package/dist/adapters/generic-sql/generic-sql-uow-executor.js +67 -0
  24. package/dist/adapters/generic-sql/generic-sql-uow-executor.js.map +1 -0
  25. package/dist/adapters/generic-sql/migration/cold-kysely.js +33 -0
  26. package/dist/adapters/generic-sql/migration/cold-kysely.js.map +1 -0
  27. package/dist/adapters/generic-sql/migration/dialect/mysql.js +60 -0
  28. package/dist/adapters/generic-sql/migration/dialect/mysql.js.map +1 -0
  29. package/dist/adapters/generic-sql/migration/dialect/postgres.js +59 -0
  30. package/dist/adapters/generic-sql/migration/dialect/postgres.js.map +1 -0
  31. package/dist/adapters/generic-sql/migration/dialect/sqlite.js +96 -0
  32. package/dist/adapters/generic-sql/migration/dialect/sqlite.js.map +1 -0
  33. package/dist/adapters/generic-sql/migration/executor.d.ts +15 -0
  34. package/dist/adapters/generic-sql/migration/executor.d.ts.map +1 -0
  35. package/dist/adapters/generic-sql/migration/executor.js +18 -0
  36. package/dist/adapters/generic-sql/migration/executor.js.map +1 -0
  37. package/dist/adapters/generic-sql/migration/prepared-migrations.d.ts +66 -0
  38. package/dist/adapters/generic-sql/migration/prepared-migrations.d.ts.map +1 -0
  39. package/dist/adapters/generic-sql/migration/prepared-migrations.js +68 -0
  40. package/dist/adapters/generic-sql/migration/prepared-migrations.js.map +1 -0
  41. package/dist/adapters/generic-sql/migration/sql-generator.js +212 -0
  42. package/dist/adapters/generic-sql/migration/sql-generator.js.map +1 -0
  43. package/dist/adapters/generic-sql/query/create-sql-query-compiler.js +32 -0
  44. package/dist/adapters/generic-sql/query/create-sql-query-compiler.js.map +1 -0
  45. package/dist/adapters/generic-sql/query/cursor-utils.js +37 -0
  46. package/dist/adapters/generic-sql/query/cursor-utils.js.map +1 -0
  47. package/dist/adapters/generic-sql/query/dialect/mysql.js +33 -0
  48. package/dist/adapters/generic-sql/query/dialect/mysql.js.map +1 -0
  49. package/dist/adapters/generic-sql/query/dialect/postgres.js +32 -0
  50. package/dist/adapters/generic-sql/query/dialect/postgres.js.map +1 -0
  51. package/dist/adapters/generic-sql/query/dialect/sqlite.js +32 -0
  52. package/dist/adapters/generic-sql/query/dialect/sqlite.js.map +1 -0
  53. package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js +152 -0
  54. package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js.map +1 -0
  55. package/dist/adapters/generic-sql/query/select-builder.js +69 -0
  56. package/dist/adapters/generic-sql/query/select-builder.js.map +1 -0
  57. package/dist/adapters/generic-sql/query/sql-query-compiler.js +145 -0
  58. package/dist/adapters/generic-sql/query/sql-query-compiler.js.map +1 -0
  59. package/dist/adapters/generic-sql/query/where-builder.js +129 -0
  60. package/dist/adapters/generic-sql/query/where-builder.js.map +1 -0
  61. package/dist/adapters/generic-sql/result-interpreter.js +74 -0
  62. package/dist/adapters/generic-sql/result-interpreter.js.map +1 -0
  63. package/dist/adapters/generic-sql/uow-decoder.js +105 -0
  64. package/dist/adapters/generic-sql/uow-decoder.js.map +1 -0
  65. package/dist/adapters/generic-sql/uow-encoder.js +93 -0
  66. package/dist/adapters/generic-sql/uow-encoder.js.map +1 -0
  67. package/dist/adapters/kysely/kysely-adapter.d.ts +5 -16
  68. package/dist/adapters/kysely/kysely-adapter.d.ts.map +1 -1
  69. package/dist/adapters/kysely/kysely-adapter.js +6 -159
  70. package/dist/adapters/kysely/kysely-adapter.js.map +1 -1
  71. package/dist/adapters/{drizzle/drizzle-query.js → shared/from-unit-of-work-compiler.js} +48 -62
  72. package/dist/adapters/shared/from-unit-of-work-compiler.js.map +1 -0
  73. package/dist/adapters/{kysely/kysely-shared.d.ts → shared/table-name-mapper.d.ts} +3 -2
  74. package/dist/adapters/shared/table-name-mapper.d.ts.map +1 -0
  75. package/dist/adapters/shared/table-name-mapper.js +43 -0
  76. package/dist/adapters/shared/table-name-mapper.js.map +1 -0
  77. package/dist/adapters/shared/uow-operation-compiler.js +105 -0
  78. package/dist/adapters/shared/uow-operation-compiler.js.map +1 -0
  79. package/dist/db-fragment-definition-builder.d.ts +186 -0
  80. package/dist/db-fragment-definition-builder.d.ts.map +1 -0
  81. package/dist/db-fragment-definition-builder.js +207 -0
  82. package/dist/db-fragment-definition-builder.js.map +1 -0
  83. package/dist/fragments/internal-fragment.d.ts +53 -0
  84. package/dist/fragments/internal-fragment.d.ts.map +1 -0
  85. package/dist/fragments/internal-fragment.js +111 -0
  86. package/dist/fragments/internal-fragment.js.map +1 -0
  87. package/dist/hooks/hooks.d.ts +51 -0
  88. package/dist/hooks/hooks.d.ts.map +1 -0
  89. package/dist/hooks/hooks.js +88 -0
  90. package/dist/hooks/hooks.js.map +1 -0
  91. package/dist/migration-engine/generation-engine.d.ts +0 -2
  92. package/dist/migration-engine/generation-engine.d.ts.map +1 -1
  93. package/dist/migration-engine/generation-engine.js +38 -56
  94. package/dist/migration-engine/generation-engine.js.map +1 -1
  95. package/dist/mod.d.ts +35 -23
  96. package/dist/mod.d.ts.map +1 -1
  97. package/dist/mod.js +48 -45
  98. package/dist/mod.js.map +1 -1
  99. package/dist/node_modules/.pnpm/rou3@0.7.10/node_modules/rou3/dist/index.js +165 -0
  100. package/dist/node_modules/.pnpm/rou3@0.7.10/node_modules/rou3/dist/index.js.map +1 -0
  101. package/dist/packages/fragno/dist/api/bind-services.js +20 -0
  102. package/dist/packages/fragno/dist/api/bind-services.js.map +1 -0
  103. package/dist/packages/fragno/dist/api/error.js +48 -0
  104. package/dist/packages/fragno/dist/api/error.js.map +1 -0
  105. package/dist/packages/fragno/dist/api/fragment-definition-builder.js +320 -0
  106. package/dist/packages/fragno/dist/api/fragment-definition-builder.js.map +1 -0
  107. package/dist/packages/fragno/dist/api/fragment-instantiator.js +525 -0
  108. package/dist/packages/fragno/dist/api/fragment-instantiator.js.map +1 -0
  109. package/dist/packages/fragno/dist/api/fragno-response.js +73 -0
  110. package/dist/packages/fragno/dist/api/fragno-response.js.map +1 -0
  111. package/dist/packages/fragno/dist/api/internal/response-stream.js +81 -0
  112. package/dist/packages/fragno/dist/api/internal/response-stream.js.map +1 -0
  113. package/dist/packages/fragno/dist/api/internal/route.js +10 -0
  114. package/dist/packages/fragno/dist/api/internal/route.js.map +1 -0
  115. package/dist/packages/fragno/dist/api/mutable-request-state.js +97 -0
  116. package/dist/packages/fragno/dist/api/mutable-request-state.js.map +1 -0
  117. package/dist/packages/fragno/dist/api/request-context-storage.js +43 -0
  118. package/dist/packages/fragno/dist/api/request-context-storage.js.map +1 -0
  119. package/dist/packages/fragno/dist/api/request-input-context.js +118 -0
  120. package/dist/packages/fragno/dist/api/request-input-context.js.map +1 -0
  121. package/dist/packages/fragno/dist/api/request-middleware.js +83 -0
  122. package/dist/packages/fragno/dist/api/request-middleware.js.map +1 -0
  123. package/dist/packages/fragno/dist/api/request-output-context.js +119 -0
  124. package/dist/packages/fragno/dist/api/request-output-context.js.map +1 -0
  125. package/dist/packages/fragno/dist/api/route.js +17 -0
  126. package/dist/packages/fragno/dist/api/route.js.map +1 -0
  127. package/dist/packages/fragno/dist/internal/symbols.js +10 -0
  128. package/dist/packages/fragno/dist/internal/symbols.js.map +1 -0
  129. package/dist/query/column-defaults.js +27 -0
  130. package/dist/query/column-defaults.js.map +1 -0
  131. package/dist/query/cursor.d.ts +14 -6
  132. package/dist/query/cursor.d.ts.map +1 -1
  133. package/dist/query/cursor.js +16 -7
  134. package/dist/query/cursor.js.map +1 -1
  135. package/dist/query/orm/orm.d.ts +1 -1
  136. package/dist/query/orm/orm.js.map +1 -1
  137. package/dist/query/serialize/create-sql-serializer.js +30 -0
  138. package/dist/query/serialize/create-sql-serializer.js.map +1 -0
  139. package/dist/query/serialize/dialect/mysql-serializer.js +87 -0
  140. package/dist/query/serialize/dialect/mysql-serializer.js.map +1 -0
  141. package/dist/query/serialize/dialect/postgres-serializer.js +80 -0
  142. package/dist/query/serialize/dialect/postgres-serializer.js.map +1 -0
  143. package/dist/query/serialize/dialect/sqlite-serializer.js +93 -0
  144. package/dist/query/serialize/dialect/sqlite-serializer.js.map +1 -0
  145. package/dist/query/serialize/sql-serializer.js +67 -0
  146. package/dist/query/serialize/sql-serializer.js.map +1 -0
  147. package/dist/query/{query.d.ts → simple-query-interface.d.ts} +6 -6
  148. package/dist/query/simple-query-interface.d.ts.map +1 -0
  149. package/dist/query/unit-of-work/execute-unit-of-work.d.ts +133 -0
  150. package/dist/query/unit-of-work/execute-unit-of-work.d.ts.map +1 -0
  151. package/dist/query/unit-of-work/execute-unit-of-work.js +197 -0
  152. package/dist/query/unit-of-work/execute-unit-of-work.js.map +1 -0
  153. package/dist/query/unit-of-work/retry-policy.d.ts +88 -0
  154. package/dist/query/unit-of-work/retry-policy.d.ts.map +1 -0
  155. package/dist/query/unit-of-work/retry-policy.js +61 -0
  156. package/dist/query/unit-of-work/retry-policy.js.map +1 -0
  157. package/dist/query/{unit-of-work.d.ts → unit-of-work/unit-of-work.d.ts} +145 -58
  158. package/dist/query/unit-of-work/unit-of-work.d.ts.map +1 -0
  159. package/dist/query/{unit-of-work.js → unit-of-work/unit-of-work.js} +435 -198
  160. package/dist/query/unit-of-work/unit-of-work.js.map +1 -0
  161. package/dist/query/value-decoding.js +71 -0
  162. package/dist/query/value-decoding.js.map +1 -0
  163. package/dist/query/value-encoding.js +124 -0
  164. package/dist/query/value-encoding.js.map +1 -0
  165. package/dist/schema/create.d.ts +3 -0
  166. package/dist/schema/create.d.ts.map +1 -1
  167. package/dist/schema/create.js +4 -0
  168. package/dist/schema/create.js.map +1 -1
  169. package/dist/schema/type-conversion/create-sql-type-mapper.js +29 -0
  170. package/dist/schema/type-conversion/create-sql-type-mapper.js.map +1 -0
  171. package/dist/schema/type-conversion/dialect/mysql.js +57 -0
  172. package/dist/schema/type-conversion/dialect/mysql.js.map +1 -0
  173. package/dist/schema/type-conversion/dialect/postgres.js +56 -0
  174. package/dist/schema/type-conversion/dialect/postgres.js.map +1 -0
  175. package/dist/schema/type-conversion/dialect/sqlite.js +52 -0
  176. package/dist/schema/type-conversion/dialect/sqlite.js.map +1 -0
  177. package/dist/schema/type-conversion/type-mapping.js +63 -0
  178. package/dist/schema/type-conversion/type-mapping.js.map +1 -0
  179. package/dist/sql-driver/connection/connection-provider.d.ts +13 -0
  180. package/dist/sql-driver/connection/connection-provider.d.ts.map +1 -0
  181. package/dist/sql-driver/connection/connection-provider.js +19 -0
  182. package/dist/sql-driver/connection/connection-provider.js.map +1 -0
  183. package/dist/sql-driver/connection/single-connection-provider.js +23 -0
  184. package/dist/sql-driver/connection/single-connection-provider.js.map +1 -0
  185. package/dist/sql-driver/dialect-adapter/dialect-adapter.d.ts +7 -0
  186. package/dist/sql-driver/dialect-adapter/dialect-adapter.d.ts.map +1 -0
  187. package/dist/sql-driver/dialects/dialects.d.ts +2 -0
  188. package/dist/sql-driver/dialects/dialects.js +3 -0
  189. package/dist/sql-driver/dialects/durable-object-dialect.d.ts +72 -0
  190. package/dist/sql-driver/dialects/durable-object-dialect.d.ts.map +1 -0
  191. package/dist/sql-driver/dialects/durable-object-dialect.js +130 -0
  192. package/dist/sql-driver/dialects/durable-object-dialect.js.map +1 -0
  193. package/dist/sql-driver/driver/runtime-driver.d.ts +23 -0
  194. package/dist/sql-driver/driver/runtime-driver.d.ts.map +1 -0
  195. package/dist/sql-driver/driver/runtime-driver.js +56 -0
  196. package/dist/sql-driver/driver/runtime-driver.js.map +1 -0
  197. package/dist/sql-driver/query-executor/default-query-executor.js +26 -0
  198. package/dist/sql-driver/query-executor/default-query-executor.js.map +1 -0
  199. package/dist/sql-driver/query-executor/plugin.d.ts +17 -0
  200. package/dist/sql-driver/query-executor/plugin.d.ts.map +1 -0
  201. package/dist/sql-driver/query-executor/query-executor-base.js +25 -0
  202. package/dist/sql-driver/query-executor/query-executor-base.js.map +1 -0
  203. package/dist/sql-driver/query-executor/query-executor.d.ts +36 -0
  204. package/dist/sql-driver/query-executor/query-executor.d.ts.map +1 -0
  205. package/dist/sql-driver/sql-driver-adapter.d.ts +29 -0
  206. package/dist/sql-driver/sql-driver-adapter.d.ts.map +1 -0
  207. package/dist/sql-driver/sql-driver-adapter.js +68 -0
  208. package/dist/sql-driver/sql-driver-adapter.js.map +1 -0
  209. package/dist/sql-driver/sql-driver.d.ts +38 -0
  210. package/dist/sql-driver/sql-driver.d.ts.map +1 -0
  211. package/dist/sql-driver/sql-driver.js +1 -0
  212. package/dist/sql-driver/sql.js +50 -0
  213. package/dist/sql-driver/sql.js.map +1 -0
  214. package/dist/with-database.d.ts +32 -0
  215. package/dist/with-database.d.ts.map +1 -0
  216. package/dist/with-database.js +34 -0
  217. package/dist/with-database.js.map +1 -0
  218. package/package.json +43 -9
  219. package/src/adapters/adapters.ts +23 -4
  220. package/src/adapters/drizzle/drizzle-adapter-pglite.test.ts +140 -185
  221. package/src/adapters/drizzle/{drizzle-adapter-sqlite.test.ts → drizzle-adapter-sqlite3.test.ts} +187 -55
  222. package/src/adapters/drizzle/drizzle-adapter.ts +14 -93
  223. package/src/adapters/drizzle/generate.test.ts +102 -269
  224. package/src/adapters/drizzle/generate.ts +89 -63
  225. package/src/adapters/drizzle/migrate-drizzle.test.ts +19 -0
  226. package/src/adapters/drizzle/shared.ts +0 -34
  227. package/src/adapters/drizzle/test-utils.ts +36 -5
  228. package/src/adapters/generic-sql/README.md +14 -0
  229. package/src/adapters/generic-sql/driver-config.ts +144 -0
  230. package/src/adapters/generic-sql/generic-sql-adapter.test.ts +50 -0
  231. package/src/adapters/generic-sql/generic-sql-adapter.ts +146 -0
  232. package/src/adapters/generic-sql/generic-sql-uow-executor.ts +130 -0
  233. package/src/adapters/generic-sql/migration/cold-kysely.ts +55 -0
  234. package/src/adapters/{kysely/migration/execute-mysql.test.ts → generic-sql/migration/dialect/mysql.test.ts} +342 -484
  235. package/src/adapters/generic-sql/migration/dialect/mysql.ts +104 -0
  236. package/src/adapters/generic-sql/migration/dialect/postgres.test.ts +1008 -0
  237. package/src/adapters/generic-sql/migration/dialect/postgres.ts +113 -0
  238. package/src/adapters/{kysely/migration/execute-sqlite.test.ts → generic-sql/migration/dialect/sqlite.test.ts} +307 -510
  239. package/src/adapters/generic-sql/migration/dialect/sqlite.ts +189 -0
  240. package/src/adapters/generic-sql/migration/executor.ts +33 -0
  241. package/src/adapters/generic-sql/migration/prepared-migrations.test.ts +661 -0
  242. package/src/adapters/generic-sql/migration/prepared-migrations.ts +214 -0
  243. package/src/adapters/generic-sql/migration/sql-generator.ts +413 -0
  244. package/src/adapters/generic-sql/query/create-sql-query-compiler.ts +36 -0
  245. package/src/adapters/generic-sql/query/cursor-utils.ts +56 -0
  246. package/src/adapters/generic-sql/query/dialect/mysql.ts +34 -0
  247. package/src/adapters/generic-sql/query/dialect/postgres.ts +32 -0
  248. package/src/adapters/generic-sql/query/dialect/sqlite.ts +32 -0
  249. package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.test.ts +1568 -0
  250. package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.ts +314 -0
  251. package/src/adapters/generic-sql/query/select-builder.test.ts +256 -0
  252. package/src/adapters/generic-sql/query/select-builder.ts +137 -0
  253. package/src/adapters/generic-sql/query/sql-query-compiler.test.ts +195 -0
  254. package/src/adapters/generic-sql/query/sql-query-compiler.ts +367 -0
  255. package/src/adapters/generic-sql/query/where-builder.test.ts +744 -0
  256. package/src/adapters/generic-sql/query/where-builder.ts +211 -0
  257. package/src/adapters/generic-sql/result-interpreter.ts +102 -0
  258. package/src/adapters/generic-sql/test/generic-drizzle-adapter-sqlite3.test.ts +899 -0
  259. package/src/adapters/generic-sql/uow-decoder.test.ts +399 -0
  260. package/src/adapters/generic-sql/uow-decoder.ts +152 -0
  261. package/src/adapters/generic-sql/uow-encoder.test.ts +183 -0
  262. package/src/adapters/generic-sql/uow-encoder.ts +131 -0
  263. package/src/adapters/kysely/kysely-adapter-pglite.test.ts +90 -96
  264. package/src/adapters/kysely/kysely-adapter-sqlocal.test.ts +215 -0
  265. package/src/adapters/kysely/kysely-adapter.ts +10 -242
  266. package/src/adapters/{drizzle/drizzle-query.ts → shared/from-unit-of-work-compiler.ts} +111 -106
  267. package/src/adapters/shared/table-name-mapper.ts +50 -0
  268. package/src/adapters/shared/uow-operation-compiler.ts +211 -0
  269. package/src/db-fragment-definition-builder.test.ts +887 -0
  270. package/src/db-fragment-definition-builder.ts +737 -0
  271. package/src/db-fragment-instantiator.test.ts +543 -0
  272. package/src/db-fragment-integration.test.ts +406 -0
  273. package/src/fragments/internal-fragment.test.ts +549 -0
  274. package/src/fragments/internal-fragment.ts +249 -0
  275. package/src/hooks/hooks.test.ts +575 -0
  276. package/src/hooks/hooks.ts +179 -0
  277. package/src/migration-engine/generation-engine.test.ts +60 -27
  278. package/src/migration-engine/generation-engine.ts +99 -92
  279. package/src/mod.ts +139 -78
  280. package/src/query/column-defaults.ts +49 -0
  281. package/src/query/cursor.test.ts +147 -3
  282. package/src/query/cursor.ts +25 -8
  283. package/src/query/orm/orm.ts +1 -1
  284. package/src/query/query-type.test.ts +9 -9
  285. package/src/query/serialize/create-sql-serializer.ts +34 -0
  286. package/src/query/serialize/dialect/mysql-serializer.ts +142 -0
  287. package/src/query/serialize/dialect/postgres-serializer.ts +129 -0
  288. package/src/query/serialize/dialect/sqlite-serializer.test.ts +251 -0
  289. package/src/query/serialize/dialect/sqlite-serializer.ts +156 -0
  290. package/src/query/serialize/sql-serializer.ts +143 -0
  291. package/src/query/{query.ts → simple-query-interface.ts} +4 -4
  292. package/src/query/unit-of-work/execute-unit-of-work.test.ts +1310 -0
  293. package/src/query/unit-of-work/execute-unit-of-work.ts +504 -0
  294. package/src/query/unit-of-work/retry-policy.test.ts +217 -0
  295. package/src/query/unit-of-work/retry-policy.ts +141 -0
  296. package/src/query/unit-of-work/unit-of-work-coordinator.test.ts +831 -0
  297. package/src/query/{unit-of-work-types.test.ts → unit-of-work/unit-of-work-types.test.ts} +7 -5
  298. package/src/query/unit-of-work/unit-of-work.test.ts +1716 -0
  299. package/src/query/{unit-of-work.ts → unit-of-work/unit-of-work.ts} +716 -420
  300. package/src/query/{result-transform.test.ts → value-decoding.test.ts} +45 -298
  301. package/src/query/value-decoding.ts +113 -0
  302. package/src/query/value-encoding.test.ts +390 -0
  303. package/src/query/value-encoding.ts +168 -0
  304. package/src/schema/create.test.ts +5 -1
  305. package/src/schema/create.ts +5 -0
  306. package/src/schema/serialize.test.ts +165 -407
  307. package/src/schema/type-conversion/create-sql-type-mapper.ts +28 -0
  308. package/src/schema/type-conversion/dialect/mysql.ts +64 -0
  309. package/src/schema/type-conversion/dialect/postgres.ts +62 -0
  310. package/src/schema/type-conversion/dialect/sqlite.ts +63 -0
  311. package/src/schema/type-conversion/type-mapping.test.ts +137 -0
  312. package/src/schema/type-conversion/type-mapping.ts +153 -0
  313. package/src/shared/connection-pool.ts +5 -5
  314. package/src/sql-driver/better-sqlite3.test.ts +126 -0
  315. package/src/sql-driver/connection/connection-provider.ts +27 -0
  316. package/src/sql-driver/connection/single-connection-provider.ts +42 -0
  317. package/src/sql-driver/dialect-adapter/dialect-adapter.ts +9 -0
  318. package/src/sql-driver/dialect-adapter/sqlite-dialect-adapter.ts +7 -0
  319. package/src/sql-driver/dialects/dialects.ts +1 -0
  320. package/src/sql-driver/dialects/durable-object-dialect.ts +260 -0
  321. package/src/sql-driver/driver/runtime-driver.ts +91 -0
  322. package/src/sql-driver/query-executor/default-query-executor.ts +38 -0
  323. package/src/sql-driver/query-executor/plugin.ts +22 -0
  324. package/src/sql-driver/query-executor/query-executor-base.ts +53 -0
  325. package/src/sql-driver/query-executor/query-executor.ts +44 -0
  326. package/src/sql-driver/sql-driver-adapter.ts +96 -0
  327. package/src/sql-driver/sql-driver.ts +53 -0
  328. package/src/sql-driver/sql.ts +57 -0
  329. package/src/sql-driver/sqlocal.test.ts +117 -0
  330. package/src/with-database.ts +152 -0
  331. package/tsdown.config.ts +8 -2
  332. package/dist/adapters/drizzle/drizzle-connection-pool.js +0 -40
  333. package/dist/adapters/drizzle/drizzle-connection-pool.js.map +0 -1
  334. package/dist/adapters/drizzle/drizzle-query.d.ts +0 -23
  335. package/dist/adapters/drizzle/drizzle-query.d.ts.map +0 -1
  336. package/dist/adapters/drizzle/drizzle-query.js.map +0 -1
  337. package/dist/adapters/drizzle/drizzle-uow-compiler.d.ts +0 -10
  338. package/dist/adapters/drizzle/drizzle-uow-compiler.d.ts.map +0 -1
  339. package/dist/adapters/drizzle/drizzle-uow-compiler.js +0 -315
  340. package/dist/adapters/drizzle/drizzle-uow-compiler.js.map +0 -1
  341. package/dist/adapters/drizzle/drizzle-uow-decoder.js +0 -116
  342. package/dist/adapters/drizzle/drizzle-uow-decoder.js.map +0 -1
  343. package/dist/adapters/drizzle/drizzle-uow-executor.js +0 -149
  344. package/dist/adapters/drizzle/drizzle-uow-executor.js.map +0 -1
  345. package/dist/adapters/drizzle/join-column-utils.js +0 -28
  346. package/dist/adapters/drizzle/join-column-utils.js.map +0 -1
  347. package/dist/adapters/drizzle/shared.d.ts +0 -14
  348. package/dist/adapters/drizzle/shared.d.ts.map +0 -1
  349. package/dist/adapters/drizzle/shared.js +0 -35
  350. package/dist/adapters/drizzle/shared.js.map +0 -1
  351. package/dist/adapters/kysely/kysely-connection-pool.js +0 -41
  352. package/dist/adapters/kysely/kysely-connection-pool.js.map +0 -1
  353. package/dist/adapters/kysely/kysely-query-builder.js +0 -321
  354. package/dist/adapters/kysely/kysely-query-builder.js.map +0 -1
  355. package/dist/adapters/kysely/kysely-query-compiler.js +0 -66
  356. package/dist/adapters/kysely/kysely-query-compiler.js.map +0 -1
  357. package/dist/adapters/kysely/kysely-query.d.ts +0 -22
  358. package/dist/adapters/kysely/kysely-query.d.ts.map +0 -1
  359. package/dist/adapters/kysely/kysely-query.js +0 -223
  360. package/dist/adapters/kysely/kysely-query.js.map +0 -1
  361. package/dist/adapters/kysely/kysely-shared.d.ts.map +0 -1
  362. package/dist/adapters/kysely/kysely-shared.js +0 -18
  363. package/dist/adapters/kysely/kysely-shared.js.map +0 -1
  364. package/dist/adapters/kysely/kysely-uow-compiler.js +0 -170
  365. package/dist/adapters/kysely/kysely-uow-compiler.js.map +0 -1
  366. package/dist/adapters/kysely/kysely-uow-executor.js +0 -89
  367. package/dist/adapters/kysely/kysely-uow-executor.js.map +0 -1
  368. package/dist/adapters/kysely/migration/execute-base.js +0 -128
  369. package/dist/adapters/kysely/migration/execute-base.js.map +0 -1
  370. package/dist/adapters/kysely/migration/execute-factory.js +0 -34
  371. package/dist/adapters/kysely/migration/execute-factory.js.map +0 -1
  372. package/dist/adapters/kysely/migration/execute-mssql.js +0 -112
  373. package/dist/adapters/kysely/migration/execute-mssql.js.map +0 -1
  374. package/dist/adapters/kysely/migration/execute-mysql.js +0 -93
  375. package/dist/adapters/kysely/migration/execute-mysql.js.map +0 -1
  376. package/dist/adapters/kysely/migration/execute-postgres.js +0 -104
  377. package/dist/adapters/kysely/migration/execute-postgres.js.map +0 -1
  378. package/dist/adapters/kysely/migration/execute-sqlite.js +0 -123
  379. package/dist/adapters/kysely/migration/execute-sqlite.js.map +0 -1
  380. package/dist/adapters/kysely/migration/execute.js +0 -34
  381. package/dist/adapters/kysely/migration/execute.js.map +0 -1
  382. package/dist/bind-services.d.ts +0 -7
  383. package/dist/bind-services.d.ts.map +0 -1
  384. package/dist/bind-services.js +0 -14
  385. package/dist/bind-services.js.map +0 -1
  386. package/dist/fragment.d.ts +0 -173
  387. package/dist/fragment.d.ts.map +0 -1
  388. package/dist/fragment.js +0 -191
  389. package/dist/fragment.js.map +0 -1
  390. package/dist/migration-engine/create.d.ts +0 -37
  391. package/dist/migration-engine/create.d.ts.map +0 -1
  392. package/dist/migration-engine/create.js +0 -58
  393. package/dist/migration-engine/create.js.map +0 -1
  394. package/dist/migration-engine/shared.d.ts +0 -112
  395. package/dist/migration-engine/shared.d.ts.map +0 -1
  396. package/dist/query/query.d.ts.map +0 -1
  397. package/dist/query/result-transform.js +0 -168
  398. package/dist/query/result-transform.js.map +0 -1
  399. package/dist/query/unit-of-work.d.ts.map +0 -1
  400. package/dist/query/unit-of-work.js.map +0 -1
  401. package/dist/schema/serialize.js +0 -106
  402. package/dist/schema/serialize.js.map +0 -1
  403. package/dist/shared/settings-schema.js +0 -36
  404. package/dist/shared/settings-schema.js.map +0 -1
  405. package/src/adapters/drizzle/drizzle-adapter.test.ts +0 -170
  406. package/src/adapters/drizzle/drizzle-connection-pool.ts +0 -66
  407. package/src/adapters/drizzle/drizzle-query.test.ts +0 -499
  408. package/src/adapters/drizzle/drizzle-uow-compiler.test.ts +0 -1383
  409. package/src/adapters/drizzle/drizzle-uow-compiler.ts +0 -636
  410. package/src/adapters/drizzle/drizzle-uow-decoder.ts +0 -218
  411. package/src/adapters/drizzle/drizzle-uow-executor.ts +0 -276
  412. package/src/adapters/drizzle/join-column-utils.test.ts +0 -79
  413. package/src/adapters/drizzle/join-column-utils.ts +0 -39
  414. package/src/adapters/kysely/kysely-connection-pool.ts +0 -70
  415. package/src/adapters/kysely/kysely-query-builder.test.ts +0 -1344
  416. package/src/adapters/kysely/kysely-query-builder.ts +0 -666
  417. package/src/adapters/kysely/kysely-query-compiler.ts +0 -132
  418. package/src/adapters/kysely/kysely-query.test.ts +0 -498
  419. package/src/adapters/kysely/kysely-query.ts +0 -390
  420. package/src/adapters/kysely/kysely-shared.ts +0 -23
  421. package/src/adapters/kysely/kysely-uow-compiler.test.ts +0 -998
  422. package/src/adapters/kysely/kysely-uow-compiler.ts +0 -318
  423. package/src/adapters/kysely/kysely-uow-executor.ts +0 -145
  424. package/src/adapters/kysely/kysely-uow-joins.test.ts +0 -811
  425. package/src/adapters/kysely/migration/execute-base.ts +0 -256
  426. package/src/adapters/kysely/migration/execute-factory.ts +0 -53
  427. package/src/adapters/kysely/migration/execute-mssql.ts +0 -250
  428. package/src/adapters/kysely/migration/execute-mysql.ts +0 -211
  429. package/src/adapters/kysely/migration/execute-postgres.test.ts +0 -2657
  430. package/src/adapters/kysely/migration/execute-postgres.ts +0 -234
  431. package/src/adapters/kysely/migration/execute-sqlite.ts +0 -247
  432. package/src/adapters/kysely/migration/execute.ts +0 -50
  433. package/src/adapters/kysely/migration/kysely-migrator.test.ts +0 -261
  434. package/src/bind-services.test.ts +0 -214
  435. package/src/bind-services.ts +0 -37
  436. package/src/db-fragment.test.ts +0 -800
  437. package/src/fragment.ts +0 -727
  438. package/src/query/result-transform.ts +0 -271
  439. package/src/query/unit-of-work-multi-schema.test.ts +0 -64
  440. package/src/query/unit-of-work.test.ts +0 -943
  441. package/src/schema/serialize.ts +0 -396
  442. package/src/shared/settings-schema.ts +0 -61
  443. package/src/uow-context-integration.test.ts +0 -102
  444. package/src/uow-context.test.ts +0 -182
  445. /package/dist/query/{query.js → simple-query-interface.js} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"file":"kysely-query-builder.js","names":["v: BinaryOperator","rhs: unknown","out: string[]","extendedKeys: string[]","processed: Record<string, unknown>","mappedSelect: string[]"],"sources":["../../../src/adapters/kysely/kysely-query-builder.ts"],"sourcesContent":["import {\n type BinaryOperator,\n type CompiledQuery,\n type ExpressionBuilder,\n type ExpressionWrapper,\n type Kysely,\n sql,\n} from \"kysely\";\nimport type { AnySelectClause, FindManyOptions } from \"../../query/query\";\nimport type { SqlBool } from \"kysely\";\nimport { type AnyColumn, type AnyTable, Column } from \"../../schema/create\";\nimport type { SQLProvider } from \"../../shared/providers\";\nimport type { Condition } from \"../../query/condition-builder\";\nimport { serialize } from \"../../schema/serialize\";\nimport type { CompiledJoin, SimplifyFindOptions } from \"../../query/orm/orm\";\nimport { decodeResult, encodeValues, ReferenceSubquery } from \"../../query/result-transform\";\nimport type { TableNameMapper } from \"./kysely-shared\";\n\n/**\n * Returns the fully qualified SQL name for a column (table.column).\n *\n * @param column - The column to get the full name for\n * @param mapper - Optional table name mapper for namespace prefixing\n * @returns The fully qualified SQL name in the format \"tableName.columnName\"\n * @internal\n *\n * @example\n * ```ts\n * fullSQLName(userTable.columns.email)\n * // Returns: \"users.email\"\n * ```\n */\nexport function fullSQLName(column: AnyColumn, mapper?: TableNameMapper) {\n const tableName = mapper ? mapper.toPhysical(column.tableName) : column.tableName;\n return `${tableName}.${column.name}`;\n}\n\n/**\n * Builds a WHERE clause expression from a Condition tree.\n *\n * Recursively processes condition objects to build Kysely WHERE expressions.\n * Handles comparison operators, logical AND/OR/NOT, and special string operators\n * like \"contains\", \"starts with\", and \"ends with\".\n *\n * @param condition - The condition tree to build the WHERE clause from\n * @param eb - Kysely expression builder for constructing SQL expressions\n * @param provider - The SQL provider (affects SQL generation)\n * @param mapper - Optional table name mapper for namespace prefixing\n * @param table - The table being queried (used for resolving reference columns)\n * @returns A Kysely expression wrapper representing the WHERE clause\n * @internal\n *\n * @example\n * ```ts\n * const condition = {\n * type: \"compare\",\n * a: userTable.columns.name,\n * operator: \"contains\",\n * b: \"john\"\n * };\n * const whereClause = buildWhere(condition, eb, 'postgresql');\n * ```\n */\nexport function buildWhere(\n condition: Condition,\n eb: ExpressionBuilder<any, any>, // eslint-disable-line @typescript-eslint/no-explicit-any\n provider: SQLProvider,\n mapper?: TableNameMapper,\n table?: AnyTable,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): ExpressionWrapper<any, any, SqlBool> {\n if (condition.type === \"compare\") {\n const left = condition.a;\n const op = condition.operator;\n let val = condition.b;\n\n if (!(val instanceof Column)) {\n // Handle string references - convert external ID to internal ID via subquery\n if (left.role === \"reference\" && typeof val === \"string\" && table) {\n // Find relation that uses this column\n const relation = Object.values(table.relations).find((rel) =>\n rel.on.some(([localCol]) => localCol === left.ormName),\n );\n if (relation) {\n const refTable = relation.table;\n const internalIdCol = refTable.getInternalIdColumn();\n const idCol = refTable.getIdColumn();\n const physicalTableName = mapper ? mapper.toPhysical(refTable.ormName) : refTable.ormName;\n\n // Build a SQL subquery\n val = eb\n .selectFrom(physicalTableName)\n .select(internalIdCol.name)\n .where(idCol.name, \"=\", val)\n .limit(1);\n }\n } else {\n val = serialize(val, left, provider);\n }\n }\n\n let v: BinaryOperator;\n let rhs: unknown;\n\n switch (op) {\n case \"contains\":\n v = \"like\";\n rhs =\n val instanceof Column\n ? sql`concat('%', ${eb.ref(fullSQLName(val, mapper))}, '%')`\n : `%${val}%`;\n break;\n case \"not contains\":\n v = \"not like\";\n rhs =\n val instanceof Column\n ? sql`concat('%', ${eb.ref(fullSQLName(val, mapper))}, '%')`\n : `%${val}%`;\n break;\n case \"starts with\":\n v = \"like\";\n rhs =\n val instanceof Column ? sql`concat(${eb.ref(fullSQLName(val, mapper))}, '%')` : `${val}%`;\n break;\n case \"not starts with\":\n v = \"not like\";\n rhs =\n val instanceof Column ? sql`concat(${eb.ref(fullSQLName(val, mapper))}, '%')` : `${val}%`;\n break;\n case \"ends with\":\n v = \"like\";\n rhs =\n val instanceof Column ? sql`concat('%', ${eb.ref(fullSQLName(val, mapper))})` : `%${val}`;\n break;\n case \"not ends with\":\n v = \"not like\";\n rhs =\n val instanceof Column ? sql`concat('%', ${eb.ref(fullSQLName(val, mapper))})` : `%${val}`;\n break;\n default:\n v = op;\n rhs = val instanceof Column ? eb.ref(fullSQLName(val, mapper)) : val;\n }\n\n return eb(fullSQLName(left, mapper), v, rhs);\n }\n\n // Nested conditions\n if (condition.type === \"and\") {\n return eb.and(condition.items.map((v) => buildWhere(v, eb, provider, mapper, table)));\n }\n\n if (condition.type === \"not\") {\n return eb.not(buildWhere(condition.item, eb, provider, mapper, table));\n }\n\n return eb.or(condition.items.map((v) => buildWhere(v, eb, provider, mapper, table)));\n}\n\n/**\n * Maps a select clause to SQL column names with optional aliases.\n *\n * Converts application-level select clauses (either array of keys or \"select all\")\n * into SQL-compatible column selections with proper aliasing for relations.\n *\n * @param select - The select clause (array of keys or true for all columns)\n * @param table - The table schema containing column definitions\n * @param options - Optional configuration\n * @param options.relation - Relation name to prefix in aliases (for joined data)\n * @param options.tableName - Override the table name in the SQL (defaults to table.name)\n * @returns Array of SQL select strings in the format \"tableName.columnName as alias\"\n * @internal\n *\n * @example\n * ```ts\n * mapSelect(['id', 'name'], userTable)\n * // Returns: ['users.id as id', 'users.name as name']\n *\n * mapSelect(['title'], postTable, { relation: 'posts' })\n * // Returns: ['posts.title as posts:title']\n * ```\n */\nexport function mapSelect(\n select: AnySelectClause,\n table: AnyTable,\n options: {\n relation?: string;\n tableName?: string;\n } = {},\n): string[] {\n const { relation, tableName = table.name } = options;\n const out: string[] = [];\n const keys = Array.isArray(select) ? select : Object.keys(table.columns);\n\n for (const key of keys) {\n const col = table.columns[key];\n\n // Skip hidden columns when explicitly selecting\n if (Array.isArray(select) && col.isHidden) {\n continue;\n }\n\n // Add the column to the select list\n const name = relation ? `${relation}:${key}` : key;\n out.push(`${tableName}.${col.name} as ${name}`);\n }\n\n // Always include hidden columns (for FragnoId construction with internal ID and version)\n for (const key in table.columns) {\n const col = table.columns[key];\n if (col.isHidden && !keys.includes(key)) {\n const name = relation ? `${relation}:${key}` : key;\n out.push(`${tableName}.${col.name} as ${name}`);\n }\n }\n\n return out;\n}\n\n/**\n * Result type from compiling a select clause with extensions.\n * @internal\n */\nexport interface CompiledSelect {\n /**\n * The final select clause to use in the query\n */\n result: AnySelectClause;\n\n /**\n * Keys that were added to the select clause (not originally requested)\n */\n extendedKeys: string[];\n\n /**\n * Removes the extended keys from a record (mutates the record).\n * Used to clean up keys that were only needed for join operations.\n *\n * @param record - The record to remove extended keys from\n * @returns The same record with extended keys removed\n */\n removeExtendedKeys: (record: Record<string, unknown>) => Record<string, unknown>;\n}\n\n/**\n * Builder for extending a select clause with additional keys.\n * @internal\n */\nexport interface SelectBuilder {\n /**\n * Adds a key to the select clause if not already present.\n * Tracks which keys were added for later removal.\n *\n * @param key - The key to add to the select clause\n */\n extend: (key: string) => void;\n\n /**\n * Compiles the select clause into its final form.\n *\n * @returns The compiled select information\n */\n compile: () => CompiledSelect;\n}\n\n/**\n * Creates a builder that can extend a select clause with additional keys.\n *\n * This is useful when you need to temporarily include columns for join operations\n * or other internal processing, but don't want them in the final result.\n *\n * @param original - The original select clause from the user\n * @returns A select builder with extend() and compile() methods\n * @internal\n *\n * @example\n * ```ts\n * const builder = extendSelect(['name', 'email']);\n * builder.extend('id'); // Add id for join operation\n * const { result, removeExtendedKeys } = builder.compile();\n * // result: ['name', 'email', 'id']\n *\n * const record = { name: 'John', email: 'j@ex.com', id: 123 };\n * removeExtendedKeys(record);\n * // record: { name: 'John', email: 'j@ex.com' }\n * ```\n */\nexport function extendSelect(original: AnySelectClause): SelectBuilder {\n const select = Array.isArray(original) ? new Set(original) : true;\n const extendedKeys: string[] = [];\n\n return {\n extend(key) {\n if (select === true || select.has(key)) {\n return;\n }\n\n select.add(key);\n extendedKeys.push(key);\n },\n compile() {\n return {\n result: select instanceof Set ? Array.from(select) : true,\n extendedKeys,\n removeExtendedKeys(record) {\n for (const key of extendedKeys) {\n delete record[key];\n }\n return record;\n },\n };\n },\n };\n}\n\n/**\n * Executes a SELECT query to find multiple records.\n *\n * Builds and executes a Kysely query with the provided options including\n * filtering (where), ordering (orderBy), pagination (limit/offset), and\n * column selection (select).\n *\n * @param kysely - The Kysely database instance\n * @param provider - The SQL provider (affects SQL generation)\n * @param table - The table to query from\n * @param v - Query options including where, select, orderBy, limit, and offset\n * @param runSubQueryJoin - Function to execute subquery joins on the results\n * @returns Array of decoded records matching the query criteria\n * @internal\n *\n * @example\n * ```ts\n * const records = await findMany(kysely, 'postgresql', userTable, {\n * where: someCondition,\n * orderBy: [['name', 'asc']],\n * limit: 10\n * });\n * ```\n */\nexport async function findMany(\n kysely: Kysely<any>, // eslint-disable-line @typescript-eslint/no-explicit-any\n provider: SQLProvider,\n table: AnyTable,\n v: SimplifyFindOptions<FindManyOptions>,\n runSubQueryJoin: (records: Record<string, unknown>[], join: CompiledJoin) => Promise<void>,\n) {\n let query = kysely.selectFrom(table.name);\n\n const where = v.where;\n if (where) {\n query = query.where((eb) => buildWhere(where, eb, provider));\n }\n\n if (v.offset !== undefined) {\n query = query.offset(v.offset);\n }\n\n if (v.limit !== undefined) {\n query = provider === \"mssql\" ? query.top(v.limit) : query.limit(v.limit);\n }\n\n if (v.orderBy) {\n for (const [col, mode] of v.orderBy) {\n query = query.orderBy(fullSQLName(col), mode);\n }\n }\n\n const selectBuilder = extendSelect(v.select);\n const mappedSelect: string[] = [];\n const subqueryJoins: CompiledJoin[] = [];\n\n const compiledSelect = selectBuilder.compile();\n mappedSelect.push(...mapSelect(compiledSelect.result, table));\n\n const records = (await query.select(mappedSelect).execute()).map((v) =>\n decodeResult(v, table, provider),\n );\n\n await Promise.all(subqueryJoins.map((join) => runSubQueryJoin(records, join)));\n for (const record of records) {\n compiledSelect.removeExtendedKeys(record);\n }\n\n return records;\n}\n\n/**\n * Processes encoded values and replaces ReferenceSubquery markers with actual SQL subqueries.\n *\n * @param values - The encoded values that may contain ReferenceSubquery objects\n * @param kysely - The Kysely database instance for building subqueries\n * @param mapper - Optional table name mapper for namespace prefixing\n * @returns Processed values with subqueries in place of ReferenceSubquery markers\n * @internal\n */\nfunction processReferenceSubqueries(\n values: Record<string, unknown>,\n kysely: Kysely<any>, // eslint-disable-line @typescript-eslint/no-explicit-any\n mapper?: TableNameMapper,\n): Record<string, unknown> {\n const processed: Record<string, unknown> = {};\n const getTableName = (table: AnyTable) => (mapper ? mapper.toPhysical(table.name) : table.name);\n\n for (const [key, value] of Object.entries(values)) {\n if (value instanceof ReferenceSubquery) {\n const refTable = value.referencedTable;\n const externalId = value.externalIdValue;\n\n // Build a subquery: SELECT _internal_id FROM referenced_table WHERE id = external_id LIMIT 1\n processed[key] = kysely\n .selectFrom(getTableName(refTable))\n .select(refTable.getInternalIdColumn().name)\n .where(refTable.getIdColumn().name, \"=\", externalId)\n .limit(1);\n } else {\n processed[key] = value;\n }\n }\n\n return processed;\n}\n\n/**\n * Creates a query compiler that builds and compiles Kysely queries without executing them.\n *\n * Each method takes table and query parameters and returns a CompiledQuery that can be\n * executed later using kysely.executeQuery().\n *\n * @param kysely - The Kysely database instance\n * @param provider - The SQL provider (affects SQL generation)\n * @returns An object with methods for compiling various database operations\n * @internal\n *\n * @example\n * ```ts\n * const builder = createKyselyQueryBuilder(kysely, 'postgresql');\n * const query = builder.count(userTable, { where: someCondition });\n * const result = await kysely.executeQuery(query);\n * ```\n */\nexport function createKyselyQueryBuilder(\n kysely: Kysely<any>, // eslint-disable-line @typescript-eslint/no-explicit-any\n provider: SQLProvider,\n mapper?: TableNameMapper,\n) {\n // Helper to get the physical table name (with namespace suffix if mapper is provided)\n const getTableName = (table: AnyTable) => (mapper ? mapper.toPhysical(table.name) : table.name);\n\n return {\n count(table: AnyTable, { where }: { where?: Condition }): CompiledQuery {\n let query = kysely.selectFrom(getTableName(table)).select(kysely.fn.countAll().as(\"count\"));\n if (where) {\n query = query.where((b) => buildWhere(where, b, provider, mapper, table));\n }\n return query.compile();\n },\n\n create(table: AnyTable, values: Record<string, unknown>): CompiledQuery {\n const encodedValues = encodeValues(values, table, true, provider);\n const processedValues = processReferenceSubqueries(encodedValues, kysely, mapper);\n const insert = kysely.insertInto(getTableName(table)).values(processedValues);\n\n if (provider === \"mssql\") {\n return (\n insert\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .output(mapSelect(true, table, { tableName: \"inserted\" }) as any[])\n .compile()\n );\n }\n\n if (provider === \"postgresql\" || provider === \"sqlite\") {\n return insert\n .returning(mapSelect(true, table, { tableName: getTableName(table) }))\n .compile();\n }\n\n // For MySQL/other providers, return the insert query\n return insert.compile();\n },\n\n findMany<T extends AnyTable>(\n table: T,\n v: SimplifyFindOptions<FindManyOptions<T>>,\n ): CompiledQuery {\n let query = kysely.selectFrom(getTableName(table));\n\n const where = v.where;\n if (where) {\n query = query.where((eb) => buildWhere(where, eb, provider, mapper, table));\n }\n\n if (v.offset !== undefined) {\n query = query.offset(v.offset);\n }\n\n if (v.limit !== undefined) {\n query = provider === \"mssql\" ? query.top(v.limit) : query.limit(v.limit);\n }\n\n if (v.orderBy) {\n for (const [col, mode] of v.orderBy) {\n query = query.orderBy(fullSQLName(col, mapper), mode);\n }\n }\n\n const selectBuilder = extendSelect(v.select);\n const mappedSelect: string[] = [];\n\n // Process joins recursively to support nested joins\n const processJoins = (\n joins: CompiledJoin[] | undefined,\n parentTable: AnyTable,\n parentTableName: string,\n parentPath: string = \"\",\n ) => {\n for (const join of joins ?? []) {\n const { options: joinOptions, relation } = join;\n\n if (joinOptions === false) {\n continue;\n }\n\n const targetTable = relation.table;\n // Build the full path for this join (e.g., \"author:inviter\")\n const fullPath = parentPath ? `${parentPath}:${relation.name}` : relation.name;\n // SQL table alias uses underscores (e.g., \"author_inviter\")\n const joinName = fullPath.replace(/:/g, \"_\");\n\n // update select\n mappedSelect.push(\n ...mapSelect(joinOptions.select, targetTable, {\n relation: fullPath, // Use full path with colons for column aliases\n tableName: joinName, // Use underscore version for table name\n }),\n );\n\n query = query.leftJoin(`${getTableName(targetTable)} as ${joinName}`, (b) =>\n b.on((eb) => {\n const conditions = [];\n for (const [left, right] of relation.on) {\n // Foreign keys always use internal IDs\n // If the relation references an external ID column (any name), translate to \"_internalId\"\n const rightCol = targetTable.columns[right];\n const actualRight = rightCol?.role === \"external-id\" ? \"_internalId\" : right;\n\n conditions.push(\n eb(\n `${parentTableName}.${parentTable.columns[left].name}`,\n \"=\",\n eb.ref(`${joinName}.${targetTable.columns[actualRight].name}`),\n ),\n );\n }\n\n if (joinOptions.where) {\n conditions.push(buildWhere(joinOptions.where, eb, provider, mapper, targetTable));\n }\n\n return eb.and(conditions);\n }),\n );\n\n // Recursively process nested joins with the full path\n processJoins(joinOptions.join, targetTable, joinName, fullPath);\n }\n };\n\n processJoins(v.join, table, getTableName(table));\n\n const compiledSelect = selectBuilder.compile();\n mappedSelect.push(\n ...mapSelect(compiledSelect.result, table, { tableName: getTableName(table) }),\n );\n\n return query.select(mappedSelect).compile();\n },\n\n updateMany(\n table: AnyTable,\n v: {\n where?: Condition;\n set: Record<string, unknown>;\n },\n ): CompiledQuery {\n const encoded = encodeValues(v.set, table, false, provider);\n const processed = processReferenceSubqueries(encoded, kysely, mapper);\n\n // Automatically increment _version for optimistic concurrency control\n const versionCol = table.getVersionColumn();\n // Safe cast: we're building a SQL expression for incrementing the version\n processed[versionCol.name] = sql.raw(`COALESCE(${versionCol.name}, 0) + 1`) as unknown;\n\n let query = kysely.updateTable(getTableName(table)).set(processed);\n const { where } = v;\n if (where) {\n query = query.where((eb) => buildWhere(where, eb, provider, mapper, table));\n }\n return query.compile();\n },\n\n upsertCheck(table: AnyTable, where: Condition | undefined): CompiledQuery {\n const idColumn = table.getIdColumn();\n let query = kysely.selectFrom(getTableName(table)).select([`${idColumn.name} as id`]);\n if (where) {\n query = query.where((b) => buildWhere(where, b, provider, mapper, table));\n }\n return query.limit(1).compile();\n },\n\n upsertUpdate(\n table: AnyTable,\n update: Record<string, unknown>,\n where: Condition | undefined,\n top?: boolean,\n ): CompiledQuery {\n const encoded = encodeValues(update, table, false, provider);\n const processed = processReferenceSubqueries(encoded, kysely, mapper);\n let query = kysely.updateTable(getTableName(table)).set(processed);\n if (top) {\n query = query.top(1);\n }\n if (where) {\n query = query.where((b) => buildWhere(where, b, provider, mapper, table));\n }\n return query.compile();\n },\n\n upsertUpdateById(table: AnyTable, update: Record<string, unknown>, id: unknown): CompiledQuery {\n const idColumn = table.getIdColumn();\n const encoded = encodeValues(update, table, false, provider);\n const processed = processReferenceSubqueries(encoded, kysely, mapper);\n return kysely\n .updateTable(getTableName(table))\n .set(processed)\n .where(idColumn.name, \"=\", id)\n .compile();\n },\n\n createMany(table: AnyTable, values: Record<string, unknown>[]): CompiledQuery {\n const encodedValues = values.map((v) => encodeValues(v, table, true, provider));\n const processedValues = encodedValues.map((v) =>\n processReferenceSubqueries(v, kysely, mapper),\n );\n return kysely.insertInto(getTableName(table)).values(processedValues).compile();\n },\n\n deleteMany(table: AnyTable, { where }: { where?: Condition }): CompiledQuery {\n let query = kysely.deleteFrom(getTableName(table));\n if (where) {\n query = query.where((eb) => buildWhere(where, eb, provider, mapper, table));\n }\n return query.compile();\n },\n\n findById(table: AnyTable, idValue: unknown): CompiledQuery {\n const idColumn = table.getIdColumn();\n return kysely\n .selectFrom(getTableName(table))\n .select(mapSelect(true, table, { tableName: getTableName(table) }))\n .where(idColumn.name, \"=\", idValue)\n .limit(1)\n .compile();\n },\n };\n}\n"],"mappings":"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"}
@@ -1,66 +0,0 @@
1
- import { buildCondition } from "../../query/condition-builder.js";
2
- import { buildFindOptions } from "../../query/orm/orm.js";
3
- import { createKyselyQueryBuilder } from "./kysely-query-builder.js";
4
-
5
- //#region src/adapters/kysely/kysely-query-compiler.ts
6
- function createKyselyQueryCompiler(schema, pool, provider, mapper) {
7
- const queryBuilder = createKyselyQueryBuilder(pool.getDatabaseSync(), provider, mapper);
8
- function toTable(name) {
9
- const table = schema.tables[name];
10
- if (!table) throw new Error(`Invalid table name ${name}.`);
11
- return table;
12
- }
13
- return {
14
- count(name, { where } = {}) {
15
- const table = toTable(name);
16
- let conditions = where ? buildCondition(table.columns, where) : void 0;
17
- if (conditions === true) conditions = void 0;
18
- if (conditions === false) return null;
19
- return queryBuilder.count(table, { where: conditions });
20
- },
21
- findFirst(name, options) {
22
- const table = toTable(name);
23
- const compiledOptions = buildFindOptions(table, options);
24
- if (compiledOptions === false) return null;
25
- return queryBuilder.findMany(table, {
26
- ...compiledOptions,
27
- limit: 1
28
- });
29
- },
30
- findMany(name, options = {}) {
31
- const table = toTable(name);
32
- const compiledOptions = buildFindOptions(table, options);
33
- if (compiledOptions === false) return null;
34
- return queryBuilder.findMany(table, compiledOptions);
35
- },
36
- create(name, values) {
37
- const table = toTable(name);
38
- return queryBuilder.create(table, values);
39
- },
40
- createMany(name, values) {
41
- const table = toTable(name);
42
- return queryBuilder.createMany(table, values);
43
- },
44
- updateMany(name, { set, where }) {
45
- const table = toTable(name);
46
- let conditions = where ? buildCondition(table.columns, where) : void 0;
47
- if (conditions === true) conditions = void 0;
48
- if (conditions === false) return null;
49
- return queryBuilder.updateMany(table, {
50
- set,
51
- where: conditions
52
- });
53
- },
54
- deleteMany(name, { where }) {
55
- const table = toTable(name);
56
- let conditions = where ? buildCondition(table.columns, where) : void 0;
57
- if (conditions === true) conditions = void 0;
58
- if (conditions === false) return null;
59
- return queryBuilder.deleteMany(table, { where: conditions });
60
- }
61
- };
62
- }
63
-
64
- //#endregion
65
- export { createKyselyQueryCompiler };
66
- //# sourceMappingURL=kysely-query-compiler.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"kysely-query-compiler.js","names":[],"sources":["../../../src/adapters/kysely/kysely-query-compiler.ts"],"sourcesContent":["import type { CompiledQuery, Kysely } from \"kysely\";\nimport type { AnySchema, AnyTable } from \"../../schema/create\";\nimport { buildCondition } from \"../../query/condition-builder\";\nimport { buildFindOptions } from \"../../query/orm/orm\";\nimport { createKyselyQueryBuilder } from \"./kysely-query-builder\";\nimport type { ConditionBuilder, Condition } from \"../../query/condition-builder\";\nimport type { TableNameMapper } from \"./kysely-shared\";\nimport type { ConnectionPool } from \"../../shared/connection-pool\";\nimport type { SQLProvider } from \"../../shared/providers\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype KyselyAny = Kysely<any>;\n\n/**\n * Internal query compiler interface for Kysely\n * Used by the UOW compiler to generate compiled queries\n */\nexport interface KyselyQueryCompiler {\n count: (\n name: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n options?: { where?: (eb: ConditionBuilder<any>) => any },\n ) => CompiledQuery | null;\n findFirst: (name: string, options: any) => CompiledQuery | null; // eslint-disable-line @typescript-eslint/no-explicit-any\n findMany: (name: string, options?: any) => CompiledQuery | null; // eslint-disable-line @typescript-eslint/no-explicit-any\n create: (name: string, values: any) => CompiledQuery; // eslint-disable-line @typescript-eslint/no-explicit-any\n createMany: (name: string, values: any[]) => CompiledQuery; // eslint-disable-line @typescript-eslint/no-explicit-any\n updateMany: (name: string, options: { set: any; where?: any }) => CompiledQuery | null; // eslint-disable-line @typescript-eslint/no-explicit-any\n deleteMany: (name: string, options: { where?: any }) => CompiledQuery | null; // eslint-disable-line @typescript-eslint/no-explicit-any\n}\n\nexport function createKyselyQueryCompiler<T extends AnySchema>(\n schema: T,\n pool: ConnectionPool<KyselyAny>,\n provider: SQLProvider,\n mapper?: TableNameMapper,\n): KyselyQueryCompiler {\n // Get kysely instance for query building (compilation doesn't execute, just builds SQL)\n const kysely = pool.getDatabaseSync();\n const queryBuilder = createKyselyQueryBuilder(kysely, provider, mapper);\n\n function toTable(name: unknown): AnyTable {\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 count(name, { where } = {}) {\n const table = toTable(name);\n let conditions = where ? buildCondition(table.columns, where) : undefined;\n if (conditions === true) {\n conditions = undefined;\n }\n if (conditions === false) {\n return null;\n }\n\n return queryBuilder.count(table, { where: conditions });\n },\n\n findFirst(name, options) {\n const table = toTable(name);\n // Safe cast: FindFirstOptions is structurally compatible with FindManyOptions\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const compiledOptions = buildFindOptions(table, options as any);\n if (compiledOptions === false) {\n return null;\n }\n\n return queryBuilder.findMany(table, {\n ...compiledOptions,\n limit: 1,\n });\n },\n\n findMany(name, options = {}) {\n const table = toTable(name);\n // Safe cast: FindManyOptions from compiler matches FindManyOptions from buildFindOptions\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const compiledOptions = buildFindOptions(table, options as any);\n if (compiledOptions === false) {\n return null;\n }\n\n return queryBuilder.findMany(table, compiledOptions);\n },\n\n create(name, values) {\n const table = toTable(name);\n return queryBuilder.create(table, values);\n },\n\n createMany(name, values) {\n const table = toTable(name);\n return queryBuilder.createMany(table, values);\n },\n\n updateMany(name, { set, where }) {\n const table = toTable(name);\n let conditions = where ? buildCondition(table.columns, where) : undefined;\n if (conditions === true) {\n conditions = undefined;\n }\n if (conditions === false) {\n return null;\n }\n\n // Safe: conditions is Condition | undefined after filtering out true/false\n return queryBuilder.updateMany(table, {\n set,\n where: conditions as Condition | undefined,\n });\n },\n\n deleteMany(name, { where }) {\n const table = toTable(name);\n let conditions = where ? buildCondition(table.columns, where) : undefined;\n if (conditions === true) {\n conditions = undefined;\n }\n if (conditions === false) {\n return null;\n }\n\n // Safe: conditions is Condition | undefined after filtering out true/false\n return queryBuilder.deleteMany(table, { where: conditions as Condition | undefined });\n },\n };\n}\n"],"mappings":";;;;;AA+BA,SAAgB,0BACd,QACA,MACA,UACA,QACqB;CAGrB,MAAM,eAAe,yBADN,KAAK,iBAAiB,EACiB,UAAU,OAAO;CAEvE,SAAS,QAAQ,MAAyB;EACxC,MAAM,QAAQ,OAAO,OAAO;AAC5B,MAAI,CAAC,MACH,OAAM,IAAI,MAAM,sBAAsB,KAAK,GAAG;AAEhD,SAAO;;AAGT,QAAO;EACL,MAAM,MAAM,EAAE,UAAU,EAAE,EAAE;GAC1B,MAAM,QAAQ,QAAQ,KAAK;GAC3B,IAAI,aAAa,QAAQ,eAAe,MAAM,SAAS,MAAM,GAAG;AAChE,OAAI,eAAe,KACjB,cAAa;AAEf,OAAI,eAAe,MACjB,QAAO;AAGT,UAAO,aAAa,MAAM,OAAO,EAAE,OAAO,YAAY,CAAC;;EAGzD,UAAU,MAAM,SAAS;GACvB,MAAM,QAAQ,QAAQ,KAAK;GAG3B,MAAM,kBAAkB,iBAAiB,OAAO,QAAe;AAC/D,OAAI,oBAAoB,MACtB,QAAO;AAGT,UAAO,aAAa,SAAS,OAAO;IAClC,GAAG;IACH,OAAO;IACR,CAAC;;EAGJ,SAAS,MAAM,UAAU,EAAE,EAAE;GAC3B,MAAM,QAAQ,QAAQ,KAAK;GAG3B,MAAM,kBAAkB,iBAAiB,OAAO,QAAe;AAC/D,OAAI,oBAAoB,MACtB,QAAO;AAGT,UAAO,aAAa,SAAS,OAAO,gBAAgB;;EAGtD,OAAO,MAAM,QAAQ;GACnB,MAAM,QAAQ,QAAQ,KAAK;AAC3B,UAAO,aAAa,OAAO,OAAO,OAAO;;EAG3C,WAAW,MAAM,QAAQ;GACvB,MAAM,QAAQ,QAAQ,KAAK;AAC3B,UAAO,aAAa,WAAW,OAAO,OAAO;;EAG/C,WAAW,MAAM,EAAE,KAAK,SAAS;GAC/B,MAAM,QAAQ,QAAQ,KAAK;GAC3B,IAAI,aAAa,QAAQ,eAAe,MAAM,SAAS,MAAM,GAAG;AAChE,OAAI,eAAe,KACjB,cAAa;AAEf,OAAI,eAAe,MACjB,QAAO;AAIT,UAAO,aAAa,WAAW,OAAO;IACpC;IACA,OAAO;IACR,CAAC;;EAGJ,WAAW,MAAM,EAAE,SAAS;GAC1B,MAAM,QAAQ,QAAQ,KAAK;GAC3B,IAAI,aAAa,QAAQ,eAAe,MAAM,SAAS,MAAM,GAAG;AAChE,OAAI,eAAe,KACjB,cAAa;AAEf,OAAI,eAAe,MACjB,QAAO;AAIT,UAAO,aAAa,WAAW,OAAO,EAAE,OAAO,YAAqC,CAAC;;EAExF"}
@@ -1,22 +0,0 @@
1
- import { CompiledQuery, Kysely } from "kysely";
2
-
3
- //#region src/adapters/kysely/kysely-query.d.ts
4
-
5
- /**
6
- * Configuration options for creating a Kysely Unit of Work
7
- */
8
- interface KyselyUOWConfig {
9
- /**
10
- * Optional callback to receive compiled SQL queries for logging/debugging
11
- * This callback is invoked for each query as it's compiled
12
- */
13
- onQuery?: (query: CompiledQuery) => void;
14
- /**
15
- * If true, the query will not be executed and the query will be returned. Not respected for UOWs
16
- * since those have to be manually executed.
17
- */
18
- dryRun?: boolean;
19
- }
20
- //#endregion
21
- export { KyselyUOWConfig };
22
- //# sourceMappingURL=kysely-query.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"kysely-query.d.ts","names":[],"sources":["../../../src/adapters/kysely/kysely-query.ts"],"sourcesContent":[],"mappings":";;;;;;;UAwBiB,eAAA;;;;;oBAKG"}
@@ -1,223 +0,0 @@
1
- import { createCursorFromRecord } from "../../query/cursor.js";
2
- import { UnitOfWork } from "../../query/unit-of-work.js";
3
- import { decodeResult } from "../../query/result-transform.js";
4
- import { createKyselyUOWCompiler } from "./kysely-uow-compiler.js";
5
- import { executeKyselyMutationPhase, executeKyselyRetrievalPhase } from "./kysely-uow-executor.js";
6
-
7
- //#region src/adapters/kysely/kysely-query.ts
8
- /**
9
- * Special builder for updateMany operations that captures configuration
10
- */
11
- var UpdateManySpecialBuilder = class {
12
- #indexName;
13
- #condition;
14
- #setValues;
15
- whereIndex(indexName, condition) {
16
- this.#indexName = indexName;
17
- this.#condition = condition;
18
- return this;
19
- }
20
- set(values) {
21
- this.#setValues = values;
22
- return this;
23
- }
24
- getConfig() {
25
- return {
26
- indexName: this.#indexName,
27
- condition: this.#condition,
28
- setValues: this.#setValues
29
- };
30
- }
31
- };
32
- /**
33
- * Creates a Kysely-based query engine for the given schema.
34
- *
35
- * This is the main entry point for creating a database query interface using Kysely.
36
- * It uses a compiler-based architecture where queries are compiled to SQL and then executed,
37
- * enabling features like SQL snapshot testing.
38
- *
39
- * @param schema - The database schema definition
40
- * @param pool - Connection pool for acquiring database connections
41
- * @param provider - SQL provider (postgresql, mysql, sqlite, etc.)
42
- * @param mapper - Optional table name mapper for namespace prefixing
43
- * @param uowConfig - Optional UOW configuration
44
- * @param schemaNamespaceMap - Optional WeakMap for schema-to-namespace lookups
45
- * @returns An AbstractQuery instance for performing database operations
46
- *
47
- * @example
48
- * ```ts
49
- * const pool = createSimpleConnectionPool(kysely);
50
- * const queryEngine = fromKysely(mySchema, pool, 'postgresql');
51
- *
52
- * const users = await queryEngine.findMany('users', {
53
- * where: (b) => b('age', '>', 18),
54
- * orderBy: [['name', 'asc']]
55
- * });
56
- * ```
57
- */
58
- function fromKysely(schema, pool, provider, mapper, uowConfig, schemaNamespaceMap) {
59
- function createUOW(opts) {
60
- const uowCompiler = createKyselyUOWCompiler(pool, provider, mapper);
61
- const executor = {
62
- async executeRetrievalPhase(retrievalBatch) {
63
- if (opts.config?.dryRun) return retrievalBatch.map(() => []);
64
- const conn = await pool.connect();
65
- try {
66
- return await executeKyselyRetrievalPhase(conn.db, retrievalBatch);
67
- } finally {
68
- await conn.release();
69
- }
70
- },
71
- async executeMutationPhase(mutationBatch) {
72
- if (opts.config?.dryRun) return {
73
- success: true,
74
- createdInternalIds: mutationBatch.map(() => null)
75
- };
76
- const conn = await pool.connect();
77
- try {
78
- return await executeKyselyMutationPhase(conn.db, mutationBatch);
79
- } finally {
80
- await conn.release();
81
- }
82
- }
83
- };
84
- const decoder = (rawResults, ops) => {
85
- if (rawResults.length !== ops.length) throw new Error("rawResults and ops must have the same length");
86
- return rawResults.map((rows, index) => {
87
- const op = ops[index];
88
- if (!op) throw new Error("op must be defined");
89
- if (op.type === "count") {
90
- const firstRow = rows[0];
91
- if (!firstRow) return 0;
92
- const count = Number(firstRow["count"]);
93
- if (Number.isNaN(count)) throw new Error(`Unexpected result for count, received: ${count}`);
94
- return count;
95
- }
96
- const decodedRows = rows.map((row) => decodeResult(row, op.table, provider));
97
- if (op.withCursor) {
98
- let cursor;
99
- if (decodedRows.length > 0 && op.options.orderByIndex && op.options.pageSize) {
100
- const lastItem = decodedRows[decodedRows.length - 1];
101
- const indexName = op.options.orderByIndex.indexName;
102
- let indexColumns;
103
- if (indexName === "_primary") indexColumns = [op.table.getIdColumn()];
104
- else {
105
- const index$1 = op.table.indexes[indexName];
106
- if (index$1) indexColumns = index$1.columns;
107
- }
108
- if (indexColumns && lastItem) cursor = createCursorFromRecord(lastItem, indexColumns, {
109
- indexName: op.options.orderByIndex.indexName,
110
- orderDirection: op.options.orderByIndex.direction,
111
- pageSize: op.options.pageSize
112
- });
113
- }
114
- return {
115
- items: decodedRows,
116
- cursor
117
- };
118
- }
119
- return decodedRows;
120
- });
121
- };
122
- const { onQuery,...restUowConfig } = opts.config ?? {};
123
- return new UnitOfWork(schema, uowCompiler, executor, decoder, opts.name, {
124
- ...restUowConfig,
125
- onQuery: (query) => {
126
- const actualQuery = query && typeof query === "object" && "expectedAffectedRows" in query ? query.query : query;
127
- opts.config?.onQuery?.(actualQuery);
128
- }
129
- }, schemaNamespaceMap);
130
- }
131
- return {
132
- async find(tableName, builderFn) {
133
- const uow = createUOW({ config: uowConfig });
134
- uow.find(tableName, builderFn);
135
- const [result] = await uow.executeRetrieve();
136
- return result ?? [];
137
- },
138
- async findWithCursor(tableName, builderFn) {
139
- const [result] = await createUOW({ config: uowConfig }).findWithCursor(tableName, builderFn).executeRetrieve();
140
- return result;
141
- },
142
- async findFirst(tableName, builderFn) {
143
- const uow = createUOW({ config: uowConfig });
144
- if (builderFn) uow.find(tableName, (b) => {
145
- builderFn(b);
146
- return b.pageSize(1);
147
- });
148
- else uow.find(tableName, (b) => b.whereIndex("primary").pageSize(1));
149
- const [result] = await uow.executeRetrieve();
150
- return result?.[0] ?? null;
151
- },
152
- async create(tableName, values) {
153
- const uow = createUOW({ config: uowConfig });
154
- uow.create(tableName, values);
155
- const { success } = await uow.executeMutations();
156
- if (!success) throw new Error("Failed to create record");
157
- const createdId = uow.getCreatedIds()[0];
158
- if (!createdId) throw new Error("Failed to get created ID");
159
- return createdId;
160
- },
161
- async createMany(tableName, valuesArray) {
162
- const uow = createUOW({ config: uowConfig });
163
- for (const values of valuesArray) uow.create(tableName, values);
164
- const { success } = await uow.executeMutations();
165
- if (!success) throw new Error("Failed to create records");
166
- return uow.getCreatedIds();
167
- },
168
- async update(tableName, id, builderFn) {
169
- const uow = createUOW({ config: uowConfig });
170
- uow.update(tableName, id, builderFn);
171
- const { success } = await uow.executeMutations();
172
- if (!success) throw new Error("Failed to update record (version conflict or record not found)");
173
- },
174
- async updateMany(tableName, builderFn) {
175
- if (!schema.tables[tableName]) throw new Error(`Table ${tableName} not found in schema`);
176
- const specialBuilder = new UpdateManySpecialBuilder();
177
- builderFn(specialBuilder);
178
- const { indexName, condition, setValues } = specialBuilder.getConfig();
179
- if (!indexName) throw new Error("whereIndex() must be called in updateMany");
180
- if (!setValues) throw new Error("set() must be called in updateMany");
181
- const findUow = createUOW({ config: uowConfig });
182
- findUow.find(tableName, (b) => {
183
- if (condition) return b.whereIndex(indexName, condition);
184
- return b.whereIndex(indexName);
185
- });
186
- const [records] = await findUow.executeRetrieve();
187
- if (!records || records.length === 0) return;
188
- const updateUow = createUOW({ config: uowConfig });
189
- for (const record of records) updateUow.update(tableName, record.id, (b) => b.set(setValues));
190
- const { success } = await updateUow.executeMutations();
191
- if (!success) throw new Error("Failed to update records (version conflict)");
192
- },
193
- async delete(tableName, id, builderFn) {
194
- const uow = createUOW({ config: uowConfig });
195
- uow.delete(tableName, id, builderFn);
196
- const { success } = await uow.executeMutations();
197
- if (!success) throw new Error("Failed to delete record (version conflict or record not found)");
198
- },
199
- async deleteMany(tableName, builderFn) {
200
- const findUow = createUOW({ config: uowConfig });
201
- findUow.find(tableName, builderFn);
202
- const [records] = await findUow.executeRetrieve();
203
- if (!records || records.length === 0) return;
204
- const deleteUow = createUOW({ config: uowConfig });
205
- for (const record of records) deleteUow.delete(tableName, record.id);
206
- const { success } = await deleteUow.executeMutations();
207
- if (!success) throw new Error("Failed to delete records (version conflict)");
208
- },
209
- createUnitOfWork(name, nestedUowConfig) {
210
- return createUOW({
211
- name,
212
- config: {
213
- ...uowConfig,
214
- ...nestedUowConfig
215
- }
216
- });
217
- }
218
- };
219
- }
220
-
221
- //#endregion
222
- export { fromKysely };
223
- //# sourceMappingURL=kysely-query.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"kysely-query.js","names":["#indexName","#condition","#setValues","executor: UOWExecutor<CompiledQuery, unknown>","decoder: UOWDecoder<unknown>","cursor: Cursor | undefined","index"],"sources":["../../../src/adapters/kysely/kysely-query.ts"],"sourcesContent":["import type { AbstractQuery, TableToUpdateValues } from \"../../query/query\";\nimport type { AnySchema, AnyTable } from \"../../schema/create\";\nimport type {\n CompiledMutation,\n UOWDecoder,\n UOWExecutor,\n ValidIndexName,\n} from \"../../query/unit-of-work\";\nimport { decodeResult } from \"../../query/result-transform\";\nimport { createKyselyUOWCompiler } from \"./kysely-uow-compiler\";\nimport { executeKyselyRetrievalPhase, executeKyselyMutationPhase } from \"./kysely-uow-executor\";\nimport { UnitOfWork } from \"../../query/unit-of-work\";\nimport type { CompiledQuery, Kysely } from \"kysely\";\nimport type { TableNameMapper } from \"./kysely-shared\";\nimport type { ConnectionPool } from \"../../shared/connection-pool\";\nimport type { SQLProvider } from \"../../shared/providers\";\nimport { createCursorFromRecord, Cursor, type CursorResult } from \"../../query/cursor\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype KyselyAny = Kysely<any>;\n\n/**\n * Configuration options for creating a Kysely Unit of Work\n */\nexport interface KyselyUOWConfig {\n /**\n * Optional callback to receive compiled SQL queries for logging/debugging\n * This callback is invoked for each query as it's compiled\n */\n onQuery?: (query: CompiledQuery) => void;\n /**\n * If true, the query will not be executed and the query will be returned. Not respected for UOWs\n * since those have to be manually executed.\n */\n dryRun?: boolean;\n}\n\n/**\n * Special builder for updateMany operations that captures configuration\n */\nclass UpdateManySpecialBuilder<TTable extends AnyTable> {\n #indexName?: string;\n #condition?: unknown;\n #setValues?: TableToUpdateValues<TTable>;\n\n whereIndex<TIndexName extends ValidIndexName<TTable>>(\n indexName: TIndexName,\n condition?: unknown,\n ): this {\n this.#indexName = indexName as string;\n this.#condition = condition;\n return this;\n }\n\n set(values: TableToUpdateValues<TTable>): this {\n this.#setValues = values;\n return this;\n }\n\n getConfig() {\n return {\n indexName: this.#indexName,\n condition: this.#condition,\n setValues: this.#setValues,\n };\n }\n}\n\n/**\n * Creates a Kysely-based query engine for the given schema.\n *\n * This is the main entry point for creating a database query interface using Kysely.\n * It uses a compiler-based architecture where queries are compiled to SQL and then executed,\n * enabling features like SQL snapshot testing.\n *\n * @param schema - The database schema definition\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\n * @param uowConfig - Optional UOW configuration\n * @param schemaNamespaceMap - Optional WeakMap for schema-to-namespace lookups\n * @returns An AbstractQuery instance for performing database operations\n *\n * @example\n * ```ts\n * const pool = createSimpleConnectionPool(kysely);\n * const queryEngine = fromKysely(mySchema, pool, 'postgresql');\n *\n * const users = await queryEngine.findMany('users', {\n * where: (b) => b('age', '>', 18),\n * orderBy: [['name', 'asc']]\n * });\n * ```\n */\nexport function fromKysely<T extends AnySchema>(\n schema: T,\n pool: ConnectionPool<KyselyAny>,\n provider: SQLProvider,\n mapper?: TableNameMapper,\n uowConfig?: KyselyUOWConfig,\n schemaNamespaceMap?: WeakMap<AnySchema, string>,\n): AbstractQuery<T, KyselyUOWConfig> {\n function createUOW(opts: { name?: string; config?: KyselyUOWConfig }) {\n const uowCompiler = createKyselyUOWCompiler(pool, provider, mapper);\n\n const executor: UOWExecutor<CompiledQuery, unknown> = {\n async executeRetrievalPhase(retrievalBatch: CompiledQuery[]) {\n // In dryRun mode, skip execution and return empty results\n if (opts.config?.dryRun) {\n return retrievalBatch.map(() => []);\n }\n\n const conn = await pool.connect();\n try {\n return await executeKyselyRetrievalPhase(conn.db, retrievalBatch);\n } finally {\n await conn.release();\n }\n },\n async executeMutationPhase(mutationBatch: CompiledMutation<CompiledQuery>[]) {\n // In dryRun mode, skip execution and return success with mock internal IDs\n if (opts.config?.dryRun) {\n return {\n success: true,\n createdInternalIds: mutationBatch.map(() => null),\n };\n }\n\n const conn = await pool.connect();\n try {\n return await executeKyselyMutationPhase(conn.db, mutationBatch);\n } finally {\n await conn.release();\n }\n },\n };\n\n // Create a decoder function to transform raw results into application format\n const decoder: UOWDecoder<unknown> = (rawResults, ops) => {\n if (rawResults.length !== ops.length) {\n throw new Error(\"rawResults and ops must have the same length\");\n }\n\n return rawResults.map((rows, index) => {\n const op = ops[index];\n if (!op) {\n throw new Error(\"op must be defined\");\n }\n\n // Handle count operations differently - return the count number directly\n if (op.type === \"count\") {\n const rowArray = rows as Record<string, unknown>[];\n const firstRow = rowArray[0];\n if (!firstRow) {\n return 0;\n }\n const count = Number(firstRow[\"count\"]);\n if (Number.isNaN(count)) {\n throw new Error(`Unexpected result for count, received: ${count}`);\n }\n return count;\n }\n\n // Each result is an array of rows - decode each row\n const rowArray = rows as Record<string, unknown>[];\n const decodedRows = rowArray.map((row) => decodeResult(row, op.table, provider));\n\n // If cursor generation is requested, wrap in CursorResult\n if (op.withCursor) {\n let cursor: Cursor | undefined;\n\n // Generate cursor from last item if results exist\n if (decodedRows.length > 0 && op.options.orderByIndex && op.options.pageSize) {\n const lastItem = decodedRows[decodedRows.length - 1];\n const indexName = op.options.orderByIndex.indexName;\n\n // Get index columns\n let indexColumns;\n if (indexName === \"_primary\") {\n indexColumns = [op.table.getIdColumn()];\n } else {\n const index = op.table.indexes[indexName];\n if (index) {\n indexColumns = index.columns;\n }\n }\n\n if (indexColumns && lastItem) {\n cursor = createCursorFromRecord(lastItem as Record<string, unknown>, indexColumns, {\n indexName: op.options.orderByIndex.indexName,\n orderDirection: op.options.orderByIndex.direction,\n pageSize: op.options.pageSize,\n });\n }\n }\n\n const result: CursorResult<unknown> = {\n items: decodedRows,\n cursor,\n };\n return result;\n }\n\n return decodedRows;\n });\n };\n\n const { onQuery, ...restUowConfig } = opts.config ?? {};\n\n return new UnitOfWork(\n schema,\n uowCompiler,\n executor,\n decoder,\n opts.name,\n {\n ...restUowConfig,\n onQuery: (query) => {\n // CompiledMutation has { query: CompiledQuery, expectedAffectedRows: number | null }\n // CompiledQuery has { query: QueryAST, sql: string, parameters: unknown[] }\n // Check for expectedAffectedRows to distinguish CompiledMutation from CompiledQuery\n const actualQuery =\n query && typeof query === \"object\" && \"expectedAffectedRows\" in query\n ? (query as CompiledMutation<CompiledQuery>).query\n : (query as CompiledQuery);\n\n opts.config?.onQuery?.(actualQuery);\n },\n },\n schemaNamespaceMap,\n );\n }\n\n return {\n async find(tableName, builderFn) {\n const uow = createUOW({ config: uowConfig });\n // Safe: builderFn returns a FindBuilder (or void), which matches UnitOfWork signature\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n uow.find(tableName, builderFn as any);\n // executeRetrieve returns an array of results (one per find operation)\n // Since we only have one find, unwrap the first result\n const [result]: unknown[][] = await uow.executeRetrieve();\n return result ?? [];\n },\n\n async findWithCursor(tableName, builderFn) {\n // Safe: builderFn returns a FindBuilder, which matches UnitOfWork signature\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const uow = createUOW({ config: uowConfig }).findWithCursor(tableName, builderFn as any);\n // executeRetrieve returns an array of results (one per find operation)\n // Since we only have one findWithCursor, unwrap the first result\n const [result] = await uow.executeRetrieve();\n return result as CursorResult<unknown>;\n },\n\n async findFirst(tableName, builderFn) {\n const uow = createUOW({ config: uowConfig });\n if (builderFn) {\n uow.find(tableName, (b) => {\n builderFn(b);\n return b.pageSize(1);\n });\n } else {\n uow.find(tableName, (b) => b.whereIndex(\"primary\").pageSize(1));\n }\n // executeRetrieve runs an array of `find` operation results, which each return an array of rows\n const [result]: unknown[][] = await uow.executeRetrieve();\n return result?.[0] ?? null;\n },\n\n async create(tableName, values) {\n const uow = createUOW({ config: uowConfig });\n uow.create(tableName, values);\n const { success } = await uow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to create record\");\n }\n\n const createdIds = uow.getCreatedIds();\n const createdId = createdIds[0];\n if (!createdId) {\n throw new Error(\"Failed to get created ID\");\n }\n return createdId;\n },\n\n async createMany(tableName, valuesArray) {\n const uow = createUOW({ config: uowConfig });\n for (const values of valuesArray) {\n uow.create(tableName, values);\n }\n const { success } = await uow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to create records\");\n }\n\n return uow.getCreatedIds();\n },\n\n async update(tableName, id, builderFn) {\n const uow = createUOW({ config: uowConfig });\n uow.update(tableName, id, builderFn);\n const { success } = await uow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to update record (version conflict or record not found)\");\n }\n },\n\n async updateMany(tableName, builderFn) {\n const table = schema.tables[tableName];\n if (!table) {\n throw new Error(`Table ${tableName} not found in schema`);\n }\n\n const specialBuilder = new UpdateManySpecialBuilder<typeof table>();\n builderFn(specialBuilder);\n\n const { indexName, condition, setValues } = specialBuilder.getConfig();\n\n if (!indexName) {\n throw new Error(\"whereIndex() must be called in updateMany\");\n }\n if (!setValues) {\n throw new Error(\"set() must be called in updateMany\");\n }\n\n const findUow = createUOW({ config: uowConfig });\n findUow.find(tableName, (b) => {\n if (condition) {\n // Safe: condition is captured from whereIndex call with proper typing\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return b.whereIndex(indexName as ValidIndexName<typeof table>, condition as any);\n }\n return b.whereIndex(indexName as ValidIndexName<typeof table>);\n });\n const [records]: unknown[][] = await findUow.executeRetrieve();\n\n if (!records || records.length === 0) {\n return;\n }\n\n const updateUow = createUOW({ config: uowConfig });\n for (const record of records as Array<{ id: unknown }>) {\n updateUow.update(tableName, record.id as string, (b) => b.set(setValues));\n }\n const { success } = await updateUow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to update records (version conflict)\");\n }\n },\n\n async delete(tableName, id, builderFn) {\n const uow = createUOW({ config: uowConfig });\n uow.delete(tableName, id, builderFn);\n const { success } = await uow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to delete record (version conflict or record not found)\");\n }\n },\n\n async deleteMany(tableName, builderFn) {\n const findUow = createUOW({ config: uowConfig });\n findUow.find(tableName, builderFn);\n const [records]: unknown[][] = await findUow.executeRetrieve();\n\n if (!records || records.length === 0) {\n return;\n }\n\n const deleteUow = createUOW({ config: uowConfig });\n for (const record of records as Array<{ id: unknown }>) {\n deleteUow.delete(tableName, record.id as string);\n }\n const { success } = await deleteUow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to delete records (version conflict)\");\n }\n },\n\n createUnitOfWork(name, nestedUowConfig) {\n return createUOW({\n name,\n config: {\n ...uowConfig,\n ...nestedUowConfig,\n },\n });\n },\n } as AbstractQuery<T, KyselyUOWConfig>;\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"kysely-shared.d.ts","names":[],"sources":["../../../src/adapters/kysely/kysely-shared.ts"],"sourcesContent":[],"mappings":";;AAGA;;UAAiB,eAAA"}
@@ -1,18 +0,0 @@
1
- //#region src/adapters/kysely/kysely-shared.ts
2
- /**
3
- * Creates a table name mapper for a given namespace.
4
- * Physical names have format: {logicalName}_{namespace}
5
- */
6
- function createTableNameMapper(namespace) {
7
- return {
8
- toPhysical: (logicalName) => `${logicalName}_${namespace}`,
9
- toLogical: (physicalName) => {
10
- if (physicalName.endsWith(`_${namespace}`)) return physicalName.slice(0, -(namespace.length + 1));
11
- return physicalName;
12
- }
13
- };
14
- }
15
-
16
- //#endregion
17
- export { createTableNameMapper };
18
- //# sourceMappingURL=kysely-shared.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"kysely-shared.js","names":[],"sources":["../../../src/adapters/kysely/kysely-shared.ts"],"sourcesContent":["/**\n * Maps logical table names (used by fragment authors) to physical table names (with namespace suffix)\n */\nexport interface TableNameMapper {\n toPhysical(logicalName: string): string;\n toLogical(physicalName: string): string;\n}\n\n/**\n * Creates a table name mapper for a given namespace.\n * Physical names have format: {logicalName}_{namespace}\n */\nexport function createTableNameMapper(namespace: string): TableNameMapper {\n return {\n toPhysical: (logicalName: string) => `${logicalName}_${namespace}`,\n toLogical: (physicalName: string) => {\n if (physicalName.endsWith(`_${namespace}`)) {\n return physicalName.slice(0, -(namespace.length + 1));\n }\n return physicalName;\n },\n };\n}\n"],"mappings":";;;;;AAYA,SAAgB,sBAAsB,WAAoC;AACxE,QAAO;EACL,aAAa,gBAAwB,GAAG,YAAY,GAAG;EACvD,YAAY,iBAAyB;AACnC,OAAI,aAAa,SAAS,IAAI,YAAY,CACxC,QAAO,aAAa,MAAM,GAAG,EAAE,UAAU,SAAS,GAAG;AAEvD,UAAO;;EAEV"}
@@ -1,170 +0,0 @@
1
- import { decodeCursor, serializeCursorValues } from "../../query/cursor.js";
2
- import { buildCondition } from "../../query/condition-builder.js";
3
- import { createKyselyQueryBuilder } from "./kysely-query-builder.js";
4
- import { createKyselyQueryCompiler } from "./kysely-query-compiler.js";
5
- import { createTableNameMapper } from "./kysely-shared.js";
6
-
7
- //#region src/adapters/kysely/kysely-uow-compiler.ts
8
- /**
9
- * Create a Kysely-specific Unit of Work compiler
10
- *
11
- * This compiler translates UOW operations into Kysely CompiledQuery objects
12
- * that can be executed as a batch/transaction.
13
- *
14
- * @param pool - Connection pool for acquiring database connections
15
- * @param provider - SQL provider (postgresql, mysql, sqlite, etc.)
16
- * @param mapper - Optional table name mapper for namespace prefixing (fallback for operations without explicit namespace)
17
- * @returns A UOWCompiler instance for Kysely
18
- */
19
- function createKyselyUOWCompiler(pool, provider, mapper) {
20
- const kysely = pool.getDatabaseSync();
21
- /**
22
- * Get the mapper for a specific operation
23
- * Uses operation's namespace if provided, otherwise falls back to the default mapper
24
- */
25
- function getMapperForOperation(namespace) {
26
- if (namespace) return createTableNameMapper(namespace);
27
- return mapper;
28
- }
29
- const compilerCache = /* @__PURE__ */ new Map();
30
- const builderCache = /* @__PURE__ */ new Map();
31
- function getQueryCompiler(schema, namespace) {
32
- const cacheKey = namespace;
33
- let compiler = compilerCache.get(cacheKey);
34
- if (!compiler) {
35
- compiler = createKyselyQueryCompiler(schema, pool, provider, getMapperForOperation(namespace));
36
- compilerCache.set(cacheKey, compiler);
37
- }
38
- return compiler;
39
- }
40
- function getQueryBuilder(namespace) {
41
- const cacheKey = namespace;
42
- let builder = builderCache.get(cacheKey);
43
- if (!builder) {
44
- builder = createKyselyQueryBuilder(kysely, provider, getMapperForOperation(namespace));
45
- builderCache.set(cacheKey, builder);
46
- }
47
- return builder;
48
- }
49
- function toTable(schema, name) {
50
- const table = schema.tables[name];
51
- if (!table) throw new Error(`Invalid table name ${name}.`);
52
- return table;
53
- }
54
- return {
55
- compileRetrievalOperation(op) {
56
- const queryCompiler = getQueryCompiler(op.schema, op.namespace);
57
- switch (op.type) {
58
- case "count": return queryCompiler.count(op.table.name, { where: op.options.where });
59
- case "find": {
60
- const { useIndex: _useIndex, orderByIndex, joins: join, after, before, pageSize,...findManyOptions } = op.options;
61
- let indexColumns = [];
62
- let orderDirection = "asc";
63
- if (orderByIndex) {
64
- const index = op.table.indexes[orderByIndex.indexName];
65
- orderDirection = orderByIndex.direction;
66
- if (!index) if (orderByIndex.indexName === "_primary") indexColumns = [op.table.getIdColumn()];
67
- else throw new Error(`Index "${orderByIndex.indexName}" not found on table "${op.table.name}"`);
68
- else indexColumns = index.columns;
69
- }
70
- let orderBy;
71
- if (indexColumns.length > 0) orderBy = indexColumns.map((col) => [col, orderDirection]);
72
- let cursorCondition;
73
- if ((after || before) && indexColumns.length > 0) {
74
- const cursor = after || before;
75
- const serializedValues = serializeCursorValues(typeof cursor === "string" ? decodeCursor(cursor) : cursor, indexColumns, provider);
76
- const isAfter = !!after;
77
- const useGreaterThan = isAfter && orderDirection === "asc" || !isAfter && orderDirection === "desc";
78
- if (indexColumns.length === 1) {
79
- const col = indexColumns[0];
80
- const val = serializedValues[col.ormName];
81
- cursorCondition = {
82
- type: "compare",
83
- a: col,
84
- operator: useGreaterThan ? ">" : "<",
85
- b: val
86
- };
87
- } else throw new Error("Multi-column cursor pagination is not yet supported in Kysely Unit of Work implementation");
88
- }
89
- let combinedWhere;
90
- if (findManyOptions.where) {
91
- const whereResult = buildCondition(op.table.columns, findManyOptions.where);
92
- if (whereResult === true) combinedWhere = void 0;
93
- else if (whereResult === false) return null;
94
- else combinedWhere = whereResult;
95
- }
96
- if (cursorCondition) if (combinedWhere) combinedWhere = {
97
- type: "and",
98
- items: [combinedWhere, cursorCondition]
99
- };
100
- else combinedWhere = cursorCondition;
101
- if (join && join.length > 0) return getQueryBuilder(op.namespace).findMany(op.table, {
102
- select: findManyOptions.select ?? true,
103
- where: combinedWhere,
104
- orderBy,
105
- limit: pageSize,
106
- join
107
- });
108
- return queryCompiler.findMany(op.table.name, {
109
- ...findManyOptions,
110
- where: combinedWhere ? () => combinedWhere : void 0,
111
- orderBy: orderBy?.map(([col, dir]) => [col.ormName, dir]),
112
- limit: pageSize
113
- });
114
- }
115
- }
116
- },
117
- compileMutationOperation(op) {
118
- const queryCompiler = getQueryCompiler(op.schema, op.namespace);
119
- switch (op.type) {
120
- case "create": return {
121
- query: queryCompiler.create(op.table, op.values),
122
- expectedAffectedRows: null
123
- };
124
- case "update": {
125
- const table = toTable(op.schema, op.table);
126
- const idColumn = table.getIdColumn();
127
- const versionColumn = table.getVersionColumn();
128
- const externalId = typeof op.id === "string" ? op.id : op.id.externalId;
129
- const versionToCheck = getVersionToCheck(op.id, op.checkVersion);
130
- 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));
131
- const query = queryCompiler.updateMany(op.table, {
132
- where: whereClause,
133
- set: op.set
134
- });
135
- return query ? {
136
- query,
137
- expectedAffectedRows: op.checkVersion ? 1 : null
138
- } : null;
139
- }
140
- case "delete": {
141
- const table = toTable(op.schema, op.table);
142
- const idColumn = table.getIdColumn();
143
- const versionColumn = table.getVersionColumn();
144
- const externalId = typeof op.id === "string" ? op.id : op.id.externalId;
145
- const versionToCheck = getVersionToCheck(op.id, op.checkVersion);
146
- 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));
147
- const query = queryCompiler.deleteMany(op.table, { where: whereClause });
148
- return query ? {
149
- query,
150
- expectedAffectedRows: op.checkVersion ? 1 : null
151
- } : null;
152
- }
153
- }
154
- }
155
- };
156
- }
157
- /**
158
- * Get the version to check for a given ID and checkVersion flag.
159
- * @returns The version to check or undefined if no check is required.
160
- * @throws Error if the ID is a string and checkVersion is true.
161
- */
162
- function getVersionToCheck(id, checkVersion) {
163
- if (!checkVersion) return;
164
- if (typeof id === "string") throw new Error(`Cannot use checkVersion with a string ID. Version checking requires a FragnoId with version information.`);
165
- return id.version;
166
- }
167
-
168
- //#endregion
169
- export { createKyselyUOWCompiler };
170
- //# sourceMappingURL=kysely-uow-compiler.js.map