@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,215 @@
1
+ import { SQLocalKysely } from "sqlocal/kysely";
2
+ import { beforeAll, describe, expect, it } from "vitest";
3
+ import { KyselyAdapter } from "./kysely-adapter";
4
+ import { column, idColumn, referenceColumn, schema } from "../../schema/create";
5
+ import { SQLocalDriverConfig } from "../generic-sql/driver-config";
6
+
7
+ describe("KyselyAdapter SQLite", () => {
8
+ const testSchema = schema((s) => {
9
+ return s
10
+ .addTable("accounts", (t) => {
11
+ return t
12
+ .addColumn("id", idColumn())
13
+ .addColumn("userId", column("string"))
14
+ .addColumn("balance", column("integer"))
15
+ .createIndex("idx_user", ["userId"]);
16
+ })
17
+ .addTable("transactions", (t) => {
18
+ return t
19
+ .addColumn("id", idColumn())
20
+ .addColumn("fromAccountId", referenceColumn())
21
+ .addColumn("toAccountId", referenceColumn())
22
+ .addColumn("amount", column("integer"));
23
+ })
24
+ .addReference("fromAccount", {
25
+ type: "one",
26
+ from: { table: "transactions", column: "fromAccountId" },
27
+ to: { table: "accounts", column: "id" },
28
+ })
29
+ .addReference("toAccount", {
30
+ type: "one",
31
+ from: { table: "transactions", column: "toAccountId" },
32
+ to: { table: "accounts", column: "id" },
33
+ });
34
+ });
35
+
36
+ let adapter: KyselyAdapter;
37
+
38
+ beforeAll(async () => {
39
+ const { dialect } = new SQLocalKysely(":memory:");
40
+ adapter = new KyselyAdapter({
41
+ dialect,
42
+ driverConfig: new SQLocalDriverConfig(),
43
+ });
44
+
45
+ // Run migrations
46
+ const preparedMigrations = adapter.prepareMigrations(testSchema, "test");
47
+ await preparedMigrations.execute(0, testSchema.version, { updateVersionInMigration: false });
48
+ });
49
+
50
+ it("should perform a balance transfer between accounts", async () => {
51
+ const queryEngine = adapter.createQueryEngine(testSchema, "test");
52
+
53
+ // Create two accounts with initial balances
54
+ const account1Id = await queryEngine.create("accounts", {
55
+ userId: "user1",
56
+ balance: 1000,
57
+ });
58
+
59
+ const account2Id = await queryEngine.create("accounts", {
60
+ userId: "user2",
61
+ balance: 500,
62
+ });
63
+
64
+ // Verify initial balances
65
+ const initialAccount1 = await queryEngine.findFirst("accounts", (b) => {
66
+ return b.whereIndex("primary", (eb) => eb("id", "=", account1Id));
67
+ });
68
+
69
+ const initialAccount2 = await queryEngine.findFirst("accounts", (b) => {
70
+ return b.whereIndex("primary", (eb) => eb("id", "=", account2Id));
71
+ });
72
+
73
+ expect(initialAccount1?.balance).toBe(1000);
74
+ expect(initialAccount2?.balance).toBe(500);
75
+
76
+ // Perform a balance transfer using Unit of Work
77
+ const transferAmount = 300;
78
+
79
+ // Read current balances - chain the calls to properly set generics
80
+ const uow = queryEngine
81
+ .createUnitOfWork("balance-transfer")
82
+ .find("accounts", (b) => {
83
+ return b.whereIndex("primary", (eb) => eb("id", "=", account1Id));
84
+ })
85
+ .find("accounts", (b) => {
86
+ return b.whereIndex("primary", (eb) => eb("id", "=", account2Id));
87
+ });
88
+
89
+ // Execute retrieval phase
90
+ const [[fromAccount], [toAccount]] = await uow.executeRetrieve();
91
+
92
+ expect(fromAccount).toBeDefined();
93
+ expect(toAccount).toBeDefined();
94
+
95
+ // Mutation phase: update balances and record transaction
96
+ uow.update("accounts", account1Id, (b) => {
97
+ return b.set({ balance: fromAccount!.balance - transferAmount }).check();
98
+ });
99
+
100
+ uow.update("accounts", account2Id, (b) => {
101
+ return b.set({ balance: toAccount!.balance + transferAmount }).check();
102
+ });
103
+
104
+ uow.create("transactions", {
105
+ fromAccountId: account1Id,
106
+ toAccountId: account2Id,
107
+ amount: transferAmount,
108
+ });
109
+
110
+ // Execute mutations
111
+ const { success } = await uow.executeMutations();
112
+ expect(success).toBe(true);
113
+
114
+ // Verify final balances
115
+ const finalAccount1 = await queryEngine.findFirst("accounts", (b) => {
116
+ return b.whereIndex("primary", (eb) => eb("id", "=", account1Id));
117
+ });
118
+
119
+ const finalAccount2 = await queryEngine.findFirst("accounts", (b) => {
120
+ return b.whereIndex("primary", (eb) => eb("id", "=", account2Id));
121
+ });
122
+
123
+ expect(finalAccount1?.balance).toBe(700); // 1000 - 300
124
+ expect(finalAccount2?.balance).toBe(800); // 500 + 300
125
+
126
+ // Verify versions were incremented
127
+ expect(finalAccount1?.id.version).toBe(1);
128
+ expect(finalAccount2?.id.version).toBe(1);
129
+
130
+ // Verify transaction was recorded
131
+ const transaction = await queryEngine.findFirst("transactions", (b) => {
132
+ return b.whereIndex("primary");
133
+ });
134
+
135
+ expect(transaction).toMatchObject({
136
+ fromAccountId: expect.objectContaining({
137
+ internalId: account1Id.internalId,
138
+ }),
139
+ toAccountId: expect.objectContaining({
140
+ internalId: account2Id.internalId,
141
+ }),
142
+ amount: transferAmount,
143
+ });
144
+ });
145
+
146
+ it("should execute Unit of Work with version checking", async () => {
147
+ // Use the same namespace as the first test (migrations already ran)
148
+ const queryEngine = adapter.createQueryEngine(testSchema, "test");
149
+
150
+ // Create initial account
151
+ const initialAccountId = await queryEngine.create("accounts", {
152
+ userId: "user3",
153
+ balance: 1000,
154
+ });
155
+
156
+ expect(initialAccountId.version).toBe(0);
157
+
158
+ // Build a UOW to update the account with optimistic locking
159
+ const uow = queryEngine
160
+ .createUnitOfWork("update-account-balance")
161
+ // Retrieval phase: find the account
162
+ .find("accounts", (b) => b.whereIndex("primary", (eb) => eb("id", "=", initialAccountId)));
163
+
164
+ // Execute retrieval and transition to mutation phase
165
+ const [accounts] = await uow.executeRetrieve();
166
+
167
+ // Mutation phase: update with version check
168
+ uow.update("accounts", initialAccountId, (b) => b.set({ balance: 1500 }).check());
169
+
170
+ // Execute mutations
171
+ const { success } = await uow.executeMutations();
172
+
173
+ // Should succeed
174
+ expect(success).toBe(true);
175
+ expect(accounts).toHaveLength(1);
176
+
177
+ // Verify the account was updated
178
+ const updatedAccount = await queryEngine.findFirst("accounts", (b) =>
179
+ b.whereIndex("primary", (eb) => eb("id", "=", initialAccountId)),
180
+ );
181
+
182
+ expect(updatedAccount).toMatchObject({
183
+ id: expect.objectContaining({
184
+ externalId: initialAccountId.externalId,
185
+ version: 1, // Version incremented
186
+ }),
187
+ userId: "user3",
188
+ balance: 1500,
189
+ });
190
+
191
+ // Try to update again with stale version (simulating concurrent update - should fail)
192
+ const uow2 = queryEngine.createUnitOfWork("update-account-stale");
193
+
194
+ // Use the old version (0) which is now stale
195
+ uow2.update("accounts", initialAccountId, (b) => b.set({ balance: 2000 }).check());
196
+
197
+ const { success: success2 } = await uow2.executeMutations();
198
+
199
+ // Should fail due to version conflict
200
+ expect(success2).toBe(false);
201
+
202
+ // Verify the account was NOT updated
203
+ const [[unchangedAccount]] = await queryEngine
204
+ .createUnitOfWork("verify-unchanged")
205
+ .find("accounts", (b) => b.whereIndex("primary", (eb) => eb("id", "=", initialAccountId)))
206
+ .executeRetrieve();
207
+
208
+ expect(unchangedAccount).toMatchObject({
209
+ id: expect.objectContaining({
210
+ version: 1, // Still version 1
211
+ }),
212
+ balance: 1500, // Still 1500, not 2000
213
+ });
214
+ });
215
+ });
@@ -1,21 +1,12 @@
1
- import { sql, type Kysely } from "kysely";
1
+ import { type Kysely } from "kysely";
2
2
  import type { SQLProvider } from "../../shared/providers";
