@timber-js/app 0.2.0-alpha.15 → 0.2.0-alpha.151

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 (854) hide show
  1. package/LICENSE +8 -0
  2. package/dist/_chunks/actions-a0RczDnB.js +1106 -0
  3. package/dist/_chunks/actions-a0RczDnB.js.map +1 -0
  4. package/dist/_chunks/build-output-helper-B20ZuTSA.js +102 -0
  5. package/dist/_chunks/build-output-helper-B20ZuTSA.js.map +1 -0
  6. package/dist/_chunks/cache-api-Co-yI-gP.js +424 -0
  7. package/dist/_chunks/cache-api-Co-yI-gP.js.map +1 -0
  8. package/dist/_chunks/{metadata-routes-Cjmvi3rQ.js → canonicalize-P41GR6tY.js} +94 -18
  9. package/dist/_chunks/canonicalize-P41GR6tY.js.map +1 -0
  10. package/dist/_chunks/cli-schema-sync-DJDdyEae.js +629 -0
  11. package/dist/_chunks/cli-schema-sync-DJDdyEae.js.map +1 -0
  12. package/dist/_chunks/cli-schema-sync-D_IhHEUW.js +2 -0
  13. package/dist/_chunks/codec-registry-oOUxugz3.js +21 -0
  14. package/dist/_chunks/codec-registry-oOUxugz3.js.map +1 -0
  15. package/dist/_chunks/define-Bssfp6ot.js +82 -0
  16. package/dist/_chunks/define-Bssfp6ot.js.map +1 -0
  17. package/dist/_chunks/define-CFmvb4Bt.js +203 -0
  18. package/dist/_chunks/define-CFmvb4Bt.js.map +1 -0
  19. package/dist/_chunks/fast-hash-D6hIVt1Y.js +36 -0
  20. package/dist/_chunks/fast-hash-D6hIVt1Y.js.map +1 -0
  21. package/dist/_chunks/format-CfwjgPz9.js +14 -0
  22. package/dist/_chunks/format-CfwjgPz9.js.map +1 -0
  23. package/dist/_chunks/href-validation-FiA_rToW.js +141 -0
  24. package/dist/_chunks/href-validation-FiA_rToW.js.map +1 -0
  25. package/dist/_chunks/logger-CM0clugc.js +645 -0
  26. package/dist/_chunks/logger-CM0clugc.js.map +1 -0
  27. package/dist/_chunks/navigation-root-bUDZLw74.js +124 -0
  28. package/dist/_chunks/navigation-root-bUDZLw74.js.map +1 -0
  29. package/dist/_chunks/plugin-context-DurqFBuY.js +2 -0
  30. package/dist/_chunks/plugin-context-GfDWsdd2.js +268 -0
  31. package/dist/_chunks/plugin-context-GfDWsdd2.js.map +1 -0
  32. package/dist/_chunks/registry-DbJPKoBp.js +20 -0
  33. package/dist/_chunks/registry-DbJPKoBp.js.map +1 -0
  34. package/dist/_chunks/resolve-schema-3iUvBV5T.js +50 -0
  35. package/dist/_chunks/resolve-schema-3iUvBV5T.js.map +1 -0
  36. package/dist/_chunks/router-ref-CtmF-aPv.js +28 -0
  37. package/dist/_chunks/router-ref-CtmF-aPv.js.map +1 -0
  38. package/dist/_chunks/schema-bridge-BY3QLBL7.js +119 -0
  39. package/dist/_chunks/schema-bridge-BY3QLBL7.js.map +1 -0
  40. package/dist/_chunks/segment-classify-CDDRVKs7.js +137 -0
  41. package/dist/_chunks/segment-classify-CDDRVKs7.js.map +1 -0
  42. package/dist/_chunks/segment-context-ZDnXDkbz.js +34 -0
  43. package/dist/_chunks/segment-context-ZDnXDkbz.js.map +1 -0
  44. package/dist/_chunks/{ssr-data-MjmprTmO.js → ssr-data-BOWsq18U.js} +1 -1
  45. package/dist/_chunks/ssr-data-BOWsq18U.js.map +1 -0
  46. package/dist/_chunks/tree-match-D2l830j2.js +102 -0
  47. package/dist/_chunks/tree-match-D2l830j2.js.map +1 -0
  48. package/dist/_chunks/{use-query-states-D5KaffOK.js → use-query-states-CbeQmext.js} +7 -20
  49. package/dist/_chunks/use-query-states-CbeQmext.js.map +1 -0
  50. package/dist/_chunks/use-segment-params-D1CzlgBo.js +151 -0
  51. package/dist/_chunks/use-segment-params-D1CzlgBo.js.map +1 -0
  52. package/dist/_chunks/validation-taUkvA4Q.js +113 -0
  53. package/dist/_chunks/validation-taUkvA4Q.js.map +1 -0
  54. package/dist/_chunks/walkers-DvWDj453.js +790 -0
  55. package/dist/_chunks/walkers-DvWDj453.js.map +1 -0
  56. package/dist/adapters/build-output-helper.d.ts +28 -0
  57. package/dist/adapters/build-output-helper.d.ts.map +1 -0
  58. package/dist/adapters/cloudflare-dev.d.ts +109 -0
  59. package/dist/adapters/cloudflare-dev.d.ts.map +1 -0
  60. package/dist/adapters/cloudflare-dev.js +73 -0
  61. package/dist/adapters/cloudflare-dev.js.map +1 -0
  62. package/dist/adapters/cloudflare-kv-cache.d.ts +64 -0
  63. package/dist/adapters/cloudflare-kv-cache.d.ts.map +1 -0
  64. package/dist/adapters/cloudflare-kv-cache.js +117 -0
  65. package/dist/adapters/cloudflare-kv-cache.js.map +1 -0
  66. package/dist/adapters/cloudflare.d.ts +142 -20
  67. package/dist/adapters/cloudflare.d.ts.map +1 -1
  68. package/dist/adapters/cloudflare.js +150 -64
  69. package/dist/adapters/cloudflare.js.map +1 -1
  70. package/dist/adapters/compress-module.d.ts +5 -4
  71. package/dist/adapters/compress-module.d.ts.map +1 -1
  72. package/dist/adapters/nitro.d.ts +17 -3
  73. package/dist/adapters/nitro.d.ts.map +1 -1
  74. package/dist/adapters/nitro.js +146 -147
  75. package/dist/adapters/nitro.js.map +1 -1
  76. package/dist/adapters/shared.d.ts +16 -0
  77. package/dist/adapters/shared.d.ts.map +1 -0
  78. package/dist/cache/cache-api.d.ts +24 -0
  79. package/dist/cache/cache-api.d.ts.map +1 -0
  80. package/dist/cache/handler-store.d.ts +31 -0
  81. package/dist/cache/handler-store.d.ts.map +1 -0
  82. package/dist/cache/index.d.ts +25 -7
  83. package/dist/cache/index.d.ts.map +1 -1
  84. package/dist/cache/index.js +100 -240
  85. package/dist/cache/index.js.map +1 -1
  86. package/dist/cache/invalidation-epoch.d.ts +43 -0
  87. package/dist/cache/invalidation-epoch.d.ts.map +1 -0
  88. package/dist/cache/redis-handler.d.ts +85 -8
  89. package/dist/cache/redis-handler.d.ts.map +1 -1
  90. package/dist/cache/singleflight.d.ts +18 -1
  91. package/dist/cache/singleflight.d.ts.map +1 -1
  92. package/dist/cache/sizeof.d.ts +22 -0
  93. package/dist/cache/sizeof.d.ts.map +1 -0
  94. package/dist/cache/stable-stringify.d.ts +9 -0
  95. package/dist/cache/stable-stringify.d.ts.map +1 -1
  96. package/dist/cache/timber-cache.d.ts +20 -10
  97. package/dist/cache/timber-cache.d.ts.map +1 -1
  98. package/dist/cli-schema-sync.d.ts +59 -0
  99. package/dist/cli-schema-sync.d.ts.map +1 -0
  100. package/dist/cli.d.ts +26 -2
  101. package/dist/cli.d.ts.map +1 -1
  102. package/dist/cli.js +70 -33
  103. package/dist/cli.js.map +1 -1
  104. package/dist/client/browser-dev.d.ts +34 -1
  105. package/dist/client/browser-dev.d.ts.map +1 -1
  106. package/dist/client/browser-entry/action-dispatch.d.ts +17 -0
  107. package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -0
  108. package/dist/client/browser-entry/hmr.d.ts +21 -0
  109. package/dist/client/browser-entry/hmr.d.ts.map +1 -0
  110. package/dist/client/browser-entry/hydrate.d.ts +46 -0
  111. package/dist/client/browser-entry/hydrate.d.ts.map +1 -0
  112. package/dist/client/browser-entry/index.d.ts +29 -0
  113. package/dist/client/browser-entry/index.d.ts.map +1 -0
  114. package/dist/client/browser-entry/post-hydration.d.ts +26 -0
  115. package/dist/client/browser-entry/post-hydration.d.ts.map +1 -0
  116. package/dist/client/browser-entry/router-init.d.ts +26 -0
  117. package/dist/client/browser-entry/router-init.d.ts.map +1 -0
  118. package/dist/client/browser-entry/rsc-stream.d.ts +24 -0
  119. package/dist/client/browser-entry/rsc-stream.d.ts.map +1 -0
  120. package/dist/client/browser-entry/scroll.d.ts +28 -0
  121. package/dist/client/browser-entry/scroll.d.ts.map +1 -0
  122. package/dist/client/error-boundary.d.ts +12 -5
  123. package/dist/client/error-boundary.d.ts.map +1 -1
  124. package/dist/client/error-boundary.js +47 -10
  125. package/dist/client/error-boundary.js.map +1 -1
  126. package/dist/client/error-reconstituter.d.ts +61 -0
  127. package/dist/client/error-reconstituter.d.ts.map +1 -0
  128. package/dist/client/form.d.ts +16 -27
  129. package/dist/client/form.d.ts.map +1 -1
  130. package/dist/client/history.d.ts +11 -3
  131. package/dist/client/history.d.ts.map +1 -1
  132. package/dist/client/index.d.ts +10 -24
  133. package/dist/client/index.d.ts.map +1 -1
  134. package/dist/client/index.js +183 -1134
  135. package/dist/client/index.js.map +1 -1
  136. package/dist/client/internal.d.ts +19 -0
  137. package/dist/client/internal.d.ts.map +1 -0
  138. package/dist/client/internal.js +900 -0
  139. package/dist/client/internal.js.map +1 -0
  140. package/dist/client/link.d.ts +69 -60
  141. package/dist/client/link.d.ts.map +1 -1
  142. package/dist/client/navigation-api-types.d.ts +90 -0
  143. package/dist/client/navigation-api-types.d.ts.map +1 -0
  144. package/dist/client/navigation-api.d.ts +122 -0
  145. package/dist/client/navigation-api.d.ts.map +1 -0
  146. package/dist/client/navigation-context.d.ts +3 -2
  147. package/dist/client/navigation-context.d.ts.map +1 -1
  148. package/dist/client/navigation-root.d.ts +119 -0
  149. package/dist/client/navigation-root.d.ts.map +1 -0
  150. package/dist/client/nuqs-adapter.d.ts +1 -1
  151. package/dist/client/nuqs-adapter.d.ts.map +1 -1
  152. package/dist/client/router-ref.d.ts +1 -1
  153. package/dist/client/router.d.ts +86 -10
  154. package/dist/client/router.d.ts.map +1 -1
  155. package/dist/client/rsc-fetch.d.ts +46 -3
  156. package/dist/client/rsc-fetch.d.ts.map +1 -1
  157. package/dist/client/segment-cache.d.ts +3 -1
  158. package/dist/client/segment-cache.d.ts.map +1 -1
  159. package/dist/client/segment-outlet.d.ts +49 -0
  160. package/dist/client/segment-outlet.d.ts.map +1 -0
  161. package/dist/client/segment-update-context.d.ts +21 -0
  162. package/dist/client/segment-update-context.d.ts.map +1 -0
  163. package/dist/client/shallow-url.d.ts +10 -0
  164. package/dist/client/shallow-url.d.ts.map +1 -0
  165. package/dist/client/ssr-data.d.ts +13 -4
  166. package/dist/client/ssr-data.d.ts.map +1 -1
  167. package/dist/client/state.d.ts +1 -1
  168. package/dist/client/top-loader.d.ts +5 -5
  169. package/dist/client/top-loader.d.ts.map +1 -1
  170. package/dist/client/use-cookie.d.ts +12 -0
  171. package/dist/client/use-cookie.d.ts.map +1 -1
  172. package/dist/client/use-link-status.d.ts +5 -5
  173. package/dist/client/use-link-status.d.ts.map +1 -1
  174. package/dist/client/use-pathname.d.ts.map +1 -1
  175. package/dist/client/use-pending-navigation.d.ts +23 -0
  176. package/dist/client/use-pending-navigation.d.ts.map +1 -0
  177. package/dist/client/use-query-states.d.ts +1 -1
  178. package/dist/client/use-query-states.d.ts.map +1 -1
  179. package/dist/client/use-router.d.ts +1 -1
  180. package/dist/client/use-router.d.ts.map +1 -1
  181. package/dist/client/use-search-params.d.ts +12 -5
  182. package/dist/client/use-search-params.d.ts.map +1 -1
  183. package/dist/client/{use-params.d.ts → use-segment-params.d.ts} +8 -6
  184. package/dist/client/use-segment-params.d.ts.map +1 -0
  185. package/dist/codec.d.ts +69 -0
  186. package/dist/codec.d.ts.map +1 -0
  187. package/dist/codec.js +75 -0
  188. package/dist/codec.js.map +1 -0
  189. package/dist/config-types.d.ts +294 -0
  190. package/dist/config-types.d.ts.map +1 -0
  191. package/dist/config-validation.d.ts +51 -0
  192. package/dist/config-validation.d.ts.map +1 -0
  193. package/dist/content/index.d.ts +1 -10
  194. package/dist/content/index.d.ts.map +1 -1
  195. package/dist/content/index.js +0 -2
  196. package/dist/cookies/define-cookie.d.ts +58 -25
  197. package/dist/cookies/define-cookie.d.ts.map +1 -1
  198. package/dist/cookies/index.d.ts +2 -1
  199. package/dist/cookies/index.d.ts.map +1 -1
  200. package/dist/cookies/index.js +249 -36
  201. package/dist/cookies/index.js.map +1 -1
  202. package/dist/cookies/json-cookie.d.ts +64 -0
  203. package/dist/cookies/json-cookie.d.ts.map +1 -0
  204. package/dist/cookies/validation.d.ts +34 -0
  205. package/dist/cookies/validation.d.ts.map +1 -0
  206. package/dist/dev-tools/404-page.d.ts +50 -0
  207. package/dist/dev-tools/404-page.d.ts.map +1 -0
  208. package/dist/dev-tools/browser-logs.d.ts +84 -0
  209. package/dist/dev-tools/browser-logs.d.ts.map +1 -0
  210. package/dist/dev-tools/dev-page-shell.d.ts +78 -0
  211. package/dist/dev-tools/dev-page-shell.d.ts.map +1 -0
  212. package/dist/dev-tools/error-page.d.ts +32 -0
  213. package/dist/dev-tools/error-page.d.ts.map +1 -0
  214. package/dist/dev-tools/holding-server.d.ts +54 -0
  215. package/dist/dev-tools/holding-server.d.ts.map +1 -0
  216. package/dist/dev-tools/hydration-overlay.d.ts +11 -0
  217. package/dist/dev-tools/hydration-overlay.d.ts.map +1 -0
  218. package/dist/dev-tools/index.d.ts +31 -0
  219. package/dist/dev-tools/index.d.ts.map +1 -0
  220. package/dist/dev-tools/instrumentation.d.ts +59 -0
  221. package/dist/dev-tools/instrumentation.d.ts.map +1 -0
  222. package/dist/{server/dev-logger.d.ts → dev-tools/logger.d.ts} +1 -1
  223. package/dist/dev-tools/logger.d.ts.map +1 -0
  224. package/dist/{plugins/dev-logs.d.ts → dev-tools/logs.d.ts} +2 -2
  225. package/dist/dev-tools/logs.d.ts.map +1 -0
  226. package/dist/dev-tools/overlay.d.ts +91 -0
  227. package/dist/dev-tools/overlay.d.ts.map +1 -0
  228. package/dist/dev-tools/stack-classifier.d.ts +34 -0
  229. package/dist/dev-tools/stack-classifier.d.ts.map +1 -0
  230. package/dist/dev-tools/terminal.d.ts +28 -0
  231. package/dist/dev-tools/terminal.d.ts.map +1 -0
  232. package/dist/fonts/ast-walk.d.ts +68 -0
  233. package/dist/fonts/ast-walk.d.ts.map +1 -0
  234. package/dist/fonts/ast.d.ts +110 -6
  235. package/dist/fonts/ast.d.ts.map +1 -1
  236. package/dist/fonts/bundle.d.ts +50 -0
  237. package/dist/fonts/bundle.d.ts.map +1 -0
  238. package/dist/fonts/dev-middleware.d.ts +22 -0
  239. package/dist/fonts/dev-middleware.d.ts.map +1 -0
  240. package/dist/fonts/fallbacks.d.ts +0 -7
  241. package/dist/fonts/fallbacks.d.ts.map +1 -1
  242. package/dist/fonts/google.d.ts +4 -2
  243. package/dist/fonts/google.d.ts.map +1 -1
  244. package/dist/fonts/local.d.ts +4 -4
  245. package/dist/fonts/local.d.ts.map +1 -1
  246. package/dist/fonts/paths.d.ts +43 -0
  247. package/dist/fonts/paths.d.ts.map +1 -0
  248. package/dist/fonts/pipeline.d.ts +158 -0
  249. package/dist/fonts/pipeline.d.ts.map +1 -0
  250. package/dist/fonts/transform.d.ts +78 -0
  251. package/dist/fonts/transform.d.ts.map +1 -0
  252. package/dist/fonts/types.d.ts +47 -1
  253. package/dist/fonts/types.d.ts.map +1 -1
  254. package/dist/fonts/virtual-modules.d.ts +77 -0
  255. package/dist/fonts/virtual-modules.d.ts.map +1 -0
  256. package/dist/index.d.ts +46 -180
  257. package/dist/index.d.ts.map +1 -1
  258. package/dist/index.js +6452 -13421
  259. package/dist/index.js.map +1 -1
  260. package/dist/params/codec-registry.d.ts +26 -0
  261. package/dist/params/codec-registry.d.ts.map +1 -0
  262. package/dist/params/define-schema.d.ts +81 -0
  263. package/dist/params/define-schema.d.ts.map +1 -0
  264. package/dist/params/index.d.ts +5 -0
  265. package/dist/params/index.d.ts.map +1 -0
  266. package/dist/params/index.js +34 -0
  267. package/dist/params/index.js.map +1 -0
  268. package/dist/params/resolve-schema.d.ts +34 -0
  269. package/dist/params/resolve-schema.d.ts.map +1 -0
  270. package/dist/plugin-context.d.ts +137 -0
  271. package/dist/plugin-context.d.ts.map +1 -0
  272. package/dist/plugins/adapter-build.d.ts +20 -1
  273. package/dist/plugins/adapter-build.d.ts.map +1 -1
  274. package/dist/plugins/build-manifest.d.ts +7 -3
  275. package/dist/plugins/build-manifest.d.ts.map +1 -1
  276. package/dist/plugins/build-report.d.ts +9 -7
  277. package/dist/plugins/build-report.d.ts.map +1 -1
  278. package/dist/plugins/cache.d.ts +73 -0
  279. package/dist/plugins/cache.d.ts.map +1 -0
  280. package/dist/plugins/client-chunks.d.ts +39 -0
  281. package/dist/plugins/client-chunks.d.ts.map +1 -0
  282. package/dist/plugins/cloudflare-wasm.d.ts +21 -0
  283. package/dist/plugins/cloudflare-wasm.d.ts.map +1 -0
  284. package/dist/plugins/content.d.ts +1 -1
  285. package/dist/plugins/content.d.ts.map +1 -1
  286. package/dist/plugins/dev-server.d.ts +17 -1
  287. package/dist/plugins/dev-server.d.ts.map +1 -1
  288. package/dist/plugins/entries.d.ts +1 -1
  289. package/dist/plugins/entries.d.ts.map +1 -1
  290. package/dist/plugins/fonts.d.ts +16 -73
  291. package/dist/plugins/fonts.d.ts.map +1 -1
  292. package/dist/plugins/mdx.d.ts +1 -1
  293. package/dist/plugins/mdx.d.ts.map +1 -1
  294. package/dist/plugins/routing.d.ts +1 -1
  295. package/dist/plugins/routing.d.ts.map +1 -1
  296. package/dist/plugins/server-bundle.d.ts.map +1 -1
  297. package/dist/plugins/shims.d.ts +29 -5
  298. package/dist/plugins/shims.d.ts.map +1 -1
  299. package/dist/plugins/static-build.d.ts +5 -26
  300. package/dist/plugins/static-build.d.ts.map +1 -1
  301. package/dist/routing/codegen-shared.d.ts +67 -0
  302. package/dist/routing/codegen-shared.d.ts.map +1 -0
  303. package/dist/routing/codegen-types.d.ts +64 -0
  304. package/dist/routing/codegen-types.d.ts.map +1 -0
  305. package/dist/routing/codegen.d.ts +7 -2
  306. package/dist/routing/codegen.d.ts.map +1 -1
  307. package/dist/routing/convention-lint.d.ts +41 -0
  308. package/dist/routing/convention-lint.d.ts.map +1 -0
  309. package/dist/routing/file-cache.d.ts +8 -0
  310. package/dist/routing/file-cache.d.ts.map +1 -0
  311. package/dist/routing/index.d.ts +7 -1
  312. package/dist/routing/index.d.ts.map +1 -1
  313. package/dist/routing/index.js +4 -2
  314. package/dist/routing/interception.d.ts +0 -5
  315. package/dist/routing/interception.d.ts.map +1 -1
  316. package/dist/routing/link-codegen.d.ts +90 -0
  317. package/dist/routing/link-codegen.d.ts.map +1 -0
  318. package/dist/routing/manifest-codegen.d.ts +32 -0
  319. package/dist/routing/manifest-codegen.d.ts.map +1 -0
  320. package/dist/routing/scanner.d.ts +1 -10
  321. package/dist/routing/scanner.d.ts.map +1 -1
  322. package/dist/routing/schema-validation.d.ts +35 -0
  323. package/dist/routing/schema-validation.d.ts.map +1 -0
  324. package/dist/routing/segment-classify.d.ts +75 -0
  325. package/dist/routing/segment-classify.d.ts.map +1 -0
  326. package/dist/routing/segment-codegen.d.ts +38 -0
  327. package/dist/routing/segment-codegen.d.ts.map +1 -0
  328. package/dist/routing/types.d.ts +77 -25
  329. package/dist/routing/types.d.ts.map +1 -1
  330. package/dist/routing/walkers.d.ts +51 -0
  331. package/dist/routing/walkers.d.ts.map +1 -0
  332. package/dist/rsc-runtime/rsc.d.ts +1 -1
  333. package/dist/rsc-runtime/rsc.d.ts.map +1 -1
  334. package/dist/rsc-runtime/ssr.d.ts +12 -0
  335. package/dist/rsc-runtime/ssr.d.ts.map +1 -1
  336. package/dist/schema-bridge.d.ts +91 -0
  337. package/dist/schema-bridge.d.ts.map +1 -0
  338. package/dist/search-params/define.d.ts +157 -0
  339. package/dist/search-params/define.d.ts.map +1 -0
  340. package/dist/search-params/index.d.ts +4 -7
  341. package/dist/search-params/index.d.ts.map +1 -1
  342. package/dist/search-params/index.js +37 -440
  343. package/dist/search-params/index.js.map +1 -1
  344. package/dist/search-params/registry.d.ts +2 -2
  345. package/dist/search-params/registry.d.ts.map +1 -1
  346. package/dist/search-params/wrappers.d.ts +53 -0
  347. package/dist/search-params/wrappers.d.ts.map +1 -0
  348. package/dist/segment-params/define.d.ts +89 -0
  349. package/dist/segment-params/define.d.ts.map +1 -0
  350. package/dist/segment-params/index.d.ts +3 -0
  351. package/dist/segment-params/index.d.ts.map +1 -0
  352. package/dist/segment-params/index.js +2 -0
  353. package/dist/server/access-gate.d.ts +8 -3
  354. package/dist/server/access-gate.d.ts.map +1 -1
  355. package/dist/server/action-client.d.ts +41 -6
  356. package/dist/server/action-client.d.ts.map +1 -1
  357. package/dist/server/action-encryption.d.ts +76 -0
  358. package/dist/server/action-encryption.d.ts.map +1 -0
  359. package/dist/server/action-handler.d.ts +35 -1
  360. package/dist/server/action-handler.d.ts.map +1 -1
  361. package/dist/server/actions.d.ts +9 -30
  362. package/dist/server/actions.d.ts.map +1 -1
  363. package/dist/server/als-registry.d.ts +70 -11
  364. package/dist/server/als-registry.d.ts.map +1 -1
  365. package/dist/server/asset-headers.d.ts +1 -15
  366. package/dist/server/asset-headers.d.ts.map +1 -1
  367. package/dist/server/body-limits.d.ts.map +1 -1
  368. package/dist/server/build-manifest.d.ts +6 -29
  369. package/dist/server/build-manifest.d.ts.map +1 -1
  370. package/dist/server/canonicalize.d.ts +10 -0
  371. package/dist/server/canonicalize.d.ts.map +1 -1
  372. package/dist/server/coalesce-tick.d.ts +40 -0
  373. package/dist/server/coalesce-tick.d.ts.map +1 -0
  374. package/dist/server/cookie-context.d.ts +170 -0
  375. package/dist/server/cookie-context.d.ts.map +1 -0
  376. package/dist/server/cookie-parsing.d.ts +51 -0
  377. package/dist/server/cookie-parsing.d.ts.map +1 -0
  378. package/dist/server/csrf.d.ts +3 -2
  379. package/dist/server/csrf.d.ts.map +1 -1
  380. package/dist/server/default-logger.d.ts +22 -0
  381. package/dist/server/default-logger.d.ts.map +1 -0
  382. package/dist/server/deny-boundary.d.ts +115 -0
  383. package/dist/server/deny-boundary.d.ts.map +1 -0
  384. package/dist/server/deny-renderer.d.ts +2 -2
  385. package/dist/server/deny-renderer.d.ts.map +1 -1
  386. package/dist/server/dev-source-map.d.ts +22 -0
  387. package/dist/server/dev-source-map.d.ts.map +1 -0
  388. package/dist/server/early-hints-sender.d.ts.map +1 -1
  389. package/dist/server/early-hints.d.ts +13 -11
  390. package/dist/server/early-hints.d.ts.map +1 -1
  391. package/dist/server/error-boundary-wrapper.d.ts +7 -1
  392. package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
  393. package/dist/server/fallback-error.d.ts +12 -7
  394. package/dist/server/fallback-error.d.ts.map +1 -1
  395. package/dist/server/flight-injection-state.d.ts +66 -0
  396. package/dist/server/flight-injection-state.d.ts.map +1 -0
  397. package/dist/server/flight-scripts.d.ts +42 -0
  398. package/dist/server/flight-scripts.d.ts.map +1 -0
  399. package/dist/server/form-data.d.ts +29 -0
  400. package/dist/server/form-data.d.ts.map +1 -1
  401. package/dist/server/html-injector-core.d.ts +221 -0
  402. package/dist/server/html-injector-core.d.ts.map +1 -0
  403. package/dist/server/html-injectors.d.ts +81 -41
  404. package/dist/server/html-injectors.d.ts.map +1 -1
  405. package/dist/server/index.d.ts +10 -46
  406. package/dist/server/index.d.ts.map +1 -1
  407. package/dist/server/index.js +170 -2911
  408. package/dist/server/index.js.map +1 -1
  409. package/dist/server/internal.d.ts +44 -0
  410. package/dist/server/internal.d.ts.map +1 -0
  411. package/dist/server/internal.js +3015 -0
  412. package/dist/server/internal.js.map +1 -0
  413. package/dist/server/logger.d.ts +39 -7
  414. package/dist/server/logger.d.ts.map +1 -1
  415. package/dist/server/metadata-routes.d.ts +23 -7
  416. package/dist/server/metadata-routes.d.ts.map +1 -1
  417. package/dist/server/middleware-runner.d.ts +36 -4
  418. package/dist/server/middleware-runner.d.ts.map +1 -1
  419. package/dist/server/node-stream-transforms.d.ts +119 -0
  420. package/dist/server/node-stream-transforms.d.ts.map +1 -0
  421. package/dist/server/param-coercion.d.ts +54 -0
  422. package/dist/server/param-coercion.d.ts.map +1 -0
  423. package/dist/server/pipeline-helpers.d.ts +95 -0
  424. package/dist/server/pipeline-helpers.d.ts.map +1 -0
  425. package/dist/server/pipeline-interception.d.ts +1 -1
  426. package/dist/server/pipeline-interception.d.ts.map +1 -1
  427. package/dist/server/pipeline-metadata.d.ts +6 -0
  428. package/dist/server/pipeline-metadata.d.ts.map +1 -1
  429. package/dist/server/pipeline-outcome.d.ts +49 -0
  430. package/dist/server/pipeline-outcome.d.ts.map +1 -0
  431. package/dist/server/pipeline-phases.d.ts +56 -0
  432. package/dist/server/pipeline-phases.d.ts.map +1 -0
  433. package/dist/server/pipeline.d.ts +122 -19
  434. package/dist/server/pipeline.d.ts.map +1 -1
  435. package/dist/server/port-resolution.d.ts +117 -0
  436. package/dist/server/port-resolution.d.ts.map +1 -0
  437. package/dist/server/primitives.d.ts +75 -31
  438. package/dist/server/primitives.d.ts.map +1 -1
  439. package/dist/server/render-timeout.d.ts +51 -0
  440. package/dist/server/render-timeout.d.ts.map +1 -0
  441. package/dist/server/render-utils.d.ts +25 -0
  442. package/dist/server/render-utils.d.ts.map +1 -0
  443. package/dist/server/request-context.d.ts +62 -107
  444. package/dist/server/request-context.d.ts.map +1 -1
  445. package/dist/server/route-element-builder.d.ts +30 -18
  446. package/dist/server/route-element-builder.d.ts.map +1 -1
  447. package/dist/server/route-handler.d.ts.map +1 -1
  448. package/dist/server/route-matcher.d.ts +25 -36
  449. package/dist/server/route-matcher.d.ts.map +1 -1
  450. package/dist/server/rsc-entry/action-middleware-runner.d.ts +66 -0
  451. package/dist/server/rsc-entry/action-middleware-runner.d.ts.map +1 -0
  452. package/dist/server/rsc-entry/api-handler.d.ts +12 -3
  453. package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
  454. package/dist/server/rsc-entry/error-renderer.d.ts +26 -13
  455. package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
  456. package/dist/server/rsc-entry/helpers.d.ts +51 -23
  457. package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
  458. package/dist/server/rsc-entry/index.d.ts +19 -8
  459. package/dist/server/rsc-entry/index.d.ts.map +1 -1
  460. package/dist/server/rsc-entry/render-route.d.ts +50 -0
  461. package/dist/server/rsc-entry/render-route.d.ts.map +1 -0
  462. package/dist/server/rsc-entry/revalidate-renderer.d.ts +108 -0
  463. package/dist/server/rsc-entry/revalidate-renderer.d.ts.map +1 -0
  464. package/dist/server/rsc-entry/rsc-payload.d.ts +3 -3
  465. package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
  466. package/dist/server/rsc-entry/rsc-stream.d.ts +17 -1
  467. package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
  468. package/dist/server/rsc-entry/ssr-bridge.d.ts +5 -1
  469. package/dist/server/rsc-entry/ssr-bridge.d.ts.map +1 -1
  470. package/dist/server/rsc-entry/ssr-renderer.d.ts +34 -4
  471. package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
  472. package/dist/server/rsc-entry/wrap-action-dispatch.d.ts +119 -0
  473. package/dist/server/rsc-entry/wrap-action-dispatch.d.ts.map +1 -0
  474. package/dist/server/safe-load.d.ts +46 -0
  475. package/dist/server/safe-load.d.ts.map +1 -0
  476. package/dist/server/sensitive-fields.d.ts +74 -0
  477. package/dist/server/sensitive-fields.d.ts.map +1 -0
  478. package/dist/server/sitemap-generator.d.ts +129 -0
  479. package/dist/server/sitemap-generator.d.ts.map +1 -0
  480. package/dist/server/sitemap-handler.d.ts +22 -0
  481. package/dist/server/sitemap-handler.d.ts.map +1 -0
  482. package/dist/server/slot-resolver.d.ts +7 -5
  483. package/dist/server/slot-resolver.d.ts.map +1 -1
  484. package/dist/server/ssr-bridge-types.d.ts +121 -0
  485. package/dist/server/ssr-bridge-types.d.ts.map +1 -0
  486. package/dist/server/ssr-entry.d.ts +2 -43
  487. package/dist/server/ssr-entry.d.ts.map +1 -1
  488. package/dist/server/ssr-render.d.ts +64 -21
  489. package/dist/server/ssr-render.d.ts.map +1 -1
  490. package/dist/server/ssr-wrappers.d.ts +50 -0
  491. package/dist/server/ssr-wrappers.d.ts.map +1 -0
  492. package/dist/server/state-tree-diff.d.ts +12 -5
  493. package/dist/server/state-tree-diff.d.ts.map +1 -1
  494. package/dist/server/status-code-resolver.d.ts +22 -11
  495. package/dist/server/status-code-resolver.d.ts.map +1 -1
  496. package/dist/server/stream-utils.d.ts +36 -0
  497. package/dist/server/stream-utils.d.ts.map +1 -0
  498. package/dist/server/tracing.d.ts +7 -6
  499. package/dist/server/tracing.d.ts.map +1 -1
  500. package/dist/server/tree-builder.d.ts +62 -30
  501. package/dist/server/tree-builder.d.ts.map +1 -1
  502. package/dist/server/tree-match.d.ts +49 -0
  503. package/dist/server/tree-match.d.ts.map +1 -0
  504. package/dist/server/types.d.ts +71 -6
  505. package/dist/server/types.d.ts.map +1 -1
  506. package/dist/server/utils/escape-html.d.ts +14 -0
  507. package/dist/server/utils/escape-html.d.ts.map +1 -0
  508. package/dist/server/utils/mdx-file.d.ts +15 -0
  509. package/dist/server/utils/mdx-file.d.ts.map +1 -0
  510. package/dist/server/version-skew.d.ts +61 -0
  511. package/dist/server/version-skew.d.ts.map +1 -0
  512. package/dist/shared/head-header.d.ts +54 -0
  513. package/dist/shared/head-header.d.ts.map +1 -0
  514. package/dist/shared/href-validation.d.ts +49 -0
  515. package/dist/shared/href-validation.d.ts.map +1 -0
  516. package/dist/shared/merge-search-params.d.ts +22 -0
  517. package/dist/shared/merge-search-params.d.ts.map +1 -0
  518. package/dist/shared/redirect-type.d.ts +17 -0
  519. package/dist/shared/redirect-type.d.ts.map +1 -0
  520. package/dist/shims/font-google.d.ts +1 -1
  521. package/dist/shims/font-google.d.ts.map +1 -1
  522. package/dist/shims/font-google.js +42 -0
  523. package/dist/shims/font-google.js.map +1 -0
  524. package/dist/shims/font-local.d.ts +26 -0
  525. package/dist/shims/font-local.d.ts.map +1 -0
  526. package/dist/shims/font-local.js +20 -0
  527. package/dist/shims/font-local.js.map +1 -0
  528. package/dist/shims/headers.d.ts +53 -1
  529. package/dist/shims/headers.d.ts.map +1 -1
  530. package/dist/shims/image.d.ts +16 -16
  531. package/dist/shims/navigation-client.d.ts +35 -11
  532. package/dist/shims/navigation-client.d.ts.map +1 -1
  533. package/dist/shims/navigation.d.ts +11 -5
  534. package/dist/shims/navigation.d.ts.map +1 -1
  535. package/dist/utils/state-machine.d.ts +80 -0
  536. package/dist/utils/state-machine.d.ts.map +1 -0
  537. package/package.json +63 -24
  538. package/src/adapters/build-output-helper.ts +139 -0
  539. package/src/adapters/cloudflare-dev.ts +177 -0
  540. package/src/adapters/cloudflare-kv-cache.ts +179 -0
  541. package/src/adapters/cloudflare.ts +356 -116
  542. package/src/adapters/compress-module.ts +27 -92
  543. package/src/adapters/nitro.ts +155 -99
  544. package/src/adapters/raw-imports.d.ts +5 -0
  545. package/src/adapters/shared.ts +40 -0
  546. package/src/adapters/wrangler.d.ts +7 -0
  547. package/src/cache/cache-api.ts +47 -0
  548. package/src/cache/handler-store.ts +68 -0
  549. package/src/cache/index.ts +84 -18
  550. package/src/cache/invalidation-epoch.ts +93 -0
  551. package/src/cache/redis-handler.ts +110 -15
  552. package/src/cache/singleflight.ts +62 -4
  553. package/src/cache/sizeof.ts +33 -0
  554. package/src/cache/stable-stringify.ts +65 -2
  555. package/src/cache/timber-cache.ts +132 -36
  556. package/src/cli-schema-sync.ts +388 -0
  557. package/src/cli.ts +98 -34
  558. package/src/client/browser-dev.ts +153 -1
  559. package/src/client/browser-entry/action-dispatch.ts +119 -0
  560. package/src/client/browser-entry/hmr.ts +70 -0
  561. package/src/client/browser-entry/hydrate.ts +187 -0
  562. package/src/client/browser-entry/index.ts +111 -0
  563. package/src/client/browser-entry/post-hydration.ts +104 -0
  564. package/src/client/browser-entry/router-init.ts +292 -0
  565. package/src/client/browser-entry/rsc-stream.ts +157 -0
  566. package/src/client/browser-entry/scroll.ts +50 -0
  567. package/src/client/error-boundary.tsx +127 -22
  568. package/src/client/error-reconstituter.tsx +79 -0
  569. package/src/client/form.tsx +31 -32
  570. package/src/client/history.ts +11 -3
  571. package/src/client/index.ts +67 -45
  572. package/src/client/internal.ts +58 -0
  573. package/src/client/link.tsx +346 -150
  574. package/src/client/navigation-api-types.ts +112 -0
  575. package/src/client/navigation-api.ts +347 -0
  576. package/src/client/navigation-context.ts +15 -7
  577. package/src/client/navigation-root.tsx +355 -0
  578. package/src/client/nuqs-adapter.tsx +16 -3
  579. package/src/client/router-ref.ts +1 -1
  580. package/src/client/router.ts +490 -140
  581. package/src/client/rsc-fetch.ts +220 -17
  582. package/src/client/segment-cache.ts +6 -3
  583. package/src/client/segment-outlet.tsx +77 -0
  584. package/src/client/segment-update-context.ts +42 -0
  585. package/src/client/shallow-url.ts +22 -0
  586. package/src/client/ssr-data.ts +13 -5
  587. package/src/client/state.ts +2 -2
  588. package/src/client/top-loader.tsx +11 -9
  589. package/src/client/use-cookie.ts +31 -2
  590. package/src/client/use-link-status.ts +7 -7
  591. package/src/client/use-pathname.ts +1 -0
  592. package/src/client/use-pending-navigation.ts +40 -0
  593. package/src/client/use-query-states.ts +9 -3
  594. package/src/client/use-router.ts +4 -1
  595. package/src/client/use-search-params.ts +31 -44
  596. package/src/client/{use-params.ts → use-segment-params.ts} +9 -6
  597. package/src/codec.ts +147 -0
  598. package/src/config-types.ts +292 -0
  599. package/src/config-validation.ts +311 -0
  600. package/src/content/index.ts +5 -13
  601. package/src/cookies/define-cookie.ts +217 -53
  602. package/src/cookies/index.ts +12 -1
  603. package/src/cookies/json-cookie.ts +105 -0
  604. package/src/cookies/validation.ts +192 -0
  605. package/src/dev-tools/404-page.ts +286 -0
  606. package/src/dev-tools/browser-logs.ts +291 -0
  607. package/src/dev-tools/dev-page-shell.ts +260 -0
  608. package/src/dev-tools/error-page.ts +331 -0
  609. package/src/dev-tools/holding-server.ts +187 -0
  610. package/src/dev-tools/hydration-overlay.ts +158 -0
  611. package/src/dev-tools/index.ts +83 -0
  612. package/src/dev-tools/instrumentation.ts +213 -0
  613. package/src/{plugins/dev-logs.ts → dev-tools/logs.ts} +9 -5
  614. package/src/dev-tools/overlay.ts +469 -0
  615. package/src/dev-tools/stack-classifier.ts +75 -0
  616. package/src/dev-tools/terminal.ts +183 -0
  617. package/src/fonts/ast-walk.ts +235 -0
  618. package/src/fonts/ast.ts +477 -126
  619. package/src/fonts/bundle.ts +138 -0
  620. package/src/fonts/dev-middleware.ts +85 -0
  621. package/src/fonts/fallbacks.ts +0 -23
  622. package/src/fonts/google.ts +7 -3
  623. package/src/fonts/local.ts +9 -8
  624. package/src/fonts/paths.ts +58 -0
  625. package/src/fonts/pipeline.ts +316 -0
  626. package/src/fonts/transform.ts +344 -0
  627. package/src/fonts/types.ts +52 -1
  628. package/src/fonts/virtual-modules.ts +179 -0
  629. package/src/index.ts +417 -346
  630. package/src/params/codec-registry.ts +34 -0
  631. package/src/params/define-schema.ts +115 -0
  632. package/src/params/index.ts +17 -0
  633. package/src/params/resolve-schema.ts +84 -0
  634. package/src/plugin-context.ts +325 -0
  635. package/src/plugins/adapter-build.ts +98 -4
  636. package/src/plugins/build-manifest.ts +168 -23
  637. package/src/plugins/build-report.ts +16 -25
  638. package/src/plugins/cache.ts +285 -0
  639. package/src/plugins/client-chunks.ts +113 -0
  640. package/src/plugins/cloudflare-wasm.ts +141 -0
  641. package/src/plugins/content.ts +1 -1
  642. package/src/plugins/dev-server.ts +293 -46
  643. package/src/plugins/entries.ts +110 -8
  644. package/src/plugins/fonts.ts +170 -663
  645. package/src/plugins/mdx.ts +47 -10
  646. package/src/plugins/routing.ts +237 -241
  647. package/src/plugins/server-bundle.ts +85 -12
  648. package/src/plugins/shims.ts +207 -64
  649. package/src/plugins/static-build.ts +15 -89
  650. package/src/routing/codegen-shared.ts +115 -0
  651. package/src/routing/codegen-types.ts +65 -0
  652. package/src/routing/codegen.ts +380 -178
  653. package/src/routing/convention-lint.ts +358 -0
  654. package/src/routing/file-cache.ts +23 -0
  655. package/src/routing/index.ts +10 -1
  656. package/src/routing/interception.ts +3 -22
  657. package/src/routing/link-codegen.ts +310 -0
  658. package/src/routing/manifest-codegen.ts +290 -0
  659. package/src/routing/scanner.ts +248 -188
  660. package/src/routing/schema-validation.ts +149 -0
  661. package/src/routing/segment-classify.ts +188 -0
  662. package/src/routing/segment-codegen.ts +98 -0
  663. package/src/routing/types.ts +78 -25
  664. package/src/routing/walkers.ts +90 -0
  665. package/src/rsc-runtime/rsc.ts +2 -0
  666. package/src/rsc-runtime/ssr.ts +50 -0
  667. package/src/rsc-runtime/vendor-types.d.ts +7 -0
  668. package/src/schema-bridge.ts +252 -0
  669. package/src/search-params/define.ts +570 -0
  670. package/src/search-params/index.ts +14 -20
  671. package/src/search-params/registry.ts +2 -2
  672. package/src/search-params/wrappers.ts +110 -0
  673. package/src/segment-params/define.ts +249 -0
  674. package/src/segment-params/index.ts +9 -0
  675. package/src/server/access-gate.tsx +84 -34
  676. package/src/server/action-client.ts +119 -28
  677. package/src/server/action-encryption.ts +144 -0
  678. package/src/server/action-handler.ts +122 -16
  679. package/src/server/actions.ts +39 -53
  680. package/src/server/als-registry.ts +108 -20
  681. package/src/server/asset-headers.ts +8 -34
  682. package/src/server/body-limits.ts +10 -2
  683. package/src/server/build-manifest.ts +13 -56
  684. package/src/server/canonicalize.ts +6 -3
  685. package/src/server/coalesce-tick.ts +75 -0
  686. package/src/server/compress.ts +34 -7
  687. package/src/server/cookie-context.ts +484 -0
  688. package/src/server/cookie-parsing.ts +147 -0
  689. package/src/server/csrf.ts +39 -6
  690. package/src/server/default-logger.ts +99 -0
  691. package/src/server/deny-boundary.ts +311 -0
  692. package/src/server/deny-renderer.ts +80 -64
  693. package/src/server/dev-source-map.ts +31 -0
  694. package/src/server/early-hints-sender.ts +3 -2
  695. package/src/server/early-hints.ts +37 -27
  696. package/src/server/error-boundary-wrapper.ts +61 -22
  697. package/src/server/fallback-error.ts +79 -102
  698. package/src/server/flight-injection-state.ts +113 -0
  699. package/src/server/flight-scripts.ts +62 -0
  700. package/src/server/form-data.ts +101 -5
  701. package/src/server/html-injector-core.ts +437 -0
  702. package/src/server/html-injectors.ts +256 -251
  703. package/src/server/index.ts +29 -183
  704. package/src/server/internal.ts +165 -0
  705. package/src/server/logger.ts +67 -36
  706. package/src/server/metadata-routes.ts +44 -19
  707. package/src/server/middleware-runner.ts +75 -4
  708. package/src/server/node-stream-transforms.ts +331 -0
  709. package/src/server/param-coercion.ts +206 -0
  710. package/src/server/pipeline-helpers.ts +204 -0
  711. package/src/server/pipeline-interception.ts +32 -18
  712. package/src/server/pipeline-metadata.ts +13 -0
  713. package/src/server/pipeline-outcome.ts +197 -0
  714. package/src/server/pipeline-phases.ts +527 -0
  715. package/src/server/pipeline.ts +213 -382
  716. package/src/server/port-resolution.ts +215 -0
  717. package/src/server/primitives.ts +126 -63
  718. package/src/server/render-timeout.ts +108 -0
  719. package/src/server/render-utils.ts +31 -0
  720. package/src/server/request-context.ts +168 -337
  721. package/src/server/route-element-builder.ts +481 -222
  722. package/src/server/route-handler.ts +31 -4
  723. package/src/server/route-matcher.ts +144 -277
  724. package/src/server/rsc-entry/action-middleware-runner.ts +167 -0
  725. package/src/server/rsc-entry/api-handler.ts +69 -32
  726. package/src/server/rsc-entry/error-renderer.ts +306 -89
  727. package/src/server/rsc-entry/helpers.ts +160 -59
  728. package/src/server/rsc-entry/index.ts +299 -329
  729. package/src/server/rsc-entry/render-route.ts +311 -0
  730. package/src/server/rsc-entry/revalidate-renderer.ts +344 -0
  731. package/src/server/rsc-entry/rsc-payload.ts +71 -26
  732. package/src/server/rsc-entry/rsc-stream.ts +85 -13
  733. package/src/server/rsc-entry/ssr-bridge.ts +18 -5
  734. package/src/server/rsc-entry/ssr-renderer.ts +273 -43
  735. package/src/server/rsc-entry/wrap-action-dispatch.ts +449 -0
  736. package/src/server/safe-load.ts +60 -0
  737. package/src/server/sensitive-fields.ts +230 -0
  738. package/src/server/sitemap-generator.ts +338 -0
  739. package/src/server/sitemap-handler.ts +148 -0
  740. package/src/server/slot-resolver.ts +258 -257
  741. package/src/server/ssr-bridge-types.ts +124 -0
  742. package/src/server/ssr-entry.ts +206 -78
  743. package/src/server/ssr-render.ts +345 -82
  744. package/src/server/ssr-wrappers.tsx +141 -0
  745. package/src/server/state-tree-diff.ts +30 -23
  746. package/src/server/status-code-resolver.ts +115 -130
  747. package/src/server/stream-utils.ts +213 -0
  748. package/src/server/tracing.ts +38 -11
  749. package/src/server/tree-builder.ts +204 -90
  750. package/src/server/tree-match.ts +220 -0
  751. package/src/server/types.ts +78 -9
  752. package/src/server/utils/escape-html.ts +20 -0
  753. package/src/server/utils/mdx-file.ts +22 -0
  754. package/src/server/version-skew.ts +104 -0
  755. package/src/shared/head-header.ts +69 -0
  756. package/src/shared/href-validation.ts +159 -0
  757. package/src/shared/merge-search-params.ts +55 -0
  758. package/src/shared/redirect-type.ts +17 -0
  759. package/src/shims/font-google.ts +1 -1
  760. package/src/shims/font-local.ts +34 -0
  761. package/src/shims/headers.ts +122 -1
  762. package/src/shims/navigation-client.ts +51 -29
  763. package/src/shims/navigation.ts +14 -7
  764. package/src/utils/state-machine.ts +111 -0
  765. package/dist/_chunks/als-registry-B7DbZ2hS.js +0 -41
  766. package/dist/_chunks/als-registry-B7DbZ2hS.js.map +0 -1
  767. package/dist/_chunks/debug-B3Gypr3D.js +0 -108
  768. package/dist/_chunks/debug-B3Gypr3D.js.map +0 -1
  769. package/dist/_chunks/format-RyoGQL74.js +0 -164
  770. package/dist/_chunks/format-RyoGQL74.js.map +0 -1
  771. package/dist/_chunks/interception-BOoWmLUA.js +0 -676
  772. package/dist/_chunks/interception-BOoWmLUA.js.map +0 -1
  773. package/dist/_chunks/metadata-routes-Cjmvi3rQ.js.map +0 -1
  774. package/dist/_chunks/request-context-BQUC8PHn.js +0 -330
  775. package/dist/_chunks/request-context-BQUC8PHn.js.map +0 -1
  776. package/dist/_chunks/ssr-data-MjmprTmO.js.map +0 -1
  777. package/dist/_chunks/tracing-CemImE6h.js +0 -187
  778. package/dist/_chunks/tracing-CemImE6h.js.map +0 -1
  779. package/dist/_chunks/use-cookie-DX-l1_5E.js +0 -91
  780. package/dist/_chunks/use-cookie-DX-l1_5E.js.map +0 -1
  781. package/dist/_chunks/use-query-states-D5KaffOK.js.map +0 -1
  782. package/dist/cache/register-cached-function.d.ts +0 -17
  783. package/dist/cache/register-cached-function.d.ts.map +0 -1
  784. package/dist/client/browser-entry.d.ts +0 -21
  785. package/dist/client/browser-entry.d.ts.map +0 -1
  786. package/dist/client/link-status-provider.d.ts +0 -11
  787. package/dist/client/link-status-provider.d.ts.map +0 -1
  788. package/dist/client/segment-merger.d.ts +0 -119
  789. package/dist/client/segment-merger.d.ts.map +0 -1
  790. package/dist/client/stale-reload.d.ts +0 -44
  791. package/dist/client/stale-reload.d.ts.map +0 -1
  792. package/dist/client/transition-root.d.ts +0 -74
  793. package/dist/client/transition-root.d.ts.map +0 -1
  794. package/dist/client/use-navigation-pending.d.ts +0 -26
  795. package/dist/client/use-navigation-pending.d.ts.map +0 -1
  796. package/dist/client/use-params.d.ts.map +0 -1
  797. package/dist/plugins/cache-transform.d.ts +0 -36
  798. package/dist/plugins/cache-transform.d.ts.map +0 -1
  799. package/dist/plugins/dev-error-overlay.d.ts +0 -60
  800. package/dist/plugins/dev-error-overlay.d.ts.map +0 -1
  801. package/dist/plugins/dev-logs.d.ts.map +0 -1
  802. package/dist/plugins/dynamic-transform.d.ts +0 -72
  803. package/dist/plugins/dynamic-transform.d.ts.map +0 -1
  804. package/dist/plugins/server-action-exports.d.ts +0 -26
  805. package/dist/plugins/server-action-exports.d.ts.map +0 -1
  806. package/dist/routing/status-file-lint.d.ts +0 -33
  807. package/dist/routing/status-file-lint.d.ts.map +0 -1
  808. package/dist/search-params/analyze.d.ts +0 -54
  809. package/dist/search-params/analyze.d.ts.map +0 -1
  810. package/dist/search-params/builtin-codecs.d.ts +0 -105
  811. package/dist/search-params/builtin-codecs.d.ts.map +0 -1
  812. package/dist/search-params/codecs.d.ts +0 -53
  813. package/dist/search-params/codecs.d.ts.map +0 -1
  814. package/dist/search-params/create.d.ts +0 -106
  815. package/dist/search-params/create.d.ts.map +0 -1
  816. package/dist/server/dev-fetch-instrumentation.d.ts +0 -22
  817. package/dist/server/dev-fetch-instrumentation.d.ts.map +0 -1
  818. package/dist/server/dev-logger.d.ts.map +0 -1
  819. package/dist/server/dev-span-processor.d.ts +0 -29
  820. package/dist/server/dev-span-processor.d.ts.map +0 -1
  821. package/dist/server/dev-warnings.d.ts +0 -129
  822. package/dist/server/dev-warnings.d.ts.map +0 -1
  823. package/dist/server/flush.d.ts +0 -74
  824. package/dist/server/flush.d.ts.map +0 -1
  825. package/dist/server/manifest-status-resolver.d.ts +0 -58
  826. package/dist/server/manifest-status-resolver.d.ts.map +0 -1
  827. package/dist/server/prerender.d.ts +0 -77
  828. package/dist/server/prerender.d.ts.map +0 -1
  829. package/dist/utils/directive-parser.d.ts +0 -70
  830. package/dist/utils/directive-parser.d.ts.map +0 -1
  831. package/src/cache/register-cached-function.ts +0 -103
  832. package/src/client/browser-entry.ts +0 -678
  833. package/src/client/link-status-provider.tsx +0 -30
  834. package/src/client/segment-merger.ts +0 -339
  835. package/src/client/stale-reload.ts +0 -87
  836. package/src/client/transition-root.tsx +0 -166
  837. package/src/client/use-navigation-pending.ts +0 -38
  838. package/src/plugins/cache-transform.ts +0 -199
  839. package/src/plugins/dev-error-overlay.ts +0 -230
  840. package/src/plugins/dynamic-transform.ts +0 -161
  841. package/src/plugins/server-action-exports.ts +0 -220
  842. package/src/routing/status-file-lint.ts +0 -112
  843. package/src/search-params/analyze.ts +0 -192
  844. package/src/search-params/builtin-codecs.ts +0 -228
  845. package/src/search-params/codecs.ts +0 -153
  846. package/src/search-params/create.ts +0 -321
  847. package/src/server/dev-fetch-instrumentation.ts +0 -96
  848. package/src/server/dev-span-processor.ts +0 -78
  849. package/src/server/dev-warnings.ts +0 -283
  850. package/src/server/flush.ts +0 -182
  851. package/src/server/manifest-status-resolver.ts +0 -215
  852. package/src/server/prerender.ts +0 -139
  853. package/src/utils/directive-parser.ts +0 -529
  854. /package/src/{server/dev-logger.ts → dev-tools/logger.ts} +0 -0
