@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 @@
1
+ {"version":3,"file":"column-defaults.js","names":[],"sources":["../../src/query/column-defaults.ts"],"sourcesContent":["import type { AnyColumn } from \"../schema/create\";\nimport { createId } from \"../id\";\n\n/**\n * Generate a runtime default value for a column that has defaultTo$()\n *\n * Only generates values for runtime defaults (defaultTo$), NOT static defaults (defaultTo).\n * Static defaults should be handled by the database via DEFAULT constraints.\n *\n * @param column - The column with a default value configuration\n * @returns The generated default value, or undefined if the column has no runtime default\n *\n * @internal\n */\nexport function generateRuntimeDefault(column: AnyColumn): unknown {\n // Check if column has a default value configuration\n if (!column.default) {\n return undefined;\n }\n\n // If it's a static default value (defaultTo), return undefined\n // as the database should handle this via DEFAULT constraint\n if (\"value\" in column.default) {\n return undefined;\n }\n\n // If it's a database-level special function (defaultTo(b => b.now())), return undefined\n // as the database should handle this via DEFAULT NOW() or equivalent\n if (\"dbSpecial\" in column.default) {\n return undefined;\n }\n\n // Handle runtime defaults (defaultTo$)\n const runtime = column.default.runtime;\n\n if (runtime === \"cuid\") {\n return createId();\n }\n\n if (runtime === \"now\") {\n return new Date();\n }\n\n if (typeof runtime === \"function\") {\n return runtime();\n }\n\n return undefined;\n}\n"],"mappings":";;;;;;;;;;;;;;AAcA,SAAgB,uBAAuB,QAA4B;AAEjE,KAAI,CAAC,OAAO,QACV;AAKF,KAAI,WAAW,OAAO,QACpB;AAKF,KAAI,eAAe,OAAO,QACxB;CAIF,MAAM,UAAU,OAAO,QAAQ;AAE/B,KAAI,YAAY,OACd,QAAO,UAAU;AAGnB,KAAI,YAAY,MACd,wBAAO,IAAI,MAAM;AAGnB,KAAI,OAAO,YAAY,WACrB,QAAO,SAAS"}
@@ -1,5 +1,5 @@
1
1
  import { AnyColumn } from "../schema/create.js";
2
- import { SQLProvider } from "../shared/providers.js";
2
+ import { DriverConfig } from "../adapters/generic-sql/driver-config.js";
3
3
 
4
4
  //#region src/query/cursor.d.ts
5
5
 
