@fragno-dev/db 0.3.0 → 0.4.1

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 (516) hide show
  1. package/.turbo/turbo-build.log +327 -160
  2. package/CHANGELOG.md +74 -0
  3. package/README.md +24 -0
  4. package/dist/adapters/adapters.d.ts +1 -1
  5. package/dist/adapters/adapters.d.ts.map +1 -1
  6. package/dist/adapters/adapters.js.map +1 -1
  7. package/dist/adapters/generic-sql/generic-sql-adapter.d.ts +0 -3
  8. package/dist/adapters/generic-sql/generic-sql-adapter.d.ts.map +1 -1
  9. package/dist/adapters/generic-sql/generic-sql-adapter.js +11 -12
  10. package/dist/adapters/generic-sql/generic-sql-adapter.js.map +1 -1
  11. package/dist/adapters/generic-sql/generic-sql-uow-executor.js +46 -6
  12. package/dist/adapters/generic-sql/generic-sql-uow-executor.js.map +1 -1
  13. package/dist/adapters/generic-sql/migration/cold-kysely.js.map +1 -1
  14. package/dist/adapters/generic-sql/migration/dialect/mysql.js +1 -1
  15. package/dist/adapters/generic-sql/migration/dialect/mysql.js.map +1 -1
  16. package/dist/adapters/generic-sql/migration/dialect/postgres.js +1 -1
  17. package/dist/adapters/generic-sql/migration/dialect/postgres.js.map +1 -1
  18. package/dist/adapters/generic-sql/migration/dialect/sqlite.js +185 -19
  19. package/dist/adapters/generic-sql/migration/dialect/sqlite.js.map +1 -1
  20. package/dist/adapters/generic-sql/migration/executor.d.ts.map +1 -1
  21. package/dist/adapters/generic-sql/migration/executor.js +30 -3
  22. package/dist/adapters/generic-sql/migration/executor.js.map +1 -1
  23. package/dist/adapters/generic-sql/migration/prepared-migrations.d.ts.map +1 -1
  24. package/dist/adapters/generic-sql/migration/prepared-migrations.js +3 -3
  25. package/dist/adapters/generic-sql/migration/prepared-migrations.js.map +1 -1
  26. package/dist/adapters/generic-sql/migration/sql-generator.js +1 -1
  27. package/dist/adapters/generic-sql/migration/sql-generator.js.map +1 -1
  28. package/dist/adapters/generic-sql/query/create-sql-query-compiler.js +1 -1
  29. package/dist/adapters/generic-sql/query/create-sql-query-compiler.js.map +1 -1
  30. package/dist/adapters/generic-sql/query/cursor-utils.js.map +1 -1
  31. package/dist/adapters/generic-sql/query/db-now-sql.js +27 -0
  32. package/dist/adapters/generic-sql/query/db-now-sql.js.map +1 -0
  33. package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js +9 -6
  34. package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js.map +1 -1
  35. package/dist/adapters/generic-sql/query/select-builder.js.map +1 -1
  36. package/dist/adapters/generic-sql/query/sql-query-compiler.js +37 -9
  37. package/dist/adapters/generic-sql/query/sql-query-compiler.js.map +1 -1
  38. package/dist/adapters/generic-sql/query/where-builder.js +24 -20
  39. package/dist/adapters/generic-sql/query/where-builder.js.map +1 -1
  40. package/dist/adapters/generic-sql/uow-decoder.js +1 -1
  41. package/dist/adapters/generic-sql/uow-decoder.js.map +1 -1
  42. package/dist/adapters/generic-sql/uow-encoder.js +8 -9
  43. package/dist/adapters/generic-sql/uow-encoder.js.map +1 -1
  44. package/dist/adapters/in-memory/condition-evaluator.js +10 -6
  45. package/dist/adapters/in-memory/condition-evaluator.js.map +1 -1
  46. package/dist/adapters/in-memory/in-memory-adapter.d.ts.map +1 -1
  47. package/dist/adapters/in-memory/in-memory-adapter.js +45 -25
  48. package/dist/adapters/in-memory/in-memory-adapter.js.map +1 -1
  49. package/dist/adapters/in-memory/in-memory-uow.js +236 -13
  50. package/dist/adapters/in-memory/in-memory-uow.js.map +1 -1
  51. package/dist/adapters/in-memory/options.d.ts +2 -0
  52. package/dist/adapters/in-memory/options.d.ts.map +1 -1
  53. package/dist/adapters/in-memory/options.js +3 -2
  54. package/dist/adapters/in-memory/options.js.map +1 -1
  55. package/dist/adapters/in-memory/reference-resolution.js.map +1 -1
  56. package/dist/adapters/in-memory/store.js +1 -1
  57. package/dist/adapters/in-memory/store.js.map +1 -1
  58. package/dist/adapters/shared/from-unit-of-work-compiler.js +51 -24
  59. package/dist/adapters/shared/from-unit-of-work-compiler.js.map +1 -1
  60. package/dist/adapters/shared/uow-operation-compiler.js.map +1 -1
  61. package/dist/browser/adapters/adapters.d.ts +61 -0
  62. package/dist/browser/adapters/adapters.d.ts.map +1 -0
  63. package/dist/browser/adapters/generic-sql/migration/executor.d.ts +15 -0
  64. package/dist/browser/adapters/generic-sql/migration/executor.d.ts.map +1 -0
  65. package/dist/browser/adapters/generic-sql/migration/prepared-migrations.d.ts +66 -0
  66. package/dist/browser/adapters/generic-sql/migration/prepared-migrations.d.ts.map +1 -0
  67. package/dist/browser/adapters/generic-sql/sqlite-storage.d.ts +11 -0
  68. package/dist/browser/adapters/generic-sql/sqlite-storage.d.ts.map +1 -0
  69. package/dist/browser/adapters/in-memory/in-memory-adapter.d.ts +5 -0
  70. package/dist/browser/adapters/in-memory/index.d.ts +2 -0
  71. package/dist/browser/adapters/in-memory/options.d.ts +1 -0
  72. package/dist/browser/db-fragment-definition-builder.d.ts +237 -0
  73. package/dist/browser/db-fragment-definition-builder.d.ts.map +1 -0
  74. package/dist/browser/durable-hooks.d.ts +3 -0
  75. package/dist/browser/fragments/internal-fragment.d.ts +317 -0
  76. package/dist/browser/fragments/internal-fragment.d.ts.map +1 -0
  77. package/dist/browser/fragments/internal-fragment.schema.d.ts +1 -0
  78. package/dist/browser/hooks/durable-hooks-logger.d.ts +10 -0
  79. package/dist/browser/hooks/durable-hooks-logger.d.ts.map +1 -0
  80. package/dist/browser/hooks/hooks.d.ts +146 -0
  81. package/dist/browser/hooks/hooks.d.ts.map +1 -0
  82. package/dist/browser/id.js +1 -0
  83. package/dist/browser/internal/adapter-registry.d.ts +4 -0
  84. package/dist/browser/internal/outbox-state.d.ts +2 -0
  85. package/dist/browser/mod.d.ts +15 -0
  86. package/dist/browser/mod.d.ts.map +1 -0
  87. package/dist/browser/mod.js +17 -0
  88. package/dist/browser/mod.js.map +1 -0
  89. package/dist/browser/mod2.d.ts +48 -0
  90. package/dist/browser/mod2.d.ts.map +1 -0
  91. package/dist/browser/naming/sql-naming.d.ts +19 -0
  92. package/dist/browser/naming/sql-naming.d.ts.map +1 -0
  93. package/dist/browser/outbox/outbox.d.ts +21 -0
  94. package/dist/browser/outbox/outbox.d.ts.map +1 -0
  95. package/dist/browser/query/column-defaults.js +1 -0
  96. package/dist/browser/query/condition-builder.d.ts +44 -0
  97. package/dist/browser/query/condition-builder.d.ts.map +1 -0
  98. package/dist/browser/query/condition-builder.js +97 -0
  99. package/dist/browser/query/condition-builder.js.map +1 -0
  100. package/dist/browser/query/cursor.d.ts +105 -0
  101. package/dist/browser/query/cursor.d.ts.map +1 -0
  102. package/dist/browser/query/cursor.js +150 -0
  103. package/dist/browser/query/cursor.js.map +1 -0
  104. package/dist/browser/query/db-now.d.ts +22 -0
  105. package/dist/browser/query/db-now.d.ts.map +1 -0
  106. package/dist/browser/query/db-now.js +33 -0
  107. package/dist/browser/query/db-now.js.map +1 -0
  108. package/dist/browser/query/orm/orm.d.ts +18 -0
  109. package/dist/browser/query/orm/orm.d.ts.map +1 -0
  110. package/dist/browser/query/simple-query-interface.d.ts +108 -0
  111. package/dist/browser/query/simple-query-interface.d.ts.map +1 -0
  112. package/dist/browser/query/unit-of-work/execute-unit-of-work.d.ts +423 -0
  113. package/dist/browser/query/unit-of-work/execute-unit-of-work.d.ts.map +1 -0
  114. package/dist/browser/query/unit-of-work/execute-unit-of-work.js +507 -0
  115. package/dist/browser/query/unit-of-work/execute-unit-of-work.js.map +1 -0
  116. package/dist/browser/query/unit-of-work/retry-policy.d.ts +23 -0
  117. package/dist/browser/query/unit-of-work/retry-policy.d.ts.map +1 -0
  118. package/dist/browser/query/unit-of-work/retry-policy.js +40 -0
  119. package/dist/browser/query/unit-of-work/retry-policy.js.map +1 -0
  120. package/dist/browser/query/unit-of-work/unit-of-work.d.ts +703 -0
  121. package/dist/browser/query/unit-of-work/unit-of-work.d.ts.map +1 -0
  122. package/dist/browser/query/unit-of-work/unit-of-work.js +1206 -0
  123. package/dist/browser/query/unit-of-work/unit-of-work.js.map +1 -0
  124. package/dist/browser/query/value-encoding.js +38 -0
  125. package/dist/browser/query/value-encoding.js.map +1 -0
  126. package/dist/browser/schema/create.d.ts +326 -0
  127. package/dist/browser/schema/create.d.ts.map +1 -0
  128. package/dist/browser/schema/create.js +89 -0
  129. package/dist/browser/schema/create.js.map +1 -0
  130. package/dist/browser/schema/generate-id.js +28 -0
  131. package/dist/browser/schema/generate-id.js.map +1 -0
  132. package/dist/browser/shared/providers.d.ts +6 -0
  133. package/dist/browser/shared/providers.d.ts.map +1 -0
  134. package/dist/browser/sql-driver/connection/connection-provider.d.ts +13 -0
  135. package/dist/browser/sql-driver/connection/connection-provider.d.ts.map +1 -0
  136. package/dist/browser/sql-driver/dialect-adapter/dialect-adapter.d.ts +7 -0
  137. package/dist/browser/sql-driver/dialect-adapter/dialect-adapter.d.ts.map +1 -0
  138. package/dist/browser/sql-driver/driver/runtime-driver.d.ts +23 -0
  139. package/dist/browser/sql-driver/driver/runtime-driver.d.ts.map +1 -0
  140. package/dist/browser/sql-driver/query-executor/plugin.d.ts +17 -0
  141. package/dist/browser/sql-driver/query-executor/plugin.d.ts.map +1 -0
  142. package/dist/browser/sql-driver/query-executor/query-executor.d.ts +36 -0
  143. package/dist/browser/sql-driver/query-executor/query-executor.d.ts.map +1 -0
  144. package/dist/browser/sql-driver/sql-driver-adapter.d.ts +29 -0
  145. package/dist/browser/sql-driver/sql-driver-adapter.d.ts.map +1 -0
  146. package/dist/browser/sql-driver/sql-driver.d.ts +38 -0
  147. package/dist/browser/sql-driver/sql-driver.d.ts.map +1 -0
  148. package/dist/browser/sync/commands.d.ts +15 -0
  149. package/dist/browser/sync/commands.d.ts.map +1 -0
  150. package/dist/browser/sync/commands.js +27 -0
  151. package/dist/browser/sync/commands.js.map +1 -0
  152. package/dist/browser/sync/types.d.ts +63 -0
  153. package/dist/browser/sync/types.d.ts.map +1 -0
  154. package/dist/browser/util/types.d.ts +8 -0
  155. package/dist/browser/util/types.d.ts.map +1 -0
  156. package/dist/browser/with-database.d.ts +29 -0
  157. package/dist/browser/with-database.d.ts.map +1 -0
  158. package/dist/client.d.ts +4 -0
  159. package/dist/client.js +5 -0
  160. package/dist/db-fragment-definition-builder.d.ts +85 -28
  161. package/dist/db-fragment-definition-builder.d.ts.map +1 -1
  162. package/dist/db-fragment-definition-builder.js +374 -46
  163. package/dist/db-fragment-definition-builder.js.map +1 -1
  164. package/dist/dispatchers/cloudflare-do/dispatcher.d.ts +20 -0
  165. package/dist/dispatchers/cloudflare-do/dispatcher.d.ts.map +1 -0
  166. package/dist/dispatchers/cloudflare-do/dispatcher.js +147 -0
  167. package/dist/dispatchers/cloudflare-do/dispatcher.js.map +1 -0
  168. package/dist/dispatchers/cloudflare-do/index.d.ts +5 -20
  169. package/dist/dispatchers/cloudflare-do/index.d.ts.map +1 -1
  170. package/dist/dispatchers/cloudflare-do/index.js +23 -55
  171. package/dist/dispatchers/cloudflare-do/index.js.map +1 -1
  172. package/dist/dispatchers/node/dispatcher.d.ts +14 -0
  173. package/dist/dispatchers/node/dispatcher.d.ts.map +1 -0
  174. package/dist/dispatchers/node/dispatcher.js +80 -0
  175. package/dist/dispatchers/node/dispatcher.js.map +1 -0
  176. package/dist/dispatchers/node/index.d.ts +5 -10
  177. package/dist/dispatchers/node/index.d.ts.map +1 -1
  178. package/dist/dispatchers/node/index.js +21 -53
  179. package/dist/dispatchers/node/index.js.map +1 -1
  180. package/dist/durable-hooks.d.ts +31 -0
  181. package/dist/durable-hooks.d.ts.map +1 -0
  182. package/dist/durable-hooks.js +23 -0
  183. package/dist/durable-hooks.js.map +1 -0
  184. package/dist/fragments/internal-fragment.d.ts +128 -27
  185. package/dist/fragments/internal-fragment.d.ts.map +1 -1
  186. package/dist/fragments/internal-fragment.js +125 -78
  187. package/dist/fragments/internal-fragment.js.map +1 -1
  188. package/dist/fragments/internal-fragment.routes.js +138 -3
  189. package/dist/fragments/internal-fragment.routes.js.map +1 -1
  190. package/dist/fragments/internal-fragment.schema.d.ts +7 -1
  191. package/dist/fragments/internal-fragment.schema.d.ts.map +1 -1
  192. package/dist/fragments/internal-fragment.schema.js +18 -1
  193. package/dist/fragments/internal-fragment.schema.js.map +1 -1
  194. package/dist/hooks/durable-hooks-logger.d.ts +10 -0
  195. package/dist/hooks/durable-hooks-logger.d.ts.map +1 -0
  196. package/dist/hooks/durable-hooks-logger.js +75 -0
  197. package/dist/hooks/durable-hooks-logger.js.map +1 -0
  198. package/dist/hooks/durable-hooks-processor.d.ts +1 -14
  199. package/dist/hooks/durable-hooks-processor.js +58 -10
  200. package/dist/hooks/durable-hooks-processor.js.map +1 -1
  201. package/dist/hooks/durable-hooks-runtime.js +44 -0
  202. package/dist/hooks/durable-hooks-runtime.js.map +1 -0
  203. package/dist/hooks/hooks.d.ts +60 -2
  204. package/dist/hooks/hooks.d.ts.map +1 -1
  205. package/dist/hooks/hooks.js +214 -53
  206. package/dist/hooks/hooks.js.map +1 -1
  207. package/dist/id.d.ts +2 -2
  208. package/dist/id.js +2 -2
  209. package/dist/internal/adapter-registry.d.ts +11 -0
  210. package/dist/internal/adapter-registry.d.ts.map +1 -0
  211. package/dist/internal/adapter-registry.js +135 -0
  212. package/dist/internal/adapter-registry.js.map +1 -0
  213. package/dist/internal/outbox-state.d.ts +2 -0
  214. package/dist/internal/outbox-state.js +26 -0
  215. package/dist/internal/outbox-state.js.map +1 -0
  216. package/dist/migration-engine/auto-from-schema.d.ts +33 -0
  217. package/dist/migration-engine/auto-from-schema.d.ts.map +1 -0
  218. package/dist/migration-engine/auto-from-schema.js +210 -27
  219. package/dist/migration-engine/auto-from-schema.js.map +1 -1
  220. package/dist/migration-engine/generation-engine.d.ts.map +1 -1
  221. package/dist/migration-engine/generation-engine.js +17 -5
  222. package/dist/migration-engine/generation-engine.js.map +1 -1
  223. package/dist/migration-engine/shared.d.ts +113 -0
  224. package/dist/migration-engine/shared.d.ts.map +1 -0
  225. package/dist/migration-engine/shared.js.map +1 -1
  226. package/dist/mod.d.ts +12 -11
  227. package/dist/mod.d.ts.map +1 -1
  228. package/dist/mod.js +10 -10
  229. package/dist/mod.js.map +1 -1
  230. package/dist/naming/sql-naming.d.ts.map +1 -1
  231. package/dist/naming/sql-naming.js.map +1 -1
  232. package/dist/outbox/outbox-builder.js.map +1 -1
  233. package/dist/outbox/outbox.d.ts +3 -1
  234. package/dist/outbox/outbox.d.ts.map +1 -1
  235. package/dist/outbox/outbox.js.map +1 -1
  236. package/dist/query/column-defaults.js.map +1 -1
  237. package/dist/query/condition-builder.d.ts +7 -1
  238. package/dist/query/condition-builder.d.ts.map +1 -1
  239. package/dist/query/condition-builder.js +5 -1
  240. package/dist/query/condition-builder.js.map +1 -1
  241. package/dist/query/cursor-client.d.ts +105 -0
  242. package/dist/query/cursor-client.d.ts.map +1 -0
  243. package/dist/query/cursor-client.js +165 -0
  244. package/dist/query/cursor-client.js.map +1 -0
  245. package/dist/query/cursor.d.ts.map +1 -1
  246. package/dist/query/cursor.js +7 -1
  247. package/dist/query/cursor.js.map +1 -1
  248. package/dist/query/db-now.d.ts +15 -1
  249. package/dist/query/db-now.d.ts.map +1 -1
  250. package/dist/query/db-now.js +30 -2
  251. package/dist/query/db-now.js.map +1 -1
  252. package/dist/query/orm/orm.js.map +1 -1
  253. package/dist/query/serialize/create-sql-serializer.js +2 -2
  254. package/dist/query/serialize/create-sql-serializer.js.map +1 -1
  255. package/dist/query/serialize/dialect/mysql-serializer.js.map +1 -1
  256. package/dist/query/serialize/dialect/postgres-serializer.js.map +1 -1
  257. package/dist/query/serialize/dialect/sqlite-serializer.js +6 -2
  258. package/dist/query/serialize/dialect/sqlite-serializer.js.map +1 -1
  259. package/dist/query/simple-query-interface.d.ts +7 -3
  260. package/dist/query/simple-query-interface.d.ts.map +1 -1
  261. package/dist/query/unit-of-work/execute-unit-of-work.d.ts +37 -2
  262. package/dist/query/unit-of-work/execute-unit-of-work.d.ts.map +1 -1
  263. package/dist/query/unit-of-work/execute-unit-of-work.js +39 -18
  264. package/dist/query/unit-of-work/execute-unit-of-work.js.map +1 -1
  265. package/dist/query/unit-of-work/unit-of-work.d.ts +42 -16
  266. package/dist/query/unit-of-work/unit-of-work.d.ts.map +1 -1
  267. package/dist/query/unit-of-work/unit-of-work.js +50 -6
  268. package/dist/query/unit-of-work/unit-of-work.js.map +1 -1
  269. package/dist/query/value-decoding.js +8 -1
  270. package/dist/query/value-decoding.js.map +1 -1
  271. package/dist/query/value-encoding.js.map +1 -1
  272. package/dist/schema/create.d.ts +69 -25
  273. package/dist/schema/create.d.ts.map +1 -1
  274. package/dist/schema/create.js +91 -16
  275. package/dist/schema/create.js.map +1 -1
  276. package/dist/schema/type-conversion/create-sql-type-mapper.js +1 -1
  277. package/dist/schema/type-conversion/create-sql-type-mapper.js.map +1 -1
  278. package/dist/schema/type-conversion/dialect/sqlite.js.map +1 -1
  279. package/dist/schema/validator.d.ts.map +1 -1
  280. package/dist/schema/validator.js.map +1 -1
  281. package/dist/schema-output/drizzle.d.ts.map +1 -1
  282. package/dist/schema-output/drizzle.js +8 -6
  283. package/dist/schema-output/drizzle.js.map +1 -1
  284. package/dist/schema-output/prisma.d.ts.map +1 -1
  285. package/dist/schema-output/prisma.js +21 -10
  286. package/dist/schema-output/prisma.js.map +1 -1
  287. package/dist/sql-driver/dialects/durable-object-dialect.js +3 -9
  288. package/dist/sql-driver/dialects/durable-object-dialect.js.map +1 -1
  289. package/dist/sql-driver/query-executor/default-query-executor.js.map +1 -1
  290. package/dist/sql-driver/query-executor/query-executor-base.js.map +1 -1
  291. package/dist/sql-driver/sql-driver-adapter.js.map +1 -1
  292. package/dist/sql-driver/sql.js.map +1 -1
  293. package/dist/sync/commands.d.ts +15 -0
  294. package/dist/sync/commands.d.ts.map +1 -0
  295. package/dist/sync/commands.js +27 -0
  296. package/dist/sync/commands.js.map +1 -0
  297. package/dist/sync/index.d.ts +4 -0
  298. package/dist/sync/index.js +4 -0
  299. package/dist/sync/read-tracking.d.ts +25 -0
  300. package/dist/sync/read-tracking.d.ts.map +1 -0
  301. package/dist/sync/read-tracking.js +148 -0
  302. package/dist/sync/read-tracking.js.map +1 -0
  303. package/dist/sync/submit.js +213 -0
  304. package/dist/sync/submit.js.map +1 -0
  305. package/dist/sync/types.d.ts +63 -0
  306. package/dist/sync/types.d.ts.map +1 -0
  307. package/dist/util/default-database-adapter.js +6 -1
  308. package/dist/util/default-database-adapter.js.map +1 -1
  309. package/dist/with-database.d.ts +3 -6
  310. package/dist/with-database.d.ts.map +1 -1
  311. package/dist/with-database.js +7 -15
  312. package/dist/with-database.js.map +1 -1
  313. package/package.json +33 -41
  314. package/src/adapters/adapters.ts +5 -4
  315. package/src/adapters/drizzle/migrate-drizzle.test.ts +46 -9
  316. package/src/adapters/drizzle/migration-parity-drizzle-kit.test.ts +5 -3
  317. package/src/adapters/drizzle/test-utils.ts +2 -1
  318. package/src/adapters/generic-sql/generic-sql-adapter.test.ts +5 -3
  319. package/src/adapters/generic-sql/generic-sql-adapter.ts +21 -24
  320. package/src/adapters/generic-sql/generic-sql-uow-executor.test.ts +1 -0
  321. package/src/adapters/generic-sql/generic-sql-uow-executor.ts +81 -15
  322. package/src/adapters/generic-sql/migration/adapter-migration-parity.test.ts +4 -2
  323. package/src/adapters/generic-sql/migration/cold-kysely.ts +1 -0
  324. package/src/adapters/generic-sql/migration/dialect/mysql.test.ts +3 -2
  325. package/src/adapters/generic-sql/migration/dialect/mysql.ts +1 -0
  326. package/src/adapters/generic-sql/migration/dialect/postgres.test.ts +5 -4
  327. package/src/adapters/generic-sql/migration/dialect/postgres.ts +2 -1
  328. package/src/adapters/generic-sql/migration/dialect/sqlite.test.ts +795 -3
  329. package/src/adapters/generic-sql/migration/dialect/sqlite.ts +385 -57
  330. package/src/adapters/generic-sql/migration/executor.test.ts +52 -0
  331. package/src/adapters/generic-sql/migration/executor.ts +47 -4
  332. package/src/adapters/generic-sql/migration/prepared-migrations.test.ts +117 -14
  333. package/src/adapters/generic-sql/migration/prepared-migrations.ts +9 -8
  334. package/src/adapters/generic-sql/migration/sql-generator.ts +5 -3
  335. package/src/adapters/generic-sql/query/create-sql-query-compiler.ts +3 -3
  336. package/src/adapters/generic-sql/query/cursor-utils.test.ts +3 -2
  337. package/src/adapters/generic-sql/query/cursor-utils.ts +1 -1
  338. package/src/adapters/generic-sql/query/db-now-sql.ts +49 -0
  339. package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.test.ts +144 -8
  340. package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.ts +16 -17
  341. package/src/adapters/generic-sql/query/select-builder.test.ts +1 -0
  342. package/src/adapters/generic-sql/query/select-builder.ts +2 -2
  343. package/src/adapters/generic-sql/query/sql-query-compiler.test.ts +24 -5
  344. package/src/adapters/generic-sql/query/sql-query-compiler.ts +83 -13
  345. package/src/adapters/generic-sql/query/where-builder.test.ts +7 -5
  346. package/src/adapters/generic-sql/query/where-builder.ts +48 -29
  347. package/src/adapters/generic-sql/sql-adapter-pglite-migrations.test.ts +6 -15
  348. package/src/adapters/generic-sql/sql-adapter-pglite-pagination.test.ts +52 -7
  349. package/src/adapters/generic-sql/sql-adapter-pglite-queries.test.ts +9 -6
  350. package/src/adapters/generic-sql/sql-adapter-sqlite3-driver.test.ts +273 -5
  351. package/src/adapters/generic-sql/sql-adapter-sqlite3-uow.test.ts +123 -6
  352. package/src/adapters/generic-sql/sql-adapter-sqlocal.test.ts +4 -2
  353. package/src/adapters/generic-sql/uow-decoder.test.ts +4 -3
  354. package/src/adapters/generic-sql/uow-decoder.ts +3 -3
  355. package/src/adapters/generic-sql/uow-encoder.test.ts +4 -2
  356. package/src/adapters/generic-sql/uow-encoder.ts +14 -18
  357. package/src/adapters/in-memory/condition-evaluator.test.ts +2 -1
  358. package/src/adapters/in-memory/condition-evaluator.ts +9 -4
  359. package/src/adapters/in-memory/in-memory-adapter.ts +155 -44
  360. package/src/adapters/in-memory/in-memory-uow.mutations.test.ts +50 -2
  361. package/src/adapters/in-memory/in-memory-uow.retrieval.test.ts +158 -3
  362. package/src/adapters/in-memory/in-memory-uow.ts +402 -26
  363. package/src/adapters/in-memory/options.test.ts +1 -0
  364. package/src/adapters/in-memory/options.ts +5 -1
  365. package/src/adapters/in-memory/outbox.test.ts +361 -0
  366. package/src/adapters/in-memory/reference-resolution.test.ts +3 -2
  367. package/src/adapters/in-memory/reference-resolution.ts +2 -2
  368. package/src/adapters/in-memory/sorted-array-index.test.ts +1 -0
  369. package/src/adapters/in-memory/store.test.ts +1 -0
  370. package/src/adapters/in-memory/store.ts +3 -3
  371. package/src/adapters/in-memory/value-normalization.test.ts +1 -0
  372. package/src/adapters/prisma/prisma-adapter-sqlite3.test.ts +51 -7
  373. package/src/adapters/shared/from-unit-of-work-compiler.ts +156 -46
  374. package/src/adapters/shared/uow-operation-compiler.ts +3 -3
  375. package/src/browser/mod.ts +64 -0
  376. package/src/client.ts +19 -0
  377. package/src/db-fragment-definition-builder.test.ts +821 -47
  378. package/src/db-fragment-definition-builder.ts +857 -110
  379. package/src/db-fragment-instantiator.test.ts +114 -90
  380. package/src/db-fragment-integration.test.ts +9 -6
  381. package/src/dispatchers/cloudflare-do/dispatcher.ts +204 -0
  382. package/src/dispatchers/cloudflare-do/index.test.ts +145 -12
  383. package/src/dispatchers/cloudflare-do/index.ts +49 -90
  384. package/src/dispatchers/node/dispatcher.ts +112 -0
  385. package/src/dispatchers/node/index.test.ts +43 -14
  386. package/src/dispatchers/node/index.ts +38 -75
  387. package/src/durable-hooks.test.ts +80 -0
  388. package/src/durable-hooks.ts +67 -0
  389. package/src/fragments/internal-fragment.routes.test.ts +570 -0
  390. package/src/fragments/internal-fragment.routes.ts +297 -5
  391. package/src/fragments/internal-fragment.schema.ts +45 -1
  392. package/src/fragments/internal-fragment.test.ts +223 -251
  393. package/src/fragments/internal-fragment.ts +278 -154
  394. package/src/hooks/durable-hooks-logger.ts +126 -0
  395. package/src/hooks/durable-hooks-processor.pglite.test.ts +87 -0
  396. package/src/hooks/durable-hooks-processor.test.ts +179 -14
  397. package/src/hooks/durable-hooks-processor.ts +120 -14
  398. package/src/hooks/durable-hooks-runtime.test.ts +65 -0
  399. package/src/hooks/durable-hooks-runtime.ts +81 -0
  400. package/src/hooks/hooks.test.ts +314 -53
  401. package/src/hooks/hooks.ts +360 -81
  402. package/src/id.test.ts +34 -0
  403. package/src/id.ts +1 -3
  404. package/src/internal/adapter-registry.test.ts +93 -0
  405. package/src/internal/adapter-registry.ts +239 -0
  406. package/src/internal/outbox-state.ts +43 -0
  407. package/src/migration-engine/auto-from-schema.test.ts +93 -0
  408. package/src/migration-engine/auto-from-schema.ts +360 -42
  409. package/src/migration-engine/create.test.ts +2 -1
  410. package/src/migration-engine/create.ts +1 -1
  411. package/src/migration-engine/generation-engine.test.ts +66 -9
  412. package/src/migration-engine/generation-engine.ts +31 -10
  413. package/src/migration-engine/shared.ts +13 -0
  414. package/src/mod.ts +45 -27
  415. package/src/naming/sql-naming.ts +1 -0
  416. package/src/outbox/outbox-builder.ts +2 -2
  417. package/src/outbox/outbox.test.ts +216 -45
  418. package/src/outbox/outbox.ts +3 -1
  419. package/src/query/column-defaults.ts +1 -1
  420. package/src/query/condition-builder.test.ts +15 -0
  421. package/src/query/condition-builder.ts +7 -0
  422. package/src/query/cursor-client.test.ts +70 -0
  423. package/src/query/cursor-client.ts +263 -0
  424. package/src/query/cursor.test.ts +3 -2
  425. package/src/query/cursor.ts +15 -3
  426. package/src/query/db-now.ts +69 -2
  427. package/src/query/orm/orm.ts +2 -2
  428. package/src/query/query-type.test.ts +2 -1
  429. package/src/query/serialize/create-sql-serializer.ts +3 -3
  430. package/src/query/serialize/dialect/mysql-serializer.ts +1 -1
  431. package/src/query/serialize/dialect/postgres-serializer.ts +1 -1
  432. package/src/query/serialize/dialect/sqlite-serializer.test.ts +39 -2
  433. package/src/query/serialize/dialect/sqlite-serializer.ts +18 -5
  434. package/src/query/simple-query-interface.ts +10 -4
  435. package/src/query/unit-of-work/execute-unit-of-work.test.ts +347 -9
  436. package/src/query/unit-of-work/execute-unit-of-work.ts +63 -20
  437. package/src/query/unit-of-work/retry-policy.test.ts +1 -0
  438. package/src/query/unit-of-work/tx-builder.test.ts +73 -1
  439. package/src/query/unit-of-work/unit-of-work-coordinator.test.ts +5 -4
  440. package/src/query/unit-of-work/unit-of-work-types.test.ts +41 -11
  441. package/src/query/unit-of-work/unit-of-work.test.ts +28 -2
  442. package/src/query/unit-of-work/unit-of-work.ts +105 -19
  443. package/src/query/value-decoding.test.ts +50 -2
  444. package/src/query/value-decoding.ts +17 -4
  445. package/src/query/value-encoding.test.ts +1 -0
  446. package/src/query/value-encoding.ts +1 -1
  447. package/src/schema/create.test.ts +164 -5
  448. package/src/schema/create.ts +222 -24
  449. package/src/schema/generate-id.test.ts +1 -0
  450. package/src/schema/serialize.test.ts +4 -3
  451. package/src/schema/type-conversion/create-sql-type-mapper.ts +1 -1
  452. package/src/schema/type-conversion/dialect/sqlite.ts +2 -2
  453. package/src/schema/type-conversion/type-mapping.test.ts +2 -1
  454. package/src/schema/validator.test.ts +4 -2
  455. package/src/schema/validator.ts +1 -0
  456. package/src/schema-output/drizzle.test.ts +72 -19
  457. package/src/schema-output/drizzle.ts +24 -18
  458. package/src/schema-output/prisma.test.ts +172 -14
  459. package/src/schema-output/prisma.ts +34 -14
  460. package/src/sql-driver/better-sqlite3.test.ts +5 -3
  461. package/src/sql-driver/dialects/durable-object-dialect.ts +3 -8
  462. package/src/sql-driver/query-executor/default-query-executor.ts +1 -1
  463. package/src/sql-driver/query-executor/query-executor-base.ts +1 -1
  464. package/src/sql-driver/query-executor/query-executor.ts +1 -1
  465. package/src/sql-driver/sql-driver-adapter.ts +2 -2
  466. package/src/sql-driver/sql.ts +2 -1
  467. package/src/sql-driver/sqlocal.test.ts +4 -2
  468. package/src/sync/commands.test.ts +39 -0
  469. package/src/sync/commands.ts +51 -0
  470. package/src/sync/conflict-checker.test.ts +450 -0
  471. package/src/sync/conflict-checker.ts +248 -0
  472. package/src/sync/index.ts +14 -0
  473. package/src/sync/plan.ts +9 -0
  474. package/src/sync/read-tracking.test.ts +177 -0
  475. package/src/sync/read-tracking.ts +287 -0
  476. package/src/sync/submit.test.ts +205 -0
  477. package/src/sync/submit.ts +328 -0
  478. package/src/sync/types.ts +80 -0
  479. package/src/util/default-database-adapter.ts +15 -2
  480. package/src/with-database.ts +20 -50
  481. package/tsconfig.json +1 -1
  482. package/tsdown.config.ts +38 -26
  483. package/vitest.config.ts +1 -0
  484. package/dist/hooks/durable-hooks-processor.d.ts.map +0 -1
  485. package/dist/node_modules/.pnpm/rou3@0.7.12/node_modules/rou3/dist/index.js +0 -168
  486. package/dist/node_modules/.pnpm/rou3@0.7.12/node_modules/rou3/dist/index.js.map +0 -1
  487. package/dist/packages/fragno/dist/api/bind-services.js +0 -20
  488. package/dist/packages/fragno/dist/api/bind-services.js.map +0 -1
  489. package/dist/packages/fragno/dist/api/error.js +0 -48
  490. package/dist/packages/fragno/dist/api/error.js.map +0 -1
  491. package/dist/packages/fragno/dist/api/fragment-definition-builder.js +0 -321
  492. package/dist/packages/fragno/dist/api/fragment-definition-builder.js.map +0 -1
  493. package/dist/packages/fragno/dist/api/fragment-instantiator.js +0 -669
  494. package/dist/packages/fragno/dist/api/fragment-instantiator.js.map +0 -1
  495. package/dist/packages/fragno/dist/api/fragno-response.js +0 -73
  496. package/dist/packages/fragno/dist/api/fragno-response.js.map +0 -1
  497. package/dist/packages/fragno/dist/api/internal/response-stream.js +0 -81
  498. package/dist/packages/fragno/dist/api/internal/response-stream.js.map +0 -1
  499. package/dist/packages/fragno/dist/api/internal/route.js +0 -10
  500. package/dist/packages/fragno/dist/api/internal/route.js.map +0 -1
  501. package/dist/packages/fragno/dist/api/mutable-request-state.js +0 -97
  502. package/dist/packages/fragno/dist/api/mutable-request-state.js.map +0 -1
  503. package/dist/packages/fragno/dist/api/request-context-storage.js +0 -43
  504. package/dist/packages/fragno/dist/api/request-context-storage.js.map +0 -1
  505. package/dist/packages/fragno/dist/api/request-input-context.js +0 -185
  506. package/dist/packages/fragno/dist/api/request-input-context.js.map +0 -1
  507. package/dist/packages/fragno/dist/api/request-middleware.js +0 -83
  508. package/dist/packages/fragno/dist/api/request-middleware.js.map +0 -1
  509. package/dist/packages/fragno/dist/api/request-output-context.js +0 -119
  510. package/dist/packages/fragno/dist/api/request-output-context.js.map +0 -1
  511. package/dist/packages/fragno/dist/api/route.js +0 -30
  512. package/dist/packages/fragno/dist/api/route.js.map +0 -1
  513. package/dist/packages/fragno/dist/internal/symbols.js +0 -10
  514. package/dist/packages/fragno/dist/internal/symbols.js.map +0 -1
  515. package/dist/packages/fragno/dist/internal/trace-context.js +0 -12
  516. package/dist/packages/fragno/dist/internal/trace-context.js.map +0 -1
