@fragno-dev/db 0.2.2 → 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 (587) hide show
  1. package/.turbo/turbo-build.log +404 -175
  2. package/CHANGELOG.md +109 -0
  3. package/README.md +54 -9
  4. package/dist/adapters/adapters.d.ts +23 -21
  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/driver-config.d.ts +16 -1
  8. package/dist/adapters/generic-sql/driver-config.d.ts.map +1 -1
  9. package/dist/adapters/generic-sql/driver-config.js +23 -1
  10. package/dist/adapters/generic-sql/driver-config.js.map +1 -1
  11. package/dist/adapters/generic-sql/generic-sql-adapter.d.ts +24 -9
  12. package/dist/adapters/generic-sql/generic-sql-adapter.d.ts.map +1 -1
  13. package/dist/adapters/generic-sql/generic-sql-adapter.js +60 -22
  14. package/dist/adapters/generic-sql/generic-sql-adapter.js.map +1 -1
  15. package/dist/adapters/generic-sql/generic-sql-uow-executor.js +169 -3
  16. package/dist/adapters/generic-sql/generic-sql-uow-executor.js.map +1 -1
  17. package/dist/adapters/generic-sql/migration/cold-kysely.js.map +1 -1
  18. package/dist/adapters/generic-sql/migration/dialect/mysql.js +25 -6
  19. package/dist/adapters/generic-sql/migration/dialect/mysql.js.map +1 -1
  20. package/dist/adapters/generic-sql/migration/dialect/postgres.js +7 -6
  21. package/dist/adapters/generic-sql/migration/dialect/postgres.js.map +1 -1
  22. package/dist/adapters/generic-sql/migration/dialect/sqlite.js +193 -16
  23. package/dist/adapters/generic-sql/migration/dialect/sqlite.js.map +1 -1
  24. package/dist/adapters/generic-sql/migration/executor.d.ts.map +1 -1
  25. package/dist/adapters/generic-sql/migration/executor.js +30 -3
  26. package/dist/adapters/generic-sql/migration/executor.js.map +1 -1
  27. package/dist/adapters/generic-sql/migration/prepared-migrations.d.ts.map +1 -1
  28. package/dist/adapters/generic-sql/migration/prepared-migrations.js +9 -9
  29. package/dist/adapters/generic-sql/migration/prepared-migrations.js.map +1 -1
  30. package/dist/adapters/generic-sql/migration/sql-generator.js +75 -52
  31. package/dist/adapters/generic-sql/migration/sql-generator.js.map +1 -1
  32. package/dist/adapters/generic-sql/query/create-sql-query-compiler.js +7 -6
  33. package/dist/adapters/generic-sql/query/create-sql-query-compiler.js.map +1 -1
  34. package/dist/adapters/generic-sql/query/cursor-utils.js +42 -4
  35. package/dist/adapters/generic-sql/query/cursor-utils.js.map +1 -1
  36. package/dist/adapters/generic-sql/query/db-now-sql.js +27 -0
  37. package/dist/adapters/generic-sql/query/db-now-sql.js.map +1 -0
  38. package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js +32 -21
  39. package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js.map +1 -1
  40. package/dist/adapters/generic-sql/query/select-builder.js +5 -3
  41. package/dist/adapters/generic-sql/query/select-builder.js.map +1 -1
  42. package/dist/adapters/generic-sql/query/sql-query-compiler.js +49 -18
  43. package/dist/adapters/generic-sql/query/sql-query-compiler.js.map +1 -1
  44. package/dist/adapters/generic-sql/query/where-builder.js +43 -29
  45. package/dist/adapters/generic-sql/query/where-builder.js.map +1 -1
  46. package/dist/adapters/generic-sql/sqlite-storage.d.ts +13 -0
  47. package/dist/adapters/generic-sql/sqlite-storage.d.ts.map +1 -0
  48. package/dist/adapters/generic-sql/sqlite-storage.js +15 -0
  49. package/dist/adapters/generic-sql/sqlite-storage.js.map +1 -0
  50. package/dist/adapters/generic-sql/uow-decoder.js +6 -2
  51. package/dist/adapters/generic-sql/uow-decoder.js.map +1 -1
  52. package/dist/adapters/generic-sql/uow-encoder.js +27 -8
  53. package/dist/adapters/generic-sql/uow-encoder.js.map +1 -1
  54. package/dist/adapters/in-memory/condition-evaluator.js +135 -0
  55. package/dist/adapters/in-memory/condition-evaluator.js.map +1 -0
  56. package/dist/adapters/in-memory/errors.d.ts +13 -0
  57. package/dist/adapters/in-memory/errors.d.ts.map +1 -0
  58. package/dist/adapters/in-memory/errors.js +23 -0
  59. package/dist/adapters/in-memory/errors.js.map +1 -0
  60. package/dist/adapters/in-memory/in-memory-adapter.d.ts +27 -0
  61. package/dist/adapters/in-memory/in-memory-adapter.d.ts.map +1 -0
  62. package/dist/adapters/in-memory/in-memory-adapter.js +196 -0
  63. package/dist/adapters/in-memory/in-memory-adapter.js.map +1 -0
  64. package/dist/adapters/in-memory/in-memory-uow.js +871 -0
  65. package/dist/adapters/in-memory/in-memory-uow.js.map +1 -0
  66. package/dist/adapters/in-memory/index.d.ts +4 -0
  67. package/dist/adapters/in-memory/index.js +4 -0
  68. package/dist/adapters/in-memory/options.d.ts +30 -0
  69. package/dist/adapters/in-memory/options.d.ts.map +1 -0
  70. package/dist/adapters/in-memory/options.js +62 -0
  71. package/dist/adapters/in-memory/options.js.map +1 -0
  72. package/dist/adapters/in-memory/reference-resolution.js +26 -0
  73. package/dist/adapters/in-memory/reference-resolution.js.map +1 -0
  74. package/dist/adapters/in-memory/sorted-array-index.js +129 -0
  75. package/dist/adapters/in-memory/sorted-array-index.js.map +1 -0
  76. package/dist/adapters/in-memory/store.js +71 -0
  77. package/dist/adapters/in-memory/store.js.map +1 -0
  78. package/dist/adapters/in-memory/value-comparison.js +28 -0
  79. package/dist/adapters/in-memory/value-comparison.js.map +1 -0
  80. package/dist/adapters/shared/from-unit-of-work-compiler.js +51 -24
  81. package/dist/adapters/shared/from-unit-of-work-compiler.js.map +1 -1
  82. package/dist/adapters/shared/uow-operation-compiler.js +11 -11
  83. package/dist/adapters/shared/uow-operation-compiler.js.map +1 -1
  84. package/dist/adapters/sql/index.d.ts +5 -0
  85. package/dist/adapters/sql/index.js +4 -0
  86. package/dist/browser/adapters/adapters.d.ts +61 -0
  87. package/dist/browser/adapters/adapters.d.ts.map +1 -0
  88. package/dist/browser/adapters/generic-sql/migration/executor.d.ts +15 -0
  89. package/dist/browser/adapters/generic-sql/migration/executor.d.ts.map +1 -0
  90. package/dist/browser/adapters/generic-sql/migration/prepared-migrations.d.ts +66 -0
  91. package/dist/browser/adapters/generic-sql/migration/prepared-migrations.d.ts.map +1 -0
  92. package/dist/browser/adapters/generic-sql/sqlite-storage.d.ts +11 -0
  93. package/dist/browser/adapters/generic-sql/sqlite-storage.d.ts.map +1 -0
  94. package/dist/browser/adapters/in-memory/in-memory-adapter.d.ts +5 -0
  95. package/dist/browser/adapters/in-memory/index.d.ts +2 -0
  96. package/dist/browser/adapters/in-memory/options.d.ts +1 -0
  97. package/dist/browser/db-fragment-definition-builder.d.ts +237 -0
  98. package/dist/browser/db-fragment-definition-builder.d.ts.map +1 -0
  99. package/dist/browser/durable-hooks.d.ts +3 -0
  100. package/dist/browser/fragments/internal-fragment.d.ts +317 -0
  101. package/dist/browser/fragments/internal-fragment.d.ts.map +1 -0
  102. package/dist/browser/fragments/internal-fragment.schema.d.ts +1 -0
  103. package/dist/browser/hooks/durable-hooks-logger.d.ts +10 -0
  104. package/dist/browser/hooks/durable-hooks-logger.d.ts.map +1 -0
  105. package/dist/browser/hooks/hooks.d.ts +146 -0
  106. package/dist/browser/hooks/hooks.d.ts.map +1 -0
  107. package/dist/browser/id.js +1 -0
  108. package/dist/browser/internal/adapter-registry.d.ts +4 -0
  109. package/dist/browser/internal/outbox-state.d.ts +2 -0
  110. package/dist/browser/mod.d.ts +15 -0
  111. package/dist/browser/mod.d.ts.map +1 -0
  112. package/dist/browser/mod.js +17 -0
  113. package/dist/browser/mod.js.map +1 -0
  114. package/dist/browser/mod2.d.ts +48 -0
  115. package/dist/browser/mod2.d.ts.map +1 -0
  116. package/dist/browser/naming/sql-naming.d.ts +19 -0
  117. package/dist/browser/naming/sql-naming.d.ts.map +1 -0
  118. package/dist/browser/outbox/outbox.d.ts +21 -0
  119. package/dist/browser/outbox/outbox.d.ts.map +1 -0
  120. package/dist/browser/query/column-defaults.js +1 -0
  121. package/dist/browser/query/condition-builder.d.ts +44 -0
  122. package/dist/browser/query/condition-builder.d.ts.map +1 -0
  123. package/dist/browser/query/condition-builder.js +97 -0
  124. package/dist/browser/query/condition-builder.js.map +1 -0
  125. package/dist/browser/query/cursor.d.ts +105 -0
  126. package/dist/browser/query/cursor.d.ts.map +1 -0
  127. package/dist/browser/query/cursor.js +150 -0
  128. package/dist/browser/query/cursor.js.map +1 -0
  129. package/dist/browser/query/db-now.d.ts +22 -0
  130. package/dist/browser/query/db-now.d.ts.map +1 -0
  131. package/dist/browser/query/db-now.js +33 -0
  132. package/dist/browser/query/db-now.js.map +1 -0
  133. package/dist/browser/query/orm/orm.d.ts +18 -0
  134. package/dist/browser/query/orm/orm.d.ts.map +1 -0
  135. package/dist/browser/query/simple-query-interface.d.ts +108 -0
  136. package/dist/browser/query/simple-query-interface.d.ts.map +1 -0
  137. package/dist/browser/query/unit-of-work/execute-unit-of-work.d.ts +423 -0
  138. package/dist/browser/query/unit-of-work/execute-unit-of-work.d.ts.map +1 -0
  139. package/dist/browser/query/unit-of-work/execute-unit-of-work.js +507 -0
  140. package/dist/browser/query/unit-of-work/execute-unit-of-work.js.map +1 -0
  141. package/dist/browser/query/unit-of-work/retry-policy.d.ts +23 -0
  142. package/dist/browser/query/unit-of-work/retry-policy.d.ts.map +1 -0
  143. package/dist/browser/query/unit-of-work/retry-policy.js +40 -0
  144. package/dist/browser/query/unit-of-work/retry-policy.js.map +1 -0
  145. package/dist/browser/query/unit-of-work/unit-of-work.d.ts +703 -0
  146. package/dist/browser/query/unit-of-work/unit-of-work.d.ts.map +1 -0
  147. package/dist/browser/query/unit-of-work/unit-of-work.js +1206 -0
  148. package/dist/browser/query/unit-of-work/unit-of-work.js.map +1 -0
  149. package/dist/browser/query/value-encoding.js +38 -0
  150. package/dist/browser/query/value-encoding.js.map +1 -0
  151. package/dist/browser/schema/create.d.ts +326 -0
  152. package/dist/browser/schema/create.d.ts.map +1 -0
  153. package/dist/browser/schema/create.js +89 -0
  154. package/dist/browser/schema/create.js.map +1 -0
  155. package/dist/browser/schema/generate-id.js +28 -0
  156. package/dist/browser/schema/generate-id.js.map +1 -0
  157. package/dist/browser/shared/providers.d.ts +6 -0
  158. package/dist/browser/shared/providers.d.ts.map +1 -0
  159. package/dist/browser/sql-driver/connection/connection-provider.d.ts +13 -0
  160. package/dist/browser/sql-driver/connection/connection-provider.d.ts.map +1 -0
  161. package/dist/browser/sql-driver/dialect-adapter/dialect-adapter.d.ts +7 -0
  162. package/dist/browser/sql-driver/dialect-adapter/dialect-adapter.d.ts.map +1 -0
  163. package/dist/browser/sql-driver/driver/runtime-driver.d.ts +23 -0
  164. package/dist/browser/sql-driver/driver/runtime-driver.d.ts.map +1 -0
  165. package/dist/browser/sql-driver/query-executor/plugin.d.ts +17 -0
  166. package/dist/browser/sql-driver/query-executor/plugin.d.ts.map +1 -0
  167. package/dist/browser/sql-driver/query-executor/query-executor.d.ts +36 -0
  168. package/dist/browser/sql-driver/query-executor/query-executor.d.ts.map +1 -0
  169. package/dist/browser/sql-driver/sql-driver-adapter.d.ts +29 -0
  170. package/dist/browser/sql-driver/sql-driver-adapter.d.ts.map +1 -0
  171. package/dist/browser/sql-driver/sql-driver.d.ts +38 -0
  172. package/dist/browser/sql-driver/sql-driver.d.ts.map +1 -0
  173. package/dist/browser/sync/commands.d.ts +15 -0
  174. package/dist/browser/sync/commands.d.ts.map +1 -0
  175. package/dist/browser/sync/commands.js +27 -0
  176. package/dist/browser/sync/commands.js.map +1 -0
  177. package/dist/browser/sync/types.d.ts +63 -0
  178. package/dist/browser/sync/types.d.ts.map +1 -0
  179. package/dist/browser/util/types.d.ts +8 -0
  180. package/dist/browser/util/types.d.ts.map +1 -0
  181. package/dist/browser/with-database.d.ts +29 -0
  182. package/dist/browser/with-database.d.ts.map +1 -0
  183. package/dist/client.d.ts +4 -0
  184. package/dist/client.js +5 -0
  185. package/dist/db-fragment-definition-builder.d.ts +101 -33
  186. package/dist/db-fragment-definition-builder.d.ts.map +1 -1
  187. package/dist/db-fragment-definition-builder.js +450 -60
  188. package/dist/db-fragment-definition-builder.js.map +1 -1
  189. package/dist/dispatchers/cloudflare-do/dispatcher.d.ts +20 -0
  190. package/dist/dispatchers/cloudflare-do/dispatcher.d.ts.map +1 -0
  191. package/dist/dispatchers/cloudflare-do/dispatcher.js +147 -0
  192. package/dist/dispatchers/cloudflare-do/dispatcher.js.map +1 -0
  193. package/dist/dispatchers/cloudflare-do/index.d.ts +11 -0
  194. package/dist/dispatchers/cloudflare-do/index.d.ts.map +1 -0
  195. package/dist/dispatchers/cloudflare-do/index.js +31 -0
  196. package/dist/dispatchers/cloudflare-do/index.js.map +1 -0
  197. package/dist/dispatchers/node/dispatcher.d.ts +14 -0
  198. package/dist/dispatchers/node/dispatcher.d.ts.map +1 -0
  199. package/dist/dispatchers/node/dispatcher.js +80 -0
  200. package/dist/dispatchers/node/dispatcher.js.map +1 -0
  201. package/dist/dispatchers/node/index.d.ts +12 -0
  202. package/dist/dispatchers/node/index.d.ts.map +1 -0
  203. package/dist/dispatchers/node/index.js +27 -0
  204. package/dist/dispatchers/node/index.js.map +1 -0
  205. package/dist/durable-hooks.d.ts +31 -0
  206. package/dist/durable-hooks.d.ts.map +1 -0
  207. package/dist/durable-hooks.js +23 -0
  208. package/dist/durable-hooks.js.map +1 -0
  209. package/dist/fragments/internal-fragment.d.ts +186 -8
  210. package/dist/fragments/internal-fragment.d.ts.map +1 -1
  211. package/dist/fragments/internal-fragment.js +203 -38
  212. package/dist/fragments/internal-fragment.js.map +1 -1
  213. package/dist/fragments/internal-fragment.routes.js +164 -0
  214. package/dist/fragments/internal-fragment.routes.js.map +1 -0
  215. package/dist/fragments/internal-fragment.schema.d.ts +15 -0
  216. package/dist/fragments/internal-fragment.schema.d.ts.map +1 -0
  217. package/dist/fragments/internal-fragment.schema.js +39 -0
  218. package/dist/fragments/internal-fragment.schema.js.map +1 -0
  219. package/dist/hooks/durable-hooks-logger.d.ts +10 -0
  220. package/dist/hooks/durable-hooks-logger.d.ts.map +1 -0
  221. package/dist/hooks/durable-hooks-logger.js +75 -0
  222. package/dist/hooks/durable-hooks-logger.js.map +1 -0
  223. package/dist/hooks/durable-hooks-processor.d.ts +1 -0
  224. package/dist/hooks/durable-hooks-processor.js +80 -0
  225. package/dist/hooks/durable-hooks-processor.js.map +1 -0
  226. package/dist/hooks/durable-hooks-runtime.js +44 -0
  227. package/dist/hooks/durable-hooks-runtime.js.map +1 -0
  228. package/dist/hooks/hooks.d.ts +100 -1
  229. package/dist/hooks/hooks.d.ts.map +1 -1
  230. package/dist/hooks/hooks.js +254 -27
  231. package/dist/hooks/hooks.js.map +1 -1
  232. package/dist/id.d.ts +2 -2
  233. package/dist/id.js +2 -2
  234. package/dist/internal/adapter-registry.d.ts +11 -0
  235. package/dist/internal/adapter-registry.d.ts.map +1 -0
  236. package/dist/internal/adapter-registry.js +135 -0
  237. package/dist/internal/adapter-registry.js.map +1 -0
  238. package/dist/internal/outbox-state.d.ts +2 -0
  239. package/dist/internal/outbox-state.js +26 -0
  240. package/dist/internal/outbox-state.js.map +1 -0
  241. package/dist/migration-engine/auto-from-schema.d.ts +33 -0
  242. package/dist/migration-engine/auto-from-schema.d.ts.map +1 -0
  243. package/dist/migration-engine/auto-from-schema.js +223 -37
  244. package/dist/migration-engine/auto-from-schema.js.map +1 -1
  245. package/dist/migration-engine/generation-engine.d.ts +16 -10
  246. package/dist/migration-engine/generation-engine.d.ts.map +1 -1
  247. package/dist/migration-engine/generation-engine.js +86 -35
  248. package/dist/migration-engine/generation-engine.js.map +1 -1
  249. package/dist/migration-engine/shared.d.ts +113 -0
  250. package/dist/migration-engine/shared.d.ts.map +1 -0
  251. package/dist/migration-engine/shared.js.map +1 -1
  252. package/dist/mod.d.ts +20 -12
  253. package/dist/mod.d.ts.map +1 -1
  254. package/dist/mod.js +18 -12
  255. package/dist/mod.js.map +1 -1
  256. package/dist/naming/sql-naming.d.ts +19 -0
  257. package/dist/naming/sql-naming.d.ts.map +1 -0
  258. package/dist/naming/sql-naming.js +116 -0
  259. package/dist/naming/sql-naming.js.map +1 -0
  260. package/dist/outbox/outbox-builder.js +156 -0
  261. package/dist/outbox/outbox-builder.js.map +1 -0
  262. package/dist/outbox/outbox.d.ts +54 -0
  263. package/dist/outbox/outbox.d.ts.map +1 -0
  264. package/dist/outbox/outbox.js +37 -0
  265. package/dist/outbox/outbox.js.map +1 -0
  266. package/dist/query/column-defaults.js +20 -4
  267. package/dist/query/column-defaults.js.map +1 -1
  268. package/dist/query/condition-builder.d.ts +7 -1
  269. package/dist/query/condition-builder.d.ts.map +1 -1
  270. package/dist/query/condition-builder.js +5 -1
  271. package/dist/query/condition-builder.js.map +1 -1
  272. package/dist/query/cursor-client.d.ts +105 -0
  273. package/dist/query/cursor-client.d.ts.map +1 -0
  274. package/dist/query/cursor-client.js +165 -0
  275. package/dist/query/cursor-client.js.map +1 -0
  276. package/dist/query/cursor.d.ts +3 -1
  277. package/dist/query/cursor.d.ts.map +1 -1
  278. package/dist/query/cursor.js +51 -14
  279. package/dist/query/cursor.js.map +1 -1
  280. package/dist/query/db-now.d.ts +22 -0
  281. package/dist/query/db-now.d.ts.map +1 -0
  282. package/dist/query/db-now.js +35 -0
  283. package/dist/query/db-now.js.map +1 -0
  284. package/dist/query/orm/orm.js.map +1 -1
  285. package/dist/query/serialize/create-sql-serializer.js +5 -4
  286. package/dist/query/serialize/create-sql-serializer.js.map +1 -1
  287. package/dist/query/serialize/dialect/mysql-serializer.js +12 -6
  288. package/dist/query/serialize/dialect/mysql-serializer.js.map +1 -1
  289. package/dist/query/serialize/dialect/postgres-serializer.js +25 -7
  290. package/dist/query/serialize/dialect/postgres-serializer.js.map +1 -1
  291. package/dist/query/serialize/dialect/sqlite-serializer.js +60 -12
  292. package/dist/query/serialize/dialect/sqlite-serializer.js.map +1 -1
  293. package/dist/query/serialize/sql-serializer.js +2 -2
  294. package/dist/query/serialize/sql-serializer.js.map +1 -1
  295. package/dist/query/simple-query-interface.d.ts +13 -4
  296. package/dist/query/simple-query-interface.d.ts.map +1 -1
  297. package/dist/query/unit-of-work/execute-unit-of-work.d.ts +37 -2
  298. package/dist/query/unit-of-work/execute-unit-of-work.d.ts.map +1 -1
  299. package/dist/query/unit-of-work/execute-unit-of-work.js +50 -24
  300. package/dist/query/unit-of-work/execute-unit-of-work.js.map +1 -1
  301. package/dist/query/unit-of-work/unit-of-work.d.ts +92 -30
  302. package/dist/query/unit-of-work/unit-of-work.d.ts.map +1 -1
  303. package/dist/query/unit-of-work/unit-of-work.js +136 -11
  304. package/dist/query/unit-of-work/unit-of-work.js.map +1 -1
  305. package/dist/query/value-decoding.js +16 -6
  306. package/dist/query/value-decoding.js.map +1 -1
  307. package/dist/query/value-encoding.js +29 -9
  308. package/dist/query/value-encoding.js.map +1 -1
  309. package/dist/schema/create.d.ts +103 -35
  310. package/dist/schema/create.d.ts.map +1 -1
  311. package/dist/schema/create.js +172 -58
  312. package/dist/schema/create.js.map +1 -1
  313. package/dist/schema/generate-id.js +2 -2
  314. package/dist/schema/generate-id.js.map +1 -1
  315. package/dist/schema/type-conversion/create-sql-type-mapper.js +4 -3
  316. package/dist/schema/type-conversion/create-sql-type-mapper.js.map +1 -1
  317. package/dist/schema/type-conversion/dialect/sqlite.js +9 -0
  318. package/dist/schema/type-conversion/dialect/sqlite.js.map +1 -1
  319. package/dist/schema/validator.d.ts +10 -0
  320. package/dist/schema/validator.d.ts.map +1 -0
  321. package/dist/schema/validator.js +123 -0
  322. package/dist/schema/validator.js.map +1 -0
  323. package/dist/schema-output/drizzle.d.ts +30 -0
  324. package/dist/schema-output/drizzle.d.ts.map +1 -0
  325. package/dist/{adapters/drizzle/generate.js → schema-output/drizzle.js} +88 -60
  326. package/dist/schema-output/drizzle.js.map +1 -0
  327. package/dist/schema-output/prisma.d.ts +17 -0
  328. package/dist/schema-output/prisma.d.ts.map +1 -0
  329. package/dist/schema-output/prisma.js +307 -0
  330. package/dist/schema-output/prisma.js.map +1 -0
  331. package/dist/sql-driver/dialects/durable-object-dialect.js +3 -9
  332. package/dist/sql-driver/dialects/durable-object-dialect.js.map +1 -1
  333. package/dist/sql-driver/query-executor/default-query-executor.js.map +1 -1
  334. package/dist/sql-driver/query-executor/query-executor-base.js.map +1 -1
  335. package/dist/sql-driver/sql-driver-adapter.js.map +1 -1
  336. package/dist/sql-driver/sql.js.map +1 -1
  337. package/dist/sync/commands.d.ts +15 -0
  338. package/dist/sync/commands.d.ts.map +1 -0
  339. package/dist/sync/commands.js +27 -0
  340. package/dist/sync/commands.js.map +1 -0
  341. package/dist/sync/index.d.ts +4 -0
  342. package/dist/sync/index.js +4 -0
  343. package/dist/sync/read-tracking.d.ts +25 -0
  344. package/dist/sync/read-tracking.d.ts.map +1 -0
  345. package/dist/sync/read-tracking.js +148 -0
  346. package/dist/sync/read-tracking.js.map +1 -0
  347. package/dist/sync/submit.js +213 -0
  348. package/dist/sync/submit.js.map +1 -0
  349. package/dist/sync/types.d.ts +63 -0
  350. package/dist/sync/types.d.ts.map +1 -0
  351. package/dist/util/default-database-adapter.js +66 -0
  352. package/dist/util/default-database-adapter.js.map +1 -0
  353. package/dist/with-database.d.ts +3 -6
  354. package/dist/with-database.d.ts.map +1 -1
  355. package/dist/with-database.js +8 -7
  356. package/dist/with-database.js.map +1 -1
  357. package/package.json +62 -55
  358. package/src/adapters/adapters.ts +33 -26
  359. package/src/adapters/drizzle/migrate-drizzle.test.ts +99 -41
  360. package/src/adapters/drizzle/migration-parity-drizzle-kit.test.ts +601 -0
  361. package/src/adapters/drizzle/test-utils.ts +13 -8
  362. package/src/adapters/generic-sql/driver-config.ts +38 -0
  363. package/src/adapters/generic-sql/generic-sql-adapter.test.ts +10 -8
  364. package/src/adapters/generic-sql/generic-sql-adapter.ts +117 -34
  365. package/src/adapters/generic-sql/generic-sql-uow-executor.test.ts +55 -0
  366. package/src/adapters/generic-sql/generic-sql-uow-executor.ts +297 -3
  367. package/src/adapters/generic-sql/migration/adapter-migration-parity.test.ts +120 -0
  368. package/src/adapters/generic-sql/migration/cold-kysely.ts +1 -0
  369. package/src/adapters/generic-sql/migration/dialect/mysql.test.ts +27 -8
  370. package/src/adapters/generic-sql/migration/dialect/mysql.ts +47 -8
  371. package/src/adapters/generic-sql/migration/dialect/postgres.test.ts +28 -9
  372. package/src/adapters/generic-sql/migration/dialect/postgres.ts +9 -4
  373. package/src/adapters/generic-sql/migration/dialect/sqlite.test.ts +839 -8
  374. package/src/adapters/generic-sql/migration/dialect/sqlite.ts +396 -53
  375. package/src/adapters/generic-sql/migration/executor.test.ts +52 -0
  376. package/src/adapters/generic-sql/migration/executor.ts +47 -4
  377. package/src/adapters/generic-sql/migration/prepared-migrations.test.ts +238 -46
  378. package/src/adapters/generic-sql/migration/prepared-migrations.ts +21 -13
  379. package/src/adapters/generic-sql/migration/sql-generator.ts +145 -66
  380. package/src/adapters/generic-sql/query/create-sql-query-compiler.ts +11 -8
  381. package/src/adapters/generic-sql/query/cursor-utils.test.ts +272 -0
  382. package/src/adapters/generic-sql/query/cursor-utils.ts +42 -7
  383. package/src/adapters/generic-sql/query/db-now-sql.ts +49 -0
  384. package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.test.ts +171 -35
  385. package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.ts +53 -40
  386. package/src/adapters/generic-sql/query/select-builder.test.ts +16 -11
  387. package/src/adapters/generic-sql/query/select-builder.ts +7 -3
  388. package/src/adapters/generic-sql/query/sql-query-compiler.test.ts +75 -6
  389. package/src/adapters/generic-sql/query/sql-query-compiler.ts +129 -24
  390. package/src/adapters/generic-sql/query/where-builder.test.ts +96 -20
  391. package/src/adapters/generic-sql/query/where-builder.ts +112 -41
  392. package/src/adapters/{kysely/kysely-adapter-pglite.test.ts → generic-sql/sql-adapter-pglite-migrations.test.ts} +11 -20
  393. package/src/adapters/generic-sql/sql-adapter-pglite-pagination.test.ts +851 -0
  394. package/src/adapters/{drizzle/drizzle-adapter-pglite.test.ts → generic-sql/sql-adapter-pglite-queries.test.ts} +18 -15
  395. package/src/adapters/generic-sql/{test/generic-drizzle-adapter-sqlite3.test.ts → sql-adapter-sqlite3-driver.test.ts} +282 -14
  396. package/src/adapters/{drizzle/drizzle-adapter-sqlite3.test.ts → generic-sql/sql-adapter-sqlite3-uow.test.ts} +129 -12
  397. package/src/adapters/{kysely/kysely-adapter-sqlocal.test.ts → generic-sql/sql-adapter-sqlocal.test.ts} +9 -7
  398. package/src/adapters/generic-sql/sqlite-storage.ts +20 -0
  399. package/src/adapters/generic-sql/uow-decoder.test.ts +5 -4
  400. package/src/adapters/generic-sql/uow-decoder.ts +23 -5
  401. package/src/adapters/generic-sql/uow-encoder.test.ts +36 -3
  402. package/src/adapters/generic-sql/uow-encoder.ts +48 -13
  403. package/src/adapters/in-memory/condition-evaluator.test.ts +194 -0
  404. package/src/adapters/in-memory/condition-evaluator.ts +280 -0
  405. package/src/adapters/in-memory/errors.ts +20 -0
  406. package/src/adapters/in-memory/in-memory-adapter.ts +388 -0
  407. package/src/adapters/in-memory/in-memory-uow.mutations.test.ts +344 -0
  408. package/src/adapters/in-memory/in-memory-uow.retrieval.test.ts +255 -0
  409. package/src/adapters/in-memory/in-memory-uow.ts +1724 -0
  410. package/src/adapters/in-memory/index.ts +3 -0
  411. package/src/adapters/in-memory/options.test.ts +42 -0
  412. package/src/adapters/in-memory/options.ts +91 -0
  413. package/src/adapters/in-memory/outbox.test.ts +361 -0
  414. package/src/adapters/in-memory/reference-resolution.test.ts +51 -0
  415. package/src/adapters/in-memory/reference-resolution.ts +67 -0
  416. package/src/adapters/in-memory/sorted-array-index.test.ts +124 -0
  417. package/src/adapters/in-memory/sorted-array-index.ts +228 -0
  418. package/src/adapters/in-memory/store.test.ts +69 -0
  419. package/src/adapters/in-memory/store.ts +145 -0
  420. package/src/adapters/in-memory/value-comparison.ts +53 -0
  421. package/src/adapters/in-memory/value-normalization.test.ts +58 -0
  422. package/src/adapters/prisma/prisma-adapter-sqlite3.test.ts +1207 -0
  423. package/src/adapters/shared/from-unit-of-work-compiler.ts +159 -47
  424. package/src/adapters/shared/uow-operation-compiler.ts +28 -18
  425. package/src/adapters/sql/index.ts +12 -0
  426. package/src/browser/mod.ts +64 -0
  427. package/src/client.ts +19 -0
  428. package/src/db-fragment-definition-builder.test.ts +845 -53
  429. package/src/db-fragment-definition-builder.ts +911 -95
  430. package/src/db-fragment-instantiator.test.ts +210 -94
  431. package/src/db-fragment-integration.test.ts +17 -12
  432. package/src/dispatchers/cloudflare-do/dispatcher.ts +204 -0
  433. package/src/dispatchers/cloudflare-do/index.test.ts +206 -0
  434. package/src/dispatchers/cloudflare-do/index.ts +63 -0
  435. package/src/dispatchers/node/dispatcher.ts +112 -0
  436. package/src/dispatchers/node/index.test.ts +120 -0
  437. package/src/dispatchers/node/index.ts +50 -0
  438. package/src/durable-hooks.test.ts +80 -0
  439. package/src/durable-hooks.ts +67 -0
  440. package/src/fragments/internal-fragment.routes.test.ts +570 -0
  441. package/src/fragments/internal-fragment.routes.ts +334 -0
  442. package/src/fragments/internal-fragment.schema.ts +95 -0
  443. package/src/fragments/internal-fragment.test.ts +505 -83
  444. package/src/fragments/internal-fragment.ts +453 -70
  445. package/src/hooks/durable-hooks-logger.ts +126 -0
  446. package/src/hooks/durable-hooks-processor.pglite.test.ts +87 -0
  447. package/src/hooks/durable-hooks-processor.test.ts +282 -0
  448. package/src/hooks/durable-hooks-processor.ts +173 -0
  449. package/src/hooks/durable-hooks-runtime.test.ts +65 -0
  450. package/src/hooks/durable-hooks-runtime.ts +81 -0
  451. package/src/hooks/hooks.test.ts +455 -34
  452. package/src/hooks/hooks.ts +501 -34
  453. package/src/id.test.ts +34 -0
  454. package/src/id.ts +1 -3
  455. package/src/internal/adapter-registry.test.ts +93 -0
  456. package/src/internal/adapter-registry.ts +239 -0
  457. package/src/internal/outbox-state.ts +43 -0
  458. package/src/migration-engine/auto-from-schema.test.ts +107 -14
  459. package/src/migration-engine/auto-from-schema.ts +365 -44
  460. package/src/migration-engine/create.test.ts +4 -3
  461. package/src/migration-engine/create.ts +1 -1
  462. package/src/migration-engine/generation-engine.test.ts +292 -110
  463. package/src/migration-engine/generation-engine.ts +117 -66
  464. package/src/migration-engine/shared.ts +14 -0
  465. package/src/mod.ts +95 -39
  466. package/src/naming/sql-naming.ts +181 -0
  467. package/src/outbox/outbox-builder.ts +241 -0
  468. package/src/outbox/outbox.test.ts +424 -0
  469. package/src/outbox/outbox.ts +139 -0
  470. package/src/query/column-defaults.ts +42 -4
  471. package/src/query/condition-builder.test.ts +18 -3
  472. package/src/query/condition-builder.ts +7 -0
  473. package/src/query/cursor-client.test.ts +70 -0
  474. package/src/query/cursor-client.ts +263 -0
  475. package/src/query/cursor.test.ts +119 -20
  476. package/src/query/cursor.ts +88 -27
  477. package/src/query/db-now.ts +73 -0
  478. package/src/query/orm/orm.ts +2 -2
  479. package/src/query/query-type.test.ts +4 -3
  480. package/src/query/serialize/create-sql-serializer.ts +10 -5
  481. package/src/query/serialize/dialect/mysql-serializer.ts +13 -5
  482. package/src/query/serialize/dialect/postgres-serializer.ts +35 -5
  483. package/src/query/serialize/dialect/sqlite-serializer.test.ts +90 -3
  484. package/src/query/serialize/dialect/sqlite-serializer.ts +108 -12
  485. package/src/query/serialize/sql-serializer.ts +4 -4
  486. package/src/query/simple-query-interface.ts +15 -4
  487. package/src/query/unit-of-work/execute-unit-of-work.test.ts +372 -10
  488. package/src/query/unit-of-work/execute-unit-of-work.ts +87 -27
  489. package/src/query/unit-of-work/retry-policy.test.ts +1 -0
  490. package/src/query/unit-of-work/tx-builder.test.ts +73 -1
  491. package/src/query/unit-of-work/unit-of-work-coordinator.test.ts +17 -16
  492. package/src/query/unit-of-work/unit-of-work-types.test.ts +42 -12
  493. package/src/query/unit-of-work/unit-of-work.test.ts +196 -39
  494. package/src/query/unit-of-work/unit-of-work.ts +309 -38
  495. package/src/query/value-decoding.test.ts +63 -4
  496. package/src/query/value-decoding.ts +32 -6
  497. package/src/query/value-encoding.test.ts +86 -2
  498. package/src/query/value-encoding.ts +56 -6
  499. package/src/schema/create.test.ts +293 -47
  500. package/src/schema/create.ts +406 -70
  501. package/src/schema/generate-id.test.ts +3 -2
  502. package/src/schema/generate-id.ts +2 -2
  503. package/src/schema/serialize.test.ts +18 -5
  504. package/src/schema/type-conversion/create-sql-type-mapper.ts +8 -3
  505. package/src/schema/type-conversion/dialect/sqlite.ts +18 -0
  506. package/src/schema/type-conversion/type-mapping.test.ts +26 -1
  507. package/src/schema/validator.test.ts +199 -0
  508. package/src/schema/validator.ts +232 -0
  509. package/src/{adapters/drizzle/generate.test.ts → schema-output/drizzle.test.ts} +232 -129
  510. package/src/{adapters/drizzle/generate.ts → schema-output/drizzle.ts} +155 -99
  511. package/src/schema-output/prisma.test.ts +694 -0
  512. package/src/schema-output/prisma.ts +593 -0
  513. package/src/sql-driver/better-sqlite3.test.ts +5 -3
  514. package/src/sql-driver/dialects/durable-object-dialect.ts +3 -8
  515. package/src/sql-driver/query-executor/default-query-executor.ts +1 -1
  516. package/src/sql-driver/query-executor/query-executor-base.ts +1 -1
  517. package/src/sql-driver/query-executor/query-executor.ts +1 -1
  518. package/src/sql-driver/sql-driver-adapter.ts +2 -2
  519. package/src/sql-driver/sql.ts +2 -1
  520. package/src/sql-driver/sqlocal.test.ts +4 -2
  521. package/src/sync/commands.test.ts +39 -0
  522. package/src/sync/commands.ts +51 -0
  523. package/src/sync/conflict-checker.test.ts +450 -0
  524. package/src/sync/conflict-checker.ts +248 -0
  525. package/src/sync/index.ts +14 -0
  526. package/src/sync/plan.ts +9 -0
  527. package/src/sync/read-tracking.test.ts +177 -0
  528. package/src/sync/read-tracking.ts +287 -0
  529. package/src/sync/submit.test.ts +205 -0
  530. package/src/sync/submit.ts +328 -0
  531. package/src/sync/types.ts +80 -0
  532. package/src/util/default-database-adapter.ts +119 -0
  533. package/src/with-database.ts +20 -31
  534. package/tsconfig.json +1 -1
  535. package/tsdown.config.ts +38 -24
  536. package/vitest.config.ts +1 -0
  537. package/dist/adapters/drizzle/drizzle-adapter.d.ts +0 -20
  538. package/dist/adapters/drizzle/drizzle-adapter.d.ts.map +0 -1
  539. package/dist/adapters/drizzle/drizzle-adapter.js +0 -27
  540. package/dist/adapters/drizzle/drizzle-adapter.js.map +0 -1
  541. package/dist/adapters/drizzle/generate.d.ts +0 -30
  542. package/dist/adapters/drizzle/generate.d.ts.map +0 -1
  543. package/dist/adapters/drizzle/generate.js.map +0 -1
  544. package/dist/adapters/kysely/kysely-adapter.d.ts +0 -19
  545. package/dist/adapters/kysely/kysely-adapter.d.ts.map +0 -1
  546. package/dist/adapters/kysely/kysely-adapter.js +0 -17
  547. package/dist/adapters/kysely/kysely-adapter.js.map +0 -1
  548. package/dist/adapters/shared/table-name-mapper.d.ts +0 -12
  549. package/dist/adapters/shared/table-name-mapper.d.ts.map +0 -1
  550. package/dist/adapters/shared/table-name-mapper.js +0 -43
  551. package/dist/adapters/shared/table-name-mapper.js.map +0 -1
  552. package/dist/node_modules/.pnpm/rou3@0.7.10/node_modules/rou3/dist/index.js +0 -165
  553. package/dist/node_modules/.pnpm/rou3@0.7.10/node_modules/rou3/dist/index.js.map +0 -1
  554. package/dist/packages/fragno/dist/api/bind-services.js +0 -20
  555. package/dist/packages/fragno/dist/api/bind-services.js.map +0 -1
  556. package/dist/packages/fragno/dist/api/error.js +0 -48
  557. package/dist/packages/fragno/dist/api/error.js.map +0 -1
  558. package/dist/packages/fragno/dist/api/fragment-definition-builder.js +0 -320
  559. package/dist/packages/fragno/dist/api/fragment-definition-builder.js.map +0 -1
  560. package/dist/packages/fragno/dist/api/fragment-instantiator.js +0 -525
  561. package/dist/packages/fragno/dist/api/fragment-instantiator.js.map +0 -1
  562. package/dist/packages/fragno/dist/api/fragno-response.js +0 -73
  563. package/dist/packages/fragno/dist/api/fragno-response.js.map +0 -1
  564. package/dist/packages/fragno/dist/api/internal/response-stream.js +0 -81
  565. package/dist/packages/fragno/dist/api/internal/response-stream.js.map +0 -1
  566. package/dist/packages/fragno/dist/api/internal/route.js +0 -10
  567. package/dist/packages/fragno/dist/api/internal/route.js.map +0 -1
  568. package/dist/packages/fragno/dist/api/mutable-request-state.js +0 -97
  569. package/dist/packages/fragno/dist/api/mutable-request-state.js.map +0 -1
  570. package/dist/packages/fragno/dist/api/request-context-storage.js +0 -43
  571. package/dist/packages/fragno/dist/api/request-context-storage.js.map +0 -1
  572. package/dist/packages/fragno/dist/api/request-input-context.js +0 -118
  573. package/dist/packages/fragno/dist/api/request-input-context.js.map +0 -1
  574. package/dist/packages/fragno/dist/api/request-middleware.js +0 -83
  575. package/dist/packages/fragno/dist/api/request-middleware.js.map +0 -1
  576. package/dist/packages/fragno/dist/api/request-output-context.js +0 -119
  577. package/dist/packages/fragno/dist/api/request-output-context.js.map +0 -1
  578. package/dist/packages/fragno/dist/api/route.js +0 -17
  579. package/dist/packages/fragno/dist/api/route.js.map +0 -1
  580. package/dist/packages/fragno/dist/internal/symbols.js +0 -10
  581. package/dist/packages/fragno/dist/internal/symbols.js.map +0 -1
  582. package/dist/schema-generator/schema-generator.d.ts +0 -15
  583. package/dist/schema-generator/schema-generator.d.ts.map +0 -1
  584. package/src/adapters/drizzle/drizzle-adapter.ts +0 -39
  585. package/src/adapters/kysely/kysely-adapter.ts +0 -27
  586. package/src/adapters/shared/table-name-mapper.ts +0 -50
  587. package/src/schema-generator/schema-generator.ts +0 -12
