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

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 (784) hide show
  1. package/dist/_chunks/actions-BNhpxrnV.js +1104 -0
  2. package/dist/_chunks/actions-BNhpxrnV.js.map +1 -0
  3. package/dist/_chunks/build-output-helper-K7oUCRqU.js +102 -0
  4. package/dist/_chunks/build-output-helper-K7oUCRqU.js.map +1 -0
  5. package/dist/_chunks/cli-schema-sync-CObqjGWF.js +2 -0
  6. package/dist/_chunks/cli-schema-sync-q-Ce6-iG.js +785 -0
  7. package/dist/_chunks/cli-schema-sync-q-Ce6-iG.js.map +1 -0
  8. package/dist/_chunks/codec-registry-DqkeAydt.js +21 -0
  9. package/dist/_chunks/codec-registry-DqkeAydt.js.map +1 -0
  10. package/dist/_chunks/define-DMq-Yjp7.js +112 -0
  11. package/dist/_chunks/define-DMq-Yjp7.js.map +1 -0
  12. package/dist/_chunks/define-jeHDXZGq.js +195 -0
  13. package/dist/_chunks/define-jeHDXZGq.js.map +1 -0
  14. package/dist/_chunks/format-BjN9HLu9.js +14 -0
  15. package/dist/_chunks/format-BjN9HLu9.js.map +1 -0
  16. package/dist/_chunks/handler-store-bIAstrxQ.js +54 -0
  17. package/dist/_chunks/handler-store-bIAstrxQ.js.map +1 -0
  18. package/dist/_chunks/logger-CMd9P1xQ.js +291 -0
  19. package/dist/_chunks/logger-CMd9P1xQ.js.map +1 -0
  20. package/dist/_chunks/merge-search-params-Cm1j99HC.js +41 -0
  21. package/dist/_chunks/merge-search-params-Cm1j99HC.js.map +1 -0
  22. package/dist/_chunks/{metadata-routes-Cjmvi3rQ.js → metadata-routes-DESG8uk5.js} +32 -19
  23. package/dist/_chunks/metadata-routes-DESG8uk5.js.map +1 -0
  24. package/dist/_chunks/navigation-root-B5-RmsPi.js +103 -0
  25. package/dist/_chunks/navigation-root-B5-RmsPi.js.map +1 -0
  26. package/dist/_chunks/registry-BI9cgCt7.js +20 -0
  27. package/dist/_chunks/registry-BI9cgCt7.js.map +1 -0
  28. package/dist/_chunks/resolve-schema-DU2nbVOi.js +77 -0
  29. package/dist/_chunks/resolve-schema-DU2nbVOi.js.map +1 -0
  30. package/dist/_chunks/router-ref-B2-2kIIC.js +28 -0
  31. package/dist/_chunks/router-ref-B2-2kIIC.js.map +1 -0
  32. package/dist/_chunks/schema-bridge-o0SwFtXW.js +86 -0
  33. package/dist/_chunks/schema-bridge-o0SwFtXW.js.map +1 -0
  34. package/dist/_chunks/segment-classify-BjfuctV2.js +137 -0
  35. package/dist/_chunks/segment-classify-BjfuctV2.js.map +1 -0
  36. package/dist/_chunks/segment-context-Bg0pFbLT.js +34 -0
  37. package/dist/_chunks/segment-context-Bg0pFbLT.js.map +1 -0
  38. package/dist/_chunks/{ssr-data-MjmprTmO.js → ssr-data-DVX8S7vj.js} +1 -1
  39. package/dist/_chunks/ssr-data-DVX8S7vj.js.map +1 -0
  40. package/dist/_chunks/stale-reload-CCqb62Z3.js +84 -0
  41. package/dist/_chunks/stale-reload-CCqb62Z3.js.map +1 -0
  42. package/dist/_chunks/tracing-DP5djRq5.js +358 -0
  43. package/dist/_chunks/tracing-DP5djRq5.js.map +1 -0
  44. package/dist/_chunks/{use-query-states-D5KaffOK.js → use-query-states-C9G6LP0F.js} +7 -20
  45. package/dist/_chunks/use-query-states-C9G6LP0F.js.map +1 -0
  46. package/dist/_chunks/use-segment-params-CIeinIx2.js +151 -0
  47. package/dist/_chunks/use-segment-params-CIeinIx2.js.map +1 -0
  48. package/dist/_chunks/validation-AfEFM5ze.js +84 -0
  49. package/dist/_chunks/validation-AfEFM5ze.js.map +1 -0
  50. package/dist/_chunks/walkers-BbEu2_Pp.js +724 -0
  51. package/dist/_chunks/walkers-BbEu2_Pp.js.map +1 -0
  52. package/dist/_chunks/{format-DviM89f0.js → warnings-CAzunaGo.js} +6 -45
  53. package/dist/_chunks/warnings-CAzunaGo.js.map +1 -0
  54. package/dist/adapters/build-output-helper.d.ts +28 -0
  55. package/dist/adapters/build-output-helper.d.ts.map +1 -0
  56. package/dist/adapters/cloudflare-dev.d.ts +109 -0
  57. package/dist/adapters/cloudflare-dev.d.ts.map +1 -0
  58. package/dist/adapters/cloudflare-dev.js +73 -0
  59. package/dist/adapters/cloudflare-dev.js.map +1 -0
  60. package/dist/adapters/cloudflare-kv-cache.d.ts +64 -0
  61. package/dist/adapters/cloudflare-kv-cache.d.ts.map +1 -0
  62. package/dist/adapters/cloudflare-kv-cache.js +95 -0
  63. package/dist/adapters/cloudflare-kv-cache.js.map +1 -0
  64. package/dist/adapters/cloudflare.d.ts +148 -12
  65. package/dist/adapters/cloudflare.d.ts.map +1 -1
  66. package/dist/adapters/cloudflare.js +142 -38
  67. package/dist/adapters/cloudflare.js.map +1 -1
  68. package/dist/adapters/compress-module.d.ts.map +1 -1
  69. package/dist/adapters/nitro.d.ts +17 -1
  70. package/dist/adapters/nitro.d.ts.map +1 -1
  71. package/dist/adapters/nitro.js +143 -45
  72. package/dist/adapters/nitro.js.map +1 -1
  73. package/dist/adapters/shared.d.ts +16 -0
  74. package/dist/adapters/shared.d.ts.map +1 -0
  75. package/dist/cache/cache-api.d.ts +24 -0
  76. package/dist/cache/cache-api.d.ts.map +1 -0
  77. package/dist/cache/handler-store.d.ts +31 -0
  78. package/dist/cache/handler-store.d.ts.map +1 -0
  79. package/dist/cache/index.d.ts +23 -7
  80. package/dist/cache/index.d.ts.map +1 -1
  81. package/dist/cache/index.js +151 -81
  82. package/dist/cache/index.js.map +1 -1
  83. package/dist/cache/singleflight.d.ts +18 -1
  84. package/dist/cache/singleflight.d.ts.map +1 -1
  85. package/dist/cache/sizeof.d.ts +22 -0
  86. package/dist/cache/sizeof.d.ts.map +1 -0
  87. package/dist/cache/timber-cache.d.ts +1 -1
  88. package/dist/cache/timber-cache.d.ts.map +1 -1
  89. package/dist/cli-schema-sync.d.ts +39 -0
  90. package/dist/cli-schema-sync.d.ts.map +1 -0
  91. package/dist/cli.d.ts +14 -2
  92. package/dist/cli.d.ts.map +1 -1
  93. package/dist/cli.js +48 -6
  94. package/dist/cli.js.map +1 -1
  95. package/dist/client/browser-dev.d.ts +34 -1
  96. package/dist/client/browser-dev.d.ts.map +1 -1
  97. package/dist/client/browser-entry/action-dispatch.d.ts +17 -0
  98. package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -0
  99. package/dist/client/browser-entry/hmr.d.ts +21 -0
  100. package/dist/client/browser-entry/hmr.d.ts.map +1 -0
  101. package/dist/client/browser-entry/hydrate.d.ts +46 -0
  102. package/dist/client/browser-entry/hydrate.d.ts.map +1 -0
  103. package/dist/client/browser-entry/index.d.ts +30 -0
  104. package/dist/client/browser-entry/index.d.ts.map +1 -0
  105. package/dist/client/browser-entry/post-hydration.d.ts +26 -0
  106. package/dist/client/browser-entry/post-hydration.d.ts.map +1 -0
  107. package/dist/client/browser-entry/router-init.d.ts +26 -0
  108. package/dist/client/browser-entry/router-init.d.ts.map +1 -0
  109. package/dist/client/browser-entry/rsc-stream.d.ts +24 -0
  110. package/dist/client/browser-entry/rsc-stream.d.ts.map +1 -0
  111. package/dist/client/browser-entry/scroll.d.ts +19 -0
  112. package/dist/client/browser-entry/scroll.d.ts.map +1 -0
  113. package/dist/client/error-boundary.d.ts +12 -5
  114. package/dist/client/error-boundary.d.ts.map +1 -1
  115. package/dist/client/error-boundary.js +29 -6
  116. package/dist/client/error-boundary.js.map +1 -1
  117. package/dist/client/error-reconstituter.d.ts +54 -0
  118. package/dist/client/error-reconstituter.d.ts.map +1 -0
  119. package/dist/client/form.d.ts +16 -27
  120. package/dist/client/form.d.ts.map +1 -1
  121. package/dist/client/history.d.ts +19 -4
  122. package/dist/client/history.d.ts.map +1 -1
  123. package/dist/client/index.d.ts +10 -24
  124. package/dist/client/index.d.ts.map +1 -1
  125. package/dist/client/index.js +180 -1119
  126. package/dist/client/index.js.map +1 -1
  127. package/dist/client/internal.d.ts +19 -0
  128. package/dist/client/internal.d.ts.map +1 -0
  129. package/dist/client/internal.js +845 -0
  130. package/dist/client/internal.js.map +1 -0
  131. package/dist/client/link-pending-store.d.ts +65 -0
  132. package/dist/client/link-pending-store.d.ts.map +1 -0
  133. package/dist/client/link.d.ts +67 -56
  134. package/dist/client/link.d.ts.map +1 -1
  135. package/dist/client/nav-link-store.d.ts +27 -0
  136. package/dist/client/nav-link-store.d.ts.map +1 -0
  137. package/dist/client/navigation-api-types.d.ts +90 -0
  138. package/dist/client/navigation-api-types.d.ts.map +1 -0
  139. package/dist/client/navigation-api.d.ts +115 -0
  140. package/dist/client/navigation-api.d.ts.map +1 -0
  141. package/dist/client/navigation-context.d.ts +14 -2
  142. package/dist/client/navigation-context.d.ts.map +1 -1
  143. package/dist/client/{transition-root.d.ts → navigation-root.d.ts} +46 -9
  144. package/dist/client/navigation-root.d.ts.map +1 -0
  145. package/dist/client/nuqs-adapter.d.ts.map +1 -1
  146. package/dist/client/router-ref.d.ts +1 -1
  147. package/dist/client/router.d.ts +79 -10
  148. package/dist/client/router.d.ts.map +1 -1
  149. package/dist/client/rsc-fetch.d.ts +46 -3
  150. package/dist/client/rsc-fetch.d.ts.map +1 -1
  151. package/dist/client/segment-cache.d.ts +3 -1
  152. package/dist/client/segment-cache.d.ts.map +1 -1
  153. package/dist/client/segment-outlet.d.ts +49 -0
  154. package/dist/client/segment-outlet.d.ts.map +1 -0
  155. package/dist/client/segment-update-context.d.ts +21 -0
  156. package/dist/client/segment-update-context.d.ts.map +1 -0
  157. package/dist/client/shallow-url.d.ts +10 -0
  158. package/dist/client/shallow-url.d.ts.map +1 -0
  159. package/dist/client/ssr-data.d.ts +13 -4
  160. package/dist/client/ssr-data.d.ts.map +1 -1
  161. package/dist/client/stale-reload.d.ts +15 -0
  162. package/dist/client/stale-reload.d.ts.map +1 -1
  163. package/dist/client/state.d.ts +1 -1
  164. package/dist/client/top-loader.d.ts +5 -5
  165. package/dist/client/top-loader.d.ts.map +1 -1
  166. package/dist/client/use-cookie.d.ts +12 -0
  167. package/dist/client/use-cookie.d.ts.map +1 -1
  168. package/dist/client/use-link-status.d.ts +5 -5
  169. package/dist/client/use-link-status.d.ts.map +1 -1
  170. package/dist/client/use-pending-navigation.d.ts +23 -0
  171. package/dist/client/use-pending-navigation.d.ts.map +1 -0
  172. package/dist/client/use-query-states.d.ts +1 -1
  173. package/dist/client/use-query-states.d.ts.map +1 -1
  174. package/dist/client/use-router.d.ts +1 -1
  175. package/dist/client/use-search-params.d.ts +7 -5
  176. package/dist/client/use-search-params.d.ts.map +1 -1
  177. package/dist/client/{use-params.d.ts → use-segment-params.d.ts} +8 -6
  178. package/dist/client/use-segment-params.d.ts.map +1 -0
  179. package/dist/codec.d.ts +69 -0
  180. package/dist/codec.d.ts.map +1 -0
  181. package/dist/codec.js +75 -0
  182. package/dist/codec.js.map +1 -0
  183. package/dist/config-types.d.ts +294 -0
  184. package/dist/config-types.d.ts.map +1 -0
  185. package/dist/config-validation.d.ts +51 -0
  186. package/dist/config-validation.d.ts.map +1 -0
  187. package/dist/content/index.d.ts +1 -10
  188. package/dist/content/index.d.ts.map +1 -1
  189. package/dist/content/index.js +0 -2
  190. package/dist/cookies/define-cookie.d.ts +58 -25
  191. package/dist/cookies/define-cookie.d.ts.map +1 -1
  192. package/dist/cookies/index.d.ts +2 -1
  193. package/dist/cookies/index.d.ts.map +1 -1
  194. package/dist/cookies/index.js +251 -36
  195. package/dist/cookies/index.js.map +1 -1
  196. package/dist/cookies/json-cookie.d.ts +64 -0
  197. package/dist/cookies/json-cookie.d.ts.map +1 -0
  198. package/dist/cookies/validation.d.ts +46 -0
  199. package/dist/cookies/validation.d.ts.map +1 -0
  200. package/dist/dev-tools/404-page.d.ts +46 -0
  201. package/dist/dev-tools/404-page.d.ts.map +1 -0
  202. package/dist/dev-tools/browser-logs.d.ts +84 -0
  203. package/dist/dev-tools/browser-logs.d.ts.map +1 -0
  204. package/dist/dev-tools/error-page.d.ts +58 -0
  205. package/dist/dev-tools/error-page.d.ts.map +1 -0
  206. package/dist/dev-tools/holding-server.d.ts +54 -0
  207. package/dist/dev-tools/holding-server.d.ts.map +1 -0
  208. package/dist/dev-tools/index.d.ts +31 -0
  209. package/dist/dev-tools/index.d.ts.map +1 -0
  210. package/dist/{server/dev-span-processor.d.ts → dev-tools/instrumentation.d.ts} +26 -6
  211. package/dist/dev-tools/instrumentation.d.ts.map +1 -0
  212. package/dist/{server/dev-logger.d.ts → dev-tools/logger.d.ts} +1 -1
  213. package/dist/dev-tools/logger.d.ts.map +1 -0
  214. package/dist/{plugins/dev-logs.d.ts → dev-tools/logs.d.ts} +2 -2
  215. package/dist/dev-tools/logs.d.ts.map +1 -0
  216. package/dist/dev-tools/overlay.d.ts +91 -0
  217. package/dist/dev-tools/overlay.d.ts.map +1 -0
  218. package/dist/dev-tools/stack-classifier.d.ts +34 -0
  219. package/dist/dev-tools/stack-classifier.d.ts.map +1 -0
  220. package/dist/dev-tools/terminal.d.ts +28 -0
  221. package/dist/dev-tools/terminal.d.ts.map +1 -0
  222. package/dist/{server/dev-warnings.d.ts → dev-tools/warnings.d.ts} +2 -22
  223. package/dist/dev-tools/warnings.d.ts.map +1 -0
  224. package/dist/fonts/ast.d.ts +98 -6
  225. package/dist/fonts/ast.d.ts.map +1 -1
  226. package/dist/fonts/bundle.d.ts +48 -0
  227. package/dist/fonts/bundle.d.ts.map +1 -0
  228. package/dist/fonts/dev-middleware.d.ts +22 -0
  229. package/dist/fonts/dev-middleware.d.ts.map +1 -0
  230. package/dist/fonts/local.d.ts +1 -1
  231. package/dist/fonts/pipeline.d.ts +167 -0
  232. package/dist/fonts/pipeline.d.ts.map +1 -0
  233. package/dist/fonts/transform.d.ts +78 -0
  234. package/dist/fonts/transform.d.ts.map +1 -0
  235. package/dist/fonts/types.d.ts +45 -1
  236. package/dist/fonts/types.d.ts.map +1 -1
  237. package/dist/fonts/virtual-modules.d.ts +94 -0
  238. package/dist/fonts/virtual-modules.d.ts.map +1 -0
  239. package/dist/index.d.ts +46 -164
  240. package/dist/index.d.ts.map +1 -1
  241. package/dist/index.js +5584 -13386
  242. package/dist/index.js.map +1 -1
  243. package/dist/params/codec-registry.d.ts +26 -0
  244. package/dist/params/codec-registry.d.ts.map +1 -0
  245. package/dist/params/define-schema.d.ts +81 -0
  246. package/dist/params/define-schema.d.ts.map +1 -0
  247. package/dist/params/index.d.ts +5 -0
  248. package/dist/params/index.d.ts.map +1 -0
  249. package/dist/params/index.js +34 -0
  250. package/dist/params/index.js.map +1 -0
  251. package/dist/params/resolve-schema.d.ts +34 -0
  252. package/dist/params/resolve-schema.d.ts.map +1 -0
  253. package/dist/plugin-context.d.ts +107 -0
  254. package/dist/plugin-context.d.ts.map +1 -0
  255. package/dist/plugins/adapter-build.d.ts +1 -1
  256. package/dist/plugins/adapter-build.d.ts.map +1 -1
  257. package/dist/plugins/build-manifest.d.ts +2 -2
  258. package/dist/plugins/build-manifest.d.ts.map +1 -1
  259. package/dist/plugins/build-report.d.ts +9 -7
  260. package/dist/plugins/build-report.d.ts.map +1 -1
  261. package/dist/plugins/client-chunks.d.ts +32 -0
  262. package/dist/plugins/client-chunks.d.ts.map +1 -0
  263. package/dist/plugins/cloudflare-wasm.d.ts +18 -0
  264. package/dist/plugins/cloudflare-wasm.d.ts.map +1 -0
  265. package/dist/plugins/content.d.ts +1 -1
  266. package/dist/plugins/content.d.ts.map +1 -1
  267. package/dist/plugins/dev-server.d.ts +1 -1
  268. package/dist/plugins/dev-server.d.ts.map +1 -1
  269. package/dist/plugins/entries.d.ts +1 -1
  270. package/dist/plugins/entries.d.ts.map +1 -1
  271. package/dist/plugins/fonts.d.ts +17 -73
  272. package/dist/plugins/fonts.d.ts.map +1 -1
  273. package/dist/plugins/mdx.d.ts +1 -1
  274. package/dist/plugins/mdx.d.ts.map +1 -1
  275. package/dist/plugins/routing.d.ts +1 -1
  276. package/dist/plugins/routing.d.ts.map +1 -1
  277. package/dist/plugins/server-bundle.d.ts.map +1 -1
  278. package/dist/plugins/shims.d.ts +6 -5
  279. package/dist/plugins/shims.d.ts.map +1 -1
  280. package/dist/plugins/static-build.d.ts +5 -26
  281. package/dist/plugins/static-build.d.ts.map +1 -1
  282. package/dist/routing/codegen-shared.d.ts +67 -0
  283. package/dist/routing/codegen-shared.d.ts.map +1 -0
  284. package/dist/routing/codegen-types.d.ts +60 -0
  285. package/dist/routing/codegen-types.d.ts.map +1 -0
  286. package/dist/routing/codegen.d.ts +7 -2
  287. package/dist/routing/codegen.d.ts.map +1 -1
  288. package/dist/routing/convention-lint.d.ts +41 -0
  289. package/dist/routing/convention-lint.d.ts.map +1 -0
  290. package/dist/routing/index.d.ts +7 -1
  291. package/dist/routing/index.d.ts.map +1 -1
  292. package/dist/routing/index.js +4 -2
  293. package/dist/routing/link-codegen.d.ts +90 -0
  294. package/dist/routing/link-codegen.d.ts.map +1 -0
  295. package/dist/routing/scanner.d.ts +1 -10
  296. package/dist/routing/scanner.d.ts.map +1 -1
  297. package/dist/routing/schema-validation.d.ts +35 -0
  298. package/dist/routing/schema-validation.d.ts.map +1 -0
  299. package/dist/routing/segment-classify.d.ts +75 -0
  300. package/dist/routing/segment-classify.d.ts.map +1 -0
  301. package/dist/routing/segment-codegen.d.ts +38 -0
  302. package/dist/routing/segment-codegen.d.ts.map +1 -0
  303. package/dist/routing/types.d.ts +77 -25
  304. package/dist/routing/types.d.ts.map +1 -1
  305. package/dist/routing/walkers.d.ts +51 -0
  306. package/dist/routing/walkers.d.ts.map +1 -0
  307. package/dist/rsc-runtime/rsc.d.ts +1 -1
  308. package/dist/rsc-runtime/rsc.d.ts.map +1 -1
  309. package/dist/rsc-runtime/ssr.d.ts +12 -0
  310. package/dist/rsc-runtime/ssr.d.ts.map +1 -1
  311. package/dist/schema-bridge.d.ts +76 -0
  312. package/dist/schema-bridge.d.ts.map +1 -0
  313. package/dist/search-params/define.d.ts +157 -0
  314. package/dist/search-params/define.d.ts.map +1 -0
  315. package/dist/search-params/index.d.ts +4 -7
  316. package/dist/search-params/index.d.ts.map +1 -1
  317. package/dist/search-params/index.js +34 -441
  318. package/dist/search-params/index.js.map +1 -1
  319. package/dist/search-params/registry.d.ts +2 -2
  320. package/dist/search-params/registry.d.ts.map +1 -1
  321. package/dist/search-params/wrappers.d.ts +53 -0
  322. package/dist/search-params/wrappers.d.ts.map +1 -0
  323. package/dist/segment-params/define.d.ts +89 -0
  324. package/dist/segment-params/define.d.ts.map +1 -0
  325. package/dist/segment-params/index.d.ts +3 -0
  326. package/dist/segment-params/index.d.ts.map +1 -0
  327. package/dist/segment-params/index.js +2 -0
  328. package/dist/server/access-gate.d.ts +8 -3
  329. package/dist/server/access-gate.d.ts.map +1 -1
  330. package/dist/server/action-client.d.ts +41 -6
  331. package/dist/server/action-client.d.ts.map +1 -1
  332. package/dist/server/action-encryption.d.ts +76 -0
  333. package/dist/server/action-encryption.d.ts.map +1 -0
  334. package/dist/server/action-handler.d.ts +35 -1
  335. package/dist/server/action-handler.d.ts.map +1 -1
  336. package/dist/server/actions.d.ts +6 -14
  337. package/dist/server/actions.d.ts.map +1 -1
  338. package/dist/server/als-registry.d.ts +70 -11
  339. package/dist/server/als-registry.d.ts.map +1 -1
  340. package/dist/server/asset-headers.d.ts +1 -15
  341. package/dist/server/asset-headers.d.ts.map +1 -1
  342. package/dist/server/build-manifest.d.ts +8 -2
  343. package/dist/server/build-manifest.d.ts.map +1 -1
  344. package/dist/server/coalesce-tick.d.ts +40 -0
  345. package/dist/server/coalesce-tick.d.ts.map +1 -0
  346. package/dist/server/cookie-context.d.ts +170 -0
  347. package/dist/server/cookie-context.d.ts.map +1 -0
  348. package/dist/server/cookie-parsing.d.ts +51 -0
  349. package/dist/server/cookie-parsing.d.ts.map +1 -0
  350. package/dist/server/debug.d.ts +1 -1
  351. package/dist/server/default-logger.d.ts +22 -0
  352. package/dist/server/default-logger.d.ts.map +1 -0
  353. package/dist/server/deny-boundary.d.ts +90 -0
  354. package/dist/server/deny-boundary.d.ts.map +1 -0
  355. package/dist/server/deny-renderer.d.ts +1 -1
  356. package/dist/server/deny-renderer.d.ts.map +1 -1
  357. package/dist/server/dev-source-map.d.ts +22 -0
  358. package/dist/server/dev-source-map.d.ts.map +1 -0
  359. package/dist/server/early-hints-sender.d.ts.map +1 -1
  360. package/dist/server/early-hints.d.ts +13 -5
  361. package/dist/server/early-hints.d.ts.map +1 -1
  362. package/dist/server/error-boundary-wrapper.d.ts +7 -1
  363. package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
  364. package/dist/server/fallback-error.d.ts +12 -7
  365. package/dist/server/fallback-error.d.ts.map +1 -1
  366. package/dist/server/flight-injection-state.d.ts +66 -0
  367. package/dist/server/flight-injection-state.d.ts.map +1 -0
  368. package/dist/server/flight-scripts.d.ts +42 -0
  369. package/dist/server/flight-scripts.d.ts.map +1 -0
  370. package/dist/server/flush.d.ts.map +1 -1
  371. package/dist/server/form-data.d.ts +29 -0
  372. package/dist/server/form-data.d.ts.map +1 -1
  373. package/dist/server/html-injector-core.d.ts +213 -0
  374. package/dist/server/html-injector-core.d.ts.map +1 -0
  375. package/dist/server/html-injectors.d.ts +81 -41
  376. package/dist/server/html-injectors.d.ts.map +1 -1
  377. package/dist/server/index.d.ts +10 -46
  378. package/dist/server/index.d.ts.map +1 -1
  379. package/dist/server/index.js +155 -2905
  380. package/dist/server/index.js.map +1 -1
  381. package/dist/server/internal.d.ts +48 -0
  382. package/dist/server/internal.d.ts.map +1 -0
  383. package/dist/server/internal.js +3073 -0
  384. package/dist/server/internal.js.map +1 -0
  385. package/dist/server/logger.d.ts +39 -7
  386. package/dist/server/logger.d.ts.map +1 -1
  387. package/dist/server/metadata-routes.d.ts +23 -7
  388. package/dist/server/metadata-routes.d.ts.map +1 -1
  389. package/dist/server/middleware-runner.d.ts +36 -4
  390. package/dist/server/middleware-runner.d.ts.map +1 -1
  391. package/dist/server/node-stream-transforms.d.ts +112 -0
  392. package/dist/server/node-stream-transforms.d.ts.map +1 -0
  393. package/dist/server/param-coercion.d.ts +54 -0
  394. package/dist/server/param-coercion.d.ts.map +1 -0
  395. package/dist/server/pipeline-helpers.d.ts +95 -0
  396. package/dist/server/pipeline-helpers.d.ts.map +1 -0
  397. package/dist/server/pipeline-interception.d.ts +1 -1
  398. package/dist/server/pipeline-interception.d.ts.map +1 -1
  399. package/dist/server/pipeline-metadata.d.ts +6 -0
  400. package/dist/server/pipeline-metadata.d.ts.map +1 -1
  401. package/dist/server/pipeline-outcome.d.ts +49 -0
  402. package/dist/server/pipeline-outcome.d.ts.map +1 -0
  403. package/dist/server/pipeline-phases.d.ts +52 -0
  404. package/dist/server/pipeline-phases.d.ts.map +1 -0
  405. package/dist/server/pipeline.d.ts +118 -23
  406. package/dist/server/pipeline.d.ts.map +1 -1
  407. package/dist/server/port-resolution.d.ts +117 -0
  408. package/dist/server/port-resolution.d.ts.map +1 -0
  409. package/dist/server/primitives.d.ts +69 -18
  410. package/dist/server/primitives.d.ts.map +1 -1
  411. package/dist/server/render-timeout.d.ts +51 -0
  412. package/dist/server/render-timeout.d.ts.map +1 -0
  413. package/dist/server/request-context.d.ts +62 -107
  414. package/dist/server/request-context.d.ts.map +1 -1
  415. package/dist/server/route-element-builder.d.ts +28 -2
  416. package/dist/server/route-element-builder.d.ts.map +1 -1
  417. package/dist/server/route-handler.d.ts.map +1 -1
  418. package/dist/server/route-matcher.d.ts +25 -36
  419. package/dist/server/route-matcher.d.ts.map +1 -1
  420. package/dist/server/rsc-entry/action-middleware-runner.d.ts +66 -0
  421. package/dist/server/rsc-entry/action-middleware-runner.d.ts.map +1 -0
  422. package/dist/server/rsc-entry/api-handler.d.ts +2 -2
  423. package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
  424. package/dist/server/rsc-entry/error-renderer.d.ts +26 -13
  425. package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
  426. package/dist/server/rsc-entry/helpers.d.ts +50 -6
  427. package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
  428. package/dist/server/rsc-entry/index.d.ts +19 -8
  429. package/dist/server/rsc-entry/index.d.ts.map +1 -1
  430. package/dist/server/rsc-entry/render-route.d.ts +50 -0
  431. package/dist/server/rsc-entry/render-route.d.ts.map +1 -0
  432. package/dist/server/rsc-entry/rsc-payload.d.ts +3 -3
  433. package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
  434. package/dist/server/rsc-entry/rsc-stream.d.ts +17 -1
  435. package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
  436. package/dist/server/rsc-entry/ssr-bridge.d.ts +5 -1
  437. package/dist/server/rsc-entry/ssr-bridge.d.ts.map +1 -1
  438. package/dist/server/rsc-entry/ssr-renderer.d.ts +19 -4
  439. package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
  440. package/dist/server/rsc-entry/wrap-action-dispatch.d.ts +119 -0
  441. package/dist/server/rsc-entry/wrap-action-dispatch.d.ts.map +1 -0
  442. package/dist/server/safe-load.d.ts +46 -0
  443. package/dist/server/safe-load.d.ts.map +1 -0
  444. package/dist/server/sensitive-fields.d.ts +74 -0
  445. package/dist/server/sensitive-fields.d.ts.map +1 -0
  446. package/dist/server/sitemap-generator.d.ts +129 -0
  447. package/dist/server/sitemap-generator.d.ts.map +1 -0
  448. package/dist/server/sitemap-handler.d.ts +22 -0
  449. package/dist/server/sitemap-handler.d.ts.map +1 -0
  450. package/dist/server/slot-resolver.d.ts +1 -1
  451. package/dist/server/slot-resolver.d.ts.map +1 -1
  452. package/dist/server/ssr-bridge-types.d.ts +121 -0
  453. package/dist/server/ssr-bridge-types.d.ts.map +1 -0
  454. package/dist/server/ssr-entry.d.ts +2 -43
  455. package/dist/server/ssr-entry.d.ts.map +1 -1
  456. package/dist/server/ssr-render.d.ts +64 -21
  457. package/dist/server/ssr-render.d.ts.map +1 -1
  458. package/dist/server/ssr-wrappers.d.ts +50 -0
  459. package/dist/server/ssr-wrappers.d.ts.map +1 -0
  460. package/dist/server/state-tree-diff.d.ts +12 -5
  461. package/dist/server/state-tree-diff.d.ts.map +1 -1
  462. package/dist/server/status-code-resolver.d.ts +16 -11
  463. package/dist/server/status-code-resolver.d.ts.map +1 -1
  464. package/dist/server/stream-utils.d.ts +36 -0
  465. package/dist/server/stream-utils.d.ts.map +1 -0
  466. package/dist/server/tracing.d.ts +5 -5
  467. package/dist/server/tracing.d.ts.map +1 -1
  468. package/dist/server/tree-builder.d.ts +62 -30
  469. package/dist/server/tree-builder.d.ts.map +1 -1
  470. package/dist/server/tree-match.d.ts +49 -0
  471. package/dist/server/tree-match.d.ts.map +1 -0
  472. package/dist/server/types.d.ts +49 -4
  473. package/dist/server/types.d.ts.map +1 -1
  474. package/dist/server/utils/escape-html.d.ts +14 -0
  475. package/dist/server/utils/escape-html.d.ts.map +1 -0
  476. package/dist/server/version-skew.d.ts +61 -0
  477. package/dist/server/version-skew.d.ts.map +1 -0
  478. package/dist/shared/merge-search-params.d.ts +22 -0
  479. package/dist/shared/merge-search-params.d.ts.map +1 -0
  480. package/dist/shims/font-google.d.ts +1 -1
  481. package/dist/shims/font-google.d.ts.map +1 -1
  482. package/dist/shims/font-google.js +42 -0
  483. package/dist/shims/font-google.js.map +1 -0
  484. package/dist/shims/font-local.d.ts +26 -0
  485. package/dist/shims/font-local.d.ts.map +1 -0
  486. package/dist/shims/font-local.js +20 -0
  487. package/dist/shims/font-local.js.map +1 -0
  488. package/dist/shims/headers.d.ts +2 -1
  489. package/dist/shims/headers.d.ts.map +1 -1
  490. package/dist/shims/navigation-client.d.ts +3 -1
  491. package/dist/shims/navigation-client.d.ts.map +1 -1
  492. package/dist/shims/navigation.d.ts +11 -5
  493. package/dist/shims/navigation.d.ts.map +1 -1
  494. package/dist/utils/state-machine.d.ts +80 -0
  495. package/dist/utils/state-machine.d.ts.map +1 -0
  496. package/package.json +56 -16
  497. package/src/adapters/build-output-helper.ts +139 -0
  498. package/src/adapters/cloudflare-dev.ts +177 -0
  499. package/src/adapters/cloudflare-kv-cache.ts +142 -0
  500. package/src/adapters/cloudflare.ts +350 -76
  501. package/src/adapters/compress-module.ts +24 -4
  502. package/src/adapters/nitro.ts +142 -59
  503. package/src/adapters/shared.ts +40 -0
  504. package/src/adapters/wrangler.d.ts +7 -0
  505. package/src/cache/cache-api.ts +38 -0
  506. package/src/cache/handler-store.ts +68 -0
  507. package/src/cache/index.ts +81 -18
  508. package/src/cache/singleflight.ts +62 -4
  509. package/src/cache/sizeof.ts +33 -0
  510. package/src/cache/timber-cache.ts +25 -20
  511. package/src/cli-schema-sync.ts +295 -0
  512. package/src/cli.ts +76 -8
  513. package/src/client/browser-dev.ts +153 -1
  514. package/src/client/browser-entry/action-dispatch.ts +125 -0
  515. package/src/client/browser-entry/hmr.ts +81 -0
  516. package/src/client/browser-entry/hydrate.ts +153 -0
  517. package/src/client/browser-entry/index.ts +151 -0
  518. package/src/client/browser-entry/post-hydration.ts +113 -0
  519. package/src/client/browser-entry/router-init.ts +219 -0
  520. package/src/client/browser-entry/rsc-stream.ts +157 -0
  521. package/src/client/browser-entry/scroll.ts +27 -0
  522. package/src/client/error-boundary.tsx +99 -22
  523. package/src/client/error-reconstituter.tsx +65 -0
  524. package/src/client/form.tsx +31 -32
  525. package/src/client/history.ts +26 -4
  526. package/src/client/index.ts +66 -45
  527. package/src/client/internal.ts +58 -0
  528. package/src/client/link-pending-store.ts +116 -0
  529. package/src/client/link.tsx +336 -119
  530. package/src/client/nav-link-store.ts +37 -0
  531. package/src/client/navigation-api-types.ts +112 -0
  532. package/src/client/navigation-api.ts +332 -0
  533. package/src/client/navigation-context.ts +33 -7
  534. package/src/client/navigation-root.tsx +347 -0
  535. package/src/client/nuqs-adapter.tsx +16 -3
  536. package/src/client/router-ref.ts +1 -1
  537. package/src/client/router.ts +418 -128
  538. package/src/client/rsc-fetch.ts +208 -10
  539. package/src/client/segment-cache.ts +6 -3
  540. package/src/client/segment-outlet.tsx +77 -0
  541. package/src/client/segment-update-context.ts +42 -0
  542. package/src/client/shallow-url.ts +22 -0
  543. package/src/client/ssr-data.ts +13 -5
  544. package/src/client/stale-reload.ts +72 -3
  545. package/src/client/state.ts +2 -2
  546. package/src/client/top-loader.tsx +11 -9
  547. package/src/client/use-cookie.ts +31 -2
  548. package/src/client/use-link-status.ts +7 -7
  549. package/src/client/use-pending-navigation.ts +40 -0
  550. package/src/client/use-query-states.ts +9 -3
  551. package/src/client/use-router.ts +1 -1
  552. package/src/client/use-search-params.ts +25 -44
  553. package/src/client/{use-params.ts → use-segment-params.ts} +8 -6
  554. package/src/codec.ts +147 -0
  555. package/src/config-types.ts +292 -0
  556. package/src/config-validation.ts +303 -0
  557. package/src/content/index.ts +5 -13
  558. package/src/cookies/define-cookie.ts +233 -53
  559. package/src/cookies/index.ts +12 -1
  560. package/src/cookies/json-cookie.ts +105 -0
  561. package/src/cookies/validation.ts +134 -0
  562. package/src/dev-tools/404-page.ts +387 -0
  563. package/src/dev-tools/browser-logs.ts +291 -0
  564. package/src/dev-tools/error-page.ts +506 -0
  565. package/src/dev-tools/holding-server.ts +187 -0
  566. package/src/dev-tools/index.ts +90 -0
  567. package/src/dev-tools/instrumentation.ts +176 -0
  568. package/src/{plugins/dev-logs.ts → dev-tools/logs.ts} +9 -5
  569. package/src/dev-tools/overlay.ts +469 -0
  570. package/src/dev-tools/stack-classifier.ts +75 -0
  571. package/src/dev-tools/terminal.ts +183 -0
  572. package/src/{server/dev-warnings.ts → dev-tools/warnings.ts} +5 -50
  573. package/src/fonts/ast.ts +525 -16
  574. package/src/fonts/bundle.ts +142 -0
  575. package/src/fonts/dev-middleware.ts +74 -0
  576. package/src/fonts/local.ts +1 -1
  577. package/src/fonts/pipeline.ts +314 -0
  578. package/src/fonts/transform.ts +317 -0
  579. package/src/fonts/types.ts +50 -1
  580. package/src/fonts/virtual-modules.ts +233 -0
  581. package/src/index.ts +411 -329
  582. package/src/params/codec-registry.ts +34 -0
  583. package/src/params/define-schema.ts +114 -0
  584. package/src/params/index.ts +17 -0
  585. package/src/params/resolve-schema.ts +116 -0
  586. package/src/plugin-context.ts +240 -0
  587. package/src/plugins/adapter-build.ts +12 -4
  588. package/src/plugins/build-manifest.ts +69 -6
  589. package/src/plugins/build-report.ts +16 -25
  590. package/src/plugins/client-chunks.ts +65 -0
  591. package/src/plugins/cloudflare-wasm.ts +103 -0
  592. package/src/plugins/content.ts +1 -1
  593. package/src/plugins/dev-server.ts +179 -37
  594. package/src/plugins/entries.ts +111 -8
  595. package/src/plugins/fonts.ts +165 -654
  596. package/src/plugins/mdx.ts +47 -10
  597. package/src/plugins/routing.ts +386 -47
  598. package/src/plugins/server-bundle.ts +59 -3
  599. package/src/plugins/shims.ts +136 -35
  600. package/src/plugins/static-build.ts +15 -89
  601. package/src/routing/codegen-shared.ts +115 -0
  602. package/src/routing/codegen-types.ts +61 -0
  603. package/src/routing/codegen.ts +321 -177
  604. package/src/routing/convention-lint.ts +357 -0
  605. package/src/routing/index.ts +10 -1
  606. package/src/routing/interception.ts +1 -1
  607. package/src/routing/link-codegen.ts +308 -0
  608. package/src/routing/scanner.ts +165 -110
  609. package/src/routing/schema-validation.ts +149 -0
  610. package/src/routing/segment-classify.ts +188 -0
  611. package/src/routing/segment-codegen.ts +98 -0
  612. package/src/routing/types.ts +78 -25
  613. package/src/routing/walkers.ts +90 -0
  614. package/src/rsc-runtime/rsc.ts +2 -0
  615. package/src/rsc-runtime/ssr.ts +50 -0
  616. package/src/rsc-runtime/vendor-types.d.ts +7 -0
  617. package/src/{search-params/codecs.ts → schema-bridge.ts} +57 -20
  618. package/src/search-params/define.ts +538 -0
  619. package/src/search-params/index.ts +14 -20
  620. package/src/search-params/registry.ts +2 -2
  621. package/src/search-params/wrappers.ts +92 -0
  622. package/src/segment-params/define.ts +309 -0
  623. package/src/segment-params/index.ts +9 -0
  624. package/src/server/access-gate.tsx +76 -34
  625. package/src/server/action-client.ts +88 -15
  626. package/src/server/action-encryption.ts +144 -0
  627. package/src/server/action-handler.ts +112 -14
  628. package/src/server/actions.ts +14 -23
  629. package/src/server/als-registry.ts +108 -20
  630. package/src/server/asset-headers.ts +8 -34
  631. package/src/server/build-manifest.ts +17 -4
  632. package/src/server/coalesce-tick.ts +75 -0
  633. package/src/server/compress.ts +25 -7
  634. package/src/server/cookie-context.ts +468 -0
  635. package/src/server/cookie-parsing.ts +135 -0
  636. package/src/server/debug.ts +1 -1
  637. package/src/server/default-logger.ts +99 -0
  638. package/src/server/deny-boundary.ts +218 -0
  639. package/src/server/deny-renderer.ts +32 -51
  640. package/src/server/dev-source-map.ts +31 -0
  641. package/src/server/early-hints-sender.ts +3 -2
  642. package/src/server/early-hints.ts +36 -15
  643. package/src/server/error-boundary-wrapper.ts +74 -22
  644. package/src/server/fallback-error.ts +74 -102
  645. package/src/server/flight-injection-state.ts +113 -0
  646. package/src/server/flight-scripts.ts +62 -0
  647. package/src/server/flush.ts +2 -1
  648. package/src/server/form-data.ts +101 -5
  649. package/src/server/html-injector-core.ts +417 -0
  650. package/src/server/html-injectors.ts +235 -223
  651. package/src/server/index.ts +29 -183
  652. package/src/server/internal.ts +182 -0
  653. package/src/server/logger.ts +67 -36
  654. package/src/server/metadata-routes.ts +44 -19
  655. package/src/server/middleware-runner.ts +75 -4
  656. package/src/server/node-stream-transforms.ts +361 -0
  657. package/src/server/param-coercion.ts +206 -0
  658. package/src/server/pipeline-helpers.ts +204 -0
  659. package/src/server/pipeline-interception.ts +31 -18
  660. package/src/server/pipeline-metadata.ts +13 -0
  661. package/src/server/pipeline-outcome.ts +197 -0
  662. package/src/server/pipeline-phases.ts +497 -0
  663. package/src/server/pipeline.ts +194 -394
  664. package/src/server/port-resolution.ts +215 -0
  665. package/src/server/primitives.ts +111 -28
  666. package/src/server/render-timeout.ts +108 -0
  667. package/src/server/request-context.ts +168 -337
  668. package/src/server/route-element-builder.ts +435 -208
  669. package/src/server/route-handler.ts +24 -4
  670. package/src/server/route-matcher.ts +128 -277
  671. package/src/server/rsc-entry/action-middleware-runner.ts +167 -0
  672. package/src/server/rsc-entry/api-handler.ts +16 -17
  673. package/src/server/rsc-entry/error-renderer.ts +315 -89
  674. package/src/server/rsc-entry/helpers.ts +155 -26
  675. package/src/server/rsc-entry/index.ts +316 -327
  676. package/src/server/rsc-entry/render-route.ts +313 -0
  677. package/src/server/rsc-entry/rsc-payload.ts +65 -18
  678. package/src/server/rsc-entry/rsc-stream.ts +85 -13
  679. package/src/server/rsc-entry/ssr-bridge.ts +18 -5
  680. package/src/server/rsc-entry/ssr-renderer.ts +195 -41
  681. package/src/server/rsc-entry/wrap-action-dispatch.ts +449 -0
  682. package/src/server/safe-load.ts +60 -0
  683. package/src/server/sensitive-fields.ts +230 -0
  684. package/src/server/sitemap-generator.ts +338 -0
  685. package/src/server/sitemap-handler.ts +126 -0
  686. package/src/server/slot-resolver.ts +228 -246
  687. package/src/server/ssr-bridge-types.ts +124 -0
  688. package/src/server/ssr-entry.ts +217 -78
  689. package/src/server/ssr-render.ts +344 -71
  690. package/src/server/ssr-wrappers.tsx +139 -0
  691. package/src/server/state-tree-diff.ts +30 -23
  692. package/src/server/status-code-resolver.ts +112 -128
  693. package/src/server/stream-utils.ts +213 -0
  694. package/src/server/tracing.ts +21 -10
  695. package/src/server/tree-builder.ts +202 -90
  696. package/src/server/tree-match.ts +210 -0
  697. package/src/server/types.ts +55 -6
  698. package/src/server/utils/escape-html.ts +20 -0
  699. package/src/server/version-skew.ts +104 -0
  700. package/src/shared/merge-search-params.ts +55 -0
  701. package/src/shims/font-google.ts +1 -1
  702. package/src/shims/font-local.ts +34 -0
  703. package/src/shims/headers.ts +5 -1
  704. package/src/shims/navigation-client.ts +4 -3
  705. package/src/shims/navigation.ts +14 -7
  706. package/src/utils/state-machine.ts +111 -0
  707. package/dist/_chunks/als-registry-B7DbZ2hS.js +0 -41
  708. package/dist/_chunks/als-registry-B7DbZ2hS.js.map +0 -1
  709. package/dist/_chunks/debug-gwlJkDuf.js +0 -108
  710. package/dist/_chunks/debug-gwlJkDuf.js.map +0 -1
  711. package/dist/_chunks/format-DviM89f0.js.map +0 -1
  712. package/dist/_chunks/interception-BOoWmLUA.js +0 -676
  713. package/dist/_chunks/interception-BOoWmLUA.js.map +0 -1
  714. package/dist/_chunks/metadata-routes-Cjmvi3rQ.js.map +0 -1
  715. package/dist/_chunks/request-context-DIkVh_jG.js +0 -330
  716. package/dist/_chunks/request-context-DIkVh_jG.js.map +0 -1
  717. package/dist/_chunks/ssr-data-MjmprTmO.js.map +0 -1
  718. package/dist/_chunks/tracing-CemImE6h.js +0 -187
  719. package/dist/_chunks/tracing-CemImE6h.js.map +0 -1
  720. package/dist/_chunks/use-cookie-DX-l1_5E.js +0 -91
  721. package/dist/_chunks/use-cookie-DX-l1_5E.js.map +0 -1
  722. package/dist/_chunks/use-query-states-D5KaffOK.js.map +0 -1
  723. package/dist/cache/register-cached-function.d.ts +0 -17
  724. package/dist/cache/register-cached-function.d.ts.map +0 -1
  725. package/dist/client/browser-entry.d.ts +0 -21
  726. package/dist/client/browser-entry.d.ts.map +0 -1
  727. package/dist/client/link-status-provider.d.ts +0 -11
  728. package/dist/client/link-status-provider.d.ts.map +0 -1
  729. package/dist/client/segment-merger.d.ts +0 -119
  730. package/dist/client/segment-merger.d.ts.map +0 -1
  731. package/dist/client/transition-root.d.ts.map +0 -1
  732. package/dist/client/use-navigation-pending.d.ts +0 -26
  733. package/dist/client/use-navigation-pending.d.ts.map +0 -1
  734. package/dist/client/use-params.d.ts.map +0 -1
  735. package/dist/plugins/cache-transform.d.ts +0 -36
  736. package/dist/plugins/cache-transform.d.ts.map +0 -1
  737. package/dist/plugins/dev-error-overlay.d.ts +0 -60
  738. package/dist/plugins/dev-error-overlay.d.ts.map +0 -1
  739. package/dist/plugins/dev-logs.d.ts.map +0 -1
  740. package/dist/plugins/dynamic-transform.d.ts +0 -72
  741. package/dist/plugins/dynamic-transform.d.ts.map +0 -1
  742. package/dist/plugins/server-action-exports.d.ts +0 -26
  743. package/dist/plugins/server-action-exports.d.ts.map +0 -1
  744. package/dist/routing/status-file-lint.d.ts +0 -33
  745. package/dist/routing/status-file-lint.d.ts.map +0 -1
  746. package/dist/search-params/analyze.d.ts +0 -54
  747. package/dist/search-params/analyze.d.ts.map +0 -1
  748. package/dist/search-params/builtin-codecs.d.ts +0 -105
  749. package/dist/search-params/builtin-codecs.d.ts.map +0 -1
  750. package/dist/search-params/codecs.d.ts +0 -53
  751. package/dist/search-params/codecs.d.ts.map +0 -1
  752. package/dist/search-params/create.d.ts +0 -106
  753. package/dist/search-params/create.d.ts.map +0 -1
  754. package/dist/server/dev-fetch-instrumentation.d.ts +0 -22
  755. package/dist/server/dev-fetch-instrumentation.d.ts.map +0 -1
  756. package/dist/server/dev-logger.d.ts.map +0 -1
  757. package/dist/server/dev-span-processor.d.ts.map +0 -1
  758. package/dist/server/dev-warnings.d.ts.map +0 -1
  759. package/dist/server/manifest-status-resolver.d.ts +0 -58
  760. package/dist/server/manifest-status-resolver.d.ts.map +0 -1
  761. package/dist/server/prerender.d.ts +0 -77
  762. package/dist/server/prerender.d.ts.map +0 -1
  763. package/dist/utils/directive-parser.d.ts +0 -70
  764. package/dist/utils/directive-parser.d.ts.map +0 -1
  765. package/src/cache/register-cached-function.ts +0 -103
  766. package/src/client/browser-entry.ts +0 -678
  767. package/src/client/link-status-provider.tsx +0 -30
  768. package/src/client/segment-merger.ts +0 -339
  769. package/src/client/transition-root.tsx +0 -166
  770. package/src/client/use-navigation-pending.ts +0 -38
  771. package/src/plugins/cache-transform.ts +0 -199
  772. package/src/plugins/dev-error-overlay.ts +0 -230
  773. package/src/plugins/dynamic-transform.ts +0 -161
  774. package/src/plugins/server-action-exports.ts +0 -220
  775. package/src/routing/status-file-lint.ts +0 -112
  776. package/src/search-params/analyze.ts +0 -192
  777. package/src/search-params/builtin-codecs.ts +0 -228
  778. package/src/search-params/create.ts +0 -321
  779. package/src/server/dev-fetch-instrumentation.ts +0 -96
  780. package/src/server/dev-span-processor.ts +0 -78
  781. package/src/server/manifest-status-resolver.ts +0 -215
  782. package/src/server/prerender.ts +0 -139
  783. package/src/utils/directive-parser.ts +0 -529
  784. /package/src/{server/dev-logger.ts → dev-tools/logger.ts} +0 -0
