@fragno-dev/db 0.1.14 → 0.2.0

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 (445) hide show
  1. package/.turbo/turbo-build.log +242 -139
  2. package/CHANGELOG.md +47 -0
  3. package/README.md +123 -8
  4. package/dist/adapters/adapters.d.ts +19 -5
  5. package/dist/adapters/adapters.d.ts.map +1 -1
  6. package/dist/adapters/adapters.js.map +1 -1
  7. package/dist/adapters/drizzle/drizzle-adapter.d.ts +6 -19
  8. package/dist/adapters/drizzle/drizzle-adapter.d.ts.map +1 -1
  9. package/dist/adapters/drizzle/drizzle-adapter.js +7 -47
  10. package/dist/adapters/drizzle/drizzle-adapter.js.map +1 -1
  11. package/dist/adapters/drizzle/generate.d.ts +7 -1
  12. package/dist/adapters/drizzle/generate.d.ts.map +1 -1
  13. package/dist/adapters/drizzle/generate.js +46 -45
  14. package/dist/adapters/drizzle/generate.js.map +1 -1
  15. package/dist/adapters/generic-sql/driver-config.d.ts +74 -0
  16. package/dist/adapters/generic-sql/driver-config.d.ts.map +1 -0
  17. package/dist/adapters/generic-sql/driver-config.js +94 -0
  18. package/dist/adapters/generic-sql/driver-config.js.map +1 -0
  19. package/dist/adapters/generic-sql/generic-sql-adapter.d.ts +43 -0
  20. package/dist/adapters/generic-sql/generic-sql-adapter.d.ts.map +1 -0
  21. package/dist/adapters/generic-sql/generic-sql-adapter.js +87 -0
  22. package/dist/adapters/generic-sql/generic-sql-adapter.js.map +1 -0
  23. package/dist/adapters/generic-sql/generic-sql-uow-executor.js +67 -0
  24. package/dist/adapters/generic-sql/generic-sql-uow-executor.js.map +1 -0
  25. package/dist/adapters/generic-sql/migration/cold-kysely.js +33 -0
  26. package/dist/adapters/generic-sql/migration/cold-kysely.js.map +1 -0
  27. package/dist/adapters/generic-sql/migration/dialect/mysql.js +60 -0
  28. package/dist/adapters/generic-sql/migration/dialect/mysql.js.map +1 -0
  29. package/dist/adapters/generic-sql/migration/dialect/postgres.js +59 -0
  30. package/dist/adapters/generic-sql/migration/dialect/postgres.js.map +1 -0
  31. package/dist/adapters/generic-sql/migration/dialect/sqlite.js +96 -0
  32. package/dist/adapters/generic-sql/migration/dialect/sqlite.js.map +1 -0
  33. package/dist/adapters/generic-sql/migration/executor.d.ts +15 -0
  34. package/dist/adapters/generic-sql/migration/executor.d.ts.map +1 -0
  35. package/dist/adapters/generic-sql/migration/executor.js +18 -0
  36. package/dist/adapters/generic-sql/migration/executor.js.map +1 -0
  37. package/dist/adapters/generic-sql/migration/prepared-migrations.d.ts +66 -0
  38. package/dist/adapters/generic-sql/migration/prepared-migrations.d.ts.map +1 -0
  39. package/dist/adapters/generic-sql/migration/prepared-migrations.js +68 -0
  40. package/dist/adapters/generic-sql/migration/prepared-migrations.js.map +1 -0
  41. package/dist/adapters/generic-sql/migration/sql-generator.js +212 -0
  42. package/dist/adapters/generic-sql/migration/sql-generator.js.map +1 -0
  43. package/dist/adapters/generic-sql/query/create-sql-query-compiler.js +32 -0
  44. package/dist/adapters/generic-sql/query/create-sql-query-compiler.js.map +1 -0
  45. package/dist/adapters/generic-sql/query/cursor-utils.js +37 -0
  46. package/dist/adapters/generic-sql/query/cursor-utils.js.map +1 -0
  47. package/dist/adapters/generic-sql/query/dialect/mysql.js +33 -0
  48. package/dist/adapters/generic-sql/query/dialect/mysql.js.map +1 -0
  49. package/dist/adapters/generic-sql/query/dialect/postgres.js +32 -0
  50. package/dist/adapters/generic-sql/query/dialect/postgres.js.map +1 -0
  51. package/dist/adapters/generic-sql/query/dialect/sqlite.js +32 -0
  52. package/dist/adapters/generic-sql/query/dialect/sqlite.js.map +1 -0
  53. package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js +152 -0
  54. package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js.map +1 -0
  55. package/dist/adapters/generic-sql/query/select-builder.js +69 -0
  56. package/dist/adapters/generic-sql/query/select-builder.js.map +1 -0
  57. package/dist/adapters/generic-sql/query/sql-query-compiler.js +145 -0
  58. package/dist/adapters/generic-sql/query/sql-query-compiler.js.map +1 -0
  59. package/dist/adapters/generic-sql/query/where-builder.js +129 -0
  60. package/dist/adapters/generic-sql/query/where-builder.js.map +1 -0
  61. package/dist/adapters/generic-sql/result-interpreter.js +74 -0
  62. package/dist/adapters/generic-sql/result-interpreter.js.map +1 -0
  63. package/dist/adapters/generic-sql/uow-decoder.js +105 -0
  64. package/dist/adapters/generic-sql/uow-decoder.js.map +1 -0
  65. package/dist/adapters/generic-sql/uow-encoder.js +93 -0
  66. package/dist/adapters/generic-sql/uow-encoder.js.map +1 -0
  67. package/dist/adapters/kysely/kysely-adapter.d.ts +5 -16
  68. package/dist/adapters/kysely/kysely-adapter.d.ts.map +1 -1
  69. package/dist/adapters/kysely/kysely-adapter.js +6 -159
  70. package/dist/adapters/kysely/kysely-adapter.js.map +1 -1
  71. package/dist/adapters/{drizzle/drizzle-query.js → shared/from-unit-of-work-compiler.js} +48 -62
  72. package/dist/adapters/shared/from-unit-of-work-compiler.js.map +1 -0
  73. package/dist/adapters/{kysely/kysely-shared.d.ts → shared/table-name-mapper.d.ts} +3 -2
  74. package/dist/adapters/shared/table-name-mapper.d.ts.map +1 -0
  75. package/dist/adapters/shared/table-name-mapper.js +43 -0
  76. package/dist/adapters/shared/table-name-mapper.js.map +1 -0
  77. package/dist/adapters/shared/uow-operation-compiler.js +105 -0
  78. package/dist/adapters/shared/uow-operation-compiler.js.map +1 -0
  79. package/dist/db-fragment-definition-builder.d.ts +186 -0
  80. package/dist/db-fragment-definition-builder.d.ts.map +1 -0
  81. package/dist/db-fragment-definition-builder.js +207 -0
  82. package/dist/db-fragment-definition-builder.js.map +1 -0
  83. package/dist/fragments/internal-fragment.d.ts +53 -0
  84. package/dist/fragments/internal-fragment.d.ts.map +1 -0
  85. package/dist/fragments/internal-fragment.js +111 -0
  86. package/dist/fragments/internal-fragment.js.map +1 -0
  87. package/dist/hooks/hooks.d.ts +51 -0
  88. package/dist/hooks/hooks.d.ts.map +1 -0
  89. package/dist/hooks/hooks.js +88 -0
  90. package/dist/hooks/hooks.js.map +1 -0
  91. package/dist/migration-engine/generation-engine.d.ts +0 -2
  92. package/dist/migration-engine/generation-engine.d.ts.map +1 -1
  93. package/dist/migration-engine/generation-engine.js +38 -56
  94. package/dist/migration-engine/generation-engine.js.map +1 -1
  95. package/dist/mod.d.ts +35 -23
  96. package/dist/mod.d.ts.map +1 -1
  97. package/dist/mod.js +48 -45
  98. package/dist/mod.js.map +1 -1
  99. package/dist/node_modules/.pnpm/rou3@0.7.10/node_modules/rou3/dist/index.js +165 -0
  100. package/dist/node_modules/.pnpm/rou3@0.7.10/node_modules/rou3/dist/index.js.map +1 -0
  101. package/dist/packages/fragno/dist/api/bind-services.js +20 -0
  102. package/dist/packages/fragno/dist/api/bind-services.js.map +1 -0
  103. package/dist/packages/fragno/dist/api/error.js +48 -0
  104. package/dist/packages/fragno/dist/api/error.js.map +1 -0
  105. package/dist/packages/fragno/dist/api/fragment-definition-builder.js +320 -0
  106. package/dist/packages/fragno/dist/api/fragment-definition-builder.js.map +1 -0
  107. package/dist/packages/fragno/dist/api/fragment-instantiator.js +525 -0
  108. package/dist/packages/fragno/dist/api/fragment-instantiator.js.map +1 -0
  109. package/dist/packages/fragno/dist/api/fragno-response.js +73 -0
  110. package/dist/packages/fragno/dist/api/fragno-response.js.map +1 -0
  111. package/dist/packages/fragno/dist/api/internal/response-stream.js +81 -0
  112. package/dist/packages/fragno/dist/api/internal/response-stream.js.map +1 -0
  113. package/dist/packages/fragno/dist/api/internal/route.js +10 -0
  114. package/dist/packages/fragno/dist/api/internal/route.js.map +1 -0
  115. package/dist/packages/fragno/dist/api/mutable-request-state.js +97 -0
  116. package/dist/packages/fragno/dist/api/mutable-request-state.js.map +1 -0
  117. package/dist/packages/fragno/dist/api/request-context-storage.js +43 -0
  118. package/dist/packages/fragno/dist/api/request-context-storage.js.map +1 -0
  119. package/dist/packages/fragno/dist/api/request-input-context.js +118 -0
  120. package/dist/packages/fragno/dist/api/request-input-context.js.map +1 -0
  121. package/dist/packages/fragno/dist/api/request-middleware.js +83 -0
  122. package/dist/packages/fragno/dist/api/request-middleware.js.map +1 -0
  123. package/dist/packages/fragno/dist/api/request-output-context.js +119 -0
  124. package/dist/packages/fragno/dist/api/request-output-context.js.map +1 -0
  125. package/dist/packages/fragno/dist/api/route.js +17 -0
  126. package/dist/packages/fragno/dist/api/route.js.map +1 -0
  127. package/dist/packages/fragno/dist/internal/symbols.js +10 -0
  128. package/dist/packages/fragno/dist/internal/symbols.js.map +1 -0
  129. package/dist/query/column-defaults.js +27 -0
  130. package/dist/query/column-defaults.js.map +1 -0
  131. package/dist/query/cursor.d.ts +14 -6
  132. package/dist/query/cursor.d.ts.map +1 -1
  133. package/dist/query/cursor.js +16 -7
  134. package/dist/query/cursor.js.map +1 -1
  135. package/dist/query/orm/orm.d.ts +1 -1
  136. package/dist/query/orm/orm.js.map +1 -1
  137. package/dist/query/serialize/create-sql-serializer.js +30 -0
  138. package/dist/query/serialize/create-sql-serializer.js.map +1 -0
  139. package/dist/query/serialize/dialect/mysql-serializer.js +87 -0
  140. package/dist/query/serialize/dialect/mysql-serializer.js.map +1 -0
  141. package/dist/query/serialize/dialect/postgres-serializer.js +80 -0
  142. package/dist/query/serialize/dialect/postgres-serializer.js.map +1 -0
  143. package/dist/query/serialize/dialect/sqlite-serializer.js +93 -0
  144. package/dist/query/serialize/dialect/sqlite-serializer.js.map +1 -0
  145. package/dist/query/serialize/sql-serializer.js +67 -0
  146. package/dist/query/serialize/sql-serializer.js.map +1 -0
  147. package/dist/query/{query.d.ts → simple-query-interface.d.ts} +6 -6
  148. package/dist/query/simple-query-interface.d.ts.map +1 -0
  149. package/dist/query/unit-of-work/execute-unit-of-work.d.ts +133 -0
  150. package/dist/query/unit-of-work/execute-unit-of-work.d.ts.map +1 -0
  151. package/dist/query/unit-of-work/execute-unit-of-work.js +197 -0
  152. package/dist/query/unit-of-work/execute-unit-of-work.js.map +1 -0
  153. package/dist/query/unit-of-work/retry-policy.d.ts +88 -0
  154. package/dist/query/unit-of-work/retry-policy.d.ts.map +1 -0
  155. package/dist/query/unit-of-work/retry-policy.js +61 -0
  156. package/dist/query/unit-of-work/retry-policy.js.map +1 -0
  157. package/dist/query/{unit-of-work.d.ts → unit-of-work/unit-of-work.d.ts} +145 -58
  158. package/dist/query/unit-of-work/unit-of-work.d.ts.map +1 -0
  159. package/dist/query/{unit-of-work.js → unit-of-work/unit-of-work.js} +435 -198
  160. package/dist/query/unit-of-work/unit-of-work.js.map +1 -0
  161. package/dist/query/value-decoding.js +71 -0
  162. package/dist/query/value-decoding.js.map +1 -0
  163. package/dist/query/value-encoding.js +124 -0
  164. package/dist/query/value-encoding.js.map +1 -0
  165. package/dist/schema/create.d.ts +3 -0
  166. package/dist/schema/create.d.ts.map +1 -1
  167. package/dist/schema/create.js +4 -0
  168. package/dist/schema/create.js.map +1 -1
  169. package/dist/schema/type-conversion/create-sql-type-mapper.js +29 -0
  170. package/dist/schema/type-conversion/create-sql-type-mapper.js.map +1 -0
  171. package/dist/schema/type-conversion/dialect/mysql.js +57 -0
  172. package/dist/schema/type-conversion/dialect/mysql.js.map +1 -0
  173. package/dist/schema/type-conversion/dialect/postgres.js +56 -0
  174. package/dist/schema/type-conversion/dialect/postgres.js.map +1 -0
  175. package/dist/schema/type-conversion/dialect/sqlite.js +52 -0
  176. package/dist/schema/type-conversion/dialect/sqlite.js.map +1 -0
  177. package/dist/schema/type-conversion/type-mapping.js +63 -0
  178. package/dist/schema/type-conversion/type-mapping.js.map +1 -0
  179. package/dist/sql-driver/connection/connection-provider.d.ts +13 -0
  180. package/dist/sql-driver/connection/connection-provider.d.ts.map +1 -0
  181. package/dist/sql-driver/connection/connection-provider.js +19 -0
  182. package/dist/sql-driver/connection/connection-provider.js.map +1 -0
  183. package/dist/sql-driver/connection/single-connection-provider.js +23 -0
  184. package/dist/sql-driver/connection/single-connection-provider.js.map +1 -0
  185. package/dist/sql-driver/dialect-adapter/dialect-adapter.d.ts +7 -0
  186. package/dist/sql-driver/dialect-adapter/dialect-adapter.d.ts.map +1 -0
  187. package/dist/sql-driver/dialects/dialects.d.ts +2 -0
  188. package/dist/sql-driver/dialects/dialects.js +3 -0
  189. package/dist/sql-driver/dialects/durable-object-dialect.d.ts +72 -0
  190. package/dist/sql-driver/dialects/durable-object-dialect.d.ts.map +1 -0
  191. package/dist/sql-driver/dialects/durable-object-dialect.js +130 -0
  192. package/dist/sql-driver/dialects/durable-object-dialect.js.map +1 -0
  193. package/dist/sql-driver/driver/runtime-driver.d.ts +23 -0
  194. package/dist/sql-driver/driver/runtime-driver.d.ts.map +1 -0
  195. package/dist/sql-driver/driver/runtime-driver.js +56 -0
  196. package/dist/sql-driver/driver/runtime-driver.js.map +1 -0
  197. package/dist/sql-driver/query-executor/default-query-executor.js +26 -0
  198. package/dist/sql-driver/query-executor/default-query-executor.js.map +1 -0
  199. package/dist/sql-driver/query-executor/plugin.d.ts +17 -0
  200. package/dist/sql-driver/query-executor/plugin.d.ts.map +1 -0
  201. package/dist/sql-driver/query-executor/query-executor-base.js +25 -0
  202. package/dist/sql-driver/query-executor/query-executor-base.js.map +1 -0
  203. package/dist/sql-driver/query-executor/query-executor.d.ts +36 -0
  204. package/dist/sql-driver/query-executor/query-executor.d.ts.map +1 -0
  205. package/dist/sql-driver/sql-driver-adapter.d.ts +29 -0
  206. package/dist/sql-driver/sql-driver-adapter.d.ts.map +1 -0
  207. package/dist/sql-driver/sql-driver-adapter.js +68 -0
  208. package/dist/sql-driver/sql-driver-adapter.js.map +1 -0
  209. package/dist/sql-driver/sql-driver.d.ts +38 -0
  210. package/dist/sql-driver/sql-driver.d.ts.map +1 -0
  211. package/dist/sql-driver/sql-driver.js +1 -0
  212. package/dist/sql-driver/sql.js +50 -0
  213. package/dist/sql-driver/sql.js.map +1 -0
  214. package/dist/with-database.d.ts +32 -0
  215. package/dist/with-database.d.ts.map +1 -0
  216. package/dist/with-database.js +34 -0
  217. package/dist/with-database.js.map +1 -0
  218. package/package.json +43 -9
  219. package/src/adapters/adapters.ts +23 -4
  220. package/src/adapters/drizzle/drizzle-adapter-pglite.test.ts +140 -185
  221. package/src/adapters/drizzle/{drizzle-adapter-sqlite.test.ts → drizzle-adapter-sqlite3.test.ts} +187 -55
  222. package/src/adapters/drizzle/drizzle-adapter.ts +14 -93
  223. package/src/adapters/drizzle/generate.test.ts +102 -269
  224. package/src/adapters/drizzle/generate.ts +89 -63
  225. package/src/adapters/drizzle/migrate-drizzle.test.ts +19 -0
  226. package/src/adapters/drizzle/shared.ts +0 -34
  227. package/src/adapters/drizzle/test-utils.ts +36 -5
  228. package/src/adapters/generic-sql/README.md +14 -0
  229. package/src/adapters/generic-sql/driver-config.ts +144 -0
  230. package/src/adapters/generic-sql/generic-sql-adapter.test.ts +50 -0
  231. package/src/adapters/generic-sql/generic-sql-adapter.ts +146 -0
  232. package/src/adapters/generic-sql/generic-sql-uow-executor.ts +130 -0
  233. package/src/adapters/generic-sql/migration/cold-kysely.ts +55 -0
  234. package/src/adapters/{kysely/migration/execute-mysql.test.ts → generic-sql/migration/dialect/mysql.test.ts} +342 -484
  235. package/src/adapters/generic-sql/migration/dialect/mysql.ts +104 -0
  236. package/src/adapters/generic-sql/migration/dialect/postgres.test.ts +1008 -0
  237. package/src/adapters/generic-sql/migration/dialect/postgres.ts +113 -0
  238. package/src/adapters/{kysely/migration/execute-sqlite.test.ts → generic-sql/migration/dialect/sqlite.test.ts} +307 -510
  239. package/src/adapters/generic-sql/migration/dialect/sqlite.ts +189 -0
  240. package/src/adapters/generic-sql/migration/executor.ts +33 -0
  241. package/src/adapters/generic-sql/migration/prepared-migrations.test.ts +661 -0
  242. package/src/adapters/generic-sql/migration/prepared-migrations.ts +214 -0
  243. package/src/adapters/generic-sql/migration/sql-generator.ts +413 -0
  244. package/src/adapters/generic-sql/query/create-sql-query-compiler.ts +36 -0
  245. package/src/adapters/generic-sql/query/cursor-utils.ts +56 -0
  246. package/src/adapters/generic-sql/query/dialect/mysql.ts +34 -0
  247. package/src/adapters/generic-sql/query/dialect/postgres.ts +32 -0
  248. package/src/adapters/generic-sql/query/dialect/sqlite.ts +32 -0
  249. package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.test.ts +1568 -0
  250. package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.ts +314 -0
  251. package/src/adapters/generic-sql/query/select-builder.test.ts +256 -0
  252. package/src/adapters/generic-sql/query/select-builder.ts +137 -0
  253. package/src/adapters/generic-sql/query/sql-query-compiler.test.ts +195 -0
  254. package/src/adapters/generic-sql/query/sql-query-compiler.ts +367 -0
  255. package/src/adapters/generic-sql/query/where-builder.test.ts +744 -0
  256. package/src/adapters/generic-sql/query/where-builder.ts +211 -0
  257. package/src/adapters/generic-sql/result-interpreter.ts +102 -0
  258. package/src/adapters/generic-sql/test/generic-drizzle-adapter-sqlite3.test.ts +899 -0
  259. package/src/adapters/generic-sql/uow-decoder.test.ts +399 -0
  260. package/src/adapters/generic-sql/uow-decoder.ts +152 -0
  261. package/src/adapters/generic-sql/uow-encoder.test.ts +183 -0
  262. package/src/adapters/generic-sql/uow-encoder.ts +131 -0
  263. package/src/adapters/kysely/kysely-adapter-pglite.test.ts +90 -96
  264. package/src/adapters/kysely/kysely-adapter-sqlocal.test.ts +215 -0
  265. package/src/adapters/kysely/kysely-adapter.ts +10 -242
  266. package/src/adapters/{drizzle/drizzle-query.ts → shared/from-unit-of-work-compiler.ts} +111 -106
  267. package/src/adapters/shared/table-name-mapper.ts +50 -0
  268. package/src/adapters/shared/uow-operation-compiler.ts +211 -0
  269. package/src/db-fragment-definition-builder.test.ts +887 -0
  270. package/src/db-fragment-definition-builder.ts +737 -0
  271. package/src/db-fragment-instantiator.test.ts +543 -0
  272. package/src/db-fragment-integration.test.ts +406 -0
  273. package/src/fragments/internal-fragment.test.ts +549 -0
  274. package/src/fragments/internal-fragment.ts +249 -0
  275. package/src/hooks/hooks.test.ts +575 -0
  276. package/src/hooks/hooks.ts +179 -0
  277. package/src/migration-engine/generation-engine.test.ts +60 -27
  278. package/src/migration-engine/generation-engine.ts +99 -92
  279. package/src/mod.ts +139 -78
  280. package/src/query/column-defaults.ts +49 -0
  281. package/src/query/cursor.test.ts +147 -3
  282. package/src/query/cursor.ts +25 -8
  283. package/src/query/orm/orm.ts +1 -1
  284. package/src/query/query-type.test.ts +9 -9
  285. package/src/query/serialize/create-sql-serializer.ts +34 -0
  286. package/src/query/serialize/dialect/mysql-serializer.ts +142 -0
  287. package/src/query/serialize/dialect/postgres-serializer.ts +129 -0
  288. package/src/query/serialize/dialect/sqlite-serializer.test.ts +251 -0
  289. package/src/query/serialize/dialect/sqlite-serializer.ts +156 -0
  290. package/src/query/serialize/sql-serializer.ts +143 -0
  291. package/src/query/{query.ts → simple-query-interface.ts} +4 -4
  292. package/src/query/unit-of-work/execute-unit-of-work.test.ts +1310 -0
  293. package/src/query/unit-of-work/execute-unit-of-work.ts +504 -0
  294. package/src/query/unit-of-work/retry-policy.test.ts +217 -0
  295. package/src/query/unit-of-work/retry-policy.ts +141 -0
  296. package/src/query/unit-of-work/unit-of-work-coordinator.test.ts +831 -0
  297. package/src/query/{unit-of-work-types.test.ts → unit-of-work/unit-of-work-types.test.ts} +7 -5
  298. package/src/query/unit-of-work/unit-of-work.test.ts +1716 -0
  299. package/src/query/{unit-of-work.ts → unit-of-work/unit-of-work.ts} +716 -420
  300. package/src/query/{result-transform.test.ts → value-decoding.test.ts} +45 -298
  301. package/src/query/value-decoding.ts +113 -0
  302. package/src/query/value-encoding.test.ts +390 -0
  303. package/src/query/value-encoding.ts +168 -0
  304. package/src/schema/create.test.ts +5 -1
  305. package/src/schema/create.ts +5 -0
  306. package/src/schema/serialize.test.ts +165 -407
  307. package/src/schema/type-conversion/create-sql-type-mapper.ts +28 -0
  308. package/src/schema/type-conversion/dialect/mysql.ts +64 -0
  309. package/src/schema/type-conversion/dialect/postgres.ts +62 -0
  310. package/src/schema/type-conversion/dialect/sqlite.ts +63 -0
  311. package/src/schema/type-conversion/type-mapping.test.ts +137 -0
  312. package/src/schema/type-conversion/type-mapping.ts +153 -0
  313. package/src/shared/connection-pool.ts +5 -5
  314. package/src/sql-driver/better-sqlite3.test.ts +126 -0
  315. package/src/sql-driver/connection/connection-provider.ts +27 -0
  316. package/src/sql-driver/connection/single-connection-provider.ts +42 -0
  317. package/src/sql-driver/dialect-adapter/dialect-adapter.ts +9 -0
  318. package/src/sql-driver/dialect-adapter/sqlite-dialect-adapter.ts +7 -0
  319. package/src/sql-driver/dialects/dialects.ts +1 -0
  320. package/src/sql-driver/dialects/durable-object-dialect.ts +260 -0
  321. package/src/sql-driver/driver/runtime-driver.ts +91 -0
  322. package/src/sql-driver/query-executor/default-query-executor.ts +38 -0
  323. package/src/sql-driver/query-executor/plugin.ts +22 -0
  324. package/src/sql-driver/query-executor/query-executor-base.ts +53 -0
  325. package/src/sql-driver/query-executor/query-executor.ts +44 -0
  326. package/src/sql-driver/sql-driver-adapter.ts +96 -0
  327. package/src/sql-driver/sql-driver.ts +53 -0
  328. package/src/sql-driver/sql.ts +57 -0
  329. package/src/sql-driver/sqlocal.test.ts +117 -0
  330. package/src/with-database.ts +152 -0
  331. package/tsdown.config.ts +8 -2
  332. package/dist/adapters/drizzle/drizzle-connection-pool.js +0 -40
  333. package/dist/adapters/drizzle/drizzle-connection-pool.js.map +0 -1
  334. package/dist/adapters/drizzle/drizzle-query.d.ts +0 -23
  335. package/dist/adapters/drizzle/drizzle-query.d.ts.map +0 -1
  336. package/dist/adapters/drizzle/drizzle-query.js.map +0 -1
  337. package/dist/adapters/drizzle/drizzle-uow-compiler.d.ts +0 -10
  338. package/dist/adapters/drizzle/drizzle-uow-compiler.d.ts.map +0 -1
  339. package/dist/adapters/drizzle/drizzle-uow-compiler.js +0 -315
  340. package/dist/adapters/drizzle/drizzle-uow-compiler.js.map +0 -1
  341. package/dist/adapters/drizzle/drizzle-uow-decoder.js +0 -116
  342. package/dist/adapters/drizzle/drizzle-uow-decoder.js.map +0 -1
  343. package/dist/adapters/drizzle/drizzle-uow-executor.js +0 -149
  344. package/dist/adapters/drizzle/drizzle-uow-executor.js.map +0 -1
  345. package/dist/adapters/drizzle/join-column-utils.js +0 -28
  346. package/dist/adapters/drizzle/join-column-utils.js.map +0 -1
  347. package/dist/adapters/drizzle/shared.d.ts +0 -14
  348. package/dist/adapters/drizzle/shared.d.ts.map +0 -1
  349. package/dist/adapters/drizzle/shared.js +0 -35
  350. package/dist/adapters/drizzle/shared.js.map +0 -1
  351. package/dist/adapters/kysely/kysely-connection-pool.js +0 -41
  352. package/dist/adapters/kysely/kysely-connection-pool.js.map +0 -1
  353. package/dist/adapters/kysely/kysely-query-builder.js +0 -321
  354. package/dist/adapters/kysely/kysely-query-builder.js.map +0 -1
  355. package/dist/adapters/kysely/kysely-query-compiler.js +0 -66
  356. package/dist/adapters/kysely/kysely-query-compiler.js.map +0 -1
  357. package/dist/adapters/kysely/kysely-query.d.ts +0 -22
  358. package/dist/adapters/kysely/kysely-query.d.ts.map +0 -1
  359. package/dist/adapters/kysely/kysely-query.js +0 -223
  360. package/dist/adapters/kysely/kysely-query.js.map +0 -1
  361. package/dist/adapters/kysely/kysely-shared.d.ts.map +0 -1
  362. package/dist/adapters/kysely/kysely-shared.js +0 -18
  363. package/dist/adapters/kysely/kysely-shared.js.map +0 -1
  364. package/dist/adapters/kysely/kysely-uow-compiler.js +0 -170
  365. package/dist/adapters/kysely/kysely-uow-compiler.js.map +0 -1
  366. package/dist/adapters/kysely/kysely-uow-executor.js +0 -89
  367. package/dist/adapters/kysely/kysely-uow-executor.js.map +0 -1
  368. package/dist/adapters/kysely/migration/execute-base.js +0 -128
  369. package/dist/adapters/kysely/migration/execute-base.js.map +0 -1
  370. package/dist/adapters/kysely/migration/execute-factory.js +0 -34
  371. package/dist/adapters/kysely/migration/execute-factory.js.map +0 -1
  372. package/dist/adapters/kysely/migration/execute-mssql.js +0 -112
  373. package/dist/adapters/kysely/migration/execute-mssql.js.map +0 -1
  374. package/dist/adapters/kysely/migration/execute-mysql.js +0 -93
  375. package/dist/adapters/kysely/migration/execute-mysql.js.map +0 -1
  376. package/dist/adapters/kysely/migration/execute-postgres.js +0 -104
  377. package/dist/adapters/kysely/migration/execute-postgres.js.map +0 -1
  378. package/dist/adapters/kysely/migration/execute-sqlite.js +0 -123
  379. package/dist/adapters/kysely/migration/execute-sqlite.js.map +0 -1
  380. package/dist/adapters/kysely/migration/execute.js +0 -34
  381. package/dist/adapters/kysely/migration/execute.js.map +0 -1
  382. package/dist/bind-services.d.ts +0 -7
  383. package/dist/bind-services.d.ts.map +0 -1
  384. package/dist/bind-services.js +0 -14
  385. package/dist/bind-services.js.map +0 -1
  386. package/dist/fragment.d.ts +0 -173
  387. package/dist/fragment.d.ts.map +0 -1
  388. package/dist/fragment.js +0 -191
  389. package/dist/fragment.js.map +0 -1
  390. package/dist/migration-engine/create.d.ts +0 -37
  391. package/dist/migration-engine/create.d.ts.map +0 -1
  392. package/dist/migration-engine/create.js +0 -58
  393. package/dist/migration-engine/create.js.map +0 -1
  394. package/dist/migration-engine/shared.d.ts +0 -112
  395. package/dist/migration-engine/shared.d.ts.map +0 -1
  396. package/dist/query/query.d.ts.map +0 -1
  397. package/dist/query/result-transform.js +0 -168
  398. package/dist/query/result-transform.js.map +0 -1
  399. package/dist/query/unit-of-work.d.ts.map +0 -1
  400. package/dist/query/unit-of-work.js.map +0 -1
  401. package/dist/schema/serialize.js +0 -106
  402. package/dist/schema/serialize.js.map +0 -1
  403. package/dist/shared/settings-schema.js +0 -36
  404. package/dist/shared/settings-schema.js.map +0 -1
  405. package/src/adapters/drizzle/drizzle-adapter.test.ts +0 -170
  406. package/src/adapters/drizzle/drizzle-connection-pool.ts +0 -66
  407. package/src/adapters/drizzle/drizzle-query.test.ts +0 -499
  408. package/src/adapters/drizzle/drizzle-uow-compiler.test.ts +0 -1383
  409. package/src/adapters/drizzle/drizzle-uow-compiler.ts +0 -636
  410. package/src/adapters/drizzle/drizzle-uow-decoder.ts +0 -218
  411. package/src/adapters/drizzle/drizzle-uow-executor.ts +0 -276
  412. package/src/adapters/drizzle/join-column-utils.test.ts +0 -79
  413. package/src/adapters/drizzle/join-column-utils.ts +0 -39
  414. package/src/adapters/kysely/kysely-connection-pool.ts +0 -70
  415. package/src/adapters/kysely/kysely-query-builder.test.ts +0 -1344
  416. package/src/adapters/kysely/kysely-query-builder.ts +0 -666
  417. package/src/adapters/kysely/kysely-query-compiler.ts +0 -132
  418. package/src/adapters/kysely/kysely-query.test.ts +0 -498
  419. package/src/adapters/kysely/kysely-query.ts +0 -390
  420. package/src/adapters/kysely/kysely-shared.ts +0 -23
  421. package/src/adapters/kysely/kysely-uow-compiler.test.ts +0 -998
  422. package/src/adapters/kysely/kysely-uow-compiler.ts +0 -318
  423. package/src/adapters/kysely/kysely-uow-executor.ts +0 -145
  424. package/src/adapters/kysely/kysely-uow-joins.test.ts +0 -811
  425. package/src/adapters/kysely/migration/execute-base.ts +0 -256
  426. package/src/adapters/kysely/migration/execute-factory.ts +0 -53
  427. package/src/adapters/kysely/migration/execute-mssql.ts +0 -250
  428. package/src/adapters/kysely/migration/execute-mysql.ts +0 -211
  429. package/src/adapters/kysely/migration/execute-postgres.test.ts +0 -2657
  430. package/src/adapters/kysely/migration/execute-postgres.ts +0 -234
  431. package/src/adapters/kysely/migration/execute-sqlite.ts +0 -247
  432. package/src/adapters/kysely/migration/execute.ts +0 -50
  433. package/src/adapters/kysely/migration/kysely-migrator.test.ts +0 -261
  434. package/src/bind-services.test.ts +0 -214
  435. package/src/bind-services.ts +0 -37
  436. package/src/db-fragment.test.ts +0 -800
  437. package/src/fragment.ts +0 -727
  438. package/src/query/result-transform.ts +0 -271
  439. package/src/query/unit-of-work-multi-schema.test.ts +0 -64
  440. package/src/query/unit-of-work.test.ts +0 -943
  441. package/src/schema/serialize.ts +0 -396
  442. package/src/shared/settings-schema.ts +0 -61
  443. package/src/uow-context-integration.test.ts +0 -102
  444. package/src/uow-context.test.ts +0 -182
  445. /package/dist/query/{query.js → simple-query-interface.js} +0 -0
