@timber-js/app 0.2.0-alpha.9 → 0.2.0-alpha.91

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 (619) hide show
  1. package/dist/_chunks/actions-DLnUaR65.js +421 -0
  2. package/dist/_chunks/actions-DLnUaR65.js.map +1 -0
  3. package/dist/_chunks/{als-registry-B7DbZ2hS.js → als-registry-HS0LGUl2.js} +1 -1
  4. package/dist/_chunks/als-registry-HS0LGUl2.js.map +1 -0
  5. package/dist/_chunks/chunk-BYIpzuS7.js +39 -0
  6. package/dist/_chunks/{debug-gwlJkDuf.js → debug-ECi_61pb.js} +2 -2
  7. package/dist/_chunks/debug-ECi_61pb.js.map +1 -0
  8. package/dist/_chunks/define-C77ScO0m.js +106 -0
  9. package/dist/_chunks/define-C77ScO0m.js.map +1 -0
  10. package/dist/_chunks/define-Itxvcd7F.js +199 -0
  11. package/dist/_chunks/define-Itxvcd7F.js.map +1 -0
  12. package/dist/_chunks/define-cookie-BowvzoP0.js +94 -0
  13. package/dist/_chunks/define-cookie-BowvzoP0.js.map +1 -0
  14. package/dist/_chunks/{format-DviM89f0.js → dev-warnings-DpGRGoDi.js} +5 -44
  15. package/dist/_chunks/dev-warnings-DpGRGoDi.js.map +1 -0
  16. package/dist/_chunks/format-CYBGxKtc.js +14 -0
  17. package/dist/_chunks/format-CYBGxKtc.js.map +1 -0
  18. package/dist/_chunks/{interception-BOoWmLUA.js → interception-ErnB33JX.js} +301 -133
  19. package/dist/_chunks/interception-ErnB33JX.js.map +1 -0
  20. package/dist/_chunks/merge-search-params-Cm_KIWDX.js +41 -0
  21. package/dist/_chunks/merge-search-params-Cm_KIWDX.js.map +1 -0
  22. package/dist/_chunks/{metadata-routes-Cjmvi3rQ.js → metadata-routes-DS3eKNmf.js} +1 -1
  23. package/dist/_chunks/{metadata-routes-Cjmvi3rQ.js.map → metadata-routes-DS3eKNmf.js.map} +1 -1
  24. package/dist/_chunks/request-context-CK5tZqIP.js +478 -0
  25. package/dist/_chunks/request-context-CK5tZqIP.js.map +1 -0
  26. package/dist/_chunks/schema-bridge-C3xl_vfb.js +86 -0
  27. package/dist/_chunks/schema-bridge-C3xl_vfb.js.map +1 -0
  28. package/dist/_chunks/segment-classify-BDNn6EzD.js +65 -0
  29. package/dist/_chunks/segment-classify-BDNn6EzD.js.map +1 -0
  30. package/dist/_chunks/segment-context-fHFLF1PE.js +34 -0
  31. package/dist/_chunks/segment-context-fHFLF1PE.js.map +1 -0
  32. package/dist/_chunks/{ssr-data-MjmprTmO.js → ssr-data-DzuI0bIV.js} +1 -1
  33. package/dist/_chunks/{ssr-data-MjmprTmO.js.map → ssr-data-DzuI0bIV.js.map} +1 -1
  34. package/dist/_chunks/stale-reload-BX5gL1r-.js +64 -0
  35. package/dist/_chunks/stale-reload-BX5gL1r-.js.map +1 -0
  36. package/dist/_chunks/{tracing-CemImE6h.js → tracing-CCYbKn5n.js} +60 -9
  37. package/dist/_chunks/tracing-CCYbKn5n.js.map +1 -0
  38. package/dist/_chunks/use-params-Br9YSUFV.js +295 -0
  39. package/dist/_chunks/use-params-Br9YSUFV.js.map +1 -0
  40. package/dist/_chunks/{use-query-states-D5KaffOK.js → use-query-states-BiV5GJgm.js} +7 -4
  41. package/dist/_chunks/use-query-states-BiV5GJgm.js.map +1 -0
  42. package/dist/adapters/cloudflare-dev.d.ts +109 -0
  43. package/dist/adapters/cloudflare-dev.d.ts.map +1 -0
  44. package/dist/adapters/cloudflare-dev.js +73 -0
  45. package/dist/adapters/cloudflare-dev.js.map +1 -0
  46. package/dist/adapters/cloudflare-kv-cache.d.ts +64 -0
  47. package/dist/adapters/cloudflare-kv-cache.d.ts.map +1 -0
  48. package/dist/adapters/cloudflare-kv-cache.js +95 -0
  49. package/dist/adapters/cloudflare-kv-cache.js.map +1 -0
  50. package/dist/adapters/cloudflare.d.ts +148 -12
  51. package/dist/adapters/cloudflare.d.ts.map +1 -1
  52. package/dist/adapters/cloudflare.js +135 -11
  53. package/dist/adapters/cloudflare.js.map +1 -1
  54. package/dist/adapters/compress-module.d.ts.map +1 -1
  55. package/dist/adapters/nitro.d.ts +17 -1
  56. package/dist/adapters/nitro.d.ts.map +1 -1
  57. package/dist/adapters/nitro.js +56 -13
  58. package/dist/adapters/nitro.js.map +1 -1
  59. package/dist/cache/cache-api.d.ts +24 -0
  60. package/dist/cache/cache-api.d.ts.map +1 -0
  61. package/dist/cache/handler-store.d.ts +31 -0
  62. package/dist/cache/handler-store.d.ts.map +1 -0
  63. package/dist/cache/index.d.ts +23 -7
  64. package/dist/cache/index.d.ts.map +1 -1
  65. package/dist/cache/index.js +142 -80
  66. package/dist/cache/index.js.map +1 -1
  67. package/dist/cache/singleflight.d.ts +18 -1
  68. package/dist/cache/singleflight.d.ts.map +1 -1
  69. package/dist/cache/sizeof.d.ts +22 -0
  70. package/dist/cache/sizeof.d.ts.map +1 -0
  71. package/dist/cache/timber-cache.d.ts +1 -1
  72. package/dist/cache/timber-cache.d.ts.map +1 -1
  73. package/dist/cli.d.ts +6 -1
  74. package/dist/cli.d.ts.map +1 -1
  75. package/dist/cli.js +8 -3
  76. package/dist/cli.js.map +1 -1
  77. package/dist/client/browser-dev.d.ts +27 -1
  78. package/dist/client/browser-dev.d.ts.map +1 -1
  79. package/dist/client/browser-entry/action-dispatch.d.ts +17 -0
  80. package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -0
  81. package/dist/client/browser-entry/hmr.d.ts +21 -0
  82. package/dist/client/browser-entry/hmr.d.ts.map +1 -0
  83. package/dist/client/browser-entry/hydrate.d.ts +46 -0
  84. package/dist/client/browser-entry/hydrate.d.ts.map +1 -0
  85. package/dist/client/browser-entry/index.d.ts +30 -0
  86. package/dist/client/browser-entry/index.d.ts.map +1 -0
  87. package/dist/client/browser-entry/post-hydration.d.ts +26 -0
  88. package/dist/client/browser-entry/post-hydration.d.ts.map +1 -0
  89. package/dist/client/browser-entry/router-init.d.ts +23 -0
  90. package/dist/client/browser-entry/router-init.d.ts.map +1 -0
  91. package/dist/client/browser-entry/rsc-stream.d.ts +24 -0
  92. package/dist/client/browser-entry/rsc-stream.d.ts.map +1 -0
  93. package/dist/client/browser-entry/scroll.d.ts +19 -0
  94. package/dist/client/browser-entry/scroll.d.ts.map +1 -0
  95. package/dist/client/error-boundary.d.ts +12 -5
  96. package/dist/client/error-boundary.d.ts.map +1 -1
  97. package/dist/client/error-boundary.js +10 -4
  98. package/dist/client/error-boundary.js.map +1 -1
  99. package/dist/client/error-reconstituter.d.ts +54 -0
  100. package/dist/client/error-reconstituter.d.ts.map +1 -0
  101. package/dist/client/form.d.ts +6 -3
  102. package/dist/client/form.d.ts.map +1 -1
  103. package/dist/client/history.d.ts +19 -4
  104. package/dist/client/history.d.ts.map +1 -1
  105. package/dist/client/index.d.ts +9 -21
  106. package/dist/client/index.d.ts.map +1 -1
  107. package/dist/client/index.js +229 -1018
  108. package/dist/client/index.js.map +1 -1
  109. package/dist/client/internal.d.ts +18 -0
  110. package/dist/client/internal.d.ts.map +1 -0
  111. package/dist/client/internal.js +890 -0
  112. package/dist/client/internal.js.map +1 -0
  113. package/dist/client/link-pending-store.d.ts +63 -0
  114. package/dist/client/link-pending-store.d.ts.map +1 -0
  115. package/dist/client/link.d.ts +62 -55
  116. package/dist/client/link.d.ts.map +1 -1
  117. package/dist/client/nav-link-store.d.ts +36 -0
  118. package/dist/client/nav-link-store.d.ts.map +1 -0
  119. package/dist/client/navigation-api-types.d.ts +90 -0
  120. package/dist/client/navigation-api-types.d.ts.map +1 -0
  121. package/dist/client/navigation-api.d.ts +115 -0
  122. package/dist/client/navigation-api.d.ts.map +1 -0
  123. package/dist/client/navigation-context.d.ts +13 -2
  124. package/dist/client/navigation-context.d.ts.map +1 -1
  125. package/dist/client/{transition-root.d.ts → navigation-root.d.ts} +42 -8
  126. package/dist/client/navigation-root.d.ts.map +1 -0
  127. package/dist/client/nuqs-adapter.d.ts.map +1 -1
  128. package/dist/client/router-ref.d.ts +1 -1
  129. package/dist/client/router.d.ts +70 -4
  130. package/dist/client/router.d.ts.map +1 -1
  131. package/dist/client/rsc-fetch.d.ts +38 -3
  132. package/dist/client/rsc-fetch.d.ts.map +1 -1
  133. package/dist/client/segment-cache.d.ts +1 -1
  134. package/dist/client/segment-cache.d.ts.map +1 -1
  135. package/dist/client/segment-outlet.d.ts +63 -0
  136. package/dist/client/segment-outlet.d.ts.map +1 -0
  137. package/dist/client/ssr-data.d.ts +13 -4
  138. package/dist/client/ssr-data.d.ts.map +1 -1
  139. package/dist/client/stale-reload.d.ts +15 -0
  140. package/dist/client/stale-reload.d.ts.map +1 -1
  141. package/dist/client/top-loader.d.ts +5 -5
  142. package/dist/client/top-loader.d.ts.map +1 -1
  143. package/dist/client/use-link-status.d.ts +5 -5
  144. package/dist/client/use-link-status.d.ts.map +1 -1
  145. package/dist/client/use-params.d.ts +6 -4
  146. package/dist/client/use-params.d.ts.map +1 -1
  147. package/dist/client/{use-navigation-pending.d.ts → use-pending-navigation.d.ts} +4 -4
  148. package/dist/client/use-pending-navigation.d.ts.map +1 -0
  149. package/dist/client/use-query-states.d.ts +1 -1
  150. package/dist/client/use-query-states.d.ts.map +1 -1
  151. package/dist/client/use-router.d.ts +1 -1
  152. package/dist/codec.d.ts +33 -0
  153. package/dist/codec.d.ts.map +1 -0
  154. package/dist/codec.js +2 -0
  155. package/dist/config-types.d.ts +266 -0
  156. package/dist/config-types.d.ts.map +1 -0
  157. package/dist/config-validation.d.ts +51 -0
  158. package/dist/config-validation.d.ts.map +1 -0
  159. package/dist/content/index.d.ts +1 -10
  160. package/dist/content/index.d.ts.map +1 -1
  161. package/dist/content/index.js +0 -2
  162. package/dist/cookies/define-cookie.d.ts +35 -14
  163. package/dist/cookies/define-cookie.d.ts.map +1 -1
  164. package/dist/cookies/index.js +1 -83
  165. package/dist/fonts/bundle.d.ts +48 -0
  166. package/dist/fonts/bundle.d.ts.map +1 -0
  167. package/dist/fonts/css.d.ts +1 -0
  168. package/dist/fonts/css.d.ts.map +1 -1
  169. package/dist/fonts/dev-middleware.d.ts +22 -0
  170. package/dist/fonts/dev-middleware.d.ts.map +1 -0
  171. package/dist/fonts/pipeline.d.ts +138 -0
  172. package/dist/fonts/pipeline.d.ts.map +1 -0
  173. package/dist/fonts/transform.d.ts +72 -0
  174. package/dist/fonts/transform.d.ts.map +1 -0
  175. package/dist/fonts/types.d.ts +45 -1
  176. package/dist/fonts/types.d.ts.map +1 -1
  177. package/dist/fonts/virtual-modules.d.ts +59 -0
  178. package/dist/fonts/virtual-modules.d.ts.map +1 -0
  179. package/dist/index.d.ts +45 -190
  180. package/dist/index.d.ts.map +1 -1
  181. package/dist/index.js +4294 -2453
  182. package/dist/index.js.map +1 -1
  183. package/dist/plugin-context.d.ts +107 -0
  184. package/dist/plugin-context.d.ts.map +1 -0
  185. package/dist/plugins/adapter-build.d.ts +1 -1
  186. package/dist/plugins/adapter-build.d.ts.map +1 -1
  187. package/dist/plugins/build-manifest.d.ts +2 -2
  188. package/dist/plugins/build-manifest.d.ts.map +1 -1
  189. package/dist/plugins/build-report.d.ts +3 -3
  190. package/dist/plugins/build-report.d.ts.map +1 -1
  191. package/dist/plugins/client-chunks.d.ts +32 -0
  192. package/dist/plugins/client-chunks.d.ts.map +1 -0
  193. package/dist/plugins/content.d.ts +1 -1
  194. package/dist/plugins/content.d.ts.map +1 -1
  195. package/dist/plugins/dev-404-page.d.ts +56 -0
  196. package/dist/plugins/dev-404-page.d.ts.map +1 -0
  197. package/dist/plugins/dev-browser-logs.d.ts +84 -0
  198. package/dist/plugins/dev-browser-logs.d.ts.map +1 -0
  199. package/dist/plugins/dev-error-overlay.d.ts +49 -9
  200. package/dist/plugins/dev-error-overlay.d.ts.map +1 -1
  201. package/dist/plugins/dev-error-page.d.ts +58 -0
  202. package/dist/plugins/dev-error-page.d.ts.map +1 -0
  203. package/dist/plugins/dev-logs.d.ts +1 -1
  204. package/dist/plugins/dev-logs.d.ts.map +1 -1
  205. package/dist/plugins/dev-server.d.ts +1 -1
  206. package/dist/plugins/dev-server.d.ts.map +1 -1
  207. package/dist/plugins/dev-terminal-error.d.ts +28 -0
  208. package/dist/plugins/dev-terminal-error.d.ts.map +1 -0
  209. package/dist/plugins/entries.d.ts +1 -1
  210. package/dist/plugins/entries.d.ts.map +1 -1
  211. package/dist/plugins/fonts.d.ts +17 -73
  212. package/dist/plugins/fonts.d.ts.map +1 -1
  213. package/dist/plugins/mdx.d.ts +1 -1
  214. package/dist/plugins/mdx.d.ts.map +1 -1
  215. package/dist/plugins/routing.d.ts +1 -1
  216. package/dist/plugins/routing.d.ts.map +1 -1
  217. package/dist/plugins/server-bundle.d.ts.map +1 -1
  218. package/dist/plugins/shims.d.ts +6 -5
  219. package/dist/plugins/shims.d.ts.map +1 -1
  220. package/dist/plugins/static-build.d.ts +4 -4
  221. package/dist/plugins/static-build.d.ts.map +1 -1
  222. package/dist/routing/codegen-shared.d.ts +38 -0
  223. package/dist/routing/codegen-shared.d.ts.map +1 -0
  224. package/dist/routing/codegen-types.d.ts +36 -0
  225. package/dist/routing/codegen-types.d.ts.map +1 -0
  226. package/dist/routing/codegen.d.ts +2 -2
  227. package/dist/routing/codegen.d.ts.map +1 -1
  228. package/dist/routing/convention-lint.d.ts +41 -0
  229. package/dist/routing/convention-lint.d.ts.map +1 -0
  230. package/dist/routing/index.d.ts +2 -0
  231. package/dist/routing/index.d.ts.map +1 -1
  232. package/dist/routing/index.js +3 -2
  233. package/dist/routing/link-codegen.d.ts +90 -0
  234. package/dist/routing/link-codegen.d.ts.map +1 -0
  235. package/dist/routing/scanner.d.ts.map +1 -1
  236. package/dist/routing/segment-classify.d.ts +46 -0
  237. package/dist/routing/segment-classify.d.ts.map +1 -0
  238. package/dist/routing/status-file-lint.d.ts +2 -1
  239. package/dist/routing/status-file-lint.d.ts.map +1 -1
  240. package/dist/routing/types.d.ts +16 -4
  241. package/dist/routing/types.d.ts.map +1 -1
  242. package/dist/rsc-runtime/rsc.d.ts +1 -1
  243. package/dist/rsc-runtime/rsc.d.ts.map +1 -1
  244. package/dist/rsc-runtime/ssr.d.ts +12 -0
  245. package/dist/rsc-runtime/ssr.d.ts.map +1 -1
  246. package/dist/schema-bridge.d.ts +76 -0
  247. package/dist/schema-bridge.d.ts.map +1 -0
  248. package/dist/search-params/define.d.ts +139 -0
  249. package/dist/search-params/define.d.ts.map +1 -0
  250. package/dist/search-params/index.d.ts +4 -7
  251. package/dist/search-params/index.d.ts.map +1 -1
  252. package/dist/search-params/index.js +32 -441
  253. package/dist/search-params/index.js.map +1 -1
  254. package/dist/search-params/registry.d.ts +2 -2
  255. package/dist/search-params/registry.d.ts.map +1 -1
  256. package/dist/search-params/wrappers.d.ts +53 -0
  257. package/dist/search-params/wrappers.d.ts.map +1 -0
  258. package/dist/segment-params/define.d.ts +78 -0
  259. package/dist/segment-params/define.d.ts.map +1 -0
  260. package/dist/segment-params/index.d.ts +3 -0
  261. package/dist/segment-params/index.d.ts.map +1 -0
  262. package/dist/segment-params/index.js +2 -0
  263. package/dist/server/access-gate.d.ts +4 -0
  264. package/dist/server/access-gate.d.ts.map +1 -1
  265. package/dist/server/action-client.d.ts +41 -6
  266. package/dist/server/action-client.d.ts.map +1 -1
  267. package/dist/server/action-encryption.d.ts +76 -0
  268. package/dist/server/action-encryption.d.ts.map +1 -0
  269. package/dist/server/action-handler.d.ts +7 -0
  270. package/dist/server/action-handler.d.ts.map +1 -1
  271. package/dist/server/actions.d.ts +3 -6
  272. package/dist/server/actions.d.ts.map +1 -1
  273. package/dist/server/als-registry.d.ts +32 -4
  274. package/dist/server/als-registry.d.ts.map +1 -1
  275. package/dist/server/build-manifest.d.ts +2 -2
  276. package/dist/server/build-manifest.d.ts.map +1 -1
  277. package/dist/server/debug.d.ts +1 -1
  278. package/dist/server/default-logger.d.ts +22 -0
  279. package/dist/server/default-logger.d.ts.map +1 -0
  280. package/dist/server/deny-page-resolver.d.ts +52 -0
  281. package/dist/server/deny-page-resolver.d.ts.map +1 -0
  282. package/dist/server/deny-renderer.d.ts.map +1 -1
  283. package/dist/server/dev-holding-server.d.ts +52 -0
  284. package/dist/server/dev-holding-server.d.ts.map +1 -0
  285. package/dist/server/dev-source-map.d.ts +22 -0
  286. package/dist/server/dev-source-map.d.ts.map +1 -0
  287. package/dist/server/dev-warnings.d.ts +1 -21
  288. package/dist/server/dev-warnings.d.ts.map +1 -1
  289. package/dist/server/early-hints.d.ts +13 -5
  290. package/dist/server/early-hints.d.ts.map +1 -1
  291. package/dist/server/error-boundary-wrapper.d.ts +7 -1
  292. package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
  293. package/dist/server/fallback-error.d.ts +12 -7
  294. package/dist/server/fallback-error.d.ts.map +1 -1
  295. package/dist/server/flight-injection-state.d.ts +66 -0
  296. package/dist/server/flight-injection-state.d.ts.map +1 -0
  297. package/dist/server/flight-scripts.d.ts +42 -0
  298. package/dist/server/flight-scripts.d.ts.map +1 -0
  299. package/dist/server/flush.d.ts.map +1 -1
  300. package/dist/server/form-data.d.ts +29 -0
  301. package/dist/server/form-data.d.ts.map +1 -1
  302. package/dist/server/html-injectors.d.ts +51 -11
  303. package/dist/server/html-injectors.d.ts.map +1 -1
  304. package/dist/server/index.d.ts +5 -43
  305. package/dist/server/index.d.ts.map +1 -1
  306. package/dist/server/index.js +195 -2800
  307. package/dist/server/index.js.map +1 -1
  308. package/dist/server/internal.d.ts +46 -0
  309. package/dist/server/internal.d.ts.map +1 -0
  310. package/dist/server/internal.js +2900 -0
  311. package/dist/server/internal.js.map +1 -0
  312. package/dist/server/logger.d.ts +25 -7
  313. package/dist/server/logger.d.ts.map +1 -1
  314. package/dist/server/middleware-runner.d.ts +19 -4
  315. package/dist/server/middleware-runner.d.ts.map +1 -1
  316. package/dist/server/node-stream-transforms.d.ts +113 -0
  317. package/dist/server/node-stream-transforms.d.ts.map +1 -0
  318. package/dist/server/page-deny-boundary.d.ts +31 -0
  319. package/dist/server/page-deny-boundary.d.ts.map +1 -0
  320. package/dist/server/pipeline-interception.d.ts +1 -1
  321. package/dist/server/pipeline-interception.d.ts.map +1 -1
  322. package/dist/server/pipeline-metadata.d.ts +6 -0
  323. package/dist/server/pipeline-metadata.d.ts.map +1 -1
  324. package/dist/server/pipeline.d.ts +52 -10
  325. package/dist/server/pipeline.d.ts.map +1 -1
  326. package/dist/server/primitives.d.ts +69 -18
  327. package/dist/server/primitives.d.ts.map +1 -1
  328. package/dist/server/render-timeout.d.ts +51 -0
  329. package/dist/server/render-timeout.d.ts.map +1 -0
  330. package/dist/server/request-context.d.ts +112 -43
  331. package/dist/server/request-context.d.ts.map +1 -1
  332. package/dist/server/route-element-builder.d.ts +27 -1
  333. package/dist/server/route-element-builder.d.ts.map +1 -1
  334. package/dist/server/route-handler.d.ts.map +1 -1
  335. package/dist/server/route-matcher.d.ts +16 -2
  336. package/dist/server/route-matcher.d.ts.map +1 -1
  337. package/dist/server/rsc-entry/api-handler.d.ts +2 -2
  338. package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
  339. package/dist/server/rsc-entry/error-renderer.d.ts +26 -13
  340. package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
  341. package/dist/server/rsc-entry/helpers.d.ts +48 -5
  342. package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
  343. package/dist/server/rsc-entry/index.d.ts +20 -3
  344. package/dist/server/rsc-entry/index.d.ts.map +1 -1
  345. package/dist/server/rsc-entry/rsc-payload.d.ts +3 -3
  346. package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
  347. package/dist/server/rsc-entry/rsc-stream.d.ts +14 -1
  348. package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
  349. package/dist/server/rsc-entry/ssr-bridge.d.ts +1 -1
  350. package/dist/server/rsc-entry/ssr-bridge.d.ts.map +1 -1
  351. package/dist/server/rsc-entry/ssr-renderer.d.ts +19 -4
  352. package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
  353. package/dist/server/safe-load.d.ts +46 -0
  354. package/dist/server/safe-load.d.ts.map +1 -0
  355. package/dist/server/sensitive-fields.d.ts +74 -0
  356. package/dist/server/sensitive-fields.d.ts.map +1 -0
  357. package/dist/server/sitemap-generator.d.ts +129 -0
  358. package/dist/server/sitemap-generator.d.ts.map +1 -0
  359. package/dist/server/sitemap-handler.d.ts +22 -0
  360. package/dist/server/sitemap-handler.d.ts.map +1 -0
  361. package/dist/server/slot-resolver.d.ts +1 -1
  362. package/dist/server/slot-resolver.d.ts.map +1 -1
  363. package/dist/server/ssr-entry.d.ts +23 -0
  364. package/dist/server/ssr-entry.d.ts.map +1 -1
  365. package/dist/server/ssr-render.d.ts +39 -21
  366. package/dist/server/ssr-render.d.ts.map +1 -1
  367. package/dist/server/ssr-wrappers.d.ts +50 -0
  368. package/dist/server/ssr-wrappers.d.ts.map +1 -0
  369. package/dist/server/status-code-resolver.d.ts +1 -1
  370. package/dist/server/status-code-resolver.d.ts.map +1 -1
  371. package/dist/server/stream-utils.d.ts +36 -0
  372. package/dist/server/stream-utils.d.ts.map +1 -0
  373. package/dist/server/tracing.d.ts +4 -4
  374. package/dist/server/tracing.d.ts.map +1 -1
  375. package/dist/server/tree-builder.d.ts +22 -19
  376. package/dist/server/tree-builder.d.ts.map +1 -1
  377. package/dist/server/types.d.ts +1 -4
  378. package/dist/server/types.d.ts.map +1 -1
  379. package/dist/server/version-skew.d.ts +61 -0
  380. package/dist/server/version-skew.d.ts.map +1 -0
  381. package/dist/shared/merge-search-params.d.ts +22 -0
  382. package/dist/shared/merge-search-params.d.ts.map +1 -0
  383. package/dist/shims/font-google.d.ts +1 -1
  384. package/dist/shims/font-google.d.ts.map +1 -1
  385. package/dist/shims/font-google.js +42 -0
  386. package/dist/shims/font-google.js.map +1 -0
  387. package/dist/shims/font-local.d.ts +26 -0
  388. package/dist/shims/font-local.d.ts.map +1 -0
  389. package/dist/shims/font-local.js +20 -0
  390. package/dist/shims/font-local.js.map +1 -0
  391. package/dist/shims/headers.d.ts +2 -1
  392. package/dist/shims/headers.d.ts.map +1 -1
  393. package/dist/shims/navigation-client.d.ts +1 -1
  394. package/dist/shims/navigation-client.d.ts.map +1 -1
  395. package/dist/shims/navigation.d.ts +3 -2
  396. package/dist/shims/navigation.d.ts.map +1 -1
  397. package/dist/utils/directive-parser.d.ts +5 -2
  398. package/dist/utils/directive-parser.d.ts.map +1 -1
  399. package/dist/utils/state-machine.d.ts +80 -0
  400. package/dist/utils/state-machine.d.ts.map +1 -0
  401. package/package.json +51 -16
  402. package/src/adapters/cloudflare-dev.ts +177 -0
  403. package/src/adapters/cloudflare-kv-cache.ts +142 -0
  404. package/src/adapters/cloudflare.ts +342 -28
  405. package/src/adapters/compress-module.ts +24 -4
  406. package/src/adapters/nitro.ts +52 -8
  407. package/src/adapters/wrangler.d.ts +7 -0
  408. package/src/cache/cache-api.ts +38 -0
  409. package/src/cache/handler-store.ts +68 -0
  410. package/src/cache/index.ts +81 -18
  411. package/src/cache/singleflight.ts +62 -4
  412. package/src/cache/sizeof.ts +31 -0
  413. package/src/cache/timber-cache.ts +24 -20
  414. package/src/cli.ts +16 -6
  415. package/src/client/browser-dev.ts +128 -1
  416. package/src/client/browser-entry/action-dispatch.ts +116 -0
  417. package/src/client/browser-entry/hmr.ts +81 -0
  418. package/src/client/browser-entry/hydrate.ts +145 -0
  419. package/src/client/browser-entry/index.ts +143 -0
  420. package/src/client/browser-entry/post-hydration.ts +119 -0
  421. package/src/client/browser-entry/router-init.ts +193 -0
  422. package/src/client/browser-entry/rsc-stream.ts +157 -0
  423. package/src/client/browser-entry/scroll.ts +27 -0
  424. package/src/client/error-boundary.tsx +48 -16
  425. package/src/client/error-reconstituter.tsx +65 -0
  426. package/src/client/form.tsx +14 -7
  427. package/src/client/history.ts +26 -4
  428. package/src/client/index.ts +65 -38
  429. package/src/client/internal.ts +57 -0
  430. package/src/client/link-pending-store.ts +111 -0
  431. package/src/client/link.tsx +342 -113
  432. package/src/client/nav-link-store.ts +47 -0
  433. package/src/client/navigation-api-types.ts +112 -0
  434. package/src/client/navigation-api.ts +332 -0
  435. package/src/client/navigation-context.ts +31 -6
  436. package/src/client/navigation-root.tsx +342 -0
  437. package/src/client/nuqs-adapter.tsx +16 -3
  438. package/src/client/router-ref.ts +1 -1
  439. package/src/client/router.ts +299 -72
  440. package/src/client/rsc-fetch.ts +97 -8
  441. package/src/client/segment-cache.ts +1 -1
  442. package/src/client/segment-outlet.tsx +86 -0
  443. package/src/client/ssr-data.ts +13 -5
  444. package/src/client/stale-reload.ts +72 -3
  445. package/src/client/top-loader.tsx +18 -6
  446. package/src/client/use-link-status.ts +7 -7
  447. package/src/client/use-params.ts +7 -5
  448. package/src/client/{use-navigation-pending.ts → use-pending-navigation.ts} +6 -6
  449. package/src/client/use-query-states.ts +9 -3
  450. package/src/client/use-router.ts +1 -1
  451. package/src/codec.ts +49 -0
  452. package/src/config-types.ts +264 -0
  453. package/src/config-validation.ts +303 -0
  454. package/src/content/index.ts +5 -13
  455. package/src/cookies/define-cookie.ts +78 -25
  456. package/src/cookies/index.ts +8 -0
  457. package/src/fonts/bundle.ts +142 -0
  458. package/src/fonts/css.ts +2 -1
  459. package/src/fonts/dev-middleware.ts +74 -0
  460. package/src/fonts/pipeline.ts +275 -0
  461. package/src/fonts/transform.ts +353 -0
  462. package/src/fonts/types.ts +50 -1
  463. package/src/fonts/virtual-modules.ts +159 -0
  464. package/src/index.ts +314 -355
  465. package/src/plugin-context.ts +240 -0
  466. package/src/plugins/adapter-build.ts +9 -3
  467. package/src/plugins/build-manifest.ts +13 -2
  468. package/src/plugins/build-report.ts +3 -3
  469. package/src/plugins/client-chunks.ts +65 -0
  470. package/src/plugins/content.ts +1 -1
  471. package/src/plugins/dev-404-page.ts +418 -0
  472. package/src/plugins/dev-browser-logs.ts +288 -0
  473. package/src/plugins/dev-error-overlay.ts +286 -42
  474. package/src/plugins/dev-error-page.ts +536 -0
  475. package/src/plugins/dev-logs.ts +1 -1
  476. package/src/plugins/dev-server.ts +146 -19
  477. package/src/plugins/dev-terminal-error.ts +217 -0
  478. package/src/plugins/entries.ts +111 -10
  479. package/src/plugins/fonts.ts +133 -638
  480. package/src/plugins/mdx.ts +1 -1
  481. package/src/plugins/routing.ts +213 -31
  482. package/src/plugins/server-action-exports.ts +1 -1
  483. package/src/plugins/server-bundle.ts +32 -1
  484. package/src/plugins/shims.ts +136 -35
  485. package/src/plugins/static-build.ts +17 -11
  486. package/src/routing/codegen-shared.ts +74 -0
  487. package/src/routing/codegen-types.ts +37 -0
  488. package/src/routing/codegen.ts +112 -173
  489. package/src/routing/convention-lint.ts +356 -0
  490. package/src/routing/index.ts +2 -0
  491. package/src/routing/link-codegen.ts +262 -0
  492. package/src/routing/scanner.ts +93 -23
  493. package/src/routing/segment-classify.ts +89 -0
  494. package/src/routing/status-file-lint.ts +3 -2
  495. package/src/routing/types.ts +17 -4
  496. package/src/rsc-runtime/rsc.ts +2 -0
  497. package/src/rsc-runtime/ssr.ts +50 -0
  498. package/src/rsc-runtime/vendor-types.d.ts +7 -0
  499. package/src/{search-params/codecs.ts → schema-bridge.ts} +57 -20
  500. package/src/search-params/define.ts +482 -0
  501. package/src/search-params/index.ts +14 -20
  502. package/src/search-params/registry.ts +2 -2
  503. package/src/search-params/wrappers.ts +85 -0
  504. package/src/segment-params/define.ts +279 -0
  505. package/src/segment-params/index.ts +9 -0
  506. package/src/server/access-gate.tsx +70 -29
  507. package/src/server/action-client.ts +88 -15
  508. package/src/server/action-encryption.ts +144 -0
  509. package/src/server/action-handler.ts +53 -6
  510. package/src/server/actions.ts +10 -9
  511. package/src/server/als-registry.ts +34 -6
  512. package/src/server/build-manifest.ts +10 -4
  513. package/src/server/compress.ts +25 -7
  514. package/src/server/debug.ts +1 -1
  515. package/src/server/default-logger.ts +99 -0
  516. package/src/server/deny-page-resolver.ts +154 -0
  517. package/src/server/deny-renderer.ts +24 -38
  518. package/src/server/dev-holding-server.ts +185 -0
  519. package/src/server/dev-source-map.ts +31 -0
  520. package/src/server/dev-warnings.ts +4 -49
  521. package/src/server/early-hints.ts +36 -15
  522. package/src/server/error-boundary-wrapper.ts +74 -22
  523. package/src/server/fallback-error.ts +74 -102
  524. package/src/server/flight-injection-state.ts +113 -0
  525. package/src/server/flight-scripts.ts +62 -0
  526. package/src/server/flush.ts +2 -1
  527. package/src/server/form-data.ts +76 -0
  528. package/src/server/html-injectors.ts +280 -120
  529. package/src/server/index.ts +25 -177
  530. package/src/server/internal.ts +169 -0
  531. package/src/server/logger.ts +44 -36
  532. package/src/server/middleware-runner.ts +31 -4
  533. package/src/server/node-stream-transforms.ts +509 -0
  534. package/src/server/page-deny-boundary.tsx +56 -0
  535. package/src/server/pipeline-interception.ts +17 -16
  536. package/src/server/pipeline-metadata.ts +13 -0
  537. package/src/server/pipeline.ts +261 -66
  538. package/src/server/primitives.ts +111 -28
  539. package/src/server/render-timeout.ts +108 -0
  540. package/src/server/request-context.ts +293 -132
  541. package/src/server/route-element-builder.ts +283 -191
  542. package/src/server/route-handler.ts +24 -4
  543. package/src/server/route-matcher.ts +31 -20
  544. package/src/server/rsc-entry/api-handler.ts +15 -16
  545. package/src/server/rsc-entry/error-renderer.ts +305 -89
  546. package/src/server/rsc-entry/helpers.ts +134 -5
  547. package/src/server/rsc-entry/index.ts +304 -111
  548. package/src/server/rsc-entry/rsc-payload.ts +65 -18
  549. package/src/server/rsc-entry/rsc-stream.ts +81 -13
  550. package/src/server/rsc-entry/ssr-bridge.ts +14 -5
  551. package/src/server/rsc-entry/ssr-renderer.ts +171 -38
  552. package/src/server/safe-load.ts +60 -0
  553. package/src/server/sensitive-fields.ts +230 -0
  554. package/src/server/sitemap-generator.ts +338 -0
  555. package/src/server/sitemap-handler.ts +126 -0
  556. package/src/server/slot-resolver.ts +244 -229
  557. package/src/server/ssr-entry.ts +215 -32
  558. package/src/server/ssr-render.ts +289 -67
  559. package/src/server/ssr-wrappers.tsx +139 -0
  560. package/src/server/status-code-resolver.ts +1 -1
  561. package/src/server/stream-utils.ts +213 -0
  562. package/src/server/tracing.ts +20 -9
  563. package/src/server/tree-builder.ts +92 -58
  564. package/src/server/types.ts +3 -6
  565. package/src/server/version-skew.ts +104 -0
  566. package/src/shared/merge-search-params.ts +55 -0
  567. package/src/shims/font-google.ts +1 -1
  568. package/src/shims/font-local.ts +34 -0
  569. package/src/shims/headers.ts +5 -1
  570. package/src/shims/navigation-client.ts +1 -1
  571. package/src/shims/navigation.ts +7 -2
  572. package/src/utils/directive-parser.ts +5 -2
  573. package/src/utils/state-machine.ts +111 -0
  574. package/dist/_chunks/als-registry-B7DbZ2hS.js.map +0 -1
  575. package/dist/_chunks/debug-gwlJkDuf.js.map +0 -1
  576. package/dist/_chunks/format-DviM89f0.js.map +0 -1
  577. package/dist/_chunks/interception-BOoWmLUA.js.map +0 -1
  578. package/dist/_chunks/request-context-DIkVh_jG.js +0 -330
  579. package/dist/_chunks/request-context-DIkVh_jG.js.map +0 -1
  580. package/dist/_chunks/tracing-CemImE6h.js.map +0 -1
  581. package/dist/_chunks/use-cookie-DX-l1_5E.js +0 -91
  582. package/dist/_chunks/use-cookie-DX-l1_5E.js.map +0 -1
  583. package/dist/_chunks/use-query-states-D5KaffOK.js.map +0 -1
  584. package/dist/cache/register-cached-function.d.ts +0 -17
  585. package/dist/cache/register-cached-function.d.ts.map +0 -1
  586. package/dist/client/browser-entry.d.ts +0 -21
  587. package/dist/client/browser-entry.d.ts.map +0 -1
  588. package/dist/client/link-status-provider.d.ts +0 -11
  589. package/dist/client/link-status-provider.d.ts.map +0 -1
  590. package/dist/client/transition-root.d.ts.map +0 -1
  591. package/dist/client/use-navigation-pending.d.ts.map +0 -1
  592. package/dist/cookies/index.js.map +0 -1
  593. package/dist/plugins/cache-transform.d.ts +0 -36
  594. package/dist/plugins/cache-transform.d.ts.map +0 -1
  595. package/dist/plugins/dynamic-transform.d.ts +0 -72
  596. package/dist/plugins/dynamic-transform.d.ts.map +0 -1
  597. package/dist/search-params/analyze.d.ts +0 -54
  598. package/dist/search-params/analyze.d.ts.map +0 -1
  599. package/dist/search-params/builtin-codecs.d.ts +0 -105
  600. package/dist/search-params/builtin-codecs.d.ts.map +0 -1
  601. package/dist/search-params/codecs.d.ts +0 -53
  602. package/dist/search-params/codecs.d.ts.map +0 -1
  603. package/dist/search-params/create.d.ts +0 -106
  604. package/dist/search-params/create.d.ts.map +0 -1
  605. package/dist/server/prerender.d.ts +0 -77
  606. package/dist/server/prerender.d.ts.map +0 -1
  607. package/dist/server/response-cache.d.ts +0 -54
  608. package/dist/server/response-cache.d.ts.map +0 -1
  609. package/src/cache/register-cached-function.ts +0 -103
  610. package/src/client/browser-entry.ts +0 -678
  611. package/src/client/link-status-provider.tsx +0 -30
  612. package/src/client/transition-root.tsx +0 -166
  613. package/src/plugins/cache-transform.ts +0 -199
  614. package/src/plugins/dynamic-transform.ts +0 -161
  615. package/src/search-params/analyze.ts +0 -192
  616. package/src/search-params/builtin-codecs.ts +0 -228
  617. package/src/search-params/create.ts +0 -321
  618. package/src/server/prerender.ts +0 -139
  619. package/src/server/response-cache.ts +0 -410
