@fragno-dev/db 0.1.15 → 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 (407) hide show
  1. package/.turbo/turbo-build.log +242 -179
  2. package/CHANGELOG.md +23 -0
  3. package/README.md +123 -8
  4. package/dist/adapters/adapters.d.ts +5 -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 -21
  8. package/dist/adapters/drizzle/drizzle-adapter.d.ts.map +1 -1
  9. package/dist/adapters/drizzle/drizzle-adapter.js +7 -54
  10. package/dist/adapters/drizzle/drizzle-adapter.js.map +1 -1
  11. package/dist/adapters/drizzle/generate.d.ts +3 -0
  12. package/dist/adapters/drizzle/generate.d.ts.map +1 -1
  13. package/dist/adapters/drizzle/generate.js +36 -28
  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 -18
  68. package/dist/adapters/kysely/kysely-adapter.d.ts.map +1 -1
  69. package/dist/adapters/kysely/kysely-adapter.js +6 -165
  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} +47 -61
  72. package/dist/adapters/shared/from-unit-of-work-compiler.js.map +1 -0
  73. package/dist/adapters/{drizzle/shared.d.ts → shared/table-name-mapper.d.ts} +2 -4
  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 +53 -19
  80. package/dist/db-fragment-definition-builder.d.ts.map +1 -1
  81. package/dist/db-fragment-definition-builder.js +89 -19
  82. package/dist/db-fragment-definition-builder.js.map +1 -1
  83. package/dist/fragments/internal-fragment.d.ts +39 -5
  84. package/dist/fragments/internal-fragment.d.ts.map +1 -1
  85. package/dist/fragments/internal-fragment.js +82 -10
  86. package/dist/fragments/internal-fragment.js.map +1 -1
  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 +23 -61
  94. package/dist/migration-engine/generation-engine.js.map +1 -1
  95. package/dist/mod.d.ts +34 -10
  96. package/dist/mod.d.ts.map +1 -1
  97. package/dist/mod.js +47 -16
  98. package/dist/mod.js.map +1 -1
  99. package/dist/node_modules/.pnpm/{rou3@0.7.8 → rou3@0.7.10}/node_modules/rou3/dist/index.js +1 -1
  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/fragment-instantiator.js +69 -31
  102. package/dist/packages/fragno/dist/api/fragment-instantiator.js.map +1 -1
  103. package/dist/query/column-defaults.js +27 -0
  104. package/dist/query/column-defaults.js.map +1 -0
  105. package/dist/query/cursor.d.ts +4 -4
  106. package/dist/query/cursor.d.ts.map +1 -1
  107. package/dist/query/cursor.js +8 -6
  108. package/dist/query/cursor.js.map +1 -1
  109. package/dist/query/orm/orm.d.ts +1 -1
  110. package/dist/query/orm/orm.js.map +1 -1
  111. package/dist/query/serialize/create-sql-serializer.js +30 -0
  112. package/dist/query/serialize/create-sql-serializer.js.map +1 -0
  113. package/dist/query/serialize/dialect/mysql-serializer.js +87 -0
  114. package/dist/query/serialize/dialect/mysql-serializer.js.map +1 -0
  115. package/dist/query/serialize/dialect/postgres-serializer.js +80 -0
  116. package/dist/query/serialize/dialect/postgres-serializer.js.map +1 -0
  117. package/dist/query/serialize/dialect/sqlite-serializer.js +93 -0
  118. package/dist/query/serialize/dialect/sqlite-serializer.js.map +1 -0
  119. package/dist/query/serialize/sql-serializer.js +67 -0
  120. package/dist/query/serialize/sql-serializer.js.map +1 -0
  121. package/dist/query/{query.d.ts → simple-query-interface.d.ts} +5 -5
  122. package/dist/query/simple-query-interface.d.ts.map +1 -0
  123. package/dist/query/{execute-unit-of-work.d.ts → unit-of-work/execute-unit-of-work.d.ts} +13 -3
  124. package/dist/query/unit-of-work/execute-unit-of-work.d.ts.map +1 -0
  125. package/dist/query/{execute-unit-of-work.js → unit-of-work/execute-unit-of-work.js} +17 -4
  126. package/dist/query/unit-of-work/execute-unit-of-work.js.map +1 -0
  127. package/dist/query/{retry-policy.d.ts → unit-of-work/retry-policy.d.ts} +1 -1
  128. package/dist/query/unit-of-work/retry-policy.d.ts.map +1 -0
  129. package/dist/query/{retry-policy.js → unit-of-work/retry-policy.js} +1 -1
  130. package/dist/query/unit-of-work/retry-policy.js.map +1 -0
  131. package/dist/query/{unit-of-work.d.ts → unit-of-work/unit-of-work.d.ts} +51 -18
  132. package/dist/query/unit-of-work/unit-of-work.d.ts.map +1 -0
  133. package/dist/query/{unit-of-work.js → unit-of-work/unit-of-work.js} +58 -11
  134. package/dist/query/unit-of-work/unit-of-work.js.map +1 -0
  135. package/dist/query/value-decoding.js +71 -0
  136. package/dist/query/value-decoding.js.map +1 -0
  137. package/dist/query/value-encoding.js +124 -0
  138. package/dist/query/value-encoding.js.map +1 -0
  139. package/dist/schema/create.d.ts +3 -0
  140. package/dist/schema/create.d.ts.map +1 -1
  141. package/dist/schema/create.js +4 -0
  142. package/dist/schema/create.js.map +1 -1
  143. package/dist/schema/type-conversion/create-sql-type-mapper.js +29 -0
  144. package/dist/schema/type-conversion/create-sql-type-mapper.js.map +1 -0
  145. package/dist/schema/type-conversion/dialect/mysql.js +57 -0
  146. package/dist/schema/type-conversion/dialect/mysql.js.map +1 -0
  147. package/dist/schema/type-conversion/dialect/postgres.js +56 -0
  148. package/dist/schema/type-conversion/dialect/postgres.js.map +1 -0
  149. package/dist/schema/type-conversion/dialect/sqlite.js +52 -0
  150. package/dist/schema/type-conversion/dialect/sqlite.js.map +1 -0
  151. package/dist/schema/type-conversion/type-mapping.js +63 -0
  152. package/dist/schema/type-conversion/type-mapping.js.map +1 -0
  153. package/dist/sql-driver/connection/connection-provider.d.ts +13 -0
  154. package/dist/sql-driver/connection/connection-provider.d.ts.map +1 -0
  155. package/dist/sql-driver/connection/connection-provider.js +19 -0
  156. package/dist/sql-driver/connection/connection-provider.js.map +1 -0
  157. package/dist/sql-driver/connection/single-connection-provider.js +23 -0
  158. package/dist/sql-driver/connection/single-connection-provider.js.map +1 -0
  159. package/dist/sql-driver/dialect-adapter/dialect-adapter.d.ts +7 -0
  160. package/dist/sql-driver/dialect-adapter/dialect-adapter.d.ts.map +1 -0
  161. package/dist/sql-driver/dialects/dialects.d.ts +2 -0
  162. package/dist/sql-driver/dialects/dialects.js +3 -0
  163. package/dist/sql-driver/dialects/durable-object-dialect.d.ts +72 -0
  164. package/dist/sql-driver/dialects/durable-object-dialect.d.ts.map +1 -0
  165. package/dist/sql-driver/dialects/durable-object-dialect.js +130 -0
  166. package/dist/sql-driver/dialects/durable-object-dialect.js.map +1 -0
  167. package/dist/sql-driver/driver/runtime-driver.d.ts +23 -0
  168. package/dist/sql-driver/driver/runtime-driver.d.ts.map +1 -0
  169. package/dist/sql-driver/driver/runtime-driver.js +56 -0
  170. package/dist/sql-driver/driver/runtime-driver.js.map +1 -0
  171. package/dist/sql-driver/query-executor/default-query-executor.js +26 -0
  172. package/dist/sql-driver/query-executor/default-query-executor.js.map +1 -0
  173. package/dist/sql-driver/query-executor/plugin.d.ts +17 -0
  174. package/dist/sql-driver/query-executor/plugin.d.ts.map +1 -0
  175. package/dist/sql-driver/query-executor/query-executor-base.js +25 -0
  176. package/dist/sql-driver/query-executor/query-executor-base.js.map +1 -0
  177. package/dist/sql-driver/query-executor/query-executor.d.ts +36 -0
  178. package/dist/sql-driver/query-executor/query-executor.d.ts.map +1 -0
  179. package/dist/sql-driver/sql-driver-adapter.d.ts +29 -0
  180. package/dist/sql-driver/sql-driver-adapter.d.ts.map +1 -0
  181. package/dist/sql-driver/sql-driver-adapter.js +68 -0
  182. package/dist/sql-driver/sql-driver-adapter.js.map +1 -0
  183. package/dist/sql-driver/sql-driver.d.ts +38 -0
  184. package/dist/sql-driver/sql-driver.d.ts.map +1 -0
  185. package/dist/sql-driver/sql-driver.js +1 -0
  186. package/dist/sql-driver/sql.js +50 -0
  187. package/dist/sql-driver/sql.js.map +1 -0
  188. package/dist/with-database.d.ts +6 -2
  189. package/dist/with-database.d.ts.map +1 -1
  190. package/dist/with-database.js +1 -1
  191. package/dist/with-database.js.map +1 -1
  192. package/package.json +37 -10
  193. package/src/adapters/adapters.ts +8 -5
  194. package/src/adapters/drizzle/drizzle-adapter-pglite.test.ts +60 -169
  195. package/src/adapters/drizzle/{drizzle-adapter-sqlite.test.ts → drizzle-adapter-sqlite3.test.ts} +31 -55
  196. package/src/adapters/drizzle/drizzle-adapter.ts +15 -107
  197. package/src/adapters/drizzle/generate.test.ts +2 -2
  198. package/src/adapters/drizzle/generate.ts +78 -34
  199. package/src/adapters/drizzle/migrate-drizzle.test.ts +19 -0
  200. package/src/adapters/drizzle/shared.ts +0 -34
  201. package/src/adapters/drizzle/test-utils.ts +3 -3
  202. package/src/adapters/generic-sql/README.md +14 -0
  203. package/src/adapters/generic-sql/driver-config.ts +144 -0
  204. package/src/adapters/generic-sql/generic-sql-adapter.test.ts +50 -0
  205. package/src/adapters/generic-sql/generic-sql-adapter.ts +146 -0
  206. package/src/adapters/generic-sql/generic-sql-uow-executor.ts +130 -0
  207. package/src/adapters/generic-sql/migration/cold-kysely.ts +55 -0
  208. package/src/adapters/{kysely/migration/execute-mysql.test.ts → generic-sql/migration/dialect/mysql.test.ts} +342 -484
  209. package/src/adapters/generic-sql/migration/dialect/mysql.ts +104 -0
  210. package/src/adapters/generic-sql/migration/dialect/postgres.test.ts +1008 -0
  211. package/src/adapters/generic-sql/migration/dialect/postgres.ts +113 -0
  212. package/src/adapters/{kysely/migration/execute-sqlite.test.ts → generic-sql/migration/dialect/sqlite.test.ts} +307 -510
  213. package/src/adapters/generic-sql/migration/dialect/sqlite.ts +189 -0
  214. package/src/adapters/generic-sql/migration/executor.ts +33 -0
  215. package/src/adapters/generic-sql/migration/prepared-migrations.test.ts +661 -0
  216. package/src/adapters/generic-sql/migration/prepared-migrations.ts +214 -0
  217. package/src/adapters/generic-sql/migration/sql-generator.ts +413 -0
  218. package/src/adapters/generic-sql/query/create-sql-query-compiler.ts +36 -0
  219. package/src/adapters/generic-sql/query/cursor-utils.ts +56 -0
  220. package/src/adapters/generic-sql/query/dialect/mysql.ts +34 -0
  221. package/src/adapters/generic-sql/query/dialect/postgres.ts +32 -0
  222. package/src/adapters/generic-sql/query/dialect/sqlite.ts +32 -0
  223. package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.test.ts +1568 -0
  224. package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.ts +314 -0
  225. package/src/adapters/generic-sql/query/select-builder.test.ts +256 -0
  226. package/src/adapters/generic-sql/query/select-builder.ts +137 -0
  227. package/src/adapters/generic-sql/query/sql-query-compiler.test.ts +195 -0
  228. package/src/adapters/generic-sql/query/sql-query-compiler.ts +367 -0
  229. package/src/adapters/generic-sql/query/where-builder.test.ts +744 -0
  230. package/src/adapters/generic-sql/query/where-builder.ts +211 -0
  231. package/src/adapters/generic-sql/result-interpreter.ts +102 -0
  232. package/src/adapters/generic-sql/test/generic-drizzle-adapter-sqlite3.test.ts +899 -0
  233. package/src/adapters/generic-sql/uow-decoder.test.ts +399 -0
  234. package/src/adapters/generic-sql/uow-decoder.ts +152 -0
  235. package/src/adapters/generic-sql/uow-encoder.test.ts +183 -0
  236. package/src/adapters/generic-sql/uow-encoder.ts +131 -0
  237. package/src/adapters/kysely/kysely-adapter-pglite.test.ts +26 -76
  238. package/src/adapters/kysely/{kysely-adapter-sqlite.test.ts → kysely-adapter-sqlocal.test.ts} +76 -17
  239. package/src/adapters/kysely/kysely-adapter.ts +10 -250
  240. package/src/adapters/{drizzle/drizzle-query.ts → shared/from-unit-of-work-compiler.ts} +110 -104
  241. package/src/adapters/shared/table-name-mapper.ts +50 -0
  242. package/src/adapters/shared/uow-operation-compiler.ts +211 -0
  243. package/src/db-fragment-definition-builder.test.ts +2 -2
  244. package/src/db-fragment-definition-builder.ts +281 -50
  245. package/src/db-fragment-instantiator.test.ts +78 -2
  246. package/src/db-fragment-integration.test.ts +14 -16
  247. package/src/fragments/internal-fragment.test.ts +434 -45
  248. package/src/fragments/internal-fragment.ts +184 -20
  249. package/src/hooks/hooks.test.ts +575 -0
  250. package/src/hooks/hooks.ts +179 -0
  251. package/src/migration-engine/generation-engine.test.ts +44 -54
  252. package/src/migration-engine/generation-engine.ts +48 -94
  253. package/src/mod.ts +117 -29
  254. package/src/query/column-defaults.ts +49 -0
  255. package/src/query/cursor.test.ts +31 -6
  256. package/src/query/cursor.ts +11 -7
  257. package/src/query/orm/orm.ts +1 -1
  258. package/src/query/query-type.test.ts +9 -9
  259. package/src/query/serialize/create-sql-serializer.ts +34 -0
  260. package/src/query/serialize/dialect/mysql-serializer.ts +142 -0
  261. package/src/query/serialize/dialect/postgres-serializer.ts +129 -0
  262. package/src/query/serialize/dialect/sqlite-serializer.test.ts +251 -0
  263. package/src/query/serialize/dialect/sqlite-serializer.ts +156 -0
  264. package/src/query/serialize/sql-serializer.ts +143 -0
  265. package/src/query/{query.ts → simple-query-interface.ts} +2 -2
  266. package/src/query/{execute-unit-of-work.test.ts → unit-of-work/execute-unit-of-work.test.ts} +16 -16
  267. package/src/query/{execute-unit-of-work.ts → unit-of-work/execute-unit-of-work.ts} +49 -8
  268. package/src/query/{unit-of-work-coordinator.test.ts → unit-of-work/unit-of-work-coordinator.test.ts} +41 -43
  269. package/src/query/{unit-of-work-types.test.ts → unit-of-work/unit-of-work-types.test.ts} +5 -3
  270. package/src/query/{unit-of-work.test.ts → unit-of-work/unit-of-work.test.ts} +100 -9
  271. package/src/query/{unit-of-work.ts → unit-of-work/unit-of-work.ts} +135 -32
  272. package/src/query/{result-transform.test.ts → value-decoding.test.ts} +45 -427
  273. package/src/query/value-decoding.ts +113 -0
  274. package/src/query/value-encoding.test.ts +390 -0
  275. package/src/query/value-encoding.ts +168 -0
  276. package/src/schema/create.test.ts +5 -1
  277. package/src/schema/create.ts +5 -0
  278. package/src/schema/serialize.test.ts +165 -407
  279. package/src/schema/type-conversion/create-sql-type-mapper.ts +28 -0
  280. package/src/schema/type-conversion/dialect/mysql.ts +64 -0
  281. package/src/schema/type-conversion/dialect/postgres.ts +62 -0
  282. package/src/schema/type-conversion/dialect/sqlite.ts +63 -0
  283. package/src/schema/type-conversion/type-mapping.test.ts +137 -0
  284. package/src/schema/type-conversion/type-mapping.ts +153 -0
  285. package/src/shared/connection-pool.ts +5 -5
  286. package/src/sql-driver/better-sqlite3.test.ts +126 -0
  287. package/src/sql-driver/connection/connection-provider.ts +27 -0
  288. package/src/sql-driver/connection/single-connection-provider.ts +42 -0
  289. package/src/sql-driver/dialect-adapter/dialect-adapter.ts +9 -0
  290. package/src/sql-driver/dialect-adapter/sqlite-dialect-adapter.ts +7 -0
  291. package/src/sql-driver/dialects/dialects.ts +1 -0
  292. package/src/sql-driver/dialects/durable-object-dialect.ts +260 -0
  293. package/src/sql-driver/driver/runtime-driver.ts +91 -0
  294. package/src/sql-driver/query-executor/default-query-executor.ts +38 -0
  295. package/src/sql-driver/query-executor/plugin.ts +22 -0
  296. package/src/sql-driver/query-executor/query-executor-base.ts +53 -0
  297. package/src/sql-driver/query-executor/query-executor.ts +44 -0
  298. package/src/sql-driver/sql-driver-adapter.ts +96 -0
  299. package/src/sql-driver/sql-driver.ts +53 -0
  300. package/src/sql-driver/sql.ts +57 -0
  301. package/src/sql-driver/sqlocal.test.ts +117 -0
  302. package/src/with-database.ts +35 -23
  303. package/tsdown.config.ts +7 -2
  304. package/dist/adapters/drizzle/drizzle-connection-pool.js +0 -40
  305. package/dist/adapters/drizzle/drizzle-connection-pool.js.map +0 -1
  306. package/dist/adapters/drizzle/drizzle-query.d.ts +0 -23
  307. package/dist/adapters/drizzle/drizzle-query.d.ts.map +0 -1
  308. package/dist/adapters/drizzle/drizzle-query.js.map +0 -1
  309. package/dist/adapters/drizzle/drizzle-uow-compiler.d.ts +0 -10
  310. package/dist/adapters/drizzle/drizzle-uow-compiler.d.ts.map +0 -1
  311. package/dist/adapters/drizzle/drizzle-uow-compiler.js +0 -334
  312. package/dist/adapters/drizzle/drizzle-uow-compiler.js.map +0 -1
  313. package/dist/adapters/drizzle/drizzle-uow-decoder.js +0 -123
  314. package/dist/adapters/drizzle/drizzle-uow-decoder.js.map +0 -1
  315. package/dist/adapters/drizzle/drizzle-uow-executor.js +0 -160
  316. package/dist/adapters/drizzle/drizzle-uow-executor.js.map +0 -1
  317. package/dist/adapters/drizzle/join-column-utils.js +0 -28
  318. package/dist/adapters/drizzle/join-column-utils.js.map +0 -1
  319. package/dist/adapters/drizzle/shared.d.ts.map +0 -1
  320. package/dist/adapters/drizzle/shared.js +0 -35
  321. package/dist/adapters/drizzle/shared.js.map +0 -1
  322. package/dist/adapters/kysely/kysely-connection-pool.js +0 -41
  323. package/dist/adapters/kysely/kysely-connection-pool.js.map +0 -1
  324. package/dist/adapters/kysely/kysely-query-builder.js +0 -321
  325. package/dist/adapters/kysely/kysely-query-builder.js.map +0 -1
  326. package/dist/adapters/kysely/kysely-query-compiler.js +0 -67
  327. package/dist/adapters/kysely/kysely-query-compiler.js.map +0 -1
  328. package/dist/adapters/kysely/kysely-query.d.ts +0 -23
  329. package/dist/adapters/kysely/kysely-query.d.ts.map +0 -1
  330. package/dist/adapters/kysely/kysely-query.js +0 -230
  331. package/dist/adapters/kysely/kysely-query.js.map +0 -1
  332. package/dist/adapters/kysely/kysely-shared.d.ts +0 -14
  333. package/dist/adapters/kysely/kysely-shared.d.ts.map +0 -1
  334. package/dist/adapters/kysely/kysely-shared.js +0 -33
  335. package/dist/adapters/kysely/kysely-shared.js.map +0 -1
  336. package/dist/adapters/kysely/kysely-uow-compiler.js +0 -193
  337. package/dist/adapters/kysely/kysely-uow-compiler.js.map +0 -1
  338. package/dist/adapters/kysely/kysely-uow-executor.js +0 -93
  339. package/dist/adapters/kysely/kysely-uow-executor.js.map +0 -1
  340. package/dist/adapters/kysely/migration/execute-base.js +0 -128
  341. package/dist/adapters/kysely/migration/execute-base.js.map +0 -1
  342. package/dist/adapters/kysely/migration/execute-factory.js +0 -34
  343. package/dist/adapters/kysely/migration/execute-factory.js.map +0 -1
  344. package/dist/adapters/kysely/migration/execute-mssql.js +0 -112
  345. package/dist/adapters/kysely/migration/execute-mssql.js.map +0 -1
  346. package/dist/adapters/kysely/migration/execute-mysql.js +0 -93
  347. package/dist/adapters/kysely/migration/execute-mysql.js.map +0 -1
  348. package/dist/adapters/kysely/migration/execute-postgres.js +0 -104
  349. package/dist/adapters/kysely/migration/execute-postgres.js.map +0 -1
  350. package/dist/adapters/kysely/migration/execute-sqlite.js +0 -123
  351. package/dist/adapters/kysely/migration/execute-sqlite.js.map +0 -1
  352. package/dist/adapters/kysely/migration/execute.js +0 -34
  353. package/dist/adapters/kysely/migration/execute.js.map +0 -1
  354. package/dist/migration-engine/create.d.ts +0 -37
  355. package/dist/migration-engine/create.d.ts.map +0 -1
  356. package/dist/migration-engine/create.js +0 -58
  357. package/dist/migration-engine/create.js.map +0 -1
  358. package/dist/migration-engine/shared.d.ts +0 -112
  359. package/dist/migration-engine/shared.d.ts.map +0 -1
  360. package/dist/node_modules/.pnpm/rou3@0.7.8/node_modules/rou3/dist/index.js.map +0 -1
  361. package/dist/query/execute-unit-of-work.d.ts.map +0 -1
  362. package/dist/query/execute-unit-of-work.js.map +0 -1
  363. package/dist/query/query.d.ts.map +0 -1
  364. package/dist/query/result-transform.js +0 -170
  365. package/dist/query/result-transform.js.map +0 -1
  366. package/dist/query/retry-policy.d.ts.map +0 -1
  367. package/dist/query/retry-policy.js.map +0 -1
  368. package/dist/query/unit-of-work.d.ts.map +0 -1
  369. package/dist/query/unit-of-work.js.map +0 -1
  370. package/dist/schema/serialize.js +0 -111
  371. package/dist/schema/serialize.js.map +0 -1
  372. package/src/adapters/drizzle/drizzle-adapter.test.ts +0 -122
  373. package/src/adapters/drizzle/drizzle-connection-pool.ts +0 -66
  374. package/src/adapters/drizzle/drizzle-query.test.ts +0 -499
  375. package/src/adapters/drizzle/drizzle-uow-compiler-mysql.test.ts +0 -1442
  376. package/src/adapters/drizzle/drizzle-uow-compiler-sqlite.test.ts +0 -1414
  377. package/src/adapters/drizzle/drizzle-uow-compiler.test.ts +0 -1400
  378. package/src/adapters/drizzle/drizzle-uow-compiler.ts +0 -677
  379. package/src/adapters/drizzle/drizzle-uow-decoder.ts +0 -228
  380. package/src/adapters/drizzle/drizzle-uow-executor.ts +0 -309
  381. package/src/adapters/drizzle/join-column-utils.test.ts +0 -79
  382. package/src/adapters/drizzle/join-column-utils.ts +0 -39
  383. package/src/adapters/kysely/kysely-connection-pool.ts +0 -70
  384. package/src/adapters/kysely/kysely-query-builder.test.ts +0 -1344
  385. package/src/adapters/kysely/kysely-query-builder.ts +0 -666
  386. package/src/adapters/kysely/kysely-query-compiler.ts +0 -127
  387. package/src/adapters/kysely/kysely-query.test.ts +0 -498
  388. package/src/adapters/kysely/kysely-query.ts +0 -399
  389. package/src/adapters/kysely/kysely-shared.ts +0 -57
  390. package/src/adapters/kysely/kysely-uow-compiler.test.ts +0 -986
  391. package/src/adapters/kysely/kysely-uow-compiler.ts +0 -350
  392. package/src/adapters/kysely/kysely-uow-executor.ts +0 -164
  393. package/src/adapters/kysely/kysely-uow-joins.test.ts +0 -794
  394. package/src/adapters/kysely/migration/execute-base.ts +0 -256
  395. package/src/adapters/kysely/migration/execute-factory.ts +0 -53
  396. package/src/adapters/kysely/migration/execute-mssql.ts +0 -250
  397. package/src/adapters/kysely/migration/execute-mysql.ts +0 -211
  398. package/src/adapters/kysely/migration/execute-postgres.test.ts +0 -2657
  399. package/src/adapters/kysely/migration/execute-postgres.ts +0 -234
  400. package/src/adapters/kysely/migration/execute-sqlite.ts +0 -247
  401. package/src/adapters/kysely/migration/execute.ts +0 -50
  402. package/src/adapters/kysely/migration/kysely-migrator.test.ts +0 -261
  403. package/src/query/result-transform.ts +0 -274
  404. package/src/schema/serialize.ts +0 -407
  405. /package/dist/query/{query.js → simple-query-interface.js} +0 -0
  406. /package/src/query/{retry-policy.test.ts → unit-of-work/retry-policy.test.ts} +0 -0
  407. /package/src/query/{retry-policy.ts → unit-of-work/retry-policy.ts} +0 -0
