@fragno-dev/db 0.2.2 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (587) hide show
  1. package/.turbo/turbo-build.log +404 -175
  2. package/CHANGELOG.md +109 -0
  3. package/README.md +54 -9
  4. package/dist/adapters/adapters.d.ts +23 -21
  5. package/dist/adapters/adapters.d.ts.map +1 -1
  6. package/dist/adapters/adapters.js.map +1 -1
  7. package/dist/adapters/generic-sql/driver-config.d.ts +16 -1
  8. package/dist/adapters/generic-sql/driver-config.d.ts.map +1 -1
  9. package/dist/adapters/generic-sql/driver-config.js +23 -1
  10. package/dist/adapters/generic-sql/driver-config.js.map +1 -1
  11. package/dist/adapters/generic-sql/generic-sql-adapter.d.ts +24 -9
  12. package/dist/adapters/generic-sql/generic-sql-adapter.d.ts.map +1 -1
  13. package/dist/adapters/generic-sql/generic-sql-adapter.js +60 -22
  14. package/dist/adapters/generic-sql/generic-sql-adapter.js.map +1 -1
  15. package/dist/adapters/generic-sql/generic-sql-uow-executor.js +169 -3
  16. package/dist/adapters/generic-sql/generic-sql-uow-executor.js.map +1 -1
  17. package/dist/adapters/generic-sql/migration/cold-kysely.js.map +1 -1
  18. package/dist/adapters/generic-sql/migration/dialect/mysql.js +25 -6
  19. package/dist/adapters/generic-sql/migration/dialect/mysql.js.map +1 -1
  20. package/dist/adapters/generic-sql/migration/dialect/postgres.js +7 -6
  21. package/dist/adapters/generic-sql/migration/dialect/postgres.js.map +1 -1
  22. package/dist/adapters/generic-sql/migration/dialect/sqlite.js +193 -16
  23. package/dist/adapters/generic-sql/migration/dialect/sqlite.js.map +1 -1
  24. package/dist/adapters/generic-sql/migration/executor.d.ts.map +1 -1
  25. package/dist/adapters/generic-sql/migration/executor.js +30 -3
  26. package/dist/adapters/generic-sql/migration/executor.js.map +1 -1
  27. package/dist/adapters/generic-sql/migration/prepared-migrations.d.ts.map +1 -1
  28. package/dist/adapters/generic-sql/migration/prepared-migrations.js +9 -9
  29. package/dist/adapters/generic-sql/migration/prepared-migrations.js.map +1 -1
  30. package/dist/adapters/generic-sql/migration/sql-generator.js +75 -52
  31. package/dist/adapters/generic-sql/migration/sql-generator.js.map +1 -1
  32. package/dist/adapters/generic-sql/query/create-sql-query-compiler.js +7 -6
  33. package/dist/adapters/generic-sql/query/create-sql-query-compiler.js.map +1 -1
  34. package/dist/adapters/generic-sql/query/cursor-utils.js +42 -4
  35. package/dist/adapters/generic-sql/query/cursor-utils.js.map +1 -1
  36. package/dist/adapters/generic-sql/query/db-now-sql.js +27 -0
  37. package/dist/adapters/generic-sql/query/db-now-sql.js.map +1 -0
  38. package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js +32 -21
  39. package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js.map +1 -1
  40. package/dist/adapters/generic-sql/query/select-builder.js +5 -3
  41. package/dist/adapters/generic-sql/query/select-builder.js.map +1 -1
  42. package/dist/adapters/generic-sql/query/sql-query-compiler.js +49 -18
  43. package/dist/adapters/generic-sql/query/sql-query-compiler.js.map +1 -1
  44. package/dist/adapters/generic-sql/query/where-builder.js +43 -29
  45. package/dist/adapters/generic-sql/query/where-builder.js.map +1 -1
  46. package/dist/adapters/generic-sql/sqlite-storage.d.ts +13 -0
  47. package/dist/adapters/generic-sql/sqlite-storage.d.ts.map +1 -0
  48. package/dist/adapters/generic-sql/sqlite-storage.js +15 -0
  49. package/dist/adapters/generic-sql/sqlite-storage.js.map +1 -0
  50. package/dist/adapters/generic-sql/uow-decoder.js +6 -2
  51. package/dist/adapters/generic-sql/uow-decoder.js.map +1 -1
  52. package/dist/adapters/generic-sql/uow-encoder.js +27 -8
  53. package/dist/adapters/generic-sql/uow-encoder.js.map +1 -1
  54. package/dist/adapters/in-memory/condition-evaluator.js +135 -0
  55. package/dist/adapters/in-memory/condition-evaluator.js.map +1 -0
  56. package/dist/adapters/in-memory/errors.d.ts +13 -0
  57. package/dist/adapters/in-memory/errors.d.ts.map +1 -0
  58. package/dist/adapters/in-memory/errors.js +23 -0
  59. package/dist/adapters/in-memory/errors.js.map +1 -0
  60. package/dist/adapters/in-memory/in-memory-adapter.d.ts +27 -0
  61. package/dist/adapters/in-memory/in-memory-adapter.d.ts.map +1 -0
  62. package/dist/adapters/in-memory/in-memory-adapter.js +196 -0
  63. package/dist/adapters/in-memory/in-memory-adapter.js.map +1 -0
  64. package/dist/adapters/in-memory/in-memory-uow.js +871 -0
  65. package/dist/adapters/in-memory/in-memory-uow.js.map +1 -0
  66. package/dist/adapters/in-memory/index.d.ts +4 -0
  67. package/dist/adapters/in-memory/index.js +4 -0
  68. package/dist/adapters/in-memory/options.d.ts +30 -0
  69. package/dist/adapters/in-memory/options.d.ts.map +1 -0
  70. package/dist/adapters/in-memory/options.js +62 -0
  71. package/dist/adapters/in-memory/options.js.map +1 -0
  72. package/dist/adapters/in-memory/reference-resolution.js +26 -0
  73. package/dist/adapters/in-memory/reference-resolution.js.map +1 -0
  74. package/dist/adapters/in-memory/sorted-array-index.js +129 -0
  75. package/dist/adapters/in-memory/sorted-array-index.js.map +1 -0
  76. package/dist/adapters/in-memory/store.js +71 -0
  77. package/dist/adapters/in-memory/store.js.map +1 -0
  78. package/dist/adapters/in-memory/value-comparison.js +28 -0
  79. package/dist/adapters/in-memory/value-comparison.js.map +1 -0
  80. package/dist/adapters/shared/from-unit-of-work-compiler.js +51 -24
  81. package/dist/adapters/shared/from-unit-of-work-compiler.js.map +1 -1
  82. package/dist/adapters/shared/uow-operation-compiler.js +11 -11
  83. package/dist/adapters/shared/uow-operation-compiler.js.map +1 -1
  84. package/dist/adapters/sql/index.d.ts +5 -0
  85. package/dist/adapters/sql/index.js +4 -0
  86. package/dist/browser/adapters/adapters.d.ts +61 -0
  87. package/dist/browser/adapters/adapters.d.ts.map +1 -0
  88. package/dist/browser/adapters/generic-sql/migration/executor.d.ts +15 -0
  89. package/dist/browser/adapters/generic-sql/migration/executor.d.ts.map +1 -0
  90. package/dist/browser/adapters/generic-sql/migration/prepared-migrations.d.ts +66 -0
  91. package/dist/browser/adapters/generic-sql/migration/prepared-migrations.d.ts.map +1 -0
  92. package/dist/browser/adapters/generic-sql/sqlite-storage.d.ts +11 -0
  93. package/dist/browser/adapters/generic-sql/sqlite-storage.d.ts.map +1 -0
  94. package/dist/browser/adapters/in-memory/in-memory-adapter.d.ts +5 -0
  95. package/dist/browser/adapters/in-memory/index.d.ts +2 -0
  96. package/dist/browser/adapters/in-memory/options.d.ts +1 -0
  97. package/dist/browser/db-fragment-definition-builder.d.ts +237 -0
  98. package/dist/browser/db-fragment-definition-builder.d.ts.map +1 -0
  99. package/dist/browser/durable-hooks.d.ts +3 -0
  100. package/dist/browser/fragments/internal-fragment.d.ts +317 -0
  101. package/dist/browser/fragments/internal-fragment.d.ts.map +1 -0
  102. package/dist/browser/fragments/internal-fragment.schema.d.ts +1 -0
  103. package/dist/browser/hooks/durable-hooks-logger.d.ts +10 -0
  104. package/dist/browser/hooks/durable-hooks-logger.d.ts.map +1 -0
  105. package/dist/browser/hooks/hooks.d.ts +146 -0
  106. package/dist/browser/hooks/hooks.d.ts.map +1 -0
  107. package/dist/browser/id.js +1 -0
  108. package/dist/browser/internal/adapter-registry.d.ts +4 -0
  109. package/dist/browser/internal/outbox-state.d.ts +2 -0
  110. package/dist/browser/mod.d.ts +15 -0
  111. package/dist/browser/mod.d.ts.map +1 -0
  112. package/dist/browser/mod.js +17 -0
  113. package/dist/browser/mod.js.map +1 -0
  114. package/dist/browser/mod2.d.ts +48 -0
  115. package/dist/browser/mod2.d.ts.map +1 -0
  116. package/dist/browser/naming/sql-naming.d.ts +19 -0
  117. package/dist/browser/naming/sql-naming.d.ts.map +1 -0
  118. package/dist/browser/outbox/outbox.d.ts +21 -0
  119. package/dist/browser/outbox/outbox.d.ts.map +1 -0
  120. package/dist/browser/query/column-defaults.js +1 -0
  121. package/dist/browser/query/condition-builder.d.ts +44 -0
  122. package/dist/browser/query/condition-builder.d.ts.map +1 -0
  123. package/dist/browser/query/condition-builder.js +97 -0
  124. package/dist/browser/query/condition-builder.js.map +1 -0
  125. package/dist/browser/query/cursor.d.ts +105 -0
  126. package/dist/browser/query/cursor.d.ts.map +1 -0
  127. package/dist/browser/query/cursor.js +150 -0
  128. package/dist/browser/query/cursor.js.map +1 -0
  129. package/dist/browser/query/db-now.d.ts +22 -0
  130. package/dist/browser/query/db-now.d.ts.map +1 -0
  131. package/dist/browser/query/db-now.js +33 -0
  132. package/dist/browser/query/db-now.js.map +1 -0
  133. package/dist/browser/query/orm/orm.d.ts +18 -0
  134. package/dist/browser/query/orm/orm.d.ts.map +1 -0
  135. package/dist/browser/query/simple-query-interface.d.ts +108 -0
  136. package/dist/browser/query/simple-query-interface.d.ts.map +1 -0
  137. package/dist/browser/query/unit-of-work/execute-unit-of-work.d.ts +423 -0
  138. package/dist/browser/query/unit-of-work/execute-unit-of-work.d.ts.map +1 -0
  139. package/dist/browser/query/unit-of-work/execute-unit-of-work.js +507 -0
  140. package/dist/browser/query/unit-of-work/execute-unit-of-work.js.map +1 -0
  141. package/dist/browser/query/unit-of-work/retry-policy.d.ts +23 -0
  142. package/dist/browser/query/unit-of-work/retry-policy.d.ts.map +1 -0
  143. package/dist/browser/query/unit-of-work/retry-policy.js +40 -0
  144. package/dist/browser/query/unit-of-work/retry-policy.js.map +1 -0
  145. package/dist/browser/query/unit-of-work/unit-of-work.d.ts +703 -0
  146. package/dist/browser/query/unit-of-work/unit-of-work.d.ts.map +1 -0
  147. package/dist/browser/query/unit-of-work/unit-of-work.js +1206 -0
  148. package/dist/browser/query/unit-of-work/unit-of-work.js.map +1 -0
  149. package/dist/browser/query/value-encoding.js +38 -0
  150. package/dist/browser/query/value-encoding.js.map +1 -0
  151. package/dist/browser/schema/create.d.ts +326 -0
  152. package/dist/browser/schema/create.d.ts.map +1 -0
  153. package/dist/browser/schema/create.js +89 -0
  154. package/dist/browser/schema/create.js.map +1 -0
  155. package/dist/browser/schema/generate-id.js +28 -0
  156. package/dist/browser/schema/generate-id.js.map +1 -0
  157. package/dist/browser/shared/providers.d.ts +6 -0
  158. package/dist/browser/shared/providers.d.ts.map +1 -0
  159. package/dist/browser/sql-driver/connection/connection-provider.d.ts +13 -0
  160. package/dist/browser/sql-driver/connection/connection-provider.d.ts.map +1 -0
  161. package/dist/browser/sql-driver/dialect-adapter/dialect-adapter.d.ts +7 -0
  162. package/dist/browser/sql-driver/dialect-adapter/dialect-adapter.d.ts.map +1 -0
  163. package/dist/browser/sql-driver/driver/runtime-driver.d.ts +23 -0
  164. package/dist/browser/sql-driver/driver/runtime-driver.d.ts.map +1 -0
  165. package/dist/browser/sql-driver/query-executor/plugin.d.ts +17 -0
  166. package/dist/browser/sql-driver/query-executor/plugin.d.ts.map +1 -0
  167. package/dist/browser/sql-driver/query-executor/query-executor.d.ts +36 -0
  168. package/dist/browser/sql-driver/query-executor/query-executor.d.ts.map +1 -0
  169. package/dist/browser/sql-driver/sql-driver-adapter.d.ts +29 -0
  170. package/dist/browser/sql-driver/sql-driver-adapter.d.ts.map +1 -0
  171. package/dist/browser/sql-driver/sql-driver.d.ts +38 -0
  172. package/dist/browser/sql-driver/sql-driver.d.ts.map +1 -0
  173. package/dist/browser/sync/commands.d.ts +15 -0
  174. package/dist/browser/sync/commands.d.ts.map +1 -0
  175. package/dist/browser/sync/commands.js +27 -0
  176. package/dist/browser/sync/commands.js.map +1 -0
  177. package/dist/browser/sync/types.d.ts +63 -0
  178. package/dist/browser/sync/types.d.ts.map +1 -0
  179. package/dist/browser/util/types.d.ts +8 -0
  180. package/dist/browser/util/types.d.ts.map +1 -0
  181. package/dist/browser/with-database.d.ts +29 -0
  182. package/dist/browser/with-database.d.ts.map +1 -0
  183. package/dist/client.d.ts +4 -0
  184. package/dist/client.js +5 -0
  185. package/dist/db-fragment-definition-builder.d.ts +101 -33
  186. package/dist/db-fragment-definition-builder.d.ts.map +1 -1
  187. package/dist/db-fragment-definition-builder.js +450 -60
  188. package/dist/db-fragment-definition-builder.js.map +1 -1
  189. package/dist/dispatchers/cloudflare-do/dispatcher.d.ts +20 -0
  190. package/dist/dispatchers/cloudflare-do/dispatcher.d.ts.map +1 -0
  191. package/dist/dispatchers/cloudflare-do/dispatcher.js +147 -0
  192. package/dist/dispatchers/cloudflare-do/dispatcher.js.map +1 -0
  193. package/dist/dispatchers/cloudflare-do/index.d.ts +11 -0
  194. package/dist/dispatchers/cloudflare-do/index.d.ts.map +1 -0
  195. package/dist/dispatchers/cloudflare-do/index.js +31 -0
  196. package/dist/dispatchers/cloudflare-do/index.js.map +1 -0
  197. package/dist/dispatchers/node/dispatcher.d.ts +14 -0
  198. package/dist/dispatchers/node/dispatcher.d.ts.map +1 -0
  199. package/dist/dispatchers/node/dispatcher.js +80 -0
  200. package/dist/dispatchers/node/dispatcher.js.map +1 -0
  201. package/dist/dispatchers/node/index.d.ts +12 -0
  202. package/dist/dispatchers/node/index.d.ts.map +1 -0
  203. package/dist/dispatchers/node/index.js +27 -0
  204. package/dist/dispatchers/node/index.js.map +1 -0
  205. package/dist/durable-hooks.d.ts +31 -0
  206. package/dist/durable-hooks.d.ts.map +1 -0
  207. package/dist/durable-hooks.js +23 -0
  208. package/dist/durable-hooks.js.map +1 -0
  209. package/dist/fragments/internal-fragment.d.ts +186 -8
  210. package/dist/fragments/internal-fragment.d.ts.map +1 -1
  211. package/dist/fragments/internal-fragment.js +203 -38
  212. package/dist/fragments/internal-fragment.js.map +1 -1
  213. package/dist/fragments/internal-fragment.routes.js +164 -0
  214. package/dist/fragments/internal-fragment.routes.js.map +1 -0
  215. package/dist/fragments/internal-fragment.schema.d.ts +15 -0
  216. package/dist/fragments/internal-fragment.schema.d.ts.map +1 -0
  217. package/dist/fragments/internal-fragment.schema.js +39 -0
  218. package/dist/fragments/internal-fragment.schema.js.map +1 -0
  219. package/dist/hooks/durable-hooks-logger.d.ts +10 -0
  220. package/dist/hooks/durable-hooks-logger.d.ts.map +1 -0
  221. package/dist/hooks/durable-hooks-logger.js +75 -0
  222. package/dist/hooks/durable-hooks-logger.js.map +1 -0
  223. package/dist/hooks/durable-hooks-processor.d.ts +1 -0
  224. package/dist/hooks/durable-hooks-processor.js +80 -0
  225. package/dist/hooks/durable-hooks-processor.js.map +1 -0
  226. package/dist/hooks/durable-hooks-runtime.js +44 -0
  227. package/dist/hooks/durable-hooks-runtime.js.map +1 -0
  228. package/dist/hooks/hooks.d.ts +100 -1
  229. package/dist/hooks/hooks.d.ts.map +1 -1
  230. package/dist/hooks/hooks.js +254 -27
  231. package/dist/hooks/hooks.js.map +1 -1
  232. package/dist/id.d.ts +2 -2
  233. package/dist/id.js +2 -2
  234. package/dist/internal/adapter-registry.d.ts +11 -0
  235. package/dist/internal/adapter-registry.d.ts.map +1 -0
  236. package/dist/internal/adapter-registry.js +135 -0
  237. package/dist/internal/adapter-registry.js.map +1 -0
  238. package/dist/internal/outbox-state.d.ts +2 -0
  239. package/dist/internal/outbox-state.js +26 -0
  240. package/dist/internal/outbox-state.js.map +1 -0
  241. package/dist/migration-engine/auto-from-schema.d.ts +33 -0
  242. package/dist/migration-engine/auto-from-schema.d.ts.map +1 -0
  243. package/dist/migration-engine/auto-from-schema.js +223 -37
  244. package/dist/migration-engine/auto-from-schema.js.map +1 -1
  245. package/dist/migration-engine/generation-engine.d.ts +16 -10
  246. package/dist/migration-engine/generation-engine.d.ts.map +1 -1
  247. package/dist/migration-engine/generation-engine.js +86 -35
  248. package/dist/migration-engine/generation-engine.js.map +1 -1
  249. package/dist/migration-engine/shared.d.ts +113 -0
  250. package/dist/migration-engine/shared.d.ts.map +1 -0
  251. package/dist/migration-engine/shared.js.map +1 -1
  252. package/dist/mod.d.ts +20 -12
  253. package/dist/mod.d.ts.map +1 -1
  254. package/dist/mod.js +18 -12
  255. package/dist/mod.js.map +1 -1
  256. package/dist/naming/sql-naming.d.ts +19 -0
  257. package/dist/naming/sql-naming.d.ts.map +1 -0
  258. package/dist/naming/sql-naming.js +116 -0
  259. package/dist/naming/sql-naming.js.map +1 -0
  260. package/dist/outbox/outbox-builder.js +156 -0
  261. package/dist/outbox/outbox-builder.js.map +1 -0
  262. package/dist/outbox/outbox.d.ts +54 -0
  263. package/dist/outbox/outbox.d.ts.map +1 -0
  264. package/dist/outbox/outbox.js +37 -0
  265. package/dist/outbox/outbox.js.map +1 -0
  266. package/dist/query/column-defaults.js +20 -4
  267. package/dist/query/column-defaults.js.map +1 -1
  268. package/dist/query/condition-builder.d.ts +7 -1
  269. package/dist/query/condition-builder.d.ts.map +1 -1
  270. package/dist/query/condition-builder.js +5 -1
  271. package/dist/query/condition-builder.js.map +1 -1
  272. package/dist/query/cursor-client.d.ts +105 -0
  273. package/dist/query/cursor-client.d.ts.map +1 -0
  274. package/dist/query/cursor-client.js +165 -0
  275. package/dist/query/cursor-client.js.map +1 -0
  276. package/dist/query/cursor.d.ts +3 -1
  277. package/dist/query/cursor.d.ts.map +1 -1
  278. package/dist/query/cursor.js +51 -14
  279. package/dist/query/cursor.js.map +1 -1
  280. package/dist/query/db-now.d.ts +22 -0
  281. package/dist/query/db-now.d.ts.map +1 -0
  282. package/dist/query/db-now.js +35 -0
  283. package/dist/query/db-now.js.map +1 -0
  284. package/dist/query/orm/orm.js.map +1 -1
  285. package/dist/query/serialize/create-sql-serializer.js +5 -4
  286. package/dist/query/serialize/create-sql-serializer.js.map +1 -1
  287. package/dist/query/serialize/dialect/mysql-serializer.js +12 -6
  288. package/dist/query/serialize/dialect/mysql-serializer.js.map +1 -1
  289. package/dist/query/serialize/dialect/postgres-serializer.js +25 -7
  290. package/dist/query/serialize/dialect/postgres-serializer.js.map +1 -1
  291. package/dist/query/serialize/dialect/sqlite-serializer.js +60 -12
  292. package/dist/query/serialize/dialect/sqlite-serializer.js.map +1 -1
  293. package/dist/query/serialize/sql-serializer.js +2 -2
  294. package/dist/query/serialize/sql-serializer.js.map +1 -1
  295. package/dist/query/simple-query-interface.d.ts +13 -4
  296. package/dist/query/simple-query-interface.d.ts.map +1 -1
  297. package/dist/query/unit-of-work/execute-unit-of-work.d.ts +37 -2
  298. package/dist/query/unit-of-work/execute-unit-of-work.d.ts.map +1 -1
  299. package/dist/query/unit-of-work/execute-unit-of-work.js +50 -24
  300. package/dist/query/unit-of-work/execute-unit-of-work.js.map +1 -1
  301. package/dist/query/unit-of-work/unit-of-work.d.ts +92 -30
  302. package/dist/query/unit-of-work/unit-of-work.d.ts.map +1 -1
  303. package/dist/query/unit-of-work/unit-of-work.js +136 -11
  304. package/dist/query/unit-of-work/unit-of-work.js.map +1 -1
  305. package/dist/query/value-decoding.js +16 -6
  306. package/dist/query/value-decoding.js.map +1 -1
  307. package/dist/query/value-encoding.js +29 -9
  308. package/dist/query/value-encoding.js.map +1 -1
  309. package/dist/schema/create.d.ts +103 -35
  310. package/dist/schema/create.d.ts.map +1 -1
  311. package/dist/schema/create.js +172 -58
  312. package/dist/schema/create.js.map +1 -1
  313. package/dist/schema/generate-id.js +2 -2
  314. package/dist/schema/generate-id.js.map +1 -1
  315. package/dist/schema/type-conversion/create-sql-type-mapper.js +4 -3
  316. package/dist/schema/type-conversion/create-sql-type-mapper.js.map +1 -1
  317. package/dist/schema/type-conversion/dialect/sqlite.js +9 -0
  318. package/dist/schema/type-conversion/dialect/sqlite.js.map +1 -1
  319. package/dist/schema/validator.d.ts +10 -0
  320. package/dist/schema/validator.d.ts.map +1 -0
  321. package/dist/schema/validator.js +123 -0
  322. package/dist/schema/validator.js.map +1 -0
  323. package/dist/schema-output/drizzle.d.ts +30 -0
  324. package/dist/schema-output/drizzle.d.ts.map +1 -0
  325. package/dist/{adapters/drizzle/generate.js → schema-output/drizzle.js} +88 -60
  326. package/dist/schema-output/drizzle.js.map +1 -0
  327. package/dist/schema-output/prisma.d.ts +17 -0
  328. package/dist/schema-output/prisma.d.ts.map +1 -0
  329. package/dist/schema-output/prisma.js +307 -0
  330. package/dist/schema-output/prisma.js.map +1 -0
  331. package/dist/sql-driver/dialects/durable-object-dialect.js +3 -9
  332. package/dist/sql-driver/dialects/durable-object-dialect.js.map +1 -1
  333. package/dist/sql-driver/query-executor/default-query-executor.js.map +1 -1
  334. package/dist/sql-driver/query-executor/query-executor-base.js.map +1 -1
  335. package/dist/sql-driver/sql-driver-adapter.js.map +1 -1
  336. package/dist/sql-driver/sql.js.map +1 -1
  337. package/dist/sync/commands.d.ts +15 -0
  338. package/dist/sync/commands.d.ts.map +1 -0
  339. package/dist/sync/commands.js +27 -0
  340. package/dist/sync/commands.js.map +1 -0
  341. package/dist/sync/index.d.ts +4 -0
  342. package/dist/sync/index.js +4 -0
  343. package/dist/sync/read-tracking.d.ts +25 -0
  344. package/dist/sync/read-tracking.d.ts.map +1 -0
  345. package/dist/sync/read-tracking.js +148 -0
  346. package/dist/sync/read-tracking.js.map +1 -0
  347. package/dist/sync/submit.js +213 -0
  348. package/dist/sync/submit.js.map +1 -0
  349. package/dist/sync/types.d.ts +63 -0
  350. package/dist/sync/types.d.ts.map +1 -0
  351. package/dist/util/default-database-adapter.js +66 -0
  352. package/dist/util/default-database-adapter.js.map +1 -0
  353. package/dist/with-database.d.ts +3 -6
  354. package/dist/with-database.d.ts.map +1 -1
  355. package/dist/with-database.js +8 -7
  356. package/dist/with-database.js.map +1 -1
  357. package/package.json +62 -55
  358. package/src/adapters/adapters.ts +33 -26
  359. package/src/adapters/drizzle/migrate-drizzle.test.ts +99 -41
  360. package/src/adapters/drizzle/migration-parity-drizzle-kit.test.ts +601 -0
  361. package/src/adapters/drizzle/test-utils.ts +13 -8
  362. package/src/adapters/generic-sql/driver-config.ts +38 -0
  363. package/src/adapters/generic-sql/generic-sql-adapter.test.ts +10 -8
  364. package/src/adapters/generic-sql/generic-sql-adapter.ts +117 -34
  365. package/src/adapters/generic-sql/generic-sql-uow-executor.test.ts +55 -0
  366. package/src/adapters/generic-sql/generic-sql-uow-executor.ts +297 -3
  367. package/src/adapters/generic-sql/migration/adapter-migration-parity.test.ts +120 -0
  368. package/src/adapters/generic-sql/migration/cold-kysely.ts +1 -0
  369. package/src/adapters/generic-sql/migration/dialect/mysql.test.ts +27 -8
  370. package/src/adapters/generic-sql/migration/dialect/mysql.ts +47 -8
  371. package/src/adapters/generic-sql/migration/dialect/postgres.test.ts +28 -9
  372. package/src/adapters/generic-sql/migration/dialect/postgres.ts +9 -4
  373. package/src/adapters/generic-sql/migration/dialect/sqlite.test.ts +839 -8
  374. package/src/adapters/generic-sql/migration/dialect/sqlite.ts +396 -53
  375. package/src/adapters/generic-sql/migration/executor.test.ts +52 -0
  376. package/src/adapters/generic-sql/migration/executor.ts +47 -4
  377. package/src/adapters/generic-sql/migration/prepared-migrations.test.ts +238 -46
  378. package/src/adapters/generic-sql/migration/prepared-migrations.ts +21 -13
  379. package/src/adapters/generic-sql/migration/sql-generator.ts +145 -66
  380. package/src/adapters/generic-sql/query/create-sql-query-compiler.ts +11 -8
  381. package/src/adapters/generic-sql/query/cursor-utils.test.ts +272 -0
  382. package/src/adapters/generic-sql/query/cursor-utils.ts +42 -7
  383. package/src/adapters/generic-sql/query/db-now-sql.ts +49 -0
  384. package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.test.ts +171 -35
  385. package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.ts +53 -40
  386. package/src/adapters/generic-sql/query/select-builder.test.ts +16 -11
  387. package/src/adapters/generic-sql/query/select-builder.ts +7 -3
  388. package/src/adapters/generic-sql/query/sql-query-compiler.test.ts +75 -6
  389. package/src/adapters/generic-sql/query/sql-query-compiler.ts +129 -24
  390. package/src/adapters/generic-sql/query/where-builder.test.ts +96 -20
  391. package/src/adapters/generic-sql/query/where-builder.ts +112 -41
  392. package/src/adapters/{kysely/kysely-adapter-pglite.test.ts → generic-sql/sql-adapter-pglite-migrations.test.ts} +11 -20
  393. package/src/adapters/generic-sql/sql-adapter-pglite-pagination.test.ts +851 -0
  394. package/src/adapters/{drizzle/drizzle-adapter-pglite.test.ts → generic-sql/sql-adapter-pglite-queries.test.ts} +18 -15
  395. package/src/adapters/generic-sql/{test/generic-drizzle-adapter-sqlite3.test.ts → sql-adapter-sqlite3-driver.test.ts} +282 -14
  396. package/src/adapters/{drizzle/drizzle-adapter-sqlite3.test.ts → generic-sql/sql-adapter-sqlite3-uow.test.ts} +129 -12
  397. package/src/adapters/{kysely/kysely-adapter-sqlocal.test.ts → generic-sql/sql-adapter-sqlocal.test.ts} +9 -7
  398. package/src/adapters/generic-sql/sqlite-storage.ts +20 -0
  399. package/src/adapters/generic-sql/uow-decoder.test.ts +5 -4
  400. package/src/adapters/generic-sql/uow-decoder.ts +23 -5
  401. package/src/adapters/generic-sql/uow-encoder.test.ts +36 -3
  402. package/src/adapters/generic-sql/uow-encoder.ts +48 -13
  403. package/src/adapters/in-memory/condition-evaluator.test.ts +194 -0
  404. package/src/adapters/in-memory/condition-evaluator.ts +280 -0
  405. package/src/adapters/in-memory/errors.ts +20 -0
  406. package/src/adapters/in-memory/in-memory-adapter.ts +388 -0
  407. package/src/adapters/in-memory/in-memory-uow.mutations.test.ts +344 -0
  408. package/src/adapters/in-memory/in-memory-uow.retrieval.test.ts +255 -0
  409. package/src/adapters/in-memory/in-memory-uow.ts +1724 -0
  410. package/src/adapters/in-memory/index.ts +3 -0
  411. package/src/adapters/in-memory/options.test.ts +42 -0
  412. package/src/adapters/in-memory/options.ts +91 -0
  413. package/src/adapters/in-memory/outbox.test.ts +361 -0
  414. package/src/adapters/in-memory/reference-resolution.test.ts +51 -0
  415. package/src/adapters/in-memory/reference-resolution.ts +67 -0
  416. package/src/adapters/in-memory/sorted-array-index.test.ts +124 -0
  417. package/src/adapters/in-memory/sorted-array-index.ts +228 -0
  418. package/src/adapters/in-memory/store.test.ts +69 -0
  419. package/src/adapters/in-memory/store.ts +145 -0
  420. package/src/adapters/in-memory/value-comparison.ts +53 -0
  421. package/src/adapters/in-memory/value-normalization.test.ts +58 -0
  422. package/src/adapters/prisma/prisma-adapter-sqlite3.test.ts +1207 -0
  423. package/src/adapters/shared/from-unit-of-work-compiler.ts +159 -47
  424. package/src/adapters/shared/uow-operation-compiler.ts +28 -18
  425. package/src/adapters/sql/index.ts +12 -0
  426. package/src/browser/mod.ts +64 -0
  427. package/src/client.ts +19 -0
  428. package/src/db-fragment-definition-builder.test.ts +845 -53
  429. package/src/db-fragment-definition-builder.ts +911 -95
  430. package/src/db-fragment-instantiator.test.ts +210 -94
  431. package/src/db-fragment-integration.test.ts +17 -12
  432. package/src/dispatchers/cloudflare-do/dispatcher.ts +204 -0
  433. package/src/dispatchers/cloudflare-do/index.test.ts +206 -0
  434. package/src/dispatchers/cloudflare-do/index.ts +63 -0
  435. package/src/dispatchers/node/dispatcher.ts +112 -0
  436. package/src/dispatchers/node/index.test.ts +120 -0
  437. package/src/dispatchers/node/index.ts +50 -0
  438. package/src/durable-hooks.test.ts +80 -0
  439. package/src/durable-hooks.ts +67 -0
  440. package/src/fragments/internal-fragment.routes.test.ts +570 -0
  441. package/src/fragments/internal-fragment.routes.ts +334 -0
  442. package/src/fragments/internal-fragment.schema.ts +95 -0
  443. package/src/fragments/internal-fragment.test.ts +505 -83
  444. package/src/fragments/internal-fragment.ts +453 -70
  445. package/src/hooks/durable-hooks-logger.ts +126 -0
  446. package/src/hooks/durable-hooks-processor.pglite.test.ts +87 -0
  447. package/src/hooks/durable-hooks-processor.test.ts +282 -0
  448. package/src/hooks/durable-hooks-processor.ts +173 -0
  449. package/src/hooks/durable-hooks-runtime.test.ts +65 -0
  450. package/src/hooks/durable-hooks-runtime.ts +81 -0
  451. package/src/hooks/hooks.test.ts +455 -34
  452. package/src/hooks/hooks.ts +501 -34
  453. package/src/id.test.ts +34 -0
  454. package/src/id.ts +1 -3
  455. package/src/internal/adapter-registry.test.ts +93 -0
  456. package/src/internal/adapter-registry.ts +239 -0
  457. package/src/internal/outbox-state.ts +43 -0
  458. package/src/migration-engine/auto-from-schema.test.ts +107 -14
  459. package/src/migration-engine/auto-from-schema.ts +365 -44
  460. package/src/migration-engine/create.test.ts +4 -3
  461. package/src/migration-engine/create.ts +1 -1
  462. package/src/migration-engine/generation-engine.test.ts +292 -110
  463. package/src/migration-engine/generation-engine.ts +117 -66
  464. package/src/migration-engine/shared.ts +14 -0
  465. package/src/mod.ts +95 -39
  466. package/src/naming/sql-naming.ts +181 -0
  467. package/src/outbox/outbox-builder.ts +241 -0
  468. package/src/outbox/outbox.test.ts +424 -0
  469. package/src/outbox/outbox.ts +139 -0
  470. package/src/query/column-defaults.ts +42 -4
  471. package/src/query/condition-builder.test.ts +18 -3
  472. package/src/query/condition-builder.ts +7 -0
  473. package/src/query/cursor-client.test.ts +70 -0
  474. package/src/query/cursor-client.ts +263 -0
  475. package/src/query/cursor.test.ts +119 -20
  476. package/src/query/cursor.ts +88 -27
  477. package/src/query/db-now.ts +73 -0
  478. package/src/query/orm/orm.ts +2 -2
  479. package/src/query/query-type.test.ts +4 -3
  480. package/src/query/serialize/create-sql-serializer.ts +10 -5
  481. package/src/query/serialize/dialect/mysql-serializer.ts +13 -5
  482. package/src/query/serialize/dialect/postgres-serializer.ts +35 -5
  483. package/src/query/serialize/dialect/sqlite-serializer.test.ts +90 -3
  484. package/src/query/serialize/dialect/sqlite-serializer.ts +108 -12
  485. package/src/query/serialize/sql-serializer.ts +4 -4
  486. package/src/query/simple-query-interface.ts +15 -4
  487. package/src/query/unit-of-work/execute-unit-of-work.test.ts +372 -10
  488. package/src/query/unit-of-work/execute-unit-of-work.ts +87 -27
  489. package/src/query/unit-of-work/retry-policy.test.ts +1 -0
  490. package/src/query/unit-of-work/tx-builder.test.ts +73 -1
  491. package/src/query/unit-of-work/unit-of-work-coordinator.test.ts +17 -16
  492. package/src/query/unit-of-work/unit-of-work-types.test.ts +42 -12
  493. package/src/query/unit-of-work/unit-of-work.test.ts +196 -39
  494. package/src/query/unit-of-work/unit-of-work.ts +309 -38
  495. package/src/query/value-decoding.test.ts +63 -4
  496. package/src/query/value-decoding.ts +32 -6
  497. package/src/query/value-encoding.test.ts +86 -2
  498. package/src/query/value-encoding.ts +56 -6
  499. package/src/schema/create.test.ts +293 -47
  500. package/src/schema/create.ts +406 -70
  501. package/src/schema/generate-id.test.ts +3 -2
  502. package/src/schema/generate-id.ts +2 -2
  503. package/src/schema/serialize.test.ts +18 -5
  504. package/src/schema/type-conversion/create-sql-type-mapper.ts +8 -3
  505. package/src/schema/type-conversion/dialect/sqlite.ts +18 -0
  506. package/src/schema/type-conversion/type-mapping.test.ts +26 -1
  507. package/src/schema/validator.test.ts +199 -0
  508. package/src/schema/validator.ts +232 -0
  509. package/src/{adapters/drizzle/generate.test.ts → schema-output/drizzle.test.ts} +232 -129
  510. package/src/{adapters/drizzle/generate.ts → schema-output/drizzle.ts} +155 -99
  511. package/src/schema-output/prisma.test.ts +694 -0
  512. package/src/schema-output/prisma.ts +593 -0
  513. package/src/sql-driver/better-sqlite3.test.ts +5 -3
  514. package/src/sql-driver/dialects/durable-object-dialect.ts +3 -8
  515. package/src/sql-driver/query-executor/default-query-executor.ts +1 -1
  516. package/src/sql-driver/query-executor/query-executor-base.ts +1 -1
  517. package/src/sql-driver/query-executor/query-executor.ts +1 -1
  518. package/src/sql-driver/sql-driver-adapter.ts +2 -2
  519. package/src/sql-driver/sql.ts +2 -1
  520. package/src/sql-driver/sqlocal.test.ts +4 -2
  521. package/src/sync/commands.test.ts +39 -0
  522. package/src/sync/commands.ts +51 -0
  523. package/src/sync/conflict-checker.test.ts +450 -0
  524. package/src/sync/conflict-checker.ts +248 -0
  525. package/src/sync/index.ts +14 -0
  526. package/src/sync/plan.ts +9 -0
  527. package/src/sync/read-tracking.test.ts +177 -0
  528. package/src/sync/read-tracking.ts +287 -0
  529. package/src/sync/submit.test.ts +205 -0
  530. package/src/sync/submit.ts +328 -0
  531. package/src/sync/types.ts +80 -0
  532. package/src/util/default-database-adapter.ts +119 -0
  533. package/src/with-database.ts +20 -31
  534. package/tsconfig.json +1 -1
  535. package/tsdown.config.ts +38 -24
  536. package/vitest.config.ts +1 -0
  537. package/dist/adapters/drizzle/drizzle-adapter.d.ts +0 -20
  538. package/dist/adapters/drizzle/drizzle-adapter.d.ts.map +0 -1
  539. package/dist/adapters/drizzle/drizzle-adapter.js +0 -27
  540. package/dist/adapters/drizzle/drizzle-adapter.js.map +0 -1
  541. package/dist/adapters/drizzle/generate.d.ts +0 -30
  542. package/dist/adapters/drizzle/generate.d.ts.map +0 -1
  543. package/dist/adapters/drizzle/generate.js.map +0 -1
  544. package/dist/adapters/kysely/kysely-adapter.d.ts +0 -19
  545. package/dist/adapters/kysely/kysely-adapter.d.ts.map +0 -1
  546. package/dist/adapters/kysely/kysely-adapter.js +0 -17
  547. package/dist/adapters/kysely/kysely-adapter.js.map +0 -1
  548. package/dist/adapters/shared/table-name-mapper.d.ts +0 -12
  549. package/dist/adapters/shared/table-name-mapper.d.ts.map +0 -1
  550. package/dist/adapters/shared/table-name-mapper.js +0 -43
  551. package/dist/adapters/shared/table-name-mapper.js.map +0 -1
  552. package/dist/node_modules/.pnpm/rou3@0.7.10/node_modules/rou3/dist/index.js +0 -165
  553. package/dist/node_modules/.pnpm/rou3@0.7.10/node_modules/rou3/dist/index.js.map +0 -1
  554. package/dist/packages/fragno/dist/api/bind-services.js +0 -20
  555. package/dist/packages/fragno/dist/api/bind-services.js.map +0 -1
  556. package/dist/packages/fragno/dist/api/error.js +0 -48
  557. package/dist/packages/fragno/dist/api/error.js.map +0 -1
  558. package/dist/packages/fragno/dist/api/fragment-definition-builder.js +0 -320
  559. package/dist/packages/fragno/dist/api/fragment-definition-builder.js.map +0 -1
  560. package/dist/packages/fragno/dist/api/fragment-instantiator.js +0 -525
  561. package/dist/packages/fragno/dist/api/fragment-instantiator.js.map +0 -1
  562. package/dist/packages/fragno/dist/api/fragno-response.js +0 -73
  563. package/dist/packages/fragno/dist/api/fragno-response.js.map +0 -1
  564. package/dist/packages/fragno/dist/api/internal/response-stream.js +0 -81
  565. package/dist/packages/fragno/dist/api/internal/response-stream.js.map +0 -1
  566. package/dist/packages/fragno/dist/api/internal/route.js +0 -10
  567. package/dist/packages/fragno/dist/api/internal/route.js.map +0 -1
  568. package/dist/packages/fragno/dist/api/mutable-request-state.js +0 -97
  569. package/dist/packages/fragno/dist/api/mutable-request-state.js.map +0 -1
  570. package/dist/packages/fragno/dist/api/request-context-storage.js +0 -43
  571. package/dist/packages/fragno/dist/api/request-context-storage.js.map +0 -1
  572. package/dist/packages/fragno/dist/api/request-input-context.js +0 -118
  573. package/dist/packages/fragno/dist/api/request-input-context.js.map +0 -1
  574. package/dist/packages/fragno/dist/api/request-middleware.js +0 -83
  575. package/dist/packages/fragno/dist/api/request-middleware.js.map +0 -1
  576. package/dist/packages/fragno/dist/api/request-output-context.js +0 -119
  577. package/dist/packages/fragno/dist/api/request-output-context.js.map +0 -1
  578. package/dist/packages/fragno/dist/api/route.js +0 -17
  579. package/dist/packages/fragno/dist/api/route.js.map +0 -1
  580. package/dist/packages/fragno/dist/internal/symbols.js +0 -10
  581. package/dist/packages/fragno/dist/internal/symbols.js.map +0 -1
  582. package/dist/schema-generator/schema-generator.d.ts +0 -15
  583. package/dist/schema-generator/schema-generator.d.ts.map +0 -1
  584. package/src/adapters/drizzle/drizzle-adapter.ts +0 -39
  585. package/src/adapters/kysely/kysely-adapter.ts +0 -27
  586. package/src/adapters/shared/table-name-mapper.ts +0 -50
  587. package/src/schema-generator/schema-generator.ts +0 -12