@@ -4,24 +4,21 @@
4
4
  * Pipeline stages (in order):
5
5
  * proxy.ts → canonicalize → route match → 103 Early Hints → middleware.ts → render
6
6
  *
7
- * Each stage is a pure function or returns a Response to short-circuit.
8
- * Each request gets a trace ID, structured logging, and OTEL spans.
7
+ * The phase functions live in `pipeline-phases.ts` so each phase can be
8
+ * tested in isolation. The terminal `outcomeToResponse` translator and
9
+ * stateless helpers live in `pipeline-phases.ts` and `pipeline-helpers.ts`
10
+ * respectively. This file owns only the public type surface and the
11
+ * `createPipeline` entry point: trace ID setup, request-context ALS,
12
+ * Server-Timing wrapping, and the activeRequests counter.
9
13
  *
10
14
  * See design/07-routing.md §"Request Lifecycle", design/02-rendering-pipeline.md §"Request Flow",
11
15
  * and design/17-logging.md §"Production Logging"
12
16
  */
13
17
 
14
- import { canonicalize } from './canonicalize.js';
15
- import { runProxy, type ProxyExport } from './proxy.js';
16
- import { runMiddleware, type MiddlewareFn } from './middleware-runner.js';
17
- import { runWithTimingCollector, withTiming, getServerTimingHeader } from './server-timing.js';
18
- import {
19
- runWithRequestContext,
20
- applyRequestHeaderOverlay,
21
- setMutableCookieContext,
22
- getSetCookieHeaders,
23
- markResponseFlushed,
24
- } from './request-context.js';
18
+ import type { ProxyExport } from './proxy.js';
19
+ import type { MiddlewareFn } from './middleware-runner.js';
20
+ import { runWithTimingCollector, getServerTimingHeader } from './server-timing.js';
21
+ import { runWithRequestContext } from './request-context.js';
25
22
  import {
26
23
  generateTraceId,
27
24
  runWithTraceId,
@@ -29,34 +26,41 @@ import {
29
26
  replaceTraceId,
30
27
  withSpan,
31
28
  setSpanAttribute,
32
- traceId,
33
29
  } from './tracing.js';
34
- import {
35
- logRequestReceived,
36
- logRequestCompleted,
37
- logSlowRequest,
38
- logProxyError,
39
- logMiddlewareError,
40
- logMiddlewareShortCircuit,
41
- logRenderError,
42
- } from './logger.js';
43
- import { callOnRequestError } from './instrumentation.js';
44
- import { RedirectSignal, DenySignal } from './primitives.js';
45
- import { serveStaticMetadataFile, serializeSitemap } from './pipeline-metadata.js';
46
- import { findInterceptionMatch } from './pipeline-interception.js';
47
- import type { MiddlewareContext } from './types.js';
48
- import type { SegmentNode } from '#/routing/types.js';
30
+ import { logRequestReceived, logRequestCompleted, logSlowRequest } from './logger.js';
31
+ import { DenySignal } from './primitives.js';
32
+ import type { ManifestSegmentNode } from './route-matcher.js';
33
+ import { makeProxyResolver } from './pipeline-helpers.js';
34
+ import { handleRequest, runProxyPhase } from './pipeline-phases.js';
35
+ import { outcomeToResponse } from './pipeline-outcome.js';
36
+ import { canonicalize } from './canonicalize.js';
37
+ import { isDebug } from './debug.js';
49
38
 
50
39
  // ─── Route Match Result ────────────────────────────────────────────────────
51
40
 
52
- /** Result of matching a canonical pathname against the route tree. */
41
+ /**
42
+ * Result of matching a canonical pathname against the route tree.
43
+ *
44
+ * `segments` is the runtime (`ManifestFile`-specialized) shape — the same
45
+ * nodes carried in the virtual route manifest. TIM-863 unified this: the
46
+ * matcher produces `ManifestSegmentNode[]` directly and every consumer
47
+ * (render, slots, params coercion, early hints, deny fallback) sees the
48
+ * same structural type with no `as unknown as` laundering.
49
+ */
53
50
  export interface RouteMatch {
54
51
  /** The matched segment chain from root to leaf. */
55
- segments: SegmentNode[];
56
- /** Extracted route params (catch-all segments produce string[]). */
57
- params: Record<string, string | string[]>;
58
- /** The leaf segment's middleware.ts export, if any. */
59
- middleware?: MiddlewareFn;
52
+ segments: ManifestSegmentNode[];
53
+ /** Extracted segment params (catch-all segments produce string[]). */
54
+ segmentParams: Record<string, string | string[]>;
55
+ /**
56
+ * Raw segment params before codec coercion. Always string or string[].
57
+ * Used by slot resolution to reconstruct URL parts — coerced params may
58
+ * have been transformed by codecs and are unsuitable for URL matching.
59
+ * Set by the pipeline before coercion runs.
60
+ */
61
+ rawSegmentParams?: Record<string, string | string[]>;
62
+ /** Middleware chain from the segment tree, ordered root-to-leaf. */
63
+ middlewareChain: MiddlewareFn[];
60
64
  }
61
65
 
62
66
  /** Function that matches a canonical pathname to a route. */
@@ -91,11 +95,32 @@ export type EarlyHintsEmitter = (
91
95
 
92
96
  // ─── Pipeline Configuration ────────────────────────────────────────────────
93
97
 
98
+ /**
99
+ * Proxy source — a tagged union so the choice between "already-resolved
100
+ * export" and "lazy HMR-friendly loader" is encoded in the type, not
101
+ * inferred per-request.
102
+ *
103
+ * - `static` — the proxy export is already resolved (production, tests).
104
+ * - `lazy` — a loader is called per-request for HMR freshness (dev).
105
+ *
106
+ * `PipelineConfig.proxy` also accepts a bare `ProxyExport` (a function or
107
+ * function array) as shorthand for the static variant — convenient for tests
108
+ * that construct a `createPipeline` config inline. Omit the field entirely
109
+ * when the app has no `proxy.ts`.
110
+ *
111
+ * See design/07-routing.md §"proxy.ts — Global Middleware".
112
+ */
113
+ export type ProxyConfig =
114
+ | { kind: 'static'; export: ProxyExport }
115
+ | { kind: 'lazy'; loader: () => Promise<{ default: ProxyExport }> };
116
+
94
117
  export interface PipelineConfig {
95
- /** The proxy.ts default export (function or array). Undefined if no proxy.ts. */
96
- proxy?: ProxyExport;
97
- /** Lazy loader for proxy.ts — called per-request so HMR updates take effect. */
98
- proxyLoader?: () => Promise<{ default: ProxyExport }>;
118
+ /**
119
+ * proxy.ts source. Undefined if the app has no proxy.ts. Accepts either a
120
+ * tagged `ProxyConfig` (canonical) or a bare `ProxyExport` as sugar for the
121
+ * static variant.
122
+ */
123
+ proxy?: ProxyConfig | ProxyExport;
99
124
  /** Route matcher — resolves a canonical pathname to a RouteMatch. */
100
125
  matchRoute: RouteMatcher;
101
126
  /** Metadata route matcher — resolves metadata route pathnames (sitemap.xml, robots.txt, etc.) */
@@ -115,14 +140,25 @@ export interface PipelineConfig {
115
140
  * Generated at build time from intercepting route directories.
116
141
  * See design/07-routing.md §"Intercepting Routes"
117
142
  */
118
- interceptionRewrites?: import('#/routing/interception.js').InterceptionRewrite[];
143
+ interceptionRewrites?: import('../routing/interception.js').InterceptionRewrite[];
119
144
  /**
120
- * Emit Server-Timing header on responses for Chrome DevTools visibility.
121
- * Only enable in dev mode — exposes internal timing data.
145
+ * Control Server-Timing header output.
146
+ *
147
+ * - `'detailed'` — per-phase breakdown (proxy, middleware, render).
148
+ * - `'total'` — single `total;dur=N` entry (production-safe).
149
+ * - `false` — no Server-Timing header at all.
122
150
  *
123
- * Default: false (production-safe).
151
+ * Default: `'total'`.
124
152
  */
125
- enableServerTiming?: boolean;
153
+ serverTiming?: 'detailed' | 'total' | false;
154
+ /**
155
+ * Auto-generated sitemap handler. When provided, the pipeline intercepts
156
+ * `/sitemap.xml` and `/sitemap/N.xml` requests and delegates to this
157
+ * function. Returns a Response or null (pass-through to regular routing).
158
+ *
159
+ * See design/16-metadata.md §"Auto-generated Sitemap"
160
+ */
161
+ autoSitemapHandler?: (pathname: string) => Promise<Response | null>;
126
162
  /**
127
163
  * Dev pipeline error callback — called when a pipeline phase (proxy,
128
164
  * middleware, render) catches an unhandled error. Used to wire the error
@@ -131,6 +167,26 @@ export interface PipelineConfig {
131
167
  * Undefined in production — zero overhead.
132
168
  */
133
169
  onPipelineError?: (error: Error, phase: string) => void;
170
+
171
+ /**
172
+ * Dev error handler with RSC debug context — set by the dev server after
173
+ * the RSC entry module is imported. `onPipelineError` resolves debug
174
+ * components from ALS and delegates to this handler.
175
+ *
176
+ * This is a mutable property (not a constructor argument) because the dev
177
+ * server imports the RSC entry module first (which constructs the config),
178
+ * then wires in the overlay handler. Moving the state here (from a
179
+ * module-level `let`) keeps it co-located with the config it belongs to
180
+ * and makes it visible in tests without module-level mutation.
181
+ *
182
+ * Undefined in production — zero overhead.
183
+ */
184
+ devPipelineErrorHandler?: (
185
+ error: Error,
186
+ phase: string,
187
+ debugComponents?: Array<{ name: string; env: string | null; stack: unknown[] | null }>
188
+ ) => void;
189
+
134
190
  /**
135
191
  * Fallback error renderer — called when a catastrophic error escapes the
136
192
  * render phase. Produces an HTML Response instead of a bare empty 500.
@@ -147,6 +203,28 @@ export interface PipelineConfig {
147
203
  req: Request,
148
204
  responseHeaders: Headers
149
205
  ) => Response | Promise<Response>;
206
+ /**
207
+ * Fallback deny page renderer — called when a DenySignal escapes from
208
+ * middleware or the render phase. Renders the appropriate status-code
209
+ * page (403.tsx, 404.tsx, etc.) instead of returning a bare empty response.
210
+ *
211
+ * If this function throws, the pipeline falls back to a bare
212
+ * `new Response(null, { status: denyStatus })`.
213
+ */
214
+ renderDenyFallback?: (
215
+ deny: DenySignal,
216
+ req: Request,
217
+ responseHeaders: Headers,
218
+ /**
219
+ * The matched route, if available. Provided by both the middleware-stage
220
+ * and render-stage catch blocks (matching runs before middleware). When
221
+ * present, the renderer should resolve the deny status file against the
222
+ * matched chain so colocated `403.tsx`/`4xx.tsx`/`401.json` files are
223
+ * picked up. Falls back to the root-only chain when omitted (e.g. for
224
+ * deny()s thrown before route matching could complete). See TIM-822.
225
+ */
226
+ match?: RouteMatch
227
+ ) => Response | Promise<Response>;
150
228
  }
151
229
 
152
230
  // ─── Pipeline ──────────────────────────────────────────────────────────────
@@ -154,20 +232,21 @@ export interface PipelineConfig {
154
232
  /**
155
233
  * Create the request handler from a pipeline configuration.
156
234
  *
157
- * Returns a function that processes an incoming Request through all pipeline stages
158
- * and produces a Response. This is the top-level entry point for the server.
235
+ * Returns a function that processes an incoming Request through all pipeline
236
+ * stages and produces a Response. This is the top-level entry point for the
237
+ * server. The body is intentionally small — phase logic lives in
238
+ * `pipeline-phases.ts`. This function only owns the per-request setup that
239
+ * has to wrap the entire dispatch: trace ID, request context ALS, span
240
+ * scope, Server-Timing header emission, and the active-request counter.
159
241
  */
160
242
  export function createPipeline(config: PipelineConfig): (req: Request) => Promise<Response> {
161
- const {
162
- proxy,
163
- matchRoute,
164
- render,
165
- earlyHints,
166
- stripTrailingSlash = true,
167
- slowRequestMs = 3000,
168
- enableServerTiming = false,
169
- onPipelineError,
170
- } = config;
243
+ // Resolve the proxy source once. The request hot path calls this closure
244
+ // directly with no discriminant check — the branch is taken here during
245
+ // setup. For the lazy variant, `loader()` still runs per-request so HMR
246
+ // continues to re-import the user's proxy.ts.
247
+ const proxyResolver = makeProxyResolver(config.proxy);
248
+ const slowRequestMs = config.slowRequestMs ?? 3000;
249
+ const serverTiming = config.serverTiming ?? 'total';
171
250
 
172
251
  // Concurrent request counter — tracks how many requests are in-flight.
173
252
  // Logged with each request for diagnosing resource contention.
@@ -186,7 +265,7 @@ export function createPipeline(config: PipelineConfig): (req: Request) => Promis
186
265
  const traceIdValue = generateTraceId();
187
266
 
188
267
  return runWithTraceId(traceIdValue, async () => {
189
- // Establish request context ALS scope so headers() and cookies() work
268
+ // Establish request context ALS scope so getHeaders() and getCookies() work
190
269
  // throughout the entire request lifecycle (proxy, middleware, render).
191
270
  return runWithRequestContext(req, async () => {
192
271
  // In dev mode, wrap with timing collector for Server-Timing header.
@@ -205,36 +284,75 @@ export function createPipeline(config: PipelineConfig): (req: Request) => Promis
205
284
  replaceTraceId(otelIds.traceId, otelIds.spanId);
206
285
  }
207
286
 
287
+ // Stage 0: Canonicalize URL at the outer boundary — before
288
+ // proxy.ts sees the request. Every layer (proxy, middleware,
289
+ // access, render) must see the same canonical path.
290
+ // See design/07-routing.md §"URL Canonicalization & Security".
291
+ const stripTrailingSlash = config.stripTrailingSlash ?? true;
292
+ const canonResult = canonicalize(url.pathname, stripTrailingSlash);
293
+ if (!canonResult.ok) {
294
+ if (isDebug()) {
295
+ console.warn(
296
+ `[timber] URL canonicalization rejected ${method} ${url.pathname} — responding with ${canonResult.status}\n` +
297
+ ` This usually means the URL contains encoded separators (%2f, %5c),\n` +
298
+ ` null bytes (%00), path traversal (..), or malformed percent-encoding.`
299
+ );
300
+ }
301
+ return new Response(null, { status: canonResult.status });
302
+ }
303
+ const canonicalPath = canonResult.pathname;
304
+
305
+ // Construct a Request with the canonical URL so proxy.ts sees
306
+ // the same path that route matching will use. This prevents
307
+ // auth bypass via /admin/, /%61dmin, etc.
308
+ let canonicalReq = req;
309
+ if (url.pathname !== canonicalPath) {
310
+ const canonicalUrl = new URL(req.url);
311
+ canonicalUrl.pathname = canonicalPath;
312
+ canonicalReq = new Request(canonicalUrl.toString(), req);
313
+ }
314
+
208
315
  let result: Response;
209
- if (proxy || config.proxyLoader) {
210
- result = await runProxyPhase(req, method, path);
316
+ if (proxyResolver) {
317
+ const outcome = await runProxyPhase(
318
+ config,
319
+ proxyResolver,
320
+ canonicalReq,
321
+ method,
322
+ canonicalPath
323
+ );
324
+ result = await outcomeToResponse(config, outcome, {
325
+ req: canonicalReq,
326
+ method,
327
+ path: canonicalPath,
328
+ });
211
329
  } else {
212
- result = await handleRequest(req, method, path);
330
+ result = await handleRequest(config, canonicalReq, method, canonicalPath);
213
331
  }
214
332
 
215
333
  // Set response status on the root span before it ends —
216
334
  // DevSpanProcessor reads this for tree/summary output.
217
335
  await setSpanAttribute('http.response.status_code', result.status);
218
336
 
219
- // Append Server-Timing header.
220
- // In dev mode: detailed per-phase breakdown (proxy, middleware, render).
221
- // In production: single total duration — safe to expose, no phase names.
222
- // Response.redirect() creates immutable headers, so we must
223
- // ensure mutability before writing Server-Timing.
224
- if (enableServerTiming) {
225
- const serverTiming = getServerTimingHeader();
226
- if (serverTiming) {
227
- result = ensureMutableResponse(result);
228
- result.headers.set('Server-Timing', serverTiming);
337
+ // Append Server-Timing header based on configured mode.
338
+ // Header mutability is guaranteed by the producer-side clone
339
+ // in `outcomeToResponse` and the metadata-route / auto-sitemap
340
+ // user-handler clones in `handleRequest`, so we can write
341
+ // directly without a runtime probe. See TIM-866.
342
+ if (serverTiming === 'detailed') {
343
+ // Detailed: per-phase breakdown (proxy, middleware, render).
344
+ const timingHeader = getServerTimingHeader();
345
+ if (timingHeader) {
346
+ result.headers.set('Server-Timing', timingHeader);
229
347
  }
230
- } else {
231
- // Production: emit total request duration only.
232
- // No phase breakdown — prevents information disclosure
233
- // while giving browser DevTools useful timing data.
348
+ } else if (serverTiming === 'total') {
349
+ // Total only: single `total;dur=N` — no phase names.
350
+ // Prevents information disclosure while giving browser
351
+ // DevTools useful timing data.
234
352
  const totalMs = Math.round(performance.now() - startTime);
235
- result = ensureMutableResponse(result);
236
353
  result.headers.set('Server-Timing', `total;dur=${totalMs}`);
237
354
  }
355
+ // serverTiming === false: no header at all
238
356
 
239
357
  return result;
240
358
  }
@@ -254,326 +372,8 @@ export function createPipeline(config: PipelineConfig): (req: Request) => Promis
254
372
  return response;
255
373
  };
256
374
 
257
- return enableServerTiming ? runWithTimingCollector(runRequest) : runRequest();
375
+ return serverTiming === 'detailed' ? runWithTimingCollector(runRequest) : runRequest();
258
376
  });
259
377
  });
260
378
  };
261
-
262
- async function runProxyPhase(req: Request, method: string, path: string): Promise<Response> {
263
- try {
264
- // Resolve the proxy export. When a proxyLoader is provided (lazy import),
265
- // it is called per-request so HMR updates in dev take effect immediately.
266
- let proxyExport: ProxyExport;
267
- if (config.proxyLoader) {
268
- const mod = await config.proxyLoader();
269
- proxyExport = mod.default;
270
- } else {
271
- proxyExport = config.proxy!;
272
- }
273
- const proxyFn = () => runProxy(proxyExport, req, () => handleRequest(req, method, path));
274
- return await withSpan('timber.proxy', {}, () =>
275
- enableServerTiming ? withTiming('proxy', 'proxy.ts', proxyFn) : proxyFn()
276
- );
277
- } catch (error) {
278
- // Uncaught proxy.ts error → bare HTTP 500
279
- logProxyError({ error });
280
- await fireOnRequestError(error, req, 'proxy');
281
- if (onPipelineError && error instanceof Error) onPipelineError(error, 'proxy');
282
- return new Response(null, { status: 500 });
283
- }
284
- }
285
-
286
- async function handleRequest(req: Request, method: string, path: string): Promise<Response> {
287
- // Stage 1: URL canonicalization
288
- const url = new URL(req.url);
289
- const result = canonicalize(url.pathname, stripTrailingSlash);
290
- if (!result.ok) {
291
- return new Response(null, { status: result.status });
292
- }
293
- const canonicalPathname = result.pathname;
294
-
295
- // Stage 1b: Metadata route matching — runs before regular route matching.
296
- // Metadata routes skip middleware.ts and access.ts (public endpoints for crawlers).
297
- // See design/16-metadata.md §"Pipeline Integration"
298
- if (config.matchMetadataRoute) {
299
- const metaMatch = config.matchMetadataRoute(canonicalPathname);
300
- if (metaMatch) {
301
- try {
302
- // Static metadata files (.xml, .txt, .png, .ico, etc.) are served
303
- // directly from disk. Dynamic metadata routes (.ts, .tsx) export a
304
- // handler function that generates the response.
305
- if (metaMatch.isStatic) {
306
- return await serveStaticMetadataFile(metaMatch);
307
- }
308
-
309
- const mod = (await metaMatch.file.load()) as { default?: Function };
310
- if (typeof mod.default !== 'function') {
311
- return new Response('Metadata route must export a default function', { status: 500 });
312
- }
313
- const handlerResult = await mod.default();
314
- // If the handler returns a Response, use it directly
315
- if (handlerResult instanceof Response) {
316
- return handlerResult;
317
- }
318
- // Otherwise, serialize based on content type
319
- const contentType = metaMatch.contentType;
320
- let body: string;
321
- if (typeof handlerResult === 'string') {
322
- body = handlerResult;
323
- } else if (contentType === 'application/xml') {
324
- body = serializeSitemap(handlerResult);
325
- } else if (contentType === 'application/manifest+json') {
326
- body = JSON.stringify(handlerResult, null, 2);
327
- } else {
328
- body = typeof handlerResult === 'string' ? handlerResult : String(handlerResult);
329
- }
330
- return new Response(body, {
331
- status: 200,
332
- headers: { 'Content-Type': `${contentType}; charset=utf-8` },
333
- });
334
- } catch (error) {
335
- logRenderError({ method, path, error });
336
- if (onPipelineError && error instanceof Error) onPipelineError(error, 'metadata-route');
337
- return new Response(null, { status: 500 });
338
- }
339
- }
340
- }
341
-
342
- // Stage 2: Route matching
343
- let match = matchRoute(canonicalPathname);
344
- let interception: InterceptionContext | undefined;
345
-
346
- // Stage 2a: Intercepting route resolution (modal pattern).
347
- // On soft navigation, check if an intercepting route should render instead.
348
- // The client sends X-Timber-URL with the current pathname (where they're
349
- // navigating FROM). If a rewrite matches, re-route to the source URL so
350
- // the source layout renders with the intercepted content in the slot.
351
- const sourceUrl = req.headers.get('X-Timber-URL');
352
- if (sourceUrl && config.interceptionRewrites?.length) {
353
- const intercepted = findInterceptionMatch(
354
- canonicalPathname,
355
- sourceUrl,
356
- config.interceptionRewrites
357
- );
358
- if (intercepted) {
359
- const sourceMatch = matchRoute(intercepted.sourcePathname);
360
- if (sourceMatch) {
361
- match = sourceMatch;
362
- interception = { targetPathname: canonicalPathname };
363
- }
364
- }
365
- }
366
-
367
- if (!match) {
368
- // No route matched — render 404.tsx in root layout if available,
369
- // otherwise fall back to a bare 404 Response.
370
- if (config.renderNoMatch) {
371
- const responseHeaders = new Headers();
372
- return config.renderNoMatch(req, responseHeaders);
373
- }
374
- return new Response(null, { status: 404 });
375
- }
376
-
377
- // Response and request header containers — created before early hints so
378
- // the emitter can append Link headers (e.g. for Cloudflare CDN → 103).
379
- const responseHeaders = new Headers();
380
- const requestHeaderOverlay = new Headers();
381
-
382
- // Set Cache-Control for dynamic HTML responses. Without this header,
383
- // CDNs (particularly Cloudflare) may attempt to buffer/process the
384
- // response differently, causing intermittent multi-second delays.
385
- // This matches Next.js's default behavior.
386
- responseHeaders.set('Cache-Control', 'private, no-cache, no-store, max-age=0, must-revalidate');
387
-
388
- // Stage 2b: 103 Early Hints (before middleware, after match)
389
- // Fires before middleware so the browser can begin fetching critical
390
- // assets while middleware runs. Non-fatal — a failing emitter never
391
- // blocks the request.
392
- if (earlyHints) {
393
- try {
394
- await earlyHints(match, req, responseHeaders);
395
- } catch {
396
- // Early hints failure is non-fatal
397
- }
398
- }
399
-
400
- // Stage 3: Leaf middleware.ts (only the leaf route's middleware runs)
401
- if (match.middleware) {
402
- const ctx: MiddlewareContext = {
403
- req,
404
- requestHeaders: requestHeaderOverlay,
405
- headers: responseHeaders,
406
- params: match.params,
407
- searchParams: new URL(req.url).searchParams,
408
- earlyHints: (hints) => {
409
- for (const hint of hints) {
410
- let value = `<${hint.href}>; rel=${hint.rel}`;
411
- if (hint.as !== undefined) value += `; as=${hint.as}`;
412
- if (hint.crossOrigin !== undefined) value += `; crossorigin=${hint.crossOrigin}`;
413
- if (hint.fetchPriority !== undefined) value += `; fetchpriority=${hint.fetchPriority}`;
414
- responseHeaders.append('Link', value);
415
- }
416
- },
417
- };
418
-
419
- try {
420
- // Enable cookie mutation during middleware (design/29-cookies.md §"Context Tracking")
421
- setMutableCookieContext(true);
422
- const middlewareFn = () => runMiddleware(match.middleware!, ctx);
423
- const middlewareResponse = await withSpan('timber.middleware', {}, () =>
424
- enableServerTiming ? withTiming('mw', 'middleware.ts', middlewareFn) : middlewareFn()
425
- );
426
- setMutableCookieContext(false);
427
- if (middlewareResponse) {
428
- // Apply cookie jar to short-circuit response.
429
- // Response.redirect() creates immutable headers, so ensure
430
- // mutability before appending Set-Cookie entries.
431
- const finalResponse = ensureMutableResponse(middlewareResponse);
432
- applyCookieJar(finalResponse.headers);
433
- logMiddlewareShortCircuit({ method, path, status: finalResponse.status });
434
- return finalResponse;
435
- }
436
- // Middleware succeeded without short-circuiting — apply any
437
- // injected request headers so headers() returns them downstream.
438
- applyRequestHeaderOverlay(requestHeaderOverlay);
439
- } catch (error) {
440
- setMutableCookieContext(false);
441
- // RedirectSignal from middleware → HTTP redirect (not an error).
442
- // For RSC payload requests (client navigation), return 204 + X-Timber-Redirect
443
- // so the client router can perform a soft SPA redirect. A raw 302 would be
444
- // turned into an opaque redirect by fetch({redirect:'manual'}), crashing
445
- // createFromFetch. See design/19-client-navigation.md.
446
- if (error instanceof RedirectSignal) {
447
- applyCookieJar(responseHeaders);
448
- const isRsc = (req.headers.get('Accept') ?? '').includes('text/x-component');
449
- if (isRsc) {
450
- responseHeaders.set('X-Timber-Redirect', error.location);
451
- return new Response(null, { status: 204, headers: responseHeaders });
452
- }
453
- responseHeaders.set('Location', error.location);
454
- return new Response(null, { status: error.status, headers: responseHeaders });
455
- }
456
- // DenySignal from middleware → HTTP deny status
457
- if (error instanceof DenySignal) {
458
- return new Response(null, { status: error.status });
459
- }
460
- // Middleware throw → HTTP 500 (middleware runs before rendering,
461
- // no error boundary to catch it)
462
- logMiddlewareError({ method, path, error });
463
- await fireOnRequestError(error, req, 'handler');
464
- if (onPipelineError && error instanceof Error) onPipelineError(error, 'middleware');
465
- return new Response(null, { status: 500 });
466
- }
467
- }
468
-
469
- // Apply cookie jar to response headers before render commits them.
470
- // Middleware may have set cookies; they need to be on responseHeaders
471
- // before flushResponse creates the Response object.
472
- applyCookieJar(responseHeaders);
473
-
474
- // Stage 4: Render (access gates + element tree + renderToReadableStream)
475
- try {
476
- const renderFn = () =>
477
- render(req, match, responseHeaders, requestHeaderOverlay, interception);
478
- const response = await withSpan('timber.render', { 'http.route': canonicalPathname }, () =>
479
- enableServerTiming ? withTiming('render', 'RSC + SSR render', renderFn) : renderFn()
480
- );
481
- markResponseFlushed();
482
- return response;
483
- } catch (error) {
484
- // DenySignal leaked from render (e.g. notFound() in metadata()).
485
- // Return the deny status code instead of 500.
486
- if (error instanceof DenySignal) {
487
- return new Response(null, { status: error.status });
488
- }
489
- // RedirectSignal leaked from render — honour the redirect.
490
- // For RSC payload requests, return 204 + X-Timber-Redirect so the
491
- // client router can perform a soft SPA redirect (same as middleware path).
492
- if (error instanceof RedirectSignal) {
493
- const isRsc = (req.headers.get('Accept') ?? '').includes('text/x-component');
494
- if (isRsc) {
495
- responseHeaders.set('X-Timber-Redirect', error.location);
496
- return new Response(null, { status: 204, headers: responseHeaders });
497
- }
498
- responseHeaders.set('Location', error.location);
499
- return new Response(null, { status: error.status, headers: responseHeaders });
500
- }
501
- logRenderError({ method, path, error });
502
- await fireOnRequestError(error, req, 'render');
503
- if (onPipelineError && error instanceof Error) onPipelineError(error, 'render');
504
- // Try fallback error page before bare 500
505
- if (config.renderFallbackError) {
506
- try {
507
- return await config.renderFallbackError(error, req, responseHeaders);
508
- } catch {
509
- // Fallback rendering itself failed — fall through to bare 500
510
- }
511
- }
512
- return new Response(null, { status: 500 });
513
- }
514
- }
515
- }
516
-
517
- /**
518
- * Fire the user's onRequestError hook with request context.
519
- * Extracts request info from the Request object and calls the instrumentation hook.
520
- */
521
- async function fireOnRequestError(
522
- error: unknown,
523
- req: Request,
524
- phase: 'proxy' | 'handler' | 'render' | 'action' | 'route'
525
- ): Promise<void> {
526
- const url = new URL(req.url);
527
- const headersObj: Record<string, string> = {};
528
- req.headers.forEach((v, k) => {
529
- headersObj[k] = v;
530
- });
531
-
532
- await callOnRequestError(
533
- error,
534
- { method: req.method, path: url.pathname, headers: headersObj },
535
- { phase, routePath: url.pathname, routeType: 'page', traceId: traceId() }
536
- );
537
- }
538
-
539
- // ─── Cookie Helpers ──────────────────────────────────────────────────────
540
-
541
- /**
542
- * Apply all Set-Cookie headers from the cookie jar to a Headers object.
543
- * Each cookie gets its own Set-Cookie header per RFC 6265 §4.1.
544
- */
545
- function applyCookieJar(headers: Headers): void {
546
- for (const value of getSetCookieHeaders()) {
547
- headers.append('Set-Cookie', value);
548
- }
549
- }
550
-
551
- // ─── Immutable Response Helpers ──────────────────────────────────────────
552
-
553
- /**
554
- * Ensure a Response has mutable headers so the pipeline can safely append
555
- * Set-Cookie and Server-Timing entries.
556
- *
557
- * `Response.redirect()` and some platform-level responses return objects
558
- * with immutable headers. Calling `.set()` or `.append()` on them throws
559
- * `TypeError: immutable`. This helper detects the immutable case by
560
- * attempting a no-op write and, on failure, clones into a fresh Response
561
- * with mutable headers.
562
- */
563
- function ensureMutableResponse(response: Response): Response {
564
- try {
565
- // Probe mutability with a benign operation that we immediately undo.
566
- // We pick a header name that is extremely unlikely to collide with
567
- // anything meaningful and delete it right away.
568
- response.headers.set('X-Timber-Probe', '1');
569
- response.headers.delete('X-Timber-Probe');
570
- return response;
571
- } catch {
572
- // Headers are immutable — rebuild with mutable headers.
573
- return new Response(response.body, {
574
- status: response.status,
575
- statusText: response.statusText,
576
- headers: new Headers(response.headers),
577
- });
578
- }
579
379
  }