@fragno-dev/db 0.1.14 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (445) hide show
  1. package/.turbo/turbo-build.log +242 -139
  2. package/CHANGELOG.md +47 -0
  3. package/README.md +123 -8
  4. package/dist/adapters/adapters.d.ts +19 -5
  5. package/dist/adapters/adapters.d.ts.map +1 -1
  6. package/dist/adapters/adapters.js.map +1 -1
  7. package/dist/adapters/drizzle/drizzle-adapter.d.ts +6 -19
  8. package/dist/adapters/drizzle/drizzle-adapter.d.ts.map +1 -1
  9. package/dist/adapters/drizzle/drizzle-adapter.js +7 -47
  10. package/dist/adapters/drizzle/drizzle-adapter.js.map +1 -1
  11. package/dist/adapters/drizzle/generate.d.ts +7 -1
  12. package/dist/adapters/drizzle/generate.d.ts.map +1 -1
  13. package/dist/adapters/drizzle/generate.js +46 -45
  14. package/dist/adapters/drizzle/generate.js.map +1 -1
  15. package/dist/adapters/generic-sql/driver-config.d.ts +74 -0
  16. package/dist/adapters/generic-sql/driver-config.d.ts.map +1 -0
  17. package/dist/adapters/generic-sql/driver-config.js +94 -0
  18. package/dist/adapters/generic-sql/driver-config.js.map +1 -0
  19. package/dist/adapters/generic-sql/generic-sql-adapter.d.ts +43 -0
  20. package/dist/adapters/generic-sql/generic-sql-adapter.d.ts.map +1 -0
  21. package/dist/adapters/generic-sql/generic-sql-adapter.js +87 -0
  22. package/dist/adapters/generic-sql/generic-sql-adapter.js.map +1 -0
  23. package/dist/adapters/generic-sql/generic-sql-uow-executor.js +67 -0
  24. package/dist/adapters/generic-sql/generic-sql-uow-executor.js.map +1 -0
  25. package/dist/adapters/generic-sql/migration/cold-kysely.js +33 -0
  26. package/dist/adapters/generic-sql/migration/cold-kysely.js.map +1 -0
  27. package/dist/adapters/generic-sql/migration/dialect/mysql.js +60 -0
  28. package/dist/adapters/generic-sql/migration/dialect/mysql.js.map +1 -0
  29. package/dist/adapters/generic-sql/migration/dialect/postgres.js +59 -0
  30. package/dist/adapters/generic-sql/migration/dialect/postgres.js.map +1 -0
  31. package/dist/adapters/generic-sql/migration/dialect/sqlite.js +96 -0
  32. package/dist/adapters/generic-sql/migration/dialect/sqlite.js.map +1 -0
  33. package/dist/adapters/generic-sql/migration/executor.d.ts +15 -0
  34. package/dist/adapters/generic-sql/migration/executor.d.ts.map +1 -0
  35. package/dist/adapters/generic-sql/migration/executor.js +18 -0
  36. package/dist/adapters/generic-sql/migration/executor.js.map +1 -0
  37. package/dist/adapters/generic-sql/migration/prepared-migrations.d.ts +66 -0
  38. package/dist/adapters/generic-sql/migration/prepared-migrations.d.ts.map +1 -0
  39. package/dist/adapters/generic-sql/migration/prepared-migrations.js +68 -0
  40. package/dist/adapters/generic-sql/migration/prepared-migrations.js.map +1 -0
  41. package/dist/adapters/generic-sql/migration/sql-generator.js +212 -0
  42. package/dist/adapters/generic-sql/migration/sql-generator.js.map +1 -0
  43. package/dist/adapters/generic-sql/query/create-sql-query-compiler.js +32 -0
  44. package/dist/adapters/generic-sql/query/create-sql-query-compiler.js.map +1 -0
  45. package/dist/adapters/generic-sql/query/cursor-utils.js +37 -0
  46. package/dist/adapters/generic-sql/query/cursor-utils.js.map +1 -0
  47. package/dist/adapters/generic-sql/query/dialect/mysql.js +33 -0
  48. package/dist/adapters/generic-sql/query/dialect/mysql.js.map +1 -0
  49. package/dist/adapters/generic-sql/query/dialect/postgres.js +32 -0
  50. package/dist/adapters/generic-sql/query/dialect/postgres.js.map +1 -0
  51. package/dist/adapters/generic-sql/query/dialect/sqlite.js +32 -0
  52. package/dist/adapters/generic-sql/query/dialect/sqlite.js.map +1 -0
  53. package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js +152 -0
  54. package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js.map +1 -0
  55. package/dist/adapters/generic-sql/query/select-builder.js +69 -0
  56. package/dist/adapters/generic-sql/query/select-builder.js.map +1 -0
  57. package/dist/adapters/generic-sql/query/sql-query-compiler.js +145 -0
  58. package/dist/adapters/generic-sql/query/sql-query-compiler.js.map +1 -0
  59. package/dist/adapters/generic-sql/query/where-builder.js +129 -0
  60. package/dist/adapters/generic-sql/query/where-builder.js.map +1 -0
  61. package/dist/adapters/generic-sql/result-interpreter.js +74 -0
  62. package/dist/adapters/generic-sql/result-interpreter.js.map +1 -0
  63. package/dist/adapters/generic-sql/uow-decoder.js +105 -0
  64. package/dist/adapters/generic-sql/uow-decoder.js.map +1 -0
  65. package/dist/adapters/generic-sql/uow-encoder.js +93 -0
  66. package/dist/adapters/generic-sql/uow-encoder.js.map +1 -0
  67. package/dist/adapters/kysely/kysely-adapter.d.ts +5 -16
  68. package/dist/adapters/kysely/kysely-adapter.d.ts.map +1 -1
  69. package/dist/adapters/kysely/kysely-adapter.js +6 -159
  70. package/dist/adapters/kysely/kysely-adapter.js.map +1 -1
  71. package/dist/adapters/{drizzle/drizzle-query.js → shared/from-unit-of-work-compiler.js} +48 -62
  72. package/dist/adapters/shared/from-unit-of-work-compiler.js.map +1 -0
  73. package/dist/adapters/{kysely/kysely-shared.d.ts → shared/table-name-mapper.d.ts} +3 -2
  74. package/dist/adapters/shared/table-name-mapper.d.ts.map +1 -0
  75. package/dist/adapters/shared/table-name-mapper.js +43 -0
  76. package/dist/adapters/shared/table-name-mapper.js.map +1 -0
  77. package/dist/adapters/shared/uow-operation-compiler.js +105 -0
  78. package/dist/adapters/shared/uow-operation-compiler.js.map +1 -0
  79. package/dist/db-fragment-definition-builder.d.ts +186 -0
  80. package/dist/db-fragment-definition-builder.d.ts.map +1 -0
  81. package/dist/db-fragment-definition-builder.js +207 -0
  82. package/dist/db-fragment-definition-builder.js.map +1 -0
  83. package/dist/fragments/internal-fragment.d.ts +53 -0
  84. package/dist/fragments/internal-fragment.d.ts.map +1 -0
  85. package/dist/fragments/internal-fragment.js +111 -0
  86. package/dist/fragments/internal-fragment.js.map +1 -0
  87. package/dist/hooks/hooks.d.ts +51 -0
  88. package/dist/hooks/hooks.d.ts.map +1 -0
  89. package/dist/hooks/hooks.js +88 -0
  90. package/dist/hooks/hooks.js.map +1 -0
  91. package/dist/migration-engine/generation-engine.d.ts +0 -2
  92. package/dist/migration-engine/generation-engine.d.ts.map +1 -1
  93. package/dist/migration-engine/generation-engine.js +38 -56
  94. package/dist/migration-engine/generation-engine.js.map +1 -1
  95. package/dist/mod.d.ts +35 -23
  96. package/dist/mod.d.ts.map +1 -1
  97. package/dist/mod.js +48 -45
  98. package/dist/mod.js.map +1 -1
  99. package/dist/node_modules/.pnpm/rou3@0.7.10/node_modules/rou3/dist/index.js +165 -0
  100. package/dist/node_modules/.pnpm/rou3@0.7.10/node_modules/rou3/dist/index.js.map +1 -0
  101. package/dist/packages/fragno/dist/api/bind-services.js +20 -0
  102. package/dist/packages/fragno/dist/api/bind-services.js.map +1 -0
  103. package/dist/packages/fragno/dist/api/error.js +48 -0
  104. package/dist/packages/fragno/dist/api/error.js.map +1 -0
  105. package/dist/packages/fragno/dist/api/fragment-definition-builder.js +320 -0
  106. package/dist/packages/fragno/dist/api/fragment-definition-builder.js.map +1 -0
  107. package/dist/packages/fragno/dist/api/fragment-instantiator.js +525 -0
  108. package/dist/packages/fragno/dist/api/fragment-instantiator.js.map +1 -0
  109. package/dist/packages/fragno/dist/api/fragno-response.js +73 -0
  110. package/dist/packages/fragno/dist/api/fragno-response.js.map +1 -0
  111. package/dist/packages/fragno/dist/api/internal/response-stream.js +81 -0
  112. package/dist/packages/fragno/dist/api/internal/response-stream.js.map +1 -0
  113. package/dist/packages/fragno/dist/api/internal/route.js +10 -0
  114. package/dist/packages/fragno/dist/api/internal/route.js.map +1 -0
  115. package/dist/packages/fragno/dist/api/mutable-request-state.js +97 -0
  116. package/dist/packages/fragno/dist/api/mutable-request-state.js.map +1 -0
  117. package/dist/packages/fragno/dist/api/request-context-storage.js +43 -0
  118. package/dist/packages/fragno/dist/api/request-context-storage.js.map +1 -0
  119. package/dist/packages/fragno/dist/api/request-input-context.js +118 -0
  120. package/dist/packages/fragno/dist/api/request-input-context.js.map +1 -0
  121. package/dist/packages/fragno/dist/api/request-middleware.js +83 -0
  122. package/dist/packages/fragno/dist/api/request-middleware.js.map +1 -0
  123. package/dist/packages/fragno/dist/api/request-output-context.js +119 -0
  124. package/dist/packages/fragno/dist/api/request-output-context.js.map +1 -0
  125. package/dist/packages/fragno/dist/api/route.js +17 -0
  126. package/dist/packages/fragno/dist/api/route.js.map +1 -0
  127. package/dist/packages/fragno/dist/internal/symbols.js +10 -0
  128. package/dist/packages/fragno/dist/internal/symbols.js.map +1 -0
  129. package/dist/query/column-defaults.js +27 -0
  130. package/dist/query/column-defaults.js.map +1 -0
  131. package/dist/query/cursor.d.ts +14 -6
  132. package/dist/query/cursor.d.ts.map +1 -1
  133. package/dist/query/cursor.js +16 -7
  134. package/dist/query/cursor.js.map +1 -1
  135. package/dist/query/orm/orm.d.ts +1 -1
  136. package/dist/query/orm/orm.js.map +1 -1
  137. package/dist/query/serialize/create-sql-serializer.js +30 -0
  138. package/dist/query/serialize/create-sql-serializer.js.map +1 -0
  139. package/dist/query/serialize/dialect/mysql-serializer.js +87 -0
  140. package/dist/query/serialize/dialect/mysql-serializer.js.map +1 -0
  141. package/dist/query/serialize/dialect/postgres-serializer.js +80 -0
  142. package/dist/query/serialize/dialect/postgres-serializer.js.map +1 -0
  143. package/dist/query/serialize/dialect/sqlite-serializer.js +93 -0
  144. package/dist/query/serialize/dialect/sqlite-serializer.js.map +1 -0
  145. package/dist/query/serialize/sql-serializer.js +67 -0
  146. package/dist/query/serialize/sql-serializer.js.map +1 -0
  147. package/dist/query/{query.d.ts → simple-query-interface.d.ts} +6 -6
  148. package/dist/query/simple-query-interface.d.ts.map +1 -0
  149. package/dist/query/unit-of-work/execute-unit-of-work.d.ts +133 -0
  150. package/dist/query/unit-of-work/execute-unit-of-work.d.ts.map +1 -0
  151. package/dist/query/unit-of-work/execute-unit-of-work.js +197 -0
  152. package/dist/query/unit-of-work/execute-unit-of-work.js.map +1 -0
  153. package/dist/query/unit-of-work/retry-policy.d.ts +88 -0
  154. package/dist/query/unit-of-work/retry-policy.d.ts.map +1 -0
  155. package/dist/query/unit-of-work/retry-policy.js +61 -0
  156. package/dist/query/unit-of-work/retry-policy.js.map +1 -0
  157. package/dist/query/{unit-of-work.d.ts → unit-of-work/unit-of-work.d.ts} +145 -58
  158. package/dist/query/unit-of-work/unit-of-work.d.ts.map +1 -0
  159. package/dist/query/{unit-of-work.js → unit-of-work/unit-of-work.js} +435 -198
  160. package/dist/query/unit-of-work/unit-of-work.js.map +1 -0
  161. package/dist/query/value-decoding.js +71 -0
  162. package/dist/query/value-decoding.js.map +1 -0
  163. package/dist/query/value-encoding.js +124 -0
  164. package/dist/query/value-encoding.js.map +1 -0
  165. package/dist/schema/create.d.ts +3 -0
  166. package/dist/schema/create.d.ts.map +1 -1
  167. package/dist/schema/create.js +4 -0
  168. package/dist/schema/create.js.map +1 -1
  169. package/dist/schema/type-conversion/create-sql-type-mapper.js +29 -0
  170. package/dist/schema/type-conversion/create-sql-type-mapper.js.map +1 -0
  171. package/dist/schema/type-conversion/dialect/mysql.js +57 -0
  172. package/dist/schema/type-conversion/dialect/mysql.js.map +1 -0
  173. package/dist/schema/type-conversion/dialect/postgres.js +56 -0
  174. package/dist/schema/type-conversion/dialect/postgres.js.map +1 -0
  175. package/dist/schema/type-conversion/dialect/sqlite.js +52 -0
  176. package/dist/schema/type-conversion/dialect/sqlite.js.map +1 -0
  177. package/dist/schema/type-conversion/type-mapping.js +63 -0
  178. package/dist/schema/type-conversion/type-mapping.js.map +1 -0
  179. package/dist/sql-driver/connection/connection-provider.d.ts +13 -0
  180. package/dist/sql-driver/connection/connection-provider.d.ts.map +1 -0
  181. package/dist/sql-driver/connection/connection-provider.js +19 -0
  182. package/dist/sql-driver/connection/connection-provider.js.map +1 -0
  183. package/dist/sql-driver/connection/single-connection-provider.js +23 -0
  184. package/dist/sql-driver/connection/single-connection-provider.js.map +1 -0
  185. package/dist/sql-driver/dialect-adapter/dialect-adapter.d.ts +7 -0
  186. package/dist/sql-driver/dialect-adapter/dialect-adapter.d.ts.map +1 -0
  187. package/dist/sql-driver/dialects/dialects.d.ts +2 -0
  188. package/dist/sql-driver/dialects/dialects.js +3 -0
  189. package/dist/sql-driver/dialects/durable-object-dialect.d.ts +72 -0
  190. package/dist/sql-driver/dialects/durable-object-dialect.d.ts.map +1 -0
  191. package/dist/sql-driver/dialects/durable-object-dialect.js +130 -0
  192. package/dist/sql-driver/dialects/durable-object-dialect.js.map +1 -0
  193. package/dist/sql-driver/driver/runtime-driver.d.ts +23 -0
  194. package/dist/sql-driver/driver/runtime-driver.d.ts.map +1 -0
  195. package/dist/sql-driver/driver/runtime-driver.js +56 -0
  196. package/dist/sql-driver/driver/runtime-driver.js.map +1 -0
  197. package/dist/sql-driver/query-executor/default-query-executor.js +26 -0
  198. package/dist/sql-driver/query-executor/default-query-executor.js.map +1 -0
  199. package/dist/sql-driver/query-executor/plugin.d.ts +17 -0
  200. package/dist/sql-driver/query-executor/plugin.d.ts.map +1 -0
  201. package/dist/sql-driver/query-executor/query-executor-base.js +25 -0
  202. package/dist/sql-driver/query-executor/query-executor-base.js.map +1 -0
  203. package/dist/sql-driver/query-executor/query-executor.d.ts +36 -0
  204. package/dist/sql-driver/query-executor/query-executor.d.ts.map +1 -0
  205. package/dist/sql-driver/sql-driver-adapter.d.ts +29 -0
  206. package/dist/sql-driver/sql-driver-adapter.d.ts.map +1 -0
  207. package/dist/sql-driver/sql-driver-adapter.js +68 -0
  208. package/dist/sql-driver/sql-driver-adapter.js.map +1 -0
  209. package/dist/sql-driver/sql-driver.d.ts +38 -0
  210. package/dist/sql-driver/sql-driver.d.ts.map +1 -0
  211. package/dist/sql-driver/sql-driver.js +1 -0
  212. package/dist/sql-driver/sql.js +50 -0
  213. package/dist/sql-driver/sql.js.map +1 -0
  214. package/dist/with-database.d.ts +32 -0
  215. package/dist/with-database.d.ts.map +1 -0
  216. package/dist/with-database.js +34 -0
  217. package/dist/with-database.js.map +1 -0
  218. package/package.json +43 -9
  219. package/src/adapters/adapters.ts +23 -4
  220. package/src/adapters/drizzle/drizzle-adapter-pglite.test.ts +140 -185
  221. package/src/adapters/drizzle/{drizzle-adapter-sqlite.test.ts → drizzle-adapter-sqlite3.test.ts} +187 -55
  222. package/src/adapters/drizzle/drizzle-adapter.ts +14 -93
  223. package/src/adapters/drizzle/generate.test.ts +102 -269
  224. package/src/adapters/drizzle/generate.ts +89 -63
  225. package/src/adapters/drizzle/migrate-drizzle.test.ts +19 -0
  226. package/src/adapters/drizzle/shared.ts +0 -34
  227. package/src/adapters/drizzle/test-utils.ts +36 -5
  228. package/src/adapters/generic-sql/README.md +14 -0
  229. package/src/adapters/generic-sql/driver-config.ts +144 -0
  230. package/src/adapters/generic-sql/generic-sql-adapter.test.ts +50 -0
  231. package/src/adapters/generic-sql/generic-sql-adapter.ts +146 -0
  232. package/src/adapters/generic-sql/generic-sql-uow-executor.ts +130 -0
  233. package/src/adapters/generic-sql/migration/cold-kysely.ts +55 -0
  234. package/src/adapters/{kysely/migration/execute-mysql.test.ts → generic-sql/migration/dialect/mysql.test.ts} +342 -484
  235. package/src/adapters/generic-sql/migration/dialect/mysql.ts +104 -0
  236. package/src/adapters/generic-sql/migration/dialect/postgres.test.ts +1008 -0
  237. package/src/adapters/generic-sql/migration/dialect/postgres.ts +113 -0
  238. package/src/adapters/{kysely/migration/execute-sqlite.test.ts → generic-sql/migration/dialect/sqlite.test.ts} +307 -510
  239. package/src/adapters/generic-sql/migration/dialect/sqlite.ts +189 -0
  240. package/src/adapters/generic-sql/migration/executor.ts +33 -0
  241. package/src/adapters/generic-sql/migration/prepared-migrations.test.ts +661 -0
  242. package/src/adapters/generic-sql/migration/prepared-migrations.ts +214 -0
  243. package/src/adapters/generic-sql/migration/sql-generator.ts +413 -0
  244. package/src/adapters/generic-sql/query/create-sql-query-compiler.ts +36 -0
  245. package/src/adapters/generic-sql/query/cursor-utils.ts +56 -0
  246. package/src/adapters/generic-sql/query/dialect/mysql.ts +34 -0
  247. package/src/adapters/generic-sql/query/dialect/postgres.ts +32 -0
  248. package/src/adapters/generic-sql/query/dialect/sqlite.ts +32 -0
  249. package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.test.ts +1568 -0
  250. package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.ts +314 -0
  251. package/src/adapters/generic-sql/query/select-builder.test.ts +256 -0
  252. package/src/adapters/generic-sql/query/select-builder.ts +137 -0
  253. package/src/adapters/generic-sql/query/sql-query-compiler.test.ts +195 -0
  254. package/src/adapters/generic-sql/query/sql-query-compiler.ts +367 -0
  255. package/src/adapters/generic-sql/query/where-builder.test.ts +744 -0
  256. package/src/adapters/generic-sql/query/where-builder.ts +211 -0
  257. package/src/adapters/generic-sql/result-interpreter.ts +102 -0
  258. package/src/adapters/generic-sql/test/generic-drizzle-adapter-sqlite3.test.ts +899 -0
  259. package/src/adapters/generic-sql/uow-decoder.test.ts +399 -0
  260. package/src/adapters/generic-sql/uow-decoder.ts +152 -0
  261. package/src/adapters/generic-sql/uow-encoder.test.ts +183 -0
  262. package/src/adapters/generic-sql/uow-encoder.ts +131 -0
  263. package/src/adapters/kysely/kysely-adapter-pglite.test.ts +90 -96
  264. package/src/adapters/kysely/kysely-adapter-sqlocal.test.ts +215 -0
  265. package/src/adapters/kysely/kysely-adapter.ts +10 -242
  266. package/src/adapters/{drizzle/drizzle-query.ts → shared/from-unit-of-work-compiler.ts} +111 -106
  267. package/src/adapters/shared/table-name-mapper.ts +50 -0
  268. package/src/adapters/shared/uow-operation-compiler.ts +211 -0
  269. package/src/db-fragment-definition-builder.test.ts +887 -0
  270. package/src/db-fragment-definition-builder.ts +737 -0
  271. package/src/db-fragment-instantiator.test.ts +543 -0
  272. package/src/db-fragment-integration.test.ts +406 -0
  273. package/src/fragments/internal-fragment.test.ts +549 -0
  274. package/src/fragments/internal-fragment.ts +249 -0
  275. package/src/hooks/hooks.test.ts +575 -0
  276. package/src/hooks/hooks.ts +179 -0
  277. package/src/migration-engine/generation-engine.test.ts +60 -27
  278. package/src/migration-engine/generation-engine.ts +99 -92
  279. package/src/mod.ts +139 -78
  280. package/src/query/column-defaults.ts +49 -0
  281. package/src/query/cursor.test.ts +147 -3
  282. package/src/query/cursor.ts +25 -8
  283. package/src/query/orm/orm.ts +1 -1
  284. package/src/query/query-type.test.ts +9 -9
  285. package/src/query/serialize/create-sql-serializer.ts +34 -0
  286. package/src/query/serialize/dialect/mysql-serializer.ts +142 -0
  287. package/src/query/serialize/dialect/postgres-serializer.ts +129 -0
  288. package/src/query/serialize/dialect/sqlite-serializer.test.ts +251 -0
  289. package/src/query/serialize/dialect/sqlite-serializer.ts +156 -0
  290. package/src/query/serialize/sql-serializer.ts +143 -0
  291. package/src/query/{query.ts → simple-query-interface.ts} +4 -4
  292. package/src/query/unit-of-work/execute-unit-of-work.test.ts +1310 -0
  293. package/src/query/unit-of-work/execute-unit-of-work.ts +504 -0
  294. package/src/query/unit-of-work/retry-policy.test.ts +217 -0
  295. package/src/query/unit-of-work/retry-policy.ts +141 -0
  296. package/src/query/unit-of-work/unit-of-work-coordinator.test.ts +831 -0
  297. package/src/query/{unit-of-work-types.test.ts → unit-of-work/unit-of-work-types.test.ts} +7 -5
  298. package/src/query/unit-of-work/unit-of-work.test.ts +1716 -0
  299. package/src/query/{unit-of-work.ts → unit-of-work/unit-of-work.ts} +716 -420
  300. package/src/query/{result-transform.test.ts → value-decoding.test.ts} +45 -298
  301. package/src/query/value-decoding.ts +113 -0
  302. package/src/query/value-encoding.test.ts +390 -0
  303. package/src/query/value-encoding.ts +168 -0
  304. package/src/schema/create.test.ts +5 -1
  305. package/src/schema/create.ts +5 -0
  306. package/src/schema/serialize.test.ts +165 -407
  307. package/src/schema/type-conversion/create-sql-type-mapper.ts +28 -0
  308. package/src/schema/type-conversion/dialect/mysql.ts +64 -0
  309. package/src/schema/type-conversion/dialect/postgres.ts +62 -0
  310. package/src/schema/type-conversion/dialect/sqlite.ts +63 -0
  311. package/src/schema/type-conversion/type-mapping.test.ts +137 -0
  312. package/src/schema/type-conversion/type-mapping.ts +153 -0
  313. package/src/shared/connection-pool.ts +5 -5
  314. package/src/sql-driver/better-sqlite3.test.ts +126 -0
  315. package/src/sql-driver/connection/connection-provider.ts +27 -0
  316. package/src/sql-driver/connection/single-connection-provider.ts +42 -0
  317. package/src/sql-driver/dialect-adapter/dialect-adapter.ts +9 -0
  318. package/src/sql-driver/dialect-adapter/sqlite-dialect-adapter.ts +7 -0
  319. package/src/sql-driver/dialects/dialects.ts +1 -0
  320. package/src/sql-driver/dialects/durable-object-dialect.ts +260 -0
  321. package/src/sql-driver/driver/runtime-driver.ts +91 -0
  322. package/src/sql-driver/query-executor/default-query-executor.ts +38 -0
  323. package/src/sql-driver/query-executor/plugin.ts +22 -0
  324. package/src/sql-driver/query-executor/query-executor-base.ts +53 -0
  325. package/src/sql-driver/query-executor/query-executor.ts +44 -0
  326. package/src/sql-driver/sql-driver-adapter.ts +96 -0
  327. package/src/sql-driver/sql-driver.ts +53 -0
  328. package/src/sql-driver/sql.ts +57 -0
  329. package/src/sql-driver/sqlocal.test.ts +117 -0
  330. package/src/with-database.ts +152 -0
  331. package/tsdown.config.ts +8 -2
  332. package/dist/adapters/drizzle/drizzle-connection-pool.js +0 -40
  333. package/dist/adapters/drizzle/drizzle-connection-pool.js.map +0 -1
  334. package/dist/adapters/drizzle/drizzle-query.d.ts +0 -23
  335. package/dist/adapters/drizzle/drizzle-query.d.ts.map +0 -1
  336. package/dist/adapters/drizzle/drizzle-query.js.map +0 -1
  337. package/dist/adapters/drizzle/drizzle-uow-compiler.d.ts +0 -10
  338. package/dist/adapters/drizzle/drizzle-uow-compiler.d.ts.map +0 -1
  339. package/dist/adapters/drizzle/drizzle-uow-compiler.js +0 -315
  340. package/dist/adapters/drizzle/drizzle-uow-compiler.js.map +0 -1
  341. package/dist/adapters/drizzle/drizzle-uow-decoder.js +0 -116
  342. package/dist/adapters/drizzle/drizzle-uow-decoder.js.map +0 -1
  343. package/dist/adapters/drizzle/drizzle-uow-executor.js +0 -149
  344. package/dist/adapters/drizzle/drizzle-uow-executor.js.map +0 -1
  345. package/dist/adapters/drizzle/join-column-utils.js +0 -28
  346. package/dist/adapters/drizzle/join-column-utils.js.map +0 -1
  347. package/dist/adapters/drizzle/shared.d.ts +0 -14
  348. package/dist/adapters/drizzle/shared.d.ts.map +0 -1
  349. package/dist/adapters/drizzle/shared.js +0 -35
  350. package/dist/adapters/drizzle/shared.js.map +0 -1
  351. package/dist/adapters/kysely/kysely-connection-pool.js +0 -41
  352. package/dist/adapters/kysely/kysely-connection-pool.js.map +0 -1
  353. package/dist/adapters/kysely/kysely-query-builder.js +0 -321
  354. package/dist/adapters/kysely/kysely-query-builder.js.map +0 -1
  355. package/dist/adapters/kysely/kysely-query-compiler.js +0 -66
  356. package/dist/adapters/kysely/kysely-query-compiler.js.map +0 -1
  357. package/dist/adapters/kysely/kysely-query.d.ts +0 -22
  358. package/dist/adapters/kysely/kysely-query.d.ts.map +0 -1
  359. package/dist/adapters/kysely/kysely-query.js +0 -223
  360. package/dist/adapters/kysely/kysely-query.js.map +0 -1
  361. package/dist/adapters/kysely/kysely-shared.d.ts.map +0 -1
  362. package/dist/adapters/kysely/kysely-shared.js +0 -18
  363. package/dist/adapters/kysely/kysely-shared.js.map +0 -1
  364. package/dist/adapters/kysely/kysely-uow-compiler.js +0 -170
  365. package/dist/adapters/kysely/kysely-uow-compiler.js.map +0 -1
  366. package/dist/adapters/kysely/kysely-uow-executor.js +0 -89
  367. package/dist/adapters/kysely/kysely-uow-executor.js.map +0 -1
  368. package/dist/adapters/kysely/migration/execute-base.js +0 -128
  369. package/dist/adapters/kysely/migration/execute-base.js.map +0 -1
  370. package/dist/adapters/kysely/migration/execute-factory.js +0 -34
  371. package/dist/adapters/kysely/migration/execute-factory.js.map +0 -1
  372. package/dist/adapters/kysely/migration/execute-mssql.js +0 -112
  373. package/dist/adapters/kysely/migration/execute-mssql.js.map +0 -1
  374. package/dist/adapters/kysely/migration/execute-mysql.js +0 -93
  375. package/dist/adapters/kysely/migration/execute-mysql.js.map +0 -1
  376. package/dist/adapters/kysely/migration/execute-postgres.js +0 -104
  377. package/dist/adapters/kysely/migration/execute-postgres.js.map +0 -1
  378. package/dist/adapters/kysely/migration/execute-sqlite.js +0 -123
  379. package/dist/adapters/kysely/migration/execute-sqlite.js.map +0 -1
  380. package/dist/adapters/kysely/migration/execute.js +0 -34
  381. package/dist/adapters/kysely/migration/execute.js.map +0 -1
  382. package/dist/bind-services.d.ts +0 -7
  383. package/dist/bind-services.d.ts.map +0 -1
  384. package/dist/bind-services.js +0 -14
  385. package/dist/bind-services.js.map +0 -1
  386. package/dist/fragment.d.ts +0 -173
  387. package/dist/fragment.d.ts.map +0 -1
  388. package/dist/fragment.js +0 -191
  389. package/dist/fragment.js.map +0 -1
  390. package/dist/migration-engine/create.d.ts +0 -37
  391. package/dist/migration-engine/create.d.ts.map +0 -1
  392. package/dist/migration-engine/create.js +0 -58
  393. package/dist/migration-engine/create.js.map +0 -1
  394. package/dist/migration-engine/shared.d.ts +0 -112
  395. package/dist/migration-engine/shared.d.ts.map +0 -1
  396. package/dist/query/query.d.ts.map +0 -1
  397. package/dist/query/result-transform.js +0 -168
  398. package/dist/query/result-transform.js.map +0 -1
  399. package/dist/query/unit-of-work.d.ts.map +0 -1
  400. package/dist/query/unit-of-work.js.map +0 -1
  401. package/dist/schema/serialize.js +0 -106
  402. package/dist/schema/serialize.js.map +0 -1
  403. package/dist/shared/settings-schema.js +0 -36
  404. package/dist/shared/settings-schema.js.map +0 -1
  405. package/src/adapters/drizzle/drizzle-adapter.test.ts +0 -170
  406. package/src/adapters/drizzle/drizzle-connection-pool.ts +0 -66
  407. package/src/adapters/drizzle/drizzle-query.test.ts +0 -499
  408. package/src/adapters/drizzle/drizzle-uow-compiler.test.ts +0 -1383
  409. package/src/adapters/drizzle/drizzle-uow-compiler.ts +0 -636
  410. package/src/adapters/drizzle/drizzle-uow-decoder.ts +0 -218
  411. package/src/adapters/drizzle/drizzle-uow-executor.ts +0 -276
  412. package/src/adapters/drizzle/join-column-utils.test.ts +0 -79
  413. package/src/adapters/drizzle/join-column-utils.ts +0 -39
  414. package/src/adapters/kysely/kysely-connection-pool.ts +0 -70
  415. package/src/adapters/kysely/kysely-query-builder.test.ts +0 -1344
  416. package/src/adapters/kysely/kysely-query-builder.ts +0 -666
  417. package/src/adapters/kysely/kysely-query-compiler.ts +0 -132
  418. package/src/adapters/kysely/kysely-query.test.ts +0 -498
  419. package/src/adapters/kysely/kysely-query.ts +0 -390
  420. package/src/adapters/kysely/kysely-shared.ts +0 -23
  421. package/src/adapters/kysely/kysely-uow-compiler.test.ts +0 -998
  422. package/src/adapters/kysely/kysely-uow-compiler.ts +0 -318
  423. package/src/adapters/kysely/kysely-uow-executor.ts +0 -145
  424. package/src/adapters/kysely/kysely-uow-joins.test.ts +0 -811
  425. package/src/adapters/kysely/migration/execute-base.ts +0 -256
  426. package/src/adapters/kysely/migration/execute-factory.ts +0 -53
  427. package/src/adapters/kysely/migration/execute-mssql.ts +0 -250
  428. package/src/adapters/kysely/migration/execute-mysql.ts +0 -211
  429. package/src/adapters/kysely/migration/execute-postgres.test.ts +0 -2657
  430. package/src/adapters/kysely/migration/execute-postgres.ts +0 -234
  431. package/src/adapters/kysely/migration/execute-sqlite.ts +0 -247
  432. package/src/adapters/kysely/migration/execute.ts +0 -50
  433. package/src/adapters/kysely/migration/kysely-migrator.test.ts +0 -261
  434. package/src/bind-services.test.ts +0 -214
  435. package/src/bind-services.ts +0 -37
  436. package/src/db-fragment.test.ts +0 -800
  437. package/src/fragment.ts +0 -727
  438. package/src/query/result-transform.ts +0 -271
  439. package/src/query/unit-of-work-multi-schema.test.ts +0 -64
  440. package/src/query/unit-of-work.test.ts +0 -943
  441. package/src/schema/serialize.ts +0 -396
  442. package/src/shared/settings-schema.ts +0 -61
  443. package/src/uow-context-integration.test.ts +0 -102
  444. package/src/uow-context.test.ts +0 -182
  445. /package/dist/query/{query.js → simple-query-interface.js} +0 -0
