@fragno-dev/db 0.3.0 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (516) hide show
  1. package/.turbo/turbo-build.log +327 -160
  2. package/CHANGELOG.md +74 -0
  3. package/README.md +24 -0
  4. package/dist/adapters/adapters.d.ts +1 -1
  5. package/dist/adapters/adapters.d.ts.map +1 -1
  6. package/dist/adapters/adapters.js.map +1 -1
  7. package/dist/adapters/generic-sql/generic-sql-adapter.d.ts +0 -3
  8. package/dist/adapters/generic-sql/generic-sql-adapter.d.ts.map +1 -1
  9. package/dist/adapters/generic-sql/generic-sql-adapter.js +11 -12
  10. package/dist/adapters/generic-sql/generic-sql-adapter.js.map +1 -1
  11. package/dist/adapters/generic-sql/generic-sql-uow-executor.js +46 -6
  12. package/dist/adapters/generic-sql/generic-sql-uow-executor.js.map +1 -1
  13. package/dist/adapters/generic-sql/migration/cold-kysely.js.map +1 -1
  14. package/dist/adapters/generic-sql/migration/dialect/mysql.js +1 -1
  15. package/dist/adapters/generic-sql/migration/dialect/mysql.js.map +1 -1
  16. package/dist/adapters/generic-sql/migration/dialect/postgres.js +1 -1
  17. package/dist/adapters/generic-sql/migration/dialect/postgres.js.map +1 -1
  18. package/dist/adapters/generic-sql/migration/dialect/sqlite.js +185 -19
  19. package/dist/adapters/generic-sql/migration/dialect/sqlite.js.map +1 -1
  20. package/dist/adapters/generic-sql/migration/executor.d.ts.map +1 -1
  21. package/dist/adapters/generic-sql/migration/executor.js +30 -3
  22. package/dist/adapters/generic-sql/migration/executor.js.map +1 -1
  23. package/dist/adapters/generic-sql/migration/prepared-migrations.d.ts.map +1 -1
  24. package/dist/adapters/generic-sql/migration/prepared-migrations.js +3 -3
  25. package/dist/adapters/generic-sql/migration/prepared-migrations.js.map +1 -1
  26. package/dist/adapters/generic-sql/migration/sql-generator.js +1 -1
  27. package/dist/adapters/generic-sql/migration/sql-generator.js.map +1 -1
  28. package/dist/adapters/generic-sql/query/create-sql-query-compiler.js +1 -1
  29. package/dist/adapters/generic-sql/query/create-sql-query-compiler.js.map +1 -1
  30. package/dist/adapters/generic-sql/query/cursor-utils.js.map +1 -1
  31. package/dist/adapters/generic-sql/query/db-now-sql.js +27 -0
  32. package/dist/adapters/generic-sql/query/db-now-sql.js.map +1 -0
  33. package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js +9 -6
  34. package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js.map +1 -1
  35. package/dist/adapters/generic-sql/query/select-builder.js.map +1 -1
  36. package/dist/adapters/generic-sql/query/sql-query-compiler.js +37 -9
  37. package/dist/adapters/generic-sql/query/sql-query-compiler.js.map +1 -1
  38. package/dist/adapters/generic-sql/query/where-builder.js +24 -20
  39. package/dist/adapters/generic-sql/query/where-builder.js.map +1 -1
  40. package/dist/adapters/generic-sql/uow-decoder.js +1 -1
  41. package/dist/adapters/generic-sql/uow-decoder.js.map +1 -1
  42. package/dist/adapters/generic-sql/uow-encoder.js +8 -9
  43. package/dist/adapters/generic-sql/uow-encoder.js.map +1 -1
  44. package/dist/adapters/in-memory/condition-evaluator.js +10 -6
  45. package/dist/adapters/in-memory/condition-evaluator.js.map +1 -1
  46. package/dist/adapters/in-memory/in-memory-adapter.d.ts.map +1 -1
  47. package/dist/adapters/in-memory/in-memory-adapter.js +45 -25
  48. package/dist/adapters/in-memory/in-memory-adapter.js.map +1 -1
  49. package/dist/adapters/in-memory/in-memory-uow.js +236 -13
  50. package/dist/adapters/in-memory/in-memory-uow.js.map +1 -1
  51. package/dist/adapters/in-memory/options.d.ts +2 -0
  52. package/dist/adapters/in-memory/options.d.ts.map +1 -1
  53. package/dist/adapters/in-memory/options.js +3 -2
  54. package/dist/adapters/in-memory/options.js.map +1 -1
  55. package/dist/adapters/in-memory/reference-resolution.js.map +1 -1
  56. package/dist/adapters/in-memory/store.js +1 -1
  57. package/dist/adapters/in-memory/store.js.map +1 -1
  58. package/dist/adapters/shared/from-unit-of-work-compiler.js +51 -24
  59. package/dist/adapters/shared/from-unit-of-work-compiler.js.map +1 -1
  60. package/dist/adapters/shared/uow-operation-compiler.js.map +1 -1
  61. package/dist/browser/adapters/adapters.d.ts +61 -0
  62. package/dist/browser/adapters/adapters.d.ts.map +1 -0
  63. package/dist/browser/adapters/generic-sql/migration/executor.d.ts +15 -0
  64. package/dist/browser/adapters/generic-sql/migration/executor.d.ts.map +1 -0
  65. package/dist/browser/adapters/generic-sql/migration/prepared-migrations.d.ts +66 -0
  66. package/dist/browser/adapters/generic-sql/migration/prepared-migrations.d.ts.map +1 -0
  67. package/dist/browser/adapters/generic-sql/sqlite-storage.d.ts +11 -0
  68. package/dist/browser/adapters/generic-sql/sqlite-storage.d.ts.map +1 -0
  69. package/dist/browser/adapters/in-memory/in-memory-adapter.d.ts +5 -0
  70. package/dist/browser/adapters/in-memory/index.d.ts +2 -0
  71. package/dist/browser/adapters/in-memory/options.d.ts +1 -0
  72. package/dist/browser/db-fragment-definition-builder.d.ts +237 -0
  73. package/dist/browser/db-fragment-definition-builder.d.ts.map +1 -0
  74. package/dist/browser/durable-hooks.d.ts +3 -0
  75. package/dist/browser/fragments/internal-fragment.d.ts +317 -0
  76. package/dist/browser/fragments/internal-fragment.d.ts.map +1 -0
  77. package/dist/browser/fragments/internal-fragment.schema.d.ts +1 -0
  78. package/dist/browser/hooks/durable-hooks-logger.d.ts +10 -0
  79. package/dist/browser/hooks/durable-hooks-logger.d.ts.map +1 -0
  80. package/dist/browser/hooks/hooks.d.ts +146 -0
  81. package/dist/browser/hooks/hooks.d.ts.map +1 -0
  82. package/dist/browser/id.js +1 -0
  83. package/dist/browser/internal/adapter-registry.d.ts +4 -0
  84. package/dist/browser/internal/outbox-state.d.ts +2 -0
  85. package/dist/browser/mod.d.ts +15 -0
  86. package/dist/browser/mod.d.ts.map +1 -0
  87. package/dist/browser/mod.js +17 -0
  88. package/dist/browser/mod.js.map +1 -0
  89. package/dist/browser/mod2.d.ts +48 -0
  90. package/dist/browser/mod2.d.ts.map +1 -0
  91. package/dist/browser/naming/sql-naming.d.ts +19 -0
  92. package/dist/browser/naming/sql-naming.d.ts.map +1 -0
  93. package/dist/browser/outbox/outbox.d.ts +21 -0
  94. package/dist/browser/outbox/outbox.d.ts.map +1 -0
  95. package/dist/browser/query/column-defaults.js +1 -0
  96. package/dist/browser/query/condition-builder.d.ts +44 -0
  97. package/dist/browser/query/condition-builder.d.ts.map +1 -0
  98. package/dist/browser/query/condition-builder.js +97 -0
  99. package/dist/browser/query/condition-builder.js.map +1 -0
  100. package/dist/browser/query/cursor.d.ts +105 -0
  101. package/dist/browser/query/cursor.d.ts.map +1 -0
  102. package/dist/browser/query/cursor.js +150 -0
  103. package/dist/browser/query/cursor.js.map +1 -0
  104. package/dist/browser/query/db-now.d.ts +22 -0
  105. package/dist/browser/query/db-now.d.ts.map +1 -0
  106. package/dist/browser/query/db-now.js +33 -0
  107. package/dist/browser/query/db-now.js.map +1 -0
  108. package/dist/browser/query/orm/orm.d.ts +18 -0
  109. package/dist/browser/query/orm/orm.d.ts.map +1 -0
  110. package/dist/browser/query/simple-query-interface.d.ts +108 -0
  111. package/dist/browser/query/simple-query-interface.d.ts.map +1 -0
  112. package/dist/browser/query/unit-of-work/execute-unit-of-work.d.ts +423 -0
  113. package/dist/browser/query/unit-of-work/execute-unit-of-work.d.ts.map +1 -0
  114. package/dist/browser/query/unit-of-work/execute-unit-of-work.js +507 -0
  115. package/dist/browser/query/unit-of-work/execute-unit-of-work.js.map +1 -0
  116. package/dist/browser/query/unit-of-work/retry-policy.d.ts +23 -0
  117. package/dist/browser/query/unit-of-work/retry-policy.d.ts.map +1 -0
  118. package/dist/browser/query/unit-of-work/retry-policy.js +40 -0
  119. package/dist/browser/query/unit-of-work/retry-policy.js.map +1 -0
  120. package/dist/browser/query/unit-of-work/unit-of-work.d.ts +703 -0
  121. package/dist/browser/query/unit-of-work/unit-of-work.d.ts.map +1 -0
  122. package/dist/browser/query/unit-of-work/unit-of-work.js +1206 -0
  123. package/dist/browser/query/unit-of-work/unit-of-work.js.map +1 -0
  124. package/dist/browser/query/value-encoding.js +38 -0
  125. package/dist/browser/query/value-encoding.js.map +1 -0
  126. package/dist/browser/schema/create.d.ts +326 -0
  127. package/dist/browser/schema/create.d.ts.map +1 -0
  128. package/dist/browser/schema/create.js +89 -0
  129. package/dist/browser/schema/create.js.map +1 -0
  130. package/dist/browser/schema/generate-id.js +28 -0
  131. package/dist/browser/schema/generate-id.js.map +1 -0
  132. package/dist/browser/shared/providers.d.ts +6 -0
  133. package/dist/browser/shared/providers.d.ts.map +1 -0
  134. package/dist/browser/sql-driver/connection/connection-provider.d.ts +13 -0
  135. package/dist/browser/sql-driver/connection/connection-provider.d.ts.map +1 -0
  136. package/dist/browser/sql-driver/dialect-adapter/dialect-adapter.d.ts +7 -0
  137. package/dist/browser/sql-driver/dialect-adapter/dialect-adapter.d.ts.map +1 -0
  138. package/dist/browser/sql-driver/driver/runtime-driver.d.ts +23 -0
  139. package/dist/browser/sql-driver/driver/runtime-driver.d.ts.map +1 -0
  140. package/dist/browser/sql-driver/query-executor/plugin.d.ts +17 -0
  141. package/dist/browser/sql-driver/query-executor/plugin.d.ts.map +1 -0
  142. package/dist/browser/sql-driver/query-executor/query-executor.d.ts +36 -0
  143. package/dist/browser/sql-driver/query-executor/query-executor.d.ts.map +1 -0
  144. package/dist/browser/sql-driver/sql-driver-adapter.d.ts +29 -0
  145. package/dist/browser/sql-driver/sql-driver-adapter.d.ts.map +1 -0
  146. package/dist/browser/sql-driver/sql-driver.d.ts +38 -0
  147. package/dist/browser/sql-driver/sql-driver.d.ts.map +1 -0
  148. package/dist/browser/sync/commands.d.ts +15 -0
  149. package/dist/browser/sync/commands.d.ts.map +1 -0
  150. package/dist/browser/sync/commands.js +27 -0
  151. package/dist/browser/sync/commands.js.map +1 -0
  152. package/dist/browser/sync/types.d.ts +63 -0
  153. package/dist/browser/sync/types.d.ts.map +1 -0
  154. package/dist/browser/util/types.d.ts +8 -0
  155. package/dist/browser/util/types.d.ts.map +1 -0
  156. package/dist/browser/with-database.d.ts +29 -0
  157. package/dist/browser/with-database.d.ts.map +1 -0
  158. package/dist/client.d.ts +4 -0
  159. package/dist/client.js +5 -0
  160. package/dist/db-fragment-definition-builder.d.ts +85 -28
  161. package/dist/db-fragment-definition-builder.d.ts.map +1 -1
  162. package/dist/db-fragment-definition-builder.js +374 -46
  163. package/dist/db-fragment-definition-builder.js.map +1 -1
  164. package/dist/dispatchers/cloudflare-do/dispatcher.d.ts +20 -0
  165. package/dist/dispatchers/cloudflare-do/dispatcher.d.ts.map +1 -0
  166. package/dist/dispatchers/cloudflare-do/dispatcher.js +147 -0
  167. package/dist/dispatchers/cloudflare-do/dispatcher.js.map +1 -0
  168. package/dist/dispatchers/cloudflare-do/index.d.ts +5 -20
  169. package/dist/dispatchers/cloudflare-do/index.d.ts.map +1 -1
  170. package/dist/dispatchers/cloudflare-do/index.js +23 -55
  171. package/dist/dispatchers/cloudflare-do/index.js.map +1 -1
  172. package/dist/dispatchers/node/dispatcher.d.ts +14 -0
  173. package/dist/dispatchers/node/dispatcher.d.ts.map +1 -0
  174. package/dist/dispatchers/node/dispatcher.js +80 -0
  175. package/dist/dispatchers/node/dispatcher.js.map +1 -0
  176. package/dist/dispatchers/node/index.d.ts +5 -10
  177. package/dist/dispatchers/node/index.d.ts.map +1 -1
  178. package/dist/dispatchers/node/index.js +21 -53
  179. package/dist/dispatchers/node/index.js.map +1 -1
  180. package/dist/durable-hooks.d.ts +31 -0
  181. package/dist/durable-hooks.d.ts.map +1 -0
  182. package/dist/durable-hooks.js +23 -0
  183. package/dist/durable-hooks.js.map +1 -0
  184. package/dist/fragments/internal-fragment.d.ts +128 -27
  185. package/dist/fragments/internal-fragment.d.ts.map +1 -1
  186. package/dist/fragments/internal-fragment.js +125 -78
  187. package/dist/fragments/internal-fragment.js.map +1 -1
  188. package/dist/fragments/internal-fragment.routes.js +138 -3
  189. package/dist/fragments/internal-fragment.routes.js.map +1 -1
  190. package/dist/fragments/internal-fragment.schema.d.ts +7 -1
  191. package/dist/fragments/internal-fragment.schema.d.ts.map +1 -1
  192. package/dist/fragments/internal-fragment.schema.js +18 -1
  193. package/dist/fragments/internal-fragment.schema.js.map +1 -1
  194. package/dist/hooks/durable-hooks-logger.d.ts +10 -0
  195. package/dist/hooks/durable-hooks-logger.d.ts.map +1 -0
  196. package/dist/hooks/durable-hooks-logger.js +75 -0
  197. package/dist/hooks/durable-hooks-logger.js.map +1 -0
  198. package/dist/hooks/durable-hooks-processor.d.ts +1 -14
  199. package/dist/hooks/durable-hooks-processor.js +58 -10
  200. package/dist/hooks/durable-hooks-processor.js.map +1 -1
  201. package/dist/hooks/durable-hooks-runtime.js +44 -0
  202. package/dist/hooks/durable-hooks-runtime.js.map +1 -0
  203. package/dist/hooks/hooks.d.ts +60 -2
  204. package/dist/hooks/hooks.d.ts.map +1 -1
  205. package/dist/hooks/hooks.js +214 -53
  206. package/dist/hooks/hooks.js.map +1 -1
  207. package/dist/id.d.ts +2 -2
  208. package/dist/id.js +2 -2
  209. package/dist/internal/adapter-registry.d.ts +11 -0
  210. package/dist/internal/adapter-registry.d.ts.map +1 -0
  211. package/dist/internal/adapter-registry.js +135 -0
  212. package/dist/internal/adapter-registry.js.map +1 -0
  213. package/dist/internal/outbox-state.d.ts +2 -0
  214. package/dist/internal/outbox-state.js +26 -0
  215. package/dist/internal/outbox-state.js.map +1 -0
  216. package/dist/migration-engine/auto-from-schema.d.ts +33 -0
  217. package/dist/migration-engine/auto-from-schema.d.ts.map +1 -0
  218. package/dist/migration-engine/auto-from-schema.js +210 -27
  219. package/dist/migration-engine/auto-from-schema.js.map +1 -1
  220. package/dist/migration-engine/generation-engine.d.ts.map +1 -1
  221. package/dist/migration-engine/generation-engine.js +17 -5
  222. package/dist/migration-engine/generation-engine.js.map +1 -1
  223. package/dist/migration-engine/shared.d.ts +113 -0
  224. package/dist/migration-engine/shared.d.ts.map +1 -0
  225. package/dist/migration-engine/shared.js.map +1 -1
  226. package/dist/mod.d.ts +12 -11
  227. package/dist/mod.d.ts.map +1 -1
  228. package/dist/mod.js +10 -10
  229. package/dist/mod.js.map +1 -1
  230. package/dist/naming/sql-naming.d.ts.map +1 -1
  231. package/dist/naming/sql-naming.js.map +1 -1
  232. package/dist/outbox/outbox-builder.js.map +1 -1
  233. package/dist/outbox/outbox.d.ts +3 -1
  234. package/dist/outbox/outbox.d.ts.map +1 -1
  235. package/dist/outbox/outbox.js.map +1 -1
  236. package/dist/query/column-defaults.js.map +1 -1
  237. package/dist/query/condition-builder.d.ts +7 -1
  238. package/dist/query/condition-builder.d.ts.map +1 -1
  239. package/dist/query/condition-builder.js +5 -1
  240. package/dist/query/condition-builder.js.map +1 -1
  241. package/dist/query/cursor-client.d.ts +105 -0
  242. package/dist/query/cursor-client.d.ts.map +1 -0
  243. package/dist/query/cursor-client.js +165 -0
  244. package/dist/query/cursor-client.js.map +1 -0
  245. package/dist/query/cursor.d.ts.map +1 -1
  246. package/dist/query/cursor.js +7 -1
  247. package/dist/query/cursor.js.map +1 -1
  248. package/dist/query/db-now.d.ts +15 -1
  249. package/dist/query/db-now.d.ts.map +1 -1
  250. package/dist/query/db-now.js +30 -2
  251. package/dist/query/db-now.js.map +1 -1
  252. package/dist/query/orm/orm.js.map +1 -1
  253. package/dist/query/serialize/create-sql-serializer.js +2 -2
  254. package/dist/query/serialize/create-sql-serializer.js.map +1 -1
  255. package/dist/query/serialize/dialect/mysql-serializer.js.map +1 -1
  256. package/dist/query/serialize/dialect/postgres-serializer.js.map +1 -1
  257. package/dist/query/serialize/dialect/sqlite-serializer.js +6 -2
  258. package/dist/query/serialize/dialect/sqlite-serializer.js.map +1 -1
  259. package/dist/query/simple-query-interface.d.ts +7 -3
  260. package/dist/query/simple-query-interface.d.ts.map +1 -1
  261. package/dist/query/unit-of-work/execute-unit-of-work.d.ts +37 -2
  262. package/dist/query/unit-of-work/execute-unit-of-work.d.ts.map +1 -1
  263. package/dist/query/unit-of-work/execute-unit-of-work.js +39 -18
  264. package/dist/query/unit-of-work/execute-unit-of-work.js.map +1 -1
  265. package/dist/query/unit-of-work/unit-of-work.d.ts +42 -16
  266. package/dist/query/unit-of-work/unit-of-work.d.ts.map +1 -1
  267. package/dist/query/unit-of-work/unit-of-work.js +50 -6
  268. package/dist/query/unit-of-work/unit-of-work.js.map +1 -1
  269. package/dist/query/value-decoding.js +8 -1
  270. package/dist/query/value-decoding.js.map +1 -1
  271. package/dist/query/value-encoding.js.map +1 -1
  272. package/dist/schema/create.d.ts +69 -25
  273. package/dist/schema/create.d.ts.map +1 -1
  274. package/dist/schema/create.js +91 -16
  275. package/dist/schema/create.js.map +1 -1
  276. package/dist/schema/type-conversion/create-sql-type-mapper.js +1 -1
  277. package/dist/schema/type-conversion/create-sql-type-mapper.js.map +1 -1
  278. package/dist/schema/type-conversion/dialect/sqlite.js.map +1 -1
  279. package/dist/schema/validator.d.ts.map +1 -1
  280. package/dist/schema/validator.js.map +1 -1
  281. package/dist/schema-output/drizzle.d.ts.map +1 -1
  282. package/dist/schema-output/drizzle.js +8 -6
  283. package/dist/schema-output/drizzle.js.map +1 -1
  284. package/dist/schema-output/prisma.d.ts.map +1 -1
  285. package/dist/schema-output/prisma.js +21 -10
  286. package/dist/schema-output/prisma.js.map +1 -1
  287. package/dist/sql-driver/dialects/durable-object-dialect.js +3 -9
  288. package/dist/sql-driver/dialects/durable-object-dialect.js.map +1 -1
  289. package/dist/sql-driver/query-executor/default-query-executor.js.map +1 -1
  290. package/dist/sql-driver/query-executor/query-executor-base.js.map +1 -1
  291. package/dist/sql-driver/sql-driver-adapter.js.map +1 -1
  292. package/dist/sql-driver/sql.js.map +1 -1
  293. package/dist/sync/commands.d.ts +15 -0
  294. package/dist/sync/commands.d.ts.map +1 -0
  295. package/dist/sync/commands.js +27 -0
  296. package/dist/sync/commands.js.map +1 -0
  297. package/dist/sync/index.d.ts +4 -0
  298. package/dist/sync/index.js +4 -0
  299. package/dist/sync/read-tracking.d.ts +25 -0
  300. package/dist/sync/read-tracking.d.ts.map +1 -0
  301. package/dist/sync/read-tracking.js +148 -0
  302. package/dist/sync/read-tracking.js.map +1 -0
  303. package/dist/sync/submit.js +213 -0
  304. package/dist/sync/submit.js.map +1 -0
  305. package/dist/sync/types.d.ts +63 -0
  306. package/dist/sync/types.d.ts.map +1 -0
  307. package/dist/util/default-database-adapter.js +6 -1
  308. package/dist/util/default-database-adapter.js.map +1 -1
  309. package/dist/with-database.d.ts +3 -6
  310. package/dist/with-database.d.ts.map +1 -1
  311. package/dist/with-database.js +7 -15
  312. package/dist/with-database.js.map +1 -1
  313. package/package.json +33 -41
  314. package/src/adapters/adapters.ts +5 -4
  315. package/src/adapters/drizzle/migrate-drizzle.test.ts +46 -9
  316. package/src/adapters/drizzle/migration-parity-drizzle-kit.test.ts +5 -3
  317. package/src/adapters/drizzle/test-utils.ts +2 -1
  318. package/src/adapters/generic-sql/generic-sql-adapter.test.ts +5 -3
  319. package/src/adapters/generic-sql/generic-sql-adapter.ts +21 -24
  320. package/src/adapters/generic-sql/generic-sql-uow-executor.test.ts +1 -0
  321. package/src/adapters/generic-sql/generic-sql-uow-executor.ts +81 -15
  322. package/src/adapters/generic-sql/migration/adapter-migration-parity.test.ts +4 -2
  323. package/src/adapters/generic-sql/migration/cold-kysely.ts +1 -0
  324. package/src/adapters/generic-sql/migration/dialect/mysql.test.ts +3 -2
  325. package/src/adapters/generic-sql/migration/dialect/mysql.ts +1 -0
  326. package/src/adapters/generic-sql/migration/dialect/postgres.test.ts +5 -4
  327. package/src/adapters/generic-sql/migration/dialect/postgres.ts +2 -1
  328. package/src/adapters/generic-sql/migration/dialect/sqlite.test.ts +795 -3
  329. package/src/adapters/generic-sql/migration/dialect/sqlite.ts +385 -57
  330. package/src/adapters/generic-sql/migration/executor.test.ts +52 -0
  331. package/src/adapters/generic-sql/migration/executor.ts +47 -4
  332. package/src/adapters/generic-sql/migration/prepared-migrations.test.ts +117 -14
  333. package/src/adapters/generic-sql/migration/prepared-migrations.ts +9 -8
  334. package/src/adapters/generic-sql/migration/sql-generator.ts +5 -3
  335. package/src/adapters/generic-sql/query/create-sql-query-compiler.ts +3 -3
  336. package/src/adapters/generic-sql/query/cursor-utils.test.ts +3 -2
  337. package/src/adapters/generic-sql/query/cursor-utils.ts +1 -1
  338. package/src/adapters/generic-sql/query/db-now-sql.ts +49 -0
  339. package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.test.ts +144 -8
  340. package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.ts +16 -17
  341. package/src/adapters/generic-sql/query/select-builder.test.ts +1 -0
  342. package/src/adapters/generic-sql/query/select-builder.ts +2 -2
  343. package/src/adapters/generic-sql/query/sql-query-compiler.test.ts +24 -5
  344. package/src/adapters/generic-sql/query/sql-query-compiler.ts +83 -13
  345. package/src/adapters/generic-sql/query/where-builder.test.ts +7 -5
  346. package/src/adapters/generic-sql/query/where-builder.ts +48 -29
  347. package/src/adapters/generic-sql/sql-adapter-pglite-migrations.test.ts +6 -15
  348. package/src/adapters/generic-sql/sql-adapter-pglite-pagination.test.ts +52 -7
  349. package/src/adapters/generic-sql/sql-adapter-pglite-queries.test.ts +9 -6
  350. package/src/adapters/generic-sql/sql-adapter-sqlite3-driver.test.ts +273 -5
  351. package/src/adapters/generic-sql/sql-adapter-sqlite3-uow.test.ts +123 -6
  352. package/src/adapters/generic-sql/sql-adapter-sqlocal.test.ts +4 -2
  353. package/src/adapters/generic-sql/uow-decoder.test.ts +4 -3
  354. package/src/adapters/generic-sql/uow-decoder.ts +3 -3
  355. package/src/adapters/generic-sql/uow-encoder.test.ts +4 -2
  356. package/src/adapters/generic-sql/uow-encoder.ts +14 -18
  357. package/src/adapters/in-memory/condition-evaluator.test.ts +2 -1
  358. package/src/adapters/in-memory/condition-evaluator.ts +9 -4
  359. package/src/adapters/in-memory/in-memory-adapter.ts +155 -44
  360. package/src/adapters/in-memory/in-memory-uow.mutations.test.ts +50 -2
  361. package/src/adapters/in-memory/in-memory-uow.retrieval.test.ts +158 -3
  362. package/src/adapters/in-memory/in-memory-uow.ts +402 -26
  363. package/src/adapters/in-memory/options.test.ts +1 -0
  364. package/src/adapters/in-memory/options.ts +5 -1
  365. package/src/adapters/in-memory/outbox.test.ts +361 -0
  366. package/src/adapters/in-memory/reference-resolution.test.ts +3 -2
  367. package/src/adapters/in-memory/reference-resolution.ts +2 -2
  368. package/src/adapters/in-memory/sorted-array-index.test.ts +1 -0
  369. package/src/adapters/in-memory/store.test.ts +1 -0
  370. package/src/adapters/in-memory/store.ts +3 -3
  371. package/src/adapters/in-memory/value-normalization.test.ts +1 -0
  372. package/src/adapters/prisma/prisma-adapter-sqlite3.test.ts +51 -7
  373. package/src/adapters/shared/from-unit-of-work-compiler.ts +156 -46
  374. package/src/adapters/shared/uow-operation-compiler.ts +3 -3
  375. package/src/browser/mod.ts +64 -0
  376. package/src/client.ts +19 -0
  377. package/src/db-fragment-definition-builder.test.ts +821 -47
  378. package/src/db-fragment-definition-builder.ts +857 -110
  379. package/src/db-fragment-instantiator.test.ts +114 -90
  380. package/src/db-fragment-integration.test.ts +9 -6
  381. package/src/dispatchers/cloudflare-do/dispatcher.ts +204 -0
  382. package/src/dispatchers/cloudflare-do/index.test.ts +145 -12
  383. package/src/dispatchers/cloudflare-do/index.ts +49 -90
  384. package/src/dispatchers/node/dispatcher.ts +112 -0
  385. package/src/dispatchers/node/index.test.ts +43 -14
  386. package/src/dispatchers/node/index.ts +38 -75
  387. package/src/durable-hooks.test.ts +80 -0
  388. package/src/durable-hooks.ts +67 -0
  389. package/src/fragments/internal-fragment.routes.test.ts +570 -0
  390. package/src/fragments/internal-fragment.routes.ts +297 -5
  391. package/src/fragments/internal-fragment.schema.ts +45 -1
  392. package/src/fragments/internal-fragment.test.ts +223 -251
  393. package/src/fragments/internal-fragment.ts +278 -154
  394. package/src/hooks/durable-hooks-logger.ts +126 -0
  395. package/src/hooks/durable-hooks-processor.pglite.test.ts +87 -0
  396. package/src/hooks/durable-hooks-processor.test.ts +179 -14
  397. package/src/hooks/durable-hooks-processor.ts +120 -14
  398. package/src/hooks/durable-hooks-runtime.test.ts +65 -0
  399. package/src/hooks/durable-hooks-runtime.ts +81 -0
  400. package/src/hooks/hooks.test.ts +314 -53
  401. package/src/hooks/hooks.ts +360 -81
  402. package/src/id.test.ts +34 -0
  403. package/src/id.ts +1 -3
  404. package/src/internal/adapter-registry.test.ts +93 -0
  405. package/src/internal/adapter-registry.ts +239 -0
  406. package/src/internal/outbox-state.ts +43 -0
  407. package/src/migration-engine/auto-from-schema.test.ts +93 -0
  408. package/src/migration-engine/auto-from-schema.ts +360 -42
  409. package/src/migration-engine/create.test.ts +2 -1
  410. package/src/migration-engine/create.ts +1 -1
  411. package/src/migration-engine/generation-engine.test.ts +66 -9
  412. package/src/migration-engine/generation-engine.ts +31 -10
  413. package/src/migration-engine/shared.ts +13 -0
  414. package/src/mod.ts +45 -27
  415. package/src/naming/sql-naming.ts +1 -0
  416. package/src/outbox/outbox-builder.ts +2 -2
  417. package/src/outbox/outbox.test.ts +216 -45
  418. package/src/outbox/outbox.ts +3 -1
  419. package/src/query/column-defaults.ts +1 -1
  420. package/src/query/condition-builder.test.ts +15 -0
  421. package/src/query/condition-builder.ts +7 -0
  422. package/src/query/cursor-client.test.ts +70 -0
  423. package/src/query/cursor-client.ts +263 -0
  424. package/src/query/cursor.test.ts +3 -2
  425. package/src/query/cursor.ts +15 -3
  426. package/src/query/db-now.ts +69 -2
  427. package/src/query/orm/orm.ts +2 -2
  428. package/src/query/query-type.test.ts +2 -1
  429. package/src/query/serialize/create-sql-serializer.ts +3 -3
  430. package/src/query/serialize/dialect/mysql-serializer.ts +1 -1
  431. package/src/query/serialize/dialect/postgres-serializer.ts +1 -1
  432. package/src/query/serialize/dialect/sqlite-serializer.test.ts +39 -2
  433. package/src/query/serialize/dialect/sqlite-serializer.ts +18 -5
  434. package/src/query/simple-query-interface.ts +10 -4
  435. package/src/query/unit-of-work/execute-unit-of-work.test.ts +347 -9
  436. package/src/query/unit-of-work/execute-unit-of-work.ts +63 -20
  437. package/src/query/unit-of-work/retry-policy.test.ts +1 -0
  438. package/src/query/unit-of-work/tx-builder.test.ts +73 -1
  439. package/src/query/unit-of-work/unit-of-work-coordinator.test.ts +5 -4
  440. package/src/query/unit-of-work/unit-of-work-types.test.ts +41 -11
  441. package/src/query/unit-of-work/unit-of-work.test.ts +28 -2
  442. package/src/query/unit-of-work/unit-of-work.ts +105 -19
  443. package/src/query/value-decoding.test.ts +50 -2
  444. package/src/query/value-decoding.ts +17 -4
  445. package/src/query/value-encoding.test.ts +1 -0
  446. package/src/query/value-encoding.ts +1 -1
  447. package/src/schema/create.test.ts +164 -5
  448. package/src/schema/create.ts +222 -24
  449. package/src/schema/generate-id.test.ts +1 -0
  450. package/src/schema/serialize.test.ts +4 -3
  451. package/src/schema/type-conversion/create-sql-type-mapper.ts +1 -1
  452. package/src/schema/type-conversion/dialect/sqlite.ts +2 -2
  453. package/src/schema/type-conversion/type-mapping.test.ts +2 -1
  454. package/src/schema/validator.test.ts +4 -2
  455. package/src/schema/validator.ts +1 -0
  456. package/src/schema-output/drizzle.test.ts +72 -19
  457. package/src/schema-output/drizzle.ts +24 -18
  458. package/src/schema-output/prisma.test.ts +172 -14
  459. package/src/schema-output/prisma.ts +34 -14
  460. package/src/sql-driver/better-sqlite3.test.ts +5 -3
  461. package/src/sql-driver/dialects/durable-object-dialect.ts +3 -8
  462. package/src/sql-driver/query-executor/default-query-executor.ts +1 -1
  463. package/src/sql-driver/query-executor/query-executor-base.ts +1 -1
  464. package/src/sql-driver/query-executor/query-executor.ts +1 -1
  465. package/src/sql-driver/sql-driver-adapter.ts +2 -2
  466. package/src/sql-driver/sql.ts +2 -1
  467. package/src/sql-driver/sqlocal.test.ts +4 -2
  468. package/src/sync/commands.test.ts +39 -0
  469. package/src/sync/commands.ts +51 -0
  470. package/src/sync/conflict-checker.test.ts +450 -0
  471. package/src/sync/conflict-checker.ts +248 -0
  472. package/src/sync/index.ts +14 -0
  473. package/src/sync/plan.ts +9 -0
  474. package/src/sync/read-tracking.test.ts +177 -0
  475. package/src/sync/read-tracking.ts +287 -0
  476. package/src/sync/submit.test.ts +205 -0
  477. package/src/sync/submit.ts +328 -0
  478. package/src/sync/types.ts +80 -0
  479. package/src/util/default-database-adapter.ts +15 -2
  480. package/src/with-database.ts +20 -50
  481. package/tsconfig.json +1 -1
  482. package/tsdown.config.ts +38 -26
  483. package/vitest.config.ts +1 -0
  484. package/dist/hooks/durable-hooks-processor.d.ts.map +0 -1
  485. package/dist/node_modules/.pnpm/rou3@0.7.12/node_modules/rou3/dist/index.js +0 -168
  486. package/dist/node_modules/.pnpm/rou3@0.7.12/node_modules/rou3/dist/index.js.map +0 -1
  487. package/dist/packages/fragno/dist/api/bind-services.js +0 -20
  488. package/dist/packages/fragno/dist/api/bind-services.js.map +0 -1
  489. package/dist/packages/fragno/dist/api/error.js +0 -48
  490. package/dist/packages/fragno/dist/api/error.js.map +0 -1
  491. package/dist/packages/fragno/dist/api/fragment-definition-builder.js +0 -321
  492. package/dist/packages/fragno/dist/api/fragment-definition-builder.js.map +0 -1
  493. package/dist/packages/fragno/dist/api/fragment-instantiator.js +0 -669
  494. package/dist/packages/fragno/dist/api/fragment-instantiator.js.map +0 -1
  495. package/dist/packages/fragno/dist/api/fragno-response.js +0 -73
  496. package/dist/packages/fragno/dist/api/fragno-response.js.map +0 -1
  497. package/dist/packages/fragno/dist/api/internal/response-stream.js +0 -81
  498. package/dist/packages/fragno/dist/api/internal/response-stream.js.map +0 -1
  499. package/dist/packages/fragno/dist/api/internal/route.js +0 -10
  500. package/dist/packages/fragno/dist/api/internal/route.js.map +0 -1
  501. package/dist/packages/fragno/dist/api/mutable-request-state.js +0 -97
  502. package/dist/packages/fragno/dist/api/mutable-request-state.js.map +0 -1
  503. package/dist/packages/fragno/dist/api/request-context-storage.js +0 -43
  504. package/dist/packages/fragno/dist/api/request-context-storage.js.map +0 -1
  505. package/dist/packages/fragno/dist/api/request-input-context.js +0 -185
  506. package/dist/packages/fragno/dist/api/request-input-context.js.map +0 -1
  507. package/dist/packages/fragno/dist/api/request-middleware.js +0 -83
  508. package/dist/packages/fragno/dist/api/request-middleware.js.map +0 -1
  509. package/dist/packages/fragno/dist/api/request-output-context.js +0 -119
  510. package/dist/packages/fragno/dist/api/request-output-context.js.map +0 -1
  511. package/dist/packages/fragno/dist/api/route.js +0 -30
  512. package/dist/packages/fragno/dist/api/route.js.map +0 -1
  513. package/dist/packages/fragno/dist/internal/symbols.js +0 -10
  514. package/dist/packages/fragno/dist/internal/symbols.js.map +0 -1
  515. package/dist/packages/fragno/dist/internal/trace-context.js +0 -12
  516. package/dist/packages/fragno/dist/internal/trace-context.js.map +0 -1
