@fragno-dev/db 0.2.2 → 0.4.1

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 (587) hide show
  1. package/.turbo/turbo-build.log +404 -175
  2. package/CHANGELOG.md +109 -0
  3. package/README.md +54 -9
  4. package/dist/adapters/adapters.d.ts +23 -21
  5. package/dist/adapters/adapters.d.ts.map +1 -1
  6. package/dist/adapters/adapters.js.map +1 -1
  7. package/dist/adapters/generic-sql/driver-config.d.ts +16 -1
  8. package/dist/adapters/generic-sql/driver-config.d.ts.map +1 -1
  9. package/dist/adapters/generic-sql/driver-config.js +23 -1
  10. package/dist/adapters/generic-sql/driver-config.js.map +1 -1
  11. package/dist/adapters/generic-sql/generic-sql-adapter.d.ts +24 -9
  12. package/dist/adapters/generic-sql/generic-sql-adapter.d.ts.map +1 -1
  13. package/dist/adapters/generic-sql/generic-sql-adapter.js +60 -22
  14. package/dist/adapters/generic-sql/generic-sql-adapter.js.map +1 -1
  15. package/dist/adapters/generic-sql/generic-sql-uow-executor.js +169 -3
  16. package/dist/adapters/generic-sql/generic-sql-uow-executor.js.map +1 -1
  17. package/dist/adapters/generic-sql/migration/cold-kysely.js.map +1 -1
  18. package/dist/adapters/generic-sql/migration/dialect/mysql.js +25 -6
  19. package/dist/adapters/generic-sql/migration/dialect/mysql.js.map +1 -1
  20. package/dist/adapters/generic-sql/migration/dialect/postgres.js +7 -6
  21. package/dist/adapters/generic-sql/migration/dialect/postgres.js.map +1 -1
  22. package/dist/adapters/generic-sql/migration/dialect/sqlite.js +193 -16
  23. package/dist/adapters/generic-sql/migration/dialect/sqlite.js.map +1 -1
  24. package/dist/adapters/generic-sql/migration/executor.d.ts.map +1 -1
  25. package/dist/adapters/generic-sql/migration/executor.js +30 -3
  26. package/dist/adapters/generic-sql/migration/executor.js.map +1 -1
  27. package/dist/adapters/generic-sql/migration/prepared-migrations.d.ts.map +1 -1
  28. package/dist/adapters/generic-sql/migration/prepared-migrations.js +9 -9
  29. package/dist/adapters/generic-sql/migration/prepared-migrations.js.map +1 -1
  30. package/dist/adapters/generic-sql/migration/sql-generator.js +75 -52
  31. package/dist/adapters/generic-sql/migration/sql-generator.js.map +1 -1
  32. package/dist/adapters/generic-sql/query/create-sql-query-compiler.js +7 -6
  33. package/dist/adapters/generic-sql/query/create-sql-query-compiler.js.map +1 -1
  34. package/dist/adapters/generic-sql/query/cursor-utils.js +42 -4
  35. package/dist/adapters/generic-sql/query/cursor-utils.js.map +1 -1
  36. package/dist/adapters/generic-sql/query/db-now-sql.js +27 -0
  37. package/dist/adapters/generic-sql/query/db-now-sql.js.map +1 -0
  38. package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js +32 -21
  39. package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js.map +1 -1
  40. package/dist/adapters/generic-sql/query/select-builder.js +5 -3
  41. package/dist/adapters/generic-sql/query/select-builder.js.map +1 -1
  42. package/dist/adapters/generic-sql/query/sql-query-compiler.js +49 -18
  43. package/dist/adapters/generic-sql/query/sql-query-compiler.js.map +1 -1
  44. package/dist/adapters/generic-sql/query/where-builder.js +43 -29
  45. package/dist/adapters/generic-sql/query/where-builder.js.map +1 -1
  46. package/dist/adapters/generic-sql/sqlite-storage.d.ts +13 -0
  47. package/dist/adapters/generic-sql/sqlite-storage.d.ts.map +1 -0
  48. package/dist/adapters/generic-sql/sqlite-storage.js +15 -0
  49. package/dist/adapters/generic-sql/sqlite-storage.js.map +1 -0
  50. package/dist/adapters/generic-sql/uow-decoder.js +6 -2
  51. package/dist/adapters/generic-sql/uow-decoder.js.map +1 -1
  52. package/dist/adapters/generic-sql/uow-encoder.js +27 -8
  53. package/dist/adapters/generic-sql/uow-encoder.js.map +1 -1
  54. package/dist/adapters/in-memory/condition-evaluator.js +135 -0
  55. package/dist/adapters/in-memory/condition-evaluator.js.map +1 -0
  56. package/dist/adapters/in-memory/errors.d.ts +13 -0
  57. package/dist/adapters/in-memory/errors.d.ts.map +1 -0
  58. package/dist/adapters/in-memory/errors.js +23 -0
  59. package/dist/adapters/in-memory/errors.js.map +1 -0
  60. package/dist/adapters/in-memory/in-memory-adapter.d.ts +27 -0
  61. package/dist/adapters/in-memory/in-memory-adapter.d.ts.map +1 -0
  62. package/dist/adapters/in-memory/in-memory-adapter.js +196 -0
  63. package/dist/adapters/in-memory/in-memory-adapter.js.map +1 -0
  64. package/dist/adapters/in-memory/in-memory-uow.js +871 -0
  65. package/dist/adapters/in-memory/in-memory-uow.js.map +1 -0
  66. package/dist/adapters/in-memory/index.d.ts +4 -0
  67. package/dist/adapters/in-memory/index.js +4 -0
  68. package/dist/adapters/in-memory/options.d.ts +30 -0
  69. package/dist/adapters/in-memory/options.d.ts.map +1 -0
  70. package/dist/adapters/in-memory/options.js +62 -0
  71. package/dist/adapters/in-memory/options.js.map +1 -0
  72. package/dist/adapters/in-memory/reference-resolution.js +26 -0
  73. package/dist/adapters/in-memory/reference-resolution.js.map +1 -0
  74. package/dist/adapters/in-memory/sorted-array-index.js +129 -0
  75. package/dist/adapters/in-memory/sorted-array-index.js.map +1 -0
  76. package/dist/adapters/in-memory/store.js +71 -0
  77. package/dist/adapters/in-memory/store.js.map +1 -0
  78. package/dist/adapters/in-memory/value-comparison.js +28 -0
  79. package/dist/adapters/in-memory/value-comparison.js.map +1 -0
  80. package/dist/adapters/shared/from-unit-of-work-compiler.js +51 -24
  81. package/dist/adapters/shared/from-unit-of-work-compiler.js.map +1 -1
  82. package/dist/adapters/shared/uow-operation-compiler.js +11 -11
  83. package/dist/adapters/shared/uow-operation-compiler.js.map +1 -1
  84. package/dist/adapters/sql/index.d.ts +5 -0
  85. package/dist/adapters/sql/index.js +4 -0
  86. package/dist/browser/adapters/adapters.d.ts +61 -0
  87. package/dist/browser/adapters/adapters.d.ts.map +1 -0
  88. package/dist/browser/adapters/generic-sql/migration/executor.d.ts +15 -0
  89. package/dist/browser/adapters/generic-sql/migration/executor.d.ts.map +1 -0
  90. package/dist/browser/adapters/generic-sql/migration/prepared-migrations.d.ts +66 -0
  91. package/dist/browser/adapters/generic-sql/migration/prepared-migrations.d.ts.map +1 -0
  92. package/dist/browser/adapters/generic-sql/sqlite-storage.d.ts +11 -0
  93. package/dist/browser/adapters/generic-sql/sqlite-storage.d.ts.map +1 -0
  94. package/dist/browser/adapters/in-memory/in-memory-adapter.d.ts +5 -0
  95. package/dist/browser/adapters/in-memory/index.d.ts +2 -0
  96. package/dist/browser/adapters/in-memory/options.d.ts +1 -0
  97. package/dist/browser/db-fragment-definition-builder.d.ts +237 -0
  98. package/dist/browser/db-fragment-definition-builder.d.ts.map +1 -0
  99. package/dist/browser/durable-hooks.d.ts +3 -0
  100. package/dist/browser/fragments/internal-fragment.d.ts +317 -0
  101. package/dist/browser/fragments/internal-fragment.d.ts.map +1 -0
  102. package/dist/browser/fragments/internal-fragment.schema.d.ts +1 -0
  103. package/dist/browser/hooks/durable-hooks-logger.d.ts +10 -0
  104. package/dist/browser/hooks/durable-hooks-logger.d.ts.map +1 -0
  105. package/dist/browser/hooks/hooks.d.ts +146 -0
  106. package/dist/browser/hooks/hooks.d.ts.map +1 -0
  107. package/dist/browser/id.js +1 -0
  108. package/dist/browser/internal/adapter-registry.d.ts +4 -0
  109. package/dist/browser/internal/outbox-state.d.ts +2 -0
  110. package/dist/browser/mod.d.ts +15 -0
  111. package/dist/browser/mod.d.ts.map +1 -0
  112. package/dist/browser/mod.js +17 -0
  113. package/dist/browser/mod.js.map +1 -0
  114. package/dist/browser/mod2.d.ts +48 -0
  115. package/dist/browser/mod2.d.ts.map +1 -0
  116. package/dist/browser/naming/sql-naming.d.ts +19 -0
  117. package/dist/browser/naming/sql-naming.d.ts.map +1 -0
  118. package/dist/browser/outbox/outbox.d.ts +21 -0
  119. package/dist/browser/outbox/outbox.d.ts.map +1 -0
  120. package/dist/browser/query/column-defaults.js +1 -0
  121. package/dist/browser/query/condition-builder.d.ts +44 -0
  122. package/dist/browser/query/condition-builder.d.ts.map +1 -0
  123. package/dist/browser/query/condition-builder.js +97 -0
  124. package/dist/browser/query/condition-builder.js.map +1 -0
  125. package/dist/browser/query/cursor.d.ts +105 -0
  126. package/dist/browser/query/cursor.d.ts.map +1 -0
  127. package/dist/browser/query/cursor.js +150 -0
  128. package/dist/browser/query/cursor.js.map +1 -0
  129. package/dist/browser/query/db-now.d.ts +22 -0
  130. package/dist/browser/query/db-now.d.ts.map +1 -0
  131. package/dist/browser/query/db-now.js +33 -0
  132. package/dist/browser/query/db-now.js.map +1 -0
  133. package/dist/browser/query/orm/orm.d.ts +18 -0
  134. package/dist/browser/query/orm/orm.d.ts.map +1 -0
  135. package/dist/browser/query/simple-query-interface.d.ts +108 -0
  136. package/dist/browser/query/simple-query-interface.d.ts.map +1 -0
  137. package/dist/browser/query/unit-of-work/execute-unit-of-work.d.ts +423 -0
  138. package/dist/browser/query/unit-of-work/execute-unit-of-work.d.ts.map +1 -0
  139. package/dist/browser/query/unit-of-work/execute-unit-of-work.js +507 -0
  140. package/dist/browser/query/unit-of-work/execute-unit-of-work.js.map +1 -0
  141. package/dist/browser/query/unit-of-work/retry-policy.d.ts +23 -0
  142. package/dist/browser/query/unit-of-work/retry-policy.d.ts.map +1 -0
  143. package/dist/browser/query/unit-of-work/retry-policy.js +40 -0
  144. package/dist/browser/query/unit-of-work/retry-policy.js.map +1 -0
  145. package/dist/browser/query/unit-of-work/unit-of-work.d.ts +703 -0
  146. package/dist/browser/query/unit-of-work/unit-of-work.d.ts.map +1 -0
  147. package/dist/browser/query/unit-of-work/unit-of-work.js +1206 -0
  148. package/dist/browser/query/unit-of-work/unit-of-work.js.map +1 -0
  149. package/dist/browser/query/value-encoding.js +38 -0
  150. package/dist/browser/query/value-encoding.js.map +1 -0
  151. package/dist/browser/schema/create.d.ts +326 -0
  152. package/dist/browser/schema/create.d.ts.map +1 -0
  153. package/dist/browser/schema/create.js +89 -0
  154. package/dist/browser/schema/create.js.map +1 -0
  155. package/dist/browser/schema/generate-id.js +28 -0
  156. package/dist/browser/schema/generate-id.js.map +1 -0
  157. package/dist/browser/shared/providers.d.ts +6 -0
  158. package/dist/browser/shared/providers.d.ts.map +1 -0
  159. package/dist/browser/sql-driver/connection/connection-provider.d.ts +13 -0
  160. package/dist/browser/sql-driver/connection/connection-provider.d.ts.map +1 -0
  161. package/dist/browser/sql-driver/dialect-adapter/dialect-adapter.d.ts +7 -0
  162. package/dist/browser/sql-driver/dialect-adapter/dialect-adapter.d.ts.map +1 -0
  163. package/dist/browser/sql-driver/driver/runtime-driver.d.ts +23 -0
  164. package/dist/browser/sql-driver/driver/runtime-driver.d.ts.map +1 -0
  165. package/dist/browser/sql-driver/query-executor/plugin.d.ts +17 -0
  166. package/dist/browser/sql-driver/query-executor/plugin.d.ts.map +1 -0
  167. package/dist/browser/sql-driver/query-executor/query-executor.d.ts +36 -0
  168. package/dist/browser/sql-driver/query-executor/query-executor.d.ts.map +1 -0
  169. package/dist/browser/sql-driver/sql-driver-adapter.d.ts +29 -0
  170. package/dist/browser/sql-driver/sql-driver-adapter.d.ts.map +1 -0
  171. package/dist/browser/sql-driver/sql-driver.d.ts +38 -0
  172. package/dist/browser/sql-driver/sql-driver.d.ts.map +1 -0
  173. package/dist/browser/sync/commands.d.ts +15 -0
  174. package/dist/browser/sync/commands.d.ts.map +1 -0
  175. package/dist/browser/sync/commands.js +27 -0
  176. package/dist/browser/sync/commands.js.map +1 -0
  177. package/dist/browser/sync/types.d.ts +63 -0
  178. package/dist/browser/sync/types.d.ts.map +1 -0
  179. package/dist/browser/util/types.d.ts +8 -0
  180. package/dist/browser/util/types.d.ts.map +1 -0
  181. package/dist/browser/with-database.d.ts +29 -0
  182. package/dist/browser/with-database.d.ts.map +1 -0
  183. package/dist/client.d.ts +4 -0
  184. package/dist/client.js +5 -0
  185. package/dist/db-fragment-definition-builder.d.ts +101 -33
  186. package/dist/db-fragment-definition-builder.d.ts.map +1 -1
  187. package/dist/db-fragment-definition-builder.js +450 -60
  188. package/dist/db-fragment-definition-builder.js.map +1 -1
  189. package/dist/dispatchers/cloudflare-do/dispatcher.d.ts +20 -0
  190. package/dist/dispatchers/cloudflare-do/dispatcher.d.ts.map +1 -0
  191. package/dist/dispatchers/cloudflare-do/dispatcher.js +147 -0
  192. package/dist/dispatchers/cloudflare-do/dispatcher.js.map +1 -0
  193. package/dist/dispatchers/cloudflare-do/index.d.ts +11 -0
  194. package/dist/dispatchers/cloudflare-do/index.d.ts.map +1 -0
  195. package/dist/dispatchers/cloudflare-do/index.js +31 -0
  196. package/dist/dispatchers/cloudflare-do/index.js.map +1 -0
  197. package/dist/dispatchers/node/dispatcher.d.ts +14 -0
  198. package/dist/dispatchers/node/dispatcher.d.ts.map +1 -0
  199. package/dist/dispatchers/node/dispatcher.js +80 -0
  200. package/dist/dispatchers/node/dispatcher.js.map +1 -0
  201. package/dist/dispatchers/node/index.d.ts +12 -0
  202. package/dist/dispatchers/node/index.d.ts.map +1 -0
  203. package/dist/dispatchers/node/index.js +27 -0
  204. package/dist/dispatchers/node/index.js.map +1 -0
  205. package/dist/durable-hooks.d.ts +31 -0
  206. package/dist/durable-hooks.d.ts.map +1 -0
  207. package/dist/durable-hooks.js +23 -0
  208. package/dist/durable-hooks.js.map +1 -0
  209. package/dist/fragments/internal-fragment.d.ts +186 -8
  210. package/dist/fragments/internal-fragment.d.ts.map +1 -1
  211. package/dist/fragments/internal-fragment.js +203 -38
  212. package/dist/fragments/internal-fragment.js.map +1 -1
  213. package/dist/fragments/internal-fragment.routes.js +164 -0
  214. package/dist/fragments/internal-fragment.routes.js.map +1 -0
  215. package/dist/fragments/internal-fragment.schema.d.ts +15 -0
  216. package/dist/fragments/internal-fragment.schema.d.ts.map +1 -0
  217. package/dist/fragments/internal-fragment.schema.js +39 -0
  218. package/dist/fragments/internal-fragment.schema.js.map +1 -0
  219. package/dist/hooks/durable-hooks-logger.d.ts +10 -0
  220. package/dist/hooks/durable-hooks-logger.d.ts.map +1 -0
  221. package/dist/hooks/durable-hooks-logger.js +75 -0
  222. package/dist/hooks/durable-hooks-logger.js.map +1 -0
  223. package/dist/hooks/durable-hooks-processor.d.ts +1 -0
  224. package/dist/hooks/durable-hooks-processor.js +80 -0
  225. package/dist/hooks/durable-hooks-processor.js.map +1 -0
  226. package/dist/hooks/durable-hooks-runtime.js +44 -0
  227. package/dist/hooks/durable-hooks-runtime.js.map +1 -0
  228. package/dist/hooks/hooks.d.ts +100 -1
  229. package/dist/hooks/hooks.d.ts.map +1 -1
  230. package/dist/hooks/hooks.js +254 -27
  231. package/dist/hooks/hooks.js.map +1 -1
  232. package/dist/id.d.ts +2 -2
  233. package/dist/id.js +2 -2
  234. package/dist/internal/adapter-registry.d.ts +11 -0
  235. package/dist/internal/adapter-registry.d.ts.map +1 -0
  236. package/dist/internal/adapter-registry.js +135 -0
  237. package/dist/internal/adapter-registry.js.map +1 -0
  238. package/dist/internal/outbox-state.d.ts +2 -0
  239. package/dist/internal/outbox-state.js +26 -0
  240. package/dist/internal/outbox-state.js.map +1 -0
  241. package/dist/migration-engine/auto-from-schema.d.ts +33 -0
  242. package/dist/migration-engine/auto-from-schema.d.ts.map +1 -0
  243. package/dist/migration-engine/auto-from-schema.js +223 -37
  244. package/dist/migration-engine/auto-from-schema.js.map +1 -1
  245. package/dist/migration-engine/generation-engine.d.ts +16 -10
  246. package/dist/migration-engine/generation-engine.d.ts.map +1 -1
  247. package/dist/migration-engine/generation-engine.js +86 -35
  248. package/dist/migration-engine/generation-engine.js.map +1 -1
  249. package/dist/migration-engine/shared.d.ts +113 -0
  250. package/dist/migration-engine/shared.d.ts.map +1 -0
  251. package/dist/migration-engine/shared.js.map +1 -1
  252. package/dist/mod.d.ts +20 -12
  253. package/dist/mod.d.ts.map +1 -1
  254. package/dist/mod.js +18 -12
  255. package/dist/mod.js.map +1 -1
  256. package/dist/naming/sql-naming.d.ts +19 -0
  257. package/dist/naming/sql-naming.d.ts.map +1 -0
  258. package/dist/naming/sql-naming.js +116 -0
  259. package/dist/naming/sql-naming.js.map +1 -0
  260. package/dist/outbox/outbox-builder.js +156 -0
  261. package/dist/outbox/outbox-builder.js.map +1 -0
  262. package/dist/outbox/outbox.d.ts +54 -0
  263. package/dist/outbox/outbox.d.ts.map +1 -0
  264. package/dist/outbox/outbox.js +37 -0
  265. package/dist/outbox/outbox.js.map +1 -0
  266. package/dist/query/column-defaults.js +20 -4
  267. package/dist/query/column-defaults.js.map +1 -1
  268. package/dist/query/condition-builder.d.ts +7 -1
  269. package/dist/query/condition-builder.d.ts.map +1 -1
  270. package/dist/query/condition-builder.js +5 -1
  271. package/dist/query/condition-builder.js.map +1 -1
  272. package/dist/query/cursor-client.d.ts +105 -0
  273. package/dist/query/cursor-client.d.ts.map +1 -0
  274. package/dist/query/cursor-client.js +165 -0
  275. package/dist/query/cursor-client.js.map +1 -0
  276. package/dist/query/cursor.d.ts +3 -1
  277. package/dist/query/cursor.d.ts.map +1 -1
  278. package/dist/query/cursor.js +51 -14
  279. package/dist/query/cursor.js.map +1 -1
  280. package/dist/query/db-now.d.ts +22 -0
  281. package/dist/query/db-now.d.ts.map +1 -0
  282. package/dist/query/db-now.js +35 -0
  283. package/dist/query/db-now.js.map +1 -0
  284. package/dist/query/orm/orm.js.map +1 -1
  285. package/dist/query/serialize/create-sql-serializer.js +5 -4
  286. package/dist/query/serialize/create-sql-serializer.js.map +1 -1
  287. package/dist/query/serialize/dialect/mysql-serializer.js +12 -6
  288. package/dist/query/serialize/dialect/mysql-serializer.js.map +1 -1
  289. package/dist/query/serialize/dialect/postgres-serializer.js +25 -7
  290. package/dist/query/serialize/dialect/postgres-serializer.js.map +1 -1
  291. package/dist/query/serialize/dialect/sqlite-serializer.js +60 -12
  292. package/dist/query/serialize/dialect/sqlite-serializer.js.map +1 -1
  293. package/dist/query/serialize/sql-serializer.js +2 -2
  294. package/dist/query/serialize/sql-serializer.js.map +1 -1
  295. package/dist/query/simple-query-interface.d.ts +13 -4
  296. package/dist/query/simple-query-interface.d.ts.map +1 -1
  297. package/dist/query/unit-of-work/execute-unit-of-work.d.ts +37 -2
  298. package/dist/query/unit-of-work/execute-unit-of-work.d.ts.map +1 -1
  299. package/dist/query/unit-of-work/execute-unit-of-work.js +50 -24
  300. package/dist/query/unit-of-work/execute-unit-of-work.js.map +1 -1
  301. package/dist/query/unit-of-work/unit-of-work.d.ts +92 -30
  302. package/dist/query/unit-of-work/unit-of-work.d.ts.map +1 -1
  303. package/dist/query/unit-of-work/unit-of-work.js +136 -11
  304. package/dist/query/unit-of-work/unit-of-work.js.map +1 -1
  305. package/dist/query/value-decoding.js +16 -6
  306. package/dist/query/value-decoding.js.map +1 -1
  307. package/dist/query/value-encoding.js +29 -9
  308. package/dist/query/value-encoding.js.map +1 -1
  309. package/dist/schema/create.d.ts +103 -35
  310. package/dist/schema/create.d.ts.map +1 -1
  311. package/dist/schema/create.js +172 -58
  312. package/dist/schema/create.js.map +1 -1
  313. package/dist/schema/generate-id.js +2 -2
  314. package/dist/schema/generate-id.js.map +1 -1
  315. package/dist/schema/type-conversion/create-sql-type-mapper.js +4 -3
  316. package/dist/schema/type-conversion/create-sql-type-mapper.js.map +1 -1
  317. package/dist/schema/type-conversion/dialect/sqlite.js +9 -0
  318. package/dist/schema/type-conversion/dialect/sqlite.js.map +1 -1
  319. package/dist/schema/validator.d.ts +10 -0
  320. package/dist/schema/validator.d.ts.map +1 -0
  321. package/dist/schema/validator.js +123 -0
  322. package/dist/schema/validator.js.map +1 -0
  323. package/dist/schema-output/drizzle.d.ts +30 -0
  324. package/dist/schema-output/drizzle.d.ts.map +1 -0
  325. package/dist/{adapters/drizzle/generate.js → schema-output/drizzle.js} +88 -60
  326. package/dist/schema-output/drizzle.js.map +1 -0
  327. package/dist/schema-output/prisma.d.ts +17 -0
  328. package/dist/schema-output/prisma.d.ts.map +1 -0
  329. package/dist/schema-output/prisma.js +307 -0
  330. package/dist/schema-output/prisma.js.map +1 -0
  331. package/dist/sql-driver/dialects/durable-object-dialect.js +3 -9
  332. package/dist/sql-driver/dialects/durable-object-dialect.js.map +1 -1
  333. package/dist/sql-driver/query-executor/default-query-executor.js.map +1 -1
  334. package/dist/sql-driver/query-executor/query-executor-base.js.map +1 -1
  335. package/dist/sql-driver/sql-driver-adapter.js.map +1 -1
  336. package/dist/sql-driver/sql.js.map +1 -1
  337. package/dist/sync/commands.d.ts +15 -0
  338. package/dist/sync/commands.d.ts.map +1 -0
  339. package/dist/sync/commands.js +27 -0
  340. package/dist/sync/commands.js.map +1 -0
  341. package/dist/sync/index.d.ts +4 -0
  342. package/dist/sync/index.js +4 -0
  343. package/dist/sync/read-tracking.d.ts +25 -0
  344. package/dist/sync/read-tracking.d.ts.map +1 -0
  345. package/dist/sync/read-tracking.js +148 -0
  346. package/dist/sync/read-tracking.js.map +1 -0
  347. package/dist/sync/submit.js +213 -0
  348. package/dist/sync/submit.js.map +1 -0
  349. package/dist/sync/types.d.ts +63 -0
  350. package/dist/sync/types.d.ts.map +1 -0
  351. package/dist/util/default-database-adapter.js +66 -0
  352. package/dist/util/default-database-adapter.js.map +1 -0
  353. package/dist/with-database.d.ts +3 -6
  354. package/dist/with-database.d.ts.map +1 -1
  355. package/dist/with-database.js +8 -7
  356. package/dist/with-database.js.map +1 -1
  357. package/package.json +62 -55
  358. package/src/adapters/adapters.ts +33 -26
  359. package/src/adapters/drizzle/migrate-drizzle.test.ts +99 -41
  360. package/src/adapters/drizzle/migration-parity-drizzle-kit.test.ts +601 -0
  361. package/src/adapters/drizzle/test-utils.ts +13 -8
  362. package/src/adapters/generic-sql/driver-config.ts +38 -0
  363. package/src/adapters/generic-sql/generic-sql-adapter.test.ts +10 -8
  364. package/src/adapters/generic-sql/generic-sql-adapter.ts +117 -34
  365. package/src/adapters/generic-sql/generic-sql-uow-executor.test.ts +55 -0
  366. package/src/adapters/generic-sql/generic-sql-uow-executor.ts +297 -3
  367. package/src/adapters/generic-sql/migration/adapter-migration-parity.test.ts +120 -0
  368. package/src/adapters/generic-sql/migration/cold-kysely.ts +1 -0
  369. package/src/adapters/generic-sql/migration/dialect/mysql.test.ts +27 -8
  370. package/src/adapters/generic-sql/migration/dialect/mysql.ts +47 -8
  371. package/src/adapters/generic-sql/migration/dialect/postgres.test.ts +28 -9
  372. package/src/adapters/generic-sql/migration/dialect/postgres.ts +9 -4
  373. package/src/adapters/generic-sql/migration/dialect/sqlite.test.ts +839 -8
  374. package/src/adapters/generic-sql/migration/dialect/sqlite.ts +396 -53
  375. package/src/adapters/generic-sql/migration/executor.test.ts +52 -0
  376. package/src/adapters/generic-sql/migration/executor.ts +47 -4
  377. package/src/adapters/generic-sql/migration/prepared-migrations.test.ts +238 -46
  378. package/src/adapters/generic-sql/migration/prepared-migrations.ts +21 -13
  379. package/src/adapters/generic-sql/migration/sql-generator.ts +145 -66
  380. package/src/adapters/generic-sql/query/create-sql-query-compiler.ts +11 -8
  381. package/src/adapters/generic-sql/query/cursor-utils.test.ts +272 -0
  382. package/src/adapters/generic-sql/query/cursor-utils.ts +42 -7
  383. package/src/adapters/generic-sql/query/db-now-sql.ts +49 -0
  384. package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.test.ts +171 -35
  385. package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.ts +53 -40
  386. package/src/adapters/generic-sql/query/select-builder.test.ts +16 -11
  387. package/src/adapters/generic-sql/query/select-builder.ts +7 -3
  388. package/src/adapters/generic-sql/query/sql-query-compiler.test.ts +75 -6
  389. package/src/adapters/generic-sql/query/sql-query-compiler.ts +129 -24
  390. package/src/adapters/generic-sql/query/where-builder.test.ts +96 -20
  391. package/src/adapters/generic-sql/query/where-builder.ts +112 -41
  392. package/src/adapters/{kysely/kysely-adapter-pglite.test.ts → generic-sql/sql-adapter-pglite-migrations.test.ts} +11 -20
  393. package/src/adapters/generic-sql/sql-adapter-pglite-pagination.test.ts +851 -0
  394. package/src/adapters/{drizzle/drizzle-adapter-pglite.test.ts → generic-sql/sql-adapter-pglite-queries.test.ts} +18 -15
  395. package/src/adapters/generic-sql/{test/generic-drizzle-adapter-sqlite3.test.ts → sql-adapter-sqlite3-driver.test.ts} +282 -14
  396. package/src/adapters/{drizzle/drizzle-adapter-sqlite3.test.ts → generic-sql/sql-adapter-sqlite3-uow.test.ts} +129 -12
  397. package/src/adapters/{kysely/kysely-adapter-sqlocal.test.ts → generic-sql/sql-adapter-sqlocal.test.ts} +9 -7
  398. package/src/adapters/generic-sql/sqlite-storage.ts +20 -0
  399. package/src/adapters/generic-sql/uow-decoder.test.ts +5 -4
  400. package/src/adapters/generic-sql/uow-decoder.ts +23 -5
  401. package/src/adapters/generic-sql/uow-encoder.test.ts +36 -3
  402. package/src/adapters/generic-sql/uow-encoder.ts +48 -13
  403. package/src/adapters/in-memory/condition-evaluator.test.ts +194 -0
  404. package/src/adapters/in-memory/condition-evaluator.ts +280 -0
  405. package/src/adapters/in-memory/errors.ts +20 -0
  406. package/src/adapters/in-memory/in-memory-adapter.ts +388 -0
  407. package/src/adapters/in-memory/in-memory-uow.mutations.test.ts +344 -0
  408. package/src/adapters/in-memory/in-memory-uow.retrieval.test.ts +255 -0
  409. package/src/adapters/in-memory/in-memory-uow.ts +1724 -0
  410. package/src/adapters/in-memory/index.ts +3 -0
  411. package/src/adapters/in-memory/options.test.ts +42 -0
  412. package/src/adapters/in-memory/options.ts +91 -0
  413. package/src/adapters/in-memory/outbox.test.ts +361 -0
  414. package/src/adapters/in-memory/reference-resolution.test.ts +51 -0
  415. package/src/adapters/in-memory/reference-resolution.ts +67 -0
  416. package/src/adapters/in-memory/sorted-array-index.test.ts +124 -0
  417. package/src/adapters/in-memory/sorted-array-index.ts +228 -0
  418. package/src/adapters/in-memory/store.test.ts +69 -0
  419. package/src/adapters/in-memory/store.ts +145 -0
  420. package/src/adapters/in-memory/value-comparison.ts +53 -0
  421. package/src/adapters/in-memory/value-normalization.test.ts +58 -0
  422. package/src/adapters/prisma/prisma-adapter-sqlite3.test.ts +1207 -0
  423. package/src/adapters/shared/from-unit-of-work-compiler.ts +159 -47
  424. package/src/adapters/shared/uow-operation-compiler.ts +28 -18
  425. package/src/adapters/sql/index.ts +12 -0
  426. package/src/browser/mod.ts +64 -0
  427. package/src/client.ts +19 -0
  428. package/src/db-fragment-definition-builder.test.ts +845 -53
  429. package/src/db-fragment-definition-builder.ts +911 -95
  430. package/src/db-fragment-instantiator.test.ts +210 -94
  431. package/src/db-fragment-integration.test.ts +17 -12
  432. package/src/dispatchers/cloudflare-do/dispatcher.ts +204 -0
  433. package/src/dispatchers/cloudflare-do/index.test.ts +206 -0
  434. package/src/dispatchers/cloudflare-do/index.ts +63 -0
  435. package/src/dispatchers/node/dispatcher.ts +112 -0
  436. package/src/dispatchers/node/index.test.ts +120 -0
  437. package/src/dispatchers/node/index.ts +50 -0
  438. package/src/durable-hooks.test.ts +80 -0
  439. package/src/durable-hooks.ts +67 -0
  440. package/src/fragments/internal-fragment.routes.test.ts +570 -0
  441. package/src/fragments/internal-fragment.routes.ts +334 -0
  442. package/src/fragments/internal-fragment.schema.ts +95 -0
  443. package/src/fragments/internal-fragment.test.ts +505 -83
  444. package/src/fragments/internal-fragment.ts +453 -70
  445. package/src/hooks/durable-hooks-logger.ts +126 -0
  446. package/src/hooks/durable-hooks-processor.pglite.test.ts +87 -0
  447. package/src/hooks/durable-hooks-processor.test.ts +282 -0
  448. package/src/hooks/durable-hooks-processor.ts +173 -0
  449. package/src/hooks/durable-hooks-runtime.test.ts +65 -0
  450. package/src/hooks/durable-hooks-runtime.ts +81 -0
  451. package/src/hooks/hooks.test.ts +455 -34
  452. package/src/hooks/hooks.ts +501 -34
  453. package/src/id.test.ts +34 -0
  454. package/src/id.ts +1 -3
  455. package/src/internal/adapter-registry.test.ts +93 -0
  456. package/src/internal/adapter-registry.ts +239 -0
  457. package/src/internal/outbox-state.ts +43 -0
  458. package/src/migration-engine/auto-from-schema.test.ts +107 -14
  459. package/src/migration-engine/auto-from-schema.ts +365 -44
  460. package/src/migration-engine/create.test.ts +4 -3
  461. package/src/migration-engine/create.ts +1 -1
  462. package/src/migration-engine/generation-engine.test.ts +292 -110
  463. package/src/migration-engine/generation-engine.ts +117 -66
  464. package/src/migration-engine/shared.ts +14 -0
  465. package/src/mod.ts +95 -39
  466. package/src/naming/sql-naming.ts +181 -0
  467. package/src/outbox/outbox-builder.ts +241 -0
  468. package/src/outbox/outbox.test.ts +424 -0
  469. package/src/outbox/outbox.ts +139 -0
  470. package/src/query/column-defaults.ts +42 -4
  471. package/src/query/condition-builder.test.ts +18 -3
  472. package/src/query/condition-builder.ts +7 -0
  473. package/src/query/cursor-client.test.ts +70 -0
  474. package/src/query/cursor-client.ts +263 -0
  475. package/src/query/cursor.test.ts +119 -20
  476. package/src/query/cursor.ts +88 -27
  477. package/src/query/db-now.ts +73 -0
  478. package/src/query/orm/orm.ts +2 -2
  479. package/src/query/query-type.test.ts +4 -3
  480. package/src/query/serialize/create-sql-serializer.ts +10 -5
  481. package/src/query/serialize/dialect/mysql-serializer.ts +13 -5
  482. package/src/query/serialize/dialect/postgres-serializer.ts +35 -5
  483. package/src/query/serialize/dialect/sqlite-serializer.test.ts +90 -3
  484. package/src/query/serialize/dialect/sqlite-serializer.ts +108 -12
  485. package/src/query/serialize/sql-serializer.ts +4 -4
  486. package/src/query/simple-query-interface.ts +15 -4
  487. package/src/query/unit-of-work/execute-unit-of-work.test.ts +372 -10
  488. package/src/query/unit-of-work/execute-unit-of-work.ts +87 -27
  489. package/src/query/unit-of-work/retry-policy.test.ts +1 -0
  490. package/src/query/unit-of-work/tx-builder.test.ts +73 -1
  491. package/src/query/unit-of-work/unit-of-work-coordinator.test.ts +17 -16
  492. package/src/query/unit-of-work/unit-of-work-types.test.ts +42 -12
  493. package/src/query/unit-of-work/unit-of-work.test.ts +196 -39
  494. package/src/query/unit-of-work/unit-of-work.ts +309 -38
  495. package/src/query/value-decoding.test.ts +63 -4
  496. package/src/query/value-decoding.ts +32 -6
  497. package/src/query/value-encoding.test.ts +86 -2
  498. package/src/query/value-encoding.ts +56 -6
  499. package/src/schema/create.test.ts +293 -47
  500. package/src/schema/create.ts +406 -70
  501. package/src/schema/generate-id.test.ts +3 -2
  502. package/src/schema/generate-id.ts +2 -2
  503. package/src/schema/serialize.test.ts +18 -5
  504. package/src/schema/type-conversion/create-sql-type-mapper.ts +8 -3
  505. package/src/schema/type-conversion/dialect/sqlite.ts +18 -0
  506. package/src/schema/type-conversion/type-mapping.test.ts +26 -1
  507. package/src/schema/validator.test.ts +199 -0
  508. package/src/schema/validator.ts +232 -0
  509. package/src/{adapters/drizzle/generate.test.ts → schema-output/drizzle.test.ts} +232 -129
  510. package/src/{adapters/drizzle/generate.ts → schema-output/drizzle.ts} +155 -99
  511. package/src/schema-output/prisma.test.ts +694 -0
  512. package/src/schema-output/prisma.ts +593 -0
  513. package/src/sql-driver/better-sqlite3.test.ts +5 -3
  514. package/src/sql-driver/dialects/durable-object-dialect.ts +3 -8
  515. package/src/sql-driver/query-executor/default-query-executor.ts +1 -1
  516. package/src/sql-driver/query-executor/query-executor-base.ts +1 -1
  517. package/src/sql-driver/query-executor/query-executor.ts +1 -1
  518. package/src/sql-driver/sql-driver-adapter.ts +2 -2
  519. package/src/sql-driver/sql.ts +2 -1
  520. package/src/sql-driver/sqlocal.test.ts +4 -2
  521. package/src/sync/commands.test.ts +39 -0
  522. package/src/sync/commands.ts +51 -0
  523. package/src/sync/conflict-checker.test.ts +450 -0
  524. package/src/sync/conflict-checker.ts +248 -0
  525. package/src/sync/index.ts +14 -0
  526. package/src/sync/plan.ts +9 -0
  527. package/src/sync/read-tracking.test.ts +177 -0
  528. package/src/sync/read-tracking.ts +287 -0
  529. package/src/sync/submit.test.ts +205 -0
  530. package/src/sync/submit.ts +328 -0
  531. package/src/sync/types.ts +80 -0
  532. package/src/util/default-database-adapter.ts +119 -0
  533. package/src/with-database.ts +20 -31
  534. package/tsconfig.json +1 -1
  535. package/tsdown.config.ts +38 -24
  536. package/vitest.config.ts +1 -0
  537. package/dist/adapters/drizzle/drizzle-adapter.d.ts +0 -20
  538. package/dist/adapters/drizzle/drizzle-adapter.d.ts.map +0 -1
  539. package/dist/adapters/drizzle/drizzle-adapter.js +0 -27
  540. package/dist/adapters/drizzle/drizzle-adapter.js.map +0 -1
  541. package/dist/adapters/drizzle/generate.d.ts +0 -30
  542. package/dist/adapters/drizzle/generate.d.ts.map +0 -1
  543. package/dist/adapters/drizzle/generate.js.map +0 -1
  544. package/dist/adapters/kysely/kysely-adapter.d.ts +0 -19
  545. package/dist/adapters/kysely/kysely-adapter.d.ts.map +0 -1
  546. package/dist/adapters/kysely/kysely-adapter.js +0 -17
  547. package/dist/adapters/kysely/kysely-adapter.js.map +0 -1
  548. package/dist/adapters/shared/table-name-mapper.d.ts +0 -12
  549. package/dist/adapters/shared/table-name-mapper.d.ts.map +0 -1
  550. package/dist/adapters/shared/table-name-mapper.js +0 -43
  551. package/dist/adapters/shared/table-name-mapper.js.map +0 -1
  552. package/dist/node_modules/.pnpm/rou3@0.7.10/node_modules/rou3/dist/index.js +0 -165
  553. package/dist/node_modules/.pnpm/rou3@0.7.10/node_modules/rou3/dist/index.js.map +0 -1
  554. package/dist/packages/fragno/dist/api/bind-services.js +0 -20
  555. package/dist/packages/fragno/dist/api/bind-services.js.map +0 -1
  556. package/dist/packages/fragno/dist/api/error.js +0 -48
  557. package/dist/packages/fragno/dist/api/error.js.map +0 -1
  558. package/dist/packages/fragno/dist/api/fragment-definition-builder.js +0 -320
  559. package/dist/packages/fragno/dist/api/fragment-definition-builder.js.map +0 -1
  560. package/dist/packages/fragno/dist/api/fragment-instantiator.js +0 -525
  561. package/dist/packages/fragno/dist/api/fragment-instantiator.js.map +0 -1
  562. package/dist/packages/fragno/dist/api/fragno-response.js +0 -73
  563. package/dist/packages/fragno/dist/api/fragno-response.js.map +0 -1
  564. package/dist/packages/fragno/dist/api/internal/response-stream.js +0 -81
  565. package/dist/packages/fragno/dist/api/internal/response-stream.js.map +0 -1
  566. package/dist/packages/fragno/dist/api/internal/route.js +0 -10
  567. package/dist/packages/fragno/dist/api/internal/route.js.map +0 -1
  568. package/dist/packages/fragno/dist/api/mutable-request-state.js +0 -97
  569. package/dist/packages/fragno/dist/api/mutable-request-state.js.map +0 -1
  570. package/dist/packages/fragno/dist/api/request-context-storage.js +0 -43
  571. package/dist/packages/fragno/dist/api/request-context-storage.js.map +0 -1
  572. package/dist/packages/fragno/dist/api/request-input-context.js +0 -118
  573. package/dist/packages/fragno/dist/api/request-input-context.js.map +0 -1
  574. package/dist/packages/fragno/dist/api/request-middleware.js +0 -83
  575. package/dist/packages/fragno/dist/api/request-middleware.js.map +0 -1
  576. package/dist/packages/fragno/dist/api/request-output-context.js +0 -119
  577. package/dist/packages/fragno/dist/api/request-output-context.js.map +0 -1
  578. package/dist/packages/fragno/dist/api/route.js +0 -17
  579. package/dist/packages/fragno/dist/api/route.js.map +0 -1
  580. package/dist/packages/fragno/dist/internal/symbols.js +0 -10
  581. package/dist/packages/fragno/dist/internal/symbols.js.map +0 -1
  582. package/dist/schema-generator/schema-generator.d.ts +0 -15
  583. package/dist/schema-generator/schema-generator.d.ts.map +0 -1
  584. package/src/adapters/drizzle/drizzle-adapter.ts +0 -39
  585. package/src/adapters/kysely/kysely-adapter.ts +0 -27
  586. package/src/adapters/shared/table-name-mapper.ts +0 -50
  587. package/src/schema-generator/schema-generator.ts +0 -12
