@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
@@ -1,17 +1,13 @@
1
- import { drizzle } from "drizzle-orm/libsql";
2
- import { createClient } from "@libsql/client";
1
+ import SQLite from "better-sqlite3";
2
+ import { SqliteDialect } from "kysely";
3
3
  import { DrizzleAdapter } from "./drizzle-adapter";
4
- import { beforeAll, describe, expect, expectTypeOf, it } from "vitest";
4
+ import { beforeAll, describe, expect, expectTypeOf, it, assert } from "vitest";
5
5
  import { column, idColumn, referenceColumn, schema, type FragnoId } from "../../schema/create";
6
- import type { DBType } from "./shared";
7
- import { createRequire } from "node:module";
8
- import { writeAndLoadSchema } from "./test-utils";
9
6
  import { Cursor } from "../../query/cursor";
10
-
11
- // Import drizzle-kit for migrations
12
- const require = createRequire(import.meta.url);
13
- const { generateSQLiteDrizzleJson, generateSQLiteMigration } =
14
- require("drizzle-kit/api") as typeof import("drizzle-kit/api");
7
+ import { executeUnitOfWork } from "../../query/unit-of-work/execute-unit-of-work";
8
+ import { ExponentialBackoffRetryPolicy } from "../../query/unit-of-work/retry-policy";
9
+ import { BetterSQLite3DriverConfig } from "../generic-sql/driver-config";
10
+ import { internalSchema } from "../../fragments/internal-fragment";
15
11
 
