@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,42 @@
1
+ /**
2
+ * Adapted from Kysely's SingleConnectionProvider
3
+ * Modified from: https://github.com/kysely-org/kysely
4
+ * License: MIT
5
+ * Copyright (c) 2022 Sami Koskimäki
6
+ */
7
+
8
+ import type { DatabaseConnection } from "../sql-driver";
9
+ import type { ConnectionProvider } from "./connection-provider";
10
+
11
+ const ignoreError = () => {};
12
+
13
+ export class SingleConnectionProvider implements ConnectionProvider {
14
+ readonly #connection: DatabaseConnection;
15
+ // oxlint-disable-next-line no-explicit-any
16
+ #runningPromise?: Promise<any>;
17
+
18
+ constructor(connection: DatabaseConnection) {
19
+ this.#connection = connection;
20
+ }
21
+
22
+ async provideConnection<T>(consumer: (connection: DatabaseConnection) => Promise<T>): Promise<T> {
23
+ while (this.#runningPromise) {
24
+ await this.#runningPromise.catch(ignoreError);
25
+ }
26
+
27
+ // `#runningPromise` must be set to undefined before it's
28
+ // resolved or rejected. Otherwise the while loop above
29
+ // will misbehave.
30
+ this.#runningPromise = this.#run(consumer).finally(() => {
31
+ this.#runningPromise = undefined;
32
+ });
33
+
34
+ return this.#runningPromise;
35
+ }
36
+
37
+ // Run the runner in an async function to make sure it doesn't
38
+ // throw synchronous errors.
39
+ async #run<T>(runner: (connection: DatabaseConnection) => Promise<T>): Promise<T> {
40
+ return await runner(this.#connection);
41
+ }
42
+ }
@@ -0,0 +1,9 @@
1
+ export interface DialectAdapter {
2
+ readonly supportsReturning: boolean;
3
+ }
4
+
5
+ export abstract class DialectAdapterBase implements DialectAdapter {
6
+ get supportsReturning(): boolean {
7
+ return false;
8
+ }
9
+ }
@@ -0,0 +1,7 @@
1
+ import { DialectAdapterBase } from "./dialect-adapter";
2
+
3
+ export class SqliteDialectAdapter extends DialectAdapterBase {
4
+ override get supportsReturning(): boolean {
5
+ return true;
6
+ }
7
+ }
@@ -0,0 +1 @@
1
+ export { SqliteDialect, PostgresDialect, MysqlDialect } from "kysely";
@@ -0,0 +1,260 @@
1
+ import {
2
+ CompiledQuery,
3
+ Kysely,
4
+ SqliteAdapter,
5
+ SqliteIntrospector,
6
+ SqliteQueryCompiler,
7
+ type DatabaseConnection,
8
+ type DatabaseIntrospector,
9
+ type Dialect,
10
+ type Driver,
11
+ type QueryCompiler,
12
+ type QueryResult,
13
+ } from "kysely";
14
+
15
+ interface DurableObjectId {
16
+ toString(): string;
17
+ equals(other: DurableObjectId): boolean;
18
+ readonly name?: string;
19
+ }
20
+
21
+ interface DurableObjectTransaction {
22
+ rollback(): void;
23
+ }
24
+
25
+ type SqlStorageValue = ArrayBuffer | string | number | null;
26
+
27
+ interface SqlStorage {
28
+ exec<T extends Record<string, SqlStorageValue>>(
29
+ query: string,
30
+ // oxlint-disable-next-line no-explicit-any
31
+ ...bindings: any[]
32
+ ): SqlStorageCursor<T>;
33
+ Cursor: typeof SqlStorageCursor;
34
+ Statement: typeof SqlStorageStatement;
35
+ }
36
+
37
+ declare abstract class SqlStorageStatement {}
38
+ declare abstract class SqlStorageCursor<T extends Record<string, SqlStorageValue>> {
39
+ next():
40
+ | {
41
+ done?: false;
42
+ value: T;
43
+ }
44
+ | {
45
+ done: true;
46
+ value?: never;
47
+ };
48
+ toArray(): T[];
49
+ one(): T;
50
+ raw<U extends SqlStorageValue[]>(): IterableIterator<U>;
51
+ columnNames: string[];
52
+ get rowsRead(): number;
53
+ get rowsWritten(): number;
54
+ [Symbol.iterator](): IterableIterator<T>;
55
+ }
56
+
57
+ interface DurableObjectStorage {
58
+ transaction<T>(closure: (txn: DurableObjectTransaction) => Promise<T>): Promise<T>;
59
+
60
+ readonly sql: SqlStorage;
61
+ }
62
+
63
+ interface DurableObjectState {
64
+ readonly id: DurableObjectId;
65
+ readonly storage: DurableObjectStorage;
66
+ }
67
+
68
+ /**
69
+ * Config for the Durable Objects dialect. Pass your Durable Object state to this object.
70
+ */
71
+ export interface DODialectConfig {
72
+ ctx: DurableObjectState;
73
+ }
74
+
75
+ /**
76
+ * DO dialect that adds support for [Cloudflare Durable Objects][0] in [Kysely][1].
77
+ * The constructor takes the Durable Object state context.
78
+ *
79
+ * ```typescript
80
+ * new DurableObjectDialect({
81
+ * ctx: this.ctx,
82
+ * })
83
+ * ```
84
+ *
85
+ * [0]: https://developers.cloudflare.com/durable-objects/
86
+ * [1]: https://github.com/koskimas/kysely
87
+ */
88
+ export class DurableObjectDialect implements Dialect {
89
+ #config: DODialectConfig;
90
+
91
+ constructor(config: DODialectConfig) {
92
+ this.#config = config;
93
+ }
94
+
95
+ createAdapter() {
96
+ return new SqliteAdapter();
97
+ }
98
+
99
+ createDriver(): Driver {
100
+ return new DurableObjectDriver(this.#config);
101
+ }
102
+
103
+ createQueryCompiler(): QueryCompiler {
104
+ return new SqliteQueryCompiler();
105
+ }
106
+
107
+ createIntrospector(db: Kysely<unknown>): DatabaseIntrospector {
108
+ return new SqliteIntrospector(db);
109
+ }
110
+ }
111
+
112
+ class DurableObjectDriver implements Driver {
113
+ #config: DODialectConfig;
114
+ #connection: DOConnection | null = null;
115
+
116
+ constructor(config: DODialectConfig) {
117
+ this.#config = config;
118
+ }
119
+
120
+ async init(): Promise<void> {}
121
+
122
+ async acquireConnection(): Promise<DatabaseConnection> {
123
+ // Ensure only one connection exists
124
+ if (!this.#connection) {
125
+ this.#connection = new DOConnection(this.#config);
126
+ }
127
+ return this.#connection;
128
+ }
129
+
130
+ async beginTransaction(conn: DOConnection): Promise<void> {
131
+ return await conn.beginTransaction();
132
+ }
133
+
134
+ async commitTransaction(conn: DOConnection): Promise<void> {
135
+ return await conn.commitTransaction();
136
+ }
137
+
138
+ async rollbackTransaction(conn: DOConnection): Promise<void> {
139
+ return await conn.rollbackTransaction();
140
+ }
141
+
142
+ async releaseConnection(_conn: DOConnection): Promise<void> {
143
+ this.#connection = null;
144
+ }
145
+
146
+ async destroy(): Promise<void> {
147
+ this.#connection = null;
148
+ }
149
+ }
150
+
151
+ class DOConnection implements DatabaseConnection {
152
+ #config: DODialectConfig;
153
+ #transactionPromise: Promise<void> | null = null;
154
+ #transactionControl: {
155
+ resolve: () => void;
156
+ reject: (error: Error) => void;
157
+ } | null = null;
158
+ #txn: DurableObjectTransaction | null = null;
159
+
160
+ constructor(config: DODialectConfig) {
161
+ this.#config = config;
162
+ }
163
+
164
+ async executeQuery<O>(compiledQuery: CompiledQuery): Promise<QueryResult<O>> {
165
+ const cursor = this.#config.ctx.storage.sql.exec(
166
+ compiledQuery.sql,
167
+ ...compiledQuery.parameters,
168
+ );
169
+
170
+ const rows = cursor.toArray() as O[];
171
+ const numAffectedRows = cursor.rowsWritten > 0 ? BigInt(cursor.rowsWritten) : undefined;
172
+
173
+ return {
174
+ insertId: undefined, // Durable Objects doesn't provide last_row_id like D1
175
+ rows: rows || [],
176
+ numAffectedRows,
177
+ };
178
+ }
179
+
180
+ async beginTransaction() {
181
+ if (this.#transactionPromise) {
182
+ throw new Error("Transaction already in progress");
183
+ }
184
+
185
+ // Use a promise to wait for the transaction closure to actually start
186
+ let transactionReady: (() => void) | null = null;
187
+ const readyPromise = new Promise<void>((resolve) => {
188
+ transactionReady = resolve;
189
+ });
190
+
191
+ // Start the transaction - all queries executed will be inside this closure
192
+ this.#transactionPromise = this.#config.ctx.storage
193
+ .transaction(async (txn) => {
194
+ this.#txn = txn;
195
+
196
+ // Wait for commit or rollback to be called
197
+ await new Promise<void>((resolve, reject) => {
198
+ this.#transactionControl = { resolve, reject };
199
+ // Signal that transaction is ready
200
+ if (transactionReady) {
201
+ transactionReady();
202
+ }
203
+ });
204
+ })
205
+ .catch((error) => {
206
+ // Don't clear state here - let commit/rollback handle it
207
+ throw error;
208
+ });
209
+
210
+ // Wait for the transaction closure to set up before returning
211
+ await readyPromise;
212
+ }
213
+
214
+ async commitTransaction() {
215
+ if (!this.#transactionPromise || !this.#transactionControl) {
216
+ throw new Error("No transaction to commit");
217
+ }
218
+
219
+ try {
220
+ // Signal commit and wait for transaction to complete
221
+ this.#transactionControl.resolve();
222
+ await this.#transactionPromise;
223
+ } finally {
224
+ this.#transactionPromise = null;
225
+ this.#transactionControl = null;
226
+ this.#txn = null;
227
+ }
228
+ }
229
+
230
+ async rollbackTransaction() {
231
+ if (!this.#transactionPromise || !this.#transactionControl) {
232
+ throw new Error("No transaction to rollback");
233
+ }
234
+
235
+ try {
236
+ // Signal rollback
237
+ if (this.#txn) {
238
+ this.#txn.rollback();
239
+ }
240
+ this.#transactionControl.reject(new Error("Transaction rolled back"));
241
+
242
+ // Wait for transaction to complete (will reject, but we catch it)
243
+ await this.#transactionPromise.catch(() => {
244
+ /* Expected to reject on rollback */
245
+ });
246
+ } finally {
247
+ this.#transactionPromise = null;
248
+ this.#transactionControl = null;
249
+ this.#txn = null;
250
+ }
251
+ }
252
+
253
+ // oxlint-disable-next-line require-yield
254
+ async *streamQuery<O>(
255
+ _compiledQuery: CompiledQuery,
256
+ _chunkSize: number,
257
+ ): AsyncIterableIterator<QueryResult<O>> {
258
+ throw new Error("DO Driver does not support streaming");
259
+ }
260
+ }
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Adapted from Kysely's RuntimeDriver
3
+ * Modified from: https://github.com/kysely-org/kysely
4
+ * License: MIT
5
+ * Copyright (c) 2022 Sami Koskimäki
6
+ */
7
+
8
+ import type { DatabaseConnection, Driver, TransactionSettings } from "../sql-driver";
9
+
10
+ /**
11
+ * A small wrapper around {@link Driver} that makes sure the driver is
12
+ * initialized before it is used, only initialized and destroyed
13
+ * once etc.
14
+ */
15
+ export class RuntimeDriver implements Driver {
16
+ readonly #driver: Driver;
17
+
18
+ #initPromise?: Promise<void>;
19
+ #initDone: boolean;
20
+ #destroyPromise?: Promise<void>;
21
+
22
+ constructor(driver: Driver) {
23
+ this.#initDone = false;
24
+ this.#driver = driver;
25
+ }
26
+
27
+ async init(): Promise<void> {
28
+ if (this.#destroyPromise) {
29
+ throw new Error("driver has already been destroyed");
30
+ }
31
+
32
+ if (!this.#initPromise) {
33
+ this.#initPromise = this.#driver
34
+ .init()
35
+ .then(() => {
36
+ this.#initDone = true;
37
+ })
38
+ .catch((err) => {
39
+ this.#initPromise = undefined;
40
+ return Promise.reject(err);
41
+ });
42
+ }
43
+
44
+ await this.#initPromise;
45
+ }
46
+
47
+ async acquireConnection(): Promise<DatabaseConnection> {
48
+ if (this.#destroyPromise) {
49
+ throw new Error("driver has already been destroyed");
50
+ }
51
+
52
+ if (!this.#initDone) {
53
+ await this.init();
54
+ }
55
+
56
+ return await this.#driver.acquireConnection();
57
+ }
58
+
59
+ async releaseConnection(connection: DatabaseConnection): Promise<void> {
60
+ await this.#driver.releaseConnection(connection);
61
+ }
62
+
63
+ beginTransaction(connection: DatabaseConnection, settings: TransactionSettings): Promise<void> {
64
+ return this.#driver.beginTransaction(connection, settings);
65
+ }
66
+
67
+ commitTransaction(connection: DatabaseConnection): Promise<void> {
68
+ return this.#driver.commitTransaction(connection);
69
+ }
70
+
71
+ rollbackTransaction(connection: DatabaseConnection): Promise<void> {
72
+ return this.#driver.rollbackTransaction(connection);
73
+ }
74
+
75
+ async destroy(): Promise<void> {
76
+ if (!this.#initPromise) {
77
+ return;
78
+ }
79
+
80
+ await this.#initPromise;
81
+
82
+ if (!this.#destroyPromise) {
83
+ this.#destroyPromise = this.#driver.destroy().catch((err) => {
84
+ this.#destroyPromise = undefined;
85
+ return Promise.reject(err);
86
+ });
87
+ }
88
+
89
+ await this.#destroyPromise;
90
+ }
91
+ }
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Adapted from Kysely's DefaultQueryExecutor
3
+ * Modified from: https://github.com/kysely-org/kysely
4
+ * License: MIT
5
+ * Copyright (c) 2022 Sami Koskimäki
6
+ *
7
+ * Simplified to remove query compilation.
8
+ */
9
+
10
+ import type { DatabaseConnection } from "../sql-driver";
11
+ import type { ConnectionProvider } from "../connection/connection-provider";
12
+ import type { GenericSQLPlugin } from "./plugin";
13
+ import { QueryExecutorBase } from "./query-executor-base";
14
+
15
+ export class DefaultQueryExecutor extends QueryExecutorBase {
16
+ readonly #connectionProvider: ConnectionProvider;
17
+
18
+ constructor(connectionProvider: ConnectionProvider, plugins: GenericSQLPlugin[] = []) {
19
+ super(plugins);
20
+ this.#connectionProvider = connectionProvider;
21
+ }
22
+
23
+ provideConnection<T>(consumer: (connection: DatabaseConnection) => Promise<T>): Promise<T> {
24
+ return this.#connectionProvider.provideConnection(consumer);
25
+ }
26
+
27
+ withConnectionProvider(connectionProvider: ConnectionProvider): DefaultQueryExecutor {
28
+ return new DefaultQueryExecutor(connectionProvider, [...this.plugins]);
29
+ }
30
+
31
+ withPlugin(plugin: GenericSQLPlugin): DefaultQueryExecutor {
32
+ return new DefaultQueryExecutor(this.#connectionProvider, [...this.plugins, plugin]);
33
+ }
34
+
35
+ withoutPlugins(): DefaultQueryExecutor {
36
+ return new DefaultQueryExecutor(this.#connectionProvider, []);
37
+ }
38
+ }
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Adapted from Kysely's KyselyPlugin
3
+ * Modified from: https://github.com/kysely-org/kysely
4
+ * License: MIT
5
+ * Copyright (c) 2022 Sami Koskimäki
6
+ *
7
+ * Simplified to only support transformResult.
8
+ */
9
+
10
+ import type { QueryResult } from "../sql-driver";
11
+
12
+ export interface GenericSQLPlugin {
13
+ /**
14
+ * This method is called for each query after it has been executed.
15
+ * You can modify the result and return the modified result.
16
+ */
17
+ transformResult(args: PluginTransformResultArgs): Promise<QueryResult<unknown>>;
18
+ }
19
+
20
+ export interface PluginTransformResultArgs {
21
+ readonly result: QueryResult<unknown>;
22
+ }
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Adapted from Kysely's QueryExecutorBase
3
+ * Modified from: https://github.com/kysely-org/kysely
4
+ * License: MIT
5
+ * Copyright (c) 2022 Sami Koskimäki
6
+ *
7
+ * Simplified to remove query compilation, streaming, and batching.
8
+ */
9
+
10
+ import type { DatabaseConnection, CompiledQuery, QueryResult } from "../sql-driver";
11
+ import type { ConnectionProvider } from "../connection/connection-provider";
12
+ import type { GenericSQLPlugin } from "./plugin";
13
+ import type { QueryExecutor } from "./query-executor";
14
+
15
+ const NO_PLUGINS: ReadonlyArray<GenericSQLPlugin> = Object.freeze([]);
16
+
17
+ export abstract class QueryExecutorBase implements QueryExecutor {
18
+ readonly #plugins: ReadonlyArray<GenericSQLPlugin>;
19
+
20
+ constructor(plugins: ReadonlyArray<GenericSQLPlugin> = NO_PLUGINS) {
21
+ this.#plugins = plugins;
22
+ }
23
+
24
+ get plugins(): ReadonlyArray<GenericSQLPlugin> {
25
+ return this.#plugins;
26
+ }
27
+
28
+ abstract provideConnection<T>(
29
+ consumer: (connection: DatabaseConnection) => Promise<T>,
30
+ ): Promise<T>;
31
+
32
+ async executeQuery<R>(compiledQuery: CompiledQuery): Promise<QueryResult<R>> {
33
+ return await this.provideConnection(async (connection) => {
34
+ const result = await connection.executeQuery(compiledQuery);
35
+ return await this.#transformResult(result);
36
+ });
37
+ }
38
+
39
+ abstract withConnectionProvider(connectionProvider: ConnectionProvider): QueryExecutorBase;
40
+
41
+ abstract withPlugin(plugin: GenericSQLPlugin): QueryExecutorBase;
42
+
43
+ abstract withoutPlugins(): QueryExecutorBase;
44
+
45
+ // oxlint-disable-next-line no-explicit-any
46
+ async #transformResult<T>(result: QueryResult<any>): Promise<QueryResult<T>> {
47
+ for (const plugin of this.#plugins) {
48
+ result = await plugin.transformResult({ result });
49
+ }
50
+
51
+ return result;
52
+ }
53
+ }
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Adapted from Kysely's QueryExecutor
3
+ * Modified from: https://github.com/kysely-org/kysely
4
+ * License: MIT
5
+ * Copyright (c) 2022 Sami Koskimäki
6
+ *
7
+ * Simplified to remove query compilation, streaming, and batching.
8
+ */
9
+
10
+ import type { CompiledQuery, QueryResult } from "../sql-driver";
11
+ import type { ConnectionProvider } from "../connection/connection-provider";
12
+ import type { GenericSQLPlugin } from "./plugin";
13
+
14
+ /**
15
+ * This interface abstracts away the details of how to execute a query.
16
+ */
17
+ export interface QueryExecutor extends ConnectionProvider {
18
+ /**
19
+ * Returns all installed plugins.
20
+ */
21
+ get plugins(): ReadonlyArray<GenericSQLPlugin>;
22
+
23
+ /**
24
+ * Executes a compiled query and runs the result through all plugins'
25
+ * `transformResult` method.
26
+ */
27
+ executeQuery<R>(compiledQuery: CompiledQuery): Promise<QueryResult<R>>;
28
+
29
+ /**
30
+ * Returns a copy of this executor with a new connection provider.
31
+ */
32
+ withConnectionProvider(connectionProvider: ConnectionProvider): QueryExecutor;
33
+
34
+ /**
35
+ * Returns a copy of this executor with a plugin added as the
36
+ * last plugin.
37
+ */
38
+ withPlugin(plugin: GenericSQLPlugin): QueryExecutor;
39
+
40
+ /**
41
+ * Returns a copy of this executor without any plugins.
42
+ */
43
+ withoutPlugins(): QueryExecutor;
44
+ }
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Adapted from Kysely patterns
3
+ * Modified from: https://github.com/kysely-org/kysely
4
+ * License: MIT
5
+ * Copyright (c) 2022 Sami Koskimäki
6
+ */
7
+
8
+ import type { CompiledQuery, Dialect, QueryResult } from "./sql-driver";
9
+ import { DefaultConnectionProvider } from "./connection/connection-provider";
10
+ import { SingleConnectionProvider } from "./connection/single-connection-provider";
11
+ import { RuntimeDriver } from "./driver/runtime-driver";
12
+ import type { GenericSQLPlugin } from "./query-executor/plugin";
13
+ import type { QueryExecutor } from "./query-executor/query-executor";
14
+ import { DefaultQueryExecutor } from "./query-executor/default-query-executor";
15
+
16
+ export class SqlDriverAdapter {
17
+ readonly #dialect: Dialect;
18
+ readonly #driver: RuntimeDriver | null;
19
+ readonly #executor: QueryExecutor;
20
+
21
+ constructor(dialect: Dialect);
22
+ constructor(dialect: Dialect, executor: QueryExecutor, driver: RuntimeDriver | null);
23
+ constructor(dialect: Dialect, executor?: QueryExecutor, driver?: RuntimeDriver | null) {
24
+ this.#dialect = dialect;
25
+
26
+ if (executor) {
27
+ this.#driver = driver ?? null;
28
+ this.#executor = executor;
29
+ } else {
30
+ const rawDriver = dialect.createDriver();
31
+ const runtimeDriver = new RuntimeDriver(rawDriver);
32
+ const connectionProvider = new DefaultConnectionProvider(runtimeDriver);
33
+ this.#driver = runtimeDriver;
34
+ this.#executor = new DefaultQueryExecutor(connectionProvider);
35
+ }
36
+ }
37
+
38
+ async executeQuery(query: CompiledQuery): Promise<QueryResult<Record<string, unknown>>> {
39
+ return await this.#executor.executeQuery(query);
40
+ }
41
+
42
+ async transaction<T>(callback: (trx: SqlDriverAdapter) => Promise<T>): Promise<T> {
43
+ if (this.#driver === null) {
44
+ throw new Error("Cannot start transaction: adapter was created with custom executor");
45
+ }
46
+
47
+ const driver = this.#driver;
48
+
49
+ return await this.#executor.provideConnection(async (connection) => {
50
+ const singleConnectionProvider = new SingleConnectionProvider(connection);
51
+ const transactionExecutor = this.#executor.withConnectionProvider(singleConnectionProvider);
52
+ const transactionAdapter = new SqlDriverAdapter(this.#dialect, transactionExecutor, driver);
53
+
54
+ let transactionBegun = false;
55
+ try {
56
+ await driver.beginTransaction(connection, {});
57
+ transactionBegun = true;
58
+
59
+ const result = await callback(transactionAdapter);
60
+
61
+ await driver.commitTransaction(connection);
62
+
63
+ return result;
64
+ } catch (error) {
65
+ if (transactionBegun) {
66
+ await driver.rollbackTransaction(connection);
67
+ }
68
+
69
+ throw error;
70
+ }
71
+ });
72
+ }
73
+
74
+ /**
75
+ * Returns a copy of this adapter with the given plugin installed.
76
+ */
77
+ withPlugin(plugin: GenericSQLPlugin): SqlDriverAdapter {
78
+ return new SqlDriverAdapter(this.#dialect, this.#executor.withPlugin(plugin), this.#driver);
79
+ }
80
+
81
+ /**
82
+ * Returns a copy of this adapter without any plugins.
83
+ */
84
+ withoutPlugins(): SqlDriverAdapter {
85
+ return new SqlDriverAdapter(this.#dialect, this.#executor.withoutPlugins(), this.#driver);
86
+ }
87
+
88
+ /**
89
+ * Releases all resources and disconnects from the database.
90
+ */
91
+ async destroy(): Promise<void> {
92
+ if (this.#driver !== null) {
93
+ await this.#driver.destroy();
94
+ }
95
+ }
96
+ }