@@ -11,7 +11,7 @@
11
11
  import type { Plugin } from 'vite';
12
12
  import { existsSync } from 'node:fs';
13
13
  import { join } from 'node:path';
14
- import type { PluginContext } from '#/index.js';
14
+ import type { PluginContext } from '../plugin-context.js';
15
15
 
16
16
  const MDX_EXTENSIONS = ['mdx', 'md'];
17
17
 
@@ -10,25 +10,46 @@
10
10
 
11
11
  import type { Plugin, ViteDevServer } from 'vite';
12
12
  import { writeFile, mkdir } from 'node:fs/promises';
13
+ import { existsSync, readFileSync } from 'node:fs';
13
14
  import { join } from 'node:path';
14
- import { scanRoutes } from '#/routing/scanner.js';
15
- import { generateRouteMap } from '#/routing/codegen.js';
16
- import { collectInterceptionRewrites } from '#/routing/interception.js';
15
+ import { scanRoutes } from '../routing/scanner.js';
16
+ import { generateRouteMap } from '../routing/codegen.js';
17
+ import { collectInterceptionRewrites } from '../routing/interception.js';
17
18
  import {
18
19
  lintStatusFileDirectives,
19
20
  formatStatusFileLintWarnings,
20
- } from '#/routing/status-file-lint.js';
21
- import type { RouteTree, SegmentNode, RouteFile } from '#/routing/types.js';
22
- import type { PluginContext } from '#/index.js';
21
+ } from '../routing/status-file-lint.js';
22
+ import {
23
+ lintConventions,
24
+ checkAppDirExists,
25
+ formatConventionWarnings,
26
+ } from '../routing/convention-lint.js';
27
+ import type { RouteTree, SegmentNode, RouteFile } from '../routing/types.js';
28
+ import type { PluginContext } from '../plugin-context.js';
23
29
 