@@ -1,103 +1,148 @@
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";
7
8
  import {
8
9
  internalFragmentDef,
9
10
  internalSchema,
10
- SETTINGS_NAMESPACE,
11
+ SETTINGS_TABLE_NAME,
11
12
  getSchemaVersionFromDatabase,
12
13
  } from "../fragments/internal-fragment";
13
- import { instantiate } from "@fragno-dev/core";
14
+ import { getRegistryForAdapterSync } from "../internal/adapter-registry";
15
+ import type { FragnoDatabase } from "../mod";
16
+ import { generateDrizzleSchema } from "../schema-output/drizzle";
17
+ import { generatePrismaSchema } from "../schema-output/prisma";
18
+ import type { AnySchema } from "../schema/create";
14
19
 
15
20
  export interface GenerationEngineResult {
16
21
  schema: string;
17
22
  path: string;
18
- namespace: string;
23
+ namespace: string | null;
24
+ }
25
+
26
+ export type SchemaOutputFormat = "sql" | "drizzle" | "prisma";
27
+
28
+ export interface GenerateSchemaOptions {
29
+ format?: SchemaOutputFormat;
30
+ path?: string;
31
+ toVersion?: number;
32
+ fromVersion?: number;
19
33
  }
20
34
 
21
35
  export interface GenerationInternalResult {
22
36
  schema: string;
23
37
  path: string;
24
- namespace: string;
38
+ namespace: string | null;
39
+ namespaceKey: string;
40
+ schemaName: string;
41
+ isSettings: boolean;
25
42
  fromVersion: number;
26
43
  toVersion: number;
27
44
  }