@@ -0,0 +1,525 @@
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 { addRoute, createRouter, findRoute } from "../../../../node_modules/.pnpm/rou3@0.7.10/node_modules/rou3/dist/index.js";
13
+
14
+ //#region ../fragno/dist/api/fragment-instantiator.js
15
+ /**
16
+ * Instantiated fragment class with encapsulated state.
17
+ * Provides the same public API as the old FragnoInstantiatedFragment but with better encapsulation.
18
+ */
19
+ var FragnoInstantiatedFragment = class {
20
+ [instantiatedFragmentFakeSymbol] = instantiatedFragmentFakeSymbol;
21
+ #name;
22
+ #routes;
23
+ #deps;
24
+ #services;
25
+ #mountRoute;
26
+ #router;
27
+ #middlewareHandler;
28
+ #serviceThisContext;
29
+ #handlerThisContext;
30
+ #contextStorage;
31
+ #createRequestStorage;
32
+ #options;
33
+ #linkedFragments;
34
+ constructor(params) {
35
+ this.#name = params.name;
36
+ this.#routes = params.routes;
37
+ this.#deps = params.deps;
38
+ this.#services = params.services;
39
+ this.#mountRoute = params.mountRoute;
40
+ this.#serviceThisContext = params.serviceThisContext;
41
+ this.#handlerThisContext = params.handlerThisContext;
42
+ this.#contextStorage = params.storage;
43
+ this.#createRequestStorage = params.createRequestStorage;
44
+ this.#options = params.options;
45
+ this.#linkedFragments = params.linkedFragments ?? {};
46
+ this.#router = createRouter();
47
+ for (const routeConfig of this.#routes) addRoute(this.#router, routeConfig.method.toUpperCase(), routeConfig.path, routeConfig);
48
+ this.handler = this.handler.bind(this);
49
+ }
50
+ get name() {
51
+ return this.#name;
52
+ }
53
+ get routes() {
54
+ return this.#routes;
55
+ }
56
+ get services() {
57
+ return this.#services;
58
+ }
59
+ get mountRoute() {
60
+ return this.#mountRoute;
61
+ }
62
+ /**
63
+ * @internal
64
+ */
65
+ get $internal() {
66
+ return {
67
+ deps: this.#deps,
68
+ options: this.#options,
69
+ linkedFragments: this.#linkedFragments
70
+ };
71
+ }
72
+ /**
73
+ * Add middleware to this fragment.
74
+ * Middleware can inspect and modify requests before they reach handlers.
75
+ */
76
+ withMiddleware(handler) {
77
+ if (this.#middlewareHandler) throw new Error("Middleware already set");
78
+ this.#middlewareHandler = handler;
79
+ return this;
80
+ }
81
+ #withRequestStorage(callback) {
82
+ if (!this.#serviceThisContext && !this.#handlerThisContext) return callback();
83
+ const storageData = this.#createRequestStorage ? this.#createRequestStorage() : {};
84
+ return this.#contextStorage.run(storageData, callback);
85
+ }
86
+ inContext(callback) {
87
+ if (this.#handlerThisContext) {
88
+ const boundCallback = callback.bind(this.#handlerThisContext);
89
+ return this.#withRequestStorage(boundCallback);
90
+ }
91
+ return this.#withRequestStorage(callback);
92
+ }
93
+ /**
94
+ * Get framework-specific handlers for this fragment.
95
+ * Use this to integrate the fragment with different fullstack frameworks.
96
+ */
97
+ handlersFor(framework) {
98
+ const handler = this.handler.bind(this);
99
+ if (framework === "h3" || framework === "nuxt") throw new Error(`To get handlers for h3, use the 'fromWebHandler' utility function:
100
+ import { fromWebHandler } from "h3";
101
+ export default fromWebHandler(myFragment().handler);`);
102
+ return {
103
+ astro: { ALL: handler },
104
+ "react-router": {
105
+ loader: ({ request }) => handler(request),
106
+ action: ({ request }) => handler(request)
107
+ },
108
+ "next-js": {
109
+ GET: handler,
110
+ POST: handler,
111
+ PUT: handler,
112
+ DELETE: handler,
113
+ PATCH: handler,
114
+ HEAD: handler,
115
+ OPTIONS: handler
116
+ },
117
+ "svelte-kit": {
118
+ GET: handler,
119
+ POST: handler,
120
+ PUT: handler,
121
+ DELETE: handler,
122
+ PATCH: handler,
123
+ HEAD: handler,
124
+ OPTIONS: handler
125
+ },
126
+ "solid-start": {
127
+ GET: ({ request }) => handler(request),
128
+ POST: ({ request }) => handler(request),
129
+ PUT: ({ request }) => handler(request),
130
+ DELETE: ({ request }) => handler(request),
131
+ PATCH: ({ request }) => handler(request),
132
+ HEAD: ({ request }) => handler(request),
133
+ OPTIONS: ({ request }) => handler(request)
134
+ },
135
+ "tanstack-start": {
136
+ GET: ({ request }) => handler(request),
137
+ POST: ({ request }) => handler(request),
138
+ PUT: ({ request }) => handler(request),
139
+ DELETE: ({ request }) => handler(request),
140
+ PATCH: ({ request }) => handler(request),
141
+ HEAD: ({ request }) => handler(request),
142
+ OPTIONS: ({ request }) => handler(request)
143
+ }
144
+ }[framework];
145
+ }
146
+ /**
147
+ * Main request handler for this fragment.
148
+ * Handles routing, middleware, and error handling.
149
+ */
150
+ async handler(req) {
151
+ const url = new URL(req.url);
152
+ const pathname = url.pathname;
153
+ const matchRoute = pathname.startsWith(this.#mountRoute) ? pathname.slice(this.#mountRoute.length) : null;
154
+ if (matchRoute === null) return Response.json({
155
+ error: `Fragno: Route for '${this.#name}' not found. Is the fragment mounted on the right route? Expecting: '${this.#mountRoute}'.`,
156
+ code: "ROUTE_NOT_FOUND"
157
+ }, { status: 404 });
158
+ const route = findRoute(this.#router, req.method, matchRoute);
159
+ if (!route) return Response.json({
160
+ error: `Fragno: Route for '${this.#name}' not found`,
161
+ code: "ROUTE_NOT_FOUND"
162
+ }, { status: 404 });
163
+ let requestBody = void 0;
164
+ let rawBody = void 0;
165
+ if (req.body instanceof ReadableStream) {
166
+ rawBody = await req.clone().text();
167
+ if (rawBody) try {
168
+ requestBody = JSON.parse(rawBody);
169
+ } catch {
170
+ requestBody = void 0;
171
+ }
172
+ }
173
+ const requestState = new MutableRequestState({
174
+ pathParams: route.params ?? {},
175
+ searchParams: url.searchParams,
176
+ body: requestBody,
177
+ headers: new Headers(req.headers)
178
+ });
179
+ const executeRequest = async () => {
180
+ if (this.#middlewareHandler) {
181
+ const middlewareResult = await this.#executeMiddleware(req, route, requestState);
182
+ if (middlewareResult !== void 0) return middlewareResult;
183
+ }
184
+ return this.#executeHandler(req, route, requestState, rawBody);
185
+ };
186
+ return this.#withRequestStorage(executeRequest);
187
+ }
188
+ /**
189
+ * Call a route directly with typed inputs and outputs.
190
+ * Useful for testing and server-side route calls.
191
+ */
192
+ async callRoute(method, path, inputOptions) {
193
+ return parseFragnoResponse(await this.callRouteRaw(method, path, inputOptions));
194
+ }
195
+ /**
196
+ * Call a route directly and get the raw Response object.
197
+ * Useful for testing and server-side route calls.
198
+ */
199
+ async callRouteRaw(method, path, inputOptions) {
200
+ const route = this.#routes.find((r) => r.method === method && r.path === path);
201
+ if (!route) return Response.json({
202
+ error: `Route ${method} ${path} not found`,
203
+ code: "ROUTE_NOT_FOUND"
204
+ }, { status: 404 });
205
+ const { pathParams = {}, body, query, headers } = inputOptions || {};
206
+ const searchParams = query instanceof URLSearchParams ? query : query ? new URLSearchParams(query) : new URLSearchParams();
207
+ const requestHeaders = headers instanceof Headers ? headers : headers ? new Headers(headers) : new Headers();
208
+ const inputContext = new RequestInputContext({
209
+ path: route.path,
210
+ method: route.method,
211
+ pathParams,
212
+ searchParams,
213
+ headers: requestHeaders,
214
+ parsedBody: body,
215
+ inputSchema: route.inputSchema,
216
+ shouldValidateInput: true
217
+ });
218
+ const outputContext = new RequestOutputContext(route.outputSchema);
219
+ const executeHandler = async () => {
220
+ try {
221
+ const thisContext = this.#handlerThisContext ?? {};
222
+ return await route.handler.call(thisContext, inputContext, outputContext);
223
+ } catch (error) {
224
+ console.error("Error in callRoute handler", error);
225
+ if (error instanceof FragnoApiError) return error.toResponse();
226
+ return Response.json({
227
+ error: "Internal server error",
228
+ code: "INTERNAL_SERVER_ERROR"
229
+ }, { status: 500 });
230
+ }
231
+ };
232
+ return this.#withRequestStorage(executeHandler);
233
+ }
234
+ /**
235
+ * Execute middleware for a request.
236
+ * Returns undefined if middleware allows the request to continue to the handler.
237
+ */
238
+ async #executeMiddleware(req, route, requestState) {
239
+ if (!this.#middlewareHandler || !route) return;
240
+ const { path } = route.data;
241
+ const middlewareInputContext = new RequestMiddlewareInputContext(this.#routes, {
242
+ method: req.method,
243
+ path,
244
+ request: req,
245
+ state: requestState
246
+ });
247
+ const middlewareOutputContext = new RequestMiddlewareOutputContext(this.#deps, this.#services);
248
+ try {
249
+ const middlewareResult = await this.#middlewareHandler(middlewareInputContext, middlewareOutputContext);
250
+ if (middlewareResult !== void 0) return middlewareResult;
251
+ } catch (error) {
252
+ console.error("Error in middleware", error);
253
+ if (error instanceof FragnoApiError) return error.toResponse();
254
+ return Response.json({
255
+ error: "Internal server error",
256
+ code: "INTERNAL_SERVER_ERROR"
257
+ }, { status: 500 });
258
+ }
259
+ }
260
+ /**
261
+ * Execute a route handler with proper error handling.
262
+ */
263
+ async #executeHandler(req, route, requestState, rawBody) {
264
+ if (!route) return Response.json({
265
+ error: "Route not found",
266
+ code: "ROUTE_NOT_FOUND"
267
+ }, { status: 404 });
268
+ const { handler, inputSchema, outputSchema, path } = route.data;
269
+ const inputContext = await RequestInputContext.fromRequest({
270
+ request: req,
271
+ method: req.method,
272
+ path,
273
+ pathParams: route.params ?? {},
274
+ inputSchema,
275
+ state: requestState,
276
+ rawBody
277
+ });
278
+ const outputContext = new RequestOutputContext(outputSchema);
279
+ try {
280
+ const contextForHandler = this.#handlerThisContext ?? {};
281
+ return await handler.call(contextForHandler, inputContext, outputContext);
282
+ } catch (error) {
283
+ console.error("Error in handler", error);
284
+ if (error instanceof FragnoApiError) return error.toResponse();
285
+ return Response.json({
286
+ error: "Internal server error",
287
+ code: "INTERNAL_SERVER_ERROR"
288
+ }, { status: 500 });
289
+ }
290
+ }
291
+ };
292
+ /**
293
+ * Core instantiation function that creates a fragment instance from a definition.
294
+ * This function validates dependencies, calls all callbacks, and wires everything together.
295
+ */
296
+ function instantiateFragment(definition, config, routesOrFactories, options, serviceImplementations, instantiationOptions) {
297
+ const { dryRun = false } = instantiationOptions ?? {};
298
+ const serviceDependencies = definition.serviceDependencies;
299
+ if (serviceDependencies) for (const [serviceName, meta] of Object.entries(serviceDependencies)) {
300
+ const metadata = meta;
301
+ const implementation = serviceImplementations?.[serviceName];
302
+ if (metadata.required && !implementation) throw new Error(`Fragment '${definition.name}' requires service '${metadata.name}' but it was not provided`);
303
+ }
304
+ let deps;
305
+ try {
306
+ deps = definition.dependencies?.({
307
+ config,
308
+ options
309
+ }) ?? {};
310
+ } catch (error) {
311
+ if (dryRun) {
312
+ console.warn("Warning: Failed to initialize dependencies in dry run mode:", error instanceof Error ? error.message : String(error));
313
+ deps = {};
314
+ } else throw error;
315
+ }
316
+ const linkedFragmentInstances = {};
317
+ const linkedFragmentServices = {};
318
+ if (definition.linkedFragments) for (const [name, callback] of Object.entries(definition.linkedFragments)) {
319
+ const linkedFragment = callback({
320
+ config,
321
+ options,
322
+ serviceDependencies: serviceImplementations
323
+ });
324
+ linkedFragmentInstances[name] = linkedFragment;
325
+ const services$1 = linkedFragment.services;
326
+ for (const [serviceName, service] of Object.entries(services$1)) linkedFragmentServices[serviceName] = service;
327
+ }
328
+ const defineService = (services$1) => services$1;
329
+ const privateServices = { ...linkedFragmentServices };
330
+ if (definition.privateServices) for (const [serviceName, factory] of Object.entries(definition.privateServices)) {
331
+ const serviceFactory = factory;
332
+ try {
333
+ privateServices[serviceName] = serviceFactory({
334
+ config,
335
+ options,
336
+ deps,
337
+ serviceDeps: serviceImplementations ?? {},
338
+ privateServices,
339
+ defineService
340
+ });
341
+ } catch (error) {
342
+ if (dryRun) {
343
+ console.warn(`Warning: Failed to initialize private service '${serviceName}' in dry run mode:`, error instanceof Error ? error.message : String(error));
344
+ privateServices[serviceName] = {};
345
+ } else throw error;
346
+ }
347
+ }
348
+ let baseServices;
349
+ try {
350
+ baseServices = definition.baseServices?.({
351
+ config,
352
+ options,
353
+ deps,
354
+ serviceDeps: serviceImplementations ?? {},
355
+ privateServices,
356
+ defineService
357
+ }) ?? {};
358
+ } catch (error) {
359
+ if (dryRun) {
360
+ console.warn("Warning: Failed to initialize base services in dry run mode:", error instanceof Error ? error.message : String(error));
361
+ baseServices = {};
362
+ } else throw error;
363
+ }
364
+ const namedServices = {};
365
+ if (definition.namedServices) for (const [serviceName, factory] of Object.entries(definition.namedServices)) {
366
+ const serviceFactory = factory;
367
+ try {
368
+ namedServices[serviceName] = serviceFactory({
369
+ config,
370
+ options,
371
+ deps,
372
+ serviceDeps: serviceImplementations ?? {},
373
+ privateServices,
374
+ defineService
375
+ });
376
+ } catch (error) {
377
+ if (dryRun) {
378
+ console.warn(`Warning: Failed to initialize service '${serviceName}' in dry run mode:`, error instanceof Error ? error.message : String(error));
379
+ namedServices[serviceName] = {};
380
+ } else throw error;
381
+ }
382
+ }
383
+ const services = {
384
+ ...baseServices,
385
+ ...namedServices
386
+ };
387
+ const storage = definition.getExternalStorage ? definition.getExternalStorage({
388
+ config,
389
+ options,
390
+ deps
391
+ }) : new RequestContextStorage();
392
+ const contexts = definition.createThisContext?.({
393
+ config,
394
+ options,
395
+ deps,
396
+ storage
397
+ });
398
+ const serviceContext = contexts?.serviceContext;
399
+ const handlerContext = contexts?.handlerContext;
400
+ const boundServices = serviceContext ? bindServicesToContext(services, serviceContext) : services;
401
+ const routes = resolveRouteFactories({
402
+ config,
403
+ deps,
404
+ services: boundServices,
405
+ serviceDeps: serviceImplementations ?? {}
406
+ }, routesOrFactories);
407
+ const mountRoute = getMountRoute({
408
+ name: definition.name,
409
+ mountRoute: options.mountRoute
410
+ });
411
+ const createRequestStorageWithContext = definition.createRequestStorage ? () => definition.createRequestStorage({
412
+ config,
413
+ options,
414
+ deps
415
+ }) : void 0;
416
+ return new FragnoInstantiatedFragment({
417
+ name: definition.name,
418
+ routes,
419
+ deps,
420
+ services: boundServices,
421
+ mountRoute,
422
+ serviceThisContext: serviceContext,
423
+ handlerThisContext: handlerContext,
424
+ storage,
425
+ createRequestStorage: createRequestStorageWithContext,
426
+ options,
427
+ linkedFragments: linkedFragmentInstances
428
+ });
429
+ }
430
+ /**
431
+ * Fluent builder for instantiating fragments.
432
+ * Provides a type-safe API for configuring and building fragment instances.
433
+ */
434
+ var FragmentInstantiationBuilder = class FragmentInstantiationBuilder$1 {
435
+ #definition;
436
+ #config;
437
+ #routes;
438
+ #options;
439
+ #services;
440
+ constructor(definition, routes) {
441
+ this.#definition = definition;
442
+ this.#routes = routes;
443
+ }
444
+ /**
445
+ * Get the fragment definition
446
+ */
447
+ get definition() {
448
+ return this.#definition;
449
+ }
450
+ /**
451
+ * Get the configured routes
452
+ */
453
+ get routes() {
454
+ return this.#routes ?? [];
455
+ }
456
+ /**
457
+ * Get the configuration
458
+ */
459
+ get config() {
460
+ return this.#config;
461
+ }
462
+ /**
463
+ * Get the options
464
+ */
465
+ get options() {
466
+ return this.#options;
467
+ }
468
+ /**
469
+ * Set the configuration for the fragment
470
+ */
471
+ withConfig(config) {
472
+ this.#config = config;
473
+ return this;
474
+ }
475
+ /**
476
+ * Set the routes for the fragment
477
+ */
478
+ withRoutes(routes) {
479
+ const newBuilder = new FragmentInstantiationBuilder$1(this.#definition, routes);
480
+ newBuilder.#config = this.#config;
481
+ newBuilder.#options = this.#options;
482
+ newBuilder.#services = this.#services;
483
+ return newBuilder;
484
+ }
485
+ /**
486
+ * Set the options for the fragment (e.g., mountRoute, databaseAdapter)
487
+ */
488
+ withOptions(options) {
489
+ this.#options = options;
490
+ return this;
491
+ }
492
+ /**
493
+ * Provide implementations for services that this fragment uses
494
+ */
495
+ withServices(services) {
496
+ this.#services = services;
497
+ return this;
498
+ }
499
+ /**
500
+ * Build and return the instantiated fragment
501
+ */
502
+ build() {
503
+ const dryRun = process.env["FRAGNO_INIT_DRY_RUN"] === "true";
504
+ return instantiateFragment(this.#definition, this.#config ?? {}, this.#routes ?? [], this.#options ?? {}, this.#services, { dryRun });
505
+ }
506
+ };
507
+ /**
508
+ * Create a fluent builder for instantiating a fragment.
509
+ *
510
+ * @example
511
+ * ```ts
512
+ * const fragment = instantiate(myFragmentDefinition)
513
+ * .withConfig({ apiKey: "key" })
514
+ * .withRoutes([route1, route2])
515
+ * .withOptions({ mountRoute: "/api" })
516
+ * .build();
517
+ * ```
518
+ */
519
+ function instantiate(definition) {
520
+ return new FragmentInstantiationBuilder(definition);
521
+ }
522
+
523
+ //#endregion
524
+ export { instantiate };
525
+ //# sourceMappingURL=fragment-instantiator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fragment-instantiator.js","names":["#name","#routes","#deps","#services","#mountRoute","#serviceThisContext","#handlerThisContext","#contextStorage","#createRequestStorage","#options","#linkedFragments","#router","#middlewareHandler","#withRequestStorage","#executeMiddleware","#executeHandler","FragmentInstantiationBuilder","#definition","#config"],"sources":["../../../../../../fragno/dist/api/fragment-instantiator.js"],"sourcesContent":["import { instantiatedFragmentFakeSymbol } from \"../internal/symbols.js\";\nimport { resolveRouteFactories } from \"./route.js\";\nimport { FragnoApiError } from \"./error.js\";\nimport { getMountRoute } from \"./internal/route.js\";\nimport { RequestInputContext } from \"./request-input-context.js\";\nimport { RequestOutputContext } from \"./request-output-context.js\";\nimport { MutableRequestState } from \"./mutable-request-state.js\";\nimport { RequestMiddlewareInputContext, RequestMiddlewareOutputContext } from \"./request-middleware.js\";\nimport { parseFragnoResponse } from \"./fragno-response.js\";\nimport { RequestContextStorage } from \"./request-context-storage.js\";\nimport { bindServicesToContext } from \"./bind-services.js\";\nimport { addRoute, createRouter, findRoute } from \"rou3\";\n\n//#region src/api/fragment-instantiator.ts\n/**\n* Instantiated fragment class with encapsulated state.\n* Provides the same public API as the old FragnoInstantiatedFragment but with better encapsulation.\n*/\nvar FragnoInstantiatedFragment = class {\n\t[instantiatedFragmentFakeSymbol] = instantiatedFragmentFakeSymbol;\n\t#name;\n\t#routes;\n\t#deps;\n\t#services;\n\t#mountRoute;\n\t#router;\n\t#middlewareHandler;\n\t#serviceThisContext;\n\t#handlerThisContext;\n\t#contextStorage;\n\t#createRequestStorage;\n\t#options;\n\t#linkedFragments;\n\tconstructor(params) {\n\t\tthis.#name = params.name;\n\t\tthis.#routes = params.routes;\n\t\tthis.#deps = params.deps;\n\t\tthis.#services = params.services;\n\t\tthis.#mountRoute = params.mountRoute;\n\t\tthis.#serviceThisContext = params.serviceThisContext;\n\t\tthis.#handlerThisContext = params.handlerThisContext;\n\t\tthis.#contextStorage = params.storage;\n\t\tthis.#createRequestStorage = params.createRequestStorage;\n\t\tthis.#options = params.options;\n\t\tthis.#linkedFragments = params.linkedFragments ?? {};\n\t\tthis.#router = createRouter();\n\t\tfor (const routeConfig of this.#routes) addRoute(this.#router, routeConfig.method.toUpperCase(), routeConfig.path, routeConfig);\n\t\tthis.handler = this.handler.bind(this);\n\t}\n\tget name() {\n\t\treturn this.#name;\n\t}\n\tget routes() {\n\t\treturn this.#routes;\n\t}\n\tget services() {\n\t\treturn this.#services;\n\t}\n\tget mountRoute() {\n\t\treturn this.#mountRoute;\n\t}\n\t/**\n\t* @internal\n\t*/\n\tget $internal() {\n\t\treturn {\n\t\t\tdeps: this.#deps,\n\t\t\toptions: this.#options,\n\t\t\tlinkedFragments: this.#linkedFragments\n\t\t};\n\t}\n\t/**\n\t* Add middleware to this fragment.\n\t* Middleware can inspect and modify requests before they reach handlers.\n\t*/\n\twithMiddleware(handler) {\n\t\tif (this.#middlewareHandler) throw new Error(\"Middleware already set\");\n\t\tthis.#middlewareHandler = handler;\n\t\treturn this;\n\t}\n\t#withRequestStorage(callback) {\n\t\tif (!this.#serviceThisContext && !this.#handlerThisContext) return callback();\n\t\tconst storageData = this.#createRequestStorage ? this.#createRequestStorage() : {};\n\t\treturn this.#contextStorage.run(storageData, callback);\n\t}\n\tinContext(callback) {\n\t\tif (this.#handlerThisContext) {\n\t\t\tconst boundCallback = callback.bind(this.#handlerThisContext);\n\t\t\treturn this.#withRequestStorage(boundCallback);\n\t\t}\n\t\treturn this.#withRequestStorage(callback);\n\t}\n\t/**\n\t* Get framework-specific handlers for this fragment.\n\t* Use this to integrate the fragment with different fullstack frameworks.\n\t*/\n\thandlersFor(framework) {\n\t\tconst handler = this.handler.bind(this);\n\t\tif (framework === \"h3\" || framework === \"nuxt\") throw new Error(`To get handlers for h3, use the 'fromWebHandler' utility function:\n import { fromWebHandler } from \"h3\";\n export default fromWebHandler(myFragment().handler);`);\n\t\treturn {\n\t\t\tastro: { ALL: handler },\n\t\t\t\"react-router\": {\n\t\t\t\tloader: ({ request }) => handler(request),\n\t\t\t\taction: ({ request }) => handler(request)\n\t\t\t},\n\t\t\t\"next-js\": {\n\t\t\t\tGET: handler,\n\t\t\t\tPOST: handler,\n\t\t\t\tPUT: handler,\n\t\t\t\tDELETE: handler,\n\t\t\t\tPATCH: handler,\n\t\t\t\tHEAD: handler,\n\t\t\t\tOPTIONS: handler\n\t\t\t},\n\t\t\t\"svelte-kit\": {\n\t\t\t\tGET: handler,\n\t\t\t\tPOST: handler,\n\t\t\t\tPUT: handler,\n\t\t\t\tDELETE: handler,\n\t\t\t\tPATCH: handler,\n\t\t\t\tHEAD: handler,\n\t\t\t\tOPTIONS: handler\n\t\t\t},\n\t\t\t\"solid-start\": {\n\t\t\t\tGET: ({ request }) => handler(request),\n\t\t\t\tPOST: ({ request }) => handler(request),\n\t\t\t\tPUT: ({ request }) => handler(request),\n\t\t\t\tDELETE: ({ request }) => handler(request),\n\t\t\t\tPATCH: ({ request }) => handler(request),\n\t\t\t\tHEAD: ({ request }) => handler(request),\n\t\t\t\tOPTIONS: ({ request }) => handler(request)\n\t\t\t},\n\t\t\t\"tanstack-start\": {\n\t\t\t\tGET: ({ request }) => handler(request),\n\t\t\t\tPOST: ({ request }) => handler(request),\n\t\t\t\tPUT: ({ request }) => handler(request),\n\t\t\t\tDELETE: ({ request }) => handler(request),\n\t\t\t\tPATCH: ({ request }) => handler(request),\n\t\t\t\tHEAD: ({ request }) => handler(request),\n\t\t\t\tOPTIONS: ({ request }) => handler(request)\n\t\t\t}\n\t\t}[framework];\n\t}\n\t/**\n\t* Main request handler for this fragment.\n\t* Handles routing, middleware, and error handling.\n\t*/\n\tasync handler(req) {\n\t\tconst url = new URL(req.url);\n\t\tconst pathname = url.pathname;\n\t\tconst matchRoute = pathname.startsWith(this.#mountRoute) ? pathname.slice(this.#mountRoute.length) : null;\n\t\tif (matchRoute === null) return Response.json({\n\t\t\terror: `Fragno: Route for '${this.#name}' not found. Is the fragment mounted on the right route? Expecting: '${this.#mountRoute}'.`,\n\t\t\tcode: \"ROUTE_NOT_FOUND\"\n\t\t}, { status: 404 });\n\t\tconst route = findRoute(this.#router, req.method, matchRoute);\n\t\tif (!route) return Response.json({\n\t\t\terror: `Fragno: Route for '${this.#name}' not found`,\n\t\t\tcode: \"ROUTE_NOT_FOUND\"\n\t\t}, { status: 404 });\n\t\tlet requestBody = void 0;\n\t\tlet rawBody = void 0;\n\t\tif (req.body instanceof ReadableStream) {\n\t\t\trawBody = await req.clone().text();\n\t\t\tif (rawBody) try {\n\t\t\t\trequestBody = JSON.parse(rawBody);\n\t\t\t} catch {\n\t\t\t\trequestBody = void 0;\n\t\t\t}\n\t\t}\n\t\tconst requestState = new MutableRequestState({\n\t\t\tpathParams: route.params ?? {},\n\t\t\tsearchParams: url.searchParams,\n\t\t\tbody: requestBody,\n\t\t\theaders: new Headers(req.headers)\n\t\t});\n\t\tconst executeRequest = async () => {\n\t\t\tif (this.#middlewareHandler) {\n\t\t\t\tconst middlewareResult = await this.#executeMiddleware(req, route, requestState);\n\t\t\t\tif (middlewareResult !== void 0) return middlewareResult;\n\t\t\t}\n\t\t\treturn this.#executeHandler(req, route, requestState, rawBody);\n\t\t};\n\t\treturn this.#withRequestStorage(executeRequest);\n\t}\n\t/**\n\t* Call a route directly with typed inputs and outputs.\n\t* Useful for testing and server-side route calls.\n\t*/\n\tasync callRoute(method, path, inputOptions) {\n\t\treturn parseFragnoResponse(await this.callRouteRaw(method, path, inputOptions));\n\t}\n\t/**\n\t* Call a route directly and get the raw Response object.\n\t* Useful for testing and server-side route calls.\n\t*/\n\tasync callRouteRaw(method, path, inputOptions) {\n\t\tconst route = this.#routes.find((r) => r.method === method && r.path === path);\n\t\tif (!route) return Response.json({\n\t\t\terror: `Route ${method} ${path} not found`,\n\t\t\tcode: \"ROUTE_NOT_FOUND\"\n\t\t}, { status: 404 });\n\t\tconst { pathParams = {}, body, query, headers } = inputOptions || {};\n\t\tconst searchParams = query instanceof URLSearchParams ? query : query ? new URLSearchParams(query) : new URLSearchParams();\n\t\tconst requestHeaders = headers instanceof Headers ? headers : headers ? new Headers(headers) : new Headers();\n\t\tconst inputContext = new RequestInputContext({\n\t\t\tpath: route.path,\n\t\t\tmethod: route.method,\n\t\t\tpathParams,\n\t\t\tsearchParams,\n\t\t\theaders: requestHeaders,\n\t\t\tparsedBody: body,\n\t\t\tinputSchema: route.inputSchema,\n\t\t\tshouldValidateInput: true\n\t\t});\n\t\tconst outputContext = new RequestOutputContext(route.outputSchema);\n\t\tconst executeHandler = async () => {\n\t\t\ttry {\n\t\t\t\tconst thisContext = this.#handlerThisContext ?? {};\n\t\t\t\treturn await route.handler.call(thisContext, inputContext, outputContext);\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(\"Error in callRoute handler\", error);\n\t\t\t\tif (error instanceof FragnoApiError) return error.toResponse();\n\t\t\t\treturn Response.json({\n\t\t\t\t\terror: \"Internal server error\",\n\t\t\t\t\tcode: \"INTERNAL_SERVER_ERROR\"\n\t\t\t\t}, { status: 500 });\n\t\t\t}\n\t\t};\n\t\treturn this.#withRequestStorage(executeHandler);\n\t}\n\t/**\n\t* Execute middleware for a request.\n\t* Returns undefined if middleware allows the request to continue to the handler.\n\t*/\n\tasync #executeMiddleware(req, route, requestState) {\n\t\tif (!this.#middlewareHandler || !route) return;\n\t\tconst { path } = route.data;\n\t\tconst middlewareInputContext = new RequestMiddlewareInputContext(this.#routes, {\n\t\t\tmethod: req.method,\n\t\t\tpath,\n\t\t\trequest: req,\n\t\t\tstate: requestState\n\t\t});\n\t\tconst middlewareOutputContext = new RequestMiddlewareOutputContext(this.#deps, this.#services);\n\t\ttry {\n\t\t\tconst middlewareResult = await this.#middlewareHandler(middlewareInputContext, middlewareOutputContext);\n\t\t\tif (middlewareResult !== void 0) return middlewareResult;\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Error in middleware\", error);\n\t\t\tif (error instanceof FragnoApiError) return error.toResponse();\n\t\t\treturn Response.json({\n\t\t\t\terror: \"Internal server error\",\n\t\t\t\tcode: \"INTERNAL_SERVER_ERROR\"\n\t\t\t}, { status: 500 });\n\t\t}\n\t}\n\t/**\n\t* Execute a route handler with proper error handling.\n\t*/\n\tasync #executeHandler(req, route, requestState, rawBody) {\n\t\tif (!route) return Response.json({\n\t\t\terror: \"Route not found\",\n\t\t\tcode: \"ROUTE_NOT_FOUND\"\n\t\t}, { status: 404 });\n\t\tconst { handler, inputSchema, outputSchema, path } = route.data;\n\t\tconst inputContext = await RequestInputContext.fromRequest({\n\t\t\trequest: req,\n\t\t\tmethod: req.method,\n\t\t\tpath,\n\t\t\tpathParams: route.params ?? {},\n\t\t\tinputSchema,\n\t\t\tstate: requestState,\n\t\t\trawBody\n\t\t});\n\t\tconst outputContext = new RequestOutputContext(outputSchema);\n\t\ttry {\n\t\t\tconst contextForHandler = this.#handlerThisContext ?? {};\n\t\t\treturn await handler.call(contextForHandler, inputContext, outputContext);\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Error in handler\", error);\n\t\t\tif (error instanceof FragnoApiError) return error.toResponse();\n\t\t\treturn Response.json({\n\t\t\t\terror: \"Internal server error\",\n\t\t\t\tcode: \"INTERNAL_SERVER_ERROR\"\n\t\t\t}, { status: 500 });\n\t\t}\n\t}\n};\n/**\n* Core instantiation function that creates a fragment instance from a definition.\n* This function validates dependencies, calls all callbacks, and wires everything together.\n*/\nfunction instantiateFragment(definition, config, routesOrFactories, options, serviceImplementations, instantiationOptions) {\n\tconst { dryRun = false } = instantiationOptions ?? {};\n\tconst serviceDependencies = definition.serviceDependencies;\n\tif (serviceDependencies) for (const [serviceName, meta] of Object.entries(serviceDependencies)) {\n\t\tconst metadata = meta;\n\t\tconst implementation = serviceImplementations?.[serviceName];\n\t\tif (metadata.required && !implementation) throw new Error(`Fragment '${definition.name}' requires service '${metadata.name}' but it was not provided`);\n\t}\n\tlet deps;\n\ttry {\n\t\tdeps = definition.dependencies?.({\n\t\t\tconfig,\n\t\t\toptions\n\t\t}) ?? {};\n\t} catch (error) {\n\t\tif (dryRun) {\n\t\t\tconsole.warn(\"Warning: Failed to initialize dependencies in dry run mode:\", error instanceof Error ? error.message : String(error));\n\t\t\tdeps = {};\n\t\t} else throw error;\n\t}\n\tconst linkedFragmentInstances = {};\n\tconst linkedFragmentServices = {};\n\tif (definition.linkedFragments) for (const [name, callback] of Object.entries(definition.linkedFragments)) {\n\t\tconst linkedFragment = callback({\n\t\t\tconfig,\n\t\t\toptions,\n\t\t\tserviceDependencies: serviceImplementations\n\t\t});\n\t\tlinkedFragmentInstances[name] = linkedFragment;\n\t\tconst services$1 = linkedFragment.services;\n\t\tfor (const [serviceName, service] of Object.entries(services$1)) linkedFragmentServices[serviceName] = service;\n\t}\n\tconst defineService = (services$1) => services$1;\n\tconst privateServices = { ...linkedFragmentServices };\n\tif (definition.privateServices) for (const [serviceName, factory] of Object.entries(definition.privateServices)) {\n\t\tconst serviceFactory = factory;\n\t\ttry {\n\t\t\tprivateServices[serviceName] = serviceFactory({\n\t\t\t\tconfig,\n\t\t\t\toptions,\n\t\t\t\tdeps,\n\t\t\t\tserviceDeps: serviceImplementations ?? {},\n\t\t\t\tprivateServices,\n\t\t\t\tdefineService\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tif (dryRun) {\n\t\t\t\tconsole.warn(`Warning: Failed to initialize private service '${serviceName}' in dry run mode:`, error instanceof Error ? error.message : String(error));\n\t\t\t\tprivateServices[serviceName] = {};\n\t\t\t} else throw error;\n\t\t}\n\t}\n\tlet baseServices;\n\ttry {\n\t\tbaseServices = definition.baseServices?.({\n\t\t\tconfig,\n\t\t\toptions,\n\t\t\tdeps,\n\t\t\tserviceDeps: serviceImplementations ?? {},\n\t\t\tprivateServices,\n\t\t\tdefineService\n\t\t}) ?? {};\n\t} catch (error) {\n\t\tif (dryRun) {\n\t\t\tconsole.warn(\"Warning: Failed to initialize base services in dry run mode:\", error instanceof Error ? error.message : String(error));\n\t\t\tbaseServices = {};\n\t\t} else throw error;\n\t}\n\tconst namedServices = {};\n\tif (definition.namedServices) for (const [serviceName, factory] of Object.entries(definition.namedServices)) {\n\t\tconst serviceFactory = factory;\n\t\ttry {\n\t\t\tnamedServices[serviceName] = serviceFactory({\n\t\t\t\tconfig,\n\t\t\t\toptions,\n\t\t\t\tdeps,\n\t\t\t\tserviceDeps: serviceImplementations ?? {},\n\t\t\t\tprivateServices,\n\t\t\t\tdefineService\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tif (dryRun) {\n\t\t\t\tconsole.warn(`Warning: Failed to initialize service '${serviceName}' in dry run mode:`, error instanceof Error ? error.message : String(error));\n\t\t\t\tnamedServices[serviceName] = {};\n\t\t\t} else throw error;\n\t\t}\n\t}\n\tconst services = {\n\t\t...baseServices,\n\t\t...namedServices\n\t};\n\tconst storage = definition.getExternalStorage ? definition.getExternalStorage({\n\t\tconfig,\n\t\toptions,\n\t\tdeps\n\t}) : new RequestContextStorage();\n\tconst contexts = definition.createThisContext?.({\n\t\tconfig,\n\t\toptions,\n\t\tdeps,\n\t\tstorage\n\t});\n\tconst serviceContext = contexts?.serviceContext;\n\tconst handlerContext = contexts?.handlerContext;\n\tconst boundServices = serviceContext ? bindServicesToContext(services, serviceContext) : services;\n\tconst routes = resolveRouteFactories({\n\t\tconfig,\n\t\tdeps,\n\t\tservices: boundServices,\n\t\tserviceDeps: serviceImplementations ?? {}\n\t}, routesOrFactories);\n\tconst mountRoute = getMountRoute({\n\t\tname: definition.name,\n\t\tmountRoute: options.mountRoute\n\t});\n\tconst createRequestStorageWithContext = definition.createRequestStorage ? () => definition.createRequestStorage({\n\t\tconfig,\n\t\toptions,\n\t\tdeps\n\t}) : void 0;\n\treturn new FragnoInstantiatedFragment({\n\t\tname: definition.name,\n\t\troutes,\n\t\tdeps,\n\t\tservices: boundServices,\n\t\tmountRoute,\n\t\tserviceThisContext: serviceContext,\n\t\thandlerThisContext: handlerContext,\n\t\tstorage,\n\t\tcreateRequestStorage: createRequestStorageWithContext,\n\t\toptions,\n\t\tlinkedFragments: linkedFragmentInstances\n\t});\n}\n/**\n* Fluent builder for instantiating fragments.\n* Provides a type-safe API for configuring and building fragment instances.\n*/\nvar FragmentInstantiationBuilder = class FragmentInstantiationBuilder {\n\t#definition;\n\t#config;\n\t#routes;\n\t#options;\n\t#services;\n\tconstructor(definition, routes) {\n\t\tthis.#definition = definition;\n\t\tthis.#routes = routes;\n\t}\n\t/**\n\t* Get the fragment definition\n\t*/\n\tget definition() {\n\t\treturn this.#definition;\n\t}\n\t/**\n\t* Get the configured routes\n\t*/\n\tget routes() {\n\t\treturn this.#routes ?? [];\n\t}\n\t/**\n\t* Get the configuration\n\t*/\n\tget config() {\n\t\treturn this.#config;\n\t}\n\t/**\n\t* Get the options\n\t*/\n\tget options() {\n\t\treturn this.#options;\n\t}\n\t/**\n\t* Set the configuration for the fragment\n\t*/\n\twithConfig(config) {\n\t\tthis.#config = config;\n\t\treturn this;\n\t}\n\t/**\n\t* Set the routes for the fragment\n\t*/\n\twithRoutes(routes) {\n\t\tconst newBuilder = new FragmentInstantiationBuilder(this.#definition, routes);\n\t\tnewBuilder.#config = this.#config;\n\t\tnewBuilder.#options = this.#options;\n\t\tnewBuilder.#services = this.#services;\n\t\treturn newBuilder;\n\t}\n\t/**\n\t* Set the options for the fragment (e.g., mountRoute, databaseAdapter)\n\t*/\n\twithOptions(options) {\n\t\tthis.#options = options;\n\t\treturn this;\n\t}\n\t/**\n\t* Provide implementations for services that this fragment uses\n\t*/\n\twithServices(services) {\n\t\tthis.#services = services;\n\t\treturn this;\n\t}\n\t/**\n\t* Build and return the instantiated fragment\n\t*/\n\tbuild() {\n\t\tconst dryRun = process.env[\"FRAGNO_INIT_DRY_RUN\"] === \"true\";\n\t\treturn instantiateFragment(this.#definition, this.#config ?? {}, this.#routes ?? [], this.#options ?? {}, this.#services, { dryRun });\n\t}\n};\n/**\n* Create a fluent builder for instantiating a fragment.\n*\n* @example\n* ```ts\n* const fragment = instantiate(myFragmentDefinition)\n* .withConfig({ apiKey: \"key\" })\n* .withRoutes([route1, route2])\n* .withOptions({ mountRoute: \"/api\" })\n* .build();\n* ```\n*/\nfunction instantiate(definition) {\n\treturn new FragmentInstantiationBuilder(definition);\n}\n\n//#endregion\nexport { FragmentInstantiationBuilder, FragnoInstantiatedFragment, instantiate, instantiateFragment };\n//# sourceMappingURL=fragment-instantiator.js.map"],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ //#region ../fragno/dist/api/fragno-response.js
2
+ /**
3
+ * Parse a Response object into a FragnoResponse discriminated union
4
+ */
5
+ async function parseFragnoResponse(response) {
6
+ const status = response.status;
7
+ const headers = response.headers;
8
+ if ((headers.get("content-type") || "").includes("application/x-ndjson")) return {
9
+ type: "jsonStream",
10
+ status,
11
+ headers,
12
+ stream: parseNDJSONStream(response)
13
+ };
14
+ const text = await response.text();
15
+ if (!text || text === "null") return {
16
+ type: "empty",
17
+ status,
18
+ headers
19
+ };
20
+ const data = JSON.parse(text);
21
+ if (data && typeof data === "object" && "code" in data) {
22
+ if ("message" in data) return {
23
+ type: "error",
24
+ status,
25
+ headers,
26
+ error: {
27
+ message: data.message,
28
+ code: data.code
29
+ }
30
+ };
31
+ if ("error" in data) return {
32
+ type: "error",
33
+ status,
34
+ headers,
35
+ error: {
36
+ message: data.error,
37
+ code: data.code
38
+ }
39
+ };
40
+ }
41
+ return {
42
+ type: "json",
43
+ status,
44
+ headers,
45
+ data
46
+ };
47
+ }
48
+ /**
49
+ * Parse an NDJSON stream into an async generator
50
+ */
51
+ async function* parseNDJSONStream(response) {
52
+ if (!response.body) return;
53
+ const reader = response.body.getReader();
54
+ const decoder = new TextDecoder();
55
+ let buffer = "";
56
+ try {
57
+ while (true) {
58
+ const { done, value } = await reader.read();
59
+ if (done) break;
60
+ buffer += decoder.decode(value, { stream: true });
61
+ const lines = buffer.split("\n");
62
+ buffer = lines.pop() || "";
63
+ for (const line of lines) if (line.trim()) yield JSON.parse(line);
64
+ }
65
+ if (buffer.trim()) yield JSON.parse(buffer);
66
+ } finally {
67
+ reader.releaseLock();
68
+ }
69
+ }
70
+
71
+ //#endregion
72
+ export { parseFragnoResponse };
73
+ //# sourceMappingURL=fragno-response.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fragno-response.js","names":[],"sources":["../../../../../../fragno/dist/api/fragno-response.js"],"sourcesContent":["//#region src/api/fragno-response.ts\n/**\n* Parse a Response object into a FragnoResponse discriminated union\n*/\nasync function parseFragnoResponse(response) {\n\tconst status = response.status;\n\tconst headers = response.headers;\n\tif ((headers.get(\"content-type\") || \"\").includes(\"application/x-ndjson\")) return {\n\t\ttype: \"jsonStream\",\n\t\tstatus,\n\t\theaders,\n\t\tstream: parseNDJSONStream(response)\n\t};\n\tconst text = await response.text();\n\tif (!text || text === \"null\") return {\n\t\ttype: \"empty\",\n\t\tstatus,\n\t\theaders\n\t};\n\tconst data = JSON.parse(text);\n\tif (data && typeof data === \"object\" && \"code\" in data) {\n\t\tif (\"message\" in data) return {\n\t\t\ttype: \"error\",\n\t\t\tstatus,\n\t\t\theaders,\n\t\t\terror: {\n\t\t\t\tmessage: data.message,\n\t\t\t\tcode: data.code\n\t\t\t}\n\t\t};\n\t\tif (\"error\" in data) return {\n\t\t\ttype: \"error\",\n\t\t\tstatus,\n\t\t\theaders,\n\t\t\terror: {\n\t\t\t\tmessage: data.error,\n\t\t\t\tcode: data.code\n\t\t\t}\n\t\t};\n\t}\n\treturn {\n\t\ttype: \"json\",\n\t\tstatus,\n\t\theaders,\n\t\tdata\n\t};\n}\n/**\n* Parse an NDJSON stream into an async generator\n*/\nasync function* parseNDJSONStream(response) {\n\tif (!response.body) return;\n\tconst reader = response.body.getReader();\n\tconst decoder = new TextDecoder();\n\tlet buffer = \"\";\n\ttry {\n\t\twhile (true) {\n\t\t\tconst { done, value } = await reader.read();\n\t\t\tif (done) break;\n\t\t\tbuffer += decoder.decode(value, { stream: true });\n\t\t\tconst lines = buffer.split(\"\\n\");\n\t\t\tbuffer = lines.pop() || \"\";\n\t\t\tfor (const line of lines) if (line.trim()) yield JSON.parse(line);\n\t\t}\n\t\tif (buffer.trim()) yield JSON.parse(buffer);\n\t} finally {\n\t\treader.releaseLock();\n\t}\n}\n\n//#endregion\nexport { parseFragnoResponse };\n//# sourceMappingURL=fragno-response.js.map"],"mappings":";;;;AAIA,eAAe,oBAAoB,UAAU;CAC5C,MAAM,SAAS,SAAS;CACxB,MAAM,UAAU,SAAS;AACzB,MAAK,QAAQ,IAAI,eAAe,IAAI,IAAI,SAAS,uBAAuB,CAAE,QAAO;EAChF,MAAM;EACN;EACA;EACA,QAAQ,kBAAkB,SAAS;EACnC;CACD,MAAM,OAAO,MAAM,SAAS,MAAM;AAClC,KAAI,CAAC,QAAQ,SAAS,OAAQ,QAAO;EACpC,MAAM;EACN;EACA;EACA;CACD,MAAM,OAAO,KAAK,MAAM,KAAK;AAC7B,KAAI,QAAQ,OAAO,SAAS,YAAY,UAAU,MAAM;AACvD,MAAI,aAAa,KAAM,QAAO;GAC7B,MAAM;GACN;GACA;GACA,OAAO;IACN,SAAS,KAAK;IACd,MAAM,KAAK;IACX;GACD;AACD,MAAI,WAAW,KAAM,QAAO;GAC3B,MAAM;GACN;GACA;GACA,OAAO;IACN,SAAS,KAAK;IACd,MAAM,KAAK;IACX;GACD;;AAEF,QAAO;EACN,MAAM;EACN;EACA;EACA;EACA;;;;;AAKF,gBAAgB,kBAAkB,UAAU;AAC3C,KAAI,CAAC,SAAS,KAAM;CACpB,MAAM,SAAS,SAAS,KAAK,WAAW;CACxC,MAAM,UAAU,IAAI,aAAa;CACjC,IAAI,SAAS;AACb,KAAI;AACH,SAAO,MAAM;GACZ,MAAM,EAAE,MAAM,UAAU,MAAM,OAAO,MAAM;AAC3C,OAAI,KAAM;AACV,aAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,MAAM,CAAC;GACjD,MAAM,QAAQ,OAAO,MAAM,KAAK;AAChC,YAAS,MAAM,KAAK,IAAI;AACxB,QAAK,MAAM,QAAQ,MAAO,KAAI,KAAK,MAAM,CAAE,OAAM,KAAK,MAAM,KAAK;;AAElE,MAAI,OAAO,MAAM,CAAE,OAAM,KAAK,MAAM,OAAO;WAClC;AACT,SAAO,aAAa"}