@@ -0,0 +1,179 @@
1
+ import type { RetryPolicy } from "../query/unit-of-work/retry-policy";
2
+ import { ExponentialBackoffRetryPolicy } from "../query/unit-of-work/retry-policy";
3
+ import type { IUnitOfWork } from "../query/unit-of-work/unit-of-work";
4
+ import type { InternalFragmentInstance } from "../fragments/internal-fragment";
5
+
6
+ /**
7
+ * Context available in hook functions via `this`.
8
+ * Contains the nonce for idempotency and database access.
9
+ */
10
+ export interface HookContext {
11
+ /**
12
+ * Unique nonce for this transaction.
13
+ * Use this for idempotency checks in your hook implementation.
14
+ */
15
+ nonce: string;
16
+ }
17
+
18
+ /**
19
+ * A hook function signature.
20
+ * Hooks receive a typed payload and access context via `this`.
21
+ */
22
+ export type HookFn<TPayload = unknown> = (payload: TPayload) => void | Promise<void>;
23
+
24
+ /**
25
+ * Map of hook names to hook functions.
26
+ * Used for type-safe hook definitions and triggering.
27
+ */
28
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
29
+ export type HooksMap = Record<string, HookFn<any>>;
30
+
31
+ /**
32
+ * Extract the payload type from a hook function.
33
+ */
34
+ export type HookPayload<T> = T extends HookFn<infer P> ? P : never;
35
+
36
+ /**
37
+ * Options for triggering a hook.
38
+ */
39
+ export interface TriggerHookOptions {
40
+ /**
41
+ * Optional retry policy override for this specific hook trigger.
42
+ * If not provided, uses the default retry policy.
43
+ */
44
+ retryPolicy?: RetryPolicy;
45
+ }
46
+
47
+ /**
48
+ * Internal representation of a triggered hook.
49
+ * Stored in the Unit of Work before execution.
50
+ */
51
+ export interface TriggeredHook {
52
+ hookName: string;
53
+ payload: unknown;
54
+ options?: TriggerHookOptions;
55
+ }
56
+
57
+ /**
58
+ * Configuration for hook processing.
59
+ */
60
+ export interface HookProcessorConfig {
61
+ hooks: HooksMap;
62
+ namespace: string;
63
+ internalFragment: InternalFragmentInstance;
64
+ defaultRetryPolicy?: RetryPolicy;
65
+ }
66
+
67
+ /**
68
+ * Add hook events as mutation operations to the UOW.
69
+ * This should be called before executeMutations() so hook records are created
70
+ * in the same transaction as the user's mutations.
71
+ */
72
+ export function prepareHookMutations(uow: IUnitOfWork, config: HookProcessorConfig): void {
73
+ const { namespace, internalFragment, defaultRetryPolicy } = config;
74
+ const retryPolicy = defaultRetryPolicy ?? new ExponentialBackoffRetryPolicy({ maxRetries: 5 });
75
+
76
+ const triggeredHooks = uow.getTriggeredHooks();
77
+
78
+ if (triggeredHooks.length === 0) {
79
+ return;
80
+ }
81
+
82
+ const internalSchema = internalFragment.$internal.deps.schema;
83
+ const internalUow = uow.forSchema(internalSchema);
84
+
85
+ for (const hook of triggeredHooks) {
86
+ const hookRetryPolicy = hook.options?.retryPolicy ?? retryPolicy;
87
+ const maxAttempts = hookRetryPolicy.shouldRetry(4) ? 5 : 1;
88
+ internalUow.create("fragno_hooks", {
89
+ namespace,
90
+ hookName: hook.hookName,
91
+ payload: hook.payload,
92
+ status: "pending",
93
+ attempts: 0,
94
+ maxAttempts,
95
+ lastAttemptAt: null,
96
+ nextRetryAt: null,
97
+ error: null,
98
+ nonce: uow.nonce,
99
+ });
100
+ }
101
+ }
102
+
103
+ /**
104
+ * Process pending hook events after the transaction has committed.
105
+ * This should be called in the onSuccess callback after executeMutations().
106
+ */
107
+ export async function processHooks(config: HookProcessorConfig): Promise<void> {
108
+ const { hooks, namespace, internalFragment, defaultRetryPolicy } = config;
109
+ const retryPolicy = defaultRetryPolicy ?? new ExponentialBackoffRetryPolicy({ maxRetries: 5 });
110
+
111
+ await internalFragment.inContext(async function () {
112
+ return await this.uow(async ({ executeRetrieve, executeMutate }) => {
113
+ const pendingEventsPromise =
114
+ internalFragment.services.hookService.getPendingHookEvents(namespace);
115
+ await executeRetrieve();
116
+
117
+ const pendingEvents = await pendingEventsPromise;
118
+
119
+ if (pendingEvents.length === 0) {
120
+ return;
121
+ }
122
+
123
+ const processedEvents = await Promise.allSettled(
124
+ pendingEvents.map(async (event) => {
125
+ const hookFn = hooks[event.hookName];
126
+ if (!hookFn) {
127
+ return {
128
+ eventId: event.id,
129
+ status: "failed" as const,
130
+ error: `Hook '${event.hookName}' not found in hooks map`,
131
+ attempts: event.attempts,
132
+ maxAttempts: event.maxAttempts,
133
+ };
134
+ }
135
+
136
+ try {
137
+ const hookContext: HookContext = { nonce: event.nonce };
138
+ await hookFn.call(hookContext, event.payload);
139
+ return {
140
+ eventId: event.id,
141
+ status: "completed" as const,
142
+ };
143
+ } catch (error) {
144
+ const errorMessage = error instanceof Error ? error.message : String(error);
145
+ return {
146
+ eventId: event.id,
147
+ status: "failed" as const,
148
+ error: errorMessage,
149
+ attempts: event.attempts,
150
+ maxAttempts: event.maxAttempts,
151
+ };
152
+ }
153
+ }),
154
+ );
155
+
156
+ for (const processedEvent of processedEvents) {
157
+ if (processedEvent.status === "rejected") {
158
+ continue;
159
+ }
160
+
161
+ const { eventId, status } = processedEvent.value;
162
+
163
+ if (status === "completed") {
164
+ internalFragment.services.hookService.markHookCompleted(eventId);
165
+ } else if (status === "failed") {
166
+ const { error, attempts } = processedEvent.value;
167
+ internalFragment.services.hookService.markHookFailed(
168
+ eventId,
169
+ error,
170
+ attempts,
171
+ retryPolicy,
172
+ );
173
+ }
174
+ }
175
+
176
+ await executeMutate();
177
+ });
178
+ });
179
+ }
@@ -1,5 +1,5 @@
1
1
  import { describe, it, expect, beforeAll, beforeEach, vi, afterEach } from "vitest";