@@ -113,7 +113,7 @@ declare function createCursorFromRecord(record: Record<string, unknown>, indexCo
113
113
  *
114
114
  * @param cursor - The cursor object
115
115
  * @param indexColumns - The columns that make up the index
116
- * @param provider - The SQL provider
116
+ * @param driverConfig - The driver configuration
117
117
  * @returns Serialized values ready for database queries
118
118
  *
119
119
  * @example
@@ -121,11 +121,11 @@ declare function createCursorFromRecord(record: Record<string, unknown>, indexCo
121
121
  * const serialized = serializeCursorValues(
122
122
  * cursor,
123
123
  * [table.columns.createdAt],
124
- * "postgresql"
124
+ * driverConfig
125
125
  * );
126
126
  * ```
127
127
  */
128
- declare function serializeCursorValues(cursor: Cursor, indexColumns: AnyColumn[], provider: SQLProvider): Record<string, unknown>;
128
+ declare function serializeCursorValues(cursor: Cursor, indexColumns: AnyColumn[], driverConfig: DriverConfig): Record<string, unknown>;
129
129
  //#endregion
130
130
  export { Cursor, CursorData, CursorResult, createCursorFromRecord, decodeCursor, serializeCursorValues };
131
131
  //# sourceMappingURL=cursor.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cursor.d.ts","names":[],"sources":["../../src/query/cursor.ts"],"sourcesContent":[],"mappings":";;;;;;;AAOA;AAgEiB,cAhEJ,MAAA,CAgEgB;EAkBZ,CAAA,OAAA;EAgCD,WAAA,CAAA,IAAY,EAAA;IA8DZ,SAAA,EAAA,MAAA;IACN,cAAA,EAAA,KAAA,GAAA,MAAA;IACM,QAAA,EAAA,MAAA;IAMb,WAAA,EA9Kc,MA8Kd,CAAA,MAAA,EAAA,OAAA,CAAA;EAAM,CAAA;EAuCO;;;EAGJ,IAAA,SAAA,CAAA,CAAA,EAAA,MAAA;EACT;;;;;;;;;;;qBAzLkB;;;;;;;;;UAsBJ;;;;SAIR;;;;WAIE;;;;;;;;;UAUM,UAAA;;;;;eAKF;;;;;;;;;;;;;;iBA2BC,YAAA,kBAA8B;;;;;;;;;;;;;;;;;;;;;;iBA8D9B,sBAAA,SACN,uCACM;;;;IAMb;;;;;;;;;;;;;;;;;;;;;;;;;iBAuCa,qBAAA,SACN,sBACM,uBACJ,cACT"}
1
+ {"version":3,"file":"cursor.d.ts","names":[],"sources":["../../src/query/cursor.ts"],"sourcesContent":[],"mappings":";;;;;;;AAQA;AAgEiB,cAhEJ,MAAA,CAgEgB;EAkBZ,CAAA,OAAA;EAgCD,WAAA,CAAA,IAAY,EAAA;IA8DZ,SAAA,EAAA,MAAA;IACN,cAAA,EAAA,KAAA,GAAA,MAAA;IACM,QAAA,EAAA,MAAA;IAMb,WAAA,EA9Kc,MA8Kd,CAAA,MAAA,EAAA,OAAA,CAAA;EAAM,CAAA;EAuCO;;;EAGA,IAAA,SAAA,CAAA,CAAA,EAAA,MAAA;EACb;;;;;;;;;;;qBAzLkB;;;;;;;;;UAsBJ;;;;SAIR;;;;WAIE;;;;;;;;;UAUM,UAAA;;;;;eAKF;;;;;;;;;;;;;;iBA2BC,YAAA,kBAA8B;;;;;;;;;;;;;;;;;;;;;;iBA8D9B,sBAAA,SACN,uCACM;;;;IAMb;;;;;;;;;;;;;;;;;;;;;;;;;iBAuCa,qBAAA,SACN,sBACM,2BACA,eACb"}
@@ -1,4 +1,5 @@
1
- import { deserialize, serialize } from "../schema/serialize.js";
1
+ import { createSQLSerializer } from "./serialize/create-sql-serializer.js";
2
+ import { resolveFragnoIdValue } from "./value-encoding.js";
2
3
 
3
4
  //#region src/query/cursor.ts
4
5
  /**
@@ -134,7 +135,7 @@ function createCursorFromRecord(record, indexColumns, metadata) {
134
135
  *
135
136
  * @param cursor - The cursor object
136
137
  * @param indexColumns - The columns that make up the index
137
- * @param provider - The SQL provider
138
+ * @param driverConfig - The driver configuration
138
139
  * @returns Serialized values ready for database queries
139
140
  *
140
141
  * @example
@@ -142,17 +143,18 @@ function createCursorFromRecord(record, indexColumns, metadata) {
142
143
  * const serialized = serializeCursorValues(
143
144
  * cursor,
144
145
  * [table.columns.createdAt],
145
- * "postgresql"
146
+ * driverConfig
146
147
  * );
147
148
  * ```
148
149
  */
149
- function serializeCursorValues(cursor, indexColumns, provider) {
150
+ function serializeCursorValues(cursor, indexColumns, driverConfig) {
151
+ const serializer = createSQLSerializer(driverConfig);
150
152
  const serialized = {};
151
153
  for (const col of indexColumns) {
152
154
  const value = cursor.indexValues[col.ormName];
153
155
  if (value !== void 0) {
154
- const deserialized = deserialize(value, col, provider);
155
- serialized[col.ormName] = serialize(deserialized, col, provider);
156
+ const resolved = resolveFragnoIdValue(serializer.deserialize(value, col), col);
157
+ serialized[col.ormName] = serializer.serialize(resolved, col);
156
158
  }
157
159
  }
158
160
  return serialized;
@@ -1 +1 @@
1
- {"version":3,"file":"cursor.js","names":["#indexName","#orderDirection","#pageSize","#indexValues","json: string","indexValues: Record<string, unknown>","serialized: Record<string, unknown>"],"sources":["../../src/query/cursor.ts"],"sourcesContent":["import type { AnyColumn } from \"../schema/create\";\nimport { deserialize, serialize } from \"../schema/serialize\";\nimport type { SQLProvider } from \"../shared/providers\";\n\n/**\n * Cursor object containing all information needed for pagination\n */\nexport class Cursor {\n readonly #indexName: string;\n readonly #orderDirection: \"asc\" | \"desc\";\n readonly #pageSize: number;\n readonly #indexValues: Record<string, unknown>;\n\n constructor(data: {\n indexName: string;\n orderDirection: \"asc\" | \"desc\";\n pageSize: number;\n indexValues: Record<string, unknown>;\n }) {\n this.#indexName = data.indexName;\n this.#orderDirection = data.orderDirection;\n this.#pageSize = data.pageSize;\n this.#indexValues = data.indexValues;\n }\n\n /**\n * Get the index name being used for pagination\n */\n get indexName(): string {\n return this.#indexName;\n }\n\n /**\n * Get the ordering direction\n */\n get orderDirection(): \"asc\" | \"desc\" {\n return this.#orderDirection;\n }\n\n /**\n * Get the page size\n */\n get pageSize(): number {\n return this.#pageSize;\n }\n\n /**\n * Get the cursor position values\n */\n get indexValues(): Record<string, unknown> {\n return this.#indexValues;\n }\n\n /**\n * Encode cursor to an opaque base64 string (safe to send to client)\n */\n encode(): string {\n const data: CursorData = {\n v: 1,\n indexName: this.#indexName,\n orderDirection: this.#orderDirection,\n pageSize: this.#pageSize,\n indexValues: this.#indexValues,\n };\n return encodeCursorData(data);\n }\n}\n\n/**\n * Result of a cursor-based query containing items and pagination cursor\n */\nexport interface CursorResult<T> {\n /**\n * The query results\n */\n items: T[];\n /**\n * Cursor to fetch the next page (undefined if no more results)\n */\n cursor?: Cursor;\n /**\n * Whether there are more results available after this page\n */\n hasNextPage: boolean;\n}\n\n/**\n * Cursor data structure for serialization\n */\nexport interface CursorData {\n v: number; // version\n indexName: string;\n orderDirection: \"asc\" | \"desc\";\n pageSize: number;\n indexValues: Record<string, unknown>;\n}\n\n/**\n * Encode cursor data to a base64 string (internal)\n */\nfunction encodeCursorData(data: CursorData): string {\n const json = JSON.stringify(data);\n // Use Buffer in Node.js or btoa in browsers\n if (typeof Buffer !== \"undefined\") {\n return Buffer.from(json, \"utf-8\").toString(\"base64\");\n }\n return btoa(json);\n}\n\n/**\n * Decode a base64 cursor string back to a Cursor object\n *\n * @param cursor - The base64-encoded cursor string\n * @returns Decoded Cursor object\n * @throws Error if cursor is invalid or malformed\n *\n * @example\n * ```ts\n * const cursor = decodeCursor(\"eyJpbmRleFZhbHVlcyI6e30sImRpcmVjdGlvbiI6ImZvcndhcmQifQ==\");\n * ```\n */\nexport function decodeCursor(cursor: string): Cursor {\n try {\n let json: string;\n if (typeof Buffer !== \"undefined\") {\n json = Buffer.from(cursor, \"base64\").toString(\"utf-8\");\n } else {\n json = atob(cursor);\n }\n const data = JSON.parse(json);\n\n // Validate structure\n if (\n !data ||\n typeof data !== \"object\" ||\n !data.indexValues ||\n typeof data.indexValues !== \"object\" ||\n typeof data.pageSize !== \"number\" ||\n !data.indexName ||\n !data.orderDirection ||\n (data.orderDirection !== \"asc\" && data.orderDirection !== \"desc\")\n ) {\n throw new Error(\"Invalid cursor structure\");\n }\n\n // Only support v1\n const version = typeof data.v === \"number\" ? data.v : 0;\n if (version !== 1) {\n throw new Error(`Unsupported cursor version: ${version}. Only v1 is supported.`);\n }\n\n return new Cursor({\n indexName: data.indexName,\n orderDirection: data.orderDirection,\n pageSize: data.pageSize,\n indexValues: data.indexValues,\n });\n } catch (error) {\n throw new Error(`Invalid cursor: ${error instanceof Error ? error.message : \"malformed data\"}`);\n }\n}\n\n/**\n * Create a cursor from a record and pagination metadata\n *\n * @param record - The database record\n * @param indexColumns - The columns that make up the index\n * @param metadata - Pagination metadata (index name, order direction, page size)\n * @returns Cursor object\n *\n * @example\n * ```ts\n * const cursor = createCursorFromRecord(\n * { id: \"abc\", name: \"Alice\", createdAt: 123 },\n * [table.columns.createdAt, table.columns.id],\n * {\n * indexName: \"idx_created\",\n * orderDirection: \"asc\",\n * pageSize: 10\n * }\n * );\n * ```\n */\nexport function createCursorFromRecord(\n record: Record<string, unknown>,\n indexColumns: AnyColumn[],\n metadata: {\n indexName: string;\n orderDirection: \"asc\" | \"desc\";\n pageSize: number;\n },\n): Cursor {\n const indexValues: Record<string, unknown> = {};\n\n for (const col of indexColumns) {\n indexValues[col.ormName] = record[col.ormName];\n }\n\n return new Cursor({\n indexName: metadata.indexName,\n orderDirection: metadata.orderDirection,\n pageSize: metadata.pageSize,\n indexValues,\n });\n}\n\n/**\n * Serialize cursor values for database queries\n *\n * Converts cursor values (which are in JSON-compatible format after decode)\n * to database format using the column serialization rules.\n *\n * This function performs a two-step process:\n * 1. Deserialize from JSON format to application format (e.g., ISO string → Date)\n * 2. Serialize from application format to database format (e.g., Date → driver format)\n *\n * @param cursor - The cursor object\n * @param indexColumns - The columns that make up the index\n * @param provider - The SQL provider\n * @returns Serialized values ready for database queries\n *\n * @example\n * ```ts\n * const serialized = serializeCursorValues(\n * cursor,\n * [table.columns.createdAt],\n * \"postgresql\"\n * );\n * ```\n */\nexport function serializeCursorValues(\n cursor: Cursor,\n indexColumns: AnyColumn[],\n provider: SQLProvider,\n): Record<string, unknown> {\n const serialized: Record<string, unknown> = {};\n\n for (const col of indexColumns) {\n const value = cursor.indexValues[col.ormName];\n if (value !== undefined) {\n // First deserialize from JSON format to application format\n // (e.g., \"2025-11-07T09:36:57.959Z\" string → Date object)\n const deserialized = deserialize(value, col, provider);\n // Then serialize to database format\n // (e.g., Date → database driver format)\n serialized[col.ormName] = serialize(deserialized, col, provider);\n }\n }\n\n return serialized;\n}\n"],"mappings":";;;;;;AAOA,IAAa,SAAb,MAAoB;CAClB,CAASA;CACT,CAASC;CACT,CAASC;CACT,CAASC;CAET,YAAY,MAKT;AACD,QAAKH,YAAa,KAAK;AACvB,QAAKC,iBAAkB,KAAK;AAC5B,QAAKC,WAAY,KAAK;AACtB,QAAKC,cAAe,KAAK;;;;;CAM3B,IAAI,YAAoB;AACtB,SAAO,MAAKH;;;;;CAMd,IAAI,iBAAiC;AACnC,SAAO,MAAKC;;;;;CAMd,IAAI,WAAmB;AACrB,SAAO,MAAKC;;;;;CAMd,IAAI,cAAuC;AACzC,SAAO,MAAKC;;;;;CAMd,SAAiB;AAQf,SAAO,iBAPkB;GACvB,GAAG;GACH,WAAW,MAAKH;GAChB,gBAAgB,MAAKC;GACrB,UAAU,MAAKC;GACf,aAAa,MAAKC;GACnB,CAC4B;;;;;;AAoCjC,SAAS,iBAAiB,MAA0B;CAClD,MAAM,OAAO,KAAK,UAAU,KAAK;AAEjC,KAAI,OAAO,WAAW,YACpB,QAAO,OAAO,KAAK,MAAM,QAAQ,CAAC,SAAS,SAAS;AAEtD,QAAO,KAAK,KAAK;;;;;;;;;;;;;;AAenB,SAAgB,aAAa,QAAwB;AACnD,KAAI;EACF,IAAIC;AACJ,MAAI,OAAO,WAAW,YACpB,QAAO,OAAO,KAAK,QAAQ,SAAS,CAAC,SAAS,QAAQ;MAEtD,QAAO,KAAK,OAAO;EAErB,MAAM,OAAO,KAAK,MAAM,KAAK;AAG7B,MACE,CAAC,QACD,OAAO,SAAS,YAChB,CAAC,KAAK,eACN,OAAO,KAAK,gBAAgB,YAC5B,OAAO,KAAK,aAAa,YACzB,CAAC,KAAK,aACN,CAAC,KAAK,kBACL,KAAK,mBAAmB,SAAS,KAAK,mBAAmB,OAE1D,OAAM,IAAI,MAAM,2BAA2B;EAI7C,MAAM,UAAU,OAAO,KAAK,MAAM,WAAW,KAAK,IAAI;AACtD,MAAI,YAAY,EACd,OAAM,IAAI,MAAM,+BAA+B,QAAQ,yBAAyB;AAGlF,SAAO,IAAI,OAAO;GAChB,WAAW,KAAK;GAChB,gBAAgB,KAAK;GACrB,UAAU,KAAK;GACf,aAAa,KAAK;GACnB,CAAC;UACK,OAAO;AACd,QAAM,IAAI,MAAM,mBAAmB,iBAAiB,QAAQ,MAAM,UAAU,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;AAyBnG,SAAgB,uBACd,QACA,cACA,UAKQ;CACR,MAAMC,cAAuC,EAAE;AAE/C,MAAK,MAAM,OAAO,aAChB,aAAY,IAAI,WAAW,OAAO,IAAI;AAGxC,QAAO,IAAI,OAAO;EAChB,WAAW,SAAS;EACpB,gBAAgB,SAAS;EACzB,UAAU,SAAS;EACnB;EACD,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BJ,SAAgB,sBACd,QACA,cACA,UACyB;CACzB,MAAMC,aAAsC,EAAE;AAE9C,MAAK,MAAM,OAAO,cAAc;EAC9B,MAAM,QAAQ,OAAO,YAAY,IAAI;AACrC,MAAI,UAAU,QAAW;GAGvB,MAAM,eAAe,YAAY,OAAO,KAAK,SAAS;AAGtD,cAAW,IAAI,WAAW,UAAU,cAAc,KAAK,SAAS;;;AAIpE,QAAO"}
1
+ {"version":3,"file":"cursor.js","names":["#indexName","#orderDirection","#pageSize","#indexValues","json: string","indexValues: Record<string, unknown>","serialized: Record<string, unknown>"],"sources":["../../src/query/cursor.ts"],"sourcesContent":["import type { AnyColumn } from \"../schema/create\";\nimport { createSQLSerializer } from \"./serialize/create-sql-serializer\";\nimport { resolveFragnoIdValue } from \"./value-encoding\";\nimport type { DriverConfig } from \"../adapters/generic-sql/driver-config\";\n\n/**\n * Cursor object containing all information needed for pagination\n */\nexport class Cursor {\n readonly #indexName: string;\n readonly #orderDirection: \"asc\" | \"desc\";\n readonly #pageSize: number;\n readonly #indexValues: Record<string, unknown>;\n\n constructor(data: {\n indexName: string;\n orderDirection: \"asc\" | \"desc\";\n pageSize: number;\n indexValues: Record<string, unknown>;\n }) {\n this.#indexName = data.indexName;\n this.#orderDirection = data.orderDirection;\n this.#pageSize = data.pageSize;\n this.#indexValues = data.indexValues;\n }\n\n /**\n * Get the index name being used for pagination\n */\n get indexName(): string {\n return this.#indexName;\n }\n\n /**\n * Get the ordering direction\n */\n get orderDirection(): \"asc\" | \"desc\" {\n return this.#orderDirection;\n }\n\n /**\n * Get the page size\n */\n get pageSize(): number {\n return this.#pageSize;\n }\n\n /**\n * Get the cursor position values\n */\n get indexValues(): Record<string, unknown> {\n return this.#indexValues;\n }\n\n /**\n * Encode cursor to an opaque base64 string (safe to send to client)\n */\n encode(): string {\n const data: CursorData = {\n v: 1,\n indexName: this.#indexName,\n orderDirection: this.#orderDirection,\n pageSize: this.#pageSize,\n indexValues: this.#indexValues,\n };\n return encodeCursorData(data);\n }\n}\n\n/**\n * Result of a cursor-based query containing items and pagination cursor\n */\nexport interface CursorResult<T> {\n /**\n * The query results\n */\n items: T[];\n /**\n * Cursor to fetch the next page (undefined if no more results)\n */\n cursor?: Cursor;\n /**\n * Whether there are more results available after this page\n */\n hasNextPage: boolean;\n}\n\n/**\n * Cursor data structure for serialization\n */\nexport interface CursorData {\n v: number; // version\n indexName: string;\n orderDirection: \"asc\" | \"desc\";\n pageSize: number;\n indexValues: Record<string, unknown>;\n}\n\n/**\n * Encode cursor data to a base64 string (internal)\n */\nfunction encodeCursorData(data: CursorData): string {\n const json = JSON.stringify(data);\n // Use Buffer in Node.js or btoa in browsers\n if (typeof Buffer !== \"undefined\") {\n return Buffer.from(json, \"utf-8\").toString(\"base64\");\n }\n return btoa(json);\n}\n\n/**\n * Decode a base64 cursor string back to a Cursor object\n *\n * @param cursor - The base64-encoded cursor string\n * @returns Decoded Cursor object\n * @throws Error if cursor is invalid or malformed\n *\n * @example\n * ```ts\n * const cursor = decodeCursor(\"eyJpbmRleFZhbHVlcyI6e30sImRpcmVjdGlvbiI6ImZvcndhcmQifQ==\");\n * ```\n */\nexport function decodeCursor(cursor: string): Cursor {\n try {\n let json: string;\n if (typeof Buffer !== \"undefined\") {\n json = Buffer.from(cursor, \"base64\").toString(\"utf-8\");\n } else {\n json = atob(cursor);\n }\n const data = JSON.parse(json);\n\n // Validate structure\n if (\n !data ||\n typeof data !== \"object\" ||\n !data.indexValues ||\n typeof data.indexValues !== \"object\" ||\n typeof data.pageSize !== \"number\" ||\n !data.indexName ||\n !data.orderDirection ||\n (data.orderDirection !== \"asc\" && data.orderDirection !== \"desc\")\n ) {\n throw new Error(\"Invalid cursor structure\");\n }\n\n // Only support v1\n const version = typeof data.v === \"number\" ? data.v : 0;\n if (version !== 1) {\n throw new Error(`Unsupported cursor version: ${version}. Only v1 is supported.`);\n }\n\n return new Cursor({\n indexName: data.indexName,\n orderDirection: data.orderDirection,\n pageSize: data.pageSize,\n indexValues: data.indexValues,\n });\n } catch (error) {\n throw new Error(`Invalid cursor: ${error instanceof Error ? error.message : \"malformed data\"}`);\n }\n}\n\n/**\n * Create a cursor from a record and pagination metadata\n *\n * @param record - The database record\n * @param indexColumns - The columns that make up the index\n * @param metadata - Pagination metadata (index name, order direction, page size)\n * @returns Cursor object\n *\n * @example\n * ```ts\n * const cursor = createCursorFromRecord(\n * { id: \"abc\", name: \"Alice\", createdAt: 123 },\n * [table.columns.createdAt, table.columns.id],\n * {\n * indexName: \"idx_created\",\n * orderDirection: \"asc\",\n * pageSize: 10\n * }\n * );\n * ```\n */\nexport function createCursorFromRecord(\n record: Record<string, unknown>,\n indexColumns: AnyColumn[],\n metadata: {\n indexName: string;\n orderDirection: \"asc\" | \"desc\";\n pageSize: number;\n },\n): Cursor {\n const indexValues: Record<string, unknown> = {};\n\n for (const col of indexColumns) {\n indexValues[col.ormName] = record[col.ormName];\n }\n\n return new Cursor({\n indexName: metadata.indexName,\n orderDirection: metadata.orderDirection,\n pageSize: metadata.pageSize,\n indexValues,\n });\n}\n\n/**\n * Serialize cursor values for database queries\n *\n * Converts cursor values (which are in JSON-compatible format after decode)\n * to database format using the column serialization rules.\n *\n * This function performs a two-step process:\n * 1. Deserialize from JSON format to application format (e.g., ISO string → Date)\n * 2. Serialize from application format to database format (e.g., Date → driver format)\n *\n * @param cursor - The cursor object\n * @param indexColumns - The columns that make up the index\n * @param driverConfig - The driver configuration\n * @returns Serialized values ready for database queries\n *\n * @example\n * ```ts\n * const serialized = serializeCursorValues(\n * cursor,\n * [table.columns.createdAt],\n * driverConfig\n * );\n * ```\n */\nexport function serializeCursorValues(\n cursor: Cursor,\n indexColumns: AnyColumn[],\n driverConfig: DriverConfig,\n): Record<string, unknown> {\n const serializer = createSQLSerializer(driverConfig);\n const serialized: Record<string, unknown> = {};\n\n for (const col of indexColumns) {\n const value = cursor.indexValues[col.ormName];\n if (value !== undefined) {\n // First deserialize from JSON format to application format\n // (e.g., \"2025-11-07T09:36:57.959Z\" string → Date object)\n const deserialized = serializer.deserialize(value, col);\n // Resolve FragnoId/FragnoReference to primitive values (if present)\n const resolved = resolveFragnoIdValue(deserialized, col);\n // Then serialize to database format\n // (e.g., Date → database driver format)\n serialized[col.ormName] = serializer.serialize(resolved, col);\n }\n }\n\n return serialized;\n}\n"],"mappings":";;;;;;;AAQA,IAAa,SAAb,MAAoB;CAClB,CAASA;CACT,CAASC;CACT,CAASC;CACT,CAASC;CAET,YAAY,MAKT;AACD,QAAKH,YAAa,KAAK;AACvB,QAAKC,iBAAkB,KAAK;AAC5B,QAAKC,WAAY,KAAK;AACtB,QAAKC,cAAe,KAAK;;;;;CAM3B,IAAI,YAAoB;AACtB,SAAO,MAAKH;;;;;CAMd,IAAI,iBAAiC;AACnC,SAAO,MAAKC;;;;;CAMd,IAAI,WAAmB;AACrB,SAAO,MAAKC;;;;;CAMd,IAAI,cAAuC;AACzC,SAAO,MAAKC;;;;;CAMd,SAAiB;AAQf,SAAO,iBAPkB;GACvB,GAAG;GACH,WAAW,MAAKH;GAChB,gBAAgB,MAAKC;GACrB,UAAU,MAAKC;GACf,aAAa,MAAKC;GACnB,CAC4B;;;;;;AAoCjC,SAAS,iBAAiB,MAA0B;CAClD,MAAM,OAAO,KAAK,UAAU,KAAK;AAEjC,KAAI,OAAO,WAAW,YACpB,QAAO,OAAO,KAAK,MAAM,QAAQ,CAAC,SAAS,SAAS;AAEtD,QAAO,KAAK,KAAK;;;;;;;;;;;;;;AAenB,SAAgB,aAAa,QAAwB;AACnD,KAAI;EACF,IAAIC;AACJ,MAAI,OAAO,WAAW,YACpB,QAAO,OAAO,KAAK,QAAQ,SAAS,CAAC,SAAS,QAAQ;MAEtD,QAAO,KAAK,OAAO;EAErB,MAAM,OAAO,KAAK,MAAM,KAAK;AAG7B,MACE,CAAC,QACD,OAAO,SAAS,YAChB,CAAC,KAAK,eACN,OAAO,KAAK,gBAAgB,YAC5B,OAAO,KAAK,aAAa,YACzB,CAAC,KAAK,aACN,CAAC,KAAK,kBACL,KAAK,mBAAmB,SAAS,KAAK,mBAAmB,OAE1D,OAAM,IAAI,MAAM,2BAA2B;EAI7C,MAAM,UAAU,OAAO,KAAK,MAAM,WAAW,KAAK,IAAI;AACtD,MAAI,YAAY,EACd,OAAM,IAAI,MAAM,+BAA+B,QAAQ,yBAAyB;AAGlF,SAAO,IAAI,OAAO;GAChB,WAAW,KAAK;GAChB,gBAAgB,KAAK;GACrB,UAAU,KAAK;GACf,aAAa,KAAK;GACnB,CAAC;UACK,OAAO;AACd,QAAM,IAAI,MAAM,mBAAmB,iBAAiB,QAAQ,MAAM,UAAU,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;AAyBnG,SAAgB,uBACd,QACA,cACA,UAKQ;CACR,MAAMC,cAAuC,EAAE;AAE/C,MAAK,MAAM,OAAO,aAChB,aAAY,IAAI,WAAW,OAAO,IAAI;AAGxC,QAAO,IAAI,OAAO;EAChB,WAAW,SAAS;EACpB,gBAAgB,SAAS;EACzB,UAAU,SAAS;EACnB;EACD,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BJ,SAAgB,sBACd,QACA,cACA,cACyB;CACzB,MAAM,aAAa,oBAAoB,aAAa;CACpD,MAAMC,aAAsC,EAAE;AAE9C,MAAK,MAAM,OAAO,cAAc;EAC9B,MAAM,QAAQ,OAAO,YAAY,IAAI;AACrC,MAAI,UAAU,QAAW;GAKvB,MAAM,WAAW,qBAFI,WAAW,YAAY,OAAO,IAAI,EAEH,IAAI;AAGxD,cAAW,IAAI,WAAW,WAAW,UAAU,UAAU,IAAI;;;AAIjE,QAAO"}
@@ -1,6 +1,6 @@
1
1
  import { AnyColumn, AnyRelation } from "../../schema/create.js";
2
2
  import { Condition } from "../condition-builder.js";
3
- import { AnySelectClause, FindManyOptions, OrderBy } from "../query.js";
3
+ import { AnySelectClause, FindManyOptions, OrderBy } from "../simple-query-interface.js";
4
4
 
5
5
  //#region src/query/orm/orm.d.ts
6
6
  interface CompiledJoin {
@@ -1 +1 @@
1
- {"version":3,"file":"orm.js","names":["compiled: CompiledJoin[]","builder: Record<string, unknown>"],"sources":["../../../src/query/orm/orm.ts"],"sourcesContent":["import type {\n AnySelectClause,\n FindFirstOptions,\n FindManyOptions,\n JoinBuilder,\n OrderBy,\n} from \"../query\";\nimport { buildCondition, type Condition } from \"../condition-builder\";\nimport type { AnyColumn, AnyRelation, AnyTable } from \"../../schema/create\";\n\nexport interface CompiledJoin {\n relation: AnyRelation;\n options: SimplifyFindOptions<FindManyOptions> | false;\n}\n\nfunction isOrderByArray(v: OrderBy | OrderBy[]): v is OrderBy[] {\n return Array.isArray(v) && Array.isArray(v[0]);\n}\n\nfunction simplifyOrderBy(\n columns: Record<string, AnyColumn>,\n orderBy: OrderBy | OrderBy[] | undefined,\n): OrderBy<AnyColumn>[] | undefined {\n if (!orderBy || orderBy.length === 0) {\n return;\n }\n\n if (!isOrderByArray(orderBy)) {\n orderBy = [orderBy];\n }\n return orderBy.map(([name, value]) => {\n const col = columns[name];\n if (!col) {\n throw new Error(`unknown column name ${name}.`);\n }\n\n return [col, value];\n });\n}\n\nexport function buildFindOptions(\n table: AnyTable,\n { select = true, where, orderBy, join, ...options }: FindManyOptions,\n): SimplifyFindOptions<FindManyOptions> | false {\n let conditions = where ? buildCondition(table.columns, where) : undefined;\n if (conditions === true) {\n conditions = undefined;\n }\n if (conditions === false) {\n return false;\n }\n\n return {\n select,\n where: conditions,\n orderBy: simplifyOrderBy(table.columns, orderBy),\n join: join ? buildJoin(table, join) : undefined,\n ...options,\n };\n}\n\nfunction buildJoin<TTable extends AnyTable>(\n table: AnyTable,\n fn: (builder: JoinBuilder<TTable>) => void,\n): CompiledJoin[] {\n const compiled: CompiledJoin[] = [];\n const builder: Record<string, unknown> = {};\n\n for (const name in table.relations) {\n const relation = table.relations[name]!;\n\n builder[name] = (options: FindFirstOptions | FindManyOptions = {}) => {\n compiled.push({\n relation,\n options: buildFindOptions(relation.table, options),\n });\n\n delete builder[name];\n return builder;\n };\n }\n\n fn(builder as JoinBuilder<TTable>);\n return compiled;\n}\n\nexport type SimplifyFindOptions<O> = Omit<O, \"where\" | \"orderBy\" | \"select\" | \"join\"> & {\n select: AnySelectClause;\n where?: Condition | undefined;\n orderBy?: OrderBy<AnyColumn>[];\n join?: CompiledJoin[];\n};\n"],"mappings":";;;AAeA,SAAS,eAAe,GAAwC;AAC9D,QAAO,MAAM,QAAQ,EAAE,IAAI,MAAM,QAAQ,EAAE,GAAG;;AAGhD,SAAS,gBACP,SACA,SACkC;AAClC,KAAI,CAAC,WAAW,QAAQ,WAAW,EACjC;AAGF,KAAI,CAAC,eAAe,QAAQ,CAC1B,WAAU,CAAC,QAAQ;AAErB,QAAO,QAAQ,KAAK,CAAC,MAAM,WAAW;EACpC,MAAM,MAAM,QAAQ;AACpB,MAAI,CAAC,IACH,OAAM,IAAI,MAAM,uBAAuB,KAAK,GAAG;AAGjD,SAAO,CAAC,KAAK,MAAM;GACnB;;AAGJ,SAAgB,iBACd,OACA,EAAE,SAAS,MAAM,OAAO,SAAS,KAAM,GAAG,WACI;CAC9C,IAAI,aAAa,QAAQ,eAAe,MAAM,SAAS,MAAM,GAAG;AAChE,KAAI,eAAe,KACjB,cAAa;AAEf,KAAI,eAAe,MACjB,QAAO;AAGT,QAAO;EACL;EACA,OAAO;EACP,SAAS,gBAAgB,MAAM,SAAS,QAAQ;EAChD,MAAM,OAAO,UAAU,OAAO,KAAK,GAAG;EACtC,GAAG;EACJ;;AAGH,SAAS,UACP,OACA,IACgB;CAChB,MAAMA,WAA2B,EAAE;CACnC,MAAMC,UAAmC,EAAE;AAE3C,MAAK,MAAM,QAAQ,MAAM,WAAW;EAClC,MAAM,WAAW,MAAM,UAAU;AAEjC,UAAQ,SAAS,UAA8C,EAAE,KAAK;AACpE,YAAS,KAAK;IACZ;IACA,SAAS,iBAAiB,SAAS,OAAO,QAAQ;IACnD,CAAC;AAEF,UAAO,QAAQ;AACf,UAAO;;;AAIX,IAAG,QAA+B;AAClC,QAAO"}
1
+ {"version":3,"file":"orm.js","names":["compiled: CompiledJoin[]","builder: Record<string, unknown>"],"sources":["../../../src/query/orm/orm.ts"],"sourcesContent":["import type {\n AnySelectClause,\n FindFirstOptions,\n FindManyOptions,\n JoinBuilder,\n OrderBy,\n} from \"../simple-query-interface\";\nimport { buildCondition, type Condition } from \"../condition-builder\";\nimport type { AnyColumn, AnyRelation, AnyTable } from \"../../schema/create\";\n\nexport interface CompiledJoin {\n relation: AnyRelation;\n options: SimplifyFindOptions<FindManyOptions> | false;\n}\n\nfunction isOrderByArray(v: OrderBy | OrderBy[]): v is OrderBy[] {\n return Array.isArray(v) && Array.isArray(v[0]);\n}\n\nfunction simplifyOrderBy(\n columns: Record<string, AnyColumn>,\n orderBy: OrderBy | OrderBy[] | undefined,\n): OrderBy<AnyColumn>[] | undefined {\n if (!orderBy || orderBy.length === 0) {\n return;\n }\n\n if (!isOrderByArray(orderBy)) {\n orderBy = [orderBy];\n }\n return orderBy.map(([name, value]) => {\n const col = columns[name];\n if (!col) {\n throw new Error(`unknown column name ${name}.`);\n }\n\n return [col, value];\n });\n}\n\nexport function buildFindOptions(\n table: AnyTable,\n { select = true, where, orderBy, join, ...options }: FindManyOptions,\n): SimplifyFindOptions<FindManyOptions> | false {\n let conditions = where ? buildCondition(table.columns, where) : undefined;\n if (conditions === true) {\n conditions = undefined;\n }\n if (conditions === false) {\n return false;\n }\n\n return {\n select,\n where: conditions,\n orderBy: simplifyOrderBy(table.columns, orderBy),\n join: join ? buildJoin(table, join) : undefined,\n ...options,\n };\n}\n\nfunction buildJoin<TTable extends AnyTable>(\n table: AnyTable,\n fn: (builder: JoinBuilder<TTable>) => void,\n): CompiledJoin[] {\n const compiled: CompiledJoin[] = [];\n const builder: Record<string, unknown> = {};\n\n for (const name in table.relations) {\n const relation = table.relations[name]!;\n\n builder[name] = (options: FindFirstOptions | FindManyOptions = {}) => {\n compiled.push({\n relation,\n options: buildFindOptions(relation.table, options),\n });\n\n delete builder[name];\n return builder;\n };\n }\n\n fn(builder as JoinBuilder<TTable>);\n return compiled;\n}\n\nexport type SimplifyFindOptions<O> = Omit<O, \"where\" | \"orderBy\" | \"select\" | \"join\"> & {\n select: AnySelectClause;\n where?: Condition | undefined;\n orderBy?: OrderBy<AnyColumn>[];\n join?: CompiledJoin[];\n};\n"],"mappings":";;;AAeA,SAAS,eAAe,GAAwC;AAC9D,QAAO,MAAM,QAAQ,EAAE,IAAI,MAAM,QAAQ,EAAE,GAAG;;AAGhD,SAAS,gBACP,SACA,SACkC;AAClC,KAAI,CAAC,WAAW,QAAQ,WAAW,EACjC;AAGF,KAAI,CAAC,eAAe,QAAQ,CAC1B,WAAU,CAAC,QAAQ;AAErB,QAAO,QAAQ,KAAK,CAAC,MAAM,WAAW;EACpC,MAAM,MAAM,QAAQ;AACpB,MAAI,CAAC,IACH,OAAM,IAAI,MAAM,uBAAuB,KAAK,GAAG;AAGjD,SAAO,CAAC,KAAK,MAAM;GACnB;;AAGJ,SAAgB,iBACd,OACA,EAAE,SAAS,MAAM,OAAO,SAAS,KAAM,GAAG,WACI;CAC9C,IAAI,aAAa,QAAQ,eAAe,MAAM,SAAS,MAAM,GAAG;AAChE,KAAI,eAAe,KACjB,cAAa;AAEf,KAAI,eAAe,MACjB,QAAO;AAGT,QAAO;EACL;EACA,OAAO;EACP,SAAS,gBAAgB,MAAM,SAAS,QAAQ;EAChD,MAAM,OAAO,UAAU,OAAO,KAAK,GAAG;EACtC,GAAG;EACJ;;AAGH,SAAS,UACP,OACA,IACgB;CAChB,MAAMA,WAA2B,EAAE;CACnC,MAAMC,UAAmC,EAAE;AAE3C,MAAK,MAAM,QAAQ,MAAM,WAAW;EAClC,MAAM,WAAW,MAAM,UAAU;AAEjC,UAAQ,SAAS,UAA8C,EAAE,KAAK;AACpE,YAAS,KAAK;IACZ;IACA,SAAS,iBAAiB,SAAS,OAAO,QAAQ;IACnD,CAAC;AAEF,UAAO,QAAQ;AACf,UAAO;;;AAIX,IAAG,QAA+B;AAClC,QAAO"}
@@ -0,0 +1,30 @@
1
+ import { SQLSerializer } from "./sql-serializer.js";
2
+ import { SQLiteSerializer } from "./dialect/sqlite-serializer.js";
3
+ import { PostgreSQLSerializer } from "./dialect/postgres-serializer.js";
4
+ import { MySQLSerializer } from "./dialect/mysql-serializer.js";
5
+
6
+ //#region src/query/serialize/create-sql-serializer.ts
7
+ /**
8
+ * Factory function to create a dialect-specific SQL serializer from a DriverConfig.
9
+ *
10
+ * Based on the database type, returns the appropriate serializer implementation
11
+ * (PostgreSQL, MySQL, or SQLite).
12
+ *
13
+ * @param driverConfig - The driver configuration
14
+ * @returns Dialect-specific SQLSerializer instance
15
+ */
16
+ function createSQLSerializer(driverConfig) {
17
+ switch (driverConfig.databaseType) {
18
+ case "postgresql": return new PostgreSQLSerializer(driverConfig);
19
+ case "mysql": return new MySQLSerializer(driverConfig);
20
+ case "sqlite": return new SQLiteSerializer(driverConfig);
21
+ default: {
22
+ const exhaustiveCheck = driverConfig.databaseType;
23
+ throw new Error(`Unsupported database type: ${exhaustiveCheck}`);
24
+ }
25
+ }
26
+ }
27
+
28
+ //#endregion
29
+ export { createSQLSerializer };
30
+ //# sourceMappingURL=create-sql-serializer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-sql-serializer.js","names":["exhaustiveCheck: never"],"sources":["../../../src/query/serialize/create-sql-serializer.ts"],"sourcesContent":["import type { DriverConfig } from \"../../adapters/generic-sql/driver-config\";\nimport { SQLSerializer } from \"./sql-serializer\";\nimport { SQLiteSerializer } from \"./dialect/sqlite-serializer\";\nimport { PostgreSQLSerializer } from \"./dialect/postgres-serializer\";\nimport { MySQLSerializer } from \"./dialect/mysql-serializer\";\n\n// Re-export SQLSerializer for convenience\nexport { SQLSerializer } from \"./sql-serializer\";\n\n/**\n * Factory function to create a dialect-specific SQL serializer from a DriverConfig.\n *\n * Based on the database type, returns the appropriate serializer implementation\n * (PostgreSQL, MySQL, or SQLite).\n *\n * @param driverConfig - The driver configuration\n * @returns Dialect-specific SQLSerializer instance\n */\nexport function createSQLSerializer(driverConfig: DriverConfig): SQLSerializer {\n // TODO: The serializers are pretty lenient in what they accept (lost of typeof checks), it may\n // be beneficial to implement serializers per DriverConfig, and be less lenient.\n switch (driverConfig.databaseType) {\n case \"postgresql\":\n return new PostgreSQLSerializer(driverConfig);\n case \"mysql\":\n return new MySQLSerializer(driverConfig);\n case \"sqlite\":\n return new SQLiteSerializer(driverConfig);\n default: {\n const exhaustiveCheck: never = driverConfig.databaseType;\n throw new Error(`Unsupported database type: ${exhaustiveCheck}`);\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;AAkBA,SAAgB,oBAAoB,cAA2C;AAG7E,SAAQ,aAAa,cAArB;EACE,KAAK,aACH,QAAO,IAAI,qBAAqB,aAAa;EAC/C,KAAK,QACH,QAAO,IAAI,gBAAgB,aAAa;EAC1C,KAAK,SACH,QAAO,IAAI,iBAAiB,aAAa;EAC3C,SAAS;GACP,MAAMA,kBAAyB,aAAa;AAC5C,SAAM,IAAI,MAAM,8BAA8B,kBAAkB"}
@@ -0,0 +1,87 @@
1
+ import { SQLSerializer } from "../sql-serializer.js";
2
+
3
+ //#region src/query/serialize/dialect/mysql-serializer.ts
4
+ /**
5
+ * MySQL-specific serializer.
6
+ *
7
+ * MySQL has good native type support:
8
+ * - Native JSON support (MySQL 5.7+)
9
+ * - Native boolean type (TINYINT(1))
10
+ * - Native timestamp/datetime/date types
11
+ * - Native bigint support
12
+ *
13
+ * Similar to PostgreSQL, most values pass through without conversion.
14
+ * Timestamps/dates are returned as strings and need to be parsed.
15
+ */
16
+ var MySQLSerializer = class extends SQLSerializer {
17
+ constructor(driverConfig) {
18
+ super(driverConfig);
19
+ }
20
+ serializeDate(value) {
21
+ return value;
22
+ }
23
+ serializeBoolean(value) {
24
+ return value;
25
+ }
26
+ serializeBigInt(value, _col) {
27
+ return value;
28
+ }
29
+ deserializeDate(value) {
30
+ if (value instanceof Date) return value;
31
+ if (typeof value === "string") return new Date(value);
32
+ throw new Error(`Cannot deserialize date from value: ${value}`);
33
+ }
34
+ deserializeBoolean(value) {
35
+ if (typeof value === "boolean") return value;
36
+ if (typeof value === "number") return value === 1;
37
+ throw new Error(`Cannot deserialize boolean from value: ${value}`);
38
+ }
39
+ deserializeBigInt(value) {
40
+ if (typeof value === "bigint") return value;
41
+ if (typeof value === "string") return BigInt(value);
42
+ if (typeof value === "number") return BigInt(value);
43
+ throw new Error(`Cannot deserialize bigint from value: ${value}`);
44
+ }
45
+ serializeJson(value) {
46
+ return value;
47
+ }
48
+ deserializeJson(value) {
49
+ return value;
50
+ }
51
+ deserializeBinary(value) {
52
+ if (value instanceof Buffer) return new Uint8Array(value.buffer, value.byteOffset, value.byteLength);
53
+ if (value instanceof Uint8Array) return value;
54
+ if (value instanceof ArrayBuffer) return new Uint8Array(value);
55
+ throw new Error(`Cannot deserialize binary from value: ${typeof value}`);
56
+ }
57
+ deserializeInteger(value) {
58
+ if (typeof value === "number") return value;
59
+ if (typeof value === "string") {
60
+ const num = Number(value);
61
+ if (isNaN(num)) throw new Error(`Cannot deserialize integer from invalid string: ${value}`);
62
+ return num;
63
+ }
64
+ if (typeof value === "bigint") {
65
+ if (value > Number.MAX_SAFE_INTEGER || value < Number.MIN_SAFE_INTEGER) throw new RangeError(`Cannot deserialize integer value ${value}: exceeds safe integer range`);
66
+ return Number(value);
67
+ }
68
+ throw new Error(`Cannot deserialize integer from value: ${typeof value}`);
69
+ }
70
+ deserializeDecimal(value) {
71
+ if (typeof value === "number") return value;
72
+ if (typeof value === "string") {
73
+ const num = parseFloat(value);
74
+ if (isNaN(num)) throw new Error(`Cannot deserialize decimal from invalid string: ${value}`);
75
+ return num;
76
+ }
77
+ throw new Error(`Cannot deserialize decimal from value: ${typeof value}`);
78
+ }
79
+ deserializeString(value) {
80
+ if (typeof value === "string") return value;
81
+ throw new Error(`Cannot deserialize string from value: ${typeof value}`);
82
+ }
83
+ };
84
+
85
+ //#endregion
86
+ export { MySQLSerializer };
87
+ //# sourceMappingURL=mysql-serializer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mysql-serializer.js","names":[],"sources":["../../../../src/query/serialize/dialect/mysql-serializer.ts"],"sourcesContent":["import type { AnyColumn } from \"../../../schema/create\";\nimport { SQLSerializer } from \"../sql-serializer\";\nimport type { DriverConfig } from \"../../../adapters/generic-sql/driver-config\";\n\n/**\n * MySQL-specific serializer.\n *\n * MySQL has good native type support:\n * - Native JSON support (MySQL 5.7+)\n * - Native boolean type (TINYINT(1))\n * - Native timestamp/datetime/date types\n * - Native bigint support\n *\n * Similar to PostgreSQL, most values pass through without conversion.\n * Timestamps/dates are returned as strings and need to be parsed.\n */\nexport class MySQLSerializer extends SQLSerializer {\n constructor(driverConfig: DriverConfig) {\n super(driverConfig);\n }\n\n protected serializeDate(value: Date): Date {\n // MySQL handles Date objects natively\n return value;\n }\n\n protected serializeBoolean(value: boolean): boolean {\n // MySQL handles boolean natively (as TINYINT(1))\n return value;\n }\n\n protected serializeBigInt(value: bigint, _col: AnyColumn): bigint {\n // MySQL handles bigint natively\n return value;\n }\n\n protected deserializeDate(value: unknown): Date {\n if (value instanceof Date) {\n return value;\n }\n // MySQL returns timestamps/dates as strings\n if (typeof value === \"string\") {\n return new Date(value);\n }\n throw new Error(`Cannot deserialize date from value: ${value}`);\n }\n\n protected deserializeBoolean(value: unknown): boolean {\n if (typeof value === \"boolean\") {\n return value;\n }\n // MySQL may return booleans as numbers (0/1)\n if (typeof value === \"number\") {\n return value === 1;\n }\n throw new Error(`Cannot deserialize boolean from value: ${value}`);\n }\n\n protected deserializeBigInt(value: unknown): bigint {\n if (typeof value === \"bigint\") {\n return value;\n }\n // MySQL may return bigints as strings\n if (typeof value === \"string\") {\n return BigInt(value);\n }\n if (typeof value === \"number\") {\n return BigInt(value);\n }\n throw new Error(`Cannot deserialize bigint from value: ${value}`);\n }\n\n protected serializeJson(value: unknown): unknown {\n // MySQL supports native JSON, pass through as-is\n return value;\n }\n\n protected deserializeJson(value: unknown): unknown {\n // MySQL returns parsed JSON objects, pass through as-is\n return value;\n }\n\n protected deserializeBinary(value: unknown): Uint8Array {\n // MySQL can return Buffer or Uint8Array for BLOB columns\n if (value instanceof Buffer) {\n return new Uint8Array(value.buffer, value.byteOffset, value.byteLength);\n }\n if (value instanceof Uint8Array) {\n return value;\n }\n if (value instanceof ArrayBuffer) {\n return new Uint8Array(value);\n }\n throw new Error(`Cannot deserialize binary from value: ${typeof value}`);\n }\n\n protected deserializeInteger(value: unknown): number {\n if (typeof value === \"number\") {\n return value;\n }\n // MySQL may return integers as strings\n if (typeof value === \"string\") {\n const num = Number(value);\n if (isNaN(num)) {\n throw new Error(`Cannot deserialize integer from invalid string: ${value}`);\n }\n return num;\n }\n // MySQL may return bigint for large integers\n if (typeof value === \"bigint\") {\n if (value > Number.MAX_SAFE_INTEGER || value < Number.MIN_SAFE_INTEGER) {\n throw new RangeError(\n `Cannot deserialize integer value ${value}: exceeds safe integer range`,\n );\n }\n return Number(value);\n }\n throw new Error(`Cannot deserialize integer from value: ${typeof value}`);\n }\n\n protected deserializeDecimal(value: unknown): number {\n // MySQL can return decimals as numbers or strings\n if (typeof value === \"number\") {\n return value;\n }\n if (typeof value === \"string\") {\n const num = parseFloat(value);\n if (isNaN(num)) {\n throw new Error(`Cannot deserialize decimal from invalid string: ${value}`);\n }\n return num;\n }\n throw new Error(`Cannot deserialize decimal from value: ${typeof value}`);\n }\n\n protected deserializeString(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n throw new Error(`Cannot deserialize string from value: ${typeof value}`);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;AAgBA,IAAa,kBAAb,cAAqC,cAAc;CACjD,YAAY,cAA4B;AACtC,QAAM,aAAa;;CAGrB,AAAU,cAAc,OAAmB;AAEzC,SAAO;;CAGT,AAAU,iBAAiB,OAAyB;AAElD,SAAO;;CAGT,AAAU,gBAAgB,OAAe,MAAyB;AAEhE,SAAO;;CAGT,AAAU,gBAAgB,OAAsB;AAC9C,MAAI,iBAAiB,KACnB,QAAO;AAGT,MAAI,OAAO,UAAU,SACnB,QAAO,IAAI,KAAK,MAAM;AAExB,QAAM,IAAI,MAAM,uCAAuC,QAAQ;;CAGjE,AAAU,mBAAmB,OAAyB;AACpD,MAAI,OAAO,UAAU,UACnB,QAAO;AAGT,MAAI,OAAO,UAAU,SACnB,QAAO,UAAU;AAEnB,QAAM,IAAI,MAAM,0CAA0C,QAAQ;;CAGpE,AAAU,kBAAkB,OAAwB;AAClD,MAAI,OAAO,UAAU,SACnB,QAAO;AAGT,MAAI,OAAO,UAAU,SACnB,QAAO,OAAO,MAAM;AAEtB,MAAI,OAAO,UAAU,SACnB,QAAO,OAAO,MAAM;AAEtB,QAAM,IAAI,MAAM,yCAAyC,QAAQ;;CAGnE,AAAU,cAAc,OAAyB;AAE/C,SAAO;;CAGT,AAAU,gBAAgB,OAAyB;AAEjD,SAAO;;CAGT,AAAU,kBAAkB,OAA4B;AAEtD,MAAI,iBAAiB,OACnB,QAAO,IAAI,WAAW,MAAM,QAAQ,MAAM,YAAY,MAAM,WAAW;AAEzE,MAAI,iBAAiB,WACnB,QAAO;AAET,MAAI,iBAAiB,YACnB,QAAO,IAAI,WAAW,MAAM;AAE9B,QAAM,IAAI,MAAM,yCAAyC,OAAO,QAAQ;;CAG1E,AAAU,mBAAmB,OAAwB;AACnD,MAAI,OAAO,UAAU,SACnB,QAAO;AAGT,MAAI,OAAO,UAAU,UAAU;GAC7B,MAAM,MAAM,OAAO,MAAM;AACzB,OAAI,MAAM,IAAI,CACZ,OAAM,IAAI,MAAM,mDAAmD,QAAQ;AAE7E,UAAO;;AAGT,MAAI,OAAO,UAAU,UAAU;AAC7B,OAAI,QAAQ,OAAO,oBAAoB,QAAQ,OAAO,iBACpD,OAAM,IAAI,WACR,oCAAoC,MAAM,8BAC3C;AAEH,UAAO,OAAO,MAAM;;AAEtB,QAAM,IAAI,MAAM,0CAA0C,OAAO,QAAQ;;CAG3E,AAAU,mBAAmB,OAAwB;AAEnD,MAAI,OAAO,UAAU,SACnB,QAAO;AAET,MAAI,OAAO,UAAU,UAAU;GAC7B,MAAM,MAAM,WAAW,MAAM;AAC7B,OAAI,MAAM,IAAI,CACZ,OAAM,IAAI,MAAM,mDAAmD,QAAQ;AAE7E,UAAO;;AAET,QAAM,IAAI,MAAM,0CAA0C,OAAO,QAAQ;;CAG3E,AAAU,kBAAkB,OAAwB;AAClD,MAAI,OAAO,UAAU,SACnB,QAAO;AAET,QAAM,IAAI,MAAM,yCAAyC,OAAO,QAAQ"}
@@ -0,0 +1,80 @@
1
+ import { SQLSerializer } from "../sql-serializer.js";
2
+
3
+ //#region src/query/serialize/dialect/postgres-serializer.ts
4
+ /**
5
+ * PostgreSQL-specific serializer.
6
+ *
7
+ * PostgreSQL has excellent native type support:
8
+ * - Native JSON support
9
+ * - Native boolean type
10
+ * - Native timestamp/date types
11
+ * - Native bigint support
12
+ *
13
+ * Most values pass through without conversion, only strings need to be parsed to Date.
14
+ */
15
+ var PostgreSQLSerializer = class extends SQLSerializer {
16
+ constructor(driverConfig) {
17
+ super(driverConfig);
18
+ }
19
+ serializeDate(value) {
20
+ return value;
21
+ }
22
+ serializeBoolean(value) {
23
+ return value;
24
+ }
25
+ serializeBigInt(value, _col) {
26
+ return value;
27
+ }
28
+ deserializeDate(value) {
29
+ if (value instanceof Date) return value;
30
+ if (typeof value === "string") return new Date(value);
31
+ throw new Error(`Cannot deserialize date from value: ${value}`);
32
+ }
33
+ deserializeBoolean(value) {
34
+ if (typeof value === "boolean") return value;
35
+ throw new Error(`Cannot deserialize boolean from value: ${value}`);
36
+ }
37
+ deserializeBigInt(value) {
38
+ if (typeof value === "bigint") return value;
39
+ if (typeof value === "string") return BigInt(value);
40
+ if (typeof value === "number") return BigInt(value);
41
+ throw new Error(`Cannot deserialize bigint from value: ${value}`);
42
+ }
43
+ serializeJson(value) {
44
+ return value;
45
+ }
46
+ deserializeJson(value) {
47
+ return value;
48
+ }
49
+ deserializeBinary(value) {
50
+ if (value instanceof Buffer) return new Uint8Array(value.buffer, value.byteOffset, value.byteLength);
51
+ if (value instanceof Uint8Array) return value;
52
+ if (value instanceof ArrayBuffer) return new Uint8Array(value);
53
+ throw new Error(`Cannot deserialize binary from value: ${typeof value}`);
54
+ }
55
+ deserializeInteger(value) {
56
+ if (typeof value === "number") return value;
57
+ if (typeof value === "bigint") {
58
+ if (value > Number.MAX_SAFE_INTEGER || value < Number.MIN_SAFE_INTEGER) throw new RangeError(`Cannot deserialize integer value ${value}: exceeds safe integer range`);
59
+ return Number(value);
60
+ }
61
+ throw new Error(`Cannot deserialize integer from value: ${typeof value}`);
62
+ }
63
+ deserializeDecimal(value) {
64
+ if (typeof value === "number") return value;
65
+ if (typeof value === "string") {
66
+ const num = parseFloat(value);
67
+ if (isNaN(num)) throw new Error(`Cannot deserialize decimal from invalid string: ${value}`);
68
+ return num;
69
+ }
70
+ throw new Error(`Cannot deserialize decimal from value: ${typeof value}`);
71
+ }
72
+ deserializeString(value) {
73
+ if (typeof value === "string") return value;
74
+ throw new Error(`Cannot deserialize string from value: ${typeof value}`);
75
+ }
76
+ };
77
+
78
+ //#endregion
79
+ export { PostgreSQLSerializer };
80
+ //# sourceMappingURL=postgres-serializer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres-serializer.js","names":[],"sources":["../../../../src/query/serialize/dialect/postgres-serializer.ts"],"sourcesContent":["import type { AnyColumn } from \"../../../schema/create\";\nimport { SQLSerializer } from \"../sql-serializer\";\nimport type { DriverConfig } from \"../../../adapters/generic-sql/driver-config\";\n\n/**\n * PostgreSQL-specific serializer.\n *\n * PostgreSQL has excellent native type support:\n * - Native JSON support\n * - Native boolean type\n * - Native timestamp/date types\n * - Native bigint support\n *\n * Most values pass through without conversion, only strings need to be parsed to Date.\n */\nexport class PostgreSQLSerializer extends SQLSerializer {\n constructor(driverConfig: DriverConfig) {\n super(driverConfig);\n }\n\n protected serializeDate(value: Date): Date {\n // PostgreSQL handles Date objects natively\n return value;\n }\n\n protected serializeBoolean(value: boolean): boolean {\n // PostgreSQL handles boolean natively\n return value;\n }\n\n protected serializeBigInt(value: bigint, _col: AnyColumn): bigint {\n // PostgreSQL handles bigint natively\n return value;\n }\n\n protected deserializeDate(value: unknown): Date {\n if (value instanceof Date) {\n return value;\n }\n // PostgreSQL returns timestamps/dates as strings\n if (typeof value === \"string\") {\n return new Date(value);\n }\n throw new Error(`Cannot deserialize date from value: ${value}`);\n }\n\n protected deserializeBoolean(value: unknown): boolean {\n if (typeof value === \"boolean\") {\n return value;\n }\n throw new Error(`Cannot deserialize boolean from value: ${value}`);\n }\n\n protected deserializeBigInt(value: unknown): bigint {\n if (typeof value === \"bigint\") {\n return value;\n }\n // PostgreSQL may return bigints as strings\n if (typeof value === \"string\") {\n return BigInt(value);\n }\n if (typeof value === \"number\") {\n return BigInt(value);\n }\n throw new Error(`Cannot deserialize bigint from value: ${value}`);\n }\n\n protected serializeJson(value: unknown): unknown {\n // PostgreSQL supports native JSON, pass through as-is\n return value;\n }\n\n protected deserializeJson(value: unknown): unknown {\n // PostgreSQL returns parsed JSON objects, pass through as-is\n return value;\n }\n\n protected deserializeBinary(value: unknown): Uint8Array {\n // PostgreSQL can return Buffer or Uint8Array for BYTEA columns\n if (value instanceof Buffer) {\n return new Uint8Array(value.buffer, value.byteOffset, value.byteLength);\n }\n if (value instanceof Uint8Array) {\n return value;\n }\n if (value instanceof ArrayBuffer) {\n return new Uint8Array(value);\n }\n throw new Error(`Cannot deserialize binary from value: ${typeof value}`);\n }\n\n protected deserializeInteger(value: unknown): number {\n if (typeof value === \"number\") {\n return value;\n }\n // PostgreSQL may return bigint for large integers\n if (typeof value === \"bigint\") {\n if (value > Number.MAX_SAFE_INTEGER || value < Number.MIN_SAFE_INTEGER) {\n throw new RangeError(\n `Cannot deserialize integer value ${value}: exceeds safe integer range`,\n );\n }\n return Number(value);\n }\n throw new Error(`Cannot deserialize integer from value: ${typeof value}`);\n }\n\n protected deserializeDecimal(value: unknown): number {\n // PostgreSQL can return decimals as numbers or strings depending on precision\n if (typeof value === \"number\") {\n return value;\n }\n if (typeof value === \"string\") {\n const num = parseFloat(value);\n if (isNaN(num)) {\n throw new Error(`Cannot deserialize decimal from invalid string: ${value}`);\n }\n return num;\n }\n throw new Error(`Cannot deserialize decimal from value: ${typeof value}`);\n }\n\n protected deserializeString(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n throw new Error(`Cannot deserialize string from value: ${typeof value}`);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;AAeA,IAAa,uBAAb,cAA0C,cAAc;CACtD,YAAY,cAA4B;AACtC,QAAM,aAAa;;CAGrB,AAAU,cAAc,OAAmB;AAEzC,SAAO;;CAGT,AAAU,iBAAiB,OAAyB;AAElD,SAAO;;CAGT,AAAU,gBAAgB,OAAe,MAAyB;AAEhE,SAAO;;CAGT,AAAU,gBAAgB,OAAsB;AAC9C,MAAI,iBAAiB,KACnB,QAAO;AAGT,MAAI,OAAO,UAAU,SACnB,QAAO,IAAI,KAAK,MAAM;AAExB,QAAM,IAAI,MAAM,uCAAuC,QAAQ;;CAGjE,AAAU,mBAAmB,OAAyB;AACpD,MAAI,OAAO,UAAU,UACnB,QAAO;AAET,QAAM,IAAI,MAAM,0CAA0C,QAAQ;;CAGpE,AAAU,kBAAkB,OAAwB;AAClD,MAAI,OAAO,UAAU,SACnB,QAAO;AAGT,MAAI,OAAO,UAAU,SACnB,QAAO,OAAO,MAAM;AAEtB,MAAI,OAAO,UAAU,SACnB,QAAO,OAAO,MAAM;AAEtB,QAAM,IAAI,MAAM,yCAAyC,QAAQ;;CAGnE,AAAU,cAAc,OAAyB;AAE/C,SAAO;;CAGT,AAAU,gBAAgB,OAAyB;AAEjD,SAAO;;CAGT,AAAU,kBAAkB,OAA4B;AAEtD,MAAI,iBAAiB,OACnB,QAAO,IAAI,WAAW,MAAM,QAAQ,MAAM,YAAY,MAAM,WAAW;AAEzE,MAAI,iBAAiB,WACnB,QAAO;AAET,MAAI,iBAAiB,YACnB,QAAO,IAAI,WAAW,MAAM;AAE9B,QAAM,IAAI,MAAM,yCAAyC,OAAO,QAAQ;;CAG1E,AAAU,mBAAmB,OAAwB;AACnD,MAAI,OAAO,UAAU,SACnB,QAAO;AAGT,MAAI,OAAO,UAAU,UAAU;AAC7B,OAAI,QAAQ,OAAO,oBAAoB,QAAQ,OAAO,iBACpD,OAAM,IAAI,WACR,oCAAoC,MAAM,8BAC3C;AAEH,UAAO,OAAO,MAAM;;AAEtB,QAAM,IAAI,MAAM,0CAA0C,OAAO,QAAQ;;CAG3E,AAAU,mBAAmB,OAAwB;AAEnD,MAAI,OAAO,UAAU,SACnB,QAAO;AAET,MAAI,OAAO,UAAU,UAAU;GAC7B,MAAM,MAAM,WAAW,MAAM;AAC7B,OAAI,MAAM,IAAI,CACZ,OAAM,IAAI,MAAM,mDAAmD,QAAQ;AAE7E,UAAO;;AAET,QAAM,IAAI,MAAM,0CAA0C,OAAO,QAAQ;;CAG3E,AAAU,kBAAkB,OAAwB;AAClD,MAAI,OAAO,UAAU,SACnB,QAAO;AAET,QAAM,IAAI,MAAM,yCAAyC,OAAO,QAAQ"}
@@ -0,0 +1,93 @@
1
+ import { SQLSerializer } from "../sql-serializer.js";
2
+
3
+ //#region src/query/serialize/dialect/sqlite-serializer.ts
4
+ /**
5
+ * SQLite-specific serializer.
6
+ *
7
+ * SQLite has limited native type support and requires conversions:
8
+ * - JSON → strings (no native JSON support)
9
+ * - Dates → numbers (timestamps)
10
+ * - Booleans → 0/1
11
+ * - BigInts → Buffer (except for internal-id and reference columns → number)
12
+ * - Numbers/strings → Date for timestamps/dates
13
+ */
14
+ var SQLiteSerializer = class extends SQLSerializer {
15
+ constructor(driverConfig) {
16
+ super(driverConfig);
17
+ }
18
+ serializeDate(value) {
19
+ return value.getTime();
20
+ }
21
+ serializeBoolean(value) {
22
+ return value ? 1 : 0;
23
+ }
24
+ serializeBigInt(value, col) {
25
+ if (col.role === "reference" || col.role === "internal-id") {
26
+ if (Math.abs(Number(value)) > Number.MAX_SAFE_INTEGER) throw new RangeError(`Cannot serialize bigint value ${value} for column "${col.name}": value exceeds Number.MAX_SAFE_INTEGER (${Number.MAX_SAFE_INTEGER}). SQLite reference and internal-id columns use INTEGER type which requires values to fit within JavaScript's safe integer range.`);
27
+ return Number(value);
28
+ }
29
+ const buf = Buffer.alloc(8);
30
+ buf.writeBigInt64BE(value);
31
+ return buf;
32
+ }
33
+ deserializeDate(value) {
34
+ if (value instanceof Date) return value;
35
+ if (typeof value === "number" || typeof value === "string") return new Date(value);
36
+ throw new Error(`Cannot deserialize date from value: ${value}`);
37
+ }
38
+ deserializeBoolean(value) {
39
+ if (typeof value === "boolean") return value;
40
+ if (typeof value === "number") return value === 1;
41
+ throw new Error(`Cannot deserialize boolean from value: ${value}`);
42
+ }
43
+ deserializeBigInt(value) {
44
+ if (typeof value === "bigint") return value;
45
+ if (value instanceof Buffer) return value.readBigInt64BE(0);
46
+ if (typeof value === "string") return BigInt(value);
47
+ if (typeof value === "number") return BigInt(value);
48
+ throw new Error(`Cannot deserialize bigint from value: ${value}`);
49
+ }
50
+ serializeJson(value) {
51
+ return JSON.stringify(value);
52
+ }
53
+ deserializeJson(value) {
54
+ if (typeof value !== "string") throw new Error(`Expected JSON string but got ${typeof value}`);
55
+ return JSON.parse(value);
56
+ }
57
+ deserializeBinary(value) {
58
+ if (value instanceof Buffer) return new Uint8Array(value.buffer, value.byteOffset, value.byteLength);
59
+ if (value instanceof Uint8Array) return value;
60
+ if (value instanceof ArrayBuffer) return new Uint8Array(value);
61
+ throw new Error(`Cannot deserialize binary from value: ${typeof value}`);
62
+ }
63
+ deserializeInteger(value) {
64
+ if (typeof value === "number") return value;
65
+ if (typeof value === "string") {
66
+ const num = Number(value);
67
+ if (isNaN(num)) throw new Error(`Cannot deserialize integer from invalid string: ${value}`);
68
+ return num;
69
+ }
70
+ if (typeof value === "bigint") {
71
+ if (value > Number.MAX_SAFE_INTEGER || value < Number.MIN_SAFE_INTEGER) throw new RangeError(`Cannot deserialize integer value ${value}: exceeds safe integer range`);
72
+ return Number(value);
73
+ }
74
+ throw new Error(`Cannot deserialize integer from value: ${typeof value}`);
75
+ }
76
+ deserializeDecimal(value) {
77
+ if (typeof value === "number") return value;
78
+ if (typeof value === "string") {
79
+ const num = parseFloat(value);
80
+ if (isNaN(num)) throw new Error(`Cannot deserialize decimal from invalid string: ${value}`);
81
+ return num;
82
+ }
83
+ throw new Error(`Cannot deserialize decimal from value: ${typeof value}`);
84
+ }
85
+ deserializeString(value) {
86
+ if (typeof value === "string") return value;
87
+ throw new Error(`Cannot deserialize string from value: ${typeof value}`);
88
+ }
89
+ };
90
+
91
+ //#endregion
92
+ export { SQLiteSerializer };
93
+ //# sourceMappingURL=sqlite-serializer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-serializer.js","names":[],"sources":["../../../../src/query/serialize/dialect/sqlite-serializer.ts"],"sourcesContent":["import type { AnyColumn } from \"../../../schema/create\";\nimport { SQLSerializer } from \"../sql-serializer\";\nimport type { DriverConfig } from \"../../../adapters/generic-sql/driver-config\";\n\n/**\n * SQLite-specific serializer.\n *\n * SQLite has limited native type support and requires conversions:\n * - JSON → strings (no native JSON support)\n * - Dates → numbers (timestamps)\n * - Booleans → 0/1\n * - BigInts → Buffer (except for internal-id and reference columns → number)\n * - Numbers/strings → Date for timestamps/dates\n */\nexport class SQLiteSerializer extends SQLSerializer {\n constructor(driverConfig: DriverConfig) {\n super(driverConfig);\n }\n\n protected serializeDate(value: Date): number {\n return value.getTime();\n }\n\n protected serializeBoolean(value: boolean): number {\n return value ? 1 : 0;\n }\n\n protected serializeBigInt(value: bigint, col: AnyColumn): number | Buffer {\n // SQLite special case: internal-id and reference columns use integer, not blob\n // These should be converted to numbers for SQLite\n if (col.role === \"reference\" || col.role === \"internal-id\") {\n // Check if the bigint is within the safe integer range to avoid precision loss\n if (Math.abs(Number(value)) > Number.MAX_SAFE_INTEGER) {\n throw new RangeError(\n `Cannot serialize bigint value ${value} for column \"${col.name}\": ` +\n `value exceeds Number.MAX_SAFE_INTEGER (${Number.MAX_SAFE_INTEGER}). ` +\n `SQLite reference and internal-id columns use INTEGER type which requires values ` +\n `to fit within JavaScript's safe integer range.`,\n );\n }\n return Number(value);\n }\n const buf = Buffer.alloc(8);\n buf.writeBigInt64BE(value);\n return buf;\n }\n\n protected deserializeDate(value: unknown): Date {\n if (value instanceof Date) {\n return value;\n }\n if (typeof value === \"number\" || typeof value === \"string\") {\n return new Date(value);\n }\n throw new Error(`Cannot deserialize date from value: ${value}`);\n }\n\n protected deserializeBoolean(value: unknown): boolean {\n if (typeof value === \"boolean\") {\n return value;\n }\n if (typeof value === \"number\") {\n return value === 1;\n }\n throw new Error(`Cannot deserialize boolean from value: ${value}`);\n }\n\n protected deserializeBigInt(value: unknown): bigint {\n if (typeof value === \"bigint\") {\n return value;\n }\n if (value instanceof Buffer) {\n return value.readBigInt64BE(0);\n }\n if (typeof value === \"string\") {\n return BigInt(value);\n }\n if (typeof value === \"number\") {\n return BigInt(value);\n }\n throw new Error(`Cannot deserialize bigint from value: ${value}`);\n }\n\n protected serializeJson(value: unknown): string {\n // SQLite doesn't support native JSON, so we stringify\n return JSON.stringify(value);\n }\n\n protected deserializeJson(value: unknown): unknown {\n // SQLite stores JSON as strings, so we need to parse\n if (typeof value !== \"string\") {\n throw new Error(`Expected JSON string but got ${typeof value}`);\n }\n return JSON.parse(value);\n }\n\n protected deserializeBinary(value: unknown): Uint8Array {\n // SQLite can return Buffer or Uint8Array for BLOB columns\n if (value instanceof Buffer) {\n return new Uint8Array(value.buffer, value.byteOffset, value.byteLength);\n }\n if (value instanceof Uint8Array) {\n return value;\n }\n if (value instanceof ArrayBuffer) {\n return new Uint8Array(value);\n }\n throw new Error(`Cannot deserialize binary from value: ${typeof value}`);\n }\n\n protected deserializeInteger(value: unknown): number {\n if (typeof value === \"number\") {\n return value;\n }\n // SQLite may return integers as strings for large values\n if (typeof value === \"string\") {\n const num = Number(value);\n if (isNaN(num)) {\n throw new Error(`Cannot deserialize integer from invalid string: ${value}`);\n }\n return num;\n }\n // SQLite may return bigint for large integers\n if (typeof value === \"bigint\") {\n if (value > Number.MAX_SAFE_INTEGER || value < Number.MIN_SAFE_INTEGER) {\n throw new RangeError(\n `Cannot deserialize integer value ${value}: exceeds safe integer range`,\n );\n }\n return Number(value);\n }\n throw new Error(`Cannot deserialize integer from value: ${typeof value}`);\n }\n\n protected deserializeDecimal(value: unknown): number {\n // SQLite stores decimals as REAL (floating point) or TEXT\n if (typeof value === \"number\") {\n return value;\n }\n if (typeof value === \"string\") {\n const num = parseFloat(value);\n if (isNaN(num)) {\n throw new Error(`Cannot deserialize decimal from invalid string: ${value}`);\n }\n return num;\n }\n throw new Error(`Cannot deserialize decimal from value: ${typeof value}`);\n }\n\n protected deserializeString(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n throw new Error(`Cannot deserialize string from value: ${typeof value}`);\n }\n}\n"],"mappings":";;;;;;;;;;;;;AAcA,IAAa,mBAAb,cAAsC,cAAc;CAClD,YAAY,cAA4B;AACtC,QAAM,aAAa;;CAGrB,AAAU,cAAc,OAAqB;AAC3C,SAAO,MAAM,SAAS;;CAGxB,AAAU,iBAAiB,OAAwB;AACjD,SAAO,QAAQ,IAAI;;CAGrB,AAAU,gBAAgB,OAAe,KAAiC;AAGxE,MAAI,IAAI,SAAS,eAAe,IAAI,SAAS,eAAe;AAE1D,OAAI,KAAK,IAAI,OAAO,MAAM,CAAC,GAAG,OAAO,iBACnC,OAAM,IAAI,WACR,iCAAiC,MAAM,eAAe,IAAI,KAAK,4CACnB,OAAO,iBAAiB,mIAGrE;AAEH,UAAO,OAAO,MAAM;;EAEtB,MAAM,MAAM,OAAO,MAAM,EAAE;AAC3B,MAAI,gBAAgB,MAAM;AAC1B,SAAO;;CAGT,AAAU,gBAAgB,OAAsB;AAC9C,MAAI,iBAAiB,KACnB,QAAO;AAET,MAAI,OAAO,UAAU,YAAY,OAAO,UAAU,SAChD,QAAO,IAAI,KAAK,MAAM;AAExB,QAAM,IAAI,MAAM,uCAAuC,QAAQ;;CAGjE,AAAU,mBAAmB,OAAyB;AACpD,MAAI,OAAO,UAAU,UACnB,QAAO;AAET,MAAI,OAAO,UAAU,SACnB,QAAO,UAAU;AAEnB,QAAM,IAAI,MAAM,0CAA0C,QAAQ;;CAGpE,AAAU,kBAAkB,OAAwB;AAClD,MAAI,OAAO,UAAU,SACnB,QAAO;AAET,MAAI,iBAAiB,OACnB,QAAO,MAAM,eAAe,EAAE;AAEhC,MAAI,OAAO,UAAU,SACnB,QAAO,OAAO,MAAM;AAEtB,MAAI,OAAO,UAAU,SACnB,QAAO,OAAO,MAAM;AAEtB,QAAM,IAAI,MAAM,yCAAyC,QAAQ;;CAGnE,AAAU,cAAc,OAAwB;AAE9C,SAAO,KAAK,UAAU,MAAM;;CAG9B,AAAU,gBAAgB,OAAyB;AAEjD,MAAI,OAAO,UAAU,SACnB,OAAM,IAAI,MAAM,gCAAgC,OAAO,QAAQ;AAEjE,SAAO,KAAK,MAAM,MAAM;;CAG1B,AAAU,kBAAkB,OAA4B;AAEtD,MAAI,iBAAiB,OACnB,QAAO,IAAI,WAAW,MAAM,QAAQ,MAAM,YAAY,MAAM,WAAW;AAEzE,MAAI,iBAAiB,WACnB,QAAO;AAET,MAAI,iBAAiB,YACnB,QAAO,IAAI,WAAW,MAAM;AAE9B,QAAM,IAAI,MAAM,yCAAyC,OAAO,QAAQ;;CAG1E,AAAU,mBAAmB,OAAwB;AACnD,MAAI,OAAO,UAAU,SACnB,QAAO;AAGT,MAAI,OAAO,UAAU,UAAU;GAC7B,MAAM,MAAM,OAAO,MAAM;AACzB,OAAI,MAAM,IAAI,CACZ,OAAM,IAAI,MAAM,mDAAmD,QAAQ;AAE7E,UAAO;;AAGT,MAAI,OAAO,UAAU,UAAU;AAC7B,OAAI,QAAQ,OAAO,oBAAoB,QAAQ,OAAO,iBACpD,OAAM,IAAI,WACR,oCAAoC,MAAM,8BAC3C;AAEH,UAAO,OAAO,MAAM;;AAEtB,QAAM,IAAI,MAAM,0CAA0C,OAAO,QAAQ;;CAG3E,AAAU,mBAAmB,OAAwB;AAEnD,MAAI,OAAO,UAAU,SACnB,QAAO;AAET,MAAI,OAAO,UAAU,UAAU;GAC7B,MAAM,MAAM,WAAW,MAAM;AAC7B,OAAI,MAAM,IAAI,CACZ,OAAM,IAAI,MAAM,mDAAmD,QAAQ;AAE7E,UAAO;;AAET,QAAM,IAAI,MAAM,0CAA0C,OAAO,QAAQ;;CAG3E,AAAU,kBAAkB,OAAwB;AAClD,MAAI,OAAO,UAAU,SACnB,QAAO;AAET,QAAM,IAAI,MAAM,yCAAyC,OAAO,QAAQ"}
@@ -0,0 +1,67 @@
1
+ //#region src/query/serialize/sql-serializer.ts
2
+ /**
3
+ * Abstract base class for SQL value serialization/deserialization.
4
+ *
5
+ * Similar to SQLTypeMapper, this class provides a framework for converting values
6
+ * between application format and database format. Each database dialect extends
7
+ * this class and implements abstract methods for dialect-specific conversions.
8
+ *
9
+ * Handles:
10
+ * - Type conversions (Date, boolean, BigInt, etc.)
11
+ * - JSON handling (delegated to dialect-specific implementations)
12
+ * - Binary data conversion (Uint8Array ↔ Buffer)
13
+ */
14
+ var SQLSerializer = class {
15
+ driverConfig;
16
+ constructor(driverConfig) {
17
+ this.driverConfig = driverConfig;
18
+ }
19
+ /**
20
+ * Deserialize a value from database format to application format.
21
+ *
22
+ * @param value - The raw database value
23
+ * @param col - The column schema definition
24
+ * @returns The deserialized value in application format
25
+ * @throws Error if value cannot be deserialized to the expected type
26
+ */
27
+ deserialize(value, col) {
28
+ if (value === null) return null;
29
+ if (col.type === "json") return this.deserializeJson(value);
30
+ if (col.type === "timestamp" || col.type === "date") return this.deserializeDate(value);
31
+ if (col.type === "bool") return this.deserializeBoolean(value);
32
+ if (col.type === "bigint") return this.deserializeBigInt(value);
33
+ if (col.type === "binary") return this.deserializeBinary(value);
34
+ if (col.type === "integer") return this.deserializeInteger(value);
35
+ if (col.type === "decimal") return this.deserializeDecimal(value);
36
+ if (col.type === "string" || typeof col.type === "string" && col.type.startsWith("varchar")) return this.deserializeString(value);
37
+ throw new Error(`Unsupported column type for deserialization: ${col.type}`);
38
+ }
39
+ /**
40
+ * Serialize a value from application format to database format.
41
+ *
42
+ * Note: This method expects FragnoId/FragnoReference objects to be resolved
43
+ * to primitive values before calling. Use resolveFragnoIdValue() from
44
+ * value-encoding.ts for this purpose.
45
+ *
46
+ * @param value - The application value to serialize (should not be FragnoId/FragnoReference)
47
+ * @param col - The column schema definition
48
+ * @param skipDriverConversions - Skip driver-level type conversions (Date->number, boolean->0/1, bigint->Buffer).
49
+ * Set to true when using ORMs like Drizzle that handle these conversions internally.
50
+ * @returns The serialized value in database format
51
+ */
52
+ serialize(value, col, skipDriverConversions = false) {
53
+ if (value === null) return null;
54
+ if (col.type === "json") return this.serializeJson(value);
55
+ if (!skipDriverConversions) {
56
+ if (value instanceof Date) return this.serializeDate(value);
57
+ if (typeof value === "boolean") return this.serializeBoolean(value);
58
+ if (typeof value === "bigint") return this.serializeBigInt(value, col);
59
+ }
60
+ if (col.type === "binary" && value instanceof Uint8Array) return Buffer.from(value);
61
+ return value;
62
+ }
63
+ };
64
+
65
+ //#endregion
66
+ export { SQLSerializer };
67
+ //# sourceMappingURL=sql-serializer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql-serializer.js","names":[],"sources":["../../../src/query/serialize/sql-serializer.ts"],"sourcesContent":["import type { DriverConfig } from \"../../adapters/generic-sql/driver-config\";\nimport type { AnyColumn } from \"../../schema/create\";\n\n/**\n * Abstract base class for SQL value serialization/deserialization.\n *\n * Similar to SQLTypeMapper, this class provides a framework for converting values\n * between application format and database format. Each database dialect extends\n * this class and implements abstract methods for dialect-specific conversions.\n *\n * Handles:\n * - Type conversions (Date, boolean, BigInt, etc.)\n * - JSON handling (delegated to dialect-specific implementations)\n * - Binary data conversion (Uint8Array ↔ Buffer)\n */\nexport abstract class SQLSerializer {\n protected readonly driverConfig: DriverConfig;\n\n constructor(driverConfig: DriverConfig) {\n this.driverConfig = driverConfig;\n }\n\n /**\n * Deserialize a value from database format to application format.\n *\n * @param value - The raw database value\n * @param col - The column schema definition\n * @returns The deserialized value in application format\n * @throws Error if value cannot be deserialized to the expected type\n */\n deserialize(value: unknown, col: AnyColumn): unknown {\n if (value === null) {\n return null;\n }\n\n // Handle JSON deserialization (delegated to subclass)\n if (col.type === \"json\") {\n return this.deserializeJson(value);\n }\n\n // Handle date/timestamp deserialization\n if (col.type === \"timestamp\" || col.type === \"date\") {\n return this.deserializeDate(value);\n }\n\n // Handle boolean deserialization\n if (col.type === \"bool\") {\n return this.deserializeBoolean(value);\n }\n\n // Handle bigint deserialization\n if (col.type === \"bigint\") {\n return this.deserializeBigInt(value);\n }\n\n // Handle binary deserialization (delegated to subclass for driver flexibility)\n if (col.type === \"binary\") {\n return this.deserializeBinary(value);\n }\n\n // Handle integer deserialization (delegated to subclass - drivers may return string/bigint)\n if (col.type === \"integer\") {\n return this.deserializeInteger(value);\n }\n\n // Handle decimal deserialization (delegated to subclass for driver flexibility)\n if (col.type === \"decimal\") {\n return this.deserializeDecimal(value);\n }\n\n // Handle string/varchar deserialization (delegated to subclass for consistency)\n if (col.type === \"string\" || (typeof col.type === \"string\" && col.type.startsWith(\"varchar\"))) {\n return this.deserializeString(value);\n }\n\n throw new Error(`Unsupported column type for deserialization: ${col.type}`);\n }\n\n /**\n * Serialize a value from application format to database format.\n *\n * Note: This method expects FragnoId/FragnoReference objects to be resolved\n * to primitive values before calling. Use resolveFragnoIdValue() from\n * value-encoding.ts for this purpose.\n *\n * @param value - The application value to serialize (should not be FragnoId/FragnoReference)\n * @param col - The column schema definition\n * @param skipDriverConversions - Skip driver-level type conversions (Date->number, boolean->0/1, bigint->Buffer).\n * Set to true when using ORMs like Drizzle that handle these conversions internally.\n * @returns The serialized value in database format\n */\n serialize(value: unknown, col: AnyColumn, skipDriverConversions = false): unknown {\n if (value === null) {\n return null;\n }\n\n // Handle JSON serialization (delegated to subclass)\n if (col.type === \"json\") {\n return this.serializeJson(value);\n }\n\n // Skip driver-specific type conversions when using ORMs that handle them internally\n if (!skipDriverConversions) {\n // Handle date/timestamp serialization\n if (value instanceof Date) {\n return this.serializeDate(value);\n }\n\n // Handle boolean serialization\n if (typeof value === \"boolean\") {\n return this.serializeBoolean(value);\n }\n\n // Handle bigint serialization\n if (typeof value === \"bigint\") {\n return this.serializeBigInt(value, col);\n }\n }\n\n // Handle binary serialization (most drivers accept Buffer)\n if (col.type === \"binary\" && value instanceof Uint8Array) {\n return Buffer.from(value);\n }\n\n return value;\n }\n\n // Abstract methods for dialect-specific serialization\n protected abstract serializeDate(value: Date): Date | number;\n protected abstract serializeBoolean(value: boolean): boolean | number;\n protected abstract serializeBigInt(value: bigint, col: AnyColumn): bigint | number | Buffer;\n protected abstract serializeJson(value: unknown): unknown;\n\n // Abstract methods for dialect-specific deserialization\n protected abstract deserializeDate(value: unknown): Date;\n protected abstract deserializeBoolean(value: unknown): boolean;\n protected abstract deserializeBigInt(value: unknown): bigint;\n protected abstract deserializeJson(value: unknown): unknown;\n protected abstract deserializeBinary(value: unknown): Uint8Array;\n protected abstract deserializeInteger(value: unknown): number;\n protected abstract deserializeDecimal(value: unknown): number;\n protected abstract deserializeString(value: unknown): string;\n}\n"],"mappings":";;;;;;;;;;;;;AAeA,IAAsB,gBAAtB,MAAoC;CAClC,AAAmB;CAEnB,YAAY,cAA4B;AACtC,OAAK,eAAe;;;;;;;;;;CAWtB,YAAY,OAAgB,KAAyB;AACnD,MAAI,UAAU,KACZ,QAAO;AAIT,MAAI,IAAI,SAAS,OACf,QAAO,KAAK,gBAAgB,MAAM;AAIpC,MAAI,IAAI,SAAS,eAAe,IAAI,SAAS,OAC3C,QAAO,KAAK,gBAAgB,MAAM;AAIpC,MAAI,IAAI,SAAS,OACf,QAAO,KAAK,mBAAmB,MAAM;AAIvC,MAAI,IAAI,SAAS,SACf,QAAO,KAAK,kBAAkB,MAAM;AAItC,MAAI,IAAI,SAAS,SACf,QAAO,KAAK,kBAAkB,MAAM;AAItC,MAAI,IAAI,SAAS,UACf,QAAO,KAAK,mBAAmB,MAAM;AAIvC,MAAI,IAAI,SAAS,UACf,QAAO,KAAK,mBAAmB,MAAM;AAIvC,MAAI,IAAI,SAAS,YAAa,OAAO,IAAI,SAAS,YAAY,IAAI,KAAK,WAAW,UAAU,CAC1F,QAAO,KAAK,kBAAkB,MAAM;AAGtC,QAAM,IAAI,MAAM,gDAAgD,IAAI,OAAO;;;;;;;;;;;;;;;CAgB7E,UAAU,OAAgB,KAAgB,wBAAwB,OAAgB;AAChF,MAAI,UAAU,KACZ,QAAO;AAIT,MAAI,IAAI,SAAS,OACf,QAAO,KAAK,cAAc,MAAM;AAIlC,MAAI,CAAC,uBAAuB;AAE1B,OAAI,iBAAiB,KACnB,QAAO,KAAK,cAAc,MAAM;AAIlC,OAAI,OAAO,UAAU,UACnB,QAAO,KAAK,iBAAiB,MAAM;AAIrC,OAAI,OAAO,UAAU,SACnB,QAAO,KAAK,gBAAgB,OAAO,IAAI;;AAK3C,MAAI,IAAI,SAAS,YAAY,iBAAiB,WAC5C,QAAO,OAAO,KAAK,MAAM;AAG3B,SAAO"}
@@ -2,9 +2,9 @@ import { AnySchema, AnyTable, FragnoId, IdColumn, Relation } from "../schema/cre
2
2
  import { Condition, ConditionBuilder } from "./condition-builder.js";
3
3
  import { CursorResult } from "./cursor.js";
4
4
  import { Prettify } from "../util/types.js";
5
- import { DeleteBuilder, FindBuilder, TypedUnitOfWork, UpdateBuilder, UpdateManyBuilder } from "./unit-of-work.js";
5
+ import { DeleteBuilder, FindBuilder, TypedUnitOfWork, UpdateBuilder, UpdateManyBuilder } from "./unit-of-work/unit-of-work.js";
6
6
 
7
- //#region src/query/query.d.ts
7
+ //#region src/query/simple-query-interface.d.ts
8
8
  type AnySelectClause = SelectClause<AnyTable>;
9
9
  type SelectClause<T extends AnyTable> = true | (keyof T["columns"])[];
10
10
  type RawColumnValues<T extends AnyTable> = { [K in keyof T["columns"] as string extends K ? never : K]: T["columns"][K]["$out"] };
@@ -42,7 +42,7 @@ type FindManyOptions<T extends AnyTable = AnyTable, Select extends SelectClause<
42
42
  } & (IsRoot extends true ? {
43
43
  offset?: number;
44
44
  } : {});
45
- interface AbstractQuery<TSchema extends AnySchema, TUOWConfig = void> {
45
+ interface SimpleQueryInterface<TSchema extends AnySchema, TUOWConfig = void> {
46
46
  /**
47
47
  * Find multiple records using a builder pattern
48
48
  */
@@ -96,5 +96,5 @@ interface AbstractQuery<TSchema extends AnySchema, TUOWConfig = void> {
96
96
  createUnitOfWork: (name?: string, config?: TUOWConfig) => TypedUnitOfWork<TSchema, [], unknown>;
97
97
  }
98
98
  //#endregion
99
- export { AbstractQuery, AnySelectClause, ExtractJoinOut, ExtractSelect, FindFirstOptions, FindManyOptions, JoinBuilder, OrderBy, RawColumnValues, SelectClause, SelectResult, TableToColumnValues, TableToInsertValues, TableToUpdateValues };
100
- //# sourceMappingURL=query.d.ts.map
99
+ export { AnySelectClause, ExtractJoinOut, ExtractSelect, FindFirstOptions, FindManyOptions, JoinBuilder, OrderBy, RawColumnValues, SelectClause, SelectResult, SimpleQueryInterface, TableToColumnValues, TableToInsertValues, TableToUpdateValues };
100
+ //# sourceMappingURL=simple-query-interface.d.ts.map