3
+ import { type DatabaseAdapter } from "../adapters";
4
+ import { createTableNameMapper } from "../shared/table-name-mapper";
3
5
  import {
4
- fragnoDatabaseAdapterNameFakeSymbol,
5
- fragnoDatabaseAdapterVersionFakeSymbol,
6
- type DatabaseAdapter,
7
- } from "../adapters";
8
- import { createMigrator, type Migrator } from "../../migration-engine/create";
9
- import type { AnySchema } from "../../schema/create";
10
- import type { CustomOperation, MigrationOperation } from "../../migration-engine/shared";
11
- import { execute, preprocessOperations } from "./migration/execute";
12
- import type { AbstractQuery } from "../../query/query";
13
- import { fromKysely, type KyselyUOWConfig } from "./kysely-query";
14
- import { createTableNameMapper } from "./kysely-shared";
15
- import { createHash } from "node:crypto";
16
- import { SETTINGS_TABLE_NAME } from "../../shared/settings-schema";
17
- import type { ConnectionPool } from "../../shared/connection-pool";
18
- import { createKyselyConnectionPool } from "./kysely-connection-pool";
6
+ GenericSQLAdapter,
7
+ type GenericSQLOptions,
8
+ type UnitOfWorkConfig,
9
+ } from "../generic-sql/generic-sql-adapter";
19
10
 
