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

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 (610) 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-DRlhJWbu.js} +219 -97
  19. package/dist/_chunks/interception-DRlhJWbu.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.d.ts +2 -2
  223. package/dist/routing/codegen.d.ts.map +1 -1
  224. package/dist/routing/convention-lint.d.ts +41 -0
  225. package/dist/routing/convention-lint.d.ts.map +1 -0
  226. package/dist/routing/index.d.ts +2 -0
  227. package/dist/routing/index.d.ts.map +1 -1
  228. package/dist/routing/index.js +3 -2
  229. package/dist/routing/scanner.d.ts.map +1 -1
  230. package/dist/routing/segment-classify.d.ts +46 -0
  231. package/dist/routing/segment-classify.d.ts.map +1 -0
  232. package/dist/routing/status-file-lint.d.ts +2 -1
  233. package/dist/routing/status-file-lint.d.ts.map +1 -1
  234. package/dist/routing/types.d.ts +16 -4
  235. package/dist/routing/types.d.ts.map +1 -1
  236. package/dist/rsc-runtime/rsc.d.ts +1 -1
  237. package/dist/rsc-runtime/rsc.d.ts.map +1 -1
  238. package/dist/rsc-runtime/ssr.d.ts +12 -0
  239. package/dist/rsc-runtime/ssr.d.ts.map +1 -1
  240. package/dist/schema-bridge.d.ts +76 -0
  241. package/dist/schema-bridge.d.ts.map +1 -0
  242. package/dist/search-params/define.d.ts +139 -0
  243. package/dist/search-params/define.d.ts.map +1 -0
  244. package/dist/search-params/index.d.ts +4 -7
  245. package/dist/search-params/index.d.ts.map +1 -1
  246. package/dist/search-params/index.js +32 -441
  247. package/dist/search-params/index.js.map +1 -1
  248. package/dist/search-params/registry.d.ts +2 -2
  249. package/dist/search-params/registry.d.ts.map +1 -1
  250. package/dist/search-params/wrappers.d.ts +53 -0
  251. package/dist/search-params/wrappers.d.ts.map +1 -0
  252. package/dist/segment-params/define.d.ts +78 -0
  253. package/dist/segment-params/define.d.ts.map +1 -0
  254. package/dist/segment-params/index.d.ts +3 -0
  255. package/dist/segment-params/index.d.ts.map +1 -0
  256. package/dist/segment-params/index.js +2 -0
  257. package/dist/server/access-gate.d.ts +4 -0
  258. package/dist/server/access-gate.d.ts.map +1 -1
  259. package/dist/server/action-client.d.ts +41 -6
  260. package/dist/server/action-client.d.ts.map +1 -1
  261. package/dist/server/action-encryption.d.ts +76 -0
  262. package/dist/server/action-encryption.d.ts.map +1 -0
  263. package/dist/server/action-handler.d.ts +7 -0
  264. package/dist/server/action-handler.d.ts.map +1 -1
  265. package/dist/server/actions.d.ts +3 -6
  266. package/dist/server/actions.d.ts.map +1 -1
  267. package/dist/server/als-registry.d.ts +32 -4
  268. package/dist/server/als-registry.d.ts.map +1 -1
  269. package/dist/server/build-manifest.d.ts +2 -2
  270. package/dist/server/build-manifest.d.ts.map +1 -1
  271. package/dist/server/debug.d.ts +1 -1
  272. package/dist/server/default-logger.d.ts +22 -0
  273. package/dist/server/default-logger.d.ts.map +1 -0
  274. package/dist/server/deny-page-resolver.d.ts +52 -0
  275. package/dist/server/deny-page-resolver.d.ts.map +1 -0
  276. package/dist/server/deny-renderer.d.ts.map +1 -1
  277. package/dist/server/dev-holding-server.d.ts +52 -0
  278. package/dist/server/dev-holding-server.d.ts.map +1 -0
  279. package/dist/server/dev-source-map.d.ts +22 -0
  280. package/dist/server/dev-source-map.d.ts.map +1 -0
  281. package/dist/server/dev-warnings.d.ts +1 -21
  282. package/dist/server/dev-warnings.d.ts.map +1 -1
  283. package/dist/server/early-hints.d.ts +13 -5
  284. package/dist/server/early-hints.d.ts.map +1 -1
  285. package/dist/server/error-boundary-wrapper.d.ts +7 -1
  286. package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
  287. package/dist/server/fallback-error.d.ts +12 -7
  288. package/dist/server/fallback-error.d.ts.map +1 -1
  289. package/dist/server/flight-injection-state.d.ts +66 -0
  290. package/dist/server/flight-injection-state.d.ts.map +1 -0
  291. package/dist/server/flight-scripts.d.ts +42 -0
  292. package/dist/server/flight-scripts.d.ts.map +1 -0
  293. package/dist/server/flush.d.ts.map +1 -1
  294. package/dist/server/form-data.d.ts +29 -0
  295. package/dist/server/form-data.d.ts.map +1 -1
  296. package/dist/server/html-injectors.d.ts +51 -11
  297. package/dist/server/html-injectors.d.ts.map +1 -1
  298. package/dist/server/index.d.ts +5 -43
  299. package/dist/server/index.d.ts.map +1 -1
  300. package/dist/server/index.js +195 -2800
  301. package/dist/server/index.js.map +1 -1
  302. package/dist/server/internal.d.ts +46 -0
  303. package/dist/server/internal.d.ts.map +1 -0
  304. package/dist/server/internal.js +2900 -0
  305. package/dist/server/internal.js.map +1 -0
  306. package/dist/server/logger.d.ts +25 -7
  307. package/dist/server/logger.d.ts.map +1 -1
  308. package/dist/server/middleware-runner.d.ts +19 -4
  309. package/dist/server/middleware-runner.d.ts.map +1 -1
  310. package/dist/server/node-stream-transforms.d.ts +113 -0
  311. package/dist/server/node-stream-transforms.d.ts.map +1 -0
  312. package/dist/server/page-deny-boundary.d.ts +31 -0
  313. package/dist/server/page-deny-boundary.d.ts.map +1 -0
  314. package/dist/server/pipeline-interception.d.ts +1 -1
  315. package/dist/server/pipeline-interception.d.ts.map +1 -1
  316. package/dist/server/pipeline-metadata.d.ts +6 -0
  317. package/dist/server/pipeline-metadata.d.ts.map +1 -1
  318. package/dist/server/pipeline.d.ts +52 -10
  319. package/dist/server/pipeline.d.ts.map +1 -1
  320. package/dist/server/primitives.d.ts +69 -18
  321. package/dist/server/primitives.d.ts.map +1 -1
  322. package/dist/server/render-timeout.d.ts +51 -0
  323. package/dist/server/render-timeout.d.ts.map +1 -0
  324. package/dist/server/request-context.d.ts +112 -43
  325. package/dist/server/request-context.d.ts.map +1 -1
  326. package/dist/server/route-element-builder.d.ts +27 -1
  327. package/dist/server/route-element-builder.d.ts.map +1 -1
  328. package/dist/server/route-handler.d.ts.map +1 -1
  329. package/dist/server/route-matcher.d.ts +16 -2
  330. package/dist/server/route-matcher.d.ts.map +1 -1
  331. package/dist/server/rsc-entry/api-handler.d.ts +2 -2
  332. package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
  333. package/dist/server/rsc-entry/error-renderer.d.ts +26 -13
  334. package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
  335. package/dist/server/rsc-entry/helpers.d.ts +48 -5
  336. package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
  337. package/dist/server/rsc-entry/index.d.ts +20 -3
  338. package/dist/server/rsc-entry/index.d.ts.map +1 -1
  339. package/dist/server/rsc-entry/rsc-payload.d.ts +3 -3
  340. package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
  341. package/dist/server/rsc-entry/rsc-stream.d.ts +14 -1
  342. package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
  343. package/dist/server/rsc-entry/ssr-bridge.d.ts +1 -1
  344. package/dist/server/rsc-entry/ssr-bridge.d.ts.map +1 -1
  345. package/dist/server/rsc-entry/ssr-renderer.d.ts +19 -4
  346. package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
  347. package/dist/server/safe-load.d.ts +46 -0
  348. package/dist/server/safe-load.d.ts.map +1 -0
  349. package/dist/server/sensitive-fields.d.ts +74 -0
  350. package/dist/server/sensitive-fields.d.ts.map +1 -0
  351. package/dist/server/sitemap-generator.d.ts +129 -0
  352. package/dist/server/sitemap-generator.d.ts.map +1 -0
  353. package/dist/server/sitemap-handler.d.ts +22 -0
  354. package/dist/server/sitemap-handler.d.ts.map +1 -0
  355. package/dist/server/slot-resolver.d.ts +1 -1
  356. package/dist/server/slot-resolver.d.ts.map +1 -1
  357. package/dist/server/ssr-entry.d.ts +23 -0
  358. package/dist/server/ssr-entry.d.ts.map +1 -1
  359. package/dist/server/ssr-render.d.ts +39 -21
  360. package/dist/server/ssr-render.d.ts.map +1 -1
  361. package/dist/server/ssr-wrappers.d.ts +50 -0
  362. package/dist/server/ssr-wrappers.d.ts.map +1 -0
  363. package/dist/server/status-code-resolver.d.ts +1 -1
  364. package/dist/server/status-code-resolver.d.ts.map +1 -1
  365. package/dist/server/stream-utils.d.ts +36 -0
  366. package/dist/server/stream-utils.d.ts.map +1 -0
  367. package/dist/server/tracing.d.ts +4 -4
  368. package/dist/server/tracing.d.ts.map +1 -1
  369. package/dist/server/tree-builder.d.ts +22 -19
  370. package/dist/server/tree-builder.d.ts.map +1 -1
  371. package/dist/server/types.d.ts +1 -4
  372. package/dist/server/types.d.ts.map +1 -1
  373. package/dist/server/version-skew.d.ts +61 -0
  374. package/dist/server/version-skew.d.ts.map +1 -0
  375. package/dist/shared/merge-search-params.d.ts +22 -0
  376. package/dist/shared/merge-search-params.d.ts.map +1 -0
  377. package/dist/shims/font-google.d.ts +1 -1
  378. package/dist/shims/font-google.d.ts.map +1 -1
  379. package/dist/shims/font-google.js +42 -0
  380. package/dist/shims/font-google.js.map +1 -0
  381. package/dist/shims/font-local.d.ts +26 -0
  382. package/dist/shims/font-local.d.ts.map +1 -0
  383. package/dist/shims/font-local.js +20 -0
  384. package/dist/shims/font-local.js.map +1 -0
  385. package/dist/shims/headers.d.ts +2 -1
  386. package/dist/shims/headers.d.ts.map +1 -1
  387. package/dist/shims/navigation-client.d.ts +1 -1
  388. package/dist/shims/navigation-client.d.ts.map +1 -1
  389. package/dist/shims/navigation.d.ts +3 -2
  390. package/dist/shims/navigation.d.ts.map +1 -1
  391. package/dist/utils/directive-parser.d.ts +5 -2
  392. package/dist/utils/directive-parser.d.ts.map +1 -1
  393. package/dist/utils/state-machine.d.ts +80 -0
  394. package/dist/utils/state-machine.d.ts.map +1 -0
  395. package/package.json +51 -16
  396. package/src/adapters/cloudflare-dev.ts +177 -0
  397. package/src/adapters/cloudflare-kv-cache.ts +142 -0
  398. package/src/adapters/cloudflare.ts +342 -28
  399. package/src/adapters/compress-module.ts +24 -4
  400. package/src/adapters/nitro.ts +52 -8
  401. package/src/adapters/wrangler.d.ts +7 -0
  402. package/src/cache/cache-api.ts +38 -0
  403. package/src/cache/handler-store.ts +68 -0
  404. package/src/cache/index.ts +81 -18
  405. package/src/cache/singleflight.ts +62 -4
  406. package/src/cache/sizeof.ts +31 -0
  407. package/src/cache/timber-cache.ts +24 -20
  408. package/src/cli.ts +16 -6
  409. package/src/client/browser-dev.ts +128 -1
  410. package/src/client/browser-entry/action-dispatch.ts +116 -0
  411. package/src/client/browser-entry/hmr.ts +81 -0
  412. package/src/client/browser-entry/hydrate.ts +145 -0
  413. package/src/client/browser-entry/index.ts +143 -0
  414. package/src/client/browser-entry/post-hydration.ts +119 -0
  415. package/src/client/browser-entry/router-init.ts +193 -0
  416. package/src/client/browser-entry/rsc-stream.ts +157 -0
  417. package/src/client/browser-entry/scroll.ts +27 -0
  418. package/src/client/error-boundary.tsx +48 -16
  419. package/src/client/error-reconstituter.tsx +65 -0
  420. package/src/client/form.tsx +14 -7
  421. package/src/client/history.ts +26 -4
  422. package/src/client/index.ts +65 -38
  423. package/src/client/internal.ts +57 -0
  424. package/src/client/link-pending-store.ts +111 -0
  425. package/src/client/link.tsx +342 -113
  426. package/src/client/nav-link-store.ts +47 -0
  427. package/src/client/navigation-api-types.ts +112 -0
  428. package/src/client/navigation-api.ts +332 -0
  429. package/src/client/navigation-context.ts +31 -6
  430. package/src/client/navigation-root.tsx +342 -0
  431. package/src/client/nuqs-adapter.tsx +16 -3
  432. package/src/client/router-ref.ts +1 -1
  433. package/src/client/router.ts +299 -72
  434. package/src/client/rsc-fetch.ts +97 -8
  435. package/src/client/segment-cache.ts +1 -1
  436. package/src/client/segment-outlet.tsx +86 -0
  437. package/src/client/ssr-data.ts +13 -5
  438. package/src/client/stale-reload.ts +72 -3
  439. package/src/client/top-loader.tsx +18 -6
  440. package/src/client/use-link-status.ts +7 -7
  441. package/src/client/use-params.ts +7 -5
  442. package/src/client/{use-navigation-pending.ts → use-pending-navigation.ts} +6 -6
  443. package/src/client/use-query-states.ts +9 -3
  444. package/src/client/use-router.ts +1 -1
  445. package/src/codec.ts +49 -0
  446. package/src/config-types.ts +264 -0
  447. package/src/config-validation.ts +303 -0
  448. package/src/content/index.ts +5 -13
  449. package/src/cookies/define-cookie.ts +78 -25
  450. package/src/cookies/index.ts +8 -0
  451. package/src/fonts/bundle.ts +142 -0
  452. package/src/fonts/css.ts +2 -1
  453. package/src/fonts/dev-middleware.ts +74 -0
  454. package/src/fonts/pipeline.ts +275 -0
  455. package/src/fonts/transform.ts +353 -0
  456. package/src/fonts/types.ts +50 -1
  457. package/src/fonts/virtual-modules.ts +159 -0
  458. package/src/index.ts +314 -355
  459. package/src/plugin-context.ts +240 -0
  460. package/src/plugins/adapter-build.ts +9 -3
  461. package/src/plugins/build-manifest.ts +13 -2
  462. package/src/plugins/build-report.ts +3 -3
  463. package/src/plugins/client-chunks.ts +65 -0
  464. package/src/plugins/content.ts +1 -1
  465. package/src/plugins/dev-404-page.ts +418 -0
  466. package/src/plugins/dev-browser-logs.ts +288 -0
  467. package/src/plugins/dev-error-overlay.ts +286 -42
  468. package/src/plugins/dev-error-page.ts +536 -0
  469. package/src/plugins/dev-logs.ts +1 -1
  470. package/src/plugins/dev-server.ts +146 -19
  471. package/src/plugins/dev-terminal-error.ts +217 -0
  472. package/src/plugins/entries.ts +111 -10
  473. package/src/plugins/fonts.ts +133 -638
  474. package/src/plugins/mdx.ts +1 -1
  475. package/src/plugins/routing.ts +213 -31
  476. package/src/plugins/server-action-exports.ts +1 -1
  477. package/src/plugins/server-bundle.ts +32 -1
  478. package/src/plugins/shims.ts +136 -35
  479. package/src/plugins/static-build.ts +17 -11
  480. package/src/routing/codegen.ts +273 -105
  481. package/src/routing/convention-lint.ts +356 -0
  482. package/src/routing/index.ts +2 -0
  483. package/src/routing/scanner.ts +93 -23
  484. package/src/routing/segment-classify.ts +89 -0
  485. package/src/routing/status-file-lint.ts +3 -2
  486. package/src/routing/types.ts +17 -4
  487. package/src/rsc-runtime/rsc.ts +2 -0
  488. package/src/rsc-runtime/ssr.ts +50 -0
  489. package/src/rsc-runtime/vendor-types.d.ts +7 -0
  490. package/src/{search-params/codecs.ts → schema-bridge.ts} +57 -20
  491. package/src/search-params/define.ts +482 -0
  492. package/src/search-params/index.ts +14 -20
  493. package/src/search-params/registry.ts +2 -2
  494. package/src/search-params/wrappers.ts +85 -0
  495. package/src/segment-params/define.ts +279 -0
  496. package/src/segment-params/index.ts +9 -0
  497. package/src/server/access-gate.tsx +70 -29
  498. package/src/server/action-client.ts +88 -15
  499. package/src/server/action-encryption.ts +144 -0
  500. package/src/server/action-handler.ts +53 -6
  501. package/src/server/actions.ts +10 -9
  502. package/src/server/als-registry.ts +34 -6
  503. package/src/server/build-manifest.ts +10 -4
  504. package/src/server/compress.ts +25 -7
  505. package/src/server/debug.ts +1 -1
  506. package/src/server/default-logger.ts +99 -0
  507. package/src/server/deny-page-resolver.ts +154 -0
  508. package/src/server/deny-renderer.ts +24 -38
  509. package/src/server/dev-holding-server.ts +185 -0
  510. package/src/server/dev-source-map.ts +31 -0
  511. package/src/server/dev-warnings.ts +4 -49
  512. package/src/server/early-hints.ts +36 -15
  513. package/src/server/error-boundary-wrapper.ts +74 -22
  514. package/src/server/fallback-error.ts +74 -102
  515. package/src/server/flight-injection-state.ts +113 -0
  516. package/src/server/flight-scripts.ts +62 -0
  517. package/src/server/flush.ts +2 -1
  518. package/src/server/form-data.ts +76 -0
  519. package/src/server/html-injectors.ts +280 -120
  520. package/src/server/index.ts +25 -177
  521. package/src/server/internal.ts +169 -0
  522. package/src/server/logger.ts +44 -36
  523. package/src/server/middleware-runner.ts +31 -4
  524. package/src/server/node-stream-transforms.ts +509 -0
  525. package/src/server/page-deny-boundary.tsx +56 -0
  526. package/src/server/pipeline-interception.ts +17 -16
  527. package/src/server/pipeline-metadata.ts +13 -0
  528. package/src/server/pipeline.ts +261 -66
  529. package/src/server/primitives.ts +111 -28
  530. package/src/server/render-timeout.ts +108 -0
  531. package/src/server/request-context.ts +293 -132
  532. package/src/server/route-element-builder.ts +283 -191
  533. package/src/server/route-handler.ts +24 -4
  534. package/src/server/route-matcher.ts +31 -20
  535. package/src/server/rsc-entry/api-handler.ts +15 -16
  536. package/src/server/rsc-entry/error-renderer.ts +305 -89
  537. package/src/server/rsc-entry/helpers.ts +134 -5
  538. package/src/server/rsc-entry/index.ts +304 -111
  539. package/src/server/rsc-entry/rsc-payload.ts +65 -18
  540. package/src/server/rsc-entry/rsc-stream.ts +81 -13
  541. package/src/server/rsc-entry/ssr-bridge.ts +14 -5
  542. package/src/server/rsc-entry/ssr-renderer.ts +171 -38
  543. package/src/server/safe-load.ts +60 -0
  544. package/src/server/sensitive-fields.ts +230 -0
  545. package/src/server/sitemap-generator.ts +338 -0
  546. package/src/server/sitemap-handler.ts +126 -0
  547. package/src/server/slot-resolver.ts +244 -229
  548. package/src/server/ssr-entry.ts +215 -32
  549. package/src/server/ssr-render.ts +289 -67
  550. package/src/server/ssr-wrappers.tsx +139 -0
  551. package/src/server/status-code-resolver.ts +1 -1
  552. package/src/server/stream-utils.ts +213 -0
  553. package/src/server/tracing.ts +20 -9
  554. package/src/server/tree-builder.ts +92 -58
  555. package/src/server/types.ts +3 -6
  556. package/src/server/version-skew.ts +104 -0
  557. package/src/shared/merge-search-params.ts +55 -0
  558. package/src/shims/font-google.ts +1 -1
  559. package/src/shims/font-local.ts +34 -0
  560. package/src/shims/headers.ts +5 -1
  561. package/src/shims/navigation-client.ts +1 -1
  562. package/src/shims/navigation.ts +7 -2
  563. package/src/utils/directive-parser.ts +5 -2
  564. package/src/utils/state-machine.ts +111 -0
  565. package/dist/_chunks/als-registry-B7DbZ2hS.js.map +0 -1
  566. package/dist/_chunks/debug-gwlJkDuf.js.map +0 -1
  567. package/dist/_chunks/format-DviM89f0.js.map +0 -1
  568. package/dist/_chunks/interception-BOoWmLUA.js.map +0 -1
  569. package/dist/_chunks/request-context-DIkVh_jG.js +0 -330
  570. package/dist/_chunks/request-context-DIkVh_jG.js.map +0 -1
  571. package/dist/_chunks/tracing-CemImE6h.js.map +0 -1
  572. package/dist/_chunks/use-cookie-DX-l1_5E.js +0 -91
  573. package/dist/_chunks/use-cookie-DX-l1_5E.js.map +0 -1
  574. package/dist/_chunks/use-query-states-D5KaffOK.js.map +0 -1
  575. package/dist/cache/register-cached-function.d.ts +0 -17
  576. package/dist/cache/register-cached-function.d.ts.map +0 -1
  577. package/dist/client/browser-entry.d.ts +0 -21
  578. package/dist/client/browser-entry.d.ts.map +0 -1
  579. package/dist/client/link-status-provider.d.ts +0 -11
  580. package/dist/client/link-status-provider.d.ts.map +0 -1
  581. package/dist/client/transition-root.d.ts.map +0 -1
  582. package/dist/client/use-navigation-pending.d.ts.map +0 -1
  583. package/dist/cookies/index.js.map +0 -1
  584. package/dist/plugins/cache-transform.d.ts +0 -36
  585. package/dist/plugins/cache-transform.d.ts.map +0 -1
  586. package/dist/plugins/dynamic-transform.d.ts +0 -72
  587. package/dist/plugins/dynamic-transform.d.ts.map +0 -1
  588. package/dist/search-params/analyze.d.ts +0 -54
  589. package/dist/search-params/analyze.d.ts.map +0 -1
  590. package/dist/search-params/builtin-codecs.d.ts +0 -105
  591. package/dist/search-params/builtin-codecs.d.ts.map +0 -1
  592. package/dist/search-params/codecs.d.ts +0 -53
  593. package/dist/search-params/codecs.d.ts.map +0 -1
  594. package/dist/search-params/create.d.ts +0 -106
  595. package/dist/search-params/create.d.ts.map +0 -1
  596. package/dist/server/prerender.d.ts +0 -77
  597. package/dist/server/prerender.d.ts.map +0 -1
  598. package/dist/server/response-cache.d.ts +0 -54
  599. package/dist/server/response-cache.d.ts.map +0 -1
  600. package/src/cache/register-cached-function.ts +0 -103
  601. package/src/client/browser-entry.ts +0 -678
  602. package/src/client/link-status-provider.tsx +0 -30
  603. package/src/client/transition-root.tsx +0 -166
  604. package/src/plugins/cache-transform.ts +0 -199
  605. package/src/plugins/dynamic-transform.ts +0 -161
  606. package/src/search-params/analyze.ts +0 -192
  607. package/src/search-params/builtin-codecs.ts +0 -228
  608. package/src/search-params/create.ts +0 -321
  609. package/src/server/prerender.ts +0 -139
  610. package/src/server/response-cache.ts +0 -410