@@ -1,10 +1,10 @@
1
1
  import { buildCondition } from "../../../query/condition-builder.js";
2
- import { createColdKysely } from "../migration/cold-kysely.js";
3
2
  import { UOWOperationCompiler } from "../../shared/uow-operation-compiler.js";
3
+ import { createColdKysely } from "../migration/cold-kysely.js";
4
+ import { buildFindOptions } from "../../../query/orm/orm.js";
4
5
  import "./sql-query-compiler.js";
5
6
  import { createSQLQueryCompiler } from "./create-sql-query-compiler.js";
6
7
  import { buildCursorCondition } from "./cursor-utils.js";
7
- import { buildFindOptions } from "../../../query/orm/orm.js";
8
8
 
9
9
  //#region src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.ts
10
10
  /**
@@ -14,25 +14,29 @@ import { buildFindOptions } from "../../../query/orm/orm.js";
14
14
  * high-level business logic like cursor pagination, version checking, and index resolution.
15
15
  */
16
16
  var GenericSQLUOWOperationCompiler = class extends UOWOperationCompiler {
17
- constructor(driverConfig, mapperFactory) {
18
- super(driverConfig, mapperFactory);
17
+ sqliteStorageMode;
18
+ constructor(driverConfig, sqliteStorageMode, resolverFactory) {
19
+ super(driverConfig, resolverFactory);
20
+ this.sqliteStorageMode = sqliteStorageMode;
19
21
  }
20
22
  /**
21
23
  * Get SQL compiler for a specific namespace
22
24
  */
23
- getSQLCompiler(namespace) {
24
- const mapper = this.getMapperForOperation(namespace);
25
- return createSQLQueryCompiler(createColdKysely(this.driverConfig.databaseType), this.driverConfig, mapper);
25
+ getSQLCompiler(schema, namespace) {
26
+ const resolver = this.getNamingResolver(schema, namespace ?? null);
27
+ const kysely = createColdKysely(this.driverConfig.databaseType);
28
+ const schemaName = resolver.getSchemaName();
29
+ return createSQLQueryCompiler(schemaName ? kysely.withSchema(schemaName) : kysely, this.driverConfig, this.sqliteStorageMode, resolver);
26
30
  }
27
31
  compileCount(op) {
28
- const sqlCompiler = this.getSQLCompiler(op.namespace);
32
+ const sqlCompiler = this.getSQLCompiler(op.schema, op.namespace);
29
33
  let conditions = op.options.where ? buildCondition(op.table.columns, op.options.where) : void 0;
30
34
  if (conditions === true) conditions = void 0;
31
35
  if (conditions === false) return null;
32
36
  return sqlCompiler.compileCount(op.table, { where: conditions });
33
37
  }
34
38
  compileFind(op) {
35
- const sqlCompiler = this.getSQLCompiler(op.namespace);
39
+ const sqlCompiler = this.getSQLCompiler(op.schema, op.namespace);
36
40
  const { useIndex: _useIndex, orderByIndex, joins: join, after, before, pageSize,...findManyOptions } = op.options;
37
41
  let indexColumns = [];
38
42
  let orderDirection = "asc";
@@ -45,8 +49,7 @@ var GenericSQLUOWOperationCompiler = class extends UOWOperationCompiler {
45
49
  }
46
50
  let orderBy;
47
51
  if (indexColumns.length > 0) orderBy = indexColumns.map((col) => [col, orderDirection]);
48
- if ((after || before) && indexColumns.length > 1) throw new Error("Multi-column cursor pagination is not yet supported in Generic SQL implementation");
49
- const cursorCondition = buildCursorCondition(after || before, indexColumns, orderDirection, !!after, this.driverConfig);
52
+ const cursorCondition = buildCursorCondition(after || before, indexColumns, orderDirection, !!after, this.driverConfig, this.sqliteStorageMode);
50
53
  let combinedWhere;
51
54
  if (findManyOptions.where) {
52
55
  const whereResult = buildCondition(op.table.columns, findManyOptions.where);
@@ -65,35 +68,40 @@ var GenericSQLUOWOperationCompiler = class extends UOWOperationCompiler {
65
68
  where: combinedWhere,
66
69
  orderBy,
67
70
  limit: effectiveLimit,
68
- join
71
+ join,
72
+ readTracking: op.readTracking
69
73
  });
70
74
  const compiledOptions = buildFindOptions(op.table, {
71
75
  ...findManyOptions,
72
76
  where: combinedWhere ? () => combinedWhere : void 0,
73
- orderBy: orderBy?.map(([col, dir]) => [col.ormName, dir]),
77
+ orderBy: orderBy?.map(([col, dir]) => [col.name, dir]),
74
78
  limit: effectiveLimit
75
79
  });
76
80
  if (compiledOptions === false) return null;
77
- return sqlCompiler.compileFindMany(op.table, compiledOptions);
81
+ return sqlCompiler.compileFindMany(op.table, {
82
+ ...compiledOptions,
83
+ readTracking: op.readTracking
84
+ });
78
85
  }
79
86
  compileCreate(op) {
80
- const sqlCompiler = this.getSQLCompiler(op.namespace);
87
+ const sqlCompiler = this.getSQLCompiler(op.schema, op.namespace);
81
88
  const table = this.getTable(op.schema, op.table);
82
89
  return {
83
90
  query: sqlCompiler.compileCreate(table, op.values),
91
+ operation: op,
84
92
  op: "create",
85
93
  expectedAffectedRows: null,
86
94
  expectedReturnedRows: null
87
95
  };
88
96
  }
89
97
  compileUpdate(op) {
90
- const sqlCompiler = this.getSQLCompiler(op.namespace);
98
+ const sqlCompiler = this.getSQLCompiler(op.schema, op.namespace);
91
99
  const table = this.getTable(op.schema, op.table);
92
100
  const idColumn = table.getIdColumn();
93
101
  const versionColumn = table.getVersionColumn();
94
102
  const externalId = this.getExternalId(op.id);
95
103
  const versionToCheck = this.getVersionToCheck(op.id, op.checkVersion);
96
- const conditionsResult = 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));
104
+ const conditionsResult = versionToCheck !== void 0 ? buildCondition(table.columns, (eb) => eb.and(eb(idColumn.name, "=", externalId), eb(versionColumn.name, "=", versionToCheck))) : buildCondition(table.columns, (eb) => eb(idColumn.name, "=", externalId));
97
105
  if (conditionsResult === false) return null;
98
106
  const conditions = conditionsResult === true ? void 0 : conditionsResult;
99
107
  const useReturningForCheck = op.checkVersion && this.driverConfig.supportsReturning && !this.driverConfig.supportsRowsAffected;
@@ -103,19 +111,20 @@ var GenericSQLUOWOperationCompiler = class extends UOWOperationCompiler {
103
111
  where: conditions,
104
112
  returning: useReturningForCheck
105
113
  }),
114
+ operation: op,
106
115
  op: "update",
107
116
  expectedAffectedRows: useReturningForCheck ? null : op.checkVersion ? 1n : null,
108
117
  expectedReturnedRows: useReturningForCheck ? 1 : null
109
118
  };
