@fragno-dev/db 0.1.14 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (445) hide show
  1. package/.turbo/turbo-build.log +242 -139
  2. package/CHANGELOG.md +47 -0
  3. package/README.md +123 -8
  4. package/dist/adapters/adapters.d.ts +19 -5
  5. package/dist/adapters/adapters.d.ts.map +1 -1
  6. package/dist/adapters/adapters.js.map +1 -1
  7. package/dist/adapters/drizzle/drizzle-adapter.d.ts +6 -19
  8. package/dist/adapters/drizzle/drizzle-adapter.d.ts.map +1 -1
  9. package/dist/adapters/drizzle/drizzle-adapter.js +7 -47
  10. package/dist/adapters/drizzle/drizzle-adapter.js.map +1 -1
  11. package/dist/adapters/drizzle/generate.d.ts +7 -1
  12. package/dist/adapters/drizzle/generate.d.ts.map +1 -1
  13. package/dist/adapters/drizzle/generate.js +46 -45
  14. package/dist/adapters/drizzle/generate.js.map +1 -1
  15. package/dist/adapters/generic-sql/driver-config.d.ts +74 -0
  16. package/dist/adapters/generic-sql/driver-config.d.ts.map +1 -0
  17. package/dist/adapters/generic-sql/driver-config.js +94 -0
  18. package/dist/adapters/generic-sql/driver-config.js.map +1 -0
  19. package/dist/adapters/generic-sql/generic-sql-adapter.d.ts +43 -0
  20. package/dist/adapters/generic-sql/generic-sql-adapter.d.ts.map +1 -0
  21. package/dist/adapters/generic-sql/generic-sql-adapter.js +87 -0
  22. package/dist/adapters/generic-sql/generic-sql-adapter.js.map +1 -0
  23. package/dist/adapters/generic-sql/generic-sql-uow-executor.js +67 -0
  24. package/dist/adapters/generic-sql/generic-sql-uow-executor.js.map +1 -0
  25. package/dist/adapters/generic-sql/migration/cold-kysely.js +33 -0
  26. package/dist/adapters/generic-sql/migration/cold-kysely.js.map +1 -0
  27. package/dist/adapters/generic-sql/migration/dialect/mysql.js +60 -0
  28. package/dist/adapters/generic-sql/migration/dialect/mysql.js.map +1 -0
  29. package/dist/adapters/generic-sql/migration/dialect/postgres.js +59 -0
  30. package/dist/adapters/generic-sql/migration/dialect/postgres.js.map +1 -0
  31. package/dist/adapters/generic-sql/migration/dialect/sqlite.js +96 -0
  32. package/dist/adapters/generic-sql/migration/dialect/sqlite.js.map +1 -0
  33. package/dist/adapters/generic-sql/migration/executor.d.ts +15 -0
  34. package/dist/adapters/generic-sql/migration/executor.d.ts.map +1 -0
  35. package/dist/adapters/generic-sql/migration/executor.js +18 -0
  36. package/dist/adapters/generic-sql/migration/executor.js.map +1 -0
  37. package/dist/adapters/generic-sql/migration/prepared-migrations.d.ts +66 -0
  38. package/dist/adapters/generic-sql/migration/prepared-migrations.d.ts.map +1 -0
  39. package/dist/adapters/generic-sql/migration/prepared-migrations.js +68 -0
  40. package/dist/adapters/generic-sql/migration/prepared-migrations.js.map +1 -0
  41. package/dist/adapters/generic-sql/migration/sql-generator.js +212 -0
  42. package/dist/adapters/generic-sql/migration/sql-generator.js.map +1 -0
  43. package/dist/adapters/generic-sql/query/create-sql-query-compiler.js +32 -0
  44. package/dist/adapters/generic-sql/query/create-sql-query-compiler.js.map +1 -0
  45. package/dist/adapters/generic-sql/query/cursor-utils.js +37 -0
  46. package/dist/adapters/generic-sql/query/cursor-utils.js.map +1 -0
  47. package/dist/adapters/generic-sql/query/dialect/mysql.js +33 -0
  48. package/dist/adapters/generic-sql/query/dialect/mysql.js.map +1 -0
  49. package/dist/adapters/generic-sql/query/dialect/postgres.js +32 -0
  50. package/dist/adapters/generic-sql/query/dialect/postgres.js.map +1 -0
  51. package/dist/adapters/generic-sql/query/dialect/sqlite.js +32 -0
  52. package/dist/adapters/generic-sql/query/dialect/sqlite.js.map +1 -0
  53. package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js +152 -0
  54. package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js.map +1 -0
  55. package/dist/adapters/generic-sql/query/select-builder.js +69 -0
  56. package/dist/adapters/generic-sql/query/select-builder.js.map +1 -0
  57. package/dist/adapters/generic-sql/query/sql-query-compiler.js +145 -0
  58. package/dist/adapters/generic-sql/query/sql-query-compiler.js.map +1 -0
  59. package/dist/adapters/generic-sql/query/where-builder.js +129 -0
  60. package/dist/adapters/generic-sql/query/where-builder.js.map +1 -0
  61. package/dist/adapters/generic-sql/result-interpreter.js +74 -0
  62. package/dist/adapters/generic-sql/result-interpreter.js.map +1 -0
  63. package/dist/adapters/generic-sql/uow-decoder.js +105 -0
  64. package/dist/adapters/generic-sql/uow-decoder.js.map +1 -0
  65. package/dist/adapters/generic-sql/uow-encoder.js +93 -0
  66. package/dist/adapters/generic-sql/uow-encoder.js.map +1 -0
  67. package/dist/adapters/kysely/kysely-adapter.d.ts +5 -16
  68. package/dist/adapters/kysely/kysely-adapter.d.ts.map +1 -1
  69. package/dist/adapters/kysely/kysely-adapter.js +6 -159
  70. package/dist/adapters/kysely/kysely-adapter.js.map +1 -1
  71. package/dist/adapters/{drizzle/drizzle-query.js → shared/from-unit-of-work-compiler.js} +48 -62
  72. package/dist/adapters/shared/from-unit-of-work-compiler.js.map +1 -0
  73. package/dist/adapters/{kysely/kysely-shared.d.ts → shared/table-name-mapper.d.ts} +3 -2
  74. package/dist/adapters/shared/table-name-mapper.d.ts.map +1 -0
  75. package/dist/adapters/shared/table-name-mapper.js +43 -0
  76. package/dist/adapters/shared/table-name-mapper.js.map +1 -0
  77. package/dist/adapters/shared/uow-operation-compiler.js +105 -0
  78. package/dist/adapters/shared/uow-operation-compiler.js.map +1 -0
  79. package/dist/db-fragment-definition-builder.d.ts +186 -0
  80. package/dist/db-fragment-definition-builder.d.ts.map +1 -0
  81. package/dist/db-fragment-definition-builder.js +207 -0
  82. package/dist/db-fragment-definition-builder.js.map +1 -0
  83. package/dist/fragments/internal-fragment.d.ts +53 -0
  84. package/dist/fragments/internal-fragment.d.ts.map +1 -0
  85. package/dist/fragments/internal-fragment.js +111 -0
  86. package/dist/fragments/internal-fragment.js.map +1 -0
  87. package/dist/hooks/hooks.d.ts +51 -0
  88. package/dist/hooks/hooks.d.ts.map +1 -0
  89. package/dist/hooks/hooks.js +88 -0
  90. package/dist/hooks/hooks.js.map +1 -0
  91. package/dist/migration-engine/generation-engine.d.ts +0 -2
  92. package/dist/migration-engine/generation-engine.d.ts.map +1 -1
  93. package/dist/migration-engine/generation-engine.js +38 -56
  94. package/dist/migration-engine/generation-engine.js.map +1 -1
  95. package/dist/mod.d.ts +35 -23
  96. package/dist/mod.d.ts.map +1 -1
  97. package/dist/mod.js +48 -45
  98. package/dist/mod.js.map +1 -1
  99. package/dist/node_modules/.pnpm/rou3@0.7.10/node_modules/rou3/dist/index.js +165 -0
  100. package/dist/node_modules/.pnpm/rou3@0.7.10/node_modules/rou3/dist/index.js.map +1 -0
  101. package/dist/packages/fragno/dist/api/bind-services.js +20 -0
  102. package/dist/packages/fragno/dist/api/bind-services.js.map +1 -0
  103. package/dist/packages/fragno/dist/api/error.js +48 -0
  104. package/dist/packages/fragno/dist/api/error.js.map +1 -0
  105. package/dist/packages/fragno/dist/api/fragment-definition-builder.js +320 -0
  106. package/dist/packages/fragno/dist/api/fragment-definition-builder.js.map +1 -0
  107. package/dist/packages/fragno/dist/api/fragment-instantiator.js +525 -0
  108. package/dist/packages/fragno/dist/api/fragment-instantiator.js.map +1 -0
  109. package/dist/packages/fragno/dist/api/fragno-response.js +73 -0
  110. package/dist/packages/fragno/dist/api/fragno-response.js.map +1 -0
  111. package/dist/packages/fragno/dist/api/internal/response-stream.js +81 -0
  112. package/dist/packages/fragno/dist/api/internal/response-stream.js.map +1 -0
  113. package/dist/packages/fragno/dist/api/internal/route.js +10 -0
  114. package/dist/packages/fragno/dist/api/internal/route.js.map +1 -0
  115. package/dist/packages/fragno/dist/api/mutable-request-state.js +97 -0
  116. package/dist/packages/fragno/dist/api/mutable-request-state.js.map +1 -0
  117. package/dist/packages/fragno/dist/api/request-context-storage.js +43 -0
  118. package/dist/packages/fragno/dist/api/request-context-storage.js.map +1 -0
  119. package/dist/packages/fragno/dist/api/request-input-context.js +118 -0
  120. package/dist/packages/fragno/dist/api/request-input-context.js.map +1 -0
  121. package/dist/packages/fragno/dist/api/request-middleware.js +83 -0
  122. package/dist/packages/fragno/dist/api/request-middleware.js.map +1 -0
  123. package/dist/packages/fragno/dist/api/request-output-context.js +119 -0
  124. package/dist/packages/fragno/dist/api/request-output-context.js.map +1 -0
  125. package/dist/packages/fragno/dist/api/route.js +17 -0
  126. package/dist/packages/fragno/dist/api/route.js.map +1 -0
  127. package/dist/packages/fragno/dist/internal/symbols.js +10 -0
  128. package/dist/packages/fragno/dist/internal/symbols.js.map +1 -0
  129. package/dist/query/column-defaults.js +27 -0
  130. package/dist/query/column-defaults.js.map +1 -0
  131. package/dist/query/cursor.d.ts +14 -6
  132. package/dist/query/cursor.d.ts.map +1 -1
  133. package/dist/query/cursor.js +16 -7
  134. package/dist/query/cursor.js.map +1 -1
  135. package/dist/query/orm/orm.d.ts +1 -1
  136. package/dist/query/orm/orm.js.map +1 -1
  137. package/dist/query/serialize/create-sql-serializer.js +30 -0
  138. package/dist/query/serialize/create-sql-serializer.js.map +1 -0
  139. package/dist/query/serialize/dialect/mysql-serializer.js +87 -0
  140. package/dist/query/serialize/dialect/mysql-serializer.js.map +1 -0
  141. package/dist/query/serialize/dialect/postgres-serializer.js +80 -0
  142. package/dist/query/serialize/dialect/postgres-serializer.js.map +1 -0
  143. package/dist/query/serialize/dialect/sqlite-serializer.js +93 -0
  144. package/dist/query/serialize/dialect/sqlite-serializer.js.map +1 -0
  145. package/dist/query/serialize/sql-serializer.js +67 -0
  146. package/dist/query/serialize/sql-serializer.js.map +1 -0
  147. package/dist/query/{query.d.ts → simple-query-interface.d.ts} +6 -6
  148. package/dist/query/simple-query-interface.d.ts.map +1 -0
  149. package/dist/query/unit-of-work/execute-unit-of-work.d.ts +133 -0
  150. package/dist/query/unit-of-work/execute-unit-of-work.d.ts.map +1 -0
  151. package/dist/query/unit-of-work/execute-unit-of-work.js +197 -0
  152. package/dist/query/unit-of-work/execute-unit-of-work.js.map +1 -0
  153. package/dist/query/unit-of-work/retry-policy.d.ts +88 -0
  154. package/dist/query/unit-of-work/retry-policy.d.ts.map +1 -0
  155. package/dist/query/unit-of-work/retry-policy.js +61 -0
  156. package/dist/query/unit-of-work/retry-policy.js.map +1 -0
  157. package/dist/query/{unit-of-work.d.ts → unit-of-work/unit-of-work.d.ts} +145 -58
  158. package/dist/query/unit-of-work/unit-of-work.d.ts.map +1 -0
  159. package/dist/query/{unit-of-work.js → unit-of-work/unit-of-work.js} +435 -198
  160. package/dist/query/unit-of-work/unit-of-work.js.map +1 -0
  161. package/dist/query/value-decoding.js +71 -0
  162. package/dist/query/value-decoding.js.map +1 -0
  163. package/dist/query/value-encoding.js +124 -0
  164. package/dist/query/value-encoding.js.map +1 -0
  165. package/dist/schema/create.d.ts +3 -0
  166. package/dist/schema/create.d.ts.map +1 -1
  167. package/dist/schema/create.js +4 -0
  168. package/dist/schema/create.js.map +1 -1
  169. package/dist/schema/type-conversion/create-sql-type-mapper.js +29 -0
  170. package/dist/schema/type-conversion/create-sql-type-mapper.js.map +1 -0
  171. package/dist/schema/type-conversion/dialect/mysql.js +57 -0
  172. package/dist/schema/type-conversion/dialect/mysql.js.map +1 -0
  173. package/dist/schema/type-conversion/dialect/postgres.js +56 -0
  174. package/dist/schema/type-conversion/dialect/postgres.js.map +1 -0
  175. package/dist/schema/type-conversion/dialect/sqlite.js +52 -0
  176. package/dist/schema/type-conversion/dialect/sqlite.js.map +1 -0
  177. package/dist/schema/type-conversion/type-mapping.js +63 -0
  178. package/dist/schema/type-conversion/type-mapping.js.map +1 -0
  179. package/dist/sql-driver/connection/connection-provider.d.ts +13 -0
  180. package/dist/sql-driver/connection/connection-provider.d.ts.map +1 -0
  181. package/dist/sql-driver/connection/connection-provider.js +19 -0
  182. package/dist/sql-driver/connection/connection-provider.js.map +1 -0
  183. package/dist/sql-driver/connection/single-connection-provider.js +23 -0
  184. package/dist/sql-driver/connection/single-connection-provider.js.map +1 -0
  185. package/dist/sql-driver/dialect-adapter/dialect-adapter.d.ts +7 -0
  186. package/dist/sql-driver/dialect-adapter/dialect-adapter.d.ts.map +1 -0
  187. package/dist/sql-driver/dialects/dialects.d.ts +2 -0
  188. package/dist/sql-driver/dialects/dialects.js +3 -0
  189. package/dist/sql-driver/dialects/durable-object-dialect.d.ts +72 -0
  190. package/dist/sql-driver/dialects/durable-object-dialect.d.ts.map +1 -0
  191. package/dist/sql-driver/dialects/durable-object-dialect.js +130 -0
  192. package/dist/sql-driver/dialects/durable-object-dialect.js.map +1 -0
  193. package/dist/sql-driver/driver/runtime-driver.d.ts +23 -0
  194. package/dist/sql-driver/driver/runtime-driver.d.ts.map +1 -0
  195. package/dist/sql-driver/driver/runtime-driver.js +56 -0
  196. package/dist/sql-driver/driver/runtime-driver.js.map +1 -0
  197. package/dist/sql-driver/query-executor/default-query-executor.js +26 -0
  198. package/dist/sql-driver/query-executor/default-query-executor.js.map +1 -0
  199. package/dist/sql-driver/query-executor/plugin.d.ts +17 -0
  200. package/dist/sql-driver/query-executor/plugin.d.ts.map +1 -0
  201. package/dist/sql-driver/query-executor/query-executor-base.js +25 -0
  202. package/dist/sql-driver/query-executor/query-executor-base.js.map +1 -0
  203. package/dist/sql-driver/query-executor/query-executor.d.ts +36 -0
  204. package/dist/sql-driver/query-executor/query-executor.d.ts.map +1 -0
  205. package/dist/sql-driver/sql-driver-adapter.d.ts +29 -0
  206. package/dist/sql-driver/sql-driver-adapter.d.ts.map +1 -0
  207. package/dist/sql-driver/sql-driver-adapter.js +68 -0
  208. package/dist/sql-driver/sql-driver-adapter.js.map +1 -0
  209. package/dist/sql-driver/sql-driver.d.ts +38 -0
  210. package/dist/sql-driver/sql-driver.d.ts.map +1 -0
  211. package/dist/sql-driver/sql-driver.js +1 -0
  212. package/dist/sql-driver/sql.js +50 -0
  213. package/dist/sql-driver/sql.js.map +1 -0
  214. package/dist/with-database.d.ts +32 -0
  215. package/dist/with-database.d.ts.map +1 -0
  216. package/dist/with-database.js +34 -0
  217. package/dist/with-database.js.map +1 -0
  218. package/package.json +43 -9
  219. package/src/adapters/adapters.ts +23 -4
  220. package/src/adapters/drizzle/drizzle-adapter-pglite.test.ts +140 -185
  221. package/src/adapters/drizzle/{drizzle-adapter-sqlite.test.ts → drizzle-adapter-sqlite3.test.ts} +187 -55
  222. package/src/adapters/drizzle/drizzle-adapter.ts +14 -93
  223. package/src/adapters/drizzle/generate.test.ts +102 -269
  224. package/src/adapters/drizzle/generate.ts +89 -63
  225. package/src/adapters/drizzle/migrate-drizzle.test.ts +19 -0
  226. package/src/adapters/drizzle/shared.ts +0 -34
  227. package/src/adapters/drizzle/test-utils.ts +36 -5
  228. package/src/adapters/generic-sql/README.md +14 -0
  229. package/src/adapters/generic-sql/driver-config.ts +144 -0
  230. package/src/adapters/generic-sql/generic-sql-adapter.test.ts +50 -0
  231. package/src/adapters/generic-sql/generic-sql-adapter.ts +146 -0
  232. package/src/adapters/generic-sql/generic-sql-uow-executor.ts +130 -0
  233. package/src/adapters/generic-sql/migration/cold-kysely.ts +55 -0
  234. package/src/adapters/{kysely/migration/execute-mysql.test.ts → generic-sql/migration/dialect/mysql.test.ts} +342 -484
  235. package/src/adapters/generic-sql/migration/dialect/mysql.ts +104 -0
  236. package/src/adapters/generic-sql/migration/dialect/postgres.test.ts +1008 -0
  237. package/src/adapters/generic-sql/migration/dialect/postgres.ts +113 -0
  238. package/src/adapters/{kysely/migration/execute-sqlite.test.ts → generic-sql/migration/dialect/sqlite.test.ts} +307 -510
  239. package/src/adapters/generic-sql/migration/dialect/sqlite.ts +189 -0
  240. package/src/adapters/generic-sql/migration/executor.ts +33 -0
  241. package/src/adapters/generic-sql/migration/prepared-migrations.test.ts +661 -0
  242. package/src/adapters/generic-sql/migration/prepared-migrations.ts +214 -0
  243. package/src/adapters/generic-sql/migration/sql-generator.ts +413 -0
  244. package/src/adapters/generic-sql/query/create-sql-query-compiler.ts +36 -0
  245. package/src/adapters/generic-sql/query/cursor-utils.ts +56 -0
  246. package/src/adapters/generic-sql/query/dialect/mysql.ts +34 -0
  247. package/src/adapters/generic-sql/query/dialect/postgres.ts +32 -0
  248. package/src/adapters/generic-sql/query/dialect/sqlite.ts +32 -0
  249. package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.test.ts +1568 -0
  250. package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.ts +314 -0
  251. package/src/adapters/generic-sql/query/select-builder.test.ts +256 -0
  252. package/src/adapters/generic-sql/query/select-builder.ts +137 -0
  253. package/src/adapters/generic-sql/query/sql-query-compiler.test.ts +195 -0
  254. package/src/adapters/generic-sql/query/sql-query-compiler.ts +367 -0
  255. package/src/adapters/generic-sql/query/where-builder.test.ts +744 -0
  256. package/src/adapters/generic-sql/query/where-builder.ts +211 -0
  257. package/src/adapters/generic-sql/result-interpreter.ts +102 -0
  258. package/src/adapters/generic-sql/test/generic-drizzle-adapter-sqlite3.test.ts +899 -0
  259. package/src/adapters/generic-sql/uow-decoder.test.ts +399 -0
  260. package/src/adapters/generic-sql/uow-decoder.ts +152 -0
  261. package/src/adapters/generic-sql/uow-encoder.test.ts +183 -0
  262. package/src/adapters/generic-sql/uow-encoder.ts +131 -0
  263. package/src/adapters/kysely/kysely-adapter-pglite.test.ts +90 -96
  264. package/src/adapters/kysely/kysely-adapter-sqlocal.test.ts +215 -0
  265. package/src/adapters/kysely/kysely-adapter.ts +10 -242
  266. package/src/adapters/{drizzle/drizzle-query.ts → shared/from-unit-of-work-compiler.ts} +111 -106
  267. package/src/adapters/shared/table-name-mapper.ts +50 -0
  268. package/src/adapters/shared/uow-operation-compiler.ts +211 -0
  269. package/src/db-fragment-definition-builder.test.ts +887 -0
  270. package/src/db-fragment-definition-builder.ts +737 -0
  271. package/src/db-fragment-instantiator.test.ts +543 -0
  272. package/src/db-fragment-integration.test.ts +406 -0
  273. package/src/fragments/internal-fragment.test.ts +549 -0
  274. package/src/fragments/internal-fragment.ts +249 -0
  275. package/src/hooks/hooks.test.ts +575 -0
  276. package/src/hooks/hooks.ts +179 -0
  277. package/src/migration-engine/generation-engine.test.ts +60 -27
  278. package/src/migration-engine/generation-engine.ts +99 -92
  279. package/src/mod.ts +139 -78
  280. package/src/query/column-defaults.ts +49 -0
  281. package/src/query/cursor.test.ts +147 -3
  282. package/src/query/cursor.ts +25 -8
  283. package/src/query/orm/orm.ts +1 -1
  284. package/src/query/query-type.test.ts +9 -9
  285. package/src/query/serialize/create-sql-serializer.ts +34 -0
  286. package/src/query/serialize/dialect/mysql-serializer.ts +142 -0
  287. package/src/query/serialize/dialect/postgres-serializer.ts +129 -0
  288. package/src/query/serialize/dialect/sqlite-serializer.test.ts +251 -0
  289. package/src/query/serialize/dialect/sqlite-serializer.ts +156 -0
  290. package/src/query/serialize/sql-serializer.ts +143 -0
  291. package/src/query/{query.ts → simple-query-interface.ts} +4 -4
  292. package/src/query/unit-of-work/execute-unit-of-work.test.ts +1310 -0
  293. package/src/query/unit-of-work/execute-unit-of-work.ts +504 -0
  294. package/src/query/unit-of-work/retry-policy.test.ts +217 -0
  295. package/src/query/unit-of-work/retry-policy.ts +141 -0
  296. package/src/query/unit-of-work/unit-of-work-coordinator.test.ts +831 -0
  297. package/src/query/{unit-of-work-types.test.ts → unit-of-work/unit-of-work-types.test.ts} +7 -5
  298. package/src/query/unit-of-work/unit-of-work.test.ts +1716 -0
  299. package/src/query/{unit-of-work.ts → unit-of-work/unit-of-work.ts} +716 -420
  300. package/src/query/{result-transform.test.ts → value-decoding.test.ts} +45 -298
  301. package/src/query/value-decoding.ts +113 -0
  302. package/src/query/value-encoding.test.ts +390 -0
  303. package/src/query/value-encoding.ts +168 -0
  304. package/src/schema/create.test.ts +5 -1
  305. package/src/schema/create.ts +5 -0
  306. package/src/schema/serialize.test.ts +165 -407
  307. package/src/schema/type-conversion/create-sql-type-mapper.ts +28 -0
  308. package/src/schema/type-conversion/dialect/mysql.ts +64 -0
  309. package/src/schema/type-conversion/dialect/postgres.ts +62 -0
  310. package/src/schema/type-conversion/dialect/sqlite.ts +63 -0
  311. package/src/schema/type-conversion/type-mapping.test.ts +137 -0
  312. package/src/schema/type-conversion/type-mapping.ts +153 -0
  313. package/src/shared/connection-pool.ts +5 -5
  314. package/src/sql-driver/better-sqlite3.test.ts +126 -0
  315. package/src/sql-driver/connection/connection-provider.ts +27 -0
  316. package/src/sql-driver/connection/single-connection-provider.ts +42 -0
  317. package/src/sql-driver/dialect-adapter/dialect-adapter.ts +9 -0
  318. package/src/sql-driver/dialect-adapter/sqlite-dialect-adapter.ts +7 -0
  319. package/src/sql-driver/dialects/dialects.ts +1 -0
  320. package/src/sql-driver/dialects/durable-object-dialect.ts +260 -0
  321. package/src/sql-driver/driver/runtime-driver.ts +91 -0
  322. package/src/sql-driver/query-executor/default-query-executor.ts +38 -0
  323. package/src/sql-driver/query-executor/plugin.ts +22 -0
  324. package/src/sql-driver/query-executor/query-executor-base.ts +53 -0
  325. package/src/sql-driver/query-executor/query-executor.ts +44 -0
  326. package/src/sql-driver/sql-driver-adapter.ts +96 -0
  327. package/src/sql-driver/sql-driver.ts +53 -0
  328. package/src/sql-driver/sql.ts +57 -0
  329. package/src/sql-driver/sqlocal.test.ts +117 -0
  330. package/src/with-database.ts +152 -0
  331. package/tsdown.config.ts +8 -2
  332. package/dist/adapters/drizzle/drizzle-connection-pool.js +0 -40
  333. package/dist/adapters/drizzle/drizzle-connection-pool.js.map +0 -1
  334. package/dist/adapters/drizzle/drizzle-query.d.ts +0 -23
  335. package/dist/adapters/drizzle/drizzle-query.d.ts.map +0 -1
  336. package/dist/adapters/drizzle/drizzle-query.js.map +0 -1
  337. package/dist/adapters/drizzle/drizzle-uow-compiler.d.ts +0 -10
  338. package/dist/adapters/drizzle/drizzle-uow-compiler.d.ts.map +0 -1
  339. package/dist/adapters/drizzle/drizzle-uow-compiler.js +0 -315
  340. package/dist/adapters/drizzle/drizzle-uow-compiler.js.map +0 -1
  341. package/dist/adapters/drizzle/drizzle-uow-decoder.js +0 -116
  342. package/dist/adapters/drizzle/drizzle-uow-decoder.js.map +0 -1
  343. package/dist/adapters/drizzle/drizzle-uow-executor.js +0 -149
  344. package/dist/adapters/drizzle/drizzle-uow-executor.js.map +0 -1
  345. package/dist/adapters/drizzle/join-column-utils.js +0 -28
  346. package/dist/adapters/drizzle/join-column-utils.js.map +0 -1
  347. package/dist/adapters/drizzle/shared.d.ts +0 -14
  348. package/dist/adapters/drizzle/shared.d.ts.map +0 -1
  349. package/dist/adapters/drizzle/shared.js +0 -35
  350. package/dist/adapters/drizzle/shared.js.map +0 -1
  351. package/dist/adapters/kysely/kysely-connection-pool.js +0 -41
  352. package/dist/adapters/kysely/kysely-connection-pool.js.map +0 -1
  353. package/dist/adapters/kysely/kysely-query-builder.js +0 -321
  354. package/dist/adapters/kysely/kysely-query-builder.js.map +0 -1
  355. package/dist/adapters/kysely/kysely-query-compiler.js +0 -66
  356. package/dist/adapters/kysely/kysely-query-compiler.js.map +0 -1
  357. package/dist/adapters/kysely/kysely-query.d.ts +0 -22
  358. package/dist/adapters/kysely/kysely-query.d.ts.map +0 -1
  359. package/dist/adapters/kysely/kysely-query.js +0 -223
  360. package/dist/adapters/kysely/kysely-query.js.map +0 -1
  361. package/dist/adapters/kysely/kysely-shared.d.ts.map +0 -1
  362. package/dist/adapters/kysely/kysely-shared.js +0 -18
  363. package/dist/adapters/kysely/kysely-shared.js.map +0 -1
  364. package/dist/adapters/kysely/kysely-uow-compiler.js +0 -170
  365. package/dist/adapters/kysely/kysely-uow-compiler.js.map +0 -1
  366. package/dist/adapters/kysely/kysely-uow-executor.js +0 -89
  367. package/dist/adapters/kysely/kysely-uow-executor.js.map +0 -1
  368. package/dist/adapters/kysely/migration/execute-base.js +0 -128
  369. package/dist/adapters/kysely/migration/execute-base.js.map +0 -1
  370. package/dist/adapters/kysely/migration/execute-factory.js +0 -34
  371. package/dist/adapters/kysely/migration/execute-factory.js.map +0 -1
  372. package/dist/adapters/kysely/migration/execute-mssql.js +0 -112
  373. package/dist/adapters/kysely/migration/execute-mssql.js.map +0 -1
  374. package/dist/adapters/kysely/migration/execute-mysql.js +0 -93
  375. package/dist/adapters/kysely/migration/execute-mysql.js.map +0 -1
  376. package/dist/adapters/kysely/migration/execute-postgres.js +0 -104
  377. package/dist/adapters/kysely/migration/execute-postgres.js.map +0 -1
  378. package/dist/adapters/kysely/migration/execute-sqlite.js +0 -123
  379. package/dist/adapters/kysely/migration/execute-sqlite.js.map +0 -1
  380. package/dist/adapters/kysely/migration/execute.js +0 -34
  381. package/dist/adapters/kysely/migration/execute.js.map +0 -1
  382. package/dist/bind-services.d.ts +0 -7
  383. package/dist/bind-services.d.ts.map +0 -1
  384. package/dist/bind-services.js +0 -14
  385. package/dist/bind-services.js.map +0 -1
  386. package/dist/fragment.d.ts +0 -173
  387. package/dist/fragment.d.ts.map +0 -1
  388. package/dist/fragment.js +0 -191
  389. package/dist/fragment.js.map +0 -1
  390. package/dist/migration-engine/create.d.ts +0 -37
  391. package/dist/migration-engine/create.d.ts.map +0 -1
  392. package/dist/migration-engine/create.js +0 -58
  393. package/dist/migration-engine/create.js.map +0 -1
  394. package/dist/migration-engine/shared.d.ts +0 -112
  395. package/dist/migration-engine/shared.d.ts.map +0 -1
  396. package/dist/query/query.d.ts.map +0 -1
  397. package/dist/query/result-transform.js +0 -168
  398. package/dist/query/result-transform.js.map +0 -1
  399. package/dist/query/unit-of-work.d.ts.map +0 -1
  400. package/dist/query/unit-of-work.js.map +0 -1
  401. package/dist/schema/serialize.js +0 -106
  402. package/dist/schema/serialize.js.map +0 -1
  403. package/dist/shared/settings-schema.js +0 -36
  404. package/dist/shared/settings-schema.js.map +0 -1
  405. package/src/adapters/drizzle/drizzle-adapter.test.ts +0 -170
  406. package/src/adapters/drizzle/drizzle-connection-pool.ts +0 -66
  407. package/src/adapters/drizzle/drizzle-query.test.ts +0 -499
  408. package/src/adapters/drizzle/drizzle-uow-compiler.test.ts +0 -1383
  409. package/src/adapters/drizzle/drizzle-uow-compiler.ts +0 -636
  410. package/src/adapters/drizzle/drizzle-uow-decoder.ts +0 -218
  411. package/src/adapters/drizzle/drizzle-uow-executor.ts +0 -276
  412. package/src/adapters/drizzle/join-column-utils.test.ts +0 -79
  413. package/src/adapters/drizzle/join-column-utils.ts +0 -39
  414. package/src/adapters/kysely/kysely-connection-pool.ts +0 -70
  415. package/src/adapters/kysely/kysely-query-builder.test.ts +0 -1344
  416. package/src/adapters/kysely/kysely-query-builder.ts +0 -666
  417. package/src/adapters/kysely/kysely-query-compiler.ts +0 -132
  418. package/src/adapters/kysely/kysely-query.test.ts +0 -498
  419. package/src/adapters/kysely/kysely-query.ts +0 -390
  420. package/src/adapters/kysely/kysely-shared.ts +0 -23
  421. package/src/adapters/kysely/kysely-uow-compiler.test.ts +0 -998
  422. package/src/adapters/kysely/kysely-uow-compiler.ts +0 -318
  423. package/src/adapters/kysely/kysely-uow-executor.ts +0 -145
  424. package/src/adapters/kysely/kysely-uow-joins.test.ts +0 -811
  425. package/src/adapters/kysely/migration/execute-base.ts +0 -256
  426. package/src/adapters/kysely/migration/execute-factory.ts +0 -53
  427. package/src/adapters/kysely/migration/execute-mssql.ts +0 -250
  428. package/src/adapters/kysely/migration/execute-mysql.ts +0 -211
  429. package/src/adapters/kysely/migration/execute-postgres.test.ts +0 -2657
  430. package/src/adapters/kysely/migration/execute-postgres.ts +0 -234
  431. package/src/adapters/kysely/migration/execute-sqlite.ts +0 -247
  432. package/src/adapters/kysely/migration/execute.ts +0 -50
  433. package/src/adapters/kysely/migration/kysely-migrator.test.ts +0 -261
  434. package/src/bind-services.test.ts +0 -214
  435. package/src/bind-services.ts +0 -37
  436. package/src/db-fragment.test.ts +0 -800
  437. package/src/fragment.ts +0 -727
  438. package/src/query/result-transform.ts +0 -271
  439. package/src/query/unit-of-work-multi-schema.test.ts +0 -64
  440. package/src/query/unit-of-work.test.ts +0 -943
  441. package/src/schema/serialize.ts +0 -396
  442. package/src/shared/settings-schema.ts +0 -61
  443. package/src/uow-context-integration.test.ts +0 -102
  444. package/src/uow-context.test.ts +0 -182
  445. /package/dist/query/{query.js → simple-query-interface.js} +0 -0
@@ -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
+ }
@@ -1,12 +1,12 @@
1
1
  import type { IdColumn, AnySchema, AnyTable, Relation, FragnoId } from "../schema/create";
2
2
  import type { Condition, ConditionBuilder } from "./condition-builder";
3
3
  import type {
4
- UnitOfWork,
4
+ TypedUnitOfWork,
5
5
  FindBuilder,
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
  */
@@ -258,5 +258,5 @@ export interface AbstractQuery<TSchema extends AnySchema, TUOWConfig = void> {
258
258
  /**
259
259
  * Create a Unit of Work bound to this query engine
260
260
  */
261
- createUnitOfWork: (name?: string, config?: TUOWConfig) => UnitOfWork<TSchema, []>;
261
+ createUnitOfWork: (name?: string, config?: TUOWConfig) => TypedUnitOfWork<TSchema, [], unknown>;
262
262
  }