@fragno-dev/db 0.1.14 → 0.2.0

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