@fragno-dev/db 0.1.15 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (407) hide show
  1. package/.turbo/turbo-build.log +242 -179
  2. package/CHANGELOG.md +23 -0
  3. package/README.md +123 -8
  4. package/dist/adapters/adapters.d.ts +5 -5
  5. package/dist/adapters/adapters.d.ts.map +1 -1
  6. package/dist/adapters/adapters.js.map +1 -1
  7. package/dist/adapters/drizzle/drizzle-adapter.d.ts +6 -21
  8. package/dist/adapters/drizzle/drizzle-adapter.d.ts.map +1 -1
  9. package/dist/adapters/drizzle/drizzle-adapter.js +7 -54
  10. package/dist/adapters/drizzle/drizzle-adapter.js.map +1 -1
  11. package/dist/adapters/drizzle/generate.d.ts +3 -0
  12. package/dist/adapters/drizzle/generate.d.ts.map +1 -1
  13. package/dist/adapters/drizzle/generate.js +36 -28
  14. package/dist/adapters/drizzle/generate.js.map +1 -1
  15. package/dist/adapters/generic-sql/driver-config.d.ts +74 -0
  16. package/dist/adapters/generic-sql/driver-config.d.ts.map +1 -0
  17. package/dist/adapters/generic-sql/driver-config.js +94 -0
  18. package/dist/adapters/generic-sql/driver-config.js.map +1 -0
  19. package/dist/adapters/generic-sql/generic-sql-adapter.d.ts +43 -0
  20. package/dist/adapters/generic-sql/generic-sql-adapter.d.ts.map +1 -0
  21. package/dist/adapters/generic-sql/generic-sql-adapter.js +87 -0
  22. package/dist/adapters/generic-sql/generic-sql-adapter.js.map +1 -0
  23. package/dist/adapters/generic-sql/generic-sql-uow-executor.js +67 -0
  24. package/dist/adapters/generic-sql/generic-sql-uow-executor.js.map +1 -0
  25. package/dist/adapters/generic-sql/migration/cold-kysely.js +33 -0
  26. package/dist/adapters/generic-sql/migration/cold-kysely.js.map +1 -0
  27. package/dist/adapters/generic-sql/migration/dialect/mysql.js +60 -0
  28. package/dist/adapters/generic-sql/migration/dialect/mysql.js.map +1 -0
  29. package/dist/adapters/generic-sql/migration/dialect/postgres.js +59 -0
  30. package/dist/adapters/generic-sql/migration/dialect/postgres.js.map +1 -0
  31. package/dist/adapters/generic-sql/migration/dialect/sqlite.js +96 -0
  32. package/dist/adapters/generic-sql/migration/dialect/sqlite.js.map +1 -0
  33. package/dist/adapters/generic-sql/migration/executor.d.ts +15 -0
  34. package/dist/adapters/generic-sql/migration/executor.d.ts.map +1 -0
  35. package/dist/adapters/generic-sql/migration/executor.js +18 -0
  36. package/dist/adapters/generic-sql/migration/executor.js.map +1 -0
  37. package/dist/adapters/generic-sql/migration/prepared-migrations.d.ts +66 -0
  38. package/dist/adapters/generic-sql/migration/prepared-migrations.d.ts.map +1 -0
  39. package/dist/adapters/generic-sql/migration/prepared-migrations.js +68 -0
  40. package/dist/adapters/generic-sql/migration/prepared-migrations.js.map +1 -0
  41. package/dist/adapters/generic-sql/migration/sql-generator.js +212 -0
  42. package/dist/adapters/generic-sql/migration/sql-generator.js.map +1 -0
  43. package/dist/adapters/generic-sql/query/create-sql-query-compiler.js +32 -0
  44. package/dist/adapters/generic-sql/query/create-sql-query-compiler.js.map +1 -0
  45. package/dist/adapters/generic-sql/query/cursor-utils.js +37 -0
  46. package/dist/adapters/generic-sql/query/cursor-utils.js.map +1 -0
  47. package/dist/adapters/generic-sql/query/dialect/mysql.js +33 -0
  48. package/dist/adapters/generic-sql/query/dialect/mysql.js.map +1 -0
  49. package/dist/adapters/generic-sql/query/dialect/postgres.js +32 -0
  50. package/dist/adapters/generic-sql/query/dialect/postgres.js.map +1 -0
  51. package/dist/adapters/generic-sql/query/dialect/sqlite.js +32 -0
  52. package/dist/adapters/generic-sql/query/dialect/sqlite.js.map +1 -0
  53. package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js +152 -0
  54. package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js.map +1 -0
  55. package/dist/adapters/generic-sql/query/select-builder.js +69 -0
  56. package/dist/adapters/generic-sql/query/select-builder.js.map +1 -0
  57. package/dist/adapters/generic-sql/query/sql-query-compiler.js +145 -0
  58. package/dist/adapters/generic-sql/query/sql-query-compiler.js.map +1 -0
  59. package/dist/adapters/generic-sql/query/where-builder.js +129 -0
  60. package/dist/adapters/generic-sql/query/where-builder.js.map +1 -0
  61. package/dist/adapters/generic-sql/result-interpreter.js +74 -0
  62. package/dist/adapters/generic-sql/result-interpreter.js.map +1 -0
  63. package/dist/adapters/generic-sql/uow-decoder.js +105 -0
  64. package/dist/adapters/generic-sql/uow-decoder.js.map +1 -0
  65. package/dist/adapters/generic-sql/uow-encoder.js +93 -0
  66. package/dist/adapters/generic-sql/uow-encoder.js.map +1 -0
  67. package/dist/adapters/kysely/kysely-adapter.d.ts +5 -18
  68. package/dist/adapters/kysely/kysely-adapter.d.ts.map +1 -1
  69. package/dist/adapters/kysely/kysely-adapter.js +6 -165
  70. package/dist/adapters/kysely/kysely-adapter.js.map +1 -1
  71. package/dist/adapters/{drizzle/drizzle-query.js → shared/from-unit-of-work-compiler.js} +47 -61
  72. package/dist/adapters/shared/from-unit-of-work-compiler.js.map +1 -0
  73. package/dist/adapters/{drizzle/shared.d.ts → shared/table-name-mapper.d.ts} +2 -4
  74. package/dist/adapters/shared/table-name-mapper.d.ts.map +1 -0
  75. package/dist/adapters/shared/table-name-mapper.js +43 -0
  76. package/dist/adapters/shared/table-name-mapper.js.map +1 -0
  77. package/dist/adapters/shared/uow-operation-compiler.js +105 -0
  78. package/dist/adapters/shared/uow-operation-compiler.js.map +1 -0
  79. package/dist/db-fragment-definition-builder.d.ts +53 -19
  80. package/dist/db-fragment-definition-builder.d.ts.map +1 -1
  81. package/dist/db-fragment-definition-builder.js +89 -19
  82. package/dist/db-fragment-definition-builder.js.map +1 -1
  83. package/dist/fragments/internal-fragment.d.ts +39 -5
  84. package/dist/fragments/internal-fragment.d.ts.map +1 -1
  85. package/dist/fragments/internal-fragment.js +82 -10
  86. package/dist/fragments/internal-fragment.js.map +1 -1
  87. package/dist/hooks/hooks.d.ts +51 -0
  88. package/dist/hooks/hooks.d.ts.map +1 -0
  89. package/dist/hooks/hooks.js +88 -0
  90. package/dist/hooks/hooks.js.map +1 -0
  91. package/dist/migration-engine/generation-engine.d.ts +0 -2
  92. package/dist/migration-engine/generation-engine.d.ts.map +1 -1
  93. package/dist/migration-engine/generation-engine.js +23 -61
  94. package/dist/migration-engine/generation-engine.js.map +1 -1
  95. package/dist/mod.d.ts +34 -10
  96. package/dist/mod.d.ts.map +1 -1
  97. package/dist/mod.js +47 -16
  98. package/dist/mod.js.map +1 -1
  99. package/dist/node_modules/.pnpm/{rou3@0.7.8 → rou3@0.7.10}/node_modules/rou3/dist/index.js +1 -1
  100. package/dist/node_modules/.pnpm/rou3@0.7.10/node_modules/rou3/dist/index.js.map +1 -0
  101. package/dist/packages/fragno/dist/api/fragment-instantiator.js +69 -31
  102. package/dist/packages/fragno/dist/api/fragment-instantiator.js.map +1 -1
  103. package/dist/query/column-defaults.js +27 -0
  104. package/dist/query/column-defaults.js.map +1 -0
  105. package/dist/query/cursor.d.ts +4 -4
  106. package/dist/query/cursor.d.ts.map +1 -1
  107. package/dist/query/cursor.js +8 -6
  108. package/dist/query/cursor.js.map +1 -1
  109. package/dist/query/orm/orm.d.ts +1 -1
  110. package/dist/query/orm/orm.js.map +1 -1
  111. package/dist/query/serialize/create-sql-serializer.js +30 -0
  112. package/dist/query/serialize/create-sql-serializer.js.map +1 -0
  113. package/dist/query/serialize/dialect/mysql-serializer.js +87 -0
  114. package/dist/query/serialize/dialect/mysql-serializer.js.map +1 -0
  115. package/dist/query/serialize/dialect/postgres-serializer.js +80 -0
  116. package/dist/query/serialize/dialect/postgres-serializer.js.map +1 -0
  117. package/dist/query/serialize/dialect/sqlite-serializer.js +93 -0
  118. package/dist/query/serialize/dialect/sqlite-serializer.js.map +1 -0
  119. package/dist/query/serialize/sql-serializer.js +67 -0
  120. package/dist/query/serialize/sql-serializer.js.map +1 -0
  121. package/dist/query/{query.d.ts → simple-query-interface.d.ts} +5 -5
  122. package/dist/query/simple-query-interface.d.ts.map +1 -0
  123. package/dist/query/{execute-unit-of-work.d.ts → unit-of-work/execute-unit-of-work.d.ts} +13 -3
  124. package/dist/query/unit-of-work/execute-unit-of-work.d.ts.map +1 -0
  125. package/dist/query/{execute-unit-of-work.js → unit-of-work/execute-unit-of-work.js} +17 -4
  126. package/dist/query/unit-of-work/execute-unit-of-work.js.map +1 -0
  127. package/dist/query/{retry-policy.d.ts → unit-of-work/retry-policy.d.ts} +1 -1
  128. package/dist/query/unit-of-work/retry-policy.d.ts.map +1 -0
  129. package/dist/query/{retry-policy.js → unit-of-work/retry-policy.js} +1 -1
  130. package/dist/query/unit-of-work/retry-policy.js.map +1 -0
  131. package/dist/query/{unit-of-work.d.ts → unit-of-work/unit-of-work.d.ts} +51 -18
  132. package/dist/query/unit-of-work/unit-of-work.d.ts.map +1 -0
  133. package/dist/query/{unit-of-work.js → unit-of-work/unit-of-work.js} +58 -11
  134. package/dist/query/unit-of-work/unit-of-work.js.map +1 -0
  135. package/dist/query/value-decoding.js +71 -0
  136. package/dist/query/value-decoding.js.map +1 -0
  137. package/dist/query/value-encoding.js +124 -0
  138. package/dist/query/value-encoding.js.map +1 -0
  139. package/dist/schema/create.d.ts +3 -0
  140. package/dist/schema/create.d.ts.map +1 -1
  141. package/dist/schema/create.js +4 -0
  142. package/dist/schema/create.js.map +1 -1
  143. package/dist/schema/type-conversion/create-sql-type-mapper.js +29 -0
  144. package/dist/schema/type-conversion/create-sql-type-mapper.js.map +1 -0
  145. package/dist/schema/type-conversion/dialect/mysql.js +57 -0
  146. package/dist/schema/type-conversion/dialect/mysql.js.map +1 -0
  147. package/dist/schema/type-conversion/dialect/postgres.js +56 -0
  148. package/dist/schema/type-conversion/dialect/postgres.js.map +1 -0
  149. package/dist/schema/type-conversion/dialect/sqlite.js +52 -0
  150. package/dist/schema/type-conversion/dialect/sqlite.js.map +1 -0
  151. package/dist/schema/type-conversion/type-mapping.js +63 -0
  152. package/dist/schema/type-conversion/type-mapping.js.map +1 -0
  153. package/dist/sql-driver/connection/connection-provider.d.ts +13 -0
  154. package/dist/sql-driver/connection/connection-provider.d.ts.map +1 -0
  155. package/dist/sql-driver/connection/connection-provider.js +19 -0
  156. package/dist/sql-driver/connection/connection-provider.js.map +1 -0
  157. package/dist/sql-driver/connection/single-connection-provider.js +23 -0
  158. package/dist/sql-driver/connection/single-connection-provider.js.map +1 -0
  159. package/dist/sql-driver/dialect-adapter/dialect-adapter.d.ts +7 -0
  160. package/dist/sql-driver/dialect-adapter/dialect-adapter.d.ts.map +1 -0
  161. package/dist/sql-driver/dialects/dialects.d.ts +2 -0
  162. package/dist/sql-driver/dialects/dialects.js +3 -0
  163. package/dist/sql-driver/dialects/durable-object-dialect.d.ts +72 -0
  164. package/dist/sql-driver/dialects/durable-object-dialect.d.ts.map +1 -0
  165. package/dist/sql-driver/dialects/durable-object-dialect.js +130 -0
  166. package/dist/sql-driver/dialects/durable-object-dialect.js.map +1 -0
  167. package/dist/sql-driver/driver/runtime-driver.d.ts +23 -0
  168. package/dist/sql-driver/driver/runtime-driver.d.ts.map +1 -0
  169. package/dist/sql-driver/driver/runtime-driver.js +56 -0
  170. package/dist/sql-driver/driver/runtime-driver.js.map +1 -0
  171. package/dist/sql-driver/query-executor/default-query-executor.js +26 -0
  172. package/dist/sql-driver/query-executor/default-query-executor.js.map +1 -0
  173. package/dist/sql-driver/query-executor/plugin.d.ts +17 -0
  174. package/dist/sql-driver/query-executor/plugin.d.ts.map +1 -0
  175. package/dist/sql-driver/query-executor/query-executor-base.js +25 -0
  176. package/dist/sql-driver/query-executor/query-executor-base.js.map +1 -0
  177. package/dist/sql-driver/query-executor/query-executor.d.ts +36 -0
  178. package/dist/sql-driver/query-executor/query-executor.d.ts.map +1 -0
  179. package/dist/sql-driver/sql-driver-adapter.d.ts +29 -0
  180. package/dist/sql-driver/sql-driver-adapter.d.ts.map +1 -0
  181. package/dist/sql-driver/sql-driver-adapter.js +68 -0
  182. package/dist/sql-driver/sql-driver-adapter.js.map +1 -0
  183. package/dist/sql-driver/sql-driver.d.ts +38 -0
  184. package/dist/sql-driver/sql-driver.d.ts.map +1 -0
  185. package/dist/sql-driver/sql-driver.js +1 -0
  186. package/dist/sql-driver/sql.js +50 -0
  187. package/dist/sql-driver/sql.js.map +1 -0
  188. package/dist/with-database.d.ts +6 -2
  189. package/dist/with-database.d.ts.map +1 -1
  190. package/dist/with-database.js +1 -1
  191. package/dist/with-database.js.map +1 -1
  192. package/package.json +37 -10
  193. package/src/adapters/adapters.ts +8 -5
  194. package/src/adapters/drizzle/drizzle-adapter-pglite.test.ts +60 -169
  195. package/src/adapters/drizzle/{drizzle-adapter-sqlite.test.ts → drizzle-adapter-sqlite3.test.ts} +31 -55
  196. package/src/adapters/drizzle/drizzle-adapter.ts +15 -107
  197. package/src/adapters/drizzle/generate.test.ts +2 -2
  198. package/src/adapters/drizzle/generate.ts +78 -34
  199. package/src/adapters/drizzle/migrate-drizzle.test.ts +19 -0
  200. package/src/adapters/drizzle/shared.ts +0 -34
  201. package/src/adapters/drizzle/test-utils.ts +3 -3
  202. package/src/adapters/generic-sql/README.md +14 -0
  203. package/src/adapters/generic-sql/driver-config.ts +144 -0
  204. package/src/adapters/generic-sql/generic-sql-adapter.test.ts +50 -0
  205. package/src/adapters/generic-sql/generic-sql-adapter.ts +146 -0
  206. package/src/adapters/generic-sql/generic-sql-uow-executor.ts +130 -0
  207. package/src/adapters/generic-sql/migration/cold-kysely.ts +55 -0
  208. package/src/adapters/{kysely/migration/execute-mysql.test.ts → generic-sql/migration/dialect/mysql.test.ts} +342 -484
  209. package/src/adapters/generic-sql/migration/dialect/mysql.ts +104 -0
  210. package/src/adapters/generic-sql/migration/dialect/postgres.test.ts +1008 -0
  211. package/src/adapters/generic-sql/migration/dialect/postgres.ts +113 -0
  212. package/src/adapters/{kysely/migration/execute-sqlite.test.ts → generic-sql/migration/dialect/sqlite.test.ts} +307 -510
  213. package/src/adapters/generic-sql/migration/dialect/sqlite.ts +189 -0
  214. package/src/adapters/generic-sql/migration/executor.ts +33 -0
  215. package/src/adapters/generic-sql/migration/prepared-migrations.test.ts +661 -0
  216. package/src/adapters/generic-sql/migration/prepared-migrations.ts +214 -0
  217. package/src/adapters/generic-sql/migration/sql-generator.ts +413 -0
  218. package/src/adapters/generic-sql/query/create-sql-query-compiler.ts +36 -0
  219. package/src/adapters/generic-sql/query/cursor-utils.ts +56 -0
  220. package/src/adapters/generic-sql/query/dialect/mysql.ts +34 -0
  221. package/src/adapters/generic-sql/query/dialect/postgres.ts +32 -0
  222. package/src/adapters/generic-sql/query/dialect/sqlite.ts +32 -0
  223. package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.test.ts +1568 -0
  224. package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.ts +314 -0
  225. package/src/adapters/generic-sql/query/select-builder.test.ts +256 -0
  226. package/src/adapters/generic-sql/query/select-builder.ts +137 -0
  227. package/src/adapters/generic-sql/query/sql-query-compiler.test.ts +195 -0
  228. package/src/adapters/generic-sql/query/sql-query-compiler.ts +367 -0
  229. package/src/adapters/generic-sql/query/where-builder.test.ts +744 -0
  230. package/src/adapters/generic-sql/query/where-builder.ts +211 -0
  231. package/src/adapters/generic-sql/result-interpreter.ts +102 -0
  232. package/src/adapters/generic-sql/test/generic-drizzle-adapter-sqlite3.test.ts +899 -0
  233. package/src/adapters/generic-sql/uow-decoder.test.ts +399 -0
  234. package/src/adapters/generic-sql/uow-decoder.ts +152 -0
  235. package/src/adapters/generic-sql/uow-encoder.test.ts +183 -0
  236. package/src/adapters/generic-sql/uow-encoder.ts +131 -0
  237. package/src/adapters/kysely/kysely-adapter-pglite.test.ts +26 -76
  238. package/src/adapters/kysely/{kysely-adapter-sqlite.test.ts → kysely-adapter-sqlocal.test.ts} +76 -17
  239. package/src/adapters/kysely/kysely-adapter.ts +10 -250
  240. package/src/adapters/{drizzle/drizzle-query.ts → shared/from-unit-of-work-compiler.ts} +110 -104
  241. package/src/adapters/shared/table-name-mapper.ts +50 -0
  242. package/src/adapters/shared/uow-operation-compiler.ts +211 -0
  243. package/src/db-fragment-definition-builder.test.ts +2 -2
  244. package/src/db-fragment-definition-builder.ts +281 -50
  245. package/src/db-fragment-instantiator.test.ts +78 -2
  246. package/src/db-fragment-integration.test.ts +14 -16
  247. package/src/fragments/internal-fragment.test.ts +434 -45
  248. package/src/fragments/internal-fragment.ts +184 -20
  249. package/src/hooks/hooks.test.ts +575 -0
  250. package/src/hooks/hooks.ts +179 -0
  251. package/src/migration-engine/generation-engine.test.ts +44 -54
  252. package/src/migration-engine/generation-engine.ts +48 -94
  253. package/src/mod.ts +117 -29
  254. package/src/query/column-defaults.ts +49 -0
  255. package/src/query/cursor.test.ts +31 -6
  256. package/src/query/cursor.ts +11 -7
  257. package/src/query/orm/orm.ts +1 -1
  258. package/src/query/query-type.test.ts +9 -9
  259. package/src/query/serialize/create-sql-serializer.ts +34 -0
  260. package/src/query/serialize/dialect/mysql-serializer.ts +142 -0
  261. package/src/query/serialize/dialect/postgres-serializer.ts +129 -0
  262. package/src/query/serialize/dialect/sqlite-serializer.test.ts +251 -0
  263. package/src/query/serialize/dialect/sqlite-serializer.ts +156 -0
  264. package/src/query/serialize/sql-serializer.ts +143 -0
  265. package/src/query/{query.ts → simple-query-interface.ts} +2 -2
  266. package/src/query/{execute-unit-of-work.test.ts → unit-of-work/execute-unit-of-work.test.ts} +16 -16
  267. package/src/query/{execute-unit-of-work.ts → unit-of-work/execute-unit-of-work.ts} +49 -8
  268. package/src/query/{unit-of-work-coordinator.test.ts → unit-of-work/unit-of-work-coordinator.test.ts} +41 -43
  269. package/src/query/{unit-of-work-types.test.ts → unit-of-work/unit-of-work-types.test.ts} +5 -3
  270. package/src/query/{unit-of-work.test.ts → unit-of-work/unit-of-work.test.ts} +100 -9
  271. package/src/query/{unit-of-work.ts → unit-of-work/unit-of-work.ts} +135 -32
  272. package/src/query/{result-transform.test.ts → value-decoding.test.ts} +45 -427
  273. package/src/query/value-decoding.ts +113 -0
  274. package/src/query/value-encoding.test.ts +390 -0
  275. package/src/query/value-encoding.ts +168 -0
  276. package/src/schema/create.test.ts +5 -1
  277. package/src/schema/create.ts +5 -0
  278. package/src/schema/serialize.test.ts +165 -407
  279. package/src/schema/type-conversion/create-sql-type-mapper.ts +28 -0
  280. package/src/schema/type-conversion/dialect/mysql.ts +64 -0
  281. package/src/schema/type-conversion/dialect/postgres.ts +62 -0
  282. package/src/schema/type-conversion/dialect/sqlite.ts +63 -0
  283. package/src/schema/type-conversion/type-mapping.test.ts +137 -0
  284. package/src/schema/type-conversion/type-mapping.ts +153 -0
  285. package/src/shared/connection-pool.ts +5 -5
  286. package/src/sql-driver/better-sqlite3.test.ts +126 -0
  287. package/src/sql-driver/connection/connection-provider.ts +27 -0
  288. package/src/sql-driver/connection/single-connection-provider.ts +42 -0
  289. package/src/sql-driver/dialect-adapter/dialect-adapter.ts +9 -0
  290. package/src/sql-driver/dialect-adapter/sqlite-dialect-adapter.ts +7 -0
  291. package/src/sql-driver/dialects/dialects.ts +1 -0
  292. package/src/sql-driver/dialects/durable-object-dialect.ts +260 -0
  293. package/src/sql-driver/driver/runtime-driver.ts +91 -0
  294. package/src/sql-driver/query-executor/default-query-executor.ts +38 -0
  295. package/src/sql-driver/query-executor/plugin.ts +22 -0
  296. package/src/sql-driver/query-executor/query-executor-base.ts +53 -0
  297. package/src/sql-driver/query-executor/query-executor.ts +44 -0
  298. package/src/sql-driver/sql-driver-adapter.ts +96 -0
  299. package/src/sql-driver/sql-driver.ts +53 -0
  300. package/src/sql-driver/sql.ts +57 -0
  301. package/src/sql-driver/sqlocal.test.ts +117 -0
  302. package/src/with-database.ts +35 -23
  303. package/tsdown.config.ts +7 -2
  304. package/dist/adapters/drizzle/drizzle-connection-pool.js +0 -40
  305. package/dist/adapters/drizzle/drizzle-connection-pool.js.map +0 -1
  306. package/dist/adapters/drizzle/drizzle-query.d.ts +0 -23
  307. package/dist/adapters/drizzle/drizzle-query.d.ts.map +0 -1
  308. package/dist/adapters/drizzle/drizzle-query.js.map +0 -1
  309. package/dist/adapters/drizzle/drizzle-uow-compiler.d.ts +0 -10
  310. package/dist/adapters/drizzle/drizzle-uow-compiler.d.ts.map +0 -1
  311. package/dist/adapters/drizzle/drizzle-uow-compiler.js +0 -334
  312. package/dist/adapters/drizzle/drizzle-uow-compiler.js.map +0 -1
  313. package/dist/adapters/drizzle/drizzle-uow-decoder.js +0 -123
  314. package/dist/adapters/drizzle/drizzle-uow-decoder.js.map +0 -1
  315. package/dist/adapters/drizzle/drizzle-uow-executor.js +0 -160
  316. package/dist/adapters/drizzle/drizzle-uow-executor.js.map +0 -1
  317. package/dist/adapters/drizzle/join-column-utils.js +0 -28
  318. package/dist/adapters/drizzle/join-column-utils.js.map +0 -1
  319. package/dist/adapters/drizzle/shared.d.ts.map +0 -1
  320. package/dist/adapters/drizzle/shared.js +0 -35
  321. package/dist/adapters/drizzle/shared.js.map +0 -1
  322. package/dist/adapters/kysely/kysely-connection-pool.js +0 -41
  323. package/dist/adapters/kysely/kysely-connection-pool.js.map +0 -1
  324. package/dist/adapters/kysely/kysely-query-builder.js +0 -321
  325. package/dist/adapters/kysely/kysely-query-builder.js.map +0 -1
  326. package/dist/adapters/kysely/kysely-query-compiler.js +0 -67
  327. package/dist/adapters/kysely/kysely-query-compiler.js.map +0 -1
  328. package/dist/adapters/kysely/kysely-query.d.ts +0 -23
  329. package/dist/adapters/kysely/kysely-query.d.ts.map +0 -1
  330. package/dist/adapters/kysely/kysely-query.js +0 -230
  331. package/dist/adapters/kysely/kysely-query.js.map +0 -1
  332. package/dist/adapters/kysely/kysely-shared.d.ts +0 -14
  333. package/dist/adapters/kysely/kysely-shared.d.ts.map +0 -1
  334. package/dist/adapters/kysely/kysely-shared.js +0 -33
  335. package/dist/adapters/kysely/kysely-shared.js.map +0 -1
  336. package/dist/adapters/kysely/kysely-uow-compiler.js +0 -193
  337. package/dist/adapters/kysely/kysely-uow-compiler.js.map +0 -1
  338. package/dist/adapters/kysely/kysely-uow-executor.js +0 -93
  339. package/dist/adapters/kysely/kysely-uow-executor.js.map +0 -1
  340. package/dist/adapters/kysely/migration/execute-base.js +0 -128
  341. package/dist/adapters/kysely/migration/execute-base.js.map +0 -1
  342. package/dist/adapters/kysely/migration/execute-factory.js +0 -34
  343. package/dist/adapters/kysely/migration/execute-factory.js.map +0 -1
  344. package/dist/adapters/kysely/migration/execute-mssql.js +0 -112
  345. package/dist/adapters/kysely/migration/execute-mssql.js.map +0 -1
  346. package/dist/adapters/kysely/migration/execute-mysql.js +0 -93
  347. package/dist/adapters/kysely/migration/execute-mysql.js.map +0 -1
  348. package/dist/adapters/kysely/migration/execute-postgres.js +0 -104
  349. package/dist/adapters/kysely/migration/execute-postgres.js.map +0 -1
  350. package/dist/adapters/kysely/migration/execute-sqlite.js +0 -123
  351. package/dist/adapters/kysely/migration/execute-sqlite.js.map +0 -1
  352. package/dist/adapters/kysely/migration/execute.js +0 -34
  353. package/dist/adapters/kysely/migration/execute.js.map +0 -1
  354. package/dist/migration-engine/create.d.ts +0 -37
  355. package/dist/migration-engine/create.d.ts.map +0 -1
  356. package/dist/migration-engine/create.js +0 -58
  357. package/dist/migration-engine/create.js.map +0 -1
  358. package/dist/migration-engine/shared.d.ts +0 -112
  359. package/dist/migration-engine/shared.d.ts.map +0 -1
  360. package/dist/node_modules/.pnpm/rou3@0.7.8/node_modules/rou3/dist/index.js.map +0 -1
  361. package/dist/query/execute-unit-of-work.d.ts.map +0 -1
  362. package/dist/query/execute-unit-of-work.js.map +0 -1
  363. package/dist/query/query.d.ts.map +0 -1
  364. package/dist/query/result-transform.js +0 -170
  365. package/dist/query/result-transform.js.map +0 -1
  366. package/dist/query/retry-policy.d.ts.map +0 -1
  367. package/dist/query/retry-policy.js.map +0 -1
  368. package/dist/query/unit-of-work.d.ts.map +0 -1
  369. package/dist/query/unit-of-work.js.map +0 -1
  370. package/dist/schema/serialize.js +0 -111
  371. package/dist/schema/serialize.js.map +0 -1
  372. package/src/adapters/drizzle/drizzle-adapter.test.ts +0 -122
  373. package/src/adapters/drizzle/drizzle-connection-pool.ts +0 -66
  374. package/src/adapters/drizzle/drizzle-query.test.ts +0 -499
  375. package/src/adapters/drizzle/drizzle-uow-compiler-mysql.test.ts +0 -1442
  376. package/src/adapters/drizzle/drizzle-uow-compiler-sqlite.test.ts +0 -1414
  377. package/src/adapters/drizzle/drizzle-uow-compiler.test.ts +0 -1400
  378. package/src/adapters/drizzle/drizzle-uow-compiler.ts +0 -677
  379. package/src/adapters/drizzle/drizzle-uow-decoder.ts +0 -228
  380. package/src/adapters/drizzle/drizzle-uow-executor.ts +0 -309
  381. package/src/adapters/drizzle/join-column-utils.test.ts +0 -79
  382. package/src/adapters/drizzle/join-column-utils.ts +0 -39
  383. package/src/adapters/kysely/kysely-connection-pool.ts +0 -70
  384. package/src/adapters/kysely/kysely-query-builder.test.ts +0 -1344
  385. package/src/adapters/kysely/kysely-query-builder.ts +0 -666
  386. package/src/adapters/kysely/kysely-query-compiler.ts +0 -127
  387. package/src/adapters/kysely/kysely-query.test.ts +0 -498
  388. package/src/adapters/kysely/kysely-query.ts +0 -399
  389. package/src/adapters/kysely/kysely-shared.ts +0 -57
  390. package/src/adapters/kysely/kysely-uow-compiler.test.ts +0 -986
  391. package/src/adapters/kysely/kysely-uow-compiler.ts +0 -350
  392. package/src/adapters/kysely/kysely-uow-executor.ts +0 -164
  393. package/src/adapters/kysely/kysely-uow-joins.test.ts +0 -794
  394. package/src/adapters/kysely/migration/execute-base.ts +0 -256
  395. package/src/adapters/kysely/migration/execute-factory.ts +0 -53
  396. package/src/adapters/kysely/migration/execute-mssql.ts +0 -250
  397. package/src/adapters/kysely/migration/execute-mysql.ts +0 -211
  398. package/src/adapters/kysely/migration/execute-postgres.test.ts +0 -2657
  399. package/src/adapters/kysely/migration/execute-postgres.ts +0 -234
  400. package/src/adapters/kysely/migration/execute-sqlite.ts +0 -247
  401. package/src/adapters/kysely/migration/execute.ts +0 -50
  402. package/src/adapters/kysely/migration/kysely-migrator.test.ts +0 -261
  403. package/src/query/result-transform.ts +0 -274
  404. package/src/schema/serialize.ts +0 -407
  405. /package/dist/query/{query.js → simple-query-interface.js} +0 -0
  406. /package/src/query/{retry-policy.test.ts → unit-of-work/retry-policy.test.ts} +0 -0
  407. /package/src/query/{retry-policy.ts → unit-of-work/retry-policy.ts} +0 -0