24
30
  const VIRTUAL_MODULE_ID = 'virtual:timber-route-manifest';
25
31
  const RESOLVED_VIRTUAL_ID = `\0${VIRTUAL_MODULE_ID}`;
26
32
 
33
+ // TIM-830: Search-params registry virtual module.
34
+ //
35
+ // Statically imports the `searchParams` named export from every page
36
+ // that exports one, and registers each definition into the shared
37
+ // search-params registry keyed by the un-interpolated route pattern
38
+ // (e.g. '/products/[id]'). This lets `<Link>` serialize flat
39
+ // `Partial<T>` values at runtime without callers importing the
40
+ // definition at the call site.
41
+ //
42
+ // The imports are STATIC (`import { searchParams as r0 } from '...'`)
43
+ // so Vite/Rolldown tree-shakes each page's component body out of the
44
+ // registry chunk — only the `searchParams` named export is pulled in.
45
+ const SEARCH_PARAMS_REGISTRY_ID = 'virtual:timber-search-params-registry';
46
+ const RESOLVED_SEARCH_PARAMS_REGISTRY_ID = `\0${SEARCH_PARAMS_REGISTRY_ID}`;
47
+
27
48
  /**
28
49
  * File convention names we track for changes that require manifest regeneration.
29
50
  */
30
51
  const ROUTE_FILE_PATTERNS =