@@ -2,7 +2,7 @@
2
2
  * timber-static-build — Vite sub-plugin for static output mode.
3
3
  *
4
4
  * When `output: 'static'` is set in timber.config.ts, this plugin:
5
- * 1. Validates that no dynamic APIs (cookies(), headers()) are used
5
+ * 1. Validates that no dynamic APIs (getCookies(), getHeaders()) are used
6
6
  * 2. When client JavaScript is disabled, rejects 'use client' and 'use server' directives
7
7
  * 3. Coordinates build-time rendering of all pages
8
8
  *
@@ -10,8 +10,8 @@
10
10
  */
11
11
 
12
12
  import type { Plugin } from 'vite';
13
- import type { PluginContext } from '#/index.js';
14
- import { detectFileDirective } from '#/utils/directive-parser.js';
13
+ import type { PluginContext } from '../plugin-context.js';
14
+ import { detectFileDirective } from '../utils/directive-parser.js';
15
15
 
16
16
  // ---------------------------------------------------------------------------
17
17
  // Types
@@ -29,7 +29,7 @@ export interface StaticOptions {
29
29
  }
30
30
 
31
31
  // ---------------------------------------------------------------------------
32
- // Detection: dynamic APIs (cookies, headers)
32
+ // Detection: dynamic APIs (getCookies, getHeaders, and legacy cookies/headers)
33
33
  // ---------------------------------------------------------------------------
