@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,7 @@
1
- import type { StandardSchemaV1 } from "@standard-schema/spec";
2
1
  import { describe, expect, it } from "vitest";
2
+
3
+ import type { StandardSchemaV1 } from "@standard-schema/spec";
4
+
3
5
  import {
4
6
  FragnoDbValidationError,
5
7
  FragnoId,
@@ -121,7 +123,7 @@ describe("table validation", () => {
121
123
  const users = testSchema.tables.users;
122
124
  const posts = testSchema.tables.posts;
123
125
 
124
- const longId = "a".repeat(31);
126
+ const longId = "a".repeat(129);
125
127
  const longTitleResult = posts["~standard"].validate({
126
128
  id: "post-1",
127
129
  userId: "user-1",
@@ -1,4 +1,5 @@
1
1
  import type { StandardSchemaV1 } from "@standard-schema/spec";
2
+
2
3
  import type {
3
4
  AnyColumn,
4
5
  Table,
@@ -1,7 +1,8 @@
1
1
  import { describe, expect, it } from "vitest";
2
+
3
+ import { internalSchema } from "../fragments/internal-fragment";
2
4
  import { column, idColumn, referenceColumn, schema } from "../schema/create";
3
5
  import { generateDrizzleSchema } from "./drizzle";
4
- import { internalSchema } from "../fragments/internal-fragment";
5
6
 
6
7
  describe("generateDrizzleSchema", () => {
7
8
  const testSchema = schema("test", (s) => {
@@ -32,6 +33,26 @@ describe("generateDrizzleSchema", () => {
32
33
  });
33
34
  });
34
35
 
36
+ it("should reflect alterColumn nullable changes", () => {
37
+ const alteredSchema = schema("altered", (s) => {
38
+ return s
39
+ .addTable("users", (t) => {
40
+ return t.addColumn("id", idColumn()).addColumn("name", column("string"));
41
+ })
42
+ .alterTable("users", (t) => {
43
+ return t.alterColumn("name").nullable();
44
+ });
45
+ });
46
+
47
+ const generated = generateDrizzleSchema(
48
+ [{ namespace: "altered", schema: alteredSchema }],
49
+ "postgresql",
50
+ );
51
+
52
+ expect(generated).toContain(`name: text("name")`);
53
+ expect(generated).not.toContain(`name: text("name").notNull()`);
54
+ });
55
+
35
56
  describe("postgresql", () => {
36
57
  it("should generate PostgreSQL schema", () => {
37
58
  const generated = generateDrizzleSchema(
@@ -50,7 +71,7 @@ describe("generateDrizzleSchema", () => {
50
71
  const schema_test = pgSchema("test");
51
72
 
52
73
  export const users_test = schema_test.table("users", {
53
- id: varchar("id", { length: 30 }).notNull().unique().$defaultFn(() => createId()),
74
+ id: varchar("id", { length: 128 }).notNull().unique().$defaultFn(() => createId()),
54
75
  name: text("name").notNull(),
55
76
  email: text("email").notNull(),
56
77
  age: integer("age"),
@@ -62,7 +83,7 @@ describe("generateDrizzleSchema", () => {
62
83
  ])
63
84
 
64
85
  export const posts_test = schema_test.table("posts", {
65
- id: varchar("id", { length: 30 }).notNull().unique().$defaultFn(() => createId()),
86
+ id: varchar("id", { length: 128 }).notNull().unique().$defaultFn(() => createId()),
66
87
  title: text("title").notNull(),
67
88
  content: text("content").notNull(),
68
89
  userId: bigint("userId", { mode: "number" }).notNull(),
@@ -121,7 +142,7 @@ describe("generateDrizzleSchema", () => {
121
142
  // ============================================================================
122
143
 
123
144
  export const users_test = mysqlTable("users_test", {
124
- id: varchar("id", { length: 30 }).notNull().unique().$defaultFn(() => createId()),
145
+ id: varchar("id", { length: 128 }).notNull().unique().$defaultFn(() => createId()),
125
146
  name: text("name").notNull(),
126
147
  email: text("email").notNull(),
127
148
  age: int("age"),
@@ -133,7 +154,7 @@ describe("generateDrizzleSchema", () => {
133
154
  ])
134
155
 
135
156
  export const posts_test = mysqlTable("posts_test", {
136
- id: varchar("id", { length: 30 }).notNull().unique().$defaultFn(() => createId()),
157
+ id: varchar("id", { length: 128 }).notNull().unique().$defaultFn(() => createId()),
137
158
  title: text("title").notNull(),
138
159
  content: text("content").notNull(),
139
160
  userId: bigint("userId", { mode: "number" }).notNull(),
@@ -281,7 +302,7 @@ describe("generateDrizzleSchema", () => {
281
302
  const schema_test = pgSchema("test");
282
303
 
283
304
  export const events_test = schema_test.table("events", {
284
- id: varchar("id", { length: 30 }).notNull().unique().$defaultFn(() => createId()),
305
+ id: varchar("id", { length: 128 }).notNull().unique().$defaultFn(() => createId()),
285
306
  createdAt: timestamp("createdAt").notNull().$defaultFn(() => new Date()),
286
307
  _internalId: bigserial("_internalId", { mode: "number" }).primaryKey().notNull(),
287
308
  _version: integer("_version").notNull().default(0)
@@ -320,7 +341,7 @@ describe("generateDrizzleSchema", () => {
320
341
  const schema_test = pgSchema("test");
321
342
 
322
343
  export const events_test = schema_test.table("events", {
323
- id: varchar("id", { length: 30 }).notNull().unique().$defaultFn(() => createId()),
344
+ id: varchar("id", { length: 128 }).notNull().unique().$defaultFn(() => createId()),
324
345
  createdAt: timestamp("createdAt").notNull().defaultNow(),
325
346
  _internalId: bigserial("_internalId", { mode: "number" }).primaryKey().notNull(),
326
347
  _version: integer("_version").notNull().default(0)
@@ -374,7 +395,7 @@ describe("generateDrizzleSchema", () => {
374
395
  const schema_test = pgSchema("test");
375
396
 
376
397
  export const files_test = schema_test.table("files", {
377
- id: varchar("id", { length: 30 }).notNull().unique().$defaultFn(() => createId()),
398
+ id: varchar("id", { length: 128 }).notNull().unique().$defaultFn(() => createId()),
378
399
  data: customBinary("data").notNull(),
379
400
  _internalId: bigserial("_internalId", { mode: "number" }).primaryKey().notNull(),
380
401
  _version: integer("_version").notNull().default(0)
@@ -431,14 +452,14 @@ describe("generateDrizzleSchema", () => {
431
452
  const schema_test = pgSchema("test");
432
453
 
433
454
  export const users_test = schema_test.table("users", {
434
- id: varchar("id", { length: 30 }).notNull().unique().$defaultFn(() => createId()),
455
+ id: varchar("id", { length: 128 }).notNull().unique().$defaultFn(() => createId()),
435
456
  name: text("name").notNull(),
436
457
  _internalId: bigserial("_internalId", { mode: "number" }).primaryKey().notNull(),
437
458
  _version: integer("_version").notNull().default(0)
438
459
  })
439
460
 
440
461
  export const posts_test = schema_test.table("posts", {
441
- id: varchar("id", { length: 30 }).notNull().unique().$defaultFn(() => createId()),
462
+ id: varchar("id", { length: 128 }).notNull().unique().$defaultFn(() => createId()),
442
463
  title: text("title").notNull(),
443
464
  userId: bigint("userId", { mode: "number" }).notNull(),
444
465
  _internalId: bigserial("_internalId", { mode: "number" }).primaryKey().notNull(),
@@ -498,14 +519,14 @@ describe("generateDrizzleSchema", () => {
498
519
  // ============================================================================
499
520
 
500
521
  export const users_test = mysqlTable("users_test", {
501
- id: varchar("id", { length: 30 }).notNull().unique().$defaultFn(() => createId()),
522
+ id: varchar("id", { length: 128 }).notNull().unique().$defaultFn(() => createId()),
502
523
  name: text("name").notNull(),
503
524
  _internalId: bigint("_internalId", { mode: "number" }).primaryKey().autoincrement().notNull(),
504
525
  _version: int("_version").notNull().default(0)
505
526
  })
506
527
 
507
528
  export const posts_test = mysqlTable("posts_test", {
508
- id: varchar("id", { length: 30 }).notNull().unique().$defaultFn(() => createId()),
529
+ id: varchar("id", { length: 128 }).notNull().unique().$defaultFn(() => createId()),
509
530
  title: text("title").notNull(),
510
531
  userId: bigint("userId", { mode: "number" }).notNull(),
511
532
  _internalId: bigint("_internalId", { mode: "number" }).primaryKey().autoincrement().notNull(),
@@ -670,14 +691,14 @@ describe("generateDrizzleSchema", () => {
670
691
  const schema_test = pgSchema("test");
671
692
 
672
693
  export const categories_test = schema_test.table("categories", {
673
- id: varchar("id", { length: 30 }).notNull().unique().$defaultFn(() => createId()),
694
+ id: varchar("id", { length: 128 }).notNull().unique().$defaultFn(() => createId()),
674
695
  name: text("name").notNull(),
675
696
  _internalId: bigserial("_internalId", { mode: "number" }).primaryKey().notNull(),
676
697
  _version: integer("_version").notNull().default(0)
677
698
  })
678
699
 
679
700
  export const products_test = schema_test.table("products", {
680
- id: varchar("id", { length: 30 }).notNull().unique().$defaultFn(() => createId()),
701
+ id: varchar("id", { length: 128 }).notNull().unique().$defaultFn(() => createId()),
681
702
  name: text("name").notNull(),
682
703
  categoryId: bigint("categoryId", { mode: "number" }).notNull(),
683
704
  _internalId: bigserial("_internalId", { mode: "number" }).primaryKey().notNull(),
@@ -748,7 +769,7 @@ describe("generateDrizzleSchema", () => {
748
769
  const schema_test = pgSchema("test");
749
770
 
750
771
  export const category_test = schema_test.table("category", {
751
- id: varchar("id", { length: 30 }).notNull().unique().$defaultFn(() => createId()),
772
+ id: varchar("id", { length: 128 }).notNull().unique().$defaultFn(() => createId()),
752
773
  name: text("name").notNull(),
753
774
  parentId: bigint("parentId", { mode: "number" }),
754
775
  _internalId: bigserial("_internalId", { mode: "number" }).primaryKey().notNull(),
@@ -786,6 +807,38 @@ describe("generateDrizzleSchema", () => {
786
807
  });
787
808
  });
788
809
 
810
+ it("should skip join-only relations in schema output", () => {
811
+ const joinOnlySchema = schema("joinonly", (s) => {
812
+ return s
813
+ .addTable("users", (t) => {
814
+ return t
815
+ .addColumn("id", idColumn())
816
+ .addColumn("email", column("string"))
817
+ .createIndex("idx_users_email", ["email"]);
818
+ })
819
+ .addTable("invitations", (t) => {
820
+ return t
821
+ .addColumn("id", idColumn())
822
+ .addColumn("email", column("string"))
823
+ .createIndex("idx_inv_email", ["email"]);
824
+ })
825
+ .addReference("invitedUser", {
826
+ type: "one",
827
+ from: { table: "invitations", column: "email" },
828
+ to: { table: "users", column: "email" },
829
+ foreignKey: false,
830
+ });
831
+ });
832
+
833
+ const generated = generateDrizzleSchema(
834
+ [{ namespace: "test", schema: joinOnlySchema }],
835
+ "postgresql",
836
+ );
837
+
838
+ expect(generated).not.toContain("foreignKey(");
839
+ expect(generated).not.toContain("relations(");
840
+ });
841
+
789
842
  describe("self-referencing foreign keys", () => {
790
843
  const selfRefSchema = schema("selfref", (s) => {
791
844
  return s
@@ -820,7 +873,7 @@ describe("generateDrizzleSchema", () => {
820
873
  const schema_test = pgSchema("test");
821
874
 
822
875
  export const comment_test = schema_test.table("comment", {
823
- id: varchar("id", { length: 30 }).notNull().unique().$defaultFn(() => createId()),
876
+ id: varchar("id", { length: 128 }).notNull().unique().$defaultFn(() => createId()),
824
877
  content: text("content").notNull(),
825
878
  parentId: bigint("parentId", { mode: "number" }),
826
879
  _internalId: bigserial("_internalId", { mode: "number" }).primaryKey().notNull(),
@@ -870,7 +923,7 @@ describe("generateDrizzleSchema", () => {
870
923
  // ============================================================================
871
924
 
872
925
  export const comment_test = mysqlTable("comment_test", {
873
- id: varchar("id", { length: 30 }).notNull().unique().$defaultFn(() => createId()),
926
+ id: varchar("id", { length: 128 }).notNull().unique().$defaultFn(() => createId()),
874
927
  content: text("content").notNull(),
875
928
  parentId: bigint("parentId", { mode: "number" }),
876
929
  _internalId: bigint("_internalId", { mode: "number" }).primaryKey().autoincrement().notNull(),
@@ -1045,7 +1098,7 @@ describe("generateDrizzleSchema", () => {
1045
1098
  const schema_my_fragment_v2 = pgSchema("my-fragment-v2");
1046
1099
 
1047
1100
  export const users_my_fragment_v2 = schema_my_fragment_v2.table("users", {
1048
- id: varchar("id", { length: 30 }).notNull().unique().$defaultFn(() => createId()),
1101
+ id: varchar("id", { length: 128 }).notNull().unique().$defaultFn(() => createId()),
1049
1102
  name: text("name").notNull(),
1050
1103
  email: text("email").notNull(),
1051
1104
  age: integer("age"),
@@ -1057,7 +1110,7 @@ describe("generateDrizzleSchema", () => {
1057
1110
  ])
1058
1111
 
1059
1112
  export const posts_my_fragment_v2 = schema_my_fragment_v2.table("posts", {
1060
- id: varchar("id", { length: 30 }).notNull().unique().$defaultFn(() => createId()),
1113
+ id: varchar("id", { length: 128 }).notNull().unique().$defaultFn(() => createId()),
1061
1114
  title: text("title").notNull(),
1062
1115
  content: text("content").notNull(),
1063
1116
  userId: bigint("userId", { mode: "number" }).notNull(),
@@ -1,25 +1,25 @@
1
- import { importGenerator } from "../util/import-generator";
2
- import { ident, parseVarchar } from "../util/parse";
3
1
  import {
4
- type AnyColumn,
5
- type AnySchema,
6
- type AnyTable,
7
- type Relation,
8
- InternalIdColumn,
9
- } from "../schema/create";
2
+ defaultNamingStrategyForDatabase,
3
+ type SupportedDatabase,
4
+ } from "../adapters/generic-sql/driver-config";
5
+ import { internalSchema } from "../fragments/internal-fragment.schema";
10
6
  import {
11
7
  createNamingResolver,
12
8
  sanitizeNamespace,
13
9
  type NamingResolver,
14
10
  type SqlNamingStrategy,
15
11
  } from "../naming/sql-naming";
16
- import { internalSchema } from "../fragments/internal-fragment.schema";
17
- import { type DatabaseTypeLiteral } from "../schema/type-conversion/type-mapping";
18
- import { createSQLTypeMapper } from "../schema/type-conversion/create-sql-type-mapper";
19
12
  import {
20
- defaultNamingStrategyForDatabase,
21
- type SupportedDatabase,
22
- } from "../adapters/generic-sql/driver-config";
13
+ type AnyColumn,
14
+ type AnySchema,
15
+ type AnyTable,
16
+ type Relation,
17
+ InternalIdColumn,
18
+ } from "../schema/create";
19
+ import { createSQLTypeMapper } from "../schema/type-conversion/create-sql-type-mapper";
20
+ import { type DatabaseTypeLiteral } from "../schema/type-conversion/type-mapping";
21
+ import { importGenerator } from "../util/import-generator";
22
+ import { ident, parseVarchar } from "../util/parse";
23
23
 
24
24
  // ============================================================================
25
25
  // PROVIDER CONFIGURATION
@@ -369,7 +369,7 @@ function generateForeignKeys(
369
369
  for (const relation of Object.values(table.relations)) {
370
370
  // Only "one" relations generate foreign keys
371
371
  // "many" relations don't have foreign keys (they're on the other side)
372
- if (relation.type === "many") {
372
+ if (relation.type === "many" || relation.foreignKey === false) {
373
373
  continue;
374
374
  }
375
375
 
@@ -380,7 +380,7 @@ function generateForeignKeys(
380
380
  for (const [localCol, refCol] of relation.on) {
381
381
  columns.push(`table.${localCol}`);
382
382
  // Foreign keys always reference internal IDs
383
- const actualRefCol = refCol === "id" ? "_internalId" : refCol;
383
+ const actualRefCol = refCol !== "id" ? refCol : "_internalId";
384
384
  // For self-referencing foreign keys, use table parameter instead of table constant
385
385
  if (isSelfReference) {
386
386
  foreignColumns.push(`table.${actualRefCol}`);
@@ -524,6 +524,9 @@ function generateRelation(
524
524
 
525
525
  // Generate explicit relations defined on this table
526
526
  for (const relation of Object.values(table.relations)) {
527
+ if (relation.foreignKey === false) {
528
+ continue;
529
+ }
527
530
  const options: string[] = [`relationName: "${relation.id}"`];
528
531
 
529
532
  // Track which relation types are used
@@ -547,7 +550,7 @@ function generateRelation(
547
550
  for (const [left, right] of relation.on) {
548
551
  fields.push(`${tableRef}.${left}`);
549
552
  // Relations reference internal IDs
550
- const actualRight = right === "id" ? "_internalId" : right;
553
+ const actualRight = right !== "id" ? right : "_internalId";
551
554
  references.push(`${relatedTableRef}.${actualRight}`);
552
555
  }
553
556
 
@@ -571,7 +574,7 @@ function generateRelation(
571
574
  if (inverseRelations && inverseRelations.length > 0) {
572
575
  for (const { fromTable, relation } of inverseRelations) {
573
576
  // Only generate inverse for "one" relations (they become "many" on this side)
574
- if (relation.type === "one") {
577
+ if (relation.type === "one" && relation.foreignKey !== false) {
575
578
  hasMany = true;
576
579
 
577
580
  // Use sanitized TypeScript export name for identifier reference
@@ -739,6 +742,9 @@ export function generateDrizzleSchema(
739
742
  const inverseRelations = new Map<string, Array<{ fromTable: AnyTable; relation: Relation }>>();
740
743
  for (const table of Object.values(schema.tables)) {
741
744
  for (const relation of Object.values(table.relations)) {
745
+ if (relation.foreignKey === false) {
746
+ continue;
747
+ }
742
748
  // Track this relation as an inverse on the target table
743
749
  const targetTableName = relation.table.name;
744
750
  if (!inverseRelations.has(targetTableName)) {
@@ -1,8 +1,9 @@
1
1
  import { describe, expect, it } from "vitest";
2
- import { column, idColumn, referenceColumn, schema } from "../schema/create";
2
+
3
+ import { sqliteStorageDefault, sqliteStoragePrisma } from "../adapters/generic-sql/sqlite-storage";
3
4
  import { internalSchema } from "../fragments/internal-fragment";
5
+ import { column, idColumn, referenceColumn, schema } from "../schema/create";
4
6
  import { generatePrismaSchema } from "./prisma";
5
- import { sqliteStorageDefault, sqliteStoragePrisma } from "../adapters/generic-sql/sqlite-storage";
6
7
 
7
8
  const blogSchema = schema("blog", (s) => {
8
9
  return s
@@ -128,7 +129,7 @@ const relationNamingSchema = schema("relationnaming", (s) => {
128
129
  });
129
130
 
130
131
  describe("generatePrismaSchema", () => {
131
- it("should generate stable ordering for internal models and namespaces", () => {
132
+ it("should generate stable ordering for internal models and schemas", () => {
132
133
  const alphaSchema = schema("alpha", (s) => {
133
134
  return s
134
135
  .addTable("zeta", (t) => t.addColumn("id", idColumn()))
@@ -141,9 +142,9 @@ describe("generatePrismaSchema", () => {
141
142
 
142
143
  const generated = generatePrismaSchema(
143
144
  [
144
- { namespace: "bravo", schema: bravoSchema },
145
+ { namespace: "alpha", schema: bravoSchema },
145
146
  { namespace: null, schema: internalSchema },
146
- { namespace: "alpha", schema: alphaSchema },
147
+ { namespace: "zulu", schema: alphaSchema },
147
148
  ],
148
149
  "sqlite",
149
150
  { sqliteStorageMode: sqliteStoragePrisma },
@@ -152,9 +153,9 @@ describe("generatePrismaSchema", () => {
152
153
  const settingsIndex = generated.indexOf("model FragnoDbSettings");
153
154
  const hooksIndex = generated.indexOf("model FragnoHooks");
154
155
  const outboxIndex = generated.indexOf("model FragnoDbOutbox");
155
- const alphaIndex = generated.indexOf("model Alpha_alpha");
156
- const zetaIndex = generated.indexOf("model Zeta_alpha");
157
- const bravoIndex = generated.indexOf("model Bravo_bravo");
156
+ const alphaIndex = generated.indexOf("model Alpha_zulu");
157
+ const zetaIndex = generated.indexOf("model Zeta_zulu");
158
+ const bravoIndex = generated.indexOf("model Bravo_alpha");
158
159
 
159
160
  expect(settingsIndex).toBeGreaterThanOrEqual(0);
160
161
  expect(hooksIndex).toBeGreaterThanOrEqual(0);
@@ -198,6 +199,24 @@ describe("generatePrismaSchema", () => {
198
199
  @@map("fragno_db_outbox")
199
200
  }
200
201
 
202
+ model FragnoDbOutboxMutations {
203
+ id String @unique @default(cuid())
204
+ entryVersionstamp String
205
+ mutationVersionstamp String
206
+ uowId String
207
+ schema String
208
+ table String
209
+ externalId String
210
+ op String
211
+ createdAt DateTime @default(now())
212
+ _internalId Int @id @default(autoincrement())
213
+ _version Int @default(0)
214
+ @@index([entryVersionstamp], map: "idx_fragno_db_outbox_mutations_idx_outbox_mutations_entf896150d")
215
+ @@index([schema, table, externalId, entryVersionstamp], map: "idx_fragno_db_outbox_mutations_idx_outbox_mutations_key16922fb2")
216
+ @@index([uowId], map: "idx_fragno_db_outbox_mutations_idx_outbox_mutations_uowa7a0749c")
217
+ @@map("fragno_db_outbox_mutations")
218
+ }
219
+
201
220
  model FragnoDbSettings {
202
221
  id String @unique @default(cuid())
203
222
  key String
@@ -208,6 +227,21 @@ describe("generatePrismaSchema", () => {
208
227
  @@map("fragno_db_settings")
209
228
  }
210
229
 
230
+ model FragnoDbSyncRequests {
231
+ id String @unique @default(cuid())
232
+ requestId String
233
+ status String
234
+ confirmedCommandIds Json
235
+ conflictCommandId String?
236
+ baseVersionstamp String?
237
+ lastVersionstamp String?
238
+ createdAt DateTime @default(now())
239
+ _internalId Int @id @default(autoincrement())
240
+ _version Int @default(0)
241
+ @@unique([requestId], map: "uidx_fragno_db_sync_requests_idx_sync_request_id_a352b2bb")
242
+ @@map("fragno_db_sync_requests")
243
+ }
244
+
211
245
  model FragnoHooks {
212
246
  id String @unique @default(cuid())
213
247
  namespace String
@@ -223,6 +257,8 @@ describe("generatePrismaSchema", () => {
223
257
  nonce String
224
258
  _internalId Int @id @default(autoincrement())
225
259
  _version Int @default(0)
260
+ @@index([namespace, createdAt, id], map: "idx_fragno_hooks_idx_namespace_created_at_e489a066")
261
+ @@index([namespace, status, lastAttemptAt], map: "idx_fragno_hooks_idx_namespace_status_last_attempt_f6aacab3")
226
262
  @@index([namespace, status, nextRetryAt], map: "idx_fragno_hooks_idx_namespace_status_retry_b66b1168")
227
263
  @@index([nonce], map: "idx_fragno_hooks_idx_nonce_90c97cf1")
228
264
  @@map("fragno_hooks")
@@ -263,6 +299,26 @@ describe("generatePrismaSchema", () => {
263
299
  `);
264
300
  });
265
301
 
302
+ it("should reflect alterColumn nullable changes", () => {
303
+ const alteredSchema = schema("altered", (s) => {
304
+ return s
305
+ .addTable("users", (t) => {
306
+ return t.addColumn("id", idColumn()).addColumn("name", column("string"));
307
+ })
308
+ .alterTable("users", (t) => {
309
+ return t.alterColumn("name").nullable();
310
+ });
311
+ });
312
+
313
+ const generated = generatePrismaSchema(
314
+ [{ namespace: "altered", schema: alteredSchema }],
315
+ "sqlite",
316
+ { sqliteStorageMode: sqliteStoragePrisma },
317
+ );
318
+
319
+ expect(generated).toContain("name String?");
320
+ });
321
+
266
322
  it("should generate SQLite Prisma schema for default storage mode", () => {
267
323
  const generated = generatePrismaSchema(
268
324
  [
@@ -292,6 +348,24 @@ describe("generatePrismaSchema", () => {
292
348
  @@map("fragno_db_outbox")
293
349
  }
294
350
 
351
+ model FragnoDbOutboxMutations {
352
+ id String @unique @default(cuid())
353
+ entryVersionstamp String
354
+ mutationVersionstamp String
355
+ uowId String
356
+ schema String
357
+ table String
358
+ externalId String
359
+ op String
360
+ createdAt Int @default(dbgenerated("CURRENT_TIMESTAMP"))
361
+ _internalId Int @id @default(autoincrement())
362
+ _version Int @default(0)
363
+ @@index([entryVersionstamp], map: "idx_fragno_db_outbox_mutations_idx_outbox_mutations_entf896150d")
364
+ @@index([schema, table, externalId, entryVersionstamp], map: "idx_fragno_db_outbox_mutations_idx_outbox_mutations_key16922fb2")
365
+ @@index([uowId], map: "idx_fragno_db_outbox_mutations_idx_outbox_mutations_uowa7a0749c")
366
+ @@map("fragno_db_outbox_mutations")
367
+ }
368
+
295
369
  model FragnoDbSettings {
296
370
  id String @unique @default(cuid())
297
371
  key String
@@ -302,6 +376,21 @@ describe("generatePrismaSchema", () => {
302
376
  @@map("fragno_db_settings")
303
377
  }
304
378
 
379
+ model FragnoDbSyncRequests {
380
+ id String @unique @default(cuid())
381
+ requestId String
382
+ status String
383
+ confirmedCommandIds Json
384
+ conflictCommandId String?
385
+ baseVersionstamp String?
386
+ lastVersionstamp String?
387
+ createdAt Int @default(dbgenerated("CURRENT_TIMESTAMP"))
388
+ _internalId Int @id @default(autoincrement())
389
+ _version Int @default(0)
390
+ @@unique([requestId], map: "uidx_fragno_db_sync_requests_idx_sync_request_id_a352b2bb")
391
+ @@map("fragno_db_sync_requests")
392
+ }
393
+
305
394
  model FragnoHooks {
306
395
  id String @unique @default(cuid())
307
396
  namespace String
@@ -317,6 +406,8 @@ describe("generatePrismaSchema", () => {
317
406
  nonce String
318
407
  _internalId Int @id @default(autoincrement())
319
408
  _version Int @default(0)
409
+ @@index([namespace, createdAt, id], map: "idx_fragno_hooks_idx_namespace_created_at_e489a066")
410
+ @@index([namespace, status, lastAttemptAt], map: "idx_fragno_hooks_idx_namespace_status_last_attempt_f6aacab3")
320
411
  @@index([namespace, status, nextRetryAt], map: "idx_fragno_hooks_idx_namespace_status_retry_b66b1168")
321
412
  @@index([nonce], map: "idx_fragno_hooks_idx_nonce_90c97cf1")
322
413
  @@map("fragno_hooks")
@@ -357,6 +448,38 @@ describe("generatePrismaSchema", () => {
357
448
  `);
358
449
  });
359
450
 
451
+ it("should skip join-only relations in Prisma output", () => {
452
+ const joinOnlySchema = schema("joinonly", (s) => {
453
+ return s
454
+ .addTable("users", (t) => {
455
+ return t
456
+ .addColumn("id", idColumn())
457
+ .addColumn("email", column("string"))
458
+ .createIndex("idx_users_email", ["email"]);
459
+ })
460
+ .addTable("invitations", (t) => {
461
+ return t
462
+ .addColumn("id", idColumn())
463
+ .addColumn("email", column("string"))
464
+ .createIndex("idx_inv_email", ["email"]);
465
+ })
466
+ .addReference("invitedUser", {
467
+ type: "one",
468
+ from: { table: "invitations", column: "email" },
469
+ to: { table: "users", column: "email" },
470
+ foreignKey: false,
471
+ });
472
+ });
473
+
474
+ const generated = generatePrismaSchema(
475
+ [{ namespace: "joinonly", schema: joinOnlySchema }],
476
+ "sqlite",
477
+ { sqliteStorageMode: sqliteStoragePrisma },
478
+ );
479
+
480
+ expect(generated).not.toContain("@relation(");
481
+ });
482
+
360
483
  it("should generate PostgreSQL (PGLite) Prisma schema", () => {
361
484
  const generated = generatePrismaSchema(
362
485
  [
@@ -372,7 +495,7 @@ describe("generatePrismaSchema", () => {
372
495
  // Namespaces: blog
373
496
 
374
497
  model FragnoDbOutbox {
375
- id String @unique @default(cuid()) @db.VarChar(30)
498
+ id String @unique @default(cuid()) @db.VarChar(128)
376
499
  versionstamp String
377
500
  uowId String
378
501
  payload Json @db.Json
@@ -385,8 +508,26 @@ describe("generatePrismaSchema", () => {
385
508
  @@map("fragno_db_outbox")
386
509
  }
387
510
 
511
+ model FragnoDbOutboxMutations {
512
+ id String @unique @default(cuid()) @db.VarChar(128)
513
+ entryVersionstamp String
514
+ mutationVersionstamp String
515
+ uowId String
516
+ schema String
517
+ table String
518
+ externalId String
519
+ op String
520
+ createdAt DateTime @default(now())
521
+ _internalId BigInt @id @default(autoincrement())
522
+ _version Int @default(0)
523
+ @@index([entryVersionstamp], map: "idx_outbox_mutations_entry")
524
+ @@index([schema, table, externalId, entryVersionstamp], map: "idx_outbox_mutations_key")
525
+ @@index([uowId], map: "idx_outbox_mutations_uow")
526
+ @@map("fragno_db_outbox_mutations")
527
+ }
528
+
388
529
  model FragnoDbSettings {
389
- id String @unique @default(cuid()) @db.VarChar(30)
530
+ id String @unique @default(cuid()) @db.VarChar(128)
390
531
  key String
391
532
  value String
392
533
  _internalId BigInt @id @default(autoincrement())
@@ -395,8 +536,23 @@ describe("generatePrismaSchema", () => {
395
536
  @@map("fragno_db_settings")
396
537
  }
397
538
 
539
+ model FragnoDbSyncRequests {
540
+ id String @unique @default(cuid()) @db.VarChar(128)
541
+ requestId String
542
+ status String
543
+ confirmedCommandIds Json @db.Json
544
+ conflictCommandId String?
545
+ baseVersionstamp String?
546
+ lastVersionstamp String?
547
+ createdAt DateTime @default(now())
548
+ _internalId BigInt @id @default(autoincrement())
549
+ _version Int @default(0)
550
+ @@unique([requestId], map: "idx_sync_request_id")
551
+ @@map("fragno_db_sync_requests")
552
+ }
553
+
398
554
  model FragnoHooks {
399
- id String @unique @default(cuid()) @db.VarChar(30)
555
+ id String @unique @default(cuid()) @db.VarChar(128)
400
556
  namespace String
401
557
  hookName String
402
558
  payload Json @db.Json
@@ -410,13 +566,15 @@ describe("generatePrismaSchema", () => {
410
566
  nonce String
411
567
  _internalId BigInt @id @default(autoincrement())
412
568
  _version Int @default(0)
569
+ @@index([namespace, createdAt, id], map: "idx_namespace_created_at")
570
+ @@index([namespace, status, lastAttemptAt], map: "idx_namespace_status_last_attempt")
413
571
  @@index([namespace, status, nextRetryAt], map: "idx_namespace_status_retry")
414
572
  @@index([nonce], map: "idx_nonce")
415
573
  @@map("fragno_hooks")
416
574
  }
417
575
 
418
576
  model Posts_blog {
419
- id String @unique @default(cuid()) @db.VarChar(30)
577
+ id String @unique @default(cuid()) @db.VarChar(128)
420
578
  title String
421
579
  authorId BigInt
422
580
  editorId BigInt?
@@ -430,7 +588,7 @@ describe("generatePrismaSchema", () => {
430
588
  }
431
589
 
432
590
  model Users_blog {
433
- id String @unique @default(cuid()) @db.VarChar(30)
591
+ id String @unique @default(cuid()) @db.VarChar(128)
434
592
  email String
435
593
  createdAt DateTime @default(now())
436
594
  birthDate DateTime? @db.Date
@@ -486,7 +644,7 @@ describe("generatePrismaSchema", () => {
486
644
  // Namespaces: my-app
487
645
 
488
646
  model UserProfiles_my_app {
489
- id String @unique @default(cuid()) @db.VarChar(30)
647
+ id String @unique @default(cuid()) @db.VarChar(128)
490
648
  user_id String @map("user-id")
491
649
  display_name String? @map("display name")
492
650
  _internalId BigInt @id @default(autoincrement())