@@ -1,16 +1,17 @@
1
1
  import { describe, expect, test } from "vitest";
2
- import { column, idColumn, referenceColumn, schema } from "../../../schema/create";
3
- import { createColdKysely } from "./cold-kysely";
4
- import { SQLiteSQLGenerator } from "./dialect/sqlite";
5
- import { PostgresSQLGenerator } from "./dialect/postgres";
6
- import { MySQLSQLGenerator } from "./dialect/mysql";
7
- import { createPreparedMigrations } from "./prepared-migrations";
2
+
8
3
  import {
9
4
  createNamingResolver,
10
5
  schemaNamingStrategy,
11
6
  suffixNamingStrategy,
12
7
  type SqlNamingStrategy,
13
8
  } from "../../../naming/sql-naming";
9
+ import { column, idColumn, referenceColumn, schema } from "../../../schema/create";
10
+ import { createColdKysely } from "./cold-kysely";
11
+ import { MySQLSQLGenerator } from "./dialect/mysql";
12
+ import { PostgresSQLGenerator } from "./dialect/postgres";
13
+ import { SQLiteSQLGenerator } from "./dialect/sqlite";
14
+ import { createPreparedMigrations } from "./prepared-migrations";
14
15
 
15
16
  const testSchema = schema("test", (s) => {
16
17
  return s
@@ -36,7 +37,37 @@ const testSchema = schema("test", (s) => {
36
37
  });
37
38
  });
