@fragno-dev/db 0.3.0 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (516) hide show
  1. package/.turbo/turbo-build.log +327 -160
  2. package/CHANGELOG.md +74 -0
  3. package/README.md +24 -0
  4. package/dist/adapters/adapters.d.ts +1 -1
  5. package/dist/adapters/adapters.d.ts.map +1 -1
  6. package/dist/adapters/adapters.js.map +1 -1
  7. package/dist/adapters/generic-sql/generic-sql-adapter.d.ts +0 -3
  8. package/dist/adapters/generic-sql/generic-sql-adapter.d.ts.map +1 -1
  9. package/dist/adapters/generic-sql/generic-sql-adapter.js +11 -12
  10. package/dist/adapters/generic-sql/generic-sql-adapter.js.map +1 -1
  11. package/dist/adapters/generic-sql/generic-sql-uow-executor.js +46 -6
  12. package/dist/adapters/generic-sql/generic-sql-uow-executor.js.map +1 -1
  13. package/dist/adapters/generic-sql/migration/cold-kysely.js.map +1 -1
  14. package/dist/adapters/generic-sql/migration/dialect/mysql.js +1 -1
  15. package/dist/adapters/generic-sql/migration/dialect/mysql.js.map +1 -1
  16. package/dist/adapters/generic-sql/migration/dialect/postgres.js +1 -1
  17. package/dist/adapters/generic-sql/migration/dialect/postgres.js.map +1 -1
  18. package/dist/adapters/generic-sql/migration/dialect/sqlite.js +185 -19
  19. package/dist/adapters/generic-sql/migration/dialect/sqlite.js.map +1 -1
  20. package/dist/adapters/generic-sql/migration/executor.d.ts.map +1 -1
  21. package/dist/adapters/generic-sql/migration/executor.js +30 -3
  22. package/dist/adapters/generic-sql/migration/executor.js.map +1 -1
  23. package/dist/adapters/generic-sql/migration/prepared-migrations.d.ts.map +1 -1
  24. package/dist/adapters/generic-sql/migration/prepared-migrations.js +3 -3
  25. package/dist/adapters/generic-sql/migration/prepared-migrations.js.map +1 -1
  26. package/dist/adapters/generic-sql/migration/sql-generator.js +1 -1
  27. package/dist/adapters/generic-sql/migration/sql-generator.js.map +1 -1
  28. package/dist/adapters/generic-sql/query/create-sql-query-compiler.js +1 -1
  29. package/dist/adapters/generic-sql/query/create-sql-query-compiler.js.map +1 -1
  30. package/dist/adapters/generic-sql/query/cursor-utils.js.map +1 -1
  31. package/dist/adapters/generic-sql/query/db-now-sql.js +27 -0
  32. package/dist/adapters/generic-sql/query/db-now-sql.js.map +1 -0
  33. package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js +9 -6
  34. package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js.map +1 -1
  35. package/dist/adapters/generic-sql/query/select-builder.js.map +1 -1
  36. package/dist/adapters/generic-sql/query/sql-query-compiler.js +37 -9
  37. package/dist/adapters/generic-sql/query/sql-query-compiler.js.map +1 -1
  38. package/dist/adapters/generic-sql/query/where-builder.js +24 -20
  39. package/dist/adapters/generic-sql/query/where-builder.js.map +1 -1
  40. package/dist/adapters/generic-sql/uow-decoder.js +1 -1
  41. package/dist/adapters/generic-sql/uow-decoder.js.map +1 -1
  42. package/dist/adapters/generic-sql/uow-encoder.js +8 -9
  43. package/dist/adapters/generic-sql/uow-encoder.js.map +1 -1
  44. package/dist/adapters/in-memory/condition-evaluator.js +10 -6
  45. package/dist/adapters/in-memory/condition-evaluator.js.map +1 -1
  46. package/dist/adapters/in-memory/in-memory-adapter.d.ts.map +1 -1
  47. package/dist/adapters/in-memory/in-memory-adapter.js +45 -25
  48. package/dist/adapters/in-memory/in-memory-adapter.js.map +1 -1
  49. package/dist/adapters/in-memory/in-memory-uow.js +236 -13
  50. package/dist/adapters/in-memory/in-memory-uow.js.map +1 -1
  51. package/dist/adapters/in-memory/options.d.ts +2 -0
  52. package/dist/adapters/in-memory/options.d.ts.map +1 -1
  53. package/dist/adapters/in-memory/options.js +3 -2
  54. package/dist/adapters/in-memory/options.js.map +1 -1
  55. package/dist/adapters/in-memory/reference-resolution.js.map +1 -1
  56. package/dist/adapters/in-memory/store.js +1 -1
  57. package/dist/adapters/in-memory/store.js.map +1 -1
  58. package/dist/adapters/shared/from-unit-of-work-compiler.js +51 -24
  59. package/dist/adapters/shared/from-unit-of-work-compiler.js.map +1 -1
  60. package/dist/adapters/shared/uow-operation-compiler.js.map +1 -1
  61. package/dist/browser/adapters/adapters.d.ts +61 -0
  62. package/dist/browser/adapters/adapters.d.ts.map +1 -0
  63. package/dist/browser/adapters/generic-sql/migration/executor.d.ts +15 -0
  64. package/dist/browser/adapters/generic-sql/migration/executor.d.ts.map +1 -0
  65. package/dist/browser/adapters/generic-sql/migration/prepared-migrations.d.ts +66 -0
  66. package/dist/browser/adapters/generic-sql/migration/prepared-migrations.d.ts.map +1 -0
  67. package/dist/browser/adapters/generic-sql/sqlite-storage.d.ts +11 -0
  68. package/dist/browser/adapters/generic-sql/sqlite-storage.d.ts.map +1 -0
  69. package/dist/browser/adapters/in-memory/in-memory-adapter.d.ts +5 -0
  70. package/dist/browser/adapters/in-memory/index.d.ts +2 -0
  71. package/dist/browser/adapters/in-memory/options.d.ts +1 -0
  72. package/dist/browser/db-fragment-definition-builder.d.ts +237 -0
  73. package/dist/browser/db-fragment-definition-builder.d.ts.map +1 -0
  74. package/dist/browser/durable-hooks.d.ts +3 -0
  75. package/dist/browser/fragments/internal-fragment.d.ts +317 -0
  76. package/dist/browser/fragments/internal-fragment.d.ts.map +1 -0
  77. package/dist/browser/fragments/internal-fragment.schema.d.ts +1 -0
  78. package/dist/browser/hooks/durable-hooks-logger.d.ts +10 -0
  79. package/dist/browser/hooks/durable-hooks-logger.d.ts.map +1 -0
  80. package/dist/browser/hooks/hooks.d.ts +146 -0
  81. package/dist/browser/hooks/hooks.d.ts.map +1 -0
  82. package/dist/browser/id.js +1 -0
  83. package/dist/browser/internal/adapter-registry.d.ts +4 -0
  84. package/dist/browser/internal/outbox-state.d.ts +2 -0
  85. package/dist/browser/mod.d.ts +15 -0
  86. package/dist/browser/mod.d.ts.map +1 -0
  87. package/dist/browser/mod.js +17 -0
  88. package/dist/browser/mod.js.map +1 -0
  89. package/dist/browser/mod2.d.ts +48 -0
  90. package/dist/browser/mod2.d.ts.map +1 -0
  91. package/dist/browser/naming/sql-naming.d.ts +19 -0
  92. package/dist/browser/naming/sql-naming.d.ts.map +1 -0
  93. package/dist/browser/outbox/outbox.d.ts +21 -0
  94. package/dist/browser/outbox/outbox.d.ts.map +1 -0
  95. package/dist/browser/query/column-defaults.js +1 -0
  96. package/dist/browser/query/condition-builder.d.ts +44 -0
  97. package/dist/browser/query/condition-builder.d.ts.map +1 -0
  98. package/dist/browser/query/condition-builder.js +97 -0
  99. package/dist/browser/query/condition-builder.js.map +1 -0
  100. package/dist/browser/query/cursor.d.ts +105 -0
  101. package/dist/browser/query/cursor.d.ts.map +1 -0
  102. package/dist/browser/query/cursor.js +150 -0
  103. package/dist/browser/query/cursor.js.map +1 -0
  104. package/dist/browser/query/db-now.d.ts +22 -0
  105. package/dist/browser/query/db-now.d.ts.map +1 -0
  106. package/dist/browser/query/db-now.js +33 -0
  107. package/dist/browser/query/db-now.js.map +1 -0
  108. package/dist/browser/query/orm/orm.d.ts +18 -0
  109. package/dist/browser/query/orm/orm.d.ts.map +1 -0
  110. package/dist/browser/query/simple-query-interface.d.ts +108 -0
  111. package/dist/browser/query/simple-query-interface.d.ts.map +1 -0
  112. package/dist/browser/query/unit-of-work/execute-unit-of-work.d.ts +423 -0
  113. package/dist/browser/query/unit-of-work/execute-unit-of-work.d.ts.map +1 -0
  114. package/dist/browser/query/unit-of-work/execute-unit-of-work.js +507 -0
  115. package/dist/browser/query/unit-of-work/execute-unit-of-work.js.map +1 -0
  116. package/dist/browser/query/unit-of-work/retry-policy.d.ts +23 -0
  117. package/dist/browser/query/unit-of-work/retry-policy.d.ts.map +1 -0
  118. package/dist/browser/query/unit-of-work/retry-policy.js +40 -0
  119. package/dist/browser/query/unit-of-work/retry-policy.js.map +1 -0
  120. package/dist/browser/query/unit-of-work/unit-of-work.d.ts +703 -0
  121. package/dist/browser/query/unit-of-work/unit-of-work.d.ts.map +1 -0
  122. package/dist/browser/query/unit-of-work/unit-of-work.js +1206 -0
  123. package/dist/browser/query/unit-of-work/unit-of-work.js.map +1 -0
  124. package/dist/browser/query/value-encoding.js +38 -0
  125. package/dist/browser/query/value-encoding.js.map +1 -0
  126. package/dist/browser/schema/create.d.ts +326 -0
  127. package/dist/browser/schema/create.d.ts.map +1 -0
  128. package/dist/browser/schema/create.js +89 -0
  129. package/dist/browser/schema/create.js.map +1 -0
  130. package/dist/browser/schema/generate-id.js +28 -0
  131. package/dist/browser/schema/generate-id.js.map +1 -0
  132. package/dist/browser/shared/providers.d.ts +6 -0
  133. package/dist/browser/shared/providers.d.ts.map +1 -0
  134. package/dist/browser/sql-driver/connection/connection-provider.d.ts +13 -0
  135. package/dist/browser/sql-driver/connection/connection-provider.d.ts.map +1 -0
  136. package/dist/browser/sql-driver/dialect-adapter/dialect-adapter.d.ts +7 -0
  137. package/dist/browser/sql-driver/dialect-adapter/dialect-adapter.d.ts.map +1 -0
  138. package/dist/browser/sql-driver/driver/runtime-driver.d.ts +23 -0
  139. package/dist/browser/sql-driver/driver/runtime-driver.d.ts.map +1 -0
  140. package/dist/browser/sql-driver/query-executor/plugin.d.ts +17 -0
  141. package/dist/browser/sql-driver/query-executor/plugin.d.ts.map +1 -0
  142. package/dist/browser/sql-driver/query-executor/query-executor.d.ts +36 -0
  143. package/dist/browser/sql-driver/query-executor/query-executor.d.ts.map +1 -0
  144. package/dist/browser/sql-driver/sql-driver-adapter.d.ts +29 -0
  145. package/dist/browser/sql-driver/sql-driver-adapter.d.ts.map +1 -0
  146. package/dist/browser/sql-driver/sql-driver.d.ts +38 -0
  147. package/dist/browser/sql-driver/sql-driver.d.ts.map +1 -0
  148. package/dist/browser/sync/commands.d.ts +15 -0
  149. package/dist/browser/sync/commands.d.ts.map +1 -0
  150. package/dist/browser/sync/commands.js +27 -0
  151. package/dist/browser/sync/commands.js.map +1 -0
  152. package/dist/browser/sync/types.d.ts +63 -0
  153. package/dist/browser/sync/types.d.ts.map +1 -0
  154. package/dist/browser/util/types.d.ts +8 -0
  155. package/dist/browser/util/types.d.ts.map +1 -0
  156. package/dist/browser/with-database.d.ts +29 -0
  157. package/dist/browser/with-database.d.ts.map +1 -0
  158. package/dist/client.d.ts +4 -0
  159. package/dist/client.js +5 -0
  160. package/dist/db-fragment-definition-builder.d.ts +85 -28
  161. package/dist/db-fragment-definition-builder.d.ts.map +1 -1
  162. package/dist/db-fragment-definition-builder.js +374 -46
  163. package/dist/db-fragment-definition-builder.js.map +1 -1
  164. package/dist/dispatchers/cloudflare-do/dispatcher.d.ts +20 -0
  165. package/dist/dispatchers/cloudflare-do/dispatcher.d.ts.map +1 -0
  166. package/dist/dispatchers/cloudflare-do/dispatcher.js +147 -0
  167. package/dist/dispatchers/cloudflare-do/dispatcher.js.map +1 -0
  168. package/dist/dispatchers/cloudflare-do/index.d.ts +5 -20
  169. package/dist/dispatchers/cloudflare-do/index.d.ts.map +1 -1
  170. package/dist/dispatchers/cloudflare-do/index.js +23 -55
  171. package/dist/dispatchers/cloudflare-do/index.js.map +1 -1
  172. package/dist/dispatchers/node/dispatcher.d.ts +14 -0
  173. package/dist/dispatchers/node/dispatcher.d.ts.map +1 -0
  174. package/dist/dispatchers/node/dispatcher.js +80 -0
  175. package/dist/dispatchers/node/dispatcher.js.map +1 -0
  176. package/dist/dispatchers/node/index.d.ts +5 -10
  177. package/dist/dispatchers/node/index.d.ts.map +1 -1
  178. package/dist/dispatchers/node/index.js +21 -53
  179. package/dist/dispatchers/node/index.js.map +1 -1
  180. package/dist/durable-hooks.d.ts +31 -0
  181. package/dist/durable-hooks.d.ts.map +1 -0
  182. package/dist/durable-hooks.js +23 -0
  183. package/dist/durable-hooks.js.map +1 -0
  184. package/dist/fragments/internal-fragment.d.ts +128 -27
  185. package/dist/fragments/internal-fragment.d.ts.map +1 -1
  186. package/dist/fragments/internal-fragment.js +125 -78
  187. package/dist/fragments/internal-fragment.js.map +1 -1
  188. package/dist/fragments/internal-fragment.routes.js +138 -3
  189. package/dist/fragments/internal-fragment.routes.js.map +1 -1
  190. package/dist/fragments/internal-fragment.schema.d.ts +7 -1
  191. package/dist/fragments/internal-fragment.schema.d.ts.map +1 -1
  192. package/dist/fragments/internal-fragment.schema.js +18 -1
  193. package/dist/fragments/internal-fragment.schema.js.map +1 -1
  194. package/dist/hooks/durable-hooks-logger.d.ts +10 -0
  195. package/dist/hooks/durable-hooks-logger.d.ts.map +1 -0
  196. package/dist/hooks/durable-hooks-logger.js +75 -0
  197. package/dist/hooks/durable-hooks-logger.js.map +1 -0
  198. package/dist/hooks/durable-hooks-processor.d.ts +1 -14
  199. package/dist/hooks/durable-hooks-processor.js +58 -10
  200. package/dist/hooks/durable-hooks-processor.js.map +1 -1
  201. package/dist/hooks/durable-hooks-runtime.js +44 -0
  202. package/dist/hooks/durable-hooks-runtime.js.map +1 -0
  203. package/dist/hooks/hooks.d.ts +60 -2
  204. package/dist/hooks/hooks.d.ts.map +1 -1
  205. package/dist/hooks/hooks.js +214 -53
  206. package/dist/hooks/hooks.js.map +1 -1
  207. package/dist/id.d.ts +2 -2
  208. package/dist/id.js +2 -2
  209. package/dist/internal/adapter-registry.d.ts +11 -0
  210. package/dist/internal/adapter-registry.d.ts.map +1 -0
  211. package/dist/internal/adapter-registry.js +135 -0
  212. package/dist/internal/adapter-registry.js.map +1 -0
  213. package/dist/internal/outbox-state.d.ts +2 -0
  214. package/dist/internal/outbox-state.js +26 -0
  215. package/dist/internal/outbox-state.js.map +1 -0
  216. package/dist/migration-engine/auto-from-schema.d.ts +33 -0
  217. package/dist/migration-engine/auto-from-schema.d.ts.map +1 -0
  218. package/dist/migration-engine/auto-from-schema.js +210 -27
  219. package/dist/migration-engine/auto-from-schema.js.map +1 -1
  220. package/dist/migration-engine/generation-engine.d.ts.map +1 -1
  221. package/dist/migration-engine/generation-engine.js +17 -5
  222. package/dist/migration-engine/generation-engine.js.map +1 -1
  223. package/dist/migration-engine/shared.d.ts +113 -0
  224. package/dist/migration-engine/shared.d.ts.map +1 -0
  225. package/dist/migration-engine/shared.js.map +1 -1
  226. package/dist/mod.d.ts +12 -11
  227. package/dist/mod.d.ts.map +1 -1
  228. package/dist/mod.js +10 -10
  229. package/dist/mod.js.map +1 -1
  230. package/dist/naming/sql-naming.d.ts.map +1 -1
  231. package/dist/naming/sql-naming.js.map +1 -1
  232. package/dist/outbox/outbox-builder.js.map +1 -1
  233. package/dist/outbox/outbox.d.ts +3 -1
  234. package/dist/outbox/outbox.d.ts.map +1 -1
  235. package/dist/outbox/outbox.js.map +1 -1
  236. package/dist/query/column-defaults.js.map +1 -1
  237. package/dist/query/condition-builder.d.ts +7 -1
  238. package/dist/query/condition-builder.d.ts.map +1 -1
  239. package/dist/query/condition-builder.js +5 -1
  240. package/dist/query/condition-builder.js.map +1 -1
  241. package/dist/query/cursor-client.d.ts +105 -0
  242. package/dist/query/cursor-client.d.ts.map +1 -0
  243. package/dist/query/cursor-client.js +165 -0
  244. package/dist/query/cursor-client.js.map +1 -0
  245. package/dist/query/cursor.d.ts.map +1 -1
  246. package/dist/query/cursor.js +7 -1
  247. package/dist/query/cursor.js.map +1 -1
  248. package/dist/query/db-now.d.ts +15 -1
  249. package/dist/query/db-now.d.ts.map +1 -1
  250. package/dist/query/db-now.js +30 -2
  251. package/dist/query/db-now.js.map +1 -1
  252. package/dist/query/orm/orm.js.map +1 -1
  253. package/dist/query/serialize/create-sql-serializer.js +2 -2
  254. package/dist/query/serialize/create-sql-serializer.js.map +1 -1
  255. package/dist/query/serialize/dialect/mysql-serializer.js.map +1 -1
  256. package/dist/query/serialize/dialect/postgres-serializer.js.map +1 -1
  257. package/dist/query/serialize/dialect/sqlite-serializer.js +6 -2
  258. package/dist/query/serialize/dialect/sqlite-serializer.js.map +1 -1
  259. package/dist/query/simple-query-interface.d.ts +7 -3
  260. package/dist/query/simple-query-interface.d.ts.map +1 -1
  261. package/dist/query/unit-of-work/execute-unit-of-work.d.ts +37 -2
  262. package/dist/query/unit-of-work/execute-unit-of-work.d.ts.map +1 -1
  263. package/dist/query/unit-of-work/execute-unit-of-work.js +39 -18
  264. package/dist/query/unit-of-work/execute-unit-of-work.js.map +1 -1
  265. package/dist/query/unit-of-work/unit-of-work.d.ts +42 -16
  266. package/dist/query/unit-of-work/unit-of-work.d.ts.map +1 -1
  267. package/dist/query/unit-of-work/unit-of-work.js +50 -6
  268. package/dist/query/unit-of-work/unit-of-work.js.map +1 -1
  269. package/dist/query/value-decoding.js +8 -1
  270. package/dist/query/value-decoding.js.map +1 -1
  271. package/dist/query/value-encoding.js.map +1 -1
  272. package/dist/schema/create.d.ts +69 -25
  273. package/dist/schema/create.d.ts.map +1 -1
  274. package/dist/schema/create.js +91 -16
  275. package/dist/schema/create.js.map +1 -1
  276. package/dist/schema/type-conversion/create-sql-type-mapper.js +1 -1
  277. package/dist/schema/type-conversion/create-sql-type-mapper.js.map +1 -1
  278. package/dist/schema/type-conversion/dialect/sqlite.js.map +1 -1
  279. package/dist/schema/validator.d.ts.map +1 -1
  280. package/dist/schema/validator.js.map +1 -1
  281. package/dist/schema-output/drizzle.d.ts.map +1 -1
  282. package/dist/schema-output/drizzle.js +8 -6
  283. package/dist/schema-output/drizzle.js.map +1 -1
  284. package/dist/schema-output/prisma.d.ts.map +1 -1
  285. package/dist/schema-output/prisma.js +21 -10
  286. package/dist/schema-output/prisma.js.map +1 -1
  287. package/dist/sql-driver/dialects/durable-object-dialect.js +3 -9
  288. package/dist/sql-driver/dialects/durable-object-dialect.js.map +1 -1
  289. package/dist/sql-driver/query-executor/default-query-executor.js.map +1 -1
  290. package/dist/sql-driver/query-executor/query-executor-base.js.map +1 -1
  291. package/dist/sql-driver/sql-driver-adapter.js.map +1 -1
  292. package/dist/sql-driver/sql.js.map +1 -1
  293. package/dist/sync/commands.d.ts +15 -0
  294. package/dist/sync/commands.d.ts.map +1 -0
  295. package/dist/sync/commands.js +27 -0
  296. package/dist/sync/commands.js.map +1 -0
  297. package/dist/sync/index.d.ts +4 -0
  298. package/dist/sync/index.js +4 -0
  299. package/dist/sync/read-tracking.d.ts +25 -0
  300. package/dist/sync/read-tracking.d.ts.map +1 -0
  301. package/dist/sync/read-tracking.js +148 -0
  302. package/dist/sync/read-tracking.js.map +1 -0
  303. package/dist/sync/submit.js +213 -0
  304. package/dist/sync/submit.js.map +1 -0
  305. package/dist/sync/types.d.ts +63 -0
  306. package/dist/sync/types.d.ts.map +1 -0
  307. package/dist/util/default-database-adapter.js +6 -1
  308. package/dist/util/default-database-adapter.js.map +1 -1
  309. package/dist/with-database.d.ts +3 -6
  310. package/dist/with-database.d.ts.map +1 -1
  311. package/dist/with-database.js +7 -15
  312. package/dist/with-database.js.map +1 -1
  313. package/package.json +33 -41
  314. package/src/adapters/adapters.ts +5 -4
  315. package/src/adapters/drizzle/migrate-drizzle.test.ts +46 -9
  316. package/src/adapters/drizzle/migration-parity-drizzle-kit.test.ts +5 -3
  317. package/src/adapters/drizzle/test-utils.ts +2 -1
  318. package/src/adapters/generic-sql/generic-sql-adapter.test.ts +5 -3
  319. package/src/adapters/generic-sql/generic-sql-adapter.ts +21 -24
  320. package/src/adapters/generic-sql/generic-sql-uow-executor.test.ts +1 -0
  321. package/src/adapters/generic-sql/generic-sql-uow-executor.ts +81 -15
  322. package/src/adapters/generic-sql/migration/adapter-migration-parity.test.ts +4 -2
  323. package/src/adapters/generic-sql/migration/cold-kysely.ts +1 -0
  324. package/src/adapters/generic-sql/migration/dialect/mysql.test.ts +3 -2
  325. package/src/adapters/generic-sql/migration/dialect/mysql.ts +1 -0
  326. package/src/adapters/generic-sql/migration/dialect/postgres.test.ts +5 -4
  327. package/src/adapters/generic-sql/migration/dialect/postgres.ts +2 -1
  328. package/src/adapters/generic-sql/migration/dialect/sqlite.test.ts +795 -3
  329. package/src/adapters/generic-sql/migration/dialect/sqlite.ts +385 -57
  330. package/src/adapters/generic-sql/migration/executor.test.ts +52 -0
  331. package/src/adapters/generic-sql/migration/executor.ts +47 -4
  332. package/src/adapters/generic-sql/migration/prepared-migrations.test.ts +117 -14
  333. package/src/adapters/generic-sql/migration/prepared-migrations.ts +9 -8
  334. package/src/adapters/generic-sql/migration/sql-generator.ts +5 -3
  335. package/src/adapters/generic-sql/query/create-sql-query-compiler.ts +3 -3
  336. package/src/adapters/generic-sql/query/cursor-utils.test.ts +3 -2
  337. package/src/adapters/generic-sql/query/cursor-utils.ts +1 -1
  338. package/src/adapters/generic-sql/query/db-now-sql.ts +49 -0
  339. package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.test.ts +144 -8
  340. package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.ts +16 -17
  341. package/src/adapters/generic-sql/query/select-builder.test.ts +1 -0
  342. package/src/adapters/generic-sql/query/select-builder.ts +2 -2
  343. package/src/adapters/generic-sql/query/sql-query-compiler.test.ts +24 -5
  344. package/src/adapters/generic-sql/query/sql-query-compiler.ts +83 -13
  345. package/src/adapters/generic-sql/query/where-builder.test.ts +7 -5
  346. package/src/adapters/generic-sql/query/where-builder.ts +48 -29
  347. package/src/adapters/generic-sql/sql-adapter-pglite-migrations.test.ts +6 -15
  348. package/src/adapters/generic-sql/sql-adapter-pglite-pagination.test.ts +52 -7
  349. package/src/adapters/generic-sql/sql-adapter-pglite-queries.test.ts +9 -6
  350. package/src/adapters/generic-sql/sql-adapter-sqlite3-driver.test.ts +273 -5
  351. package/src/adapters/generic-sql/sql-adapter-sqlite3-uow.test.ts +123 -6
  352. package/src/adapters/generic-sql/sql-adapter-sqlocal.test.ts +4 -2
  353. package/src/adapters/generic-sql/uow-decoder.test.ts +4 -3
  354. package/src/adapters/generic-sql/uow-decoder.ts +3 -3
  355. package/src/adapters/generic-sql/uow-encoder.test.ts +4 -2
  356. package/src/adapters/generic-sql/uow-encoder.ts +14 -18
  357. package/src/adapters/in-memory/condition-evaluator.test.ts +2 -1
  358. package/src/adapters/in-memory/condition-evaluator.ts +9 -4
  359. package/src/adapters/in-memory/in-memory-adapter.ts +155 -44
  360. package/src/adapters/in-memory/in-memory-uow.mutations.test.ts +50 -2
  361. package/src/adapters/in-memory/in-memory-uow.retrieval.test.ts +158 -3
  362. package/src/adapters/in-memory/in-memory-uow.ts +402 -26
  363. package/src/adapters/in-memory/options.test.ts +1 -0
  364. package/src/adapters/in-memory/options.ts +5 -1
  365. package/src/adapters/in-memory/outbox.test.ts +361 -0
  366. package/src/adapters/in-memory/reference-resolution.test.ts +3 -2
  367. package/src/adapters/in-memory/reference-resolution.ts +2 -2
  368. package/src/adapters/in-memory/sorted-array-index.test.ts +1 -0
  369. package/src/adapters/in-memory/store.test.ts +1 -0
  370. package/src/adapters/in-memory/store.ts +3 -3
  371. package/src/adapters/in-memory/value-normalization.test.ts +1 -0
  372. package/src/adapters/prisma/prisma-adapter-sqlite3.test.ts +51 -7
  373. package/src/adapters/shared/from-unit-of-work-compiler.ts +156 -46
  374. package/src/adapters/shared/uow-operation-compiler.ts +3 -3
  375. package/src/browser/mod.ts +64 -0
  376. package/src/client.ts +19 -0
  377. package/src/db-fragment-definition-builder.test.ts +821 -47
  378. package/src/db-fragment-definition-builder.ts +857 -110
  379. package/src/db-fragment-instantiator.test.ts +114 -90
  380. package/src/db-fragment-integration.test.ts +9 -6
  381. package/src/dispatchers/cloudflare-do/dispatcher.ts +204 -0
  382. package/src/dispatchers/cloudflare-do/index.test.ts +145 -12
  383. package/src/dispatchers/cloudflare-do/index.ts +49 -90
  384. package/src/dispatchers/node/dispatcher.ts +112 -0
  385. package/src/dispatchers/node/index.test.ts +43 -14
  386. package/src/dispatchers/node/index.ts +38 -75
  387. package/src/durable-hooks.test.ts +80 -0
  388. package/src/durable-hooks.ts +67 -0
  389. package/src/fragments/internal-fragment.routes.test.ts +570 -0
  390. package/src/fragments/internal-fragment.routes.ts +297 -5
  391. package/src/fragments/internal-fragment.schema.ts +45 -1
  392. package/src/fragments/internal-fragment.test.ts +223 -251
  393. package/src/fragments/internal-fragment.ts +278 -154
  394. package/src/hooks/durable-hooks-logger.ts +126 -0
  395. package/src/hooks/durable-hooks-processor.pglite.test.ts +87 -0
  396. package/src/hooks/durable-hooks-processor.test.ts +179 -14
  397. package/src/hooks/durable-hooks-processor.ts +120 -14
  398. package/src/hooks/durable-hooks-runtime.test.ts +65 -0
  399. package/src/hooks/durable-hooks-runtime.ts +81 -0
  400. package/src/hooks/hooks.test.ts +314 -53
  401. package/src/hooks/hooks.ts +360 -81
  402. package/src/id.test.ts +34 -0
  403. package/src/id.ts +1 -3
  404. package/src/internal/adapter-registry.test.ts +93 -0
  405. package/src/internal/adapter-registry.ts +239 -0
  406. package/src/internal/outbox-state.ts +43 -0
  407. package/src/migration-engine/auto-from-schema.test.ts +93 -0
  408. package/src/migration-engine/auto-from-schema.ts +360 -42
  409. package/src/migration-engine/create.test.ts +2 -1
  410. package/src/migration-engine/create.ts +1 -1
  411. package/src/migration-engine/generation-engine.test.ts +66 -9
  412. package/src/migration-engine/generation-engine.ts +31 -10
  413. package/src/migration-engine/shared.ts +13 -0
  414. package/src/mod.ts +45 -27
  415. package/src/naming/sql-naming.ts +1 -0
  416. package/src/outbox/outbox-builder.ts +2 -2
  417. package/src/outbox/outbox.test.ts +216 -45
  418. package/src/outbox/outbox.ts +3 -1
  419. package/src/query/column-defaults.ts +1 -1
  420. package/src/query/condition-builder.test.ts +15 -0
  421. package/src/query/condition-builder.ts +7 -0
  422. package/src/query/cursor-client.test.ts +70 -0
  423. package/src/query/cursor-client.ts +263 -0
  424. package/src/query/cursor.test.ts +3 -2
  425. package/src/query/cursor.ts +15 -3
  426. package/src/query/db-now.ts +69 -2
  427. package/src/query/orm/orm.ts +2 -2
  428. package/src/query/query-type.test.ts +2 -1
  429. package/src/query/serialize/create-sql-serializer.ts +3 -3
  430. package/src/query/serialize/dialect/mysql-serializer.ts +1 -1
  431. package/src/query/serialize/dialect/postgres-serializer.ts +1 -1
  432. package/src/query/serialize/dialect/sqlite-serializer.test.ts +39 -2
  433. package/src/query/serialize/dialect/sqlite-serializer.ts +18 -5
  434. package/src/query/simple-query-interface.ts +10 -4
  435. package/src/query/unit-of-work/execute-unit-of-work.test.ts +347 -9
  436. package/src/query/unit-of-work/execute-unit-of-work.ts +63 -20
  437. package/src/query/unit-of-work/retry-policy.test.ts +1 -0
  438. package/src/query/unit-of-work/tx-builder.test.ts +73 -1
  439. package/src/query/unit-of-work/unit-of-work-coordinator.test.ts +5 -4
  440. package/src/query/unit-of-work/unit-of-work-types.test.ts +41 -11
  441. package/src/query/unit-of-work/unit-of-work.test.ts +28 -2
  442. package/src/query/unit-of-work/unit-of-work.ts +105 -19
  443. package/src/query/value-decoding.test.ts +50 -2
  444. package/src/query/value-decoding.ts +17 -4
  445. package/src/query/value-encoding.test.ts +1 -0
  446. package/src/query/value-encoding.ts +1 -1
  447. package/src/schema/create.test.ts +164 -5
  448. package/src/schema/create.ts +222 -24
  449. package/src/schema/generate-id.test.ts +1 -0
  450. package/src/schema/serialize.test.ts +4 -3
  451. package/src/schema/type-conversion/create-sql-type-mapper.ts +1 -1
  452. package/src/schema/type-conversion/dialect/sqlite.ts +2 -2
  453. package/src/schema/type-conversion/type-mapping.test.ts +2 -1
  454. package/src/schema/validator.test.ts +4 -2
  455. package/src/schema/validator.ts +1 -0
  456. package/src/schema-output/drizzle.test.ts +72 -19
  457. package/src/schema-output/drizzle.ts +24 -18
  458. package/src/schema-output/prisma.test.ts +172 -14
  459. package/src/schema-output/prisma.ts +34 -14
  460. package/src/sql-driver/better-sqlite3.test.ts +5 -3
  461. package/src/sql-driver/dialects/durable-object-dialect.ts +3 -8
  462. package/src/sql-driver/query-executor/default-query-executor.ts +1 -1
  463. package/src/sql-driver/query-executor/query-executor-base.ts +1 -1
  464. package/src/sql-driver/query-executor/query-executor.ts +1 -1
  465. package/src/sql-driver/sql-driver-adapter.ts +2 -2
  466. package/src/sql-driver/sql.ts +2 -1
  467. package/src/sql-driver/sqlocal.test.ts +4 -2
  468. package/src/sync/commands.test.ts +39 -0
  469. package/src/sync/commands.ts +51 -0
  470. package/src/sync/conflict-checker.test.ts +450 -0
  471. package/src/sync/conflict-checker.ts +248 -0
  472. package/src/sync/index.ts +14 -0
  473. package/src/sync/plan.ts +9 -0
  474. package/src/sync/read-tracking.test.ts +177 -0
  475. package/src/sync/read-tracking.ts +287 -0
  476. package/src/sync/submit.test.ts +205 -0
  477. package/src/sync/submit.ts +328 -0
  478. package/src/sync/types.ts +80 -0
  479. package/src/util/default-database-adapter.ts +15 -2
  480. package/src/with-database.ts +20 -50
  481. package/tsconfig.json +1 -1
  482. package/tsdown.config.ts +38 -26
  483. package/vitest.config.ts +1 -0
  484. package/dist/hooks/durable-hooks-processor.d.ts.map +0 -1
  485. package/dist/node_modules/.pnpm/rou3@0.7.12/node_modules/rou3/dist/index.js +0 -168
  486. package/dist/node_modules/.pnpm/rou3@0.7.12/node_modules/rou3/dist/index.js.map +0 -1
  487. package/dist/packages/fragno/dist/api/bind-services.js +0 -20
  488. package/dist/packages/fragno/dist/api/bind-services.js.map +0 -1
  489. package/dist/packages/fragno/dist/api/error.js +0 -48
  490. package/dist/packages/fragno/dist/api/error.js.map +0 -1
  491. package/dist/packages/fragno/dist/api/fragment-definition-builder.js +0 -321
  492. package/dist/packages/fragno/dist/api/fragment-definition-builder.js.map +0 -1
  493. package/dist/packages/fragno/dist/api/fragment-instantiator.js +0 -669
  494. package/dist/packages/fragno/dist/api/fragment-instantiator.js.map +0 -1
  495. package/dist/packages/fragno/dist/api/fragno-response.js +0 -73
  496. package/dist/packages/fragno/dist/api/fragno-response.js.map +0 -1
  497. package/dist/packages/fragno/dist/api/internal/response-stream.js +0 -81
  498. package/dist/packages/fragno/dist/api/internal/response-stream.js.map +0 -1
  499. package/dist/packages/fragno/dist/api/internal/route.js +0 -10
  500. package/dist/packages/fragno/dist/api/internal/route.js.map +0 -1
  501. package/dist/packages/fragno/dist/api/mutable-request-state.js +0 -97
  502. package/dist/packages/fragno/dist/api/mutable-request-state.js.map +0 -1
  503. package/dist/packages/fragno/dist/api/request-context-storage.js +0 -43
  504. package/dist/packages/fragno/dist/api/request-context-storage.js.map +0 -1
  505. package/dist/packages/fragno/dist/api/request-input-context.js +0 -185
  506. package/dist/packages/fragno/dist/api/request-input-context.js.map +0 -1
  507. package/dist/packages/fragno/dist/api/request-middleware.js +0 -83
  508. package/dist/packages/fragno/dist/api/request-middleware.js.map +0 -1
  509. package/dist/packages/fragno/dist/api/request-output-context.js +0 -119
  510. package/dist/packages/fragno/dist/api/request-output-context.js.map +0 -1
  511. package/dist/packages/fragno/dist/api/route.js +0 -30
  512. package/dist/packages/fragno/dist/api/route.js.map +0 -1
  513. package/dist/packages/fragno/dist/internal/symbols.js +0 -10
  514. package/dist/packages/fragno/dist/internal/symbols.js.map +0 -1
  515. package/dist/packages/fragno/dist/internal/trace-context.js +0 -12
  516. package/dist/packages/fragno/dist/internal/trace-context.js.map +0 -1