2
- import { Kysely, PostgresDialect } from "kysely";
2
+ import { DummyDriver, MysqlAdapter, PostgresAdapter, SqliteAdapter } from "kysely";
3
3
  import {
4
4
  postProcessMigrationFilenames,
5
5
  type GenerationInternalResult,
@@ -8,32 +8,30 @@ import {
8
8
  import { KyselyAdapter } from "../adapters/kysely/kysely-adapter";
9
9
  import { column, idColumn, schema, type AnySchema } from "../schema/create";
10
10
  import { FragnoDatabase } from "../mod";
11
+ import {
12
+ MySQL2DriverConfig,
13
+ NodePostgresDriverConfig,
14
+ SQLocalDriverConfig,
15
+ } from "../adapters/generic-sql/driver-config";
11
16
 
12
17
  describe("generateMigrationsOrSchema - kysely", () => {
13
18
  const mockDate = new Date("2025-10-24T12:00:00Z");
14
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
15
- let db: Kysely<any>;
16
19
  let adapter: KyselyAdapter;
17
20
 
18
21
  beforeAll(() => {
19
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
20
- db = new Kysely({ dialect: new PostgresDialect({} as any) });
21
-
22
- // Mock Kysely transaction to prevent actual database connections
23
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
24
- vi.spyOn(db, "transaction").mockReturnValue({
25
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
26
- execute: async (callback: any) => {
27
- // Return a mock transaction executor that returns empty results
28
- const mockTx = {
29
- executeQuery: async () => ({ rows: [] }),
30
- };
31
- return callback(mockTx);
22
+ adapter = new KyselyAdapter({
23
+ dialect: {
24
+ createAdapter: () => new PostgresAdapter(),
25
+ createDriver: () => new DummyDriver(),
26
+ createQueryCompiler: () => ({
27
+ compileQuery: () => ({
28
+ sql: "",
29
+ parameters: [],
30
+ }),
31
+ }),
32
32
  },
33
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
34
- } as any);
35
-
36
- adapter = new KyselyAdapter({ db, provider: "postgresql" });
33
+ driverConfig: new NodePostgresDriverConfig(),
34
+ });
37
35
 
38
36
  // Mock the adapter methods
39
37
  vi.spyOn(adapter, "isConnectionHealthy").mockResolvedValue(true);
@@ -66,7 +64,7 @@ describe("generateMigrationsOrSchema - kysely", () => {
66
64
 
67
65
  expect(results).toHaveLength(2); // Settings + test-db
68
66
  expect(results[0].namespace).toBe(""); // Empty namespace for settings table
69
- expect(results[0].path).toBe("20251024_001_f000_t001_fragno_db_settings.sql");
67
+ expect(results[0].path).toMatch(/^20251024_001_f000_t00\d_fragno_db_settings.sql$/);
70
68
  expect(results[0].schema).toContain("create table");
71
69
  expect(results[0].schema).toContain("fragno_db_settings");
72
70
 
@@ -117,7 +115,7 @@ describe("generateMigrationsOrSchema - kysely", () => {
117
115
 
118
116
  expect(results).toHaveLength(4); // Settings + 3 databases
119
117
  expect(results[0].namespace).toBe(""); // Empty namespace for settings table
120
- expect(results[0].path).toBe("20251024_001_f000_t001_fragno_db_settings.sql");
118
+ expect(results[0].path).toMatch(/^20251024_001_f000_t00\d_fragno_db_settings.sql$/);
121
119
 
122
120
  expect(results[1].namespace).toBe("apple-db");
123
121
  expect(results[1].path).toBe("20251024_002_f000_t001_apple-db.sql");
@@ -296,23 +294,19 @@ describe("generateMigrationsOrSchema - kysely", () => {
296
294
  });
297
295
 
298
296
  it("should include MySQL-specific foreign key checks in generated SQL", async () => {
299
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
300
- const mysqlDb = new Kysely({ dialect: new PostgresDialect({} as any) });
301
-
302
- // Mock Kysely transaction to prevent actual database connections
303
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
304
- vi.spyOn(mysqlDb, "transaction").mockReturnValue({
305
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
306
- execute: async (callback: any) => {
307
- const mockTx = {
308
- executeQuery: async () => ({ rows: [] }),
309
- };
310
- return callback(mockTx);
297
+ const mysqlAdapter = new KyselyAdapter({
298
+ dialect: {
299
+ createAdapter: () => new MysqlAdapter(),
300
+ createDriver: () => new DummyDriver(),
301
+ createQueryCompiler: () => ({
302
+ compileQuery: () => ({
303
+ sql: "",
304
+ parameters: [],
305
+ }),
306
+ }),
311
307
  },
312
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
313
- } as any);
314
-
315
- const mysqlAdapter = new KyselyAdapter({ db: mysqlDb, provider: "mysql" });
308
+ driverConfig: new MySQL2DriverConfig(),
309
+ });
316
310
 
317
311
  vi.spyOn(mysqlAdapter, "isConnectionHealthy").mockResolvedValue(true);
318
312
  vi.spyOn(mysqlAdapter, "getSchemaVersion").mockResolvedValue(undefined);
@@ -345,23 +339,19 @@ describe("generateMigrationsOrSchema - kysely", () => {
345
339
  });
346
340
 
347
341
  it("should include SQLite-specific pragma in generated SQL", async () => {
348
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
349
- const sqliteDb = new Kysely({ dialect: new PostgresDialect({} as any) });
350
-
351
- // Mock Kysely transaction to prevent actual database connections
352
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
353
- vi.spyOn(sqliteDb, "transaction").mockReturnValue({
354
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
355
- execute: async (callback: any) => {
356
- const mockTx = {
357
- executeQuery: async () => ({ rows: [] }),
358
- };
359
- return callback(mockTx);
342
+ const sqliteAdapter = new KyselyAdapter({
343
+ dialect: {
344
+ createAdapter: () => new SqliteAdapter(),
345
+ createDriver: () => new DummyDriver(),
346
+ createQueryCompiler: () => ({
347
+ compileQuery: () => ({
348
+ sql: "",
349
+ parameters: [],
350
+ }),
351
+ }),
360
352
  },
361
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
362
- } as any);
363
-
364
- const sqliteAdapter = new KyselyAdapter({ db: sqliteDb, provider: "sqlite" });
353
+ driverConfig: new SQLocalDriverConfig(),
354
+ });
365
355
 
366
356
  vi.spyOn(sqliteAdapter, "isConnectionHealthy").mockResolvedValue(true);
367
357
  vi.spyOn(sqliteAdapter, "getSchemaVersion").mockResolvedValue(undefined);
@@ -1,15 +1,14 @@
1
1
  import type { FragnoDatabase } from "../mod";
2
2
  import type { AnySchema } from "../schema/create";
3
- import type { PreparedMigration } from "./create";
4
3
  import {
5
4
  fragnoDatabaseAdapterNameFakeSymbol,
6
5
  fragnoDatabaseAdapterVersionFakeSymbol,
7
6
  } from "../adapters/adapters";
8
7
  import {
9
8
  internalFragmentDef,
10
- settingsSchema,
11
- SETTINGS_TABLE_NAME,
9
+ internalSchema,
12
10
  SETTINGS_NAMESPACE,
11
+ getSchemaVersionFromDatabase,
13
12
  } from "../fragments/internal-fragment";
14
13
  import { instantiate } from "@fragno-dev/core";
15
14
 
@@ -25,7 +24,6 @@ export interface GenerationInternalResult {
25
24
  namespace: string;
26
25
  fromVersion: number;
27
26
  toVersion: number;
28
- preparedMigration?: PreparedMigration;
29
27
  }
30
28
 
31
29
  export interface ExecuteMigrationResult {
@@ -68,7 +66,7 @@ export async function generateMigrationsOrSchema<
68
66
 
69
67
  // Include internal fragment first with empty namespace (settings table has no prefix)
70
68
  fragmentsMap.set("", {
71
- schema: settingsSchema,
69
+ schema: internalSchema,
72
70
  namespace: "",
73
71
  });
74
72
 
@@ -96,10 +94,10 @@ export async function generateMigrationsOrSchema<
96
94
  ];
97
95
  }
98
96
 
99
- // Otherwise, use migration engine for individual generation (e.g., Kysely)
100
- if (!adapter.createMigrationEngine) {
97
+ // Otherwise, use migration engine for individual generation (e.g., Kysely, GenericSQL)
98
+ if (!adapter.prepareMigrations) {
101
99
  throw new Error(
102
- "Adapter does not support migration-based schema generation. Ensure your adapter implements createMigrationEngine.",
100
+ "Adapter does not support migration-based schema generation. Ensure your adapter implements prepareMigrations.",
103
101
  );
104
102
  }
105
103
 
@@ -115,45 +113,22 @@ export async function generateMigrationsOrSchema<
115
113
  .withOptions({ databaseAdapter: adapter })
116
114
  .build();
117
115
 
118
- let settingsSourceVersion: number;
119
- try {
120
- const result = await internalFragment.inContext(async function () {
121
- return await this.uow(async ({ executeRetrieve }) => {
122
- const v = internalFragment.services.settingsService.get("version");
123
- await executeRetrieve();
124
-
125
- return v;
126
- });
127
- });
128
-
129
- if (!result) {
130
- settingsSourceVersion = 0;
131
- } else {
132
- settingsSourceVersion = parseInt(result.value);
133
- }
134
- } catch {
135
- // Settings table doesn't exist yet (first migration)
136
- settingsSourceVersion = 0;
137
- }
116
+ const settingsSourceVersion = await getSchemaVersionFromDatabase(
117
+ internalFragment,
118
+ SETTINGS_NAMESPACE,
119
+ );
138
120
 
139
121
  const generatedFiles: GenerationInternalResult[] = [];
140
122
 
141
123
  // Use empty namespace for settings (SETTINGS_NAMESPACE is for prefixing keys, not the database namespace)
142
- const settingsMigrator = adapter.createMigrationEngine(settingsSchema, "");
143
- const settingsTargetVersion = settingsSchema.version;
124
+ const settingsPreparedMigrations = adapter.prepareMigrations(internalSchema, "");
125
+ const settingsTargetVersion = internalSchema.version;
144
126
 
145
127
  // Generate settings table migration
146
- const settingsMigration = await settingsMigrator.prepareMigrationTo(settingsTargetVersion, {
147
- fromVersion: settingsSourceVersion,
148
- });
149
-
150
- if (!settingsMigration.getSQL) {
151
- throw new Error(
152
- "Migration engine does not support SQL generation. Ensure your adapter's migration engine provides getSQL().",
153
- );
154
- }
155
-
156
- const settingsSql = settingsMigration.getSQL();
128
+ const settingsSql = settingsPreparedMigrations.getSQL(
129
+ settingsSourceVersion,
130
+ settingsTargetVersion,
131
+ );
157
132
 
158
133
  if (settingsSql.trim()) {
159
134
  generatedFiles.push({
@@ -162,7 +137,6 @@ export async function generateMigrationsOrSchema<
162
137
  namespace: "", // Empty namespace for settings table
163
138
  fromVersion: settingsSourceVersion,
164
139
  toVersion: settingsTargetVersion,
165
- preparedMigration: settingsMigration,
166
140
  });
167
141
  }
168
142
 
@@ -171,29 +145,19 @@ export async function generateMigrationsOrSchema<
171
145
  const dbAdapter = db.adapter;
172
146
 
173
147
  // Use migration engine
174
- if (!dbAdapter.createMigrationEngine) {
148
+ if (!dbAdapter.prepareMigrations) {
175
149
  throw new Error(
176
150
  `Adapter for ${db.namespace} does not support schema generation. ` +
177
- `Ensure your adapter implements either createSchemaGenerator or createMigrationEngine.`,
151
+ `Ensure your adapter implements either createSchemaGenerator or prepareMigrations.`,
178
152
  );
179
153
  }
180
154
 
181
- const migrator = dbAdapter.createMigrationEngine(db.schema, db.namespace);
155
+ const preparedMigrations = dbAdapter.prepareMigrations(db.schema, db.namespace);
182
156
  const targetVersion = options?.toVersion ?? db.schema.version;
183
157
  const sourceVersion = options?.fromVersion ?? 0;
184
158
 
185
159
  // Generate migration from source to target version
186
- const preparedMigration = await migrator.prepareMigrationTo(targetVersion, {
187
- fromVersion: sourceVersion,
188
- });
189
-
190
- if (!preparedMigration.getSQL) {
191
- throw new Error(
192
- "Migration engine does not support SQL generation. Ensure your adapter's migration engine provides getSQL().",
193
- );
194
- }
195
-
196
- const sql = preparedMigration.getSQL();
160
+ const sql = preparedMigrations.getSQL(sourceVersion, targetVersion);
197
161
 
198
162
  // If no migrations needed, skip this fragment
199
163
  if (sql.trim()) {
@@ -203,7 +167,6 @@ export async function generateMigrationsOrSchema<
203
167
  namespace: db.namespace,
204
168
  fromVersion: sourceVersion,
205
169
  toVersion: targetVersion,
206
- preparedMigration: preparedMigration,
207
170
  });
208
171
  }
209
172
  }
@@ -230,7 +193,7 @@ export async function executeMigrations<const TDatabases extends FragnoDatabase<
230
193
  const adapter = firstDb.adapter;
231
194
 
232
195
  // Validate adapter supports migrations
233
- if (!adapter.createMigrationEngine) {
196
+ if (!adapter.prepareMigrations) {
234
197
  throw new Error(
235
198
  "Adapter does not support running migrations. The adapter only supports schema generation.\n" +
236
199
  "Try using 'generateMigrationsOrSchema' instead to generate schema files.",
@@ -264,7 +227,7 @@ export async function executeMigrations<const TDatabases extends FragnoDatabase<
264
227
  namespace: string;
265
228
  fromVersion: number;
266
229
  toVersion: number;
267
- preparedMigration: PreparedMigration;
230
+ execute: () => Promise<void>;
268
231
  }> = [];
269
232
 
270
233
  // 1. Prepare settings table migration
@@ -274,43 +237,31 @@ export async function executeMigrations<const TDatabases extends FragnoDatabase<
274
237
  .withOptions({ databaseAdapter: adapter })
275
238
  .build();
276
239
 
277
- let settingsSourceVersion: number;
278
- try {
279
- const result = await internalFragment.inContext(async function () {
280
- return this.uow(async ({ forSchema, executeRetrieve }) => {
281
- const uow = forSchema(settingsSchema);
282
- const findOp = uow.find(SETTINGS_TABLE_NAME, (b) =>
283
- b.whereIndex("unique_key", (eb) => eb("key", "=", `${SETTINGS_NAMESPACE}.version`)),
284
- );
285
-
286
- await executeRetrieve();
287
-
288
- const [results] = await findOp.retrievalPhase;
289
- return results?.[0];
290
- });
291
- });
292
- settingsSourceVersion = result ? parseInt(result.value) : 0;
293
- } catch {
294
- // Settings table doesn't exist yet (first migration)
295
- settingsSourceVersion = 0;
296
- }
240
+ const settingsSourceVersion = await getSchemaVersionFromDatabase(
241
+ internalFragment,
242
+ SETTINGS_NAMESPACE,
243
+ );
297
244
 
298
245
  // Use empty namespace for settings (SETTINGS_NAMESPACE is for prefixing keys, not the database namespace)
299
- const settingsMigrator = adapter.createMigrationEngine(settingsSchema, "");
300
- const settingsTargetVersion = settingsSchema.version;
246
+ const settingsPreparedMigrations = adapter.prepareMigrations(internalSchema, "");
247
+ const settingsTargetVersion = internalSchema.version;
301
248
 
302
249
  if (settingsSourceVersion < settingsTargetVersion) {
303
- const settingsMigration = await settingsMigrator.prepareMigrationTo(settingsTargetVersion, {
304
- fromVersion: settingsSourceVersion,
305
- updateSettings: true,
306
- });
250
+ const compiledMigration = settingsPreparedMigrations.compile(
251
+ settingsSourceVersion,
252
+ settingsTargetVersion,
253
+ { updateVersionInMigration: true },
254
+ );
307
255
 
308
- if (settingsMigration.operations.length > 0) {
256
+ if (compiledMigration.statements.length > 0) {
309
257
  migrationsToExecute.push({
310
258
  namespace: "", // Empty namespace for settings table
311
259
  fromVersion: settingsSourceVersion,
312
260
  toVersion: settingsTargetVersion,
313
- preparedMigration: settingsMigration,
261
+ execute: () =>
262
+ settingsPreparedMigrations.execute(settingsSourceVersion, settingsTargetVersion, {
263
+ updateVersionInMigration: true,
264
+ }),
314
265
  });
315
266
  }
316
267
  }
@@ -319,21 +270,24 @@ export async function executeMigrations<const TDatabases extends FragnoDatabase<
319
270
  const sortedDatabases = [...databases].sort((a, b) => a.namespace.localeCompare(b.namespace));
320
271
 
321
272
  for (const fragnoDb of sortedDatabases) {
322
- const migrator = adapter.createMigrationEngine(fragnoDb.schema, fragnoDb.namespace);
323
- const currentVersion = await migrator.getVersion();
273
+ const preparedMigrations = adapter.prepareMigrations(fragnoDb.schema, fragnoDb.namespace);
274
+ const currentVersion = await getSchemaVersionFromDatabase(internalFragment, fragnoDb.namespace);
324
275
  const targetVersion = fragnoDb.schema.version;
325
276
 
326
277
  if (currentVersion < targetVersion) {
327
- const preparedMigration = await migrator.prepareMigrationTo(targetVersion, {
328
- updateSettings: true,
278
+ const compiledMigration = preparedMigrations.compile(currentVersion, targetVersion, {
279
+ updateVersionInMigration: true,
329
280
  });
330
281
 
331
- if (preparedMigration.operations.length > 0) {
282
+ if (compiledMigration.statements.length > 0) {
332
283
  migrationsToExecute.push({
333
284
  namespace: fragnoDb.namespace,
334
285
  fromVersion: currentVersion,
335
286
  toVersion: targetVersion,
336
- preparedMigration: preparedMigration,
287
+ execute: () =>
288
+ preparedMigrations.execute(currentVersion, targetVersion, {
289
+ updateVersionInMigration: true,
290
+ }),
337
291
  });
338
292
  }
339
293
  }
@@ -341,7 +295,7 @@ export async function executeMigrations<const TDatabases extends FragnoDatabase<
341
295
 
342
296
  // 3. Execute all migrations in order
343
297
  for (const migration of migrationsToExecute) {
344
- await migration.preparedMigration.execute();
298
+ await migration.execute();
345
299
  results.push({
346
300
  namespace: migration.namespace,
347
301
  didMigrate: true,