@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,129 @@
1
+ import type { AnyColumn } from "../../../schema/create";
2
+ import { SQLSerializer } from "../sql-serializer";
3
+ import type { DriverConfig } from "../../../adapters/generic-sql/driver-config";
4
+
5
+ /**
6
+ * PostgreSQL-specific serializer.
7
+ *
8
+ * PostgreSQL has excellent native type support:
9
+ * - Native JSON support
10
+ * - Native boolean type
11
+ * - Native timestamp/date types
12
+ * - Native bigint support
13
+ *
14
+ * Most values pass through without conversion, only strings need to be parsed to Date.
15
+ */
16
+ export class PostgreSQLSerializer extends SQLSerializer {
17
+ constructor(driverConfig: DriverConfig) {
18
+ super(driverConfig);
19
+ }
20
+
21
+ protected serializeDate(value: Date): Date {
22
+ // PostgreSQL handles Date objects natively
23
+ return value;
24
+ }
25
+
26
+ protected serializeBoolean(value: boolean): boolean {
27
+ // PostgreSQL handles boolean natively
28
+ return value;
29
+ }
30
+
31
+ protected serializeBigInt(value: bigint, _col: AnyColumn): bigint {
32
+ // PostgreSQL handles bigint natively
33
+ return value;
34
+ }
35
+
36
+ protected deserializeDate(value: unknown): Date {
37
+ if (value instanceof Date) {
38
+ return value;
39
+ }
40
+ // PostgreSQL returns timestamps/dates as strings
41
+ if (typeof value === "string") {
42
+ return new Date(value);
43
+ }
44
+ throw new Error(`Cannot deserialize date from value: ${value}`);
45
+ }
46
+
47
+ protected deserializeBoolean(value: unknown): boolean {
48
+ if (typeof value === "boolean") {
49
+ return value;
50
+ }
51
+ throw new Error(`Cannot deserialize boolean from value: ${value}`);
52
+ }
53
+
54
+ protected deserializeBigInt(value: unknown): bigint {
55
+ if (typeof value === "bigint") {
56
+ return value;
57
+ }
58
+ // PostgreSQL may return bigints as strings
59
+ if (typeof value === "string") {
60
+ return BigInt(value);
61
+ }
62
+ if (typeof value === "number") {
63
+ return BigInt(value);
64
+ }
65
+ throw new Error(`Cannot deserialize bigint from value: ${value}`);
66
+ }
67
+
68
+ protected serializeJson(value: unknown): unknown {
69
+ // PostgreSQL supports native JSON, pass through as-is
70
+ return value;
71
+ }
72
+
73
+ protected deserializeJson(value: unknown): unknown {
74
+ // PostgreSQL returns parsed JSON objects, pass through as-is
75
+ return value;
76
+ }
77
+
78
+ protected deserializeBinary(value: unknown): Uint8Array {
79
+ // PostgreSQL can return Buffer or Uint8Array for BYTEA columns
80
+ if (value instanceof Buffer) {
81
+ return new Uint8Array(value.buffer, value.byteOffset, value.byteLength);
82
+ }
83
+ if (value instanceof Uint8Array) {
84
+ return value;
85
+ }
86
+ if (value instanceof ArrayBuffer) {
87
+ return new Uint8Array(value);
88
+ }
89
+ throw new Error(`Cannot deserialize binary from value: ${typeof value}`);
90
+ }
91
+
92
+ protected deserializeInteger(value: unknown): number {
93
+ if (typeof value === "number") {
94
+ return value;
95
+ }
96
+ // PostgreSQL may return bigint for large integers
97
+ if (typeof value === "bigint") {
98
+ if (value > Number.MAX_SAFE_INTEGER || value < Number.MIN_SAFE_INTEGER) {
99
+ throw new RangeError(
100
+ `Cannot deserialize integer value ${value}: exceeds safe integer range`,
101
+ );
102
+ }
103
+ return Number(value);
104
+ }
105
+ throw new Error(`Cannot deserialize integer from value: ${typeof value}`);
106
+ }
107
+
108
+ protected deserializeDecimal(value: unknown): number {
109
+ // PostgreSQL can return decimals as numbers or strings depending on precision
110
+ if (typeof value === "number") {
111
+ return value;
112
+ }
113
+ if (typeof value === "string") {
114
+ const num = parseFloat(value);
115
+ if (isNaN(num)) {
116
+ throw new Error(`Cannot deserialize decimal from invalid string: ${value}`);
117
+ }
118
+ return num;
119
+ }
120
+ throw new Error(`Cannot deserialize decimal from value: ${typeof value}`);
121
+ }
122
+
123
+ protected deserializeString(value: unknown): string {
124
+ if (typeof value === "string") {
125
+ return value;
126
+ }
127
+ throw new Error(`Cannot deserialize string from value: ${typeof value}`);
128
+ }
129
+ }
@@ -0,0 +1,251 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { SQLiteSerializer } from "./sqlite-serializer";
3
+ import type { AnyColumn } from "../../../schema/create";
4
+ import { BetterSQLite3DriverConfig } from "../../../adapters/generic-sql/driver-config";
5
+
6
+ describe("SQLiteSerializer", () => {
7
+ const mockDriverConfig = new BetterSQLite3DriverConfig();
8
+ const serializer = new SQLiteSerializer(mockDriverConfig);
9
+
10
+ describe("serializeBigInt", () => {
11
+ describe("for internal-id and reference columns", () => {
12
+ it("should convert safe bigint to number for reference column", () => {
13
+ const col: AnyColumn = {
14
+ name: "userId",
15
+ type: "bigint",
16
+ role: "reference",
17
+ isNullable: false,
18
+ } as AnyColumn;
19
+
20
+ const result = serializer["serializeBigInt"](BigInt(123), col);
21
+ expect(result).toBe(123);
22
+ expect(typeof result).toBe("number");
23
+ });
24
+
25
+ it("should convert safe bigint to number for internal-id column", () => {
26
+ const col: AnyColumn = {
27
+ name: "_internalId",
28
+ type: "bigint",
29
+ role: "internal-id",
30
+ isNullable: false,
31
+ } as AnyColumn;
32
+
33
+ const result = serializer["serializeBigInt"](BigInt(456), col);
34
+ expect(result).toBe(456);
35
+ expect(typeof result).toBe("number");
36
+ });
37
+
38
+ it("should convert MAX_SAFE_INTEGER successfully", () => {
39
+ const col: AnyColumn = {
40
+ name: "userId",
41
+ type: "bigint",
42
+ role: "reference",
43
+ isNullable: false,
44
+ } as AnyColumn;
45
+
46
+ const maxSafe = BigInt(Number.MAX_SAFE_INTEGER);
47
+ const result = serializer["serializeBigInt"](maxSafe, col);
48
+ expect(result).toBe(Number.MAX_SAFE_INTEGER);
49
+ });
50
+
51
+ it("should convert negative MAX_SAFE_INTEGER successfully", () => {
52
+ const col: AnyColumn = {
53
+ name: "userId",
54
+ type: "bigint",
55
+ role: "reference",
56
+ isNullable: false,
57
+ } as AnyColumn;
58
+
59
+ const minSafe = BigInt(-Number.MAX_SAFE_INTEGER);
60
+ const result = serializer["serializeBigInt"](minSafe, col);
61
+ expect(result).toBe(-Number.MAX_SAFE_INTEGER);
62
+ });
63
+
64
+ it("should throw RangeError when bigint exceeds MAX_SAFE_INTEGER for reference column", () => {
65
+ const col: AnyColumn = {
66
+ name: "userId",
67
+ type: "bigint",
68
+ role: "reference",
69
+ isNullable: false,
70
+ } as AnyColumn;
71
+
72
+ const tooBig = BigInt(Number.MAX_SAFE_INTEGER) + BigInt(1);
73
+
74
+ expect(() => serializer["serializeBigInt"](tooBig, col)).toThrow(RangeError);
75
+ expect(() => serializer["serializeBigInt"](tooBig, col)).toThrow(
76
+ /Cannot serialize bigint value.*exceeds Number\.MAX_SAFE_INTEGER/,
77
+ );
78
+ expect(() => serializer["serializeBigInt"](tooBig, col)).toThrow(/userId/);
79
+ });
80
+
81
+ it("should throw RangeError when bigint is less than -MAX_SAFE_INTEGER for internal-id column", () => {
82
+ const col: AnyColumn = {
83
+ name: "_internalId",
84
+ type: "bigint",
85
+ role: "internal-id",
86
+ isNullable: false,
87
+ } as AnyColumn;
88
+
89
+ const tooSmall = BigInt(-Number.MAX_SAFE_INTEGER) - BigInt(1);
90
+
91
+ expect(() => serializer["serializeBigInt"](tooSmall, col)).toThrow(RangeError);
92
+ expect(() => serializer["serializeBigInt"](tooSmall, col)).toThrow(
93
+ /Cannot serialize bigint value.*exceeds Number\.MAX_SAFE_INTEGER/,
94
+ );
95
+ expect(() => serializer["serializeBigInt"](tooSmall, col)).toThrow(/_internalId/);
96
+ });
97
+ });
98
+
99
+ describe("for regular bigint columns", () => {
100
+ it("should convert to Buffer for regular bigint column", () => {
101
+ const col: AnyColumn = {
102
+ name: "largeNumber",
103
+ type: "bigint",
104
+ role: "regular",
105
+ isNullable: false,
106
+ } as AnyColumn;
107
+
108
+ const result = serializer["serializeBigInt"](BigInt(789), col);
109
+ expect(result).toBeInstanceOf(Buffer);
110
+ expect((result as Buffer).length).toBe(8);
111
+ });
112
+
113
+ it("should handle large values outside safe integer range as Buffer", () => {
114
+ const col: AnyColumn = {
115
+ name: "largeNumber",
116
+ type: "bigint",
117
+ role: "regular",
118
+ isNullable: false,
119
+ } as AnyColumn;
120
+
121
+ const veryLarge = BigInt(Number.MAX_SAFE_INTEGER) + BigInt(1000);
122
+ const result = serializer["serializeBigInt"](veryLarge, col);
123
+
124
+ expect(result).toBeInstanceOf(Buffer);
125
+ // Verify round-trip
126
+ const deserialized = (result as Buffer).readBigInt64BE(0);
127
+ expect(deserialized).toBe(veryLarge);
128
+ });
129
+ });
130
+ });
131
+
132
+ describe("other serialization methods", () => {
133
+ it("should serialize Date to timestamp number", () => {
134
+ const date = new Date("2024-01-01T00:00:00Z");
135
+ const result = serializer["serializeDate"](date);
136
+ expect(result).toBe(date.getTime());
137
+ expect(typeof result).toBe("number");
138
+ });
139
+
140
+ it("should serialize boolean to 0/1", () => {
141
+ expect(serializer["serializeBoolean"](true)).toBe(1);
142
+ expect(serializer["serializeBoolean"](false)).toBe(0);
143
+ });
144
+
145
+ it("should serialize JSON to string", () => {
146
+ const obj = { foo: "bar", num: 42 };
147
+ const result = serializer["serializeJson"](obj);
148
+ expect(result).toBe(JSON.stringify(obj));
149
+ expect(typeof result).toBe("string");
150
+ });
151
+ });
152
+
153
+ describe("deserializeBinary", () => {
154
+ it("should deserialize Buffer to Uint8Array", () => {
155
+ const buffer = Buffer.from([1, 2, 3, 4]);
156
+ const result = serializer["deserializeBinary"](buffer);
157
+ expect(result).toBeInstanceOf(Uint8Array);
158
+ expect(Array.from(result)).toEqual([1, 2, 3, 4]);
159
+ });
160
+
161
+ it("should deserialize Uint8Array directly", () => {
162
+ const uint8 = new Uint8Array([5, 6, 7, 8]);
163
+ const result = serializer["deserializeBinary"](uint8);
164
+ expect(result).toBeInstanceOf(Uint8Array);
165
+ expect(result).toBe(uint8);
166
+ });
167
+
168
+ it("should deserialize ArrayBuffer to Uint8Array", () => {
169
+ const arrayBuffer = new ArrayBuffer(4);
170
+ const view = new Uint8Array(arrayBuffer);
171
+ view.set([9, 10, 11, 12]);
172
+ const result = serializer["deserializeBinary"](arrayBuffer);
173
+ expect(result).toBeInstanceOf(Uint8Array);
174
+ expect(Array.from(result)).toEqual([9, 10, 11, 12]);
175
+ });
176
+
177
+ it("should throw error for invalid binary value", () => {
178
+ expect(() => serializer["deserializeBinary"]("not binary")).toThrow(
179
+ /Cannot deserialize binary/,
180
+ );
181
+ });
182
+ });
183
+
184
+ describe("deserializeInteger", () => {
185
+ it("should deserialize number directly", () => {
186
+ expect(serializer["deserializeInteger"](42)).toBe(42);
187
+ });
188
+
189
+ it("should deserialize string to number", () => {
190
+ expect(serializer["deserializeInteger"]("123")).toBe(123);
191
+ });
192
+
193
+ it("should deserialize bigint to number when safe", () => {
194
+ expect(serializer["deserializeInteger"](BigInt(456))).toBe(456);
195
+ });
196
+
197
+ it("should throw error when bigint exceeds safe range", () => {
198
+ const tooBig = BigInt(Number.MAX_SAFE_INTEGER) + BigInt(1);
199
+ expect(() => serializer["deserializeInteger"](tooBig)).toThrow(RangeError);
200
+ expect(() => serializer["deserializeInteger"](tooBig)).toThrow(/exceeds safe integer range/);
201
+ });
202
+
203
+ it("should throw error for invalid string", () => {
204
+ expect(() => serializer["deserializeInteger"]("not a number")).toThrow(
205
+ /Cannot deserialize integer from invalid string/,
206
+ );
207
+ });
208
+
209
+ it("should throw error for invalid type", () => {
210
+ expect(() => serializer["deserializeInteger"](null)).toThrow(
211
+ /Cannot deserialize integer from value/,
212
+ );
213
+ });
214
+ });
215
+
216
+ describe("deserializeDecimal", () => {
217
+ it("should deserialize number directly", () => {
218
+ expect(serializer["deserializeDecimal"](3.14)).toBe(3.14);
219
+ });
220
+
221
+ it("should deserialize string to number", () => {
222
+ expect(serializer["deserializeDecimal"]("3.14")).toBe(3.14);
223
+ expect(serializer["deserializeDecimal"]("123.456")).toBe(123.456);
224
+ expect(serializer["deserializeDecimal"]("-99.99")).toBe(-99.99);
225
+ });
226
+
227
+ it("should throw error for invalid string", () => {
228
+ expect(() => serializer["deserializeDecimal"]("not a number")).toThrow(
229
+ /Cannot deserialize decimal from invalid string/,
230
+ );
231
+ });
232
+
233
+ it("should throw error for invalid type", () => {
234
+ expect(() => serializer["deserializeDecimal"](null)).toThrow(
235
+ /Cannot deserialize decimal from value/,
236
+ );
237
+ });
238
+ });
239
+
240
+ describe("deserializeString", () => {
241
+ it("should deserialize string directly", () => {
242
+ expect(serializer["deserializeString"]("hello")).toBe("hello");
243
+ });
244
+
245
+ it("should throw error for non-string", () => {
246
+ expect(() => serializer["deserializeString"](123)).toThrow(
247
+ /Cannot deserialize string from value/,
248
+ );
249
+ });
250
+ });
251
+ });
@@ -0,0 +1,156 @@
1
+ import type { AnyColumn } from "../../../schema/create";
2
+ import { SQLSerializer } from "../sql-serializer";
3
+ import type { DriverConfig } from "../../../adapters/generic-sql/driver-config";
4
+
5
+ /**
6
+ * SQLite-specific serializer.
7
+ *
8
+ * SQLite has limited native type support and requires conversions:
9
+ * - JSON → strings (no native JSON support)
10
+ * - Dates → numbers (timestamps)
11
+ * - Booleans → 0/1
12
+ * - BigInts → Buffer (except for internal-id and reference columns → number)
13
+ * - Numbers/strings → Date for timestamps/dates
14
+ */
15
+ export class SQLiteSerializer extends SQLSerializer {
16
+ constructor(driverConfig: DriverConfig) {
17
+ super(driverConfig);
18
+ }
19
+
20
+ protected serializeDate(value: Date): number {
21
+ return value.getTime();
22
+ }
23
+
24
+ protected serializeBoolean(value: boolean): number {
25
+ return value ? 1 : 0;
26
+ }
27
+
28
+ protected serializeBigInt(value: bigint, col: AnyColumn): number | Buffer {
29
+ // SQLite special case: internal-id and reference columns use integer, not blob
30
+ // These should be converted to numbers for SQLite
31
+ if (col.role === "reference" || col.role === "internal-id") {
32
+ // Check if the bigint is within the safe integer range to avoid precision loss
33
+ if (Math.abs(Number(value)) > Number.MAX_SAFE_INTEGER) {
34
+ throw new RangeError(
35
+ `Cannot serialize bigint value ${value} for column "${col.name}": ` +
36
+ `value exceeds Number.MAX_SAFE_INTEGER (${Number.MAX_SAFE_INTEGER}). ` +
37
+ `SQLite reference and internal-id columns use INTEGER type which requires values ` +
38
+ `to fit within JavaScript's safe integer range.`,
39
+ );
40
+ }
41
+ return Number(value);
42
+ }
43
+ const buf = Buffer.alloc(8);
44
+ buf.writeBigInt64BE(value);
45
+ return buf;
46
+ }
47
+
48
+ protected deserializeDate(value: unknown): Date {
49
+ if (value instanceof Date) {
50
+ return value;
51
+ }
52
+ if (typeof value === "number" || typeof value === "string") {
53
+ return new Date(value);
54
+ }
55
+ throw new Error(`Cannot deserialize date from value: ${value}`);
56
+ }
57
+
58
+ protected deserializeBoolean(value: unknown): boolean {
59
+ if (typeof value === "boolean") {
60
+ return value;
61
+ }
62
+ if (typeof value === "number") {
63
+ return value === 1;
64
+ }
65
+ throw new Error(`Cannot deserialize boolean from value: ${value}`);
66
+ }
67
+
68
+ protected deserializeBigInt(value: unknown): bigint {
69
+ if (typeof value === "bigint") {
70
+ return value;
71
+ }
72
+ if (value instanceof Buffer) {
73
+ return value.readBigInt64BE(0);
74
+ }
75
+ if (typeof value === "string") {
76
+ return BigInt(value);
77
+ }
78
+ if (typeof value === "number") {
79
+ return BigInt(value);
80
+ }
81
+ throw new Error(`Cannot deserialize bigint from value: ${value}`);
82
+ }
83
+
84
+ protected serializeJson(value: unknown): string {
85
+ // SQLite doesn't support native JSON, so we stringify
86
+ return JSON.stringify(value);
87
+ }
88
+
89
+ protected deserializeJson(value: unknown): unknown {
90
+ // SQLite stores JSON as strings, so we need to parse
91
+ if (typeof value !== "string") {
92
+ throw new Error(`Expected JSON string but got ${typeof value}`);
93
+ }
94
+ return JSON.parse(value);
95
+ }
96
+
97
+ protected deserializeBinary(value: unknown): Uint8Array {
98
+ // SQLite can return Buffer or Uint8Array for BLOB columns
99
+ if (value instanceof Buffer) {
100
+ return new Uint8Array(value.buffer, value.byteOffset, value.byteLength);
101
+ }
102
+ if (value instanceof Uint8Array) {
103
+ return value;
104
+ }
105
+ if (value instanceof ArrayBuffer) {
106
+ return new Uint8Array(value);
107
+ }
108
+ throw new Error(`Cannot deserialize binary from value: ${typeof value}`);
109
+ }
110
+
111
+ protected deserializeInteger(value: unknown): number {
112
+ if (typeof value === "number") {
113
+ return value;
114
+ }
115
+ // SQLite may return integers as strings for large values
116
+ if (typeof value === "string") {
117
+ const num = Number(value);
118
+ if (isNaN(num)) {
119
+ throw new Error(`Cannot deserialize integer from invalid string: ${value}`);
120
+ }
121
+ return num;
122
+ }
123
+ // SQLite may return bigint for large integers
124
+ if (typeof value === "bigint") {
125
+ if (value > Number.MAX_SAFE_INTEGER || value < Number.MIN_SAFE_INTEGER) {
126
+ throw new RangeError(
127
+ `Cannot deserialize integer value ${value}: exceeds safe integer range`,
128
+ );
129
+ }
130
+ return Number(value);
131
+ }
132
+ throw new Error(`Cannot deserialize integer from value: ${typeof value}`);
133
+ }
134
+
135
+ protected deserializeDecimal(value: unknown): number {
136
+ // SQLite stores decimals as REAL (floating point) or TEXT
137
+ if (typeof value === "number") {
138
+ return value;
139
+ }
140
+ if (typeof value === "string") {
141
+ const num = parseFloat(value);
142
+ if (isNaN(num)) {
143
+ throw new Error(`Cannot deserialize decimal from invalid string: ${value}`);
144
+ }
145
+ return num;
146
+ }
147
+ throw new Error(`Cannot deserialize decimal from value: ${typeof value}`);
148
+ }
149
+
150
+ protected deserializeString(value: unknown): string {
151
+ if (typeof value === "string") {
152
+ return value;
153
+ }
154
+ throw new Error(`Cannot deserialize string from value: ${typeof value}`);
155
+ }
156
+ }
@@ -0,0 +1,143 @@
1
+ import type { DriverConfig } from "../../adapters/generic-sql/driver-config";
2
+ import type { AnyColumn } from "../../schema/create";
3
+
4
+ /**
5
+ * Abstract base class for SQL value serialization/deserialization.
6
+ *
7
+ * Similar to SQLTypeMapper, this class provides a framework for converting values
8
+ * between application format and database format. Each database dialect extends
9
+ * this class and implements abstract methods for dialect-specific conversions.
10
+ *
11
+ * Handles:
12
+ * - Type conversions (Date, boolean, BigInt, etc.)
13
+ * - JSON handling (delegated to dialect-specific implementations)
14
+ * - Binary data conversion (Uint8Array ↔ Buffer)
15
+ */
16
+ export abstract class SQLSerializer {
17
+ protected readonly driverConfig: DriverConfig;
18
+
19
+ constructor(driverConfig: DriverConfig) {
20
+ this.driverConfig = driverConfig;
21
+ }
22
+
23
+ /**
24
+ * Deserialize a value from database format to application format.
25
+ *
26
+ * @param value - The raw database value
27
+ * @param col - The column schema definition
28
+ * @returns The deserialized value in application format
29
+ * @throws Error if value cannot be deserialized to the expected type
30
+ */
31
+ deserialize(value: unknown, col: AnyColumn): unknown {
32
+ if (value === null) {
33
+ return null;
34
+ }
35
+
36
+ // Handle JSON deserialization (delegated to subclass)
37
+ if (col.type === "json") {
38
+ return this.deserializeJson(value);
39
+ }
40
+
41
+ // Handle date/timestamp deserialization
42
+ if (col.type === "timestamp" || col.type === "date") {
43
+ return this.deserializeDate(value);
44
+ }
45
+
46
+ // Handle boolean deserialization
47
+ if (col.type === "bool") {
48
+ return this.deserializeBoolean(value);
49
+ }
50
+
51
+ // Handle bigint deserialization
52
+ if (col.type === "bigint") {
53
+ return this.deserializeBigInt(value);
54
+ }
55
+
56
+ // Handle binary deserialization (delegated to subclass for driver flexibility)
57
+ if (col.type === "binary") {
58
+ return this.deserializeBinary(value);
59
+ }
60
+
61
+ // Handle integer deserialization (delegated to subclass - drivers may return string/bigint)
62
+ if (col.type === "integer") {
63
+ return this.deserializeInteger(value);
64
+ }
65
+
66
+ // Handle decimal deserialization (delegated to subclass for driver flexibility)
67
+ if (col.type === "decimal") {
68
+ return this.deserializeDecimal(value);
69
+ }
70
+
71
+ // Handle string/varchar deserialization (delegated to subclass for consistency)
72
+ if (col.type === "string" || (typeof col.type === "string" && col.type.startsWith("varchar"))) {
73
+ return this.deserializeString(value);
74
+ }
75
+
76
+ throw new Error(`Unsupported column type for deserialization: ${col.type}`);
77
+ }
78
+
79
+ /**
80
+ * Serialize a value from application format to database format.
81
+ *
82
+ * Note: This method expects FragnoId/FragnoReference objects to be resolved
83
+ * to primitive values before calling. Use resolveFragnoIdValue() from
84
+ * value-encoding.ts for this purpose.
85
+ *
86
+ * @param value - The application value to serialize (should not be FragnoId/FragnoReference)
87
+ * @param col - The column schema definition
88
+ * @param skipDriverConversions - Skip driver-level type conversions (Date->number, boolean->0/1, bigint->Buffer).
89
+ * Set to true when using ORMs like Drizzle that handle these conversions internally.
90
+ * @returns The serialized value in database format
91
+ */
92
+ serialize(value: unknown, col: AnyColumn, skipDriverConversions = false): unknown {
93
+ if (value === null) {
94
+ return null;
95
+ }
96
+
97
+ // Handle JSON serialization (delegated to subclass)
98
+ if (col.type === "json") {
99
+ return this.serializeJson(value);
100
+ }
101
+
102
+ // Skip driver-specific type conversions when using ORMs that handle them internally
103
+ if (!skipDriverConversions) {
104
+ // Handle date/timestamp serialization
105
+ if (value instanceof Date) {
106
+ return this.serializeDate(value);
107
+ }
108
+
109
+ // Handle boolean serialization
110
+ if (typeof value === "boolean") {
111
+ return this.serializeBoolean(value);
112
+ }
113
+
114
+ // Handle bigint serialization
115
+ if (typeof value === "bigint") {
116
+ return this.serializeBigInt(value, col);
117
+ }
118
+ }
119
+
120
+ // Handle binary serialization (most drivers accept Buffer)
121
+ if (col.type === "binary" && value instanceof Uint8Array) {
122
+ return Buffer.from(value);
123
+ }
124
+
125
+ return value;
126
+ }
127
+
128
+ // Abstract methods for dialect-specific serialization
129
+ protected abstract serializeDate(value: Date): Date | number;
130
+ protected abstract serializeBoolean(value: boolean): boolean | number;
131
+ protected abstract serializeBigInt(value: bigint, col: AnyColumn): bigint | number | Buffer;
132
+ protected abstract serializeJson(value: unknown): unknown;
133
+
134
+ // Abstract methods for dialect-specific deserialization
135
+ protected abstract deserializeDate(value: unknown): Date;
136
+ protected abstract deserializeBoolean(value: unknown): boolean;
137
+ protected abstract deserializeBigInt(value: unknown): bigint;
138
+ protected abstract deserializeJson(value: unknown): unknown;
139
+ protected abstract deserializeBinary(value: unknown): Uint8Array;
140
+ protected abstract deserializeInteger(value: unknown): number;
141
+ protected abstract deserializeDecimal(value: unknown): number;
142
+ protected abstract deserializeString(value: unknown): string;
143
+ }
@@ -6,7 +6,7 @@ import type {
6
6
  UpdateBuilder,
7
7
  DeleteBuilder,
8
8
  UpdateManyBuilder,
9
- } from "./unit-of-work";
9
+ } from "./unit-of-work/unit-of-work";
10
10
  import type { Prettify } from "../util/types";
11
11
  import type { CursorResult } from "./cursor";
12
12
 
@@ -132,7 +132,7 @@ export type FindManyOptions<
132
132
  }
133
133
  : {});
134
134
 
135
- export interface AbstractQuery<TSchema extends AnySchema, TUOWConfig = void> {
135
+ export interface SimpleQueryInterface<TSchema extends AnySchema, TUOWConfig = void> {
136
136
  /**
137
137
  * Find multiple records using a builder pattern
138
138
  */