31
- /\/(page|layout|middleware|access|route|error|default|denied|search-params|\d{3}|[45]xx|not-found|forbidden|unauthorized|sitemap|robots|manifest|favicon|icon|opengraph-image|twitter-image|apple-icon)\./;
52
+ /\/(page|layout|middleware|access|route|error|global-error|default|denied|params|\d{3}|[45]xx|not-found|forbidden|unauthorized|sitemap|robots|manifest|favicon|icon|opengraph-image|twitter-image|apple-icon)\./;
32
53
 
33
54
  /**
34
55
  * Create the timber-routing Vite plugin.
@@ -83,6 +104,24 @@ export function timberRouting(ctx: PluginContext): Plugin {
83
104
  const warnedFiles = new Set<string>();
84
105
 
85
106
  function rescan(): void {
107
+ // Check app/ directory exists before scanning
108
+ const appDirWarning = checkAppDirExists(ctx.appDir);
109
+ if (appDirWarning) {
110
+ const formatted = formatConventionWarnings([appDirWarning]);
111
+ if (formatted) process.stderr.write(`${formatted}\n`);
112
+ // Still create an empty tree so the rest of the pipeline doesn't crash
113
+ ctx.routeTree = {
114
+ root: {
115
+ segmentName: '',
116
+ segmentType: 'static',
117
+ urlPath: '/',
118
+ children: [],
119
+ slots: new Map(),
120
+ },
121
+ };
122
+ return;
123
+ }
124
+
86
125
  ctx.timer.start('route-scan');
87
126
  ctx.routeTree = scanRoutes(ctx.appDir, {
88
127
  pageExtensions: ctx.config.pageExtensions,
@@ -91,11 +130,20 @@ export function timberRouting(ctx: PluginContext): Plugin {
91
130
  writeCodegen(ctx);
92
131
 
93
132
  // Lint status files for missing 'use client' directive
94
- const warnings = lintStatusFileDirectives(ctx.routeTree);
95
- const newWarnings = warnings.filter((w) => !warnedFiles.has(w.filePath));
96
- if (newWarnings.length > 0) {
97
- for (const w of newWarnings) warnedFiles.add(w.filePath);
98
- console.warn(formatStatusFileLintWarnings(newWarnings));
133
+ const statusWarnings = lintStatusFileDirectives(ctx.routeTree);
134
+ const newStatusWarnings = statusWarnings.filter((w) => !warnedFiles.has(w.filePath));
135
+ if (newStatusWarnings.length > 0) {
136
+ for (const w of newStatusWarnings) warnedFiles.add(w.filePath);
137
+ console.warn(formatStatusFileLintWarnings(newStatusWarnings));
138
+ }
139
+
140
+ // Lint conventions (empty app, missing methods, missing root layout)
141
+ const conventionWarnings = lintConventions(ctx.routeTree, ctx.appDir);
142
+ const newConventionWarnings = conventionWarnings.filter((w) => !warnedFiles.has(w.id));
143
+ if (newConventionWarnings.length > 0) {
144
+ for (const w of newConventionWarnings) warnedFiles.add(w.id);
145
+ const formatted = formatConventionWarnings(newConventionWarnings);
146
+ if (formatted) process.stderr.write(`${formatted}\n`);
99
147
  }
100
148
  }
101
149
 
@@ -123,6 +171,14 @@ export function timberRouting(ctx: PluginContext): Plugin {
123
171
  return RESOLVED_VIRTUAL_ID;
124
172
  }
125
173
 
174
+ // TIM-830: Search-params registry virtual module
175
+ if (
176
+ cleanId === SEARCH_PARAMS_REGISTRY_ID ||
177
+ cleanId.endsWith(`/${SEARCH_PARAMS_REGISTRY_ID}`)
178
+ ) {
179
+ return RESOLVED_SEARCH_PARAMS_REGISTRY_ID;
180
+ }
181
+
126
182
  return null;
127
183
  },
128
184
 
@@ -133,14 +189,22 @@ export function timberRouting(ctx: PluginContext): Plugin {
133
189
  * with absolute import paths for all file references.
134
190
  */
