@timber-js/app 0.2.0-alpha.13 → 0.2.0-alpha.131

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 (785) hide show
  1. package/LICENSE +8 -0
  2. package/dist/_chunks/actions-BNhpxrnV.js +1104 -0
  3. package/dist/_chunks/actions-BNhpxrnV.js.map +1 -0
  4. package/dist/_chunks/build-output-helper-K7oUCRqU.js +102 -0
  5. package/dist/_chunks/build-output-helper-K7oUCRqU.js.map +1 -0
  6. package/dist/_chunks/cli-schema-sync-CObqjGWF.js +2 -0
  7. package/dist/_chunks/cli-schema-sync-q-Ce6-iG.js +785 -0
  8. package/dist/_chunks/cli-schema-sync-q-Ce6-iG.js.map +1 -0
  9. package/dist/_chunks/codec-registry-DqkeAydt.js +21 -0
  10. package/dist/_chunks/codec-registry-DqkeAydt.js.map +1 -0
  11. package/dist/_chunks/define-DMq-Yjp7.js +112 -0
  12. package/dist/_chunks/define-DMq-Yjp7.js.map +1 -0
  13. package/dist/_chunks/define-jeHDXZGq.js +195 -0
  14. package/dist/_chunks/define-jeHDXZGq.js.map +1 -0
  15. package/dist/_chunks/format-BjN9HLu9.js +14 -0
  16. package/dist/_chunks/format-BjN9HLu9.js.map +1 -0
  17. package/dist/_chunks/handler-store-bIAstrxQ.js +54 -0
  18. package/dist/_chunks/handler-store-bIAstrxQ.js.map +1 -0
  19. package/dist/_chunks/logger-CMd9P1xQ.js +291 -0
  20. package/dist/_chunks/logger-CMd9P1xQ.js.map +1 -0
  21. package/dist/_chunks/merge-search-params-Cm1j99HC.js +41 -0
  22. package/dist/_chunks/merge-search-params-Cm1j99HC.js.map +1 -0
  23. package/dist/_chunks/{metadata-routes-Cjmvi3rQ.js → metadata-routes-DESG8uk5.js} +32 -19
  24. package/dist/_chunks/metadata-routes-DESG8uk5.js.map +1 -0
  25. package/dist/_chunks/navigation-root-B5-RmsPi.js +103 -0
  26. package/dist/_chunks/navigation-root-B5-RmsPi.js.map +1 -0
  27. package/dist/_chunks/registry-BI9cgCt7.js +20 -0
  28. package/dist/_chunks/registry-BI9cgCt7.js.map +1 -0
  29. package/dist/_chunks/resolve-schema-DU2nbVOi.js +77 -0
  30. package/dist/_chunks/resolve-schema-DU2nbVOi.js.map +1 -0
  31. package/dist/_chunks/router-ref-B2-2kIIC.js +28 -0
  32. package/dist/_chunks/router-ref-B2-2kIIC.js.map +1 -0
  33. package/dist/_chunks/schema-bridge-o0SwFtXW.js +86 -0
  34. package/dist/_chunks/schema-bridge-o0SwFtXW.js.map +1 -0
  35. package/dist/_chunks/segment-classify-BjfuctV2.js +137 -0
  36. package/dist/_chunks/segment-classify-BjfuctV2.js.map +1 -0
  37. package/dist/_chunks/segment-context-Bg0pFbLT.js +34 -0
  38. package/dist/_chunks/segment-context-Bg0pFbLT.js.map +1 -0
  39. package/dist/_chunks/{ssr-data-MjmprTmO.js → ssr-data-DVX8S7vj.js} +1 -1
  40. package/dist/_chunks/ssr-data-DVX8S7vj.js.map +1 -0
  41. package/dist/_chunks/stale-reload-CCqb62Z3.js +84 -0
  42. package/dist/_chunks/stale-reload-CCqb62Z3.js.map +1 -0
  43. package/dist/_chunks/tracing-DP5djRq5.js +358 -0
  44. package/dist/_chunks/tracing-DP5djRq5.js.map +1 -0
  45. package/dist/_chunks/{use-query-states-D5KaffOK.js → use-query-states-C9G6LP0F.js} +7 -20
  46. package/dist/_chunks/use-query-states-C9G6LP0F.js.map +1 -0
  47. package/dist/_chunks/use-segment-params-CIeinIx2.js +151 -0
  48. package/dist/_chunks/use-segment-params-CIeinIx2.js.map +1 -0
  49. package/dist/_chunks/validation-AfEFM5ze.js +84 -0
  50. package/dist/_chunks/validation-AfEFM5ze.js.map +1 -0
  51. package/dist/_chunks/walkers-BbEu2_Pp.js +724 -0
  52. package/dist/_chunks/walkers-BbEu2_Pp.js.map +1 -0
  53. package/dist/_chunks/{format-DviM89f0.js → warnings-CAzunaGo.js} +6 -45
  54. package/dist/_chunks/warnings-CAzunaGo.js.map +1 -0
  55. package/dist/adapters/build-output-helper.d.ts +28 -0
  56. package/dist/adapters/build-output-helper.d.ts.map +1 -0
  57. package/dist/adapters/cloudflare-dev.d.ts +109 -0
  58. package/dist/adapters/cloudflare-dev.d.ts.map +1 -0
  59. package/dist/adapters/cloudflare-dev.js +73 -0
  60. package/dist/adapters/cloudflare-dev.js.map +1 -0
  61. package/dist/adapters/cloudflare-kv-cache.d.ts +64 -0
  62. package/dist/adapters/cloudflare-kv-cache.d.ts.map +1 -0
  63. package/dist/adapters/cloudflare-kv-cache.js +95 -0
  64. package/dist/adapters/cloudflare-kv-cache.js.map +1 -0
  65. package/dist/adapters/cloudflare.d.ts +148 -12
  66. package/dist/adapters/cloudflare.d.ts.map +1 -1
  67. package/dist/adapters/cloudflare.js +142 -38
  68. package/dist/adapters/cloudflare.js.map +1 -1
  69. package/dist/adapters/compress-module.d.ts.map +1 -1
  70. package/dist/adapters/nitro.d.ts +17 -1
  71. package/dist/adapters/nitro.d.ts.map +1 -1
  72. package/dist/adapters/nitro.js +143 -45
  73. package/dist/adapters/nitro.js.map +1 -1
  74. package/dist/adapters/shared.d.ts +16 -0
  75. package/dist/adapters/shared.d.ts.map +1 -0
  76. package/dist/cache/cache-api.d.ts +24 -0
  77. package/dist/cache/cache-api.d.ts.map +1 -0
  78. package/dist/cache/handler-store.d.ts +31 -0
  79. package/dist/cache/handler-store.d.ts.map +1 -0
  80. package/dist/cache/index.d.ts +23 -7
  81. package/dist/cache/index.d.ts.map +1 -1
  82. package/dist/cache/index.js +151 -81
  83. package/dist/cache/index.js.map +1 -1
  84. package/dist/cache/singleflight.d.ts +18 -1
  85. package/dist/cache/singleflight.d.ts.map +1 -1
  86. package/dist/cache/sizeof.d.ts +22 -0
  87. package/dist/cache/sizeof.d.ts.map +1 -0
  88. package/dist/cache/timber-cache.d.ts +1 -1
  89. package/dist/cache/timber-cache.d.ts.map +1 -1
  90. package/dist/cli-schema-sync.d.ts +39 -0
  91. package/dist/cli-schema-sync.d.ts.map +1 -0
  92. package/dist/cli.d.ts +14 -2
  93. package/dist/cli.d.ts.map +1 -1
  94. package/dist/cli.js +48 -6
  95. package/dist/cli.js.map +1 -1
  96. package/dist/client/browser-dev.d.ts +34 -1
  97. package/dist/client/browser-dev.d.ts.map +1 -1
  98. package/dist/client/browser-entry/action-dispatch.d.ts +17 -0
  99. package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -0
  100. package/dist/client/browser-entry/hmr.d.ts +21 -0
  101. package/dist/client/browser-entry/hmr.d.ts.map +1 -0
  102. package/dist/client/browser-entry/hydrate.d.ts +46 -0
  103. package/dist/client/browser-entry/hydrate.d.ts.map +1 -0
  104. package/dist/client/browser-entry/index.d.ts +30 -0
  105. package/dist/client/browser-entry/index.d.ts.map +1 -0
  106. package/dist/client/browser-entry/post-hydration.d.ts +26 -0
  107. package/dist/client/browser-entry/post-hydration.d.ts.map +1 -0
  108. package/dist/client/browser-entry/router-init.d.ts +26 -0
  109. package/dist/client/browser-entry/router-init.d.ts.map +1 -0
  110. package/dist/client/browser-entry/rsc-stream.d.ts +24 -0
  111. package/dist/client/browser-entry/rsc-stream.d.ts.map +1 -0
  112. package/dist/client/browser-entry/scroll.d.ts +19 -0
  113. package/dist/client/browser-entry/scroll.d.ts.map +1 -0
  114. package/dist/client/error-boundary.d.ts +12 -5
  115. package/dist/client/error-boundary.d.ts.map +1 -1
  116. package/dist/client/error-boundary.js +29 -6
  117. package/dist/client/error-boundary.js.map +1 -1
  118. package/dist/client/error-reconstituter.d.ts +54 -0
  119. package/dist/client/error-reconstituter.d.ts.map +1 -0
  120. package/dist/client/form.d.ts +16 -27
  121. package/dist/client/form.d.ts.map +1 -1
  122. package/dist/client/history.d.ts +19 -4
  123. package/dist/client/history.d.ts.map +1 -1
  124. package/dist/client/index.d.ts +10 -24
  125. package/dist/client/index.d.ts.map +1 -1
  126. package/dist/client/index.js +180 -1119
  127. package/dist/client/index.js.map +1 -1
  128. package/dist/client/internal.d.ts +19 -0
  129. package/dist/client/internal.d.ts.map +1 -0
  130. package/dist/client/internal.js +845 -0
  131. package/dist/client/internal.js.map +1 -0
  132. package/dist/client/link-pending-store.d.ts +65 -0
  133. package/dist/client/link-pending-store.d.ts.map +1 -0
  134. package/dist/client/link.d.ts +67 -56
  135. package/dist/client/link.d.ts.map +1 -1
  136. package/dist/client/nav-link-store.d.ts +27 -0
  137. package/dist/client/nav-link-store.d.ts.map +1 -0
  138. package/dist/client/navigation-api-types.d.ts +90 -0
  139. package/dist/client/navigation-api-types.d.ts.map +1 -0
  140. package/dist/client/navigation-api.d.ts +115 -0
  141. package/dist/client/navigation-api.d.ts.map +1 -0
  142. package/dist/client/navigation-context.d.ts +14 -2
  143. package/dist/client/navigation-context.d.ts.map +1 -1
  144. package/dist/client/{transition-root.d.ts → navigation-root.d.ts} +46 -9
  145. package/dist/client/navigation-root.d.ts.map +1 -0
  146. package/dist/client/nuqs-adapter.d.ts.map +1 -1
  147. package/dist/client/router-ref.d.ts +1 -1
  148. package/dist/client/router.d.ts +79 -10
  149. package/dist/client/router.d.ts.map +1 -1
  150. package/dist/client/rsc-fetch.d.ts +46 -3
  151. package/dist/client/rsc-fetch.d.ts.map +1 -1
  152. package/dist/client/segment-cache.d.ts +3 -1
  153. package/dist/client/segment-cache.d.ts.map +1 -1
  154. package/dist/client/segment-outlet.d.ts +49 -0
  155. package/dist/client/segment-outlet.d.ts.map +1 -0
  156. package/dist/client/segment-update-context.d.ts +21 -0
  157. package/dist/client/segment-update-context.d.ts.map +1 -0
  158. package/dist/client/shallow-url.d.ts +10 -0
  159. package/dist/client/shallow-url.d.ts.map +1 -0
  160. package/dist/client/ssr-data.d.ts +13 -4
  161. package/dist/client/ssr-data.d.ts.map +1 -1
  162. package/dist/client/stale-reload.d.ts +15 -0
  163. package/dist/client/stale-reload.d.ts.map +1 -1
  164. package/dist/client/state.d.ts +1 -1
  165. package/dist/client/top-loader.d.ts +5 -5
  166. package/dist/client/top-loader.d.ts.map +1 -1
  167. package/dist/client/use-cookie.d.ts +12 -0
  168. package/dist/client/use-cookie.d.ts.map +1 -1
  169. package/dist/client/use-link-status.d.ts +5 -5
  170. package/dist/client/use-link-status.d.ts.map +1 -1
  171. package/dist/client/use-pending-navigation.d.ts +23 -0
  172. package/dist/client/use-pending-navigation.d.ts.map +1 -0
  173. package/dist/client/use-query-states.d.ts +1 -1
  174. package/dist/client/use-query-states.d.ts.map +1 -1
  175. package/dist/client/use-router.d.ts +1 -1
  176. package/dist/client/use-search-params.d.ts +7 -5
  177. package/dist/client/use-search-params.d.ts.map +1 -1
  178. package/dist/client/{use-params.d.ts → use-segment-params.d.ts} +8 -6
  179. package/dist/client/use-segment-params.d.ts.map +1 -0
  180. package/dist/codec.d.ts +69 -0
  181. package/dist/codec.d.ts.map +1 -0
  182. package/dist/codec.js +75 -0
  183. package/dist/codec.js.map +1 -0
  184. package/dist/config-types.d.ts +294 -0
  185. package/dist/config-types.d.ts.map +1 -0
  186. package/dist/config-validation.d.ts +51 -0
  187. package/dist/config-validation.d.ts.map +1 -0
  188. package/dist/content/index.d.ts +1 -10
  189. package/dist/content/index.d.ts.map +1 -1
  190. package/dist/content/index.js +0 -2
  191. package/dist/cookies/define-cookie.d.ts +58 -25
  192. package/dist/cookies/define-cookie.d.ts.map +1 -1
  193. package/dist/cookies/index.d.ts +2 -1
  194. package/dist/cookies/index.d.ts.map +1 -1
  195. package/dist/cookies/index.js +251 -36
  196. package/dist/cookies/index.js.map +1 -1
  197. package/dist/cookies/json-cookie.d.ts +64 -0
  198. package/dist/cookies/json-cookie.d.ts.map +1 -0
  199. package/dist/cookies/validation.d.ts +46 -0
  200. package/dist/cookies/validation.d.ts.map +1 -0
  201. package/dist/dev-tools/404-page.d.ts +46 -0
  202. package/dist/dev-tools/404-page.d.ts.map +1 -0
  203. package/dist/dev-tools/browser-logs.d.ts +84 -0
  204. package/dist/dev-tools/browser-logs.d.ts.map +1 -0
  205. package/dist/dev-tools/error-page.d.ts +58 -0
  206. package/dist/dev-tools/error-page.d.ts.map +1 -0
  207. package/dist/dev-tools/holding-server.d.ts +54 -0
  208. package/dist/dev-tools/holding-server.d.ts.map +1 -0
  209. package/dist/dev-tools/index.d.ts +31 -0
  210. package/dist/dev-tools/index.d.ts.map +1 -0
  211. package/dist/{server/dev-span-processor.d.ts → dev-tools/instrumentation.d.ts} +26 -6
  212. package/dist/dev-tools/instrumentation.d.ts.map +1 -0
  213. package/dist/{server/dev-logger.d.ts → dev-tools/logger.d.ts} +1 -1
  214. package/dist/dev-tools/logger.d.ts.map +1 -0
  215. package/dist/{plugins/dev-logs.d.ts → dev-tools/logs.d.ts} +2 -2
  216. package/dist/dev-tools/logs.d.ts.map +1 -0
  217. package/dist/dev-tools/overlay.d.ts +91 -0
  218. package/dist/dev-tools/overlay.d.ts.map +1 -0
  219. package/dist/dev-tools/stack-classifier.d.ts +34 -0
  220. package/dist/dev-tools/stack-classifier.d.ts.map +1 -0
  221. package/dist/dev-tools/terminal.d.ts +28 -0
  222. package/dist/dev-tools/terminal.d.ts.map +1 -0
  223. package/dist/{server/dev-warnings.d.ts → dev-tools/warnings.d.ts} +2 -22
  224. package/dist/dev-tools/warnings.d.ts.map +1 -0
  225. package/dist/fonts/ast.d.ts +98 -6
  226. package/dist/fonts/ast.d.ts.map +1 -1
  227. package/dist/fonts/bundle.d.ts +48 -0
  228. package/dist/fonts/bundle.d.ts.map +1 -0
  229. package/dist/fonts/dev-middleware.d.ts +22 -0
  230. package/dist/fonts/dev-middleware.d.ts.map +1 -0
  231. package/dist/fonts/local.d.ts +1 -1
  232. package/dist/fonts/pipeline.d.ts +167 -0
  233. package/dist/fonts/pipeline.d.ts.map +1 -0
  234. package/dist/fonts/transform.d.ts +78 -0
  235. package/dist/fonts/transform.d.ts.map +1 -0
  236. package/dist/fonts/types.d.ts +45 -1
  237. package/dist/fonts/types.d.ts.map +1 -1
  238. package/dist/fonts/virtual-modules.d.ts +94 -0
  239. package/dist/fonts/virtual-modules.d.ts.map +1 -0
  240. package/dist/index.d.ts +46 -164
  241. package/dist/index.d.ts.map +1 -1
  242. package/dist/index.js +5584 -13386
  243. package/dist/index.js.map +1 -1
  244. package/dist/params/codec-registry.d.ts +26 -0
  245. package/dist/params/codec-registry.d.ts.map +1 -0
  246. package/dist/params/define-schema.d.ts +81 -0
  247. package/dist/params/define-schema.d.ts.map +1 -0
  248. package/dist/params/index.d.ts +5 -0
  249. package/dist/params/index.d.ts.map +1 -0
  250. package/dist/params/index.js +34 -0
  251. package/dist/params/index.js.map +1 -0
  252. package/dist/params/resolve-schema.d.ts +34 -0
  253. package/dist/params/resolve-schema.d.ts.map +1 -0
  254. package/dist/plugin-context.d.ts +107 -0
  255. package/dist/plugin-context.d.ts.map +1 -0
  256. package/dist/plugins/adapter-build.d.ts +1 -1
  257. package/dist/plugins/adapter-build.d.ts.map +1 -1
  258. package/dist/plugins/build-manifest.d.ts +2 -2
  259. package/dist/plugins/build-manifest.d.ts.map +1 -1
  260. package/dist/plugins/build-report.d.ts +9 -7
  261. package/dist/plugins/build-report.d.ts.map +1 -1
  262. package/dist/plugins/client-chunks.d.ts +32 -0
  263. package/dist/plugins/client-chunks.d.ts.map +1 -0
  264. package/dist/plugins/cloudflare-wasm.d.ts +18 -0
  265. package/dist/plugins/cloudflare-wasm.d.ts.map +1 -0
  266. package/dist/plugins/content.d.ts +1 -1
  267. package/dist/plugins/content.d.ts.map +1 -1
  268. package/dist/plugins/dev-server.d.ts +1 -1
  269. package/dist/plugins/dev-server.d.ts.map +1 -1
  270. package/dist/plugins/entries.d.ts +1 -1
  271. package/dist/plugins/entries.d.ts.map +1 -1
  272. package/dist/plugins/fonts.d.ts +17 -73
  273. package/dist/plugins/fonts.d.ts.map +1 -1
  274. package/dist/plugins/mdx.d.ts +1 -1
  275. package/dist/plugins/mdx.d.ts.map +1 -1
  276. package/dist/plugins/routing.d.ts +1 -1
  277. package/dist/plugins/routing.d.ts.map +1 -1
  278. package/dist/plugins/server-bundle.d.ts.map +1 -1
  279. package/dist/plugins/shims.d.ts +6 -5
  280. package/dist/plugins/shims.d.ts.map +1 -1
  281. package/dist/plugins/static-build.d.ts +5 -26
  282. package/dist/plugins/static-build.d.ts.map +1 -1
  283. package/dist/routing/codegen-shared.d.ts +67 -0
  284. package/dist/routing/codegen-shared.d.ts.map +1 -0
  285. package/dist/routing/codegen-types.d.ts +60 -0
  286. package/dist/routing/codegen-types.d.ts.map +1 -0
  287. package/dist/routing/codegen.d.ts +7 -2
  288. package/dist/routing/codegen.d.ts.map +1 -1
  289. package/dist/routing/convention-lint.d.ts +41 -0
  290. package/dist/routing/convention-lint.d.ts.map +1 -0
  291. package/dist/routing/index.d.ts +7 -1
  292. package/dist/routing/index.d.ts.map +1 -1
  293. package/dist/routing/index.js +4 -2
  294. package/dist/routing/link-codegen.d.ts +90 -0
  295. package/dist/routing/link-codegen.d.ts.map +1 -0
  296. package/dist/routing/scanner.d.ts +1 -10
  297. package/dist/routing/scanner.d.ts.map +1 -1
  298. package/dist/routing/schema-validation.d.ts +35 -0
  299. package/dist/routing/schema-validation.d.ts.map +1 -0
  300. package/dist/routing/segment-classify.d.ts +75 -0
  301. package/dist/routing/segment-classify.d.ts.map +1 -0
  302. package/dist/routing/segment-codegen.d.ts +38 -0
  303. package/dist/routing/segment-codegen.d.ts.map +1 -0
  304. package/dist/routing/types.d.ts +77 -25
  305. package/dist/routing/types.d.ts.map +1 -1
  306. package/dist/routing/walkers.d.ts +51 -0
  307. package/dist/routing/walkers.d.ts.map +1 -0
  308. package/dist/rsc-runtime/rsc.d.ts +1 -1
  309. package/dist/rsc-runtime/rsc.d.ts.map +1 -1
  310. package/dist/rsc-runtime/ssr.d.ts +12 -0
  311. package/dist/rsc-runtime/ssr.d.ts.map +1 -1
  312. package/dist/schema-bridge.d.ts +76 -0
  313. package/dist/schema-bridge.d.ts.map +1 -0
  314. package/dist/search-params/define.d.ts +157 -0
  315. package/dist/search-params/define.d.ts.map +1 -0
  316. package/dist/search-params/index.d.ts +4 -7
  317. package/dist/search-params/index.d.ts.map +1 -1
  318. package/dist/search-params/index.js +34 -441
  319. package/dist/search-params/index.js.map +1 -1
  320. package/dist/search-params/registry.d.ts +2 -2
  321. package/dist/search-params/registry.d.ts.map +1 -1
  322. package/dist/search-params/wrappers.d.ts +53 -0
  323. package/dist/search-params/wrappers.d.ts.map +1 -0
  324. package/dist/segment-params/define.d.ts +89 -0
  325. package/dist/segment-params/define.d.ts.map +1 -0
  326. package/dist/segment-params/index.d.ts +3 -0
  327. package/dist/segment-params/index.d.ts.map +1 -0
  328. package/dist/segment-params/index.js +2 -0
  329. package/dist/server/access-gate.d.ts +8 -3
  330. package/dist/server/access-gate.d.ts.map +1 -1
  331. package/dist/server/action-client.d.ts +41 -6
  332. package/dist/server/action-client.d.ts.map +1 -1
  333. package/dist/server/action-encryption.d.ts +76 -0
  334. package/dist/server/action-encryption.d.ts.map +1 -0
  335. package/dist/server/action-handler.d.ts +35 -1
  336. package/dist/server/action-handler.d.ts.map +1 -1
  337. package/dist/server/actions.d.ts +6 -14
  338. package/dist/server/actions.d.ts.map +1 -1
  339. package/dist/server/als-registry.d.ts +70 -11
  340. package/dist/server/als-registry.d.ts.map +1 -1
  341. package/dist/server/asset-headers.d.ts +1 -15
  342. package/dist/server/asset-headers.d.ts.map +1 -1
  343. package/dist/server/build-manifest.d.ts +8 -2
  344. package/dist/server/build-manifest.d.ts.map +1 -1
  345. package/dist/server/coalesce-tick.d.ts +40 -0
  346. package/dist/server/coalesce-tick.d.ts.map +1 -0
  347. package/dist/server/cookie-context.d.ts +170 -0
  348. package/dist/server/cookie-context.d.ts.map +1 -0
  349. package/dist/server/cookie-parsing.d.ts +51 -0
  350. package/dist/server/cookie-parsing.d.ts.map +1 -0
  351. package/dist/server/debug.d.ts +1 -1
  352. package/dist/server/default-logger.d.ts +22 -0
  353. package/dist/server/default-logger.d.ts.map +1 -0
  354. package/dist/server/deny-boundary.d.ts +90 -0
  355. package/dist/server/deny-boundary.d.ts.map +1 -0
  356. package/dist/server/deny-renderer.d.ts +1 -1
  357. package/dist/server/deny-renderer.d.ts.map +1 -1
  358. package/dist/server/dev-source-map.d.ts +22 -0
  359. package/dist/server/dev-source-map.d.ts.map +1 -0
  360. package/dist/server/early-hints-sender.d.ts.map +1 -1
  361. package/dist/server/early-hints.d.ts +13 -5
  362. package/dist/server/early-hints.d.ts.map +1 -1
  363. package/dist/server/error-boundary-wrapper.d.ts +7 -1
  364. package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
  365. package/dist/server/fallback-error.d.ts +12 -7
  366. package/dist/server/fallback-error.d.ts.map +1 -1
  367. package/dist/server/flight-injection-state.d.ts +66 -0
  368. package/dist/server/flight-injection-state.d.ts.map +1 -0
  369. package/dist/server/flight-scripts.d.ts +42 -0
  370. package/dist/server/flight-scripts.d.ts.map +1 -0
  371. package/dist/server/flush.d.ts.map +1 -1
  372. package/dist/server/form-data.d.ts +29 -0
  373. package/dist/server/form-data.d.ts.map +1 -1
  374. package/dist/server/html-injector-core.d.ts +213 -0
  375. package/dist/server/html-injector-core.d.ts.map +1 -0
  376. package/dist/server/html-injectors.d.ts +81 -41
  377. package/dist/server/html-injectors.d.ts.map +1 -1
  378. package/dist/server/index.d.ts +10 -46
  379. package/dist/server/index.d.ts.map +1 -1
  380. package/dist/server/index.js +155 -2905
  381. package/dist/server/index.js.map +1 -1
  382. package/dist/server/internal.d.ts +48 -0
  383. package/dist/server/internal.d.ts.map +1 -0
  384. package/dist/server/internal.js +3027 -0
  385. package/dist/server/internal.js.map +1 -0
  386. package/dist/server/logger.d.ts +39 -7
  387. package/dist/server/logger.d.ts.map +1 -1
  388. package/dist/server/metadata-routes.d.ts +23 -7
  389. package/dist/server/metadata-routes.d.ts.map +1 -1
  390. package/dist/server/middleware-runner.d.ts +36 -4
  391. package/dist/server/middleware-runner.d.ts.map +1 -1
  392. package/dist/server/node-stream-transforms.d.ts +112 -0
  393. package/dist/server/node-stream-transforms.d.ts.map +1 -0
  394. package/dist/server/param-coercion.d.ts +54 -0
  395. package/dist/server/param-coercion.d.ts.map +1 -0
  396. package/dist/server/pipeline-helpers.d.ts +95 -0
  397. package/dist/server/pipeline-helpers.d.ts.map +1 -0
  398. package/dist/server/pipeline-interception.d.ts +1 -1
  399. package/dist/server/pipeline-interception.d.ts.map +1 -1
  400. package/dist/server/pipeline-metadata.d.ts +6 -0
  401. package/dist/server/pipeline-metadata.d.ts.map +1 -1
  402. package/dist/server/pipeline-outcome.d.ts +49 -0
  403. package/dist/server/pipeline-outcome.d.ts.map +1 -0
  404. package/dist/server/pipeline-phases.d.ts +52 -0
  405. package/dist/server/pipeline-phases.d.ts.map +1 -0
  406. package/dist/server/pipeline.d.ts +118 -23
  407. package/dist/server/pipeline.d.ts.map +1 -1
  408. package/dist/server/port-resolution.d.ts +117 -0
  409. package/dist/server/port-resolution.d.ts.map +1 -0
  410. package/dist/server/primitives.d.ts +69 -18
  411. package/dist/server/primitives.d.ts.map +1 -1
  412. package/dist/server/render-timeout.d.ts +51 -0
  413. package/dist/server/render-timeout.d.ts.map +1 -0
  414. package/dist/server/request-context.d.ts +62 -107
  415. package/dist/server/request-context.d.ts.map +1 -1
  416. package/dist/server/route-element-builder.d.ts +28 -2
  417. package/dist/server/route-element-builder.d.ts.map +1 -1
  418. package/dist/server/route-handler.d.ts.map +1 -1
  419. package/dist/server/route-matcher.d.ts +25 -36
  420. package/dist/server/route-matcher.d.ts.map +1 -1
  421. package/dist/server/rsc-entry/action-middleware-runner.d.ts +66 -0
  422. package/dist/server/rsc-entry/action-middleware-runner.d.ts.map +1 -0
  423. package/dist/server/rsc-entry/api-handler.d.ts +2 -2
  424. package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
  425. package/dist/server/rsc-entry/error-renderer.d.ts +26 -13
  426. package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
  427. package/dist/server/rsc-entry/helpers.d.ts +50 -6
  428. package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
  429. package/dist/server/rsc-entry/index.d.ts +19 -8
  430. package/dist/server/rsc-entry/index.d.ts.map +1 -1
  431. package/dist/server/rsc-entry/render-route.d.ts +50 -0
  432. package/dist/server/rsc-entry/render-route.d.ts.map +1 -0
  433. package/dist/server/rsc-entry/rsc-payload.d.ts +3 -3
  434. package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
  435. package/dist/server/rsc-entry/rsc-stream.d.ts +17 -1
  436. package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
  437. package/dist/server/rsc-entry/ssr-bridge.d.ts +5 -1
  438. package/dist/server/rsc-entry/ssr-bridge.d.ts.map +1 -1
  439. package/dist/server/rsc-entry/ssr-renderer.d.ts +19 -4
  440. package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
  441. package/dist/server/rsc-entry/wrap-action-dispatch.d.ts +119 -0
  442. package/dist/server/rsc-entry/wrap-action-dispatch.d.ts.map +1 -0
  443. package/dist/server/safe-load.d.ts +46 -0
  444. package/dist/server/safe-load.d.ts.map +1 -0
  445. package/dist/server/sensitive-fields.d.ts +74 -0
  446. package/dist/server/sensitive-fields.d.ts.map +1 -0
  447. package/dist/server/sitemap-generator.d.ts +129 -0
  448. package/dist/server/sitemap-generator.d.ts.map +1 -0
  449. package/dist/server/sitemap-handler.d.ts +22 -0
  450. package/dist/server/sitemap-handler.d.ts.map +1 -0
  451. package/dist/server/slot-resolver.d.ts +1 -1
  452. package/dist/server/slot-resolver.d.ts.map +1 -1
  453. package/dist/server/ssr-bridge-types.d.ts +121 -0
  454. package/dist/server/ssr-bridge-types.d.ts.map +1 -0
  455. package/dist/server/ssr-entry.d.ts +2 -43
  456. package/dist/server/ssr-entry.d.ts.map +1 -1
  457. package/dist/server/ssr-render.d.ts +64 -21
  458. package/dist/server/ssr-render.d.ts.map +1 -1
  459. package/dist/server/ssr-wrappers.d.ts +50 -0
  460. package/dist/server/ssr-wrappers.d.ts.map +1 -0
  461. package/dist/server/state-tree-diff.d.ts +12 -5
  462. package/dist/server/state-tree-diff.d.ts.map +1 -1
  463. package/dist/server/status-code-resolver.d.ts +16 -11
  464. package/dist/server/status-code-resolver.d.ts.map +1 -1
  465. package/dist/server/stream-utils.d.ts +36 -0
  466. package/dist/server/stream-utils.d.ts.map +1 -0
  467. package/dist/server/tracing.d.ts +5 -5
  468. package/dist/server/tracing.d.ts.map +1 -1
  469. package/dist/server/tree-builder.d.ts +62 -30
  470. package/dist/server/tree-builder.d.ts.map +1 -1
  471. package/dist/server/tree-match.d.ts +49 -0
  472. package/dist/server/tree-match.d.ts.map +1 -0
  473. package/dist/server/types.d.ts +49 -4
  474. package/dist/server/types.d.ts.map +1 -1
  475. package/dist/server/utils/escape-html.d.ts +14 -0
  476. package/dist/server/utils/escape-html.d.ts.map +1 -0
  477. package/dist/server/version-skew.d.ts +61 -0
  478. package/dist/server/version-skew.d.ts.map +1 -0
  479. package/dist/shared/merge-search-params.d.ts +22 -0
  480. package/dist/shared/merge-search-params.d.ts.map +1 -0
  481. package/dist/shims/font-google.d.ts +1 -1
  482. package/dist/shims/font-google.d.ts.map +1 -1
  483. package/dist/shims/font-google.js +42 -0
  484. package/dist/shims/font-google.js.map +1 -0
  485. package/dist/shims/font-local.d.ts +26 -0
  486. package/dist/shims/font-local.d.ts.map +1 -0
  487. package/dist/shims/font-local.js +20 -0
  488. package/dist/shims/font-local.js.map +1 -0
  489. package/dist/shims/headers.d.ts +2 -1
  490. package/dist/shims/headers.d.ts.map +1 -1
  491. package/dist/shims/navigation-client.d.ts +3 -1
  492. package/dist/shims/navigation-client.d.ts.map +1 -1
  493. package/dist/shims/navigation.d.ts +11 -5
  494. package/dist/shims/navigation.d.ts.map +1 -1
  495. package/dist/utils/state-machine.d.ts +80 -0
  496. package/dist/utils/state-machine.d.ts.map +1 -0
  497. package/package.json +61 -22
  498. package/src/adapters/build-output-helper.ts +139 -0
  499. package/src/adapters/cloudflare-dev.ts +177 -0
  500. package/src/adapters/cloudflare-kv-cache.ts +142 -0
  501. package/src/adapters/cloudflare.ts +350 -76
  502. package/src/adapters/compress-module.ts +24 -4
  503. package/src/adapters/nitro.ts +142 -59
  504. package/src/adapters/shared.ts +40 -0
  505. package/src/adapters/wrangler.d.ts +7 -0
  506. package/src/cache/cache-api.ts +38 -0
  507. package/src/cache/handler-store.ts +68 -0
  508. package/src/cache/index.ts +81 -18
  509. package/src/cache/singleflight.ts +62 -4
  510. package/src/cache/sizeof.ts +33 -0
  511. package/src/cache/timber-cache.ts +25 -20
  512. package/src/cli-schema-sync.ts +295 -0
  513. package/src/cli.ts +76 -8
  514. package/src/client/browser-dev.ts +153 -1
  515. package/src/client/browser-entry/action-dispatch.ts +125 -0
  516. package/src/client/browser-entry/hmr.ts +81 -0
  517. package/src/client/browser-entry/hydrate.ts +153 -0
  518. package/src/client/browser-entry/index.ts +151 -0
  519. package/src/client/browser-entry/post-hydration.ts +113 -0
  520. package/src/client/browser-entry/router-init.ts +219 -0
  521. package/src/client/browser-entry/rsc-stream.ts +157 -0
  522. package/src/client/browser-entry/scroll.ts +27 -0
  523. package/src/client/error-boundary.tsx +99 -22
  524. package/src/client/error-reconstituter.tsx +65 -0
  525. package/src/client/form.tsx +31 -32
  526. package/src/client/history.ts +26 -4
  527. package/src/client/index.ts +66 -45
  528. package/src/client/internal.ts +58 -0
  529. package/src/client/link-pending-store.ts +116 -0
  530. package/src/client/link.tsx +336 -119
  531. package/src/client/nav-link-store.ts +37 -0
  532. package/src/client/navigation-api-types.ts +112 -0
  533. package/src/client/navigation-api.ts +332 -0
  534. package/src/client/navigation-context.ts +33 -7
  535. package/src/client/navigation-root.tsx +347 -0
  536. package/src/client/nuqs-adapter.tsx +16 -3
  537. package/src/client/router-ref.ts +1 -1
  538. package/src/client/router.ts +418 -128
  539. package/src/client/rsc-fetch.ts +208 -10
  540. package/src/client/segment-cache.ts +6 -3
  541. package/src/client/segment-outlet.tsx +77 -0
  542. package/src/client/segment-update-context.ts +42 -0
  543. package/src/client/shallow-url.ts +22 -0
  544. package/src/client/ssr-data.ts +13 -5
  545. package/src/client/stale-reload.ts +72 -3
  546. package/src/client/state.ts +2 -2
  547. package/src/client/top-loader.tsx +11 -9
  548. package/src/client/use-cookie.ts +31 -2
  549. package/src/client/use-link-status.ts +7 -7
  550. package/src/client/use-pending-navigation.ts +40 -0
  551. package/src/client/use-query-states.ts +9 -3
  552. package/src/client/use-router.ts +1 -1
  553. package/src/client/use-search-params.ts +25 -44
  554. package/src/client/{use-params.ts → use-segment-params.ts} +8 -6
  555. package/src/codec.ts +147 -0
  556. package/src/config-types.ts +292 -0
  557. package/src/config-validation.ts +303 -0
  558. package/src/content/index.ts +5 -13
  559. package/src/cookies/define-cookie.ts +233 -53
  560. package/src/cookies/index.ts +12 -1
  561. package/src/cookies/json-cookie.ts +105 -0
  562. package/src/cookies/validation.ts +134 -0
  563. package/src/dev-tools/404-page.ts +387 -0
  564. package/src/dev-tools/browser-logs.ts +291 -0
  565. package/src/dev-tools/error-page.ts +506 -0
  566. package/src/dev-tools/holding-server.ts +187 -0
  567. package/src/dev-tools/index.ts +90 -0
  568. package/src/dev-tools/instrumentation.ts +176 -0
  569. package/src/{plugins/dev-logs.ts → dev-tools/logs.ts} +9 -5
  570. package/src/dev-tools/overlay.ts +469 -0
  571. package/src/dev-tools/stack-classifier.ts +75 -0
  572. package/src/dev-tools/terminal.ts +183 -0
  573. package/src/{server/dev-warnings.ts → dev-tools/warnings.ts} +5 -50
  574. package/src/fonts/ast.ts +525 -16
  575. package/src/fonts/bundle.ts +142 -0
  576. package/src/fonts/dev-middleware.ts +74 -0
  577. package/src/fonts/local.ts +1 -1
  578. package/src/fonts/pipeline.ts +314 -0
  579. package/src/fonts/transform.ts +317 -0
  580. package/src/fonts/types.ts +50 -1
  581. package/src/fonts/virtual-modules.ts +233 -0
  582. package/src/index.ts +411 -329
  583. package/src/params/codec-registry.ts +34 -0
  584. package/src/params/define-schema.ts +114 -0
  585. package/src/params/index.ts +17 -0
  586. package/src/params/resolve-schema.ts +116 -0
  587. package/src/plugin-context.ts +240 -0
  588. package/src/plugins/adapter-build.ts +12 -4
  589. package/src/plugins/build-manifest.ts +69 -6
  590. package/src/plugins/build-report.ts +16 -25
  591. package/src/plugins/client-chunks.ts +65 -0
  592. package/src/plugins/cloudflare-wasm.ts +103 -0
  593. package/src/plugins/content.ts +1 -1
  594. package/src/plugins/dev-server.ts +179 -37
  595. package/src/plugins/entries.ts +111 -8
  596. package/src/plugins/fonts.ts +165 -654
  597. package/src/plugins/mdx.ts +47 -10
  598. package/src/plugins/routing.ts +386 -47
  599. package/src/plugins/server-bundle.ts +59 -3
  600. package/src/plugins/shims.ts +136 -35
  601. package/src/plugins/static-build.ts +15 -89
  602. package/src/routing/codegen-shared.ts +115 -0
  603. package/src/routing/codegen-types.ts +61 -0
  604. package/src/routing/codegen.ts +321 -177
  605. package/src/routing/convention-lint.ts +357 -0
  606. package/src/routing/index.ts +10 -1
  607. package/src/routing/interception.ts +1 -1
  608. package/src/routing/link-codegen.ts +308 -0
  609. package/src/routing/scanner.ts +165 -110
  610. package/src/routing/schema-validation.ts +149 -0
  611. package/src/routing/segment-classify.ts +188 -0
  612. package/src/routing/segment-codegen.ts +98 -0
  613. package/src/routing/types.ts +78 -25
  614. package/src/routing/walkers.ts +90 -0
  615. package/src/rsc-runtime/rsc.ts +2 -0
  616. package/src/rsc-runtime/ssr.ts +50 -0
  617. package/src/rsc-runtime/vendor-types.d.ts +7 -0
  618. package/src/{search-params/codecs.ts → schema-bridge.ts} +57 -20
  619. package/src/search-params/define.ts +538 -0
  620. package/src/search-params/index.ts +14 -20
  621. package/src/search-params/registry.ts +2 -2
  622. package/src/search-params/wrappers.ts +92 -0
  623. package/src/segment-params/define.ts +309 -0
  624. package/src/segment-params/index.ts +9 -0
  625. package/src/server/access-gate.tsx +76 -34
  626. package/src/server/action-client.ts +88 -15
  627. package/src/server/action-encryption.ts +144 -0
  628. package/src/server/action-handler.ts +112 -14
  629. package/src/server/actions.ts +14 -23
  630. package/src/server/als-registry.ts +108 -20
  631. package/src/server/asset-headers.ts +8 -34
  632. package/src/server/build-manifest.ts +17 -4
  633. package/src/server/coalesce-tick.ts +75 -0
  634. package/src/server/compress.ts +25 -7
  635. package/src/server/cookie-context.ts +468 -0
  636. package/src/server/cookie-parsing.ts +135 -0
  637. package/src/server/debug.ts +1 -1
  638. package/src/server/default-logger.ts +99 -0
  639. package/src/server/deny-boundary.ts +218 -0
  640. package/src/server/deny-renderer.ts +32 -51
  641. package/src/server/dev-source-map.ts +31 -0
  642. package/src/server/early-hints-sender.ts +3 -2
  643. package/src/server/early-hints.ts +36 -15
  644. package/src/server/error-boundary-wrapper.ts +74 -22
  645. package/src/server/fallback-error.ts +74 -102
  646. package/src/server/flight-injection-state.ts +113 -0
  647. package/src/server/flight-scripts.ts +62 -0
  648. package/src/server/flush.ts +2 -1
  649. package/src/server/form-data.ts +101 -5
  650. package/src/server/html-injector-core.ts +417 -0
  651. package/src/server/html-injectors.ts +235 -223
  652. package/src/server/index.ts +29 -183
  653. package/src/server/internal.ts +182 -0
  654. package/src/server/logger.ts +67 -36
  655. package/src/server/metadata-routes.ts +44 -19
  656. package/src/server/middleware-runner.ts +75 -4
  657. package/src/server/node-stream-transforms.ts +361 -0
  658. package/src/server/param-coercion.ts +206 -0
  659. package/src/server/pipeline-helpers.ts +204 -0
  660. package/src/server/pipeline-interception.ts +17 -16
  661. package/src/server/pipeline-metadata.ts +13 -0
  662. package/src/server/pipeline-outcome.ts +197 -0
  663. package/src/server/pipeline-phases.ts +468 -0
  664. package/src/server/pipeline.ts +154 -394
  665. package/src/server/port-resolution.ts +215 -0
  666. package/src/server/primitives.ts +111 -28
  667. package/src/server/render-timeout.ts +108 -0
  668. package/src/server/request-context.ts +168 -337
  669. package/src/server/route-element-builder.ts +435 -208
  670. package/src/server/route-handler.ts +24 -4
  671. package/src/server/route-matcher.ts +128 -277
  672. package/src/server/rsc-entry/action-middleware-runner.ts +167 -0
  673. package/src/server/rsc-entry/api-handler.ts +16 -17
  674. package/src/server/rsc-entry/error-renderer.ts +315 -89
  675. package/src/server/rsc-entry/helpers.ts +155 -26
  676. package/src/server/rsc-entry/index.ts +316 -327
  677. package/src/server/rsc-entry/render-route.ts +313 -0
  678. package/src/server/rsc-entry/rsc-payload.ts +65 -18
  679. package/src/server/rsc-entry/rsc-stream.ts +85 -13
  680. package/src/server/rsc-entry/ssr-bridge.ts +18 -5
  681. package/src/server/rsc-entry/ssr-renderer.ts +193 -40
  682. package/src/server/rsc-entry/wrap-action-dispatch.ts +449 -0
  683. package/src/server/safe-load.ts +60 -0
  684. package/src/server/sensitive-fields.ts +230 -0
  685. package/src/server/sitemap-generator.ts +338 -0
  686. package/src/server/sitemap-handler.ts +126 -0
  687. package/src/server/slot-resolver.ts +228 -246
  688. package/src/server/ssr-bridge-types.ts +124 -0
  689. package/src/server/ssr-entry.ts +217 -78
  690. package/src/server/ssr-render.ts +344 -71
  691. package/src/server/ssr-wrappers.tsx +139 -0
  692. package/src/server/state-tree-diff.ts +30 -23
  693. package/src/server/status-code-resolver.ts +112 -128
  694. package/src/server/stream-utils.ts +213 -0
  695. package/src/server/tracing.ts +21 -10
  696. package/src/server/tree-builder.ts +202 -90
  697. package/src/server/tree-match.ts +210 -0
  698. package/src/server/types.ts +55 -6
  699. package/src/server/utils/escape-html.ts +20 -0
  700. package/src/server/version-skew.ts +104 -0
  701. package/src/shared/merge-search-params.ts +55 -0
  702. package/src/shims/font-google.ts +1 -1
  703. package/src/shims/font-local.ts +34 -0
  704. package/src/shims/headers.ts +5 -1
  705. package/src/shims/navigation-client.ts +4 -3
  706. package/src/shims/navigation.ts +14 -7
  707. package/src/utils/state-machine.ts +111 -0
  708. package/dist/_chunks/als-registry-B7DbZ2hS.js +0 -41
  709. package/dist/_chunks/als-registry-B7DbZ2hS.js.map +0 -1
  710. package/dist/_chunks/debug-gwlJkDuf.js +0 -108
  711. package/dist/_chunks/debug-gwlJkDuf.js.map +0 -1
  712. package/dist/_chunks/format-DviM89f0.js.map +0 -1
  713. package/dist/_chunks/interception-BOoWmLUA.js +0 -676
  714. package/dist/_chunks/interception-BOoWmLUA.js.map +0 -1
  715. package/dist/_chunks/metadata-routes-Cjmvi3rQ.js.map +0 -1
  716. package/dist/_chunks/request-context-DIkVh_jG.js +0 -330
  717. package/dist/_chunks/request-context-DIkVh_jG.js.map +0 -1
  718. package/dist/_chunks/ssr-data-MjmprTmO.js.map +0 -1
  719. package/dist/_chunks/tracing-CemImE6h.js +0 -187
  720. package/dist/_chunks/tracing-CemImE6h.js.map +0 -1
  721. package/dist/_chunks/use-cookie-DX-l1_5E.js +0 -91
  722. package/dist/_chunks/use-cookie-DX-l1_5E.js.map +0 -1
  723. package/dist/_chunks/use-query-states-D5KaffOK.js.map +0 -1
  724. package/dist/cache/register-cached-function.d.ts +0 -17
  725. package/dist/cache/register-cached-function.d.ts.map +0 -1
  726. package/dist/client/browser-entry.d.ts +0 -21
  727. package/dist/client/browser-entry.d.ts.map +0 -1
  728. package/dist/client/link-status-provider.d.ts +0 -11
  729. package/dist/client/link-status-provider.d.ts.map +0 -1
  730. package/dist/client/segment-merger.d.ts +0 -119
  731. package/dist/client/segment-merger.d.ts.map +0 -1
  732. package/dist/client/transition-root.d.ts.map +0 -1
  733. package/dist/client/use-navigation-pending.d.ts +0 -26
  734. package/dist/client/use-navigation-pending.d.ts.map +0 -1
  735. package/dist/client/use-params.d.ts.map +0 -1
  736. package/dist/plugins/cache-transform.d.ts +0 -36
  737. package/dist/plugins/cache-transform.d.ts.map +0 -1
  738. package/dist/plugins/dev-error-overlay.d.ts +0 -60
  739. package/dist/plugins/dev-error-overlay.d.ts.map +0 -1
  740. package/dist/plugins/dev-logs.d.ts.map +0 -1
  741. package/dist/plugins/dynamic-transform.d.ts +0 -72
  742. package/dist/plugins/dynamic-transform.d.ts.map +0 -1
  743. package/dist/plugins/server-action-exports.d.ts +0 -26
  744. package/dist/plugins/server-action-exports.d.ts.map +0 -1
  745. package/dist/routing/status-file-lint.d.ts +0 -33
  746. package/dist/routing/status-file-lint.d.ts.map +0 -1
  747. package/dist/search-params/analyze.d.ts +0 -54
  748. package/dist/search-params/analyze.d.ts.map +0 -1
  749. package/dist/search-params/builtin-codecs.d.ts +0 -105
  750. package/dist/search-params/builtin-codecs.d.ts.map +0 -1
  751. package/dist/search-params/codecs.d.ts +0 -53
  752. package/dist/search-params/codecs.d.ts.map +0 -1
  753. package/dist/search-params/create.d.ts +0 -106
  754. package/dist/search-params/create.d.ts.map +0 -1
  755. package/dist/server/dev-fetch-instrumentation.d.ts +0 -22
  756. package/dist/server/dev-fetch-instrumentation.d.ts.map +0 -1
  757. package/dist/server/dev-logger.d.ts.map +0 -1
  758. package/dist/server/dev-span-processor.d.ts.map +0 -1
  759. package/dist/server/dev-warnings.d.ts.map +0 -1
  760. package/dist/server/manifest-status-resolver.d.ts +0 -58
  761. package/dist/server/manifest-status-resolver.d.ts.map +0 -1
  762. package/dist/server/prerender.d.ts +0 -77
  763. package/dist/server/prerender.d.ts.map +0 -1
  764. package/dist/utils/directive-parser.d.ts +0 -70
  765. package/dist/utils/directive-parser.d.ts.map +0 -1
  766. package/src/cache/register-cached-function.ts +0 -103
  767. package/src/client/browser-entry.ts +0 -678
  768. package/src/client/link-status-provider.tsx +0 -30
  769. package/src/client/segment-merger.ts +0 -339
  770. package/src/client/transition-root.tsx +0 -166
  771. package/src/client/use-navigation-pending.ts +0 -38
  772. package/src/plugins/cache-transform.ts +0 -199
  773. package/src/plugins/dev-error-overlay.ts +0 -230
  774. package/src/plugins/dynamic-transform.ts +0 -161
  775. package/src/plugins/server-action-exports.ts +0 -220
  776. package/src/routing/status-file-lint.ts +0 -112
  777. package/src/search-params/analyze.ts +0 -192
  778. package/src/search-params/builtin-codecs.ts +0 -228
  779. package/src/search-params/create.ts +0 -321
  780. package/src/server/dev-fetch-instrumentation.ts +0 -96
  781. package/src/server/dev-span-processor.ts +0 -78
  782. package/src/server/manifest-status-resolver.ts +0 -215
  783. package/src/server/prerender.ts +0 -139
  784. package/src/utils/directive-parser.ts +0 -529
  785. /package/src/{server/dev-logger.ts → dev-tools/logger.ts} +0 -0