@@ -0,0 +1,311 @@
1
+ /**
2
+ * Route renderer — turns a matched route into a Response.
3
+ *
4
+ * Extracted from `rsc-entry/index.ts` so the entry can stay focused on
5
+ * pipeline construction. This module owns the steps that happen *after*
6
+ * the pipeline has matched a route and before it commits a response:
7
+ * element-tree build, RSC Flight render, and dispatch to either the SSR
8
+ * HTML path or the RSC payload path. It also handles the
9
+ * synchronous-signal escape hatches (deny / redirect / render error
10
+ * thrown during stream creation) so the entry doesn't carry that logic.
11
+ *
12
+ * The function is parameterized over its dependencies — `clientBootstrap`,
13
+ * `clientJsDisabled`, `rootSegment`, `globalError` — so the entry passes
14
+ * them in once at handler-construction time and they ride along on every
15
+ * call. No globals, no closures over the entry's createRequestHandler
16
+ * scope.
17
+ *
18
+ * Design docs: 02-rendering-pipeline.md, 19-client-navigation.md.
19
+ */
20
+
21
+ import type { BuildManifest } from '../build-manifest.js';
22
+ import {
23
+ buildCssLinkTags,
24
+ buildFontPreloadTags,
25
+ buildModulepreloadTags,
26
+ collectRouteCss,
27
+ collectRouteFonts,
28
+ collectRouteModulepreloads,
29
+ } from '../build-manifest.js';
30
+ import { isDevMode } from '../debug.js';
31
+ import type { LayoutEntry } from '../deny-renderer.js';
32
+ import { renderDenyPage, renderDenyPageAsRsc } from '../deny-renderer.js';
33
+ import type { ClientBootstrapConfig } from '../html-injectors.js';
34
+ import type { InterceptionContext, RouteMatch } from '../pipeline.js';
35
+ import { buildRouteElement, ParamCoercionError } from '../route-element-builder.js';
36
+ import type { ManifestSegmentNode } from '../route-matcher.js';
37
+ import { recordTiming } from '../server-timing.js';
38
+ import { requestContextAls } from '../als-registry.js';
39
+ import { parseClientStateTree } from '../state-tree-diff.js';
40
+
41
+ import { handleApiRoute } from './api-handler.js';
42
+ import { renderErrorPage, renderNoMatchPage } from './error-renderer.js';
43
+ import {
44
+ buildRedirectResponse,
45
+ createDebugChannelSink,
46
+ escapeHtml,
47
+ isRscPayloadRequest,
48
+ } from './helpers.js';
49
+ import { buildRscPayloadResponse } from './rsc-payload.js';
50
+ import { renderRscStream } from './rsc-stream.js';
51
+ import { renderSsrResponse } from './ssr-renderer.js';
52
+ import { callSsr } from './ssr-bridge.js';
53
+
54
+ /**
55
+ * Static-per-handler dependencies for `renderRoute` — captured once at
56
+ * handler construction so each per-request call site only has to pass
57
+ * the request-specific arguments.
58
+ */
59
+ export interface RenderRouteDeps {
60
+ clientBootstrap: ClientBootstrapConfig;
61
+ clientJsDisabled: boolean;
62
+ rootSegment: ManifestSegmentNode;
63
+ buildManifest: BuildManifest;
64
+ globalError?: { load: () => Promise<unknown>; filePath: string };
65
+ }
66
+
67
+ /**
68
+ * Render a matched route to an HTML Response via RSC → SSR pipeline,
69
+ * or return a raw RSC Flight stream for client-side navigation requests.
70
+ *
71
+ * 1. Load page/layout components from the segment chain
72
+ * 2. Resolve metadata
73
+ * 3. Render to RSC Flight stream (serializes "use client" as references)
74
+ * 4. If Accept: text/x-component → return RSC stream directly
75
+ * Otherwise → pass RSC stream to SSR entry for HTML rendering
76
+ */
77
+ export async function renderRoute(
78
+ req: Request,
79
+ match: RouteMatch,
80
+ responseHeaders: Headers,
81
+ deps: RenderRouteDeps,
82
+ interception?: InterceptionContext
83
+ ): Promise<Response> {
84
+ const { clientBootstrap, clientJsDisabled, rootSegment, buildManifest, globalError } = deps;
85
+ const segments = match.segments;
86
+ const leaf = segments[segments.length - 1];
87
+
88
+ // API routes (route.ts) — run access.ts standalone then dispatch to handler.
89
+ // No React render pass — AccessGate is not used, React.cache is not active.
90
+ // See design/04-authorization.md §"Auth in API Routes".
91
+ if (leaf.route && !leaf.page) {
92
+ return handleApiRoute(req, segments, responseHeaders);
93
+ }
94
+
95
+ // Parse X-Timber-State-Tree for RSC payload requests (client navigation).
96
+ // The state tree lists sync segments the client has cached — the server
97
+ // skips re-rendering those layouts for a smaller, faster RSC payload.
98
+ // Only used for RSC requests — HTML requests always get a full render.
99
+ // See design/19-client-navigation.md §"X-Timber-State-Tree Header"
100
+ const clientStateTree = isRscPayloadRequest(req) ? parseClientStateTree(req) : null;
101
+
102
+ // Build the React element tree — runs access checks eagerly to gate
103
+ // metadata resolution (TIM-1027), then loads modules and resolves
104
+ // metadata for non-denied segments. Denied segments' verdicts are
105
+ // passed to AccessGate for in-tree replay. Passing segments' access
106
+ // re-runs during render for React.cache population (TIM-662).
107
+ let routeResult;
108
+ const _buildStart = performance.now();
109
+ try {
110
+ routeResult = await buildRouteElement(
111
+ req,
112
+ match,
113
+ interception,
114
+ clientStateTree,
115
+ buildManifest.metadataRouteHashes
116
+ );
117
+ } catch (error) {
118
+ // Param coercion failed — render the custom 404 page (status files / not-found).
119
+ // Previously returned a bare Response(null, { status: 404 }) which bypassed
120
+ // custom not-found pages. Now routes through renderNoMatchPage so apps with
121
+ // 404.tsx / not-found status files render their custom page.
122
+ if (error instanceof ParamCoercionError) {
123
+ return renderNoMatchPage(req, rootSegment, responseHeaders, clientBootstrap);
124
+ }
125
+ // No PageComponent found — same treatment as param coercion: render custom 404.
126
+ if (error instanceof Error && error.message.startsWith('No page component')) {
127
+ if (process.env.NODE_ENV !== 'production') {
128
+ console.warn(`[timber] ${error.message}`);
129
+ }
130
+ return renderNoMatchPage(req, rootSegment, responseHeaders, clientBootstrap);
131
+ }
132
+ throw error;
133
+ }
134
+
135
+ const _buildEnd = performance.now();
136
+ recordTiming({
137
+ name: 'build',
138
+ dur: Math.round(_buildEnd - _buildStart),
139
+ desc: 'build element tree',
140
+ });
141
+
142
+ const { element, headElements, layoutComponents, deferSuspenseFor, skippedSegments } =
143
+ routeResult;
144
+
145
+ // Build head HTML for injection into the SSR output.
146
+ // Collects CSS, fonts, and modulepreload from the build manifest for matched segments.
147
+ // In dev mode the manifest is empty — Vite HMR handles CSS/JS.
148
+ //
149
+ // Link headers (for 103 Early Hints) are emitted by the earlyHints pipeline
150
+ // stage before middleware runs. Here we only emit the <head> HTML fallback tags
151
+ // — these ensure resources load even on platforms without Early Hints support.
152
+ let headHtml = '';
153
+
154
+ // Font CSS is NOT inlined here anymore (TIM-828). The transform hook
155
+ // injects a side-effect `import 'virtual:timber-font-css/<hash>.css'`
156
+ // into each file that calls a font function. @vitejs/plugin-rsc's
157
+ // `collectCss` walks the RSC module graph, finds the virtual CSS
158
+ // module, and React Float `preinit()`s it as
159
+ // `<link rel="stylesheet" data-rsc-css-href=...>` — the same path
160
+ // component CSS rides on. Dev and production share a single path,
161
+ // with no `globalThis` channel and no dev/prod skew.
162
+ //
163
+ // Font preload hints (distinct from the @font-face CSS) still flow
164
+ // through `BuildManifest.fonts[importer]` and are emitted below plus
165
+ // as 103 Early Hints via `buildEarlyHintsHeaders()`.
166
+ const fontEntries = collectRouteFonts(segments, buildManifest);
167
+ if (fontEntries.length > 0) {
168
+ headHtml += buildFontPreloadTags(fontEntries);
169
+ }
170
+
171
+ // Emit <link rel="stylesheet"> tags for per-route CSS (TIM-1014).
172
+ // React Float also emits stylesheet links via preinit() during Fizz
173
+ // rendering, but those arrive too late — after the RSC stream starts.
174
+ // These <head> tags ensure CSS is discovered during HTML parsing.
175
+ // Float deduplicates, so no double-fetch.
176
+ const cssUrls = collectRouteCss(segments, buildManifest);
177
+ if (cssUrls.length > 0) {
178
+ headHtml += buildCssLinkTags(cssUrls);
179
+ }
180
+
181
+ // Skip modulepreload tags when client JavaScript is disabled — no JS to preload.
182
+ if (!clientJsDisabled) {
183
+ const preloadUrls = collectRouteModulepreloads(segments, buildManifest);
184
+ if (preloadUrls.length > 0) {
185
+ headHtml += buildModulepreloadTags(preloadUrls);
186
+ }
187
+ }
188
+
189
+ for (const el of headElements) {
190
+ if (el.tag === 'title' && el.content) {
191
+ headHtml += `<title>${escapeHtml(el.content)}</title>`;
192
+ } else if (el.attrs) {
193
+ const attrs = Object.entries(el.attrs)
194
+ .filter(([, v]) => v != null)
195
+ .map(([k, v]) => `${k}="${escapeHtml(v as string)}"`)
196
+ .join(' ');
197
+ headHtml += `<${el.tag} ${attrs}>`;
198
+ }
199
+ }
200
+
201
+ // In dev mode, inject the browser log forwarding script so console
202
+ // errors/warnings from the browser appear in the server terminal.
203
+ // Set by timber-dev-browser-logs plugin via globalThis (TIM-575).
204
+ if (isDevMode()) {
205
+ const devLogScript = (globalThis as Record<string, unknown>).__timber_dev_browser_log_script as
206
+ | string
207
+ | undefined;
208
+ if (devLogScript) {
209
+ headHtml += devLogScript;
210
+ }
211
+ }
212
+
213
+ // Render to RSC Flight stream with signal tracking.
214
+ const _rscStart = performance.now();
215
+ const { rscStream, signals, getDebugComponents } = renderRscStream(element, req);
216
+
217
+ // Store the debug components getter in ALS so onPipelineError can
218
+ // include component tree context for render-phase errors (dev mode only).
219
+ // Per-request via ALS — no cross-request race. See TIM-557.
220
+ const alsStore = requestContextAls.getStore();
221
+ if (alsStore) {
222
+ alsStore.debugComponentsGetter = getDebugComponents;
223
+ }
224
+ recordTiming({
225
+ name: 'rsc-init',
226
+ dur: Math.round(performance.now() - _rscStart),
227
+ desc: 'RSC stream init',
228
+ });
229
+
230
+ // Synchronous redirect — redirect() in access.ts or a non-async component
231
+ // throws during renderToReadableStream creation. Return HTTP redirect.
232
+ if (signals.redirectSignal) {
233
+ return buildRedirectResponse(signals.redirectSignal, req, responseHeaders);
234
+ }
235
+
236
+ // Synchronous deny — deny() in a non-async component throws during
237
+ // renderToReadableStream creation, caught in the try/catch above.
238
+ if (signals.denySignal) {
239
+ if (isRscPayloadRequest(req)) {
240
+ return renderDenyPageAsRsc(
241
+ signals.denySignal,
242
+ segments,
243
+ layoutComponents as LayoutEntry[],
244
+ req,
245
+ responseHeaders,
246
+ createDebugChannelSink
247
+ );
248
+ }
249
+ return renderDenyPage(
250
+ signals.denySignal,
251
+ segments,
252
+ layoutComponents as LayoutEntry[],
253
+ req,
254
+ match,
255
+ responseHeaders,
256
+ clientBootstrap,
257
+ createDebugChannelSink,
258
+ callSsr
259
+ );
260
+ }
261
+
262
+ // Synchronous render error — renderToReadableStream threw before
263
+ // creating the stream. Render the error page with correct 5xx status.
264
+ // (Async render errors are tracked in onError and handled after SSR.)
265
+ if (signals.renderError && !rscStream) {
266
+ return renderErrorPage(
267
+ signals.renderError.error,
268
+ signals.renderError.status,
269
+ segments,
270
+ layoutComponents as LayoutEntry[],
271
+ req,
272
+ match,
273
+ responseHeaders,
274
+ clientBootstrap,
275
+ globalError
276
+ );
277
+ }
278
+
279
+ // For RSC payload requests (client navigation), return the RSC Flight
280
+ // stream directly — skip SSR HTML rendering entirely.
281
+ // See design/19-client-navigation.md §"RSC Payload Handling"
282
+ if (isRscPayloadRequest(req)) {
283
+ return buildRscPayloadResponse(
284
+ req,
285
+ rscStream!,
286
+ signals,
287
+ segments,
288
+ layoutComponents,
289
+ headElements,
290
+ match,
291
+ responseHeaders,
292
+ skippedSegments
293
+ );
294
+ }
295
+
296
+ // Pipe through SSR for HTML rendering with streaming Suspense support.
297
+ return renderSsrResponse({
298
+ req,
299
+ rscStream: rscStream!,
300
+ signals,
301
+ segments,
302
+ layoutComponents,
303
+ match,
304
+ responseHeaders,
305
+ clientBootstrap,
306
+ clientJsDisabled,
307
+ headHtml,
308
+ deferSuspenseFor,
309
+ globalError,
310
+ });
311
+ }
@@ -0,0 +1,344 @@
1
+ /**
2
+ * Revalidation renderer — builds the React element tree for the target
3
+ * path requested by `revalidatePath()` from inside a server action, with
4
+ * the same security guarantees as a normal route render.
5
+ *
6
+ * Before this module existed, `revalidatePath()` matched the route, coerced
7
+ * params, and called `buildRouteElement()` directly. That bypassed the
8
+ * target route's `middleware.ts` chain entirely. An action that revalidated
9
+ * a higher-privilege or user-controlled path could leak an authenticated
10
+ * RSC tree to the action submitter even when middleware on that path
11
+ * would have denied them.
12
+ *
13
+ * The fix (TIM-996) is to run the target route's middleware chain inside
14
+ * a fresh `runWithRequestContext` scope BEFORE building the element tree,
15
+ * propagate `DenySignal` and `RedirectSignal` to `executeAction`, drop the
16
+ * revalidation when middleware returns a short-circuit `Response`, and
17
+ * lift the request-header overlay onto the action's ALS store so the
18
+ * revalidated component render sees middleware-injected headers via
19
+ * `getHeaders()`.
20
+ *
21
+ * The input `path` is also validated as a local root-relative pathname so
22
+ * `revalidatePath('//evil.com/admin')` and similar scheme/authority
23
+ * injections cannot smuggle a foreign host through `new URL(path, base)`.
24
+ *
25
+ * See design/08-forms-and-actions.md §"revalidatePath()" and
26
+ * design/13-security.md §"Server actions silently bypass middleware".
27
+ */
28
+
29
+ import type { BuildManifest } from '../build-manifest.js';
30
+ import { canonicalize } from '../canonicalize.js';
31
+ import { getCookiesForSsr, seedRequestCookies } from '../cookie-context.js';
32
+ import { logRenderError } from '../logger.js';
33
+ import type { RouteMatch, RouteMatcher } from '../pipeline.js';
34
+ import { DenySignal, RedirectSignal } from '../primitives.js';
35
+ import { applyRequestHeaderOverlay, setSegmentParams } from '../request-context.js';
36
+ import { requestContextAls } from '../als-registry.js';
37
+ import { buildRouteElement } from '../route-element-builder.js';
38
+ import type { RevalidateRenderer, RevalidationResult } from '../actions.js';
39
+
40
+ import { runMiddlewareForAction, type CoerceSegmentParamsFn } from './action-middleware-runner.js';
41
+
42
+ /**
43
+ * Sentinel thrown when revalidation cannot proceed because middleware
44
+ * returned a short-circuit `Response` (a non-redirect HTTP response that
45
+ * we cannot translate back to an element tree). `executeAction` catches
46
+ * this and drops the revalidation — the action result is still delivered,
47
+ * but no `_tree` is piggybacked onto the response. The matching name
48
+ * `RevalidationDropped` is exported so callers can identify it via
49
+ * `instanceof` without leaking the message text to clients.
50
+ */
51
+ export class RevalidationDropped extends Error {
52
+ constructor(message: string) {
53
+ super(message);
54
+ this.name = 'RevalidationDropped';
55
+ }
56
+ }
57
+
58
+ /** Result of validating a `revalidatePath()` argument. */
59
+ type PathValidation =
60
+ | { ok: true; pathname: string; search: string }
61
+ | { ok: false; reason: string };
62
+
63
+ /**
64
+ * Validate a `revalidatePath()` argument.
65
+ *
66
+ * Accepts local root-relative pathnames only. Rejects anything that
67
+ * `new URL(path, base)` would resolve to a different host or scheme:
68
+ *
69
+ * - Empty / non-string input
70
+ * - Anything not starting with `/` (relative, scheme-bearing, etc.)
71
+ * - Protocol-relative `//evil.com/admin` — resolves to scheme://evil.com
72
+ * - Backslash-prefixed `/\evil.com` — some clients fold `\` into `/`
73
+ * - Control characters and null bytes
74
+ * - Paths that fail canonicalization (encoded separators, `..` escaping
75
+ * root, malformed percent-encoding)
76
+ *
77
+ * The pathname is canonicalized so the rest of the renderer matches the
78
+ * same shape the page pipeline matches.
79
+ */
80
+ export function validateRevalidatePath(path: unknown): PathValidation {
81
+ if (typeof path !== 'string' || path.length === 0) {
82
+ return { ok: false, reason: 'must be a non-empty string' };
83
+ }
84
+ if (!path.startsWith('/')) {
85
+ return { ok: false, reason: 'must start with "/" (root-relative path)' };
86
+ }
87
+ if (path.startsWith('//')) {
88
+ return { ok: false, reason: 'must not start with "//" (protocol-relative URL)' };
89
+ }
90
+ if (path.startsWith('/\\')) {
91
+ return { ok: false, reason: 'must not start with "/\\" (backslash injection)' };
92
+ }
93
+ for (let i = 0; i < path.length; i++) {
94
+ const code = path.charCodeAt(i);
95
+ if (code <= 0x1f || code === 0x7f) {
96
+ return { ok: false, reason: 'must not contain control characters' };
97
+ }
98
+ }
99
+ const hashIndex = path.indexOf('#');
100
+ // Fragments are meaningless server-side and would not be sent back to
101
+ // the client on revalidation anyway. Drop them silently before splitting
102
+ // the query so a `#` cannot smuggle additional path content past the
103
+ // canonicalizer.
104
+ const noFragment = hashIndex >= 0 ? path.slice(0, hashIndex) : path;
105
+ const queryIndex = noFragment.indexOf('?');
106
+ const pathnameOnly = queryIndex >= 0 ? noFragment.slice(0, queryIndex) : noFragment;
107
+ const search = queryIndex >= 0 ? noFragment.slice(queryIndex) : '';
108
+ const canonical = canonicalize(pathnameOnly, true);
109
+ if (!canonical.ok) {
110
+ return { ok: false, reason: `failed URL canonicalization (status ${canonical.status})` };
111
+ }
112
+ return { ok: true, pathname: canonical.pathname, search };
113
+ }
114
+
115
+ /**
116
+ * Serialize a cookie map into a `Cookie:` request header value
117
+ * (`name1=value1; name2=value2`).
118
+ *
119
+ * Cookie values are RFC 6265 cookie-octet (no `;`, no `,`, no whitespace,
120
+ * no `"` / `\`) by construction — `assertValidCookieValue()` rejects
121
+ * anything else at write time. Names are validated similarly. Joining
122
+ * with `; ` is therefore safe and cannot be used to smuggle additional
123
+ * cookies via a malformed value.
124
+ */
125
+ function serializeCookieMap(cookies: Map<string, string>): string {
126
+ const parts: string[] = [];
127
+ cookies.forEach((value, name) => {
128
+ parts.push(`${name}=${value}`);
129
+ });
130
+ return parts.join('; ');
131
+ }
132
+
133
+ /** Dependencies for the revalidate renderer factory. */
134
+ export interface RevalidateRendererDeps {
135
+ matchRoute: RouteMatcher;
136
+ coerceSegmentParams: CoerceSegmentParamsFn;
137
+ buildManifest: BuildManifest;
138
+ }
139
+
140
+ /**
141
+ * Build a per-request `RevalidateRenderer`.
142
+ *
143
+ * The returned renderer:
144
+ * 1. Validates the requested path.
145
+ * 2. Matches the canonicalized path against the route tree.
146
+ * 3. Coerces segment params via the matched chain's `params.ts` codecs.
147
+ * 4. Runs the matched route's `middleware.ts` chain inside a fresh
148
+ * `runWithRequestContext` scope (via `runMiddlewareForAction`).
149
+ * Deny/redirect signals are re-thrown so `executeAction` can apply
150
+ * its existing redirect handling and the new deny-drop behavior.
151
+ * A short-circuit `Response` becomes `RevalidationDropped`.
152
+ * 5. Lifts the request-header overlay onto the OUTER action's ALS store
153
+ * so the revalidated component render (which happens later inside
154
+ * `renderToReadableStream` in the action's scope) observes
155
+ * middleware-injected headers via `getHeaders()`. Acceptable because
156
+ * revalidation runs after the action body has returned — the only
157
+ * remaining ALS readers are render-phase code that should see the
158
+ * same overlay a normal page render would see.
159
+ * 6. Builds and returns the route element tree, ready for the action
160
+ * handler to serialize alongside the action result.
161
+ *
162
+ * Cookies set inside the revalidation middleware are intentionally NOT
163
+ * propagated to the action response. The middleware on a *different* path
164
+ * setting cookies via the action's response is surprising semantics; the
165
+ * scoped cookie jar on the inner ALS run is discarded with the scope.
166
+ * The primary security boundary closed here is auth — `deny()` from the
167
+ * target's middleware now prevents the revalidated tree from leaking.
168
+ */
169
+ export function createRevalidateRendererFactory(
170
+ deps: RevalidateRendererDeps
171
+ ): (req: Request) => RevalidateRenderer {
172
+ return (req: Request): RevalidateRenderer => {
173
+ return async (path: string): Promise<RevalidationResult> => {
174
+ // ── 1. Validate the path ────────────────────────────────────────
175
+ const validation = validateRevalidatePath(path);
176
+ if (!validation.ok) {
177
+ // Throwing a typed error here drops the revalidation. We do not
178
+ // surface the message to the client (logRenderError sinks it).
179
+ const err = new RevalidationDropped(
180
+ `revalidatePath(${JSON.stringify(path)}) rejected: ${validation.reason}`
181
+ );
182
+ logRenderError({ method: req.method, path: new URL(req.url).pathname, error: err });
183
+ throw err;
184
+ }
185
+
186
+ // ── 2. Build the revalidation Request on the canonical pathname ─
187
+ //
188
+ // Use the canonical pathname (not the raw input) so the rebuilt
189
+ // URL cannot carry a hostile authority — `new URL('//evil.com/x',
190
+ // base)` would otherwise resolve to scheme://evil.com/x. Forward
191
+ // the original action request's headers (session IDs, accept-
192
+ // language, etc.) so middleware on the target route sees the same
193
+ // identity the action did.
194
+ //
195
+ // The `Cookie:` header is REBUILT from the action's
196
+ // read-your-own-writes cookie state rather than copied from the
197
+ // inbound request. An action that rotates the session via
198
+ // `getCookieJar().set('session', newToken)` and then calls
199
+ // `revalidatePath('/dashboard')` should have the target route's
200
+ // middleware see the NEW session — otherwise a session-rotation
201
+ // action would succeed only to have the piggybacked revalidation
202
+ // redirect to /login. `getCookieJar()` writes only update the ALS
203
+ // jar, not the immutable `Request.headers`, so without this step
204
+ // middleware reading `ctx.req.headers.get('cookie')` sees stale
205
+ // values. Codex P2.
206
+ const baseUrl = new URL(req.url);
207
+ const revalidateUrl = new URL(baseUrl.origin);
208
+ revalidateUrl.pathname = validation.pathname;
209
+ revalidateUrl.search = validation.search;
210
+ const revalidateHeaders = new Headers(req.headers);
211
+ revalidateHeaders.set('Accept', 'text/x-component');
212
+ // Snapshot the action's post-mutation cookie map (deletions
213
+ // included) and serialize it into a `Cookie:` header value the
214
+ // target middleware can read off `ctx.req.headers.get('cookie')`.
215
+ // Only attempt this inside a request context — `getCookiesForSsr`
216
+ // throws otherwise — and bail out gracefully if no context is
217
+ // active (the legacy call-site contract permitted this).
218
+ const inRequestContext = Boolean(requestContextAls.getStore());
219
+ const ryw = inRequestContext ? getCookiesForSsr() : new Map<string, string>();
220
+ if (inRequestContext) {
221
+ if (ryw.size === 0) {
222
+ revalidateHeaders.delete('cookie');
223
+ } else {
224
+ revalidateHeaders.set('cookie', serializeCookieMap(ryw));
225
+ }
226
+ }
227
+ const revalidateReq = new Request(revalidateUrl.toString(), {
228
+ headers: revalidateHeaders,
229
+ });
230
+ // Seed the parsed map directly so the child `runWithRequestContext`
231
+ // inside `runMiddlewareForAction` skips `parseCookieHeader` — the
232
+ // same H-3 smuggling primitive mitigated by TIM-868. The Cookie
233
+ // header above remains in place for code that reads
234
+ // `ctx.req.headers.get('cookie')` directly.
235
+ if (inRequestContext) {
236
+ seedRequestCookies(revalidateReq, new Map(ryw));
237
+ }
238
+
239
+ // ── 3. Match the canonical path ─────────────────────────────────
240
+ const match = deps.matchRoute(validation.pathname);
241
+ if (!match) {
242
+ throw new Error(`revalidatePath('${path}') — no matching route`);
243
+ }
244
+
245
+ // ── 4. Run middleware in a fresh ALS scope ──────────────────────
246
+ //
247
+ // We only run middleware when the matched chain has at least one
248
+ // entry. Routes with no middleware skip this step (no scope, no
249
+ // overlay) — matching the page pipeline's behavior in
250
+ // `handleRequest` where `runMiddlewarePhase` is gated on
251
+ // `middlewareChain.length > 0`.
252
+ let overlay: Headers | undefined;
253
+ if (match.middlewareChain.length > 0) {
254
+ const outcome = await runMiddlewareForAction(
255
+ revalidateReq,
256
+ match,
257
+ deps.coerceSegmentParams
258
+ );
259
+
260
+ if (outcome.kind === 'param-coercion-error') {
261
+ // Bad params on the target path — drop revalidation. The
262
+ // action's own response still goes back to the client.
263
+ throw new RevalidationDropped(
264
+ `revalidatePath('${path}') — segment param coercion failed`
265
+ );
266
+ }
267
+ if (outcome.kind === 'error') {
268
+ // Re-throw unhandled middleware errors so `executeAction`'s
269
+ // existing `console.error` fallback logs them. Not surfaced
270
+ // to the action client (revalidation is best-effort).
271
+ throw outcome.error;
272
+ }
273
+ if (outcome.kind === 'redirect') {
274
+ // Propagate the redirect — `executeAction` catches
275
+ // RedirectSignal and converts it to an action-level redirect.
276
+ // See actions.ts §"Process path revalidation".
277
+ throw outcome.signal;
278
+ }
279
+ if (outcome.kind === 'deny') {
280
+ // Propagate the deny — `executeAction` catches DenySignal
281
+ // (added in this PR) and drops the revalidation.
282
+ throw outcome.signal;
283
+ }
284
+ if (outcome.kind === 'short-circuit') {
285
+ // Middleware returned a Response directly. A redirect Response
286
+ // (`return Response.redirect('/login')` or a 3xx + Location)
287
+ // is the same outcome as throwing `redirect()` — common for
288
+ // session-expiry / feature-flag gates — and the action client
289
+ // should follow it. Translate to a `RedirectSignal` so
290
+ // `executeAction` surfaces it as the action redirect, matching
291
+ // the normal page-pipeline behavior promised in
292
+ // design/08-forms-and-actions.md §"revalidatePath()". Codex P2.
293
+ const status = outcome.response.status;
294
+ const location = outcome.response.headers.get('location');
295
+ if (status >= 300 && status < 400 && location) {
296
+ throw new RedirectSignal(location, status);
297
+ }
298
+ // Any other short-circuit Response (200/403/418/etc.) cannot
299
+ // be translated to a piggy-backed element tree. Drop the
300
+ // revalidation; the action result still ships.
301
+ throw new RevalidationDropped(
302
+ `revalidatePath('${path}') — middleware returned a short-circuit Response (status ${status})`
303
+ );
304
+ }
305
+
306
+ // `continue` — capture the overlay so we can apply it to the
307
+ // action's request-context store below. We deliberately do NOT
308
+ // forward `outcome.cookies` or `outcome.setCookieHeaders` here;
309
+ // see the module docstring for why.
310
+ overlay = outcome.overlay;
311
+ } else {
312
+ // No middleware on the target — still coerce params so segment
313
+ // params reach `setSegmentParams` typed. `runMiddlewareForAction`
314
+ // would have done this for us; do it manually on the bypass path.
315
+ await deps.coerceSegmentParams(match);
316
+ }
317
+
318
+ // ── 5. Lift state onto the action's ALS store ───────────────────
319
+ //
320
+ // Segment params are set unconditionally so `getSegmentParams()`
321
+ // inside the revalidated tree returns the target path's coerced
322
+ // params, not the action route's. The overlay is applied only
323
+ // when middleware ran and produced headers — otherwise we leave
324
+ // the action's `headers()` view untouched.
325
+ setSegmentParams(match.segmentParams);
326
+ if (overlay) {
327
+ applyRequestHeaderOverlay(overlay);
328
+ }
329
+
330
+ // ── 6. Build the route element tree ─────────────────────────────
331
+ const routeResult = await buildRouteElement(
332
+ revalidateReq,
333
+ match,
334
+ undefined,
335
+ null,
336
+ deps.buildManifest.metadataRouteHashes
337
+ );
338
+ return {
339
+ element: routeResult.element,
340
+ headElements: routeResult.headElements,
341
+ };
342
+ };
343
+ };
344
+ }