@@ -1,3 +1,4 @@
1
+ import type { TriggeredHook, TriggerHookOptions, HooksMap, HookPayload } from "../../hooks/hooks";
1
2
  import type {
2
3
  AnySchema,
3
4
  AnyTable,
@@ -8,7 +9,13 @@ import type {
8
9
  } from "../../schema/create";
9
10
  import { FragnoId } from "../../schema/create";
10
11
  import { generateId } from "../../schema/generate-id";
12
+ import type { Prettify } from "../../util/types";
11
13
  import type { Condition, ConditionBuilder } from "../condition-builder";
14
+ import { buildCondition } from "../condition-builder";
15
+ import type { CursorResult } from "../cursor";
16
+ import { Cursor } from "../cursor";
17
+ import { dbInterval, dbNow, type DbInterval, type DbIntervalInput, type DbNow } from "../db-now";
18
+ import type { CompiledJoin } from "../orm/orm";
12
19
  import type {
13
20
  SelectClause,
14
21
  TableToInsertValues,
@@ -17,12 +24,6 @@ import type {
17
24
  ExtractSelect,
18
25
  ExtractJoinOut,
19
26
  } from "../simple-query-interface";
20
- import { buildCondition } from "../condition-builder";
21
- import type { CompiledJoin } from "../orm/orm";
22
- import type { CursorResult } from "../cursor";
23
- import { Cursor } from "../cursor";
24
- import type { Prettify } from "../../util/types";
25
- import type { TriggeredHook, TriggerHookOptions, HooksMap, HookPayload } from "../../hooks/hooks";
26
27
 
27
28
  /**
28
29
  * Builder for updateMany operations that supports both whereIndex and set chaining
@@ -33,6 +34,8 @@ export interface UpdateManyBuilder<TTable extends AnyTable> {
33
34
  condition?: (eb: IndexSpecificConditionBuilder<TTable, TIndexName>) => Condition | boolean,
34
35
  ): this;
35
36
  set(values: TableToUpdateValues<TTable>): this;
37
+ now(): DbNow;
38
+ interval(input: DbIntervalInput): DbInterval;
36
39
  }
37
40
 
38
41
  /**
@@ -42,6 +45,12 @@ export type IndexColumns<TIndex extends Index> = TIndex["columnNames"][number];
42
45
 
43
46
  type RemoveEmptyObject<T> = T extends object ? (keyof T extends never ? never : T) : never;
44
47
 
48
+ type ExtractJoinBuilderSelect<T> =
49
+ T extends JoinFindBuilder<infer _Table, infer TSelect, infer _JoinOut> ? TSelect : true;
50
+
51
+ type ExtractJoinBuilderOut<T> =
52
+ T extends JoinFindBuilder<infer _Table, infer _Select, infer TJoinOut> ? TJoinOut : {};
53
+
45
54
  /**
46
55
  * Extract all indexed column names from a table's indexes
47
56
  */
@@ -161,17 +170,18 @@ export type RetrievalOperation<
161
170
  | {
162
171
  type: "find";
163
172
  schema: TSchema;
164
- namespace?: string;
173
+ namespace?: string | null;
165
174
  table: TTable;
166
175
  indexName: string;
167
176
  options: FindOptions<TTable, SelectClause<TTable>>;
168
177
  withCursor?: boolean;
169
178
  withSingleResult?: boolean;
179
+ readTracking?: boolean;
170
180
  }
171
181
  | {
172
182
  type: "count";
173
183
  schema: TSchema;
174
- namespace?: string;
184
+ namespace?: string | null;
175
185
  table: TTable;
176
186
  indexName: string;
177
187
  options: Pick<FindOptions<TTable>, "where" | "useIndex">;
@@ -187,7 +197,7 @@ export type MutationOperation<
187
197
  | {
188
198
  type: "update";
189
199
  schema: TSchema;
190
- namespace?: string;
200
+ namespace?: string | null;
191
201
  table: TTable["name"];
192
202
  id: FragnoId | string;
193
203
  checkVersion: boolean;
@@ -196,7 +206,7 @@ export type MutationOperation<
196
206
  | {
197
207
  type: "create";
198
208
  schema: TSchema;
199
- namespace?: string;
209
+ namespace?: string | null;
200
210
  table: TTable["name"];
201
211
  values: TableToInsertValues<TTable>;
202
212
  generatedExternalId: string;
@@ -204,7 +214,7 @@ export type MutationOperation<
204
214
  | {
205
215
  type: "delete";
206
216
  schema: TSchema;
207
- namespace?: string;
217
+ namespace?: string | null;
208
218
  table: TTable["name"];
209
219
  id: FragnoId | string;
210
220
  checkVersion: boolean;
@@ -212,7 +222,7 @@ export type MutationOperation<
212
222
  | {
213
223
  type: "check";
214
224
  schema: TSchema;
215
- namespace?: string;
225
+ namespace?: string | null;
216
226
  table: TTable["name"];
217
227
  id: FragnoId;
218
228
  };
@@ -222,6 +232,14 @@ export type MutationOperation<
222
232
  */
223
233
  export interface CompiledMutation<TOutput> {
224
234
  query: TOutput;
235
+ /**
236
+ * Original mutation operation for execution metadata (e.g., outbox payloads).
237
+ */
238
+ operation?: MutationOperation<AnySchema>;
239
+ /**
240
+ * Idempotency key for the Unit of Work that produced this mutation.
241
+ */
242
+ uowId?: string;
225
243
  /**
226
244
  * The type of mutation operation (create, update, delete, or check).
227
245
  */
@@ -358,6 +376,7 @@ export class FindBuilder<
358
376
  `Use either select() or selectCount(), not both.`,
359
377
  );
360
378
  }
379
+ // prettier-ignore
361
380
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
362
381
  (this as any).#selectClause = columns;
363
382
  return this as unknown as FindBuilder<TTable, TNewSelect, TJoinOut>;
@@ -567,6 +586,17 @@ export class UpdateBuilder<TTable extends AnyTable> {
567
586
  return this;
568
587
  }
569
588
 
589
+ /**
590
+ * Database timestamp helper for mutation values.
591
+ */
592
+ now(): DbNow {
593
+ return dbNow();
594
+ }
595
+
596
+ interval(input: DbIntervalInput): DbInterval {
597
+ return dbInterval(input);
598
+ }
599
+
570
600
  /**
571
601
  * Enable version checking for optimistic concurrency control
572
602
  * @throws Error if the ID is just a string (no version available)
@@ -703,6 +733,7 @@ export class JoinFindBuilder<
703
733
  select<const TNewSelect extends SelectClause<TTable>>(
704
734
  columns: TNewSelect,
705
735
  ): JoinFindBuilder<TTable, TNewSelect, TJoinOut> {
736
+ // prettier-ignore
706
737
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
707
738
  (this as any).#selectClause = columns;
708
739
  return this as unknown as JoinFindBuilder<TTable, TNewSelect, TJoinOut>;
@@ -801,15 +832,22 @@ export type IndexedJoinBuilder<TTable extends AnyTable, TJoinOut> = {
801
832
  infer TRelationType,
802
833
  infer TTargetTable
803
834
  >
804
- ? <TSelect extends SelectClause<TTable["relations"][K]["table"]> = true, TNestedJoinOut = {}>(
805
- builderFn?: (
806
- builder: JoinFindBuilder<TTable["relations"][K]["table"]>,
807
- ) => JoinFindBuilder<TTable["relations"][K]["table"], TSelect, TNestedJoinOut>,
835
+ ? <
836
+ TBuilderFn extends (builder: JoinFindBuilder<TTable["relations"][K]["table"]>) => unknown =
837
+ (
838
+ builder: JoinFindBuilder<TTable["relations"][K]["table"]>,
839
+ ) => JoinFindBuilder<TTable["relations"][K]["table"]>,
840
+ >(
841
+ builderFn?: TBuilderFn,
808
842
  ) => IndexedJoinBuilder<
809
843
  TTable,
810
844
  TJoinOut & {
811
845
  [P in K]: MapRelationType<
812
- SelectResult<TTargetTable, TNestedJoinOut, TSelect>
846
+ SelectResult<
847
+ TTargetTable,
848
+ ExtractJoinBuilderOut<ReturnType<TBuilderFn>>,
849
+ ExtractJoinBuilderSelect<ReturnType<TBuilderFn>>
850
+ >
813
851
  >[TRelationType];
814
852
  }
815
853
  >
@@ -832,7 +870,7 @@ export function buildJoinIndexed<TTable extends AnyTable, TJoinOut>(
832
870
 
833
871
  builder[name] = (builderFn?: (b: JoinFindBuilder<AnyTable>) => JoinFindBuilder<AnyTable>) => {
834
872
  // Create join builder for this relation's table
835
- const joinBuilder = new JoinFindBuilder(relation.table.ormName, relation.table);
873
+ const joinBuilder = new JoinFindBuilder(relation.table.name, relation.table);
836
874
  if (builderFn) {
837
875
  builderFn(joinBuilder);
838
876
  }
@@ -933,10 +971,16 @@ export interface IUnitOfWork {
933
971
  ): TypedUnitOfWork<TOtherSchema, [], any, TOtherHooks>;
934
972
 
935
973
  // Schema registration (for cross-fragment operations like hooks)
936
- registerSchema(schema: AnySchema, namespace: string): void;
937
-
938
- // Hook triggering (schema-agnostic, string-based hook names)
939
- triggerHook(hookName: string, payload: unknown, options?: TriggerHookOptions): void;
974
+ registerSchema(schema: AnySchema, namespace: string | null): void;
975
+
976
+ // Hook triggering (schema-agnostic, string-based hook names).
977
+ // Namespace identifies which fragment/dispatcher owns this hook.
978
+ triggerHook(
979
+ namespace: string,
980
+ hookName: string,
981
+ payload: unknown,
982
+ options?: TriggerHookOptions,
983
+ ): void;
940
984
 
941
985
  getTriggeredHooks(): readonly TriggeredHook[];
942
986
  }
@@ -948,14 +992,55 @@ export interface IUnitOfWork {
948
992
  *
949
993
  * Note: This is just a marker interface. Restriction is enforced by the UnitOfWork class itself.
950
994
  */
951
- export interface IUnitOfWorkRestricted
952
- extends Omit<IUnitOfWork, "executeRetrieve" | "executeMutations"> {}
995
+ export interface IUnitOfWorkRestricted extends Omit<
996
+ IUnitOfWork,
997
+ "executeRetrieve" | "executeMutations"
998
+ > {}
999
+
1000
+ export type UOWInstrumentationPhase =
1001
+ | "beforeRetrieve"
1002
+ | "afterRetrieve"
1003
+ | "beforeMutate"
1004
+ | "afterMutate";
1005
+
1006
+ export type UOWInstrumentationInjection =
1007
+ | { type: "conflict"; reason?: string }
1008
+ | { type: "error"; error: Error };
1009
+
1010
+ export type UOWInstrumentationContext = {
1011
+ phase: UOWInstrumentationPhase;
1012
+ uowName?: string;
1013
+ idempotencyKey: string;
1014
+ retrievalOpsCount: number;
1015
+ mutationOpsCount: number;
1016
+ uow: IUnitOfWork;
1017
+ };
1018
+
1019
+ export type UOWInstrumentation = {
1020
+ beforeRetrieve?: (
1021
+ ctx: UOWInstrumentationContext,
1022
+ ) => void | Promise<void> | UOWInstrumentationInjection;
1023
+ afterRetrieve?: (
1024
+ ctx: UOWInstrumentationContext,
1025
+ ) => void | Promise<void> | UOWInstrumentationInjection;
1026
+ beforeMutate?: (
1027
+ ctx: UOWInstrumentationContext,
1028
+ ) => void | Promise<void> | UOWInstrumentationInjection;
1029
+ afterMutate?: (
1030
+ ctx: UOWInstrumentationContext,
1031
+ ) => void | Promise<void> | UOWInstrumentationInjection;
1032
+ };
1033
+
1034
+ export type UOWInstrumentationFinalizer = {
1035
+ afterRetrieve?: (ctx: UOWInstrumentationContext) => void | Promise<void>;
1036
+ afterMutate?: (ctx: UOWInstrumentationContext) => void | Promise<void>;
1037
+ };
953
1038
 
954
1039
  export function createUnitOfWork(
955
1040
  compiler: UOWCompiler<unknown>,
956
1041
  executor: UOWExecutor<unknown, unknown>,
957
1042
  decoder: UOWDecoder<unknown>,
958
- schemaNamespaceMap?: WeakMap<AnySchema, string>,
1043
+ schemaNamespaceMap?: WeakMap<AnySchema, string | null>,
959
1044
  name?: string,
960
1045
  ): UnitOfWork {
961
1046
  return new UnitOfWork(compiler, executor, decoder, name, undefined, schemaNamespaceMap);
@@ -965,6 +1050,16 @@ export interface UnitOfWorkConfig {
965
1050
  dryRun?: boolean;
966
1051
  onQuery?: (query: unknown) => void;
967
1052
  idempotencyKey?: string;
1053
+ instrumentation?: UOWInstrumentation;
1054
+ instrumentationFinalizer?: UOWInstrumentationFinalizer;
1055
+ }
1056
+
1057
+ function isUowInstrumentationInjection(value: unknown): value is UOWInstrumentationInjection {
1058
+ if (!value || typeof value !== "object") {
1059
+ return false;
1060
+ }
1061
+ const injection = value as UOWInstrumentationInjection;
1062
+ return injection.type === "conflict" || injection.type === "error";
968
1063
  }
969
1064
 
970
1065
  /**
@@ -1207,10 +1302,11 @@ export class UnitOfWork<const TRawInput = unknown> implements IUnitOfWork {
1207
1302
  #compiler: UOWCompiler<unknown>;
1208
1303
  #executor: UOWExecutor<unknown, TRawInput>;
1209
1304
  #decoder: UOWDecoder<TRawInput>;
1210
- #schemaNamespaceMap: WeakMap<AnySchema, string>;
1305
+ #schemaNamespaceMap: WeakMap<AnySchema, string | null>;
1211
1306
 
1212
1307
  #retrievalResults?: unknown[];
1213
1308
  #createdInternalIds: (bigint | null)[] = [];
1309
+ #readTrackingEnabled = false;
1214
1310
 
1215
1311
  // Phase coordination promises
1216
1312
  #retrievalPhaseDeferred = new DeferredPromise<unknown[]>();
@@ -1232,7 +1328,7 @@ export class UnitOfWork<const TRawInput = unknown> implements IUnitOfWork {
1232
1328
  decoder: UOWDecoder<TRawInput>,
1233
1329
  name?: string,
1234
1330
  config?: UnitOfWorkConfig,
1235
- schemaNamespaceMap?: WeakMap<AnySchema, string>,
1331
+ schemaNamespaceMap?: WeakMap<AnySchema, string | null>,
1236
1332
  ) {
1237
1333
  this.#compiler = compiler;
1238
1334
  this.#executor = executor;
@@ -1243,12 +1339,67 @@ export class UnitOfWork<const TRawInput = unknown> implements IUnitOfWork {
1243
1339
  this.#idempotencyKey = config?.idempotencyKey ?? crypto.randomUUID();
1244
1340
  }
1245
1341
 
1342
+ #createInstrumentationContext(phase: UOWInstrumentationPhase): UOWInstrumentationContext {
1343
+ return {
1344
+ phase,
1345
+ uowName: this.#name,
1346
+ idempotencyKey: this.#idempotencyKey,
1347
+ retrievalOpsCount: this.#retrievalOps.length,
1348
+ mutationOpsCount: this.#mutationOps.length,
1349
+ uow: this,
1350
+ };
1351
+ }
1352
+
1353
+ async #runInstrumentation(
1354
+ phase: UOWInstrumentationPhase,
1355
+ ): Promise<UOWInstrumentationInjection | null> {
1356
+ const hook = this.#config?.instrumentation?.[phase];
1357
+ if (!hook) {
1358
+ return null;
1359
+ }
1360
+
1361
+ const result = await hook(this.#createInstrumentationContext(phase));
1362
+ if (isUowInstrumentationInjection(result)) {
1363
+ return result;
1364
+ }
1365
+
1366
+ return null;
1367
+ }
1368
+
1369
+ async #runInstrumentationFinalizer(phase: "afterRetrieve" | "afterMutate"): Promise<void> {
1370
+ const hook = this.#config?.instrumentationFinalizer?.[phase];
1371
+ if (!hook) {
1372
+ return;
1373
+ }
1374
+
1375
+ await hook(this.#createInstrumentationContext(phase));
1376
+ }
1377
+
1378
+ #handleRetrieveInjection(injection: UOWInstrumentationInjection): never {
1379
+ if (injection.type === "error") {
1380
+ throw injection.error;
1381
+ }
1382
+
1383
+ throw new Error(injection.reason ?? "Injected conflict");
1384
+ }
1385
+
1386
+ #handleMutationInjection(injection: UOWInstrumentationInjection): { success: false } | never {
1387
+ if (injection.type === "error") {
1388
+ throw injection.error;
1389
+ }
1390
+
1391
+ this.#state = "executed";
1392
+ this.#createdInternalIds.length = 0;
1393
+ this.#mutationPhaseDeferred.resolve();
1394
+ return { success: false };
1395
+ }
1396
+
1246
1397
  /**
1247
1398
  * Register a schema with its namespace for cross-fragment operations.
1248
1399
  * This is used for internal fragments like hooks that need to create
1249
1400
  * records in a different schema during the same transaction.
1250
1401
  */
1251
- registerSchema(schema: AnySchema, namespace: string): void {
1402
+ registerSchema(schema: AnySchema, namespace: string | null): void {
1252
1403
  this.#schemaNamespaceMap.set(schema, namespace);
1253
1404
  }
1254
1405
 
@@ -1299,6 +1450,7 @@ export class UnitOfWork<const TRawInput = unknown> implements IUnitOfWork {
1299
1450
  child.#mutationOps = this.#mutationOps;
1300
1451
  child.#retrievalResults = this.#retrievalResults;
1301
1452
  child.#createdInternalIds = this.#createdInternalIds;
1453
+ child.#readTrackingEnabled = this.#readTrackingEnabled;
1302
1454
  child.#retrievalPhaseDeferred = this.#retrievalPhaseDeferred;
1303
1455
  child.#mutationPhaseDeferred = this.#mutationPhaseDeferred;
1304
1456
  child.#retrievalError = this.#retrievalError;
@@ -1348,6 +1500,7 @@ export class UnitOfWork<const TRawInput = unknown> implements IUnitOfWork {
1348
1500
  this.#mutationOps = [];
1349
1501
  this.#retrievalResults = undefined;
1350
1502
  this.#createdInternalIds = [];
1503
+ this.#readTrackingEnabled = false;
1351
1504
 
1352
1505
  // Reset state
1353
1506
  this.#state = "building-retrieval";
@@ -1368,8 +1521,14 @@ export class UnitOfWork<const TRawInput = unknown> implements IUnitOfWork {
1368
1521
  /**
1369
1522
  * Trigger a hook to be executed after the transaction commits.
1370
1523
  */
1371
- triggerHook(hookName: string, payload: unknown, options?: TriggerHookOptions): void {
1524
+ triggerHook(
1525
+ namespace: string,
1526
+ hookName: string,
1527
+ payload: unknown,
1528
+ options?: TriggerHookOptions,
1529
+ ): void {
1372
1530
  this.#triggeredHooks.push({
1531
+ namespace,
1373
1532
  hookName,
1374
1533
  payload,
1375
1534
  options,
@@ -1387,6 +1546,14 @@ export class UnitOfWork<const TRawInput = unknown> implements IUnitOfWork {
1387
1546
  return this.#coordinator.parent?.state ?? this.#state;
1388
1547
  }
1389
1548
 
1549
+ enableReadTracking(): void {
1550
+ this.#readTrackingEnabled = true;
1551
+ }
1552
+
1553
+ get readTrackingEnabled(): boolean {
1554
+ return this.#readTrackingEnabled;
1555
+ }
1556
+
1390
1557
  get name(): string | undefined {
1391
1558
  return this.#name;
1392
1559
  }
@@ -1426,13 +1593,25 @@ export class UnitOfWork<const TRawInput = unknown> implements IUnitOfWork {
1426
1593
  );
1427
1594
  }
1428
1595
 
1596
+ let afterRan = false;
1597
+ let failed = false;
1429
1598
  try {
1430
1599
  // Wait for all children to signal readiness
1431
1600
  await this.#coordinator.retrievalReadinessPromise;
1432
1601
 
1602
+ const beforeInjection = await this.#runInstrumentation("beforeRetrieve");
1603
+ if (beforeInjection) {
1604
+ return this.#handleRetrieveInjection(beforeInjection);
1605
+ }
1606
+
1433
1607
  if (this.#retrievalOps.length === 0) {
1434
1608
  this.#state = "building-mutation";
1435
1609
  const emptyResults: unknown[] = [];
1610
+ afterRan = true;
1611
+ const afterInjection = await this.#runInstrumentation("afterRetrieve");
1612
+ if (afterInjection) {
1613
+ return this.#handleRetrieveInjection(afterInjection);
1614
+ }
1436
1615
  this.#retrievalPhaseDeferred.resolve(emptyResults);
1437
1616
  return emptyResults;
1438
1617
  }
@@ -1450,6 +1629,11 @@ export class UnitOfWork<const TRawInput = unknown> implements IUnitOfWork {
1450
1629
  if (this.#config?.dryRun) {
1451
1630
  this.#state = "executed";
1452
1631
  const emptyResults: unknown[] = [];
1632
+ afterRan = true;
1633
+ const afterInjection = await this.#runInstrumentation("afterRetrieve");
1634
+ if (afterInjection) {
1635
+ return this.#handleRetrieveInjection(afterInjection);
1636
+ }
1453
1637
  this.#retrievalPhaseDeferred.resolve(emptyResults);
1454
1638
  return emptyResults;
1455
1639
  }
@@ -1462,12 +1646,33 @@ export class UnitOfWork<const TRawInput = unknown> implements IUnitOfWork {
1462
1646
  this.#retrievalResults = results;
1463
1647
  this.#state = "building-mutation";
1464
1648
 
1649
+ afterRan = true;
1650
+ const afterInjection = await this.#runInstrumentation("afterRetrieve");
1651
+ if (afterInjection) {
1652
+ return this.#handleRetrieveInjection(afterInjection);
1653
+ }
1654
+
1465
1655
  this.#retrievalPhaseDeferred.resolve(this.#retrievalResults);
1466
1656
 
1467
1657
  return this.#retrievalResults;
1468
1658
  } catch (error) {
1469
1659
  this.#retrievalError = error instanceof Error ? error : new Error(String(error));
1660
+ failed = true;
1470
1661
  throw error;
1662
+ } finally {
1663
+ try {
1664
+ await this.#runInstrumentationFinalizer("afterRetrieve");
1665
+ } catch {
1666
+ // Ignore finalizer errors when unwinding failures.
1667
+ }
1668
+
1669
+ if (!afterRan && failed) {
1670
+ try {
1671
+ await this.#runInstrumentation("afterRetrieve");
1672
+ } catch {
1673
+ // Ignore after-retrieve hook errors when unwinding failures.
1674
+ }
1675
+ }
1471
1676
  }
1472
1677
  }
1473
1678
 
@@ -1484,15 +1689,23 @@ export class UnitOfWork<const TRawInput = unknown> implements IUnitOfWork {
1484
1689
  throw new Error(`Cannot execute mutations from state ${this.#state}.`);
1485
1690
  }
1486
1691
 
1692
+ let afterRan = false;
1693
+ let failed = false;
1487
1694
  try {
1488
1695
  // Wait for all children to signal readiness
1489
1696
  await this.#coordinator.mutationReadinessPromise;
1490
1697
 
1698
+ const beforeInjection = await this.#runInstrumentation("beforeMutate");
1699
+ if (beforeInjection) {
1700
+ return this.#handleMutationInjection(beforeInjection);
1701
+ }
1702
+
1491
1703
  // Compile mutation operations using single compiler
1492
1704
  const mutationBatch: CompiledMutation<unknown>[] = [];
1493
1705
  for (const op of this.#mutationOps) {
1494
1706
  const compiled = this.#compiler.compileMutationOperation(op);
1495
1707
  if (compiled !== null) {
1708
+ compiled.uowId = this.#idempotencyKey;
1496
1709
  this.#config?.onQuery?.(compiled);
1497
1710
  mutationBatch.push(compiled);
1498
1711
  }
@@ -1500,6 +1713,11 @@ export class UnitOfWork<const TRawInput = unknown> implements IUnitOfWork {
1500
1713
 
1501
1714
  if (this.#config?.dryRun) {
1502
1715
  this.#state = "executed";
1716
+ afterRan = true;
1717
+ const afterInjection = await this.#runInstrumentation("afterMutate");
1718
+ if (afterInjection) {
1719
+ return this.#handleMutationInjection(afterInjection);
1720
+ }
1503
1721
  this.#mutationPhaseDeferred.resolve();
1504
1722
  return {
1505
1723
  success: true,
@@ -1516,6 +1734,12 @@ export class UnitOfWork<const TRawInput = unknown> implements IUnitOfWork {
1516
1734
  this.#createdInternalIds.push(...result.createdInternalIds);
1517
1735
  }
1518
1736
 
1737
+ afterRan = true;
1738
+ const afterInjection = await this.#runInstrumentation("afterMutate");
1739
+ if (afterInjection) {
1740
+ return this.#handleMutationInjection(afterInjection);
1741
+ }
1742
+
1519
1743
  // Resolve the mutation phase promise to unblock waiting service methods
1520
1744
  this.#mutationPhaseDeferred.resolve();
1521
1745
 
@@ -1524,7 +1748,22 @@ export class UnitOfWork<const TRawInput = unknown> implements IUnitOfWork {
1524
1748
  };
1525
1749
  } catch (error) {
1526
1750
  this.#mutationError = error instanceof Error ? error : new Error(String(error));
1751
+ failed = true;
1527
1752
  throw error;
1753
+ } finally {
1754
+ try {
1755
+ await this.#runInstrumentationFinalizer("afterMutate");
1756
+ } catch {
1757
+ // Ignore finalizer errors when unwinding failures.
1758
+ }
1759
+
1760
+ if (!afterRan && failed) {
1761
+ try {
1762
+ await this.#runInstrumentation("afterMutate");
1763
+ } catch {
1764
+ // Ignore after-mutate hook errors when unwinding failures.
1765
+ }
1766
+ }
1528
1767
  }
1529
1768
  }
1530
1769
 
@@ -1623,6 +1862,7 @@ export class UnitOfWork<const TRawInput = unknown> implements IUnitOfWork {
1623
1862
  for (const op of this.#mutationOps) {
1624
1863
  const compiled = compiler.compileMutationOperation(op);
1625
1864
  if (compiled !== null) {
1865
+ compiled.uowId = this.#idempotencyKey;
1626
1866
  mutationBatch.push(compiled);
1627
1867
  }
1628
1868
  }
@@ -1645,20 +1885,22 @@ export class TypedUnitOfWork<
1645
1885
  const TRetrievalResults extends unknown[] = [],
1646
1886
  const TRawInput = unknown,
1647
1887
  const THooks extends HooksMap = {},
1648
- > implements IUnitOfWork
1649
- {
1888
+ > {
1650
1889
  #schema: TSchema;
1651
- #namespace?: string;
1890
+ #namespace?: string | null;
1652
1891
  #uow: UnitOfWork<TRawInput>;
1653
1892
  #operationIndices: number[] = [];
1654
1893
  #cachedRetrievalPhase?: Promise<TRetrievalResults>;
1655
1894
 
1656
- constructor(schema: TSchema, namespace: string | undefined, uow: UnitOfWork<TRawInput>) {
1895
+ constructor(schema: TSchema, namespace: string | null | undefined, uow: UnitOfWork<TRawInput>) {
1657
1896
  this.#schema = schema;
1658
1897
  this.#namespace = namespace;
1659
1898
  this.#uow = uow;
1660
1899
  }
1661
1900
 
1901
+ /**
1902
+ * Type-only access to retrieval results for this typed UOW.
1903
+ */
1662
1904
  get $results(): Prettify<TRetrievalResults> {
1663
1905
  throw new Error("type only");
1664
1906
  }
@@ -1746,7 +1988,21 @@ export class TypedUnitOfWork<
1746
1988
  return this.#uow.forSchema<TOtherSchema, TOtherHooks>(schema, hooks);
1747
1989
  }
1748
1990
 
1749
- registerSchema(schema: AnySchema, namespace: string): void {
1991
+ /**
1992
+ * Database timestamp helper for inserts.
1993
+ */
1994
+ now(): DbNow {
1995
+ return dbNow();
1996
+ }
1997
+
1998
+ /**
1999
+ * Build a database interval for use with now().plus(...).
2000
+ */
2001
+ interval(input: DbIntervalInput): DbInterval {
2002
+ return dbInterval(input);
2003
+ }
2004
+
2005
+ registerSchema(schema: AnySchema, namespace: string | null): void {
1750
2006
  this.#uow.registerSchema(schema, namespace);
1751
2007
  }
1752
2008
 
@@ -1823,6 +2079,7 @@ export class TypedUnitOfWork<
1823
2079
  indexName,
1824
2080
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
1825
2081
  options: options as any,
2082
+ readTracking: this.#uow.readTrackingEnabled,
1826
2083
  });
1827
2084
 
1828
2085
  // Track which operation index belongs to this view
@@ -1901,6 +2158,7 @@ export class TypedUnitOfWork<
1901
2158
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
1902
2159
  options: options as any,
1903
2160
  withSingleResult: true,
2161
+ readTracking: this.#uow.readTrackingEnabled,
1904
2162
  });
1905
2163
 
1906
2164
  // Track which operation index belongs to this view
@@ -1949,6 +2207,7 @@ export class TypedUnitOfWork<
1949
2207
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
1950
2208
  options: options as any,
1951
2209
  withCursor: true,
2210
+ readTracking: this.#uow.readTrackingEnabled,
1952
2211
  });
1953
2212
 
1954
2213
  // Track which operation index belongs to this view
@@ -1989,7 +2248,7 @@ export class TypedUnitOfWork<
1989
2248
  let updatedValues = values;
1990
2249
 
1991
2250
  // Check if ID value is provided in values
1992
- const providedIdValue = (values as Record<string, unknown>)[idColumn.ormName];
2251
+ const providedIdValue = (values as Record<string, unknown>)[idColumn.name];
1993
2252
 
1994
2253
  if (providedIdValue !== undefined) {
1995
2254
  // Extract string from FragnoId or use string directly
@@ -2007,7 +2266,7 @@ export class TypedUnitOfWork<
2007
2266
  const generated = idColumn.generateDefaultValue();
2008
2267
  if (generated === undefined) {
2009
2268
  throw new Error(
2010
- `No ID value provided and ID column ${idColumn.ormName} has no default generator`,
2269
+ `No ID value provided and ID column ${idColumn.name} has no default generator`,
2011
2270
  );
2012
2271
  }
2013
2272
  externalId = generated as string;
@@ -2015,7 +2274,7 @@ export class TypedUnitOfWork<
2015
2274
  // Add the generated ID to values so it's used in the insert
2016
2275
  updatedValues = {
2017
2276
  ...values,
2018
- [idColumn.ormName]: externalId,
2277
+ [idColumn.name]: externalId,
2019
2278
  } as TableToInsertValues<TSchema["tables"][TableName]>;
2020
2279
  }
2021
2280
 
@@ -2105,15 +2364,27 @@ export class TypedUnitOfWork<
2105
2364
  throw new Error("type only");
2106
2365
  }
2107
2366
 
2367
+ get namespace(): string | null | undefined {
2368
+ return this.#namespace;
2369
+ }
2370
+
2108
2371
  /**
2109
2372
  * Trigger a hook to be executed after the transaction commits.
2373
+ * The namespace is automatically injected from this typed view's schema registration.
2110
2374
  */
2111
2375
  triggerHook<K extends keyof THooks & string>(
2112
2376
  hookName: K,
2113
2377
  payload: HookPayload<THooks[K]>,
2114
2378
  options?: TriggerHookOptions,
2115
2379
  ): void {
2116
- this.#uow.triggerHook(hookName, payload, options);
2380
+ if (this.#namespace === undefined) {
2381
+ throw new Error(
2382
+ "Cannot trigger hook: schema has no registered namespace. " +
2383
+ "Ensure the schema is registered with a namespace via registerSchema().",
2384
+ );
2385
+ }
2386
+ const hookNamespace = this.#namespace ?? this.#schema.name;
2387
+ this.#uow.triggerHook(hookNamespace, hookName, payload, options);
2117
2388
  }
2118
2389
 
2119
2390
  getTriggeredHooks(): ReadonlyArray<TriggeredHook> {