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

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 +6432 -13423
  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 +264 -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
@@ -14,11 +14,25 @@
14
14
 
15
15
  import type { Plugin, ViteDevServer, DevEnvironment } from 'vite';
16
16
  import type { IncomingMessage, ServerResponse } from 'node:http';
17
+ import type { TLSSocket } from 'node:tls';
18
+ import { existsSync } from 'node:fs';
17
19
  import { join } from 'node:path';
18
- import type { PluginContext } from '#/index.js';
19
- import { setViteServer } from '#/server/dev-warnings.js';
20
- import { sendErrorToOverlay, classifyErrorPhase, parseFirstAppFrame } from './dev-error-overlay.js';
21
- import { compressResponse } from '#/server/compress.js';
20
+ import type { PluginContext } from '../plugin-context.js';
21
+ import {
22
+ sendErrorToOverlay,
23
+ classifyErrorPhase,
24
+ fixErrorStacktrace,
25
+ parseFirstAppFrame,
26
+ type ErrorPhase,
27
+ } from '../dev-tools/overlay.js';
28
+ import { generateDevErrorPage } from '../dev-tools/error-page.js';
29
+ import { extractHmrOptions, type DevErrorHmrOptions } from '../dev-tools/dev-page-shell.js';
30
+ import { addVirtualModuleContext } from '../config-validation.js';
31
+ import { compressResponse } from '../server/compress.js';
32
+ import { isMetadataRouteServePath } from '../server/metadata-routes.js';
33
+ import { canonicalize } from '../server/canonicalize.js';
34
+ import { matchUrlParts } from '../server/tree-match.js';
35
+ import type { RouteTree } from '../routing/types.js';
22
36
 
23
37
  // ─── Constants ────────────────────────────────────────────────────────────
24
38
 