20
11
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
21
12
  type KyselyAny = Kysely<any>;
@@ -25,235 +16,12 @@ export interface KyselyConfig {
25
16
  provider: SQLProvider;
26
17
  }
27
18
 
28
- export class KyselyAdapter implements DatabaseAdapter<KyselyUOWConfig> {
29
- #connectionPool: ConnectionPool<KyselyAny>;
30
- #provider: SQLProvider;
31
- #schemaNamespaceMap = new WeakMap<AnySchema, string>();
32
-
33
- constructor(config: KyselyConfig) {
34
- this.#connectionPool = createKyselyConnectionPool(config.db);
35
- this.#provider = config.provider;
36
- }
37
-
38
- get [fragnoDatabaseAdapterNameFakeSymbol](): string {
39
- return "kysely";
40
- }
41
-
42
- get [fragnoDatabaseAdapterVersionFakeSymbol](): number {
43
- return 0;
44
- }
45
-
46
- async close(): Promise<void> {
47
- await this.#connectionPool.close();
19
+ export class KyselyAdapter extends GenericSQLAdapter implements DatabaseAdapter<UnitOfWorkConfig> {
20
+ constructor(options: GenericSQLOptions) {
21
+ super(options);
48
22
  }
49
23
 
50
24
  createTableNameMapper(namespace: string) {
51
25
  return createTableNameMapper(namespace);
52
26
  }
53
-
54
- createQueryEngine<T extends AnySchema>(
55
- schema: T,
56
- namespace: string,
57
- ): AbstractQuery<T, KyselyUOWConfig> {
58
- // Register schema-namespace mapping
59
- this.#schemaNamespaceMap.set(schema, namespace);
60
-
61
- // Only create mapper if namespace is non-empty
62
- const mapper = namespace ? createTableNameMapper(namespace) : undefined;
63
- return fromKysely(
64
- schema,
65
- this.#connectionPool,
66
- this.#provider,
67
- mapper,
68
- undefined,
69
- this.#schemaNamespaceMap,
70
- );
71
- }
72
-
73
- async isConnectionHealthy(): Promise<boolean> {
74
- const conn = await this.#connectionPool.connect();
75
- try {
76
- const result = await conn.db.executeQuery(sql`SELECT 1 as healthy`.compile(conn.db));
77
- return (result.rows[0] as Record<string, unknown>)["healthy"] === 1;
78
- } catch {
79
- return false;
80
- } finally {
81
- await conn.release();
82
- }
83
- }
84
-
85
- createMigrationEngine(schema: AnySchema, namespace: string): Migrator {
86
- const mapper = namespace ? createTableNameMapper(namespace) : undefined;
87
-
88
- const preprocessMigrationOperations = (operations: MigrationOperation[], db: KyselyAny) => {
89
- // Preprocess operations using the provided db instance
90
- const config: KyselyConfig = {
91
- db,
92
- provider: this.#provider,
93
- };
94
- let preprocessed = preprocessOperations(operations, config);
95
-
96
- if (this.#provider === "mysql") {
97
- preprocessed.unshift({ type: "custom", sql: "SET FOREIGN_KEY_CHECKS = 0" });
98
- preprocessed.push({ type: "custom", sql: "SET FOREIGN_KEY_CHECKS = 1" });
99
- }
100
-
101
- return preprocessed;
102
- };
103
-
104
- // Convert operations to executable nodes bound to specific db instance
105
- const toExecutableNodes = (operations: MigrationOperation[], db: KyselyAny) => {
106
- const onCustomNode = (node: CustomOperation, db: KyselyAny) => {
107
- const statement = sql.raw(node["sql"] as string);
108
-
109
- return {
110
- compile() {
111
- return statement.compile(db);
112
- },
113
- execute() {
114
- return statement.execute(db);
115
- },
116
- };
117
- };
118
-
119
- const config: KyselyConfig = { db, provider: this.#provider };
120
- return operations.flatMap((op) =>
121
- execute(op, config, (node) => onCustomNode(node, db), mapper),
122
- );
123
- };
124
-
125
- const migrator = createMigrator({
126
- schema,
127
- executor: async (operations) => {
128
- const conn = await this.#connectionPool.connect();
129
- try {
130
- // For SQLite, execute PRAGMA defer_foreign_keys BEFORE transaction
131
- if (this.#provider === "sqlite") {
132
- await sql.raw("PRAGMA defer_foreign_keys = ON").execute(conn.db);
133
- }
134
-
135
- await conn.db.transaction().execute(async (tx) => {
136
- // Use the transaction instance for both preprocessing and execution
137
- const preprocessed = preprocessMigrationOperations(operations, tx);
138
- const nodes = toExecutableNodes(preprocessed, tx);
139
- for (const node of nodes) {
140
- try {
141
- await node.execute();
142
- } catch (e) {
143
- console.error("failed at", node.compile(), e);
144
- throw e;
145
- }
146
- }
147
- });
148
- } finally {
149
- await conn.release();
150
- }
151
- },
152
- sql: {
153
- toSql: (operations) => {
154
- const parts: string[] = [];
155
-
156
- // Add SQLite PRAGMA at the beginning
157
- if (this.#provider === "sqlite") {
158
- parts.push("PRAGMA defer_foreign_keys = ON;");
159
- }
160
-
161
- // Use getDatabaseSync for SQL generation (doesn't execute, just builds SQL strings)
162
- const db = this.#connectionPool.getDatabaseSync();
163
- const preprocessed = preprocessMigrationOperations(operations, db);
164
- const nodes = toExecutableNodes(preprocessed, db);
165
- const compiled = nodes.map((node) => `${node.compile().sql};`);
166
-
167
- parts.push(...compiled);
168
-
169
- return parts.join("\n\n");
170
- },
171
- },
172
-
173
- settings: {
174
- getVersion: async () => {
175
- const conn = await this.#connectionPool.connect();
176
- try {
177
- const manager = createSettingsManager(conn.db, namespace);
178
- const v = await manager.get(`schema_version`);
179
- return v ? parseInt(v) : 0;
180
- } finally {
181
- await conn.release();
182
- }
183
- },
184
- updateSettingsInMigration: async (fromVersion, toVersion) => {
185
- const conn = await this.#connectionPool.connect();
186
- try {
187
- const manager = createSettingsManager(conn.db, namespace);
188
- return [
189
- {
190
- type: "custom",
191
- sql:
192
- fromVersion === 0
193
- ? manager.insert(`schema_version`, toVersion.toString())
194
- : manager.update(`schema_version`, toVersion.toString()),
195
- },
196
- ];
197
- } finally {
198
- await conn.release();
199
- }
200
- },
201
- },
202
- });
203
-
204
- return migrator;
205
- }
206
-
207
- async getSchemaVersion(namespace: string): Promise<string | undefined> {
208
- const conn = await this.#connectionPool.connect();
209
- try {
210
- const manager = createSettingsManager(conn.db, namespace);
211
- return await manager.get(`schema_version`);
212
- } finally {
213
- await conn.release();
214
- }
215
- }
216
- }
217
-
218
- function createSettingsManager(db: KyselyAny, namespace: string) {
219
- // Settings table is never namespaced, but keys include namespace prefix
220
- const tableName = SETTINGS_TABLE_NAME;
221
-
222
- return {
223
- async get(key: string): Promise<string | undefined> {
224
- try {
225
- const result = await db
226
- .selectFrom(tableName)
227
- .where("key", "=", sql.lit(`${namespace}.${key}`))
228
- .select(["value"])
229
- .executeTakeFirstOrThrow();
230
- return result.value as string;
231
- } catch {
232
- return;
233
- }
234
- },
235
-
236
- insert(key: string, value: string) {
237
- return db
238
- .insertInto(tableName)
239
- .values({
240
- id: sql.lit(
241
- createHash("md5").update(`${namespace}.${key}`).digest("base64url").replace(/=/g, ""),
242
- ),
243
- key: sql.lit(`${namespace}.${key}`),
244
- value: sql.lit(value),
245
- })
246
- .compile().sql;
247
- },
248
-
249
- update(key: string, value: string) {
250
- return db
251
- .updateTable(tableName)
252
- .set({
253
- value: sql.lit(value),
254
- })
255
- .where("key", "=", sql.lit(`${namespace}.${key}`))
256
- .compile().sql;
257
- },
258
- };
259
27
  }