@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
@@ -0,0 +1,183 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { UnitOfWorkEncoder } from "./uow-encoder";
3
+ import { schema, column, idColumn, referenceColumn } from "../../schema/create";
4
+ import {
5
+ BetterSQLite3DriverConfig,
6
+ MySQL2DriverConfig,
7
+ NodePostgresDriverConfig,
8
+ } from "./driver-config";
9
+
10
+ describe("UnitOfWorkEncoder", () => {
11
+ const testSchema = schema((s) => {
12
+ return s
13
+ .addTable("users", (t) => {
14
+ return t
15
+ .addColumn("id", idColumn())
16
+ .addColumn("name", column("string"))
17
+ .addColumn("age", column("integer").nullable())
18
+ .addColumn("isActive", column("bool"))
19
+ .addColumn("createdAt", column("timestamp"));
20
+ })
21
+ .addTable("posts", (t) => {
22
+ return t
23
+ .addColumn("id", idColumn())
24
+ .addColumn("userId", referenceColumn())
25
+ .addColumn("title", column("string"));
26
+ });
27
+ });
28
+
29
+ const usersTable = testSchema.tables.users;
30
+ const postsTable = testSchema.tables.posts;
31
+
32
+ describe("SQLite encoding", () => {
33
+ const sqliteConfig = new BetterSQLite3DriverConfig();
34
+
35
+ // Mock Kysely instance (only needed for reference subquery processing)
36
+ const db = {} as any; // eslint-disable-line @typescript-eslint/no-explicit-any
37
+ const encoder = new UnitOfWorkEncoder(sqliteConfig, db);
38
+
39
+ it("should serialize Date to number for sqlite", () => {
40
+ const date = new Date("2024-01-15T10:30:00Z");
41
+ const result = encoder.encodeForDatabase({
42
+ values: { createdAt: date },
43
+ table: usersTable,
44
+ generateDefaults: false,
45
+ });
46
+
47
+ expect(result).toEqual({ createdAt: date.getTime() });
48
+ });
49
+
50
+ it("should serialize boolean to number for sqlite", () => {
51
+ const result = encoder.encodeForDatabase({
52
+ values: { isActive: true },
53
+ table: usersTable,
54
+ generateDefaults: false,
55
+ });
56
+
57
+ expect(result).toEqual({ isActive: 1 });
58
+ });
59
+
60
+ it("should serialize bigint to Number for reference columns in sqlite", () => {
61
+ const result = encoder.encodeForDatabase({
62
+ values: { userId: BigInt(456) },
63
+ table: postsTable,
64
+ generateDefaults: false,
65
+ });
66
+
67
+ // Reference columns should be converted to Number for SQLite
68
+ expect(result).toEqual({ userId: 456 });
69
+ });
70
+
71
+ it("should handle multiple fields", () => {
72
+ const date = new Date("2024-01-15T10:30:00Z");
73
+ const result = encoder.encodeForDatabase({
74
+ values: {
75
+ name: "Alice",
76
+ age: 30,
77
+ isActive: false,
78
+ createdAt: date,
79
+ },
80
+ table: usersTable,
81
+ generateDefaults: false,
82
+ });
83
+
84
+ expect(result).toEqual({
85
+ name: "Alice",
86
+ age: 30,
87
+ isActive: 0,
88
+ createdAt: date.getTime(),
89
+ });
90
+ });
91
+
92
+ it("should handle null values", () => {
93
+ const result = encoder.encodeForDatabase({
94
+ values: { age: null },
95
+ table: usersTable,
96
+ generateDefaults: false,
97
+ });
98
+
99
+ expect(result).toEqual({ age: null });
100
+ });
101
+
102
+ it("should generate defaults when requested", () => {
103
+ const result = encoder.encodeForDatabase({
104
+ values: { title: "Test" },
105
+ table: postsTable,
106
+ generateDefaults: true,
107
+ });
108
+
109
+ // Should have generated an ID
110
+ expect(result["id"]).toBeDefined();
111
+ expect(typeof result["id"]).toBe("string");
112
+ expect(result["title"]).toBe("Test");
113
+ });
114
+ });
115
+
116
+ describe("PostgreSQL encoding", () => {
117
+ const postgresConfig = new NodePostgresDriverConfig();
118
+
119
+ // Mock Kysely instance
120
+ const db = {} as any; // eslint-disable-line @typescript-eslint/no-explicit-any
121
+ const encoder = new UnitOfWorkEncoder(postgresConfig, db);
122
+
123
+ it("should keep Date as Date for postgresql", () => {
124
+ const date = new Date("2024-01-15T10:30:00Z");
125
+ const result = encoder.encodeForDatabase({
126
+ values: { createdAt: date },
127
+ table: usersTable,
128
+ generateDefaults: false,
129
+ });
130
+
131
+ expect(result).toEqual({ createdAt: date });
132
+ });
133
+
134
+ it("should keep boolean as boolean for postgresql", () => {
135
+ const result = encoder.encodeForDatabase({
136
+ values: { isActive: true },
137
+ table: usersTable,
138
+ generateDefaults: false,
139
+ });
140
+
141
+ expect(result).toEqual({ isActive: true });
142
+ });
143
+
144
+ it("should keep bigint as bigint for reference columns in postgresql", () => {
145
+ const result = encoder.encodeForDatabase({
146
+ values: { userId: BigInt(456) },
147
+ table: postsTable,
148
+ generateDefaults: false,
149
+ });
150
+
151
+ expect(result).toEqual({ userId: BigInt(456) });
152
+ });
153
+ });
154
+
155
+ describe("MySQL encoding", () => {
156
+ const mysqlConfig = new MySQL2DriverConfig();
157
+
158
+ // Mock Kysely instance
159
+ const db = {} as any; // eslint-disable-line @typescript-eslint/no-explicit-any
160
+ const encoder = new UnitOfWorkEncoder(mysqlConfig, db);
161
+
162
+ it("should keep Date as Date for mysql", () => {
163
+ const date = new Date("2024-01-15T10:30:00Z");
164
+ const result = encoder.encodeForDatabase({
165
+ values: { createdAt: date },
166
+ table: usersTable,
167
+ generateDefaults: false,
168
+ });
169
+
170
+ expect(result).toEqual({ createdAt: date });
171
+ });
172
+
173
+ it("should keep boolean as boolean for mysql", () => {
174
+ const result = encoder.encodeForDatabase({
175
+ values: { isActive: true },
176
+ table: usersTable,
177
+ generateDefaults: false,
178
+ });
179
+
180
+ expect(result).toEqual({ isActive: true });
181
+ });
182
+ });
183
+ });
@@ -0,0 +1,131 @@
1
+ import type { AnyTable, AnyColumn } from "../../schema/create";
2
+ import type { DriverConfig } from "./driver-config";
3
+ import {
4
+ createSQLSerializer,
5
+ type SQLSerializer,
6
+ } from "../../query/serialize/create-sql-serializer";
7
+ import { encodeValues } from "../../query/value-encoding";
8
+ import { processReferenceSubqueries } from "./query/where-builder";
9
+ import type { TableNameMapper } from "../shared/table-name-mapper";
10
+ import type { Kysely } from "kysely";
11
+
12
+ /**
13
+ * Encoder class for Unit of Work mutation operations.
14
+ *
15
+ * Handles the complete transformation from application values to database-ready values
16
+ * in three clear steps:
17
+ * 1. Resolution - Resolve FragnoId/FragnoReference objects and generate defaults
18
+ * 2. Reference Processing - Create subqueries for external ID lookups
19
+ * 3. Serialization - Apply database-specific type conversions
20
+ *
21
+ * This class mirrors the UnitOfWorkDecoder pattern for symmetry.
22
+ */
23
+ export class UnitOfWorkEncoder {
24
+ readonly #serializer: SQLSerializer;
25
+ readonly #db: Kysely<any>; // eslint-disable-line @typescript-eslint/no-explicit-any
26
+ readonly #mapper?: TableNameMapper;
27
+
28
+ constructor(
29
+ driverConfig: DriverConfig,
30
+ db: Kysely<any>, // eslint-disable-line @typescript-eslint/no-explicit-any
31
+ mapper?: TableNameMapper,
32
+ ) {
33
+ this.#serializer = createSQLSerializer(driverConfig);
34
+ this.#db = db;
35
+ this.#mapper = mapper;
36
+ }
37
+
38
+ /**
39
+ * Encode application values to database-ready format.
40
+ *
41
+ * This is the main entry point that handles all encoding steps:
42
+ * 1. **Resolution**: Transform ORM names to DB columns, resolve FragnoId/FragnoReference,
43
+ * generate defaults (CUIDs for IDs, etc.)
44
+ * 2. **Reference Processing**: Convert external ID strings to subqueries for internal ID lookup
45
+ * 3. **Serialization**: Apply database-specific conversions (Date → number for SQLite, etc.)
46
+ *
47
+ * @param options - Encoding options
48
+ * @param options.values - Application values to encode
49
+ * @param options.table - Table schema definition
50
+ * @param options.generateDefaults - Whether to generate default values for undefined columns
51
+ * @returns Database-ready values
52
+ *
53
+ * @example
54
+ * ```ts
55
+ * const encoded = encoder.encodeForDatabase({
56
+ * values: { userId: FragnoId(...), createdAt: new Date(), isActive: true },
57
+ * table: usersTable,
58
+ * generateDefaults: true
59
+ * });
60
+ * // For SQLite: { user_id: 456, created_at: 1705316400000, is_active: 1 }
61
+ * ```
62
+ */
63
+ encodeForDatabase(options: {
64
+ values: Record<string, unknown>;
65
+ table: AnyTable;
66
+ generateDefaults: boolean;
67
+ }): Record<string, unknown> {
68
+ // Step 1: Resolution - Resolve FragnoId/FragnoReference and generate defaults
69
+ const resolved = encodeValues(options.values, options.table, options.generateDefaults);
70
+
71
+ // Step 2: Reference Processing - Convert external IDs to subqueries
72
+ const processed = processReferenceSubqueries(resolved, this.#db, this.#mapper);
73
+
74
+ // Step 3: Serialization - Apply database-specific type conversions
75
+ const serialized = this.serializeValues(processed, options.table);
76
+
77
+ return serialized;
78
+ }
79
+
80
+ /**
81
+ * Serialize resolved values to database format.
82
+ *
83
+ * Applies database-specific type conversions:
84
+ * - SQLite: Date → number, boolean → 0/1, bigint → Buffer (or Number for reference columns)
85
+ * - PostgreSQL: Mostly pass-through (database handles types natively)
86
+ * - MySQL: Mostly pass-through
87
+ *
88
+ * @param values - Resolved values (after resolution and reference processing)
89
+ * @param table - The table schema definition
90
+ * @returns Serialized values ready for database driver
91
+ */
92
+ private serializeValues(
93
+ values: Record<string, unknown>,
94
+ table: AnyTable,
95
+ ): Record<string, unknown> {
96
+ const result: Record<string, unknown> = {};
97
+
98
+ for (const [dbColumnName, value] of Object.entries(values)) {
99
+ // Find the column definition by database column name
100
+ const col = this.findColumnByDbName(table, dbColumnName);
101
+
102
+ if (!col) {
103
+ // Not a regular column (might be a special value like sql.raw())
104
+ // Pass through as-is
105
+ result[dbColumnName] = value;
106
+ continue;
107
+ }
108
+
109
+ // Serialize the value using the column definition and database type
110
+ result[dbColumnName] = this.#serializer.serialize(value, col);
111
+ }
112
+
113
+ return result;
114
+ }
115
+
116
+ /**
117
+ * Find a column definition by its database column name.
118
+ *
119
+ * @param table - The table to search
120
+ * @param dbColumnName - The database column name (e.g., "user_id")
121
+ * @returns The column definition or undefined if not found
122
+ */
123
+ private findColumnByDbName(table: AnyTable, dbColumnName: string): AnyColumn | undefined {
124
+ for (const col of Object.values(table.columns)) {
125
+ if (col.name === dbColumnName) {
126
+ return col;
127
+ }
128
+ }
129
+ return undefined;
130
+ }
131
+ }
@@ -1,6 +1,5 @@
1
- import { Kysely } from "kysely";
2
1
  import { KyselyPGlite } from "kysely-pglite";
3
- import { assert, beforeAll, describe, expect, expectTypeOf, it } from "vitest";
2
+ import { beforeAll, describe, expect, expectTypeOf, it } from "vitest";
4
3
  import { KyselyAdapter } from "./kysely-adapter";
5
4
  import {
6
5
  column,
@@ -11,6 +10,8 @@ import {
11
10
  type FragnoReference,
12
11
  } from "../../schema/create";
13
12
  import { Cursor } from "../../query/cursor";
13
+ import { PGLiteDriverConfig } from "../generic-sql/driver-config";
14
+ import { internalSchema } from "../../fragments/internal-fragment";
14
15
 
15
16
  describe("KyselyAdapter PGLite", () => {
16
17
  const testSchema = schema((s) => {
@@ -95,19 +96,14 @@ describe("KyselyAdapter PGLite", () => {
95
96
  });
96
97
  });
97
98
 
98
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
99
- let kysely: Kysely<any>;
100
99
  let adapter: KyselyAdapter;
101
100
 
102
101
  beforeAll(async () => {
103
102
  const { dialect } = await KyselyPGlite.create();
104
- kysely = new Kysely({
105
- dialect,
106
- });
107
103
 
108
104
  adapter = new KyselyAdapter({
109
- db: kysely,
110
- provider: "postgresql",
105
+ dialect,
106
+ driverConfig: new PGLiteDriverConfig(),
111
107
  });
112
108
  }, 12000);
113
109
 
@@ -115,72 +111,26 @@ describe("KyselyAdapter PGLite", () => {
115
111
  const schemaVersion = await adapter.getSchemaVersion("test");
116
112
  expect(schemaVersion).toBeUndefined();
117
113
 
118
- const migrator = adapter.createMigrationEngine(testSchema, "test");
119
- const preparedMigration = await migrator.prepareMigration({
120
- updateSettings: false,
121
- });
122
- assert(preparedMigration.getSQL);
123
-
124
- expect(preparedMigration.getSQL()).toMatchInlineSnapshot(`
125
- "create table "users_test" ("id" varchar(30) not null unique, "name" text not null, "age" integer, "_internalId" bigserial not null primary key, "_version" integer default 0 not null);
126
-
127
- create index "name_idx" on "users_test" ("name");
128
-
129
- create index "age_idx" on "users_test" ("age");
130
-
131
- create table "emails_test" ("id" varchar(30) not null unique, "user_id" bigint not null, "email" text not null, "is_primary" boolean default false not null, "_internalId" bigserial not null primary key, "_version" integer default 0 not null);
132
-
133
- create unique index "unique_email" on "emails_test" ("email");
134
-
135
- create index "user_emails" on "emails_test" ("user_id");
136
-
137
- create table "posts_test" ("id" varchar(30) not null unique, "user_id" bigint not null, "title" text not null, "content" text not null, "_internalId" bigserial not null primary key, "_version" integer default 0 not null);
138
-
139
- create index "posts_user_idx" on "posts_test" ("user_id");
140
-
141
- create table "tags_test" ("id" varchar(30) not null unique, "name" text not null, "_internalId" bigserial not null primary key, "_version" integer default 0 not null);
142
-
143
- create index "tag_name" on "tags_test" ("name");
144
-
145
- create table "post_tags_test" ("id" varchar(30) not null unique, "post_id" bigint not null, "tag_id" bigint not null, "_internalId" bigserial not null primary key, "_version" integer default 0 not null);
146
-
147
- create index "pt_post" on "post_tags_test" ("post_id");
148
-
149
- create index "pt_tag" on "post_tags_test" ("tag_id");
150
-
151
- create table "comments_test" ("id" varchar(30) not null unique, "post_id" bigint not null, "user_id" bigint not null, "text" text not null, "_internalId" bigserial not null primary key, "_version" integer default 0 not null);
152
-
153
- create index "comments_post_idx" on "comments_test" ("post_id");
154
-
155
- create index "comments_user_idx" on "comments_test" ("user_id");
156
-
157
- alter table "emails_test" add constraint "emails_users_user_fk" foreign key ("user_id") references "users_test" ("_internalId") on delete restrict on update restrict;
158
-
159
- alter table "posts_test" add constraint "posts_users_author_fk" foreign key ("user_id") references "users_test" ("_internalId") on delete restrict on update restrict;
160
-
161
- alter table "post_tags_test" add constraint "post_tags_posts_post_fk" foreign key ("post_id") references "posts_test" ("_internalId") on delete restrict on update restrict;
162
-
163
- alter table "post_tags_test" add constraint "post_tags_tags_tag_fk" foreign key ("tag_id") references "tags_test" ("_internalId") on delete restrict on update restrict;
164
-
165
- alter table "comments_test" add constraint "comments_posts_post_fk" foreign key ("post_id") references "posts_test" ("_internalId") on delete restrict on update restrict;
166
-
167
- alter table "comments_test" add constraint "comments_users_commenter_fk" foreign key ("user_id") references "users_test" ("_internalId") on delete restrict on update restrict;"
168
- `);
114
+ {
115
+ const migrations = adapter.prepareMigrations(internalSchema, "");
116
+ await migrations.executeWithDriver(adapter.driver, 0);
117
+ }
169
118
 
170
- await preparedMigration.execute();
119
+ {
120
+ const migrations = adapter.prepareMigrations(testSchema, "test");
121
+ await migrations.executeWithDriver(adapter.driver, 0);
122
+ }
171
123
 
172
124
  const queryEngine = adapter.createQueryEngine(testSchema, "test");
173
125
 
174
- // Create a user
175
126
  const userId = await queryEngine.create("users", {
176
127
  name: "John Doe",
177
128
  age: 30,
178
129
  });
179
130
 
180
- // create() now returns just the ID
181
131
  expect(userId).toMatchObject({
182
132
  externalId: expect.stringMatching(/^[a-z0-9]{20,}$/),
183
- internalId: expect.any(Number),
133
+ internalId: expect.any(BigInt),
184
134
  });
185
135
 
186
136
  expect(userId.version).toBe(0);
@@ -191,7 +141,7 @@ describe("KyselyAdapter PGLite", () => {
191
141
  expect(getUser).toMatchObject({
192
142
  id: expect.objectContaining({
193
143
  externalId: expect.stringMatching(/^[a-z0-9]{20,}$/),
194
- internalId: expect.any(Number),
144
+ internalId: expect.any(BigInt),
195
145
  }),
196
146
  name: "John Doe",
197
147
  });
@@ -212,12 +162,12 @@ describe("KyselyAdapter PGLite", () => {
212
162
 
213
163
  expect(email1Id).toMatchObject({
214
164
  externalId: expect.stringMatching(/^[a-z0-9]{20,}$/),
215
- internalId: expect.any(Number),
165
+ internalId: expect.any(BigInt),
216
166
  });
217
167
 
218
168
  expect(email2Id).toMatchObject({
219
169
  externalId: expect.stringMatching(/^[a-z0-9]{20,}$/),
220
- internalId: expect.any(Number),
170
+ internalId: expect.any(BigInt),
221
171
  });
222
172
 
223
173
  // Update user name
@@ -244,17 +194,17 @@ describe("KyselyAdapter PGLite", () => {
244
194
  expect(emailsWithUsers[0]).toEqual({
245
195
  id: expect.objectContaining({
246
196
  externalId: expect.stringMatching(/^[a-z0-9]{20,}$/),
247
- internalId: expect.any(Number),
197
+ internalId: expect.any(BigInt),
248
198
  }),
249
199
  user_id: expect.objectContaining({
250
- internalId: expect.any(Number),
200
+ internalId: expect.any(BigInt),
251
201
  }),
252
202
  email: expect.stringMatching(/\.com$/),
253
203
  is_primary: expect.any(Boolean),
254
204
  user: {
255
205
  id: expect.objectContaining({
256
206
  externalId: expect.stringMatching(/^[a-z0-9]{20,}$/),
257
- internalId: expect.any(Number),
207
+ internalId: expect.any(BigInt),
258
208
  }),
259
209
  name: "Jane Doe",
260
210
  age: 30,
@@ -498,10 +448,10 @@ describe("KyselyAdapter PGLite", () => {
498
448
  externalId: expect.any(String),
499
449
  }),
500
450
  post_id: expect.objectContaining({
501
- internalId: expect.any(Number),
451
+ internalId: expect.any(BigInt),
502
452
  }),
503
453
  tag_id: expect.objectContaining({
504
- internalId: expect.any(Number),
454
+ internalId: expect.any(BigInt),
505
455
  }),
506
456
  post: {
507
457
  title: expect.any(String),
@@ -640,7 +590,7 @@ describe("KyselyAdapter PGLite", () => {
640
590
  expect(comment).toMatchObject({
641
591
  id: expect.objectContaining({
642
592
  externalId: expect.stringMatching(/^[a-z0-9]{20,}$/),
643
- internalId: expect.any(Number),
593
+ internalId: expect.any(BigInt),
644
594
  }),
645
595
  text: "Great post!",
646
596
  // Post join (first level)
@@ -687,15 +637,15 @@ describe("KyselyAdapter PGLite", () => {
687
637
  expect(createdIds1).toMatchObject([
688
638
  expect.objectContaining({
689
639
  externalId: expect.stringMatching(/^[a-z0-9]{20,}$/),
690
- internalId: expect.any(Number),
640
+ internalId: expect.any(BigInt),
691
641
  }),
692
642
  expect.objectContaining({
693
643
  externalId: expect.stringMatching(/^[a-z0-9]{20,}$/),
694
- internalId: expect.any(Number),
644
+ internalId: expect.any(BigInt),
695
645
  }),
696
646
  expect.objectContaining({
697
647
  externalId: expect.stringMatching(/^[a-z0-9]{20,}$/),
698
- internalId: expect.any(Number),
648
+ internalId: expect.any(BigInt),
699
649
  }),
700
650
  ]);
701
651
 
@@ -1,8 +1,8 @@
1
- import { Kysely } from "kysely";
2
1
  import { SQLocalKysely } from "sqlocal/kysely";
3
2
  import { beforeAll, describe, expect, it } from "vitest";
4
3
  import { KyselyAdapter } from "./kysely-adapter";
5
4
  import { column, idColumn, referenceColumn, schema } from "../../schema/create";
5
+ import { SQLocalDriverConfig } from "../generic-sql/driver-config";
6
6
 
7
7
  describe("KyselyAdapter SQLite", () => {
8
8
  const testSchema = schema((s) => {
@@ -33,32 +33,21 @@ describe("KyselyAdapter SQLite", () => {
33
33
  });
34
34
  });
35
35
 
36
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
37
- let kysely: Kysely<any>;
38
36
  let adapter: KyselyAdapter;
39
37
 
40
38
  beforeAll(async () => {
41
39
  const { dialect } = new SQLocalKysely(":memory:");
42
- kysely = new Kysely({
43
- dialect,
44
- });
45
-
46
40
  adapter = new KyselyAdapter({
47
- db: kysely,
48
- provider: "sqlite",
41
+ dialect,
42
+ driverConfig: new SQLocalDriverConfig(),
49
43
  });
50
44
 
51
45
  // Run migrations
52
- const migrator = adapter.createMigrationEngine(testSchema, "test");
53
- const preparedMigration = await migrator.prepareMigration({
54
- updateSettings: false,
55
- });
56
- await preparedMigration.execute();
46
+ const preparedMigrations = adapter.prepareMigrations(testSchema, "test");
47
+ await preparedMigrations.execute(0, testSchema.version, { updateVersionInMigration: false });
57
48
  });
58
49
 
59
- // TODO(Wilco): The SQLocal adapter does not return the number of affected rows for updates/deletes.
60
- // (this only seems to happens when the query is compiled and then executed with executeQuery())
61
- it.todo("should perform a balance transfer between accounts", async () => {
50
+ it("should perform a balance transfer between accounts", async () => {
62
51
  const queryEngine = adapter.createQueryEngine(testSchema, "test");
63
52
 
64
53
  // Create two accounts with initial balances
@@ -153,4 +142,74 @@ describe("KyselyAdapter SQLite", () => {
153
142
  amount: transferAmount,
154
143
  });
155
144
  });
145
+
146
+ it("should execute Unit of Work with version checking", async () => {
147
+ // Use the same namespace as the first test (migrations already ran)
148
+ const queryEngine = adapter.createQueryEngine(testSchema, "test");
149
+
150
+ // Create initial account
151
+ const initialAccountId = await queryEngine.create("accounts", {
152
+ userId: "user3",
153
+ balance: 1000,
154
+ });
155
+
156
+ expect(initialAccountId.version).toBe(0);
157
+
158
+ // Build a UOW to update the account with optimistic locking
159
+ const uow = queryEngine
160
+ .createUnitOfWork("update-account-balance")
161
+ // Retrieval phase: find the account
162
+ .find("accounts", (b) => b.whereIndex("primary", (eb) => eb("id", "=", initialAccountId)));
163
+
164
+ // Execute retrieval and transition to mutation phase
165
+ const [accounts] = await uow.executeRetrieve();
166
+
167
+ // Mutation phase: update with version check
168
+ uow.update("accounts", initialAccountId, (b) => b.set({ balance: 1500 }).check());
169
+
170
+ // Execute mutations
171
+ const { success } = await uow.executeMutations();
172
+
173
+ // Should succeed
174
+ expect(success).toBe(true);
175
+ expect(accounts).toHaveLength(1);
176
+
177
+ // Verify the account was updated
178
+ const updatedAccount = await queryEngine.findFirst("accounts", (b) =>
179
+ b.whereIndex("primary", (eb) => eb("id", "=", initialAccountId)),
180
+ );
181
+
182
+ expect(updatedAccount).toMatchObject({
183
+ id: expect.objectContaining({
184
+ externalId: initialAccountId.externalId,
185
+ version: 1, // Version incremented
186
+ }),
187
+ userId: "user3",
188
+ balance: 1500,
189
+ });
190
+
191
+ // Try to update again with stale version (simulating concurrent update - should fail)
192
+ const uow2 = queryEngine.createUnitOfWork("update-account-stale");
193
+
194
+ // Use the old version (0) which is now stale
195
+ uow2.update("accounts", initialAccountId, (b) => b.set({ balance: 2000 }).check());
196
+
197
+ const { success: success2 } = await uow2.executeMutations();
198
+
199
+ // Should fail due to version conflict
200
+ expect(success2).toBe(false);
201
+
202
+ // Verify the account was NOT updated
203
+ const [[unchangedAccount]] = await queryEngine
204
+ .createUnitOfWork("verify-unchanged")
205
+ .find("accounts", (b) => b.whereIndex("primary", (eb) => eb("id", "=", initialAccountId)))
206
+ .executeRetrieve();
207
+
208
+ expect(unchangedAccount).toMatchObject({
209
+ id: expect.objectContaining({
210
+ version: 1, // Still version 1
211
+ }),
212
+ balance: 1500, // Still 1500, not 2000
213
+ });
214
+ });
156
215
  });