@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
@@ -0,0 +1,146 @@
1
+ import { DbNow } from "../query/db-now.js";
2
+ import { FragnoId } from "../schema/create.js";
3
+ import { RetryPolicy } from "../query/unit-of-work/retry-policy.js";
4
+ import { ExecuteTxOptions, HandlerTxBuilder } from "../query/unit-of-work/execute-unit-of-work.js";
5
+ import "../fragments/internal-fragment.js";
6
+ import { DurableHooksLoggerConfig } from "./durable-hooks-logger.js";
7
+ import "../query/unit-of-work/unit-of-work.js";
8
+
9
+ //#region src/hooks/hooks.d.ts
10
+
11
+ /**
12
+ * Context available in hook functions via `this`.
13
+ * Contains the idempotency key for idempotency and database access.
14
+ */
15
+ interface HookContext {
16
+ /**
17
+ * Unique idempotency key for this transaction.
18
+ * Use this for idempotency checks in your hook implementation.
19
+ */
20
+ idempotencyKey: string;
21
+ /**
22
+ * Hook event identifier (versioned FragnoId).
23
+ */
24
+ hookId: FragnoId;
25
+ /**
26
+ * Hook name for this event.
27
+ */
28
+ hookName: string;
29
+ /**
30
+ * Current status of the hook event.
31
+ */
32
+ status: HookStatus;
33
+ /**
34
+ * Attempt count for this hook event.
35
+ */
36
+ attempts: number;
37
+ /**
38
+ * Maximum attempts configured for this hook event.
39
+ */
40
+ maxAttempts: number;
41
+ /**
42
+ * Timestamp of the last attempt (if any).
43
+ */
44
+ lastAttemptAt: Date | null;
45
+ /**
46
+ * Next scheduled retry timestamp (if any).
47
+ */
48
+ nextRetryAt: Date | null;
49
+ /**
50
+ * When the hook event was created.
51
+ */
52
+ createdAt: Date;
53
+ /**
54
+ * Create a handler transaction builder to run atomic operations.
55
+ */
56
+ handlerTx: HookHandlerTx;
57
+ }
58
+ declare const hookStatusValues: readonly ["pending", "processing", "completed", "failed"];
59
+ type HookStatus = (typeof hookStatusValues)[number];
60
+ /**
61
+ * A hook function signature.
62
+ * Hooks receive a typed payload and access context via `this`.
63
+ */
64
+ type HookFn<TPayload = unknown> = (payload: TPayload) => void | Promise<void>;
65
+ /**
66
+ * Map of hook names to hook functions.
67
+ * Used for type-safe hook definitions and triggering.
68
+ */
69
+ type HooksMap = Record<string, HookFn<any>>;
70
+ /**
71
+ * Extract the payload type from a hook function.
72
+ */
73
+ type HookPayload<T> = T extends HookFn<infer P> ? P : never;
74
+ /**
75
+ * Options for triggering a hook.
76
+ */
77
+ interface TriggerHookOptions {
78
+ /**
79
+ * Optional retry policy override for this specific hook trigger.
80
+ * If not provided, uses the default retry policy.
81
+ */
82
+ retryPolicy?: RetryPolicy;
83
+ /**
84
+ * Optional hook event ID. When provided, the hook insert will fail if a hook
85
+ * with the same ID already exists.
86
+ */
87
+ id?: string | FragnoId;
88
+ /**
89
+ * Absolute time for the first attempt. If in the future, the hook is
90
+ * scheduled for that time; if in the past, it runs immediately.
91
+ */
92
+ processAt?: Date | DbNow;
93
+ }
94
+ /**
95
+ * Internal representation of a triggered hook.
96
+ * Stored in the Unit of Work before execution.
97
+ */
98
+ interface TriggeredHook {
99
+ namespace: string;
100
+ hookName: string;
101
+ payload: unknown;
102
+ options?: TriggerHookOptions;
103
+ }
104
+ type StuckHookProcessingTimeoutMinutes = number | false;
105
+ type StuckHookProcessingEvent = {
106
+ id: FragnoId;
107
+ hookName: string;
108
+ attempts: number;
109
+ maxAttempts: number;
110
+ lastAttemptAt: Date | null;
111
+ nextRetryAt: Date | null;
112
+ };
113
+ type StuckHookProcessingInfo = {
114
+ namespace: string;
115
+ timeoutMinutes: number;
116
+ events: StuckHookProcessingEvent[];
117
+ };
118
+ type DurableHooksProcessingOptions = {
119
+ /**
120
+ * Re-queue hooks that have been in `processing` for at least this many minutes.
121
+ * Use `false` to disable stuck-processing recovery entirely.
122
+ * Values <= 0 are treated as `false`.
123
+ *
124
+ * Default: 10 minutes.
125
+ */
126
+ stuckProcessingTimeoutMinutes?: StuckHookProcessingTimeoutMinutes;
127
+ /**
128
+ * Automatically schedule hook processing after successful mutations.
129
+ * Defaults to true. Set false to disable auto scheduling (manual drain only).
130
+ */
131
+ autoSchedule?: boolean;
132
+ /**
133
+ * Called when stuck processing hooks are detected and re-queued.
134
+ * Invoked after the hooks are moved back to `pending`.
135
+ */
136
+ onStuckProcessingHooks?: (info: StuckHookProcessingInfo) => void;
137
+ /**
138
+ * Durable hooks logging controls.
139
+ * Defaults: enabled=true, level="warn".
140
+ */
141
+ logging?: DurableHooksLoggerConfig;
142
+ };
143
+ type HookHandlerTx = (execOptions?: Omit<ExecuteTxOptions, "createUnitOfWork">) => HandlerTxBuilder<readonly [], [], [], unknown, unknown, false, false, false, false, HooksMap>;
144
+ //#endregion
145
+ export { DurableHooksProcessingOptions, HookContext, HookFn, HookHandlerTx, HookPayload, HooksMap, StuckHookProcessingEvent, StuckHookProcessingInfo, StuckHookProcessingTimeoutMinutes, TriggerHookOptions, TriggeredHook };
146
+ //# sourceMappingURL=hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.d.ts","names":[],"sources":["../../../src/hooks/hooks.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;AAgBA;;AAiBU,UAjBO,WAAA,CAiBP;EAYO;;;;EAYS,cAAA,EAAA,MAAA;EAGb;AAEb;AAgBA;EAOY,MAAA,EA5DF,QA4DU;EAKR;;;EAA6C,QAAA,EAAA,MAAA;EAAC;AAK1D;;EAUgB,MAAA,EAxEN,UAwEM;EAKF;;;EAOG,QAAA,EAAA,MAAa;EAyElB;AAEZ;;EAKiB,WAAA,EAAA,MAAA;EACF;;AAGf;EAMY,aAAA,EAlKK,IAkKL,GAAA,IAAA;EAQsB;;;EAeE,WAAA,EArLrB,IAqLqB,GAAA,IAAA;EAGxB;;;EAE6E,SAAA,EAtL5E,IAsL4E;EAApF;;;aAlLQ;;cAGA;KAED,UAAA,WAAqB;;;;;KAgBrB,uCAAuC,oBAAoB;;;;;KAO3D,QAAA,GAAW,eAAe;;;;KAK1B,iBAAiB,UAAU,kBAAkB;;;;UAKxC,kBAAA;;;;;gBAKD;;;;;gBAKA;;;;;cAKF,OAAO;;;;;;UAOJ,aAAA;;;;YAIL;;KAqEA,iCAAA;KAEA,wBAAA;MACN;;;;iBAIW;eACF;;KAGH,uBAAA;;;UAGF;;KAGE,6BAAA;;;;;;;;kCAQsB;;;;;;;;;;kCAUA;;;;;YAKtB;;KAGA,aAAA,kBACI,KAAK,0CAChB,oFAAoF"}
@@ -0,0 +1 @@
1
+ import "@fragno-dev/core";
@@ -0,0 +1,4 @@
1
+ import "../sync/types.js";
2
+ import "../fragments/internal-fragment.js";
3
+ import "../adapters/adapters.js";
4
+ import "./outbox-state.js";
@@ -0,0 +1,2 @@
1
+ import "../outbox/outbox.js";
2
+ import "../adapters/adapters.js";
@@ -0,0 +1,15 @@
1
+ import { DbInterval, DbIntervalInput, DbNow, dbInterval, dbNow } from "./query/db-now.js";
2
+ import { Cursor, CursorData, CursorResult, createCursorFromRecord, decodeCursor } from "./query/cursor.js";
3
+ import { BuilderTransformContextWithMutate, BuilderTransformContextWithoutMutate, ExtractServiceFinalResults, ExtractServiceRetrieveResults, HandlerBuilderMutateContext, HandlerTxBuilder, ServiceBuilderMutateContext, ServiceTxBuilder, TxResult, createHandlerTxBuilder, createServiceTxBuilder } from "./query/unit-of-work/execute-unit-of-work.js";
4
+ import { SubmitAppliedResponse, SubmitConflictReason, SubmitConflictResponse, SubmitRequest, SubmitResponse, SyncCommandDefinition, SyncCommandHandler, SyncCommandRegistry, SyncCommandTxFactory } from "./sync/types.js";
5
+ import { IUnitOfWork, IUnitOfWorkRestricted, TypedUnitOfWork, UOWCompiler, UOWDecoder, UOWExecutor, UnitOfWork, createUnitOfWork } from "./query/unit-of-work/unit-of-work.js";
6
+ import { withDatabase as withDatabase$1 } from "./with-database.js";
7
+ import { defineSyncCommands } from "./sync/commands.js";
8
+ import { migrate as migrate$1 } from "./mod2.js";
9
+
10
+ //#region src/browser/mod.d.ts
11
+ declare const withDatabase: typeof withDatabase$1;
12
+ declare const migrate: typeof migrate$1;
13
+ //#endregion
14
+ export { type BuilderTransformContextWithMutate, type BuilderTransformContextWithoutMutate, Cursor, type CursorData, type CursorResult, type DbInterval, type DbIntervalInput, type DbNow, type ExtractServiceFinalResults, type ExtractServiceRetrieveResults, type HandlerBuilderMutateContext, HandlerTxBuilder, type IUnitOfWork, type IUnitOfWorkRestricted, type ServiceBuilderMutateContext, ServiceTxBuilder, type SubmitAppliedResponse, type SubmitConflictReason, type SubmitConflictResponse, type SubmitRequest, type SubmitResponse, type SyncCommandDefinition, type SyncCommandHandler, type SyncCommandRegistry, type SyncCommandTxFactory, type TxResult, TypedUnitOfWork, type UOWCompiler, type UOWDecoder, type UOWExecutor, UnitOfWork, createCursorFromRecord, createHandlerTxBuilder, createServiceTxBuilder, createUnitOfWork, dbInterval, dbNow, decodeCursor, defineSyncCommands, migrate, withDatabase };
15
+ //# sourceMappingURL=mod.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mod.d.ts","names":[],"sources":["../../src/browser/mod.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;cA4Ca,qBAAqB;cAIrB,gBAAgB"}
@@ -0,0 +1,17 @@
1
+ import { HandlerTxBuilder, ServiceTxBuilder, createHandlerTxBuilder, createServiceTxBuilder } from "./query/unit-of-work/execute-unit-of-work.js";
2
+ import { dbInterval, dbNow } from "./query/db-now.js";
3
+ import { Cursor, createCursorFromRecord, decodeCursor } from "./query/cursor.js";
4
+ import { TypedUnitOfWork, UnitOfWork, createUnitOfWork } from "./query/unit-of-work/unit-of-work.js";
5
+ import { defineSyncCommands } from "./sync/commands.js";
6
+
7
+ //#region src/browser/mod.ts
8
+ const withDatabase = () => {
9
+ throw new Error("withDatabase is not available in browser builds.");
10
+ };
11
+ const migrate = async () => {
12
+ throw new Error("migrate is not available in browser builds.");
13
+ };
14
+
15
+ //#endregion
16
+ export { Cursor, HandlerTxBuilder, ServiceTxBuilder, TypedUnitOfWork, UnitOfWork, createCursorFromRecord, createHandlerTxBuilder, createServiceTxBuilder, createUnitOfWork, dbInterval, dbNow, decodeCursor, defineSyncCommands, migrate, withDatabase };
17
+ //# sourceMappingURL=mod.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mod.js","names":["withDatabase: typeof withDatabaseType","migrate: typeof migrateType"],"sources":["../../src/browser/mod.ts"],"sourcesContent":["import type { migrate as migrateType } from \"../mod\";\nimport type { withDatabase as withDatabaseType } from \"../with-database\";\n\nexport {\n createHandlerTxBuilder,\n createServiceTxBuilder,\n ServiceTxBuilder,\n HandlerTxBuilder,\n type TxResult,\n type ServiceBuilderMutateContext,\n type HandlerBuilderMutateContext,\n type BuilderTransformContextWithMutate,\n type BuilderTransformContextWithoutMutate,\n type ExtractServiceRetrieveResults,\n type ExtractServiceFinalResults,\n} from \"../query/unit-of-work/execute-unit-of-work\";\n\nexport {\n createUnitOfWork,\n UnitOfWork,\n TypedUnitOfWork,\n type IUnitOfWork,\n type IUnitOfWorkRestricted,\n type UOWCompiler,\n type UOWExecutor,\n type UOWDecoder,\n} from \"../query/unit-of-work/unit-of-work\";\n\nexport {\n Cursor,\n decodeCursor,\n createCursorFromRecord,\n type CursorData,\n type CursorResult,\n} from \"../query/cursor\";\n\nexport {\n dbNow,\n dbInterval,\n type DbNow,\n type DbInterval,\n type DbIntervalInput,\n} from \"../query/db-now\";\n\nexport const withDatabase: typeof withDatabaseType = () => {\n throw new Error(\"withDatabase is not available in browser builds.\");\n};\n\nexport const migrate: typeof migrateType = async () => {\n throw new Error(\"migrate is not available in browser builds.\");\n};\n\nexport { defineSyncCommands } from \"../sync/commands\";\nexport type {\n SubmitAppliedResponse,\n SubmitConflictReason,\n SubmitConflictResponse,\n SubmitRequest,\n SubmitResponse,\n SyncCommandDefinition,\n SyncCommandHandler,\n SyncCommandRegistry,\n SyncCommandTxFactory,\n} from \"../sync/types\";\n"],"mappings":";;;;;;;AA4CA,MAAaA,qBAA8C;AACzD,OAAM,IAAI,MAAM,mDAAmD;;AAGrE,MAAaC,UAA8B,YAAY;AACrD,OAAM,IAAI,MAAM,8CAA8C"}
@@ -0,0 +1,48 @@
1
+ import { DbInterval, DbIntervalInput, DbNow, dbInterval, dbNow } from "./query/db-now.js";
2
+ import { AnySchema } from "./schema/create.js";
3
+ import { Cursor, CursorData, CursorResult, decodeCursor } from "./query/cursor.js";
4
+ import { RetryPolicy } from "./query/unit-of-work/retry-policy.js";
5
+ import { BuilderTransformContextWithMutate, BuilderTransformContextWithoutMutate, ExtractServiceFinalResults, ExtractServiceRetrieveResults, HandlerBuilderMutateContext, HandlerTxBuilder, ServiceBuilderMutateContext, ServiceTxBuilder, TxResult, createHandlerTxBuilder, createServiceTxBuilder } from "./query/unit-of-work/execute-unit-of-work.js";
6
+ import { OutboxEntry, OutboxRefMap } from "./outbox/outbox.js";
7
+ import { SubmitAppliedResponse, SubmitConflictReason, SubmitConflictResponse, SubmitRequest, SubmitResponse, SyncCommandDefinition, SyncCommandHandler, SyncCommandRegistry, SyncCommandTxFactory } from "./sync/types.js";
8
+ import { DatabaseFragmentDefinitionBuilder, DatabaseHandlerContext, DatabaseServiceContext, DbRoundtripGuardConfig, FragnoPublicConfigWithDatabase, ImplicitDatabaseDependencies } from "./db-fragment-definition-builder.js";
9
+ import { InternalFragmentInstance, internalFragmentDef } from "./fragments/internal-fragment.js";
10
+ import { DurableHooksProcessingOptions, HookContext, HookFn, HookHandlerTx, HookPayload, HooksMap, StuckHookProcessingEvent, StuckHookProcessingInfo, StuckHookProcessingTimeoutMinutes, TriggerHookOptions } from "./hooks/hooks.js";
11
+ import { IUnitOfWork, IUnitOfWorkRestricted, TypedUnitOfWork, UOWCompiler, UOWDecoder, UOWExecutor, UnitOfWork, createUnitOfWork } from "./query/unit-of-work/unit-of-work.js";
12
+ import { DatabaseAdapter } from "./adapters/adapters.js";
13
+ import "./adapters/in-memory/index.js";
14
+ import "./internal/adapter-registry.js";
15
+ import { withDatabase } from "./with-database.js";
16
+ import { defineSyncCommands } from "./sync/commands.js";
17
+ import "./durable-hooks.js";
18
+ import { FragnoInstantiatedFragment } from "@fragno-dev/core";
19
+
20
+ //#region src/mod.d.ts
21
+
22
+ type AnyFragnoInstantiatedDatabaseFragment<TSchema extends AnySchema = AnySchema> = FragnoInstantiatedFragment<any, ImplicitDatabaseDependencies<TSchema>, any, any, DatabaseHandlerContext, any, FragnoPublicConfigWithDatabase>;
23
+ /**
24
+ * Helper function to run migrations for a database fragment.
25
+ * Extracts the database adapter, schema, and namespace from the fragment and runs migrations.
26
+ * This function:
27
+ * 1. Ensures the internal settings fragment is migrated first
28
+ * 2. Retrieves the current database version from the internal fragment
29
+ * 3. Runs migration from current version to target version
30
+ *
31
+ * @param fragment - The instantiated fragment to run migrations for
32
+ * @throws Error if the fragment doesn't have database support or the adapter doesn't support migrations
33
+ *
34
+ * @example
35
+ * ```typescript
36
+ * const fragment = instantiate(myFragmentDef)
37
+ * .withConfig({})
38
+ * .withRoutes([])
39
+ * .withOptions({ databaseAdapter: myAdapter })
40
+ * .build();
41
+ *
42
+ * await migrate(fragment);
43
+ * ```
44
+ */
45
+ declare function migrate<TSchema extends AnySchema>(fragment: AnyFragnoInstantiatedDatabaseFragment<TSchema>): Promise<void>;
46
+ //#endregion
47
+ export { AnyFragnoInstantiatedDatabaseFragment, migrate };
48
+ //# sourceMappingURL=mod2.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mod2.d.ts","names":[],"sources":["../../src/mod.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;;;;;;;;;;KAuLY,sDAAsD,YAAY,aAC5E,gCAGE,6BAA6B,oBAK7B,6BAGA;;;;;;;;;;;;;;;;;;;;;;;iBAyBkB,wBAAwB,qBAClC,sCAAsC,WAC/C"}
@@ -0,0 +1,19 @@
1
+ //#region src/naming/sql-naming.d.ts
2
+ type NamespaceScope = "suffix" | "schema";
3
+ interface SqlNamingStrategy {
4
+ namespaceScope: NamespaceScope;
5
+ namespaceToSchema: (namespace: string) => string;
6
+ tableName: (logicalTable: string, namespace: string | null) => string;
7
+ columnName: (logicalColumn: string, logicalTable: string) => string;
8
+ indexName: (logicalIndex: string, logicalTable: string, namespace: string | null) => string;
9
+ uniqueIndexName: (logicalIndex: string, logicalTable: string, namespace: string | null) => string;
10
+ foreignKeyName: (params: {
11
+ logicalTable: string;
12
+ logicalReferencedTable: string;
13
+ referenceName: string;
14
+ namespace: string | null;
15
+ }) => string;
16
+ }
17
+ //#endregion
18
+ export { SqlNamingStrategy };
19
+ //# sourceMappingURL=sql-naming.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql-naming.d.ts","names":[],"sources":["../../../src/naming/sql-naming.ts"],"sourcesContent":[],"mappings":";AAIY,KAAA,cAAA,GAAc,QAAA,GAAA,QAAA;AAET,UAAA,iBAAA,CAAiB;kBAChB"}
@@ -0,0 +1,21 @@
1
+ import { FragnoId } from "../schema/create.js";
2
+ import "../query/unit-of-work/unit-of-work.js";
3
+
4
+ //#region src/outbox/outbox.d.ts
5
+
6
+ type OutboxRefMap = Record<string, string>;
7
+ type OutboxPayloadSerialized = {
8
+ json: unknown;
9
+ meta?: Record<string, unknown>;
10
+ };
11
+ type OutboxEntry = {
12
+ id: FragnoId;
13
+ versionstamp: string;
14
+ uowId: string;
15
+ payload: OutboxPayloadSerialized;
16
+ refMap?: OutboxRefMap;
17
+ createdAt: Date;
18
+ };
19
+ //#endregion
20
+ export { OutboxEntry, OutboxRefMap };
21
+ //# sourceMappingURL=outbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outbox.d.ts","names":[],"sources":["../../../src/outbox/outbox.ts"],"sourcesContent":[],"mappings":";;;;;KAgDY,YAAA,GAAe;KAEf,uBAAA;;SAEH;;KAGG,WAAA;MACN;;;WAGK;WACA;aACE"}
@@ -0,0 +1 @@
1
+ import "../id.js";
@@ -0,0 +1,44 @@
1
+ import { DbInterval, DbIntervalInput, DbNow } from "./db-now.js";
2
+ import { AnyColumn, FragnoId, IdColumn } from "../schema/create.js";
3
+
4
+ //#region src/query/condition-builder.d.ts
5
+ type Condition = {
6
+ type: "compare";
7
+ a: AnyColumn;
8
+ operator: Operator;
9
+ b: AnyColumn | unknown | null;
10
+ } | {
11
+ type: "or" | "and";
12
+ items: Condition[];
13
+ } | {
14
+ type: "not";
15
+ item: Condition;
16
+ };
17
+ /**
18
+ * Helper type that allows FragnoId for ID columns and reference columns (bigint).
19
+ * Used in ConditionBuilder to accept FragnoId values in where conditions.
20
+ */
21
+ type AcceptsFragnoId<T extends AnyColumn> = T extends IdColumn ? T["$in"] | FragnoId : T["$in"] extends bigint ? T["$in"] | FragnoId : T["$in"];
22
+ type ConditionBuilder<Columns extends Record<string, AnyColumn>> = {
23
+ <ColName extends keyof Columns>(a: ColName, operator: (typeof valueOperators)[number] | (typeof stringOperators)[number], b: AcceptsFragnoId<Columns[ColName]> | null): Condition;
24
+ <ColName extends keyof Columns>(a: ColName, operator: (typeof arrayOperators)[number], b: AcceptsFragnoId<Columns[ColName]>[]): Condition;
25
+ /**
26
+ * Boolean values
27
+ */
28
+ <ColName extends keyof Columns>(a: ColName): Condition;
29
+ and: (...v: (Condition | boolean)[]) => Condition | boolean;
30
+ or: (...v: (Condition | boolean)[]) => Condition | boolean;
31
+ not: (v: Condition | boolean) => Condition | boolean;
32
+ isNull: (a: keyof Columns) => Condition;
33
+ isNotNull: (a: keyof Columns) => Condition;
34
+ now: () => DbNow;
35
+ interval: (input: DbIntervalInput) => DbInterval;
36
+ };
37
+ declare const stringOperators: readonly ["contains", "starts with", "ends with", "not contains", "not starts with", "not ends with"];
38
+ declare const arrayOperators: readonly ["in", "not in"];
39
+ declare const valueOperators: readonly ["=", "!=", ">", ">=", "<", "<=", "is", "is not"];
40
+ declare const operators: readonly ["=", "!=", ">", ">=", "<", "<=", "is", "is not", "in", "not in", "contains", "starts with", "ends with", "not contains", "not starts with", "not ends with"];
41
+ type Operator = (typeof operators)[number];
42
+ //#endregion
43
+ export { Condition, ConditionBuilder };
44
+ //# sourceMappingURL=condition-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"condition-builder.d.ts","names":[],"sources":["../../../src/query/condition-builder.ts"],"sourcesContent":[],"mappings":";;;;KAKY,SAAA;EAAA,IAAA,EAAA,SAAS;EAGZ,CAAA,EAAA,SAAA;EACO,QAAA,EAAA,QAAA;EACP,CAAA,EAAA,SAAA,GAAA,OAAA,GAAA,IAAA;CAII,GAAA;EAID,IAAA,EAAA,IAAA,GAAA,KAAA;EAAS,KAAA,EAJR,SAIQ,EAAA;AACf,CAAA,GAQD;EAA0B,IAAA,EAAA,KAAA;EAAa,IAAA,EAThC,SASgC;CAAU;;;;;KAAjD,eAGY,CAAA,UAHc,SAGd,CAAA,GAH2B,CAG3B,SAHqC,QAGrC,GAFb,CAEa,CAAA,KAAA,CAAA,GAFF,QAEE,GADb,CACa,CAAA,KAAA,CAAA,SAAA,MAAA,GAAX,CAAW,CAAA,KAAA,CAAA,GAAA,QAAA,GACX,CADW,CAAA,KAAA,CAAA;AACX,KAEM,gBAFN,CAAA,gBAEuC,MAFvC,CAAA,MAAA,EAEsD,SAFtD,CAAA,CAAA,GAAA;EAAC,CAAA,gBAAA,MAGkB,OAHlB,CAAA,CAAA,CAAA,EAIA,OAJA,EAAA,QAAA,EAAA,CAAA,OAKe,cALf,CAAA,CAAA,MAAA,CAAA,GAAA,CAAA,OAKiD,eALjD,CAAA,CAAA,MAAA,CAAA,EAAA,CAAA,EAMA,eANA,CAMgB,OANhB,CAMwB,OANxB,CAAA,CAAA,GAAA,IAAA,CAAA,EAOF,SAPE;EAEK,CAAA,gBAAA,MAOa,OAPG,CAAA,CAAA,CAAA,EAQrB,OARqB,EAAA,QAAA,EAAA,CAAA,OASN,cATM,CAAA,CAAA,MAAA,CAAA,EAAA,CAAA,EAUrB,eAVqB,CAUL,OAVK,CAUG,OAVH,CAAA,CAAA,EAAA,CAAA,EAWvB,SAXuB;EAAgC;;;EAErD,CAAA,gBAAA,MAckB,OAdlB,CAAA,CAAA,CAAA,EAc8B,OAd9B,CAAA,EAcwC,SAdxC;EACe,GAAA,EAAA,CAAA,GAAA,CAAA,EAAA,CAeP,SAfO,GAAA,OAAA,CAAA,EAAA,EAAA,GAeoB,SAfpB,GAAA,OAAA;EAAkC,EAAA,EAAA,CAAA,GAAA,CAAA,EAAA,CAgB1C,SAhB0C,GAAA,OAAA,CAAA,EAAA,EAAA,GAgBf,SAhBe,GAAA,OAAA;EACjC,GAAA,EAAA,CAAA,CAAA,EAgBZ,SAhBY,GAAA,OAAA,EAAA,GAgBY,SAhBZ,GAAA,OAAA;EAAQ,MAAA,EAAA,CAAA,CAAA,EAAA,MAkBX,OAlBW,EAAA,GAkBC,SAlBD;EAAxB,SAAA,EAAA,CAAA,CAAA,EAAA,MAmBgB,OAnBhB,EAAA,GAmB4B,SAnB5B;EACF,GAAA,EAAA,GAAA,GAmBQ,KAnBR;EAEoB,QAAA,EAAA,CAAA,KAAA,EAkBL,eAlBK,EAAA,GAkBe,UAlBf;CAClB;cAqBD,eApBgB,EAAA,SAAA,CAAA,UAAA,EAAA,aAAA,EAAA,WAAA,EAAA,cAAA,EAAA,iBAAA,EAAA,eAAA,CAAA;cA+BhB,cA9BiB,EAAA,SAAA,CAAA,IAAA,EAAA,QAAA,CAAA;cAgCjB,cAhCyB,EAAA,SAAA,CAAA,GAAA,EAAA,IAAA,EAAA,GAAA,EAAA,IAAA,EAAA,GAAA,EAAA,IAAA,EAAA,IAAA,EAAA,QAAA,CAAA;AAAxB,cAqCM,SArCN,EAAA,SAAA,CAAA,GAAA,EAAA,IAAA,EAAA,GAAA,EAAA,IAAA,EAAA,GAAA,EAAA,IAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,QAAA,EAAA,UAAA,EAAA,aAAA,EAAA,WAAA,EAAA,cAAA,EAAA,iBAAA,EAAA,eAAA,CAAA;AACF,KAsCO,QAAA,GAtCP,CAAA,OAsC0B,SAtC1B,CAAA,CAAA,MAAA,CAAA"}
@@ -0,0 +1,97 @@
1
+ import { dbInterval, dbNow } from "./db-now.js";
2
+
3
+ //#region src/query/condition-builder.ts
4
+ const stringOperators = [
5
+ "contains",
6
+ "starts with",
7
+ "ends with",
8
+ "not contains",
9
+ "not starts with",
10
+ "not ends with"
11
+ ];
12
+ const arrayOperators = ["in", "not in"];
13
+ const valueOperators = [
14
+ "=",
15
+ "!=",
16
+ ">",
17
+ ">=",
18
+ "<",
19
+ "<=",
20
+ "is",
21
+ "is not"
22
+ ];
23
+ const operators = [
24
+ ...valueOperators,
25
+ ...arrayOperators,
26
+ ...stringOperators
27
+ ];
28
+ function createBuilder(columns) {
29
+ function col(name) {
30
+ const out = columns[name];
31
+ if (!out) throw new Error(`Invalid column name ${String(name)}`);
32
+ return out;
33
+ }
34
+ const builder = (...args) => {
35
+ if (args.length === 3) {
36
+ const [a, operator, b] = args;
37
+ if (!operators.includes(operator)) throw new Error(`Unsupported operator: ${operator}`);
38
+ return {
39
+ type: "compare",
40
+ a: col(a),
41
+ b,
42
+ operator
43
+ };
44
+ }
45
+ return {
46
+ type: "compare",
47
+ a: col(args[0]),
48
+ operator: "=",
49
+ b: true
50
+ };
51
+ };
52
+ builder.isNull = (a) => builder(a, "is", null);
53
+ builder.isNotNull = (a) => builder(a, "is not", null);
54
+ builder.now = () => dbNow();
55
+ builder.interval = (input) => dbInterval(input);
56
+ builder.not = (condition) => {
57
+ if (typeof condition === "boolean") return !condition;
58
+ return {
59
+ type: "not",
60
+ item: condition
61
+ };
62
+ };
63
+ builder.or = (...conditions) => {
64
+ const out = {
65
+ type: "or",
66
+ items: []
67
+ };
68
+ for (const item of conditions) {
69
+ if (item === true) return true;
70
+ if (item === false) continue;
71
+ out.items.push(item);
72
+ }
73
+ if (out.items.length === 0) return false;
74
+ return out;
75
+ };
76
+ builder.and = (...conditions) => {
77
+ const out = {
78
+ type: "and",
79
+ items: []
80
+ };
81
+ for (const item of conditions) {
82
+ if (item === true) continue;
83
+ if (item === false) return false;
84
+ out.items.push(item);
85
+ }
86
+ if (out.items.length === 0) return true;
87
+ return out;
88
+ };
89
+ return builder;
90
+ }
91
+ function buildCondition(columns, input) {
92
+ return input(createBuilder(columns));
93
+ }
94
+
95
+ //#endregion
96
+ export { buildCondition };
97
+ //# sourceMappingURL=condition-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"condition-builder.js","names":["builder: ConditionBuilder<Columns>"],"sources":["../../../src/query/condition-builder.ts"],"sourcesContent":["import type { AnyColumn, FragnoId, IdColumn } from \"../schema/create\";\nimport { dbInterval, dbNow, type DbInterval, type DbIntervalInput, type DbNow } from \"./db-now\";\n\nexport type ConditionType = \"compare\" | \"and\" | \"or\" | \"not\";\n\nexport type Condition =\n | {\n type: \"compare\";\n a: AnyColumn;\n operator: Operator;\n b: AnyColumn | unknown | null;\n }\n | {\n type: \"or\" | \"and\";\n items: Condition[];\n }\n | {\n type: \"not\";\n item: Condition;\n };\n\n// TODO: we temporarily dropped support for comparing against another column, because Prisma ORM still have problems with it.\n\n/**\n * Helper type that allows FragnoId for ID columns and reference columns (bigint).\n * Used in ConditionBuilder to accept FragnoId values in where conditions.\n */\ntype AcceptsFragnoId<T extends AnyColumn> = T extends IdColumn\n ? T[\"$in\"] | FragnoId\n : T[\"$in\"] extends bigint\n ? T[\"$in\"] | FragnoId\n : T[\"$in\"];\n\nexport type ConditionBuilder<Columns extends Record<string, AnyColumn>> = {\n <ColName extends keyof Columns>(\n a: ColName,\n operator: (typeof valueOperators)[number] | (typeof stringOperators)[number],\n b: AcceptsFragnoId<Columns[ColName]> | null,\n ): Condition;\n\n <ColName extends keyof Columns>(\n a: ColName,\n operator: (typeof arrayOperators)[number],\n b: AcceptsFragnoId<Columns[ColName]>[],\n ): Condition;\n\n /**\n * Boolean values\n */\n <ColName extends keyof Columns>(a: ColName): Condition;\n\n and: (...v: (Condition | boolean)[]) => Condition | boolean;\n or: (...v: (Condition | boolean)[]) => Condition | boolean;\n not: (v: Condition | boolean) => Condition | boolean;\n\n isNull: (a: keyof Columns) => Condition;\n isNotNull: (a: keyof Columns) => Condition;\n now: () => DbNow;\n interval: (input: DbIntervalInput) => DbInterval;\n};\n\n// replacement for `like` (Prisma doesn't support `like`)\nconst stringOperators = [\n \"contains\",\n \"starts with\",\n \"ends with\",\n\n \"not contains\",\n \"not starts with\",\n \"not ends with\",\n // excluded `regexp` since MSSQL doesn't support it, may re-consider\n] as const;\n\nconst arrayOperators = [\"in\", \"not in\"] as const;\n\nconst valueOperators = [\"=\", \"!=\", \">\", \">=\", \"<\", \"<=\", \"is\", \"is not\"] as const;\n\n// JSON specific operators are not included, some databases don't support them\n// `match` requires additional extensions & configurations on SQLite and PostgreSQL\n// MySQL & SQLite requires workarounds to support `ilike`\nexport const operators = [...valueOperators, ...arrayOperators, ...stringOperators] as const;\n\nexport type Operator = (typeof operators)[number];\n\nexport function createBuilder<Columns extends Record<string, AnyColumn>>(\n columns: Columns,\n): ConditionBuilder<Columns> {\n function col(name: keyof Columns) {\n const out = columns[name];\n if (!out) {\n throw new Error(`Invalid column name ${String(name)}`);\n }\n\n return out;\n }\n\n const builder: ConditionBuilder<Columns> = (...args: [string, Operator, unknown] | [string]) => {\n if (args.length === 3) {\n const [a, operator, b] = args;\n\n if (!operators.includes(operator)) {\n throw new Error(`Unsupported operator: ${operator}`);\n }\n\n return {\n type: \"compare\",\n a: col(a),\n b,\n operator,\n };\n }\n\n return {\n type: \"compare\",\n a: col(args[0]),\n operator: \"=\",\n b: true,\n };\n };\n\n builder.isNull = (a) => builder(a, \"is\", null);\n builder.isNotNull = (a) => builder(a, \"is not\", null);\n builder.now = () => dbNow();\n builder.interval = (input) => dbInterval(input);\n builder.not = (condition) => {\n if (typeof condition === \"boolean\") {\n return !condition;\n }\n\n return {\n type: \"not\",\n item: condition,\n };\n };\n\n builder.or = (...conditions) => {\n const out = {\n type: \"or\",\n items: [] as Condition[],\n } as const;\n\n for (const item of conditions) {\n if (item === true) {\n return true;\n }\n if (item === false) {\n continue;\n }\n\n out.items.push(item);\n }\n\n if (out.items.length === 0) {\n return false;\n }\n return out;\n };\n\n builder.and = (...conditions) => {\n const out = {\n type: \"and\",\n items: [] as Condition[],\n } as const;\n\n for (const item of conditions) {\n if (item === true) {\n continue;\n }\n if (item === false) {\n return false;\n }\n\n out.items.push(item);\n }\n\n if (out.items.length === 0) {\n return true;\n }\n return out;\n };\n\n return builder;\n}\n\nexport function buildCondition<T, Columns extends Record<string, AnyColumn>>(\n columns: Columns,\n input: (builder: ConditionBuilder<Columns>) => T,\n): T {\n return input(createBuilder(columns));\n}\n\n/**\n * Create a ConditionBuilder that only allows comparisons on indexed columns.\n * Used in Unit of Work to ensure queries can leverage indexes for optimal performance.\n *\n * @param columns - The full set of columns from the table\n * @param indexedColumnNames - Set of column names that are part of indexes\n * @returns A ConditionBuilder restricted to indexed columns only\n *\n * @example\n * ```ts\n * const builder = createIndexedBuilder(\n * table.columns,\n * new Set([\"id\", \"userId\", \"createdAt\"])\n * );\n * const condition = builder(\"userId\", \"=\", \"123\");\n * ```\n */\nexport function createIndexedBuilder<Columns extends Record<string, AnyColumn>>(\n columns: Columns,\n indexedColumnNames: Set<string>,\n): ConditionBuilder<Columns> {\n function col(name: keyof Columns) {\n const columnName = String(name);\n\n if (!indexedColumnNames.has(columnName)) {\n throw new Error(\n `Column \"${columnName}\" is not indexed. Only indexed columns can be used in Unit of Work queries. ` +\n `Available indexed columns: ${Array.from(indexedColumnNames).join(\", \")}`,\n );\n }\n\n const out = columns[name];\n if (!out) {\n throw new Error(`Invalid column name ${columnName}`);\n }\n\n return out;\n }\n\n const builder: ConditionBuilder<Columns> = (...args: [string, Operator, unknown] | [string]) => {\n if (args.length === 3) {\n const [a, operator, b] = args;\n\n if (!operators.includes(operator)) {\n throw new Error(`Unsupported operator: ${operator}`);\n }\n\n return {\n type: \"compare\",\n a: col(a),\n b,\n operator,\n };\n }\n\n return {\n type: \"compare\",\n a: col(args[0]),\n operator: \"=\",\n b: true,\n };\n };\n\n builder.isNull = (a) => builder(a, \"is\", null);\n builder.isNotNull = (a) => builder(a, \"is not\", null);\n builder.now = () => dbNow();\n builder.interval = (input) => dbInterval(input);\n builder.not = (condition) => {\n if (typeof condition === \"boolean\") {\n return !condition;\n }\n\n return {\n type: \"not\",\n item: condition,\n };\n };\n\n builder.or = (...conditions) => {\n const out = {\n type: \"or\",\n items: [] as Condition[],\n } as const;\n\n for (const item of conditions) {\n if (item === true) {\n return true;\n }\n if (item === false) {\n continue;\n }\n\n out.items.push(item);\n }\n\n if (out.items.length === 0) {\n return false;\n }\n return out;\n };\n\n builder.and = (...conditions) => {\n const out = {\n type: \"and\",\n items: [] as Condition[],\n } as const;\n\n for (const item of conditions) {\n if (item === true) {\n continue;\n }\n if (item === false) {\n return false;\n }\n\n out.items.push(item);\n }\n\n if (out.items.length === 0) {\n return true;\n }\n return out;\n };\n\n return builder;\n}\n"],"mappings":";;;AA8DA,MAAM,kBAAkB;CACtB;CACA;CACA;CAEA;CACA;CACA;CAED;AAED,MAAM,iBAAiB,CAAC,MAAM,SAAS;AAEvC,MAAM,iBAAiB;CAAC;CAAK;CAAM;CAAK;CAAM;CAAK;CAAM;CAAM;CAAS;AAKxE,MAAa,YAAY;CAAC,GAAG;CAAgB,GAAG;CAAgB,GAAG;CAAgB;AAInF,SAAgB,cACd,SAC2B;CAC3B,SAAS,IAAI,MAAqB;EAChC,MAAM,MAAM,QAAQ;AACpB,MAAI,CAAC,IACH,OAAM,IAAI,MAAM,uBAAuB,OAAO,KAAK,GAAG;AAGxD,SAAO;;CAGT,MAAMA,WAAsC,GAAG,SAAiD;AAC9F,MAAI,KAAK,WAAW,GAAG;GACrB,MAAM,CAAC,GAAG,UAAU,KAAK;AAEzB,OAAI,CAAC,UAAU,SAAS,SAAS,CAC/B,OAAM,IAAI,MAAM,yBAAyB,WAAW;AAGtD,UAAO;IACL,MAAM;IACN,GAAG,IAAI,EAAE;IACT;IACA;IACD;;AAGH,SAAO;GACL,MAAM;GACN,GAAG,IAAI,KAAK,GAAG;GACf,UAAU;GACV,GAAG;GACJ;;AAGH,SAAQ,UAAU,MAAM,QAAQ,GAAG,MAAM,KAAK;AAC9C,SAAQ,aAAa,MAAM,QAAQ,GAAG,UAAU,KAAK;AACrD,SAAQ,YAAY,OAAO;AAC3B,SAAQ,YAAY,UAAU,WAAW,MAAM;AAC/C,SAAQ,OAAO,cAAc;AAC3B,MAAI,OAAO,cAAc,UACvB,QAAO,CAAC;AAGV,SAAO;GACL,MAAM;GACN,MAAM;GACP;;AAGH,SAAQ,MAAM,GAAG,eAAe;EAC9B,MAAM,MAAM;GACV,MAAM;GACN,OAAO,EAAE;GACV;AAED,OAAK,MAAM,QAAQ,YAAY;AAC7B,OAAI,SAAS,KACX,QAAO;AAET,OAAI,SAAS,MACX;AAGF,OAAI,MAAM,KAAK,KAAK;;AAGtB,MAAI,IAAI,MAAM,WAAW,EACvB,QAAO;AAET,SAAO;;AAGT,SAAQ,OAAO,GAAG,eAAe;EAC/B,MAAM,MAAM;GACV,MAAM;GACN,OAAO,EAAE;GACV;AAED,OAAK,MAAM,QAAQ,YAAY;AAC7B,OAAI,SAAS,KACX;AAEF,OAAI,SAAS,MACX,QAAO;AAGT,OAAI,MAAM,KAAK,KAAK;;AAGtB,MAAI,IAAI,MAAM,WAAW,EACvB,QAAO;AAET,SAAO;;AAGT,QAAO;;AAGT,SAAgB,eACd,SACA,OACG;AACH,QAAO,MAAM,cAAc,QAAQ,CAAC"}
@@ -0,0 +1,105 @@
1
+ import { AnyColumn } from "../schema/create.js";
2
+
3
+ //#region src/query/cursor.d.ts
4
+
5
+ /**
6
+ * Cursor object containing all information needed for pagination
7
+ */
8
+ declare class Cursor {
9
+ #private;
10
+ constructor(data: {
11
+ indexName: string;
12
+ orderDirection: "asc" | "desc";
13
+ pageSize: number;
14
+ indexValues: Record<string, unknown>;
15
+ });
16
+ /**
17
+ * Get the index name being used for pagination
18
+ */
19
+ get indexName(): string;
20
+ /**
21
+ * Get the ordering direction
22
+ */
23
+ get orderDirection(): "asc" | "desc";
24
+ /**
25
+ * Get the page size
26
+ */
27
+ get pageSize(): number;
28
+ /**
29
+ * Get the cursor position values
30
+ */
31
+ get indexValues(): Record<string, unknown>;
32
+ /**
33
+ * Encode cursor to an opaque base64 string (safe to send to client)
34
+ */
35
+ encode(): string;
36
+ }
37
+ /**
38
+ * Result of a cursor-based query containing items and pagination cursor
39
+ */
40
+ interface CursorResult<T> {
41
+ /**
42
+ * The query results
43
+ */
44
+ items: T[];
45
+ /**
46
+ * Cursor to fetch the next page (undefined if no more results)
47
+ */
48
+ cursor?: Cursor;
49
+ /**
50
+ * Whether there are more results available after this page
51
+ */
52
+ hasNextPage: boolean;
53
+ }
54
+ /**
55
+ * Cursor data structure for serialization
56
+ */
57
+ interface CursorData {
58
+ v: number;
59
+ indexName: string;
60
+ orderDirection: "asc" | "desc";
61
+ pageSize: number;
62
+ indexValues: Record<string, unknown>;
63
+ }
64
+ /**
65
+ * Decode a base64 cursor string back to a Cursor object
66
+ *
67
+ * @param cursor - The base64-encoded cursor string
68
+ * @returns Decoded Cursor object
69
+ * @throws Error if cursor is invalid or malformed
70
+ *
71
+ * @example
72
+ * ```ts
73
+ * const cursor = decodeCursor("eyJpbmRleFZhbHVlcyI6e30sImRpcmVjdGlvbiI6ImZvcndhcmQifQ==");
74
+ * ```
75
+ */
76
+ declare function decodeCursor(cursor: string): Cursor;
77
+ /**
78
+ * Create a cursor from a record and pagination metadata
79
+ *
80
+ * @param record - The database record
81
+ * @param indexColumns - The columns that make up the index
82
+ * @param metadata - Pagination metadata (index name, order direction, page size)
83
+ * @returns Cursor object
84
+ *
85
+ * @example
86
+ * ```ts
87
+ * const cursor = createCursorFromRecord(
88
+ * { id: "abc", name: "Alice", createdAt: 123 },
89
+ * [table.columns.createdAt, table.columns.id],
90
+ * {
91
+ * indexName: "idx_created",
92
+ * orderDirection: "asc",
93
+ * pageSize: 10
94
+ * }
95
+ * );
96
+ * ```
97
+ */
98
+ declare function createCursorFromRecord(record: Record<string, unknown>, indexColumns: AnyColumn[], metadata: {
99
+ indexName: string;
100
+ orderDirection: "asc" | "desc";
101
+ pageSize: number;
102
+ }): Cursor;
103
+ //#endregion
104
+ export { Cursor, CursorData, CursorResult, createCursorFromRecord, decodeCursor };
105
+ //# sourceMappingURL=cursor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor.d.ts","names":[],"sources":["../../../src/query/cursor.ts"],"sourcesContent":[],"mappings":";;;;AASA;AAiEA;AAkBA;AAqCgB,cAxHH,MAAA,CAwHe;EAoEZ,CAAA,OAAA;EACN,WAAA,CAAA,IAAA,EAAA;IACM,SAAA,EAAA,MAAA;IAMb,cAAA,EAAA,KAAA,GAAA,MAAA;IAAM,QAAA,EAAA,MAAA;iBA1LQ;;;;;;;;;;;;;;;;;qBAgCI;;;;;;;;;UAuBJ;;;;SAIR;;;;WAIE;;;;;;;;;UAUM,UAAA;;;;;eAKF;;;;;;;;;;;;;;iBAgCC,YAAA,kBAA8B;;;;;;;;;;;;;;;;;;;;;;iBAoE9B,sBAAA,SACN,uCACM;;;;IAMb"}