@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,499 +0,0 @@
1
- import { drizzle } from "drizzle-orm/pglite";
2
- import { beforeAll, beforeEach, describe, expect, expectTypeOf, it } from "vitest";
3
- import { column, FragnoId, idColumn, referenceColumn, schema } from "../../schema/create";
4
- import type { DBType } from "./shared";
5
- import { writeAndLoadSchema } from "./test-utils";
6
- import { fromDrizzle } from "./drizzle-query";
7
- import { createDrizzleConnectionPool } from "./drizzle-connection-pool";
8
- import type { ConnectionPool } from "../../shared/connection-pool";
9
- import type { DrizzleCompiledQuery } from "./drizzle-uow-compiler";
10
-
11
- describe("drizzle-query", () => {
12
- const authSchema = schema((s) => {
13
- return s
14
- .addTable("user", (t) => {
15
- return t
16
- .addColumn("id", idColumn())
17
- .addColumn("email", column("string"))
18
- .addColumn("passwordHash", column("string"))
19
- .addColumn(
20
- "createdAt",
21
- column("timestamp").defaultTo$((b) => b.now()),
22
- )
23
- .createIndex("idx_user_email", ["email"]);
24
- })
25
- .addTable("session", (t) => {
26
- return t
27
- .addColumn("id", idColumn())
28
- .addColumn("userId", referenceColumn())
29
- .addColumn("expiresAt", column("timestamp"))
30
- .addColumn(
31
- "createdAt",
32
- column("timestamp").defaultTo$((b) => b.now()),
33
- )
34
- .createIndex("idx_session_user", ["userId"]);
35
- })
36
- .addReference("sessionOwner", {
37
- from: {
38
- table: "session",
39
- column: "userId",
40
- },
41
- to: {
42
- table: "user",
43
- column: "id",
44
- },
45
- type: "one",
46
- });
47
- });
48
-
49
- let db: DBType;
50
- let pool: ConnectionPool<DBType>;
51
- let orm: ReturnType<typeof fromDrizzle<typeof authSchema>>;
52
-
53
- const queries: DrizzleCompiledQuery[] = [];
54
-
55
- beforeAll(async () => {
56
- // Write schema to file and dynamically import it
57
- const { schemaModule, cleanup, drizzleSchemaTs } = await writeAndLoadSchema(
58
- "drizzle-query",
59
- authSchema,
60
- "postgresql",
61
- );
62
-
63
- console.log(drizzleSchemaTs);
64
-
65
- // Create Drizzle instance with PGLite (in-memory Postgres)
66
- db = drizzle({
67
- schema: schemaModule,
68
- }) as unknown as DBType;
69
-
70
- // Create connection pool and ORM instance
71
- pool = createDrizzleConnectionPool(db);
72
- orm = fromDrizzle(authSchema, pool, "postgresql", undefined, {
73
- onQuery: (query) => {
74
- queries.push(query);
75
- },
76
- dryRun: true,
77
- });
78
-
79
- return async () => {
80
- await cleanup();
81
- };
82
- });
83
-
84
- beforeEach(() => {
85
- queries.splice(0, queries.length);
86
- });
87
-
88
- describe("findFirst", () => {
89
- it("should find session with user join", async () => {
90
- const someExternalId = "some-external-id";
91
-
92
- // Find the session with user join
93
- await orm.findFirst("session", (b) =>
94
- b
95
- .whereIndex("primary", (eb) => eb("id", "=", someExternalId))
96
- .join((j) => j.sessionOwner((b) => b.select(["id", "email"]))),
97
- );
98
-
99
- const [query] = queries;
100
- expect(query.sql).toMatchInlineSnapshot(
101
- `"select "session"."id", "session"."userId", "session"."expiresAt", "session"."createdAt", "session"."_internalId", "session"."_version", "session_sessionOwner"."data" as "sessionOwner" from "session" "session" left join lateral (select json_build_array("session_sessionOwner"."id", "session_sessionOwner"."email", "session_sessionOwner"."_internalId", "session_sessionOwner"."_version") as "data" from (select * from "user" "session_sessionOwner" where "session_sessionOwner"."_internalId" = "session"."userId" limit $1) "session_sessionOwner") "session_sessionOwner" on true where "session"."id" = $2 limit $3"`,
102
- );
103
- expect(query.params).toEqual([1, someExternalId, 1]);
104
- });
105
-
106
- it("should find session without join", async () => {
107
- const someExternalId = "some-external-id";
108
-
109
- await orm.findFirst("session", (b) =>
110
- b.whereIndex("primary", (eb) => eb("id", "=", someExternalId)),
111
- );
112
-
113
- const [query] = queries;
114
- expect(query.sql).toMatchInlineSnapshot(
115
- `"select "id", "userId", "expiresAt", "createdAt", "_internalId", "_version" from "session" "session" where "session"."id" = $1 limit $2"`,
116
- );
117
- expect(query.params).toEqual([someExternalId, 1]);
118
- });
119
-
120
- it("should find user by email using custom index", async () => {
121
- const email = "test@example.com";
122
-
123
- await orm.findFirst("user", (b) =>
124
- b.whereIndex("idx_user_email", (eb) => eb("email", "=", email)),
125
- );
126
-
127
- const [query] = queries;
128
- expect(query.sql).toMatchInlineSnapshot(
129
- `"select "id", "email", "passwordHash", "createdAt", "_internalId", "_version" from "user" "user" where "user"."email" = $1 limit $2"`,
130
- );
131
- expect(query.params).toEqual([email, 1]);
132
- });
133
-
134
- it("should find with select subset of columns", async () => {
135
- const someExternalId = "some-external-id";
136
-
137
- const res = await orm.findFirst("user", (b) =>
138
- b.whereIndex("primary", (eb) => eb("id", "=", someExternalId)).select(["id", "email"]),
139
- );
140
-
141
- if (res) {
142
- expectTypeOf(res.email).toEqualTypeOf<string>();
143
- }
144
-
145
- const [query] = queries;
146
- expect(query.sql).toMatchInlineSnapshot(
147
- `"select "id", "email", "_internalId", "_version" from "user" "user" where "user"."id" = $1 limit $2"`,
148
- );
149
- expect(query.params).toEqual([someExternalId, 1]);
150
- });
151
- });
152
-
153
- describe("find", () => {
154
- it("should find all sessions using primary index", async () => {
155
- await orm.find("session", (b) => b.whereIndex("primary"));
156
-
157
- const [query] = queries;
158
- expect(query.sql).toMatchInlineSnapshot(
159
- `"select "id", "userId", "expiresAt", "createdAt", "_internalId", "_version" from "session" "session""`,
160
- );
161
- expect(query.params).toEqual([]);
162
- });
163
-
164
- it("should find sessions with user join", async () => {
165
- await orm.find("session", (b) =>
166
- b.whereIndex("primary").join((j) => j.sessionOwner((b) => b.select(["id", "email"]))),
167
- );
168
-
169
- const [query] = queries;
170
- expect(query.sql).toMatchInlineSnapshot(
171
- `"select "session"."id", "session"."userId", "session"."expiresAt", "session"."createdAt", "session"."_internalId", "session"."_version", "session_sessionOwner"."data" as "sessionOwner" from "session" "session" left join lateral (select json_build_array("session_sessionOwner"."id", "session_sessionOwner"."email", "session_sessionOwner"."_internalId", "session_sessionOwner"."_version") as "data" from (select * from "user" "session_sessionOwner" where "session_sessionOwner"."_internalId" = "session"."userId" limit $1) "session_sessionOwner") "session_sessionOwner" on true"`,
172
- );
173
- expect(query.params).toEqual([1]);
174
- });
175
-
176
- it("should find sessions with where clause using custom index", async () => {
177
- const userId = "user-123";
178
-
179
- await orm.find("session", (b) =>
180
- b.whereIndex("idx_session_user", (eb) => eb("userId", "=", userId)),
181
- );
182
-
183
- const [query] = queries;
184
- expect(query.sql).toMatchInlineSnapshot(
185
- `"select "id", "userId", "expiresAt", "createdAt", "_internalId", "_version" from "session" "session" where "session"."userId" = (select "_internalId" from "user" where "id" = $1 limit 1)"`,
186
- );
187
- expect(query.params).toEqual([userId]);
188
- });
189
-
190
- it("should find with pageSize", async () => {
191
- await orm.find("user", (b) => b.whereIndex("primary").pageSize(10));
192
-
193
- const [query] = queries;
194
- expect(query.sql).toMatchInlineSnapshot(
195
- `"select "id", "email", "passwordHash", "createdAt", "_internalId", "_version" from "user" "user" limit $1"`,
196
- );
197
- expect(query.params).toEqual([10]);
198
- });
199
-
200
- it("should find with select subset", async () => {
201
- const _res = await orm.find("user", (b) => b.whereIndex("primary").select(["id", "email"]));
202
-
203
- const [query] = queries;
204
- expect(query.sql).toMatchInlineSnapshot(
205
- `"select "id", "email", "_internalId", "_version" from "user" "user""`,
206
- );
207
- expect(query.params).toEqual([]);
208
- });
209
- });
210
-
211
- describe("create", () => {
212
- it("should create a new user", async () => {
213
- const createdId = await orm.create("user", {
214
- id: "user-123",
215
- email: "test@example.com",
216
- passwordHash: "hashed-password",
217
- });
218
-
219
- // Verify the operation succeeded by getting the created ID (FragnoId object)
220
- expect(createdId).toBeDefined();
221
- expect(typeof createdId).toBe("object");
222
-
223
- // Verify the SQL query was captured
224
- const [query] = queries;
225
- expect(query.sql).toMatchInlineSnapshot(
226
- `"insert into "user" ("id", "email", "passwordHash", "createdAt", "_internalId", "_version") values ($1, $2, $3, $4, default, default)"`,
227
- );
228
- expect(query.params[0]).toEqual("user-123");
229
- expect(query.params[1]).toEqual("test@example.com");
230
- expect(query.params[2]).toEqual("hashed-password");
231
- expect(typeof query.params[3]).toBe("string"); // createdAt timestamp (serialized)
232
- expect(query.params[3]).toMatch(/^\d{4}-\d{2}-\d{2}T/); // ISO format
233
- });
234
-
235
- it("should create a new session", async () => {
236
- const expiresAt = new Date("2025-12-31T23:59:59Z");
237
-
238
- const createdId = await orm.create("session", {
239
- id: "session-456",
240
- userId: "user-123",
241
- expiresAt,
242
- });
243
-
244
- // Verify the operation succeeded by getting the created ID (FragnoId object)
245
- expect(createdId).toBeDefined();
246
- expect(typeof createdId).toBe("object");
247
-
248
- // Verify the SQL query was captured
249
- const [query] = queries;
250
- expect(query.sql).toMatchInlineSnapshot(
251
- `"insert into "session" ("id", "userId", "expiresAt", "createdAt", "_internalId", "_version") values ($1, (select "_internalId" from "user" where "id" = $2 limit 1), $3, $4, default, default)"`,
252
- );
253
- expect(query.params[0]).toEqual("session-456");
254
- expect(query.params[1]).toEqual("user-123"); // userId is resolved via subquery
255
- expect(query.params[2]).toEqual(expiresAt.toISOString());
256
- expect(typeof query.params[3]).toBe("string"); // createdAt timestamp (serialized)
257
- expect(query.params[3]).toMatch(/^\d{4}-\d{2}-\d{2}T/); // ISO format
258
- });
259
- });
260
-
261
- describe("createMany", () => {
262
- it("should create multiple users", async () => {
263
- const createdIds = await orm.createMany("user", [
264
- {
265
- id: "user-1",
266
- email: "user1@example.com",
267
- passwordHash: "hash1",
268
- },
269
- {
270
- id: "user-2",
271
- email: "user2@example.com",
272
- passwordHash: "hash2",
273
- },
274
- ]);
275
-
276
- // Verify the operation succeeded by checking we got IDs back (FragnoId objects)
277
- expect(createdIds).toHaveLength(2);
278
- expect(typeof createdIds[0]).toBe("object");
279
- expect(typeof createdIds[1]).toBe("object");
280
-
281
- // Verify the SQL queries were captured
282
- // createMany should generate one insert per record
283
- expect(queries).toHaveLength(2);
284
-
285
- // Check the first user insert
286
- expect(queries[0].sql).toMatchInlineSnapshot(
287
- `"insert into "user" ("id", "email", "passwordHash", "createdAt", "_internalId", "_version") values ($1, $2, $3, $4, default, default)"`,
288
- );
289
- expect(queries[0].params[0]).toEqual("user-1");
290
- expect(queries[0].params[1]).toEqual("user1@example.com");
291
- expect(queries[0].params[2]).toEqual("hash1");
292
-
293
- // Check the second user insert
294
- expect(queries[1].sql).toMatchInlineSnapshot(
295
- `"insert into "user" ("id", "email", "passwordHash", "createdAt", "_internalId", "_version") values ($1, $2, $3, $4, default, default)"`,
296
- );
297
- expect(queries[1].params[0]).toEqual("user-2");
298
- expect(queries[1].params[1]).toEqual("user2@example.com");
299
- expect(queries[1].params[2]).toEqual("hash2");
300
- });
301
- });
302
-
303
- describe("update", () => {
304
- it("should update user by id", async () => {
305
- const userId = "user-123";
306
-
307
- await orm.update("user", userId, (b) =>
308
- b.set({
309
- email: "newemail@example.com",
310
- }),
311
- );
312
-
313
- // Verify the SQL query was captured
314
- const [query] = queries;
315
- expect(query.sql).toMatchInlineSnapshot(
316
- `"update "user" set "email" = $1, "_version" = COALESCE(_version, 0) + 1 where "user"."id" = $2"`,
317
- );
318
- expect(query.params).toEqual(["newemail@example.com", userId]);
319
- });
320
-
321
- it("should update session expiration", async () => {
322
- const sessionId = "session-456";
323
- const newExpiresAt = new Date("2026-01-01T00:00:00Z");
324
-
325
- await orm.update("session", sessionId, (b) =>
326
- b.set({
327
- expiresAt: newExpiresAt,
328
- }),
329
- );
330
-
331
- // Verify the SQL query was captured
332
- const [query] = queries;
333
- expect(query.sql).toMatchInlineSnapshot(
334
- `"update "session" set "expiresAt" = $1, "_version" = COALESCE(_version, 0) + 1 where "session"."id" = $2"`,
335
- );
336
- expect(query.params).toEqual([newExpiresAt.toISOString(), sessionId]);
337
- });
338
-
339
- it("should update with version check using FragnoId", async () => {
340
- const userId = FragnoId.fromExternal("user-123", 5);
341
-
342
- await orm.update("user", userId, (b) =>
343
- b
344
- .set({
345
- email: "checked@example.com",
346
- })
347
- .check(),
348
- );
349
-
350
- // Verify the SQL query includes version check in WHERE clause
351
- const [query] = queries;
352
- expect(query.sql).toMatchInlineSnapshot(
353
- `"update "user" set "email" = $1, "_version" = COALESCE(_version, 0) + 1 where ("user"."id" = $2 and "user"."_version" = $3)"`,
354
- );
355
- expect(query.params).toEqual(["checked@example.com", "user-123", 5]);
356
- });
357
-
358
- it("should throw when trying to check() with string ID", async () => {
359
- await expect(
360
- orm.update("user", "user-123", (b) => b.set({ email: "test@example.com" }).check()),
361
- ).rejects.toThrow(
362
- 'Cannot use check() with a string ID on table "user". Version checking requires a FragnoId with version information.',
363
- );
364
- });
365
- });
366
-
367
- describe("updateMany", () => {
368
- it("should update multiple users by index", async () => {
369
- await orm.updateMany("user", (b) =>
370
- b
371
- .whereIndex("idx_user_email", (eb) => eb("email", "=", "old@example.com"))
372
- .set({ email: "new@example.com" }),
373
- );
374
-
375
- // updateMany first finds matching records, then updates them
376
- expect(queries.length).toBeGreaterThan(0);
377
-
378
- // Verify the find query that's executed first
379
- const findQuery = queries[0];
380
- expect(findQuery.sql).toMatchInlineSnapshot(
381
- `"select "id", "email", "passwordHash", "createdAt", "_internalId", "_version" from "user" "user" where "user"."email" = $1"`,
382
- );
383
- expect(findQuery.params).toEqual(["old@example.com"]);
384
-
385
- // Note: In dryRun mode, no actual records are found, so no update queries are generated
386
- // This is expected behavior - updateMany only generates update queries for found records
387
- });
388
- });
389
-
390
- describe("delete", () => {
391
- it("should delete user by id", async () => {
392
- const userId = "user-123";
393
-
394
- await orm.delete("user", userId);
395
-
396
- // Verify the SQL query was captured
397
- const [query] = queries;
398
- expect(query.sql).toMatchInlineSnapshot(`"delete from "user" where "user"."id" = $1"`);
399
- expect(query.params).toEqual([userId]);
400
- });
401
-
402
- it("should delete session by id", async () => {
403
- const sessionId = "session-456";
404
-
405
- await orm.delete("session", sessionId);
406
-
407
- // Verify the SQL query was captured
408
- const [query] = queries;
409
- expect(query.sql).toMatchInlineSnapshot(`"delete from "session" where "session"."id" = $1"`);
410
- expect(query.params).toEqual([sessionId]);
411
- });
412
-
413
- it("should delete with version check using FragnoId", async () => {
414
- const userId = FragnoId.fromExternal("user-789", 3);
415
-
416
- await orm.delete("user", userId, (b) => b.check());
417
-
418
- // Verify the SQL query includes version check in WHERE clause
419
- const [query] = queries;
420
- expect(query.sql).toMatchInlineSnapshot(
421
- `"delete from "user" where ("user"."id" = $1 and "user"."_version" = $2)"`,
422
- );
423
- expect(query.params).toEqual(["user-789", 3]);
424
- });
425
-
426
- it("should throw when trying to check() with string ID on delete", async () => {
427
- await expect(orm.delete("user", "user-123", (b) => b.check())).rejects.toThrow(
428
- 'Cannot use check() with a string ID on table "user". Version checking requires a FragnoId with version information.',
429
- );
430
- });
431
- });
432
-
433
- describe("deleteMany", () => {
434
- it("should delete sessions by userId using index", async () => {
435
- const userId = "user-123";
436
-
437
- await orm.deleteMany("session", (b) =>
438
- b.whereIndex("idx_session_user", (eb) => eb("userId", "=", userId)),
439
- );
440
-
441
- // deleteMany first finds matching records, then deletes them
442
- expect(queries.length).toBeGreaterThan(0);
443
-
444
- // Verify the find query that's executed first
445
- const findQuery = queries[0];
446
- expect(findQuery.sql).toMatchInlineSnapshot(
447
- `"select "id", "userId", "expiresAt", "createdAt", "_internalId", "_version" from "session" "session" where "session"."userId" = (select "_internalId" from "user" where "id" = $1 limit 1)"`,
448
- );
449
- expect(findQuery.params).toEqual([userId]);
450
-
451
- // Note: In dryRun mode, no actual records are found, so no delete queries are generated
452
- // This is expected behavior - deleteMany only generates delete queries for found records
453
- });
454
- });
455
-
456
- describe("FragnoId support", () => {
457
- it("should accept FragnoId in delete", async () => {
458
- // Create a user first to get a FragnoId
459
- const createdId = await orm.create("user", {
460
- id: "fragno-user-123",
461
- email: "fragno@example.com",
462
- passwordHash: "hash",
463
- });
464
-
465
- // Clear queries from create
466
- queries.splice(0, queries.length);
467
-
468
- // Now delete using the FragnoId
469
- await orm.delete("user", createdId);
470
-
471
- // Verify the SQL query was captured with the external ID
472
- const [query] = queries;
473
- expect(query.sql).toMatchInlineSnapshot(`"delete from "user" where "user"."id" = $1"`);
474
- expect(query.params).toEqual(["fragno-user-123"]);
475
- });
476
-
477
- it("should accept FragnoId in update", async () => {
478
- // Create a user first to get a FragnoId
479
- const createdId = await orm.create("user", {
480
- id: "fragno-user-456",
481
- email: "update@example.com",
482
- passwordHash: "hash",
483
- });
484
-
485
- // Clear queries from create
486
- queries.splice(0, queries.length);
487
-
488
- // Now update using the FragnoId
489
- await orm.update("user", createdId, (b) => b.set({ email: "updated@example.com" }));
490
-
491
- // Verify the SQL query was captured with the external ID
492
- const [query] = queries;
493
- expect(query.sql).toMatchInlineSnapshot(
494
- `"update "user" set "email" = $1, "_version" = COALESCE(_version, 0) + 1 where "user"."id" = $2"`,
495
- );
496
- expect(query.params).toEqual(["updated@example.com", "fragno-user-456"]);
497
- });
498
- });
499
- });