135
191
  load(id: string) {
136
- if (id !== RESOLVED_VIRTUAL_ID) return null;
192
+ if (id === RESOLVED_VIRTUAL_ID) {
193
+ // If routeTree hasn't been built yet (shouldn't happen), scan now
194
+ if (!ctx.routeTree) {
195
+ rescan();
196
+ }
197
+ return generateManifestModule(ctx.routeTree!, ctx.root);
198
+ }
137
199
 
138
- // If routeTree hasn't been built yet (shouldn't happen), scan now
139
- if (!ctx.routeTree) {
140
- rescan();
200
+ if (id === RESOLVED_SEARCH_PARAMS_REGISTRY_ID) {
201
+ if (!ctx.routeTree) {
202
+ rescan();
203
+ }
204
+ return generateSearchParamsRegistryModule(ctx.routeTree!);
141
205
  }
142
206
 
143
- return generateManifestModule(ctx.routeTree!);
207
+ return null;
144
208
  },
145
209
 
146
210
  /**
@@ -168,20 +232,49 @@ export function timberRouting(ctx: PluginContext): Plugin {
168
232
  // Watch the app directory
169
233
  devServer.watcher.add(ctx.appDir);
170
234
 
171
- const handleFileChange = (filePath: string) => {
172
- // Only react to route-significant files in the app directory
235
+ /** Snapshot of the last generated manifest, used to detect structural changes. */
236
+ let lastManifest = ctx.routeTree ? generateManifestModule(ctx.routeTree, ctx.root) : '';
237
+
238
+ /**
239
+ * Handle a route-significant file being added or removed.
240
+ * Always triggers a full-reload since the route tree structure changed.
241
+ */
242
+ const handleStructuralChange = (filePath: string) => {
173
243
  if (!filePath.startsWith(ctx.appDir)) return;
174
244
  if (!ROUTE_FILE_PATTERNS.test(filePath)) return;
175
245
 
176
- // Rescan the route tree
177
246
  rescan();
178
-
179
- // Invalidate the virtual module in all environments
247
+ lastManifest = ctx.routeTree ? generateManifestModule(ctx.routeTree, ctx.root) : '';
180
248
  invalidateManifest(devServer);
181
249
  };
182
250
 
183
- devServer.watcher.on('add', handleFileChange);
184
- devServer.watcher.on('unlink', handleFileChange);
251
+ /**
252
+ * Handle a route file's content changing.
253
+ *
254
+ * Most content edits (JSX changes, fixing typos) don't affect route
255
+ * metadata — Vite's React Fast Refresh handles those via normal HMR.
256
+ * Only rescan and full-reload when route metadata actually changed
257
+ * (e.g., searchParams export added/removed, metadata export changed).
258
+ */
259
+ const handleContentChange = (filePath: string) => {
260
+ if (!filePath.startsWith(ctx.appDir)) return;
261
+ if (!ROUTE_FILE_PATTERNS.test(filePath)) return;
262
+
263
+ rescan();
264
+ const newManifest = ctx.routeTree ? generateManifestModule(ctx.routeTree, ctx.root) : '';
265
+ if (newManifest !== lastManifest) {
266
+ lastManifest = newManifest;
267
+ invalidateManifest(devServer);
268
+ }
269
+ // Otherwise: content edit didn't change route metadata — let Vite HMR handle it
270
+ };
271
+
272
+ devServer.watcher.on('add', handleStructuralChange);
273
+ devServer.watcher.on('unlink', handleStructuralChange);
274
+ // Watch content changes to page files — searchParams detection depends
275
+ // on file contents (export const searchParams), not just file presence.
276
+ // But only full-reload when route metadata actually changes.
277
+ devServer.watcher.on('change', handleContentChange);
185
278
  // Also watch renames (which are add+unlink) — handled by the above
186
279
  },
