@fragno-dev/db 0.1.15 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (407) hide show
  1. package/.turbo/turbo-build.log +242 -179
  2. package/CHANGELOG.md +23 -0
  3. package/README.md +123 -8
  4. package/dist/adapters/adapters.d.ts +5 -5
  5. package/dist/adapters/adapters.d.ts.map +1 -1
  6. package/dist/adapters/adapters.js.map +1 -1
  7. package/dist/adapters/drizzle/drizzle-adapter.d.ts +6 -21
  8. package/dist/adapters/drizzle/drizzle-adapter.d.ts.map +1 -1
  9. package/dist/adapters/drizzle/drizzle-adapter.js +7 -54
  10. package/dist/adapters/drizzle/drizzle-adapter.js.map +1 -1
  11. package/dist/adapters/drizzle/generate.d.ts +3 -0
  12. package/dist/adapters/drizzle/generate.d.ts.map +1 -1
  13. package/dist/adapters/drizzle/generate.js +36 -28
  14. package/dist/adapters/drizzle/generate.js.map +1 -1
  15. package/dist/adapters/generic-sql/driver-config.d.ts +74 -0
  16. package/dist/adapters/generic-sql/driver-config.d.ts.map +1 -0
  17. package/dist/adapters/generic-sql/driver-config.js +94 -0
  18. package/dist/adapters/generic-sql/driver-config.js.map +1 -0
  19. package/dist/adapters/generic-sql/generic-sql-adapter.d.ts +43 -0
  20. package/dist/adapters/generic-sql/generic-sql-adapter.d.ts.map +1 -0
  21. package/dist/adapters/generic-sql/generic-sql-adapter.js +87 -0
  22. package/dist/adapters/generic-sql/generic-sql-adapter.js.map +1 -0
  23. package/dist/adapters/generic-sql/generic-sql-uow-executor.js +67 -0
  24. package/dist/adapters/generic-sql/generic-sql-uow-executor.js.map +1 -0
  25. package/dist/adapters/generic-sql/migration/cold-kysely.js +33 -0
  26. package/dist/adapters/generic-sql/migration/cold-kysely.js.map +1 -0
  27. package/dist/adapters/generic-sql/migration/dialect/mysql.js +60 -0
  28. package/dist/adapters/generic-sql/migration/dialect/mysql.js.map +1 -0
  29. package/dist/adapters/generic-sql/migration/dialect/postgres.js +59 -0
  30. package/dist/adapters/generic-sql/migration/dialect/postgres.js.map +1 -0
  31. package/dist/adapters/generic-sql/migration/dialect/sqlite.js +96 -0
  32. package/dist/adapters/generic-sql/migration/dialect/sqlite.js.map +1 -0
  33. package/dist/adapters/generic-sql/migration/executor.d.ts +15 -0
  34. package/dist/adapters/generic-sql/migration/executor.d.ts.map +1 -0
  35. package/dist/adapters/generic-sql/migration/executor.js +18 -0
  36. package/dist/adapters/generic-sql/migration/executor.js.map +1 -0
  37. package/dist/adapters/generic-sql/migration/prepared-migrations.d.ts +66 -0
  38. package/dist/adapters/generic-sql/migration/prepared-migrations.d.ts.map +1 -0
  39. package/dist/adapters/generic-sql/migration/prepared-migrations.js +68 -0
  40. package/dist/adapters/generic-sql/migration/prepared-migrations.js.map +1 -0
  41. package/dist/adapters/generic-sql/migration/sql-generator.js +212 -0
  42. package/dist/adapters/generic-sql/migration/sql-generator.js.map +1 -0
  43. package/dist/adapters/generic-sql/query/create-sql-query-compiler.js +32 -0
  44. package/dist/adapters/generic-sql/query/create-sql-query-compiler.js.map +1 -0
  45. package/dist/adapters/generic-sql/query/cursor-utils.js +37 -0
  46. package/dist/adapters/generic-sql/query/cursor-utils.js.map +1 -0
  47. package/dist/adapters/generic-sql/query/dialect/mysql.js +33 -0
  48. package/dist/adapters/generic-sql/query/dialect/mysql.js.map +1 -0
  49. package/dist/adapters/generic-sql/query/dialect/postgres.js +32 -0
  50. package/dist/adapters/generic-sql/query/dialect/postgres.js.map +1 -0
  51. package/dist/adapters/generic-sql/query/dialect/sqlite.js +32 -0
  52. package/dist/adapters/generic-sql/query/dialect/sqlite.js.map +1 -0
  53. package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js +152 -0
  54. package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js.map +1 -0
  55. package/dist/adapters/generic-sql/query/select-builder.js +69 -0
  56. package/dist/adapters/generic-sql/query/select-builder.js.map +1 -0
  57. package/dist/adapters/generic-sql/query/sql-query-compiler.js +145 -0
  58. package/dist/adapters/generic-sql/query/sql-query-compiler.js.map +1 -0
  59. package/dist/adapters/generic-sql/query/where-builder.js +129 -0
  60. package/dist/adapters/generic-sql/query/where-builder.js.map +1 -0
  61. package/dist/adapters/generic-sql/result-interpreter.js +74 -0
  62. package/dist/adapters/generic-sql/result-interpreter.js.map +1 -0
  63. package/dist/adapters/generic-sql/uow-decoder.js +105 -0
  64. package/dist/adapters/generic-sql/uow-decoder.js.map +1 -0
  65. package/dist/adapters/generic-sql/uow-encoder.js +93 -0
  66. package/dist/adapters/generic-sql/uow-encoder.js.map +1 -0
  67. package/dist/adapters/kysely/kysely-adapter.d.ts +5 -18
  68. package/dist/adapters/kysely/kysely-adapter.d.ts.map +1 -1
  69. package/dist/adapters/kysely/kysely-adapter.js +6 -165
  70. package/dist/adapters/kysely/kysely-adapter.js.map +1 -1
  71. package/dist/adapters/{drizzle/drizzle-query.js → shared/from-unit-of-work-compiler.js} +47 -61
  72. package/dist/adapters/shared/from-unit-of-work-compiler.js.map +1 -0
  73. package/dist/adapters/{drizzle/shared.d.ts → shared/table-name-mapper.d.ts} +2 -4
  74. package/dist/adapters/shared/table-name-mapper.d.ts.map +1 -0
  75. package/dist/adapters/shared/table-name-mapper.js +43 -0
  76. package/dist/adapters/shared/table-name-mapper.js.map +1 -0
  77. package/dist/adapters/shared/uow-operation-compiler.js +105 -0
  78. package/dist/adapters/shared/uow-operation-compiler.js.map +1 -0
  79. package/dist/db-fragment-definition-builder.d.ts +53 -19
  80. package/dist/db-fragment-definition-builder.d.ts.map +1 -1
  81. package/dist/db-fragment-definition-builder.js +89 -19
  82. package/dist/db-fragment-definition-builder.js.map +1 -1
  83. package/dist/fragments/internal-fragment.d.ts +39 -5
  84. package/dist/fragments/internal-fragment.d.ts.map +1 -1
  85. package/dist/fragments/internal-fragment.js +82 -10
  86. package/dist/fragments/internal-fragment.js.map +1 -1
  87. package/dist/hooks/hooks.d.ts +51 -0
  88. package/dist/hooks/hooks.d.ts.map +1 -0
  89. package/dist/hooks/hooks.js +88 -0
  90. package/dist/hooks/hooks.js.map +1 -0
  91. package/dist/migration-engine/generation-engine.d.ts +0 -2
  92. package/dist/migration-engine/generation-engine.d.ts.map +1 -1
  93. package/dist/migration-engine/generation-engine.js +23 -61
  94. package/dist/migration-engine/generation-engine.js.map +1 -1
  95. package/dist/mod.d.ts +34 -10
  96. package/dist/mod.d.ts.map +1 -1
  97. package/dist/mod.js +47 -16
  98. package/dist/mod.js.map +1 -1
  99. package/dist/node_modules/.pnpm/{rou3@0.7.8 → rou3@0.7.10}/node_modules/rou3/dist/index.js +1 -1
  100. package/dist/node_modules/.pnpm/rou3@0.7.10/node_modules/rou3/dist/index.js.map +1 -0
  101. package/dist/packages/fragno/dist/api/fragment-instantiator.js +69 -31
  102. package/dist/packages/fragno/dist/api/fragment-instantiator.js.map +1 -1
  103. package/dist/query/column-defaults.js +27 -0
  104. package/dist/query/column-defaults.js.map +1 -0
  105. package/dist/query/cursor.d.ts +4 -4
  106. package/dist/query/cursor.d.ts.map +1 -1
  107. package/dist/query/cursor.js +8 -6
  108. package/dist/query/cursor.js.map +1 -1
  109. package/dist/query/orm/orm.d.ts +1 -1
  110. package/dist/query/orm/orm.js.map +1 -1
  111. package/dist/query/serialize/create-sql-serializer.js +30 -0
  112. package/dist/query/serialize/create-sql-serializer.js.map +1 -0
  113. package/dist/query/serialize/dialect/mysql-serializer.js +87 -0
  114. package/dist/query/serialize/dialect/mysql-serializer.js.map +1 -0
  115. package/dist/query/serialize/dialect/postgres-serializer.js +80 -0
  116. package/dist/query/serialize/dialect/postgres-serializer.js.map +1 -0
  117. package/dist/query/serialize/dialect/sqlite-serializer.js +93 -0
  118. package/dist/query/serialize/dialect/sqlite-serializer.js.map +1 -0
  119. package/dist/query/serialize/sql-serializer.js +67 -0
  120. package/dist/query/serialize/sql-serializer.js.map +1 -0
  121. package/dist/query/{query.d.ts → simple-query-interface.d.ts} +5 -5
  122. package/dist/query/simple-query-interface.d.ts.map +1 -0
  123. package/dist/query/{execute-unit-of-work.d.ts → unit-of-work/execute-unit-of-work.d.ts} +13 -3
  124. package/dist/query/unit-of-work/execute-unit-of-work.d.ts.map +1 -0
  125. package/dist/query/{execute-unit-of-work.js → unit-of-work/execute-unit-of-work.js} +17 -4
  126. package/dist/query/unit-of-work/execute-unit-of-work.js.map +1 -0
  127. package/dist/query/{retry-policy.d.ts → unit-of-work/retry-policy.d.ts} +1 -1
  128. package/dist/query/unit-of-work/retry-policy.d.ts.map +1 -0
  129. package/dist/query/{retry-policy.js → unit-of-work/retry-policy.js} +1 -1
  130. package/dist/query/unit-of-work/retry-policy.js.map +1 -0
  131. package/dist/query/{unit-of-work.d.ts → unit-of-work/unit-of-work.d.ts} +51 -18
  132. package/dist/query/unit-of-work/unit-of-work.d.ts.map +1 -0
  133. package/dist/query/{unit-of-work.js → unit-of-work/unit-of-work.js} +58 -11
  134. package/dist/query/unit-of-work/unit-of-work.js.map +1 -0
  135. package/dist/query/value-decoding.js +71 -0
  136. package/dist/query/value-decoding.js.map +1 -0
  137. package/dist/query/value-encoding.js +124 -0
  138. package/dist/query/value-encoding.js.map +1 -0
  139. package/dist/schema/create.d.ts +3 -0
  140. package/dist/schema/create.d.ts.map +1 -1
  141. package/dist/schema/create.js +4 -0
  142. package/dist/schema/create.js.map +1 -1
  143. package/dist/schema/type-conversion/create-sql-type-mapper.js +29 -0
  144. package/dist/schema/type-conversion/create-sql-type-mapper.js.map +1 -0
  145. package/dist/schema/type-conversion/dialect/mysql.js +57 -0
  146. package/dist/schema/type-conversion/dialect/mysql.js.map +1 -0
  147. package/dist/schema/type-conversion/dialect/postgres.js +56 -0
  148. package/dist/schema/type-conversion/dialect/postgres.js.map +1 -0
  149. package/dist/schema/type-conversion/dialect/sqlite.js +52 -0
  150. package/dist/schema/type-conversion/dialect/sqlite.js.map +1 -0
  151. package/dist/schema/type-conversion/type-mapping.js +63 -0
  152. package/dist/schema/type-conversion/type-mapping.js.map +1 -0
  153. package/dist/sql-driver/connection/connection-provider.d.ts +13 -0
  154. package/dist/sql-driver/connection/connection-provider.d.ts.map +1 -0
  155. package/dist/sql-driver/connection/connection-provider.js +19 -0
  156. package/dist/sql-driver/connection/connection-provider.js.map +1 -0
  157. package/dist/sql-driver/connection/single-connection-provider.js +23 -0
  158. package/dist/sql-driver/connection/single-connection-provider.js.map +1 -0
  159. package/dist/sql-driver/dialect-adapter/dialect-adapter.d.ts +7 -0
  160. package/dist/sql-driver/dialect-adapter/dialect-adapter.d.ts.map +1 -0
  161. package/dist/sql-driver/dialects/dialects.d.ts +2 -0
  162. package/dist/sql-driver/dialects/dialects.js +3 -0
  163. package/dist/sql-driver/dialects/durable-object-dialect.d.ts +72 -0
  164. package/dist/sql-driver/dialects/durable-object-dialect.d.ts.map +1 -0
  165. package/dist/sql-driver/dialects/durable-object-dialect.js +130 -0
  166. package/dist/sql-driver/dialects/durable-object-dialect.js.map +1 -0
  167. package/dist/sql-driver/driver/runtime-driver.d.ts +23 -0
  168. package/dist/sql-driver/driver/runtime-driver.d.ts.map +1 -0
  169. package/dist/sql-driver/driver/runtime-driver.js +56 -0
  170. package/dist/sql-driver/driver/runtime-driver.js.map +1 -0
  171. package/dist/sql-driver/query-executor/default-query-executor.js +26 -0
  172. package/dist/sql-driver/query-executor/default-query-executor.js.map +1 -0
  173. package/dist/sql-driver/query-executor/plugin.d.ts +17 -0
  174. package/dist/sql-driver/query-executor/plugin.d.ts.map +1 -0
  175. package/dist/sql-driver/query-executor/query-executor-base.js +25 -0
  176. package/dist/sql-driver/query-executor/query-executor-base.js.map +1 -0
  177. package/dist/sql-driver/query-executor/query-executor.d.ts +36 -0
  178. package/dist/sql-driver/query-executor/query-executor.d.ts.map +1 -0
  179. package/dist/sql-driver/sql-driver-adapter.d.ts +29 -0
  180. package/dist/sql-driver/sql-driver-adapter.d.ts.map +1 -0
  181. package/dist/sql-driver/sql-driver-adapter.js +68 -0
  182. package/dist/sql-driver/sql-driver-adapter.js.map +1 -0
  183. package/dist/sql-driver/sql-driver.d.ts +38 -0
  184. package/dist/sql-driver/sql-driver.d.ts.map +1 -0
  185. package/dist/sql-driver/sql-driver.js +1 -0
  186. package/dist/sql-driver/sql.js +50 -0
  187. package/dist/sql-driver/sql.js.map +1 -0
  188. package/dist/with-database.d.ts +6 -2
  189. package/dist/with-database.d.ts.map +1 -1
  190. package/dist/with-database.js +1 -1
  191. package/dist/with-database.js.map +1 -1
  192. package/package.json +37 -10
  193. package/src/adapters/adapters.ts +8 -5
  194. package/src/adapters/drizzle/drizzle-adapter-pglite.test.ts +60 -169
  195. package/src/adapters/drizzle/{drizzle-adapter-sqlite.test.ts → drizzle-adapter-sqlite3.test.ts} +31 -55
  196. package/src/adapters/drizzle/drizzle-adapter.ts +15 -107
  197. package/src/adapters/drizzle/generate.test.ts +2 -2
  198. package/src/adapters/drizzle/generate.ts +78 -34
  199. package/src/adapters/drizzle/migrate-drizzle.test.ts +19 -0
  200. package/src/adapters/drizzle/shared.ts +0 -34
  201. package/src/adapters/drizzle/test-utils.ts +3 -3
  202. package/src/adapters/generic-sql/README.md +14 -0
  203. package/src/adapters/generic-sql/driver-config.ts +144 -0
  204. package/src/adapters/generic-sql/generic-sql-adapter.test.ts +50 -0
  205. package/src/adapters/generic-sql/generic-sql-adapter.ts +146 -0
  206. package/src/adapters/generic-sql/generic-sql-uow-executor.ts +130 -0
  207. package/src/adapters/generic-sql/migration/cold-kysely.ts +55 -0
  208. package/src/adapters/{kysely/migration/execute-mysql.test.ts → generic-sql/migration/dialect/mysql.test.ts} +342 -484
  209. package/src/adapters/generic-sql/migration/dialect/mysql.ts +104 -0
  210. package/src/adapters/generic-sql/migration/dialect/postgres.test.ts +1008 -0
  211. package/src/adapters/generic-sql/migration/dialect/postgres.ts +113 -0
  212. package/src/adapters/{kysely/migration/execute-sqlite.test.ts → generic-sql/migration/dialect/sqlite.test.ts} +307 -510
  213. package/src/adapters/generic-sql/migration/dialect/sqlite.ts +189 -0
  214. package/src/adapters/generic-sql/migration/executor.ts +33 -0
  215. package/src/adapters/generic-sql/migration/prepared-migrations.test.ts +661 -0
  216. package/src/adapters/generic-sql/migration/prepared-migrations.ts +214 -0
  217. package/src/adapters/generic-sql/migration/sql-generator.ts +413 -0
  218. package/src/adapters/generic-sql/query/create-sql-query-compiler.ts +36 -0
  219. package/src/adapters/generic-sql/query/cursor-utils.ts +56 -0
  220. package/src/adapters/generic-sql/query/dialect/mysql.ts +34 -0
  221. package/src/adapters/generic-sql/query/dialect/postgres.ts +32 -0
  222. package/src/adapters/generic-sql/query/dialect/sqlite.ts +32 -0
  223. package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.test.ts +1568 -0
  224. package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.ts +314 -0
  225. package/src/adapters/generic-sql/query/select-builder.test.ts +256 -0
  226. package/src/adapters/generic-sql/query/select-builder.ts +137 -0
  227. package/src/adapters/generic-sql/query/sql-query-compiler.test.ts +195 -0
  228. package/src/adapters/generic-sql/query/sql-query-compiler.ts +367 -0
  229. package/src/adapters/generic-sql/query/where-builder.test.ts +744 -0
  230. package/src/adapters/generic-sql/query/where-builder.ts +211 -0
  231. package/src/adapters/generic-sql/result-interpreter.ts +102 -0
  232. package/src/adapters/generic-sql/test/generic-drizzle-adapter-sqlite3.test.ts +899 -0
  233. package/src/adapters/generic-sql/uow-decoder.test.ts +399 -0
  234. package/src/adapters/generic-sql/uow-decoder.ts +152 -0
  235. package/src/adapters/generic-sql/uow-encoder.test.ts +183 -0
  236. package/src/adapters/generic-sql/uow-encoder.ts +131 -0
  237. package/src/adapters/kysely/kysely-adapter-pglite.test.ts +26 -76
  238. package/src/adapters/kysely/{kysely-adapter-sqlite.test.ts → kysely-adapter-sqlocal.test.ts} +76 -17
  239. package/src/adapters/kysely/kysely-adapter.ts +10 -250
  240. package/src/adapters/{drizzle/drizzle-query.ts → shared/from-unit-of-work-compiler.ts} +110 -104
  241. package/src/adapters/shared/table-name-mapper.ts +50 -0
  242. package/src/adapters/shared/uow-operation-compiler.ts +211 -0
  243. package/src/db-fragment-definition-builder.test.ts +2 -2
  244. package/src/db-fragment-definition-builder.ts +281 -50
  245. package/src/db-fragment-instantiator.test.ts +78 -2
  246. package/src/db-fragment-integration.test.ts +14 -16
  247. package/src/fragments/internal-fragment.test.ts +434 -45
  248. package/src/fragments/internal-fragment.ts +184 -20
  249. package/src/hooks/hooks.test.ts +575 -0
  250. package/src/hooks/hooks.ts +179 -0
  251. package/src/migration-engine/generation-engine.test.ts +44 -54
  252. package/src/migration-engine/generation-engine.ts +48 -94
  253. package/src/mod.ts +117 -29
  254. package/src/query/column-defaults.ts +49 -0
  255. package/src/query/cursor.test.ts +31 -6
  256. package/src/query/cursor.ts +11 -7
  257. package/src/query/orm/orm.ts +1 -1
  258. package/src/query/query-type.test.ts +9 -9
  259. package/src/query/serialize/create-sql-serializer.ts +34 -0
  260. package/src/query/serialize/dialect/mysql-serializer.ts +142 -0
  261. package/src/query/serialize/dialect/postgres-serializer.ts +129 -0
  262. package/src/query/serialize/dialect/sqlite-serializer.test.ts +251 -0
  263. package/src/query/serialize/dialect/sqlite-serializer.ts +156 -0
  264. package/src/query/serialize/sql-serializer.ts +143 -0
  265. package/src/query/{query.ts → simple-query-interface.ts} +2 -2
  266. package/src/query/{execute-unit-of-work.test.ts → unit-of-work/execute-unit-of-work.test.ts} +16 -16
  267. package/src/query/{execute-unit-of-work.ts → unit-of-work/execute-unit-of-work.ts} +49 -8
  268. package/src/query/{unit-of-work-coordinator.test.ts → unit-of-work/unit-of-work-coordinator.test.ts} +41 -43
  269. package/src/query/{unit-of-work-types.test.ts → unit-of-work/unit-of-work-types.test.ts} +5 -3
  270. package/src/query/{unit-of-work.test.ts → unit-of-work/unit-of-work.test.ts} +100 -9
  271. package/src/query/{unit-of-work.ts → unit-of-work/unit-of-work.ts} +135 -32
  272. package/src/query/{result-transform.test.ts → value-decoding.test.ts} +45 -427
  273. package/src/query/value-decoding.ts +113 -0
  274. package/src/query/value-encoding.test.ts +390 -0
  275. package/src/query/value-encoding.ts +168 -0
  276. package/src/schema/create.test.ts +5 -1
  277. package/src/schema/create.ts +5 -0
  278. package/src/schema/serialize.test.ts +165 -407
  279. package/src/schema/type-conversion/create-sql-type-mapper.ts +28 -0
  280. package/src/schema/type-conversion/dialect/mysql.ts +64 -0
  281. package/src/schema/type-conversion/dialect/postgres.ts +62 -0
  282. package/src/schema/type-conversion/dialect/sqlite.ts +63 -0
  283. package/src/schema/type-conversion/type-mapping.test.ts +137 -0
  284. package/src/schema/type-conversion/type-mapping.ts +153 -0
  285. package/src/shared/connection-pool.ts +5 -5
  286. package/src/sql-driver/better-sqlite3.test.ts +126 -0
  287. package/src/sql-driver/connection/connection-provider.ts +27 -0
  288. package/src/sql-driver/connection/single-connection-provider.ts +42 -0
  289. package/src/sql-driver/dialect-adapter/dialect-adapter.ts +9 -0
  290. package/src/sql-driver/dialect-adapter/sqlite-dialect-adapter.ts +7 -0
  291. package/src/sql-driver/dialects/dialects.ts +1 -0
  292. package/src/sql-driver/dialects/durable-object-dialect.ts +260 -0
  293. package/src/sql-driver/driver/runtime-driver.ts +91 -0
  294. package/src/sql-driver/query-executor/default-query-executor.ts +38 -0
  295. package/src/sql-driver/query-executor/plugin.ts +22 -0
  296. package/src/sql-driver/query-executor/query-executor-base.ts +53 -0
  297. package/src/sql-driver/query-executor/query-executor.ts +44 -0
  298. package/src/sql-driver/sql-driver-adapter.ts +96 -0
  299. package/src/sql-driver/sql-driver.ts +53 -0
  300. package/src/sql-driver/sql.ts +57 -0
  301. package/src/sql-driver/sqlocal.test.ts +117 -0
  302. package/src/with-database.ts +35 -23
  303. package/tsdown.config.ts +7 -2
  304. package/dist/adapters/drizzle/drizzle-connection-pool.js +0 -40
  305. package/dist/adapters/drizzle/drizzle-connection-pool.js.map +0 -1
  306. package/dist/adapters/drizzle/drizzle-query.d.ts +0 -23
  307. package/dist/adapters/drizzle/drizzle-query.d.ts.map +0 -1
  308. package/dist/adapters/drizzle/drizzle-query.js.map +0 -1
  309. package/dist/adapters/drizzle/drizzle-uow-compiler.d.ts +0 -10
  310. package/dist/adapters/drizzle/drizzle-uow-compiler.d.ts.map +0 -1
  311. package/dist/adapters/drizzle/drizzle-uow-compiler.js +0 -334
  312. package/dist/adapters/drizzle/drizzle-uow-compiler.js.map +0 -1
  313. package/dist/adapters/drizzle/drizzle-uow-decoder.js +0 -123
  314. package/dist/adapters/drizzle/drizzle-uow-decoder.js.map +0 -1
  315. package/dist/adapters/drizzle/drizzle-uow-executor.js +0 -160
  316. package/dist/adapters/drizzle/drizzle-uow-executor.js.map +0 -1
  317. package/dist/adapters/drizzle/join-column-utils.js +0 -28
  318. package/dist/adapters/drizzle/join-column-utils.js.map +0 -1
  319. package/dist/adapters/drizzle/shared.d.ts.map +0 -1
  320. package/dist/adapters/drizzle/shared.js +0 -35
  321. package/dist/adapters/drizzle/shared.js.map +0 -1
  322. package/dist/adapters/kysely/kysely-connection-pool.js +0 -41
  323. package/dist/adapters/kysely/kysely-connection-pool.js.map +0 -1
  324. package/dist/adapters/kysely/kysely-query-builder.js +0 -321
  325. package/dist/adapters/kysely/kysely-query-builder.js.map +0 -1
  326. package/dist/adapters/kysely/kysely-query-compiler.js +0 -67
  327. package/dist/adapters/kysely/kysely-query-compiler.js.map +0 -1
  328. package/dist/adapters/kysely/kysely-query.d.ts +0 -23
  329. package/dist/adapters/kysely/kysely-query.d.ts.map +0 -1
  330. package/dist/adapters/kysely/kysely-query.js +0 -230
  331. package/dist/adapters/kysely/kysely-query.js.map +0 -1
  332. package/dist/adapters/kysely/kysely-shared.d.ts +0 -14
  333. package/dist/adapters/kysely/kysely-shared.d.ts.map +0 -1
  334. package/dist/adapters/kysely/kysely-shared.js +0 -33
  335. package/dist/adapters/kysely/kysely-shared.js.map +0 -1
  336. package/dist/adapters/kysely/kysely-uow-compiler.js +0 -193
  337. package/dist/adapters/kysely/kysely-uow-compiler.js.map +0 -1
  338. package/dist/adapters/kysely/kysely-uow-executor.js +0 -93
  339. package/dist/adapters/kysely/kysely-uow-executor.js.map +0 -1
  340. package/dist/adapters/kysely/migration/execute-base.js +0 -128
  341. package/dist/adapters/kysely/migration/execute-base.js.map +0 -1
  342. package/dist/adapters/kysely/migration/execute-factory.js +0 -34
  343. package/dist/adapters/kysely/migration/execute-factory.js.map +0 -1
  344. package/dist/adapters/kysely/migration/execute-mssql.js +0 -112
  345. package/dist/adapters/kysely/migration/execute-mssql.js.map +0 -1
  346. package/dist/adapters/kysely/migration/execute-mysql.js +0 -93
  347. package/dist/adapters/kysely/migration/execute-mysql.js.map +0 -1
  348. package/dist/adapters/kysely/migration/execute-postgres.js +0 -104
  349. package/dist/adapters/kysely/migration/execute-postgres.js.map +0 -1
  350. package/dist/adapters/kysely/migration/execute-sqlite.js +0 -123
  351. package/dist/adapters/kysely/migration/execute-sqlite.js.map +0 -1
  352. package/dist/adapters/kysely/migration/execute.js +0 -34
  353. package/dist/adapters/kysely/migration/execute.js.map +0 -1
  354. package/dist/migration-engine/create.d.ts +0 -37
  355. package/dist/migration-engine/create.d.ts.map +0 -1
  356. package/dist/migration-engine/create.js +0 -58
  357. package/dist/migration-engine/create.js.map +0 -1
  358. package/dist/migration-engine/shared.d.ts +0 -112
  359. package/dist/migration-engine/shared.d.ts.map +0 -1
  360. package/dist/node_modules/.pnpm/rou3@0.7.8/node_modules/rou3/dist/index.js.map +0 -1
  361. package/dist/query/execute-unit-of-work.d.ts.map +0 -1
  362. package/dist/query/execute-unit-of-work.js.map +0 -1
  363. package/dist/query/query.d.ts.map +0 -1
  364. package/dist/query/result-transform.js +0 -170
  365. package/dist/query/result-transform.js.map +0 -1
  366. package/dist/query/retry-policy.d.ts.map +0 -1
  367. package/dist/query/retry-policy.js.map +0 -1
  368. package/dist/query/unit-of-work.d.ts.map +0 -1
  369. package/dist/query/unit-of-work.js.map +0 -1
  370. package/dist/schema/serialize.js +0 -111
  371. package/dist/schema/serialize.js.map +0 -1
  372. package/src/adapters/drizzle/drizzle-adapter.test.ts +0 -122
  373. package/src/adapters/drizzle/drizzle-connection-pool.ts +0 -66
  374. package/src/adapters/drizzle/drizzle-query.test.ts +0 -499
  375. package/src/adapters/drizzle/drizzle-uow-compiler-mysql.test.ts +0 -1442
  376. package/src/adapters/drizzle/drizzle-uow-compiler-sqlite.test.ts +0 -1414
  377. package/src/adapters/drizzle/drizzle-uow-compiler.test.ts +0 -1400
  378. package/src/adapters/drizzle/drizzle-uow-compiler.ts +0 -677
  379. package/src/adapters/drizzle/drizzle-uow-decoder.ts +0 -228
  380. package/src/adapters/drizzle/drizzle-uow-executor.ts +0 -309
  381. package/src/adapters/drizzle/join-column-utils.test.ts +0 -79
  382. package/src/adapters/drizzle/join-column-utils.ts +0 -39
  383. package/src/adapters/kysely/kysely-connection-pool.ts +0 -70
  384. package/src/adapters/kysely/kysely-query-builder.test.ts +0 -1344
  385. package/src/adapters/kysely/kysely-query-builder.ts +0 -666
  386. package/src/adapters/kysely/kysely-query-compiler.ts +0 -127
  387. package/src/adapters/kysely/kysely-query.test.ts +0 -498
  388. package/src/adapters/kysely/kysely-query.ts +0 -399
  389. package/src/adapters/kysely/kysely-shared.ts +0 -57
  390. package/src/adapters/kysely/kysely-uow-compiler.test.ts +0 -986
  391. package/src/adapters/kysely/kysely-uow-compiler.ts +0 -350
  392. package/src/adapters/kysely/kysely-uow-executor.ts +0 -164
  393. package/src/adapters/kysely/kysely-uow-joins.test.ts +0 -794
  394. package/src/adapters/kysely/migration/execute-base.ts +0 -256
  395. package/src/adapters/kysely/migration/execute-factory.ts +0 -53
  396. package/src/adapters/kysely/migration/execute-mssql.ts +0 -250
  397. package/src/adapters/kysely/migration/execute-mysql.ts +0 -211
  398. package/src/adapters/kysely/migration/execute-postgres.test.ts +0 -2657
  399. package/src/adapters/kysely/migration/execute-postgres.ts +0 -234
  400. package/src/adapters/kysely/migration/execute-sqlite.ts +0 -247
  401. package/src/adapters/kysely/migration/execute.ts +0 -50
  402. package/src/adapters/kysely/migration/kysely-migrator.test.ts +0 -261
  403. package/src/query/result-transform.ts +0 -274
  404. package/src/schema/serialize.ts +0 -407
  405. /package/dist/query/{query.js → simple-query-interface.js} +0 -0
  406. /package/src/query/{retry-policy.test.ts → unit-of-work/retry-policy.test.ts} +0 -0
  407. /package/src/query/{retry-policy.ts → unit-of-work/retry-policy.ts} +0 -0