@@ -0,0 +1,206 @@
1
+ /**
2
+ * Segment param coercion — runs the matched route's `params.ts` codecs
3
+ * over the raw matcher output before middleware and rendering.
4
+ *
5
+ * Lifted out of `pipeline-phases.ts` (TIM-853) so the coercer can be
6
+ * imported directly by other entry points (the action-dispatch wrapper,
7
+ * the revalidation renderer in `rsc-entry/index.ts`) without pulling
8
+ * the entire pipeline phase module along with it.
9
+ *
10
+ * The function throws `ParamCoercionError` from `route-element-builder.ts`
11
+ * on any codec failure; the pipeline catches that and dispatches to the
12
+ * 404 page. See design/07-routing.md §"Where Coercion Runs".
13
+ */
14
+
15
+ import type { Codec } from '../codec.js';
16
+ import { toBracketKey } from '../params/resolve-schema.js';
17
+ import type { RouteMatch } from './pipeline.js';
18
+ import { sanitizeParamValue } from './pipeline-helpers.js';
19
+ import { loadModule } from './safe-load.js';
20
+ import { ParamCoercionError } from './route-element-builder.js';
21
+ import { isDebug } from './debug.js';
22
+
23
+ // ---------------------------------------------------------------------------
24
+ // Module-level global codec store (TIM-931)
25
+ // ---------------------------------------------------------------------------
26
+
27
+ /** Global schema codecs, set once at startup from virtual:timber-schema. */
28
+ let _globalCodecs: Record<string, Codec<unknown>> | null = null;
29
+
30
+ /**
31
+ * Register the global schema codecs. Called once from the RSC entry
32
+ * at server startup when app/schema.ts provides segment param codecs.
33
+ * @internal
34
+ */
35
+ export function setGlobalSchemaCodecs(codecs: Record<string, Codec<unknown>> | null): void {
36
+ _globalCodecs = codecs;
37
+ }
38
+
39
+ /**
40
+ * Coerce raw slot params through global schema codecs.
41
+ *
42
+ * Each slot segment that has a paramName is looked up in the global codec
43
+ * map by its bracket key (e.g. '[...year]' for catch-all). If a codec
44
+ * exists, the raw value is parsed through it. If no codec exists or no
45
+ * global codecs are registered, the raw value passes through unchanged.
46
+ *
47
+ * Unlike main route coercion, this does NOT throw ParamCoercionError on
48
+ * failure — slots degrade gracefully. A failed coercion logs a warning
49
+ * in dev mode and keeps the raw value.
50
+ *
51
+ * @internal — framework use only
52
+ */
53
+ export function coerceSlotParams(
54
+ slotChain: Array<{ segmentType: string; paramName?: string }>,
55
+ rawParams: Record<string, string | string[]>
56
+ ): Record<string, string | string[]> {
57
+ const globalCodecs = _globalCodecs;
58
+ if (!globalCodecs) return rawParams;
59
+
60
+ const result: Record<string, string | string[]> = Object.create(null);
61
+ for (const key of Object.keys(rawParams)) {
62
+ result[key] = rawParams[key];
63
+ }
64
+
65
+ for (const segment of slotChain) {
66
+ if (!segment.paramName) continue;
67
+ const bracketKey = toBracketKey(segment.segmentType, segment.paramName);
68
+ const codec = globalCodecs[bracketKey];
69
+ if (!codec) continue;
70
+
71
+ const key = segment.paramName;
72
+ if (!(key in result)) continue;
73
+
74
+ try {
75
+ result[key] = sanitizeParamValue(codec.parse(result[key] as string | string[])) as
76
+ | string
77
+ | string[];
78
+ } catch (err) {
79
+ // Slot param coercion failures are non-fatal — keep the raw value.
80
+ // The main route already validated the URL; the slot just interprets
81
+ // the same parts differently.
82
+ if (isDebug()) {
83
+ const message = err instanceof Error ? err.message : String(err);
84
+ console.warn(
85
+ `[timber] Slot param coercion failed for "${key}" (codec: ${bracketKey})\n` +
86
+ ` Error: ${message}\n` +
87
+ ` Raw value: ${JSON.stringify(result[key])}\n` +
88
+ ` Keeping raw value.`
89
+ );
90
+ }
91
+ }
92
+ }
93
+
94
+ return result as Record<string, string | string[]>;
95
+ }
96
+
97
+ /**
98
+ * Run segment param coercion on the matched route's segments.
99
+ *
100
+ * When `globalCodecs` is provided (from app/schema.ts), uses the global
101
+ * codec map keyed by bare param name. Otherwise falls back to loading
102
+ * per-segment params.ts modules.
103
+ *
104
+ * Throws ParamCoercionError if any codec fails (→ 404).
105
+ *
106
+ * This runs BEFORE middleware, so ctx.segmentParams is already typed.
107
+ * See design/07-routing.md §"Where Coercion Runs"
108
+ * See design/41-global-params.md §"Pipeline Integration"
109
+ */
110
+ export async function coerceSegmentParams(match: RouteMatch): Promise<void> {
111
+ const globalCodecs = _globalCodecs;
112
+ // Unconditionally install a null-prototype target so the invariant
113
+ // "match.segmentParams is null-prototype" holds from the first line,
114
+ // regardless of whether any segment has a codec.
115
+ const mergeTarget: Record<string, unknown> = Object.create(null);
116
+ for (const key of Object.keys(match.segmentParams)) {
117
+ if (key !== '__proto__') {
118
+ mergeTarget[key] = match.segmentParams[key as keyof typeof match.segmentParams];
119
+ }
120
+ }
121
+ match.segmentParams = mergeTarget as RouteMatch['segmentParams'];
122
+
123
+ // TIM-931/TIM-936: When a global schema is available, use it for coercion
124
+ // instead of per-segment params.ts files. The global codec map is keyed
125
+ // by bracket name (e.g. '[id]', '[...slug]') to avoid collisions between
126
+ // distinct segment types that share a param name.
127
+ if (globalCodecs) {
128
+ for (const segment of match.segments) {
129
+ if (!segment.paramName) continue;
130
+ const bracketKey = toBracketKey(segment.segmentType, segment.paramName);
131
+ const codec = globalCodecs[bracketKey];
132
+ if (!codec) continue; // no codec in schema → keep raw string
133
+
134
+ const key = segment.paramName;
135
+ try {
136
+ mergeTarget[key] = sanitizeParamValue(codec.parse(mergeTarget[key] as string | string[]));
137
+ } catch (err) {
138
+ const message = err instanceof Error ? err.message : String(err);
139
+ if (isDebug()) {
140
+ console.warn(
141
+ `[timber] Global schema codec rejected value for param "${key}"\n` +
142
+ ` Error: ${message}\n` +
143
+ ` Raw value: ${JSON.stringify(mergeTarget[key])}\n` +
144
+ ` Hint: check the codec in app/schema.ts for key '${bracketKey}'.`
145
+ );
146
+ }
147
+ throw new ParamCoercionError(message);
148
+ }
149
+ }
150
+ return;
151
+ }
152
+
153
+ // Legacy path: per-segment params.ts coercion
154
+ for (const segment of match.segments) {
155
+ // Only process segments that have a params.ts convention file
156
+ if (!segment.params) continue;
157
+
158
+ let mod: Record<string, unknown>;
159
+ try {
160
+ mod = await loadModule(segment.params);
161
+ } catch (err) {
162
+ const message = `Failed to load params module for segment "${segment.segmentName}": ${err instanceof Error ? err.message : String(err)}`;
163
+ if (isDebug()) {
164
+ console.warn(
165
+ `[timber] Param coercion error: ${message}\n` +
166
+ ` Segment: ${segment.segmentName}\n` +
167
+ ` Params file: ${segment.params}`
168
+ );
169
+ }
170
+ throw new ParamCoercionError(message);
171
+ }
172
+
173
+ const segmentParamsDef = mod.segmentParams as
174
+ | { parse(raw: Record<string, string | string[]>): Record<string, unknown> }
175
+ | undefined;
176
+
177
+ if (!segmentParamsDef || typeof segmentParamsDef.parse !== 'function') continue;
178
+
179
+ try {
180
+ const coerced = segmentParamsDef.parse(match.segmentParams);
181
+
182
+ // Deep-sanitize codec output: every nested plain object becomes
183
+ // null-prototype with dangerous keys stripped at every depth.
184
+ // See TIM-873, design/13-security.md
185
+ for (const key of Object.keys(coerced as Record<string, unknown>)) {
186
+ if (key !== '__proto__') {
187
+ mergeTarget[key] = sanitizeParamValue((coerced as Record<string, unknown>)[key]);
188
+ }
189
+ }
190
+ } catch (err) {
191
+ const message = err instanceof Error ? err.message : String(err);
192
+ if (isDebug()) {
193
+ const rawKeys = Object.keys(match.segmentParams).join(', ');
194
+ console.warn(
195
+ `[timber] Param codec rejected values for segment "${segment.segmentName}"\n` +
196
+ ` Error: ${message}\n` +
197
+ ` Available raw params: { ${rawKeys} }\n` +
198
+ ` Params file: ${segment.params}\n` +
199
+ ` Hint: this usually means a codec threw for the raw URL value.\n` +
200
+ ` Check that the regex/schema accepts the actual path segment string.`
201
+ );
202
+ }
203
+ throw new ParamCoercionError(message);
204
+ }
205
+ }
206
+ }
@@ -0,0 +1,204 @@
1
+ /**
2
+ * Pipeline helpers — small utility functions used by `pipeline.ts` and
3
+ * `pipeline-phases.ts`. Lifted out of `pipeline.ts` to keep that file
4
+ * focused on the request handler entry point.
5
+ *
6
+ * Each helper is intentionally a free function with no closure capture, so
7
+ * it can be unit-tested in isolation.
8
+ *
9
+ * See design/07-routing.md §"Request Lifecycle".
10
+ */
11
+
12
+ import type { ProxyExport } from './proxy.js';
13
+ import { getSetCookieHeaders } from './cookie-context.js';
14
+ import { callOnRequestError } from './instrumentation.js';
15
+ import { getTraceId } from './tracing.js';
16
+ import { RedirectSignal } from './primitives.js';
17
+ import type { ProxyConfig } from './pipeline.js';
18
+
19
+ // ─── Prototype-Pollution-Safe Sanitizer ────────────────────────────────────
20
+
21
+ /**
22
+ * Only __proto__ needs stripping — it has a language-level setter that
23
+ * changes the prototype chain of spread copies. constructor and prototype
24
+ * are harmless own properties on null-prototype objects.
25
+ */
26
+ const DANGEROUS_KEYS = new Set(['__proto__']);
27
+
28
+ /**
29
+ * Deep-walk a value returned by a segment param codec, producing a
30
+ * sanitized copy where every plain object is null-prototype and
31
+ * dangerous keys (__proto__, constructor, prototype) are stripped at
32
+ * every depth.
33
+ *
34
+ * Non-plain objects (Date, Map, class instances, etc.) are returned
35
+ * as-is — they cannot be poisoned by `{...x}` spread and may carry
36
+ * author-intended prototype methods.
37
+ *
38
+ * Arrays are walked element-wise.
39
+ *
40
+ * Performance: URL params are bounded by URL length (~8 KB). Realistic
41
+ * trees are <1 KB. The recursive walk is sub-microsecond.
42
+ *
43
+ * See TIM-655, TIM-855, TIM-873, design/13-security.md
44
+ */
45
+ export function sanitizeParamValue(value: unknown): unknown {
46
+ if (value === null || typeof value !== 'object') return value;
47
+
48
+ if (Array.isArray(value)) {
49
+ return value.map(sanitizeParamValue);
50
+ }
51
+
52
+ // Only walk plain objects — anything with a custom prototype (Date, Map,
53
+ // class instances) is left untouched.
54
+ const proto = Object.getPrototypeOf(value);
55
+ if (proto !== Object.prototype && proto !== null) return value;
56
+
57
+ const out: Record<string, unknown> = Object.create(null);
58
+ for (const key of Object.keys(value as Record<string, unknown>)) {
59
+ if (!DANGEROUS_KEYS.has(key)) {
60
+ out[key] = sanitizeParamValue((value as Record<string, unknown>)[key]);
61
+ }
62
+ }
63
+ return out;
64
+ }
65
+
66
+ // ─── Proxy Resolver ────────────────────────────────────────────────────────
67
+
68
+ /**
69
+ * Resolver closure produced once at pipeline construction. The lazy variant
70
+ * still calls `loader()` per-request (HMR relies on re-importing), but the
71
+ * choice of which branch to take is made once, not on every request.
72
+ */
73
+ export type ProxyResolver = () => ProxyExport | Promise<ProxyExport>;
74
+
75
+ /**
76
+ * Build a proxy resolver closure from the declared source. Called exactly
77
+ * once at `createPipeline` setup time, so the hot path sees only the branch
78
+ * that corresponds to this pipeline's configured variant.
79
+ *
80
+ * Returns `null` when the app has no proxy.ts — the hot path short-circuits
81
+ * around `runProxyPhase` entirely in that case.
82
+ *
83
+ * Accepts the sugar form (a bare `ProxyExport` — function or function array)
84
+ * and normalises it to the static variant. Functions and arrays are
85
+ * structurally distinct from the tagged `{ kind: 'lazy', loader }` object,
86
+ * so discrimination is unambiguous.
87
+ */
88
+ export function makeProxyResolver(
89
+ proxy: ProxyConfig | ProxyExport | undefined
90
+ ): ProxyResolver | null {
91
+ if (proxy === undefined) return null;
92
+ // Sugar: a bare ProxyExport (function or function array) — treat as static.
93
+ if (typeof proxy === 'function' || Array.isArray(proxy)) {
94
+ const exp = proxy;
95
+ return () => exp;
96
+ }
97
+ if (proxy.kind === 'static') {
98
+ const exp = proxy.export;
99
+ return () => exp;
100
+ }
101
+ const loader = proxy.loader;
102
+ return async () => (await loader()).default;
103
+ }
104
+
105
+ // ─── Cookie / Header Helpers ───────────────────────────────────────────────
106
+
107
+ /**
108
+ * Apply all Set-Cookie headers from the cookie jar to a Headers object.
109
+ * Each cookie gets its own Set-Cookie header per RFC 6265 §4.1.
110
+ */
111
+ export function applyCookieJar(headers: Headers): void {
112
+ for (const value of getSetCookieHeaders()) {
113
+ headers.append('Set-Cookie', value);
114
+ }
115
+ }
116
+
117
+ /**
118
+ * Merge framework-managed response headers onto a terminal response without
119
+ * overwriting headers the terminal response already set itself.
120
+ */
121
+ export function mergeMissingHeaders(target: Headers, source: Headers): void {
122
+ const existingKeys = new Set([...target.keys()].map((key) => key.toLowerCase()));
123
+ for (const [key, value] of source.entries()) {
124
+ if (!existingKeys.has(key.toLowerCase())) {
125
+ target.append(key, value);
126
+ }
127
+ }
128
+ }
129
+
130
+ // ─── Mutable Response Cloning ──────────────────────────────────────────────
131
+
132
+ /**
133
+ * Clone a Response into a fresh one whose header bag is guaranteed mutable.
134
+ *
135
+ * `Response.redirect()` and some platform-level passthrough responses (notably
136
+ * on Cloudflare Workers) return objects with frozen header bags. Calling
137
+ * `.set()` or `.append()` on them throws `TypeError: immutable`, which the
138
+ * pipeline can hit when it appends Set-Cookie or Server-Timing entries.
139
+ *
140
+ * The pipeline calls this at the producer sites where user-controlled
141
+ * responses enter the framework — `outcomeToResponse` for all phase outcomes,
142
+ * and `handleRequest` for metadata-route and auto-sitemap user handlers — so
143
+ * downstream code can write headers without runtime feature-detection.
144
+ *
145
+ * The clone is unconditional. This is a deliberate trade: we avoid a
146
+ * try/catch + thrown `TypeError` on every request (the previous probe-based
147
+ * approach paid that cost on the hot path) and accept one cheap Response
148
+ * rewrap at the framework boundary instead.
149
+ */
150
+ export function cloneWithMutableHeaders(response: Response): Response {
151
+ return new Response(response.body, {
152
+ status: response.status,
153
+ statusText: response.statusText,
154
+ headers: new Headers(response.headers),
155
+ });
156
+ }
157
+
158
+ // ─── Redirect Builder ──────────────────────────────────────────────────────
159
+
160
+ /**
161
+ * Build a redirect Response from a RedirectSignal.
162
+ *
163
+ * For RSC payload requests (client navigation), returns 204 + X-Timber-Redirect
164
+ * so the client router can perform a soft SPA redirect. A raw 302 would be
165
+ * turned into an opaque redirect by fetch({redirect:'manual'}), crashing
166
+ * createFromFetch. See design/19-client-navigation.md.
167
+ */
168
+ export function buildRedirectResponse(
169
+ signal: RedirectSignal,
170
+ req: Request,
171
+ headers: Headers
172
+ ): Response {
173
+ const isRsc = (req.headers.get('Accept') ?? '').includes('text/x-component');
174
+ if (isRsc) {
175
+ headers.set('X-Timber-Redirect', signal.location);
176
+ return new Response(null, { status: 204, headers });
177
+ }
178
+ headers.set('Location', signal.location);
179
+ return new Response(null, { status: signal.status, headers });
180
+ }
181
+
182
+ // ─── Instrumentation ───────────────────────────────────────────────────────
183
+
184
+ /**
185
+ * Fire the user's onRequestError hook with request context.
186
+ * Extracts request info from the Request object and calls the instrumentation hook.
187
+ */
188
+ export async function fireOnRequestError(
189
+ error: unknown,
190
+ req: Request,
191
+ phase: 'proxy' | 'handler' | 'render' | 'action' | 'route'
192
+ ): Promise<void> {
193
+ const url = new URL(req.url);
194
+ const headersObj: Record<string, string> = {};
195
+ req.headers.forEach((v, k) => {
196
+ headersObj[k] = v;
197
+ });
198
+
199
+ await callOnRequestError(
200
+ error,
201
+ { method: req.method, path: url.pathname, headers: headersObj },
202
+ { phase, routePath: url.pathname, routeType: 'page', traceId: getTraceId() }
203
+ );
204
+ }
@@ -9,6 +9,8 @@
9
9
  * See design/07-routing.md §"Intercepting Routes"