187
280
  };
@@ -198,9 +291,11 @@ function invalidateManifest(server: ViteDevServer): void {
198
291
  const env = server.environments[envName];
199
292
  if (!env?.moduleGraph) continue;
200
293
 
201
- const mod = env.moduleGraph.getModuleById(RESOLVED_VIRTUAL_ID);
202
- if (mod) {
203
- env.moduleGraph.invalidateModule(mod);
294
+ for (const virtualId of [RESOLVED_VIRTUAL_ID, RESOLVED_SEARCH_PARAMS_REGISTRY_ID]) {
295
+ const mod = env.moduleGraph.getModuleById(virtualId);
296
+ if (mod) {
297
+ env.moduleGraph.invalidateModule(mod);
298
+ }
204
299
  }
205
300
  }
206
301
 
@@ -208,13 +303,88 @@ function invalidateManifest(server: ViteDevServer): void {
208
303
  server.hot.send({ type: 'full-reload' });
209
304
  }
210
305
 
306
+ /**
307
+ * TIM-830: Walk the route tree and collect every page that exports a
308
+ * `searchParams` definition, then emit a module that statically imports
309
+ * each export and registers it into the shared search-params registry.
310
+ *
311
+ * Keys use the un-interpolated route pattern (e.g. '/products/[id]') so
312
+ * <Link> can look up the definition from the original `href` prop before
313
+ * segmentParams are interpolated.
314
+ */
315
+ function generateSearchParamsRegistryModule(tree: RouteTree): string {
316
+ const entries: Array<{ urlPath: string; filePath: string }> = [];
317
+
318
+ function walk(node: SegmentNode): void {
319
+ // params.ts is the canonical location for `export const searchParams`;
320
+ // page.tsx is the legacy fallback (see codegen.ts `collectRoutes`).
321
+ if (node.page) {
322
+ if (node.params && fileHasSearchParamsExport(node.params.filePath)) {
323
+ entries.push({ urlPath: node.urlPath, filePath: node.params.filePath });
324
+ } else if (fileHasSearchParamsExport(node.page.filePath)) {
325
+ entries.push({ urlPath: node.urlPath, filePath: node.page.filePath });
326
+ }
327
+ }
328
+ for (const child of node.children) walk(child);
329
+ for (const [, slot] of node.slots) walk(slot);
330
+ }
331
+ walk(tree.root);
332
+
333
+ // Deterministic order for stable output / snapshots
334
+ entries.sort((a, b) => a.urlPath.localeCompare(b.urlPath));
335
+
336
+ const lines: string[] = [];
337
+ lines.push('// Auto-generated search-params registry — do not edit.');
338
+ lines.push('// Generated by timber-routing plugin (TIM-830).');
339
+ lines.push('');
340
+ lines.push("import { registerSearchParams } from '@timber-js/app/search-params';");
341
+ lines.push('');
342
+
343
+ // Static imports — Vite/Rolldown tree-shakes the page component body out
344
+ // of this chunk, leaving only the `searchParams` named export.
345
+ entries.forEach((entry, i) => {
346
+ lines.push(`import { searchParams as r${i} } from ${JSON.stringify(entry.filePath)};`);
347
+ });
348
+ lines.push('');
349
+
350
+ entries.forEach((entry, i) => {
351
+ lines.push(`registerSearchParams(${JSON.stringify(entry.urlPath)}, r${i});`);
352
+ });
353
+ lines.push('');
354
+
355
+ // Exporting an empty object keeps the module a real ESM module even
356
+ // when there are zero entries (no top-level imports in that case).
357
+ lines.push('export {};');
358
+ lines.push('');
359
+
360
+ return lines.join('\n');
361
+ }
362
+
363
+ /**
364
+ * Lightweight check for a `searchParams` named export. Mirrors
365
+ * `fileHasExport('searchParams')` in routing/codegen.ts so we stay
366
+ * in sync with what the type codegen detects.
367
+ */
368
+ function fileHasSearchParamsExport(filePath: string): boolean {
369
+ try {
370
+ if (!existsSync(filePath)) return false;
371
+ const content = readFileSync(filePath, 'utf-8');
372
+ return (
373
+ /export\s+(const|let|var)\s+searchParams\b/.test(content) ||
374
+ /export\s*\{[^}]*\bsearchParams\b[^}]*\}/.test(content)
375
+ );
376
+ } catch {
377
+ return false;
378
+ }
379
+ }
380
+
211
381
  /**
212
382
  * Generate the virtual module source code for the route manifest.
213
383
  *
214
384
  * The output is a default-exported object containing the serialized route tree.
215
385
  * All file references use absolute paths (required for virtual modules).
216
386
  */
