@fragno-dev/db 0.1.14 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (445) hide show
  1. package/.turbo/turbo-build.log +242 -139
  2. package/CHANGELOG.md +47 -0
  3. package/README.md +123 -8
  4. package/dist/adapters/adapters.d.ts +19 -5
  5. package/dist/adapters/adapters.d.ts.map +1 -1
  6. package/dist/adapters/adapters.js.map +1 -1
  7. package/dist/adapters/drizzle/drizzle-adapter.d.ts +6 -19
  8. package/dist/adapters/drizzle/drizzle-adapter.d.ts.map +1 -1
  9. package/dist/adapters/drizzle/drizzle-adapter.js +7 -47
  10. package/dist/adapters/drizzle/drizzle-adapter.js.map +1 -1
  11. package/dist/adapters/drizzle/generate.d.ts +7 -1
  12. package/dist/adapters/drizzle/generate.d.ts.map +1 -1
  13. package/dist/adapters/drizzle/generate.js +46 -45
  14. package/dist/adapters/drizzle/generate.js.map +1 -1
  15. package/dist/adapters/generic-sql/driver-config.d.ts +74 -0
  16. package/dist/adapters/generic-sql/driver-config.d.ts.map +1 -0
  17. package/dist/adapters/generic-sql/driver-config.js +94 -0
  18. package/dist/adapters/generic-sql/driver-config.js.map +1 -0
  19. package/dist/adapters/generic-sql/generic-sql-adapter.d.ts +43 -0
  20. package/dist/adapters/generic-sql/generic-sql-adapter.d.ts.map +1 -0
  21. package/dist/adapters/generic-sql/generic-sql-adapter.js +87 -0
  22. package/dist/adapters/generic-sql/generic-sql-adapter.js.map +1 -0
  23. package/dist/adapters/generic-sql/generic-sql-uow-executor.js +67 -0
  24. package/dist/adapters/generic-sql/generic-sql-uow-executor.js.map +1 -0
  25. package/dist/adapters/generic-sql/migration/cold-kysely.js +33 -0
  26. package/dist/adapters/generic-sql/migration/cold-kysely.js.map +1 -0
  27. package/dist/adapters/generic-sql/migration/dialect/mysql.js +60 -0
  28. package/dist/adapters/generic-sql/migration/dialect/mysql.js.map +1 -0
  29. package/dist/adapters/generic-sql/migration/dialect/postgres.js +59 -0
  30. package/dist/adapters/generic-sql/migration/dialect/postgres.js.map +1 -0
  31. package/dist/adapters/generic-sql/migration/dialect/sqlite.js +96 -0
  32. package/dist/adapters/generic-sql/migration/dialect/sqlite.js.map +1 -0
  33. package/dist/adapters/generic-sql/migration/executor.d.ts +15 -0
  34. package/dist/adapters/generic-sql/migration/executor.d.ts.map +1 -0
  35. package/dist/adapters/generic-sql/migration/executor.js +18 -0
  36. package/dist/adapters/generic-sql/migration/executor.js.map +1 -0
  37. package/dist/adapters/generic-sql/migration/prepared-migrations.d.ts +66 -0
  38. package/dist/adapters/generic-sql/migration/prepared-migrations.d.ts.map +1 -0
  39. package/dist/adapters/generic-sql/migration/prepared-migrations.js +68 -0
  40. package/dist/adapters/generic-sql/migration/prepared-migrations.js.map +1 -0
  41. package/dist/adapters/generic-sql/migration/sql-generator.js +212 -0
  42. package/dist/adapters/generic-sql/migration/sql-generator.js.map +1 -0
  43. package/dist/adapters/generic-sql/query/create-sql-query-compiler.js +32 -0
  44. package/dist/adapters/generic-sql/query/create-sql-query-compiler.js.map +1 -0
  45. package/dist/adapters/generic-sql/query/cursor-utils.js +37 -0
  46. package/dist/adapters/generic-sql/query/cursor-utils.js.map +1 -0
  47. package/dist/adapters/generic-sql/query/dialect/mysql.js +33 -0
  48. package/dist/adapters/generic-sql/query/dialect/mysql.js.map +1 -0
  49. package/dist/adapters/generic-sql/query/dialect/postgres.js +32 -0
  50. package/dist/adapters/generic-sql/query/dialect/postgres.js.map +1 -0
  51. package/dist/adapters/generic-sql/query/dialect/sqlite.js +32 -0
  52. package/dist/adapters/generic-sql/query/dialect/sqlite.js.map +1 -0
  53. package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js +152 -0
  54. package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js.map +1 -0
  55. package/dist/adapters/generic-sql/query/select-builder.js +69 -0
  56. package/dist/adapters/generic-sql/query/select-builder.js.map +1 -0
  57. package/dist/adapters/generic-sql/query/sql-query-compiler.js +145 -0
  58. package/dist/adapters/generic-sql/query/sql-query-compiler.js.map +1 -0
  59. package/dist/adapters/generic-sql/query/where-builder.js +129 -0
  60. package/dist/adapters/generic-sql/query/where-builder.js.map +1 -0
  61. package/dist/adapters/generic-sql/result-interpreter.js +74 -0
  62. package/dist/adapters/generic-sql/result-interpreter.js.map +1 -0
  63. package/dist/adapters/generic-sql/uow-decoder.js +105 -0
  64. package/dist/adapters/generic-sql/uow-decoder.js.map +1 -0
  65. package/dist/adapters/generic-sql/uow-encoder.js +93 -0
  66. package/dist/adapters/generic-sql/uow-encoder.js.map +1 -0
  67. package/dist/adapters/kysely/kysely-adapter.d.ts +5 -16
  68. package/dist/adapters/kysely/kysely-adapter.d.ts.map +1 -1
  69. package/dist/adapters/kysely/kysely-adapter.js +6 -159
  70. package/dist/adapters/kysely/kysely-adapter.js.map +1 -1
  71. package/dist/adapters/{drizzle/drizzle-query.js → shared/from-unit-of-work-compiler.js} +48 -62
  72. package/dist/adapters/shared/from-unit-of-work-compiler.js.map +1 -0
  73. package/dist/adapters/{kysely/kysely-shared.d.ts → shared/table-name-mapper.d.ts} +3 -2
  74. package/dist/adapters/shared/table-name-mapper.d.ts.map +1 -0
  75. package/dist/adapters/shared/table-name-mapper.js +43 -0
  76. package/dist/adapters/shared/table-name-mapper.js.map +1 -0
  77. package/dist/adapters/shared/uow-operation-compiler.js +105 -0
  78. package/dist/adapters/shared/uow-operation-compiler.js.map +1 -0
  79. package/dist/db-fragment-definition-builder.d.ts +186 -0
  80. package/dist/db-fragment-definition-builder.d.ts.map +1 -0
  81. package/dist/db-fragment-definition-builder.js +207 -0
  82. package/dist/db-fragment-definition-builder.js.map +1 -0
  83. package/dist/fragments/internal-fragment.d.ts +53 -0
  84. package/dist/fragments/internal-fragment.d.ts.map +1 -0
  85. package/dist/fragments/internal-fragment.js +111 -0
  86. package/dist/fragments/internal-fragment.js.map +1 -0
  87. package/dist/hooks/hooks.d.ts +51 -0
  88. package/dist/hooks/hooks.d.ts.map +1 -0
  89. package/dist/hooks/hooks.js +88 -0
  90. package/dist/hooks/hooks.js.map +1 -0
  91. package/dist/migration-engine/generation-engine.d.ts +0 -2
  92. package/dist/migration-engine/generation-engine.d.ts.map +1 -1
  93. package/dist/migration-engine/generation-engine.js +38 -56
  94. package/dist/migration-engine/generation-engine.js.map +1 -1
  95. package/dist/mod.d.ts +35 -23
  96. package/dist/mod.d.ts.map +1 -1
  97. package/dist/mod.js +48 -45
  98. package/dist/mod.js.map +1 -1
  99. package/dist/node_modules/.pnpm/rou3@0.7.10/node_modules/rou3/dist/index.js +165 -0
  100. package/dist/node_modules/.pnpm/rou3@0.7.10/node_modules/rou3/dist/index.js.map +1 -0
  101. package/dist/packages/fragno/dist/api/bind-services.js +20 -0
  102. package/dist/packages/fragno/dist/api/bind-services.js.map +1 -0
  103. package/dist/packages/fragno/dist/api/error.js +48 -0
  104. package/dist/packages/fragno/dist/api/error.js.map +1 -0
  105. package/dist/packages/fragno/dist/api/fragment-definition-builder.js +320 -0
  106. package/dist/packages/fragno/dist/api/fragment-definition-builder.js.map +1 -0
  107. package/dist/packages/fragno/dist/api/fragment-instantiator.js +525 -0
  108. package/dist/packages/fragno/dist/api/fragment-instantiator.js.map +1 -0
  109. package/dist/packages/fragno/dist/api/fragno-response.js +73 -0
  110. package/dist/packages/fragno/dist/api/fragno-response.js.map +1 -0
  111. package/dist/packages/fragno/dist/api/internal/response-stream.js +81 -0
  112. package/dist/packages/fragno/dist/api/internal/response-stream.js.map +1 -0
  113. package/dist/packages/fragno/dist/api/internal/route.js +10 -0
  114. package/dist/packages/fragno/dist/api/internal/route.js.map +1 -0
  115. package/dist/packages/fragno/dist/api/mutable-request-state.js +97 -0
  116. package/dist/packages/fragno/dist/api/mutable-request-state.js.map +1 -0
  117. package/dist/packages/fragno/dist/api/request-context-storage.js +43 -0
  118. package/dist/packages/fragno/dist/api/request-context-storage.js.map +1 -0
  119. package/dist/packages/fragno/dist/api/request-input-context.js +118 -0
  120. package/dist/packages/fragno/dist/api/request-input-context.js.map +1 -0
  121. package/dist/packages/fragno/dist/api/request-middleware.js +83 -0
  122. package/dist/packages/fragno/dist/api/request-middleware.js.map +1 -0
  123. package/dist/packages/fragno/dist/api/request-output-context.js +119 -0
  124. package/dist/packages/fragno/dist/api/request-output-context.js.map +1 -0
  125. package/dist/packages/fragno/dist/api/route.js +17 -0
  126. package/dist/packages/fragno/dist/api/route.js.map +1 -0
  127. package/dist/packages/fragno/dist/internal/symbols.js +10 -0
  128. package/dist/packages/fragno/dist/internal/symbols.js.map +1 -0
  129. package/dist/query/column-defaults.js +27 -0
  130. package/dist/query/column-defaults.js.map +1 -0
  131. package/dist/query/cursor.d.ts +14 -6
  132. package/dist/query/cursor.d.ts.map +1 -1
  133. package/dist/query/cursor.js +16 -7
  134. package/dist/query/cursor.js.map +1 -1
  135. package/dist/query/orm/orm.d.ts +1 -1
  136. package/dist/query/orm/orm.js.map +1 -1
  137. package/dist/query/serialize/create-sql-serializer.js +30 -0
  138. package/dist/query/serialize/create-sql-serializer.js.map +1 -0
  139. package/dist/query/serialize/dialect/mysql-serializer.js +87 -0
  140. package/dist/query/serialize/dialect/mysql-serializer.js.map +1 -0
  141. package/dist/query/serialize/dialect/postgres-serializer.js +80 -0
  142. package/dist/query/serialize/dialect/postgres-serializer.js.map +1 -0
  143. package/dist/query/serialize/dialect/sqlite-serializer.js +93 -0
  144. package/dist/query/serialize/dialect/sqlite-serializer.js.map +1 -0
  145. package/dist/query/serialize/sql-serializer.js +67 -0
  146. package/dist/query/serialize/sql-serializer.js.map +1 -0
  147. package/dist/query/{query.d.ts → simple-query-interface.d.ts} +6 -6
  148. package/dist/query/simple-query-interface.d.ts.map +1 -0
  149. package/dist/query/unit-of-work/execute-unit-of-work.d.ts +133 -0
  150. package/dist/query/unit-of-work/execute-unit-of-work.d.ts.map +1 -0
  151. package/dist/query/unit-of-work/execute-unit-of-work.js +197 -0
  152. package/dist/query/unit-of-work/execute-unit-of-work.js.map +1 -0
  153. package/dist/query/unit-of-work/retry-policy.d.ts +88 -0
  154. package/dist/query/unit-of-work/retry-policy.d.ts.map +1 -0
  155. package/dist/query/unit-of-work/retry-policy.js +61 -0
  156. package/dist/query/unit-of-work/retry-policy.js.map +1 -0
  157. package/dist/query/{unit-of-work.d.ts → unit-of-work/unit-of-work.d.ts} +145 -58
  158. package/dist/query/unit-of-work/unit-of-work.d.ts.map +1 -0
  159. package/dist/query/{unit-of-work.js → unit-of-work/unit-of-work.js} +435 -198
  160. package/dist/query/unit-of-work/unit-of-work.js.map +1 -0
  161. package/dist/query/value-decoding.js +71 -0
  162. package/dist/query/value-decoding.js.map +1 -0
  163. package/dist/query/value-encoding.js +124 -0
  164. package/dist/query/value-encoding.js.map +1 -0
  165. package/dist/schema/create.d.ts +3 -0
  166. package/dist/schema/create.d.ts.map +1 -1
  167. package/dist/schema/create.js +4 -0
  168. package/dist/schema/create.js.map +1 -1
  169. package/dist/schema/type-conversion/create-sql-type-mapper.js +29 -0
  170. package/dist/schema/type-conversion/create-sql-type-mapper.js.map +1 -0
  171. package/dist/schema/type-conversion/dialect/mysql.js +57 -0
  172. package/dist/schema/type-conversion/dialect/mysql.js.map +1 -0
  173. package/dist/schema/type-conversion/dialect/postgres.js +56 -0
  174. package/dist/schema/type-conversion/dialect/postgres.js.map +1 -0
  175. package/dist/schema/type-conversion/dialect/sqlite.js +52 -0
  176. package/dist/schema/type-conversion/dialect/sqlite.js.map +1 -0
  177. package/dist/schema/type-conversion/type-mapping.js +63 -0
  178. package/dist/schema/type-conversion/type-mapping.js.map +1 -0
  179. package/dist/sql-driver/connection/connection-provider.d.ts +13 -0
  180. package/dist/sql-driver/connection/connection-provider.d.ts.map +1 -0
  181. package/dist/sql-driver/connection/connection-provider.js +19 -0
  182. package/dist/sql-driver/connection/connection-provider.js.map +1 -0
  183. package/dist/sql-driver/connection/single-connection-provider.js +23 -0
  184. package/dist/sql-driver/connection/single-connection-provider.js.map +1 -0
  185. package/dist/sql-driver/dialect-adapter/dialect-adapter.d.ts +7 -0
  186. package/dist/sql-driver/dialect-adapter/dialect-adapter.d.ts.map +1 -0
  187. package/dist/sql-driver/dialects/dialects.d.ts +2 -0
  188. package/dist/sql-driver/dialects/dialects.js +3 -0
  189. package/dist/sql-driver/dialects/durable-object-dialect.d.ts +72 -0
  190. package/dist/sql-driver/dialects/durable-object-dialect.d.ts.map +1 -0
  191. package/dist/sql-driver/dialects/durable-object-dialect.js +130 -0
  192. package/dist/sql-driver/dialects/durable-object-dialect.js.map +1 -0
  193. package/dist/sql-driver/driver/runtime-driver.d.ts +23 -0
  194. package/dist/sql-driver/driver/runtime-driver.d.ts.map +1 -0
  195. package/dist/sql-driver/driver/runtime-driver.js +56 -0
  196. package/dist/sql-driver/driver/runtime-driver.js.map +1 -0
  197. package/dist/sql-driver/query-executor/default-query-executor.js +26 -0
  198. package/dist/sql-driver/query-executor/default-query-executor.js.map +1 -0
  199. package/dist/sql-driver/query-executor/plugin.d.ts +17 -0
  200. package/dist/sql-driver/query-executor/plugin.d.ts.map +1 -0
  201. package/dist/sql-driver/query-executor/query-executor-base.js +25 -0
  202. package/dist/sql-driver/query-executor/query-executor-base.js.map +1 -0
  203. package/dist/sql-driver/query-executor/query-executor.d.ts +36 -0
  204. package/dist/sql-driver/query-executor/query-executor.d.ts.map +1 -0
  205. package/dist/sql-driver/sql-driver-adapter.d.ts +29 -0
  206. package/dist/sql-driver/sql-driver-adapter.d.ts.map +1 -0
  207. package/dist/sql-driver/sql-driver-adapter.js +68 -0
  208. package/dist/sql-driver/sql-driver-adapter.js.map +1 -0
  209. package/dist/sql-driver/sql-driver.d.ts +38 -0
  210. package/dist/sql-driver/sql-driver.d.ts.map +1 -0
  211. package/dist/sql-driver/sql-driver.js +1 -0
  212. package/dist/sql-driver/sql.js +50 -0
  213. package/dist/sql-driver/sql.js.map +1 -0
  214. package/dist/with-database.d.ts +32 -0
  215. package/dist/with-database.d.ts.map +1 -0
  216. package/dist/with-database.js +34 -0
  217. package/dist/with-database.js.map +1 -0
  218. package/package.json +43 -9
  219. package/src/adapters/adapters.ts +23 -4
  220. package/src/adapters/drizzle/drizzle-adapter-pglite.test.ts +140 -185
  221. package/src/adapters/drizzle/{drizzle-adapter-sqlite.test.ts → drizzle-adapter-sqlite3.test.ts} +187 -55
  222. package/src/adapters/drizzle/drizzle-adapter.ts +14 -93
  223. package/src/adapters/drizzle/generate.test.ts +102 -269
  224. package/src/adapters/drizzle/generate.ts +89 -63
  225. package/src/adapters/drizzle/migrate-drizzle.test.ts +19 -0
  226. package/src/adapters/drizzle/shared.ts +0 -34
  227. package/src/adapters/drizzle/test-utils.ts +36 -5
  228. package/src/adapters/generic-sql/README.md +14 -0
  229. package/src/adapters/generic-sql/driver-config.ts +144 -0
  230. package/src/adapters/generic-sql/generic-sql-adapter.test.ts +50 -0
  231. package/src/adapters/generic-sql/generic-sql-adapter.ts +146 -0
  232. package/src/adapters/generic-sql/generic-sql-uow-executor.ts +130 -0
  233. package/src/adapters/generic-sql/migration/cold-kysely.ts +55 -0
  234. package/src/adapters/{kysely/migration/execute-mysql.test.ts → generic-sql/migration/dialect/mysql.test.ts} +342 -484
  235. package/src/adapters/generic-sql/migration/dialect/mysql.ts +104 -0
  236. package/src/adapters/generic-sql/migration/dialect/postgres.test.ts +1008 -0
  237. package/src/adapters/generic-sql/migration/dialect/postgres.ts +113 -0
  238. package/src/adapters/{kysely/migration/execute-sqlite.test.ts → generic-sql/migration/dialect/sqlite.test.ts} +307 -510
  239. package/src/adapters/generic-sql/migration/dialect/sqlite.ts +189 -0
  240. package/src/adapters/generic-sql/migration/executor.ts +33 -0
  241. package/src/adapters/generic-sql/migration/prepared-migrations.test.ts +661 -0
  242. package/src/adapters/generic-sql/migration/prepared-migrations.ts +214 -0
  243. package/src/adapters/generic-sql/migration/sql-generator.ts +413 -0
  244. package/src/adapters/generic-sql/query/create-sql-query-compiler.ts +36 -0
  245. package/src/adapters/generic-sql/query/cursor-utils.ts +56 -0
  246. package/src/adapters/generic-sql/query/dialect/mysql.ts +34 -0
  247. package/src/adapters/generic-sql/query/dialect/postgres.ts +32 -0
  248. package/src/adapters/generic-sql/query/dialect/sqlite.ts +32 -0
  249. package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.test.ts +1568 -0
  250. package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.ts +314 -0
  251. package/src/adapters/generic-sql/query/select-builder.test.ts +256 -0
  252. package/src/adapters/generic-sql/query/select-builder.ts +137 -0
  253. package/src/adapters/generic-sql/query/sql-query-compiler.test.ts +195 -0
  254. package/src/adapters/generic-sql/query/sql-query-compiler.ts +367 -0
  255. package/src/adapters/generic-sql/query/where-builder.test.ts +744 -0
  256. package/src/adapters/generic-sql/query/where-builder.ts +211 -0
  257. package/src/adapters/generic-sql/result-interpreter.ts +102 -0
  258. package/src/adapters/generic-sql/test/generic-drizzle-adapter-sqlite3.test.ts +899 -0
  259. package/src/adapters/generic-sql/uow-decoder.test.ts +399 -0
  260. package/src/adapters/generic-sql/uow-decoder.ts +152 -0
  261. package/src/adapters/generic-sql/uow-encoder.test.ts +183 -0
  262. package/src/adapters/generic-sql/uow-encoder.ts +131 -0
  263. package/src/adapters/kysely/kysely-adapter-pglite.test.ts +90 -96
  264. package/src/adapters/kysely/kysely-adapter-sqlocal.test.ts +215 -0
  265. package/src/adapters/kysely/kysely-adapter.ts +10 -242
  266. package/src/adapters/{drizzle/drizzle-query.ts → shared/from-unit-of-work-compiler.ts} +111 -106
  267. package/src/adapters/shared/table-name-mapper.ts +50 -0
  268. package/src/adapters/shared/uow-operation-compiler.ts +211 -0
  269. package/src/db-fragment-definition-builder.test.ts +887 -0
  270. package/src/db-fragment-definition-builder.ts +737 -0
  271. package/src/db-fragment-instantiator.test.ts +543 -0
  272. package/src/db-fragment-integration.test.ts +406 -0
  273. package/src/fragments/internal-fragment.test.ts +549 -0
  274. package/src/fragments/internal-fragment.ts +249 -0
  275. package/src/hooks/hooks.test.ts +575 -0
  276. package/src/hooks/hooks.ts +179 -0
  277. package/src/migration-engine/generation-engine.test.ts +60 -27
  278. package/src/migration-engine/generation-engine.ts +99 -92
  279. package/src/mod.ts +139 -78
  280. package/src/query/column-defaults.ts +49 -0
  281. package/src/query/cursor.test.ts +147 -3
  282. package/src/query/cursor.ts +25 -8
  283. package/src/query/orm/orm.ts +1 -1
  284. package/src/query/query-type.test.ts +9 -9
  285. package/src/query/serialize/create-sql-serializer.ts +34 -0
  286. package/src/query/serialize/dialect/mysql-serializer.ts +142 -0
  287. package/src/query/serialize/dialect/postgres-serializer.ts +129 -0
  288. package/src/query/serialize/dialect/sqlite-serializer.test.ts +251 -0
  289. package/src/query/serialize/dialect/sqlite-serializer.ts +156 -0
  290. package/src/query/serialize/sql-serializer.ts +143 -0
  291. package/src/query/{query.ts → simple-query-interface.ts} +4 -4
  292. package/src/query/unit-of-work/execute-unit-of-work.test.ts +1310 -0
  293. package/src/query/unit-of-work/execute-unit-of-work.ts +504 -0
  294. package/src/query/unit-of-work/retry-policy.test.ts +217 -0
  295. package/src/query/unit-of-work/retry-policy.ts +141 -0
  296. package/src/query/unit-of-work/unit-of-work-coordinator.test.ts +831 -0
  297. package/src/query/{unit-of-work-types.test.ts → unit-of-work/unit-of-work-types.test.ts} +7 -5
  298. package/src/query/unit-of-work/unit-of-work.test.ts +1716 -0
  299. package/src/query/{unit-of-work.ts → unit-of-work/unit-of-work.ts} +716 -420
  300. package/src/query/{result-transform.test.ts → value-decoding.test.ts} +45 -298
  301. package/src/query/value-decoding.ts +113 -0
  302. package/src/query/value-encoding.test.ts +390 -0
  303. package/src/query/value-encoding.ts +168 -0
  304. package/src/schema/create.test.ts +5 -1
  305. package/src/schema/create.ts +5 -0
  306. package/src/schema/serialize.test.ts +165 -407
  307. package/src/schema/type-conversion/create-sql-type-mapper.ts +28 -0
  308. package/src/schema/type-conversion/dialect/mysql.ts +64 -0
  309. package/src/schema/type-conversion/dialect/postgres.ts +62 -0
  310. package/src/schema/type-conversion/dialect/sqlite.ts +63 -0
  311. package/src/schema/type-conversion/type-mapping.test.ts +137 -0
  312. package/src/schema/type-conversion/type-mapping.ts +153 -0
  313. package/src/shared/connection-pool.ts +5 -5
  314. package/src/sql-driver/better-sqlite3.test.ts +126 -0
  315. package/src/sql-driver/connection/connection-provider.ts +27 -0
  316. package/src/sql-driver/connection/single-connection-provider.ts +42 -0
  317. package/src/sql-driver/dialect-adapter/dialect-adapter.ts +9 -0
  318. package/src/sql-driver/dialect-adapter/sqlite-dialect-adapter.ts +7 -0
  319. package/src/sql-driver/dialects/dialects.ts +1 -0
  320. package/src/sql-driver/dialects/durable-object-dialect.ts +260 -0
  321. package/src/sql-driver/driver/runtime-driver.ts +91 -0
  322. package/src/sql-driver/query-executor/default-query-executor.ts +38 -0
  323. package/src/sql-driver/query-executor/plugin.ts +22 -0
  324. package/src/sql-driver/query-executor/query-executor-base.ts +53 -0
  325. package/src/sql-driver/query-executor/query-executor.ts +44 -0
  326. package/src/sql-driver/sql-driver-adapter.ts +96 -0
  327. package/src/sql-driver/sql-driver.ts +53 -0
  328. package/src/sql-driver/sql.ts +57 -0
  329. package/src/sql-driver/sqlocal.test.ts +117 -0
  330. package/src/with-database.ts +152 -0
  331. package/tsdown.config.ts +8 -2
  332. package/dist/adapters/drizzle/drizzle-connection-pool.js +0 -40
  333. package/dist/adapters/drizzle/drizzle-connection-pool.js.map +0 -1
  334. package/dist/adapters/drizzle/drizzle-query.d.ts +0 -23
  335. package/dist/adapters/drizzle/drizzle-query.d.ts.map +0 -1
  336. package/dist/adapters/drizzle/drizzle-query.js.map +0 -1
  337. package/dist/adapters/drizzle/drizzle-uow-compiler.d.ts +0 -10
  338. package/dist/adapters/drizzle/drizzle-uow-compiler.d.ts.map +0 -1
  339. package/dist/adapters/drizzle/drizzle-uow-compiler.js +0 -315
  340. package/dist/adapters/drizzle/drizzle-uow-compiler.js.map +0 -1
  341. package/dist/adapters/drizzle/drizzle-uow-decoder.js +0 -116
  342. package/dist/adapters/drizzle/drizzle-uow-decoder.js.map +0 -1
  343. package/dist/adapters/drizzle/drizzle-uow-executor.js +0 -149
  344. package/dist/adapters/drizzle/drizzle-uow-executor.js.map +0 -1
  345. package/dist/adapters/drizzle/join-column-utils.js +0 -28
  346. package/dist/adapters/drizzle/join-column-utils.js.map +0 -1
  347. package/dist/adapters/drizzle/shared.d.ts +0 -14
  348. package/dist/adapters/drizzle/shared.d.ts.map +0 -1
  349. package/dist/adapters/drizzle/shared.js +0 -35
  350. package/dist/adapters/drizzle/shared.js.map +0 -1
  351. package/dist/adapters/kysely/kysely-connection-pool.js +0 -41
  352. package/dist/adapters/kysely/kysely-connection-pool.js.map +0 -1
  353. package/dist/adapters/kysely/kysely-query-builder.js +0 -321
  354. package/dist/adapters/kysely/kysely-query-builder.js.map +0 -1
  355. package/dist/adapters/kysely/kysely-query-compiler.js +0 -66
  356. package/dist/adapters/kysely/kysely-query-compiler.js.map +0 -1
  357. package/dist/adapters/kysely/kysely-query.d.ts +0 -22
  358. package/dist/adapters/kysely/kysely-query.d.ts.map +0 -1
  359. package/dist/adapters/kysely/kysely-query.js +0 -223
  360. package/dist/adapters/kysely/kysely-query.js.map +0 -1
  361. package/dist/adapters/kysely/kysely-shared.d.ts.map +0 -1
  362. package/dist/adapters/kysely/kysely-shared.js +0 -18
  363. package/dist/adapters/kysely/kysely-shared.js.map +0 -1
  364. package/dist/adapters/kysely/kysely-uow-compiler.js +0 -170
  365. package/dist/adapters/kysely/kysely-uow-compiler.js.map +0 -1
  366. package/dist/adapters/kysely/kysely-uow-executor.js +0 -89
  367. package/dist/adapters/kysely/kysely-uow-executor.js.map +0 -1
  368. package/dist/adapters/kysely/migration/execute-base.js +0 -128
  369. package/dist/adapters/kysely/migration/execute-base.js.map +0 -1
  370. package/dist/adapters/kysely/migration/execute-factory.js +0 -34
  371. package/dist/adapters/kysely/migration/execute-factory.js.map +0 -1
  372. package/dist/adapters/kysely/migration/execute-mssql.js +0 -112
  373. package/dist/adapters/kysely/migration/execute-mssql.js.map +0 -1
  374. package/dist/adapters/kysely/migration/execute-mysql.js +0 -93
  375. package/dist/adapters/kysely/migration/execute-mysql.js.map +0 -1
  376. package/dist/adapters/kysely/migration/execute-postgres.js +0 -104
  377. package/dist/adapters/kysely/migration/execute-postgres.js.map +0 -1
  378. package/dist/adapters/kysely/migration/execute-sqlite.js +0 -123
  379. package/dist/adapters/kysely/migration/execute-sqlite.js.map +0 -1
  380. package/dist/adapters/kysely/migration/execute.js +0 -34
  381. package/dist/adapters/kysely/migration/execute.js.map +0 -1
  382. package/dist/bind-services.d.ts +0 -7
  383. package/dist/bind-services.d.ts.map +0 -1
  384. package/dist/bind-services.js +0 -14
  385. package/dist/bind-services.js.map +0 -1
  386. package/dist/fragment.d.ts +0 -173
  387. package/dist/fragment.d.ts.map +0 -1
  388. package/dist/fragment.js +0 -191
  389. package/dist/fragment.js.map +0 -1
  390. package/dist/migration-engine/create.d.ts +0 -37
  391. package/dist/migration-engine/create.d.ts.map +0 -1
  392. package/dist/migration-engine/create.js +0 -58
  393. package/dist/migration-engine/create.js.map +0 -1
  394. package/dist/migration-engine/shared.d.ts +0 -112
  395. package/dist/migration-engine/shared.d.ts.map +0 -1
  396. package/dist/query/query.d.ts.map +0 -1
  397. package/dist/query/result-transform.js +0 -168
  398. package/dist/query/result-transform.js.map +0 -1
  399. package/dist/query/unit-of-work.d.ts.map +0 -1
  400. package/dist/query/unit-of-work.js.map +0 -1
  401. package/dist/schema/serialize.js +0 -106
  402. package/dist/schema/serialize.js.map +0 -1
  403. package/dist/shared/settings-schema.js +0 -36
  404. package/dist/shared/settings-schema.js.map +0 -1
  405. package/src/adapters/drizzle/drizzle-adapter.test.ts +0 -170
  406. package/src/adapters/drizzle/drizzle-connection-pool.ts +0 -66
  407. package/src/adapters/drizzle/drizzle-query.test.ts +0 -499
  408. package/src/adapters/drizzle/drizzle-uow-compiler.test.ts +0 -1383
  409. package/src/adapters/drizzle/drizzle-uow-compiler.ts +0 -636
  410. package/src/adapters/drizzle/drizzle-uow-decoder.ts +0 -218
  411. package/src/adapters/drizzle/drizzle-uow-executor.ts +0 -276
  412. package/src/adapters/drizzle/join-column-utils.test.ts +0 -79
  413. package/src/adapters/drizzle/join-column-utils.ts +0 -39
  414. package/src/adapters/kysely/kysely-connection-pool.ts +0 -70
  415. package/src/adapters/kysely/kysely-query-builder.test.ts +0 -1344
  416. package/src/adapters/kysely/kysely-query-builder.ts +0 -666
  417. package/src/adapters/kysely/kysely-query-compiler.ts +0 -132
  418. package/src/adapters/kysely/kysely-query.test.ts +0 -498
  419. package/src/adapters/kysely/kysely-query.ts +0 -390
  420. package/src/adapters/kysely/kysely-shared.ts +0 -23
  421. package/src/adapters/kysely/kysely-uow-compiler.test.ts +0 -998
  422. package/src/adapters/kysely/kysely-uow-compiler.ts +0 -318
  423. package/src/adapters/kysely/kysely-uow-executor.ts +0 -145
  424. package/src/adapters/kysely/kysely-uow-joins.test.ts +0 -811
  425. package/src/adapters/kysely/migration/execute-base.ts +0 -256
  426. package/src/adapters/kysely/migration/execute-factory.ts +0 -53
  427. package/src/adapters/kysely/migration/execute-mssql.ts +0 -250
  428. package/src/adapters/kysely/migration/execute-mysql.ts +0 -211
  429. package/src/adapters/kysely/migration/execute-postgres.test.ts +0 -2657
  430. package/src/adapters/kysely/migration/execute-postgres.ts +0 -234
  431. package/src/adapters/kysely/migration/execute-sqlite.ts +0 -247
  432. package/src/adapters/kysely/migration/execute.ts +0 -50
  433. package/src/adapters/kysely/migration/kysely-migrator.test.ts +0 -261
  434. package/src/bind-services.test.ts +0 -214
  435. package/src/bind-services.ts +0 -37
  436. package/src/db-fragment.test.ts +0 -800
  437. package/src/fragment.ts +0 -727
  438. package/src/query/result-transform.ts +0 -271
  439. package/src/query/unit-of-work-multi-schema.test.ts +0 -64
  440. package/src/query/unit-of-work.test.ts +0 -943
  441. package/src/schema/serialize.ts +0 -396
  442. package/src/shared/settings-schema.ts +0 -61
  443. package/src/uow-context-integration.test.ts +0 -102
  444. package/src/uow-context.test.ts +0 -182
  445. /package/dist/query/{query.js → simple-query-interface.js} +0 -0