@@ -1,127 +0,0 @@
1
- import type { CompiledQuery } from "kysely";
2
- import type { AnySchema, AnyTable } from "../../schema/create";
3
- import { buildCondition } from "../../query/condition-builder";
4
- import { buildFindOptions } from "../../query/orm/orm";
5
- import { createKyselyQueryBuilder } from "./kysely-query-builder";
6
- import type { ConditionBuilder, Condition } from "../../query/condition-builder";
7
- import { createKysely, type TableNameMapper } from "./kysely-shared";
8
- import type { SQLProvider } from "../../shared/providers";
9
-
10
- /**
11
- * Internal query compiler interface for Kysely
12
- * Used by the UOW compiler to generate compiled queries
13
- */
14
- export interface KyselyQueryCompiler {
15
- count: (
16
- name: string,
17
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
18
- options?: { where?: (eb: ConditionBuilder<any>) => any },
19
- ) => CompiledQuery | null;
20
- findFirst: (name: string, options: any) => CompiledQuery | null; // eslint-disable-line @typescript-eslint/no-explicit-any
21
- findMany: (name: string, options?: any) => CompiledQuery | null; // eslint-disable-line @typescript-eslint/no-explicit-any
22
- create: (name: string, values: any) => CompiledQuery; // eslint-disable-line @typescript-eslint/no-explicit-any
23
- createMany: (name: string, values: any[]) => CompiledQuery; // eslint-disable-line @typescript-eslint/no-explicit-any
24
- updateMany: (name: string, options: { set: any; where?: any }) => CompiledQuery | null; // eslint-disable-line @typescript-eslint/no-explicit-any
25
- deleteMany: (name: string, options: { where?: any }) => CompiledQuery | null; // eslint-disable-line @typescript-eslint/no-explicit-any
26
- }
27
-
28
- export function createKyselyQueryCompiler<T extends AnySchema>(
29
- schema: T,
30
- provider: SQLProvider,
31
- mapper?: TableNameMapper,
32
- ): KyselyQueryCompiler {
33
- // Get kysely instance for query building (compilation doesn't execute, just builds SQL)
34
- const kysely = createKysely(provider);
35
- const queryBuilder = createKyselyQueryBuilder(kysely, provider, mapper);
36
-
37
- function toTable(name: unknown): AnyTable {
38
- const table = schema.tables[name as string];
39
- if (!table) {
40
- throw new Error(`Invalid table name ${name}.`);
41
- }
42
- return table;
43
- }
44
-
45
- return {
46
- count(name, { where } = {}) {
47
- const table = toTable(name);
48
- let conditions = where ? buildCondition(table.columns, where) : undefined;
49
- if (conditions === true) {
50
- conditions = undefined;
51
- }
52
- if (conditions === false) {
53
- return null;
54
- }
55
-
56
- return queryBuilder.count(table, { where: conditions });
57
- },
58
-
59
- findFirst(name, options) {
60
- const table = toTable(name);
61
- // Safe cast: FindFirstOptions is structurally compatible with FindManyOptions
62
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
63
- const compiledOptions = buildFindOptions(table, options as any);
64
- if (compiledOptions === false) {
65
- return null;
66
- }
67
-
68
- return queryBuilder.findMany(table, {
69
- ...compiledOptions,
70
- limit: 1,
71
- });
72
- },
73
-
74
- findMany(name, options = {}) {
75
- const table = toTable(name);
76
- // Safe cast: FindManyOptions from compiler matches FindManyOptions from buildFindOptions
77
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
78
- const compiledOptions = buildFindOptions(table, options as any);
79
- if (compiledOptions === false) {
80
- return null;
81
- }
82
-
83
- return queryBuilder.findMany(table, compiledOptions);
84
- },
85
-
86
- create(name, values) {
87
- const table = toTable(name);
88
- return queryBuilder.create(table, values);
89
- },
90
-
91
- createMany(name, values) {
92
- const table = toTable(name);
93
- return queryBuilder.createMany(table, values);
94
- },
95
-
96
- updateMany(name, { set, where }) {
97
- const table = toTable(name);
98
- let conditions = where ? buildCondition(table.columns, where) : undefined;
99
- if (conditions === true) {
100
- conditions = undefined;
101
- }
102
- if (conditions === false) {
103
- return null;
104
- }
105
-
106
- // Safe: conditions is Condition | undefined after filtering out true/false
107
- return queryBuilder.updateMany(table, {
108
- set,
109
- where: conditions as Condition | undefined,
110
- });
111
- },
112
-
113
- deleteMany(name, { where }) {
114
- const table = toTable(name);
115
- let conditions = where ? buildCondition(table.columns, where) : undefined;
116
- if (conditions === true) {
117
- conditions = undefined;
118
- }
119
- if (conditions === false) {
120
- return null;
121
- }
122
-
123
- // Safe: conditions is Condition | undefined after filtering out true/false
124
- return queryBuilder.deleteMany(table, { where: conditions as Condition | undefined });
125
- },
126
- };
127
- }
@@ -1,498 +0,0 @@
1
- import { Kysely } from "kysely";
2
- import { KyselyPGlite } from "kysely-pglite";
3
- import { assert, beforeAll, beforeEach, describe, expect, expectTypeOf, it } from "vitest";
4
- import { column, FragnoId, idColumn, referenceColumn, schema } from "../../schema/create";
5
- import { fromKysely } from "./kysely-query";
6
- import { createKyselyConnectionPool } from "./kysely-connection-pool";
7
- import type { ConnectionPool } from "../../shared/connection-pool";
8
- import type { CompiledQuery } from "kysely";
9
-
10
- describe("kysely-query", () => {
11
- const authSchema = schema((s) => {
12
- return s
13
- .addTable("user", (t) => {
14
- return t
15
- .addColumn("id", idColumn())
16
- .addColumn("email", column("string"))
17
- .addColumn("passwordHash", column("string"))
18
- .addColumn(
19
- "createdAt",
20
- column("timestamp").defaultTo$((b) => b.now()),
21
- )
22
- .createIndex("idx_user_email", ["email"]);
23
- })
24
- .addTable("session", (t) => {
25
- return t
26
- .addColumn("id", idColumn())
27
- .addColumn("userId", referenceColumn())
28
- .addColumn("expiresAt", column("timestamp"))
29
- .addColumn(
30
- "createdAt",
31
- column("timestamp").defaultTo$((b) => b.now()),
32
- )
33
- .createIndex("idx_session_user", ["userId"]);
34
- })
35
- .addReference("sessionOwner", {
36
- from: {
37
- table: "session",
38
- column: "userId",
39
- },
40
- to: {
41
- table: "user",
42
- column: "id",
43
- },
44
- type: "one",
45
- });
46
- });
47
-
48
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
49
- let kysely: Kysely<any>;
50
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
51
- let pool: ConnectionPool<Kysely<any>>;
52
- let orm: ReturnType<typeof fromKysely<typeof authSchema>>;
53
-
54
- const queries: CompiledQuery[] = [];
55
-
56
- beforeAll(async () => {
57
- // Create Kysely instance with PGLite (in-memory Postgres)
58
- const { dialect } = await KyselyPGlite.create();
59
- kysely = new Kysely({
60
- dialect,
61
- });
62
-
63
- // Wrap in connection pool
64
- pool = createKyselyConnectionPool(kysely);
65
- orm = fromKysely(authSchema, pool, "postgresql", undefined, {
66
- onQuery: (query) => {
67
- queries.push(query);
68
- },
69
- dryRun: true,
70
- });
71
- });
72
-
73
- beforeEach(() => {
74
- queries.splice(0, queries.length);
75
- });
76
-
77
- describe("findFirst", () => {
78
- it("should find session with user join", async () => {
79
- const someExternalId = "some-external-id";
80
-
81
- // Find the session with user join
82
- await orm.findFirst("session", (b) =>
83
- b
84
- .whereIndex("primary", (eb) => eb("id", "=", someExternalId))
85
- .join((j) => j.sessionOwner((b) => b.select(["id", "email"]))),
86
- );
87
-
88
- const [query] = queries;
89
- assert(query?.sql);
90
- expect(query?.sql).toMatchInlineSnapshot(
91
- `"select "sessionOwner"."id" as "sessionOwner:id", "sessionOwner"."email" as "sessionOwner:email", "sessionOwner"."_internalId" as "sessionOwner:_internalId", "sessionOwner"."_version" as "sessionOwner:_version", "session"."id" as "id", "session"."userId" as "userId", "session"."expiresAt" as "expiresAt", "session"."createdAt" as "createdAt", "session"."_internalId" as "_internalId", "session"."_version" as "_version" from "session" left join "user" as "sessionOwner" on "session"."userId" = "sessionOwner"."_internalId" where "session"."id" = $1 limit $2"`,
92
- );
93
- expect(query?.parameters).toEqual([someExternalId, 1]);
94
- });
95
-
96
- it("should find session without join", async () => {
97
- const someExternalId = "some-external-id";
98
-
99
- await orm.findFirst("session", (b) =>
100
- b.whereIndex("primary", (eb) => eb("id", "=", someExternalId)),
101
- );
102
-
103
- const [query] = queries;
104
- assert(query?.sql);
105
- expect(query?.sql).toMatchInlineSnapshot(
106
- `"select "session"."id" as "id", "session"."userId" as "userId", "session"."expiresAt" as "expiresAt", "session"."createdAt" as "createdAt", "session"."_internalId" as "_internalId", "session"."_version" as "_version" from "session" where "session"."id" = $1 limit $2"`,
107
- );
108
- expect(query?.parameters).toEqual([someExternalId, 1]);
109
- });
110
-
111
- it("should find user by email using custom index", async () => {
112
- const email = "test@example.com";
113
-
114
- await orm.findFirst("user", (b) =>
115
- b.whereIndex("idx_user_email", (eb) => eb("email", "=", email)),
116
- );
117
-
118
- const [query] = queries;
119
- assert(query?.sql);
120
- expect(query?.sql).toMatchInlineSnapshot(
121
- `"select "user"."id" as "id", "user"."email" as "email", "user"."passwordHash" as "passwordHash", "user"."createdAt" as "createdAt", "user"."_internalId" as "_internalId", "user"."_version" as "_version" from "user" where "user"."email" = $1 limit $2"`,
122
- );
123
- expect(query?.parameters).toEqual([email, 1]);
124
- });
125
-
126
- it("should find with select subset of columns", async () => {
127
- const someExternalId = "some-external-id";
128
-
129
- const res = await orm.findFirst("user", (b) =>
130
- b.whereIndex("primary", (eb) => eb("id", "=", someExternalId)).select(["id", "email"]),
131
- );
132
-
133
- if (res) {
134
- expectTypeOf(res.email).toEqualTypeOf<string>();
135
- }
136
-
137
- const [query] = queries;
138
- assert(query?.sql);
139
- expect(query?.sql).toMatchInlineSnapshot(
140
- `"select "user"."id" as "id", "user"."email" as "email", "user"."_internalId" as "_internalId", "user"."_version" as "_version" from "user" where "user"."id" = $1 limit $2"`,
141
- );
142
- expect(query?.parameters).toEqual([someExternalId, 1]);
143
- });
144
- });
145
-
146
- describe("find", () => {
147
- it("should find all sessions using primary index", async () => {
148
- await orm.find("session", (b) => b.whereIndex("primary"));
149
-
150
- const [query] = queries;
151
- assert(query?.sql);
152
- expect(query?.sql).toMatchInlineSnapshot(
153
- `"select "session"."id" as "id", "session"."userId" as "userId", "session"."expiresAt" as "expiresAt", "session"."createdAt" as "createdAt", "session"."_internalId" as "_internalId", "session"."_version" as "_version" from "session""`,
154
- );
155
- expect(query?.parameters).toEqual([]);
156
- });
157
-
158
- it("should find sessions with user join", async () => {
159
- await orm.find("session", (b) =>
160
- b.whereIndex("primary").join((j) => j.sessionOwner((b) => b.select(["id", "email"]))),
161
- );
162
-
163
- const [query] = queries;
164
- assert(query?.sql);
165
- expect(query?.sql).toMatchInlineSnapshot(
166
- `"select "sessionOwner"."id" as "sessionOwner:id", "sessionOwner"."email" as "sessionOwner:email", "sessionOwner"."_internalId" as "sessionOwner:_internalId", "sessionOwner"."_version" as "sessionOwner:_version", "session"."id" as "id", "session"."userId" as "userId", "session"."expiresAt" as "expiresAt", "session"."createdAt" as "createdAt", "session"."_internalId" as "_internalId", "session"."_version" as "_version" from "session" left join "user" as "sessionOwner" on "session"."userId" = "sessionOwner"."_internalId""`,
167
- );
168
- expect(query?.parameters).toEqual([]);
169
- });
170
-
171
- it("should find sessions with where clause using custom index", async () => {
172
- const userId = "user-123";
173
-
174
- await orm.find("session", (b) =>
175
- b.whereIndex("idx_session_user", (eb) => eb("userId", "=", userId)),
176
- );
177
-
178
- const [query] = queries;
179
- assert(query?.sql);
180
- expect(query?.sql).toMatchInlineSnapshot(
181
- `"select "session"."id" as "id", "session"."userId" as "userId", "session"."expiresAt" as "expiresAt", "session"."createdAt" as "createdAt", "session"."_internalId" as "_internalId", "session"."_version" as "_version" from "session" where "session"."userId" = (select "_internalId" from "user" where "id" = $1 limit $2)"`,
182
- );
183
- expect(query?.parameters).toEqual([userId, 1]);
184
- });
185
-
186
- it("should find with pageSize", async () => {
187
- await orm.find("user", (b) => b.whereIndex("primary").pageSize(10));
188
-
189
- const [query] = queries;
190
- assert(query?.sql);
191
- expect(query?.sql).toMatchInlineSnapshot(
192
- `"select "user"."id" as "id", "user"."email" as "email", "user"."passwordHash" as "passwordHash", "user"."createdAt" as "createdAt", "user"."_internalId" as "_internalId", "user"."_version" as "_version" from "user" limit $1"`,
193
- );
194
- expect(query?.parameters).toEqual([10]);
195
- });
196
-
197
- it("should find with select subset", async () => {
198
- const _res = await orm.find("user", (b) => b.whereIndex("primary").select(["id", "email"]));
199
-
200
- const [query] = queries;
201
- assert(query?.sql);
202
- expect(query?.sql).toMatchInlineSnapshot(
203
- `"select "user"."id" as "id", "user"."email" as "email", "user"."_internalId" as "_internalId", "user"."_version" as "_version" from "user""`,
204
- );
205
- expect(query?.parameters).toEqual([]);
206
- });
207
- });
208
-
209
- describe("create", () => {
210
- it("should create a new user", async () => {
211
- const createdId = await orm.create("user", {
212
- id: "user-123",
213
- email: "test@example.com",
214
- passwordHash: "hashed-password",
215
- });
216
-
217
- // Verify the operation succeeded by getting the created ID (FragnoId object)
218
- expect(createdId).toBeDefined();
219
- expect(typeof createdId).toBe("object");
220
-
221
- // Verify the SQL query was captured
222
- const [query] = queries;
223
- expect(query.sql).toMatchInlineSnapshot(
224
- `"insert into "user" ("id", "email", "passwordHash", "createdAt") values ($1, $2, $3, $4) returning "user"."id" as "id", "user"."email" as "email", "user"."passwordHash" as "passwordHash", "user"."createdAt" as "createdAt", "user"."_internalId" as "_internalId", "user"."_version" as "_version""`,
225
- );
226
- expect(query.parameters[0]).toEqual("user-123");
227
- expect(query.parameters[1]).toEqual("test@example.com");
228
- expect(query.parameters[2]).toEqual("hashed-password");
229
- expect(query.parameters[3]).toBeInstanceOf(Date); // createdAt timestamp
230
- });
231
-
232
- it("should create a new session", async () => {
233
- const expiresAt = new Date("2025-12-31T23:59:59Z");
234
-
235
- const createdId = await orm.create("session", {
236
- id: "session-456",
237
- userId: "user-123",
238
- expiresAt,
239
- });
240
-
241
- // Verify the operation succeeded by getting the created ID (FragnoId object)
242
- expect(createdId).toBeDefined();
243
- expect(typeof createdId).toBe("object");
244
-
245
- // Verify the SQL query was captured
246
- const [query] = queries;
247
- expect(query.sql).toMatchInlineSnapshot(
248
- `"insert into "session" ("id", "userId", "expiresAt", "createdAt") values ($1, (select "_internalId" from "user" where "id" = $2 limit $3), $4, $5) returning "session"."id" as "id", "session"."userId" as "userId", "session"."expiresAt" as "expiresAt", "session"."createdAt" as "createdAt", "session"."_internalId" as "_internalId", "session"."_version" as "_version""`,
249
- );
250
- expect(query.parameters[0]).toEqual("session-456");
251
- expect(query.parameters[1]).toEqual("user-123"); // userId is resolved via subquery
252
- expect(query.parameters[2]).toEqual(1); // Limit for subquery
253
- expect(query.parameters[3]).toEqual(expiresAt);
254
- expect(query.parameters[4]).toBeInstanceOf(Date); // createdAt timestamp
255
- });
256
- });
257
-
258
- describe("createMany", () => {
259
- it("should create multiple users", async () => {
260
- const createdIds = await orm.createMany("user", [
261
- {
262
- id: "user-1",
263
- email: "user1@example.com",
264
- passwordHash: "hash1",
265
- },
266
- {
267
- id: "user-2",
268
- email: "user2@example.com",
269
- passwordHash: "hash2",
270
- },
271
- ]);
272
-
273
- // Verify the operation succeeded by checking we got IDs back (FragnoId objects)
274
- expect(createdIds).toHaveLength(2);
275
- expect(typeof createdIds[0]).toBe("object");
276
- expect(typeof createdIds[1]).toBe("object");
277
-
278
- // Verify the SQL queries were captured
279
- // createMany should generate one insert per record
280
- expect(queries).toHaveLength(2);
281
-
282
- // Check the first user insert
283
- expect(queries[0].sql).toMatchInlineSnapshot(
284
- `"insert into "user" ("id", "email", "passwordHash", "createdAt") values ($1, $2, $3, $4) returning "user"."id" as "id", "user"."email" as "email", "user"."passwordHash" as "passwordHash", "user"."createdAt" as "createdAt", "user"."_internalId" as "_internalId", "user"."_version" as "_version""`,
285
- );
286
- expect(queries[0].parameters[0]).toEqual("user-1");
287
- expect(queries[0].parameters[1]).toEqual("user1@example.com");
288
- expect(queries[0].parameters[2]).toEqual("hash1");
289
-
290
- // Check the second user insert
291
- expect(queries[1].sql).toMatchInlineSnapshot(
292
- `"insert into "user" ("id", "email", "passwordHash", "createdAt") values ($1, $2, $3, $4) returning "user"."id" as "id", "user"."email" as "email", "user"."passwordHash" as "passwordHash", "user"."createdAt" as "createdAt", "user"."_internalId" as "_internalId", "user"."_version" as "_version""`,
293
- );
294
- expect(queries[1].parameters[0]).toEqual("user-2");
295
- expect(queries[1].parameters[1]).toEqual("user2@example.com");
296
- expect(queries[1].parameters[2]).toEqual("hash2");
297
- });
298
- });
299
-
300
- describe("update", () => {
301
- it("should update user by id", async () => {
302
- const userId = "user-123";
303
-
304
- await orm.update("user", userId, (b) =>
305
- b.set({
306
- email: "newemail@example.com",
307
- }),
308
- );
309
-
310
- // Verify the SQL query was captured
311
- const [query] = queries;
312
- expect(query.sql).toMatchInlineSnapshot(
313
- `"update "user" set "email" = $1, "_version" = COALESCE(_version, 0) + 1 where "user"."id" = $2"`,
314
- );
315
- expect(query.parameters).toEqual(["newemail@example.com", userId]);
316
- });
317
-
318
- it("should update session expiration", async () => {
319
- const sessionId = "session-456";
320
- const newExpiresAt = new Date("2026-01-01T00:00:00Z");
321
-
322
- await orm.update("session", sessionId, (b) =>
323
- b.set({
324
- expiresAt: newExpiresAt,
325
- }),
326
- );
327
-
328
- // Verify the SQL query was captured
329
- const [query] = queries;
330
- expect(query.sql).toMatchInlineSnapshot(
331
- `"update "session" set "expiresAt" = $1, "_version" = COALESCE(_version, 0) + 1 where "session"."id" = $2"`,
332
- );
333
- expect(query.parameters).toEqual([newExpiresAt, sessionId]);
334
- });
335
-
336
- it("should update with version check using FragnoId", async () => {
337
- const userId = FragnoId.fromExternal("user-123", 5);
338
-
339
- await orm.update("user", userId, (b) =>
340
- b
341
- .set({
342
- email: "checked@example.com",
343
- })
344
- .check(),
345
- );
346
-
347
- // Verify the SQL query includes version check in WHERE clause
348
- const [query] = queries;
349
- expect(query.sql).toMatchInlineSnapshot(
350
- `"update "user" set "email" = $1, "_version" = COALESCE(_version, 0) + 1 where ("user"."id" = $2 and "user"."_version" = $3)"`,
351
- );
352
- expect(query.parameters).toEqual(["checked@example.com", "user-123", 5]);
353
- });
354
-
355
- it("should throw when trying to check() with string ID", async () => {
356
- await expect(
357
- orm.update("user", "user-123", (b) => b.set({ email: "test@example.com" }).check()),
358
- ).rejects.toThrow(
359
- 'Cannot use check() with a string ID on table "user". Version checking requires a FragnoId with version information.',
360
- );
361
- });
362
- });
363
-
364
- describe("updateMany", () => {
365
- it("should update multiple users by index", async () => {
366
- await orm.updateMany("user", (b) =>
367
- b
368
- .whereIndex("idx_user_email", (eb) => eb("email", "=", "old@example.com"))
369
- .set({ email: "new@example.com" }),
370
- );
371
-
372
- // updateMany first finds matching records, then updates them
373
- expect(queries.length).toBeGreaterThan(0);
374
-
375
- // Verify the find query that's executed first
376
- const findQuery = queries[0];
377
- assert(findQuery?.sql);
378
- expect(findQuery?.sql).toMatchInlineSnapshot(
379
- `"select "user"."id" as "id", "user"."email" as "email", "user"."passwordHash" as "passwordHash", "user"."createdAt" as "createdAt", "user"."_internalId" as "_internalId", "user"."_version" as "_version" from "user" where "user"."email" = $1"`,
380
- );
381
- expect(findQuery?.parameters).toEqual(["old@example.com"]);
382
-
383
- // Note: In dryRun mode, no actual records are found, so no update queries are generated
384
- // This is expected behavior - updateMany only generates update queries for found records
385
- });
386
- });
387
-
388
- describe("delete", () => {
389
- it("should delete user by id", async () => {
390
- const userId = "user-123";
391
-
392
- await orm.delete("user", userId);
393
-
394
- // Verify the SQL query was captured
395
- const [query] = queries;
396
- expect(query.sql).toMatchInlineSnapshot(`"delete from "user" where "user"."id" = $1"`);
397
- expect(query.parameters).toEqual([userId]);
398
- });
399
-
400
- it("should delete session by id", async () => {
401
- const sessionId = "session-456";
402
-
403
- await orm.delete("session", sessionId);
404
-
405
- // Verify the SQL query was captured
406
- const [query] = queries;
407
- expect(query.sql).toMatchInlineSnapshot(`"delete from "session" where "session"."id" = $1"`);
408
- expect(query.parameters).toEqual([sessionId]);
409
- });
410
-
411
- it("should delete with version check using FragnoId", async () => {
412
- const userId = FragnoId.fromExternal("user-789", 3);
413
-
414
- await orm.delete("user", userId, (b) => b.check());
415
-
416
- // Verify the SQL query includes version check in WHERE clause
417
- const [query] = queries;
418
- expect(query.sql).toMatchInlineSnapshot(
419
- `"delete from "user" where ("user"."id" = $1 and "user"."_version" = $2)"`,
420
- );
421
- expect(query.parameters).toEqual(["user-789", 3]);
422
- });
423
-
424
- it("should throw when trying to check() with string ID on delete", async () => {
425
- await expect(orm.delete("user", "user-123", (b) => b.check())).rejects.toThrow(
426
- 'Cannot use check() with a string ID on table "user". Version checking requires a FragnoId with version information.',
427
- );
428
- });
429
- });
430
-
431
- describe("deleteMany", () => {
432
- it("should delete sessions by userId using index", async () => {
433
- const userId = "user-123";
434
-
435
- await orm.deleteMany("session", (b) =>
436
- b.whereIndex("idx_session_user", (eb) => eb("userId", "=", userId)),
437
- );
438
-
439
- // deleteMany first finds matching records, then deletes them
440
- expect(queries.length).toBeGreaterThan(0);
441
-
442
- // Verify the find query that's executed first
443
- const findQuery = queries[0];
444
- assert(findQuery?.sql);
445
- expect(findQuery?.sql).toMatchInlineSnapshot(
446
- `"select "session"."id" as "id", "session"."userId" as "userId", "session"."expiresAt" as "expiresAt", "session"."createdAt" as "createdAt", "session"."_internalId" as "_internalId", "session"."_version" as "_version" from "session" where "session"."userId" = (select "_internalId" from "user" where "id" = $1 limit $2)"`,
447
- );
448
- expect(findQuery?.parameters).toEqual([userId, 1]);
449
-
450
- // Note: In dryRun mode, no actual records are found, so no delete queries are generated
451
- // This is expected behavior - deleteMany only generates delete queries for found records
452
- });
453
- });
454
-
455
- describe("FragnoId support", () => {
456
- it("should accept FragnoId in delete", async () => {
457
- // Create a user first to get a FragnoId
458
- const createdId = await orm.create("user", {
459
- id: "fragno-user-123",
460
- email: "fragno@example.com",
461
- passwordHash: "hash",
462
- });
463
-
464
- // Clear queries from create
465
- queries.splice(0, queries.length);
466
-
467
- // Now delete using the FragnoId
468
- await orm.delete("user", createdId);
469
-
470
- // Verify the SQL query was captured with the external ID
471
- const [query] = queries;
472
- expect(query.sql).toMatchInlineSnapshot(`"delete from "user" where "user"."id" = $1"`);
473
- expect(query.parameters).toEqual(["fragno-user-123"]);
474
- });
475
-
476
- it("should accept FragnoId in update", async () => {
477
- // Create a user first to get a FragnoId
478
- const createdId = await orm.create("user", {
479
- id: "fragno-user-456",
480
- email: "update@example.com",
481
- passwordHash: "hash",
482
- });
483
-
484
- // Clear queries from create
485
- queries.splice(0, queries.length);
486
-
487
- // Now update using the FragnoId
488
- await orm.update("user", createdId, (b) => b.set({ email: "updated@example.com" }));
489
-
490
- // Verify the SQL query was captured with the external ID
491
- const [query] = queries;
492
- expect(query.sql).toMatchInlineSnapshot(
493
- `"update "user" set "email" = $1, "_version" = COALESCE(_version, 0) + 1 where "user"."id" = $2"`,
494
- );
495
- expect(query.parameters).toEqual(["updated@example.com", "fragno-user-456"]);
496
- });
497
- });
498
- });