16
12
  describe("DrizzleAdapter SQLite", () => {
17
13
  const testSchema = schema((s) => {
@@ -96,56 +92,38 @@ describe("DrizzleAdapter SQLite", () => {
96
92
  });
97
93
 
98
94
  let adapter: DrizzleAdapter;
99
- let db: DBType;
100
- // let sqliteDb: Database.Database;
95
+ let sqliteDatabase: InstanceType<typeof SQLite>;
101
96
 
102
97
  beforeAll(async () => {
103
- // Write schema to file and dynamically import it
104
- const { schemaModule, cleanup } = await writeAndLoadSchema(
105
- "drizzle-adapter-sqlite",
106
- testSchema,
107
- "sqlite",
108
- "namespace",
109
- );
98
+ sqliteDatabase = new SQLite(":memory:");
110
99
 
111
- // Write second schema to file and dynamically import it
112
- const { schemaModule: schemaModule2, cleanup: cleanup2 } = await writeAndLoadSchema(
113
- "drizzle-adapter-sqlite-schema2",
114
- schema2,
115
- "sqlite",
116
- "namespace2",
117
- );
118
-
119
- const client = createClient({
120
- url: "file::memory:?cache=shared",
100
+ const dialect = new SqliteDialect({
101
+ database: sqliteDatabase,
121
102
  });
122
103
 
123
- // Merge both schema modules for the db
124
- const mergedSchema = { ...schemaModule, ...schemaModule2 };
125
-
126
- db = drizzle(client, {
127
- schema: mergedSchema,
128
- }) as unknown as DBType;
129
-
130
- // Generate and run migrations for both schemas
131
- const emptyJson = await generateSQLiteDrizzleJson({});
132
- const targetJson = await generateSQLiteDrizzleJson(mergedSchema);
104
+ adapter = new DrizzleAdapter({
105
+ dialect,
106
+ driverConfig: new BetterSQLite3DriverConfig(),
107
+ });
133
108
 
134
- const migrationStatements = await generateSQLiteMigration(emptyJson, targetJson);
109
+ // Create settings table first (needed for version tracking)
110
+ {
111
+ const migrations = adapter.prepareMigrations(internalSchema, "");
112
+ await migrations.executeWithDriver(adapter.driver, 0);
113
+ }
135
114
 
136
- for (const statement of migrationStatements) {
137
- await client.execute(statement);
115
+ {
116
+ const migrations = adapter.prepareMigrations(testSchema, "namespace");
117
+ await migrations.executeWithDriver(adapter.driver, 0);
138
118
  }
139
119
 
140
- adapter = new DrizzleAdapter({
141
- db,
142
- provider: "sqlite",
143
- });
120
+ {
121
+ const migrations = adapter.prepareMigrations(schema2, "namespace2");
122
+ await migrations.executeWithDriver(adapter.driver, 0);
123
+ }
144
124
 
145
125
  return async () => {
146
- client.close();
147
- await cleanup();
148
- await cleanup2();
126
+ await adapter.close();
149
127
  };
150
128
  }, 12000);
151
129
 
@@ -271,7 +249,6 @@ describe("DrizzleAdapter SQLite", () => {
271
249
  it("should support count operations", async () => {
272
250
  const queryEngine = adapter.createQueryEngine(testSchema, "namespace");
273
251
 
274
- // Create some users
275
252
  const createUow = queryEngine.createUnitOfWork("create-users");
276
253
  createUow.create("users", { name: "User1", age: 20 });
277
254
  createUow.create("users", { name: "User2", age: 30 });
@@ -382,17 +359,17 @@ describe("DrizzleAdapter SQLite", () => {
382
359
  expect(email).toMatchObject({
383
360
  id: expect.objectContaining({
384
361
  externalId: expect.stringMatching(/^[a-z0-9]{20,}$/),
385
- internalId: expect.any(Number),
362
+ internalId: expect.any(BigInt),
386
363
  }),
387
364
  user_id: expect.objectContaining({
388
- internalId: expect.any(Number),
365
+ internalId: expect.any(BigInt),
389
366
  }),
390
367
  email: "test@example.com",
391
368
  is_primary: true,
392
369
  user: {
393
370
  id: expect.objectContaining({
394
371
  externalId: expect.stringMatching(/^[a-z0-9]{20,}$/),
395
- internalId: expect.any(Number),
372
+ internalId: expect.any(BigInt),
396
373
  }),
397
374
  name: "Email User",
398
375
  age: 20,
@@ -475,7 +452,7 @@ describe("DrizzleAdapter SQLite", () => {
475
452
  expect(comment).toMatchObject({
476
453
  id: expect.objectContaining({
477
454
  externalId: expect.stringMatching(/^[a-z0-9]{20,}$/),
478
- internalId: expect.any(Number),
455
+ internalId: expect.any(BigInt),
479
456
  }),
480
457
  text: "Great post!",
481
458
  // Post join (first level)
@@ -764,4 +741,159 @@ describe("DrizzleAdapter SQLite", () => {
764
741
  price: 200,
765
742
  });
766
743
  });
744
+
745
+ it("should verify hasNextPage in cursor pagination", async () => {
746
+ const queryEngine = adapter.createQueryEngine(testSchema, "namespace");
747
+
748
+ // Create exactly 15 users for precise pagination testing
749
+ const prefix = "HasNextPageTest";
750
+
751
+ for (let i = 1; i <= 15; i++) {
752
+ await queryEngine.create("users", {
753
+ name: `${prefix} ${i.toString().padStart(2, "0")}`,
754
+ age: 20 + i,
755
+ });
756
+ }
757
+
758
+ // Test 1: First page with more results available (pageSize=10, total=15)
759
+ const firstPage = await queryEngine.findWithCursor("users", (b) =>
760
+ b
761
+ .whereIndex("name_idx", (eb) => eb("name", "starts with", prefix))
762
+ .orderByIndex("name_idx", "asc")
763
+ .pageSize(10),
764
+ );
765
+
766
+ expect(firstPage.items).toHaveLength(10);
767
+ expect(firstPage.hasNextPage).toBe(true);
768
+ expect(firstPage.cursor).toBeInstanceOf(Cursor);
769
+
770
+ // Test 2: Second page (last page, partial results: 5 items remaining)
771
+ const secondPage = await queryEngine.findWithCursor("users", (b) =>
772
+ b
773
+ .whereIndex("name_idx", (eb) => eb("name", "starts with", prefix))
774
+ .after(firstPage.cursor!)
775
+ .orderByIndex("name_idx", "asc")
776
+ .pageSize(10),
777
+ );
778
+
779
+ expect(secondPage.items).toHaveLength(5);
780
+ expect(secondPage.hasNextPage).toBe(false);
781
+ expect(secondPage.cursor).toBeUndefined();
782
+
783
+ // Test 3: Empty results
784
+ const emptyPage = await queryEngine.findWithCursor("users", (b) =>
785
+ b
786
+ .whereIndex("name_idx", (eb) => eb("name", "starts with", "NonExistentPrefix"))
787
+ .orderByIndex("name_idx", "asc")
788
+ .pageSize(10),
789
+ );
790
+
791
+ expect(emptyPage.items).toHaveLength(0);
792
+ expect(emptyPage.hasNextPage).toBe(false);
793
+ expect(emptyPage.cursor).toBeUndefined();
794
+ });
795
+
796
+ it("should support executeUnitOfWork with retry logic", async () => {
797
+ const queryEngine = adapter.createQueryEngine(testSchema, "namespace");
798
+
799
+ // Create a test user
800
+ const createUow = queryEngine.createUnitOfWork("create-user-for-execute-uow");
801
+ createUow.create("users", { name: "Execute UOW User", age: 42 });
802
+ await createUow.executeMutations();
803
+
804
+ // Fetch the user to get their ID
805
+ const [[user]] = await queryEngine
806
+ .createUnitOfWork("get-user-for-execute-uow")
807
+ .find("users", (b) => b.whereIndex("name_idx", (eb) => eb("name", "=", "Execute UOW User")))
808
+ .executeRetrieve();
809
+
810
+ // Use executeUnitOfWork to increment age with optimistic locking
811
+ const result = await executeUnitOfWork(
812
+ {
813
+ retrieve: (uow) =>
814
+ uow.find("users", (b) => b.whereIndex("primary", (eb) => eb("id", "=", user.id))),
815
+ mutate: (uow, [users]) => {
816
+ const foundUser = users[0];
817
+ const newAge = foundUser.age! + 1;
818
+ uow.update("users", foundUser.id, (b) => b.set({ age: newAge }).check());
819
+ return { previousAge: foundUser.age, newAge };
820
+ },
821
+ onSuccess: ({ mutationResult }) => {
822
+ // Verify the age was incremented correctly
823
+ expect(mutationResult.newAge).toBe(mutationResult.previousAge! + 1);
824
+ },
825
+ },
826
+ {
827
+ createUnitOfWork: () => queryEngine.createUnitOfWork("execute-uow-update"),
828
+ retryPolicy: new ExponentialBackoffRetryPolicy({ maxRetries: 3, initialDelayMs: 1 }),
829
+ },
830
+ );
831
+
832
+ // Verify the operation succeeded
833
+ assert(result.success);
834
+ expect(result.mutationResult).toEqual({
835
+ previousAge: 42,
836
+ newAge: 43,
837
+ });
838
+
839
+ // Verify the user was actually updated in the database
840
+ const updatedUser = await queryEngine.findFirst("users", (b) =>
841
+ b.whereIndex("primary", (eb) => eb("id", "=", user.id)),
842
+ );
843
+
844
+ expect(updatedUser).toMatchObject({
845
+ id: expect.objectContaining({
846
+ externalId: user.id.externalId,
847
+ version: 1, // Version incremented due to check()
848
+ }),
849
+ name: "Execute UOW User",
850
+ age: 43,
851
+ });
852
+ });
853
+
854
+ it("should fail check() when version changes", async () => {
855
+ const queryEngine = adapter.createQueryEngine(testSchema, "namespace");
856
+
857
+ // Create a user
858
+ const createUserUow = queryEngine.createUnitOfWork("create-user-for-version-conflict");
859
+ createUserUow.create("users", {
860
+ name: "Version Conflict User SQLite",
861
+ age: 40,
862
+ });
863
+ await createUserUow.executeMutations();
864
+
865
+ // Get the user
866
+ const [[user]] = await queryEngine
867
+ .createUnitOfWork("get-user-for-version-conflict")
868
+ .find("users", (b) =>
869
+ b.whereIndex("name_idx", (eb) => eb("name", "=", "Version Conflict User SQLite")),
870
+ )
871
+ .executeRetrieve();
872
+
873
+ // Update the user to increment their version
874
+ const updateUow = queryEngine.createUnitOfWork("update-user-version");
875
+ updateUow.update("users", user.id, (b) => b.set({ age: 41 }));
876
+ await updateUow.executeMutations();
877
+
878
+ // Try to check with the old version (should fail)
879
+ const uow = queryEngine.createUnitOfWork("check-stale-version");
880
+ uow.check("users", user.id); // This has version 0, but the user now has version 1
881
+ uow.create("posts", {
882
+ user_id: user.id,
883
+ title: "Should Not Be Created SQLite",
884
+ content: "Content",
885
+ });
886
+
887
+ const { success } = await uow.executeMutations();
888
+ expect(success).toBe(false);
889
+
890
+ // Verify the post was NOT created
891
+ const [posts] = await queryEngine
892
+ .createUnitOfWork("get-posts-for-version-conflict")
893
+ .find("posts", (b) => b.whereIndex("posts_user_idx", (eb) => eb("user_id", "=", user.id)))
894
+ .executeRetrieve();
895
+
896
+ const conflictPosts = posts.filter((p) => p.title === "Should Not Be Created SQLite");
897
+ expect(conflictPosts).toHaveLength(0);
898
+ });
767
899
  });
@@ -1,103 +1,22 @@
1
1
  import type { DatabaseAdapter } from "../adapters";
2
2
  import { type AnySchema } from "../../schema/create";
3
- import type { AbstractQuery } from "../../query/query";
4
3
  import type { SchemaGenerator } from "../../schema-generator/schema-generator";
5
4
  import { generateSchema } from "./generate";
6
- import { fromDrizzle, type DrizzleUOWConfig } from "./drizzle-query";
7
- import { createTableNameMapper, type DBType, type DrizzleResult } from "./shared";
8
- import { createSettingsManager, settingsSchema } from "../../shared/settings-schema";
9
- import { sql } from "drizzle-orm";
10
- import {
11
- fragnoDatabaseAdapterNameFakeSymbol,
12
- fragnoDatabaseAdapterVersionFakeSymbol,
13
- } from "../adapters";
14
- import type { ConnectionPool } from "../../shared/connection-pool";
15
- import { createDrizzleConnectionPool } from "./drizzle-connection-pool";
16
-
17
- export interface DrizzleConfig {
18
- db: unknown | (() => unknown | Promise<unknown>);
19
- provider: "sqlite" | "mysql" | "postgresql";
20
- }
21
-
22
- export class DrizzleAdapter implements DatabaseAdapter<DrizzleUOWConfig> {
23
- #connectionPool: ConnectionPool<DBType>;
24
- #provider: "sqlite" | "mysql" | "postgresql";
25
- #schemaNamespaceMap = new WeakMap<AnySchema, string>();
26
-
27
- constructor(config: DrizzleConfig) {
28
- this.#connectionPool = createDrizzleConnectionPool(
29
- config.db as DBType | (() => DBType | Promise<DBType>),
30
- );
31
- this.#provider = config.provider;
32
- }
5
+ import { createTableNameMapper } from "../shared/table-name-mapper";
33
6
 
34
- get [fragnoDatabaseAdapterNameFakeSymbol](): string {
35
- return "drizzle";
36
- }
37
-
38
- get [fragnoDatabaseAdapterVersionFakeSymbol](): number {
39
- return 0;
40
- }
41
-
42
- async close(): Promise<void> {
43
- await this.#connectionPool.close();
44
- }
45
-
46
- createTableNameMapper(namespace: string) {
47
- return createTableNameMapper(namespace);
48
- }
49
-
50
- get provider(): "sqlite" | "mysql" | "postgresql" {
51
- return this.#provider;
52
- }
53
-
54
- async isConnectionHealthy(): Promise<boolean> {
55
- const conn = await this.#connectionPool.connect();
56
- try {
57
- const result = await conn.db.execute(sql`SELECT 1 as healthy`);
58
-
59
- // Handle different result formats across providers
60
- // PostgreSQL/MySQL: { rows: [...] }
61
- // SQLite: array directly or { rows: [...] }
62
- if (Array.isArray(result)) {
63
- return result.length > 0 && result[0]["healthy"] === 1;
64
- } else {
65
- const drizzleResult = result as DrizzleResult;
66
- return drizzleResult.rows[0]["healthy"] === 1;
67
- }
68
- } catch {
69
- return false;
70
- } finally {
71
- await conn.release();
72
- }
73
- }
74
-
75
- async getSchemaVersion(namespace: string): Promise<string | undefined> {
76
- const queryEngine = this.createQueryEngine(settingsSchema, namespace);
77
- const manager = createSettingsManager(queryEngine, namespace);
7
+ import {
8
+ GenericSQLAdapter,
9
+ type GenericSQLOptions,
10
+ type UnitOfWorkConfig,
11
+ } from "../generic-sql/generic-sql-adapter";
78
12
 
79
- // Try to read the version key directly
80
- const result = await manager.get("version");
81
- return result?.value;
13
+ export class DrizzleAdapter extends GenericSQLAdapter implements DatabaseAdapter<UnitOfWorkConfig> {
14
+ constructor(options: GenericSQLOptions) {
15
+ super(options);
82
16
  }
83
17
 
84
- createQueryEngine<TSchema extends AnySchema>(
85
- schema: TSchema,
86
- namespace: string,
87
- ): AbstractQuery<TSchema, DrizzleUOWConfig> {
88
- // Register schema-namespace mapping
89
- this.#schemaNamespaceMap.set(schema, namespace);
90
-
91
- // Only create mapper if namespace is non-empty
92
- const mapper = namespace ? createTableNameMapper(namespace) : undefined;
93
- return fromDrizzle(
94
- schema,
95
- this.#connectionPool,
96
- this.#provider,
97
- mapper,
98
- undefined,
99
- this.#schemaNamespaceMap,
100
- );
18
+ override createTableNameMapper(namespace: string) {
19
+ return createTableNameMapper(namespace, false);
101
20
  }
102
21
 
103
22
  createSchemaGenerator(
@@ -109,7 +28,9 @@ export class DrizzleAdapter implements DatabaseAdapter<DrizzleUOWConfig> {
109
28
  const path = genOptions?.path ?? options?.path ?? "fragno-schema.ts";
110
29
 
111
30
  return {
112
- schema: generateSchema(fragments, this.#provider),
31
+ schema: generateSchema(fragments, this.driverConfig.databaseType, {
32
+ mapperFactory: (ns) => (ns ? this.createTableNameMapper(ns) : undefined),
33
+ }),
113
34
  path,
114
35
  };
115
36
  },