@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,28 @@
1
+ import type { SupportedDatabase } from "../../adapters/generic-sql/driver-config";
2
+ import { PostgreSQLTypeMapper } from "./dialect/postgres";
3
+ import { MySQLTypeMapper } from "./dialect/mysql";
4
+ import { SQLiteTypeMapper } from "./dialect/sqlite";
5
+
6
+ /**
7
+ * Factory function to create a dialect-specific SQL type mapper.
8
+ *
9
+ * Based on the database type, returns the appropriate mapper implementation
10
+ * (PostgreSQL, MySQL, or SQLite).
11
+ *
12
+ * @param database - The database type (sqlite, postgresql, or mysql)
13
+ * @returns Dialect-specific SQLTypeMapper instance
14
+ */
15
+ export function createSQLTypeMapper(database: SupportedDatabase) {
16
+ switch (database) {
17
+ case "postgresql":
18
+ return new PostgreSQLTypeMapper(database);
19
+ case "mysql":
20
+ return new MySQLTypeMapper(database);
21
+ case "sqlite":
22
+ return new SQLiteTypeMapper(database);
23
+ default: {
24
+ const exhaustiveCheck: never = database;
25
+ throw new Error(`Unsupported database type: ${exhaustiveCheck}`);
26
+ }
27
+ }
28
+ }
@@ -0,0 +1,64 @@
1
+ import type { AnyColumn } from "../../create";
2
+ import { SQLTypeMapper, type MySQLDatabaseType } from "../type-mapping";
3
+
4
+ /**
5
+ * MySQL-specific type mapper.
6
+ *
7
+ * MySQL supports:
8
+ * - BIGINT for large integers (with AUTO_INCREMENT for internal IDs)
9
+ * - INTEGER for integers
10
+ * - BOOLEAN for booleans (alias for TINYINT(1))
11
+ * - JSON for JSON data (native support in MySQL 5.7+)
12
+ * - TEXT for strings
13
+ * - VARCHAR(n) for variable-length strings
14
+ * - LONGBLOB for binary data
15
+ * - DATETIME for timestamps without timezone
16
+ * - DATE for dates
17
+ * - DECIMAL for decimals
18
+ */
19
+ export class MySQLTypeMapper extends SQLTypeMapper<MySQLDatabaseType> {
20
+ protected getInternalIdType(): MySQLDatabaseType {
21
+ // MySQL uses bigint with AUTO_INCREMENT applied separately
22
+ return "bigint";
23
+ }
24
+
25
+ protected mapInteger(_column: AnyColumn | Pick<AnyColumn, "type">): MySQLDatabaseType {
26
+ return "integer";
27
+ }
28
+
29
+ protected mapBigint(_column: AnyColumn | Pick<AnyColumn, "type">): MySQLDatabaseType {
30
+ return "bigint";
31
+ }
32
+
33
+ protected mapString(): MySQLDatabaseType {
34
+ return "text";
35
+ }
36
+
37
+ protected mapVarchar(length: number): MySQLDatabaseType {
38
+ return `varchar(${length})`;
39
+ }
40
+
41
+ protected mapBinary(): MySQLDatabaseType {
42
+ return "longblob";
43
+ }
44
+
45
+ protected mapBool(): MySQLDatabaseType {
46
+ return "boolean";
47
+ }
48
+
49
+ protected mapDecimal(): MySQLDatabaseType {
50
+ return "decimal";
51
+ }
52
+
53
+ protected mapTimestamp(): MySQLDatabaseType {
54
+ return "datetime";
55
+ }
56
+
57
+ protected mapDate(): MySQLDatabaseType {
58
+ return "date";
59
+ }
60
+
61
+ protected mapJson(): MySQLDatabaseType {
62
+ return "json";
63
+ }
64
+ }
@@ -0,0 +1,62 @@
1
+ import type { AnyColumn } from "../../create";
2
+ import { SQLTypeMapper, type PostgreSQLDatabaseType } from "../type-mapping";
3
+
4
+ /**
5
+ * PostgreSQL-specific type mapper.
6
+ *
7
+ * PostgreSQL supports:
8
+ * - BIGSERIAL for auto-increment
9
+ * - BOOLEAN for booleans
10
+ * - JSON for JSON data
11
+ * - TEXT for strings
12
+ * - VARCHAR(n) for variable-length strings
13
+ * - BYTEA for binary data
14
+ * - Full timestamp and date support
15
+ * - BIGINT and INTEGER for integers
16
+ * - DECIMAL for decimals
17
+ */
18
+ export class PostgreSQLTypeMapper extends SQLTypeMapper<PostgreSQLDatabaseType> {
19
+ protected getInternalIdType(): PostgreSQLDatabaseType {
20
+ return "bigserial";
21
+ }
22
+
23
+ protected mapInteger(_column: AnyColumn | Pick<AnyColumn, "type">): PostgreSQLDatabaseType {
24
+ return "integer";
25
+ }
26
+
27
+ protected mapBigint(_column: AnyColumn | Pick<AnyColumn, "type">): PostgreSQLDatabaseType {
28
+ return "bigint";
29
+ }
30
+
31
+ protected mapString(): PostgreSQLDatabaseType {
32
+ return "text";
33
+ }
34
+
35
+ protected mapVarchar(length: number): PostgreSQLDatabaseType {
36
+ return `varchar(${length})`;
37
+ }
38
+
39
+ protected mapBinary(): PostgreSQLDatabaseType {
40
+ return "bytea";
41
+ }
42
+
43
+ protected mapBool(): PostgreSQLDatabaseType {
44
+ return "boolean";
45
+ }
46
+
47
+ protected mapDecimal(): PostgreSQLDatabaseType {
48
+ return "decimal";
49
+ }
50
+
51
+ protected mapTimestamp(): PostgreSQLDatabaseType {
52
+ return "timestamp";
53
+ }
54
+
55
+ protected mapDate(): PostgreSQLDatabaseType {
56
+ return "date";
57
+ }
58
+
59
+ protected mapJson(): PostgreSQLDatabaseType {
60
+ return "json";
61
+ }
62
+ }
@@ -0,0 +1,63 @@
1
+ import type { AnyColumn } from "../../create";
2
+ import { SQLTypeMapper, type SQLiteDatabaseType } from "../type-mapping";
3
+
4
+ /**
5
+ * SQLite-specific type mapper.
6
+ *
7
+ * SQLite has a limited type system with only 4 storage classes:
8
+ * - INTEGER for integers, booleans, timestamps, dates (and reference columns)
9
+ * - BLOB for binary data and bigints (except for reference columns)
10
+ * - TEXT for strings, JSON, and varchar
11
+ * - REAL for decimals
12
+ */
13
+ export class SQLiteTypeMapper extends SQLTypeMapper<SQLiteDatabaseType> {
14
+ protected getInternalIdType(): SQLiteDatabaseType {
15
+ // SQLite uses INTEGER for auto-increment (INTEGER PRIMARY KEY)
16
+ return "integer";
17
+ }
18
+
19
+ protected mapInteger(_column: AnyColumn | Pick<AnyColumn, "type">): SQLiteDatabaseType {
20
+ return "integer";
21
+ }
22
+
23
+ protected mapBigint(column: AnyColumn | Pick<AnyColumn, "type">): SQLiteDatabaseType {
24
+ // SQLite special case: reference columns should use integer even if type is bigint
25
+ if ("role" in column && column.role === "reference") {
26
+ return "integer";
27
+ }
28
+ return "blob";
29
+ }
30
+
31
+ protected mapString(): SQLiteDatabaseType {
32
+ return "text";
33
+ }
34
+
35
+ protected mapVarchar(_length: number): SQLiteDatabaseType {
36
+ // SQLite doesn't support varchar - convert to text
37
+ return "text";
38
+ }
39
+
40
+ protected mapBinary(): SQLiteDatabaseType {
41
+ return "blob";
42
+ }
43
+
44
+ protected mapBool(): SQLiteDatabaseType {
45
+ return "integer";
46
+ }
47
+
48
+ protected mapDecimal(): SQLiteDatabaseType {
49
+ return "real";
50
+ }
51
+
52
+ protected mapTimestamp(): SQLiteDatabaseType {
53
+ return "integer";
54
+ }
55
+
56
+ protected mapDate(): SQLiteDatabaseType {
57
+ return "integer";
58
+ }
59
+
60
+ protected mapJson(): SQLiteDatabaseType {
61
+ return "text";
62
+ }
63
+ }
@@ -0,0 +1,137 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { column } from "../create";
3
+ import { createSQLTypeMapper } from "./create-sql-type-mapper";
4
+
5
+ describe("SQLTypeMapper", () => {
6
+ describe("error handling", () => {
7
+ it("should throw error for varchar without length", () => {
8
+ const mapper = createSQLTypeMapper("postgresql");
9
+ // @ts-expect-error - Testing runtime error handling for invalid type
10
+ expect(() => mapper.getDatabaseType({ type: "varchar" })).toThrow(
11
+ 'Invalid varchar format: "varchar". Expected format: varchar(number), e.g., varchar(255)',
12
+ );
13
+ });
14
+
15
+ it("should throw error for varchar with non-numeric length", () => {
16
+ const mapper = createSQLTypeMapper("mysql");
17
+ // @ts-expect-error - Testing runtime error handling for invalid type
18
+ expect(() => mapper.getDatabaseType({ type: "varchar(abc)" })).toThrow(
19
+ 'Invalid varchar format: "varchar(abc)". Expected format: varchar(number), e.g., varchar(255)',
20
+ );
21
+ });
22
+
23
+ it("should throw error for malformed varchar", () => {
24
+ const mapper = createSQLTypeMapper("sqlite");
25
+ // @ts-expect-error - Testing runtime error handling for invalid type
26
+ expect(() => mapper.getDatabaseType({ type: "varchar(100" })).toThrow(
27
+ 'Invalid varchar format: "varchar(100". Expected format: varchar(number), e.g., varchar(255)',
28
+ );
29
+ });
30
+
31
+ it("should throw error for completely unsupported type", () => {
32
+ const mapper = createSQLTypeMapper("postgresql");
33
+ // @ts-expect-error - Testing runtime error handling for invalid type
34
+ expect(() => mapper.getDatabaseType({ type: "unsupported" })).toThrow(
35
+ "Unsupported column type: unsupported",
36
+ );
37
+ });
38
+ });
39
+
40
+ describe("sqlite", () => {
41
+ const mapper = createSQLTypeMapper("sqlite");
42
+
43
+ it("should convert integer types to integer", () => {
44
+ expect(mapper.getDatabaseType(column("integer"))).toBe("integer");
45
+ });
46
+
47
+ it("should convert timestamp to integer", () => {
48
+ expect(mapper.getDatabaseType(column("timestamp"))).toBe("integer");
49
+ });
50
+
51
+ it("should convert date to integer", () => {
52
+ expect(mapper.getDatabaseType(column("date"))).toBe("integer");
53
+ });
54
+
55
+ it("should convert bool to integer", () => {
56
+ expect(mapper.getDatabaseType(column("bool"))).toBe("integer");
57
+ });
58
+
59
+ it("should convert binary to blob", () => {
60
+ expect(mapper.getDatabaseType(column("binary"))).toBe("blob");
61
+ });
62
+
63
+ it("should convert bigint to blob", () => {
64
+ expect(mapper.getDatabaseType(column("bigint"))).toBe("blob");
65
+ });
66
+
67
+ it("should convert json to text", () => {
68
+ expect(mapper.getDatabaseType(column("json"))).toBe("text");
69
+ });
70
+
71
+ it("should convert string to text", () => {
72
+ expect(mapper.getDatabaseType(column("string"))).toBe("text");
73
+ });
74
+
75
+ it("should convert varchar to text", () => {
76
+ expect(mapper.getDatabaseType({ type: "varchar(255)" })).toBe("text");
77
+ });
78
+
79
+ it("should convert decimal to real", () => {
80
+ expect(mapper.getDatabaseType(column("decimal"))).toBe("real");
81
+ });
82
+ });
83
+
84
+ describe("postgresql", () => {
85
+ const mapper = createSQLTypeMapper("postgresql");
86
+
87
+ it("should convert bool to boolean", () => {
88
+ expect(mapper.getDatabaseType(column("bool"))).toBe("boolean");
89
+ });
90
+
91
+ it("should convert json to json", () => {
92
+ expect(mapper.getDatabaseType(column("json"))).toBe("json");
93
+ });
94
+
95
+ it("should convert string to text", () => {
96
+ expect(mapper.getDatabaseType(column("string"))).toBe("text");
97
+ });
98
+
99
+ it("should convert binary to bytea", () => {
100
+ expect(mapper.getDatabaseType(column("binary"))).toBe("bytea");
101
+ });
102
+
103
+ it("should preserve varchar with length", () => {
104
+ expect(mapper.getDatabaseType({ type: "varchar(200)" })).toBe("varchar(200)");
105
+ });
106
+
107
+ it("should preserve other types", () => {
108
+ expect(mapper.getDatabaseType(column("timestamp"))).toBe("timestamp");
109
+ expect(mapper.getDatabaseType(column("integer"))).toBe("integer");
110
+ });
111
+ });
112
+
113
+ describe("mysql", () => {
114
+ const mapper = createSQLTypeMapper("mysql");
115
+
116
+ it("should convert bool to boolean", () => {
117
+ expect(mapper.getDatabaseType(column("bool"))).toBe("boolean");
118
+ });
119
+
120
+ it("should convert string to text", () => {
121
+ expect(mapper.getDatabaseType(column("string"))).toBe("text");
122
+ });
123
+
124
+ it("should convert binary to longblob", () => {
125
+ expect(mapper.getDatabaseType(column("binary"))).toBe("longblob");
126
+ });
127
+
128
+ it("should preserve varchar with length", () => {
129
+ expect(mapper.getDatabaseType({ type: "varchar(150)" })).toBe("varchar(150)");
130
+ });
131
+
132
+ it("should preserve other types", () => {
133
+ expect(mapper.getDatabaseType(column("integer"))).toBe("integer");
134
+ expect(mapper.getDatabaseType(column("json"))).toBe("json");
135
+ });
136
+ });
137
+ });
@@ -0,0 +1,153 @@
1
+ import type { SupportedDatabase } from "../../adapters/generic-sql/driver-config";
2
+ import type { AnyColumn } from "../create";
3
+
4
+ export interface AdditionalColumnMetadata {
5
+ length?: number;
6
+ precision?: number;
7
+ scale?: number;
8
+ }
9
+
10
+ /**
11
+ * PostgreSQL-specific database types
12
+ */
13
+ export type PostgreSQLDatabaseType =
14
+ | "bigserial"
15
+ | "serial"
16
+ | "boolean"
17
+ | "json"
18
+ | "text"
19
+ | "bytea"
20
+ | "timestamp"
21
+ | "timestamptz"
22
+ | "bigint"
23
+ | "integer"
24
+ | "decimal"
25
+ | "date"
26
+ | `varchar(${number})`;
27
+
28
+ /**
29
+ * MySQL-specific database types
30
+ */
31
+ export type MySQLDatabaseType =
32
+ | "bigint"
33
+ | "boolean"
34
+ | "text"
35
+ | "longblob"
36
+ | "integer"
37
+ | "decimal"
38
+ | "date"
39
+ | "datetime"
40
+ | "json"
41
+ | "timestamp"
42
+ | `varchar(${number})`;
43
+
44
+ /**
45
+ * SQLite-specific database types
46
+ */
47
+ export type SQLiteDatabaseType = "integer" | "blob" | "text" | "real";
48
+
49
+ /**
50
+ * Union of all database-specific types
51
+ */
52
+ export type DatabaseTypeLiteral = PostgreSQLDatabaseType | MySQLDatabaseType | SQLiteDatabaseType;
53
+
54
+ /**
55
+ * Abstract base class for SQL type mapping.
56
+ *
57
+ * Similar to SQLQueryCompiler and SQLGenerator, this class provides a framework
58
+ * for mapping schema column types to database-specific column types.
59
+ *
60
+ * Each database dialect extends this class and implements abstract methods
61
+ * for each column type. The base class handles the switch statement logic.
62
+ *
63
+ * @template TDatabaseType - The specific database type union for this dialect
64
+ */
65
+ export abstract class SQLTypeMapper<TDatabaseType extends DatabaseTypeLiteral> {
66
+ protected readonly database: SupportedDatabase;
67
+
68
+ constructor(database: SupportedDatabase) {
69
+ this.database = database;
70
+ }
71
+
72
+ /**
73
+ * Get the database type for internal ID columns.
74
+ */
75
+ protected abstract getInternalIdType(): TDatabaseType;
76
+
77
+ // Abstract methods for each column type that dialects must implement
78
+ protected abstract mapInteger(column: AnyColumn | Pick<AnyColumn, "type">): TDatabaseType;
79
+ protected abstract mapBigint(column: AnyColumn | Pick<AnyColumn, "type">): TDatabaseType;
80
+ protected abstract mapString(): TDatabaseType;
81
+ protected abstract mapVarchar(length: number): TDatabaseType;
82
+ protected abstract mapBinary(): TDatabaseType;
83
+ protected abstract mapBool(): TDatabaseType;
84
+ protected abstract mapDecimal(): TDatabaseType;
85
+ protected abstract mapTimestamp(): TDatabaseType;
86
+ protected abstract mapDate(): TDatabaseType;
87
+ protected abstract mapJson(): TDatabaseType;
88
+
89
+ /**
90
+ * Map a column type to a database-specific type.
91
+ * Contains the central switch statement that delegates to abstract methods.
92
+ */
93
+ protected mapColumnType(column: AnyColumn | Pick<AnyColumn, "type">): TDatabaseType {
94
+ const { type } = column;
95
+
96
+ // Handle varchar with length parameter
97
+ if (typeof type === "string" && type.startsWith("varchar")) {
98
+ const match = type.match(/^varchar\((\d+)\)$/);
99
+ if (match) {
100
+ const length = parseInt(match[1], 10);
101
+ return this.mapVarchar(length);
102
+ }
103
+ throw new Error(
104
+ `Invalid varchar format: "${type}". Expected format: varchar(number), e.g., varchar(255)`,
105
+ );
106
+ }
107
+
108
+ switch (type) {
109
+ case "integer":
110
+ return this.mapInteger(column);
111
+ case "bigint":
112
+ return this.mapBigint(column);
113
+ case "string":
114
+ return this.mapString();
115
+ case "binary":
116
+ return this.mapBinary();
117
+ case "bool":
118
+ return this.mapBool();
119
+ case "decimal":
120
+ return this.mapDecimal();
121
+ case "timestamp":
122
+ return this.mapTimestamp();
123
+ case "date":
124
+ return this.mapDate();
125
+ case "json":
126
+ return this.mapJson();
127
+ default:
128
+ // TypeScript should ensure we never reach here
129
+ throw new Error(`Unsupported column type: ${type}`);
130
+ }
131
+ }
132
+
133
+ /**
134
+ * Map a schema column type to the appropriate database column type.
135
+ * Used for generating CREATE TABLE statements and migrations.
136
+ *
137
+ * Handles common cases like internal-id columns,
138
+ * then delegates to mapColumnType for other types.
139
+ *
140
+ * @param column - The column schema definition
141
+ * @returns The database-specific column type
142
+ */
143
+ getDatabaseType(column: AnyColumn | Pick<AnyColumn, "type">): TDatabaseType {
144
+ // Handle internal ID columns with auto-increment
145
+ if ("role" in column && column.role === "internal-id") {
146
+ return this.getInternalIdType();
147
+ }
148
+
149
+ // Delegate to type mapping logic
150
+ // This includes reference columns, which should use their specified type
151
+ return this.mapColumnType(column);
152
+ }
153
+ }
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * Represents an active database connection that can be released back to the pool.
3
3
  */