@@ -1,669 +0,0 @@
1
- import { resolveRouteFactories } from "./route.js";
2
- import { instantiatedFragmentFakeSymbol } from "../internal/symbols.js";
3
- import { FragnoApiError } from "./error.js";
4
- import { getMountRoute } from "./internal/route.js";
5
- import { RequestInputContext } from "./request-input-context.js";
6
- import { RequestOutputContext } from "./request-output-context.js";
7
- import { MutableRequestState } from "./mutable-request-state.js";
8
- import { RequestMiddlewareInputContext, RequestMiddlewareOutputContext } from "./request-middleware.js";
9
- import { parseFragnoResponse } from "./fragno-response.js";
10
- import { RequestContextStorage } from "./request-context-storage.js";
11
- import { bindServicesToContext } from "./bind-services.js";
12
- import { recordTraceEvent } from "../internal/trace-context.js";
13
- import { addRoute, createRouter, findRoute } from "../../../../node_modules/.pnpm/rou3@0.7.12/node_modules/rou3/dist/index.js";
14
-
15
- //#region ../fragno/dist/api/fragment-instantiator.js
16
- const serializeHeadersForTrace = (headers) => Array.from(headers.entries()).sort(([a], [b]) => a.localeCompare(b));
17
- const serializeQueryForTrace = (query) => Array.from(query.entries()).sort(([a], [b]) => a.localeCompare(b));
18
- const serializeBodyForTrace = (body) => {
19
- if (body instanceof FormData) return {
20
- type: "form-data",
21
- entries: Array.from(body.entries()).map(([key, value]) => {
22
- if (value instanceof Blob) return [key, {
23
- type: "blob",
24
- size: value.size,
25
- mime: value.type
26
- }];
27
- return [key, value];
28
- })
29
- };
30
- if (body instanceof Blob) return {
31
- type: "blob",
32
- size: body.size,
33
- mime: body.type
34
- };
35
- if (body instanceof ReadableStream) return { type: "stream" };
36
- return body;
37
- };
38
- const INTERNAL_LINKED_FRAGMENT_NAME = "_fragno_internal";
39
- const INTERNAL_ROUTE_PREFIX = "/_internal";
40
- function normalizeRoutePrefix(prefix) {
41
- if (!prefix.startsWith("/")) prefix = `/${prefix}`;
42
- return prefix.endsWith("/") && prefix.length > 1 ? prefix.slice(0, -1) : prefix;
43
- }
44
- function joinRoutePath(prefix, path) {
45
- const normalizedPrefix = normalizeRoutePrefix(prefix);
46
- if (!path || path === "/") return normalizedPrefix;
47
- return `${normalizedPrefix}${path.startsWith("/") ? path : `/${path}`}`;
48
- }
49
- function collectLinkedFragmentRoutes(linkedFragments) {
50
- const linkedRoutes = [];
51
- for (const [name, fragment] of Object.entries(linkedFragments)) {
52
- if (name !== INTERNAL_LINKED_FRAGMENT_NAME) continue;
53
- const internalRoutes = fragment.routes ?? [];
54
- if (internalRoutes.length === 0) continue;
55
- for (const route of internalRoutes) linkedRoutes.push({
56
- ...route,
57
- path: joinRoutePath(INTERNAL_ROUTE_PREFIX, route.path),
58
- __internal: {
59
- fragment,
60
- originalPath: route.path,
61
- routes: internalRoutes
62
- }
63
- });
64
- }
65
- return linkedRoutes;
66
- }
67
- /**
68
- * Instantiated fragment class with encapsulated state.
69
- * Provides the same public API as the old FragnoInstantiatedFragment but with better encapsulation.
70
- */
71
- var FragnoInstantiatedFragment = class FragnoInstantiatedFragment$1 {
72
- [instantiatedFragmentFakeSymbol] = instantiatedFragmentFakeSymbol;
73
- #name;
74
- #routes;
75
- #deps;
76
- #services;
77
- #mountRoute;
78
- #router;
79
- #middlewareHandler;
80
- #serviceThisContext;
81
- #handlerThisContext;
82
- #contextStorage;
83
- #createRequestStorage;
84
- #options;
85
- #linkedFragments;
86
- #internalData;
87
- constructor(params) {
88
- this.#name = params.name;
89
- this.#routes = params.routes;
90
- this.#deps = params.deps;
91
- this.#services = params.services;
92
- this.#mountRoute = params.mountRoute;
93
- this.#serviceThisContext = params.serviceThisContext;
94
- this.#handlerThisContext = params.handlerThisContext;
95
- this.#contextStorage = params.storage;
96
- this.#createRequestStorage = params.createRequestStorage;
97
- this.#options = params.options;
98
- this.#linkedFragments = params.linkedFragments ?? {};
99
- this.#internalData = params.internalData ?? {};
100
- this.#router = createRouter();
101
- for (const routeConfig of this.#routes) addRoute(this.#router, routeConfig.method.toUpperCase(), routeConfig.path, routeConfig);
102
- this.handler = this.handler.bind(this);
103
- }
104
- get name() {
105
- return this.#name;
106
- }
107
- get routes() {
108
- return this.#routes;
109
- }
110
- get services() {
111
- return this.#services;
112
- }
113
- get mountRoute() {
114
- return this.#mountRoute;
115
- }
116
- /**
117
- * @internal
118
- */
119
- get $internal() {
120
- return {
121
- deps: this.#deps,
122
- options: this.#options,
123
- linkedFragments: this.#linkedFragments,
124
- ...this.#internalData
125
- };
126
- }
127
- /**
128
- * Add middleware to this fragment.
129
- * Middleware can inspect and modify requests before they reach handlers.
130
- */
131
- withMiddleware(handler) {
132
- if (this.#middlewareHandler) throw new Error("Middleware already set");
133
- this.#middlewareHandler = handler;
134
- return this;
135
- }
136
- #withRequestStorage(callback) {
137
- if (!this.#serviceThisContext && !this.#handlerThisContext) return callback();
138
- const storageData = this.#createRequestStorage ? this.#createRequestStorage() : {};
139
- return this.#contextStorage.run(storageData, callback);
140
- }
141
- inContext(callback) {
142
- if (this.#handlerThisContext) {
143
- const boundCallback = callback.bind(this.#handlerThisContext);
144
- return this.#withRequestStorage(boundCallback);
145
- }
146
- return this.#withRequestStorage(callback);
147
- }
148
- /**
149
- * Get framework-specific handlers for this fragment.
150
- * Use this to integrate the fragment with different fullstack frameworks.
151
- */
152
- handlersFor(framework) {
153
- const handler = this.handler.bind(this);
154
- if (framework === "h3" || framework === "nuxt") throw new Error(`To get handlers for h3, use the 'fromWebHandler' utility function:
155
- import { fromWebHandler } from "h3";
156
- export default fromWebHandler(myFragment().handler);`);
157
- return {
158
- astro: { ALL: handler },
159
- "react-router": {
160
- loader: ({ request }) => handler(request),
161
- action: ({ request }) => handler(request)
162
- },
163
- "next-js": {
164
- GET: handler,
165
- POST: handler,
166
- PUT: handler,
167
- DELETE: handler,
168
- PATCH: handler,
169
- HEAD: handler,
170
- OPTIONS: handler
171
- },
172
- "svelte-kit": {
173
- GET: handler,
174
- POST: handler,
175
- PUT: handler,
176
- DELETE: handler,
177
- PATCH: handler,
178
- HEAD: handler,
179
- OPTIONS: handler
180
- },
181
- "solid-start": {
182
- GET: ({ request }) => handler(request),
183
- POST: ({ request }) => handler(request),
184
- PUT: ({ request }) => handler(request),
185
- DELETE: ({ request }) => handler(request),
186
- PATCH: ({ request }) => handler(request),
187
- HEAD: ({ request }) => handler(request),
188
- OPTIONS: ({ request }) => handler(request)
189
- },
190
- "tanstack-start": {
191
- GET: ({ request }) => handler(request),
192
- POST: ({ request }) => handler(request),
193
- PUT: ({ request }) => handler(request),
194
- DELETE: ({ request }) => handler(request),
195
- PATCH: ({ request }) => handler(request),
196
- HEAD: ({ request }) => handler(request),
197
- OPTIONS: ({ request }) => handler(request)
198
- }
199
- }[framework];
200
- }
201
- /**
202
- * Main request handler for this fragment.
203
- * Handles routing, middleware, and error handling.
204
- */
205
- async handler(req) {
206
- const url = new URL(req.url);
207
- const pathname = url.pathname;
208
- const matchRoute = pathname.startsWith(this.#mountRoute) ? pathname.slice(this.#mountRoute.length) : null;
209
- if (matchRoute === null) return Response.json({
210
- error: `Fragno: Route for '${this.#name}' not found. Is the fragment mounted on the right route? Expecting: '${this.#mountRoute}'.`,
211
- code: "ROUTE_NOT_FOUND"
212
- }, { status: 404 });
213
- const route = findRoute(this.#router, req.method, matchRoute);
214
- if (!route) return Response.json({
215
- error: `Fragno: Route for '${this.#name}' not found`,
216
- code: "ROUTE_NOT_FOUND"
217
- }, { status: 404 });
218
- const routeConfig = route.data;
219
- const expectedContentType = routeConfig.contentType ?? "application/json";
220
- let requestBody = void 0;
221
- let rawBody = void 0;
222
- if (req.body instanceof ReadableStream) {
223
- const requestContentType = (req.headers.get("content-type") ?? "").toLowerCase();
224
- if (expectedContentType === "multipart/form-data") {
225
- if (!requestContentType.includes("multipart/form-data")) return Response.json({
226
- error: `This endpoint expects multipart/form-data, but received: ${requestContentType || "no content-type"}`,
227
- code: "UNSUPPORTED_MEDIA_TYPE"
228
- }, { status: 415 });
229
- try {
230
- requestBody = await req.formData();
231
- } catch {
232
- return Response.json({
233
- error: "Failed to parse multipart form data",
234
- code: "INVALID_REQUEST_BODY"
235
- }, { status: 400 });
236
- }
237
- } else if (expectedContentType === "application/octet-stream") {
238
- if (!requestContentType.includes("application/octet-stream")) return Response.json({
239
- error: `This endpoint expects application/octet-stream, but received: ${requestContentType || "no content-type"}`,
240
- code: "UNSUPPORTED_MEDIA_TYPE"
241
- }, { status: 415 });
242
- requestBody = req.body ?? new ReadableStream();
243
- } else {
244
- if (requestContentType.includes("multipart/form-data")) return Response.json({
245
- error: `This endpoint expects JSON, but received multipart/form-data. Use a route with contentType: "multipart/form-data" for file uploads.`,
246
- code: "UNSUPPORTED_MEDIA_TYPE"
247
- }, { status: 415 });
248
- rawBody = await req.clone().text();
249
- if (rawBody) try {
250
- requestBody = JSON.parse(rawBody);
251
- } catch {
252
- requestBody = void 0;
253
- }
254
- }
255
- }
256
- const decodedRouteParams = {};
257
- for (const [key, value] of Object.entries(route.params ?? {})) decodedRouteParams[key] = decodeURIComponent(value);
258
- const requestState = new MutableRequestState({
259
- pathParams: decodedRouteParams,
260
- searchParams: url.searchParams,
261
- body: requestBody,
262
- headers: new Headers(req.headers)
263
- });
264
- const executeRequest = async () => {
265
- const middlewareResult = await this.#executeMiddleware(req, route, requestState);
266
- if (middlewareResult !== void 0) return middlewareResult;
267
- const internalMeta = routeConfig.__internal;
268
- if (internalMeta) {
269
- const internalResult = await FragnoInstantiatedFragment$1.#runMiddlewareForFragment(internalMeta.fragment, {
270
- req,
271
- method: routeConfig.method,
272
- path: internalMeta.originalPath,
273
- requestState,
274
- routes: internalMeta.routes
275
- });
276
- if (internalResult !== void 0) return internalResult;
277
- }
278
- return this.#executeHandler(req, route, requestState, rawBody);
279
- };
280
- return this.#withRequestStorage(executeRequest);
281
- }
282
- /**
283
- * Call a route directly with typed inputs and outputs.
284
- * Useful for testing and server-side route calls.
285
- */
286
- async callRoute(method, path, inputOptions) {
287
- return parseFragnoResponse(await this.callRouteRaw(method, path, inputOptions));
288
- }
289
- /**
290
- * Call a route directly and get the raw Response object.
291
- * Useful for testing and server-side route calls.
292
- */
293
- async callRouteRaw(method, path, inputOptions) {
294
- const route = this.#routes.find((r) => r.method === method && r.path === path);
295
- if (!route) return Response.json({
296
- error: `Route ${method} ${path} not found`,
297
- code: "ROUTE_NOT_FOUND"
298
- }, { status: 404 });
299
- const { pathParams = {}, body, query, headers } = inputOptions || {};
300
- const searchParams = query instanceof URLSearchParams ? query : query ? new URLSearchParams(query) : new URLSearchParams();
301
- const requestHeaders = headers instanceof Headers ? headers : headers ? new Headers(headers) : new Headers();
302
- const inputContext = new RequestInputContext({
303
- path: route.path,
304
- method: route.method,
305
- pathParams,
306
- searchParams,
307
- headers: requestHeaders,
308
- parsedBody: body,
309
- inputSchema: route.inputSchema,
310
- shouldValidateInput: true
311
- });
312
- recordTraceEvent({
313
- type: "route-input",
314
- method: route.method,
315
- path: route.path,
316
- pathParams: pathParams ?? {},
317
- queryParams: serializeQueryForTrace(searchParams),
318
- headers: serializeHeadersForTrace(requestHeaders),
319
- body: serializeBodyForTrace(body)
320
- });
321
- const outputContext = new RequestOutputContext(route.outputSchema);
322
- const executeHandler = async () => {
323
- try {
324
- const thisContext = this.#handlerThisContext ?? {};
325
- return await route.handler.call(thisContext, inputContext, outputContext);
326
- } catch (error) {
327
- console.error("Error in callRoute handler", error);
328
- if (error instanceof FragnoApiError) return error.toResponse();
329
- return Response.json({
330
- error: "Internal server error",
331
- code: "INTERNAL_SERVER_ERROR"
332
- }, { status: 500 });
333
- }
334
- };
335
- return this.#withRequestStorage(executeHandler);
336
- }
337
- /**
338
- * Execute middleware for a request.
339
- * Returns undefined if middleware allows the request to continue to the handler.
340
- */
341
- async #executeMiddleware(req, route, requestState) {
342
- if (!route) return;
343
- const { path } = route.data;
344
- return FragnoInstantiatedFragment$1.#runMiddlewareForFragment(this, {
345
- req,
346
- method: req.method,
347
- path,
348
- requestState
349
- });
350
- }
351
- static async #runMiddlewareForFragment(fragment, options) {
352
- if (!fragment.#middlewareHandler) return;
353
- const middlewareInputContext = new RequestMiddlewareInputContext(options.routes ?? fragment.#routes, {
354
- method: options.method,
355
- path: options.path,
356
- request: options.req,
357
- state: options.requestState
358
- });
359
- const middlewareOutputContext = new RequestMiddlewareOutputContext(fragment.#deps, fragment.#services);
360
- try {
361
- const middlewareResult = await fragment.#middlewareHandler(middlewareInputContext, middlewareOutputContext);
362
- recordTraceEvent({
363
- type: "middleware-decision",
364
- method: options.method,
365
- path: options.path,
366
- outcome: middlewareResult ? "deny" : "allow",
367
- status: middlewareResult?.status
368
- });
369
- if (middlewareResult !== void 0) return middlewareResult;
370
- } catch (error) {
371
- console.error("Error in middleware", error);
372
- recordTraceEvent({
373
- type: "middleware-decision",
374
- method: options.method,
375
- path: options.path,
376
- outcome: "deny",
377
- status: error instanceof FragnoApiError ? error.status : 500
378
- });
379
- if (error instanceof FragnoApiError) return error.toResponse();
380
- return Response.json({
381
- error: "Internal server error",
382
- code: "INTERNAL_SERVER_ERROR"
383
- }, { status: 500 });
384
- }
385
- }
386
- /**
387
- * Execute a route handler with proper error handling.
388
- */
389
- async #executeHandler(req, route, requestState, rawBody) {
390
- if (!route) return Response.json({
391
- error: "Route not found",
392
- code: "ROUTE_NOT_FOUND"
393
- }, { status: 404 });
394
- const { handler, inputSchema, outputSchema, path } = route.data;
395
- const inputContext = await RequestInputContext.fromRequest({
396
- request: req,
397
- method: req.method,
398
- path,
399
- pathParams: route.params ?? {},
400
- inputSchema,
401
- state: requestState,
402
- rawBody
403
- });
404
- recordTraceEvent({
405
- type: "route-input",
406
- method: req.method,
407
- path,
408
- pathParams: inputContext.pathParams,
409
- queryParams: serializeQueryForTrace(requestState.searchParams),
410
- headers: serializeHeadersForTrace(requestState.headers),
411
- body: serializeBodyForTrace(requestState.body)
412
- });
413
- const outputContext = new RequestOutputContext(outputSchema);
414
- try {
415
- const contextForHandler = this.#handlerThisContext ?? {};
416
- return await handler.call(contextForHandler, inputContext, outputContext);
417
- } catch (error) {
418
- console.error("Error in handler", error);
419
- if (error instanceof FragnoApiError) return error.toResponse();
420
- return Response.json({
421
- error: "Internal server error",
422
- code: "INTERNAL_SERVER_ERROR"
423
- }, { status: 500 });
424
- }
425
- }
426
- };
427
- /**
428
- * Core instantiation function that creates a fragment instance from a definition.
429
- * This function validates dependencies, calls all callbacks, and wires everything together.
430
- */
431
- function instantiateFragment(definition, config, routesOrFactories, options, serviceImplementations, instantiationOptions) {
432
- const { dryRun = false } = instantiationOptions ?? {};
433
- const serviceDependencies = definition.serviceDependencies;
434
- if (serviceDependencies) for (const [serviceName, meta] of Object.entries(serviceDependencies)) {
435
- const metadata = meta;
436
- const implementation = serviceImplementations?.[serviceName];
437
- if (metadata.required && !implementation) throw new Error(`Fragment '${definition.name}' requires service '${metadata.name}' but it was not provided`);
438
- }
439
- let deps;
440
- try {
441
- deps = definition.dependencies?.({
442
- config,
443
- options
444
- }) ?? {};
445
- } catch (error) {
446
- if (dryRun) {
447
- console.warn("Warning: Failed to initialize dependencies in dry run mode:", error instanceof Error ? error.message : String(error));
448
- deps = {};
449
- } else throw error;
450
- }
451
- const linkedFragmentInstances = {};
452
- const linkedFragmentServices = {};
453
- if (definition.linkedFragments) for (const [name, callback] of Object.entries(definition.linkedFragments)) {
454
- const linkedFragment = callback({
455
- config,
456
- options,
457
- serviceDependencies: serviceImplementations
458
- });
459
- linkedFragmentInstances[name] = linkedFragment;
460
- const services$1 = linkedFragment.services;
461
- for (const [serviceName, service] of Object.entries(services$1)) linkedFragmentServices[serviceName] = service;
462
- }
463
- const defineService = (services$1) => services$1;
464
- const privateServices = { ...linkedFragmentServices };
465
- if (definition.privateServices) for (const [serviceName, factory] of Object.entries(definition.privateServices)) {
466
- const serviceFactory = factory;
467
- try {
468
- privateServices[serviceName] = serviceFactory({
469
- config,
470
- options,
471
- deps,
472
- serviceDeps: serviceImplementations ?? {},
473
- privateServices,
474
- defineService
475
- });
476
- } catch (error) {
477
- if (dryRun) {
478
- console.warn(`Warning: Failed to initialize private service '${serviceName}' in dry run mode:`, error instanceof Error ? error.message : String(error));
479
- privateServices[serviceName] = {};
480
- } else throw error;
481
- }
482
- }
483
- let baseServices;
484
- try {
485
- baseServices = definition.baseServices?.({
486
- config,
487
- options,
488
- deps,
489
- serviceDeps: serviceImplementations ?? {},
490
- privateServices,
491
- defineService
492
- }) ?? {};
493
- } catch (error) {
494
- if (dryRun) {
495
- console.warn("Warning: Failed to initialize base services in dry run mode:", error instanceof Error ? error.message : String(error));
496
- baseServices = {};
497
- } else throw error;
498
- }
499
- const namedServices = {};
500
- if (definition.namedServices) for (const [serviceName, factory] of Object.entries(definition.namedServices)) {
501
- const serviceFactory = factory;
502
- try {
503
- namedServices[serviceName] = serviceFactory({
504
- config,
505
- options,
506
- deps,
507
- serviceDeps: serviceImplementations ?? {},
508
- privateServices,
509
- defineService
510
- });
511
- } catch (error) {
512
- if (dryRun) {
513
- console.warn(`Warning: Failed to initialize service '${serviceName}' in dry run mode:`, error instanceof Error ? error.message : String(error));
514
- namedServices[serviceName] = {};
515
- } else throw error;
516
- }
517
- }
518
- const services = {
519
- ...baseServices,
520
- ...namedServices
521
- };
522
- const storage = definition.getExternalStorage ? definition.getExternalStorage({
523
- config,
524
- options,
525
- deps
526
- }) : new RequestContextStorage();
527
- const contexts = definition.createThisContext?.({
528
- config,
529
- options,
530
- deps,
531
- storage
532
- });
533
- const serviceContext = contexts?.serviceContext;
534
- const handlerContext = contexts?.handlerContext;
535
- const internalData = definition.internalDataFactory?.({
536
- config,
537
- options,
538
- deps,
539
- linkedFragments: linkedFragmentInstances
540
- }) ?? {};
541
- const boundServices = serviceContext ? bindServicesToContext(services, serviceContext) : services;
542
- const routes = resolveRouteFactories({
543
- config,
544
- deps,
545
- services: boundServices,
546
- serviceDeps: serviceImplementations ?? {}
547
- }, routesOrFactories);
548
- const linkedRoutes = collectLinkedFragmentRoutes(linkedFragmentInstances);
549
- const finalRoutes = linkedRoutes.length > 0 ? [...routes, ...linkedRoutes] : routes;
550
- const mountRoute = getMountRoute({
551
- name: definition.name,
552
- mountRoute: options.mountRoute
553
- });
554
- const createRequestStorageWithContext = definition.createRequestStorage ? () => definition.createRequestStorage({
555
- config,
556
- options,
557
- deps
558
- }) : void 0;
559
- return new FragnoInstantiatedFragment({
560
- name: definition.name,
561
- routes: finalRoutes,
562
- deps,
563
- services: boundServices,
564
- mountRoute,
565
- serviceThisContext: serviceContext,
566
- handlerThisContext: handlerContext,
567
- storage,
568
- createRequestStorage: createRequestStorageWithContext,
569
- options,
570
- linkedFragments: linkedFragmentInstances,
571
- internalData
572
- });
573
- }
574
- /**
575
- * Fluent builder for instantiating fragments.
576
- * Provides a type-safe API for configuring and building fragment instances.
577
- */
578
- var FragmentInstantiationBuilder = class FragmentInstantiationBuilder$1 {
579
- #definition;
580
- #config;
581
- #routes;
582
- #options;
583
- #services;
584
- constructor(definition, routes) {
585
- this.#definition = definition;
586
- this.#routes = routes;
587
- }
588
- /**
589
- * Get the fragment definition
590
- */
591
- get definition() {
592
- return this.#definition;
593
- }
594
- /**
595
- * Get the configured routes
596
- */
597
- get routes() {
598
- return this.#routes ?? [];
599
- }
600
- /**
601
- * Get the configuration
602
- */
603
- get config() {
604
- return this.#config;
605
- }
606
- /**
607
- * Get the options
608
- */
609
- get options() {
610
- return this.#options;
611
- }
612
- /**
613
- * Set the configuration for the fragment
614
- */
615
- withConfig(config) {
616
- this.#config = config;
617
- return this;
618
- }
619
- /**
620
- * Set the routes for the fragment
621
- */
622
- withRoutes(routes) {
623
- const newBuilder = new FragmentInstantiationBuilder$1(this.#definition, routes);
624
- newBuilder.#config = this.#config;
625
- newBuilder.#options = this.#options;
626
- newBuilder.#services = this.#services;
627
- return newBuilder;
628
- }
629
- /**
630
- * Set the options for the fragment (e.g., mountRoute, databaseAdapter)
631
- */
632
- withOptions(options) {
633
- this.#options = options;
634
- return this;
635
- }
636
- /**
637
- * Provide implementations for services that this fragment uses
638
- */
639
- withServices(services) {
640
- this.#services = services;
641
- return this;
642
- }
643
- /**
644
- * Build and return the instantiated fragment
645
- */
646
- build() {
647
- const dryRun = process.env["FRAGNO_INIT_DRY_RUN"] === "true";
648
- return instantiateFragment(this.#definition, this.#config ?? {}, this.#routes ?? [], this.#options ?? {}, this.#services, { dryRun });
649
- }
650
- };
651
- /**
652
- * Create a fluent builder for instantiating a fragment.
653
- *
654
- * @example
655
- * ```ts
656
- * const fragment = instantiate(myFragmentDefinition)
657
- * .withConfig({ apiKey: "key" })
658
- * .withRoutes([route1, route2])
659
- * .withOptions({ mountRoute: "/api" })
660
- * .build();
661
- * ```
662
- */
663
- function instantiate(definition) {
664
- return new FragmentInstantiationBuilder(definition);
665
- }
666
-
667
- //#endregion
668
- export { instantiate };
669
- //# sourceMappingURL=fragment-instantiator.js.map