@@ -1,666 +0,0 @@
1
- import {
2
- type BinaryOperator,
3
- type CompiledQuery,
4
- type ExpressionBuilder,
5
- type ExpressionWrapper,
6
- type Kysely,
7
- sql,
8
- } from "kysely";
9
- import type { AnySelectClause, FindManyOptions } from "../../query/query";
10
- import type { SqlBool } from "kysely";
11
- import { type AnyColumn, type AnyTable, Column } from "../../schema/create";
12
- import type { SQLProvider } from "../../shared/providers";
13
- import type { Condition } from "../../query/condition-builder";
14
- import { serialize } from "../../schema/serialize";
15
- import type { CompiledJoin, SimplifyFindOptions } from "../../query/orm/orm";
16
- import { decodeResult, encodeValues, ReferenceSubquery } from "../../query/result-transform";
17
- import type { TableNameMapper } from "./kysely-shared";
18
-
19
- /**
20
- * Returns the fully qualified SQL name for a column (table.column).
21
- *
22
- * @param column - The column to get the full name for
23
- * @param mapper - Optional table name mapper for namespace prefixing
24
- * @returns The fully qualified SQL name in the format "tableName.columnName"
25
- * @internal
26
- *
27
- * @example
28
- * ```ts
29
- * fullSQLName(userTable.columns.email)
30
- * // Returns: "users.email"
31
- * ```
32
- */
33
- export function fullSQLName(column: AnyColumn, mapper?: TableNameMapper) {
34
- const tableName = mapper ? mapper.toPhysical(column.tableName) : column.tableName;
35
- return `${tableName}.${column.name}`;
36
- }
37
-
38
- /**
39
- * Builds a WHERE clause expression from a Condition tree.
40
- *
41
- * Recursively processes condition objects to build Kysely WHERE expressions.
42
- * Handles comparison operators, logical AND/OR/NOT, and special string operators
43
- * like "contains", "starts with", and "ends with".
44
- *
45
- * @param condition - The condition tree to build the WHERE clause from
46
- * @param eb - Kysely expression builder for constructing SQL expressions
47
- * @param provider - The SQL provider (affects SQL generation)
48
- * @param mapper - Optional table name mapper for namespace prefixing
49
- * @param table - The table being queried (used for resolving reference columns)
50
- * @returns A Kysely expression wrapper representing the WHERE clause
51
- * @internal
52
- *
53
- * @example
54
- * ```ts
55
- * const condition = {
56
- * type: "compare",
57
- * a: userTable.columns.name,
58
- * operator: "contains",
59
- * b: "john"
60
- * };
61
- * const whereClause = buildWhere(condition, eb, 'postgresql');
62
- * ```
63
- */
64
- export function buildWhere(
65
- condition: Condition,
66
- eb: ExpressionBuilder<any, any>, // eslint-disable-line @typescript-eslint/no-explicit-any
67
- provider: SQLProvider,
68
- mapper?: TableNameMapper,
69
- table?: AnyTable,
70
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
71
- ): ExpressionWrapper<any, any, SqlBool> {
72
- if (condition.type === "compare") {
73
- const left = condition.a;
74
- const op = condition.operator;
75
- let val = condition.b;
76
-
77
- if (!(val instanceof Column)) {
78
- // Handle string references - convert external ID to internal ID via subquery
79
- if (left.role === "reference" && typeof val === "string" && table) {
80
- // Find relation that uses this column
81
- const relation = Object.values(table.relations).find((rel) =>
82
- rel.on.some(([localCol]) => localCol === left.ormName),
83
- );
84
- if (relation) {
85
- const refTable = relation.table;
86
- const internalIdCol = refTable.getInternalIdColumn();
87
- const idCol = refTable.getIdColumn();
88
- const physicalTableName = mapper ? mapper.toPhysical(refTable.ormName) : refTable.ormName;
89
-
90
- // Build a SQL subquery
91
- val = eb
92
- .selectFrom(physicalTableName)
93
- .select(internalIdCol.name)
94
- .where(idCol.name, "=", val)
95
- .limit(1);
96
- }
97
- } else {
98
- val = serialize(val, left, provider);
99
- }
100
- }
101
-
102
- let v: BinaryOperator;
103
- let rhs: unknown;
104
-
105
- switch (op) {
106
- case "contains":
107
- v = "like";
108
- rhs =
109
- val instanceof Column
110
- ? sql`concat('%', ${eb.ref(fullSQLName(val, mapper))}, '%')`
111
- : `%${val}%`;
112
- break;
113
- case "not contains":
114
- v = "not like";
115
- rhs =
116
- val instanceof Column
117
- ? sql`concat('%', ${eb.ref(fullSQLName(val, mapper))}, '%')`
118
- : `%${val}%`;
119
- break;
120
- case "starts with":
121
- v = "like";
122
- rhs =
123
- val instanceof Column ? sql`concat(${eb.ref(fullSQLName(val, mapper))}, '%')` : `${val}%`;
124
- break;
125
- case "not starts with":
126
- v = "not like";
127
- rhs =
128
- val instanceof Column ? sql`concat(${eb.ref(fullSQLName(val, mapper))}, '%')` : `${val}%`;
129
- break;
130
- case "ends with":
131
- v = "like";
132
- rhs =
133
- val instanceof Column ? sql`concat('%', ${eb.ref(fullSQLName(val, mapper))})` : `%${val}`;
134
- break;
135
- case "not ends with":
136
- v = "not like";
137
- rhs =
138
- val instanceof Column ? sql`concat('%', ${eb.ref(fullSQLName(val, mapper))})` : `%${val}`;
139
- break;
140
- default:
141
- v = op;
142
- rhs = val instanceof Column ? eb.ref(fullSQLName(val, mapper)) : val;
143
- }
144
-
145
- return eb(fullSQLName(left, mapper), v, rhs);
146
- }
147
-
148
- // Nested conditions
149
- if (condition.type === "and") {
150
- return eb.and(condition.items.map((v) => buildWhere(v, eb, provider, mapper, table)));
151
- }
152
-
153
- if (condition.type === "not") {
154
- return eb.not(buildWhere(condition.item, eb, provider, mapper, table));
155
- }
156
-
157
- return eb.or(condition.items.map((v) => buildWhere(v, eb, provider, mapper, table)));
158
- }
159
-
160
- /**
161
- * Maps a select clause to SQL column names with optional aliases.
162
- *
163
- * Converts application-level select clauses (either array of keys or "select all")
164
- * into SQL-compatible column selections with proper aliasing for relations.
165
- *
166
- * @param select - The select clause (array of keys or true for all columns)
167
- * @param table - The table schema containing column definitions
168
- * @param options - Optional configuration
169
- * @param options.relation - Relation name to prefix in aliases (for joined data)
170
- * @param options.tableName - Override the table name in the SQL (defaults to table.name)
171
- * @returns Array of SQL select strings in the format "tableName.columnName as alias"
172
- * @internal
173
- *
174
- * @example
175
- * ```ts
176
- * mapSelect(['id', 'name'], userTable)
177
- * // Returns: ['users.id as id', 'users.name as name']
178
- *
179
- * mapSelect(['title'], postTable, { relation: 'posts' })
180
- * // Returns: ['posts.title as posts:title']
181
- * ```
182
- */
183
- export function mapSelect(
184
- select: AnySelectClause,
185
- table: AnyTable,
186
- options: {
187
- relation?: string;
188
- tableName?: string;
189
- } = {},
190
- ): string[] {
191
- const { relation, tableName = table.name } = options;
192
- const out: string[] = [];
193
- const keys = Array.isArray(select) ? select : Object.keys(table.columns);
194
-
195
- for (const key of keys) {
196
- const col = table.columns[key];
197
-
198
- // Skip hidden columns when explicitly selecting
199
- if (Array.isArray(select) && col.isHidden) {
200
- continue;
201
- }
202
-
203
- // Add the column to the select list
204
- const name = relation ? `${relation}:${key}` : key;
205
- out.push(`${tableName}.${col.name} as ${name}`);
206
- }
207
-
208
- // Always include hidden columns (for FragnoId construction with internal ID and version)
209
- for (const key in table.columns) {
210
- const col = table.columns[key];
211
- if (col.isHidden && !keys.includes(key)) {
212
- const name = relation ? `${relation}:${key}` : key;
213
- out.push(`${tableName}.${col.name} as ${name}`);
214
- }
215
- }
216
-
217
- return out;
218
- }
219
-
220
- /**
221
- * Result type from compiling a select clause with extensions.
222
- * @internal
223
- */
224
- export interface CompiledSelect {
225
- /**
226
- * The final select clause to use in the query
227
- */
228
- result: AnySelectClause;
229
-
230
- /**
231
- * Keys that were added to the select clause (not originally requested)
232
- */
233
- extendedKeys: string[];
234
-
235
- /**
236
- * Removes the extended keys from a record (mutates the record).
237
- * Used to clean up keys that were only needed for join operations.
238
- *
239
- * @param record - The record to remove extended keys from
240
- * @returns The same record with extended keys removed
241
- */
242
- removeExtendedKeys: (record: Record<string, unknown>) => Record<string, unknown>;
243
- }
244
-
245
- /**
246
- * Builder for extending a select clause with additional keys.
247
- * @internal
248
- */
249
- export interface SelectBuilder {
250
- /**
251
- * Adds a key to the select clause if not already present.
252
- * Tracks which keys were added for later removal.
253
- *
254
- * @param key - The key to add to the select clause
255
- */
256
- extend: (key: string) => void;
257
-
258
- /**
259
- * Compiles the select clause into its final form.
260
- *
261
- * @returns The compiled select information
262
- */
263
- compile: () => CompiledSelect;
264
- }
265
-
266
- /**
267
- * Creates a builder that can extend a select clause with additional keys.
268
- *
269
- * This is useful when you need to temporarily include columns for join operations
270
- * or other internal processing, but don't want them in the final result.
271
- *
272
- * @param original - The original select clause from the user
273
- * @returns A select builder with extend() and compile() methods
274
- * @internal
275
- *
276
- * @example
277
- * ```ts
278
- * const builder = extendSelect(['name', 'email']);
279
- * builder.extend('id'); // Add id for join operation
280
- * const { result, removeExtendedKeys } = builder.compile();
281
- * // result: ['name', 'email', 'id']
282
- *
283
- * const record = { name: 'John', email: 'j@ex.com', id: 123 };
284
- * removeExtendedKeys(record);
285
- * // record: { name: 'John', email: 'j@ex.com' }
286
- * ```
287
- */
288
- export function extendSelect(original: AnySelectClause): SelectBuilder {
289
- const select = Array.isArray(original) ? new Set(original) : true;
290
- const extendedKeys: string[] = [];
291
-
292
- return {
293
- extend(key) {
294
- if (select === true || select.has(key)) {
295
- return;
296
- }
297
-
298
- select.add(key);
299
- extendedKeys.push(key);
300
- },
301
- compile() {
302
- return {
303
- result: select instanceof Set ? Array.from(select) : true,
304
- extendedKeys,
305
- removeExtendedKeys(record) {
306
- for (const key of extendedKeys) {
307
- delete record[key];
308
- }
309
- return record;
310
- },
311
- };
312
- },
313
- };
314
- }
315
-
316
- /**
317
- * Executes a SELECT query to find multiple records.
318
- *
319
- * Builds and executes a Kysely query with the provided options including
320
- * filtering (where), ordering (orderBy), pagination (limit/offset), and
321
- * column selection (select).
322
- *
323
- * @param kysely - The Kysely database instance
324
- * @param provider - The SQL provider (affects SQL generation)
325
- * @param table - The table to query from
326
- * @param v - Query options including where, select, orderBy, limit, and offset
327
- * @param runSubQueryJoin - Function to execute subquery joins on the results
328
- * @returns Array of decoded records matching the query criteria
329
- * @internal
330
- *
331
- * @example
332
- * ```ts
333
- * const records = await findMany(kysely, 'postgresql', userTable, {
334
- * where: someCondition,
335
- * orderBy: [['name', 'asc']],
336
- * limit: 10
337
- * });
338
- * ```
339
- */
340
- export async function findMany(
341
- kysely: Kysely<any>, // eslint-disable-line @typescript-eslint/no-explicit-any
342
- provider: SQLProvider,
343
- table: AnyTable,
344
- v: SimplifyFindOptions<FindManyOptions>,
345
- runSubQueryJoin: (records: Record<string, unknown>[], join: CompiledJoin) => Promise<void>,
346
- ) {
347
- let query = kysely.selectFrom(table.name);
348
-
349
- const where = v.where;
350
- if (where) {
351
- query = query.where((eb) => buildWhere(where, eb, provider));
352
- }
353
-
354
- if (v.offset !== undefined) {
355
- query = query.offset(v.offset);
356
- }
357
-
358
- if (v.limit !== undefined) {
359
- query = provider === "mssql" ? query.top(v.limit) : query.limit(v.limit);
360
- }
361
-
362
- if (v.orderBy) {
363
- for (const [col, mode] of v.orderBy) {
364
- query = query.orderBy(fullSQLName(col), mode);
365
- }
366
- }
367
-
368
- const selectBuilder = extendSelect(v.select);
369
- const mappedSelect: string[] = [];
370
- const subqueryJoins: CompiledJoin[] = [];
371
-
372
- const compiledSelect = selectBuilder.compile();
373
- mappedSelect.push(...mapSelect(compiledSelect.result, table));
374
-
375
- const records = (await query.select(mappedSelect).execute()).map((v) =>
376
- decodeResult(v, table, provider),
377
- );
378
-
379
- await Promise.all(subqueryJoins.map((join) => runSubQueryJoin(records, join)));
380
- for (const record of records) {
381
- compiledSelect.removeExtendedKeys(record);
382
- }
383
-
384
- return records;
385
- }
386
-
387
- /**
388
- * Processes encoded values and replaces ReferenceSubquery markers with actual SQL subqueries.
389
- *
390
- * @param values - The encoded values that may contain ReferenceSubquery objects
391
- * @param kysely - The Kysely database instance for building subqueries
392
- * @param mapper - Optional table name mapper for namespace prefixing
393
- * @returns Processed values with subqueries in place of ReferenceSubquery markers
394
- * @internal
395
- */
396
- function processReferenceSubqueries(
397
- values: Record<string, unknown>,
398
- kysely: Kysely<any>, // eslint-disable-line @typescript-eslint/no-explicit-any
399
- mapper?: TableNameMapper,
400
- ): Record<string, unknown> {
401
- const processed: Record<string, unknown> = {};
402
- const getTableName = (table: AnyTable) => (mapper ? mapper.toPhysical(table.name) : table.name);
403
-
404
- for (const [key, value] of Object.entries(values)) {
405
- if (value instanceof ReferenceSubquery) {
406
- const refTable = value.referencedTable;
407
- const externalId = value.externalIdValue;
408
-
409
- // Build a subquery: SELECT _internal_id FROM referenced_table WHERE id = external_id LIMIT 1
410
- processed[key] = kysely
411
- .selectFrom(getTableName(refTable))
412
- .select(refTable.getInternalIdColumn().name)
413
- .where(refTable.getIdColumn().name, "=", externalId)
414
- .limit(1);
415
- } else {
416
- processed[key] = value;
417
- }
418
- }
419
-
420
- return processed;
421
- }
422
-
423
- /**
424
- * Creates a query compiler that builds and compiles Kysely queries without executing them.
425
- *
426
- * Each method takes table and query parameters and returns a CompiledQuery that can be
427
- * executed later using kysely.executeQuery().
428
- *
429
- * @param kysely - The Kysely database instance
430
- * @param provider - The SQL provider (affects SQL generation)
431
- * @returns An object with methods for compiling various database operations
432
- * @internal
433
- *
434
- * @example
435
- * ```ts
436
- * const builder = createKyselyQueryBuilder(kysely, 'postgresql');
437
- * const query = builder.count(userTable, { where: someCondition });
438
- * const result = await kysely.executeQuery(query);
439
- * ```
440
- */
441
- export function createKyselyQueryBuilder(
442
- kysely: Kysely<any>, // eslint-disable-line @typescript-eslint/no-explicit-any
443
- provider: SQLProvider,
444
- mapper?: TableNameMapper,
445
- ) {
446
- // Helper to get the physical table name (with namespace suffix if mapper is provided)
447
- const getTableName = (table: AnyTable) => (mapper ? mapper.toPhysical(table.name) : table.name);
448
-
449
- return {
450
- count(table: AnyTable, { where }: { where?: Condition }): CompiledQuery {
451
- let query = kysely.selectFrom(getTableName(table)).select(kysely.fn.countAll().as("count"));
452
- if (where) {
453
- query = query.where((b) => buildWhere(where, b, provider, mapper, table));
454
- }
455
- return query.compile();
456
- },
457
-
458
- create(table: AnyTable, values: Record<string, unknown>): CompiledQuery {
459
- const encodedValues = encodeValues(values, table, true, provider);
460
- const processedValues = processReferenceSubqueries(encodedValues, kysely, mapper);
461
- const insert = kysely.insertInto(getTableName(table)).values(processedValues);
462
-
463
- if (provider === "mssql") {
464
- return (
465
- insert
466
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
467
- .output(mapSelect(true, table, { tableName: "inserted" }) as any[])
468
- .compile()
469
- );
470
- }
471
-
472
- if (provider === "postgresql" || provider === "sqlite") {
473
- return insert
474
- .returning(mapSelect(true, table, { tableName: getTableName(table) }))
475
- .compile();
476
- }
477
-
478
- // For MySQL/other providers, return the insert query
479
- return insert.compile();
480
- },
481
-
482
- findMany<T extends AnyTable>(
483
- table: T,
484
- v: SimplifyFindOptions<FindManyOptions<T>>,
485
- ): CompiledQuery {
486
- let query = kysely.selectFrom(getTableName(table));
487
-
488
- const where = v.where;
489
- if (where) {
490
- query = query.where((eb) => buildWhere(where, eb, provider, mapper, table));
491
- }
492
-
493
- if (v.offset !== undefined) {
494
- query = query.offset(v.offset);
495
- }
496
-
497
- if (v.limit !== undefined) {
498
- query = provider === "mssql" ? query.top(v.limit) : query.limit(v.limit);
499
- }
500
-
501
- if (v.orderBy) {
502
- for (const [col, mode] of v.orderBy) {
503
- query = query.orderBy(fullSQLName(col, mapper), mode);
504
- }
505
- }
506
-
507
- const selectBuilder = extendSelect(v.select);
508
- const mappedSelect: string[] = [];
509
-
510
- // Process joins recursively to support nested joins
511
- const processJoins = (
512
- joins: CompiledJoin[] | undefined,
513
- parentTable: AnyTable,
514
- parentTableName: string,
515
- parentPath: string = "",
516
- ) => {
517
- for (const join of joins ?? []) {
518
- const { options: joinOptions, relation } = join;
519
-
520
- if (joinOptions === false) {
521
- continue;
522
- }
523
-
524
- const targetTable = relation.table;
525
- // Build the full path for this join (e.g., "author:inviter")
526
- const fullPath = parentPath ? `${parentPath}:${relation.name}` : relation.name;
527
- // SQL table alias uses underscores (e.g., "author_inviter")
528
- const joinName = fullPath.replace(/:/g, "_");
529
-
530
- // update select
531
- mappedSelect.push(
532
- ...mapSelect(joinOptions.select, targetTable, {
533
- relation: fullPath, // Use full path with colons for column aliases
534
- tableName: joinName, // Use underscore version for table name
535
- }),
536
- );
537
-
538
- query = query.leftJoin(`${getTableName(targetTable)} as ${joinName}`, (b) =>
539
- b.on((eb) => {
540
- const conditions = [];
541
- for (const [left, right] of relation.on) {
542
- // Foreign keys always use internal IDs
543
- // If the relation references an external ID column (any name), translate to "_internalId"
544
- const rightCol = targetTable.columns[right];
545
- const actualRight = rightCol?.role === "external-id" ? "_internalId" : right;
546
-
547
- conditions.push(
548
- eb(
549
- `${parentTableName}.${parentTable.columns[left].name}`,
550
- "=",
551
- eb.ref(`${joinName}.${targetTable.columns[actualRight].name}`),
552
- ),
553
- );
554
- }
555
-
556
- if (joinOptions.where) {
557
- conditions.push(buildWhere(joinOptions.where, eb, provider, mapper, targetTable));
558
- }
559
-
560
- return eb.and(conditions);
561
- }),
562
- );
563
-
564
- // Recursively process nested joins with the full path
565
- processJoins(joinOptions.join, targetTable, joinName, fullPath);
566
- }
567
- };
568
-
569
- processJoins(v.join, table, getTableName(table));
570
-
571
- const compiledSelect = selectBuilder.compile();
572
- mappedSelect.push(
573
- ...mapSelect(compiledSelect.result, table, { tableName: getTableName(table) }),
574
- );
575
-
576
- return query.select(mappedSelect).compile();
577
- },
578
-
579
- updateMany(
580
- table: AnyTable,
581
- v: {
582
- where?: Condition;
583
- set: Record<string, unknown>;
584
- },
585
- ): CompiledQuery {
586
- const encoded = encodeValues(v.set, table, false, provider);
587
- const processed = processReferenceSubqueries(encoded, kysely, mapper);
588
-
589
- // Automatically increment _version for optimistic concurrency control
590
- const versionCol = table.getVersionColumn();
591
- // Safe cast: we're building a SQL expression for incrementing the version
592
- processed[versionCol.name] = sql.raw(`COALESCE(${versionCol.name}, 0) + 1`) as unknown;
593
-
594
- let query = kysely.updateTable(getTableName(table)).set(processed);
595
- const { where } = v;
596
- if (where) {
597
- query = query.where((eb) => buildWhere(where, eb, provider, mapper, table));
598
- }
599
- return query.compile();
600
- },
601
-
602
- upsertCheck(table: AnyTable, where: Condition | undefined): CompiledQuery {
603
- const idColumn = table.getIdColumn();
604
- let query = kysely.selectFrom(getTableName(table)).select([`${idColumn.name} as id`]);
605
- if (where) {
606
- query = query.where((b) => buildWhere(where, b, provider, mapper, table));
607
- }
608
- return query.limit(1).compile();
609
- },
610
-
611
- upsertUpdate(
612
- table: AnyTable,
613
- update: Record<string, unknown>,
614
- where: Condition | undefined,
615
- top?: boolean,
616
- ): CompiledQuery {
617
- const encoded = encodeValues(update, table, false, provider);
618
- const processed = processReferenceSubqueries(encoded, kysely, mapper);
619
- let query = kysely.updateTable(getTableName(table)).set(processed);
620
- if (top) {
621
- query = query.top(1);
622
- }
623
- if (where) {
624
- query = query.where((b) => buildWhere(where, b, provider, mapper, table));
625
- }
626
- return query.compile();
627
- },
628
-
629
- upsertUpdateById(table: AnyTable, update: Record<string, unknown>, id: unknown): CompiledQuery {
630
- const idColumn = table.getIdColumn();
631
- const encoded = encodeValues(update, table, false, provider);
632
- const processed = processReferenceSubqueries(encoded, kysely, mapper);
633
- return kysely
634
- .updateTable(getTableName(table))
635
- .set(processed)
636
- .where(idColumn.name, "=", id)
637
- .compile();
638
- },
639
-
640
- createMany(table: AnyTable, values: Record<string, unknown>[]): CompiledQuery {
641
- const encodedValues = values.map((v) => encodeValues(v, table, true, provider));
642
- const processedValues = encodedValues.map((v) =>
643
- processReferenceSubqueries(v, kysely, mapper),
644
- );
645
- return kysely.insertInto(getTableName(table)).values(processedValues).compile();
646
- },
647
-
648
- deleteMany(table: AnyTable, { where }: { where?: Condition }): CompiledQuery {
649
- let query = kysely.deleteFrom(getTableName(table));
650
- if (where) {
651
- query = query.where((eb) => buildWhere(where, eb, provider, mapper, table));
652
- }
653
- return query.compile();
654
- },
655
-
656
- findById(table: AnyTable, idValue: unknown): CompiledQuery {
657
- const idColumn = table.getIdColumn();
658
- return kysely
659
- .selectFrom(getTableName(table))
660
- .select(mapSelect(true, table, { tableName: getTableName(table) }))
661
- .where(idColumn.name, "=", idValue)
662
- .limit(1)
663
- .compile();
664
- },
665
- };
666
- }