38
39
 
40
+ const nullableSchema = schema("nullable", (s) => {
41
+ return s
42
+ .addTable("users", (t) => {
43
+ return t.addColumn("id", idColumn()).addColumn("name", column("string"));
44
+ })
45
+ .alterTable("users", (t) => {
46
+ return t.alterColumn("name").nullable();
47
+ });
48
+ });
49
+
39
50
  const resolver = createNamingResolver(testSchema, "test", suffixNamingStrategy);
51
+ const nullableResolver = createNamingResolver(nullableSchema, "nullable", suffixNamingStrategy);
52
+ const fkLaterSchema = schema("fk_later", (s) => {
53
+ return s
54
+ .addTable("users", (t) => {
55
+ return t.addColumn("id", idColumn()).addColumn("name", column("string"));
56
+ })
57
+ .addTable("posts", (t) => {
58
+ return t
59
+ .addColumn("id", idColumn())
60
+ .addColumn("title", column("string"))
61
+ .addColumn("authorId", referenceColumn());
62
+ })
63
+ .addReference("author", {
64
+ type: "one",
65
+ from: { table: "posts", column: "authorId" },
66
+ to: { table: "users", column: "id" },
67
+ });
68
+ });
69
+
70
+ const fkLaterResolver = createNamingResolver(fkLaterSchema, "fk_later", suffixNamingStrategy);
40
71
 
