@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,10 +1,11 @@
1
1
  import { describe, expect, it } from "vitest";
2
- import { column, idColumn, referenceColumn, schema } from "../../schema/create";
3
- import { generateSchema } from "./generate";
4
- import { internalSchema } from "../../fragments/internal-fragment";
5
2
 
6
- describe("generateSchema", () => {
7
- const testSchema = schema((s) => {
3
+ import { internalSchema } from "../fragments/internal-fragment";
4
+ import { column, idColumn, referenceColumn, schema } from "../schema/create";
5
+ import { generateDrizzleSchema } from "./drizzle";
6
+
7
+ describe("generateDrizzleSchema", () => {
8
+ const testSchema = schema("test", (s) => {
8
9
  return s
9
10
  .addTable("users", (t) => {
10
11
  return t
@@ -32,11 +33,34 @@ describe("generateSchema", () => {
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
- const generated = generateSchema([{ namespace: "test", schema: testSchema }], "postgresql");
58
+ const generated = generateDrizzleSchema(
59
+ [{ namespace: "test", schema: testSchema }],
60
+ "postgresql",
61
+ );
38
62
  expect(generated).toMatchInlineSnapshot(`
39
- "import { pgTable, varchar, text, integer, bigserial, uniqueIndex, index, bigint, foreignKey } from "drizzle-orm/pg-core"
63
+ "import { pgSchema, varchar, text, integer, bigserial, uniqueIndex, index, bigint, foreignKey } from "drizzle-orm/pg-core"
40
64
  import { createId } from "@fragno-dev/db/id"
41
65
  import { relations } from "drizzle-orm"
42
66
 
@@ -44,20 +68,22 @@ describe("generateSchema", () => {
44
68
  // Fragment: test
45
69
  // ============================================================================
46
70
 
47
- export const users_test = pgTable("users_test", {
48
- id: varchar("id", { length: 30 }).notNull().$defaultFn(() => createId()),
71
+ const schema_test = pgSchema("test");
72
+
73
+ export const users_test = schema_test.table("users", {
74
+ id: varchar("id", { length: 128 }).notNull().unique().$defaultFn(() => createId()),
49
75
  name: text("name").notNull(),
50
76
  email: text("email").notNull(),
51
77
  age: integer("age"),
52
78
  _internalId: bigserial("_internalId", { mode: "number" }).primaryKey().notNull(),
53
79
  _version: integer("_version").notNull().default(0)
54
80
  }, (table) => [
55
- uniqueIndex("idx_email_test").on(table.email),
56
- index("idx_name_test").on(table.name)
81
+ uniqueIndex("idx_email").on(table.email),
82
+ index("idx_name").on(table.name)
57
83
  ])
58
84
 
59
- export const posts_test = pgTable("posts_test", {
60
- id: varchar("id", { length: 30 }).notNull().$defaultFn(() => createId()),
85
+ export const posts_test = schema_test.table("posts", {
86
+ id: varchar("id", { length: 128 }).notNull().unique().$defaultFn(() => createId()),
61
87
  title: text("title").notNull(),
62
88
  content: text("content").notNull(),
63
89
  userId: bigint("userId", { mode: "number" }).notNull(),
@@ -68,10 +94,10 @@ describe("generateSchema", () => {
68
94
  foreignKey({
69
95
  columns: [table.userId],
70
96
  foreignColumns: [users_test._internalId],
71
- name: "fk_posts_users_author_test"
97
+ name: "fk_posts_users_author"
72
98
  }),
73
- index("idx_user_test").on(table.userId),
74
- index("idx_title_test").on(table.title)
99
+ index("idx_user").on(table.userId),
100
+ index("idx_title").on(table.title)
75
101
  ])
76
102
 
77
103
  export const users_testRelations = relations(users_test, ({ many }) => ({
@@ -105,7 +131,7 @@ describe("generateSchema", () => {
105
131
 
106
132
  describe("mysql", () => {
107
133
  it("should generate MySQL schema", () => {
108
- const generated = generateSchema([{ namespace: "test", schema: testSchema }], "mysql");
134
+ const generated = generateDrizzleSchema([{ namespace: "test", schema: testSchema }], "mysql");
109
135
  expect(generated).toMatchInlineSnapshot(`
110
136
  "import { mysqlTable, varchar, text, int, bigint, uniqueIndex, index, foreignKey } from "drizzle-orm/mysql-core"
111
137
  import { createId } from "@fragno-dev/db/id"
@@ -116,19 +142,19 @@ describe("generateSchema", () => {
116
142
  // ============================================================================
117
143
 
118
144
  export const users_test = mysqlTable("users_test", {
119
- id: varchar("id", { length: 30 }).notNull().$defaultFn(() => createId()),
145
+ id: varchar("id", { length: 128 }).notNull().unique().$defaultFn(() => createId()),
120
146
  name: text("name").notNull(),
121
147
  email: text("email").notNull(),
122
148
  age: int("age"),
123
149
  _internalId: bigint("_internalId", { mode: "number" }).primaryKey().autoincrement().notNull(),
124
150
  _version: int("_version").notNull().default(0)
125
151
  }, (table) => [
126
- uniqueIndex("idx_email_test").on(table.email),
127
- index("idx_name_test").on(table.name)
152
+ uniqueIndex("uidx_users_idx_email_test_3d974845").on(table.email),
153
+ index("idx_users_idx_name_test_7f36c497").on(table.name)
128
154
  ])
129
155
 
130
156
  export const posts_test = mysqlTable("posts_test", {
131
- id: varchar("id", { length: 30 }).notNull().$defaultFn(() => createId()),
157
+ id: varchar("id", { length: 128 }).notNull().unique().$defaultFn(() => createId()),
132
158
  title: text("title").notNull(),
133
159
  content: text("content").notNull(),
134
160
  userId: bigint("userId", { mode: "number" }).notNull(),
@@ -139,10 +165,10 @@ describe("generateSchema", () => {
139
165
  foreignKey({
140
166
  columns: [table.userId],
141
167
  foreignColumns: [users_test._internalId],
142
- name: "fk_posts_users_author_test"
168
+ name: "fk_posts_users_author_test_8d48035c"
143
169
  }),
144
- index("idx_user_test").on(table.userId),
145
- index("idx_title_test").on(table.title)
170
+ index("idx_posts_idx_user_test_4a5c5c19").on(table.userId),
171
+ index("idx_posts_idx_title_test_00e97ff4").on(table.title)
146
172
  ])
147
173
 
148
174
  export const users_testRelations = relations(users_test, ({ many }) => ({
@@ -176,7 +202,10 @@ describe("generateSchema", () => {
176
202
 
177
203
  describe("sqlite", () => {
178
204
  it("should generate SQLite schema", () => {
179
- const generated = generateSchema([{ namespace: "test", schema: testSchema }], "sqlite");
205
+ const generated = generateDrizzleSchema(
206
+ [{ namespace: "test", schema: testSchema }],
207
+ "sqlite",
208
+ );
180
209
  expect(generated).toMatchInlineSnapshot(`
181
210
  "import { sqliteTable, text, integer, uniqueIndex, index, foreignKey } from "drizzle-orm/sqlite-core"
182
211
  import { createId } from "@fragno-dev/db/id"
@@ -187,19 +216,20 @@ describe("generateSchema", () => {
187
216
  // ============================================================================
188
217
 
189
218
  export const users_test = sqliteTable("users_test", {
190
- id: text("id").notNull().$defaultFn(() => createId()),
219
+ id: text("id").notNull().unique().$defaultFn(() => createId()),
191
220
  name: text("name").notNull(),
192
221
  email: text("email").notNull(),
193
222
  age: integer("age"),
194
223
  _internalId: integer("_internalId").primaryKey({ autoIncrement: true }).notNull(),
195
224
  _version: integer("_version").notNull().default(0)
196
225
  }, (table) => [
197
- uniqueIndex("idx_email_test").on(table.email),
198
- index("idx_name_test").on(table.name)
226
+ uniqueIndex("uidx_users_idx_email_test_3d974845").on(table.email),
227
+ index("idx_users_idx_name_test_7f36c497").on(table.name),
228
+ uniqueIndex("uidx_users_idx_users_external_id_test_8eaf053f").on(table.id)
199
229
  ])
200
230
 
201
231
  export const posts_test = sqliteTable("posts_test", {
202
- id: text("id").notNull().$defaultFn(() => createId()),
232
+ id: text("id").notNull().unique().$defaultFn(() => createId()),
203
233
  title: text("title").notNull(),
204
234
  content: text("content").notNull(),
205
235
  userId: integer("userId").notNull(),
@@ -210,10 +240,11 @@ describe("generateSchema", () => {
210
240
  foreignKey({
211
241
  columns: [table.userId],
212
242
  foreignColumns: [users_test._internalId],
213
- name: "fk_posts_users_author_test"
243
+ name: "fk_posts_users_author_test_8d48035c"
214
244
  }),
215
- index("idx_user_test").on(table.userId),
216
- index("idx_title_test").on(table.title)
245
+ index("idx_posts_idx_user_test_4a5c5c19").on(table.userId),
246
+ index("idx_posts_idx_title_test_00e97ff4").on(table.title),
247
+ uniqueIndex("uidx_posts_idx_posts_external_id_test_80487638").on(table.id)
217
248
  ])
218
249
 
219
250
  export const users_testRelations = relations(users_test, ({ many }) => ({
@@ -247,7 +278,7 @@ describe("generateSchema", () => {
247
278
 
248
279
  describe("default values", () => {
249
280
  it("should handle runtime default values", () => {
250
- const timestampSchema = schema((s) => {
281
+ const timestampSchema = schema("timestamp", (s) => {
251
282
  return s.addTable("events", (t) => {
252
283
  return t.addColumn("id", idColumn()).addColumn(
253
284
  "createdAt",
@@ -256,20 +287,22 @@ describe("generateSchema", () => {
256
287
  });
257
288
  });
258
289
 
259
- const generated = generateSchema(
290
+ const generated = generateDrizzleSchema(
260
291
  [{ namespace: "test", schema: timestampSchema }],
261
292
  "postgresql",
262
293
  );
263
294
  expect(generated).toMatchInlineSnapshot(`
264
- "import { pgTable, varchar, timestamp, bigserial, integer } from "drizzle-orm/pg-core"
295
+ "import { pgSchema, varchar, timestamp, bigserial, integer } from "drizzle-orm/pg-core"
265
296
  import { createId } from "@fragno-dev/db/id"
266
297
 
267
298
  // ============================================================================
268
299
  // Fragment: test
269
300
  // ============================================================================
270
301
 
271
- export const events_test = pgTable("events_test", {
272
- id: varchar("id", { length: 30 }).notNull().$defaultFn(() => createId()),
302
+ const schema_test = pgSchema("test");
303
+
304
+ export const events_test = schema_test.table("events", {
305
+ id: varchar("id", { length: 128 }).notNull().unique().$defaultFn(() => createId()),
273
306
  createdAt: timestamp("createdAt").notNull().$defaultFn(() => new Date()),
274
307
  _internalId: bigserial("_internalId", { mode: "number" }).primaryKey().notNull(),
275
308
  _version: integer("_version").notNull().default(0)
@@ -284,7 +317,7 @@ describe("generateSchema", () => {
284
317
  });
285
318
 
286
319
  it("should handle database-level default values", () => {
287
- const timestampSchema = schema((s) => {
320
+ const timestampSchema = schema("timestamp", (s) => {
288
321
  return s.addTable("events", (t) => {
289
322
  return t.addColumn("id", idColumn()).addColumn(
290
323
  "createdAt",
@@ -293,20 +326,22 @@ describe("generateSchema", () => {
293
326
  });
294
327
  });
295
328
 
296
- const generated = generateSchema(
329
+ const generated = generateDrizzleSchema(
297
330
  [{ namespace: "test", schema: timestampSchema }],
298
331
  "postgresql",
299
332
  );
300
333
  expect(generated).toMatchInlineSnapshot(`
301
- "import { pgTable, varchar, timestamp, bigserial, integer } from "drizzle-orm/pg-core"
334
+ "import { pgSchema, varchar, timestamp, bigserial, integer } from "drizzle-orm/pg-core"
302
335
  import { createId } from "@fragno-dev/db/id"
303
336
 
304
337
  // ============================================================================
305
338
  // Fragment: test
306
339
  // ============================================================================
307
340
 
308
- export const events_test = pgTable("events_test", {
309
- id: varchar("id", { length: 30 }).notNull().$defaultFn(() => createId()),
341
+ const schema_test = pgSchema("test");
342
+
343
+ export const events_test = schema_test.table("events", {
344
+ id: varchar("id", { length: 128 }).notNull().unique().$defaultFn(() => createId()),
310
345
  createdAt: timestamp("createdAt").notNull().defaultNow(),
311
346
  _internalId: bigserial("_internalId", { mode: "number" }).primaryKey().notNull(),
312
347
  _version: integer("_version").notNull().default(0)
@@ -323,15 +358,18 @@ describe("generateSchema", () => {
323
358
 
324
359
  describe("binary columns", () => {
325
360
  it("should generate custom type for binary columns", () => {
326
- const binarySchema = schema((s) => {
361
+ const binarySchema = schema("binary", (s) => {
327
362
  return s.addTable("files", (t) => {
328
363
  return t.addColumn("id", idColumn()).addColumn("data", column("binary"));
329
364
  });
330
365
  });
331
366
 
332
- const generated = generateSchema([{ namespace: "test", schema: binarySchema }], "postgresql");
367
+ const generated = generateDrizzleSchema(
368
+ [{ namespace: "test", schema: binarySchema }],
369
+ "postgresql",
370
+ );
333
371
  expect(generated).toMatchInlineSnapshot(`
334
- "import { pgTable, varchar, customType, bigserial, integer } from "drizzle-orm/pg-core"
372
+ "import { pgSchema, varchar, customType, bigserial, integer } from "drizzle-orm/pg-core"
335
373
  import { createId } from "@fragno-dev/db/id"
336
374
  const customBinary = customType<
337
375
  {
@@ -354,8 +392,10 @@ describe("generateSchema", () => {
354
392
  // Fragment: test
355
393
  // ============================================================================
356
394
 
357
- export const files_test = pgTable("files_test", {
358
- id: varchar("id", { length: 30 }).notNull().$defaultFn(() => createId()),
395
+ const schema_test = pgSchema("test");
396
+
397
+ export const files_test = schema_test.table("files", {
398
+ id: varchar("id", { length: 128 }).notNull().unique().$defaultFn(() => createId()),
359
399
  data: customBinary("data").notNull(),
360
400
  _internalId: bigserial("_internalId", { mode: "number" }).primaryKey().notNull(),
361
401
  _version: integer("_version").notNull().default(0)
@@ -371,7 +411,7 @@ describe("generateSchema", () => {
371
411
  });
372
412
 
373
413
  describe("many relations", () => {
374
- const oneToManySchema = schema((s) => {
414
+ const oneToManySchema = schema("onetomany", (s) => {
375
415
  return s
376
416
  .addTable("users", (t) => {
377
417
  return t.addColumn("id", idColumn()).addColumn("name", column("string"));
@@ -396,12 +436,12 @@ describe("generateSchema", () => {
396
436
  });
397
437
 
398
438
  it("should generate PostgreSQL schema with many relations", () => {
399
- const generated = generateSchema(
439
+ const generated = generateDrizzleSchema(
400
440
  [{ namespace: "test", schema: oneToManySchema }],
401
441
  "postgresql",
402
442
  );
403
443
  expect(generated).toMatchInlineSnapshot(`
404
- "import { pgTable, varchar, text, bigserial, integer, bigint, foreignKey, index } from "drizzle-orm/pg-core"
444
+ "import { pgSchema, varchar, text, bigserial, integer, bigint, foreignKey, index } from "drizzle-orm/pg-core"
405
445
  import { createId } from "@fragno-dev/db/id"
406
446
  import { relations } from "drizzle-orm"
407
447
 
@@ -409,15 +449,17 @@ describe("generateSchema", () => {
409
449
  // Fragment: test
410
450
  // ============================================================================
411
451
 
412
- export const users_test = pgTable("users_test", {
413
- id: varchar("id", { length: 30 }).notNull().$defaultFn(() => createId()),
452
+ const schema_test = pgSchema("test");
453
+
454
+ export const users_test = schema_test.table("users", {
455
+ id: varchar("id", { length: 128 }).notNull().unique().$defaultFn(() => createId()),
414
456
  name: text("name").notNull(),
415
457
  _internalId: bigserial("_internalId", { mode: "number" }).primaryKey().notNull(),
416
458
  _version: integer("_version").notNull().default(0)
417
459
  })
418
460
 
419
- export const posts_test = pgTable("posts_test", {
420
- id: varchar("id", { length: 30 }).notNull().$defaultFn(() => createId()),
461
+ export const posts_test = schema_test.table("posts", {
462
+ id: varchar("id", { length: 128 }).notNull().unique().$defaultFn(() => createId()),
421
463
  title: text("title").notNull(),
422
464
  userId: bigint("userId", { mode: "number" }).notNull(),
423
465
  _internalId: bigserial("_internalId", { mode: "number" }).primaryKey().notNull(),
@@ -426,9 +468,9 @@ describe("generateSchema", () => {
426
468
  foreignKey({
427
469
  columns: [table.userId],
428
470
  foreignColumns: [users_test._internalId],
429
- name: "fk_posts_users_author_test"
471
+ name: "fk_posts_users_author"
430
472
  }),
431
- index("idx_user_test").on(table.userId)
473
+ index("idx_user").on(table.userId)
432
474
  ])
433
475
 
434
476
  export const users_testRelations = relations(users_test, ({ many }) => ({
@@ -463,7 +505,10 @@ describe("generateSchema", () => {
463
505
  });
464
506
 
465
507
  it("should generate MySQL schema with many relations", () => {
466
- const generated = generateSchema([{ namespace: "test", schema: oneToManySchema }], "mysql");
508
+ const generated = generateDrizzleSchema(
509
+ [{ namespace: "test", schema: oneToManySchema }],
510
+ "mysql",
511
+ );
467
512
  expect(generated).toMatchInlineSnapshot(`
468
513
  "import { mysqlTable, varchar, text, bigint, int, foreignKey, index } from "drizzle-orm/mysql-core"
469
514
  import { createId } from "@fragno-dev/db/id"
@@ -474,14 +519,14 @@ describe("generateSchema", () => {
474
519
  // ============================================================================
475
520
 
476
521
  export const users_test = mysqlTable("users_test", {
477
- id: varchar("id", { length: 30 }).notNull().$defaultFn(() => createId()),
522
+ id: varchar("id", { length: 128 }).notNull().unique().$defaultFn(() => createId()),
478
523
  name: text("name").notNull(),
479
524
  _internalId: bigint("_internalId", { mode: "number" }).primaryKey().autoincrement().notNull(),
480
525
  _version: int("_version").notNull().default(0)
481
526
  })
482
527
 
483
528
  export const posts_test = mysqlTable("posts_test", {
484
- id: varchar("id", { length: 30 }).notNull().$defaultFn(() => createId()),
529
+ id: varchar("id", { length: 128 }).notNull().unique().$defaultFn(() => createId()),
485
530
  title: text("title").notNull(),
486
531
  userId: bigint("userId", { mode: "number" }).notNull(),
487
532
  _internalId: bigint("_internalId", { mode: "number" }).primaryKey().autoincrement().notNull(),
@@ -490,9 +535,9 @@ describe("generateSchema", () => {
490
535
  foreignKey({
491
536
  columns: [table.userId],
492
537
  foreignColumns: [users_test._internalId],
493
- name: "fk_posts_users_author_test"
538
+ name: "fk_posts_users_author_test_8d48035c"
494
539
  }),
495
- index("idx_user_test").on(table.userId)
540
+ index("idx_posts_idx_user_test_4a5c5c19").on(table.userId)
496
541
  ])
497
542
 
498
543
  export const users_testRelations = relations(users_test, ({ many }) => ({
@@ -527,9 +572,12 @@ describe("generateSchema", () => {
527
572
  });
528
573
 
529
574
  it("should generate SQLite schema with many relations", () => {
530
- const generated = generateSchema([{ namespace: "test", schema: oneToManySchema }], "sqlite");
575
+ const generated = generateDrizzleSchema(
576
+ [{ namespace: "test", schema: oneToManySchema }],
577
+ "sqlite",
578
+ );
531
579
  expect(generated).toMatchInlineSnapshot(`
532
- "import { sqliteTable, text, integer, foreignKey, index } from "drizzle-orm/sqlite-core"
580
+ "import { sqliteTable, text, integer, uniqueIndex, foreignKey, index } from "drizzle-orm/sqlite-core"
533
581
  import { createId } from "@fragno-dev/db/id"
534
582
  import { relations } from "drizzle-orm"
535
583
 
@@ -538,14 +586,16 @@ describe("generateSchema", () => {
538
586
  // ============================================================================
539
587
 
540
588
  export const users_test = sqliteTable("users_test", {
541
- id: text("id").notNull().$defaultFn(() => createId()),
589
+ id: text("id").notNull().unique().$defaultFn(() => createId()),
542
590
  name: text("name").notNull(),
543
591
  _internalId: integer("_internalId").primaryKey({ autoIncrement: true }).notNull(),
544
592
  _version: integer("_version").notNull().default(0)
545
- })
593
+ }, (table) => [
594
+ uniqueIndex("uidx_users_idx_users_external_id_test_8eaf053f").on(table.id)
595
+ ])
546
596
 
547
597
  export const posts_test = sqliteTable("posts_test", {
548
- id: text("id").notNull().$defaultFn(() => createId()),
598
+ id: text("id").notNull().unique().$defaultFn(() => createId()),
549
599
  title: text("title").notNull(),
550
600
  userId: integer("userId").notNull(),
551
601
  _internalId: integer("_internalId").primaryKey({ autoIncrement: true }).notNull(),
@@ -554,9 +604,10 @@ describe("generateSchema", () => {
554
604
  foreignKey({
555
605
  columns: [table.userId],
556
606
  foreignColumns: [users_test._internalId],
557
- name: "fk_posts_users_author_test"
607
+ name: "fk_posts_users_author_test_8d48035c"
558
608
  }),
559
- index("idx_user_test").on(table.userId)
609
+ index("idx_posts_idx_user_test_4a5c5c19").on(table.userId),
610
+ uniqueIndex("uidx_posts_idx_posts_external_id_test_80487638").on(table.id)
560
611
  ])
561
612
 
562
613
  export const users_testRelations = relations(users_test, ({ many }) => ({
@@ -591,7 +642,7 @@ describe("generateSchema", () => {
591
642
  });
592
643
 
593
644
  it("should handle table with only many relations (no foreign keys)", () => {
594
- const manyOnlySchema = schema((s) => {
645
+ const manyOnlySchema = schema("manyonly", (s) => {
595
646
  return s
596
647
  .addTable("categories", (t) => {
597
648
  return t.addColumn("id", idColumn()).addColumn("name", column("string"));
@@ -609,14 +660,14 @@ describe("generateSchema", () => {
609
660
  });
610
661
  });
611
662
 
612
- const generated = generateSchema(
663
+ const generated = generateDrizzleSchema(
613
664
  [{ namespace: "test", schema: manyOnlySchema }],
614
665
  "postgresql",
615
666
  );
616
667
 
617
668
  // Categories table should NOT have a constraint callback (no foreign keys, no indexes)
618
669
  const categoriesTableMatch = generated.match(
619
- /export const categories_test = pgTable\("categories_test", \{[^}]+\}\)/,
670
+ /export const categories_test = schema_test\.table\("categories", \{[^}]+\}\)/,
620
671
  );
621
672
  expect(categoriesTableMatch).toBeTruthy();
622
673
 
@@ -629,7 +680,7 @@ describe("generateSchema", () => {
629
680
  // Should have schema export
630
681
  expect(generated).toContain("export const test_schema = {");
631
682
  expect(generated).toMatchInlineSnapshot(`
632
- "import { pgTable, varchar, text, bigserial, integer, bigint } from "drizzle-orm/pg-core"
683
+ "import { pgSchema, varchar, text, bigserial, integer, bigint } from "drizzle-orm/pg-core"
633
684
  import { createId } from "@fragno-dev/db/id"
634
685
  import { relations } from "drizzle-orm"
635
686
 
@@ -637,15 +688,17 @@ describe("generateSchema", () => {
637
688
  // Fragment: test
638
689
  // ============================================================================
639
690
 
640
- export const categories_test = pgTable("categories_test", {
641
- id: varchar("id", { length: 30 }).notNull().$defaultFn(() => createId()),
691
+ const schema_test = pgSchema("test");
692
+
693
+ export const categories_test = schema_test.table("categories", {
694
+ id: varchar("id", { length: 128 }).notNull().unique().$defaultFn(() => createId()),
642
695
  name: text("name").notNull(),
643
696
  _internalId: bigserial("_internalId", { mode: "number" }).primaryKey().notNull(),
644
697
  _version: integer("_version").notNull().default(0)
645
698
  })
646
699
 
647
- export const products_test = pgTable("products_test", {
648
- id: varchar("id", { length: 30 }).notNull().$defaultFn(() => createId()),
700
+ export const products_test = schema_test.table("products", {
701
+ id: varchar("id", { length: 128 }).notNull().unique().$defaultFn(() => createId()),
649
702
  name: text("name").notNull(),
650
703
  categoryId: bigint("categoryId", { mode: "number" }).notNull(),
651
704
  _internalId: bigserial("_internalId", { mode: "number" }).primaryKey().notNull(),
@@ -671,7 +724,7 @@ describe("generateSchema", () => {
671
724
  });
672
725
 
673
726
  it("should handle self-referencing many relations", () => {
674
- const selfManySchema = schema((s) => {
727
+ const selfManySchema = schema("selfmany", (s) => {
675
728
  return s
676
729
  .addTable("category", (t) => {
677
730
  return t
@@ -691,7 +744,7 @@ describe("generateSchema", () => {
691
744
  });
692
745
  });
693
746
 
694
- const generated = generateSchema(
747
+ const generated = generateDrizzleSchema(
695
748
  [{ namespace: "test", schema: selfManySchema }],
696
749
  "postgresql",
697
750
  );
@@ -705,7 +758,7 @@ describe("generateSchema", () => {
705
758
  expect(fkMatches).toHaveLength(1);
706
759
 
707
760
  expect(generated).toMatchInlineSnapshot(`
708
- "import { pgTable, varchar, text, bigint, bigserial, integer, foreignKey } from "drizzle-orm/pg-core"
761
+ "import { pgSchema, varchar, text, bigint, bigserial, integer, foreignKey } from "drizzle-orm/pg-core"
709
762
  import { createId } from "@fragno-dev/db/id"
710
763
  import { relations } from "drizzle-orm"
711
764
 
@@ -713,8 +766,10 @@ describe("generateSchema", () => {
713
766
  // Fragment: test
714
767
  // ============================================================================
715
768
 
716
- export const category_test = pgTable("category_test", {
717
- id: varchar("id", { length: 30 }).notNull().$defaultFn(() => createId()),
769
+ const schema_test = pgSchema("test");
770
+
771
+ export const category_test = schema_test.table("category", {
772
+ id: varchar("id", { length: 128 }).notNull().unique().$defaultFn(() => createId()),
718
773
  name: text("name").notNull(),
719
774
  parentId: bigint("parentId", { mode: "number" }),
720
775
  _internalId: bigserial("_internalId", { mode: "number" }).primaryKey().notNull(),
@@ -723,7 +778,7 @@ describe("generateSchema", () => {
723
778
  foreignKey({
724
779
  columns: [table.parentId],
725
780
  foreignColumns: [table._internalId],
726
- name: "fk_category_category_parent_test"
781
+ name: "fk_category_category_parent"
727
782
  })
728
783
  ])
729
784
 
@@ -752,8 +807,40 @@ describe("generateSchema", () => {
752
807
  });
753
808
  });
754
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
+
755
842
  describe("self-referencing foreign keys", () => {
756
- const selfRefSchema = schema((s) => {
843
+ const selfRefSchema = schema("selfref", (s) => {
757
844
  return s
758
845
  .addTable("comment", (t) => {
759
846
  return t
@@ -770,12 +857,12 @@ describe("generateSchema", () => {
770
857
  });
771
858
 
772
859
  it("should generate PostgreSQL self-referencing foreign key using table parameter", () => {
773
- const generated = generateSchema(
860
+ const generated = generateDrizzleSchema(
774
861
  [{ namespace: "test", schema: selfRefSchema }],
775
862
  "postgresql",
776
863
  );
777
864
  expect(generated).toMatchInlineSnapshot(`
778
- "import { pgTable, varchar, text, bigint, bigserial, integer, foreignKey, index } from "drizzle-orm/pg-core"
865
+ "import { pgSchema, varchar, text, bigint, bigserial, integer, foreignKey, index } from "drizzle-orm/pg-core"
779
866
  import { createId } from "@fragno-dev/db/id"
780
867
  import { relations } from "drizzle-orm"
781
868
 
@@ -783,8 +870,10 @@ describe("generateSchema", () => {
783
870
  // Fragment: test
784
871
  // ============================================================================
785
872
 
786
- export const comment_test = pgTable("comment_test", {
787
- id: varchar("id", { length: 30 }).notNull().$defaultFn(() => createId()),
873
+ const schema_test = pgSchema("test");
874
+
875
+ export const comment_test = schema_test.table("comment", {
876
+ id: varchar("id", { length: 128 }).notNull().unique().$defaultFn(() => createId()),
788
877
  content: text("content").notNull(),
789
878
  parentId: bigint("parentId", { mode: "number" }),
790
879
  _internalId: bigserial("_internalId", { mode: "number" }).primaryKey().notNull(),
@@ -793,9 +882,9 @@ describe("generateSchema", () => {
793
882
  foreignKey({
794
883
  columns: [table.parentId],
795
884
  foreignColumns: [table._internalId],
796
- name: "fk_comment_comment_parent_test"
885
+ name: "fk_comment_comment_parent"
797
886
  }),
798
- index("idx_parent_test").on(table.parentId)
887
+ index("idx_parent").on(table.parentId)
799
888
  ])
800
889
 
801
890
  export const comment_testRelations = relations(comment_test, ({ one, many }) => ({
@@ -820,7 +909,10 @@ describe("generateSchema", () => {
820
909
  });
821
910
 
822
911
  it("should generate MySQL self-referencing foreign key using table parameter", () => {
823
- const generated = generateSchema([{ namespace: "test", schema: selfRefSchema }], "mysql");
912
+ const generated = generateDrizzleSchema(
913
+ [{ namespace: "test", schema: selfRefSchema }],
914
+ "mysql",
915
+ );
824
916
  expect(generated).toMatchInlineSnapshot(`
825
917
  "import { mysqlTable, varchar, text, bigint, int, foreignKey, index } from "drizzle-orm/mysql-core"
826
918
  import { createId } from "@fragno-dev/db/id"
@@ -831,7 +923,7 @@ describe("generateSchema", () => {
831
923
  // ============================================================================
832
924
 
833
925
  export const comment_test = mysqlTable("comment_test", {
834
- id: varchar("id", { length: 30 }).notNull().$defaultFn(() => createId()),
926
+ id: varchar("id", { length: 128 }).notNull().unique().$defaultFn(() => createId()),
835
927
  content: text("content").notNull(),
836
928
  parentId: bigint("parentId", { mode: "number" }),
837
929
  _internalId: bigint("_internalId", { mode: "number" }).primaryKey().autoincrement().notNull(),
@@ -840,9 +932,9 @@ describe("generateSchema", () => {
840
932
  foreignKey({
841
933
  columns: [table.parentId],
842
934
  foreignColumns: [table._internalId],
843
- name: "fk_comment_comment_parent_test"
935
+ name: "fk_comment_comment_parent_test_af0d05a4"
844
936
  }),
845
- index("idx_parent_test").on(table.parentId)
937
+ index("idx_comment_idx_parent_test_3c264dbc").on(table.parentId)
846
938
  ])
847
939
 
848
940
  export const comment_testRelations = relations(comment_test, ({ one, many }) => ({
@@ -867,9 +959,12 @@ describe("generateSchema", () => {
867
959
  });
868
960
 
869
961
  it("should generate SQLite self-referencing foreign key using table parameter", () => {
870
- const generated = generateSchema([{ namespace: "test", schema: selfRefSchema }], "sqlite");
962
+ const generated = generateDrizzleSchema(
963
+ [{ namespace: "test", schema: selfRefSchema }],
964
+ "sqlite",
965
+ );
871
966
  expect(generated).toMatchInlineSnapshot(`
872
- "import { sqliteTable, text, integer, foreignKey, index } from "drizzle-orm/sqlite-core"
967
+ "import { sqliteTable, text, integer, foreignKey, index, uniqueIndex } from "drizzle-orm/sqlite-core"
873
968
  import { createId } from "@fragno-dev/db/id"
874
969
  import { relations } from "drizzle-orm"
875
970
 
@@ -878,7 +973,7 @@ describe("generateSchema", () => {
878
973
  // ============================================================================
879
974
 
880
975
  export const comment_test = sqliteTable("comment_test", {
881
- id: text("id").notNull().$defaultFn(() => createId()),
976
+ id: text("id").notNull().unique().$defaultFn(() => createId()),
882
977
  content: text("content").notNull(),
883
978
  parentId: integer("parentId"),
884
979
  _internalId: integer("_internalId").primaryKey({ autoIncrement: true }).notNull(),
@@ -887,9 +982,10 @@ describe("generateSchema", () => {
887
982
  foreignKey({
888
983
  columns: [table.parentId],
889
984
  foreignColumns: [table._internalId],
890
- name: "fk_comment_comment_parent_test"
985
+ name: "fk_comment_comment_parent_test_af0d05a4"
891
986
  }),
892
- index("idx_parent_test").on(table.parentId)
987
+ index("idx_comment_idx_parent_test_3c264dbc").on(table.parentId),
988
+ uniqueIndex("uidx_comment_idx_comment_external_id_test_6a1c2b8f").on(table.id)
893
989
  ])
894
990
 
895
991
  export const comment_testRelations = relations(comment_test, ({ one, many }) => ({
@@ -915,8 +1011,8 @@ describe("generateSchema", () => {
915
1011
  });
916
1012
 
917
1013
  describe("namespace sanitization", () => {
918
- it("should sanitize namespace with hyphens for Drizzle compatibility", () => {
919
- const generated = generateSchema(
1014
+ it("should sanitize exports while preserving physical table names", () => {
1015
+ const generated = generateDrizzleSchema(
920
1016
  [{ namespace: "auth-db", schema: testSchema }],
921
1017
  "postgresql",
922
1018
  );
@@ -925,12 +1021,13 @@ describe("generateSchema", () => {
925
1021
  expect(generated).toContain("export const users_auth_db =");
926
1022
  expect(generated).toContain("export const posts_auth_db =");
927
1023
 
928
- // Physical table names must also be sanitized for Drizzle's relational query system
929
- expect(generated).toContain('pgTable("users_auth_db"');
930
- expect(generated).toContain('pgTable("posts_auth_db"');
1024
+ // Physical table names use logical names with schema scoping
1025
+ expect(generated).toContain('const schema_auth_db = pgSchema("auth-db");');
1026
+ expect(generated).toContain('schema_auth_db.table("users"');
1027
+ expect(generated).toContain('schema_auth_db.table("posts"');
931
1028
 
932
- // Foreign key name should use sanitized namespace
933
- expect(generated).toContain('name: "fk_posts_users_author_auth_db"');
1029
+ // Foreign key name should use the original namespace with hashed naming
1030
+ expect(generated).toMatch(/name: "fk_posts_users_author"/);
934
1031
 
935
1032
  // Relations should reference sanitized table names
936
1033
  expect(generated).toContain("foreignColumns: [users_auth_db._internalId]");
@@ -950,7 +1047,10 @@ describe("generateSchema", () => {
950
1047
  });
951
1048
 
952
1049
  it("should generate inverse relations for namespaced tables", () => {
953
- const generated = generateSchema([{ namespace: "my-app", schema: testSchema }], "postgresql");
1050
+ const generated = generateDrizzleSchema(
1051
+ [{ namespace: "my-app", schema: testSchema }],
1052
+ "postgresql",
1053
+ );
954
1054
 
955
1055
  // User should have inverse "many" relation to posts
956
1056
  expect(generated).toMatch(
@@ -963,8 +1063,8 @@ describe("generateSchema", () => {
963
1063
  expect(generated).toContain("posts_my_appRelations: posts_my_appRelations");
964
1064
  });
965
1065
 
966
- it("should sanitize namespace with special characters in foreign key references", () => {
967
- const generated = generateSchema(
1066
+ it("should sanitize exports with special characters in foreign key references", () => {
1067
+ const generated = generateDrizzleSchema(
968
1068
  [{ namespace: "my-fragment-v2", schema: testSchema }],
969
1069
  "postgresql",
970
1070
  );
@@ -981,12 +1081,13 @@ describe("generateSchema", () => {
981
1081
  expect(generated).toContain("fields: [posts_my_fragment_v2.userId]");
982
1082
  expect(generated).toContain("references: [users_my_fragment_v2._internalId]");
983
1083
 
984
- // Physical table names must also be sanitized for Drizzle's relational query system
985
- expect(generated).toContain('pgTable("users_my_fragment_v2"');
986
- expect(generated).toContain('pgTable("posts_my_fragment_v2"');
1084
+ // Physical table names use logical names with schema scoping
1085
+ expect(generated).toContain('const schema_my_fragment_v2 = pgSchema("my-fragment-v2");');
1086
+ expect(generated).toContain('schema_my_fragment_v2.table("users"');
1087
+ expect(generated).toContain('schema_my_fragment_v2.table("posts"');
987
1088
 
988
1089
  expect(generated).toMatchInlineSnapshot(`
989
- "import { pgTable, varchar, text, integer, bigserial, uniqueIndex, index, bigint, foreignKey } from "drizzle-orm/pg-core"
1090
+ "import { pgSchema, varchar, text, integer, bigserial, uniqueIndex, index, bigint, foreignKey } from "drizzle-orm/pg-core"
990
1091
  import { createId } from "@fragno-dev/db/id"
991
1092
  import { relations } from "drizzle-orm"
992
1093
 
@@ -994,20 +1095,22 @@ describe("generateSchema", () => {
994
1095
  // Fragment: my-fragment-v2
995
1096
  // ============================================================================
996
1097
 
997
- export const users_my_fragment_v2 = pgTable("users_my_fragment_v2", {
998
- id: varchar("id", { length: 30 }).notNull().$defaultFn(() => createId()),
1098
+ const schema_my_fragment_v2 = pgSchema("my-fragment-v2");
1099
+
1100
+ export const users_my_fragment_v2 = schema_my_fragment_v2.table("users", {
1101
+ id: varchar("id", { length: 128 }).notNull().unique().$defaultFn(() => createId()),
999
1102
  name: text("name").notNull(),
1000
1103
  email: text("email").notNull(),
1001
1104
  age: integer("age"),
1002
1105
  _internalId: bigserial("_internalId", { mode: "number" }).primaryKey().notNull(),
1003
1106
  _version: integer("_version").notNull().default(0)
1004
1107
  }, (table) => [
1005
- uniqueIndex("idx_email_my-fragment-v2").on(table.email),
1006
- index("idx_name_my-fragment-v2").on(table.name)
1108
+ uniqueIndex("idx_email").on(table.email),
1109
+ index("idx_name").on(table.name)
1007
1110
  ])
1008
1111
 
1009
- export const posts_my_fragment_v2 = pgTable("posts_my_fragment_v2", {
1010
- id: varchar("id", { length: 30 }).notNull().$defaultFn(() => createId()),
1112
+ export const posts_my_fragment_v2 = schema_my_fragment_v2.table("posts", {
1113
+ id: varchar("id", { length: 128 }).notNull().unique().$defaultFn(() => createId()),
1011
1114
  title: text("title").notNull(),
1012
1115
  content: text("content").notNull(),
1013
1116
  userId: bigint("userId", { mode: "number" }).notNull(),
@@ -1018,10 +1121,10 @@ describe("generateSchema", () => {
1018
1121
  foreignKey({
1019
1122
  columns: [table.userId],
1020
1123
  foreignColumns: [users_my_fragment_v2._internalId],
1021
- name: "fk_posts_users_author_my_fragment_v2"
1124
+ name: "fk_posts_users_author"
1022
1125
  }),
1023
- index("idx_user_my-fragment-v2").on(table.userId),
1024
- index("idx_title_my-fragment-v2").on(table.title)
1126
+ index("idx_user").on(table.userId),
1127
+ index("idx_title").on(table.title)
1025
1128
  ])
1026
1129
 
1027
1130
  export const users_my_fragment_v2Relations = relations(users_my_fragment_v2, ({ many }) => ({
@@ -1056,23 +1159,23 @@ describe("generateSchema", () => {
1056
1159
  describe("schema generation", () => {
1057
1160
  it("should generate settings schema and multiple user fragments", () => {
1058
1161
  // settingsSchema is imported at the top to simulate what happens with linked internal fragments
1059
- const fragment1Schema = schema((s) => {
1162
+ const fragment1Schema = schema("fragment1", (s) => {
1060
1163
  return s.addTable("users", (t) => {
1061
1164
  return t.addColumn("id", idColumn()).addColumn("name", column("string"));
1062
1165
  });
1063
1166
  });
1064
1167
 
1065
- const fragment2Schema = schema((s) => {
1168
+ const fragment2Schema = schema("fragment2", (s) => {
1066
1169
  return s.addTable("posts", (t) => {
1067
1170
  return t.addColumn("id", idColumn()).addColumn("title", column("string"));
1068
1171
  });
1069
1172
  });
1070
1173
 
1071
- // De-duplication happens in generation-engine.ts before calling generateSchema
1072
- // This test verifies generateSchema works correctly with already-deduplicated inputs
1073
- const generated = generateSchema(
1174
+ // De-duplication happens in generation-engine.ts before calling generateDrizzleSchema
1175
+ // This test verifies generateDrizzleSchema works correctly with already-deduplicated inputs
1176
+ const generated = generateDrizzleSchema(
1074
1177
  [
1075
- { namespace: "", schema: internalSchema }, // Internal fragment (namespace: "")
1178
+ { namespace: null, schema: internalSchema }, // Internal fragment (namespace: null)
1076
1179
  { namespace: "fragment1", schema: fragment1Schema },
1077
1180
  { namespace: "fragment2", schema: fragment2Schema },
1078
1181
  ],
@@ -1104,14 +1207,14 @@ describe("generateSchema", () => {
1104
1207
 
1105
1208
  it("should generate schema for single fragment with custom namespace", () => {
1106
1209
  // Test a simple single-schema generation
1107
- const sharedSchema = schema((s) => {
1210
+ const sharedSchema = schema("shared", (s) => {
1108
1211
  return s.addTable("shared_table", (t) => {
1109
1212
  return t.addColumn("id", idColumn()).addColumn("data", column("string"));
1110
1213
  });
1111
1214
  });
1112
1215
 
1113
1216
  // De-duplication happens in generation-engine.ts, so we pass pre-deduplicated input
1114
- const generated = generateSchema(
1217
+ const generated = generateDrizzleSchema(
1115
1218
  [{ namespace: "namespace1", schema: sharedSchema }],
1116
1219
  "postgresql",
1117
1220
  );