@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 +1 @@
1
- {"version":3,"file":"from-unit-of-work-compiler.js","names":["#indexName","#condition","#setValues"],"sources":["../../../src/adapters/shared/from-unit-of-work-compiler.ts"],"sourcesContent":["import type { SimpleQueryInterface, TableToUpdateValues } from \"../../query/simple-query-interface\";\nimport type { AnySchema, AnyTable, FragnoId } from \"../../schema/create\";\nimport type {\n CompiledMutation,\n UOWCompiler,\n UOWDecoder,\n UOWExecutor,\n UOWInstrumentation,\n ValidIndexName,\n} from \"../../query/unit-of-work/unit-of-work\";\nimport { UnitOfWork } from \"../../query/unit-of-work/unit-of-work\";\nimport type { CursorResult } from \"../../query/cursor\";\nimport type { CompiledQuery } from \"../../sql-driver/sql-driver\";\n\n/**\n * Configuration options for creating a Unit of Work with generic SQL\n */\nexport interface UnitOfWorkConfig {\n /**\n * Optional callback to receive compiled SQL queries for logging/debugging\n * This callback is invoked for each query as it's compiled\n */\n onQuery?: (query: CompiledQuery) => void;\n /**\n * If true, the query will not be executed and the query will be returned. Not respected for UOWs\n * since those have to be manually executed.\n */\n dryRun?: boolean;\n instrumentation?: UOWInstrumentation;\n}\n\n/**\n * Factory interface for creating Unit of Work instances\n */\nexport interface UnitOfWorkFactory {\n /**\n * UOW compiler for compiling operations to SQL\n */\n compiler: UOWCompiler<CompiledQuery>;\n /**\n * UOW executor for running compiled queries\n */\n executor: UOWExecutor<CompiledQuery, unknown>;\n /**\n * UOW decoder for transforming raw results\n */\n decoder: UOWDecoder<unknown>;\n /**\n * Optional UOW configuration\n */\n uowConfig?: UnitOfWorkConfig;\n /**\n * Optional WeakMap for schema-to-namespace lookups\n */\n schemaNamespaceMap?: WeakMap<AnySchema, string | null>;\n}\n\n/**\n * Type guard to check if a query is a CompiledMutation\n */\nfunction isCompiledMutation(query: unknown): query is CompiledMutation<CompiledQuery> {\n return (\n query !== null &&\n typeof query === \"object\" &&\n \"expectedAffectedRows\" in query &&\n \"query\" in query\n );\n}\n\n/**\n * Type guard to check if a record has an id field\n */\nfunction hasIdField(record: unknown): record is { id: string | FragnoId } {\n return record !== null && typeof record === \"object\" && \"id\" in record;\n}\n\nclass UpdateManySpecialBuilder<TTable extends AnyTable> {\n #indexName?: ValidIndexName<TTable>;\n #condition?: unknown;\n #setValues?: TableToUpdateValues<TTable>;\n\n whereIndex<TIndexName extends ValidIndexName<TTable>>(\n indexName: TIndexName,\n condition?: unknown,\n ): this {\n this.#indexName = indexName;\n this.#condition = condition;\n return this;\n }\n\n set(values: TableToUpdateValues<TTable>): this {\n this.#setValues = values;\n return this;\n }\n\n getConfig() {\n return {\n indexName: this.#indexName,\n condition: this.#condition,\n setValues: this.#setValues,\n };\n }\n}\n\n/**\n * Creates a generic SQL-based query engine for the given schema using a UnitOfWorkFactory.\n *\n * This is the main entry point for creating a database query interface using a Unit of Work compiler.\n * It uses a compiler-based architecture where queries are compiled to SQL and then executed,\n * enabling features like SQL snapshot testing.\n *\n * @param schema - The database schema definition\n * @param factory - Factory containing compiler, executor, decoder, and optional configuration\n * @returns An SimpleQueryInterface instance for performing database operations\n *\n * @example\n * ```ts\n * const operationCompiler = new GenericSQLUOWOperationCompiler(driverConfig);\n * const factory: UnitOfWorkFactory = {\n * compiler: createUOWCompilerFromOperationCompiler(operationCompiler),\n * executor: createExecutor(sqlDriver),\n * decoder: createKyselyUOWDecoder(driverConfig.databaseType),\n * };\n * const queryEngine = fromUnitOfWorkCompiler(mySchema, factory);\n *\n * const users = await queryEngine.find('users', (b) =>\n * b.whereIndex('age').where((eb) => eb('age', '>', 18))\n * );\n * ```\n */\nexport function fromUnitOfWorkCompiler<T extends AnySchema>(\n schema: T,\n factory: UnitOfWorkFactory,\n): SimpleQueryInterface<T, UnitOfWorkConfig> {\n const { compiler, executor, decoder, uowConfig, schemaNamespaceMap } = factory;\n\n function createUOW(opts: { name?: string; config?: UnitOfWorkConfig }) {\n const { onQuery, ...restUowConfig } = opts.config ?? {};\n\n return new UnitOfWork(\n compiler,\n executor,\n decoder,\n opts.name,\n {\n ...restUowConfig,\n onQuery: onQuery\n ? (query) => {\n // Extract the actual query from CompiledMutation if needed\n const actualQuery = isCompiledMutation(query)\n ? query.query\n : (query as CompiledQuery);\n onQuery(actualQuery);\n }\n : undefined,\n },\n schemaNamespaceMap,\n ).forSchema(schema);\n }\n\n return {\n async find(tableName, builderFn) {\n const uow = createUOW({ config: uowConfig });\n uow.find(tableName, builderFn);\n const [result]: unknown[][] = await uow.executeRetrieve();\n return result ?? [];\n },\n\n async findWithCursor(tableName, builderFn) {\n const uow = createUOW({ config: uowConfig }).findWithCursor(tableName, builderFn);\n const [result] = await uow.executeRetrieve();\n // Result from findWithCursor is always a CursorResult - the UOW decoder handles the conversion\n return result as CursorResult<unknown>;\n },\n\n async findFirst(tableName, builderFn) {\n const uow = createUOW({ config: uowConfig });\n if (builderFn) {\n uow.find(tableName, (b) => {\n builderFn(b);\n return b.pageSize(1);\n });\n } else {\n uow.find(tableName, (b) => b.whereIndex(\"primary\").pageSize(1));\n }\n // executeRetrieve runs an array of `find` operation results, which each return an array of rows\n const [result]: unknown[][] = await uow.executeRetrieve();\n return result?.[0] ?? null;\n },\n\n async create(tableName, values) {\n const uow = createUOW({ config: uowConfig });\n uow.create(tableName, values);\n const { success } = await uow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to create record\");\n }\n\n const createdIds = uow.getCreatedIds();\n const createdId = createdIds[0];\n if (!createdId) {\n throw new Error(\"Failed to get created ID\");\n }\n return createdId;\n },\n\n async createMany(tableName, valuesArray) {\n const uow = createUOW({ config: uowConfig });\n for (const values of valuesArray) {\n uow.create(tableName, values);\n }\n const { success } = await uow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to create records\");\n }\n\n return uow.getCreatedIds();\n },\n\n async update(tableName, id, builderFn) {\n const uow = createUOW({ config: uowConfig });\n uow.update(tableName, id, builderFn);\n const { success } = await uow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to update record (version conflict or record not found)\");\n }\n },\n\n async updateMany(tableName, builderFn) {\n const table = schema.tables[tableName];\n if (!table) {\n throw new Error(`Table ${tableName} not found in schema`);\n }\n\n const specialBuilder = new UpdateManySpecialBuilder<typeof table>();\n builderFn(specialBuilder);\n\n const { indexName, condition, setValues } = specialBuilder.getConfig();\n\n if (!indexName) {\n throw new Error(\"whereIndex() must be called in updateMany\");\n }\n if (!setValues) {\n throw new Error(\"set() must be called in updateMany\");\n }\n\n const findUow = createUOW({ config: uowConfig });\n findUow.find(tableName, (b) => {\n // Condition might be null or undefined, only pass if defined and not null\n if (condition !== undefined && condition !== null) {\n // TypeScript can't infer the complex condition type from the builder\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return b.whereIndex(indexName, condition as any);\n }\n return b.whereIndex(indexName);\n });\n const [records]: unknown[][] = await findUow.executeRetrieve();\n\n if (!records || records.length === 0) {\n return;\n }\n\n const updateUow = createUOW({ config: uowConfig });\n for (const record of records) {\n if (!hasIdField(record)) {\n throw new Error(\"Record missing id field\");\n }\n updateUow.update(tableName, record.id, (b) => b.set(setValues));\n }\n const { success } = await updateUow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to update records (version conflict)\");\n }\n },\n\n async delete(tableName, id, builderFn) {\n const uow = createUOW({ config: uowConfig });\n uow.delete(tableName, id, builderFn);\n const { success } = await uow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to delete record (version conflict or record not found)\");\n }\n },\n\n async deleteMany(tableName, builderFn) {\n const findUow = createUOW({ config: uowConfig });\n findUow.find(tableName, builderFn);\n const [records]: unknown[][] = await findUow.executeRetrieve();\n\n if (!records || records.length === 0) {\n return;\n }\n\n const deleteUow = createUOW({ config: uowConfig });\n for (const record of records) {\n if (!hasIdField(record)) {\n throw new Error(\"Record missing id field\");\n }\n deleteUow.delete(tableName, record.id);\n }\n const { success } = await deleteUow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to delete records (version conflict)\");\n }\n },\n\n createUnitOfWork(name, nestedUowConfig) {\n return createUOW({\n name,\n config: {\n ...uowConfig,\n ...nestedUowConfig,\n },\n });\n },\n } as SimpleQueryInterface<T, UnitOfWorkConfig>;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"from-unit-of-work-compiler.js","names":["#indexName","#condition","#setValues"],"sources":["../../../src/adapters/shared/from-unit-of-work-compiler.ts"],"sourcesContent":["import type { CursorResult } from \"../../query/cursor\";\nimport { dbInterval, dbNow, type DbInterval, type DbIntervalInput } from \"../../query/db-now\";\nimport type {\n SimpleQueryInterface,\n TableToUpdateValues,\n SelectResult,\n ExtractJoinOut,\n ExtractSelect,\n SelectClause,\n} from \"../../query/simple-query-interface\";\nimport type {\n CompiledMutation,\n FindBuilder,\n UOWCompiler,\n UOWDecoder,\n UOWExecutor,\n UOWInstrumentation,\n ValidIndexName,\n UnitOfWorkConfig as BaseUnitOfWorkConfig,\n} from \"../../query/unit-of-work/unit-of-work\";\nimport { UnitOfWork } from \"../../query/unit-of-work/unit-of-work\";\nimport type { AnySchema, AnyTable, FragnoId } from \"../../schema/create\";\nimport type { CompiledQuery } from \"../../sql-driver/sql-driver\";\n\n/**\n * Configuration options for creating a Unit of Work with generic SQL\n */\nexport interface UnitOfWorkConfig {\n /**\n * Optional callback to receive compiled SQL queries for logging/debugging\n * This callback is invoked for each query as it's compiled\n */\n onQuery?: (query: CompiledQuery) => void;\n /**\n * If true, the query will not be executed and the query will be returned. Not respected for UOWs\n * since those have to be manually executed.\n */\n dryRun?: boolean;\n instrumentation?: UOWInstrumentation;\n}\n\n/**\n * Factory interface for creating Unit of Work instances\n */\nexport interface UnitOfWorkFactory {\n /**\n * UOW compiler for compiling operations to SQL\n */\n compiler: UOWCompiler<CompiledQuery>;\n /**\n * UOW executor for running compiled queries\n */\n executor: UOWExecutor<CompiledQuery, unknown>;\n /**\n * UOW decoder for transforming raw results\n */\n decoder: UOWDecoder<unknown>;\n /**\n * Optional UOW configuration\n */\n uowConfig?: UnitOfWorkConfig;\n /**\n * Optional WeakMap for schema-to-namespace lookups\n */\n schemaNamespaceMap?: WeakMap<AnySchema, string | null>;\n}\n\n/**\n * Type guard to check if a query is a CompiledMutation\n */\nfunction isCompiledMutation(query: unknown): query is CompiledMutation<CompiledQuery> {\n return (\n query !== null &&\n typeof query === \"object\" &&\n \"expectedAffectedRows\" in query &&\n \"query\" in query\n );\n}\n\n/**\n * Type guard to check if a record has an id field\n */\nfunction hasIdField(record: unknown): record is { id: string | FragnoId } {\n return record !== null && typeof record === \"object\" && \"id\" in record;\n}\n\nclass UpdateManySpecialBuilder<TTable extends AnyTable> {\n #indexName?: ValidIndexName<TTable>;\n #condition?: unknown;\n #setValues?: TableToUpdateValues<TTable>;\n\n whereIndex<TIndexName extends ValidIndexName<TTable>>(\n indexName: TIndexName,\n condition?: unknown,\n ): this {\n this.#indexName = indexName;\n this.#condition = condition;\n return this;\n }\n\n set(values: TableToUpdateValues<TTable>): this {\n this.#setValues = values;\n return this;\n }\n\n now() {\n return dbNow();\n }\n\n interval(input: DbIntervalInput): DbInterval {\n return dbInterval(input);\n }\n\n getConfig() {\n return {\n indexName: this.#indexName,\n condition: this.#condition,\n setValues: this.#setValues,\n };\n }\n}\n\n/**\n * Creates a generic SQL-based query engine for the given schema using a UnitOfWorkFactory.\n *\n * This is the main entry point for creating a database query interface using a Unit of Work compiler.\n * It uses a compiler-based architecture where queries are compiled to SQL and then executed,\n * enabling features like SQL snapshot testing.\n *\n * @param schema - The database schema definition\n * @param factory - Factory containing compiler, executor, decoder, and optional configuration\n * @returns An SimpleQueryInterface instance for performing database operations\n *\n * @example\n * ```ts\n * const operationCompiler = new GenericSQLUOWOperationCompiler(driverConfig);\n * const factory: UnitOfWorkFactory = {\n * compiler: createUOWCompilerFromOperationCompiler(operationCompiler),\n * executor: createExecutor(sqlDriver),\n * decoder: createKyselyUOWDecoder(driverConfig.databaseType),\n * };\n * const queryEngine = fromUnitOfWorkCompiler(mySchema, factory);\n *\n * const users = await queryEngine.find('users', (b) =>\n * b.whereIndex('age').where((eb) => eb('age', '>', 18))\n * );\n * ```\n */\nexport function fromUnitOfWorkCompiler<T extends AnySchema>(\n schema: T,\n factory: UnitOfWorkFactory,\n): SimpleQueryInterface<T, UnitOfWorkConfig> {\n const { compiler, executor, decoder, uowConfig, schemaNamespaceMap } = factory;\n\n function normalizeUowConfig(config?: UnitOfWorkConfig): BaseUnitOfWorkConfig | undefined {\n if (!config) {\n return undefined;\n }\n const { onQuery, ...restUowConfig } = config;\n return {\n ...restUowConfig,\n onQuery: onQuery\n ? (query) => {\n // Extract the actual query from CompiledMutation if needed\n const actualQuery = isCompiledMutation(query) ? query.query : (query as CompiledQuery);\n onQuery(actualQuery);\n }\n : undefined,\n };\n }\n\n function createBaseUow(opts: { name?: string; config?: UnitOfWorkConfig }) {\n return new UnitOfWork(\n compiler,\n executor,\n decoder,\n opts.name,\n normalizeUowConfig(opts.config),\n schemaNamespaceMap,\n );\n }\n\n function createUOW(opts: { name?: string; config?: UnitOfWorkConfig }) {\n return createBaseUow(opts).forSchema(schema);\n }\n\n async function find<TableName extends keyof T[\"tables\"] & string, const TBuilderResult>(\n tableName: TableName,\n builderFn: (builder: Omit<FindBuilder<T[\"tables\"][TableName]>, \"build\">) => TBuilderResult,\n ): Promise<\n SelectResult<\n T[\"tables\"][TableName],\n ExtractJoinOut<TBuilderResult>,\n Extract<ExtractSelect<TBuilderResult>, SelectClause<T[\"tables\"][TableName]>>\n >[]\n >;\n async function find<TableName extends keyof T[\"tables\"] & string>(\n tableName: TableName,\n ): Promise<SelectResult<T[\"tables\"][TableName], {}, true>[]>;\n async function find<TableName extends keyof T[\"tables\"] & string, const TBuilderResult>(\n tableName: TableName,\n builderFn?: (builder: Omit<FindBuilder<T[\"tables\"][TableName]>, \"build\">) => TBuilderResult,\n ): Promise<\n SelectResult<\n T[\"tables\"][TableName],\n ExtractJoinOut<TBuilderResult>,\n Extract<ExtractSelect<TBuilderResult>, SelectClause<T[\"tables\"][TableName]>>\n >[]\n > {\n const uow = createUOW({ config: uowConfig });\n if (builderFn) {\n uow.find(tableName, builderFn);\n } else {\n uow.find(tableName);\n }\n const [result]: unknown[][] = await uow.executeRetrieve();\n return (result ?? []) as SelectResult<\n T[\"tables\"][TableName],\n ExtractJoinOut<TBuilderResult>,\n Extract<ExtractSelect<TBuilderResult>, SelectClause<T[\"tables\"][TableName]>>\n >[];\n }\n\n async function findWithCursor<TableName extends keyof T[\"tables\"] & string, const TBuilderResult>(\n tableName: TableName,\n builderFn: (builder: Omit<FindBuilder<T[\"tables\"][TableName]>, \"build\">) => TBuilderResult,\n ): Promise<\n CursorResult<\n SelectResult<\n T[\"tables\"][TableName],\n ExtractJoinOut<TBuilderResult>,\n Extract<ExtractSelect<TBuilderResult>, SelectClause<T[\"tables\"][TableName]>>\n >\n >\n > {\n const uow = createUOW({ config: uowConfig }).findWithCursor(tableName, builderFn);\n const [result] = await uow.executeRetrieve();\n // Result from findWithCursor is always a CursorResult - the UOW decoder handles the conversion\n return result as CursorResult<\n SelectResult<\n T[\"tables\"][TableName],\n ExtractJoinOut<TBuilderResult>,\n Extract<ExtractSelect<TBuilderResult>, SelectClause<T[\"tables\"][TableName]>>\n >\n >;\n }\n\n async function findFirst<TableName extends keyof T[\"tables\"] & string, const TBuilderResult>(\n tableName: TableName,\n builderFn: (builder: Omit<FindBuilder<T[\"tables\"][TableName]>, \"build\">) => TBuilderResult,\n ): Promise<SelectResult<\n T[\"tables\"][TableName],\n ExtractJoinOut<TBuilderResult>,\n Extract<ExtractSelect<TBuilderResult>, SelectClause<T[\"tables\"][TableName]>>\n > | null>;\n async function findFirst<TableName extends keyof T[\"tables\"] & string>(\n tableName: TableName,\n ): Promise<SelectResult<T[\"tables\"][TableName], {}, true> | null>;\n async function findFirst<TableName extends keyof T[\"tables\"] & string, const TBuilderResult>(\n tableName: TableName,\n builderFn?: (builder: Omit<FindBuilder<T[\"tables\"][TableName]>, \"build\">) => TBuilderResult,\n ): Promise<SelectResult<\n T[\"tables\"][TableName],\n ExtractJoinOut<TBuilderResult>,\n Extract<ExtractSelect<TBuilderResult>, SelectClause<T[\"tables\"][TableName]>>\n > | null> {\n const uow = createUOW({ config: uowConfig });\n if (builderFn) {\n uow.find(tableName, (b) => {\n builderFn(b);\n return b.pageSize(1);\n });\n } else {\n uow.find(tableName, (b) => b.whereIndex(\"primary\").pageSize(1));\n }\n // executeRetrieve runs an array of `find` operation results, which each return an array of rows\n const [result]: unknown[][] = await uow.executeRetrieve();\n return (result?.[0] ?? null) as SelectResult<\n T[\"tables\"][TableName],\n ExtractJoinOut<TBuilderResult>,\n Extract<ExtractSelect<TBuilderResult>, SelectClause<T[\"tables\"][TableName]>>\n > | null;\n }\n\n const queryEngine: SimpleQueryInterface<T, UnitOfWorkConfig> = {\n find,\n findWithCursor,\n findFirst,\n\n async create(tableName, values) {\n const uow = createUOW({ config: uowConfig });\n uow.create(tableName, values);\n const { success } = await uow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to create record\");\n }\n\n const createdIds = uow.getCreatedIds();\n const createdId = createdIds[0];\n if (!createdId) {\n throw new Error(\"Failed to get created ID\");\n }\n return createdId;\n },\n\n async createMany(tableName, valuesArray) {\n const uow = createUOW({ config: uowConfig });\n for (const values of valuesArray) {\n uow.create(tableName, values);\n }\n const { success } = await uow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to create records\");\n }\n\n return uow.getCreatedIds();\n },\n\n async update(tableName, id, builderFn) {\n const uow = createUOW({ config: uowConfig });\n uow.update(tableName, id, builderFn);\n const { success } = await uow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to update record (version conflict or record not found)\");\n }\n },\n\n async updateMany(tableName, builderFn) {\n const table = schema.tables[tableName];\n if (!table) {\n throw new Error(`Table ${tableName} not found in schema`);\n }\n\n const specialBuilder = new UpdateManySpecialBuilder<typeof table>();\n builderFn(specialBuilder);\n\n const { indexName, condition, setValues } = specialBuilder.getConfig();\n\n if (!indexName) {\n throw new Error(\"whereIndex() must be called in updateMany\");\n }\n if (!setValues) {\n throw new Error(\"set() must be called in updateMany\");\n }\n\n const findUow = createUOW({ config: uowConfig });\n findUow.find(tableName, (b) => {\n // Condition might be null or undefined, only pass if defined and not null\n if (condition !== undefined && condition !== null) {\n // TypeScript can't infer the complex condition type from the builder\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return b.whereIndex(indexName, condition as any);\n }\n return b.whereIndex(indexName);\n });\n const [records]: unknown[][] = await findUow.executeRetrieve();\n\n if (!records || records.length === 0) {\n return;\n }\n\n const updateUow = createUOW({ config: uowConfig });\n for (const record of records) {\n if (!hasIdField(record)) {\n throw new Error(\"Record missing id field\");\n }\n updateUow.update(tableName, record.id, (b) => b.set(setValues));\n }\n const { success } = await updateUow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to update records (version conflict)\");\n }\n },\n\n async delete(tableName, id, builderFn?) {\n const uow = createUOW({ config: uowConfig });\n uow.delete(tableName, id, builderFn);\n const { success } = await uow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to delete record (version conflict or record not found)\");\n }\n },\n\n async deleteMany(tableName, builderFn) {\n const findUow = createUOW({ config: uowConfig });\n findUow.find(tableName, builderFn);\n const [records]: unknown[][] = await findUow.executeRetrieve();\n\n if (!records || records.length === 0) {\n return;\n }\n\n const deleteUow = createUOW({ config: uowConfig });\n for (const record of records) {\n if (!hasIdField(record)) {\n throw new Error(\"Record missing id field\");\n }\n deleteUow.delete(tableName, record.id);\n }\n const { success } = await deleteUow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to delete records (version conflict)\");\n }\n },\n\n createUnitOfWork(name, nestedUowConfig) {\n return createUOW({\n name,\n config: {\n ...uowConfig,\n ...nestedUowConfig,\n },\n });\n },\n\n createBaseUnitOfWork(name, nestedUowConfig) {\n return createBaseUow({\n name,\n config: {\n ...uowConfig,\n ...nestedUowConfig,\n },\n });\n },\n };\n return queryEngine;\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"uow-operation-compiler.js","names":["#driverConfig","#resolverFactory","exhaustiveCheck: never"],"sources":["../../../src/adapters/shared/uow-operation-compiler.ts"],"sourcesContent":["import type { AnyColumn, AnySchema, AnyTable, FragnoId } from \"../../schema/create\";\nimport type { Condition } from \"../../query/condition-builder\";\nimport type {\n CompiledMutation,\n RetrievalOperation,\n MutationOperation,\n UOWCompiler,\n} from \"../../query/unit-of-work/unit-of-work\";\nimport { Cursor } from \"../../query/cursor\";\nimport type { DriverConfig } from \"../generic-sql/driver-config\";\nimport { createNamingResolver, type NamingResolver } from \"../../naming/sql-naming\";\n\n/**\n * Options for compiling a find operation with cursor pagination\n */\nexport interface FindCompilationOptions {\n /** Index columns used for ordering */\n indexColumns: AnyColumn[];\n /** Order direction for the index */\n orderDirection: \"asc\" | \"desc\";\n /** User-provided where condition */\n userWhere: Condition | boolean | undefined;\n /** Cursor string or Cursor object for pagination (after) */\n after?: string | Cursor;\n /** Cursor string or Cursor object for pagination (before) */\n before?: string | Cursor;\n /** Page size for pagination */\n pageSize?: number;\n /** Whether this is a high-level cursor API call (affects limit calculation) */\n withCursor?: boolean;\n /** Driver config for cursor serialization */\n driverConfig: DriverConfig;\n}\n\n/**\n * Result of cursor condition building\n */\nexport interface CursorConditionResult {\n /** The combined where condition (user where + cursor condition) */\n where: Condition | undefined;\n /** The effective limit to use (may be pageSize + 1 for cursor detection) */\n limit: number | undefined;\n}\n\n/**\n * Abstract base class for Unit of Work operation compilers\n *\n * This class provides a structure and utilities for implementing UOW compilers\n * for different ORM/query builders (Kysely, Drizzle, etc.).\n *\n * Subclasses must implement the abstract methods for each operation type,\n * and can use the provided utility methods for common tasks.\n *\n * @template TCompiledQuery - The type of compiled query for the target ORM\n */\nexport abstract class UOWOperationCompiler<TCompiledQuery> {\n #driverConfig: DriverConfig;\n #resolverFactory?: (schema: AnySchema, namespace: string | null) => NamingResolver;\n\n constructor(\n driverConfig: DriverConfig,\n resolverFactory?: (schema: AnySchema, namespace: string | null) => NamingResolver,\n ) {\n this.#driverConfig = driverConfig;\n this.#resolverFactory = resolverFactory;\n }\n\n protected get driverConfig(): DriverConfig {\n return this.#driverConfig;\n }\n\n protected get resolverFactory():\n | ((schema: AnySchema, namespace: string | null) => NamingResolver)\n | undefined {\n return this.#resolverFactory;\n }\n\n abstract compileCount(\n op: RetrievalOperation<AnySchema> & { type: \"count\" },\n ): TCompiledQuery | null;\n\n abstract compileFind(op: RetrievalOperation<AnySchema> & { type: \"find\" }): TCompiledQuery | null;\n\n /**\n * Compile a create operation\n */\n abstract compileCreate(\n op: MutationOperation<AnySchema> & { type: \"create\" },\n ): CompiledMutation<TCompiledQuery> | null;\n\n abstract compileUpdate(\n op: MutationOperation<AnySchema> & { type: \"update\" },\n ): CompiledMutation<TCompiledQuery> | null;\n\n abstract compileDelete(\n op: MutationOperation<AnySchema> & { type: \"delete\" },\n ): CompiledMutation<TCompiledQuery> | null;\n\n abstract compileCheck(\n op: MutationOperation<AnySchema> & { type: \"check\" },\n ): CompiledMutation<TCompiledQuery> | null;\n\n // ==================== Utility Methods ====================\n\n /**\n * Get the mapper for a specific operation based on its namespace\n */\n protected getNamingResolver(\n schema: AnySchema,\n namespace: string | null | undefined,\n ): NamingResolver {\n if (this.#resolverFactory) {\n return this.#resolverFactory(schema, namespace ?? null);\n }\n return createNamingResolver(\n schema,\n namespace ?? null,\n this.#driverConfig.defaultNamingStrategy,\n );\n }\n\n /**\n * Get a table from a schema by name\n * @throws Error if table is not found\n */\n protected getTable(schema: AnySchema, tableName: string): AnyTable {\n const table = schema.tables[tableName];\n if (!table) {\n throw new Error(`Invalid table name ${tableName}.`);\n }\n return table;\n }\n\n /**\n * Get the version to check for a given ID and checkVersion flag\n * @returns The version to check or undefined if no check is required\n * @throws Error if the ID is a string and checkVersion is true\n */\n protected getVersionToCheck(id: FragnoId | string, checkVersion: boolean): number | undefined {\n if (!checkVersion) {\n return undefined;\n }\n\n if (typeof id === \"string\") {\n throw new Error(\n `Cannot use checkVersion with a string ID. Version checking requires a FragnoId with version information.`,\n );\n }\n\n return id.version;\n }\n\n /**\n * Extract external ID from FragnoId or string\n */\n protected getExternalId(id: FragnoId | string): string {\n return typeof id === \"string\" ? id : id.externalId;\n }\n\n /**\n * Get the physical table name for an operation, applying namespace mapping if needed\n */\n protected getPhysicalTableName(\n schema: AnySchema,\n logicalName: string,\n namespace: string | undefined,\n ): string {\n const resolver = this.getNamingResolver(schema, namespace ?? null);\n return resolver.getTableName(logicalName);\n }\n}\n\n/**\n * Creates a UOWCompiler from a UOWOperationCompiler by dispatching operations\n * to the appropriate specific compilation methods based on operation type.\n *\n * @template TCompiledQuery - The type of compiled query for the target ORM\n * @param operationCompiler - The operation compiler to wrap\n * @returns A UOWCompiler instance that delegates to the operation compiler\n */\nexport function createUOWCompilerFromOperationCompiler<TCompiledQuery>(\n operationCompiler: UOWOperationCompiler<TCompiledQuery>,\n): UOWCompiler<TCompiledQuery> {\n return {\n compileRetrievalOperation(op: RetrievalOperation<AnySchema>): TCompiledQuery | null {\n switch (op.type) {\n case \"count\":\n return operationCompiler.compileCount(op);\n case \"find\":\n return operationCompiler.compileFind(op);\n default: {\n const exhaustiveCheck: never = op;\n throw new Error(\n `Unknown retrieval operation type: ${(exhaustiveCheck as RetrievalOperation<AnySchema>).type}`,\n );\n }\n }\n },\n\n compileMutationOperation(\n op: MutationOperation<AnySchema>,\n ): CompiledMutation<TCompiledQuery> | null {\n switch (op.type) {\n case \"create\":\n return operationCompiler.compileCreate(op);\n case \"update\":\n return operationCompiler.compileUpdate(op);\n case \"delete\":\n return operationCompiler.compileDelete(op);\n case \"check\":\n return operationCompiler.compileCheck(op);\n default: {\n const exhaustiveCheck: never = op;\n throw new Error(\n `Unknown mutation operation type: ${(exhaustiveCheck as MutationOperation<AnySchema>).type}`,\n );\n }\n }\n },\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;AAuDA,IAAsB,uBAAtB,MAA2D;CACzD;CACA;CAEA,YACE,cACA,iBACA;AACA,QAAKA,eAAgB;AACrB,QAAKC,kBAAmB;;CAG1B,IAAc,eAA6B;AACzC,SAAO,MAAKD;;CAGd,IAAc,kBAEA;AACZ,SAAO,MAAKC;;;;;CAiCd,AAAU,kBACR,QACA,WACgB;AAChB,MAAI,MAAKA,gBACP,QAAO,MAAKA,gBAAiB,QAAQ,aAAa,KAAK;AAEzD,SAAO,qBACL,QACA,aAAa,MACb,MAAKD,aAAc,sBACpB;;;;;;CAOH,AAAU,SAAS,QAAmB,WAA6B;EACjE,MAAM,QAAQ,OAAO,OAAO;AAC5B,MAAI,CAAC,MACH,OAAM,IAAI,MAAM,sBAAsB,UAAU,GAAG;AAErD,SAAO;;;;;;;CAQT,AAAU,kBAAkB,IAAuB,cAA2C;AAC5F,MAAI,CAAC,aACH;AAGF,MAAI,OAAO,OAAO,SAChB,OAAM,IAAI,MACR,2GACD;AAGH,SAAO,GAAG;;;;;CAMZ,AAAU,cAAc,IAA+B;AACrD,SAAO,OAAO,OAAO,WAAW,KAAK,GAAG;;;;;CAM1C,AAAU,qBACR,QACA,aACA,WACQ;AAER,SADiB,KAAK,kBAAkB,QAAQ,aAAa,KAAK,CAClD,aAAa,YAAY;;;;;;;;;;;AAY7C,SAAgB,uCACd,mBAC6B;AAC7B,QAAO;EACL,0BAA0B,IAA0D;AAClF,WAAQ,GAAG,MAAX;IACE,KAAK,QACH,QAAO,kBAAkB,aAAa,GAAG;IAC3C,KAAK,OACH,QAAO,kBAAkB,YAAY,GAAG;IAC1C,SAAS;KACP,MAAME,kBAAyB;AAC/B,WAAM,IAAI,MACR,qCAAsC,gBAAkD,OACzF;;;;EAKP,yBACE,IACyC;AACzC,WAAQ,GAAG,MAAX;IACE,KAAK,SACH,QAAO,kBAAkB,cAAc,GAAG;IAC5C,KAAK,SACH,QAAO,kBAAkB,cAAc,GAAG;IAC5C,KAAK,SACH,QAAO,kBAAkB,cAAc,GAAG;IAC5C,KAAK,QACH,QAAO,kBAAkB,aAAa,GAAG;IAC3C,SAAS;KACP,MAAMA,kBAAyB;AAC/B,WAAM,IAAI,MACR,oCAAqC,gBAAiD,OACvF;;;;EAIR"}
1
+ {"version":3,"file":"uow-operation-compiler.js","names":["#driverConfig","#resolverFactory","exhaustiveCheck: never"],"sources":["../../../src/adapters/shared/uow-operation-compiler.ts"],"sourcesContent":["import { createNamingResolver, type NamingResolver } from \"../../naming/sql-naming\";\nimport type { Condition } from \"../../query/condition-builder\";\nimport { Cursor } from \"../../query/cursor\";\nimport type {\n CompiledMutation,\n RetrievalOperation,\n MutationOperation,\n UOWCompiler,\n} from \"../../query/unit-of-work/unit-of-work\";\nimport type { AnyColumn, AnySchema, AnyTable, FragnoId } from \"../../schema/create\";\nimport type { DriverConfig } from \"../generic-sql/driver-config\";\n\n/**\n * Options for compiling a find operation with cursor pagination\n */\nexport interface FindCompilationOptions {\n /** Index columns used for ordering */\n indexColumns: AnyColumn[];\n /** Order direction for the index */\n orderDirection: \"asc\" | \"desc\";\n /** User-provided where condition */\n userWhere: Condition | boolean | undefined;\n /** Cursor string or Cursor object for pagination (after) */\n after?: string | Cursor;\n /** Cursor string or Cursor object for pagination (before) */\n before?: string | Cursor;\n /** Page size for pagination */\n pageSize?: number;\n /** Whether this is a high-level cursor API call (affects limit calculation) */\n withCursor?: boolean;\n /** Driver config for cursor serialization */\n driverConfig: DriverConfig;\n}\n\n/**\n * Result of cursor condition building\n */\nexport interface CursorConditionResult {\n /** The combined where condition (user where + cursor condition) */\n where: Condition | undefined;\n /** The effective limit to use (may be pageSize + 1 for cursor detection) */\n limit: number | undefined;\n}\n\n/**\n * Abstract base class for Unit of Work operation compilers\n *\n * This class provides a structure and utilities for implementing UOW compilers\n * for different ORM/query builders (Kysely, Drizzle, etc.).\n *\n * Subclasses must implement the abstract methods for each operation type,\n * and can use the provided utility methods for common tasks.\n *\n * @template TCompiledQuery - The type of compiled query for the target ORM\n */\nexport abstract class UOWOperationCompiler<TCompiledQuery> {\n #driverConfig: DriverConfig;\n #resolverFactory?: (schema: AnySchema, namespace: string | null) => NamingResolver;\n\n constructor(\n driverConfig: DriverConfig,\n resolverFactory?: (schema: AnySchema, namespace: string | null) => NamingResolver,\n ) {\n this.#driverConfig = driverConfig;\n this.#resolverFactory = resolverFactory;\n }\n\n protected get driverConfig(): DriverConfig {\n return this.#driverConfig;\n }\n\n protected get resolverFactory():\n | ((schema: AnySchema, namespace: string | null) => NamingResolver)\n | undefined {\n return this.#resolverFactory;\n }\n\n abstract compileCount(\n op: RetrievalOperation<AnySchema> & { type: \"count\" },\n ): TCompiledQuery | null;\n\n abstract compileFind(op: RetrievalOperation<AnySchema> & { type: \"find\" }): TCompiledQuery | null;\n\n /**\n * Compile a create operation\n */\n abstract compileCreate(\n op: MutationOperation<AnySchema> & { type: \"create\" },\n ): CompiledMutation<TCompiledQuery> | null;\n\n abstract compileUpdate(\n op: MutationOperation<AnySchema> & { type: \"update\" },\n ): CompiledMutation<TCompiledQuery> | null;\n\n abstract compileDelete(\n op: MutationOperation<AnySchema> & { type: \"delete\" },\n ): CompiledMutation<TCompiledQuery> | null;\n\n abstract compileCheck(\n op: MutationOperation<AnySchema> & { type: \"check\" },\n ): CompiledMutation<TCompiledQuery> | null;\n\n // ==================== Utility Methods ====================\n\n /**\n * Get the mapper for a specific operation based on its namespace\n */\n protected getNamingResolver(\n schema: AnySchema,\n namespace: string | null | undefined,\n ): NamingResolver {\n if (this.#resolverFactory) {\n return this.#resolverFactory(schema, namespace ?? null);\n }\n return createNamingResolver(\n schema,\n namespace ?? null,\n this.#driverConfig.defaultNamingStrategy,\n );\n }\n\n /**\n * Get a table from a schema by name\n * @throws Error if table is not found\n */\n protected getTable(schema: AnySchema, tableName: string): AnyTable {\n const table = schema.tables[tableName];\n if (!table) {\n throw new Error(`Invalid table name ${tableName}.`);\n }\n return table;\n }\n\n /**\n * Get the version to check for a given ID and checkVersion flag\n * @returns The version to check or undefined if no check is required\n * @throws Error if the ID is a string and checkVersion is true\n */\n protected getVersionToCheck(id: FragnoId | string, checkVersion: boolean): number | undefined {\n if (!checkVersion) {\n return undefined;\n }\n\n if (typeof id === \"string\") {\n throw new Error(\n `Cannot use checkVersion with a string ID. Version checking requires a FragnoId with version information.`,\n );\n }\n\n return id.version;\n }\n\n /**\n * Extract external ID from FragnoId or string\n */\n protected getExternalId(id: FragnoId | string): string {\n return typeof id === \"string\" ? id : id.externalId;\n }\n\n /**\n * Get the physical table name for an operation, applying namespace mapping if needed\n */\n protected getPhysicalTableName(\n schema: AnySchema,\n logicalName: string,\n namespace: string | undefined,\n ): string {\n const resolver = this.getNamingResolver(schema, namespace ?? null);\n return resolver.getTableName(logicalName);\n }\n}\n\n/**\n * Creates a UOWCompiler from a UOWOperationCompiler by dispatching operations\n * to the appropriate specific compilation methods based on operation type.\n *\n * @template TCompiledQuery - The type of compiled query for the target ORM\n * @param operationCompiler - The operation compiler to wrap\n * @returns A UOWCompiler instance that delegates to the operation compiler\n */\nexport function createUOWCompilerFromOperationCompiler<TCompiledQuery>(\n operationCompiler: UOWOperationCompiler<TCompiledQuery>,\n): UOWCompiler<TCompiledQuery> {\n return {\n compileRetrievalOperation(op: RetrievalOperation<AnySchema>): TCompiledQuery | null {\n switch (op.type) {\n case \"count\":\n return operationCompiler.compileCount(op);\n case \"find\":\n return operationCompiler.compileFind(op);\n default: {\n const exhaustiveCheck: never = op;\n throw new Error(\n `Unknown retrieval operation type: ${(exhaustiveCheck as RetrievalOperation<AnySchema>).type}`,\n );\n }\n }\n },\n\n compileMutationOperation(\n op: MutationOperation<AnySchema>,\n ): CompiledMutation<TCompiledQuery> | null {\n switch (op.type) {\n case \"create\":\n return operationCompiler.compileCreate(op);\n case \"update\":\n return operationCompiler.compileUpdate(op);\n case \"delete\":\n return operationCompiler.compileDelete(op);\n case \"check\":\n return operationCompiler.compileCheck(op);\n default: {\n const exhaustiveCheck: never = op;\n throw new Error(\n `Unknown mutation operation type: ${(exhaustiveCheck as MutationOperation<AnySchema>).type}`,\n );\n }\n }\n },\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;AAuDA,IAAsB,uBAAtB,MAA2D;CACzD;CACA;CAEA,YACE,cACA,iBACA;AACA,QAAKA,eAAgB;AACrB,QAAKC,kBAAmB;;CAG1B,IAAc,eAA6B;AACzC,SAAO,MAAKD;;CAGd,IAAc,kBAEA;AACZ,SAAO,MAAKC;;;;;CAiCd,AAAU,kBACR,QACA,WACgB;AAChB,MAAI,MAAKA,gBACP,QAAO,MAAKA,gBAAiB,QAAQ,aAAa,KAAK;AAEzD,SAAO,qBACL,QACA,aAAa,MACb,MAAKD,aAAc,sBACpB;;;;;;CAOH,AAAU,SAAS,QAAmB,WAA6B;EACjE,MAAM,QAAQ,OAAO,OAAO;AAC5B,MAAI,CAAC,MACH,OAAM,IAAI,MAAM,sBAAsB,UAAU,GAAG;AAErD,SAAO;;;;;;;CAQT,AAAU,kBAAkB,IAAuB,cAA2C;AAC5F,MAAI,CAAC,aACH;AAGF,MAAI,OAAO,OAAO,SAChB,OAAM,IAAI,MACR,2GACD;AAGH,SAAO,GAAG;;;;;CAMZ,AAAU,cAAc,IAA+B;AACrD,SAAO,OAAO,OAAO,WAAW,KAAK,GAAG;;;;;CAM1C,AAAU,qBACR,QACA,aACA,WACQ;AAER,SADiB,KAAK,kBAAkB,QAAQ,aAAa,KAAK,CAClD,aAAa,YAAY;;;;;;;;;;;AAY7C,SAAgB,uCACd,mBAC6B;AAC7B,QAAO;EACL,0BAA0B,IAA0D;AAClF,WAAQ,GAAG,MAAX;IACE,KAAK,QACH,QAAO,kBAAkB,aAAa,GAAG;IAC3C,KAAK,OACH,QAAO,kBAAkB,YAAY,GAAG;IAC1C,SAAS;KACP,MAAME,kBAAyB;AAC/B,WAAM,IAAI,MACR,qCAAsC,gBAAkD,OACzF;;;;EAKP,yBACE,IACyC;AACzC,WAAQ,GAAG,MAAX;IACE,KAAK,SACH,QAAO,kBAAkB,cAAc,GAAG;IAC5C,KAAK,SACH,QAAO,kBAAkB,cAAc,GAAG;IAC5C,KAAK,SACH,QAAO,kBAAkB,cAAc,GAAG;IAC5C,KAAK,QACH,QAAO,kBAAkB,aAAa,GAAG;IAC3C,SAAS;KACP,MAAMA,kBAAyB;AAC/B,WAAM,IAAI,MACR,oCAAqC,gBAAiD,OACvF;;;;EAIR"}
@@ -0,0 +1,61 @@
1
+ import { AnySchema } from "../schema/create.js";
2
+ import { SqlNamingStrategy } from "../naming/sql-naming.js";
3
+ import { SQLiteStorageMode } from "./generic-sql/sqlite-storage.js";
4
+ import { IUnitOfWork } from "../query/unit-of-work/unit-of-work.js";
5
+ import { SimpleQueryInterface } from "../query/simple-query-interface.js";
6
+ import { SQLProvider } from "../shared/providers.js";
7
+ import { PreparedMigrations } from "./generic-sql/migration/prepared-migrations.js";
8
+ import { RequestContextStorage } from "@fragno-dev/core/internal/request-context-storage";
9
+
10
+ //#region src/adapters/adapters.d.ts
11
+ declare const fragnoDatabaseAdapterNameFakeSymbol: "$fragno-database-adapter-name";
12
+ declare const fragnoDatabaseAdapterVersionFakeSymbol: "$fragno-database-adapter-version";
13
+ /**
14
+ * Storage type for database context - stores the Unit of Work.
15
+ * This is shared across all fragments using the same adapter.
16
+ */
17
+ type DatabaseContextStorage = {
18
+ uow: IUnitOfWork;
19
+ };
20
+ type SQLiteProfile = "default" | "prisma";
21
+ interface DatabaseAdapterMetadata {
22
+ databaseType?: SQLProvider;
23
+ sqliteProfile?: SQLiteProfile;
24
+ sqliteStorageMode?: SQLiteStorageMode;
25
+ }
26
+ interface DatabaseAdapter<TUOWConfig = void> {
27
+ [fragnoDatabaseAdapterNameFakeSymbol]: string;
28
+ [fragnoDatabaseAdapterVersionFakeSymbol]: number;
29
+ /**
30
+ * Request context storage shared across all fragments using this adapter.
31
+ * This allows multiple fragments to participate in the same Unit of Work.
32
+ */
33
+ readonly contextStorage: RequestContextStorage<DatabaseContextStorage>;
34
+ /**
35
+ * Optional adapter override used for durable hook processing.
36
+ * Use this when the public adapter wraps another adapter (e.g. model checker).
37
+ */
38
+ getHookProcessingAdapter?: () => DatabaseAdapter<TUOWConfig>;
39
+ /**
40
+ * Get current schema version, undefined if not initialized.
41
+ */
42
+ getSchemaVersion(namespace: string): Promise<string | undefined>;
43
+ /**
44
+ * Optional metadata used by schema output tooling.
45
+ */
46
+ readonly adapterMetadata?: DatabaseAdapterMetadata;
47
+ /**
48
+ * Naming strategy used for physical SQL identifiers.
49
+ */
50
+ readonly namingStrategy: SqlNamingStrategy;
51
+ /**
52
+ * @deprecated Avoid using query engines directly in fragment code. Prefer handlerTx/serviceTx.
53
+ */
54
+ createQueryEngine: <const T extends AnySchema>(schema: T, namespace: string | null) => SimpleQueryInterface<T, TUOWConfig>;
55
+ prepareMigrations?: <const T extends AnySchema>(schema: T, namespace: string | null) => PreparedMigrations;
56
+ isConnectionHealthy: () => Promise<boolean>;
57
+ close: () => Promise<void>;
58
+ }
59
+ //#endregion
60
+ export { DatabaseAdapter };
61
+ //# sourceMappingURL=adapters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapters.d.ts","names":[],"sources":["../../../src/adapters/adapters.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;cAUa;cACA;AADb;AACA;AAMA;AAIA;AAEiB,KANL,sBAAA,GAM4B;EACvB,GAAA,EANV,WAMU;CACC;AACI,KALV,aAAA,GAKU,SAAA,GAAA,QAAA;AAAiB,UAHtB,uBAAA,CAGsB;EAGtB,YAAA,CAAA,EALA,WAKe;EAC7B,aAAA,CAAA,EALe,aAKf;EACA,iBAAA,CAAA,EALmB,iBAKnB;;AAMwB,UARV,eAQU,CAAA,aAAA,IAAA,CAAA,CAAA;EAMwB,CAbhD,mCAAA,CAagD,EAAA,MAAA;EAAhB,CAZhC,sCAAA,CAYgC,EAAA,MAAA;EAKI;;;;EAgB3B,SAAA,cAAA,EA3Be,qBA2Bf,CA3BqC,sBA2BrC,CAAA;EAEgB;;;;EAGhB,wBAAA,CAAA,EAAA,GAAA,GA1BuB,eA0BvB,CA1BuC,UA0BvC,CAAA;EAEL;;;EAIe,gBAAA,CAAA,SAAA,EAAA,MAAA,CAAA,EA3BiB,OA2BjB,CAAA,MAAA,GAAA,SAAA,CAAA;;;;6BAtBO;;;;2BAKF;;;;sCAKW,mBAC1B,gCAEL,qBAAqB,GAAG;uCAEQ,mBAC3B,gCAEL;6BAEsB;eAEd"}
@@ -0,0 +1,15 @@
1
+ import { CompiledQuery } from "kysely";
2
+
3
+ //#region src/adapters/generic-sql/migration/executor.d.ts
4
+
5
+ /**
6
+ * Compiled migration containing all SQL statements to execute.
7
+ */
8
+ interface CompiledMigration {
9
+ statements: CompiledQuery[];
10
+ fromVersion: number;
11
+ toVersion: number;
12
+ }
13
+ //#endregion
14
+ export { CompiledMigration };
15
+ //# sourceMappingURL=executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.d.ts","names":[],"sources":["../../../../../src/adapters/generic-sql/migration/executor.ts"],"sourcesContent":[],"mappings":";;;;;AAOA;;UAAiB,iBAAA;cACH"}
@@ -0,0 +1,66 @@
1
+ import { SqlDriverAdapter } from "../../../sql-driver/sql-driver-adapter.js";
2
+ import { CompiledMigration } from "./executor.js";
3
+
4
+ //#region src/adapters/generic-sql/migration/prepared-migrations.d.ts
5
+
6
+ /**
7
+ * Options for executing a migration.
8
+ */
9
+ interface ExecuteOptions {
10
+ /**
11
+ * Whether to automatically update the schema version in the database after migration.
12
+ * If not specified, uses the value from PreparedMigrationsConfig.
13
+ */
14
+ updateVersionInMigration?: boolean;
15
+ }
16
+ /**
17
+ * Interface for preparing and executing migrations.
18
+ * Provides a clean separation between compilation (SQL generation) and execution.
19
+ */
20
+ interface PreparedMigrations {
21
+ /**
22
+ * Execute migration from one version to another.
23
+ * This performs all three phases:
24
+ * - Phase 1: schema → operations
25
+ * - Phase 2: operations → SQL
26
+ * - Phase 3: SQL → database
27
+ *
28
+ * @param fromVersion - Current database version (0 for new database)
29
+ * @param toVersion - Target schema version (defaults to schema.version)
30
+ * @param options - Optional execution options (overrides config defaults)
31
+ */
32
+ execute(fromVersion: number, toVersion?: number, options?: ExecuteOptions): Promise<void>;
33
+ /**
34
+ * Execute migration using a specific driver.
35
+ * Useful for testing or when you need to use a different driver than the one provided in config.
36
+ *
37
+ * @param driver - SQL driver to use for execution
38
+ * @param fromVersion - Current database version (0 for new database)
39
+ * @param toVersion - Target schema version (defaults to schema.version)
40
+ * @param options - Optional execution options (overrides config defaults)
41
+ */
42
+ executeWithDriver(driver: SqlDriverAdapter, fromVersion: number, toVersion?: number, options?: ExecuteOptions): Promise<void>;
43
+ /**
44
+ * Get the SQL for a migration from one version to another without executing it.
45
+ * Useful for generating migration files or previewing changes.
46
+ *
47
+ * @param fromVersion - Current database version (0 for new database)
48
+ * @param toVersion - Target schema version (defaults to schema.version)
49
+ * @param options - Optional execution options (affects version update SQL)
50
+ * @returns SQL string for the migration
51
+ */
52
+ getSQL(fromVersion: number, toVersion?: number, options?: ExecuteOptions): string;
53
+ /**
54
+ * Get the compiled migration for a version range.
55
+ * Returns both the SQL statements and the version information.
56
+ *
57
+ * @param fromVersion - Current database version (0 for new database)
58
+ * @param toVersion - Target schema version (defaults to schema.version)
59
+ * @param options - Optional execution options (affects version update SQL)
60
+ * @returns Compiled migration with statements and version info
61
+ */
62
+ compile(fromVersion: number, toVersion?: number, options?: ExecuteOptions): CompiledMigration;
63
+ }
64
+ //#endregion
65
+ export { PreparedMigrations };
66
+ //# sourceMappingURL=prepared-migrations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prepared-migrations.d.ts","names":[],"sources":["../../../../../src/adapters/generic-sql/migration/prepared-migrations.ts"],"sourcesContent":[],"mappings":";;;;;;;;AAwDc,UAvCG,cAAA,CAuCH;EACT;;;;EAsB0F,wBAAA,CAAA,EAAA,OAAA;;;;;;UAlD9E,kBAAA;;;;;;;;;;;;6DAY4C,iBAAiB;;;;;;;;;;4BAYlE,qEAGE,iBACT;;;;;;;;;;4DAWuD;;;;;;;;;;6DAWC,iBAAiB"}
@@ -0,0 +1,11 @@
1
+ //#region src/adapters/generic-sql/sqlite-storage.d.ts
2
+ type SQLiteDateStorage = "epoch-ms" | "iso-text";
3
+ type SQLiteBigintStorage = "blob" | "integer";
4
+ interface SQLiteStorageMode {
5
+ timestampStorage: SQLiteDateStorage;
6
+ dateStorage: SQLiteDateStorage;
7
+ bigintStorage: SQLiteBigintStorage;
8
+ }
9
+ //#endregion
10
+ export { SQLiteStorageMode };
11
+ //# sourceMappingURL=sqlite-storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-storage.d.ts","names":[],"sources":["../../../../src/adapters/generic-sql/sqlite-storage.ts"],"sourcesContent":[],"mappings":";KAAY,iBAAA;AAAA,KACA,mBAAA,GADiB,MAAA,GAAA,SAAA;AACjB,UAEK,iBAAA,CAFc;EAEd,gBAAA,EACG,iBADc;EACd,WAAA,EACL,iBADK;EACL,aAAA,EACE,mBADF"}
@@ -0,0 +1,5 @@
1
+ import "../../query/unit-of-work/unit-of-work.js";
2
+ import "../../query/simple-query-interface.js";
3
+ import "../adapters.js";
4
+ import "./options.js";
5
+ import { RequestContextStorage } from "@fragno-dev/core/internal/request-context-storage";
@@ -0,0 +1,2 @@
1
+ import "./options.js";
2
+ import "./in-memory-adapter.js";
@@ -0,0 +1 @@
1
+ import "../../outbox/outbox.js";
@@ -0,0 +1,237 @@
1
+ import { AnySchema } from "./schema/create.js";
2
+ import { AwaitedPromisesInObject, ExecuteTxOptions, ExtractServiceFinalResults, HandlerTxBuilder, ServiceTxBuilder, TxResult } from "./query/unit-of-work/execute-unit-of-work.js";
3
+ import { SyncCommandRegistry, SyncCommandTargetRegistration } from "./sync/types.js";
4
+ import { InternalFragmentInstance } from "./fragments/internal-fragment.js";
5
+ import { DurableHooksProcessingOptions, HookContext, HookFn, HooksMap } from "./hooks/hooks.js";
6
+ import { IUnitOfWork } from "./query/unit-of-work/unit-of-work.js";
7
+ import { DatabaseAdapter } from "./adapters/adapters.js";
8
+ import { AnyRouteOrFactory, BoundServices, FragmentDefinition, FragmentDefinitionBuilder, FragnoPublicConfig, RequestThisContext, ServiceConstructorFn } from "@fragno-dev/core";
9
+
10
+ //#region src/db-fragment-definition-builder.d.ts
11
+ type RegistrySchemaInfo = {
12
+ name: string;
13
+ namespace: string | null;
14
+ version: number;
15
+ tables: string[];
16
+ };
17
+ type RegistryFragmentMeta = {
18
+ name: string;
19
+ mountRoute: string;
20
+ };
21
+ type ExtractServiceFinalResultOrSingle<T> = T extends readonly (TxResult<unknown, unknown> | undefined)[] ? AwaitedPromisesInObject<ExtractServiceFinalResults<T>> : T extends undefined ? undefined : AwaitedPromisesInObject<ExtractServiceFinalResults<readonly [T]>>[0];
22
+ type RegistryResolver = {
23
+ getRegistryForAdapterSync: <TUOWConfig>(adapter: DatabaseAdapter<TUOWConfig>) => {
24
+ registerSchema: (schema: RegistrySchemaInfo, fragment: RegistryFragmentMeta, options?: {
25
+ outboxEnabled?: boolean;
26
+ }) => void;
27
+ registerSyncCommands: (registration: SyncCommandTargetRegistration) => void;
28
+ };
29
+ getInternalFragment: <TUOWConfig>(adapter: DatabaseAdapter<TUOWConfig>) => InternalFragmentInstance;
30
+ };
31
+ type HooksFactoryContext<TConfig> = {
32
+ config: TConfig;
33
+ options: FragnoPublicConfigWithDatabase;
34
+ deps: unknown;
35
+ services: unknown;
36
+ serviceDeps: unknown;
37
+ };
38
+ /**
39
+ * Extended FragnoPublicConfig for database fragments.
40
+ * If databaseAdapter is omitted and better-sqlite3 is available, a default SQLite adapter is used.
41
+ */
42
+ type FragnoPublicConfigWithDatabase = FragnoPublicConfig & {
43
+ databaseAdapter?: DatabaseAdapter<any>;
44
+ /**
45
+ * Optional guard to limit database roundtrips per request (primarily for tests).
46
+ * When enabled, retrieve-only and mutate-only handlerTx().execute() calls are
47
+ * counted separately (one of each by default).
48
+ * Applied only for route handlers (not inContext).
49
+ */
50
+ dbRoundtripGuard?: boolean | DbRoundtripGuardConfig;
51
+ /**
52
+ * Optional outbox configuration for this fragment.
53
+ */
54
+ outbox?: {
55
+ enabled?: boolean;
56
+ };
57
+ /**
58
+ * Optional durable hooks processing configuration.
59
+ */
60
+ durableHooks?: DurableHooksProcessingOptions;
61
+ /**
62
+ * Optional override for database namespace. If provided (including null), it is used as-is
63
+ * without sanitization — the caller is responsible for providing a valid namespace.
64
+ * When omitted, defaults to a sanitized version of schema.name.
65
+ */
66
+ databaseNamespace?: string | null;
67
+ };
68
+ /**
69
+ * Configuration for limiting database roundtrips per request.
70
+ */
71
+ type DbRoundtripGuardConfig = {
72
+ /**
73
+ * Maximum allowed retrieve-only and mutate-only handlerTx().execute() calls per request.
74
+ * Each type is tracked separately.
75
+ * Defaults to 1 when the guard is enabled.
76
+ */
77
+ maxRoundtrips?: number;
78
+ };
79
+ /**
80
+ * Implicit dependencies that database fragments get automatically.
81
+ * These are injected without requiring explicit configuration.
82
+ */
83
+ type ImplicitDatabaseDependencies<TSchema extends AnySchema> = {
84
+ /**
85
+ * Database adapter instance.
86
+ */
87
+ databaseAdapter: DatabaseAdapter<any>;
88
+ /**
89
+ * The schema definition for this fragment.
90
+ */
91
+ schema: TSchema;
92
+ /**
93
+ * The database namespace for this fragment.
94
+ */
95
+ namespace: string | null;
96
+ /**
97
+ * Create a new Unit of Work for database operations.
98
+ */
99
+ createUnitOfWork: () => IUnitOfWork;
100
+ };
101
+ /**
102
+ * Service context for database fragments - provides restricted UOW access without execute methods.
103
+ */
104
+ type DatabaseServiceContext<THooks extends HooksMap> = RequestThisContext & {
105
+ /**
106
+ * Create a service-level transaction builder using the fluent API.
107
+ * Returns a builder that can be chained with withServiceCalls, retrieve,
108
+ * transformRetrieve, mutate, transform, and build.
109
+ *
110
+ * @example
111
+ * ```ts
112
+ * return this.serviceTx(schema)
113
+ * .withServiceCalls(() => [otherService.getData()])
114
+ * .retrieve((uow) => uow.find("users", ...))
115
+ * .transformRetrieve(([users]) => users[0])
116
+ * .mutate(({ uow, retrieveResult, serviceIntermediateResult }) =>
117
+ * uow.create("records", { ... })
118
+ * )
119
+ * .transform(({ mutateResult, serviceResult }) => ({ id: mutateResult }))
120
+ * .build();
121
+ * ```
122
+ */
123
+ serviceTx<TSchema extends AnySchema>(schema: TSchema): ServiceTxBuilder<TSchema, readonly [], [], [], unknown, unknown, false, false, false, false, THooks>;
124
+ };
125
+ /**
126
+ * Handler context for database fragments - provides UOW execution with automatic retry support.
127
+ */
128
+ type DatabaseHandlerContext<THooks extends HooksMap = {}> = RequestThisContext & {
129
+ /**
130
+ * Create a handler-level transaction builder using the fluent API.
131
+ * Returns a builder that can be chained with withServiceCalls, retrieve,
132
+ * transformRetrieve, mutate, transform, and execute.
133
+ *
134
+ * @example
135
+ * ```ts
136
+ * const result = await this.handlerTx()
137
+ * .withServiceCalls(() => [userService.getUser(id)])
138
+ * .mutate(({ forSchema, idempotencyKey, currentAttempt, serviceIntermediateResult }) => {
139
+ * return forSchema(ordersSchema).create("orders", { ... });
140
+ * })
141
+ * .transform(({ mutateResult, serviceResult }) => ({ ... }))
142
+ * .execute();
143
+ * ```
144
+ */
145
+ handlerTx(options?: Omit<ExecuteTxOptions, "createUnitOfWork">): HandlerTxBuilder<readonly [], [], [], unknown, unknown, false, false, false, false, THooks>;
146
+ /**
147
+ * Execute multiple service calls in a handler context and return their final results.
148
+ */
149
+ callServices<TServiceCalls extends TxResult<unknown, unknown> | undefined | readonly (TxResult<unknown, unknown> | undefined)[]>(
150
+ /**
151
+ * Factory to create service calls inside the active context.
152
+ */
153
+ serviceCalls: () => TServiceCalls): Promise<ExtractServiceFinalResultOrSingle<TServiceCalls>>;
154
+ };
155
+ /**
156
+ * Storage type for database fragments - stores the Unit of Work.
157
+ */
158
+ type DatabaseRequestStorage = {
159
+ uow: IUnitOfWork;
160
+ };
161
+ /**
162
+ * Builder for database fragments that wraps the core fragment builder
163
+ * and provides database-specific functionality.
164
+ *
165
+ * Database fragments use FragnoPublicConfigWithDatabase and default the adapter when possible.
166
+ */
167
+ declare class DatabaseFragmentDefinitionBuilder<TSchema extends AnySchema, TConfig, TDeps, TBaseServices, TServices, TServiceDependencies, TPrivateServices, THooks extends HooksMap = {}, TServiceThisContext extends RequestThisContext = DatabaseHandlerContext, THandlerThisContext extends RequestThisContext = DatabaseHandlerContext, TInternalRoutes extends readonly AnyRouteOrFactory[] = readonly []> {
168
+ #private;
169
+ constructor(baseBuilder: FragmentDefinitionBuilder<TConfig, FragnoPublicConfigWithDatabase, TDeps, TBaseServices, TServices, TServiceDependencies, TPrivateServices, TServiceThisContext, THandlerThisContext, DatabaseRequestStorage, TInternalRoutes>, schema: TSchema, hooksFactory?: (context: HooksFactoryContext<TConfig>) => THooks, syncRegistry?: SyncCommandRegistry, registryResolver?: RegistryResolver);
170
+ /**
171
+ * Define dependencies for this database fragment.
172
+ * The context includes the database adapter.
173
+ */
174
+ withDependencies<TNewDeps>(fn: (context: {
175
+ config: TConfig;
176
+ options: FragnoPublicConfigWithDatabase;
177
+ databaseAdapter: DatabaseAdapter<any>;
178
+ }) => TNewDeps): DatabaseFragmentDefinitionBuilder<TSchema, TConfig, TNewDeps & ImplicitDatabaseDependencies<TSchema>, {}, {}, TServiceDependencies, {}, THooks, TServiceThisContext, THandlerThisContext, TInternalRoutes>;
179
+ providesBaseService<TNewService>(fn: ServiceConstructorFn<TConfig, FragnoPublicConfigWithDatabase, TDeps, TServiceDependencies, TPrivateServices, TNewService, TServiceThisContext>): DatabaseFragmentDefinitionBuilder<TSchema, TConfig, TDeps, TNewService, TServices, TServiceDependencies, TPrivateServices, THooks, TServiceThisContext, THandlerThisContext, TInternalRoutes>;
180
+ providesService<TServiceName extends string, TService>(serviceName: TServiceName, fn: ServiceConstructorFn<TConfig, FragnoPublicConfigWithDatabase, TDeps, TServiceDependencies, TPrivateServices, TService, TServiceThisContext>): DatabaseFragmentDefinitionBuilder<TSchema, TConfig, TDeps, TBaseServices, TServices & { [K in TServiceName]: TService }, TServiceDependencies, TPrivateServices, THooks, TServiceThisContext, THandlerThisContext, TInternalRoutes>;
181
+ /**
182
+ * Provide a private service that is only accessible to the fragment author.
183
+ * Private services are NOT exposed on the fragment instance, but can be used
184
+ * when defining other services (baseServices, namedServices, and other privateServices).
185
+ * Private services are instantiated in order, so earlier private services are available
186
+ * to later ones.
187
+ */
188
+ providesPrivateService<TServiceName extends string, TService>(serviceName: TServiceName, fn: ServiceConstructorFn<TConfig, FragnoPublicConfigWithDatabase, TDeps, TServiceDependencies, TPrivateServices, TService, TServiceThisContext>): DatabaseFragmentDefinitionBuilder<TSchema, TConfig, TDeps, TBaseServices, TServices, TServiceDependencies, TPrivateServices & { [K in TServiceName]: TService }, THooks, TServiceThisContext, THandlerThisContext, TInternalRoutes>;
189
+ /**
190
+ * Define durable hooks for this fragment.
191
+ * Hooks are automatically persisted and retried on failure.
192
+ *
193
+ * @param fn - Function that receives defineHook helper and returns a hooks map
194
+ * @returns Builder with hooks type set
195
+ *
196
+ * @example
197
+ * ```ts
198
+ * .provideHooks(({ defineHook, config }) => ({
199
+ * onSubscribe: defineHook(async function (payload: { email: string }) {
200
+ * // 'this' context available (HookServiceContext with idempotencyKey)
201
+ * await config.onSubscribe?.(payload.email);
202
+ * }),
203
+ * }))
204
+ * ```
205
+ */
206
+ provideHooks<TNewHooks extends HooksMap>(fn: (context: {
207
+ config: TConfig;
208
+ options: FragnoPublicConfigWithDatabase;
209
+ deps: TDeps;
210
+ services: BoundServices<TBaseServices & TServices>;
211
+ serviceDeps: TServiceDependencies;
212
+ defineHook: <TPayload>(hook: (this: HookContext, payload: TPayload) => void | Promise<void>) => HookFn<TPayload>;
213
+ }) => TNewHooks): DatabaseFragmentDefinitionBuilder<TSchema, TConfig, TDeps, TBaseServices, TServices, TServiceDependencies, TPrivateServices, TNewHooks, DatabaseServiceContext<TNewHooks>, THandlerThisContext, TInternalRoutes>;
214
+ /**
215
+ * Register sync command definitions for this fragment.
216
+ */
217
+ withSyncCommands(registry: SyncCommandRegistry): DatabaseFragmentDefinitionBuilder<TSchema, TConfig, TDeps, TBaseServices, TServices, TServiceDependencies, TPrivateServices, THooks, TServiceThisContext, THandlerThisContext, TInternalRoutes>;
218
+ /**
219
+ * Declare that this fragment uses a required service provided by the runtime.
220
+ * Delegates to the base builder.
221
+ */
222
+ usesService<TServiceName extends string, TService>(serviceName: TServiceName): DatabaseFragmentDefinitionBuilder<TSchema, TConfig, TDeps, TBaseServices, TServices, TServiceDependencies & { [K in TServiceName]: TService }, TPrivateServices, THooks, TServiceThisContext, THandlerThisContext, TInternalRoutes>;
223
+ /**
224
+ * Declare that this fragment uses an optional service provided by the runtime.
225
+ * Delegates to the base builder.
226
+ */
227
+ usesOptionalService<TServiceName extends string, TService>(serviceName: TServiceName): DatabaseFragmentDefinitionBuilder<TSchema, TConfig, TDeps, TBaseServices, TServices, TServiceDependencies & { [K in TServiceName]: TService | undefined }, TPrivateServices, THooks, TServiceThisContext, THandlerThisContext, TInternalRoutes>;
228
+ /**
229
+ * Build the final database fragment definition.
230
+ * This includes the request context setup for UnitOfWork management.
231
+ * Note: TDeps already includes ImplicitDatabaseDependencies from withDatabase().
232
+ */
233
+ build(): FragmentDefinition<TConfig, FragnoPublicConfigWithDatabase, TDeps, TBaseServices, TServices, TServiceDependencies, TPrivateServices, DatabaseServiceContext<THooks>, DatabaseHandlerContext<THooks>, DatabaseRequestStorage, TInternalRoutes>;
234
+ }
235
+ //#endregion
236
+ export { DatabaseFragmentDefinitionBuilder, DatabaseHandlerContext, DatabaseRequestStorage, DatabaseServiceContext, DbRoundtripGuardConfig, FragnoPublicConfigWithDatabase, ImplicitDatabaseDependencies };
237
+ //# sourceMappingURL=db-fragment-definition-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db-fragment-definition-builder.d.ts","names":[],"sources":["../../src/db-fragment-definition-builder.ts"],"sourcesContent":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import "./fragments/internal-fragment.js";
2
+ import "./hooks/hooks.js";
3
+ import { AnyFragnoInstantiatedDatabaseFragment } from "./mod2.js";