41
72
  describe("PreparedMigrations - PostgreSQL", () => {
42
73
  const coldKysely = createColdKysely("postgresql");
@@ -434,7 +465,7 @@ describe("PreparedMigrations - Integration", () => {
434
465
  expect(transactionStarted).toBe(true);
435
466
  expect(executedStatements.length).toBe(2);
436
467
  expect(executedStatements[0]).toMatchInlineSnapshot(
437
- `"create table "users_test" ("id" varchar(30) not null unique, "name" text not null, "_internalId" bigserial not null primary key, "_version" integer default 0 not null)"`,
468
+ `"create table "users_test" ("id" varchar(128) not null unique, "name" text not null, "_internalId" bigserial not null primary key, "_version" integer default 0 not null)"`,
438
469
  );
439
470
  expect(executedStatements[1]).toMatchInlineSnapshot(
440
471
  `"insert into "fragno_db_settings" ("id", "key", "value") values ('BflimUWc1NbCMMDD9SM3gQ', 'test.schema_version', '1')"`,
@@ -588,7 +619,7 @@ describe("PreparedMigrations - Multi-step Migration Scenarios", () => {
588
619
 
589
620
  const sql = prepared.getSQL(0, 2, { updateVersionInMigration: true });
590
621
  expect(sql).toMatchInlineSnapshot(`
591
- "create table "users_test" ("id" varchar(30) not null unique, "name" text not null, "_internalId" bigserial not null primary key, "_version" integer default 0 not null);
622
+ "create table "users_test" ("id" varchar(128) not null unique, "name" text not null, "_internalId" bigserial not null primary key, "_version" integer default 0 not null);
592
623
 
593
624
  alter table "users_test" add column "age" integer;
594
625
 
@@ -610,7 +641,7 @@ describe("PreparedMigrations - Multi-step Migration Scenarios", () => {
610
641
 
611
642
  const sql = prepared.getSQL(0, 4, { updateVersionInMigration: true });
612
643
  expect(sql).toMatchInlineSnapshot(`
613
- "create table "users_test" ("id" varchar(30) not null unique, "name" text not null, "_internalId" bigserial not null primary key, "_version" integer default 0 not null);
644
+ "create table "users_test" ("id" varchar(128) not null unique, "name" text not null, "_internalId" bigserial not null primary key, "_version" integer default 0 not null);
614
645
 
615
646
  alter table "users_test" add column "age" integer;
616
647
 
@@ -618,7 +649,7 @@ describe("PreparedMigrations - Multi-step Migration Scenarios", () => {
618
649
 
619
650
  create index "idx_users_age_idx_test_1c69311d" on "users_test" ("age");
620
651
 
621
- create table "posts_test" ("id" varchar(30) not null unique, "title" text not null, "authorId" bigint not null, "_internalId" bigserial not null primary key, "_version" integer default 0 not null);
652
+ create table "posts_test" ("id" varchar(128) not null unique, "title" text not null, "authorId" bigint not null, "_internalId" bigserial not null primary key, "_version" integer default 0 not null);
622
653
 
623
654
  alter table "posts_test" add constraint "fk_posts_users_author_test_8d48035c" foreign key ("authorId") references "users_test" ("_internalId") on delete restrict on update restrict;
624
655
 
@@ -656,7 +687,7 @@ describe("PreparedMigrations - Multi-step Migration Scenarios", () => {
656
687
 
657
688
  const sql = prepared.getSQL(2, 3, { updateVersionInMigration: true });
658
689
  expect(sql).toMatchInlineSnapshot(`
659
- "create table "posts_test" ("id" varchar(30) not null unique, "title" text not null, "authorId" bigint not null, "_internalId" bigserial not null primary key, "_version" integer default 0 not null);
690
+ "create table "posts_test" ("id" varchar(128) not null unique, "title" text not null, "authorId" bigint not null, "_internalId" bigserial not null primary key, "_version" integer default 0 not null);
660
691
 
661
692
  update "fragno_db_settings" set "value" = '3' where "key" = 'test.schema_version';"
662
693
  `);
@@ -688,6 +719,20 @@ describe("PreparedMigrations - Multi-step Migration Scenarios", () => {
688
719
  `);
689
720
  });
690
721
 
722
+ test("SQLite: adding FK after table creation throws", () => {
723
+ const prepared = createPreparedMigrations({
724
+ schema: fkLaterSchema,
725
+ namespace: "fk_later",
726
+ database: "sqlite",
727
+ resolver: fkLaterResolver,
728
+ });
729
+
730
+ const previousVersion = fkLaterSchema.version - 1;
731
+ expect(() =>
732
+ prepared.getSQL(previousVersion, fkLaterSchema.version, { updateVersionInMigration: false }),
733
+ ).toThrow("SQLite doesn't support modifying foreign keys");
734
+ });
735
+
691
736
  test("MySQL: migration 0 -> 4 with FK checks disabled", () => {
692
737
  const prepared = createPreparedMigrations({
693
738
  schema: testSchema,
@@ -700,7 +745,7 @@ describe("PreparedMigrations - Multi-step Migration Scenarios", () => {
700
745
  expect(sql).toMatchInlineSnapshot(`
701
746
  "SET FOREIGN_KEY_CHECKS = 0;
702
747
 
703
- create table \`users_test\` (\`id\` varchar(30) not null unique, \`name\` text not null, \`_internalId\` bigint not null auto_increment, \`_version\` integer default 0 not null, constraint \`users_test__internalId\` primary key (\`_internalId\`));
748
+ create table \`users_test\` (\`id\` varchar(128) not null unique, \`name\` text not null, \`_internalId\` bigint not null auto_increment, \`_version\` integer default 0 not null, constraint \`users_test__internalId\` primary key (\`_internalId\`));
704
749
 
705
750
  alter table \`users_test\` add column \`age\` integer;
706
751
 
@@ -708,7 +753,7 @@ describe("PreparedMigrations - Multi-step Migration Scenarios", () => {
708
753
 
709
754
  create index \`idx_users_age_idx_test_1c69311d\` on \`users_test\` (\`age\`);
710
755
 
711
- create table \`posts_test\` (\`id\` varchar(30) not null unique, \`title\` text not null, \`authorId\` bigint not null, \`_internalId\` bigint not null auto_increment, \`_version\` integer default 0 not null, constraint \`posts_test__internalId\` primary key (\`_internalId\`));
756
+ create table \`posts_test\` (\`id\` varchar(128) not null unique, \`title\` text not null, \`authorId\` bigint not null, \`_internalId\` bigint not null auto_increment, \`_version\` integer default 0 not null, constraint \`posts_test__internalId\` primary key (\`_internalId\`));
712
757
 
713
758
  alter table \`posts_test\` add constraint \`fk_posts_users_author_test_8d48035c\` foreign key (\`authorId\`) references \`users_test\` (\`_internalId\`) on delete restrict on update restrict;
714
759
 
@@ -718,6 +763,64 @@ describe("PreparedMigrations - Multi-step Migration Scenarios", () => {
718
763
  `);
719
764
  });
720
765
 
766
+ test("PostgreSQL: migration 1 -> 2 (make column nullable)", () => {
767
+ const prepared = createPreparedMigrations({
768
+ schema: nullableSchema,
769
+ namespace: "nullable",
770
+ database: "postgresql",
771
+ resolver: nullableResolver,
772
+ });
773
+
774
+ const sql = prepared.getSQL(1, 2, { updateVersionInMigration: false });
775
+ expect(sql).toMatchInlineSnapshot(
776
+ `"alter table "users_nullable" alter column "name" drop not null;"`,
777
+ );
778
+ });
779
+
780
+ test("MySQL: migration 1 -> 2 (make column nullable)", () => {
781
+ const prepared = createPreparedMigrations({
782
+ schema: nullableSchema,
783
+ namespace: "nullable",
784
+ database: "mysql",
785
+ resolver: nullableResolver,
786
+ });
787
+
788
+ const sql = prepared.getSQL(1, 2, { updateVersionInMigration: false });
789
+ expect(sql).toMatchInlineSnapshot(`
790
+ "SET FOREIGN_KEY_CHECKS = 0;
791
+
792
+ alter table \`users_nullable\` modify column \`name\` text;
793
+
794
+ SET FOREIGN_KEY_CHECKS = 1;"
795
+ `);
796
+ });
797
+
798
+ test("SQLite: migration 1 -> 2 (make column nullable)", () => {
799
+ const prepared = createPreparedMigrations({
800
+ schema: nullableSchema,
801
+ namespace: "nullable",
802
+ database: "sqlite",
803
+ resolver: nullableResolver,
804
+ });
805
+
806
+ const sql = prepared.getSQL(1, 2, { updateVersionInMigration: false });
807
+ expect(sql).toMatchInlineSnapshot(`
808
+ "PRAGMA defer_foreign_keys = ON;
809
+
810
+ PRAGMA foreign_keys = OFF;
811
+
812
+ create table "users_nullable__fragno_tmp_414fdd" ("id" text not null unique, "name" text, "_internalId" integer not null primary key autoincrement, "_version" integer default 0 not null);
813
+
814
+ insert into "users_nullable__fragno_tmp_414fdd" ("id", "name", "_internalId", "_version") select "id", "name", "_internalId", "_version" from "users_nullable";
815
+
816
+ drop table "users_nullable";
817
+
818
+ alter table "users_nullable__fragno_tmp_414fdd" rename to "users_nullable";
819
+
820
+ PRAGMA foreign_keys = ON;"
821
+ `);
822
+ });
823
+
721
824
  test("compile returns CompiledMigration with statements array", () => {
722
825
  const prepared = createPreparedMigrations({
723
826
  schema: testSchema,
@@ -744,7 +847,7 @@ describe("PreparedMigrations - Multi-step Migration Scenarios", () => {
744
847
  const sql = prepared.getSQL(0, 1, { updateVersionInMigration: false });
745
848
  expect(sql).not.toContain("fragno_db_settings");
746
849
  expect(sql).toMatchInlineSnapshot(
747
- `"create table "users_test" ("id" varchar(30) not null unique, "name" text not null, "_internalId" bigserial not null primary key, "_version" integer default 0 not null);"`,
850
+ `"create table "users_test" ("id" varchar(128) not null unique, "name" text not null, "_internalId" bigserial not null primary key, "_version" integer default 0 not null);"`,
748
851
  );
749
852
  });
750
853
  });
@@ -1,16 +1,17 @@
1
+ import type { Kysely } from "kysely";
2
+
3
+ import { generateMigrationFromSchema } from "../../../migration-engine/auto-from-schema";
4
+ import type { NamingResolver } from "../../../naming/sql-naming";
1
5
  import type { AnySchema } from "../../../schema/create";
2
6
  import type { SqlDriverAdapter } from "../../../sql-driver/sql-driver-adapter";
3
- import type { NamingResolver } from "../../../naming/sql-naming";
4
- import { generateMigrationFromSchema } from "../../../migration-engine/auto-from-schema";
7
+ import type { DriverConfig, SupportedDatabase } from "../driver-config";
8
+ import type { SQLiteStorageMode } from "../sqlite-storage";
5
9
  import { createColdKysely } from "./cold-kysely";
6
- import { type SQLGenerator } from "./sql-generator";
7
- import { SQLiteSQLGenerator } from "./dialect/sqlite";
8
- import { PostgresSQLGenerator } from "./dialect/postgres";
9
10
  import { MySQLSQLGenerator } from "./dialect/mysql";
11
+ import { PostgresSQLGenerator } from "./dialect/postgres";
12
+ import { SQLiteSQLGenerator } from "./dialect/sqlite";
10
13
  import { executeMigration, type CompiledMigration } from "./executor";
11
- import type { DriverConfig, SupportedDatabase } from "../driver-config";
12
- import type { Kysely } from "kysely";
13
- import type { SQLiteStorageMode } from "../sqlite-storage";
14
+ import { type SQLGenerator } from "./sql-generator";
14
15
  /**
15
16
  * Options for executing a migration.
16
17
  */
@@ -1,3 +1,5 @@
1
+ import { createHash } from "node:crypto";
2
+
1
3
  import {
2
4
  type ColumnDefinitionBuilder,
3
5
  type CompiledQuery,
@@ -6,17 +8,17 @@ import {
6
8
  type RawBuilder,
7
9
  sql,
8
10
  } from "kysely";
9
- import { createHash } from "node:crypto";
11
+
12
+ import { SETTINGS_TABLE_NAME } from "../../../fragments/internal-fragment.schema";
10
13
  import type {
11
14
  ColumnInfo,
12
15
  ColumnOperation,
13
16
  MigrationOperation,
14
17
  } from "../../../migration-engine/shared";
15
- import { SETTINGS_TABLE_NAME } from "../../../fragments/internal-fragment.schema";
16
18
  import type { NamingResolver } from "../../../naming/sql-naming";
19
+ import { createSQLTypeMapper } from "../../../schema/type-conversion/create-sql-type-mapper";
17
20
  import type { DriverConfig, SupportedDatabase } from "../driver-config";
18
21
  import type { SQLiteStorageMode } from "../sqlite-storage";
19
- import { createSQLTypeMapper } from "../../../schema/type-conversion/create-sql-type-mapper";
20
22
 
21
23
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
22
24
  type KyselyAny = Kysely<any>;
@@ -1,10 +1,10 @@
1
- import type { DriverConfig } from "../driver-config";
2
1
  import type { NamingResolver } from "../../../naming/sql-naming";
2
+ import type { DriverConfig } from "../driver-config";
3
3
  import type { SQLiteStorageMode } from "../sqlite-storage";
4
- import { SQLQueryCompiler, type AnyKysely } from "./sql-query-compiler";
5
- import { PostgreSQLQueryCompiler } from "./dialect/postgres";
6
4
  import { MySQLQueryCompiler } from "./dialect/mysql";
5
+ import { PostgreSQLQueryCompiler } from "./dialect/postgres";
7
6
  import { SQLiteQueryCompiler } from "./dialect/sqlite";
7
+ import { SQLQueryCompiler, type AnyKysely } from "./sql-query-compiler";
8
8
 
9
9
  /**
10
10
  * Factory function to create a dialect-specific SQL query compiler.
@@ -1,7 +1,8 @@
1
1
  import { describe, expect, it } from "vitest";
2
- import { column, idColumn, schema } from "../../../schema/create";
3
- import { Cursor } from "../../../query/cursor";
2
+
4
3
  import type { Condition } from "../../../query/condition-builder";
4
+ import { Cursor } from "../../../query/cursor";
5
+ import { column, idColumn, schema } from "../../../schema/create";
5
6
  import { NodePostgresDriverConfig } from "../driver-config";
6
7
  import { buildCursorCondition } from "./cursor-utils";
7
8
 
@@ -1,6 +1,6 @@
1
- import type { AnyColumn } from "../../../schema/create";
2
1
  import type { Condition } from "../../../query/condition-builder";
3
2
  import { decodeCursor, serializeCursorValues, type Cursor } from "../../../query/cursor";
3
+ import type { AnyColumn } from "../../../schema/create";
4
4
  import type { DriverConfig } from "../driver-config";
5
5
  import type { SQLiteStorageMode } from "../sqlite-storage";
6
6
 
@@ -0,0 +1,49 @@
1
+ import { sql } from "kysely";
2
+
3
+ import type { AnyColumn } from "../../../schema/create";
4
+ import type { DriverConfig } from "../driver-config";
5
+ import { sqliteStorageDefault, type SQLiteStorageMode } from "../sqlite-storage";
6
+
7
+ type ColumnType = AnyColumn["type"];
8
+
9
+ type BuildDbNowSqlOptions = {
10
+ driverConfig: DriverConfig;
11
+ columnType: ColumnType;
12
+ offsetMs: number;
13
+ sqliteStorageMode?: SQLiteStorageMode;
14
+ };
15
+
16
+ export const buildDbNowSql = ({
17
+ driverConfig,
18
+ columnType,
19
+ offsetMs,
20
+ sqliteStorageMode,
21
+ }: BuildDbNowSqlOptions) => {
22
+ if (driverConfig.databaseType === "sqlite") {
23
+ const storageMode = sqliteStorageMode ?? sqliteStorageDefault;
24
+ const storage = columnType === "date" ? storageMode.dateStorage : storageMode.timestampStorage;
25
+ if ((columnType === "timestamp" || columnType === "date") && storage === "epoch-ms") {
26
+ const base = sql`(cast((julianday('now') - 2440587.5)*86400000 as integer))`;
27
+ return offsetMs === 0 ? base : sql`${base} + ${offsetMs}`;
28
+ }
29
+ if (offsetMs === 0) {
30
+ return sql`CURRENT_TIMESTAMP`;
31
+ }
32
+ const roundedSeconds = Math.round((offsetMs / 1000) * 1000) / 1000;
33
+ const modifier = `${roundedSeconds >= 0 ? "+" : ""}${roundedSeconds} seconds`;
34
+ return sql`datetime('now', ${modifier})`;
35
+ }
36
+
37
+ if (driverConfig.databaseType === "mysql") {
38
+ if (offsetMs === 0) {
39
+ return sql`CURRENT_TIMESTAMP`;
40
+ }
41
+ const micros = Math.trunc(offsetMs * 1000);
42
+ return sql`TIMESTAMPADD(MICROSECOND, ${micros}, CURRENT_TIMESTAMP)`;
43
+ }
44
+
45
+ if (offsetMs === 0) {
46
+ return sql`CURRENT_TIMESTAMP`;
47
+ }
48
+ return sql`(CURRENT_TIMESTAMP + (${offsetMs} * interval '1 millisecond'))`;
49
+ };
@@ -1,8 +1,9 @@
1
1
  import { describe, test, expect } from "vitest";
2
- import { GenericSQLUOWOperationCompiler } from "./generic-sql-uow-operation-compiler";
3
- import { BetterSQLite3DriverConfig, NodePostgresDriverConfig } from "../driver-config";
4
- import { schema, column, idColumn, referenceColumn, FragnoId } from "../../../schema/create";
2
+
5
3
  import { Cursor } from "../../../query/cursor";
4
+ import { schema, column, idColumn, referenceColumn, FragnoId } from "../../../schema/create";
5
+ import { BetterSQLite3DriverConfig, NodePostgresDriverConfig } from "../driver-config";
6
+ import { GenericSQLUOWOperationCompiler } from "./generic-sql-uow-operation-compiler";
6
7
 
7
8
  // Test schema with indexes
8
9
  const testSchema = schema("test", (s) => {
@@ -18,7 +19,8 @@ const testSchema = schema("test", (s) => {
18
19
  .addColumn("invitedBy", referenceColumn().nullable())
19
20
  .createIndex("idx_email", ["email"], { unique: true })
20
21
  .createIndex("idx_users_name", ["name"])
21
- .createIndex("idx_age", ["age"]);
22
+ .createIndex("idx_age", ["age"])
23
+ .createIndex("idx_users_name_created_id", ["name", "createdAt", "id"]);
22
24
  })
23
25
  .addTable("posts", (t) => {
24
26
  return t
@@ -133,6 +135,45 @@ const customIdSchema = schema("customid", (s) => {
133
135
  });
134
136
  });
135
137
 
138
+ const joinOnlySchema = schema("joinonly", (s) => {
139
+ return s
140
+ .addTable("users", (t) => {
141
+ return t
142
+ .addColumn("id", idColumn())
143
+ .addColumn("email", column("string"))
144
+ .createIndex("idx_users_email", ["email"]);
145
+ })
146
+ .addTable("invitations", (t) => {
147
+ return t
148
+ .addColumn("id", idColumn())
149
+ .addColumn("email", column("string"))
150
+ .createIndex("idx_inv_email", ["email"]);
151
+ })
152
+ .addTable("memberships", (t) => {
153
+ return t
154
+ .addColumn("id", idColumn())
155
+ .addColumn("userId", referenceColumn())
156
+ .createIndex("idx_memberships_user", ["userId"]);
157
+ })
158
+ .addReference("invitedUser", {
159
+ type: "one",
160
+ from: { table: "invitations", column: "email" },
161
+ to: { table: "users", column: "email" },
162
+ foreignKey: false,
163
+ })
164
+ .addReference("membershipUser", {
165
+ type: "one",
166
+ from: { table: "memberships", column: "userId" },
167
+ to: { table: "users", column: "id" },
168
+ })
169
+ .addReference("memberships", {
170
+ type: "many",
171
+ from: { table: "users", column: "id" },
172
+ to: { table: "memberships", column: "userId" },
173
+ foreignKey: false,
174
+ });
175
+ });
176
+
136
177
  describe("GenericSQLUOWOperationCompiler", () => {
137
178
  const driverConfig = new BetterSQLite3DriverConfig();
138
179
 
@@ -886,6 +927,45 @@ describe("GenericSQLUOWOperationCompiler", () => {
886
927
  );
887
928
  expect(result!.parameters).toEqual([1, "Alice", 5]);
888
929
  });
930
+
931
+ test("should compile find with composite cursor pagination", () => {
932
+ const compiler = new GenericSQLUOWOperationCompiler(driverConfig);
933
+ const createdAt = new Date("2024-01-01T00:00:00.000Z");
934
+ const cursor = new Cursor({
935
+ indexName: "idx_users_name_created_id",
936
+ orderDirection: "desc",
937
+ pageSize: 7,
938
+ indexValues: { name: "Alice", createdAt, id: "user-123" },
939
+ });
940
+
941
+ const result = compiler.compileFind({
942
+ type: "find",
943
+ schema: testSchema,
944
+ table: testSchema.tables.users,
945
+ indexName: "idx_users_name_created_id",
946
+ options: {
947
+ useIndex: "idx_users_name_created_id",
948
+ select: true,
949
+ orderByIndex: { indexName: "idx_users_name_created_id", direction: "desc" },
950
+ after: cursor,
951
+ pageSize: 7,
952
+ },
953
+ });
954
+
955
+ expect(result).not.toBeNull();
956
+ expect(result!.sql).toMatchInlineSnapshot(
957
+ `"select "users"."id" as "id", "users"."name" as "name", "users"."email" as "email", "users"."age" as "age", "users"."isActive" as "isActive", "users"."createdAt" as "createdAt", "users"."invitedBy" as "invitedBy", "users"."_internalId" as "_internalId", "users"."_version" as "_version" from "users" where ("users"."name" < ? or ("users"."name" = ? and "users"."createdAt" < ?) or ("users"."name" = ? and "users"."createdAt" = ? and "users"."id" < ?)) order by "users"."name" desc, "users"."createdAt" desc, "users"."id" desc limit ?"`,
958
+ );
959
+ expect(result!.parameters).toEqual([
960
+ "Alice",
961
+ "Alice",
962
+ createdAt.getTime(),
963
+ "Alice",
964
+ createdAt.getTime(),
965
+ "user-123",
966
+ 7,
967
+ ]);
968
+ });
889
969
  });
890
970
 
891
971
  describe("complex where conditions", () => {
@@ -1099,6 +1179,62 @@ describe("GenericSQLUOWOperationCompiler", () => {
1099
1179
  );
1100
1180
  });
1101
1181
 
1182
+ test("should compile join-only relation without internal id coercion", () => {
1183
+ const compiler = new GenericSQLUOWOperationCompiler(driverConfig);
1184
+
1185
+ const result = compiler.compileFind({
1186
+ type: "find",
1187
+ schema: joinOnlySchema,
1188
+ table: joinOnlySchema.tables.invitations,
1189
+ indexName: "primary",
1190
+ options: {
1191
+ useIndex: "primary",
1192
+ select: ["id"],
1193
+ joins: [
1194
+ {
1195
+ relation: joinOnlySchema.tables.invitations.relations.invitedUser,
1196
+ options: {
1197
+ select: ["email"],
1198
+ },
1199
+ },
1200
+ ],
1201
+ },
1202
+ });
1203
+
1204
+ expect(result).not.toBeNull();
1205
+ expect(result!.sql).toMatchInlineSnapshot(
1206
+ `"select "invitedUser"."email" as "invitedUser:email", "invitedUser"."_internalId" as "invitedUser:_internalId", "invitedUser"."_version" as "invitedUser:_version", "invitations"."id" as "id", "invitations"."_internalId" as "_internalId", "invitations"."_version" as "_version" from "invitations" left join "users" as "invitedUser" on "invitations"."email" = "invitedUser"."email""`,
1207
+ );
1208
+ });
1209
+
1210
+ test("should coerce left-side id for join-only relations", () => {
1211
+ const compiler = new GenericSQLUOWOperationCompiler(driverConfig);
1212
+
1213
+ const result = compiler.compileFind({
1214
+ type: "find",
1215
+ schema: joinOnlySchema,
1216
+ table: joinOnlySchema.tables.users,
1217
+ indexName: "primary",
1218
+ options: {
1219
+ useIndex: "primary",
1220
+ select: ["id"],
1221
+ joins: [
1222
+ {
1223
+ relation: joinOnlySchema.tables.users.relations.memberships,
1224
+ options: {
1225
+ select: ["id"],
1226
+ },
1227
+ },
1228
+ ],
1229
+ },
1230
+ });
1231
+
1232
+ expect(result).not.toBeNull();
1233
+ expect(result!.sql).toMatchInlineSnapshot(
1234
+ `"select "memberships"."id" as "memberships:id", "memberships"."_internalId" as "memberships:_internalId", "memberships"."_version" as "memberships:_version", "users"."id" as "id", "users"."_internalId" as "_internalId", "users"."_version" as "_version" from "users" left join "memberships" as "memberships" on "users"."_internalId" = "memberships"."userId""`,
1235
+ );
1236
+ });
1237
+
1102
1238
  test("should compile join with specific column selection", () => {
1103
1239
  const compiler = new GenericSQLUOWOperationCompiler(driverConfig);
1104
1240
 
@@ -1220,7 +1356,7 @@ describe("GenericSQLUOWOperationCompiler", () => {
1220
1356
 
1221
1357
  expect(result).not.toBeNull();
1222
1358
  expect(result!.sql).toMatchInlineSnapshot(
1223
- `"select "author"."name" as "author:name", "author"."_internalId" as "author:_internalId", "author"."_version" as "author:_version", "posts"."id" as "id", "posts"."title" as "title", "posts"."_internalId" as "_internalId", "posts"."_version" as "_version" from "posts" left join "users" as "author" on ("posts"."userId" = "author"."_internalId" and "users"."name" like ?)"`,
1359
+ `"select "author"."name" as "author:name", "author"."_internalId" as "author:_internalId", "author"."_version" as "author:_version", "posts"."id" as "id", "posts"."title" as "title", "posts"."_internalId" as "_internalId", "posts"."_version" as "_version" from "posts" left join "users" as "author" on ("posts"."userId" = "author"."_internalId" and "author"."name" like ?)"`,
1224
1360
  );
1225
1361
  expect(result!.parameters).toEqual(["%john%"]);
1226
1362
  });
@@ -1267,7 +1403,7 @@ describe("GenericSQLUOWOperationCompiler", () => {
1267
1403
 
1268
1404
  expect(result).not.toBeNull();
1269
1405
  expect(result!.sql).toMatchInlineSnapshot(
1270
- `"select "author"."name" as "author:name", "author"."_internalId" as "author:_internalId", "author"."_version" as "author:_version", "posts"."id" as "id", "posts"."title" as "title", "posts"."_internalId" as "_internalId", "posts"."_version" as "_version" from "posts" left join "users" as "author" on ("posts"."userId" = "author"."_internalId" and ("users"."name" like ? and "users"."isActive" = ?))"`,
1406
+ `"select "author"."name" as "author:name", "author"."_internalId" as "author:_internalId", "author"."_version" as "author:_version", "posts"."id" as "id", "posts"."title" as "title", "posts"."_internalId" as "_internalId", "posts"."_version" as "_version" from "posts" left join "users" as "author" on ("posts"."userId" = "author"."_internalId" and ("author"."name" like ? and "author"."isActive" = ?))"`,
1271
1407
  );
1272
1408
  });
1273
1409
 
@@ -1358,7 +1494,7 @@ describe("GenericSQLUOWOperationCompiler", () => {
1358
1494
 
1359
1495
  expect(result).not.toBeNull();
1360
1496
  expect(result!.sql).toMatchInlineSnapshot(
1361
- `"select "author"."id" as "author:id", "author"."name" as "author:name", "author"."_internalId" as "author:_internalId", "author"."_version" as "author:_version", "posts"."id" as "id", "posts"."title" as "title", "posts"."_internalId" as "_internalId", "posts"."_version" as "_version" from "posts" left join "users" as "author" on ("posts"."userId" = "author"."_internalId" and "users"."id" = ?)"`,
1497
+ `"select "author"."id" as "author:id", "author"."name" as "author:name", "author"."_internalId" as "author:_internalId", "author"."_version" as "author:_version", "posts"."id" as "id", "posts"."title" as "title", "posts"."_internalId" as "_internalId", "posts"."_version" as "_version" from "posts" left join "users" as "author" on ("posts"."userId" = "author"."_internalId" and "author"."id" = ?)"`,
1362
1498
  );
1363
1499
  expect(result!.parameters).toEqual(["user-123"]);
1364
1500
  });
@@ -1498,7 +1634,7 @@ describe("GenericSQLUOWOperationCompiler", () => {
1498
1634
 
1499
1635
  expect(result).not.toBeNull();
1500
1636
  expect(result!.sql).toMatchInlineSnapshot(
1501
- `"select "product"."productId" as "product:productId", "product"."name" as "product:name", "product"."_internalId" as "product:_internalId", "product"."_version" as "product:_version", "product_categories"."id" as "id", "product_categories"."_internalId" as "_internalId", "product_categories"."_version" as "_version" from "product_categories" left join "products" as "product" on ("product_categories"."prodRef" = "product"."_internalId" and "products"."productId" = ?)"`,
1637
+ `"select "product"."productId" as "product:productId", "product"."name" as "product:name", "product"."_internalId" as "product:_internalId", "product"."_version" as "product:_version", "product_categories"."id" as "id", "product_categories"."_internalId" as "_internalId", "product_categories"."_version" as "_version" from "product_categories" left join "products" as "product" on ("product_categories"."prodRef" = "product"."_internalId" and "product"."productId" = ?)"`,
1502
1638
  );
1503
1639
  expect(result!.parameters).toEqual(["prod-456"]);
1504
1640
  });
@@ -1,22 +1,23 @@
1
- import { UOWOperationCompiler } from "../../shared/uow-operation-compiler";
2
1
  import type { CompiledQuery } from "kysely";
3
- import type { DriverConfig } from "../driver-config";
2
+
4
3
  import type { NamingResolver } from "../../../naming/sql-naming";
5
- import type { SQLiteStorageMode } from "../sqlite-storage";
4
+ import { buildCondition } from "../../../query/condition-builder";
5
+ import type { Condition } from "../../../query/condition-builder";
6
+ import { buildFindOptions } from "../../../query/orm/orm";
7
+ import type { AnySelectClause } from "../../../query/simple-query-interface";
6
8
  import type {
7
9
  RetrievalOperation,
8
10
  MutationOperation,
9
11
  CompiledMutation,
10
12
  } from "../../../query/unit-of-work/unit-of-work";
11
13
  import type { AnyColumn, AnySchema } from "../../../schema/create";
12
- import { buildCondition } from "../../../query/condition-builder";
14
+ import { UOWOperationCompiler } from "../../shared/uow-operation-compiler";
15
+ import type { DriverConfig } from "../driver-config";
16
+ import { createColdKysely } from "../migration/cold-kysely";
17
+ import type { SQLiteStorageMode } from "../sqlite-storage";
13
18
  import { createSQLQueryCompiler } from "./create-sql-query-compiler";
14
- import { SQLQueryCompiler } from "./sql-query-compiler";
15
19
  import { buildCursorCondition } from "./cursor-utils";
16
- import type { Condition } from "../../../query/condition-builder";
17
- import { buildFindOptions } from "../../../query/orm/orm";
18
- import type { AnySelectClause } from "../../../query/simple-query-interface";
19
- import { createColdKysely } from "../migration/cold-kysely";
20
+ import { SQLQueryCompiler } from "./sql-query-compiler";
20
21
 
21
22
  /**
22
23
  * Generic SQL UOW Operation Compiler.
@@ -118,13 +119,7 @@ export class GenericSQLUOWOperationCompiler extends UOWOperationCompiler<Compile
118
119
  orderBy = indexColumns.map((col) => [col, orderDirection]);
119
120
  }
120
121
 
121
- // Handle cursor pagination - build a cursor condition
122
- // TODO: Multi-column cursor pagination not yet supported
123
- if ((after || before) && indexColumns.length > 1) {
124
- throw new Error(
125
- "Multi-column cursor pagination is not yet supported in Generic SQL implementation",
126
- );
127
- }
122
+ // Handle cursor pagination - build a cursor condition (supports multi-column lexicographic compare)
128
123
  const cursorCondition = buildCursorCondition(
129
124
  after || before,
130
125
  indexColumns,
@@ -169,6 +164,7 @@ export class GenericSQLUOWOperationCompiler extends UOWOperationCompiler<Compile
169
164
  orderBy,
170
165
  limit: effectiveLimit,
171
166
  join,
167
+ readTracking: op.readTracking,
172
168
  });
173
169
  }
174
170
 
@@ -184,7 +180,10 @@ export class GenericSQLUOWOperationCompiler extends UOWOperationCompiler<Compile
184
180
  return null;
185
181
  }
186
182
 
187
- return sqlCompiler.compileFindMany(op.table, compiledOptions);
183
+ return sqlCompiler.compileFindMany(op.table, {
184
+ ...compiledOptions,
185
+ readTracking: op.readTracking,
186
+ });
188
187
  }
189
188
 
190
189
  override compileCreate(
@@ -1,4 +1,5 @@
1
1
  import { describe, expect, it } from "vitest";
2
+
2
3
  import { column, idColumn, referenceColumn, schema } from "../../../schema/create";
3
4
  import { mapSelect, extendSelect } from "./select-builder";
4
5