217
- function generateManifestModule(tree: RouteTree): string {
387
+ function generateManifestModule(tree: RouteTree, viteRoot: string): string {
218
388
  const imports: string[] = [];
219
389
  let importIndex = 0;
220
390
 
@@ -301,12 +471,15 @@ function generateManifestModule(tree: RouteTree): string {
301
471
  `${nextIndent}denied: { load: ${v}, filePath: ${JSON.stringify(node.denied.filePath)} },`
302
472
  );
303
473
  }
304
- if (node.searchParams) {
305
- const v = addImport(node.searchParams);
474
+ if (node.params) {
475
+ const v = addImport(node.params);
306
476
  parts.push(
307
- `${nextIndent}searchParams: { load: ${v}, filePath: ${JSON.stringify(node.searchParams.filePath)} },`
477
+ `${nextIndent}params: { load: ${v}, filePath: ${JSON.stringify(node.params.filePath)} },`
308
478
  );
309
479
  }
480
+ // searchParams is now a named export from page.tsx, not a separate file.
481
+ // The page module's searchParams export is loaded via the page's lazy import.
482
+ // Runtime registration happens in the route loader using the page module.
310
483
 
311
484
  // Status-code files
312
485
  if (node.statusFiles && node.statusFiles.size > 0) {
@@ -391,6 +564,13 @@ function generateManifestModule(tree: RouteTree): string {
391
564
  proxyLine = ` proxy: { load: ${v}, filePath: ${JSON.stringify(tree.proxy.filePath)} },`;
392
565
  }
393
566
 
567
+ // Global error page (Tier 2)
568
+ let globalErrorLine = '';
569
+ if (tree.globalError) {
570
+ const v = addImport(tree.globalError);
571
+ globalErrorLine = ` globalError: { load: ${v}, filePath: ${JSON.stringify(tree.globalError.filePath)} },`;
572
+ }
573
+
394
574
  // Interception rewrites — computed at build time from the route tree.
395
575
  // Only interceptedPattern and interceptingPrefix are needed at runtime.
396
576
  const rewrites = collectInterceptionRewrites(tree.root);
@@ -406,7 +586,9 @@ function generateManifestModule(tree: RouteTree): string {
406
586
  ...imports,
407
587
  '',
408
588
  'const manifest = {',
589
+ ` viteRoot: ${JSON.stringify(viteRoot)},`,
409
590
  proxyLine,
591
+ globalErrorLine,
410
592
  rewritesLine,
411
593
  ` root: ${rootSerialized},`,
412
594
  '};',
@@ -1,7 +1,7 @@
1
1
  import type { Plugin } from 'vite';
2
2
  import { Parser } from 'acorn';
3
3
  import acornJsx from 'acorn-jsx';
4
- import { detectFileDirective } from '#/utils/directive-parser.js';
4
+ import { detectFileDirective } from '../utils/directive-parser.js';
5
5
 
6
6
  const jsxParser = Parser.extend(acornJsx());
7
7
 
@@ -137,5 +137,36 @@ export function timberServerBundle(): Plugin[] {
137
137
  },
138
138
  };
139
139
 
140
- return [bundlePlugin, esmInitFixPlugin];
140
+ // Fix Rolldown's `createRequire(import.meta.url)` CJS interop shim for
141
+ // Cloudflare Workers. Rolldown emits this for CJS dependencies (e.g.
142
+ // @opentelemetry/context-async-hooks) that use `require()`. On Workers,
143
+ // `import.meta.url` is `undefined` for non-entry modules, causing:
144
+ // TypeError: The argument 'path' must be a file URL object, a file URL
145
+ // string, or an absolute path string. Received 'undefined'
146
+ //
147
+ // The fix: provide a fallback URL when `import.meta.url` is undefined.
148
+ // The actual URL doesn't matter — `createRequire` only needs it for
149
+ // resolving relative paths, but the only `__require()` calls are for
150
+ // Node built-ins (events, async_hooks) which resolve from any base.
151
+ //
152
+ // The top-level `ssr: { target: 'webworker' }` was supposed to prevent
153
+ // this, but it doesn't propagate to custom environments (rsc) in Vite's
154
+ // Environment API. See LOCAL-405.
155
+ const createRequireFixPlugin: Plugin = {
156
+ name: 'timber-create-require-fix',
157
+ applyToEnvironment(environment) {
158
+ return environment.name === 'rsc' || environment.name === 'ssr';
159
+ },
160
+ renderChunk(code) {
161
+ const pattern = 'createRequire(import.meta.url)';
162
+ if (!code.includes(pattern)) return null;
163
+
164
+ return {
165
+ code: code.replace(pattern, 'createRequire(import.meta.url || "file:///app")'),
166
+ map: null,
167
+ };
168
+ },
169
+ };
170
+
171
+ return [bundlePlugin, esmInitFixPlugin, createRequireFixPlugin];
141
172
  }
@@ -5,10 +5,11 @@
5
5
  * shim implementations. This enables Next.js-compatible libraries
6
6
  * (nuqs, next-intl, etc.) to work unmodified.
7
7
  *
8
- * NOTE: This plugin does NOT resolve @timber-js/app/* subpath imports.
9
- * Those are handled by Vite's native package.json `exports` resolution,
10
- * which maps them to dist/ files. This ensures a single module instance
11
- * for shared modules like request-context (ALS singleton).
8
+ * This plugin also remaps ALL @timber-js/app/* subpath imports to src/ in
9
+ * server environments (RSC + SSR). This is required because dist/ chunks
10
+ * are pre-built and miss Vite's RSC transforms (e.g. createContext from
11
+ * 'react' doesn't exist in RSC's React build). It also ensures a single
12
+ * module instance for shared mutable state. See SUBPATH_SRC_MAP and TIM-568.
12
13
  *
13
14
  * Design doc: 18-build-system.md §"Shim Map"
14
15
  */
@@ -16,7 +17,7 @@
16
17
  import type { Plugin } from 'vite';
17
18
  import { resolve, dirname } from 'node:path';
18
19
  import { fileURLToPath } from 'node:url';
19
- import type { PluginContext } from '#/index.js';
20
+ import type { PluginContext } from '../plugin-context.js';
20
21
 
21
22
  const __dirname = dirname(fileURLToPath(import.meta.url));
22
23
  // Detect whether we're running from source (src/plugins/) or dist (dist/).
@@ -38,6 +39,24 @@ const SHIMS_DIR = resolve(PKG_ROOT, 'src', 'shims');
38
39
  const SERVER_ONLY_VIRTUAL = '\0timber:server-only';
39
40
  const CLIENT_ONLY_VIRTUAL = '\0timber:client-only';
40
41
 
42
+ /**
43
+ * Map from @timber-js/app/<subpath> to relative src/ file paths.
44
+ *
45
+ * Used by the catch-all resolveId rule to remap subpath imports to src/
46
+ * in server environments. When adding a new subpath export to package.json,
47
+ * add it here too. See TIM-568.
48
+ */
49
+ const SUBPATH_SRC_MAP: Record<string, string> = {
50
+ 'cache': 'cache/index.ts',
51
+ 'cookies': 'cookies/index.ts',
52
+ 'search-params': 'search-params/index.ts',
53
+ 'segment-params': 'segment-params/index.ts',
54
+
55
+ 'adapters/cloudflare': 'adapters/cloudflare.ts',
56
+ 'adapters/cloudflare/dev': 'adapters/cloudflare-dev.ts',
57
+ 'adapters/nitro': 'adapters/nitro.ts',
58
+ };
59
+
41
60
  /**
42
61
  * Map from next/* import specifiers to shim file paths.
43
62
  *
@@ -49,10 +68,14 @@ const SHIM_MAP: Record<string, string> = {
49
68
  'next/image': resolve(SHIMS_DIR, 'image.ts'),
50
69
  'next/navigation': resolve(SHIMS_DIR, 'navigation.ts'),
51
70
  'next/headers': resolve(SHIMS_DIR, 'headers.ts'),
52
- // next/font/* redirects to the timber-fonts virtual modules.
53
- // The fonts plugin's load hook serves the actual module code.
71
+ // next/font/* and @timber-js/app/fonts/* redirect to the timber-fonts
72
+ // virtual modules. The fonts plugin's load hook serves the actual module
73
+ // code. The package.json exports point to shim stubs for non-Vite contexts
74
+ // (tsc, tests), but in Vite the virtual module takes priority via this map.
54
75
  'next/font/google': '\0@timber/fonts/google',
55
76
  'next/font/local': '\0@timber/fonts/local',
77
+ '@timber-js/app/fonts/google': '\0@timber/fonts/google',
78
+ '@timber-js/app/fonts/local': '\0@timber/fonts/local',
56
79
  };
57
80
 
58
81
  /**
@@ -88,14 +111,14 @@ export function timberShims(_ctx: PluginContext): Plugin {
88
111
  * 3. Check next/* shim map
89
112
  * 4. Return null (pass through) for everything else
90
113
  *
91
- * @timber-js/app/server is resolved to src/ so it shares the same module
92
- * instance as framework internals (which import via #/). This ensures
93
- * a single requestContextAls and _getRscFallback variable.
114
+ * All @timber-js/app/* subpath imports resolve to dist/ via package.json
115
+ * exports in all environments. This ensures a single module instance
116
+ * for each module the dist/ chunks share code via rollup's code
117
+ * splitting. No src/ remapping is needed (see TIM-568).
94
118
  *
95
- * @timber-js/app/client is resolved to src/ in the SSR environment so
96
- * client hooks share the same module instance as ssr-entry.ts internals.
97
- * In RSC it resolves to dist/ (via package.json exports) where 'use client'
98
- * is preserved on the entry for client boundary detection.
119
+ * The only exception is @timber-js/app/server in the client (browser)
120
+ * environment, which returns a virtual stub server code must never
121
+ * be bundled into the browser.
99
122
  */
100
123
  resolveId(id: string) {
101
124
  // Poison pill packages — resolve to virtual modules handled by load()
@@ -117,38 +140,110 @@ export function timberShims(_ctx: PluginContext): Plugin {
117
140
  return SHIM_MAP[cleanId];
118
141
  }
119
142
 
120
- // @timber-js/app/server → src/ in server environments so user code
121
- // shares the same module instance as framework internals (single ALS).
122
- // In the client environment, return a virtual empty module server
123
- // code must never be bundled into the browser.
143
+ // ── @timber-js/app/* → src/ resolution in server environments ──
144
+ //
145
+ // All @timber-js/app/* subpath imports are remapped to src/ in server
146
+ // environments (RSC + SSR). This is required for two reasons:
147
+ //
148
+ // 1. RSC correctness: dist/ chunks eagerly import from 'react' (e.g.
149
+ // createContext in segment-context) which doesn't exist in RSC's
150
+ // React build. Vite's RSC plugin only transforms src/ files —
151
+ // dist/ chunks are pre-built and served as-is.
152
+ //
153
+ // 2. Module singleton correctness: framework internals use relative
154
+ // imports that resolve within src/. If user code resolved to dist/
155
+ // while framework code resolved to src/, mutable module-level state
156
+ // (ALS refs, registered callbacks) would be duplicated. By remapping
157
+ // all @timber-js/app/* to src/, everything shares one module graph.
158
+ //
159
+ // Exception: @timber-js/app/client in RSC resolves to dist/ where
160
+ // 'use client' is preserved for client boundary detection.
161
+ //
162
+ // In the client (browser) environment, all imports resolve to dist/
163
+ // via package.json exports (no remapping needed).
164
+
165
+ // ── #imports resolution for package-internal modules ─────────────
166
+ //
167
+ // #server-internal and #client-internal are Node package imports
168
+ // (package.json "imports" field). They are only resolvable from
169
+ // within this package — external consumers get module-not-found.
170
+ //
171
+ // In Vite, we intercept them here to resolve to src/ for dev/build
172
+ // correctness (same rationale as the @timber-js/app/* remap above).
173
+ if (cleanId === '#server-internal') {
174
+ const envName = (this as unknown as { environment?: { name?: string } }).environment?.name;
175
+ if (envName === 'client') {
176
+ return '\0timber:server-empty';
177
+ }
178
+ return resolve(PKG_ROOT, 'src', 'server', 'internal.ts');
179
+ }
180
+
181
+ if (cleanId === '#client-internal') {
182
+ // Always resolve to src/ — all environments (RSC, SSR, client)
183
+ // use src/ for framework internals. In the client env, this
184
+ // ensures browser-entry and @timber-js/app/client share the
185
+ // same module graph (both resolve to src/).
186
+ return resolve(PKG_ROOT, 'src', 'client', 'internal.ts');
187
+ }
188
+
189
+ if (cleanId === '#routing') {
190
+ return resolve(PKG_ROOT, 'src', 'routing', 'index.ts');
191
+ }
192
+
193
+ // Legacy aliases — vitest and monorepo configs may still reference
194
+ // the old @timber-js/app/server/internal and @timber-js/app/client/internal
195
+ // specifiers via resolve.alias. When those aliases resolve to the
196
+ // absolute src/ path, they bypass this plugin entirely. But if the
197
+ // specifier reaches us unresolved (e.g., in a Vite build without
198
+ // aliases), handle it the same way as the #imports above.
199
+ if (cleanId === '@timber-js/app/server/internal') {
200
+ const envName = (this as unknown as { environment?: { name?: string } }).environment?.name;
201
+ if (envName === 'client') {
202
+ return '\0timber:server-empty';
203
+ }
204
+ return resolve(PKG_ROOT, 'src', 'server', 'internal.ts');
205
+ }
206
+
207
+ if (cleanId === '@timber-js/app/client/internal') {
208
+ // Same as #client-internal above — always resolve to src/.
209
+ return resolve(PKG_ROOT, 'src', 'client', 'internal.ts');
210
+ }
211
+
124
212
  if (cleanId === '@timber-js/app/server') {
125
213
  const envName = (this as unknown as { environment?: { name?: string } }).environment?.name;
126
214
  if (envName === 'client') {
127
215
  return '\0timber:server-empty';
128
216
  }
217
+ // RSC + SSR: remap to src/
129
218
  return resolve(PKG_ROOT, 'src', 'server', 'index.ts');
130
219
  }
131
220
 
132
- // @timber-js/app/client → src/ in the SSR environment so client hooks
133
- // (useParams, usePathname, etc.) share the same module instance as
134
- // ssr-entry.ts's internal imports (via #/client/...).
135
- //
136
- // Without this remap, @timber-js/app/client resolves to dist/ (via
137
- // package.json exports), creating a module instance split: ssr-entry.ts
138
- // registers the ALS-backed SSR data provider on the src/ instance of
139
- // ssr-data.ts, but client component hooks read getSsrData() from the
140
- // dist/ instance — which has no provider. Result: hooks like useParams()
141
- // return empty defaults during SSR.
142
- //
143
- // This remap is SSR-only. The RSC environment still resolves to dist/
144
- // where 'use client' is preserved on the entry (needed for client
145
- // boundary detection). The client (browser) environment uses dist/
146
- // for bundling.
147
221
  if (cleanId === '@timber-js/app/client') {
148
222
  const envName = (this as unknown as { environment?: { name?: string } }).environment?.name;
149
- if (envName === 'ssr') {
223
+ // RSC: return null — needs dist/ for 'use client' boundary detection.
224
+ // SSR + Client: resolve to src/ so that browser-entry (which uses
225
+ // relative imports from src/) and user code (which uses the bare
226
+ // specifier @timber-js/app/client) share the same module instances.
227
+ // Without this, state.ts is loaded twice (src/ and dist/) and
228
+ // setGlobalRouter() writes to one copy while getRouterOrNull()
229
+ // reads from the other (always null).
230
+ if (envName === 'ssr' || envName === 'client') {
150
231
  return resolve(PKG_ROOT, 'src', 'client', 'index.ts');
151
232
  }
233
+ return null;
234
+ }
235
+
236
+ // Catch-all: remap any other @timber-js/app/<subpath> to src/
237
+ // in non-client environments (RSC + SSR).
238
+ if (cleanId.startsWith('@timber-js/app/') && cleanId !== '@timber-js/app/package.json') {
239
+ const envName = (this as unknown as { environment?: { name?: string } }).environment?.name;
240
+ if (envName !== 'client') {
241
+ const subpath = cleanId.slice('@timber-js/app/'.length);
242
+ const srcPath = SUBPATH_SRC_MAP[subpath];
243
+ if (srcPath) {
244
+ return resolve(PKG_ROOT, 'src', srcPath);
245
+ }
246
+ }
152
247
  }
153
248
 
154
249
  return null;
@@ -202,6 +297,12 @@ const msg = "[timber] @timber-js/app/server was imported from client code. " +
202
297
  function stub() { throw new Error(msg); }
203
298
  export const headers = stub;
204
299
  export const cookies = stub;
300
+ export const getHeaders = stub;
301
+ export const getHeader = stub;
302
+ export const getCookies = stub;
303
+ export const getCookie = stub;
304
+ export const getSearchParams = stub;
305
+ export const getSegmentParams = stub;
205
306
  export const searchParams = stub;
206
307
  export const deny = stub;
207
308
  export const notFound = stub;
@@ -209,7 +310,7 @@ export const redirect = stub;
209
310
  export const permanentRedirect = stub;
210
311
  export const redirectExternal = stub;
211
312
  export const waitUntil = stub;
212
- export const RenderError = stub;
313
+ export const DenyOptions = {};
213
314
  export const RedirectType = {};
214
315
  export const DenySignal = stub;
215
316
  export const RedirectSignal = stub;