@@ -1,315 +0,0 @@
1
- import { Column } from "../../schema/create.js";
2
- import { serialize } from "../../schema/serialize.js";
3
- import { decodeCursor, serializeCursorValues } from "../../query/cursor.js";
4
- import { buildCondition } from "../../query/condition-builder.js";
5
- import { createTableNameMapper, parseDrizzle } from "./shared.js";
6
- import { ReferenceSubquery, encodeValues } from "../../query/result-transform.js";
7
- import { getOrderedJoinColumns } from "./join-column-utils.js";
8
- import * as Drizzle from "drizzle-orm";
9
-
10
- //#region src/adapters/drizzle/drizzle-uow-compiler.ts
11
- /**
12
- * Create a Drizzle-specific Unit of Work compiler
13
- *
14
- * This compiler translates UOW operations into Drizzle query functions
15
- * that can be executed as a batch/transaction.
16
- *
17
- * @param pool - Connection pool for acquiring database connections
18
- * @param provider - SQL provider (sqlite, mysql, postgresql)
19
- * @param mapper - Optional table name mapper for namespace prefixing (fallback for operations without explicit namespace)
20
- * @returns A UOWCompiler instance for Drizzle
21
- */
22
- function createDrizzleUOWCompiler(pool, provider, mapper) {
23
- const [db, drizzleTables] = parseDrizzle(pool.getDatabaseSync());
24
- /**
25
- * Get the mapper for a specific operation
26
- * Uses operation's namespace if provided, otherwise falls back to the default mapper
27
- */
28
- function getMapperForOperation(namespace) {
29
- if (namespace) return createTableNameMapper(namespace);
30
- return mapper;
31
- }
32
- /**
33
- * Convert a Fragno table to a Drizzle table
34
- * @throws Error if table is not found in Drizzle schema
35
- */
36
- function toDrizzleTable(table, namespace) {
37
- const opMapper = getMapperForOperation(namespace);
38
- const physicalTableName = opMapper ? opMapper.toPhysical(table.ormName) : table.ormName;
39
- const out = drizzleTables[physicalTableName];
40
- if (out) return out;
41
- throw new Error(`[Drizzle] Unknown table name ${physicalTableName} (logical: ${table.ormName}), is it included in your Drizzle schema?`);
42
- }
43
- /**
44
- * Convert a Fragno column to a Drizzle column
45
- * @throws Error if column is not found in Drizzle table
46
- */
47
- function toDrizzleColumn(schema, namespace, col) {
48
- const fragnoTable = schema.tables[col.tableName];
49
- if (!fragnoTable) throw new Error(`[Drizzle] Unknown table ${col.tableName} for column ${col.ormName}.`);
50
- const out = toDrizzleTable(fragnoTable, namespace)[col.ormName];
51
- if (out) return out;
52
- throw new Error(`[Drizzle] Unknown column name ${col.ormName} in ${fragnoTable.ormName}.`);
53
- }
54
- /**
55
- * Build a WHERE clause from a condition using Drizzle's query builder
56
- */
57
- function buildWhere(schema, namespace, condition) {
58
- if (condition.type === "compare") {
59
- const left = toDrizzleColumn(schema, namespace, condition.a);
60
- const op = condition.operator;
61
- let right = condition.b;
62
- if (right instanceof Column) right = toDrizzleColumn(schema, namespace, right);
63
- else if (condition.a.role === "reference" && typeof right === "string") {
64
- const table = Object.values(schema.tables).find((t) => Object.values(t.columns).includes(condition.a));
65
- if (table) {
66
- const relation = Object.values(table.relations).find((rel) => rel.on.some(([localCol]) => localCol === condition.a.ormName));
67
- if (relation) {
68
- const refTable = relation.table;
69
- const internalIdCol = refTable.getInternalIdColumn();
70
- const idCol = refTable.getIdColumn();
71
- const physicalTableName = mapper ? mapper.toPhysical(refTable.ormName) : refTable.ormName;
72
- right = Drizzle.sql`(select ${Drizzle.sql.identifier(internalIdCol.name)} from ${Drizzle.sql.identifier(physicalTableName)} where ${Drizzle.sql.identifier(idCol.name)} = ${right} limit 1)`;
73
- }
74
- }
75
- } else right = serialize(right, condition.a, provider);
76
- switch (op) {
77
- case "=": return Drizzle.eq(left, right);
78
- case "!=": return Drizzle.ne(left, right);
79
- case ">": return Drizzle.gt(left, right);
80
- case ">=": return Drizzle.gte(left, right);
81
- case "<": return Drizzle.lt(left, right);
82
- case "<=": return Drizzle.lte(left, right);
83
- case "in": return Drizzle.inArray(left, right);
84
- case "not in": return Drizzle.notInArray(left, right);
85
- case "is": return right === null ? Drizzle.isNull(left) : Drizzle.eq(left, right);
86
- case "is not": return right === null ? Drizzle.isNotNull(left) : Drizzle.ne(left, right);
87
- case "contains":
88
- right = typeof right === "string" ? `%${right}%` : Drizzle.sql`concat('%', ${right}, '%')`;
89
- return Drizzle.like(left, right);
90
- case "not contains":
91
- right = typeof right === "string" ? `%${right}%` : Drizzle.sql`concat('%', ${right}, '%')`;
92
- return Drizzle.notLike(left, right);
93
- case "ends with":
94
- right = typeof right === "string" ? `%${right}` : Drizzle.sql`concat('%', ${right})`;
95
- return Drizzle.like(left, right);
96
- case "not ends with":
97
- right = typeof right === "string" ? `%${right}` : Drizzle.sql`concat('%', ${right})`;
98
- return Drizzle.notLike(left, right);
99
- case "starts with":
100
- right = typeof right === "string" ? `${right}%` : Drizzle.sql`concat(${right}, '%')`;
101
- return Drizzle.like(left, right);
102
- case "not starts with":
103
- right = typeof right === "string" ? `${right}%` : Drizzle.sql`concat(${right}, '%')`;
104
- return Drizzle.notLike(left, right);
105
- default: throw new Error(`Unsupported operator: ${op}`);
106
- }
107
- }
108
- if (condition.type === "and") return Drizzle.and(...condition.items.map((item) => buildWhere(schema, namespace, item)));
109
- if (condition.type === "not") {
110
- const result = buildWhere(schema, namespace, condition.item);
111
- if (!result) return;
112
- return Drizzle.not(result);
113
- }
114
- return Drizzle.or(...condition.items.map((item) => buildWhere(schema, namespace, item)));
115
- }
116
- /**
117
- * Process reference subqueries in encoded values, converting them to Drizzle SQL subqueries
118
- */
119
- function processReferenceSubqueries(values) {
120
- const processed = {};
121
- for (const [key, value] of Object.entries(values)) if (value instanceof ReferenceSubquery) {
122
- const refTable = value.referencedTable;
123
- const externalId = value.externalIdValue;
124
- const internalIdCol = refTable.getInternalIdColumn();
125
- const idCol = refTable.getIdColumn();
126
- const physicalTableName = mapper ? mapper.toPhysical(refTable.ormName) : refTable.ormName;
127
- processed[key] = Drizzle.sql`(select ${Drizzle.sql.identifier(internalIdCol.name)} from ${Drizzle.sql.identifier(physicalTableName)} where ${Drizzle.sql.identifier(idCol.name)} = ${externalId} limit 1)`;
128
- } else processed[key] = value;
129
- return processed;
130
- }
131
- /**
132
- * Get table from schema by name
133
- * @throws Error if table is not found in schema
134
- */
135
- function getTable(schema, name) {
136
- const table = schema.tables[name];
137
- if (!table) throw new Error(`Invalid table name ${name}.`);
138
- return table;
139
- }
140
- /**
141
- * Get the version to check for a given ID and checkVersion flag.
142
- * @returns The version to check or undefined if no check is required.
143
- * @throws Error if the ID is a string and checkVersion is true.
144
- */
145
- function getVersionToCheck(id, checkVersion) {
146
- if (!checkVersion) return;
147
- if (typeof id === "string") throw new Error(`Cannot use checkVersion with a string ID. Version checking requires a FragnoId with version information.`);
148
- return id.version;
149
- }
150
- /**
151
- * Process joins recursively to support nested joins with orderBy and limit
152
- */
153
- function processJoins(schema, namespace, joins) {
154
- const result = {};
155
- for (const join of joins) {
156
- const { options, relation } = join;
157
- if (!options) continue;
158
- const targetTable = relation.table;
159
- const joinName = relation.name;
160
- const orderedColumns = getOrderedJoinColumns(targetTable, options.select === void 0 ? true : options.select);
161
- const joinColumns = {};
162
- for (const colName of orderedColumns) joinColumns[colName] = true;
163
- let joinOrderBy;
164
- if (options.orderBy && options.orderBy.length > 0) joinOrderBy = options.orderBy.map(([col, direction]) => {
165
- const drizzleCol = toDrizzleColumn(schema, namespace, col);
166
- return direction === "asc" ? Drizzle.asc(drizzleCol) : Drizzle.desc(drizzleCol);
167
- });
168
- let joinWhere;
169
- if (options.where) joinWhere = buildWhere(schema, namespace, options.where);
170
- const joinConfig = {
171
- columns: joinColumns,
172
- orderBy: joinOrderBy,
173
- limit: options.limit,
174
- where: joinWhere
175
- };
176
- if (options.join && options.join.length > 0) joinConfig.with = processJoins(schema, namespace, options.join);
177
- result[joinName] = joinConfig;
178
- }
179
- return result;
180
- }
181
- return {
182
- compileRetrievalOperation(op) {
183
- const schema = op.schema;
184
- switch (op.type) {
185
- case "count": {
186
- let whereClause;
187
- if (op.options.where) {
188
- const condition = buildCondition(op.table.columns, op.options.where);
189
- if (condition === false) return null;
190
- if (condition !== true) whereClause = buildWhere(schema, op.namespace, condition);
191
- }
192
- const drizzleTable = toDrizzleTable(op.table, op.namespace);
193
- const query = db.select({ count: Drizzle.count() }).from(drizzleTable);
194
- return whereClause ? query.where(whereClause).toSQL() : query.toSQL();
195
- }
196
- case "find": {
197
- const { useIndex: _useIndex, orderByIndex, joins, after, before, pageSize,...findOptions } = op.options;
198
- let indexColumns = [];
199
- let orderDirection = "asc";
200
- if (orderByIndex) {
201
- const index = op.table.indexes[orderByIndex.indexName];
202
- orderDirection = orderByIndex.direction;
203
- if (!index) if (orderByIndex.indexName === "_primary") indexColumns = [op.table.getIdColumn()];
204
- else throw new Error(`Index "${orderByIndex.indexName}" not found on table "${op.table.name}"`);
205
- else indexColumns = index.columns;
206
- }
207
- let orderBy;
208
- if (indexColumns.length > 0) orderBy = indexColumns.map((col) => {
209
- const drizzleCol = toDrizzleColumn(schema, op.namespace, col);
210
- return orderDirection === "asc" ? Drizzle.asc(drizzleCol) : Drizzle.desc(drizzleCol);
211
- });
212
- const columns = {};
213
- const select = findOptions.select;
214
- if (select === true || select === void 0) for (const col of Object.values(op.table.columns)) columns[col.ormName] = true;
215
- else {
216
- for (const k of select) columns[op.table.columns[k].ormName] = true;
217
- for (const col of Object.values(op.table.columns)) if (col.isHidden && !columns[col.ormName]) columns[col.ormName] = true;
218
- }
219
- const whereClauses = [];
220
- if (findOptions.where) {
221
- const condition = buildCondition(op.table.columns, findOptions.where);
222
- if (condition === false) return null;
223
- if (condition !== true) {
224
- const clause = buildWhere(schema, op.namespace, condition);
225
- if (clause) whereClauses.push(clause);
226
- }
227
- }
228
- if ((after || before) && indexColumns.length > 0) {
229
- const cursor = after || before;
230
- const serializedValues = serializeCursorValues(typeof cursor === "string" ? decodeCursor(cursor) : cursor, indexColumns, provider);
231
- const isAfter = !!after;
232
- const useGreaterThan = isAfter && orderDirection === "asc" || !isAfter && orderDirection === "desc";
233
- if (indexColumns.length === 1) {
234
- const col = toDrizzleColumn(schema, op.namespace, indexColumns[0]);
235
- const val = serializedValues[indexColumns[0].ormName];
236
- whereClauses.push(useGreaterThan ? Drizzle.gt(col, val) : Drizzle.lt(col, val));
237
- } else {
238
- const drizzleCols = indexColumns.map((c) => toDrizzleColumn(schema, op.namespace, c));
239
- const vals = indexColumns.map((c) => serializedValues[c.ormName]);
240
- const operator = useGreaterThan ? ">" : "<";
241
- const colsSQL = Drizzle.sql.join(drizzleCols, Drizzle.sql.raw(", "));
242
- const valsSQL = Drizzle.sql.join(vals.map((v) => Drizzle.sql`${v}`), Drizzle.sql.raw(", "));
243
- whereClauses.push(Drizzle.sql`(${colsSQL}) ${Drizzle.sql.raw(operator)} (${valsSQL})`);
244
- }
245
- }
246
- const queryConfig = {
247
- columns,
248
- limit: pageSize,
249
- where: whereClauses.length > 0 ? Drizzle.and(...whereClauses) : void 0,
250
- orderBy,
251
- with: {}
252
- };
253
- if (joins) queryConfig.with = processJoins(schema, op.namespace, joins);
254
- const opMapper = getMapperForOperation(op.namespace);
255
- const physicalTableName = opMapper ? opMapper.toPhysical(op.table.ormName) : op.table.ormName;
256
- const tableQuery = db.query[physicalTableName];
257
- if (!tableQuery) throw new Error(`[Drizzle] Table ${op.table.ormName} (physical: ${physicalTableName}) not found in db.query. Available tables: ${Object.keys(db.query).join(", ")}`);
258
- return tableQuery.findMany(queryConfig).toSQL();
259
- }
260
- }
261
- },
262
- compileMutationOperation(op) {
263
- const schema = op.schema;
264
- switch (op.type) {
265
- case "create": {
266
- const table = getTable(schema, op.table);
267
- const drizzleTable = toDrizzleTable(table, op.namespace);
268
- const values = processReferenceSubqueries(encodeValues(op.values, table, true, provider));
269
- return {
270
- query: db.insert(drizzleTable).values(values).toSQL(),
271
- expectedAffectedRows: null
272
- };
273
- }
274
- case "update": {
275
- const table = getTable(schema, op.table);
276
- const idColumn = table.getIdColumn();
277
- const versionColumn = table.getVersionColumn();
278
- const drizzleTable = toDrizzleTable(table, op.namespace);
279
- const externalId = typeof op.id === "string" ? op.id : op.id.externalId;
280
- const versionToCheck = getVersionToCheck(op.id, op.checkVersion);
281
- const condition = 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));
282
- if (condition === false) return null;
283
- const whereClause = condition === true ? void 0 : buildWhere(schema, op.namespace, condition);
284
- const setValues = processReferenceSubqueries(encodeValues(op.set, table, false, provider));
285
- setValues[versionColumn.ormName] = Drizzle.sql.raw(`COALESCE(${versionColumn.ormName}, 0) + 1`);
286
- return {
287
- query: db.update(drizzleTable).set(setValues).where(whereClause).toSQL(),
288
- expectedAffectedRows: op.checkVersion ? 1 : null
289
- };
290
- }
291
- case "delete": {
292
- const table = getTable(schema, op.table);
293
- const idColumn = table.getIdColumn();
294
- const versionColumn = table.getVersionColumn();
295
- const drizzleTable = toDrizzleTable(table, op.namespace);
296
- if (!op.id) throw new Error(`[Drizzle] Delete operation on table "${op.table}" has undefined id. Make sure you're passing a valid FragnoId or string ID.`);
297
- const externalId = typeof op.id === "string" ? op.id : op.id.externalId;
298
- if (!externalId) throw new Error(`[Drizzle] Delete operation on table "${op.table}" has invalid id. The FragnoId object exists but has no externalId. Received: ${JSON.stringify(op.id)}. Make sure the record was properly loaded from the database.`);
299
- const versionToCheck = getVersionToCheck(op.id, op.checkVersion);
300
- const condition = 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));
301
- if (condition === false) return null;
302
- const whereClause = condition === true ? void 0 : buildWhere(schema, op.namespace, condition);
303
- return {
304
- query: db.delete(drizzleTable).where(whereClause).toSQL(),
305
- expectedAffectedRows: op.checkVersion ? 1 : null
306
- };
307
- }
308
- }
309
- }
310
- };
311
- }
312
-
313
- //#endregion
314
- export { createDrizzleUOWCompiler };
315
- //# sourceMappingURL=drizzle-uow-compiler.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"drizzle-uow-compiler.js","names":["processed: Record<string, unknown>","result: Record<string, Drizzle.DBQueryConfig<\"many\", boolean>>","joinColumns: Record<string, boolean>","joinOrderBy: Drizzle.SQL[] | undefined","joinWhere: Drizzle.SQL | undefined","joinConfig: Drizzle.DBQueryConfig<\"many\", boolean>","whereClause: Drizzle.SQL | undefined","indexColumns: AnyColumn[]","orderDirection: \"asc\" | \"desc\"","orderBy: Drizzle.SQL[] | undefined","columns: Record<string, boolean>","whereClauses: Drizzle.SQL[]","queryConfig: Drizzle.DBQueryConfig<\"many\", boolean>"],"sources":["../../../src/adapters/drizzle/drizzle-uow-compiler.ts"],"sourcesContent":["import * as Drizzle from \"drizzle-orm\";\nimport type { AnyColumn, AnySchema, AnyTable, FragnoId } from \"../../schema/create\";\nimport { Column } from \"../../schema/create\";\nimport type {\n CompiledMutation,\n MutationOperation,\n RetrievalOperation,\n UOWCompiler,\n} from \"../../query/unit-of-work\";\nimport { buildCondition, type Condition } from \"../../query/condition-builder\";\nimport {\n type ColumnType,\n type TableType,\n type TableNameMapper,\n parseDrizzle,\n type DBType,\n createTableNameMapper,\n} from \"./shared\";\nimport { encodeValues, ReferenceSubquery } from \"../../query/result-transform\";\nimport { serialize } from \"../../schema/serialize\";\nimport { decodeCursor, serializeCursorValues } from \"../../query/cursor\";\nimport type { CompiledJoin } from \"../../query/orm/orm\";\nimport { getOrderedJoinColumns } from \"./join-column-utils\";\nimport type { ConnectionPool } from \"../../shared/connection-pool\";\n\nexport type DrizzleCompiledQuery = {\n sql: string;\n params: unknown[];\n};\n\n/**\n * Create a Drizzle-specific Unit of Work compiler\n *\n * This compiler translates UOW operations into Drizzle query functions\n * that can be executed as a batch/transaction.\n *\n * @param pool - Connection pool for acquiring database connections\n * @param provider - SQL provider (sqlite, mysql, postgresql)\n * @param mapper - Optional table name mapper for namespace prefixing (fallback for operations without explicit namespace)\n * @returns A UOWCompiler instance for Drizzle\n */\nexport function createDrizzleUOWCompiler(\n pool: ConnectionPool<DBType>,\n provider: \"sqlite\" | \"mysql\" | \"postgresql\",\n mapper?: TableNameMapper,\n): UOWCompiler<DrizzleCompiledQuery> {\n // Get db synchronously for compilation (doesn't execute, just builds SQL)\n // TODO: We don't even need a Drizzle instance with a db client attached here. `drizzle({ schema })` is enough.\n const dbRaw = pool.getDatabaseSync();\n const [db, drizzleTables] = parseDrizzle(dbRaw);\n\n /**\n * Get the mapper for a specific operation\n * Uses operation's namespace if provided, otherwise falls back to the default mapper\n */\n function getMapperForOperation(namespace: string | undefined): TableNameMapper | undefined {\n if (namespace) {\n return createTableNameMapper(namespace);\n }\n return mapper;\n }\n\n /**\n * Convert a Fragno table to a Drizzle table\n * @throws Error if table is not found in Drizzle schema\n */\n function toDrizzleTable(table: AnyTable, namespace: string | undefined): TableType {\n // Get the mapper for this operation's namespace\n const opMapper = getMapperForOperation(namespace);\n\n // Map logical table name to physical table name using the operation-specific mapper\n const physicalTableName = opMapper ? opMapper.toPhysical(table.ormName) : table.ormName;\n const out = drizzleTables[physicalTableName];\n if (out) {\n return out;\n }\n\n throw new Error(\n `[Drizzle] Unknown table name ${physicalTableName} (logical: ${table.ormName}), is it included in your Drizzle schema?`,\n );\n }\n\n /**\n * Convert a Fragno column to a Drizzle column\n * @throws Error if column is not found in Drizzle table\n */\n function toDrizzleColumn(\n schema: AnySchema,\n namespace: string | undefined,\n col: AnyColumn,\n ): ColumnType {\n const fragnoTable = schema.tables[col.tableName];\n if (!fragnoTable) {\n throw new Error(`[Drizzle] Unknown table ${col.tableName} for column ${col.ormName}.`);\n }\n\n const table = toDrizzleTable(fragnoTable, namespace);\n const out = table[col.ormName];\n if (out) {\n return out;\n }\n\n throw new Error(`[Drizzle] Unknown column name ${col.ormName} in ${fragnoTable.ormName}.`);\n }\n\n /**\n * Build a WHERE clause from a condition using Drizzle's query builder\n */\n function buildWhere(\n schema: AnySchema,\n namespace: string | undefined,\n condition: Condition,\n ): Drizzle.SQL | undefined {\n if (condition.type === \"compare\") {\n const left = toDrizzleColumn(schema, namespace, condition.a);\n const op = condition.operator;\n let right = condition.b;\n if (right instanceof Column) {\n right = toDrizzleColumn(schema, namespace, right);\n } else {\n // Handle string references - convert external ID to internal ID via subquery\n if (condition.a.role === \"reference\" && typeof right === \"string\") {\n // Find the table that contains this column\n const table = Object.values(schema.tables).find((t) =>\n Object.values(t.columns).includes(condition.a),\n );\n if (table) {\n // Find relation that uses this column\n const relation = Object.values(table.relations).find((rel) =>\n rel.on.some(([localCol]) => localCol === condition.a.ormName),\n );\n if (relation) {\n const refTable = relation.table;\n const internalIdCol = refTable.getInternalIdColumn();\n const idCol = refTable.getIdColumn();\n const physicalTableName = mapper\n ? mapper.toPhysical(refTable.ormName)\n : refTable.ormName;\n\n // Build a SQL subquery using Drizzle's sql template\n right = Drizzle.sql`(select ${Drizzle.sql.identifier(internalIdCol.name)} from ${Drizzle.sql.identifier(physicalTableName)} where ${Drizzle.sql.identifier(idCol.name)} = ${right} limit 1)`;\n }\n }\n } else {\n // Serialize non-Column values (e.g., FragnoId -> string, Date -> number for SQLite)\n right = serialize(right, condition.a, provider);\n }\n }\n\n switch (op) {\n case \"=\":\n return Drizzle.eq(left, right);\n case \"!=\":\n return Drizzle.ne(left, right);\n case \">\":\n return Drizzle.gt(left, right);\n case \">=\":\n return Drizzle.gte(left, right);\n case \"<\":\n return Drizzle.lt(left, right);\n case \"<=\":\n return Drizzle.lte(left, right);\n case \"in\": {\n return Drizzle.inArray(left, right as never[]);\n }\n case \"not in\":\n return Drizzle.notInArray(left, right as never[]);\n case \"is\":\n return right === null ? Drizzle.isNull(left) : Drizzle.eq(left, right);\n case \"is not\":\n return right === null ? Drizzle.isNotNull(left) : Drizzle.ne(left, right);\n case \"contains\": {\n right =\n typeof right === \"string\" ? `%${right}%` : Drizzle.sql`concat('%', ${right}, '%')`;\n return Drizzle.like(left, right as string);\n }\n case \"not contains\": {\n right =\n typeof right === \"string\" ? `%${right}%` : Drizzle.sql`concat('%', ${right}, '%')`;\n return Drizzle.notLike(left, right as string);\n }\n case \"ends with\": {\n right = typeof right === \"string\" ? `%${right}` : Drizzle.sql`concat('%', ${right})`;\n return Drizzle.like(left, right as string);\n }\n case \"not ends with\": {\n right = typeof right === \"string\" ? `%${right}` : Drizzle.sql`concat('%', ${right})`;\n return Drizzle.notLike(left, right as string);\n }\n case \"starts with\": {\n right = typeof right === \"string\" ? `${right}%` : Drizzle.sql`concat(${right}, '%')`;\n return Drizzle.like(left, right as string);\n }\n case \"not starts with\": {\n right = typeof right === \"string\" ? `${right}%` : Drizzle.sql`concat(${right}, '%')`;\n return Drizzle.notLike(left, right as string);\n }\n\n default:\n throw new Error(`Unsupported operator: ${op}`);\n }\n }\n\n if (condition.type === \"and\") {\n return Drizzle.and(...condition.items.map((item) => buildWhere(schema, namespace, item)));\n }\n\n if (condition.type === \"not\") {\n const result = buildWhere(schema, namespace, condition.item);\n if (!result) {\n return;\n }\n\n return Drizzle.not(result);\n }\n\n return Drizzle.or(...condition.items.map((item) => buildWhere(schema, namespace, item)));\n }\n\n /**\n * Process reference subqueries in encoded values, converting them to Drizzle SQL subqueries\n */\n function processReferenceSubqueries(values: Record<string, unknown>): Record<string, unknown> {\n const processed: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(values)) {\n if (value instanceof ReferenceSubquery) {\n const refTable = value.referencedTable;\n const externalId = value.externalIdValue;\n const internalIdCol = refTable.getInternalIdColumn();\n const idCol = refTable.getIdColumn();\n\n // Map logical table name to physical table name using the mapper\n const physicalTableName = mapper ? mapper.toPhysical(refTable.ormName) : refTable.ormName;\n\n // Build a SQL subquery using Drizzle's sql template\n // This creates a subquery: (SELECT _internalId FROM table WHERE id = ? LIMIT 1)\n // Safe cast: we're building a SQL subquery that returns a single bigint value\n processed[key] =\n Drizzle.sql`(select ${Drizzle.sql.identifier(internalIdCol.name)} from ${Drizzle.sql.identifier(physicalTableName)} where ${Drizzle.sql.identifier(idCol.name)} = ${externalId} limit 1)`;\n } else {\n processed[key] = value;\n }\n }\n\n return processed;\n }\n\n /**\n * Get table from schema by name\n * @throws Error if table is not found in schema\n */\n function getTable(schema: AnySchema, name: unknown): AnyTable {\n const table = schema.tables[name as string];\n if (!table) {\n throw new Error(`Invalid table name ${name}.`);\n }\n return table;\n }\n\n /**\n * Get the version to check for a given ID and checkVersion flag.\n * @returns The version to check or undefined if no check is required.\n * @throws Error if the ID is a string and checkVersion is true.\n */\n function getVersionToCheck(id: FragnoId | string, checkVersion: boolean): number | undefined {\n if (!checkVersion) {\n return undefined;\n }\n\n if (typeof id === \"string\") {\n throw new Error(\n `Cannot use checkVersion with a string ID. Version checking requires a FragnoId with version information.`,\n );\n }\n\n return id.version;\n }\n\n /**\n * Process joins recursively to support nested joins with orderBy and limit\n */\n function processJoins(\n schema: AnySchema,\n namespace: string | undefined,\n joins: CompiledJoin[],\n ): Record<string, Drizzle.DBQueryConfig<\"many\", boolean>> {\n const result: Record<string, Drizzle.DBQueryConfig<\"many\", boolean>> = {};\n\n for (const join of joins) {\n const { options, relation } = join;\n\n if (!options) {\n continue;\n }\n\n const targetTable = relation.table;\n const joinName = relation.name;\n\n // Build columns for this join using shared utility\n const selectOption = options.select === undefined ? true : options.select;\n const orderedColumns = getOrderedJoinColumns(targetTable, selectOption);\n const joinColumns: Record<string, boolean> = {};\n for (const colName of orderedColumns) {\n joinColumns[colName] = true;\n }\n\n // Build orderBy for this join\n let joinOrderBy: Drizzle.SQL[] | undefined;\n if (options.orderBy && options.orderBy.length > 0) {\n joinOrderBy = options.orderBy.map(([col, direction]) => {\n const drizzleCol = toDrizzleColumn(schema, namespace, col);\n return direction === \"asc\" ? Drizzle.asc(drizzleCol) : Drizzle.desc(drizzleCol);\n });\n }\n\n // Build WHERE clause for this join if provided\n let joinWhere: Drizzle.SQL | undefined;\n if (options.where) {\n joinWhere = buildWhere(schema, namespace, options.where);\n }\n\n // Build the join config\n const joinConfig: Drizzle.DBQueryConfig<\"many\", boolean> = {\n columns: joinColumns,\n orderBy: joinOrderBy,\n limit: options.limit,\n where: joinWhere,\n };\n\n // Recursively process nested joins\n if (options.join && options.join.length > 0) {\n joinConfig.with = processJoins(schema, namespace, options.join);\n }\n\n result[joinName] = joinConfig;\n }\n\n return result;\n }\n\n return {\n compileRetrievalOperation(op: RetrievalOperation<AnySchema>): DrizzleCompiledQuery | null {\n const schema = op.schema;\n switch (op.type) {\n case \"count\": {\n // Build WHERE clause\n let whereClause: Drizzle.SQL | undefined;\n if (op.options.where) {\n const condition = buildCondition(op.table.columns, op.options.where);\n if (condition === false) {\n // Never matches - return null\n return null;\n }\n if (condition !== true) {\n whereClause = buildWhere(schema, op.namespace, condition);\n }\n }\n\n const drizzleTable = toDrizzleTable(op.table, op.namespace);\n const query = db.select({ count: Drizzle.count() }).from(drizzleTable);\n\n const compiledQuery = whereClause ? query.where(whereClause).toSQL() : query.toSQL();\n return compiledQuery;\n }\n\n case \"find\": {\n const {\n useIndex: _useIndex,\n orderByIndex,\n joins,\n after,\n before,\n pageSize,\n ...findOptions\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 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 indexColumns = index.columns;\n }\n }\n\n // Convert orderByIndex to orderBy format\n let orderBy: Drizzle.SQL[] | undefined;\n if (indexColumns.length > 0) {\n orderBy = indexColumns.map((col) => {\n const drizzleCol = toDrizzleColumn(schema, op.namespace, col);\n return orderDirection === \"asc\" ? Drizzle.asc(drizzleCol) : Drizzle.desc(drizzleCol);\n });\n }\n\n // Build query configuration\n const columns: Record<string, boolean> = {};\n const select = findOptions.select;\n\n if (select === true || select === undefined) {\n for (const col of Object.values(op.table.columns)) {\n columns[col.ormName] = true;\n }\n } else {\n for (const k of select) {\n columns[op.table.columns[k].ormName] = true;\n }\n // Always include hidden columns (for FragnoId construction with internal ID and version)\n for (const col of Object.values(op.table.columns)) {\n if (col.isHidden && !columns[col.ormName]) {\n columns[col.ormName] = true;\n }\n }\n }\n\n // Build WHERE clause with cursor conditions\n const whereClauses: Drizzle.SQL[] = [];\n\n // Add user-defined where clause\n if (findOptions.where) {\n const condition = buildCondition(op.table.columns, findOptions.where);\n if (condition === false) {\n // Never matches - return null to indicate this query should be skipped\n return null;\n }\n if (condition !== true) {\n const clause = buildWhere(schema, op.namespace, condition);\n if (clause) {\n whereClauses.push(clause);\n }\n }\n }\n\n // Add cursor-based pagination conditions\n if ((after || before) && indexColumns.length > 0) {\n const cursor = after || before;\n // Decode cursor if it's a string, otherwise use it as-is\n const cursorObj = typeof cursor === \"string\" ? decodeCursor(cursor!) : cursor!;\n const serializedValues = serializeCursorValues(cursorObj, indexColumns, provider);\n\n // Build tuple comparison for cursor pagination\n // For \"after\" with \"asc\": (col1, col2, ...) > (val1, val2, ...)\n // For \"before\" with \"desc\": reverse the comparison\n const isAfter = !!after;\n const useGreaterThan =\n (isAfter && orderDirection === \"asc\") || (!isAfter && orderDirection === \"desc\");\n\n if (indexColumns.length === 1) {\n // Simple single-column case\n const col = toDrizzleColumn(schema, op.namespace, indexColumns[0]!);\n const val = serializedValues[indexColumns[0]!.ormName];\n whereClauses.push(useGreaterThan ? Drizzle.gt(col, val) : Drizzle.lt(col, val));\n } else {\n // Multi-column tuple comparison using SQL\n const drizzleCols = indexColumns.map((c) => toDrizzleColumn(schema, op.namespace, c));\n const vals = indexColumns.map((c) => serializedValues[c.ormName]);\n const operator = useGreaterThan ? \">\" : \"<\";\n // Safe cast: building a SQL comparison expression for cursor pagination\n // Build the tuple comparison: (col1, col2) > (val1, val2)\n const colsSQL = Drizzle.sql.join(drizzleCols, Drizzle.sql.raw(\", \"));\n const valsSQL = Drizzle.sql.join(\n vals.map((v) => Drizzle.sql`${v}`),\n Drizzle.sql.raw(\", \"),\n );\n whereClauses.push(\n Drizzle.sql`(${colsSQL}) ${Drizzle.sql.raw(operator)} (${valsSQL})`,\n );\n }\n }\n\n const whereClause = whereClauses.length > 0 ? Drizzle.and(...whereClauses) : undefined;\n\n const queryConfig: Drizzle.DBQueryConfig<\"many\", boolean> = {\n columns,\n limit: pageSize,\n where: whereClause,\n orderBy,\n with: {},\n };\n\n // Process joins recursively to support nested joins\n if (joins) {\n queryConfig.with = processJoins(schema, op.namespace, joins);\n }\n\n // For multi-schema support: get the mapper for the operation's namespace\n const opMapper = getMapperForOperation(op.namespace);\n const physicalTableName = opMapper\n ? opMapper.toPhysical(op.table.ormName)\n : op.table.ormName;\n const tableQuery = db.query[physicalTableName];\n\n if (!tableQuery) {\n throw new Error(\n `[Drizzle] Table ${op.table.ormName} (physical: ${physicalTableName}) not found in db.query. ` +\n `Available tables: ${Object.keys(db.query).join(\", \")}`,\n );\n }\n\n const compiledQuery = tableQuery.findMany(queryConfig).toSQL();\n return compiledQuery;\n }\n }\n },\n\n compileMutationOperation(\n op: MutationOperation<AnySchema>,\n ): CompiledMutation<DrizzleCompiledQuery> | null {\n const schema = op.schema;\n switch (op.type) {\n case \"create\": {\n const table = getTable(schema, op.table);\n const drizzleTable = toDrizzleTable(table, op.namespace);\n // encodeValues now handles runtime defaults automatically\n const encodedValues = encodeValues(op.values, table, true, provider);\n const values = processReferenceSubqueries(encodedValues);\n\n const compiledQuery = db.insert(drizzleTable).values(values).toSQL();\n return {\n query: compiledQuery,\n expectedAffectedRows: null, // creates don't need affected row checks\n };\n }\n\n case \"update\": {\n const table = getTable(schema, op.table);\n const idColumn = table.getIdColumn();\n const versionColumn = table.getVersionColumn();\n const drizzleTable = toDrizzleTable(table, op.namespace);\n\n const externalId = typeof op.id === \"string\" ? op.id : op.id.externalId;\n const versionToCheck = getVersionToCheck(op.id, op.checkVersion);\n\n // Build WHERE clause that filters by ID and optionally by version\n const condition =\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 // Handle boolean cases\n if (condition === false) {\n // Never matches - skip this operation\n return null;\n }\n\n const whereClause =\n condition === true ? undefined : buildWhere(schema, op.namespace, condition);\n const encodedSetValues = encodeValues(op.set, table, false, provider);\n const setValues = processReferenceSubqueries(encodedSetValues);\n\n // Automatically increment _version for optimistic concurrency control\n // Safe cast: we're building a SQL expression for incrementing the version\n setValues[versionColumn.ormName] = Drizzle.sql.raw(\n `COALESCE(${versionColumn.ormName}, 0) + 1`,\n ) as unknown;\n\n const compiledQuery = db.update(drizzleTable).set(setValues).where(whereClause).toSQL();\n return {\n query: compiledQuery,\n expectedAffectedRows: op.checkVersion ? 1 : null,\n };\n }\n\n case \"delete\": {\n const table = getTable(schema, op.table);\n const idColumn = table.getIdColumn();\n const versionColumn = table.getVersionColumn();\n const drizzleTable = toDrizzleTable(table, op.namespace);\n\n if (!op.id) {\n throw new Error(\n `[Drizzle] Delete operation on table \"${op.table}\" has undefined id. ` +\n `Make sure you're passing a valid FragnoId or string ID.`,\n );\n }\n\n const externalId = typeof op.id === \"string\" ? op.id : op.id.externalId;\n\n if (!externalId) {\n throw new Error(\n `[Drizzle] Delete operation on table \"${op.table}\" has invalid id. ` +\n `The FragnoId object exists but has no externalId. ` +\n `Received: ${JSON.stringify(op.id)}. ` +\n `Make sure the record was properly loaded from the database.`,\n );\n }\n const versionToCheck = getVersionToCheck(op.id, op.checkVersion);\n\n // Build WHERE clause that filters by ID and optionally by version\n const condition =\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 // Handle boolean cases\n if (condition === false) {\n // Never matches - skip this operation\n return null;\n }\n\n const whereClause =\n condition === true ? undefined : buildWhere(schema, op.namespace, condition);\n\n const compiledQuery = db.delete(drizzleTable).where(whereClause).toSQL();\n return {\n query: compiledQuery,\n expectedAffectedRows: op.checkVersion ? 1 : null,\n };\n }\n }\n },\n };\n}\n"],"mappings":"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"}
@@ -1,116 +0,0 @@
1
- import { createCursorFromRecord } from "../../query/cursor.js";
2
- import { decodeResult } from "../../query/result-transform.js";
3
- import { getOrderedJoinColumns } from "./join-column-utils.js";
4
-
5
- //#region src/adapters/drizzle/drizzle-uow-decoder.ts
6
- /**
7
- * Recursively transform join arrays to objects, handling nested joins.
8
- *
9
- * Drizzle joins use `json_build_array` where nested join data is appended after the parent's columns.
10
- * For example, if post has columns [id, title, content, _internalId, _version] and a nested author join,
11
- * the array will be: [id, title, content, _internalId, _version, authorArray]
12
- *
13
- * @param value - The join array from Drizzle
14
- * @param joinInfo - Join metadata including nested joins
15
- * @param relationName - Name of the current relation (for prefixing column names)
16
- * @returns Object with flattened keys (relationName:columnName) for all levels
17
- */
18
- function transformJoinArray(value, joinInfo, relationName) {
19
- const result = {};
20
- if (joinInfo.options === false) return result;
21
- const targetTable = joinInfo.relation.table;
22
- const orderedSelectedColumns = getOrderedJoinColumns(targetTable, joinInfo.options.select);
23
- for (let i = 0; i < orderedSelectedColumns.length && i < value.length; i++) {
24
- const columnName = orderedSelectedColumns[i];
25
- if (columnName) result[`${relationName}:${columnName}`] = value[i];
26
- }
27
- if (joinInfo.options.join && joinInfo.options.join.length > 0) {
28
- let nestedArrayIndex = orderedSelectedColumns.length;
29
- for (const nestedJoin of joinInfo.options.join) {
30
- const nestedRelationName = `${relationName}:${nestedJoin.relation.name}`;
31
- const nestedValue = value[nestedArrayIndex];
32
- if (Array.isArray(nestedValue)) {
33
- const nestedResult = transformJoinArray(nestedValue, nestedJoin, nestedRelationName);
34
- Object.assign(result, nestedResult);
35
- }
36
- nestedArrayIndex++;
37
- }
38
- }
39
- return result;
40
- }
41
- /**
42
- * Drizzle joins using `json_build_array` so the result is a tuple of values that we need to map to
43
- * the correct columns. This function handles nested joins recursively.
44
- *
45
- * @param row - Raw database result row that may contain join arrays
46
- * @param op - The retrieval operation containing join information
47
- * @returns Transformed row with join arrays converted to objects
48
- */
49
- function transformJoinArraysToObjects(row, op, provider) {
50
- if (op.type !== "find" || !op.options?.joins) return row;
51
- const transformedRow = { ...row };
52
- for (const join of op.options.joins) {
53
- const relationName = join.relation.name;
54
- let value = row[relationName];
55
- if (provider === "sqlite" && typeof value === "string") try {
56
- value = JSON.parse(value);
57
- } catch {
58
- continue;
59
- }
60
- if (!Array.isArray(value)) continue;
61
- if (join.options === false) continue;
62
- if (!op.table.relations[relationName]) continue;
63
- const joinResult = transformJoinArray(value, join, relationName);
64
- Object.assign(transformedRow, joinResult);
65
- delete transformedRow[relationName];
66
- }
67
- return transformedRow;
68
- }
69
- function createDrizzleUOWDecoder(provider) {
70
- return (rawResults, ops) => {
71
- if (rawResults.length !== ops.length) throw new Error("rawResults and ops must have the same length");
72
- return rawResults.map((result, index) => {
73
- const op = ops[index];
74
- if (!op) throw new Error("op must be defined");
75
- if (op.type === "count") {
76
- if (result.rows.length > 0 && result.rows[0]) {
77
- const row = result.rows[0];
78
- const countValue = row["count"] ?? row["count(*)"];
79
- if (typeof countValue !== "number") throw new Error(`Unexpected result for count, received: ${countValue}`);
80
- return countValue;
81
- }
82
- return 0;
83
- }
84
- const decodedRows = result.rows.map((row) => {
85
- return decodeResult(transformJoinArraysToObjects(row, op, provider), op.table, provider);
86
- });
87
- if (op.withCursor) {
88
- let cursor;
89
- if (decodedRows.length > 0 && op.options.orderByIndex && op.options.pageSize) {
90
- const lastItem = decodedRows[decodedRows.length - 1];
91
- const indexName = op.options.orderByIndex.indexName;
92
- let indexColumns;
93
- if (indexName === "_primary") indexColumns = [op.table.getIdColumn()];
94
- else {
95
- const index$1 = op.table.indexes[indexName];
96
- if (index$1) indexColumns = index$1.columns;
97
- }
98
- if (indexColumns && lastItem) cursor = createCursorFromRecord(lastItem, indexColumns, {
99
- indexName: op.options.orderByIndex.indexName,
100
- orderDirection: op.options.orderByIndex.direction,
101
- pageSize: op.options.pageSize
102
- });
103
- }
104
- return {
105
- items: decodedRows,
106
- cursor
107
- };
108
- }
109
- return decodedRows;
110
- });
111
- };
112
- }
113
-
114
- //#endregion
115
- export { createDrizzleUOWDecoder };
116
- //# sourceMappingURL=drizzle-uow-decoder.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"drizzle-uow-decoder.js","names":["result: Record<string, unknown>","cursor: Cursor | undefined","index"],"sources":["../../../src/adapters/drizzle/drizzle-uow-decoder.ts"],"sourcesContent":["import type { AnySchema, AnyTable } from \"../../schema/create\";\nimport type { SQLProvider } from \"../../shared/providers\";\nimport type { RetrievalOperation, UOWDecoder } from \"../../query/unit-of-work\";\nimport { decodeResult } from \"../../query/result-transform\";\nimport { getOrderedJoinColumns } from \"./join-column-utils\";\nimport type { DrizzleResult } from \"./shared\";\nimport { createCursorFromRecord, Cursor, type CursorResult } from \"../../query/cursor\";\n\n/**\n * Join information with nested join support\n */\ninterface JoinInfo {\n relation: { name: string; table: AnyTable };\n options:\n | {\n select: true | string[];\n join?: JoinInfo[];\n }\n | false;\n}\n\n/**\n * Recursively transform join arrays to objects, handling nested joins.\n *\n * Drizzle joins use `json_build_array` where nested join data is appended after the parent's columns.\n * For example, if post has columns [id, title, content, _internalId, _version] and a nested author join,\n * the array will be: [id, title, content, _internalId, _version, authorArray]\n *\n * @param value - The join array from Drizzle\n * @param joinInfo - Join metadata including nested joins\n * @param relationName - Name of the current relation (for prefixing column names)\n * @returns Object with flattened keys (relationName:columnName) for all levels\n */\nfunction transformJoinArray(\n value: unknown[],\n joinInfo: JoinInfo,\n relationName: string,\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n if (joinInfo.options === false) {\n return result;\n }\n\n const targetTable = joinInfo.relation.table;\n\n // Get ordered columns using shared utility (must match compiler's column order)\n const orderedSelectedColumns = getOrderedJoinColumns(targetTable, joinInfo.options.select);\n\n // Map column values to flattened format: relationName:columnName\n for (let i = 0; i < orderedSelectedColumns.length && i < value.length; i++) {\n const columnName = orderedSelectedColumns[i];\n if (columnName) {\n result[`${relationName}:${columnName}`] = value[i];\n }\n }\n\n // Handle nested joins - they appear after all columns in the array\n if (joinInfo.options.join && joinInfo.options.join.length > 0) {\n let nestedArrayIndex = orderedSelectedColumns.length;\n\n for (const nestedJoin of joinInfo.options.join) {\n const nestedRelationName = `${relationName}:${nestedJoin.relation.name}`;\n const nestedValue = value[nestedArrayIndex];\n\n if (Array.isArray(nestedValue)) {\n // Recursively transform nested join\n const nestedResult = transformJoinArray(nestedValue, nestedJoin, nestedRelationName);\n Object.assign(result, nestedResult);\n }\n\n nestedArrayIndex++;\n }\n }\n\n return result;\n}\n\n/**\n * Drizzle joins using `json_build_array` so the result is a tuple of values that we need to map to\n * the correct columns. This function handles nested joins recursively.\n *\n * @param row - Raw database result row that may contain join arrays\n * @param op - The retrieval operation containing join information\n * @returns Transformed row with join arrays converted to objects\n */\nfunction transformJoinArraysToObjects(\n row: Record<string, unknown>,\n op: {\n type: string;\n table: AnyTable;\n options?: {\n joins?: JoinInfo[];\n };\n },\n provider: SQLProvider,\n): Record<string, unknown> {\n // Only process find operations with joins\n if (op.type !== \"find\" || !op.options?.joins) {\n return row;\n }\n\n const transformedRow = { ...row };\n\n for (const join of op.options.joins) {\n const relationName = join.relation.name;\n let value = row[relationName];\n\n // For SQLite, json_array returns a JSON string that needs to be parsed\n if (provider === \"sqlite\" && typeof value === \"string\") {\n try {\n value = JSON.parse(value) as unknown;\n } catch {\n // If parsing fails, skip this join\n continue;\n }\n }\n\n // Skip if not an array (join didn't return data)\n if (!Array.isArray(value)) {\n continue;\n }\n\n // Skip if join options are false (join was disabled)\n if (join.options === false) {\n continue;\n }\n\n // Get the target table for this relation\n const relation = op.table.relations[relationName];\n if (!relation) {\n continue;\n }\n\n // Recursively transform this join and its nested joins\n const joinResult = transformJoinArray(value, join, relationName);\n Object.assign(transformedRow, joinResult);\n\n // Remove the original array property\n delete transformedRow[relationName];\n }\n\n return transformedRow;\n}\n\nexport function createDrizzleUOWDecoder(provider: SQLProvider): UOWDecoder<DrizzleResult> {\n return (rawResults, ops) => {\n if (rawResults.length !== ops.length) {\n throw new Error(\"rawResults and ops must have the same length\");\n }\n\n return rawResults.map((result, index) => {\n const op = ops[index] as RetrievalOperation<AnySchema>;\n if (!op) {\n throw new Error(\"op must be defined\");\n }\n\n // Handle count operations - return the count value directly\n if (op.type === \"count\") {\n if (result.rows.length > 0 && result.rows[0]) {\n const row = result.rows[0] as Record<string, unknown>;\n const countValue = row[\"count\"] ?? row[\"count(*)\"];\n\n if (typeof countValue !== \"number\") {\n throw new Error(`Unexpected result for count, received: ${countValue}`);\n }\n\n return countValue;\n }\n return 0;\n }\n\n // Handle find operations - decode each row\n const decodedRows = result.rows.map((row) => {\n const transformedRow = transformJoinArraysToObjects(row, op, provider);\n return decodeResult(transformedRow, op.table, provider);\n });\n\n // If cursor generation is requested, wrap in CursorResult\n if (op.withCursor) {\n let cursor: Cursor | undefined;\n\n // Generate cursor from last item if results exist\n if (decodedRows.length > 0 && op.options.orderByIndex && op.options.pageSize) {\n const lastItem = decodedRows[decodedRows.length - 1];\n const indexName = op.options.orderByIndex.indexName;\n\n // Get index columns\n let indexColumns;\n if (indexName === \"_primary\") {\n indexColumns = [op.table.getIdColumn()];\n } else {\n const index = op.table.indexes[indexName];\n if (index) {\n indexColumns = index.columns;\n }\n }\n\n if (indexColumns && lastItem) {\n cursor = createCursorFromRecord(lastItem as Record<string, unknown>, indexColumns, {\n indexName: op.options.orderByIndex.indexName,\n orderDirection: op.options.orderByIndex.direction,\n pageSize: op.options.pageSize,\n });\n }\n }\n\n const cursorResult: CursorResult<unknown> = {\n items: decodedRows,\n cursor,\n };\n return cursorResult;\n }\n\n return decodedRows;\n });\n };\n}\n"],"mappings":"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"}