@@ -1,5 +1,243 @@
1
- import { type AnySchema } from "../schema/create";
2
- import type { MigrationOperation, ColumnInfo } from "./shared";
1
+ import {
2
+ type AnySchema,
3
+ type AnyColumn,
4
+ type TableSubOperation,
5
+ type SchemaOperation,
6
+ } from "../schema/create";
7
+ import type {
8
+ MigrationOperation,
9
+ ColumnInfo,
10
+ ColumnOperation,
11
+ ForeignKeyInfo,
12
+ SqliteAlterTableMetadata,
13
+ SqliteCopyColumn,
14
+ } from "./shared";
15
+
16
+ type IndexInfo = { name: string; columns: string[]; unique: boolean };
17
+
18
+ type TableState = {
19
+ columns: Record<string, AnyColumn>;
20
+ columnOrder: string[];
21
+ indexes: Record<string, IndexInfo>;
22
+ foreignKeys: ForeignKeyInfo[];
23
+ };
24
+
25
+ function cloneTableState(state: TableState): TableState {
26
+ return {
27
+ columns: { ...state.columns },
28
+ columnOrder: [...state.columnOrder],
29
+ indexes: { ...state.indexes },
30
+ foreignKeys: [...state.foreignKeys],
31
+ };
32
+ }
33
+
34
+ function createTableState(operations: TableSubOperation[]): TableState {
35
+ const state: TableState = {
36
+ columns: {},
37
+ columnOrder: [],
38
+ indexes: {},
39
+ foreignKeys: [],
40
+ };
41
+
42
+ for (const subOp of operations) {
43
+ if (subOp.type === "add-column") {
44
+ state.columns[subOp.columnName] = subOp.column;
45
+ state.columnOrder.push(subOp.columnName);
46
+ } else if (subOp.type === "add-index") {
47
+ state.indexes[subOp.name] = {
48
+ name: subOp.name,
49
+ columns: [...subOp.columns],
50
+ unique: subOp.unique,
51
+ };
52
+ }
53
+ }
54
+
55
+ return state;
56
+ }
57
+
58
+ function applyTableSubOperations(state: TableState, operations: TableSubOperation[]): void {
59
+ for (const subOp of operations) {
60
+ if (subOp.type === "add-column") {
61
+ if (!state.columns[subOp.columnName]) {
62
+ state.columnOrder.push(subOp.columnName);
63
+ }
64
+ state.columns[subOp.columnName] = subOp.column;
65
+ } else if (subOp.type === "update-column") {
66
+ state.columns[subOp.columnName] = subOp.column;
67
+ } else if (subOp.type === "rename-column") {
68
+ if (state.columns[subOp.from]) {
69
+ state.columns[subOp.to] = state.columns[subOp.from]!;
70
+ delete state.columns[subOp.from];
71
+ }
72
+ const orderIndex = state.columnOrder.indexOf(subOp.from);
73
+ if (orderIndex !== -1) {
74
+ state.columnOrder[orderIndex] = subOp.to;
75
+ }
76
+ state.indexes = renameColumnInIndexes(state.indexes, subOp.from, subOp.to);
77
+ state.foreignKeys = renameColumnInForeignKeys(state.foreignKeys, subOp.from, subOp.to);
78
+ } else if (subOp.type === "drop-column") {
79
+ if (state.columns[subOp.name]) {
80
+ delete state.columns[subOp.name];
81
+ }
82
+ state.columnOrder = state.columnOrder.filter((colName) => colName !== subOp.name);
83
+ state.indexes = dropColumnFromIndexes(state.indexes, subOp.name);
84
+ state.foreignKeys = dropColumnFromForeignKeys(state.foreignKeys, subOp.name);
85
+ } else if (subOp.type === "add-index") {
86
+ state.indexes[subOp.name] = {
87
+ name: subOp.name,
88
+ columns: [...subOp.columns],
89
+ unique: subOp.unique,
90
+ };
91
+ }
92
+ }
93
+ }
94
+
95
+ function renameColumnInIndexes(
96
+ indexes: Record<string, IndexInfo>,
97
+ from: string,
98
+ to: string,
99
+ ): Record<string, IndexInfo> {
100
+ const next: Record<string, IndexInfo> = {};
101
+
102
+ for (const [name, index] of Object.entries(indexes)) {
103
+ if (!index.columns.includes(from)) {
104
+ next[name] = index;
105
+ continue;
106
+ }
107
+
108
+ next[name] = {
109
+ ...index,
110
+ columns: index.columns.map((column) => (column === from ? to : column)),
111
+ };
112
+ }
113
+
114
+ return next;
115
+ }
116
+
117
+ function dropColumnFromIndexes(
118
+ indexes: Record<string, IndexInfo>,
119
+ columnName: string,
120
+ ): Record<string, IndexInfo> {
121
+ const next: Record<string, IndexInfo> = {};
122
+
123
+ for (const [name, index] of Object.entries(indexes)) {
124
+ if (index.columns.includes(columnName)) {
125
+ continue;
126
+ }
127
+ next[name] = index;
128
+ }
129
+
130
+ return next;
131
+ }
132
+
133
+ function renameColumnInForeignKeys(
134
+ foreignKeys: ForeignKeyInfo[],
135
+ from: string,
136
+ to: string,
137
+ ): ForeignKeyInfo[] {
138
+ return foreignKeys.map((foreignKey) => {
139
+ if (!foreignKey.columns.includes(from)) {
140
+ return foreignKey;
141
+ }
142
+
143
+ return {
144
+ ...foreignKey,
145
+ columns: foreignKey.columns.map((column) => (column === from ? to : column)),
146
+ };
147
+ });
148
+ }
149
+
150
+ function dropColumnFromForeignKeys(
151
+ foreignKeys: ForeignKeyInfo[],
152
+ columnName: string,
153
+ ): ForeignKeyInfo[] {
154
+ return foreignKeys.filter((foreignKey) => !foreignKey.columns.includes(columnName));
155
+ }
156
+
157
+ function buildCopyColumns(
158
+ columnOrder: string[],
159
+ operations: TableSubOperation[],
160
+ ): SqliteCopyColumn[] {
161
+ const mappings = columnOrder.map((columnName) => ({ from: columnName, to: columnName }));
162
+
163
+ for (const op of operations) {
164
+ if (op.type === "rename-column") {
165
+ for (const mapping of mappings) {
166
+ if (mapping.to === op.from) {
167
+ mapping.to = op.to;
168
+ }
169
+ }
170
+ } else if (op.type === "drop-column") {
171
+ for (let i = mappings.length - 1; i >= 0; i -= 1) {
172
+ if (mappings[i]?.to === op.name) {
173
+ mappings.splice(i, 1);
174
+ }
175
+ }
176
+ }
177
+ }
178
+
179
+ return mappings;
180
+ }
181
+
182
+ function applyRenameDropToColumnList(
183
+ columns: string[],
184
+ operations: TableSubOperation[],
185
+ ): string[] | null {
186
+ let next = [...columns];
187
+
188
+ for (const op of operations) {
189
+ if (op.type === "rename-column") {
190
+ next = next.map((column) => (column === op.from ? op.to : column));
191
+ continue;
192
+ }
193
+
194
+ if (op.type === "drop-column" && next.includes(op.name)) {
195
+ return null;
196
+ }
197
+ }
198
+
199
+ return next;
200
+ }
201
+
202
+ function applyReferenceOperation(
203
+ state: TableState,
204
+ operation: Extract<SchemaOperation, { type: "add-reference" }>,
205
+ ): void {
206
+ if (operation.config.foreignKey === false) {
207
+ return;
208
+ }
209
+ state.foreignKeys.push({
210
+ name: operation.referenceName,
211
+ columns: [operation.config.from.column],
212
+ referencedTable: operation.config.to.table,
213
+ referencedColumns: [operation.config.to.column],
214
+ });
215
+ }
216
+
217
+ function buildTableStates(schema: AnySchema, version: number): Map<string, TableState> {
218
+ const tableStates = new Map<string, TableState>();
219
+ const operations = schema.operations.slice(0, version);
220
+
221
+ for (const op of operations) {
222
+ if (op.type === "add-table") {
223
+ tableStates.set(op.tableName, createTableState(op.operations));
224
+ } else if (op.type === "alter-table") {
225
+ const state = tableStates.get(op.tableName);
226
+ if (!state) {
227
+ continue;
228
+ }
229
+ applyTableSubOperations(state, op.operations);
230
+ } else if (op.type === "add-reference") {
231
+ const state = tableStates.get(op.tableName);
232
+ if (!state) {
233
+ continue;
234
+ }
235
+ applyReferenceOperation(state, op);
236
+ }
237
+ }
238
+
239
+ return tableStates;
240
+ }
3
241
 
