@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,261 +0,0 @@
1
- import { Kysely, PostgresDialect, SqliteDialect } from "kysely";
2
- import { describe, expect, beforeAll, test } from "vitest";
3
- import { KyselyAdapter } from "../kysely-adapter";
4
- import { column, idColumn, referenceColumn, schema } from "../../../schema/create";
5
-
6
- describe("KyselyMigrator", () => {
7
- const testSchema = schema((s) => {
8
- return s
9
- .addTable("users", (t) => {
10
- return t.addColumn("id", idColumn()).addColumn("name", column("string"));
11
- })
12
- .alterTable("users", (t) => {
13
- return t
14
- .addColumn("age", column("integer").nullable())
15
- .createIndex("name_idx", ["name"])
16
- .createIndex("age_idx", ["age"]);
17
- })
18
- .addTable("posts", (t) => {
19
- return t
20
- .addColumn("id", idColumn())
21
- .addColumn("title", column("string"))
22
- .addColumn("user_id", column("string"));
23
- })
24
- .addReference("author", {
25
- type: "one",
26
- from: { table: "posts", column: "user_id" },
27
- to: { table: "users", column: "id" },
28
- });
29
- });
30
-
31
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
32
- let db: Kysely<any>;
33
- let adapter: KyselyAdapter;
34
-
35
- beforeAll(async () => {
36
- // Create a Kysely instance with a PostgresDialect, but not actually connected to a database
37
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
38
- db = new Kysely({ dialect: new PostgresDialect({} as any) });
39
- adapter = new KyselyAdapter({ db, provider: "postgresql" });
40
- });
41
-
42
- test("generate SQL for migration 0 -> 1 (create users table)", async () => {
43
- const migrator = adapter.createMigrationEngine(testSchema, "test_namespace");
44
- const preparedMigration = await migrator.prepareMigrationTo(1, {
45
- updateSettings: true,
46
- fromVersion: 0,
47
- });
48
-
49
- expect(preparedMigration.operations.length).toBeGreaterThan(0);
50
- const sql = preparedMigration.getSQL?.();
51
- expect(sql).toBeDefined();
52
- expect(sql).toMatchInlineSnapshot(`
53
- "create table "users_test_namespace" ("id" varchar(30) not null unique, "name" text not null, "_internalId" bigserial not null primary key, "_version" integer default 0 not null);
54
-
55
- insert into "fragno_db_settings" ("id", "key", "value") values ('jprP_43K5uMwxAFiepbbrQ', 'test_namespace.schema_version', '1');"
56
- `);
57
- });
58
-
59
- test("generate SQL for migration 0 -> 2 (create users table and add age)", async () => {
60
- const migrator = adapter.createMigrationEngine(testSchema, "test_namespace");
61
- const preparedMigration = await migrator.prepareMigrationTo(2, {
62
- updateSettings: true,
63
- fromVersion: 0,
64
- });
65
-
66
- expect(preparedMigration.operations.length).toBeGreaterThan(0);
67
- const sql = preparedMigration.getSQL?.();
68
- expect(sql).toBeDefined();
69
- expect(sql).toMatchInlineSnapshot(`
70
- "create table "users_test_namespace" ("id" varchar(30) not null unique, "name" text not null, "_internalId" bigserial not null primary key, "_version" integer default 0 not null);
71
-
72
- alter table "users_test_namespace" add column "age" integer;
73
-
74
- create index "name_idx" on "users_test_namespace" ("name");
75
-
76
- create index "age_idx" on "users_test_namespace" ("age");
77
-
78
- insert into "fragno_db_settings" ("id", "key", "value") values ('jprP_43K5uMwxAFiepbbrQ', 'test_namespace.schema_version', '2');"
79
- `);
80
- });
81
-
82
- test("generate SQL for migration 1 -> 2 (add age column and indexes)", async () => {
83
- const migrator = adapter.createMigrationEngine(testSchema, "test_namespace");
84
- const preparedMigration = await migrator.prepareMigrationTo(2, {
85
- updateSettings: true,
86
- fromVersion: 1,
87
- });
88
-
89
- expect(preparedMigration.operations.length).toBeGreaterThan(0);
90
- const sql = preparedMigration.getSQL?.();
91
- expect(sql).toBeDefined();
92
- expect(sql).toMatchInlineSnapshot(`
93
- "alter table "users_test_namespace" add column "age" integer;
94
-
95
- create index "name_idx" on "users_test_namespace" ("name");
96
-
97
- create index "age_idx" on "users_test_namespace" ("age");
98
-
99
- update "fragno_db_settings" set "value" = '2' where "key" = 'test_namespace.schema_version';"
100
- `);
101
- });
102
-
103
- test("generate SQL for migration 0 -> 3 (full schema)", async () => {
104
- const migrator = adapter.createMigrationEngine(testSchema, "test_namespace");
105
- const preparedMigration = await migrator.prepareMigrationTo(3, {
106
- updateSettings: true,
107
- fromVersion: 0,
108
- });
109
-
110
- expect(preparedMigration.operations.length).toBeGreaterThan(0);
111
- const sql = preparedMigration.getSQL?.();
112
- expect(sql).toBeDefined();
113
- expect(sql).toMatchInlineSnapshot(`
114
- "create table "users_test_namespace" ("id" varchar(30) not null unique, "name" text not null, "_internalId" bigserial not null primary key, "_version" integer default 0 not null);
115
-
116
- alter table "users_test_namespace" add column "age" integer;
117
-
118
- create index "name_idx" on "users_test_namespace" ("name");
119
-
120
- create index "age_idx" on "users_test_namespace" ("age");
121
-
122
- create table "posts_test_namespace" ("id" varchar(30) not null unique, "title" text not null, "user_id" text not null, "_internalId" bigserial not null primary key, "_version" integer default 0 not null);
123
-
124
- insert into "fragno_db_settings" ("id", "key", "value") values ('jprP_43K5uMwxAFiepbbrQ', 'test_namespace.schema_version', '3');"
125
- `);
126
- });
127
-
128
- test("generate SQL for migration 2 -> 3 (add posts table)", async () => {
129
- const migrator = adapter.createMigrationEngine(testSchema, "test_namespace");
130
- const preparedMigration = await migrator.prepareMigrationTo(3, {
131
- updateSettings: true,
132
- fromVersion: 2,
133
- });
134
-
135
- expect(preparedMigration.operations.length).toBeGreaterThan(0);
136
- const sql = preparedMigration.getSQL?.();
137
- expect(sql).toBeDefined();
138
- expect(sql).toMatchInlineSnapshot(`
139
- "create table "posts_test_namespace" ("id" varchar(30) not null unique, "title" text not null, "user_id" text not null, "_internalId" bigserial not null primary key, "_version" integer default 0 not null);
140
-
141
- update "fragno_db_settings" set "value" = '3' where "key" = 'test_namespace.schema_version';"
142
- `);
143
- });
144
-
145
- test("generate empty SQL for migration 2 -> 2 (no changes)", async () => {
146
- const migrator = adapter.createMigrationEngine(testSchema, "test_namespace");
147
- const preparedMigration = await migrator.prepareMigrationTo(2, {
148
- updateSettings: true,
149
- fromVersion: 2,
150
- });
151
-
152
- expect(preparedMigration.operations.length).toBe(0);
153
- const sql = preparedMigration.getSQL?.();
154
- expect(sql).toBeDefined();
155
- expect(sql).toBe("");
156
- });
157
-
158
- test("throw error for backward migration", async () => {
159
- const migrator = adapter.createMigrationEngine(testSchema, "test_namespace");
160
-
161
- await expect(
162
- migrator.prepareMigrationTo(1, {
163
- updateSettings: true,
164
- fromVersion: 2,
165
- }),
166
- ).rejects.toThrow("Cannot migrate backwards");
167
- });
168
-
169
- test("throw error for version beyond schema", async () => {
170
- const migrator = adapter.createMigrationEngine(testSchema, "test_namespace");
171
-
172
- await expect(
173
- migrator.prepareMigrationTo(10, {
174
- updateSettings: true,
175
- fromVersion: 0,
176
- }),
177
- ).rejects.toThrow("schema only has version 4");
178
- });
179
- });
180
-
181
- describe("KyselyMigrator - SQLite Foreign Key Merging", () => {
182
- // Test the user's exact example schema
183
- const userExampleSchema = schema((s) => {
184
- return s
185
- .addTable("users", (t) => {
186
- return t.addColumn("id", idColumn());
187
- })
188
- .addTable("posts", (t) => {
189
- return t.addColumn("id", idColumn()).addColumn("authorId", referenceColumn());
190
- })
191
- .addReference("author", {
192
- type: "one",
193
- from: { table: "posts", column: "authorId" },
194
- to: { table: "users", column: "id" },
195
- });
196
- });
197
-
198
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
199
- let db: Kysely<any>;
200
- let adapter: KyselyAdapter;
201
-
202
- beforeAll(async () => {
203
- // Create a Kysely instance with SQLite dialect
204
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
205
- db = new Kysely({ dialect: new SqliteDialect({} as any) });
206
- adapter = new KyselyAdapter({ db, provider: "sqlite" });
207
- });
208
-
209
- test("SQLite should merge foreign keys into create-table operations", async () => {
210
- const migrator = adapter.createMigrationEngine(userExampleSchema, "test");
211
-
212
- // Migrate from 0 -> 3 (all tables + FK in one batch)
213
- const preparedMigration = await migrator.prepareMigrationTo(3, {
214
- updateSettings: true,
215
- fromVersion: 0,
216
- });
217
-
218
- expect(preparedMigration.operations.length).toBeGreaterThan(0);
219
- const sql = preparedMigration.getSQL?.();
220
- expect(sql).toBeDefined();
221
-
222
- // The SQL should have PRAGMA defer_foreign_keys
223
- expect(sql).toContain("PRAGMA defer_foreign_keys = ON");
224
-
225
- // Should create users table
226
- expect(sql).toContain('create table "users_test"');
227
-
228
- // Should create posts table WITH inline foreign key constraint
229
- expect(sql).toContain('create table "posts_test"');
230
- expect(sql).toContain("foreign key");
231
- expect(sql).toContain("authorId");
232
- expect(sql).toContain('references "users_test"');
233
-
234
- // Should NOT have a separate ALTER TABLE ADD FOREIGN KEY
235
- // (SQLite doesn't support it, and we've merged it into create-table)
236
- expect(sql).not.toMatch(/alter table.*add.*foreign key/i);
237
- });
238
-
239
- test("SQLite FK merging full schema verification", async () => {
240
- const migrator = adapter.createMigrationEngine(userExampleSchema, "test");
241
-
242
- const preparedMigration = await migrator.prepareMigrationTo(3, {
243
- updateSettings: true,
244
- fromVersion: 0,
245
- });
246
-
247
- const sql = preparedMigration.getSQL?.();
248
- expect(sql).toBeDefined();
249
-
250
- // Verify the complete SQL snapshot
251
- expect(sql).toMatchInlineSnapshot(`
252
- "PRAGMA defer_foreign_keys = ON;
253
-
254
- create table "users_test" ("id" text not null unique, "_internalId" integer not null primary key autoincrement, "_version" integer default 0 not null);
255
-
256
- create table "posts_test" ("id" text not null unique, "authorId" integer not null, "_internalId" integer not null primary key autoincrement, "_version" integer default 0 not null, constraint "posts_users_author_fk" foreign key ("authorId") references "users_test" ("_internalId") on delete restrict on update restrict);
257
-
258
- insert into "fragno_db_settings" ("id", "key", "value") values ('BflimUWc1NbCMMDD9SM3gQ', 'test.schema_version', '3');"
259
- `);
260
- });
261
- });
@@ -1,274 +0,0 @@
1
- import type { AnyColumn, AnyTable } from "../schema/create";
2
- import type { SQLProvider } from "../shared/providers";
3
- import { deserialize, serialize } from "../schema/serialize";
4
- import { FragnoId, FragnoReference } from "../schema/create";
5
- import { createId } from "../id";
6
-
7
- /**
8
- * Marker class for reference column values that need subquery resolution.
9
- * When a reference column receives a string (external ID), this marker tells
10
- * the query builder to generate a subquery to look up the internal ID.
11
- * @internal
12
- */
13
- export class ReferenceSubquery {
14
- #referencedTable: AnyTable;
15
- #externalIdValue: string;
16
-
17
- constructor(referencedTable: AnyTable, externalIdValue: string) {
18
- this.#referencedTable = referencedTable;
19
- this.#externalIdValue = externalIdValue;
20
- }
21
-
22
- get referencedTable() {
23
- return this.#referencedTable;
24
- }
25
-
26
- get externalIdValue() {
27
- return this.#externalIdValue;
28
- }
29
- }
30
-
31
- /**
32
- * Generate a runtime default value for a column that has defaultTo$()
33
- *
34
- * Only generates values for runtime defaults (defaultTo$), NOT static defaults (defaultTo).
35
- * Static defaults should be handled by the database via DEFAULT constraints.
36
- *
37
- * @param column - The column with a default value configuration
38
- * @returns The generated default value, or undefined if the column has no runtime default
39
- *
40
- * @internal
41
- */
42
- export function generateRuntimeDefault(column: AnyColumn): unknown {
43
- // Check if column has a default value configuration
44
- if (!column.default) {
45
- return undefined;
46
- }
47
-
48
- // If it's a static default value (defaultTo), return undefined
49
- // as the database should handle this via DEFAULT constraint
50
- if ("value" in column.default) {
51
- return undefined;
52
- }
53
-
54
- // If it's a database-level special function (defaultTo(b => b.now())), return undefined
55
- // as the database should handle this via DEFAULT NOW() or equivalent
56
- if ("dbSpecial" in column.default) {
57
- return undefined;
58
- }
59
-
60
- // Handle runtime defaults (defaultTo$)
61
- const runtime = column.default.runtime;
62
-
63
- if (runtime === "cuid") {
64
- return createId();
65
- }
66
-
67
- if (runtime === "now") {
68
- return new Date();
69
- }
70
-
71
- if (typeof runtime === "function") {
72
- return runtime();
73
- }
74
-
75
- return undefined;
76
- }
77
-
78
- /**
79
- * Encodes a record of values from the application format to database format.
80
- *
81
- * This function transforms object keys to match SQL column names and serializes
82
- * values according to the database provider's requirements (e.g., converting
83
- * JavaScript Date objects to numbers for SQLite).
84
- *
85
- * @param values - The record of values to encode in application format
86
- * @param table - The table schema definition containing column information
87
- * @param generateDefault - Whether to generate default values for undefined columns
88
- * @param provider - The SQL provider (sqlite, postgresql, mysql, etc.)
89
- * @param skipDriverConversions - Skip driver-level type conversions (Date->number, boolean->0/1, bigint->Buffer).
90
- * Set to true when using ORMs like Drizzle that handle these conversions internally.
91
- * @returns A record with database-compatible column names and serialized values
92
- *
93
- * @example
94
- * ```ts
95
- * const encoded = encodeValues(
96
- * { userId: 123, createdAt: new Date() },
97
- * userTable,
98
- * true,
99
- * 'sqlite'
100
- * );
101
- * // Returns: { user_id: 123, created_at: 1234567890 }
102
- * ```
103
- */
104
- export function encodeValues(
105
- values: Record<string, unknown>,
106
- table: AnyTable,
107
- generateDefault: boolean,
108
- provider: SQLProvider,
109
- skipDriverConversions = false,
110
- ): Record<string, unknown> {
111
- const result: Record<string, unknown> = {};
112
-
113
- for (const k in table.columns) {
114
- const col = table.columns[k];
115
-
116
- // Skip internal ID - never provided by user, auto-generated by database
117
- if (col.role === "internal-id") {
118
- continue;
119
- }
120
- let value = values[k];
121
-
122
- if (generateDefault && value === undefined) {
123
- // Only generate runtime defaults (defaultTo$), not static defaults (defaultTo).
124
- // Static defaults should be handled by the database via DEFAULT constraints.
125
- value = generateRuntimeDefault(col);
126
- }
127
-
128
- if (value !== undefined) {
129
- // Handle string references and FragnoId objects
130
- if (col.role === "reference") {
131
- if (typeof value === "string") {
132
- // String external ID - generate subquery
133
- const relation = Object.values(table.relations).find((rel) =>
134
- rel.on.some(([localCol]) => localCol === k),
135
- );
136
- if (relation) {
137
- result[col.name] = new ReferenceSubquery(relation.table, value);
138
- continue;
139
- }
140
- throw new Error(`Reference column ${k} not found in table ${table.name}`);
141
- } else if (value instanceof FragnoId) {
142
- // FragnoId object
143
- if (value.internalId !== undefined) {
144
- // If internal ID is populated, use it directly (no subquery needed)
145
- result[col.name] = value.internalId;
146
- continue;
147
- } else {
148
- // If internal ID is not populated, use external ID via subquery
149
- const relation = Object.values(table.relations).find((rel) =>
150
- rel.on.some(([localCol]) => localCol === k),
151
- );
152
- if (relation) {
153
- result[col.name] = new ReferenceSubquery(relation.table, value.externalId);
154
- continue;
155
- }
156
- throw new Error(`Reference column ${k} not found in table ${table.name}`);
157
- }
158
- }
159
- }
160
-
161
- result[col.name] = serialize(value, col, provider, skipDriverConversions);
162
- }
163
- }
164
-
165
- return result;
166
- }
167
-
168
- /**
169
- * Decodes a database result record to application format.
170
- *
171
- * This function transforms database column names back to application property names
172
- * and deserializes values according to the database provider's format (e.g., converting
173
- * SQLite integers back to JavaScript Date objects).
174
- *
175
- * Supports relation data encoded with the pattern `relationName:columnName`.
176
- *
177
- * @param result - The raw database result record
178
- * @param table - The table schema definition containing column and relation information
179
- * @param provider - The SQL provider (sqlite, postgresql, mysql, etc.)
180
- * @returns A record in application format with deserialized values
181
- *
182
- * @example
183
- * ```ts
184
- * const decoded = decodeResult(
185
- * { user_id: 123, created_at: 1234567890, 'posts:title': 'Hello' },
186
- * userTable,
187
- * 'sqlite'
188
- * );
189
- * // Returns: { userId: 123, createdAt: Date, posts: { title: 'Hello' } }
190
- * ```
191
- */
192
- export function decodeResult(
193
- result: Record<string, unknown>,
194
- table: AnyTable,
195
- provider: SQLProvider,
196
- ): Record<string, unknown> {
197
- const output: Record<string, unknown> = {};
198
- // First pass: collect all column values
199
- const columnValues: Record<string, unknown> = {};
200
-
201
- // Collect all relation data (including nested) keyed by relation name
202
- const relationData: Record<string, Record<string, unknown>> = {};
203
-
204
- for (const k in result) {
205
- const colonIndex = k.indexOf(":");
206
- const value = result[k];
207
-
208
- // Direct column (no colon)
209
- if (colonIndex === -1) {
210
- const col = table.columns[k];
211
- if (!col) {
212
- continue;
213
- }
214
-
215
- // Store all column values (including hidden ones for FragnoId creation)
216
- columnValues[k] = deserialize(value, col, provider);
217
- continue;
218
- }
219
-
220
- // Relation column (has colon)
221
- const relationName = k.slice(0, colonIndex);
222
- const remainder = k.slice(colonIndex + 1);
223
-
224
- const relation = table.relations[relationName];
225
- if (relation === undefined) {
226
- continue;
227
- }
228
-
229
- // Collect relation data with the remaining key path
230
- relationData[relationName] ??= {};
231
- relationData[relationName][remainder] = value;
232
- }
233
-
234
- // Process each relation's data recursively
235
- for (const relationName in relationData) {
236
- const relation = table.relations[relationName];
237
- if (!relation) {
238
- continue;
239
- }
240
-
241
- // Recursively decode the relation data
242
- output[relationName] = decodeResult(relationData[relationName], relation.table, provider);
243
- }
244
-
245
- // Second pass: create output with FragnoId objects where appropriate
246
- for (const k in columnValues) {
247
- const col = table.columns[k];
248
- if (!col) {
249
- continue;
250
- }
251
-
252
- // Filter out hidden columns (like _internalId, _version) from results
253
- if (col.isHidden) {
254
- continue;
255
- }
256
-
257
- // For external ID columns, create FragnoId if we have both external and internal IDs
258
- if (col.role === "external-id" && columnValues["_internalId"] !== undefined) {
259
- output[k] = new FragnoId({
260
- externalId: columnValues[k] as string,
261
- internalId: columnValues["_internalId"] as bigint,
262
- // _version is always selected as a hidden column, so it should always be present
263
- version: columnValues["_version"] as number,
264
- });
265
- } else if (col.role === "reference") {
266
- // For reference columns, create FragnoReference with internal ID
267
- output[k] = FragnoReference.fromInternal(columnValues[k] as bigint);
268
- } else {
269
- output[k] = columnValues[k];
270
- }
271
- }
272
-
273
- return output;
274
- }