4
- export interface Connection<TDb> {
5
- db: TDb;
4
+ export interface Connection<TDatabase> {
5
+ db: TDatabase;
6
6
  release(): Promise<void>;
7
7
  }
8
8
 
@@ -10,15 +10,15 @@ export interface Connection<TDb> {
10
10
  * Connection pool interface for managing database connections.
11
11
  * Adapter-specific implementations should be used (e.g., createKyselyConnectionPool, createDrizzleConnectionPool).
12
12
  */
13
- export interface ConnectionPool<TDb> {
13
+ export interface ConnectionPool<TDatabase> {
14
14
  /** Acquire a connection from the pool */
15
- connect(): Promise<Connection<TDb>>;
15
+ connect(): Promise<Connection<TDatabase>>;
16
16
  /**
17
17
  * Get the database instance synchronously. Only works if the pool has already been initialized
18
18
  * via connect().
19
19
  * @throws an error if called before the pool is initialized.
20
20
  */
21
- getDatabaseSync(): TDb;
21
+ getDatabaseSync(): TDatabase;
22
22
  /** Close the pool and cleanup resources */
23
23
  close(): Promise<void>;
24
24
  }
@@ -0,0 +1,126 @@
1
+ import SQLite from "better-sqlite3";
2
+ import { describe, expect, it } from "vitest";
3
+ import { SqlDriverAdapter } from "./sql-driver-adapter";
4
+ import type { GenericSQLPlugin } from "./query-executor/plugin";
5
+ import { sql } from "./sql";
6
+ import { SqliteDialect } from "kysely";
7
+
8
+ describe("better-sqlite3", () => {
9
+ it("Should be able to execute queries using better-sqlite3", async () => {
10
+ const dialect = new SqliteDialect({
11
+ database: new SQLite(":memory:"),
12
+ });
13
+
14
+ const adapter = new SqlDriverAdapter(dialect);
15
+
16
+ const query = sql`SELECT 5`.compile(dialect);
17
+ const result = await adapter.executeQuery(query);
18
+ expect(result.rows).toEqual([{ 5: 5 }]);
19
+
20
+ await adapter.destroy();
21
+ });
22
+
23
+ it("should execute queries in a transaction and commit", async () => {
24
+ const dialect = new SqliteDialect({
25
+ database: new SQLite(":memory:"),
26
+ });
27
+ const adapter = new SqlDriverAdapter(dialect);
28
+
29
+ // Create table outside transaction
30
+ await adapter.executeQuery(sql`CREATE TABLE test (id INTEGER, name TEXT)`.compile(dialect));
31
+
32
+ // Execute queries in transaction
33
+ await adapter.transaction(async (trx) => {
34
+ await trx.executeQuery(sql`INSERT INTO test VALUES (1, 'Alice')`.compile(dialect));
35
+ await trx.executeQuery(sql`INSERT INTO test VALUES (2, 'Bob')`.compile(dialect));
36
+ });
37
+
38
+ // Verify data persists after transaction
39
+ const result = await adapter.executeQuery(sql`SELECT * FROM test ORDER BY id`.compile(dialect));
40
+ expect(result.rows).toEqual([
41
+ { id: 1, name: "Alice" },
42
+ { id: 2, name: "Bob" },
43
+ ]);
44
+
45
+ await adapter.destroy();
46
+ });
47
+
48
+ it("should rollback transaction on error", async () => {
49
+ const dialect = new SqliteDialect({
50
+ database: new SQLite(":memory:"),
51
+ });
52
+ const adapter = new SqlDriverAdapter(dialect);
53
+
54
+ // Create table outside transaction
55
+ await adapter.executeQuery(
56
+ sql`CREATE TABLE test (id INTEGER PRIMARY KEY, name TEXT)`.compile(dialect),
57
+ );
58
+ await adapter.executeQuery(sql`INSERT INTO test VALUES (1, 'Alice')`.compile(dialect));
59
+
60
+ // Try to execute queries in transaction with duplicate key error
61
+ await expect(
62
+ adapter.transaction(async (trx) => {
63
+ await trx.executeQuery(sql`INSERT INTO test VALUES (2, 'Bob')`.compile(dialect));
64
+ // This should cause a duplicate key error
65
+ await trx.executeQuery(sql`INSERT INTO test VALUES (1, 'Charlie')`.compile(dialect));
66
+ }),
67
+ ).rejects.toThrow();
68
+
69
+ // Verify Bob was not inserted (transaction rolled back)
70
+ const result = await adapter.executeQuery(sql`SELECT * FROM test ORDER BY id`.compile(dialect));
71
+ expect(result.rows).toEqual([{ id: 1, name: "Alice" }]);
72
+
73
+ await adapter.destroy();
74
+ });
75
+
76
+ it("should support plugins that transform results", async () => {
77
+ const dialect = new SqliteDialect({
78
+ database: new SQLite(":memory:"),
79
+ });
80
+ const adapter = new SqlDriverAdapter(dialect);
81
+
82
+ // Create a plugin that adds metadata to results
83
+ const metadataPlugin: GenericSQLPlugin = {
84
+ async transformResult({ result }) {
85
+ return {
86
+ ...result,
87
+ rows: result.rows.map((row) => ({
88
+ ...(row as object),
89
+ __metadata: { transformed: true },
90
+ })),
91
+ };
92
+ },
93
+ };
94
+
95
+ const adapterWithPlugin = adapter.withPlugin(metadataPlugin);
96
+
97
+ await adapterWithPlugin.executeQuery(
98
+ sql`CREATE TABLE test (id INTEGER, name TEXT)`.compile(dialect),
99
+ );
100
+ await adapterWithPlugin.executeQuery(
101
+ sql`INSERT INTO test VALUES (1, 'Alice')`.compile(dialect),
102
+ );
103
+
104
+ const result = await adapterWithPlugin.executeQuery(sql`SELECT * FROM test`.compile(dialect));
105
+
106
+ expect(result.rows).toEqual([{ id: 1, name: "Alice", __metadata: { transformed: true } }]);
107
+
108
+ await adapter.destroy();
109
+ });
110
+
111
+ it("should properly destroy and release resources", async () => {
112
+ const dialect = new SqliteDialect({
113
+ database: new SQLite(":memory:"),
114
+ });
115
+ const adapter = new SqlDriverAdapter(dialect);
116
+
117
+ // Execute some queries
118
+ await adapter.executeQuery(sql`SELECT 1`.compile(dialect));
119
+
120
+ // Destroy should complete without error
121
+ await expect(adapter.destroy()).resolves.toBeUndefined();
122
+
123
+ // Multiple destroy calls should be safe
124
+ await expect(adapter.destroy()).resolves.toBeUndefined();
125
+ });
126
+ });
@@ -0,0 +1,27 @@
1
+ import type { DatabaseConnection, Driver } from "../sql-driver";
2
+
3
+ export interface ConnectionProvider {
4
+ /**
5
+ * Provides a connection for the callback and takes care of disposing
6
+ * the connection after the callback has been run.
7
+ */
8
+ provideConnection<T>(consumer: (connection: DatabaseConnection) => Promise<T>): Promise<T>;
9
+ }
10
+
11
+ export class DefaultConnectionProvider implements ConnectionProvider {
12
+ readonly #driver: Driver;
13
+
14
+ constructor(driver: Driver) {
15
+ this.#driver = driver;
16
+ }
17
+
18
+ async provideConnection<T>(consumer: (connection: DatabaseConnection) => Promise<T>): Promise<T> {
19
+ const connection = await this.#driver.acquireConnection();
20
+
21
+ try {
22
+ return await consumer(connection);
23
+ } finally {
24
+ await this.#driver.releaseConnection(connection);
25
+ }
26
+ }
27
+ }