@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,93 @@
1
+ import { createSQLSerializer } from "../../query/serialize/create-sql-serializer.js";
2
+ import { encodeValues } from "../../query/value-encoding.js";
3
+ import { processReferenceSubqueries } from "./query/where-builder.js";
4
+
5
+ //#region src/adapters/generic-sql/uow-encoder.ts
6
+ /**
7
+ * Encoder class for Unit of Work mutation operations.
8
+ *
9
+ * Handles the complete transformation from application values to database-ready values
10
+ * in three clear steps:
11
+ * 1. Resolution - Resolve FragnoId/FragnoReference objects and generate defaults
12
+ * 2. Reference Processing - Create subqueries for external ID lookups
13
+ * 3. Serialization - Apply database-specific type conversions
14
+ *
15
+ * This class mirrors the UnitOfWorkDecoder pattern for symmetry.
16
+ */
17
+ var UnitOfWorkEncoder = class {
18
+ #serializer;
19
+ #db;
20
+ #mapper;
21
+ constructor(driverConfig, db, mapper) {
22
+ this.#serializer = createSQLSerializer(driverConfig);
23
+ this.#db = db;
24
+ this.#mapper = mapper;
25
+ }
26
+ /**
27
+ * Encode application values to database-ready format.
28
+ *
29
+ * This is the main entry point that handles all encoding steps:
30
+ * 1. **Resolution**: Transform ORM names to DB columns, resolve FragnoId/FragnoReference,
31
+ * generate defaults (CUIDs for IDs, etc.)
32
+ * 2. **Reference Processing**: Convert external ID strings to subqueries for internal ID lookup
33
+ * 3. **Serialization**: Apply database-specific conversions (Date → number for SQLite, etc.)
34
+ *
35
+ * @param options - Encoding options
36
+ * @param options.values - Application values to encode
37
+ * @param options.table - Table schema definition
38
+ * @param options.generateDefaults - Whether to generate default values for undefined columns
39
+ * @returns Database-ready values
40
+ *
41
+ * @example
42
+ * ```ts
43
+ * const encoded = encoder.encodeForDatabase({
44
+ * values: { userId: FragnoId(...), createdAt: new Date(), isActive: true },
45
+ * table: usersTable,
46
+ * generateDefaults: true
47
+ * });
48
+ * // For SQLite: { user_id: 456, created_at: 1705316400000, is_active: 1 }
49
+ * ```
50
+ */
51
+ encodeForDatabase(options) {
52
+ const processed = processReferenceSubqueries(encodeValues(options.values, options.table, options.generateDefaults), this.#db, this.#mapper);
53
+ return this.serializeValues(processed, options.table);
54
+ }
55
+ /**
56
+ * Serialize resolved values to database format.
57
+ *
58
+ * Applies database-specific type conversions:
59
+ * - SQLite: Date → number, boolean → 0/1, bigint → Buffer (or Number for reference columns)
60
+ * - PostgreSQL: Mostly pass-through (database handles types natively)
61
+ * - MySQL: Mostly pass-through
62
+ *
63
+ * @param values - Resolved values (after resolution and reference processing)
64
+ * @param table - The table schema definition
65
+ * @returns Serialized values ready for database driver
66
+ */
67
+ serializeValues(values, table) {
68
+ const result = {};
69
+ for (const [dbColumnName, value] of Object.entries(values)) {
70
+ const col = this.findColumnByDbName(table, dbColumnName);
71
+ if (!col) {
72
+ result[dbColumnName] = value;
73
+ continue;
74
+ }
75
+ result[dbColumnName] = this.#serializer.serialize(value, col);
76
+ }
77
+ return result;
78
+ }
79
+ /**
80
+ * Find a column definition by its database column name.
81
+ *
82
+ * @param table - The table to search
83
+ * @param dbColumnName - The database column name (e.g., "user_id")
84
+ * @returns The column definition or undefined if not found
85
+ */
86
+ findColumnByDbName(table, dbColumnName) {
87
+ for (const col of Object.values(table.columns)) if (col.name === dbColumnName) return col;
88
+ }
89
+ };
90
+
91
+ //#endregion
92
+ export { UnitOfWorkEncoder };
93
+ //# sourceMappingURL=uow-encoder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uow-encoder.js","names":["#serializer","#db","#mapper","result: Record<string, unknown>"],"sources":["../../../src/adapters/generic-sql/uow-encoder.ts"],"sourcesContent":["import type { AnyTable, AnyColumn } from \"../../schema/create\";\nimport type { DriverConfig } from \"./driver-config\";\nimport {\n createSQLSerializer,\n type SQLSerializer,\n} from \"../../query/serialize/create-sql-serializer\";\nimport { encodeValues } from \"../../query/value-encoding\";\nimport { processReferenceSubqueries } from \"./query/where-builder\";\nimport type { TableNameMapper } from \"../shared/table-name-mapper\";\nimport type { Kysely } from \"kysely\";\n\n/**\n * Encoder class for Unit of Work mutation operations.\n *\n * Handles the complete transformation from application values to database-ready values\n * in three clear steps:\n * 1. Resolution - Resolve FragnoId/FragnoReference objects and generate defaults\n * 2. Reference Processing - Create subqueries for external ID lookups\n * 3. Serialization - Apply database-specific type conversions\n *\n * This class mirrors the UnitOfWorkDecoder pattern for symmetry.\n */\nexport class UnitOfWorkEncoder {\n readonly #serializer: SQLSerializer;\n readonly #db: Kysely<any>; // eslint-disable-line @typescript-eslint/no-explicit-any\n readonly #mapper?: TableNameMapper;\n\n constructor(\n driverConfig: DriverConfig,\n db: Kysely<any>, // eslint-disable-line @typescript-eslint/no-explicit-any\n mapper?: TableNameMapper,\n ) {\n this.#serializer = createSQLSerializer(driverConfig);\n this.#db = db;\n this.#mapper = mapper;\n }\n\n /**\n * Encode application values to database-ready format.\n *\n * This is the main entry point that handles all encoding steps:\n * 1. **Resolution**: Transform ORM names to DB columns, resolve FragnoId/FragnoReference,\n * generate defaults (CUIDs for IDs, etc.)\n * 2. **Reference Processing**: Convert external ID strings to subqueries for internal ID lookup\n * 3. **Serialization**: Apply database-specific conversions (Date → number for SQLite, etc.)\n *\n * @param options - Encoding options\n * @param options.values - Application values to encode\n * @param options.table - Table schema definition\n * @param options.generateDefaults - Whether to generate default values for undefined columns\n * @returns Database-ready values\n *\n * @example\n * ```ts\n * const encoded = encoder.encodeForDatabase({\n * values: { userId: FragnoId(...), createdAt: new Date(), isActive: true },\n * table: usersTable,\n * generateDefaults: true\n * });\n * // For SQLite: { user_id: 456, created_at: 1705316400000, is_active: 1 }\n * ```\n */\n encodeForDatabase(options: {\n values: Record<string, unknown>;\n table: AnyTable;\n generateDefaults: boolean;\n }): Record<string, unknown> {\n // Step 1: Resolution - Resolve FragnoId/FragnoReference and generate defaults\n const resolved = encodeValues(options.values, options.table, options.generateDefaults);\n\n // Step 2: Reference Processing - Convert external IDs to subqueries\n const processed = processReferenceSubqueries(resolved, this.#db, this.#mapper);\n\n // Step 3: Serialization - Apply database-specific type conversions\n const serialized = this.serializeValues(processed, options.table);\n\n return serialized;\n }\n\n /**\n * Serialize resolved values to database format.\n *\n * Applies database-specific type conversions:\n * - SQLite: Date → number, boolean → 0/1, bigint → Buffer (or Number for reference columns)\n * - PostgreSQL: Mostly pass-through (database handles types natively)\n * - MySQL: Mostly pass-through\n *\n * @param values - Resolved values (after resolution and reference processing)\n * @param table - The table schema definition\n * @returns Serialized values ready for database driver\n */\n private serializeValues(\n values: Record<string, unknown>,\n table: AnyTable,\n ): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const [dbColumnName, value] of Object.entries(values)) {\n // Find the column definition by database column name\n const col = this.findColumnByDbName(table, dbColumnName);\n\n if (!col) {\n // Not a regular column (might be a special value like sql.raw())\n // Pass through as-is\n result[dbColumnName] = value;\n continue;\n }\n\n // Serialize the value using the column definition and database type\n result[dbColumnName] = this.#serializer.serialize(value, col);\n }\n\n return result;\n }\n\n /**\n * Find a column definition by its database column name.\n *\n * @param table - The table to search\n * @param dbColumnName - The database column name (e.g., \"user_id\")\n * @returns The column definition or undefined if not found\n */\n private findColumnByDbName(table: AnyTable, dbColumnName: string): AnyColumn | undefined {\n for (const col of Object.values(table.columns)) {\n if (col.name === dbColumnName) {\n return col;\n }\n }\n return undefined;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAsBA,IAAa,oBAAb,MAA+B;CAC7B,CAASA;CACT,CAASC;CACT,CAASC;CAET,YACE,cACA,IACA,QACA;AACA,QAAKF,aAAc,oBAAoB,aAAa;AACpD,QAAKC,KAAM;AACX,QAAKC,SAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BjB,kBAAkB,SAIU;EAK1B,MAAM,YAAY,2BAHD,aAAa,QAAQ,QAAQ,QAAQ,OAAO,QAAQ,iBAAiB,EAG/B,MAAKD,IAAK,MAAKC,OAAQ;AAK9E,SAFmB,KAAK,gBAAgB,WAAW,QAAQ,MAAM;;;;;;;;;;;;;;CAiBnE,AAAQ,gBACN,QACA,OACyB;EACzB,MAAMC,SAAkC,EAAE;AAE1C,OAAK,MAAM,CAAC,cAAc,UAAU,OAAO,QAAQ,OAAO,EAAE;GAE1D,MAAM,MAAM,KAAK,mBAAmB,OAAO,aAAa;AAExD,OAAI,CAAC,KAAK;AAGR,WAAO,gBAAgB;AACvB;;AAIF,UAAO,gBAAgB,MAAKH,WAAY,UAAU,OAAO,IAAI;;AAG/D,SAAO;;;;;;;;;CAUT,AAAQ,mBAAmB,OAAiB,cAA6C;AACvF,OAAK,MAAM,OAAO,OAAO,OAAO,MAAM,QAAQ,CAC5C,KAAI,IAAI,SAAS,aACf,QAAO"}
@@ -1,10 +1,7 @@
1
- import { AnySchema } from "../../schema/create.js";
2
- import { Migrator } from "../../migration-engine/create.js";
1
+ import { TableNameMapper } from "../shared/table-name-mapper.js";
2
+ import { DatabaseAdapter } from "../adapters.js";
3
+ import { GenericSQLAdapter, GenericSQLOptions, UnitOfWorkConfig } from "../generic-sql/generic-sql-adapter.js";
3
4
  import { SQLProvider } from "../../shared/providers.js";
4
- import { AbstractQuery } from "../../query/query.js";
5
- import { DatabaseAdapter, fragnoDatabaseAdapterNameFakeSymbol, fragnoDatabaseAdapterVersionFakeSymbol } from "../adapters.js";
6
- import { TableNameMapper } from "./kysely-shared.js";
7
- import { KyselyUOWConfig } from "./kysely-query.js";
8
5
  import { Kysely } from "kysely";
9
6
 
10
7
  //#region src/adapters/kysely/kysely-adapter.d.ts
@@ -13,17 +10,9 @@ interface KyselyConfig {
13
10
  db: KyselyAny | (() => KyselyAny | Promise<KyselyAny>);
14
11
  provider: SQLProvider;
15
12
  }
16
- declare class KyselyAdapter implements DatabaseAdapter<KyselyUOWConfig> {
17
- #private;
18
- constructor(config: KyselyConfig);
19
- get [fragnoDatabaseAdapterNameFakeSymbol](): string;
20
- get [fragnoDatabaseAdapterVersionFakeSymbol](): number;
21
- close(): Promise<void>;
13
+ declare class KyselyAdapter extends GenericSQLAdapter implements DatabaseAdapter<UnitOfWorkConfig> {
14
+ constructor(options: GenericSQLOptions);
22
15
  createTableNameMapper(namespace: string): TableNameMapper;
23
- createQueryEngine<T extends AnySchema>(schema: T, namespace: string): AbstractQuery<T, KyselyUOWConfig>;
24
- isConnectionHealthy(): Promise<boolean>;
25
- createMigrationEngine(schema: AnySchema, namespace: string): Migrator;
26
- getSchemaVersion(namespace: string): Promise<string | undefined>;
27
16
  }
28
17
  //#endregion
29
18
  export { KyselyAdapter, KyselyConfig };
@@ -1 +1 @@
1
- {"version":3,"file":"kysely-adapter.d.ts","names":[],"sources":["../../../src/adapters/kysely/kysely-adapter.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;KAoBK,SAAA,GAAY;UAEA,YAAA;MACX,mBAAmB,YAAY,QAAQ;EAHxC,QAAA,EAIO,WAJE;AAEd;AACM,cAIO,aAAA,YAAyB,eAJhC,CAIgD,eAJhD,CAAA,CAAA;EAAmB,CAAA,OAAA;EAAoB,WAAA,CAAA,MAAA,EASvB,YATuB;EAAR,KAc9B,mCAAA,GAd8B,EAAA,MAAA;EACzB,KAiBL,sCAAA,GAjBK,EAAA,MAAA;EAAW,KAAA,CAAA,CAAA,EAqBN,OArBM,CAAA,IAAA,CAAA;EAGV,qBAAc,CAAA,SAAA,EAAA,MAAA,CAAA,EAkBH,eAlBG;EAA2B,iBAAA,CAAA,UA0BxB,SA1BwB,CAAA,CAAA,MAAA,EA2B1C,CA3B0C,EAAA,SAAA,EAAA,MAAA,CAAA,EA6BjD,aA7BiD,CA6BnC,CA7BmC,EA6BhC,eA7BgC,CAAA;EAKhC,mBAAA,CAAA,CAAA,EAwCS,OAxCT,CAAA,OAAA,CAAA;EAKf,qBAAA,CAAA,MAAA,EA+CyB,SA/CzB,EAAA,SAAA,EAAA,MAAA,CAAA,EA+CwD,QA/CxD;EAIA,gBAAA,CAAA,SAAA,EAAA,MAAA,CAAA,EAqKsC,OArKtC,CAAA,MAAA,GAAA,SAAA,CAAA"}
1
+ {"version":3,"file":"kysely-adapter.d.ts","names":[],"sources":["../../../src/adapters/kysely/kysely-adapter.ts"],"sourcesContent":[],"mappings":";;;;;;;KAWK,SAAA,GAAY;UAEA,YAAA;MACX,mBAAmB,YAAY,QAAQ;EAHxC,QAAA,EAIO,WAJE;AAEd;AACM,cAIO,aAAA,SAAsB,iBAAA,YAA6B,eAJ1D,CAI0E,gBAJ1E,CAAA,CAAA;EAAmB,WAAA,CAAA,OAAA,EAKF,iBALE;EAAoB,qBAAA,CAAA,SAAA,EAAA,MAAA,CAAA,EAKL,eALK"}
@@ -1,169 +1,16 @@
1
- import { fragnoDatabaseAdapterNameFakeSymbol, fragnoDatabaseAdapterVersionFakeSymbol } from "../adapters.js";
2
- import { SETTINGS_TABLE_NAME } from "../../shared/settings-schema.js";
3
- import { createMigrator } from "../../migration-engine/create.js";
4
- import { execute, preprocessOperations } from "./migration/execute.js";
5
- import { createTableNameMapper } from "./kysely-shared.js";
6
- import { fromKysely } from "./kysely-query.js";
7
- import { createKyselyConnectionPool } from "./kysely-connection-pool.js";
8
- import { sql } from "kysely";
9
- import { createHash } from "node:crypto";
1
+ import { createTableNameMapper } from "../shared/table-name-mapper.js";
2
+ import { GenericSQLAdapter } from "../generic-sql/generic-sql-adapter.js";
3
+ import "kysely";
10
4
 
11
5
  //#region src/adapters/kysely/kysely-adapter.ts
12
- var KyselyAdapter = class {
13
- #connectionPool;
14
- #provider;
15
- #schemaNamespaceMap = /* @__PURE__ */ new WeakMap();
16
- constructor(config) {
17
- this.#connectionPool = createKyselyConnectionPool(config.db);
18
- this.#provider = config.provider;
19
- }
20
- get [fragnoDatabaseAdapterNameFakeSymbol]() {
21
- return "kysely";
22
- }
23
- get [fragnoDatabaseAdapterVersionFakeSymbol]() {
24
- return 0;
25
- }
26
- async close() {
27
- await this.#connectionPool.close();
6
+ var KyselyAdapter = class extends GenericSQLAdapter {
7
+ constructor(options) {
8
+ super(options);
28
9
  }
29
10
  createTableNameMapper(namespace) {
30
11
  return createTableNameMapper(namespace);
31
12
  }
32
- createQueryEngine(schema, namespace) {
33
- this.#schemaNamespaceMap.set(schema, namespace);
34
- const mapper = namespace ? createTableNameMapper(namespace) : void 0;
35
- return fromKysely(schema, this.#connectionPool, this.#provider, mapper, void 0, this.#schemaNamespaceMap);
36
- }
37
- async isConnectionHealthy() {
38
- const conn = await this.#connectionPool.connect();
39
- try {
40
- return (await conn.db.executeQuery(sql`SELECT 1 as healthy`.compile(conn.db))).rows[0]["healthy"] === 1;
41
- } catch {
42
- return false;
43
- } finally {
44
- await conn.release();
45
- }
46
- }
47
- createMigrationEngine(schema, namespace) {
48
- const mapper = namespace ? createTableNameMapper(namespace) : void 0;
49
- const preprocessMigrationOperations = (operations, db) => {
50
- let preprocessed = preprocessOperations(operations, {
51
- db,
52
- provider: this.#provider
53
- });
54
- if (this.#provider === "mysql") {
55
- preprocessed.unshift({
56
- type: "custom",
57
- sql: "SET FOREIGN_KEY_CHECKS = 0"
58
- });
59
- preprocessed.push({
60
- type: "custom",
61
- sql: "SET FOREIGN_KEY_CHECKS = 1"
62
- });
63
- }
64
- return preprocessed;
65
- };
66
- const toExecutableNodes = (operations, db) => {
67
- const onCustomNode = (node, db$1) => {
68
- const statement = sql.raw(node["sql"]);
69
- return {
70
- compile() {
71
- return statement.compile(db$1);
72
- },
73
- execute() {
74
- return statement.execute(db$1);
75
- }
76
- };
77
- };
78
- const config = {
79
- db,
80
- provider: this.#provider
81
- };
82
- return operations.flatMap((op) => execute(op, config, (node) => onCustomNode(node, db), mapper));
83
- };
84
- return createMigrator({
85
- schema,
86
- executor: async (operations) => {
87
- const conn = await this.#connectionPool.connect();
88
- try {
89
- if (this.#provider === "sqlite") await sql.raw("PRAGMA defer_foreign_keys = ON").execute(conn.db);
90
- await conn.db.transaction().execute(async (tx) => {
91
- const nodes = toExecutableNodes(preprocessMigrationOperations(operations, tx), tx);
92
- for (const node of nodes) try {
93
- await node.execute();
94
- } catch (e) {
95
- console.error("failed at", node.compile(), e);
96
- throw e;
97
- }
98
- });
99
- } finally {
100
- await conn.release();
101
- }
102
- },
103
- sql: { toSql: (operations) => {
104
- const parts = [];
105
- if (this.#provider === "sqlite") parts.push("PRAGMA defer_foreign_keys = ON;");
106
- const db = this.#connectionPool.getDatabaseSync();
107
- const compiled = toExecutableNodes(preprocessMigrationOperations(operations, db), db).map((node) => `${node.compile().sql};`);
108
- parts.push(...compiled);
109
- return parts.join("\n\n");
110
- } },
111
- settings: {
112
- getVersion: async () => {
113
- const conn = await this.#connectionPool.connect();
114
- try {
115
- const v = await createSettingsManager(conn.db, namespace).get(`schema_version`);
116
- return v ? parseInt(v) : 0;
117
- } finally {
118
- await conn.release();
119
- }
120
- },
121
- updateSettingsInMigration: async (fromVersion, toVersion) => {
122
- const conn = await this.#connectionPool.connect();
123
- try {
124
- const manager = createSettingsManager(conn.db, namespace);
125
- return [{
126
- type: "custom",
127
- sql: fromVersion === 0 ? manager.insert(`schema_version`, toVersion.toString()) : manager.update(`schema_version`, toVersion.toString())
128
- }];
129
- } finally {
130
- await conn.release();
131
- }
132
- }
133
- }
134
- });
135
- }
136
- async getSchemaVersion(namespace) {
137
- const conn = await this.#connectionPool.connect();
138
- try {
139
- return await createSettingsManager(conn.db, namespace).get(`schema_version`);
140
- } finally {
141
- await conn.release();
142
- }
143
- }
144
13
  };
145
- function createSettingsManager(db, namespace) {
146
- const tableName = SETTINGS_TABLE_NAME;
147
- return {
148
- async get(key) {
149
- try {
150
- return (await db.selectFrom(tableName).where("key", "=", sql.lit(`${namespace}.${key}`)).select(["value"]).executeTakeFirstOrThrow()).value;
151
- } catch {
152
- return;
153
- }
154
- },
155
- insert(key, value) {
156
- return db.insertInto(tableName).values({
157
- id: sql.lit(createHash("md5").update(`${namespace}.${key}`).digest("base64url").replace(/=/g, "")),
158
- key: sql.lit(`${namespace}.${key}`),
159
- value: sql.lit(value)
160
- }).compile().sql;
161
- },
162
- update(key, value) {
163
- return db.updateTable(tableName).set({ value: sql.lit(value) }).where("key", "=", sql.lit(`${namespace}.${key}`)).compile().sql;
164
- }
165
- };
166
- }
167
14
 
168
15
  //#endregion
169
16
  export { KyselyAdapter };
@@ -1 +1 @@
1
- {"version":3,"file":"kysely-adapter.js","names":["#connectionPool","#provider","#schemaNamespaceMap","db","config: KyselyConfig","parts: string[]"],"sources":["../../../src/adapters/kysely/kysely-adapter.ts"],"sourcesContent":["import { sql, type Kysely } from \"kysely\";\nimport type { SQLProvider } from \"../../shared/providers\";\nimport {\n fragnoDatabaseAdapterNameFakeSymbol,\n fragnoDatabaseAdapterVersionFakeSymbol,\n type DatabaseAdapter,\n} from \"../adapters\";\nimport { createMigrator, type Migrator } from \"../../migration-engine/create\";\nimport type { AnySchema } from \"../../schema/create\";\nimport type { CustomOperation, MigrationOperation } from \"../../migration-engine/shared\";\nimport { execute, preprocessOperations } from \"./migration/execute\";\nimport type { AbstractQuery } from \"../../query/query\";\nimport { fromKysely, type KyselyUOWConfig } from \"./kysely-query\";\nimport { createTableNameMapper } from \"./kysely-shared\";\nimport { createHash } from \"node:crypto\";\nimport { SETTINGS_TABLE_NAME } from \"../../shared/settings-schema\";\nimport type { ConnectionPool } from \"../../shared/connection-pool\";\nimport { createKyselyConnectionPool } from \"./kysely-connection-pool\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype KyselyAny = Kysely<any>;\n\nexport interface KyselyConfig {\n db: KyselyAny | (() => KyselyAny | Promise<KyselyAny>);\n provider: SQLProvider;\n}\n\nexport class KyselyAdapter implements DatabaseAdapter<KyselyUOWConfig> {\n #connectionPool: ConnectionPool<KyselyAny>;\n #provider: SQLProvider;\n #schemaNamespaceMap = new WeakMap<AnySchema, string>();\n\n constructor(config: KyselyConfig) {\n this.#connectionPool = createKyselyConnectionPool(config.db);\n this.#provider = config.provider;\n }\n\n get [fragnoDatabaseAdapterNameFakeSymbol](): string {\n return \"kysely\";\n }\n\n get [fragnoDatabaseAdapterVersionFakeSymbol](): number {\n return 0;\n }\n\n async close(): Promise<void> {\n await this.#connectionPool.close();\n }\n\n createTableNameMapper(namespace: string) {\n return createTableNameMapper(namespace);\n }\n\n createQueryEngine<T extends AnySchema>(\n schema: T,\n namespace: string,\n ): AbstractQuery<T, KyselyUOWConfig> {\n // Register schema-namespace mapping\n this.#schemaNamespaceMap.set(schema, namespace);\n\n // Only create mapper if namespace is non-empty\n const mapper = namespace ? createTableNameMapper(namespace) : undefined;\n return fromKysely(\n schema,\n this.#connectionPool,\n this.#provider,\n mapper,\n undefined,\n this.#schemaNamespaceMap,\n );\n }\n\n async isConnectionHealthy(): Promise<boolean> {\n const conn = await this.#connectionPool.connect();\n try {\n const result = await conn.db.executeQuery(sql`SELECT 1 as healthy`.compile(conn.db));\n return (result.rows[0] as Record<string, unknown>)[\"healthy\"] === 1;\n } catch {\n return false;\n } finally {\n await conn.release();\n }\n }\n\n createMigrationEngine(schema: AnySchema, namespace: string): Migrator {\n const mapper = namespace ? createTableNameMapper(namespace) : undefined;\n\n const preprocessMigrationOperations = (operations: MigrationOperation[], db: KyselyAny) => {\n // Preprocess operations using the provided db instance\n const config: KyselyConfig = {\n db,\n provider: this.#provider,\n };\n let preprocessed = preprocessOperations(operations, config);\n\n if (this.#provider === \"mysql\") {\n preprocessed.unshift({ type: \"custom\", sql: \"SET FOREIGN_KEY_CHECKS = 0\" });\n preprocessed.push({ type: \"custom\", sql: \"SET FOREIGN_KEY_CHECKS = 1\" });\n }\n\n return preprocessed;\n };\n\n // Convert operations to executable nodes bound to specific db instance\n const toExecutableNodes = (operations: MigrationOperation[], db: KyselyAny) => {\n const onCustomNode = (node: CustomOperation, db: KyselyAny) => {\n const statement = sql.raw(node[\"sql\"] as string);\n\n return {\n compile() {\n return statement.compile(db);\n },\n execute() {\n return statement.execute(db);\n },\n };\n };\n\n const config: KyselyConfig = { db, provider: this.#provider };\n return operations.flatMap((op) =>\n execute(op, config, (node) => onCustomNode(node, db), mapper),\n );\n };\n\n const migrator = createMigrator({\n schema,\n executor: async (operations) => {\n const conn = await this.#connectionPool.connect();\n try {\n // For SQLite, execute PRAGMA defer_foreign_keys BEFORE transaction\n if (this.#provider === \"sqlite\") {\n await sql.raw(\"PRAGMA defer_foreign_keys = ON\").execute(conn.db);\n }\n\n await conn.db.transaction().execute(async (tx) => {\n // Use the transaction instance for both preprocessing and execution\n const preprocessed = preprocessMigrationOperations(operations, tx);\n const nodes = toExecutableNodes(preprocessed, tx);\n for (const node of nodes) {\n try {\n await node.execute();\n } catch (e) {\n console.error(\"failed at\", node.compile(), e);\n throw e;\n }\n }\n });\n } finally {\n await conn.release();\n }\n },\n sql: {\n toSql: (operations) => {\n const parts: string[] = [];\n\n // Add SQLite PRAGMA at the beginning\n if (this.#provider === \"sqlite\") {\n parts.push(\"PRAGMA defer_foreign_keys = ON;\");\n }\n\n // Use getDatabaseSync for SQL generation (doesn't execute, just builds SQL strings)\n const db = this.#connectionPool.getDatabaseSync();\n const preprocessed = preprocessMigrationOperations(operations, db);\n const nodes = toExecutableNodes(preprocessed, db);\n const compiled = nodes.map((node) => `${node.compile().sql};`);\n\n parts.push(...compiled);\n\n return parts.join(\"\\n\\n\");\n },\n },\n\n settings: {\n getVersion: async () => {\n const conn = await this.#connectionPool.connect();\n try {\n const manager = createSettingsManager(conn.db, namespace);\n const v = await manager.get(`schema_version`);\n return v ? parseInt(v) : 0;\n } finally {\n await conn.release();\n }\n },\n updateSettingsInMigration: async (fromVersion, toVersion) => {\n const conn = await this.#connectionPool.connect();\n try {\n const manager = createSettingsManager(conn.db, namespace);\n return [\n {\n type: \"custom\",\n sql:\n fromVersion === 0\n ? manager.insert(`schema_version`, toVersion.toString())\n : manager.update(`schema_version`, toVersion.toString()),\n },\n ];\n } finally {\n await conn.release();\n }\n },\n },\n });\n\n return migrator;\n }\n\n async getSchemaVersion(namespace: string): Promise<string | undefined> {\n const conn = await this.#connectionPool.connect();\n try {\n const manager = createSettingsManager(conn.db, namespace);\n return await manager.get(`schema_version`);\n } finally {\n await conn.release();\n }\n }\n}\n\nfunction createSettingsManager(db: KyselyAny, namespace: string) {\n // Settings table is never namespaced, but keys include namespace prefix\n const tableName = SETTINGS_TABLE_NAME;\n\n return {\n async get(key: string): Promise<string | undefined> {\n try {\n const result = await db\n .selectFrom(tableName)\n .where(\"key\", \"=\", sql.lit(`${namespace}.${key}`))\n .select([\"value\"])\n .executeTakeFirstOrThrow();\n return result.value as string;\n } catch {\n return;\n }\n },\n\n insert(key: string, value: string) {\n return db\n .insertInto(tableName)\n .values({\n id: sql.lit(\n createHash(\"md5\").update(`${namespace}.${key}`).digest(\"base64url\").replace(/=/g, \"\"),\n ),\n key: sql.lit(`${namespace}.${key}`),\n value: sql.lit(value),\n })\n .compile().sql;\n },\n\n update(key: string, value: string) {\n return db\n .updateTable(tableName)\n .set({\n value: sql.lit(value),\n })\n .where(\"key\", \"=\", sql.lit(`${namespace}.${key}`))\n .compile().sql;\n },\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"kysely-adapter.js","names":[],"sources":["../../../src/adapters/kysely/kysely-adapter.ts"],"sourcesContent":["import { type Kysely } from \"kysely\";\nimport type { SQLProvider } from \"../../shared/providers\";\nimport { type DatabaseAdapter } from \"../adapters\";\nimport { createTableNameMapper } from \"../shared/table-name-mapper\";\nimport {\n GenericSQLAdapter,\n type GenericSQLOptions,\n type UnitOfWorkConfig,\n} from \"../generic-sql/generic-sql-adapter\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype KyselyAny = Kysely<any>;\n\nexport interface KyselyConfig {\n db: KyselyAny | (() => KyselyAny | Promise<KyselyAny>);\n provider: SQLProvider;\n}\n\nexport class KyselyAdapter extends GenericSQLAdapter implements DatabaseAdapter<UnitOfWorkConfig> {\n constructor(options: GenericSQLOptions) {\n super(options);\n }\n\n createTableNameMapper(namespace: string) {\n return createTableNameMapper(namespace);\n }\n}\n"],"mappings":";;;;;AAkBA,IAAa,gBAAb,cAAmC,kBAA+D;CAChG,YAAY,SAA4B;AACtC,QAAM,QAAQ;;CAGhB,sBAAsB,WAAmB;AACvC,SAAO,sBAAsB,UAAU"}
@@ -1,13 +1,18 @@
1
- import { UnitOfWork } from "../../query/unit-of-work.js";
2
- import { parseDrizzle } from "./shared.js";
3
- import { createDrizzleUOWCompiler } from "./drizzle-uow-compiler.js";
4
- import { executeDrizzleMutationPhase, executeDrizzleRetrievalPhase } from "./drizzle-uow-executor.js";
5
- import { createDrizzleUOWDecoder } from "./drizzle-uow-decoder.js";
1
+ import { UnitOfWork } from "../../query/unit-of-work/unit-of-work.js";
6
2
 
7
- //#region src/adapters/drizzle/drizzle-query.ts
3
+ //#region src/adapters/shared/from-unit-of-work-compiler.ts
8
4
  /**
9
- * Special builder for updateMany operations that captures configuration
5
+ * Type guard to check if a query is a CompiledMutation
10
6
  */
7
+ function isCompiledMutation(query) {
8
+ return query !== null && typeof query === "object" && "expectedAffectedRows" in query && "query" in query;
9
+ }
10
+ /**
11
+ * Type guard to check if a record has an id field
12
+ */
13
+ function hasIdField(record) {
14
+ return record !== null && typeof record === "object" && "id" in record;
15
+ }
11
16
  var UpdateManySpecialBuilder = class {
12
17
  #indexName;
13
18
  #condition;
@@ -30,73 +35,48 @@ var UpdateManySpecialBuilder = class {
30
35
  }
31
36
  };
32
37
  /**
33
- * Creates a Drizzle-based query engine for the given schema.
38
+ * Creates a generic SQL-based query engine for the given schema using a UnitOfWorkFactory.
34
39
  *
35
- * This is the main entry point for creating a database query interface using Drizzle.
40
+ * This is the main entry point for creating a database query interface using a Unit of Work compiler.
36
41
  * It uses a compiler-based architecture where queries are compiled to SQL and then executed,
37
42
  * enabling features like SQL snapshot testing.
38
43
  *
39
44
  * @param schema - The database schema definition
40
- * @param pool - Connection pool for acquiring database connections
41
- * @param provider - SQL provider (sqlite, mysql, postgresql)
42
- * @param mapper - Optional table name mapper for namespace prefixing
43
- * @param uowConfig - Optional UOW configuration
44
- * @param schemaNamespaceMap - Optional WeakMap for schema-to-namespace lookups
45
- * @returns An AbstractQuery instance for performing database operations
45
+ * @param factory - Factory containing compiler, executor, decoder, and optional configuration
46
+ * @returns An SimpleQueryInterface instance for performing database operations
46
47
  *
47
48
  * @example
48
49
  * ```ts
49
- * const pool = createSimpleConnectionPool(drizzle);
50
- * const queryEngine = fromDrizzle(mySchema, pool, 'postgresql');
50
+ * const operationCompiler = new GenericSQLUOWOperationCompiler(driverConfig);
51
+ * const factory: UnitOfWorkFactory = {
52
+ * compiler: createUOWCompilerFromOperationCompiler(operationCompiler),
53
+ * executor: createExecutor(sqlDriver),
54
+ * decoder: createKyselyUOWDecoder(driverConfig.databaseType),
55
+ * };
56
+ * const queryEngine = fromUnitOfWorkCompiler(mySchema, factory);
51
57
  *
52
- * const uow = queryEngine.createUnitOfWork('myOperation');
58
+ * const users = await queryEngine.find('users', (b) =>
59
+ * b.whereIndex('age').where((eb) => eb('age', '>', 18))
60
+ * );
53
61
  * ```
54
62
  */
55
- function fromDrizzle(schema, pool, provider, mapper, uowConfig, schemaNamespaceMap) {
63
+ function fromUnitOfWorkCompiler(schema, factory) {
64
+ const { compiler, executor, decoder, uowConfig, schemaNamespaceMap } = factory;
56
65
  function createUOW(opts) {
57
- const uowCompiler = createDrizzleUOWCompiler(pool, provider, mapper);
58
- const executor = {
59
- async executeRetrievalPhase(retrievalBatch) {
60
- if (opts.config?.dryRun) return retrievalBatch.map(() => ({
61
- rows: [],
62
- affectedRows: 0
63
- }));
64
- const conn = await pool.connect();
65
- try {
66
- const db = parseDrizzle(conn.db)[0];
67
- return await executeDrizzleRetrievalPhase(db, retrievalBatch, provider);
68
- } finally {
69
- await conn.release();
70
- }
71
- },
72
- async executeMutationPhase(mutationBatch) {
73
- if (opts.config?.dryRun) return {
74
- success: true,
75
- createdInternalIds: mutationBatch.map(() => null)
76
- };
77
- const conn = await pool.connect();
78
- try {
79
- const db = parseDrizzle(conn.db)[0];
80
- return await executeDrizzleMutationPhase(db, mutationBatch, provider);
81
- } finally {
82
- await conn.release();
83
- }
84
- }
85
- };
86
- const decoder = createDrizzleUOWDecoder(provider);
87
66
  const { onQuery,...restUowConfig } = opts.config ?? {};
88
- return new UnitOfWork(schema, uowCompiler, executor, decoder, opts.name, {
67
+ return new UnitOfWork(compiler, executor, decoder, opts.name, {
89
68
  ...restUowConfig,
90
- onQuery: (query) => {
91
- const actualQuery = query && typeof query === "object" && "query" in query ? query.query : query;
92
- opts.config?.onQuery?.(actualQuery);
93
- }
94
- }, schemaNamespaceMap);
69
+ onQuery: onQuery ? (query) => {
70
+ onQuery(isCompiledMutation(query) ? query.query : query);
71
+ } : void 0
72
+ }, schemaNamespaceMap).forSchema(schema);
95
73
  }
96
74
  return {
97
75
  async find(tableName, builderFn) {
98
- const [result] = await createUOW({ config: uowConfig }).find(tableName, builderFn).executeRetrieve();
99
- return result;
76
+ const uow = createUOW({ config: uowConfig });
77
+ uow.find(tableName, builderFn);
78
+ const [result] = await uow.executeRetrieve();
79
+ return result ?? [];
100
80
  },
101
81
  async findWithCursor(tableName, builderFn) {
102
82
  const [result] = await createUOW({ config: uowConfig }).findWithCursor(tableName, builderFn).executeRetrieve();
@@ -143,13 +123,16 @@ function fromDrizzle(schema, pool, provider, mapper, uowConfig, schemaNamespaceM
143
123
  if (!setValues) throw new Error("set() must be called in updateMany");
144
124
  const findUow = createUOW({ config: uowConfig });
145
125
  findUow.find(tableName, (b) => {
146
- if (condition) return b.whereIndex(indexName, condition);
126
+ if (condition !== void 0 && condition !== null) return b.whereIndex(indexName, condition);
147
127
  return b.whereIndex(indexName);
148
128
  });
149
129
  const [records] = await findUow.executeRetrieve();
150
130
  if (!records || records.length === 0) return;
151
131
  const updateUow = createUOW({ config: uowConfig });
152
- for (const record of records) updateUow.update(tableName, record.id, (b) => b.set(setValues));
132
+ for (const record of records) {
133
+ if (!hasIdField(record)) throw new Error("Record missing id field");
134
+ updateUow.update(tableName, record.id, (b) => b.set(setValues));
135
+ }
153
136
  const { success } = await updateUow.executeMutations();
154
137
  if (!success) throw new Error("Failed to update records (version conflict)");
155
138
  },
@@ -165,7 +148,10 @@ function fromDrizzle(schema, pool, provider, mapper, uowConfig, schemaNamespaceM
165
148
  const [records] = await findUow.executeRetrieve();
166
149
  if (!records || records.length === 0) return;
167
150
  const deleteUow = createUOW({ config: uowConfig });
168
- for (const record of records) deleteUow.delete(tableName, record.id);
151
+ for (const record of records) {
152
+ if (!hasIdField(record)) throw new Error("Record missing id field");
153
+ deleteUow.delete(tableName, record.id);
154
+ }
169
155
  const { success } = await deleteUow.executeMutations();
170
156
  if (!success) throw new Error("Failed to delete records (version conflict)");
171
157
  },
@@ -182,5 +168,5 @@ function fromDrizzle(schema, pool, provider, mapper, uowConfig, schemaNamespaceM
182
168
  }
183
169
 
184
170
  //#endregion
185
- export { fromDrizzle };
186
- //# sourceMappingURL=drizzle-query.js.map
171
+ export { fromUnitOfWorkCompiler };
172
+ //# sourceMappingURL=from-unit-of-work-compiler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"from-unit-of-work-compiler.js","names":["#indexName","#condition","#setValues"],"sources":["../../../src/adapters/shared/from-unit-of-work-compiler.ts"],"sourcesContent":["import type { SimpleQueryInterface, TableToUpdateValues } from \"../../query/simple-query-interface\";\nimport type { AnySchema, AnyTable, FragnoId } from \"../../schema/create\";\nimport type {\n CompiledMutation,\n UOWCompiler,\n UOWDecoder,\n UOWExecutor,\n ValidIndexName,\n} from \"../../query/unit-of-work/unit-of-work\";\nimport { UnitOfWork } from \"../../query/unit-of-work/unit-of-work\";\nimport type { CursorResult } from \"../../query/cursor\";\nimport type { CompiledQuery } from \"../../sql-driver/sql-driver\";\n\n/**\n * Configuration options for creating a Unit of Work with generic SQL\n */\nexport interface UnitOfWorkConfig {\n /**\n * Optional callback to receive compiled SQL queries for logging/debugging\n * This callback is invoked for each query as it's compiled\n */\n onQuery?: (query: CompiledQuery) => void;\n /**\n * If true, the query will not be executed and the query will be returned. Not respected for UOWs\n * since those have to be manually executed.\n */\n dryRun?: boolean;\n}\n\n/**\n * Factory interface for creating Unit of Work instances\n */\nexport interface UnitOfWorkFactory {\n /**\n * UOW compiler for compiling operations to SQL\n */\n compiler: UOWCompiler<CompiledQuery>;\n /**\n * UOW executor for running compiled queries\n */\n executor: UOWExecutor<CompiledQuery, unknown>;\n /**\n * UOW decoder for transforming raw results\n */\n decoder: UOWDecoder<unknown>;\n /**\n * Optional UOW configuration\n */\n uowConfig?: UnitOfWorkConfig;\n /**\n * Optional WeakMap for schema-to-namespace lookups\n */\n schemaNamespaceMap?: WeakMap<AnySchema, string>;\n}\n\n/**\n * Type guard to check if a query is a CompiledMutation\n */\nfunction isCompiledMutation(query: unknown): query is CompiledMutation<CompiledQuery> {\n return (\n query !== null &&\n typeof query === \"object\" &&\n \"expectedAffectedRows\" in query &&\n \"query\" in query\n );\n}\n\n/**\n * Type guard to check if a record has an id field\n */\nfunction hasIdField(record: unknown): record is { id: string | FragnoId } {\n return record !== null && typeof record === \"object\" && \"id\" in record;\n}\n\nclass UpdateManySpecialBuilder<TTable extends AnyTable> {\n #indexName?: ValidIndexName<TTable>;\n #condition?: unknown;\n #setValues?: TableToUpdateValues<TTable>;\n\n whereIndex<TIndexName extends ValidIndexName<TTable>>(\n indexName: TIndexName,\n condition?: unknown,\n ): this {\n this.#indexName = indexName;\n this.#condition = condition;\n return this;\n }\n\n set(values: TableToUpdateValues<TTable>): this {\n this.#setValues = values;\n return this;\n }\n\n getConfig() {\n return {\n indexName: this.#indexName,\n condition: this.#condition,\n setValues: this.#setValues,\n };\n }\n}\n\n/**\n * Creates a generic SQL-based query engine for the given schema using a UnitOfWorkFactory.\n *\n * This is the main entry point for creating a database query interface using a Unit of Work compiler.\n * It uses a compiler-based architecture where queries are compiled to SQL and then executed,\n * enabling features like SQL snapshot testing.\n *\n * @param schema - The database schema definition\n * @param factory - Factory containing compiler, executor, decoder, and optional configuration\n * @returns An SimpleQueryInterface instance for performing database operations\n *\n * @example\n * ```ts\n * const operationCompiler = new GenericSQLUOWOperationCompiler(driverConfig);\n * const factory: UnitOfWorkFactory = {\n * compiler: createUOWCompilerFromOperationCompiler(operationCompiler),\n * executor: createExecutor(sqlDriver),\n * decoder: createKyselyUOWDecoder(driverConfig.databaseType),\n * };\n * const queryEngine = fromUnitOfWorkCompiler(mySchema, factory);\n *\n * const users = await queryEngine.find('users', (b) =>\n * b.whereIndex('age').where((eb) => eb('age', '>', 18))\n * );\n * ```\n */\nexport function fromUnitOfWorkCompiler<T extends AnySchema>(\n schema: T,\n factory: UnitOfWorkFactory,\n): SimpleQueryInterface<T, UnitOfWorkConfig> {\n const { compiler, executor, decoder, uowConfig, schemaNamespaceMap } = factory;\n\n function createUOW(opts: { name?: string; config?: UnitOfWorkConfig }) {\n const { onQuery, ...restUowConfig } = opts.config ?? {};\n\n return new UnitOfWork(\n compiler,\n executor,\n decoder,\n opts.name,\n {\n ...restUowConfig,\n onQuery: onQuery\n ? (query) => {\n // Extract the actual query from CompiledMutation if needed\n const actualQuery = isCompiledMutation(query)\n ? query.query\n : (query as CompiledQuery);\n onQuery(actualQuery);\n }\n : undefined,\n },\n schemaNamespaceMap,\n ).forSchema(schema);\n }\n\n return {\n async find(tableName, builderFn) {\n const uow = createUOW({ config: uowConfig });\n uow.find(tableName, builderFn);\n const [result]: unknown[][] = await uow.executeRetrieve();\n return result ?? [];\n },\n\n async findWithCursor(tableName, builderFn) {\n const uow = createUOW({ config: uowConfig }).findWithCursor(tableName, builderFn);\n const [result] = await uow.executeRetrieve();\n // Result from findWithCursor is always a CursorResult - the UOW decoder handles the conversion\n return result as CursorResult<unknown>;\n },\n\n async findFirst(tableName, builderFn) {\n const uow = createUOW({ config: uowConfig });\n if (builderFn) {\n uow.find(tableName, (b) => {\n builderFn(b);\n return b.pageSize(1);\n });\n } else {\n uow.find(tableName, (b) => b.whereIndex(\"primary\").pageSize(1));\n }\n // executeRetrieve runs an array of `find` operation results, which each return an array of rows\n const [result]: unknown[][] = await uow.executeRetrieve();\n return result?.[0] ?? null;\n },\n\n async create(tableName, values) {\n const uow = createUOW({ config: uowConfig });\n uow.create(tableName, values);\n const { success } = await uow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to create record\");\n }\n\n const createdIds = uow.getCreatedIds();\n const createdId = createdIds[0];\n if (!createdId) {\n throw new Error(\"Failed to get created ID\");\n }\n return createdId;\n },\n\n async createMany(tableName, valuesArray) {\n const uow = createUOW({ config: uowConfig });\n for (const values of valuesArray) {\n uow.create(tableName, values);\n }\n const { success } = await uow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to create records\");\n }\n\n return uow.getCreatedIds();\n },\n\n async update(tableName, id, builderFn) {\n const uow = createUOW({ config: uowConfig });\n uow.update(tableName, id, builderFn);\n const { success } = await uow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to update record (version conflict or record not found)\");\n }\n },\n\n async updateMany(tableName, builderFn) {\n const table = schema.tables[tableName];\n if (!table) {\n throw new Error(`Table ${tableName} not found in schema`);\n }\n\n const specialBuilder = new UpdateManySpecialBuilder<typeof table>();\n builderFn(specialBuilder);\n\n const { indexName, condition, setValues } = specialBuilder.getConfig();\n\n if (!indexName) {\n throw new Error(\"whereIndex() must be called in updateMany\");\n }\n if (!setValues) {\n throw new Error(\"set() must be called in updateMany\");\n }\n\n const findUow = createUOW({ config: uowConfig });\n findUow.find(tableName, (b) => {\n // Condition might be null or undefined, only pass if defined and not null\n if (condition !== undefined && condition !== null) {\n // TypeScript can't infer the complex condition type from the builder\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return b.whereIndex(indexName, condition as any);\n }\n return b.whereIndex(indexName);\n });\n const [records]: unknown[][] = await findUow.executeRetrieve();\n\n if (!records || records.length === 0) {\n return;\n }\n\n const updateUow = createUOW({ config: uowConfig });\n for (const record of records) {\n if (!hasIdField(record)) {\n throw new Error(\"Record missing id field\");\n }\n updateUow.update(tableName, record.id, (b) => b.set(setValues));\n }\n const { success } = await updateUow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to update records (version conflict)\");\n }\n },\n\n async delete(tableName, id, builderFn) {\n const uow = createUOW({ config: uowConfig });\n uow.delete(tableName, id, builderFn);\n const { success } = await uow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to delete record (version conflict or record not found)\");\n }\n },\n\n async deleteMany(tableName, builderFn) {\n const findUow = createUOW({ config: uowConfig });\n findUow.find(tableName, builderFn);\n const [records]: unknown[][] = await findUow.executeRetrieve();\n\n if (!records || records.length === 0) {\n return;\n }\n\n const deleteUow = createUOW({ config: uowConfig });\n for (const record of records) {\n if (!hasIdField(record)) {\n throw new Error(\"Record missing id field\");\n }\n deleteUow.delete(tableName, record.id);\n }\n const { success } = await deleteUow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to delete records (version conflict)\");\n }\n },\n\n createUnitOfWork(name, nestedUowConfig) {\n return createUOW({\n name,\n config: {\n ...uowConfig,\n ...nestedUowConfig,\n },\n });\n },\n } as SimpleQueryInterface<T, UnitOfWorkConfig>;\n}\n"],"mappings":"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"}
@@ -1,4 +1,5 @@
1
- //#region src/adapters/kysely/kysely-shared.d.ts
1
+ //#region src/adapters/shared/table-name-mapper.d.ts
2
+
2
3
  /**
3
4
  * Maps logical table names (used by fragment authors) to physical table names (with namespace suffix)
4
5
  */
@@ -8,4 +9,4 @@ interface TableNameMapper {
8
9
  }
9
10
  //#endregion
10
11
  export { TableNameMapper };
11
- //# sourceMappingURL=kysely-shared.d.ts.map
12
+ //# sourceMappingURL=table-name-mapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table-name-mapper.d.ts","names":[],"sources":["../../../src/adapters/shared/table-name-mapper.ts"],"sourcesContent":[],"mappings":";;;;;UAeiB,eAAA"}
@@ -0,0 +1,43 @@
1
+ //#region src/adapters/shared/table-name-mapper.ts
2
+ /**
3
+ * Sanitizes a namespace for use in database table names and TypeScript exports.
4
+ * Converts dashes to underscores to ensure compatibility with SQL identifiers
5
+ * and Drizzle's relational query system.
6
+ *
7
+ * @example
8
+ * sanitizeNamespace("my-fragment") // => "my_fragment"
9
+ */
10
+ function sanitizeNamespace(namespace) {
11
+ return namespace.replace(/-/g, "_");
12
+ }
13
+ /**
14
+ * Creates a table name mapper for a given namespace.
15
+ * Physical names have format: {logicalName}_{namespace} (or {logicalName}_{sanitizedNamespace} if sanitize is true)
16
+ *
17
+ * @param namespace - The namespace to use for table name prefixing
18
+ * @param sanitize - Whether to sanitize the namespace by converting dashes to underscores (default: false)
19
+ * @returns A table name mapper with toPhysical and toLogical methods
20
+ *
21
+ * @example
22
+ * const mapper = createTableNameMapper("my-fragment");
23
+ * mapper.toPhysical("users") // => "users_my-fragment"
24
+ *
25
+ * @example
26
+ * const mapper = createTableNameMapper("my-fragment", true);
27
+ * mapper.toPhysical("users") // => "users_my_fragment"
28
+ * mapper.toLogical("users_my_fragment") // => "users"
29
+ */
30
+ function createTableNameMapper(namespace, sanitize = false) {
31
+ const processedNamespace = sanitize ? sanitizeNamespace(namespace) : namespace;
32
+ return {
33
+ toPhysical: (logicalName) => `${logicalName}_${processedNamespace}`,
34
+ toLogical: (physicalName) => {
35
+ if (physicalName.endsWith(`_${processedNamespace}`)) return physicalName.slice(0, -(processedNamespace.length + 1));
36
+ return physicalName;
37
+ }
38
+ };
39
+ }
40
+
41
+ //#endregion
42
+ export { createTableNameMapper, sanitizeNamespace };
43
+ //# sourceMappingURL=table-name-mapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table-name-mapper.js","names":[],"sources":["../../../src/adapters/shared/table-name-mapper.ts"],"sourcesContent":["/**\n * Sanitizes a namespace for use in database table names and TypeScript exports.\n * Converts dashes to underscores to ensure compatibility with SQL identifiers\n * and Drizzle's relational query system.\n *\n * @example\n * sanitizeNamespace(\"my-fragment\") // => \"my_fragment\"\n */\nexport function sanitizeNamespace(namespace: string): string {\n return namespace.replace(/-/g, \"_\");\n}\n\n/**\n * Maps logical table names (used by fragment authors) to physical table names (with namespace suffix)\n */\nexport interface TableNameMapper {\n toPhysical(logicalName: string): string;\n toLogical(physicalName: string): string;\n}\n\n/**\n * Creates a table name mapper for a given namespace.\n * Physical names have format: {logicalName}_{namespace} (or {logicalName}_{sanitizedNamespace} if sanitize is true)\n *\n * @param namespace - The namespace to use for table name prefixing\n * @param sanitize - Whether to sanitize the namespace by converting dashes to underscores (default: false)\n * @returns A table name mapper with toPhysical and toLogical methods\n *\n * @example\n * const mapper = createTableNameMapper(\"my-fragment\");\n * mapper.toPhysical(\"users\") // => \"users_my-fragment\"\n *\n * @example\n * const mapper = createTableNameMapper(\"my-fragment\", true);\n * mapper.toPhysical(\"users\") // => \"users_my_fragment\"\n * mapper.toLogical(\"users_my_fragment\") // => \"users\"\n */\nexport function createTableNameMapper(namespace: string, sanitize = false): TableNameMapper {\n const processedNamespace = sanitize ? sanitizeNamespace(namespace) : namespace;\n\n return {\n toPhysical: (logicalName: string) => `${logicalName}_${processedNamespace}`,\n toLogical: (physicalName: string) => {\n if (physicalName.endsWith(`_${processedNamespace}`)) {\n return physicalName.slice(0, -(processedNamespace.length + 1));\n }\n return physicalName;\n },\n };\n}\n"],"mappings":";;;;;;;;;AAQA,SAAgB,kBAAkB,WAA2B;AAC3D,QAAO,UAAU,QAAQ,MAAM,IAAI;;;;;;;;;;;;;;;;;;;AA4BrC,SAAgB,sBAAsB,WAAmB,WAAW,OAAwB;CAC1F,MAAM,qBAAqB,WAAW,kBAAkB,UAAU,GAAG;AAErE,QAAO;EACL,aAAa,gBAAwB,GAAG,YAAY,GAAG;EACvD,YAAY,iBAAyB;AACnC,OAAI,aAAa,SAAS,IAAI,qBAAqB,CACjD,QAAO,aAAa,MAAM,GAAG,EAAE,mBAAmB,SAAS,GAAG;AAEhE,UAAO;;EAEV"}