@@ -1,677 +0,0 @@
1
- import * as Drizzle from "drizzle-orm";
2
- import type { AnyColumn, AnySchema, AnyTable, FragnoId } from "../../schema/create";
3
- import { Column } from "../../schema/create";
4
- import type {
5
- CompiledMutation,
6
- MutationOperation,
7
- RetrievalOperation,
8
- UOWCompiler,
9
- } from "../../query/unit-of-work";
10
- import { buildCondition, type Condition } from "../../query/condition-builder";
11
- import {
12
- type ColumnType,
13
- type TableType,
14
- type TableNameMapper,
15
- parseDrizzle,
16
- type DBType,
17
- createTableNameMapper,
18
- } from "./shared";
19
- import { encodeValues, ReferenceSubquery } from "../../query/result-transform";
20
- import { serialize } from "../../schema/serialize";
21
- import { decodeCursor, serializeCursorValues } from "../../query/cursor";
22
- import type { CompiledJoin } from "../../query/orm/orm";
23
- import { getOrderedJoinColumns } from "./join-column-utils";
24
- import type { ConnectionPool } from "../../shared/connection-pool";
25
-
26
- export type DrizzleCompiledQuery = {
27
- sql: string;
28
- params: unknown[];
29
- };
30
-
31
- /**
32
- * Create a Drizzle-specific Unit of Work compiler
33
- *
34
- * This compiler translates UOW operations into Drizzle query functions
35
- * that can be executed as a batch/transaction.
36
- *
37
- * @param pool - Connection pool for acquiring database connections
38
- * @param provider - SQL provider (sqlite, mysql, postgresql)
39
- * @param mapper - Optional table name mapper for namespace prefixing (fallback for operations without explicit namespace)
40
- * @returns A UOWCompiler instance for Drizzle
41
- */
42
- export function createDrizzleUOWCompiler(
43
- pool: ConnectionPool<DBType>,
44
- provider: "sqlite" | "mysql" | "postgresql",
45
- mapper?: TableNameMapper,
46
- ): UOWCompiler<DrizzleCompiledQuery> {
47
- // Get db synchronously for compilation (doesn't execute, just builds SQL)
48
- // TODO: We don't even need a Drizzle instance with a db client attached here. `drizzle({ schema })` is enough.
49
- const dbRaw = pool.getDatabaseSync();
50
- const [db, drizzleTables] = parseDrizzle(dbRaw);
51
-
52
- /**
53
- * Get the mapper for a specific operation
54
- * Uses operation's namespace if provided, otherwise falls back to the default mapper
55
- */
56
- function getMapperForOperation(namespace: string | undefined): TableNameMapper | undefined {
57
- if (namespace) {
58
- return createTableNameMapper(namespace);
59
- }
60
- return mapper;
61
- }
62
-
63
- /**
64
- * Convert a Fragno table to a Drizzle table
65
- * @throws Error if table is not found in Drizzle schema
66
- */
67
- function toDrizzleTable(table: AnyTable, namespace: string | undefined): TableType {
68
- // Get the mapper for this operation's namespace
69
- const opMapper = getMapperForOperation(namespace);
70
-
71
- // Map logical table name to physical table name using the operation-specific mapper
72
- const physicalTableName = opMapper ? opMapper.toPhysical(table.ormName) : table.ormName;
73
- const out = drizzleTables[physicalTableName];
74
- if (out) {
75
- return out;
76
- }
77
-
78
- throw new Error(
79
- `[Drizzle] Unknown table name ${physicalTableName} (logical: ${table.ormName}), is it included in your Drizzle schema?`,
80
- );
81
- }
82
-
83
- /**
84
- * Convert a Fragno column to a Drizzle column
85
- * @throws Error if column is not found in Drizzle table
86
- */
87
- function toDrizzleColumn(
88
- schema: AnySchema,
89
- namespace: string | undefined,
90
- col: AnyColumn,
91
- ): ColumnType {
92
- const fragnoTable = schema.tables[col.tableName];
93
- if (!fragnoTable) {
94
- throw new Error(`[Drizzle] Unknown table ${col.tableName} for column ${col.ormName}.`);
95
- }
96
-
97
- const table = toDrizzleTable(fragnoTable, namespace);
98
- const out = table[col.ormName];
99
- if (out) {
100
- return out;
101
- }
102
-
103
- throw new Error(`[Drizzle] Unknown column name ${col.ormName} in ${fragnoTable.ormName}.`);
104
- }
105
-
106
- /**
107
- * Build a WHERE clause from a condition using Drizzle's query builder
108
- */
109
- function buildWhere(
110
- schema: AnySchema,
111
- namespace: string | undefined,
112
- condition: Condition,
113
- ): Drizzle.SQL | undefined {
114
- if (condition.type === "compare") {
115
- const left = toDrizzleColumn(schema, namespace, condition.a);
116
- const op = condition.operator;
117
- let right = condition.b;
118
- if (right instanceof Column) {
119
- right = toDrizzleColumn(schema, namespace, right);
120
- } else {
121
- // Handle string references - convert external ID to internal ID via subquery
122
- if (condition.a.role === "reference" && typeof right === "string") {
123
- // Find the table that contains this column
124
- const table = Object.values(schema.tables).find((t) =>
125
- Object.values(t.columns).includes(condition.a),
126
- );
127
- if (table) {
128
- // Find relation that uses this column
129
- const relation = Object.values(table.relations).find((rel) =>
130
- rel.on.some(([localCol]) => localCol === condition.a.ormName),
131
- );
132
- if (relation) {
133
- const refTable = relation.table;
134
- const internalIdCol = refTable.getInternalIdColumn();
135
- const idCol = refTable.getIdColumn();
136
- const physicalTableName = mapper
137
- ? mapper.toPhysical(refTable.ormName)
138
- : refTable.ormName;
139
-
140
- // Build a SQL subquery using Drizzle's sql template
141
- right = Drizzle.sql`(select ${Drizzle.sql.identifier(internalIdCol.name)} from ${Drizzle.sql.identifier(physicalTableName)} where ${Drizzle.sql.identifier(idCol.name)} = ${right} limit 1)`;
142
- }
143
- }
144
- } else {
145
- // Serialize non-Column values (e.g., FragnoId -> string, Date -> number for SQLite)
146
- right = serialize(right, condition.a, provider);
147
- }
148
- }
149
-
150
- switch (op) {
151
- case "=":
152
- return Drizzle.eq(left, right);
153
- case "!=":
154
- return Drizzle.ne(left, right);
155
- case ">":
156
- return Drizzle.gt(left, right);
157
- case ">=":
158
- return Drizzle.gte(left, right);
159
- case "<":
160
- return Drizzle.lt(left, right);
161
- case "<=":
162
- return Drizzle.lte(left, right);
163
- case "in": {
164
- return Drizzle.inArray(left, right as never[]);
165
- }
166
- case "not in":
167
- return Drizzle.notInArray(left, right as never[]);
168
- case "is":
169
- return right === null ? Drizzle.isNull(left) : Drizzle.eq(left, right);
170
- case "is not":
171
- return right === null ? Drizzle.isNotNull(left) : Drizzle.ne(left, right);
172
- case "contains": {
173
- right =
174
- typeof right === "string" ? `%${right}%` : Drizzle.sql`concat('%', ${right}, '%')`;
175
- return Drizzle.like(left, right as string);
176
- }
177
- case "not contains": {
178
- right =
179
- typeof right === "string" ? `%${right}%` : Drizzle.sql`concat('%', ${right}, '%')`;
180
- return Drizzle.notLike(left, right as string);
181
- }
182
- case "ends with": {
183
- right = typeof right === "string" ? `%${right}` : Drizzle.sql`concat('%', ${right})`;
184
- return Drizzle.like(left, right as string);
185
- }
186
- case "not ends with": {
187
- right = typeof right === "string" ? `%${right}` : Drizzle.sql`concat('%', ${right})`;
188
- return Drizzle.notLike(left, right as string);
189
- }
190
- case "starts with": {
191
- right = typeof right === "string" ? `${right}%` : Drizzle.sql`concat(${right}, '%')`;
192
- return Drizzle.like(left, right as string);
193
- }
194
- case "not starts with": {
195
- right = typeof right === "string" ? `${right}%` : Drizzle.sql`concat(${right}, '%')`;
196
- return Drizzle.notLike(left, right as string);
197
- }
198
-
199
- default:
200
- throw new Error(`Unsupported operator: ${op}`);
201
- }
202
- }
203
-
204
- if (condition.type === "and") {
205
- return Drizzle.and(...condition.items.map((item) => buildWhere(schema, namespace, item)));
206
- }
207
-
208
- if (condition.type === "not") {
209
- const result = buildWhere(schema, namespace, condition.item);
210
- if (!result) {
211
- return;
212
- }
213
-
214
- return Drizzle.not(result);
215
- }
216
-
217
- return Drizzle.or(...condition.items.map((item) => buildWhere(schema, namespace, item)));
218
- }
219
-
220
- /**
221
- * Process reference subqueries in encoded values, converting them to Drizzle SQL subqueries
222
- */
223
- function processReferenceSubqueries(values: Record<string, unknown>): Record<string, unknown> {
224
- const processed: Record<string, unknown> = {};
225
-
226
- for (const [key, value] of Object.entries(values)) {
227
- if (value instanceof ReferenceSubquery) {
228
- const refTable = value.referencedTable;
229
- const externalId = value.externalIdValue;
230
- const internalIdCol = refTable.getInternalIdColumn();
231
- const idCol = refTable.getIdColumn();
232
-
233
- // Map logical table name to physical table name using the mapper
234
- const physicalTableName = mapper ? mapper.toPhysical(refTable.ormName) : refTable.ormName;
235
-
236
- // Build a SQL subquery using Drizzle's sql template
237
- // This creates a subquery: (SELECT _internalId FROM table WHERE id = ? LIMIT 1)
238
- // Safe cast: we're building a SQL subquery that returns a single bigint value
239
- processed[key] =
240
- Drizzle.sql`(select ${Drizzle.sql.identifier(internalIdCol.name)} from ${Drizzle.sql.identifier(physicalTableName)} where ${Drizzle.sql.identifier(idCol.name)} = ${externalId} limit 1)`;
241
- } else {
242
- processed[key] = value;
243
- }
244
- }
245
-
246
- return processed;
247
- }
248
-
249
- /**
250
- * Get table from schema by name
251
- * @throws Error if table is not found in schema
252
- */
253
- function getTable(schema: AnySchema, name: unknown): AnyTable {
254
- const table = schema.tables[name as string];
255
- if (!table) {
256
- throw new Error(`Invalid table name ${name}.`);
257
- }
258
- return table;
259
- }
260
-
261
- /**
262
- * Get the version to check for a given ID and checkVersion flag.
263
- * @returns The version to check or undefined if no check is required.
264
- * @throws Error if the ID is a string and checkVersion is true.
265
- */
266
- function getVersionToCheck(id: FragnoId | string, checkVersion: boolean): number | undefined {
267
- if (!checkVersion) {
268
- return undefined;
269
- }
270
-
271
- if (typeof id === "string") {
272
- throw new Error(
273
- `Cannot use checkVersion with a string ID. Version checking requires a FragnoId with version information.`,
274
- );
275
- }
276
-
277
- return id.version;
278
- }
279
-
280
- /**
281
- * Process joins recursively to support nested joins with orderBy and limit
282
- */
283
- function processJoins(
284
- schema: AnySchema,
285
- namespace: string | undefined,
286
- joins: CompiledJoin[],
287
- ): Record<string, Drizzle.DBQueryConfig<"many", boolean>> {
288
- const result: Record<string, Drizzle.DBQueryConfig<"many", boolean>> = {};
289
-
290
- for (const join of joins) {
291
- const { options, relation } = join;
292
-
293
- if (!options) {
294
- continue;
295
- }
296
-
297
- const targetTable = relation.table;
298
- const joinName = relation.name;
299
-
300
- // Build columns for this join using shared utility
301
- const selectOption = options.select === undefined ? true : options.select;
302
- const orderedColumns = getOrderedJoinColumns(targetTable, selectOption);
303
- const joinColumns: Record<string, boolean> = {};
304
- for (const colName of orderedColumns) {
305
- joinColumns[colName] = true;
306
- }
307
-
308
- // Build orderBy for this join
309
- let joinOrderBy: Drizzle.SQL[] | undefined;
310
- if (options.orderBy && options.orderBy.length > 0) {
311
- joinOrderBy = options.orderBy.map(([col, direction]) => {
312
- const drizzleCol = toDrizzleColumn(schema, namespace, col);
313
- return direction === "asc" ? Drizzle.asc(drizzleCol) : Drizzle.desc(drizzleCol);
314
- });
315
- }
316
-
317
- // Build WHERE clause for this join if provided
318
- let joinWhere: Drizzle.SQL | undefined;
319
- if (options.where) {
320
- joinWhere = buildWhere(schema, namespace, options.where);
321
- }
322
-
323
- // Build the join config
324
- const joinConfig: Drizzle.DBQueryConfig<"many", boolean> = {
325
- columns: joinColumns,
326
- orderBy: joinOrderBy,
327
- limit: options.limit,
328
- where: joinWhere,
329
- };
330
-
331
- // Recursively process nested joins
332
- if (options.join && options.join.length > 0) {
333
- joinConfig.with = processJoins(schema, namespace, options.join);
334
- }
335
-
336
- result[joinName] = joinConfig;
337
- }
338
-
339
- return result;
340
- }
341
-
342
- return {
343
- compileRetrievalOperation(op: RetrievalOperation<AnySchema>): DrizzleCompiledQuery | null {
344
- const schema = op.schema;
345
- switch (op.type) {
346
- case "count": {
347
- // Build WHERE clause
348
- let whereClause: Drizzle.SQL | undefined;
349
- if (op.options.where) {
350
- const condition = buildCondition(op.table.columns, op.options.where);
351
- if (condition === false) {
352
- // Never matches - return null
353
- return null;
354
- }
355
- if (condition !== true) {
356
- whereClause = buildWhere(schema, op.namespace, condition);
357
- }
358
- }
359
-
360
- const drizzleTable = toDrizzleTable(op.table, op.namespace);
361
- const query = db.select({ count: Drizzle.count() }).from(drizzleTable);
362
-
363
- const compiledQuery = whereClause ? query.where(whereClause).toSQL() : query.toSQL();
364
- return compiledQuery;
365
- }
366
-
367
- case "find": {
368
- const {
369
- useIndex: _useIndex,
370
- orderByIndex,
371
- joins,
372
- after,
373
- before,
374
- pageSize,
375
- ...findOptions
376
- } = op.options;
377
-
378
- // Get index columns for ordering and cursor pagination
379
- let indexColumns: AnyColumn[] = [];
380
- let orderDirection: "asc" | "desc" = "asc";
381
-
382
- if (orderByIndex) {
383
- const index = op.table.indexes[orderByIndex.indexName];
384
- orderDirection = orderByIndex.direction;
385
-
386
- if (!index) {
387
- // If _primary index doesn't exist, fall back to ID column
388
- if (orderByIndex.indexName === "_primary") {
389
- indexColumns = [op.table.getIdColumn()];
390
- } else {
391
- throw new Error(
392
- `Index "${orderByIndex.indexName}" not found on table "${op.table.name}"`,
393
- );
394
- }
395
- } else {
396
- indexColumns = index.columns;
397
- }
398
- }
399
-
400
- // Convert orderByIndex to orderBy format
401
- let orderBy: Drizzle.SQL[] | undefined;
402
- if (indexColumns.length > 0) {
403
- orderBy = indexColumns.map((col) => {
404
- const drizzleCol = toDrizzleColumn(schema, op.namespace, col);
405
- return orderDirection === "asc" ? Drizzle.asc(drizzleCol) : Drizzle.desc(drizzleCol);
406
- });
407
- }
408
-
409
- // Build query configuration
410
- const columns: Record<string, boolean> = {};
411
- const select = findOptions.select;
412
-
413
- if (select === true || select === undefined) {
414
- for (const col of Object.values(op.table.columns)) {
415
- columns[col.ormName] = true;
416
- }
417
- } else {
418
- for (const k of select) {
419
- columns[op.table.columns[k].ormName] = true;
420
- }
421
- // Always include hidden columns (for FragnoId construction with internal ID and version)
422
- for (const col of Object.values(op.table.columns)) {
423
- if (col.isHidden && !columns[col.ormName]) {
424
- columns[col.ormName] = true;
425
- }
426
- }
427
- }
428
-
429
- // Build WHERE clause with cursor conditions
430
- const whereClauses: Drizzle.SQL[] = [];
431
-
432
- // Add user-defined where clause
433
- if (findOptions.where) {
434
- const condition = buildCondition(op.table.columns, findOptions.where);
435
- if (condition === false) {
436
- // Never matches - return null to indicate this query should be skipped
437
- return null;
438
- }
439
- if (condition !== true) {
440
- const clause = buildWhere(schema, op.namespace, condition);
441
- if (clause) {
442
- whereClauses.push(clause);
443
- }
444
- }
445
- }
446
-
447
- // Add cursor-based pagination conditions
448
- if ((after || before) && indexColumns.length > 0) {
449
- const cursor = after || before;
450
- // Decode cursor if it's a string, otherwise use it as-is
451
- const cursorObj = typeof cursor === "string" ? decodeCursor(cursor!) : cursor!;
452
- const serializedValues = serializeCursorValues(cursorObj, indexColumns, provider);
453
-
454
- // Build tuple comparison for cursor pagination
455
- // For "after" with "asc": (col1, col2, ...) > (val1, val2, ...)
456
- // For "before" with "desc": reverse the comparison
457
- const isAfter = !!after;
458
- const useGreaterThan =
459
- (isAfter && orderDirection === "asc") || (!isAfter && orderDirection === "desc");
460
-
461
- if (indexColumns.length === 1) {
462
- // Simple single-column case
463
- const col = toDrizzleColumn(schema, op.namespace, indexColumns[0]!);
464
- const val = serializedValues[indexColumns[0]!.ormName];
465
- whereClauses.push(useGreaterThan ? Drizzle.gt(col, val) : Drizzle.lt(col, val));
466
- } else {
467
- // Multi-column tuple comparison using SQL
468
- const drizzleCols = indexColumns.map((c) => toDrizzleColumn(schema, op.namespace, c));
469
- const vals = indexColumns.map((c) => serializedValues[c.ormName]);
470
- const operator = useGreaterThan ? ">" : "<";
471
- // Safe cast: building a SQL comparison expression for cursor pagination
472
- // Build the tuple comparison: (col1, col2) > (val1, val2)
473
- const colsSQL = Drizzle.sql.join(drizzleCols, Drizzle.sql.raw(", "));
474
- const valsSQL = Drizzle.sql.join(
475
- vals.map((v) => Drizzle.sql`${v}`),
476
- Drizzle.sql.raw(", "),
477
- );
478
- whereClauses.push(
479
- Drizzle.sql`(${colsSQL}) ${Drizzle.sql.raw(operator)} (${valsSQL})`,
480
- );
481
- }
482
- }
483
-
484
- const whereClause = whereClauses.length > 0 ? Drizzle.and(...whereClauses) : undefined;
485
-
486
- // For cursor pagination, fetch one extra item to determine if there's a next page
487
- // Only apply this when using the high-level findWithCursor() API (op.withCursor === true)
488
- const effectiveLimit = pageSize && op.withCursor ? pageSize + 1 : pageSize;
489
-
490
- const queryConfig: Drizzle.DBQueryConfig<"many", boolean> = {
491
- columns,
492
- limit: effectiveLimit,
493
- where: whereClause,
494
- orderBy,
495
- with: {},
496
- };
497
-
498
- // Process joins recursively to support nested joins
499
- if (joins) {
500
- queryConfig.with = processJoins(schema, op.namespace, joins);
501
- }
502
-
503
- // For multi-schema support: get the mapper for the operation's namespace
504
- const opMapper = getMapperForOperation(op.namespace);
505
- const physicalTableName = opMapper
506
- ? opMapper.toPhysical(op.table.ormName)
507
- : op.table.ormName;
508
- const tableQuery = db.query[physicalTableName];
509
-
510
- if (!tableQuery) {
511
- throw new Error(
512
- `[Drizzle] Table ${op.table.ormName} (physical: ${physicalTableName}) not found in db.query. ` +
513
- `Available tables: ${Object.keys(db.query).join(", ")}`,
514
- );
515
- }
516
-
517
- const compiledQuery = tableQuery.findMany(queryConfig).toSQL();
518
- return compiledQuery;
519
- }
520
- }
521
- },
522
-
523
- compileMutationOperation(
524
- op: MutationOperation<AnySchema>,
525
- ): CompiledMutation<DrizzleCompiledQuery> | null {
526
- const schema = op.schema;
527
- switch (op.type) {
528
- case "create": {
529
- const table = getTable(schema, op.table);
530
- const drizzleTable = toDrizzleTable(table, op.namespace);
531
- // encodeValues now handles runtime defaults automatically
532
- const encodedValues = encodeValues(op.values, table, true, provider, true);
533
- const values = processReferenceSubqueries(encodedValues);
534
-
535
- const compiledQuery = db.insert(drizzleTable).values(values).toSQL();
536
- return {
537
- query: compiledQuery,
538
- expectedAffectedRows: null, // creates don't need affected row checks
539
- expectedReturnedRows: null,
540
- };
541
- }
542
-
543
- case "update": {
544
- const table = getTable(schema, op.table);
545
- const idColumn = table.getIdColumn();
546
- const versionColumn = table.getVersionColumn();
547
- const drizzleTable = toDrizzleTable(table, op.namespace);
548
-
549
- const externalId = typeof op.id === "string" ? op.id : op.id.externalId;
550
- const versionToCheck = getVersionToCheck(op.id, op.checkVersion);
551
-
552
- // Build WHERE clause that filters by ID and optionally by version
553
- const condition =
554
- versionToCheck !== undefined
555
- ? buildCondition(table.columns, (eb) =>
556
- eb.and(
557
- eb(idColumn.ormName, "=", externalId),
558
- eb(versionColumn.ormName, "=", versionToCheck),
559
- ),
560
- )
561
- : buildCondition(table.columns, (eb) => eb(idColumn.ormName, "=", externalId));
562
-
563
- // Handle boolean cases
564
- if (condition === false) {
565
- // Never matches - skip this operation
566
- return null;
567
- }
568
-
569
- const whereClause =
570
- condition === true ? undefined : buildWhere(schema, op.namespace, condition);
571
- const encodedSetValues = encodeValues(op.set, table, false, provider, true);
572
- const setValues = processReferenceSubqueries(encodedSetValues);
573
-
574
- // Automatically increment _version for optimistic concurrency control
575
- // Safe cast: we're building a SQL expression for incrementing the version
576
- setValues[versionColumn.ormName] = Drizzle.sql.raw(
577
- `COALESCE(${versionColumn.ormName}, 0) + 1`,
578
- ) as unknown;
579
-
580
- const compiledQuery = db.update(drizzleTable).set(setValues).where(whereClause).toSQL();
581
- return {
582
- query: compiledQuery,
583
- expectedAffectedRows: op.checkVersion ? 1 : null,
584
- expectedReturnedRows: null,
585
- };
586
- }
587
-
588
- case "delete": {
589
- const table = getTable(schema, op.table);
590
- const idColumn = table.getIdColumn();
591
- const versionColumn = table.getVersionColumn();
592
- const drizzleTable = toDrizzleTable(table, op.namespace);
593
-
594
- if (!op.id) {
595
- throw new Error(
596
- `[Drizzle] Delete operation on table "${op.table}" has undefined id. ` +
597
- `Make sure you're passing a valid FragnoId or string ID.`,
598
- );
599
- }
600
-
601
- const externalId = typeof op.id === "string" ? op.id : op.id.externalId;
602
-
603
- if (!externalId) {
604
- throw new Error(
605
- `[Drizzle] Delete operation on table "${op.table}" has invalid id. ` +
606
- `The FragnoId object exists but has no externalId. ` +
607
- `Received: ${JSON.stringify(op.id)}. ` +
608
- `Make sure the record was properly loaded from the database.`,
609
- );
610
- }
611
- const versionToCheck = getVersionToCheck(op.id, op.checkVersion);
612
-
613
- // Build WHERE clause that filters by ID and optionally by version
614
- const condition =
615
- versionToCheck !== undefined
616
- ? buildCondition(table.columns, (eb) =>
617
- eb.and(
618
- eb(idColumn.ormName, "=", externalId),
619
- eb(versionColumn.ormName, "=", versionToCheck),
620
- ),
621
- )
622
- : buildCondition(table.columns, (eb) => eb(idColumn.ormName, "=", externalId));
623
-
624
- // Handle boolean cases
625
- if (condition === false) {
626
- // Never matches - skip this operation
627
- return null;
628
- }
629
-
630
- const whereClause =
631
- condition === true ? undefined : buildWhere(schema, op.namespace, condition);
632
-
633
- const compiledQuery = db.delete(drizzleTable).where(whereClause).toSQL();
634
- return {
635
- query: compiledQuery,
636
- expectedAffectedRows: op.checkVersion ? 1 : null,
637
- expectedReturnedRows: null,
638
- };
639
- }
640
-
641
- case "check": {
642
- const table = getTable(schema, op.table);
643
- const idColumn = table.getIdColumn();
644
- const versionColumn = table.getVersionColumn();
645
- const drizzleTable = toDrizzleTable(table, op.namespace);
646
-
647
- const externalId = op.id.externalId;
648
- const version = op.id.version;
649
-
650
- // Build WHERE clause that filters by ID and version
651
- const condition = buildCondition(table.columns, (eb) =>
652
- eb.and(eb(idColumn.ormName, "=", externalId), eb(versionColumn.ormName, "=", version)),
653
- );
654
-
655
- if (typeof condition === "boolean") {
656
- throw new Error("Condition is a boolean, but should be a condition object.");
657
- }
658
-
659
- // Build a SELECT query to check if the row exists with the correct version
660
- // Use sql`1` to select a constant with an alias
661
- const compiledQuery = db
662
- .select({ exists: Drizzle.sql<number>`1`.as("exists") })
663
- .from(drizzleTable)
664
- .where(buildWhere(schema, op.namespace, condition))
665
- .limit(1)
666
- .toSQL();
667
-
668
- return {
669
- query: compiledQuery,
670
- expectedAffectedRows: null,
671
- expectedReturnedRows: 1, // Check that exactly 1 row was returned
672
- };
673
- }
674
- }
675
- },
676
- };
677
- }