4
242
  /**
5
243
  * Generate migration operations from a schema's operation history
@@ -56,6 +294,25 @@ export function generateMigrationFromSchema(
56
294
 
57
295
  // Convert schema operations to migration operations
58
296
  const migrationOperations: MigrationOperation[] = [];
297
+ const tableStates = buildTableStates(targetSchema, fromVersion);
298
+
299
+ const toColumnInfo = (columnName: string, col: AnyColumn): ColumnInfo => {
300
+ return {
301
+ name: columnName,
302
+ type: col.type,
303
+ isNullable: col.isNullable,
304
+ role: col.role,
305
+ default: col.default
306
+ ? "value" in col.default
307
+ ? { value: col.default.value }
308
+ : "dbSpecial" in col.default
309
+ ? { dbSpecial: col.default.dbSpecial }
310
+ : "runtime" in col.default && typeof col.default.runtime === "string"
311
+ ? { runtime: col.default.runtime }
312
+ : undefined
313
+ : undefined,
314
+ };
315
+ };
59
316
 
60
317
  for (const op of relevantOperations) {
61
318
  if (op.type === "add-table") {
@@ -64,22 +321,7 @@ export function generateMigrationFromSchema(
64
321
 
65
322
  for (const subOp of op.operations) {
66
323
  if (subOp.type === "add-column") {
67
- const col = subOp.column;
68
- columns.push({
69
- name: subOp.columnName,
70
- type: col.type,
71
- isNullable: col.isNullable,
72
- role: col.role,
73
- default: col.default
74
- ? "value" in col.default
75
- ? { value: col.default.value }
76
- : "dbSpecial" in col.default
77
- ? { dbSpecial: col.default.dbSpecial }
78
- : "runtime" in col.default && typeof col.default.runtime === "string"
79
- ? { runtime: col.default.runtime }
80
- : undefined
81
- : undefined,
82
- });
324
+ columns.push(toColumnInfo(subOp.columnName, subOp.column));
83
325
  }
84
326
  }
85
327
 
@@ -112,35 +354,97 @@ export function generateMigrationFromSchema(
112
354
  });
113
355
  }
114
356
  }
357
+
358
+ tableStates.set(op.tableName, createTableState(op.operations));
115
359
  } else if (op.type === "alter-table") {
116
- const columnOps = op.operations.filter((o) => o.type === "add-column");
360
+ const columnOps: ColumnOperation[] = [];
361
+ const tableState = tableStates.get(op.tableName);
362
+
363
+ for (const subOp of op.operations) {
364
+ if (subOp.type === "add-column") {
365
+ columnOps.push({
366
+ type: "create-column",
367
+ value: toColumnInfo(subOp.columnName, subOp.column),
368
+ });
369
+ } else if (subOp.type === "update-column") {
370
+ columnOps.push({
371
+ type: "update-column",
372
+ name: subOp.columnName,
373
+ value: toColumnInfo(subOp.columnName, subOp.column),
374
+ updateNullable: subOp.updateNullable,
375
+ updateDefault: subOp.updateDefault,
376
+ updateDataType: subOp.updateDataType,
377
+ });
378
+ } else if (subOp.type === "rename-column") {
379
+ columnOps.push({
380
+ type: "rename-column",
381
+ from: subOp.from,
382
+ to: subOp.to,
383
+ });
384
+ } else if (subOp.type === "drop-column") {
385
+ columnOps.push({
386
+ type: "drop-column",
387
+ name: subOp.name,
388
+ });
389
+ }
390
+ }
117
391
 
118
392
  if (columnOps.length > 0) {
119
- migrationOperations.push({
393
+ const hasUpdateColumn = columnOps.some((colOp) => colOp.type === "update-column");
394
+ const alterTableOperation: MigrationOperation = {
120
395
  type: "alter-table",
121
396
  name: op.tableName,
122
- value: columnOps.map((o) => {
123
- const col = o.column;
124
- return {
125
- type: "create-column" as const,
126
- value: {
127
- name: o.columnName,
128
- type: col.type,
129
- isNullable: col.isNullable,
130
- role: col.role,
131
- default: col.default
132
- ? "value" in col.default
133
- ? { value: col.default.value }
134
- : "dbSpecial" in col.default
135
- ? { dbSpecial: col.default.dbSpecial }
136
- : "runtime" in col.default && typeof col.default.runtime === "string"
137
- ? { runtime: col.default.runtime }
138
- : undefined
139
- : undefined,
140
- },
141
- };
142
- }),
143
- });
397
+ value: columnOps,
398
+ };
399
+
400
+ if (hasUpdateColumn) {
401
+ if (!tableState) {
402
+ throw new Error(`Table ${op.tableName} not found in schema state`);
403
+ }
404
+
405
+ const nextState = cloneTableState(tableState);
406
+ applyTableSubOperations(nextState, op.operations);
407
+
408
+ const metadata: SqliteAlterTableMetadata = {
409
+ recreateTable: {
410
+ columns: nextState.columnOrder.map((colName) =>
411
+ toColumnInfo(colName, nextState.columns[colName]!),
412
+ ),
413
+ copyColumns: buildCopyColumns(tableState.columnOrder, op.operations),
414
+ indexes: Object.values(tableState.indexes).flatMap((idx) => {
415
+ const columns = applyRenameDropToColumnList(idx.columns, op.operations);
416
+ if (!columns) {
417
+ return [];
418
+ }
419
+ return [
420
+ {
421
+ name: idx.name,
422
+ columns,
423
+ unique: idx.unique,
424
+ },
425
+ ];
426
+ }),
427
+ foreignKeys: tableState.foreignKeys.flatMap((fk) => {
428
+ const columns = applyRenameDropToColumnList(fk.columns, op.operations);
429
+ if (!columns) {
430
+ return [];
431
+ }
432
+ return [
433
+ {
434
+ name: fk.name,
435
+ columns,
436
+ referencedTable: fk.referencedTable,
437
+ referencedColumns: [...fk.referencedColumns],
438
+ },
439
+ ];
440
+ }),
441
+ },
442
+ };
443
+
444
+ alterTableOperation.metadata = metadata;
445
+ }
446
+
447
+ migrationOperations.push(alterTableOperation);
144
448
  }
145
449
 
146
450
  // Add indexes as separate operations
@@ -155,10 +459,19 @@ export function generateMigrationFromSchema(
155
459
  });
156
460
  }
157
461
  }
462
+
463
+ if (tableState) {
464
+ const nextState = cloneTableState(tableState);
465
+ applyTableSubOperations(nextState, op.operations);
466
+ tableStates.set(op.tableName, nextState);
467
+ }
158
468
  } else if (op.type === "add-reference") {
159
469
  if (!op.referenceName || op.referenceName.trim().length === 0) {
160
470
  throw new Error(`referenceName is required for add-reference on ${op.tableName}`);
161
471
  }
472
+ if (op.config.foreignKey === false) {
473
+ continue;
474
+ }
162
475
  migrationOperations.push({
163
476
  type: "add-foreign-key",
164
477
  table: op.tableName,
@@ -169,6 +482,11 @@ export function generateMigrationFromSchema(
169
482
  referencedColumns: [op.config.to.column],
170
483
  },
171
484
  });
485
+
486
+ const tableState = tableStates.get(op.tableName);
487
+ if (tableState) {
488
+ applyReferenceOperation(tableState, op);
489
+ }
172
490
  }
173
491
  }
174
492
 
@@ -1,6 +1,7 @@
1
1
  import { describe, expect, it, vi } from "vitest";
2
- import { createMigrator, type MigrationEngineOptions } from "./create";
2
+
3
3
  import { schema, idColumn, column, referenceColumn } from "../schema/create";
4
+ import { createMigrator, type MigrationEngineOptions } from "./create";
4
5
  import type { MigrationOperation } from "./shared";
5
6
 
6
7
  describe("createMigrator", () => {
@@ -1,6 +1,6 @@
1
- import { type MigrationOperation } from "./shared";
2
1
  import type { AnySchema } from "../schema/create";
3
2
  import { generateMigrationFromSchema as defaultGenerateMigrationFromSchema } from "./auto-from-schema";
3
+ import { type MigrationOperation } from "./shared";
4
4
 
5
5
  type Awaitable<T> = T | Promise<T>;
6
6
 
@@ -1,18 +1,20 @@
1
1
  import { describe, it, expect, beforeAll, beforeEach, vi, afterEach } from "vitest";
2
+
2
3
  import { DummyDriver, MysqlAdapter, PostgresAdapter, SqliteAdapter } from "kysely";
3
- import {
4
- postProcessMigrationFilenames,
5
- type GenerationInternalResult,
6
- generateSchemaArtifacts,
7
- } from "./generation-engine";
8
- import { SqlAdapter } from "../adapters/generic-sql/generic-sql-adapter";
9
- import { column, idColumn, schema, type AnySchema } from "../schema/create";
10
- import { FragnoDatabase } from "../mod";
4
+
11
5
  import {
12
6
  MySQL2DriverConfig,
13
7
  NodePostgresDriverConfig,
14
8
  SQLocalDriverConfig,
15
9
  } from "../adapters/generic-sql/driver-config";
10
+ import { SqlAdapter } from "../adapters/generic-sql/generic-sql-adapter";
11
+ import { FragnoDatabase } from "../mod";
12
+ import { column, idColumn, schema, type AnySchema } from "../schema/create";
13
+ import {
14
+ postProcessMigrationFilenames,
15
+ type GenerationInternalResult,
16
+ generateSchemaArtifacts,
17
+ } from "./generation-engine";
16
18
 
17
19
  const buildFile = (
18
20
  overrides: Partial<GenerationInternalResult> &
@@ -293,7 +295,7 @@ describe("generateSchemaArtifacts - sql", () => {
293
295
  expect(resultsV1[1].schema).toMatchInlineSnapshot(`
294
296
  "CREATE SCHEMA IF NOT EXISTS "test-db";
295
297
 
296
- create table "test-db"."users" ("id" varchar(30) not null unique, "name" text not null, "_internalId" bigserial not null primary key, "_version" integer default 0 not null);
298
+ create table "test-db"."users" ("id" varchar(128) not null unique, "name" text not null, "_internalId" bigserial not null primary key, "_version" integer default 0 not null);
297
299
 
298
300
  insert into "fragno_db_settings" ("id", "key", "value") values ('6_U2SCfiaNG9VyYmQ_JwzQ', 'test-db.schema_version', '1');"
299
301
  `);
@@ -444,6 +446,61 @@ describe("generateSchemaArtifacts - schema outputs", () => {
444
446
  expect(healthSpy).not.toHaveBeenCalled();
445
447
  });
446
448
 
449
+ it("should order drizzle schema fragments deterministically by schema name", async () => {
450
+ const adapter = new SqlAdapter({
451
+ dialect: {
452
+ createAdapter: () => new PostgresAdapter(),
453
+ createDriver: () => new DummyDriver(),
454
+ createQueryCompiler: () => ({
455
+ compileQuery: () => ({
456
+ sql: "",
457
+ parameters: [],
458
+ }),
459
+ }),
460
+ },
461
+ driverConfig: new NodePostgresDriverConfig(),
462
+ });
463
+
464
+ const schemaAlpha: AnySchema = schema("alpha", (s) => {
465
+ return s.addTable("alpha_table", (t) => {
466
+ return t.addColumn("id", idColumn()).addColumn("name", column("string"));
467
+ });
468
+ });
469
+
470
+ const schemaBeta: AnySchema = schema("beta", (s) => {
471
+ return s.addTable("beta_table", (t) => {
472
+ return t.addColumn("id", idColumn()).addColumn("title", column("string"));
473
+ });
474
+ });
475
+
476
+ const fragnoDbBeta = new FragnoDatabase({
477
+ namespace: "alpha",
478
+ schema: schemaBeta,
479
+ adapter,
480
+ });
481
+
482
+ const fragnoDbAlpha = new FragnoDatabase({
483
+ namespace: "zulu",
484
+ schema: schemaAlpha,
485
+ adapter,
486
+ });
487
+
488
+ const [result] = await generateSchemaArtifacts([fragnoDbBeta, fragnoDbAlpha], {
489
+ format: "drizzle",
490
+ });
491
+
492
+ const schemaOutput = result.schema;
493
+ const internalIndex = schemaOutput.indexOf("Fragment: (none)");
494
+ const alphaIndex = schemaOutput.indexOf("Fragment: zulu");
495
+ const betaIndex = schemaOutput.indexOf("Fragment: alpha");
496
+
497
+ expect(internalIndex).toBeGreaterThanOrEqual(0);
498
+ expect(alphaIndex).toBeGreaterThanOrEqual(0);
499
+ expect(betaIndex).toBeGreaterThanOrEqual(0);
500
+ expect(internalIndex).toBeLessThan(alphaIndex);
501
+ expect(alphaIndex).toBeLessThan(betaIndex);
502
+ });
503
+
447
504
  it("should reject from/to versions for prisma output", async () => {
448
505
  const adapter = new SqlAdapter({
449
506
  dialect: {
@@ -1,15 +1,21 @@
1
- import type { FragnoDatabase } from "../mod";
2
- import type { AnySchema } from "../schema/create";
1
+ import { instantiate } from "@fragno-dev/core";
2
+
3
3
  import {
4
4
  fragnoDatabaseAdapterNameFakeSymbol,
5
5
  fragnoDatabaseAdapterVersionFakeSymbol,
6
6
  } from "../adapters/adapters";
7
+ import { supportedDatabases, type SupportedDatabase } from "../adapters/generic-sql/driver-config";
8
+ import {
9
+ internalFragmentDef,
10
+ internalSchema,
11
+ SETTINGS_TABLE_NAME,
12
+ getSchemaVersionFromDatabase,
13
+ } from "../fragments/internal-fragment";
14
+ import { getRegistryForAdapterSync } from "../internal/adapter-registry";
15
+ import type { FragnoDatabase } from "../mod";
7
16
  import { generateDrizzleSchema } from "../schema-output/drizzle";
8
17
  import { generatePrismaSchema } from "../schema-output/prisma";
9
- import { internalFragmentDef, getSchemaVersionFromDatabase } from "../fragments/internal-fragment";
10
- import { internalSchema, SETTINGS_TABLE_NAME } from "../fragments/internal-fragment.schema";
11
- import { instantiate } from "@fragno-dev/core";
12
- import { supportedDatabases, type SupportedDatabase } from "../adapters/generic-sql/driver-config";
18
+ import type { AnySchema } from "../schema/create";
13
19
 
14
20
  export interface GenerationEngineResult {
15
21
  schema: string;
@@ -76,7 +82,7 @@ export async function generateSchemaArtifacts<
76
82
 
77
83
  // Collect all schemas, de-duplicating by namespace.
78
84
  // The internal fragment (settings schema) is always included first since all database
79
- // fragments automatically link to it via withDatabase().
85
+ // fragments share it via the adapter registry.
80
86
  const fragmentsMap = new Map<string, { schema: AnySchema; namespace: string | null }>();
81
87
 
82
88
  // Include internal fragment first with empty namespace (settings table has no prefix)
@@ -97,7 +103,22 @@ export async function generateSchemaArtifacts<
97
103
  }
98
104
  }
99
105
 
100
- const allFragments = Array.from(fragmentsMap.values());
106
+ const allFragments = Array.from(fragmentsMap.entries())
107
+ .map(([namespaceKey, fragment]) => ({
108
+ ...fragment,
109
+ namespaceKey,
110
+ isInternal: fragment.schema === internalSchema,
111
+ }))
112
+ .sort((a, b) => {
113
+ if (a.isInternal) {
114
+ return -1;
115
+ }
116
+ if (b.isInternal) {
117
+ return 1;
118
+ }
119
+ return a.schema.name.localeCompare(b.schema.name);
120
+ })
121
+ .map(({ schema, namespace }) => ({ schema, namespace }));
101
122
  const defaultPath = format === "drizzle" ? DEFAULT_DRIZZLE_PATH : DEFAULT_PRISMA_PATH;
102
123
  const schema =
103
124
  format === "drizzle"
@@ -133,7 +154,7 @@ export async function generateSchemaArtifacts<
133
154
 
134
155
  // Use the internal fragment for settings management
135
156
  const internalFragment = instantiate(internalFragmentDef)
136
- .withConfig({})
157
+ .withConfig({ registry: getRegistryForAdapterSync(adapter) })
137
158
  .withOptions({ databaseAdapter: adapter, databaseNamespace: null })
138
159
  .build();
139
160
 
@@ -261,7 +282,7 @@ export async function executeMigrations<const TDatabases extends FragnoDatabase<
261
282
  // 1. Prepare settings table migration
262
283
  // Use the internal fragment for settings management
263
284
  const internalFragment = instantiate(internalFragmentDef)
264
- .withConfig({})
285
+ .withConfig({ registry: getRegistryForAdapterSync(adapter) })
265
286
  .withOptions({ databaseAdapter: adapter, databaseNamespace: null })
266
287
  .build();
267
288
 
@@ -39,6 +39,19 @@ export interface ColumnInfo {
39
39
  default?: { value: unknown } | { dbSpecial: "now" } | { runtime: "cuid" | "now" };
40
40
  }
41
41
 
42
+ export interface SqliteRecreateTableInfo {
43
+ columns: ColumnInfo[];
44
+ copyColumns: SqliteCopyColumn[];
45
+ indexes: { name: string; columns: string[]; unique: boolean }[];
46
+ foreignKeys: ForeignKeyInfo[];
47
+ }
48
+
49
+ export type SqliteCopyColumn = string | { from: string; to: string };
50
+
51
+ export interface SqliteAlterTableMetadata extends MigrationOperationMetadata {
52
+ recreateTable?: SqliteRecreateTableInfo;
53
+ }
54
+
42
55
  export type MigrationOperation<
43
56
  TMeta extends MigrationOperationMetadata = MigrationOperationMetadata,
44
57
  > =