28
45
 
29
46
  export interface ExecuteMigrationResult {
30
- namespace: string;
47
+ namespace: string | null;
31
48
  didMigrate: boolean;
32
49
  fromVersion: number;
33
50
  toVersion: number;
34
51
  }
35
52
 
36
- export async function generateMigrationsOrSchema<
53
+ const DEFAULT_DRIZZLE_PATH = "fragno-schema.ts";
54
+ const DEFAULT_PRISMA_PATH = "fragno.prisma";
55
+
56
+ const isSupportedDatabase = (value: string): value is SupportedDatabase =>
57
+ supportedDatabases.includes(value as SupportedDatabase);
58
+
59
+ export async function generateSchemaArtifacts<
37
60
  // oxlint-disable-next-line no-explicit-any
38
61
  const TDatabases extends FragnoDatabase<AnySchema, any>[],
39
- >(
40
- databases: TDatabases,
41
- options?: {
42
- path?: string;
43
- toVersion?: number;
44
- fromVersion?: number;
45
- },
46
- ): Promise<GenerationEngineResult[]> {
62
+ >(databases: TDatabases, options?: GenerateSchemaOptions): Promise<GenerationEngineResult[]> {
47
63
  if (databases.length === 0) {
48
64
  throw new Error("No databases provided for schema generation");
49
65
  }
50
66
 
51
67
  const firstDb = databases[0];
52
68
  const adapter = firstDb.adapter;
69
+ const format = options?.format ?? "sql";
53
70
 
54
- // If adapter has createSchemaGenerator, use it for combined generation (e.g., Drizzle)
55
- if (adapter.createSchemaGenerator) {
71
+ if (format !== "sql") {
56
72
  if (options?.toVersion !== undefined || options?.fromVersion !== undefined) {
57
- console.warn(
58
- "⚠️ Warning: --from and --to version options are not supported when generating schemas for multiple fragments and will be ignored.",
73
+ throw new Error("--from and --to are only supported when generating SQL migrations.");
74
+ }
75
+
76
+ const databaseType = adapter.adapterMetadata?.databaseType;
77
+ if (!databaseType || !isSupportedDatabase(databaseType)) {
78
+ throw new Error(
79
+ "Adapter does not expose databaseType metadata required for schema output generation.",
59
80
  );
60
81
  }
61
82
 
62
83
  // Collect all schemas, de-duplicating by namespace.
63
84
  // The internal fragment (settings schema) is always included first since all database
64
- // fragments automatically link to it via withDatabase().
65
- const fragmentsMap = new Map<string, { schema: AnySchema; namespace: string }>();
85
+ // fragments share it via the adapter registry.
86
+ const fragmentsMap = new Map<string, { schema: AnySchema; namespace: string | null }>();
66
87
 
67
88
  // Include internal fragment first with empty namespace (settings table has no prefix)
68
- fragmentsMap.set("", {
89
+ fragmentsMap.set(internalSchema.name, {
69
90
  schema: internalSchema,
70
- namespace: "",
91
+ namespace: null,
71
92
  });
72
93
 
73
94
  // Add user fragments, de-duplicating by namespace
74
95
  // Each FragnoDatabase has a unique namespace, so this prevents duplicate schema generation
75
96
  for (const db of databases) {
76
- if (!fragmentsMap.has(db.namespace)) {
77
- fragmentsMap.set(db.namespace, {
97
+ const namespaceKey = db.namespace ?? db.schema.name;
98
+ if (!fragmentsMap.has(namespaceKey)) {
99
+ fragmentsMap.set(namespaceKey, {
78
100
  schema: db.schema,
79
101
  namespace: db.namespace,
80
102
  });
81
103
  }
82
104
  }
83
105
 
84
- const allFragments = Array.from(fragmentsMap.values());
85
- const generator = adapter.createSchemaGenerator(allFragments, {
86
- path: options?.path,
87
- });
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 }));
122
+ const defaultPath = format === "drizzle" ? DEFAULT_DRIZZLE_PATH : DEFAULT_PRISMA_PATH;
123
+ const schema =
124
+ format === "drizzle"
125
+ ? generateDrizzleSchema(allFragments, databaseType, {
126
+ namingStrategy: adapter.namingStrategy,
127
+ })
128
+ : generatePrismaSchema(allFragments, databaseType, {
129
+ sqliteStorageMode: adapter.adapterMetadata?.sqliteStorageMode,
130
+ namingStrategy: adapter.namingStrategy,
131
+ });
88
132
 
89
133
  return [
90
134
  {
91
- ...generator.generateSchema(),
135
+ schema,
136
+ path: options?.path ?? defaultPath,
92
137
  namespace: firstDb.namespace,
93
138
  },
94
139
  ];
95
140
  }
96
141
 
97
- // Otherwise, use migration engine for individual generation (e.g., Kysely, GenericSQL)
142
+ // Otherwise, use migration engine for SQL migration generation.
98
143
  if (!adapter.prepareMigrations) {
99
144
  throw new Error(
100
- "Adapter does not support migration-based schema generation. Ensure your adapter implements prepareMigrations.",
145
+ "Adapter does not support migration generation. Ensure your adapter implements prepareMigrations.",
101
146
  );
102
147
  }
103
148
 
@@ -109,18 +154,15 @@ export async function generateMigrationsOrSchema<
109
154
 
110
155
  // Use the internal fragment for settings management
111
156
  const internalFragment = instantiate(internalFragmentDef)
112
- .withConfig({})
113
- .withOptions({ databaseAdapter: adapter })
157
+ .withConfig({ registry: getRegistryForAdapterSync(adapter) })
158
+ .withOptions({ databaseAdapter: adapter, databaseNamespace: null })
114
159
  .build();
115
160
 
116
- const settingsSourceVersion = await getSchemaVersionFromDatabase(
117
- internalFragment,
118
- SETTINGS_NAMESPACE,
119
- );
161
+ const settingsSourceVersion = await getSchemaVersionFromDatabase(internalFragment, "");
120
162
 
121
163
  const generatedFiles: GenerationInternalResult[] = [];
122
164
 
123
- // Use empty namespace for settings (SETTINGS_NAMESPACE is for prefixing keys, not the database namespace)
165
+ // Internal fragment uses empty-string namespace: no table suffix, version key is ".schema_version"
124
166
  const settingsPreparedMigrations = adapter.prepareMigrations(internalSchema, "");
125
167
  const settingsTargetVersion = internalSchema.version;
126
168
 
@@ -134,7 +176,10 @@ export async function generateMigrationsOrSchema<
134
176
  generatedFiles.push({
135
177
  schema: settingsSql,
136
178
  path: "settings-migration.sql", // Placeholder, will be renamed in post-processing
137
- namespace: "", // Empty namespace for settings table
179
+ namespace: null,
180
+ namespaceKey: SETTINGS_TABLE_NAME,
181
+ schemaName: internalSchema.name,
182
+ isSettings: true,
138
183
  fromVersion: settingsSourceVersion,
139
184
  toVersion: settingsTargetVersion,
140
185
  });
@@ -147,8 +192,8 @@ export async function generateMigrationsOrSchema<
147
192
  // Use migration engine
148
193
  if (!dbAdapter.prepareMigrations) {
149
194
  throw new Error(
150
- `Adapter for ${db.namespace} does not support schema generation. ` +
151
- `Ensure your adapter implements either createSchemaGenerator or prepareMigrations.`,
195
+ `Adapter for ${db.namespace ?? db.schema.name} does not support migration generation. ` +
196
+ `Ensure your adapter implements prepareMigrations.`,
152
197
  );
153
198
  }
154
199
 
@@ -165,6 +210,9 @@ export async function generateMigrationsOrSchema<
165
210
  schema: sql,
166
211
  path: "schema.sql", // Placeholder, will be renamed in post-processing
167
212
  namespace: db.namespace,
213
+ namespaceKey: db.namespace ?? db.schema.name,
214
+ schemaName: db.schema.name,
215
+ isSettings: false,
168
216
  fromVersion: sourceVersion,
169
217
  toVersion: targetVersion,
170
218
  });
@@ -196,7 +244,7 @@ export async function executeMigrations<const TDatabases extends FragnoDatabase<
196
244
  if (!adapter.prepareMigrations) {
197
245
  throw new Error(
198
246
  "Adapter does not support running migrations. The adapter only supports schema generation.\n" +
199
- "Try using 'generateMigrationsOrSchema' instead to generate schema files.",
247
+ "Try using 'generateSchemaArtifacts' instead to generate schema files.",
200
248
  );
201
249
  }
202
250
 
@@ -224,7 +272,8 @@ export async function executeMigrations<const TDatabases extends FragnoDatabase<
224
272
 
225
273
  const results: ExecuteMigrationResult[] = [];
226
274
  const migrationsToExecute: Array<{
227
- namespace: string;
275
+ namespace: string | null;
276
+ namespaceKey: string;
228
277
  fromVersion: number;
229
278
  toVersion: number;
230
279
  execute: () => Promise<void>;
@@ -233,16 +282,13 @@ export async function executeMigrations<const TDatabases extends FragnoDatabase<
233
282
  // 1. Prepare settings table migration
234
283
  // Use the internal fragment for settings management
235
284
  const internalFragment = instantiate(internalFragmentDef)
236
- .withConfig({})
237
- .withOptions({ databaseAdapter: adapter })
285
+ .withConfig({ registry: getRegistryForAdapterSync(adapter) })
286
+ .withOptions({ databaseAdapter: adapter, databaseNamespace: null })
238
287
  .build();
239
288
 
240
- const settingsSourceVersion = await getSchemaVersionFromDatabase(
241
- internalFragment,
242
- SETTINGS_NAMESPACE,
243
- );
289
+ const settingsSourceVersion = await getSchemaVersionFromDatabase(internalFragment, "");
244
290
 
245
- // Use empty namespace for settings (SETTINGS_NAMESPACE is for prefixing keys, not the database namespace)
291
+ // Internal fragment uses empty-string namespace: no table suffix, version key is ".schema_version"
246
292
  const settingsPreparedMigrations = adapter.prepareMigrations(internalSchema, "");
247
293
  const settingsTargetVersion = internalSchema.version;
248
294
 
@@ -255,7 +301,8 @@ export async function executeMigrations<const TDatabases extends FragnoDatabase<
255
301
 
256
302
  if (compiledMigration.statements.length > 0) {
257
303
  migrationsToExecute.push({
258
- namespace: "", // Empty namespace for settings table
304
+ namespace: null,
305
+ namespaceKey: SETTINGS_TABLE_NAME,
259
306
  fromVersion: settingsSourceVersion,
260
307
  toVersion: settingsTargetVersion,
261
308
  execute: () =>
@@ -267,11 +314,15 @@ export async function executeMigrations<const TDatabases extends FragnoDatabase<
267
314
  }
268
315
 
269
316
  // 2. Prepare fragment migrations (sorted alphabetically)
270
- const sortedDatabases = [...databases].sort((a, b) => a.namespace.localeCompare(b.namespace));
317
+ const getNamespaceKey = (db: FragnoDatabase<AnySchema>) => db.namespace ?? db.schema.name;
318
+ const sortedDatabases = [...databases].sort((a, b) =>
319
+ getNamespaceKey(a).localeCompare(getNamespaceKey(b)),
320
+ );
271
321
 
272
322
  for (const fragnoDb of sortedDatabases) {
323
+ const namespaceKey = getNamespaceKey(fragnoDb);
273
324
  const preparedMigrations = adapter.prepareMigrations(fragnoDb.schema, fragnoDb.namespace);
274
- const currentVersion = await getSchemaVersionFromDatabase(internalFragment, fragnoDb.namespace);
325
+ const currentVersion = await getSchemaVersionFromDatabase(internalFragment, namespaceKey);
275
326
  const targetVersion = fragnoDb.schema.version;
276
327
 
277
328
  if (currentVersion < targetVersion) {
@@ -282,6 +333,7 @@ export async function executeMigrations<const TDatabases extends FragnoDatabase<
282
333
  if (compiledMigration.statements.length > 0) {
283
334
  migrationsToExecute.push({
284
335
  namespace: fragnoDb.namespace,
336
+ namespaceKey,
285
337
  fromVersion: currentVersion,
286
338
  toVersion: targetVersion,
287
339
  execute: () =>
@@ -294,6 +346,7 @@ export async function executeMigrations<const TDatabases extends FragnoDatabase<
294
346
  }
295
347
 
296
348
  // 3. Execute all migrations in order
349
+ const executedNamespaceKeys = new Set<string>();
297
350
  for (const migration of migrationsToExecute) {
298
351
  await migration.execute();
299
352
  results.push({
@@ -302,11 +355,13 @@ export async function executeMigrations<const TDatabases extends FragnoDatabase<
302
355
  fromVersion: migration.fromVersion,
303
356
  toVersion: migration.toVersion,
304
357
  });
358
+ executedNamespaceKeys.add(migration.namespaceKey);
305
359
  }
306
360
 
307
361
  // 4. Add skipped migrations (already up-to-date)
308
362
  for (const fragnoDb of databases) {
309
- if (!results.find((r) => r.namespace === fragnoDb.namespace)) {
363
+ const namespaceKey = getNamespaceKey(fragnoDb);
364
+ if (!executedNamespaceKeys.has(namespaceKey)) {
310
365
  results.push({
311
366
  namespace: fragnoDb.namespace,
312
367
  didMigrate: false,
@@ -322,7 +377,7 @@ export async function executeMigrations<const TDatabases extends FragnoDatabase<
322
377
  /**
323
378
  * Post-processes migration files to add ordering and standardize naming.
324
379
  *
325
- * Sorts files with settings namespace first, then alphabetically by namespace,
380
+ * Sorts files with settings namespace first, then alphabetically by namespace key,
326
381
  * and assigns ordering numbers. Transforms filenames to format:
327
382
  * `<date>_<n>_f<from>_t<to>_<namespace>.sql`
328
383
  *
@@ -336,16 +391,15 @@ export function postProcessMigrationFilenames(
336
391
  return [];
337
392
  }
338
393
 
339
- // Sort files: settings namespace first (empty string), then alphabetically by namespace
394
+ // Sort files: settings first, then alphabetically by namespace key
340
395
  const sortedFiles = [...files].sort((a, b) => {
341
- // Settings table has empty namespace - sort it first
342
- if (a.namespace === "") {
396
+ if (a.isSettings) {
343
397
  return -1;
344
398
  }
345
- if (b.namespace === "") {
399
+ if (b.isSettings) {
346
400
  return 1;
347
401
  }
348
- return a.namespace.localeCompare(b.namespace);
402
+ return a.namespaceKey.localeCompare(b.namespaceKey);
349
403
  });
350
404
 
351
405
  // Generate date prefix for filenames
@@ -361,10 +415,7 @@ export function postProcessMigrationFilenames(
361
415
  const fromPadded = fromVersion.toString().padStart(3, "0");
362
416
  const toPadded = toVersion.toString().padStart(3, "0");
363
417
 
364
- // For settings table (empty namespace), use "fragno_db_settings" in the filename
365
- // For other tables, use their namespace
366
- const safeName =
367
- file.namespace === "" ? "fragno_db_settings" : file.namespace.replace(/[^a-z0-9-]/gi, "_");
418
+ const safeName = file.namespaceKey.replace(/[^a-z0-9-]/gi, "_");
368
419
  const newPath = `${date}_${orderNum}_f${fromPadded}_t${toPadded}_${safeName}.sql`;
369
420
 
370
421
  return {
@@ -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
  > =
@@ -54,6 +67,7 @@ export type MigrationOperation<
54
67
  type: "drop-foreign-key";
55
68
  table: string;
56
69
  name: string;
70
+ referencedTable: string;
57
71
  } & { metadata?: TMeta })
58
72
  | ({
59
73
  type: "drop-index";
package/src/mod.ts CHANGED
@@ -1,25 +1,37 @@
1
+ import type { FragnoInstantiatedFragment } from "@fragno-dev/core";
2
+
1
3
  import type { DatabaseAdapter } from "./adapters/adapters";
2
- import type { AnySchema } from "./schema/create";
3
- import type { CursorResult } from "./query/cursor";
4
- import { Cursor } from "./query/cursor";
5
- import type { FragnoInstantiatedFragment, AnyFragnoInstantiatedFragment } from "@fragno-dev/core";
6
4
  import type {
7
5
  FragnoPublicConfigWithDatabase,
8
6
  ImplicitDatabaseDependencies,
7
+ DatabaseHandlerContext,
9
8
  } from "./db-fragment-definition-builder";
9
+ import { getSchemaVersionFromDatabase } from "./fragments/internal-fragment";
10
+ import { getInternalFragment } from "./internal/adapter-registry";
11
+ import type { CursorResult } from "./query/cursor";
12
+ import { Cursor } from "./query/cursor";
10
13
  import {
11
- getSchemaVersionFromDatabase,
12
- type InternalFragmentInstance,
13
- } from "./fragments/internal-fragment";
14
+ dbInterval,
15
+ dbNow,
16
+ type DbInterval,
17
+ type DbIntervalInput,
18
+ type DbNow,
19
+ } from "./query/db-now";
20
+ import type { AnySchema } from "./schema/create";
14
21
 
15
22
  export type { DatabaseAdapter, CursorResult };
16
23
  export { Cursor };
24
+ export { dbNow, dbInterval };
25
+ export type { DbNow, DbInterval, DbIntervalInput };
26
+ export { InMemoryAdapter, type InMemoryAdapterOptions } from "./adapters/in-memory";
27
+ export { internalSchema } from "./fragments/internal-fragment";
28
+ export { getInternalFragment } from "./internal/adapter-registry";
17
29
 
18
30
  export const fragnoDatabaseFakeSymbol = "$fragno-database" as const;
19
31
  export const fragnoDatabaseLibraryVersion = "0.1" as const;
20
32
 
21
33
  export interface CreateFragnoDatabaseDefinitionOptions<T extends AnySchema> {
22
- namespace: string;
34
+ namespace: string | null;
23
35
  schema: T;
24
36
  }
25
37
 
@@ -43,11 +55,15 @@ export function isFragnoDatabase(value: unknown): value is FragnoDatabase<AnySch
43
55
  * Created from a FragnoDatabaseDefinition by calling .create(adapter).
44
56
  */
45
57
  export class FragnoDatabase<const T extends AnySchema, TUOWConfig = void> {
46
- #namespace: string;
58
+ #namespace: string | null;
47
59
  #schema: T;
48
60
  #adapter: DatabaseAdapter<TUOWConfig>;
49
61
 
50
- constructor(options: { namespace: string; schema: T; adapter: DatabaseAdapter<TUOWConfig> }) {
62
+ constructor(options: {
63
+ namespace: string | null;
64
+ schema: T;
65
+ adapter: DatabaseAdapter<TUOWConfig>;
66
+ }) {
51
67
  this.#namespace = options.namespace;
52
68
  this.#schema = options.schema;
53
69
  this.#adapter = options.adapter;
@@ -72,8 +88,10 @@ export class FragnoDatabase<const T extends AnySchema, TUOWConfig = void> {
72
88
 
73
89
  export {
74
90
  DatabaseFragmentDefinitionBuilder,
91
+ type DbRoundtripGuardConfig,
75
92
  type FragnoPublicConfigWithDatabase,
76
93
  type DatabaseFragmentContext,
94
+ type DatabaseServiceContext,
77
95
  type DatabaseHandlerContext as DatabaseRequestContext,
78
96
  type ImplicitDatabaseDependencies,
79
97
  } from "./db-fragment-definition-builder";
@@ -107,8 +125,10 @@ export {
107
125
  HandlerTxBuilder,
108
126
  createServiceTxBuilder,
109
127
  createHandlerTxBuilder,
128
+ serviceCalls,
110
129
  type TxResult,
111
130
  // Builder context types
131
+ type HandlerTxContext,
112
132
  type ServiceBuilderMutateContext,
113
133
  type HandlerBuilderMutateContext,
114
134
  type BuilderTransformContextWithMutate,
@@ -121,25 +141,60 @@ export type { BoundServices } from "@fragno-dev/core";
121
141
 
122
142
  export { internalFragmentDef } from "./fragments/internal-fragment";
123
143
  export type { InternalFragmentInstance } from "./fragments/internal-fragment";
124
-
125
- export type { HookContext, HooksMap, HookFn, HookPayload, TriggerHookOptions } from "./hooks/hooks";
126
-
127
- export type AnyFragnoInstantiatedDatabaseFragment = FragnoInstantiatedFragment<
128
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
129
- any,
130
- ImplicitDatabaseDependencies<AnySchema>,
131
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
132
- any,
133
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
134
- any,
135
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
136
- any,
137
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
138
- any,
139
- FragnoPublicConfigWithDatabase,
140
- // Ensure the fragment has the internal fragment linked
141
- { _fragno_internal: InternalFragmentInstance } & Record<string, AnyFragnoInstantiatedFragment>
142
- >;
144
+ export type {
145
+ OutboxConfig,
146
+ OutboxEntry,
147
+ OutboxPayload,
148
+ OutboxMutation,
149
+ OutboxRefMap,
150
+ } from "./outbox/outbox";
151
+
152
+ export type {
153
+ HookContext,
154
+ HooksMap,
155
+ HookFn,
156
+ HookHandlerTx,
157
+ HookPayload,
158
+ TriggerHookOptions,
159
+ DurableHooksProcessingOptions,
160
+ StuckHookProcessingInfo,
161
+ StuckHookProcessingEvent,
162
+ StuckHookProcessingTimeoutMinutes,
163
+ } from "./hooks/hooks";
164
+ export { defineSyncCommands } from "./sync/commands";
165
+ export type {
166
+ DurableHookRecord,
167
+ DurableHookStatus,
168
+ DurableHooksAccessor,
169
+ DurableHooksService,
170
+ } from "./durable-hooks";
171
+ export { getDurableHooksService } from "./durable-hooks";
172
+ export type {
173
+ SubmitAppliedResponse,
174
+ SubmitConflictReason,
175
+ SubmitConflictResponse,
176
+ SubmitRequest,
177
+ SubmitResponse,
178
+ SyncCommandDefinition,
179
+ SyncCommandHandler,
180
+ SyncCommandRegistry,
181
+ SyncCommandTxFactory,
182
+ } from "./sync/types";
183
+
184
+ export type AnyFragnoInstantiatedDatabaseFragment<TSchema extends AnySchema = AnySchema> =
185
+ FragnoInstantiatedFragment<
186
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
187
+ any,
188
+ ImplicitDatabaseDependencies<TSchema>,
189
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
190
+ any,
191
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
192
+ any,
193
+ DatabaseHandlerContext,
194
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
195
+ any,
196
+ FragnoPublicConfigWithDatabase
197
+ >;
143
198
 
144
199
  /**
145
200
  * Helper function to run migrations for a database fragment.
@@ -163,9 +218,11 @@ export type AnyFragnoInstantiatedDatabaseFragment = FragnoInstantiatedFragment<
163
218
  * await migrate(fragment);
164
219
  * ```
165
220
  */
166
- export async function migrate(fragment: AnyFragnoInstantiatedDatabaseFragment): Promise<void> {
167
- const { options, deps, linkedFragments } = fragment.$internal;
168
- const adapter = options.databaseAdapter;
221
+ export async function migrate<TSchema extends AnySchema>(
222
+ fragment: AnyFragnoInstantiatedDatabaseFragment<TSchema>,
223
+ ): Promise<void> {
224
+ const { deps } = fragment.$internal;
225
+ const adapter = deps.databaseAdapter;
169
226
 
170
227
  // Check if adapter supports prepareMigrations
171
228
  if (!adapter.prepareMigrations) {
@@ -175,14 +232,10 @@ export async function migrate(fragment: AnyFragnoInstantiatedDatabaseFragment):
175
232
  }
176
233
 
177
234
  const schema = deps.schema;
178
- const namespace = deps.namespace;
235
+ const namespace = deps.namespace ?? schema.name;
179
236
 
180
237
  // Step 1: Ensure the internal fragment (settings table) is migrated first
181
- const internalFragment = linkedFragments._fragno_internal;
182
-
183
- if (!internalFragment) {
184
- throw new Error("Internal fragment not found. Please ensure the internal fragment is linked.");
185
- }
238
+ const internalFragment = getInternalFragment(adapter);
186
239
 
187
240
  if (!(await adapter.isConnectionHealthy())) {
188
241
  throw new Error(
@@ -192,7 +245,10 @@ export async function migrate(fragment: AnyFragnoInstantiatedDatabaseFragment):
192
245
 
193
246
  const internalDeps = internalFragment.$internal.deps;
194
247
  const internalSchema = internalDeps.schema;
195
- const internalNamespace = internalDeps.namespace;
248
+ // Internal fragment uses databaseNamespace: null (no table suffix).
249
+ // Version tracking uses empty string so the key is ".schema_version",
250
+ // which matches both the legacy format and how the internal fragment was designed.
251
+ const internalNamespace = internalDeps.namespace ?? "";
196
252
 
197
253
  const internalCurrentVersion = await getSchemaVersionFromDatabase(
198
254
  internalFragment,