110
119
  }
111
120
  compileDelete(op) {
112
- const sqlCompiler = this.getSQLCompiler(op.namespace);
121
+ const sqlCompiler = this.getSQLCompiler(op.schema, op.namespace);
113
122
  const table = this.getTable(op.schema, op.table);
114
123
  const idColumn = table.getIdColumn();
115
124
  const versionColumn = table.getVersionColumn();
116
125
  const externalId = this.getExternalId(op.id);
117
126
  const versionToCheck = this.getVersionToCheck(op.id, op.checkVersion);
118
- const conditionsResult = 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));
127
+ const conditionsResult = versionToCheck !== void 0 ? buildCondition(table.columns, (eb) => eb.and(eb(idColumn.name, "=", externalId), eb(versionColumn.name, "=", versionToCheck))) : buildCondition(table.columns, (eb) => eb(idColumn.name, "=", externalId));
119
128
  if (conditionsResult === false) return null;
120
129
  const conditions = conditionsResult === true ? void 0 : conditionsResult;
121
130
  const useReturningForCheck = op.checkVersion && this.driverConfig.supportsReturning && !this.driverConfig.supportsRowsAffected;
@@ -124,22 +133,24 @@ var GenericSQLUOWOperationCompiler = class extends UOWOperationCompiler {
124
133
  where: conditions,
125
134
  returning: useReturningForCheck
126
135
  }),