10
10
  */
11
11
 
12
+ import { classifyUrlSegment } from '../routing/segment-classify.js';
13
+
12
14
  /** Result of a successful interception match. */
13
15
  export interface InterceptionMatchResult {
14
16
  /** The pathname to re-match (the source/intercepting route's parent). */
@@ -26,7 +28,7 @@ export interface InterceptionMatchResult {
26
28
  export function findInterceptionMatch(
27
29
  targetPathname: string,
28
30
  sourceUrl: string,
29
- rewrites: import('#/routing/interception.js').InterceptionRewrite[]
31
+ rewrites: import('../routing/interception.js').InterceptionRewrite[]
30
32
  ): InterceptionMatchResult | null {
31
33
  for (const rewrite of rewrites) {
32
34
  // Check if the source URL starts with the intercepting prefix
@@ -53,23 +55,22 @@ export function pathnameMatchesPattern(pathname: string, pattern: string): boole
53
55
 
54
56
  let pi = 0;
55
57
  for (let i = 0; i < patternParts.length; i++) {
56
- const segment = patternParts[i];
57
-
58
- // Catch-all: [...param] or [[...param]] — matches rest of URL
59
- if (segment.startsWith('[...') || segment.startsWith('[[...')) {
60
- return pi < pathParts.length || segment.startsWith('[[...');
61
- }
58
+ const seg = classifyUrlSegment(patternParts[i]);
62
59
 
63
- // Dynamic: [param] — matches any single segment
64
- if (segment.startsWith('[') && segment.endsWith(']')) {
65
- if (pi >= pathParts.length) return false;
66
- pi++;
67
- continue;
60
+ switch (seg.kind) {
61
+ case 'catch-all':
62
+ return pi < pathParts.length;
63
+ case 'optional-catch-all':
64
+ return true;
65
+ case 'dynamic':
66
+ if (pi >= pathParts.length) return false;
67
+ pi++;
68
+ continue;
69
+ case 'static':
70
+ if (pi >= pathParts.length || pathParts[pi] !== seg.value) return false;
71
+ pi++;
72
+ continue;
68
73
  }
69
-
70
- // Static — must match exactly
71
- if (pi >= pathParts.length || pathParts[pi] !== segment) return false;
72
- pi++;
73
74
  }
74
75
 
75
76
  return pi === pathParts.length;
@@ -79,6 +79,19 @@ export function serializeSitemap(
79
79
  return `<?xml version="1.0" encoding="UTF-8"?>\n<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">\n${urls}\n</urlset>`;
80
80
  }
81
81
 
82
+ /**
83
+ * Serialize a sitemap index (list of sub-sitemap URLs) to XML.
84
+ * Used for pagination when the total URL count exceeds 50,000.
85
+ * Follows the sitemap.org protocol: https://www.sitemaps.org/protocol.html
86
+ */
87
+ export function serializeSitemapIndex(sitemapUrls: string[]): string {
88
+ const sitemaps = sitemapUrls
89
+ .map((url) => ` <sitemap>\n <loc>${escapeXml(url)}</loc>\n </sitemap>`)
90
+ .join('\n');
91
+
92
+ return `<?xml version="1.0" encoding="UTF-8"?>\n<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">\n${sitemaps}\n</sitemapindex>`;
93
+ }
94
+
82
95
  /** Escape special XML characters. */
83
96
  export function escapeXml(str: string): string {
84
97
  return str
@@ -0,0 +1,197 @@
1
+ /**
2
+ * Pipeline outcome translator — converts a `PhaseOutcome` (the value
3
+ * each phase function returns) into a final `Response`.
4
+ *
5
+ * Lifted out of `pipeline-phases.ts` (TIM-853) so the per-phase try /
6
+ * catch logic and the terminal Response-building logic each live in
7
+ * their own file. The phases produce values; this module is the single
8
+ * source of truth for how those values become wire responses.
9
+ *
10
+ * See design/07-routing.md §"Request Lifecycle".
11
+ */
12
+
13
+ import {
14
+ applyCookieJar,
15
+ buildRedirectResponse,
16
+ cloneWithMutableHeaders,
17
+ fireOnRequestError,
18
+ mergeMissingHeaders,
19
+ } from './pipeline-helpers.js';
20
+ import {
21
+ logProxyError,
22
+ logMiddlewareError,
23
+ logMiddlewareShortCircuit,
24
+ logRenderError,
25
+ } from './logger.js';
26
+ import { markResponseFlushed } from './request-context.js';
27
+ import { RedirectSignal, DenySignal } from './primitives.js';
28
+ import { isDebug } from './debug.js';
29
+ import type { PipelineConfig, RouteMatch } from './pipeline.js';
30
+
31
+ // ─── Helpers ───────────────────────────────────────────────────────────────
32
+
33
+ function rscErrorResponse(isRsc: boolean, status: number, headers?: Headers): Response {
34
+ if (!isRsc) return new Response(null, { status });
35
+ const h = headers ?? new Headers();
36
+ h.set('X-Timber-Error', '1');
37
+ h.set('content-type', 'application/json; charset=utf-8');
38
+ return new Response(JSON.stringify({ error: true, status }), { status, headers: h });
39
+ }
40
+
41
+ // ─── Phase Outcome ─────────────────────────────────────────────────────────
42
+
43
+ export type PhaseName = 'proxy' | 'middleware' | 'render';
44
+
45
+ export type PhaseOutcome =
46
+ | { kind: 'response'; phase: PhaseName; response: Response }
47
+ | { kind: 'redirect'; phase: PhaseName; signal: RedirectSignal }
48
+ | { kind: 'deny'; phase: PhaseName; signal: DenySignal }
49
+ | { kind: 'error'; phase: PhaseName; error: unknown };
50
+
51
+ export interface OutcomeContext {
52
+ req: Request;
53
+ method: string;
54
+ path: string;
55
+ responseHeaders?: Headers;
56
+ match?: RouteMatch;
57
+ }
58
+
59
+ // ─── Translator ────────────────────────────────────────────────────────────
60
+
61
+ /**
62
+ * Terminal outcome handler — converts a `PhaseOutcome` into a final
63
+ * `Response`, applying cookies, building redirects, rendering deny pages
64
+ * and fallback error pages, and firing instrumentation hooks.
65
+ *
66
+ * This is the single source of truth for how phase outputs become wire
67
+ * responses; the per-phase try/catch blocks now produce values, not
68
+ * Responses, so the conversion logic lives in exactly one place.
69
+ */
70
+ export async function outcomeToResponse(
71
+ config: PipelineConfig,
72
+ outcome: PhaseOutcome,
73
+ ctx: OutcomeContext
74
+ ): Promise<Response> {
75
+ switch (outcome.kind) {
76
+ case 'response': {
77
+ // Clone unconditionally so downstream code (cookie/header merge,
78
+ // Server-Timing in createPipeline) can write headers without paying
79
+ // for a try/catch immutability probe per request. User middleware,
80
+ // proxy, and route code may all return `Response.redirect()` or
81
+ // platform-level responses with frozen header bags. See TIM-866.
82
+ const finalResponse = cloneWithMutableHeaders(outcome.response);
83
+
84
+ if (outcome.phase === 'proxy') return finalResponse;
85
+
86
+ if (outcome.phase === 'middleware' && ctx.responseHeaders) {
87
+ applyCookieJar(finalResponse.headers);
88
+ mergeMissingHeaders(finalResponse.headers, ctx.responseHeaders);
89
+ logMiddlewareShortCircuit({
90
+ method: ctx.method,
91
+ path: ctx.path,
92
+ status: finalResponse.status,
93
+ });
94
+ }
95
+
96
+ if (outcome.phase === 'render') {
97
+ markResponseFlushed();
98
+ }
99
+
100
+ return finalResponse;
101
+ }
102
+
103
+ case 'redirect': {
104
+ const headers = ctx.responseHeaders ?? new Headers();
105
+ applyCookieJar(headers);
106
+ return buildRedirectResponse(outcome.signal, ctx.req, headers);
107
+ }
108
+
109
+ case 'deny': {
110
+ const headers = ctx.responseHeaders ?? new Headers();
111
+ applyCookieJar(headers);
112
+ if (config.renderDenyFallback) {
113
+ try {
114
+ // Clone user-supplied deny-page responses so downstream
115
+ // Server-Timing writes are safe against frozen header bags
116
+ // (e.g. user returned Response.redirect from the hook).
117
+ return cloneWithMutableHeaders(
118
+ await config.renderDenyFallback(outcome.signal, ctx.req, headers, ctx.match)
119
+ );
120
+ } catch (denyRenderError) {
121
+ // Deny page rendering failed — log before falling through to bare response.
122
+ // Without this, a crashing deny page produces a blank response with zero
123
+ // server-side signal. See TIM-876.
124
+ logRenderError({ method: ctx.method, path: ctx.path, error: denyRenderError });
125
+ await fireOnRequestError(denyRenderError, ctx.req, 'render');
126
+ if (config.onPipelineError && denyRenderError instanceof Error)
127
+ config.onPipelineError(denyRenderError, 'render');
128
+ }
129
+ }
130
+ if (isDebug()) {
131
+ console.warn(
132
+ `[timber] DenySignal(${outcome.signal.status}) from ${outcome.phase} phase — ` +
133
+ `no renderDenyFallback configured, returning bare ${outcome.signal.status} response\n` +
134
+ ` Request: ${ctx.method} ${ctx.path}\n` +
135
+ ` Add a not-found.tsx or error.tsx to render a custom deny page.`
136
+ );
137
+ }
138
+ return new Response(null, { status: outcome.signal.status, headers });
139
+ }
140
+
141
+ case 'error': {
142
+ // RSC payload requests (client navigation) expect Flight data, not HTML.
143
+ // Signal the error via X-Timber-Error so the client hard-navigates
144
+ // to the server-rendered error page instead of feeding HTML to the
145
+ // Flight decoder (which crashes with "enqueueModel is not a function").
146
+ const isRsc = (ctx.req.headers.get('Accept') ?? '').includes('text/x-component');
147
+
148
+ if (outcome.phase === 'proxy') {
149
+ logProxyError({ error: outcome.error });
150
+ await fireOnRequestError(outcome.error, ctx.req, 'proxy');
151
+ if (config.onPipelineError && outcome.error instanceof Error)
152
+ config.onPipelineError(outcome.error, 'proxy');
153
+ return rscErrorResponse(isRsc, 500);
154
+ }
155
+
156
+ if (outcome.phase === 'middleware') {
157
+ logMiddlewareError({ method: ctx.method, path: ctx.path, error: outcome.error });
158
+ await fireOnRequestError(outcome.error, ctx.req, 'handler');
159
+ if (config.onPipelineError && outcome.error instanceof Error) {
160
+ config.onPipelineError(outcome.error, 'middleware');
161
+ }
162
+ return rscErrorResponse(isRsc, 500);
163
+ }
164
+
165
+ const headers = ctx.responseHeaders ?? new Headers();
166
+ applyCookieJar(headers);
167
+ logRenderError({ method: ctx.method, path: ctx.path, error: outcome.error });
168
+ await fireOnRequestError(outcome.error, ctx.req, 'render');
169
+ if (config.onPipelineError && outcome.error instanceof Error)
170
+ config.onPipelineError(outcome.error, 'render');
171
+
172
+ if (isRsc) {
173
+ return rscErrorResponse(true, 500, headers);
174
+ }
175
+
176
+ if (config.renderFallbackError) {
177
+ try {
178
+ // Clone user-supplied fallback error responses so downstream
179
+ // Server-Timing writes are safe against frozen header bags.
180
+ return cloneWithMutableHeaders(
181
+ await config.renderFallbackError(outcome.error, ctx.req, headers)
182
+ );
183
+ } catch (fallbackRenderError) {
184
+ // Fallback rendering itself failed — log the secondary error before
185
+ // falling through to bare 500. The original render error was already
186
+ // logged above; this captures the fallback renderer's own crash so it
187
+ // doesn't vanish silently. See TIM-876.
188
+ logRenderError({ method: ctx.method, path: ctx.path, error: fallbackRenderError });
189
+ await fireOnRequestError(fallbackRenderError, ctx.req, 'render');
190
+ if (config.onPipelineError && fallbackRenderError instanceof Error)
191
+ config.onPipelineError(fallbackRenderError, 'render');
192
+ }
193
+ }
194
+ return new Response(null, { status: 500 });
195
+ }
196
+ }
197
+ }