34
34
 
35
35
  /**
@@ -39,12 +39,14 @@ export interface StaticOptions {
39
39
  * We detect both import-level and call-level usage.
40
40
  */
41
41
  const DYNAMIC_API_PATTERNS: Array<{ pattern: RegExp; name: string }> = [
42
+ { pattern: /\bgetCookies\s*\(/, name: 'getCookies()' },
43
+ { pattern: /\bgetHeaders\s*\(/, name: 'getHeaders()' },
42
44
  { pattern: /\bcookies\s*\(/, name: 'cookies()' },
43
45
  { pattern: /\bheaders\s*\(/, name: 'headers()' },
44
46
  ];
45
47
 
46
48
  /**
47
- * Detect usage of dynamic per-request APIs (cookies(), headers())
49
+ * Detect usage of dynamic per-request APIs (getCookies(), getHeaders())
48
50
  * that cannot work at build time in static mode.
49
51
  *
50
52
  * Returns an array of validation errors.
@@ -134,7 +136,7 @@ export function detectDirectives(
134
136
  * Run all static mode validations on a source file.
135
137
  *
136
138
  * Combines:
137
- * - Dynamic API detection (cookies, headers) — always in static mode
139
+ * - Dynamic API detection (getCookies, getHeaders) — always in static mode
138
140
  * - Directive detection ('use client', 'use server') — only when client JS is disabled
139
141
  */
140
142
  export function validateStaticMode(
@@ -163,9 +165,6 @@ export function validateStaticMode(
163
165
  * - transform: Validates source files for static mode violations
164
166
  */
165
167
  export function timberStaticBuild(ctx: PluginContext): Plugin {
166
- const isStatic = ctx.config.output === 'static';
167
- const clientJavascriptDisabled = ctx.clientJavascript.disabled;
168
-
169
168
  return {
170
169
  name: 'timber-static-build',
171
170
 
@@ -173,10 +172,15 @@ export function timberStaticBuild(ctx: PluginContext): Plugin {
173
172
  * Validate source files during transform.
174
173
  *
175
174
  * In static mode, we check every app/ file for:
176
- * - Dynamic API usage (cookies(), headers()) → build error
175
+ * - Dynamic API usage (getCookies(), getHeaders()) → build error
177
176
  * - When client JS disabled: 'use client' / 'use server' directives → build error
178
177
  */
179
178
  transform(code: string, id: string) {
179
+ // Read ctx.config lazily inside the hook — not at plugin construction
180
+ // time — so file-based config from timber.config.ts is respected.
181
+ // See TIM-451.
182
+ const isStatic = ctx.config.output === 'static';
183
+
180
184
  // Only active in static mode
181
185
  if (!isStatic) return null;
182
186
 
@@ -189,7 +193,9 @@ export function timberStaticBuild(ctx: PluginContext): Plugin {
189
193
  // Only check JS/TS files
190
194
  if (!/\.[jt]sx?$/.test(id)) return null;
191
195
 
192
- const errors = validateStaticMode(code, id, { clientJavascriptDisabled });
196
+ const errors = validateStaticMode(code, id, {
197
+ clientJavascriptDisabled: ctx.clientJavascript.disabled,
198
+ });
193
199
 
194
200
  if (errors.length > 0) {
195
201
  // Format all errors into a single build error message
@@ -8,8 +8,8 @@
8
8
  * No runtime overhead — purely static type generation.
9
9
  */
10
10
 
11
- import { existsSync } from 'node:fs';
12
- import { join, relative, posix } from 'node:path';
11
+ import { existsSync, readFileSync } from 'node:fs';
12
+ import { relative, posix } from 'node:path';
13
13
  import type { RouteTree, SegmentNode } from './types.js';
14
14
 
15
15
  /** A single route entry extracted from the segment tree. */
@@ -18,10 +18,10 @@ interface RouteEntry {
18
18
  urlPath: string;
19
19
  /** Accumulated params from all ancestor dynamic segments */
20
20
  params: ParamEntry[];
21
- /** Whether this route has a co-located search-params.ts */
21
+ /** Whether the page.tsx exports searchParams */
22
22
  hasSearchParams: boolean;
23
- /** Absolute path to search-params.ts (for computing relative import paths) */
24
- searchParamsAbsPath?: string;
23
+ /** Absolute path to the page file that exports searchParams (for import paths) */
24
+ searchParamsPagePath?: string;
25
25
  /** Whether this is an API route (route.ts) vs page route */
26
26
  isApiRoute: boolean;
27
27
  }
@@ -29,15 +29,17 @@ interface RouteEntry {
29
29
  interface ParamEntry {
30
30
  name: string;
31
31
  type: 'string' | 'string[]' | 'string[] | undefined';
32
+ /** When a layout/page exports defineParams, the absolute path to that file. */
33
+ codecFilePath?: string;
32
34
  }
33
35
 
34
36
  /** Options for route map generation. */
35
37
  export interface CodegenOptions {
36
- /** Absolute path to the app/ directory. Required for search-params.ts detection. */
38
+ /** Absolute path to the app/ directory. Required for page searchParams detection. */
37
39
  appDir?: string;
38
40
  /**
39
41
  * Absolute path to the directory where the .d.ts file will be written.
40
- * Used to compute correct relative import paths for search-params.ts files.
42
+ * Used to compute correct relative import paths for page files.
41
43
  * Defaults to appDir when not provided (preserves backward compat for tests).
42
44
  */
43
45
  outputDir?: string;
@@ -51,7 +53,7 @@ export interface CodegenOptions {
51
53
  */
52
54
  export function generateRouteMap(tree: RouteTree, options: CodegenOptions = {}): string {
53
55
  const routes: RouteEntry[] = [];
54
- collectRoutes(tree.root, [], options.appDir, routes);
56
+ collectRoutes(tree.root, [], routes);
55
57
 
56
58
  // Sort routes alphabetically for deterministic output
57
59
  routes.sort((a, b) => a.urlPath.localeCompare(b.urlPath));
@@ -71,15 +73,17 @@ export function generateRouteMap(tree: RouteTree, options: CodegenOptions = {}):
71
73
  function collectRoutes(
72
74
  node: SegmentNode,
73
75
  ancestorParams: ParamEntry[],
74
- appDir: string | undefined,
75
76
  routes: RouteEntry[]
76
77
  ): void {
77
78
  // Accumulate params from this segment
78
79
  const params = [...ancestorParams];
79
80
  if (node.paramName) {
81
+ // Check if layout or page exports a params codec for this segment
82
+ const codecFile = findParamsExport(node);
80
83
  params.push({
81
84
  name: node.paramName,
82
85
  type: paramTypeForSegment(node.segmentType),
86
+ codecFilePath: codecFile,
83
87
  });
84
88
  }
85
89
 
@@ -95,13 +99,14 @@ function collectRoutes(
95
99
  isApiRoute,
96
100
  };
97
101
 
98
- // Detect co-located search-params.ts
99
- if (appDir && isPage) {
100
- const segmentDir = resolveSegmentDir(appDir, node);
101
- const searchParamsFile = findSearchParamsFile(segmentDir);
102
- if (searchParamsFile) {
102
+ // Detect searchParams export from params.ts (primary) or page.tsx (fallback)
103
+ if (isPage) {
104
+ if (node.params && fileHasExport(node.params.filePath, 'searchParams')) {
103
105
  entry.hasSearchParams = true;
104
- entry.searchParamsAbsPath = searchParamsFile;
106
+ entry.searchParamsPagePath = node.params.filePath;
107
+ } else if (node.page && fileHasExport(node.page.filePath, 'searchParams')) {
108
+ entry.hasSearchParams = true;
109
+ entry.searchParamsPagePath = node.page.filePath;
105
110
  }
106
111
  }
107
112
 
@@ -110,12 +115,12 @@ function collectRoutes(
110
115
 
111
116
  // Recurse into children
112
117
  for (const child of node.children) {
113
- collectRoutes(child, params, appDir, routes);
118
+ collectRoutes(child, params, routes);
114
119
  }
115
120
 
116
121
  // Recurse into slots (they share the parent's URL path, but may have their own pages)
117
122
  for (const [, slot] of node.slots) {
118
- collectRoutes(slot, params, appDir, routes);
123
+ collectRoutes(slot, params, routes);
119
124
  }
120
125
  }
121
126
 
@@ -134,33 +139,43 @@ function paramTypeForSegment(segmentType: string): ParamEntry['type'] {
134
139
  }
135
140
 
136
141
  /**
137
- * Resolve the absolute directory path for a segment node.
142
+ * Check if a file exports a specific named export.
138
143
  *
139
- * Reconstructs the filesystem path by walking from appDir through
140
- * the segment names encoded in the urlPath, accounting for groups and slots.
144
+ * Uses a lightweight regex check not full AST parsing. The actual type
145
+ * extraction happens via the TypeScript compiler in the generated .d.ts.
141
146
  */
142
- function resolveSegmentDir(appDir: string, node: SegmentNode): string {
143
- // The node's page/route file path gives us the actual directory
144
- const file = node.page ?? node.route;
145
- if (file) {
146
- // The file is in the segment directory — go up one level
147
- const parts = file.filePath.split('/');
148
- parts.pop(); // remove filename
149
- return parts.join('/');
147
+ function fileHasExport(filePath: string, exportName: string): boolean {
148
+ if (!existsSync(filePath)) return false;
149
+ try {
150
+ const content = readFileSync(filePath, 'utf-8');
151
+ const e = exportName.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
152
+ return (
153
+ new RegExp(`export\\s+(const|let|var)\\s+${e}\\b`).test(content) ||
154
+ new RegExp(`export\\s*\\{[^}]*\\b${e}\\b[^}]*\\}`).test(content)
155
+ );
156
+ } catch {
157
+ return false;
150
158
  }
151
- // Fallback: construct from urlPath (imprecise for groups, but acceptable)
152
- return appDir;
153
159
  }
154
160
 
155
161
  /**
156
- * Find a search-params.ts file in a directory.
162
+ * Find which file exports `segmentParams` for a dynamic segment.
163
+ *
164
+ * Priority: params.ts (convention file) > layout > page.
165
+ * params.ts is the canonical location (TIM-508). Layout/page fallback
166
+ * exists for backward compat during migration.
157
167
  */
158
- function findSearchParamsFile(dirPath: string): string | undefined {
159
- for (const ext of ['ts', 'tsx']) {
160
- const candidate = join(dirPath, `search-params.${ext}`);
161
- if (existsSync(candidate)) {
162
- return candidate;
163
- }
168
+ function findParamsExport(node: SegmentNode): string | undefined {
169
+ // params.ts convention file primary location
170
+ if (node.params && fileHasExport(node.params.filePath, 'segmentParams')) {
171
+ return node.params.filePath;
172
+ }
173
+ // Fallback: layout or page export (legacy, will be removed)
174
+ if (node.layout && fileHasExport(node.layout.filePath, 'segmentParams')) {
175
+ return node.layout.filePath;
176
+ }
177
+ if (node.page && fileHasExport(node.page.filePath, 'segmentParams')) {
178
+ return node.page.filePath;
164
179
  }
165
180
  return undefined;
166
181
  }
@@ -184,11 +199,11 @@ function formatDeclarationFile(routes: RouteEntry[], importBase?: string): strin
184
199
  lines.push(' interface Routes {');
185
200
 
186
201
  for (const route of routes) {
187
- const paramsType = formatParamsType(route.params);
202
+ const paramsType = formatParamsType(route.params, importBase);
188
203
  const searchParamsType = formatSearchParamsType(route, importBase);
189
204
 
190
205
  lines.push(` '${route.urlPath}': {`);
191
- lines.push(` params: ${paramsType}`);
206
+ lines.push(` segmentParams: ${paramsType}`);
192
207
  lines.push(` searchParams: ${searchParamsType}`);
193
208
  lines.push(` }`);
194
209
  }
@@ -200,15 +215,9 @@ function formatDeclarationFile(routes: RouteEntry[], importBase?: string): strin
200
215
  // Generate @timber-js/app/server augmentation — typed searchParams() generic
201
216
  const pageRoutes = routes.filter((r) => !r.isApiRoute);
202
217
 
203
- if (pageRoutes.length > 0) {
204
- lines.push("declare module '@timber-js/app/server' {");
205
- lines.push(" import type { Routes } from '@timber-js/app'");
206
- lines.push(
207
- " export function searchParams<R extends keyof Routes>(): Promise<Routes[R]['searchParams']>"
208
- );
209
- lines.push('}');
210
- lines.push('');
211
- }
218
+ // Note: searchParams() always returns Promise<URLSearchParams>.
219
+ // Typed parsing is done via definition.parse(searchParams()).
220
+ // No module augmentation needed for @timber-js/app/server.
212
221
 
213
222
  // Generate overloads for @timber-js/app/client
214
223
  const dynamicRoutes = routes.filter((r) => r.params.length > 0);
@@ -223,10 +232,10 @@ function formatDeclarationFile(routes: RouteEntry[], importBase?: string): strin
223
232
  // useParams overloads
224
233
  if (dynamicRoutes.length > 0) {
225
234
  for (const route of dynamicRoutes) {
226
- const paramsType = formatParamsType(route.params);
227
- lines.push(` export function useParams(route: '${route.urlPath}'): ${paramsType}`);
235
+ const paramsType = formatParamsType(route.params, importBase);
236
+ lines.push(` export function useSegmentParams(route: '${route.urlPath}'): ${paramsType}`);
228
237
  }
229
- lines.push(' export function useParams(): Record<string, string | string[]>');
238
+ lines.push(' export function useSegmentParams(): Record<string, string | string[]>');
230
239
  lines.push('');
231
240
  }
232
241
 
@@ -236,47 +245,95 @@ function formatDeclarationFile(routes: RouteEntry[], importBase?: string): strin
236
245
  lines.push('');
237
246
  }
238
247
 
239
- // Typed Link overloads
248
+ // Typed Link overloads — per-route with DIRECT types (no conditionals).
249
+ // Direct types preserve TypeScript's excess property checking.
250
+ //
251
+ // TIM-832: per-route and catch-all are emitted as TWO separate
252
+ // augmentation blocks. Per TS's merging rule "later overload sets
253
+ // ordered first", the catch-all block (declared SECOND in this file)
254
+ // ends up FIRST in the merged call-signature list at resolution time,
255
+ // which puts the per-route block LAST — so its error message is the
256
+ // one TypeScript reports when no overload matches. This gives users a
257
+ // clear prop-mismatch error (e.g. "'string | undefined' is not
258
+ // assignable to 'string | number' on id") instead of the old
259
+ // confusing "Type 'string' is not assignable to type 'never'" cascade.
240
260
  if (pageRoutes.length > 0) {
241
- lines.push(' // Typed Link props per route');
261
+ lines.push(' // Typed Link overloads per-route (block 1 / emitted first)');
242
262
  lines.push(...formatTypedLinkOverloads(pageRoutes, importBase));
263
+ lines.push('');
243
264
  }
244
265
 
245
266
  lines.push('}');
246
267
  lines.push('');
247
268
  }
248
269
 
270
+ // TIM-832: catch-all block — emitted as a SEPARATE `declare module`
271
+ // augmentation so TS's "later overload set first" rule orders it ahead
272
+ // of the per-route block above at resolution time, leaving per-route as
273
+ // the "last overload" whose error TypeScript reports.
274
+ lines.push("declare module '@timber-js/app/client' {");
275
+ lines.push(" import type { SearchParamsDefinition } from '@timber-js/app/search-params'");
276
+ lines.push('');
277
+ lines.push(...formatLinkCatchAllOverloads());
278
+ lines.push('}');
279
+ lines.push('');
280
+
249
281
  return lines.join('\n');
250
282
  }
251
283
 
252
284
  /**
253
285
  * Format the params type for a route entry.
254
286
  */
255
- function formatParamsType(params: ParamEntry[]): string {
287
+ function formatParamsType(params: ParamEntry[], importBase?: string): string {
256
288
  if (params.length === 0) {
257
289
  return '{}';
258
290
  }
259
291
 
260
- const fields = params.map((p) => `${p.name}: ${p.type}`);
292
+ const fields = params.map((p) => {
293
+ if (p.codecFilePath) {
294
+ // Use the codec's inferred type from the layout/page file
295
+ const absPath = p.codecFilePath.replace(/\.(ts|tsx)$/, '');
296
+ let importPath: string;
297
+ if (importBase) {
298
+ importPath = './' + relative(importBase, absPath).replace(/\\/g, '/');
299
+ } else {
300
+ importPath = './' + posix.basename(absPath);
301
+ }
302
+ // Extract T from the 'segmentParams' named export's ParamsDefinition<T>
303
+ const codecType = `(typeof import('${importPath}'))['segmentParams'] extends import('@timber-js/app/segment-params').ParamsDefinition<infer T> ? T[${JSON.stringify(p.name)}] : ${p.type}`;
304
+ return `${p.name}: ${codecType}`;
305
+ }
306
+ return `${p.name}: ${p.type}`;
307
+ });
261
308
  return `{ ${fields.join('; ')} }`;
262
309
  }
263
310
 
264
311
  /**
265
- * Format the params type for Link props.
312
+ * Format the params type for Link overloads.
266
313
  *
267
314
  * Link params accept `string | number` for single dynamic segments
268
315
  * (convenience — values are stringified at runtime). Catch-all and
269
316
  * optional catch-all remain `string[]` / `string[] | undefined`.
270
317
  *
271
- * See design/07-routing.md §"Typed params and searchParams on <Link>"
318
+ * Uses DIRECT types (not conditional) to preserve excess property checking.
272
319
  */
273
- function formatLinkParamsType(params: ParamEntry[]): string {
320
+ function formatLinkParamsType(params: ParamEntry[], importBase?: string): string {
274
321
  if (params.length === 0) {
275
322
  return '{}';
276
323
  }
277
324
 
278
325
  const fields = params.map((p) => {
279
- // Single dynamic segments accept string | number for convenience
326
+ if (p.codecFilePath) {
327
+ const absPath = p.codecFilePath.replace(/\.(ts|tsx)$/, '');
328
+ let importPath: string;
329
+ if (importBase) {
330
+ importPath = './' + relative(importBase, absPath).replace(/\\/g, '/');
331
+ } else {
332
+ importPath = './' + posix.basename(absPath);
333
+ }
334
+ const codecType = `(typeof import('${importPath}'))['segmentParams'] extends import('@timber-js/app/segment-params').ParamsDefinition<infer T> ? T[${JSON.stringify(p.name)}] : ${p.type}`;
335
+ return `${p.name}: ${codecType}`;
336
+ }
280
337
  const type = p.type === 'string' ? 'string | number' : p.type;
281
338
  return `${p.name}: ${type}`;
282
339
  });
@@ -286,13 +343,13 @@ function formatLinkParamsType(params: ParamEntry[]): string {
286
343
  /**
287
344
  * Format the searchParams type for a route entry.
288
345
  *
289
- * When a search-params.ts exists, we reference its inferred type via an import type.
346
+ * When a page.tsx exports searchParams, we reference its inferred type via an import type.
290
347
  * The import path is relative to `importBase` (the directory where the .d.ts will be
291
348
  * written). When importBase is undefined, falls back to a bare relative path.
292
349
  */
293
350
  function formatSearchParamsType(route: RouteEntry, importBase?: string): string {
294
- if (route.hasSearchParams && route.searchParamsAbsPath) {
295
- const absPath = route.searchParamsAbsPath.replace(/\.(ts|tsx)$/, '');
351
+ if (route.hasSearchParams && route.searchParamsPagePath) {
352
+ const absPath = route.searchParamsPagePath.replace(/\.(ts|tsx)$/, '');
296
353
  let importPath: string;
297
354
  if (importBase) {
298
355
  // Make the path relative to the output directory, converted to posix separators
@@ -300,10 +357,8 @@ function formatSearchParamsType(route: RouteEntry, importBase?: string): string
300
357
  } else {
301
358
  importPath = './' + posix.basename(absPath);
302
359
  }
303
- // Use (typeof import('...'))[' default'] instead of import('...').default
304
- // because with moduleResolution:"bundler", import('...').default is treated as
305
- // a namespace member access which doesn't work for default exports.
306
- return `(typeof import('${importPath}'))['default'] extends import('@timber-js/app/search-params').SearchParamsDefinition<infer T> ? T : never`;
360
+ // Extract the type from the named 'searchParams' export of the page module.
361
+ return `(typeof import('${importPath}'))['searchParams'] extends import('@timber-js/app/search-params').SearchParamsDefinition<infer T> ? T : never`;
307
362
  }
308
363
  return '{}';
309
364
  }
@@ -338,59 +393,172 @@ function formatUseQueryStatesOverloads(routes: RouteEntry[], importBase?: string
338
393
  }
339
394
 
340
395
  /**
341
- * Generate typed Link overloads.
396
+ * Build a TypeScript template literal pattern for a dynamic route.
397
+ * e.g. '/products/[id]' → '/products/${string}'
398
+ * '/blog/[...slug]' → '/blog/${string}'
399
+ * '/docs/[[...path]]' → '/docs/${string}' (also matches /docs)
400
+ * '/[org]/[repo]' → '/${string}/${string}'
401
+ */
402
+ function buildResolvedPattern(route: RouteEntry): string | null {
403
+ const parts = route.urlPath.split('/');
404
+ const templateParts = parts.map((part) => {
405
+ if (part.startsWith('[[...') && part.endsWith(']]')) {
406
+ // Optional catch-all — matches any trailing path
407
+ return '${string}';
408
+ }
409
+ if (part.startsWith('[...') && part.endsWith(']')) {
410
+ // Catch-all — matches one or more segments
411
+ return '${string}';
412
+ }
413
+ if (part.startsWith('[') && part.endsWith(']')) {
414
+ // Dynamic segment
415
+ return '${string}';
416
+ }
417
+ return part;
418
+ });
419
+ return templateParts.join('/');
420
+ }
421
+
422
+ /** Shared Link base-props type literal used in every emitted call signature. */
423
+ const LINK_BASE_PROPS_TYPE =
424
+ "Omit<import('react').AnchorHTMLAttributes<HTMLAnchorElement>, 'href'> & { prefetch?: boolean; scroll?: boolean; preserveSearchParams?: true | string[]; onNavigate?: import('./client/link.js').OnNavigateHandler; children?: import('react').ReactNode }";
425
+
426
+ /**
427
+ * TIM-832: Catch-all call signatures for `<Link>` — external hrefs and
428
+ * computed `string` variables. Emitted from codegen in a SEPARATE
429
+ * `declare module` block (declared AFTER the per-route block) so the TS
430
+ * "later overload set ordered first" rule places these catch-all
431
+ * signatures ahead of per-route in resolution order, leaving per-route
432
+ * as the final overload whose error message is reported on failure.
433
+ *
434
+ * The conditional `string extends H ? ... : never` protection preserves
435
+ * TIM-624's guarantee that unknown internal path literals don't match
436
+ * the catch-all — typos like `<Link href="/typo" />` still error.
437
+ */
438
+ function formatLinkCatchAllOverloads(): string[] {
439
+ const lines: string[] = [];
440
+ const baseProps = LINK_BASE_PROPS_TYPE;
441
+
442
+ // TIM-830: the catch-all signatures accept EITHER the legacy
443
+ // `{ definition, values }` wrapper OR a flat `Record<string, unknown>`
444
+ // values object. External/computed hrefs can't be looked up in the
445
+ // runtime registry, so the wrapped form is still the reliable path;
446
+ // the flat form is kept permissive for callers migrating from typed-
447
+ // route hrefs to computed strings. `resolveHref` discriminates at
448
+ // runtime via the presence of a `definition` key.
449
+ const catchAllSearchParams =
450
+ '{ definition: SearchParamsDefinition<Record<string, unknown>>; values: Record<string, unknown> } | Record<string, unknown>';
451
+
452
+ // ExternalHref inlined here rather than referenced as an exported
453
+ // alias so the generated .d.ts stands alone without source imports.
454
+ const externalHref =
455
+ '`http://${string}` | `https://${string}` | `mailto:${string}` | `tel:${string}` | `ftp://${string}` | `//${string}` | `#${string}` | `?${string}`';
456
+
457
+ lines.push(' // Typed Link overloads — catch-all (block 2 / emitted second)');
458
+ lines.push(' interface LinkFunction {');
459
+
460
+ // (1) External/literal-protocol hrefs.
461
+ lines.push(` (props: ${baseProps} & {`);
462
+ lines.push(` href: ${externalHref}`);
463
+ lines.push(` segmentParams?: never`);
464
+ lines.push(` searchParams?: ${catchAllSearchParams}`);
465
+ lines.push(` }): import('react').JSX.Element`);
466
+
467
+ // (2) Computed/variable href — non-literal `string` only.
468
+ // `string extends H` is true only when H is the wide `string` type,
469
+ // not a specific literal. Literal internal paths (typos) that don't
470
+ // match any per-route signature collapse to `never` here, but since
471
+ // this block is NOT the "last overload" at resolution time, TS
472
+ // instead reports the error from the per-route block — which now
473
+ // says `Type '"/typo"' is not assignable to type '"/products/[id]"'`
474
+ // or similar per-route-specific guidance.
475
+ lines.push(` <H extends string>(`);
476
+ lines.push(` props: string extends H`);
477
+ lines.push(` ? ${baseProps} & {`);
478
+ lines.push(` href: H`);
479
+ lines.push(` segmentParams?: Record<string, string | number | string[]>`);
480
+ lines.push(` searchParams?: ${catchAllSearchParams}`);
481
+ lines.push(` }`);
482
+ lines.push(` : never`);
483
+ lines.push(` ): import('react').JSX.Element`);
484
+
485
+ lines.push(' }');
486
+ return lines;
487
+ }
488
+
489
+ /**
490
+ * Generate typed per-route Link call signatures via LinkFunction
491
+ * interface merging.
342
492
  *
343
- * For each page route, we generate a Link function overload that:
344
- * - Constrains href to the route pattern
345
- * - Types the params prop based on dynamic segments
346
- * - Types the searchParams prop based on search-params.ts (if present)
493
+ * Each call signature uses DIRECT types (not conditional types) for
494
+ * segmentParams, preserving TypeScript's excess property checking.
495
+ * Interface merging is the only reliable way to add "overloads" via
496
+ * module augmentation function overloads can't be augmented.
347
497
  *
348
- * Routes without dynamic segments accept href as a literal string with no params.
349
- * Routes with dynamic segments require a params prop.
498
+ * TIM-832: this function emits ONLY the per-route block. The catch-all
499
+ * block is emitted separately by `formatLinkCatchAllOverloads` inside a
500
+ * second `declare module` so TS overload ordering reports per-route
501
+ * errors (see `formatDeclarationFile`).
350
502
  */
351
503
  function formatTypedLinkOverloads(routes: RouteEntry[], importBase?: string): string[] {
352
504
  const lines: string[] = [];
505
+ const baseProps = LINK_BASE_PROPS_TYPE;
353
506
 
507
+ lines.push(' interface LinkFunction {');
354
508
  for (const route of routes) {
355
509
  const hasDynamicParams = route.params.length > 0;
356
- const paramsType = formatLinkParamsType(route.params);
510
+ const paramsProp = hasDynamicParams
511
+ ? `segmentParams: ${formatLinkParamsType(route.params, importBase)}`
512
+ : 'segmentParams?: never';
513
+
357
514
  const searchParamsType = route.hasSearchParams
358
515
  ? formatSearchParamsType(route, importBase)
359
516
  : null;
360
-
517
+ // TIM-830: the per-route pattern signature (href: '/products/[id]')
518
+ // uses a FLAT `Partial<T>` shape — the registry is keyed by the
519
+ // un-interpolated pattern, which matches `href` here exactly.
520
+ const patternSearchParamsProp = searchParamsType
521
+ ? `searchParams?: Partial<${searchParamsType}>`
522
+ : 'searchParams?: never';
523
+
524
+ // TIM-832: For dynamic routes, emit the resolved-template signature
525
+ // FIRST and the pattern signature SECOND. The TS overload resolution
526
+ // order is top-to-bottom, and TS reports the error from the LAST
527
+ // overload tried on a failed call. For a user who passes the literal
528
+ // pattern href (`href="/products/[id]"`) and mistyped segmentParams,
529
+ // we want the PATTERN signature's error (which names the specific
530
+ // `segmentParams` shape like `{ id: string | number }`) to be the one
531
+ // TS reports — so the pattern must come LAST.
532
+ //
533
+ // TIM-830: the resolved-template signature keeps the legacy WRAPPED
534
+ // `{ definition, values }` shape. The runtime registry is keyed by
535
+ // the un-interpolated pattern (e.g. '/products/[id]'), so a flat
536
+ // lookup for an already-interpolated href like '/products/42' would
537
+ // fail. Flat values only work on the pattern signature below where
538
+ // `href` is the pattern itself. Callers using a resolved-template
539
+ // href must pass the definition inline, same as the external/
540
+ // computed catch-all signature.
361
541
  if (hasDynamicParams) {
362
- // Route with dynamic segments — params prop required
363
- const spProp = searchParamsType
364
- ? `searchParams?: { definition: SearchParamsDefinition<${searchParamsType}>; values: Partial<${searchParamsType}> }`
365
- : `searchParams?: never`;
366
- lines.push(
367
- ` export function Link(props: Omit<import('react').AnchorHTMLAttributes<HTMLAnchorElement>, 'href'> & {`
368
- );
369
- lines.push(` href: '${route.urlPath}'`);
370
- lines.push(` params: ${paramsType}`);
371
- lines.push(` ${spProp}`);
372
- lines.push(` prefetch?: boolean; scroll?: boolean; children?: import('react').ReactNode`);
373
- lines.push(` }): import('react').JSX.Element`);
374
- } else {
375
- // Static route — no params needed
376
- const spProp = searchParamsType
377
- ? `searchParams?: { definition: SearchParamsDefinition<${searchParamsType}>; values: Partial<${searchParamsType}> }`
378
- : `searchParams?: never`;
379
- lines.push(
380
- ` export function Link(props: Omit<import('react').AnchorHTMLAttributes<HTMLAnchorElement>, 'href'> & {`
381
- );
382
- lines.push(` href: '${route.urlPath}'`);
383
- lines.push(` params?: never`);
384
- lines.push(` ${spProp}`);
385
- lines.push(` prefetch?: boolean; scroll?: boolean; children?: import('react').ReactNode`);
386
- lines.push(` }): import('react').JSX.Element`);
542
+ const templatePattern = buildResolvedPattern(route);
543
+ if (templatePattern) {
544
+ const resolvedSearchParamsProp = searchParamsType
545
+ ? `searchParams?: { definition: SearchParamsDefinition<${searchParamsType}>; values: Partial<${searchParamsType}> }`
546
+ : 'searchParams?: never';
547
+ lines.push(` (props: ${baseProps} & {`);
548
+ lines.push(` href: \`${templatePattern}\``);
549
+ lines.push(` segmentParams?: never`);
550
+ lines.push(` ${resolvedSearchParamsProp}`);
551
+ lines.push(` }): import('react').JSX.Element`);
552
+ }
387
553
  }
388
- }
389
554
 
390
- // Fallback overload for arbitrary string hrefs (escape hatch)
391
- lines.push(
392
- ` export function Link(props: import('./client/link.js').LinkProps): import('react').JSX.Element`
393
- );
555
+ lines.push(` (props: ${baseProps} & {`);
556
+ lines.push(` href: '${route.urlPath}'`);
557
+ lines.push(` ${paramsProp}`);
558
+ lines.push(` ${patternSearchParamsProp}`);
559
+ lines.push(` }): import('react').JSX.Element`);
560
+ }
561
+ lines.push(' }');
394
562
 
395
563
  return lines;
396
564
  }