@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,4 +1,11 @@
1
1
  import { describe, expect, expectTypeOf, it } from "vitest";
2
+
3
+ import type {
4
+ RawColumnValues,
5
+ TableToColumnValues,
6
+ TableToInsertValues,
7
+ TableToUpdateValues,
8
+ } from "../query/simple-query-interface";
2
9
  import {
3
10
  column,
4
11
  FragnoId,
@@ -8,15 +15,10 @@ import {
8
15
  schema,
9
16
  SchemaBuilder,
10
17
  } from "./create";
11
- import type {
12
- RawColumnValues,
13
- TableToColumnValues,
14
- TableToInsertValues,
15
- } from "../query/simple-query-interface";
16
18
 
17
19
  describe("create", () => {
18
20
  it("should create a table with columns using callback pattern", () => {
19
- const userSchema = schema((s) => {
21
+ const userSchema = schema("user", (s) => {
20
22
  return s.addTable("users", (t) => {
21
23
  return t
22
24
  .addColumn("id", idColumn())
@@ -45,7 +47,7 @@ describe("create", () => {
45
47
  });
46
48
 
47
49
  it("should create a schema with multiple tables using callback pattern", () => {
48
- const userSchema = schema((s) => {
50
+ const userSchema = schema("user", (s) => {
49
51
  return s
50
52
  .addTable("users", (t) => {
51
53
  return t.addColumn("id", idColumn()).addColumn("name", column("string"));
@@ -61,12 +63,12 @@ describe("create", () => {
61
63
  expect(userSchema.version).toBe(2); // Two addTable calls
62
64
  expect(userSchema.tables.users).toBeDefined();
63
65
  expect(userSchema.tables.posts).toBeDefined();
64
- expect(userSchema.tables.users.ormName).toBe("users");
65
- expect(userSchema.tables.posts.ormName).toBe("posts");
66
+ expect(userSchema.tables.users.name).toBe("users");
67
+ expect(userSchema.tables.posts.name).toBe("posts");
66
68
  });
67
69
 
68
70
  it("should generate default values for columns", () => {
69
- const testSchema = schema((s) => {
71
+ const testSchema = schema("test", (s) => {
70
72
  return s.addTable("test", (t) => {
71
73
  return t
72
74
  .addColumn("id", idColumn())
@@ -91,7 +93,7 @@ describe("create", () => {
91
93
  });
92
94
 
93
95
  it("should increment schema version on each schema-level operation", () => {
94
- const userSchema = schema((s) => {
96
+ const userSchema = schema("user", (s) => {
95
97
  return s
96
98
  .addTable("users", (t) => {
97
99
  return t
@@ -108,7 +110,7 @@ describe("create", () => {
108
110
  });
109
111
 
110
112
  it("should support unique constraints on tables via unique method", () => {
111
- const userSchema = schema((s) => {
113
+ const userSchema = schema("user", (s) => {
112
114
  return s.addTable("users", (t) => {
113
115
  return t
114
116
  .addColumn("id", idColumn())
@@ -129,7 +131,7 @@ describe("create", () => {
129
131
  });
130
132
 
131
133
  it("should support creating indexes on tables", () => {
132
- const userSchema = schema((s) => {
134
+ const userSchema = schema("user", (s) => {
133
135
  return s.addTable("users", (t) => {
134
136
  return t
135
137
  .addColumn("id", idColumn())
@@ -157,9 +159,54 @@ describe("create", () => {
157
159
  expect(usernameIndex!.unique).toBe(true);
158
160
  });
159
161
 
162
+ it("should throw on duplicate table names", () => {
163
+ expect(() =>
164
+ schema("dup", (s) => {
165
+ return s
166
+ .addTable("users", (t) => {
167
+ return t.addColumn("id", idColumn());
168
+ })
169
+ .addTable("users", (t) => {
170
+ return t.addColumn("id", idColumn());
171
+ });
172
+ }),
173
+ ).toThrow(/Duplicate table name "users"/);
174
+ });
175
+
176
+ it("should throw on duplicate index names across tables", () => {
177
+ expect(() =>
178
+ schema("dup", (s) => {
179
+ return s
180
+ .addTable("users", (t) => {
181
+ return t.addColumn("id", idColumn()).createIndex("idx_shared", ["id"]);
182
+ })
183
+ .addTable("posts", (t) => {
184
+ return t.addColumn("id", idColumn()).createIndex("idx_shared", ["id"]);
185
+ });
186
+ }),
187
+ ).toThrow(/Duplicate index name "idx_shared"/);
188
+ });
189
+
190
+ it("should throw on duplicate index names added via alterTable", () => {
191
+ expect(() =>
192
+ schema("dup", (s) => {
193
+ return s
194
+ .addTable("users", (t) => {
195
+ return t.addColumn("id", idColumn()).createIndex("idx_email", ["id"]);
196
+ })
197
+ .addTable("posts", (t) => {
198
+ return t.addColumn("id", idColumn());
199
+ })
200
+ .alterTable("posts", (t) => {
201
+ return t.createIndex("idx_email", ["id"]);
202
+ });
203
+ }),
204
+ ).toThrow(/Duplicate index name "idx_email"/);
205
+ });
206
+
160
207
  it("should demonstrate manual many-to-many relation setup", () => {
161
208
  // For many-to-many, create a junction table manually
162
- const userSchema = schema((s) => {
209
+ const userSchema = schema("user", (s) => {
163
210
  return s
164
211
  .addTable("users", (t) => {
165
212
  return t.addColumn("id", idColumn()).addColumn("name", column("string"));
@@ -211,7 +258,7 @@ describe("create", () => {
211
258
  });
212
259
 
213
260
  it("should create a foreign key reference using addReference", () => {
214
- const userSchema = schema((s) => {
261
+ const userSchema = schema("user", (s) => {
215
262
  return s
216
263
  .addTable("users", (t) => {
217
264
  return t.addColumn("id", idColumn()).addColumn("name", column("string"));
@@ -251,8 +298,137 @@ describe("create", () => {
251
298
  expect(addReferenceOps[0].config.to).toEqual({ table: "users", column: "_internalId" });
252
299
  });
253
300
 
301
+ it("should coerce external-id target columns to _internalId in addReference operations", () => {
302
+ const catalogSchema = schema("catalog", (s) => {
303
+ return s
304
+ .addTable("products", (t) => {
305
+ return t.addColumn("productId", idColumn()).addColumn("name", column("string"));
306
+ })
307
+ .addTable("orders", (t) => {
308
+ return t.addColumn("id", idColumn()).addColumn("productRef", referenceColumn());
309
+ })
310
+ .addReference("product", {
311
+ type: "one",
312
+ from: { table: "orders", column: "productRef" },
313
+ to: { table: "products", column: "productId" },
314
+ });
315
+ });
316
+
317
+ const addReferenceOps = catalogSchema.operations.filter((op) => op.type === "add-reference");
318
+ expect(addReferenceOps).toHaveLength(1);
319
+ expect(addReferenceOps[0].config.to).toEqual({ table: "products", column: "_internalId" });
320
+ });
321
+
322
+ it("should support join-only references with foreignKey:false", () => {
323
+ const userSchema = schema("user", (s) => {
324
+ return s
325
+ .addTable("users", (t) => {
326
+ return t
327
+ .addColumn("id", idColumn())
328
+ .addColumn("email", column("string"))
329
+ .createIndex("idx_users_email", ["email"]);
330
+ })
331
+ .addTable("invitations", (t) => {
332
+ return t
333
+ .addColumn("id", idColumn())
334
+ .addColumn("email", column("string"))
335
+ .createIndex("idx_inv_email", ["email"]);
336
+ })
337
+ .addReference("invitedUser", {
338
+ type: "one",
339
+ from: { table: "invitations", column: "email" },
340
+ to: { table: "users", column: "email" },
341
+ foreignKey: false,
342
+ });
343
+ });
344
+
345
+ const invitationsTable = userSchema.tables.invitations;
346
+ const invitedRelation = invitationsTable.relations["invitedUser"];
347
+ expect(invitedRelation).toBeDefined();
348
+ expect(invitedRelation.foreignKey).toBe(false);
349
+ expect(invitedRelation.on).toEqual([["email", "email"]]);
350
+
351
+ const addReferenceOps = userSchema.operations.filter((op) => op.type === "add-reference");
352
+ expect(addReferenceOps).toHaveLength(1);
353
+ expect(addReferenceOps[0].config.to).toEqual({ table: "users", column: "email" });
354
+ expect(addReferenceOps[0].config.foreignKey).toBe(false);
355
+ });
356
+
357
+ it("should coerce id to _internalId for join-only references", () => {
358
+ const userSchema = schema("user", (s) => {
359
+ return s
360
+ .addTable("users", (t) => {
361
+ return t.addColumn("id", idColumn()).addColumn("name", column("string"));
362
+ })
363
+ .addTable("sessions", (t) => {
364
+ return t
365
+ .addColumn("id", idColumn())
366
+ .addColumn("userId", referenceColumn())
367
+ .createIndex("idx_sessions_user", ["userId"]);
368
+ })
369
+ .addReference("sessionUser", {
370
+ type: "one",
371
+ from: { table: "sessions", column: "userId" },
372
+ to: { table: "users", column: "id" },
373
+ foreignKey: false,
374
+ });
375
+ });
376
+
377
+ const addReferenceOps = userSchema.operations.filter((op) => op.type === "add-reference");
378
+ expect(addReferenceOps).toHaveLength(1);
379
+ expect(addReferenceOps[0].config.to).toEqual({ table: "users", column: "_internalId" });
380
+ });
381
+
382
+ it("should coerce left-side id to _internalId for join-only references", () => {
383
+ const userSchema = schema("user", (s) => {
384
+ return s
385
+ .addTable("users", (t) => {
386
+ return t.addColumn("id", idColumn()).addColumn("name", column("string"));
387
+ })
388
+ .addTable("memberships", (t) => {
389
+ return t
390
+ .addColumn("id", idColumn())
391
+ .addColumn("userId", referenceColumn())
392
+ .createIndex("idx_memberships_user", ["userId"]);
393
+ })
394
+ .addReference("memberships", {
395
+ type: "many",
396
+ from: { table: "users", column: "id" },
397
+ to: { table: "memberships", column: "userId" },
398
+ foreignKey: false,
399
+ });
400
+ });
401
+
402
+ const addReferenceOps = userSchema.operations.filter((op) => op.type === "add-reference");
403
+ expect(addReferenceOps).toHaveLength(1);
404
+ expect(addReferenceOps[0].config.from).toEqual({ table: "users", column: "_internalId" });
405
+
406
+ const userRelation = userSchema.tables.users.relations["memberships"];
407
+ expect(userRelation.on).toEqual([["_internalId", "userId"]]);
408
+ });
409
+
410
+ it("should require indexes for join-only references", () => {
411
+ expect(() =>
412
+ schema("user", (s) => {
413
+ return s
414
+ .addTable("users", (t) => {
415
+ return t.addColumn("id", idColumn()).addColumn("email", column("string"));
416
+ })
417
+ .addTable("invitations", (t) => {
418
+ return t.addColumn("id", idColumn()).addColumn("email", column("string"));
419
+ })
420
+ .addReference("invitedUser", {
421
+ type: "one",
422
+ from: { table: "invitations", column: "email" },
423
+ to: { table: "users", column: "email" },
424
+ foreignKey: false,
425
+ });
426
+ }),
427
+ ).toThrow(/indexed join columns/);
428
+ });
429
+
254
430
  it("should support multiple references by calling addReference multiple times", () => {
255
- const userSchema = schema((s) => {
431
+ const userSchema = schema("user", (s) => {
256
432
  return s
257
433
  .addTable("users", (t) => {
258
434
  return t.addColumn("id", idColumn()).addColumn("name", column("string"));
@@ -305,7 +481,7 @@ describe("create", () => {
305
481
  });
306
482
 
307
483
  it("should support self-referencing foreign keys", () => {
308
- const userSchema = schema((s) => {
484
+ const userSchema = schema("user", (s) => {
309
485
  return s
310
486
  .addTable("users", (t) => {
311
487
  return t
@@ -340,7 +516,7 @@ describe("create", () => {
340
516
  });
341
517
 
342
518
  it("should allow altering an existing table to add columns", () => {
343
- const userSchema = schema((s) => {
519
+ const userSchema = schema("user", (s) => {
344
520
  return s
345
521
  .addTable("users", (t) => {
346
522
  return t.addColumn("id", idColumn()).addColumn("name", column("string"));
@@ -381,7 +557,7 @@ describe("create", () => {
381
557
  });
382
558
 
383
559
  it("should allow altering an existing table to add indexes", () => {
384
- const userSchema = schema((s) => {
560
+ const userSchema = schema("user", (s) => {
385
561
  return s
386
562
  .addTable("users", (t) => {
387
563
  return t
@@ -406,7 +582,7 @@ describe("create", () => {
406
582
  });
407
583
 
408
584
  it("should allow multiple alterTable calls on the same table", () => {
409
- const userSchema = schema((s) => {
585
+ const userSchema = schema("user", (s) => {
410
586
  return s
411
587
  .addTable("users", (t) => {
412
588
  return t.addColumn("id", idColumn()).addColumn("name", column("string"));
@@ -444,8 +620,36 @@ describe("create", () => {
444
620
  expect(userSchema.version).toBe(3);
445
621
  });
446
622
 
623
+ it("should preserve user-defined columns after alterTable type updates", () => {
624
+ const userSchema = schema("user", (s) => {
625
+ return s
626
+ .addTable("users", (t) => {
627
+ return t
628
+ .addColumn("id", idColumn())
629
+ .addColumn("email", column("string"))
630
+ .addColumn("passwordHash", column("string"));
631
+ })
632
+ .alterTable("users", (t) => {
633
+ expectTypeOf(t.alterColumn).parameter(0).toEqualTypeOf<"email" | "passwordHash">();
634
+ return t.alterColumn("passwordHash").nullable();
635
+ });
636
+ });
637
+
638
+ type UserColumns = typeof userSchema.tables.users.columns;
639
+ type UserColumnKeys = keyof UserColumns;
640
+
641
+ expectTypeOf<UserColumnKeys>().not.toEqualTypeOf<string>();
642
+ expectTypeOf<UserColumnKeys>().toEqualTypeOf<"id" | "email" | "passwordHash">();
643
+
644
+ type UpdateValues = TableToUpdateValues<typeof userSchema.tables.users>;
645
+ expectTypeOf<UpdateValues>().toMatchObjectType<{
646
+ email?: string;
647
+ passwordHash?: string | null;
648
+ }>();
649
+ });
650
+
447
651
  it("should preserve indexes when altering a table", () => {
448
- const userSchema = schema((s) => {
652
+ const userSchema = schema("user", (s) => {
449
653
  return s
450
654
  .addTable("users", (t) => {
451
655
  return t
@@ -476,7 +680,7 @@ describe("create", () => {
476
680
  });
477
681
 
478
682
  it("should not duplicate existing indexes when altering a table", () => {
479
- const userSchema = schema((s) => {
683
+ const userSchema = schema("user", (s) => {
480
684
  return s
481
685
  .addTable("users", (t) => {
482
686
  return t
@@ -514,7 +718,7 @@ describe("create", () => {
514
718
  });
515
719
 
516
720
  it("should only add new indexes when altering a table with additional indexes", () => {
517
- const userSchema = schema((s) => {
721
+ const userSchema = schema("user", (s) => {
518
722
  return s
519
723
  .addTable("users", (t) => {
520
724
  return t
@@ -558,7 +762,7 @@ describe("create", () => {
558
762
  });
559
763
 
560
764
  it("Simple user table types", () => {
561
- const _userSchema = schema((s) => {
765
+ const _userSchema = schema("_user", (s) => {
562
766
  return s.addTable("users", (t) => {
563
767
  return t.addColumn("id", idColumn()).addColumn("name", column("string"));
564
768
  });
@@ -585,7 +789,7 @@ describe("create", () => {
585
789
  });
586
790
 
587
791
  it("Simple user table types after alter table statements", () => {
588
- const _userSchema = schema((s) => {
792
+ const _userSchema = schema("_user", (s) => {
589
793
  return s
590
794
  .addTable("users", (t) => {
591
795
  return t.addColumn("id", idColumn()).addColumn("name", column("string"));
@@ -636,13 +840,13 @@ describe("referenceColumn", () => {
636
840
 
637
841
  describe("SchemaBuilder with existing schema", () => {
638
842
  it("should initialize with an existing schema", () => {
639
- const existingSchema = schema((s) => {
843
+ const existingSchema = schema("existing", (s) => {
640
844
  return s.addTable("users", (t) => {
641
845
  return t.addColumn("id", idColumn()).addColumn("name", column("string"));
642
846
  });
643
847
  });
644
848
 
645
- const extendedSchema = new SchemaBuilder(existingSchema)
849
+ const extendedSchema = new SchemaBuilder(existingSchema.name, existingSchema)
646
850
  .addTable("posts", (t) => {
647
851
  return t.addColumn("id", idColumn()).addColumn("title", column("string"));
648
852
  })
@@ -655,7 +859,7 @@ describe("SchemaBuilder with existing schema", () => {
655
859
  });
656
860
 
657
861
  it("should preserve operations from existing schema", () => {
658
- const existingSchema = schema((s) => {
862
+ const existingSchema = schema("existing", (s) => {
659
863
  return s
660
864
  .addTable("users", (t) => {
661
865
  return t.addColumn("id", idColumn()).addColumn("name", column("string"));
@@ -665,7 +869,7 @@ describe("SchemaBuilder with existing schema", () => {
665
869
  });
666
870
  });
667
871
 
668
- const extendedSchema = new SchemaBuilder(existingSchema)
872
+ const extendedSchema = new SchemaBuilder(existingSchema.name, existingSchema)
669
873
  .addTable("comments", (t) => {
670
874
  return t.addColumn("id", idColumn()).addColumn("text", column("string"));
671
875
  })
@@ -681,19 +885,19 @@ describe("SchemaBuilder with existing schema", () => {
681
885
  });
682
886
 
683
887
  it("should merge multiple schemas using mergeWithExistingSchema", () => {
684
- const schema1 = schema((s) => {
888
+ const schema1 = schema("schema1", (s) => {
685
889
  return s.addTable("users", (t) => {
686
890
  return t.addColumn("id", idColumn()).addColumn("name", column("string"));
687
891
  });
688
892
  });
689
893
 
690
- const schema2 = schema((s) => {
894
+ const schema2 = schema("schema2", (s) => {
691
895
  return s.addTable("posts", (t) => {
692
896
  return t.addColumn("id", idColumn()).addColumn("title", column("string"));
693
897
  });
694
898
  });
695
899
 
696
- const mergedSchema = new SchemaBuilder()
900
+ const mergedSchema = new SchemaBuilder("merged")
697
901
  .mergeWithExistingSchema(schema1)
698
902
  .mergeWithExistingSchema(schema2)
699
903
  .build();
@@ -704,20 +908,62 @@ describe("SchemaBuilder with existing schema", () => {
704
908
  expect(mergedSchema.operations).toHaveLength(2);
705
909
  });
706
910
 
911
+ it("should throw on duplicate table names when merging schemas", () => {
912
+ const schema1 = schema("schema1", (s) => {
913
+ return s.addTable("users", (t) => {
914
+ return t.addColumn("id", idColumn()).addColumn("name", column("string"));
915
+ });
916
+ });
917
+
918
+ const schema2 = schema("schema2", (s) => {
919
+ return s.addTable("users", (t) => {
920
+ return t.addColumn("id", idColumn()).addColumn("title", column("string"));
921
+ });
922
+ });
923
+
924
+ expect(() =>
925
+ new SchemaBuilder("merged").mergeWithExistingSchema(schema1).mergeWithExistingSchema(schema2),
926
+ ).toThrow(/Duplicate table name "users"/);
927
+ });
928
+
929
+ it("should throw on duplicate index names when merging schemas", () => {
930
+ const schema1 = schema("schema1", (s) => {
931
+ return s.addTable("users", (t) => {
932
+ return t
933
+ .addColumn("id", idColumn())
934
+ .addColumn("name", column("string"))
935
+ .createIndex("idx_shared", ["name"]);
936
+ });
937
+ });
938
+
939
+ const schema2 = schema("schema2", (s) => {
940
+ return s.addTable("posts", (t) => {
941
+ return t
942
+ .addColumn("id", idColumn())
943
+ .addColumn("title", column("string"))
944
+ .createIndex("idx_shared", ["title"]);
945
+ });
946
+ });
947
+
948
+ expect(() =>
949
+ new SchemaBuilder("merged").mergeWithExistingSchema(schema1).mergeWithExistingSchema(schema2),
950
+ ).toThrow(/Duplicate index name "idx_shared"/);
951
+ });
952
+
707
953
  it("should extend merged schema with new tables", () => {
708
- const schema1 = schema((s) => {
954
+ const schema1 = schema("schema1", (s) => {
709
955
  return s.addTable("users", (t) => {
710
956
  return t.addColumn("id", idColumn()).addColumn("name", column("string"));
711
957
  });
712
958
  });
713
959
 
714
- const schema2 = schema((s) => {
960
+ const schema2 = schema("schema2", (s) => {
715
961
  return s.addTable("posts", (t) => {
716
962
  return t.addColumn("id", idColumn()).addColumn("title", column("string"));
717
963
  });
718
964
  });
719
965
 
720
- const extended = new SchemaBuilder()
966
+ const extended = new SchemaBuilder("extended")
721
967
  .mergeWithExistingSchema(schema1)
722
968
  .mergeWithExistingSchema(schema2)
723
969
  .addTable("comments", (t) => {
@@ -733,19 +979,19 @@ describe("SchemaBuilder with existing schema", () => {
733
979
  });
734
980
 
735
981
  it("should use mergeWithExistingSchema method to merge schemas", () => {
736
- const schema1 = schema((s) => {
982
+ const schema1 = schema("schema1", (s) => {
737
983
  return s.addTable("users", (t) => {
738
984
  return t.addColumn("id", idColumn()).addColumn("name", column("string"));
739
985
  });
740
986
  });
741
987
 
742
- const schema2 = schema((s) => {
988
+ const schema2 = schema("schema2", (s) => {
743
989
  return s.addTable("posts", (t) => {
744
990
  return t.addColumn("id", idColumn()).addColumn("title", column("string"));
745
991
  });
746
992
  });
747
993
 
748
- const combined = new SchemaBuilder()
994
+ const combined = new SchemaBuilder("combined")
749
995
  .mergeWithExistingSchema(schema1)
750
996
  .mergeWithExistingSchema(schema2)
751
997
  .addTable("comments", (t) => {
@@ -761,13 +1007,13 @@ describe("SchemaBuilder with existing schema", () => {
761
1007
  });
762
1008
 
763
1009
  it("should merge operations from multiple schemas in order", () => {
764
- const schema1 = schema((s) => {
1010
+ const schema1 = schema("schema1", (s) => {
765
1011
  return s.addTable("users", (t) => {
766
1012
  return t.addColumn("id", idColumn()).addColumn("name", column("string"));
767
1013
  });
768
1014
  });
769
1015
 
770
- const schema2 = schema((s) => {
1016
+ const schema2 = schema("schema2", (s) => {
771
1017
  return s
772
1018
  .addTable("posts", (t) => {
773
1019
  return t.addColumn("id", idColumn()).addColumn("title", column("string"));
@@ -777,7 +1023,7 @@ describe("SchemaBuilder with existing schema", () => {
777
1023
  });
778
1024
  });
779
1025
 
780
- const mergedSchema = new SchemaBuilder()
1026
+ const mergedSchema = new SchemaBuilder("merged")
781
1027
  .mergeWithExistingSchema(schema1)
782
1028
  .mergeWithExistingSchema(schema2)
783
1029
  .build();
@@ -790,25 +1036,25 @@ describe("SchemaBuilder with existing schema", () => {
790
1036
  });
791
1037
 
792
1038
  it("should merge three or more schemas", () => {
793
- const schema1 = schema((s) => {
1039
+ const schema1 = schema("schema1", (s) => {
794
1040
  return s.addTable("users", (t) => {
795
1041
  return t.addColumn("id", idColumn()).addColumn("name", column("string"));
796
1042
  });
797
1043
  });
798
1044
 
799
- const schema2 = schema((s) => {
1045
+ const schema2 = schema("schema2", (s) => {
800
1046
  return s.addTable("posts", (t) => {
801
1047
  return t.addColumn("id", idColumn()).addColumn("title", column("string"));
802
1048
  });
803
1049
  });
804
1050
 
805
- const schema3 = schema((s) => {
1051
+ const schema3 = schema("schema3", (s) => {
806
1052
  return s.addTable("comments", (t) => {
807
1053
  return t.addColumn("id", idColumn()).addColumn("text", column("string"));
808
1054
  });
809
1055
  });
810
1056
 
811
- const mergedSchema = new SchemaBuilder()
1057
+ const mergedSchema = new SchemaBuilder("merged")
812
1058
  .mergeWithExistingSchema(schema1)
813
1059
  .mergeWithExistingSchema(schema2)
814
1060
  .mergeWithExistingSchema(schema3)
@@ -822,13 +1068,13 @@ describe("SchemaBuilder with existing schema", () => {
822
1068
  });
823
1069
 
824
1070
  it("should handle single schema merge", () => {
825
- const schema1 = schema((s) => {
1071
+ const schema1 = schema("schema1", (s) => {
826
1072
  return s.addTable("users", (t) => {
827
1073
  return t.addColumn("id", idColumn()).addColumn("name", column("string"));
828
1074
  });
829
1075
  });
830
1076
 
831
- const mergedSchema = new SchemaBuilder().mergeWithExistingSchema(schema1).build();
1077
+ const mergedSchema = new SchemaBuilder("merged").mergeWithExistingSchema(schema1).build();
832
1078
 
833
1079
  expect(mergedSchema.tables.users).toBeDefined();
834
1080
  expect(mergedSchema.version).toBe(1);