136
+ operation: op,
127
137
  op: "delete",
128
138
  expectedAffectedRows: useReturningForCheck ? null : op.checkVersion ? 1n : null,
129
139
  expectedReturnedRows: useReturningForCheck ? 1 : null
130
140
  };
131
141
  }
132
142
  compileCheck(op) {
133
- const sqlCompiler = this.getSQLCompiler(op.namespace);
143
+ const sqlCompiler = this.getSQLCompiler(op.schema, op.namespace);
134
144
  const table = this.getTable(op.schema, op.table);
135
145
  const idColumn = table.getIdColumn();
136
146
  const versionColumn = table.getVersionColumn();
137
147
  const externalId = op.id.externalId;
138
148
  const version = op.id.version;
139
- const condition = buildCondition(table.columns, (eb) => eb.and(eb(idColumn.ormName, "=", externalId), eb(versionColumn.ormName, "=", version)));
149
+ const condition = buildCondition(table.columns, (eb) => eb.and(eb(idColumn.name, "=", externalId), eb(versionColumn.name, "=", version)));
140
150
  if (typeof condition === "boolean") throw new Error("Condition is a boolean, but should be a condition object.");
141
151
  return {
142
152
  query: sqlCompiler.compileCheck(table, condition),
153
+ operation: op,
143
154
  op: "check",
144
155
  expectedAffectedRows: null,
145
156
  expectedReturnedRows: 1
@@ -1 +1 @@
1
- {"version":3,"file":"generic-sql-uow-operation-compiler.js","names":["indexColumns: AnyColumn[]","orderDirection: \"asc\" | \"desc\"","orderBy: [AnyColumn, \"asc\" | \"desc\"][] | undefined","combinedWhere: Condition | undefined","conditions: Condition | undefined"],"sources":["../../../../src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.ts"],"sourcesContent":["import { UOWOperationCompiler } from \"../../shared/uow-operation-compiler\";\nimport type { CompiledQuery } from \"kysely\";\nimport type { DriverConfig } from \"../driver-config\";\nimport type { TableNameMapper } from \"../../shared/table-name-mapper\";\nimport type {\n RetrievalOperation,\n MutationOperation,\n CompiledMutation,\n} from \"../../../query/unit-of-work/unit-of-work\";\nimport type { AnyColumn, AnySchema } from \"../../../schema/create\";\nimport { buildCondition } from \"../../../query/condition-builder\";\nimport { createSQLQueryCompiler } from \"./create-sql-query-compiler\";\nimport { SQLQueryCompiler } from \"./sql-query-compiler\";\nimport { buildCursorCondition } from \"./cursor-utils\";\nimport type { Condition } from \"../../../query/condition-builder\";\nimport { buildFindOptions } from \"../../../query/orm/orm\";\nimport type { AnySelectClause } from \"../../../query/simple-query-interface\";\nimport { createColdKysely } from \"../migration/cold-kysely\";\n\n/**\n * Generic SQL UOW Operation Compiler.\n *\n * Uses SQLQueryCompiler for dialect-specific SQL generation while handling\n * high-level business logic like cursor pagination, version checking, and index resolution.\n */\nexport class GenericSQLUOWOperationCompiler extends UOWOperationCompiler<CompiledQuery> {\n constructor(\n driverConfig: DriverConfig,\n mapperFactory?: (namespace: string | undefined) => TableNameMapper | undefined,\n ) {\n super(driverConfig, mapperFactory);\n }\n\n /**\n * Get SQL compiler for a specific namespace\n */\n private getSQLCompiler(namespace: string | undefined): SQLQueryCompiler {\n const mapper = this.getMapperForOperation(namespace);\n const kysely = createColdKysely(this.driverConfig.databaseType);\n return createSQLQueryCompiler(kysely, this.driverConfig, mapper);\n }\n\n override compileCount(\n op: RetrievalOperation<AnySchema> & { type: \"count\" },\n ): CompiledQuery | null {\n const sqlCompiler = this.getSQLCompiler(op.namespace);\n\n // Build where condition\n let conditions = op.options.where\n ? buildCondition(op.table.columns, op.options.where)\n : undefined;\n\n if (conditions === true) {\n conditions = undefined;\n }\n if (conditions === false) {\n return null;\n }\n\n return sqlCompiler.compileCount(op.table, { where: conditions });\n }\n\n override compileFind(op: RetrievalOperation<AnySchema> & { type: \"find\" }): CompiledQuery | null {\n const sqlCompiler = this.getSQLCompiler(op.namespace);\n\n // Extract options\n const {\n useIndex: _useIndex,\n orderByIndex,\n joins: join,\n after,\n before,\n pageSize,\n ...findManyOptions\n } = op.options;\n\n // Get index columns for ordering and cursor pagination\n let indexColumns: AnyColumn[] = [];\n let orderDirection: \"asc\" | \"desc\" = \"asc\";\n\n if (orderByIndex) {\n const index = op.table.indexes[orderByIndex.indexName];\n orderDirection = orderByIndex.direction;\n\n if (!index) {\n // If _primary index doesn't exist, fall back to internal ID column\n if (orderByIndex.indexName === \"_primary\") {\n indexColumns = [op.table.getIdColumn()];\n } else {\n throw new Error(\n `Index \"${orderByIndex.indexName}\" not found on table \"${op.table.name}\"`,\n );\n }\n } else {\n // Order by all columns in the index with the specified direction\n indexColumns = index.columns;\n }\n }\n\n // Convert orderByIndex to orderBy format\n let orderBy: [AnyColumn, \"asc\" | \"desc\"][] | undefined;\n if (indexColumns.length > 0) {\n orderBy = indexColumns.map((col) => [col, orderDirection]);\n }\n\n // Handle cursor pagination - build a cursor condition\n // TODO: Multi-column cursor pagination not yet supported\n if ((after || before) && indexColumns.length > 1) {\n throw new Error(\n \"Multi-column cursor pagination is not yet supported in Generic SQL implementation\",\n );\n }\n const cursorCondition = buildCursorCondition(\n after || before,\n indexColumns,\n orderDirection,\n !!after,\n this.driverConfig,\n );\n\n // Combine user where clause with cursor condition\n let combinedWhere: Condition | undefined;\n if (findManyOptions.where) {\n const whereResult = buildCondition(op.table.columns, findManyOptions.where);\n if (whereResult === true) {\n combinedWhere = undefined;\n } else if (whereResult === false) {\n return null;\n } else {\n combinedWhere = whereResult;\n }\n }\n\n if (cursorCondition) {\n if (combinedWhere) {\n combinedWhere = {\n type: \"and\",\n items: [combinedWhere, cursorCondition],\n };\n } else {\n combinedWhere = cursorCondition;\n }\n }\n\n // For cursor pagination, fetch one extra item to determine if there's a next page\n const effectiveLimit = pageSize && op.withCursor ? pageSize + 1 : pageSize;\n\n // When we have joins, use the query builder directly\n if (join && join.length > 0) {\n return sqlCompiler.compileFindMany(op.table, {\n select: (findManyOptions.select ?? true) as AnySelectClause,\n where: combinedWhere,\n orderBy,\n limit: effectiveLimit,\n join,\n });\n }\n\n // Otherwise, use buildFindOptions to process the query options\n const compiledOptions = buildFindOptions(op.table, {\n ...findManyOptions,\n where: combinedWhere ? () => combinedWhere! : undefined,\n orderBy: orderBy?.map(([col, dir]) => [col.ormName, dir]),\n limit: effectiveLimit,\n });\n\n if (compiledOptions === false) {\n return null;\n }\n\n return sqlCompiler.compileFindMany(op.table, compiledOptions);\n }\n\n override compileCreate(\n op: MutationOperation<AnySchema> & { type: \"create\" },\n ): CompiledMutation<CompiledQuery> | null {\n const sqlCompiler = this.getSQLCompiler(op.namespace);\n const table = this.getTable(op.schema, op.table);\n\n return {\n query: sqlCompiler.compileCreate(table, op.values),\n op: \"create\",\n expectedAffectedRows: null, // creates don't need affected row checks\n expectedReturnedRows: null,\n };\n }\n\n override compileUpdate(\n op: MutationOperation<AnySchema> & { type: \"update\" },\n ): CompiledMutation<CompiledQuery> | null {\n const sqlCompiler = this.getSQLCompiler(op.namespace);\n const table = this.getTable(op.schema, op.table);\n const idColumn = table.getIdColumn();\n const versionColumn = table.getVersionColumn();\n\n const externalId = this.getExternalId(op.id);\n const versionToCheck = this.getVersionToCheck(op.id, op.checkVersion);\n\n // Build WHERE clause that filters by ID and optionally by version\n const conditionsResult =\n versionToCheck !== undefined\n ? buildCondition(table.columns, (eb) =>\n eb.and(\n eb(idColumn.ormName, \"=\", externalId),\n eb(versionColumn.ormName, \"=\", versionToCheck),\n ),\n )\n : buildCondition(table.columns, (eb) => eb(idColumn.ormName, \"=\", externalId));\n\n if (conditionsResult === false) {\n return null;\n }\n\n const conditions: Condition | undefined =\n conditionsResult === true ? undefined : conditionsResult;\n\n // Determine if we should use RETURNING-based checking\n // Use RETURNING when driver supports it but doesn't support affected rows reporting\n const useReturningForCheck =\n op.checkVersion &&\n this.driverConfig.supportsReturning &&\n !this.driverConfig.supportsRowsAffected;\n\n const query = sqlCompiler.compileUpdate(table, {\n set: op.set,\n where: conditions,\n returning: useReturningForCheck,\n });\n\n return {\n query,\n op: \"update\",\n expectedAffectedRows: useReturningForCheck ? null : op.checkVersion ? 1n : null,\n expectedReturnedRows: useReturningForCheck ? 1 : null,\n };\n }\n\n override compileDelete(\n op: MutationOperation<AnySchema> & { type: \"delete\" },\n ): CompiledMutation<CompiledQuery> | null {\n const sqlCompiler = this.getSQLCompiler(op.namespace);\n const table = this.getTable(op.schema, op.table);\n const idColumn = table.getIdColumn();\n const versionColumn = table.getVersionColumn();\n\n const externalId = this.getExternalId(op.id);\n const versionToCheck = this.getVersionToCheck(op.id, op.checkVersion);\n\n // Build WHERE clause that filters by ID and optionally by version\n const conditionsResult =\n versionToCheck !== undefined\n ? buildCondition(table.columns, (eb) =>\n eb.and(\n eb(idColumn.ormName, \"=\", externalId),\n eb(versionColumn.ormName, \"=\", versionToCheck),\n ),\n )\n : buildCondition(table.columns, (eb) => eb(idColumn.ormName, \"=\", externalId));\n\n if (conditionsResult === false) {\n return null;\n }\n\n const conditions: Condition | undefined =\n conditionsResult === true ? undefined : conditionsResult;\n\n // Determine if we should use RETURNING-based checking\n // Use RETURNING when driver supports it but doesn't support affected rows reporting\n const useReturningForCheck =\n op.checkVersion &&\n this.driverConfig.supportsReturning &&\n !this.driverConfig.supportsRowsAffected;\n\n const query = sqlCompiler.compileDelete(table, {\n where: conditions,\n returning: useReturningForCheck,\n });\n\n return {\n query,\n op: \"delete\",\n expectedAffectedRows: useReturningForCheck ? null : op.checkVersion ? 1n : null,\n expectedReturnedRows: useReturningForCheck ? 1 : null,\n };\n }\n\n override compileCheck(\n op: MutationOperation<AnySchema> & { type: \"check\" },\n ): CompiledMutation<CompiledQuery> {\n const sqlCompiler = this.getSQLCompiler(op.namespace);\n const table = this.getTable(op.schema, op.table);\n const idColumn = table.getIdColumn();\n const versionColumn = table.getVersionColumn();\n\n const externalId = op.id.externalId;\n const version = op.id.version;\n\n // Build a SELECT 1 query to check if the row exists with the correct version\n const condition = buildCondition(table.columns, (eb) =>\n eb.and(eb(idColumn.ormName, \"=\", externalId), eb(versionColumn.ormName, \"=\", version)),\n );\n\n if (typeof condition === \"boolean\") {\n throw new Error(\"Condition is a boolean, but should be a condition object.\");\n }\n\n return {\n query: sqlCompiler.compileCheck(table, condition),\n op: \"check\",\n expectedAffectedRows: null,\n expectedReturnedRows: 1, // Check that exactly 1 row was returned\n };\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"generic-sql-uow-operation-compiler.js","names":["indexColumns: AnyColumn[]","orderDirection: \"asc\" | \"desc\"","orderBy: [AnyColumn, \"asc\" | \"desc\"][] | undefined","combinedWhere: Condition | undefined","conditions: Condition | undefined"],"sources":["../../../../src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.ts"],"sourcesContent":["import type { CompiledQuery } from \"kysely\";\n\nimport type { NamingResolver } from \"../../../naming/sql-naming\";\nimport { buildCondition } from \"../../../query/condition-builder\";\nimport type { Condition } from \"../../../query/condition-builder\";\nimport { buildFindOptions } from \"../../../query/orm/orm\";\nimport type { AnySelectClause } from \"../../../query/simple-query-interface\";\nimport type {\n RetrievalOperation,\n MutationOperation,\n CompiledMutation,\n} from \"../../../query/unit-of-work/unit-of-work\";\nimport type { AnyColumn, AnySchema } from \"../../../schema/create\";\nimport { UOWOperationCompiler } from \"../../shared/uow-operation-compiler\";\nimport type { DriverConfig } from \"../driver-config\";\nimport { createColdKysely } from \"../migration/cold-kysely\";\nimport type { SQLiteStorageMode } from \"../sqlite-storage\";\nimport { createSQLQueryCompiler } from \"./create-sql-query-compiler\";\nimport { buildCursorCondition } from \"./cursor-utils\";\nimport { SQLQueryCompiler } from \"./sql-query-compiler\";\n\n/**\n * Generic SQL UOW Operation Compiler.\n *\n * Uses SQLQueryCompiler for dialect-specific SQL generation while handling\n * high-level business logic like cursor pagination, version checking, and index resolution.\n */\nexport class GenericSQLUOWOperationCompiler extends UOWOperationCompiler<CompiledQuery> {\n private readonly sqliteStorageMode?: SQLiteStorageMode;\n\n constructor(\n driverConfig: DriverConfig,\n sqliteStorageMode?: SQLiteStorageMode,\n resolverFactory?: (schema: AnySchema, namespace: string | null) => NamingResolver,\n ) {\n super(driverConfig, resolverFactory);\n this.sqliteStorageMode = sqliteStorageMode;\n }\n\n /**\n * Get SQL compiler for a specific namespace\n */\n private getSQLCompiler(\n schema: AnySchema,\n namespace: string | null | undefined,\n ): SQLQueryCompiler {\n const resolver = this.getNamingResolver(schema, namespace ?? null);\n const kysely = createColdKysely(this.driverConfig.databaseType);\n const schemaName = resolver.getSchemaName();\n const scopedKysely = schemaName ? kysely.withSchema(schemaName) : kysely;\n return createSQLQueryCompiler(\n scopedKysely,\n this.driverConfig,\n this.sqliteStorageMode,\n resolver,\n );\n }\n\n override compileCount(\n op: RetrievalOperation<AnySchema> & { type: \"count\" },\n ): CompiledQuery | null {\n const sqlCompiler = this.getSQLCompiler(op.schema, op.namespace);\n\n // Build where condition\n let conditions = op.options.where\n ? buildCondition(op.table.columns, op.options.where)\n : undefined;\n\n if (conditions === true) {\n conditions = undefined;\n }\n if (conditions === false) {\n return null;\n }\n\n return sqlCompiler.compileCount(op.table, { where: conditions });\n }\n\n override compileFind(op: RetrievalOperation<AnySchema> & { type: \"find\" }): CompiledQuery | null {\n const sqlCompiler = this.getSQLCompiler(op.schema, op.namespace);\n\n // Extract options\n const {\n useIndex: _useIndex,\n orderByIndex,\n joins: join,\n after,\n before,\n pageSize,\n ...findManyOptions\n } = op.options;\n\n // Get index columns for ordering and cursor pagination\n let indexColumns: AnyColumn[] = [];\n let orderDirection: \"asc\" | \"desc\" = \"asc\";\n\n if (orderByIndex) {\n const index = op.table.indexes[orderByIndex.indexName];\n orderDirection = orderByIndex.direction;\n\n if (!index) {\n // If _primary index doesn't exist, fall back to internal ID column\n if (orderByIndex.indexName === \"_primary\") {\n indexColumns = [op.table.getIdColumn()];\n } else {\n throw new Error(\n `Index \"${orderByIndex.indexName}\" not found on table \"${op.table.name}\"`,\n );\n }\n } else {\n // Order by all columns in the index with the specified direction\n indexColumns = index.columns;\n }\n }\n\n // Convert orderByIndex to orderBy format\n let orderBy: [AnyColumn, \"asc\" | \"desc\"][] | undefined;\n if (indexColumns.length > 0) {\n orderBy = indexColumns.map((col) => [col, orderDirection]);\n }\n\n // Handle cursor pagination - build a cursor condition (supports multi-column lexicographic compare)\n const cursorCondition = buildCursorCondition(\n after || before,\n indexColumns,\n orderDirection,\n !!after,\n this.driverConfig,\n this.sqliteStorageMode,\n );\n\n // Combine user where clause with cursor condition\n let combinedWhere: Condition | undefined;\n if (findManyOptions.where) {\n const whereResult = buildCondition(op.table.columns, findManyOptions.where);\n if (whereResult === true) {\n combinedWhere = undefined;\n } else if (whereResult === false) {\n return null;\n } else {\n combinedWhere = whereResult;\n }\n }\n\n if (cursorCondition) {\n if (combinedWhere) {\n combinedWhere = {\n type: \"and\",\n items: [combinedWhere, cursorCondition],\n };\n } else {\n combinedWhere = cursorCondition;\n }\n }\n\n // For cursor pagination, fetch one extra item to determine if there's a next page\n const effectiveLimit = pageSize && op.withCursor ? pageSize + 1 : pageSize;\n\n // When we have joins, use the query builder directly\n if (join && join.length > 0) {\n return sqlCompiler.compileFindMany(op.table, {\n select: (findManyOptions.select ?? true) as AnySelectClause,\n where: combinedWhere,\n orderBy,\n limit: effectiveLimit,\n join,\n readTracking: op.readTracking,\n });\n }\n\n // Otherwise, use buildFindOptions to process the query options\n const compiledOptions = buildFindOptions(op.table, {\n ...findManyOptions,\n where: combinedWhere ? () => combinedWhere! : undefined,\n orderBy: orderBy?.map(([col, dir]) => [col.name, dir]),\n limit: effectiveLimit,\n });\n\n if (compiledOptions === false) {\n return null;\n }\n\n return sqlCompiler.compileFindMany(op.table, {\n ...compiledOptions,\n readTracking: op.readTracking,\n });\n }\n\n override compileCreate(\n op: MutationOperation<AnySchema> & { type: \"create\" },\n ): CompiledMutation<CompiledQuery> | null {\n const sqlCompiler = this.getSQLCompiler(op.schema, op.namespace);\n const table = this.getTable(op.schema, op.table);\n\n return {\n query: sqlCompiler.compileCreate(table, op.values),\n operation: op,\n op: \"create\",\n expectedAffectedRows: null, // creates don't need affected row checks\n expectedReturnedRows: null,\n };\n }\n\n override compileUpdate(\n op: MutationOperation<AnySchema> & { type: \"update\" },\n ): CompiledMutation<CompiledQuery> | null {\n const sqlCompiler = this.getSQLCompiler(op.schema, op.namespace);\n const table = this.getTable(op.schema, op.table);\n const idColumn = table.getIdColumn();\n const versionColumn = table.getVersionColumn();\n\n const externalId = this.getExternalId(op.id);\n const versionToCheck = this.getVersionToCheck(op.id, op.checkVersion);\n\n // Build WHERE clause that filters by ID and optionally by version\n const conditionsResult =\n versionToCheck !== undefined\n ? buildCondition(table.columns, (eb) =>\n eb.and(eb(idColumn.name, \"=\", externalId), eb(versionColumn.name, \"=\", versionToCheck)),\n )\n : buildCondition(table.columns, (eb) => eb(idColumn.name, \"=\", externalId));\n\n if (conditionsResult === false) {\n return null;\n }\n\n const conditions: Condition | undefined =\n conditionsResult === true ? undefined : conditionsResult;\n\n // Determine if we should use RETURNING-based checking\n // Use RETURNING when driver supports it but doesn't support affected rows reporting\n const useReturningForCheck =\n op.checkVersion &&\n this.driverConfig.supportsReturning &&\n !this.driverConfig.supportsRowsAffected;\n\n const query = sqlCompiler.compileUpdate(table, {\n set: op.set,\n where: conditions,\n returning: useReturningForCheck,\n });\n\n return {\n query,\n operation: op,\n op: \"update\",\n expectedAffectedRows: useReturningForCheck ? null : op.checkVersion ? 1n : null,\n expectedReturnedRows: useReturningForCheck ? 1 : null,\n };\n }\n\n override compileDelete(\n op: MutationOperation<AnySchema> & { type: \"delete\" },\n ): CompiledMutation<CompiledQuery> | null {\n const sqlCompiler = this.getSQLCompiler(op.schema, op.namespace);\n const table = this.getTable(op.schema, op.table);\n const idColumn = table.getIdColumn();\n const versionColumn = table.getVersionColumn();\n\n const externalId = this.getExternalId(op.id);\n const versionToCheck = this.getVersionToCheck(op.id, op.checkVersion);\n\n // Build WHERE clause that filters by ID and optionally by version\n const conditionsResult =\n versionToCheck !== undefined\n ? buildCondition(table.columns, (eb) =>\n eb.and(eb(idColumn.name, \"=\", externalId), eb(versionColumn.name, \"=\", versionToCheck)),\n )\n : buildCondition(table.columns, (eb) => eb(idColumn.name, \"=\", externalId));\n\n if (conditionsResult === false) {\n return null;\n }\n\n const conditions: Condition | undefined =\n conditionsResult === true ? undefined : conditionsResult;\n\n // Determine if we should use RETURNING-based checking\n // Use RETURNING when driver supports it but doesn't support affected rows reporting\n const useReturningForCheck =\n op.checkVersion &&\n this.driverConfig.supportsReturning &&\n !this.driverConfig.supportsRowsAffected;\n\n const query = sqlCompiler.compileDelete(table, {\n where: conditions,\n returning: useReturningForCheck,\n });\n\n return {\n query,\n operation: op,\n op: \"delete\",\n expectedAffectedRows: useReturningForCheck ? null : op.checkVersion ? 1n : null,\n expectedReturnedRows: useReturningForCheck ? 1 : null,\n };\n }\n\n override compileCheck(\n op: MutationOperation<AnySchema> & { type: \"check\" },\n ): CompiledMutation<CompiledQuery> {\n const sqlCompiler = this.getSQLCompiler(op.schema, op.namespace);\n const table = this.getTable(op.schema, op.table);\n const idColumn = table.getIdColumn();\n const versionColumn = table.getVersionColumn();\n\n const externalId = op.id.externalId;\n const version = op.id.version;\n\n // Build a SELECT 1 query to check if the row exists with the correct version\n const condition = buildCondition(table.columns, (eb) =>\n eb.and(eb(idColumn.name, \"=\", externalId), eb(versionColumn.name, \"=\", version)),\n );\n\n if (typeof condition === \"boolean\") {\n throw new Error(\"Condition is a boolean, but should be a condition object.\");\n }\n\n return {\n query: sqlCompiler.compileCheck(table, condition),\n operation: op,\n op: \"check\",\n expectedAffectedRows: null,\n expectedReturnedRows: 1, // Check that exactly 1 row was returned\n };\n }\n}\n"],"mappings":"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"}
@@ -13,7 +13,7 @@
13
13
  * @returns Array of SQL select strings in the format "tableName.columnName as alias"
14
14
  * @internal
15
15
  */
16
- function mapSelect(select, table, options = {}) {
16
+ function mapSelect(select, table, resolver, options = {}) {
17
17
  const { relation, tableName = table.name } = options;
18
18
  const out = [];
19
19
  const keys = Array.isArray(select) ? select : Object.keys(table.columns);
@@ -21,13 +21,15 @@ function mapSelect(select, table, options = {}) {
21
21
  const col = table.columns[key];
22
22
  if (Array.isArray(select) && col.isHidden) continue;
23
23
  const name = relation ? `${relation}:${key}` : key;
24
- out.push(`${tableName}.${col.name} as ${name}`);
24
+ const columnName = resolver ? resolver.getColumnName(table.name, col.name) : col.name;
25
+ out.push(`${tableName}.${columnName} as ${name}`);
25
26
  }
26
27
  for (const key in table.columns) {
27
28
  const col = table.columns[key];
28
29
  if (col.isHidden && !keys.includes(key)) {
29
30
  const name = relation ? `${relation}:${key}` : key;
30
- out.push(`${tableName}.${col.name} as ${name}`);
31
+ const columnName = resolver ? resolver.getColumnName(table.name, col.name) : col.name;
32
+ out.push(`${tableName}.${columnName} as ${name}`);
31
33
  }
32
34
  }
33
35
  return out;
@@ -1 +1 @@
1
- {"version":3,"file":"select-builder.js","names":["out: string[]","extendedKeys: string[]"],"sources":["../../../../src/adapters/generic-sql/query/select-builder.ts"],"sourcesContent":["import type { AnyTable } from \"../../../schema/create\";\nimport type { AnySelectClause } from \"../../../query/simple-query-interface\";\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 */\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 */\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"],"mappings":";;;;;;;;;;;;;;;AAiBA,SAAgB,UACd,QACA,OACA,UAGI,EAAE,EACI;CACV,MAAM,EAAE,UAAU,YAAY,MAAM,SAAS;CAC7C,MAAMA,MAAgB,EAAE;CACxB,MAAM,OAAO,MAAM,QAAQ,OAAO,GAAG,SAAS,OAAO,KAAK,MAAM,QAAQ;AAExE,MAAK,MAAM,OAAO,MAAM;EACtB,MAAM,MAAM,MAAM,QAAQ;AAG1B,MAAI,MAAM,QAAQ,OAAO,IAAI,IAAI,SAC/B;EAIF,MAAM,OAAO,WAAW,GAAG,SAAS,GAAG,QAAQ;AAC/C,MAAI,KAAK,GAAG,UAAU,GAAG,IAAI,KAAK,MAAM,OAAO;;AAIjD,MAAK,MAAM,OAAO,MAAM,SAAS;EAC/B,MAAM,MAAM,MAAM,QAAQ;AAC1B,MAAI,IAAI,YAAY,CAAC,KAAK,SAAS,IAAI,EAAE;GACvC,MAAM,OAAO,WAAW,GAAG,SAAS,GAAG,QAAQ;AAC/C,OAAI,KAAK,GAAG,UAAU,GAAG,IAAI,KAAK,MAAM,OAAO;;;AAInD,QAAO;;;;;;;;;;;;AA2DT,SAAgB,aAAa,UAA0C;CACrE,MAAM,SAAS,MAAM,QAAQ,SAAS,GAAG,IAAI,IAAI,SAAS,GAAG;CAC7D,MAAMC,eAAyB,EAAE;AAEjC,QAAO;EACL,OAAO,KAAK;AACV,OAAI,WAAW,QAAQ,OAAO,IAAI,IAAI,CACpC;AAGF,UAAO,IAAI,IAAI;AACf,gBAAa,KAAK,IAAI;;EAExB,UAAU;AACR,UAAO;IACL,QAAQ,kBAAkB,MAAM,MAAM,KAAK,OAAO,GAAG;IACrD;IACA,mBAAmB,QAAQ;AACzB,UAAK,MAAM,OAAO,aAChB,QAAO,OAAO;AAEhB,YAAO;;IAEV;;EAEJ"}
1
+ {"version":3,"file":"select-builder.js","names":["out: string[]","extendedKeys: string[]"],"sources":["../../../../src/adapters/generic-sql/query/select-builder.ts"],"sourcesContent":["import type { NamingResolver } from \"../../../naming/sql-naming\";\nimport type { AnySelectClause } from \"../../../query/simple-query-interface\";\nimport type { AnyTable } from \"../../../schema/create\";\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 */\nexport function mapSelect(\n select: AnySelectClause,\n table: AnyTable,\n resolver: NamingResolver | undefined,\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 const columnName = resolver ? resolver.getColumnName(table.name, col.name) : col.name;\n out.push(`${tableName}.${columnName} 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 const columnName = resolver ? resolver.getColumnName(table.name, col.name) : col.name;\n out.push(`${tableName}.${columnName} 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 */\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"],"mappings":";;;;;;;;;;;;;;;AAkBA,SAAgB,UACd,QACA,OACA,UACA,UAGI,EAAE,EACI;CACV,MAAM,EAAE,UAAU,YAAY,MAAM,SAAS;CAC7C,MAAMA,MAAgB,EAAE;CACxB,MAAM,OAAO,MAAM,QAAQ,OAAO,GAAG,SAAS,OAAO,KAAK,MAAM,QAAQ;AAExE,MAAK,MAAM,OAAO,MAAM;EACtB,MAAM,MAAM,MAAM,QAAQ;AAG1B,MAAI,MAAM,QAAQ,OAAO,IAAI,IAAI,SAC/B;EAIF,MAAM,OAAO,WAAW,GAAG,SAAS,GAAG,QAAQ;EAC/C,MAAM,aAAa,WAAW,SAAS,cAAc,MAAM,MAAM,IAAI,KAAK,GAAG,IAAI;AACjF,MAAI,KAAK,GAAG,UAAU,GAAG,WAAW,MAAM,OAAO;;AAInD,MAAK,MAAM,OAAO,MAAM,SAAS;EAC/B,MAAM,MAAM,MAAM,QAAQ;AAC1B,MAAI,IAAI,YAAY,CAAC,KAAK,SAAS,IAAI,EAAE;GACvC,MAAM,OAAO,WAAW,GAAG,SAAS,GAAG,QAAQ;GAC/C,MAAM,aAAa,WAAW,SAAS,cAAc,MAAM,MAAM,IAAI,KAAK,GAAG,IAAI;AACjF,OAAI,KAAK,GAAG,UAAU,GAAG,WAAW,MAAM,OAAO;;;AAIrD,QAAO;;;;;;;;;;;;AA2DT,SAAgB,aAAa,UAA0C;CACrE,MAAM,SAAS,MAAM,QAAQ,SAAS,GAAG,IAAI,IAAI,SAAS,GAAG;CAC7D,MAAMC,eAAyB,EAAE;AAEjC,QAAO;EACL,OAAO,KAAK;AACV,OAAI,WAAW,QAAQ,OAAO,IAAI,IAAI,CACpC;AAGF,UAAO,IAAI,IAAI;AACf,gBAAa,KAAK,IAAI;;EAExB,UAAU;AACR,UAAO;IACL,QAAQ,kBAAkB,MAAM,MAAM,KAAK,OAAO,GAAG;IACrD;IACA,mBAAmB,QAAQ;AACzB,UAAK,MAAM,OAAO,aAChB,QAAO,OAAO;AAEhB,YAAO;;IAEV;;EAEJ"}
@@ -1,6 +1,6 @@
1
1
  import { buildWhere, fullSQLName } from "./where-builder.js";
2
- import { extendSelect, mapSelect } from "./select-builder.js";
3
2
  import { UnitOfWorkEncoder } from "../uow-encoder.js";
3
+ import { extendSelect, mapSelect } from "./select-builder.js";
4
4
  import { sql } from "kysely";
5
5
 
6
6
  //#region src/adapters/generic-sql/query/sql-query-compiler.ts
@@ -17,31 +17,33 @@ var SQLQueryCompiler = class {
17
17
  db;
18
18
  driverConfig;
19
19
  database;
20
- mapper;
20
+ resolver;
21
21
  encoder;
22
- constructor(db, driverConfig, mapper) {
22
+ sqliteStorageMode;
23
+ constructor(db, driverConfig, sqliteStorageMode, resolver) {
23
24
  this.db = db;
24
25
  this.driverConfig = driverConfig;
25
26
  this.database = driverConfig.databaseType;
26
- this.mapper = mapper;
27
- this.encoder = new UnitOfWorkEncoder(driverConfig, db, mapper);
27
+ this.resolver = resolver;
28
+ this.sqliteStorageMode = sqliteStorageMode;
29
+ this.encoder = new UnitOfWorkEncoder(driverConfig, db, sqliteStorageMode, resolver);
28
30
  }
29
31
  /**
30
32
  * Get the physical table name, applying namespace mapping if provided.
31
33
  */
32
34
  getTableName(table) {
33
- return this.mapper ? this.mapper.toPhysical(table.name) : table.name;
35
+ return this.resolver ? this.resolver.getTableName(table.name) : table.name;
34
36
  }
35
37
  /**
36
38
  * Build WHERE clause from a condition tree.
37
39
  */
38
- buildWhereClause(condition, eb, table) {
39
- return buildWhere(condition, eb, this.driverConfig, this.mapper, table);
40
+ buildWhereClause(condition, eb, table, tableAlias) {
41
+ return buildWhere(condition, eb, this.driverConfig, this.sqliteStorageMode, this.resolver, table, tableAlias);
40
42
  }
41
43
  /**
42
44
  * Process joins recursively to support nested joins.
43
45
  */
44
- processJoins(query, joins, parentTable, parentTableName, mappedSelect, parentPath = "") {
46
+ processJoins(query, joins, parentTable, parentTableName, mappedSelect, parentPath = "", aliasCollector, readTracking) {
45
47
  let result = query;
46
48
  for (const join of joins) {
47
49
  const { options: joinOptions, relation } = join;
@@ -49,24 +51,51 @@ var SQLQueryCompiler = class {
49
51
  const targetTable = relation.table;
50
52
  const fullPath = parentPath ? `${parentPath}:${relation.name}` : relation.name;
51
53
  const joinName = fullPath.replace(/:/g, "_");
52
- mappedSelect.push(...mapSelect(joinOptions.select, targetTable, {
54
+ if (aliasCollector) aliasCollector.push({
55
+ table: targetTable,
56
+ alias: joinName
57
+ });
58
+ const joinSelectBuilder = extendSelect(joinOptions.select);
59
+ if (readTracking) joinSelectBuilder.extend(targetTable.getIdColumn().name);
60
+ const compiledJoinSelect = joinSelectBuilder.compile();
61
+ mappedSelect.push(...mapSelect(compiledJoinSelect.result, targetTable, this.resolver, {
53
62
  relation: fullPath,
54
63
  tableName: joinName
55
64
  }));
56
65
  result = result.leftJoin(`${this.getTableName(targetTable)} as ${joinName}`, (b) => b.on((eb) => {
57
66
  const conditions = [];
58
67
  for (const [left, right] of relation.on) {
68
+ const actualLeft = parentTable.columns[left]?.role === "external-id" ? parentTable.getInternalIdColumn().name : left;
69
+ const actualLeftCol = parentTable.columns[actualLeft];
59
70
  const actualRight = targetTable.columns[right]?.role === "external-id" ? "_internalId" : right;
60
- conditions.push(eb(`${parentTableName}.${parentTable.columns[left].name}`, "=", eb.ref(`${joinName}.${targetTable.columns[actualRight].name}`)));
71
+ conditions.push(eb(`${parentTableName}.${this.resolver ? this.resolver.getColumnName(parentTable.name, actualLeftCol ? actualLeftCol.name : parentTable.columns[left].name) : (actualLeftCol ?? parentTable.columns[left]).name}`, "=", eb.ref(`${joinName}.${this.resolver ? this.resolver.getColumnName(targetTable.name, targetTable.columns[actualRight].name) : targetTable.columns[actualRight].name}`)));
61
72
  }
62
- if (joinOptions.where) conditions.push(this.buildWhereClause(joinOptions.where, eb, targetTable));
73
+ if (joinOptions.where) conditions.push(this.buildWhereClause(joinOptions.where, eb, targetTable, joinName));
63
74
  return eb.and(conditions);
64
75
  }));
65
- if (joinOptions.join && joinOptions.join.length > 0) result = this.processJoins(result, joinOptions.join, targetTable, joinName, mappedSelect, fullPath);
76
+ if (joinOptions.join && joinOptions.join.length > 0) result = this.processJoins(result, joinOptions.join, targetTable, joinName, mappedSelect, fullPath, aliasCollector, readTracking);
66
77
  }
67
78
  return result;
68
79
  }
69
80
  /**
81
+ * Build a select query with joins applied, returning a list of table aliases used.
82
+ * Intended for conflict checks that need to mirror the join tree from queries.
83
+ */
84
+ buildJoinQuery(table, options) {
85
+ const tableName = this.getTableName(table);
86
+ let query = this.db.selectFrom(tableName);
87
+ const aliases = [{
88
+ table,
89
+ alias: tableName
90
+ }];
91
+ if (options.where) query = query.where((eb) => this.buildWhereClause(options.where, eb, table));
92
+ if (options.join && options.join.length > 0) query = this.processJoins(query, options.join, table, tableName, [], "", aliases);
93
+ return {
94
+ query,
95
+ aliases
96
+ };
97
+ }
98
+ /**
70
99
  * Compile a COUNT query.
71
100
  */
72
101
  compileCount(table, options) {
@@ -83,12 +112,13 @@ var SQLQueryCompiler = class {
83
112
  if (whereQuery) query = query.where((eb) => this.buildWhereClause(whereQuery, eb, table));
84
113
  if (options.offset !== void 0) query = this.applyOffset(query, options.offset);
85
114
  if (options.limit !== void 0) query = this.applyLimit(query, options.limit);
86
- if (options.orderBy) for (const [col, mode] of options.orderBy) query = query.orderBy(fullSQLName(col, this.mapper), mode);
115
+ if (options.orderBy) for (const [col, mode] of options.orderBy) query = query.orderBy(fullSQLName(col, this.resolver), mode);
87
116
  const selectBuilder = extendSelect(options.select);
117
+ if (options.readTracking) selectBuilder.extend(table.getIdColumn().name);
88
118
  const mappedSelect = [];
89
- if (options.join && options.join.length > 0) query = this.processJoins(query, options.join, table, this.getTableName(table), mappedSelect);
119
+ if (options.join && options.join.length > 0) query = this.processJoins(query, options.join, table, this.getTableName(table), mappedSelect, "", void 0, options.readTracking);
90
120
  const compiledSelect = selectBuilder.compile();
91
- mappedSelect.push(...mapSelect(compiledSelect.result, table, { tableName: this.getTableName(table) }));
121
+ mappedSelect.push(...mapSelect(compiledSelect.result, table, this.resolver, { tableName: this.getTableName(table) }));
92
122
  return query.select(mappedSelect).compile();
93
123
  }
94
124
  /**
@@ -102,7 +132,7 @@ var SQLQueryCompiler = class {
102
132
  });
103
133
  let insert = this.db.insertInto(this.getTableName(table)).values(encodedValues);
104
134
  if (this.driverConfig.supportsReturning) {
105
- const columns = mapSelect(true, table, { tableName: this.getTableName(table) });
135
+ const columns = mapSelect(true, table, this.resolver, { tableName: this.getTableName(table) });
106
136
  insert = this.applyReturning(insert, columns);
107
137
  }
108
138
  return insert.compile();
@@ -117,7 +147,8 @@ var SQLQueryCompiler = class {
117
147
  generateDefaults: false
118
148
  });
119
149
  const versionCol = table.getVersionColumn();
120
- encoded[versionCol.name] = sql.raw(`COALESCE(${versionCol.name}, 0) + 1`);
150
+ const versionColumnName = this.resolver ? this.resolver.getColumnName(table.name, versionCol.name) : versionCol.name;
151
+ encoded[versionColumnName] = sql`coalesce(${sql.ref(versionColumnName)}, 0) + 1`;
121
152
  let query = this.db.updateTable(this.getTableName(table)).set(encoded);
122
153
  if (options.where) query = query.where((eb) => this.buildWhereClause(options.where, eb, table));
123
154
  if (options.returning && this.driverConfig.supportsReturning) return query.returning(sql`1`.as("_returned")).compile();
@@ -1 +1 @@
1
- {"version":3,"file":"sql-query-compiler.js","names":["mappedSelect: string[]","insert: AnyInsertQueryBuilder"],"sources":["../../../../src/adapters/generic-sql/query/sql-query-compiler.ts"],"sourcesContent":["import type {\n CompiledQuery,\n Kysely,\n ExpressionBuilder,\n ExpressionWrapper,\n SelectQueryBuilder,\n InsertQueryBuilder,\n} from \"kysely\";\nimport { sql } from \"kysely\";\nimport type { SqlBool } from \"kysely\";\nimport type { AnyColumn, AnyTable } from \"../../../schema/create\";\nimport type { Condition } from \"../../../query/condition-builder\";\nimport type { DriverConfig, SupportedDatabase } from \"../driver-config\";\nimport type { TableNameMapper } from \"../../shared/table-name-mapper\";\nimport { buildWhere, fullSQLName } from \"./where-builder\";\nimport { mapSelect, extendSelect } from \"./select-builder\";\nimport type { CompiledJoin } from \"../../../query/orm/orm\";\nimport { UnitOfWorkEncoder } from \"../uow-encoder\";\n\n/**\n * Type helpers for Kysely query builders.\n *\n * These use `any` for database schema types because at this abstraction layer,\n * we cannot know the specific database schema - we work with generic query\n * compilation that needs to work across any schema.\n */\n\n// oxlint-disable-next-line no-explicit-any\nexport type AnyKysely = Kysely<any>;\n\n// oxlint-disable-next-line no-explicit-any\nexport type AnyExpressionBuilder = ExpressionBuilder<any, any>;\n\n// oxlint-disable-next-line no-explicit-any\nexport type AnyExpressionWrapper = ExpressionWrapper<any, any, SqlBool>;\n\n// oxlint-disable-next-line no-explicit-any\nexport type AnySelectQueryBuilder<O = any> = SelectQueryBuilder<any, any, O>;\n\n// oxlint-disable-next-line no-explicit-any\nexport type AnyInsertQueryBuilder<O = any> = InsertQueryBuilder<any, any, O>;\n\n/**\n * Options for compiling a find operation\n */\nexport interface FindManyCompilerOptions {\n select: true | string[];\n where?: Condition;\n orderBy?: [AnyColumn, \"asc\" | \"desc\"][];\n limit?: number;\n offset?: number;\n join?: CompiledJoin[];\n}\n\n/**\n * Options for compiling a count operation\n */\nexport interface CountCompilerOptions {\n where?: Condition;\n}\n\n/**\n * Options for compiling an update operation\n */\nexport interface UpdateCompilerOptions {\n where?: Condition;\n set: Record<string, unknown>;\n /**\n * Whether to add RETURNING clause to the UPDATE query.\n * Used for version conflict detection when driver supports RETURNING but not affected rows.\n */\n returning?: boolean;\n}\n\n/**\n * Options for compiling a delete operation\n */\nexport interface DeleteCompilerOptions {\n where?: Condition;\n /**\n * Whether to add RETURNING clause to the DELETE query.\n * Used for version conflict detection when driver supports RETURNING but not affected rows.\n */\n returning?: boolean;\n}\n\n/**\n * Abstract base class for SQL query compilation.\n *\n * Similar to SQLGenerator for migrations, this class provides a framework\n * for compiling runtime queries with dialect-specific behavior.\n *\n * Each database dialect extends this class and implements the abstract methods\n * to handle database-specific SQL generation (like .limit() vs .top()).\n */\nexport abstract class SQLQueryCompiler {\n protected readonly db: AnyKysely;\n protected readonly driverConfig: DriverConfig;\n protected readonly database: SupportedDatabase;\n protected readonly mapper?: TableNameMapper;\n protected readonly encoder: UnitOfWorkEncoder;\n\n constructor(db: AnyKysely, driverConfig: DriverConfig, mapper?: TableNameMapper) {\n this.db = db;\n this.driverConfig = driverConfig;\n this.database = driverConfig.databaseType;\n this.mapper = mapper;\n this.encoder = new UnitOfWorkEncoder(driverConfig, db, mapper);\n }\n\n /**\n * Apply LIMIT clause to a query.\n * Different databases use different syntax (.limit() vs .top()).\n */\n protected abstract applyLimit<T>(query: T & { limit(limit: number): T }, limit: number): T;\n\n /**\n * Apply OFFSET clause to a query.\n * Some databases may not support offset.\n */\n protected abstract applyOffset<T>(query: T & { offset(offset: number): T }, offset: number): T;\n\n /**\n * Apply RETURNING clause to an insert/update query.\n * Returns the query with RETURNING if supported, otherwise returns as-is.\n */\n protected abstract applyReturning<T>(\n query: T & { returning(columns: string[]): T },\n columns: string[],\n ): T;\n\n /**\n * Get the physical table name, applying namespace mapping if provided.\n */\n protected getTableName(table: AnyTable): string {\n return this.mapper ? this.mapper.toPhysical(table.name) : table.name;\n }\n\n /**\n * Build WHERE clause from a condition tree.\n */\n protected buildWhereClause(condition: Condition, eb: AnyExpressionBuilder, table: AnyTable) {\n return buildWhere(condition, eb, this.driverConfig, this.mapper, table);\n }\n\n /**\n * Process joins recursively to support nested joins.\n */\n protected processJoins<O>(\n query: AnySelectQueryBuilder<O>,\n joins: CompiledJoin[],\n parentTable: AnyTable,\n parentTableName: string,\n mappedSelect: string[],\n parentPath: string = \"\",\n ): AnySelectQueryBuilder<O> {\n let result = query;\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 result = result.leftJoin(`${this.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(this.buildWhereClause(joinOptions.where, eb, targetTable));\n }\n\n return eb.and(conditions);\n }),\n );\n\n // Recursively process nested joins with the full path\n if (joinOptions.join && joinOptions.join.length > 0) {\n result = this.processJoins(\n result,\n joinOptions.join,\n targetTable,\n joinName,\n mappedSelect,\n fullPath,\n );\n }\n }\n\n return result;\n }\n\n /**\n * Compile a COUNT query.\n */\n compileCount(table: AnyTable, options: CountCompilerOptions): CompiledQuery {\n let query = this.db\n .selectFrom(this.getTableName(table))\n .select(this.db.fn.countAll().as(\"count\"));\n\n if (options.where) {\n query = query.where((b) => this.buildWhereClause(options.where!, b, table));\n }\n\n return query.compile();\n }\n\n /**\n * Compile a FIND MANY query.\n */\n compileFindMany(table: AnyTable, options: FindManyCompilerOptions): CompiledQuery {\n let query = this.db.selectFrom(this.getTableName(table));\n\n // Apply WHERE clause\n const whereQuery = options.where;\n if (whereQuery) {\n query = query.where((eb) => this.buildWhereClause(whereQuery, eb, table));\n }\n\n // Apply OFFSET\n if (options.offset !== undefined) {\n query = this.applyOffset(query, options.offset);\n }\n\n // Apply LIMIT\n if (options.limit !== undefined) {\n query = this.applyLimit(query, options.limit);\n }\n\n // Apply ORDER BY\n if (options.orderBy) {\n for (const [col, mode] of options.orderBy) {\n query = query.orderBy(fullSQLName(col, this.mapper), mode);\n }\n }\n\n // Build SELECT with joins\n const selectBuilder = extendSelect(options.select);\n const mappedSelect: string[] = [];\n\n // Process joins if provided\n if (options.join && options.join.length > 0) {\n query = this.processJoins(query, options.join, table, this.getTableName(table), mappedSelect);\n }\n\n const compiledSelect = selectBuilder.compile();\n mappedSelect.push(\n ...mapSelect(compiledSelect.result, table, { tableName: this.getTableName(table) }),\n );\n\n return query.select(mappedSelect).compile();\n }\n\n /**\n * Compile a CREATE (INSERT) query.\n */\n compileCreate(table: AnyTable, values: Record<string, unknown>): CompiledQuery {\n // Encode application values to database format (resolves FragnoId, generates defaults, serializes)\n const encodedValues = this.encoder.encodeForDatabase({\n values,\n table,\n generateDefaults: true,\n });\n\n let insert: AnyInsertQueryBuilder = this.db\n .insertInto(this.getTableName(table))\n .values(encodedValues);\n\n // Apply RETURNING if supported\n if (this.driverConfig.supportsReturning) {\n const columns = mapSelect(true, table, { tableName: this.getTableName(table) });\n insert = this.applyReturning(insert, columns);\n }\n\n return insert.compile();\n }\n\n /**\n * Compile an UPDATE query.\n */\n compileUpdate(table: AnyTable, options: UpdateCompilerOptions): CompiledQuery {\n const encoded = this.encoder.encodeForDatabase({\n values: options.set,\n table,\n generateDefaults: false,\n });\n\n // Add version increment (must be added after encoding, as a raw SQL expression)\n const versionCol = table.getVersionColumn();\n encoded[versionCol.name] = sql.raw(`COALESCE(${versionCol.name}, 0) + 1`);\n\n let query = this.db.updateTable(this.getTableName(table)).set(encoded);\n\n if (options.where) {\n query = query.where((eb) => this.buildWhereClause(options.where!, eb, table));\n }\n\n // Apply RETURNING if requested and supported\n // Use sql template tag for literal value (not a column name)\n if (options.returning && this.driverConfig.supportsReturning) {\n return query.returning(sql<number>`1`.as(\"_returned\")).compile();\n }\n\n return query.compile();\n }\n\n /**\n * Compile a DELETE query.\n */\n compileDelete(table: AnyTable, options: DeleteCompilerOptions): CompiledQuery {\n let query = this.db.deleteFrom(this.getTableName(table));\n\n if (options.where) {\n query = query.where((eb) => this.buildWhereClause(options.where!, eb, table));\n }\n\n // Apply RETURNING if requested and supported\n // Use sql template tag for literal value (not a column name)\n if (options.returning && this.driverConfig.supportsReturning) {\n return query.returning(sql<number>`1`.as(\"_returned\")).compile();\n }\n\n return query.compile();\n }\n\n /**\n * Compile a CHECK query (SELECT 1 to verify a row exists).\n */\n compileCheck(table: AnyTable, where: Condition): CompiledQuery {\n const query = this.db\n .selectFrom(this.getTableName(table))\n .select(sql<number>`1`.as(\"exists\"))\n .where((eb) => this.buildWhereClause(where, eb, table))\n .limit(1);\n\n return query.compile();\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"sql-query-compiler.js","names":["aliases: JoinAliasInfo[]","mappedSelect: string[]","insert: AnyInsertQueryBuilder"],"sources":["../../../../src/adapters/generic-sql/query/sql-query-compiler.ts"],"sourcesContent":["import type {\n CompiledQuery,\n Kysely,\n ExpressionBuilder,\n ExpressionWrapper,\n SelectQueryBuilder,\n InsertQueryBuilder,\n} from \"kysely\";\nimport { sql } from \"kysely\";\nimport type { SqlBool } from \"kysely\";\n\nimport type { NamingResolver } from \"../../../naming/sql-naming\";\nimport type { Condition } from \"../../../query/condition-builder\";\nimport type { CompiledJoin } from \"../../../query/orm/orm\";\nimport type { AnyColumn, AnyTable } from \"../../../schema/create\";\nimport type { DriverConfig, SupportedDatabase } from \"../driver-config\";\nimport type { SQLiteStorageMode } from \"../sqlite-storage\";\nimport { UnitOfWorkEncoder } from \"../uow-encoder\";\nimport { mapSelect, extendSelect } from \"./select-builder\";\nimport { buildWhere, fullSQLName } from \"./where-builder\";\n\n/**\n * Type helpers for Kysely query builders.\n *\n * These use `any` for database schema types because at this abstraction layer,\n * we cannot know the specific database schema - we work with generic query\n * compilation that needs to work across any schema.\n */\n\n// oxlint-disable-next-line no-explicit-any\nexport type AnyKysely = Kysely<any>;\n\n// oxlint-disable-next-line no-explicit-any\nexport type AnyExpressionBuilder = ExpressionBuilder<any, any>;\n\n// oxlint-disable-next-line no-explicit-any\nexport type AnyExpressionWrapper = ExpressionWrapper<any, any, SqlBool>;\n\n// oxlint-disable-next-line no-explicit-any\nexport type AnySelectQueryBuilder<O = any> = SelectQueryBuilder<any, any, O>;\n\n// oxlint-disable-next-line no-explicit-any\nexport type AnyInsertQueryBuilder<O = any> = InsertQueryBuilder<any, any, O>;\n\n/**\n * Options for compiling a find operation\n */\nexport interface FindManyCompilerOptions {\n select: true | readonly string[];\n where?: Condition;\n orderBy?: [AnyColumn, \"asc\" | \"desc\"][];\n limit?: number;\n offset?: number;\n join?: CompiledJoin[];\n readTracking?: boolean;\n}\n\n/**\n * Options for compiling a count operation\n */\nexport interface CountCompilerOptions {\n where?: Condition;\n}\n\n/**\n * Options for compiling an update operation\n */\nexport interface UpdateCompilerOptions {\n where?: Condition;\n set: Record<string, unknown>;\n /**\n * Whether to add RETURNING clause to the UPDATE query.\n * Used for version conflict detection when driver supports RETURNING but not affected rows.\n */\n returning?: boolean;\n}\n\n/**\n * Options for compiling a delete operation\n */\nexport interface DeleteCompilerOptions {\n where?: Condition;\n /**\n * Whether to add RETURNING clause to the DELETE query.\n * Used for version conflict detection when driver supports RETURNING but not affected rows.\n */\n returning?: boolean;\n}\n\nexport type JoinAliasInfo = {\n table: AnyTable;\n alias: string;\n};\n\n/**\n * Abstract base class for SQL query compilation.\n *\n * Similar to SQLGenerator for migrations, this class provides a framework\n * for compiling runtime queries with dialect-specific behavior.\n *\n * Each database dialect extends this class and implements the abstract methods\n * to handle database-specific SQL generation (like .limit() vs .top()).\n */\nexport abstract class SQLQueryCompiler {\n protected readonly db: AnyKysely;\n protected readonly driverConfig: DriverConfig;\n protected readonly database: SupportedDatabase;\n protected readonly resolver?: NamingResolver;\n protected readonly encoder: UnitOfWorkEncoder;\n protected readonly sqliteStorageMode?: SQLiteStorageMode;\n\n constructor(\n db: AnyKysely,\n driverConfig: DriverConfig,\n sqliteStorageMode?: SQLiteStorageMode,\n resolver?: NamingResolver,\n ) {\n this.db = db;\n this.driverConfig = driverConfig;\n this.database = driverConfig.databaseType;\n this.resolver = resolver;\n this.sqliteStorageMode = sqliteStorageMode;\n this.encoder = new UnitOfWorkEncoder(driverConfig, db, sqliteStorageMode, resolver);\n }\n\n /**\n * Apply LIMIT clause to a query.\n * Different databases use different syntax (.limit() vs .top()).\n */\n protected abstract applyLimit<T>(query: T & { limit(limit: number): T }, limit: number): T;\n\n /**\n * Apply OFFSET clause to a query.\n * Some databases may not support offset.\n */\n protected abstract applyOffset<T>(query: T & { offset(offset: number): T }, offset: number): T;\n\n /**\n * Apply RETURNING clause to an insert/update query.\n * Returns the query with RETURNING if supported, otherwise returns as-is.\n */\n protected abstract applyReturning<T>(\n query: T & { returning(columns: string[]): T },\n columns: string[],\n ): T;\n\n /**\n * Get the physical table name, applying namespace mapping if provided.\n */\n protected getTableName(table: AnyTable): string {\n return this.resolver ? this.resolver.getTableName(table.name) : table.name;\n }\n\n /**\n * Build WHERE clause from a condition tree.\n */\n protected buildWhereClause(\n condition: Condition,\n eb: AnyExpressionBuilder,\n table: AnyTable,\n tableAlias?: string,\n ) {\n return buildWhere(\n condition,\n eb,\n this.driverConfig,\n this.sqliteStorageMode,\n this.resolver,\n table,\n tableAlias,\n );\n }\n\n /**\n * Process joins recursively to support nested joins.\n */\n protected processJoins<O>(\n query: AnySelectQueryBuilder<O>,\n joins: CompiledJoin[],\n parentTable: AnyTable,\n parentTableName: string,\n mappedSelect: string[],\n parentPath: string = \"\",\n aliasCollector?: JoinAliasInfo[],\n readTracking?: boolean,\n ): AnySelectQueryBuilder<O> {\n let result = query;\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 if (aliasCollector) {\n aliasCollector.push({ table: targetTable, alias: joinName });\n }\n\n const joinSelectBuilder = extendSelect(joinOptions.select);\n if (readTracking) {\n joinSelectBuilder.extend(targetTable.getIdColumn().name);\n }\n const compiledJoinSelect = joinSelectBuilder.compile();\n mappedSelect.push(\n ...mapSelect(compiledJoinSelect.result, targetTable, this.resolver, {\n relation: fullPath, // Use full path with colons for column aliases\n tableName: joinName, // Use underscore version for table name\n }),\n );\n\n result = result.leftJoin(`${this.getTableName(targetTable)} as ${joinName}`, (b) =>\n b.on((eb) => {\n const conditions = [];\n for (const [left, right] of relation.on) {\n const leftCol = parentTable.columns[left];\n const actualLeft =\n leftCol?.role === \"external-id\" ? parentTable.getInternalIdColumn().name : left;\n const actualLeftCol = parentTable.columns[actualLeft];\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}.${\n this.resolver\n ? this.resolver.getColumnName(\n parentTable.name,\n actualLeftCol ? actualLeftCol.name : parentTable.columns[left].name,\n )\n : (actualLeftCol ?? parentTable.columns[left]).name\n }`,\n \"=\",\n eb.ref(\n `${joinName}.${\n this.resolver\n ? this.resolver.getColumnName(\n targetTable.name,\n targetTable.columns[actualRight].name,\n )\n : targetTable.columns[actualRight].name\n }`,\n ),\n ),\n );\n }\n\n if (joinOptions.where) {\n conditions.push(this.buildWhereClause(joinOptions.where, eb, targetTable, joinName));\n }\n\n return eb.and(conditions);\n }),\n );\n\n // Recursively process nested joins with the full path\n if (joinOptions.join && joinOptions.join.length > 0) {\n result = this.processJoins(\n result,\n joinOptions.join,\n targetTable,\n joinName,\n mappedSelect,\n fullPath,\n aliasCollector,\n readTracking,\n );\n }\n }\n\n return result;\n }\n\n /**\n * Build a select query with joins applied, returning a list of table aliases used.\n * Intended for conflict checks that need to mirror the join tree from queries.\n */\n buildJoinQuery(\n table: AnyTable,\n options: { where?: Condition; join?: CompiledJoin[] },\n ): {\n query: AnySelectQueryBuilder;\n aliases: JoinAliasInfo[];\n } {\n const tableName = this.getTableName(table);\n let query = this.db.selectFrom(tableName);\n const aliases: JoinAliasInfo[] = [{ table, alias: tableName }];\n\n if (options.where) {\n query = query.where((eb) => this.buildWhereClause(options.where!, eb, table));\n }\n\n if (options.join && options.join.length > 0) {\n const mappedSelect: string[] = [];\n query = this.processJoins(query, options.join, table, tableName, mappedSelect, \"\", aliases);\n }\n\n return { query, aliases };\n }\n\n /**\n * Compile a COUNT query.\n */\n compileCount(table: AnyTable, options: CountCompilerOptions): CompiledQuery {\n let query = this.db\n .selectFrom(this.getTableName(table))\n .select(this.db.fn.countAll().as(\"count\"));\n\n if (options.where) {\n query = query.where((b) => this.buildWhereClause(options.where!, b, table));\n }\n\n return query.compile();\n }\n\n /**\n * Compile a FIND MANY query.\n */\n compileFindMany(table: AnyTable, options: FindManyCompilerOptions): CompiledQuery {\n let query = this.db.selectFrom(this.getTableName(table));\n\n // Apply WHERE clause\n const whereQuery = options.where;\n if (whereQuery) {\n query = query.where((eb) => this.buildWhereClause(whereQuery, eb, table));\n }\n\n // Apply OFFSET\n if (options.offset !== undefined) {\n query = this.applyOffset(query, options.offset);\n }\n\n // Apply LIMIT\n if (options.limit !== undefined) {\n query = this.applyLimit(query, options.limit);\n }\n\n // Apply ORDER BY\n if (options.orderBy) {\n for (const [col, mode] of options.orderBy) {\n query = query.orderBy(fullSQLName(col, this.resolver), mode);\n }\n }\n\n // Build SELECT with joins\n const selectBuilder = extendSelect(options.select);\n if (options.readTracking) {\n selectBuilder.extend(table.getIdColumn().name);\n }\n const mappedSelect: string[] = [];\n\n // Process joins if provided\n if (options.join && options.join.length > 0) {\n query = this.processJoins(\n query,\n options.join,\n table,\n this.getTableName(table),\n mappedSelect,\n \"\",\n undefined,\n options.readTracking,\n );\n }\n\n const compiledSelect = selectBuilder.compile();\n mappedSelect.push(\n ...mapSelect(compiledSelect.result, table, this.resolver, {\n tableName: this.getTableName(table),\n }),\n );\n\n return query.select(mappedSelect).compile();\n }\n\n /**\n * Compile a CREATE (INSERT) query.\n */\n compileCreate(table: AnyTable, values: Record<string, unknown>): CompiledQuery {\n // Encode application values to database format (resolves FragnoId, generates defaults, serializes)\n const encodedValues = this.encoder.encodeForDatabase({\n values,\n table,\n generateDefaults: true,\n });\n\n let insert: AnyInsertQueryBuilder = this.db\n .insertInto(this.getTableName(table))\n .values(encodedValues);\n\n // Apply RETURNING if supported\n if (this.driverConfig.supportsReturning) {\n const columns = mapSelect(true, table, this.resolver, {\n tableName: this.getTableName(table),\n });\n insert = this.applyReturning(insert, columns);\n }\n\n return insert.compile();\n }\n\n /**\n * Compile an UPDATE query.\n */\n compileUpdate(table: AnyTable, options: UpdateCompilerOptions): CompiledQuery {\n const encoded = this.encoder.encodeForDatabase({\n values: options.set,\n table,\n generateDefaults: false,\n });\n\n // Add version increment (must be added after encoding, as a raw SQL expression)\n const versionCol = table.getVersionColumn();\n const versionColumnName = this.resolver\n ? this.resolver.getColumnName(table.name, versionCol.name)\n : versionCol.name;\n encoded[versionColumnName] = sql`coalesce(${sql.ref(versionColumnName)}, 0) + 1`;\n\n let query = this.db.updateTable(this.getTableName(table)).set(encoded);\n\n if (options.where) {\n query = query.where((eb) => this.buildWhereClause(options.where!, eb, table));\n }\n\n // Apply RETURNING if requested and supported\n // Use sql template tag for literal value (not a column name)\n if (options.returning && this.driverConfig.supportsReturning) {\n return query.returning(sql<number>`1`.as(\"_returned\")).compile();\n }\n\n return query.compile();\n }\n\n /**\n * Compile a DELETE query.\n */\n compileDelete(table: AnyTable, options: DeleteCompilerOptions): CompiledQuery {\n let query = this.db.deleteFrom(this.getTableName(table));\n\n if (options.where) {\n query = query.where((eb) => this.buildWhereClause(options.where!, eb, table));\n }\n\n // Apply RETURNING if requested and supported\n // Use sql template tag for literal value (not a column name)\n if (options.returning && this.driverConfig.supportsReturning) {\n return query.returning(sql<number>`1`.as(\"_returned\")).compile();\n }\n\n return query.compile();\n }\n\n /**\n * Compile a CHECK query (SELECT 1 to verify a row exists).\n */\n compileCheck(table: AnyTable, where: Condition): CompiledQuery {\n const query = this.db\n .selectFrom(this.getTableName(table))\n .select(sql<number>`1`.as(\"exists\"))\n .where((eb) => this.buildWhereClause(where, eb, table))\n .limit(1);\n\n return query.compile();\n }\n}\n"],"mappings":"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"}