@@ -72,20 +86,15 @@ export function timberDevServer(ctx: PluginContext): Plugin {
72
86
  * filtered out explicitly and passed through to Vite.
73
87
  */
74
88
  configureServer(server: ViteDevServer) {
75
- // Watch config files for full restart.
76
- // timber.config.ts is loaded once at startup — any change requires
77
- // a full dev server restart. See 21-dev-server.md §HMR Wiring.
89
+ // Ensure config files are in the watch set. Vite's watcher covers
90
+ // the project root, but `server.watcher.add()` is a no-op for files
91
+ // already watched, and ensures newly-created config files (e.g. from
92
+ // create-timber-app) are picked up. The actual restart logic is
93
+ // handled by Vite's built-in configFileDependencies check — see the
94
+ // configResolved hook in index.ts where we register the config path.
95
+ // See 21-dev-server.md §HMR Wiring.
78
96
  const configPaths = CONFIG_FILE_NAMES.map((name) => join(ctx.root, name));
79
-
80
- server.watcher.on('change', (filePath: string) => {
81
- if (configPaths.includes(filePath)) {
82
- server.restart();
83
- }
84
- });
85
-
86
- // Register Vite server for browser console warning forwarding.
87
- // See 21-dev-server.md §Dev-Mode Warnings.
88
- setViteServer(server);
97
+ server.watcher.add(configPaths);
89
98
 
90
99
  // Listen for client-side errors forwarded from the browser.
91
100
  // The browser entry sends 'timber:client-error' events via HMR
@@ -94,7 +103,22 @@ export function timberDevServer(ctx: PluginContext): Plugin {
94
103
  listenForClientErrors(server, ctx.root);
95
104
 
96
105
  // Pre-hook — registers middleware before Vite's internals
97
- server.middlewares.use(createTimberMiddleware(server, ctx.root));
106
+ server.middlewares.use(createTimberMiddleware(server, ctx));
107
+
108
+ // Wrap server.listen() to close the holding server immediately
109
+ // before Vite binds the port — no gap where nothing is listening.
110
+ // The holding server was started in rootSync's config() hook to
111
+ // serve a loading page during initialization.
112
+ // See design/21-dev-server.md §"Startup Holding Server", TIM-665.
113
+ if (ctx.holdingServer) {
114
+ const originalListen = server.listen.bind(server);
115
+ const holdingRef = ctx.holdingServer;
116
+ ctx.holdingServer = null;
117
+ server.listen = async (port?: number, isRestart?: boolean) => {
118
+ await holdingRef.close().catch(() => {});
119
+ return originalListen(port, isRestart);
120
+ };
121
+ }
98
122
 
99
123
  // Log startup timing summary. configureServer runs on all plugins
100
124
  // before the server listens, so this captures the full cold start.
@@ -121,7 +145,12 @@ export function timberDevServer(ctx: PluginContext): Plugin {
121
145
  * For non-route requests (assets, Vite internals, HMR), the middleware
122
146
  * calls next() to let Vite handle them.
123
147
  */
124
- function createTimberMiddleware(server: ViteDevServer, projectRoot: string) {
148
+ function createTimberMiddleware(server: ViteDevServer, ctx: PluginContext) {
149
+ const projectRoot = ctx.root;
150
+ // Extract HMR connection options once so the error page can construct
151
+ // a correct WebSocket URL (TIM-789).
152
+ const hmrOptions = extractHmrOptions(server.config);
153
+
125
154
  return async (req: IncomingMessage, res: ServerResponse, next: () => void): Promise<void> => {
126
155
  const url = req.url;
127
156
  if (!url) {
@@ -135,8 +164,17 @@ function createTimberMiddleware(server: ViteDevServer, projectRoot: string) {
135
164
  return;
136
165
  }
137
166
 
138
- // Pass through static asset requests
139
- if (isAssetRequest(url)) {
167
+ // Pass through static asset requests — but not metadata routes like
168
+ // /favicon.ico that match asset extensions but are handled by timber,
169
+ // and not registered routes like app/feed.json/route.ts whose URL ends
170
+ // in an asset extension. Production serves these through the RSC
171
+ // handler, so letting them fall through to Vite would 404 in dev only
172
+ // (TIM-1038).
173
+ if (
174
+ isAssetRequest(url) &&
175
+ !isMetadataRouteServePath(url) &&
176
+ !isRouteOwnedAsset(ctx.routeTree, server, url)
177
+ ) {
140
178
  next();
141
179
  return;
142
180
  }
@@ -160,13 +198,50 @@ function createTimberMiddleware(server: ViteDevServer, projectRoot: string) {
160
198
  handler = rscModule.default as (req: Request) => Promise<Response>;
161
199
 
162
200
  // Wire pipeline errors into the browser error overlay.
163
- // setDevPipelineErrorHandler is only defined in dev (rsc-entry.ts exports it).
164
- const setHandler = rscModule.setDevPipelineErrorHandler as
165
- | ((fn: (error: Error, phase: string) => void) => void)
201
+ // Set devPipelineErrorHandler directly on the pipeline config —
202
+ // no module-level singleton. The handler receives optional RSC debug
203
+ // component data (component names, environments, stack frames) from
204
+ // the Flight debug channel for render errors.
205
+ const config = rscModule.pipelineConfig as
206
+ | {
207
+ devPipelineErrorHandler?: (
208
+ error: Error,
209
+ phase: string,
210
+ debugComponents?: Array<{
211
+ name: string;
212
+ env: string | null;
213
+ stack: unknown[] | null;
214
+ }>
215
+ ) => void;
216
+ devHmrOptions?: DevErrorHmrOptions;
217
+ }
166
218
  | undefined;
167
- if (typeof setHandler === 'function') {
168
- setHandler((error) => {
169
- sendErrorToOverlay(server, error, classifyErrorPhase(error, projectRoot), projectRoot);
219
+ if (config) {
220
+ config.devPipelineErrorHandler = (error, _phase, debugComponents) => {
221
+ sendErrorToOverlay(
222
+ server,
223
+ error,
224
+ classifyErrorPhase(error, projectRoot),
225
+ projectRoot,
226
+ debugComponents
227
+ );
228
+ };
229
+ // Plumb the resolved HMR options into the RSC environment. The RSC
230
+ // entry can't read the Vite server config (separate module graph),
231
+ // but its dev 404 page and fallback error page need the HMR endpoint
232
+ // (including Vite 8's required WS token) for auto-reload (TIM-1067).
233
+ config.devHmrOptions = hmrOptions;
234
+ }
235
+
236
+ // Wire source-map handler so error pages show original positions.
237
+ // fixErrorStacktrace rewrites the error's stack trace in-place using
238
+ // the Vite dev server's module graph. See TIM-811.
239
+ const setSourceMap = rscModule.setDevSourceMapHandler as
240
+ | ((fn: (error: Error) => void) => void)
241
+ | undefined;
242
+ if (typeof setSourceMap === 'function') {
243
+ setSourceMap((error: Error) => {
244
+ fixErrorStacktrace(server, error);
170
245
  });
171
246
  }
172
247
  } catch (error) {
@@ -174,9 +249,11 @@ function createTimberMiddleware(server: ViteDevServer, projectRoot: string) {
174
249
  // Vite may already show its own overlay for these, but we still
175
250
  // log to stderr with frame dimming for the terminal.
176
251
  if (error instanceof Error) {
252
+ // Add context for virtual:timber-* module errors
253
+ addTimberContext(error);
177
254
  sendErrorToOverlay(server, error, 'module-transform', projectRoot);
178
255
  }
179
- respond500(res, error);
256
+ respond500(res, error, 'module-transform', projectRoot, hmrOptions);
180
257
  return;
181
258
  }
182
259
 
@@ -191,8 +268,20 @@ function createTimberMiddleware(server: ViteDevServer, projectRoot: string) {
191
268
  // Convert Node IncomingMessage → Web Request
192
269
  const webRequest = toWebRequest(req);
193
270
 
194
- // Run the full pipeline
195
- const webResponse = await handler(webRequest);
271
+ // Check for a platform-specific request wrapper (e.g., Cloudflare
272
+ // dev bindings). The cloudflareDevBindings() plugin stores a wrapper
273
+ // function on the server instance using a well-known Symbol. The
274
+ // wrapper runs the handler inside an ALS context so platform APIs
275
+ // like getCloudflareBindings() work during dev.
276
+ // See design/35-cloudflare-primitives.md §"Dev Experience".
277
+ const wrapper = (server as any)[Symbol.for('timber:dev-request-wrapper')] as
278
+ | (<T>(fn: () => T) => T)
279
+ | undefined;
280
+
281
+ // Run the full pipeline (wrapped if a platform dev plugin is active)
282
+ const webResponse = wrapper
283
+ ? await wrapper(() => handler(webRequest))
284
+ : await handler(webRequest);
196
285
 
197
286
  // Compress the response if the client supports it.
198
287
  // In dev mode, compression is always enabled for parity with production.
@@ -205,26 +294,71 @@ function createTimberMiddleware(server: ViteDevServer, projectRoot: string) {
205
294
  // Pipeline error — classify the phase, send to overlay, respond 500.
206
295
  // The dev server remains running for recovery on file fix + HMR.
207
296
  if (error instanceof Error) {
208
- const phase = classifyErrorPhase(error, projectRoot);
209
- sendErrorToOverlay(server, error, phase, projectRoot);
297
+ // Unwrap SsrStreamError to show the real cause in the error overlay.
298
+ // SsrStreamError wraps the original RSC render error with a generic
299
+ // message; the developer needs to see the actual error (e.g.,
300
+ // "useSegmentParams is not a function"), not the wrapper.
301
+ const displayError =
302
+ error.name === 'SsrStreamError' && error.cause instanceof Error ? error.cause : error;
303
+ const phase = classifyErrorPhase(displayError, projectRoot);
304
+ sendErrorToOverlay(server, displayError, phase, projectRoot);
305
+ respond500(res, displayError, phase, projectRoot, hmrOptions);
210
306
  } else {
211
307
  process.stderr.write(`\x1b[31m[timber] Dev server error:\x1b[0m ${String(error)}\n`);
308
+ respond500(res, error, 'render', projectRoot, hmrOptions);
212
309
  }
213
- respond500(res, error);
214
310
  }
215
311
  };
216
312
  }
217
313
 
218
314
  /**
219
315
  * Send a 500 response without crashing the dev server.
316
+ *
317
+ * In dev mode, renders a styled HTML error page with source context,
318
+ * classified stack trace, and auto-reload on HMR. Falls back to
319
+ * text/plain if the HTML generator fails (must never crash).
220
320
  */
221
- function respond500(res: ServerResponse, error: unknown): void {
222
- if (!res.headersSent) {
223
- res.statusCode = 500;
224
- res.setHeader('content-type', 'text/plain');
225
- res.end(
226
- `[timber] Internal server error\n\n${error instanceof Error ? (error.stack ?? error.message) : String(error)}`
227
- );
321
+ function respond500(
322
+ res: ServerResponse,
323
+ error: unknown,
324
+ phase: ErrorPhase,
325
+ projectRoot: string,
326
+ hmrOptions?: DevErrorHmrOptions
327
+ ): void {
328
+ if (res.headersSent) return;
329
+
330
+ // Try to render the rich HTML error page
331
+ if (error instanceof Error) {
332
+ try {
333
+ const html = generateDevErrorPage(error, phase, projectRoot, hmrOptions);
334
+ res.statusCode = 500;
335
+ res.setHeader('content-type', 'text/html; charset=utf-8');
336
+ res.end(html);
337
+ return;
338
+ } catch (e) {
339
+ console.debug(
340
+ '[timber] dev error page generation failed, falling back to text/plain:',
341
+ e instanceof Error ? e.message : e
342
+ );
343
+ }
344
+ }
345
+
346
+ // Fallback: plain text (same as before)
347
+ res.statusCode = 500;
348
+ res.setHeader('content-type', 'text/plain');
349
+ res.end(
350
+ `[timber] Internal server error\n\n${error instanceof Error ? (error.stack ?? error.message) : String(error)}`
351
+ );
352
+ }
353
+
354
+ /**
355
+ * Add timber-specific context to an error's message if it references
356
+ * internal virtual modules (virtual:timber-*). Mutates the error in place.
357
+ */
358
+ function addTimberContext(error: Error): void {
359
+ const enriched = addVirtualModuleContext(error.message);
360
+ if (enriched !== error.message) {
361
+ error.message = enriched;
228
362
  }
229
363
  }
230
364
 
@@ -235,15 +369,30 @@ function respond500(res: ServerResponse, error: unknown): void {
235
369
  *
236
370
  * Constructs the full URL from the Host header and request URL,
237
371
  * and forwards the method, headers, and body.
372
+ *
373
+ * The scheme comes from the socket's TLS state — with `server.https` the
374
+ * browser sends `Origin: https://host`, and a hardcoded `http://` would
375
+ * fail CSRF origin comparison on every POST. X-Forwarded-Proto is NOT
376
+ * consulted: dev connections are direct, so the header would be
377
+ * attacker-controlled. (TIM-1067, B32)
378
+ *
379
+ * Exported for tests.
238
380
  */
239
- function toWebRequest(nodeReq: IncomingMessage): Request {
240
- const protocol = 'http';
241
- const host = nodeReq.headers.host ?? 'localhost';
381
+ export function toWebRequest(nodeReq: IncomingMessage): Request {
382
+ const protocol = (nodeReq.socket as TLSSocket | undefined)?.encrypted ? 'https' : 'http';
383
+ // Under HTTP/2 there is no Host header — the authority lives in the
384
+ // `:authority` pseudo-header.
385
+ const host =
386
+ nodeReq.headers.host ?? (nodeReq.headers[':authority'] as string | undefined) ?? 'localhost';
242
387
  const url = `${protocol}://${host}${nodeReq.url}`;
243
388
 
244
389
  const headers = new Headers();
245
390
  for (const [key, value] of Object.entries(nodeReq.headers)) {
246
391
  if (value === undefined) continue;
392
+ // HTTP/2 pseudo-headers (:method, :path, :authority, :scheme) are not
393
+ // valid Headers names — Headers.set() throws on them. They're already
394
+ // reflected in the request URL/method above.
395
+ if (key.startsWith(':')) continue;
247
396
  if (Array.isArray(value)) {
248
397
  for (const v of value) {
249
398
  headers.append(key, v);
@@ -252,6 +401,11 @@ function toWebRequest(nodeReq: IncomingMessage): Request {
252
401
  headers.set(key, value);
253
402
  }
254
403
  }
404
+ // HTTP/2 requests carry the authority in `:authority`, not Host — but
405
+ // downstream consumers (CSRF origin validation) read the Host header.
406
+ if (!headers.has('host')) {
407
+ headers.set('host', host);
408
+ }
255
409
 
256
410
  const method = nodeReq.method ?? 'GET';
257
411
  const hasBody = method !== 'GET' && method !== 'HEAD';
@@ -317,6 +471,17 @@ async function sendWebResponse(nodeRes: ServerResponse, webResponse: Response):
317
471
  nodeRes.flushHeaders();
318
472
 
319
473
  const reader = webResponse.body.getReader();
474
+
475
+ // Cancel the reader when the client disconnects. This causes any pending
476
+ // reader.read() to reject, breaking the pump loop. Critical for SSE and
477
+ // other infinite streams — without this, disconnected clients leak readers.
478
+ let clientDisconnected = false;
479
+ const onClose = () => {
480
+ clientDisconnected = true;
481
+ reader.cancel('Client disconnected').catch(() => {});
482
+ };
483
+ nodeRes.on('close', onClose);
484
+
320
485
  try {
321
486
  while (true) {
322
487
  const { done, value } = await reader.read();
@@ -325,9 +490,18 @@ async function sendWebResponse(nodeRes: ServerResponse, webResponse: Response):
325
490
  // don't need back-pressure here — just keep pushing chunks.
326
491
  nodeRes.write(value);
327
492
  }
493
+ } catch (err) {
494
+ // reader.cancel() from the close handler causes read() to reject.
495
+ // This is expected on client disconnect — not an error.
496
+ if (!clientDisconnected) {
497
+ throw err;
498
+ }
328
499
  } finally {
500
+ nodeRes.off('close', onClose);
329
501
  reader.releaseLock();
330
- nodeRes.end();
502
+ if (!nodeRes.writableEnded) {
503
+ nodeRes.end();
504
+ }
331
505
  }
332
506
  }
333
507
 
@@ -347,6 +521,50 @@ function isAssetRequest(url: string): boolean {
347
521
  return ASSET_EXTENSIONS.test(url);
348
522
  }
349
523
 
524
+ /**
525
+ * Check whether an asset-extension URL belongs to a scanned route rather
526
+ * than a static file.
527
+ *
528
+ * Route handlers may live at paths ending in asset-like extensions
529
+ * (app/feed.json/route.ts → /feed.json), which the asset bypass would
530
+ * otherwise hand to Vite — 404ing in dev while working in production.
531
+ * Uses the same canonicalization and tree walker as the runtime matcher
532
+ * so dev classification agrees with what the pipeline would match.
533
+ *
534
+ * A file that actually exists on disk wins over the route match: the
535
+ * production server serves public/ statics before the RSC handler (see
536
+ * adapters/nitro.ts), and Vite serves root-relative source files (e.g.
537
+ * /app/global.css) in dev. Without this, a broad catch-all route like
538
+ * app/[...slug] would shadow every static asset. Joining the canonical
539
+ * pathname is traversal-safe — canonicalize() resolves `..` segments and
540
+ * rejects root escapes and encoded separators.
541
+ *
542
+ * Reads ctx.routeTree per request — the routing plugin rescans it on
543
+ * file add/unlink/change, so newly created routes are picked up live.
544
+ */
545
+ function isRouteOwnedAsset(
546
+ routeTree: RouteTree | null,
547
+ server: ViteDevServer,
548
+ url: string
549
+ ): boolean {
550
+ if (!routeTree) return false;
551
+ const rawPathname = url.split('?')[0];
552
+ const result = canonicalize(rawPathname);
553
+ // Malformed URLs can't match a route — let Vite handle them as before.
554
+ if (!result.ok) return false;
555
+ const parts = result.pathname === '/' ? [] : result.pathname.slice(1).split('/');
556
+ if (matchUrlParts(routeTree.root, parts) === null) return false;
557
+
558
+ // Real static files win over the route match (dev/prod parity: the
559
+ // production server tries public/ before the RSC handler).
560
+ const relativePath = result.pathname.slice(1);
561
+ const { publicDir, root } = server.config;
562
+ if (publicDir && existsSync(join(publicDir, relativePath))) return false;
563
+ if (existsSync(join(root, relativePath))) return false;
564
+
565
+ return true;
566
+ }
567
+
350
568
  // ─── Client Error Listener ─────────────────────────────────────────────
351
569
 
352
570
  interface ClientErrorPayload {
@@ -392,8 +610,8 @@ function listenForClientErrors(server: ViteDevServer, projectRoot: string): void
392
610
  loc: loc ? { file: loc.file, line: loc.line, column: loc.column } : undefined,
393
611
  },
394
612
  });
395
- } catch {
396
- // Overlay send must never crash the dev server
613
+ } catch (e) {
614
+ console.debug('[timber] overlay send failed:', e instanceof Error ? e.message : e);
397
615
  }
398
616
  });
399
617
  }
@@ -15,7 +15,7 @@ import type { Plugin } from 'vite';
15
15
  import { resolve, dirname } from 'node:path';
16
16
  import { fileURLToPath } from 'node:url';
17
17
  import { existsSync } from 'node:fs';
18
- import type { PluginContext } from '#/index.js';
18
+ import type { PluginContext } from '../plugin-context.js';
19
19
 
20
20
  const __dirname = dirname(fileURLToPath(import.meta.url));
21
21
 
@@ -34,6 +34,7 @@ const VIRTUAL_IDS = {
34
34
  browserEntry: 'virtual:timber-browser-entry',
35
35
  config: 'virtual:timber-config',
36
36
  instrumentation: 'virtual:timber-instrumentation',
37
+ cacheHandler: 'virtual:timber-cache-handler',
37
38
  } as const;
38
39
 
39
40
  /**
@@ -48,7 +49,7 @@ const VIRTUAL_IDS = {
48
49
  const ENTRY_FILE_MAP: Record<string, string> = {
49
50
  [VIRTUAL_IDS.rscEntry]: resolve(SRC_DIR, 'server', 'rsc-entry', 'index.ts'),
50
51
  [VIRTUAL_IDS.ssrEntry]: resolve(SRC_DIR, 'server', 'ssr-entry.ts'),
51
- [VIRTUAL_IDS.browserEntry]: resolve(SRC_DIR, 'client', 'browser-entry.ts'),
52
+ [VIRTUAL_IDS.browserEntry]: resolve(SRC_DIR, 'client', 'browser-entry', 'index.ts'),
52
53
  };
53
54
 
54
55
  /** The \0-prefixed resolved ID for virtual:timber-config */
@@ -57,6 +58,9 @@ const RESOLVED_CONFIG_ID = `\0${VIRTUAL_IDS.config}`;
57
58
  /** The \0-prefixed resolved ID for virtual:timber-instrumentation */
58
59
  const RESOLVED_INSTRUMENTATION_ID = `\0${VIRTUAL_IDS.instrumentation}`;
59
60
 
61
+ /** The \0-prefixed resolved ID for virtual:timber-cache-handler */
62
+ const RESOLVED_CACHE_HANDLER_ID = `\0${VIRTUAL_IDS.cacheHandler}`;
63
+
60
64
  /**
61
65
  * Strip the \0 prefix from a module ID.
62
66
  *
@@ -94,12 +98,39 @@ function stripRootPrefix(id: string, root: string): string {
94
98
  *
95
99
  * Serializes output mode and feature flags for runtime consumption.
96
100
  */
97
- function generateConfigModule(ctx: PluginContext): string {
98
- // Resolve cookie secrets: `secret` shorthand expands to `secrets: [secret]`
99
- const cookieSecrets =
100
- ctx.config.cookies?.secrets ??
101
- (ctx.config.cookies?.secret ? [ctx.config.cookies.secret] : undefined);
101
+ /**
102
+ * Extract the JSON-serializable subset of `forms` config.
103
+ *
104
+ * Drops function-valued `stripSensitiveFields` with a build-time warning —
105
+ * functions cannot cross the JSON boundary to the runtime, so users must
106
+ * configure function predicates per-action via `createActionClient` instead.
107
+ */
108
+ function serializeFormsConfig(
109
+ forms: { stripSensitiveFields?: unknown } | undefined
110
+ ): { stripSensitiveFields?: boolean | readonly string[] } | undefined {
111
+ if (!forms) return undefined;
112
+ const opt = forms.stripSensitiveFields;
113
+ if (opt === undefined) return {};
114
+ if (typeof opt === 'boolean') return { stripSensitiveFields: opt };
115
+ if (Array.isArray(opt)) {
116
+ // Coerce to a string array and drop any non-string entries.
117
+ const names = opt.filter((v): v is string => typeof v === 'string');
118
+ return { stripSensitiveFields: names };
119
+ }
120
+ if (typeof opt === 'function') {
121
+ console.warn(
122
+ '[timber] forms.stripSensitiveFields was set to a function in timber.config.ts — ' +
123
+ 'this is not supported at the global level (functions cannot be serialized ' +
124
+ 'into the runtime config). Use a per-action override via ' +
125
+ '`createActionClient({ stripSensitiveFields: (name) => ... })` instead. ' +
126
+ 'The built-in deny-list will be used globally.'
127
+ );
128
+ return {};
129
+ }
130
+ return {};
131
+ }
102
132
 
133
+ function generateConfigModule(ctx: PluginContext): string {
103
134
  const runtimeConfig = {
104
135
  output: ctx.config.output ?? 'server',
105
136
  csrf: ctx.config.csrf ?? true,
@@ -108,10 +139,24 @@ function generateConfigModule(ctx: PluginContext): string {
108
139
  dev: ctx.dev ?? false,
109
140
  slowPhaseMs: ctx.config.dev?.slowPhaseMs ?? 200,
110
141
  slowRequestMs: ctx.config.slowRequestMs ?? 3000,
111
- cookieSecrets,
112
142
  topLoader: ctx.config.topLoader,
113
143
  debug: ctx.config.debug ?? false,
114
144
  serverTiming: ctx.config.serverTiming,
145
+ renderTimeoutMs: ctx.config.renderTimeoutMs ?? 30_000,
146
+ // Auto-generated sitemap config — opt-in via timber.config.ts.
147
+ // See design/16-metadata.md §"Auto-generated Sitemap"
148
+ sitemap: ctx.config.sitemap,
149
+ // Forms config — only the serializable subset. `stripSensitiveFields`
150
+ // accepts boolean | string[] at the global level. Functions must be
151
+ // configured per-action via `createActionClient({ stripSensitiveFields })`
152
+ // because JSON.stringify would silently drop them here. See TIM-816.
153
+ forms: serializeFormsConfig(ctx.config.forms),
154
+ // Per-build deployment ID for version skew detection (TIM-446).
155
+ // Null in dev mode — HMR handles code updates without full reloads.
156
+ deploymentId: ctx.deploymentId ?? null,
157
+ // Note: project root is NOT included here — it was leaking server
158
+ // filesystem paths to client bundles (TIM-787). Dev error pages get
159
+ // the root through the dev server, not the runtime config.
115
160
  };
116
161
 
117
162
  return [
@@ -177,6 +222,53 @@ export function generateInstrumentationModule(instrumentationPath: string | null
177
222
  ].join('\n');
178
223
  }
179
224
 
225
+ /**
226
+ * Detect the user's timber.config file at the project root.
227
+ * Returns the absolute path or null if not found.
228
+ */
229
+ function detectConfigFile(root: string): string | null {
230
+ const names = ['timber.config.ts', 'timber.config.js', 'timber.config.mjs'];
231
+ for (const name of names) {
232
+ const candidate = resolve(root, name);
233
+ if (existsSync(candidate)) return candidate;
234
+ }
235
+ return null;
236
+ }
237
+
238
+ /**
239
+ * Generate the virtual:timber-cache-handler module source.
240
+ *
241
+ * When the user's config has a cacheHandler, generates a module that
242
+ * dynamically imports the config file and extracts the cacheHandler.
243
+ * The cacheHandler is a class instance (e.g. RedisCacheHandler) that
244
+ * cannot be JSON-serialized into virtual:timber-config, so it must
245
+ * be loaded at runtime via dynamic import. See TIM-599.
246
+ */
247
+ function generateCacheHandlerModule(configPath: string | null, hasCacheHandler: boolean): string {
248
+ if (configPath && hasCacheHandler) {
249
+ return [
250
+ '// Auto-generated cache handler loader — do not edit.',
251
+ '// Generated by timber-entries plugin.',
252
+ '',
253
+ `export default async function loadCacheHandler() {`,
254
+ ` const mod = await import(${JSON.stringify(configPath)});`,
255
+ ` const config = mod.default ?? mod;`,
256
+ ` return config.cacheHandler ?? null;`,
257
+ `}`,
258
+ ].join('\n');
259
+ }
260
+
261
+ return [
262
+ '// Auto-generated cache handler loader — do not edit.',
263
+ '// Generated by timber-entries plugin.',
264
+ '// No cacheHandler configured in timber.config.',
265
+ '',
266
+ `export default async function loadCacheHandler() {`,
267
+ ` return null;`,
268
+ `}`,
269
+ ].join('\n');
270
+ }
271
+
180
272
  /**
181
273
  * Create the timber-entries Vite plugin.
182
274
  *
@@ -219,6 +311,11 @@ export function timberEntries(ctx: PluginContext): Plugin {
219
311
  return RESOLVED_INSTRUMENTATION_ID;
220
312
  }
221
313
 
314
+ // Check cache handler virtual module
315
+ if (cleanId === VIRTUAL_IDS.cacheHandler) {
316
+ return RESOLVED_CACHE_HANDLER_ID;
317
+ }
318
+
222
319
  return null;
223
320
  },
224
321
 
@@ -236,6 +333,11 @@ export function timberEntries(ctx: PluginContext): Plugin {
236
333
  const instrumentationPath = detectInstrumentationFile(ctx.root);
237
334
  return generateInstrumentationModule(instrumentationPath);
238
335
  }
336
+ if (id === RESOLVED_CACHE_HANDLER_ID) {
337
+ const configPath = detectConfigFile(ctx.root);
338
+ const hasCacheHandler = ctx.config.cacheHandler != null;
339
+ return generateCacheHandlerModule(configPath, hasCacheHandler);
340
+ }
239
341
  return null;
240
342
  },
241
343