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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (784) hide show
  1. package/dist/_chunks/actions-BNhpxrnV.js +1104 -0
  2. package/dist/_chunks/actions-BNhpxrnV.js.map +1 -0
  3. package/dist/_chunks/build-output-helper-K7oUCRqU.js +102 -0
  4. package/dist/_chunks/build-output-helper-K7oUCRqU.js.map +1 -0
  5. package/dist/_chunks/cli-schema-sync-CObqjGWF.js +2 -0
  6. package/dist/_chunks/cli-schema-sync-q-Ce6-iG.js +785 -0
  7. package/dist/_chunks/cli-schema-sync-q-Ce6-iG.js.map +1 -0
  8. package/dist/_chunks/codec-registry-DqkeAydt.js +21 -0
  9. package/dist/_chunks/codec-registry-DqkeAydt.js.map +1 -0
  10. package/dist/_chunks/define-DMq-Yjp7.js +112 -0
  11. package/dist/_chunks/define-DMq-Yjp7.js.map +1 -0
  12. package/dist/_chunks/define-jeHDXZGq.js +195 -0
  13. package/dist/_chunks/define-jeHDXZGq.js.map +1 -0
  14. package/dist/_chunks/format-BjN9HLu9.js +14 -0
  15. package/dist/_chunks/format-BjN9HLu9.js.map +1 -0
  16. package/dist/_chunks/handler-store-bIAstrxQ.js +54 -0
  17. package/dist/_chunks/handler-store-bIAstrxQ.js.map +1 -0
  18. package/dist/_chunks/logger-CMd9P1xQ.js +291 -0
  19. package/dist/_chunks/logger-CMd9P1xQ.js.map +1 -0
  20. package/dist/_chunks/merge-search-params-Cm1j99HC.js +41 -0
  21. package/dist/_chunks/merge-search-params-Cm1j99HC.js.map +1 -0
  22. package/dist/_chunks/{metadata-routes-Cjmvi3rQ.js → metadata-routes-DESG8uk5.js} +32 -19
  23. package/dist/_chunks/metadata-routes-DESG8uk5.js.map +1 -0
  24. package/dist/_chunks/navigation-root-B5-RmsPi.js +103 -0
  25. package/dist/_chunks/navigation-root-B5-RmsPi.js.map +1 -0
  26. package/dist/_chunks/registry-BI9cgCt7.js +20 -0
  27. package/dist/_chunks/registry-BI9cgCt7.js.map +1 -0
  28. package/dist/_chunks/resolve-schema-DU2nbVOi.js +77 -0
  29. package/dist/_chunks/resolve-schema-DU2nbVOi.js.map +1 -0
  30. package/dist/_chunks/router-ref-B2-2kIIC.js +28 -0
  31. package/dist/_chunks/router-ref-B2-2kIIC.js.map +1 -0
  32. package/dist/_chunks/schema-bridge-o0SwFtXW.js +86 -0
  33. package/dist/_chunks/schema-bridge-o0SwFtXW.js.map +1 -0
  34. package/dist/_chunks/segment-classify-BjfuctV2.js +137 -0
  35. package/dist/_chunks/segment-classify-BjfuctV2.js.map +1 -0
  36. package/dist/_chunks/segment-context-Bg0pFbLT.js +34 -0
  37. package/dist/_chunks/segment-context-Bg0pFbLT.js.map +1 -0
  38. package/dist/_chunks/{ssr-data-MjmprTmO.js → ssr-data-DVX8S7vj.js} +1 -1
  39. package/dist/_chunks/ssr-data-DVX8S7vj.js.map +1 -0
  40. package/dist/_chunks/stale-reload-CCqb62Z3.js +84 -0
  41. package/dist/_chunks/stale-reload-CCqb62Z3.js.map +1 -0
  42. package/dist/_chunks/tracing-DP5djRq5.js +358 -0
  43. package/dist/_chunks/tracing-DP5djRq5.js.map +1 -0
  44. package/dist/_chunks/{use-query-states-D5KaffOK.js → use-query-states-C9G6LP0F.js} +7 -20
  45. package/dist/_chunks/use-query-states-C9G6LP0F.js.map +1 -0
  46. package/dist/_chunks/use-segment-params-CIeinIx2.js +151 -0
  47. package/dist/_chunks/use-segment-params-CIeinIx2.js.map +1 -0
  48. package/dist/_chunks/validation-AfEFM5ze.js +84 -0
  49. package/dist/_chunks/validation-AfEFM5ze.js.map +1 -0
  50. package/dist/_chunks/walkers-BbEu2_Pp.js +724 -0
  51. package/dist/_chunks/walkers-BbEu2_Pp.js.map +1 -0
  52. package/dist/_chunks/{format-DviM89f0.js → warnings-CAzunaGo.js} +6 -45
  53. package/dist/_chunks/warnings-CAzunaGo.js.map +1 -0
  54. package/dist/adapters/build-output-helper.d.ts +28 -0
  55. package/dist/adapters/build-output-helper.d.ts.map +1 -0
  56. package/dist/adapters/cloudflare-dev.d.ts +109 -0
  57. package/dist/adapters/cloudflare-dev.d.ts.map +1 -0
  58. package/dist/adapters/cloudflare-dev.js +73 -0
  59. package/dist/adapters/cloudflare-dev.js.map +1 -0
  60. package/dist/adapters/cloudflare-kv-cache.d.ts +64 -0
  61. package/dist/adapters/cloudflare-kv-cache.d.ts.map +1 -0
  62. package/dist/adapters/cloudflare-kv-cache.js +95 -0
  63. package/dist/adapters/cloudflare-kv-cache.js.map +1 -0
  64. package/dist/adapters/cloudflare.d.ts +148 -12
  65. package/dist/adapters/cloudflare.d.ts.map +1 -1
  66. package/dist/adapters/cloudflare.js +142 -38
  67. package/dist/adapters/cloudflare.js.map +1 -1
  68. package/dist/adapters/compress-module.d.ts.map +1 -1
  69. package/dist/adapters/nitro.d.ts +17 -1
  70. package/dist/adapters/nitro.d.ts.map +1 -1
  71. package/dist/adapters/nitro.js +143 -45
  72. package/dist/adapters/nitro.js.map +1 -1
  73. package/dist/adapters/shared.d.ts +16 -0
  74. package/dist/adapters/shared.d.ts.map +1 -0
  75. package/dist/cache/cache-api.d.ts +24 -0
  76. package/dist/cache/cache-api.d.ts.map +1 -0
  77. package/dist/cache/handler-store.d.ts +31 -0
  78. package/dist/cache/handler-store.d.ts.map +1 -0
  79. package/dist/cache/index.d.ts +23 -7
  80. package/dist/cache/index.d.ts.map +1 -1
  81. package/dist/cache/index.js +151 -81
  82. package/dist/cache/index.js.map +1 -1
  83. package/dist/cache/singleflight.d.ts +18 -1
  84. package/dist/cache/singleflight.d.ts.map +1 -1
  85. package/dist/cache/sizeof.d.ts +22 -0
  86. package/dist/cache/sizeof.d.ts.map +1 -0
  87. package/dist/cache/timber-cache.d.ts +1 -1
  88. package/dist/cache/timber-cache.d.ts.map +1 -1
  89. package/dist/cli-schema-sync.d.ts +39 -0
  90. package/dist/cli-schema-sync.d.ts.map +1 -0
  91. package/dist/cli.d.ts +14 -2
  92. package/dist/cli.d.ts.map +1 -1
  93. package/dist/cli.js +48 -6
  94. package/dist/cli.js.map +1 -1
  95. package/dist/client/browser-dev.d.ts +34 -1
  96. package/dist/client/browser-dev.d.ts.map +1 -1
  97. package/dist/client/browser-entry/action-dispatch.d.ts +17 -0
  98. package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -0
  99. package/dist/client/browser-entry/hmr.d.ts +21 -0
  100. package/dist/client/browser-entry/hmr.d.ts.map +1 -0
  101. package/dist/client/browser-entry/hydrate.d.ts +46 -0
  102. package/dist/client/browser-entry/hydrate.d.ts.map +1 -0
  103. package/dist/client/browser-entry/index.d.ts +30 -0
  104. package/dist/client/browser-entry/index.d.ts.map +1 -0
  105. package/dist/client/browser-entry/post-hydration.d.ts +26 -0
  106. package/dist/client/browser-entry/post-hydration.d.ts.map +1 -0
  107. package/dist/client/browser-entry/router-init.d.ts +26 -0
  108. package/dist/client/browser-entry/router-init.d.ts.map +1 -0
  109. package/dist/client/browser-entry/rsc-stream.d.ts +24 -0
  110. package/dist/client/browser-entry/rsc-stream.d.ts.map +1 -0
  111. package/dist/client/browser-entry/scroll.d.ts +19 -0
  112. package/dist/client/browser-entry/scroll.d.ts.map +1 -0
  113. package/dist/client/error-boundary.d.ts +12 -5
  114. package/dist/client/error-boundary.d.ts.map +1 -1
  115. package/dist/client/error-boundary.js +29 -6
  116. package/dist/client/error-boundary.js.map +1 -1
  117. package/dist/client/error-reconstituter.d.ts +54 -0
  118. package/dist/client/error-reconstituter.d.ts.map +1 -0
  119. package/dist/client/form.d.ts +16 -27
  120. package/dist/client/form.d.ts.map +1 -1
  121. package/dist/client/history.d.ts +19 -4
  122. package/dist/client/history.d.ts.map +1 -1
  123. package/dist/client/index.d.ts +10 -24
  124. package/dist/client/index.d.ts.map +1 -1
  125. package/dist/client/index.js +180 -1119
  126. package/dist/client/index.js.map +1 -1
  127. package/dist/client/internal.d.ts +19 -0
  128. package/dist/client/internal.d.ts.map +1 -0
  129. package/dist/client/internal.js +845 -0
  130. package/dist/client/internal.js.map +1 -0
  131. package/dist/client/link-pending-store.d.ts +65 -0
  132. package/dist/client/link-pending-store.d.ts.map +1 -0
  133. package/dist/client/link.d.ts +67 -56
  134. package/dist/client/link.d.ts.map +1 -1
  135. package/dist/client/nav-link-store.d.ts +27 -0
  136. package/dist/client/nav-link-store.d.ts.map +1 -0
  137. package/dist/client/navigation-api-types.d.ts +90 -0
  138. package/dist/client/navigation-api-types.d.ts.map +1 -0
  139. package/dist/client/navigation-api.d.ts +115 -0
  140. package/dist/client/navigation-api.d.ts.map +1 -0
  141. package/dist/client/navigation-context.d.ts +14 -2
  142. package/dist/client/navigation-context.d.ts.map +1 -1
  143. package/dist/client/{transition-root.d.ts → navigation-root.d.ts} +46 -9
  144. package/dist/client/navigation-root.d.ts.map +1 -0
  145. package/dist/client/nuqs-adapter.d.ts.map +1 -1
  146. package/dist/client/router-ref.d.ts +1 -1
  147. package/dist/client/router.d.ts +79 -10
  148. package/dist/client/router.d.ts.map +1 -1
  149. package/dist/client/rsc-fetch.d.ts +46 -3
  150. package/dist/client/rsc-fetch.d.ts.map +1 -1
  151. package/dist/client/segment-cache.d.ts +3 -1
  152. package/dist/client/segment-cache.d.ts.map +1 -1
  153. package/dist/client/segment-outlet.d.ts +49 -0
  154. package/dist/client/segment-outlet.d.ts.map +1 -0
  155. package/dist/client/segment-update-context.d.ts +21 -0
  156. package/dist/client/segment-update-context.d.ts.map +1 -0
  157. package/dist/client/shallow-url.d.ts +10 -0
  158. package/dist/client/shallow-url.d.ts.map +1 -0
  159. package/dist/client/ssr-data.d.ts +13 -4
  160. package/dist/client/ssr-data.d.ts.map +1 -1
  161. package/dist/client/stale-reload.d.ts +15 -0
  162. package/dist/client/stale-reload.d.ts.map +1 -1
  163. package/dist/client/state.d.ts +1 -1
  164. package/dist/client/top-loader.d.ts +5 -5
  165. package/dist/client/top-loader.d.ts.map +1 -1
  166. package/dist/client/use-cookie.d.ts +12 -0
  167. package/dist/client/use-cookie.d.ts.map +1 -1
  168. package/dist/client/use-link-status.d.ts +5 -5
  169. package/dist/client/use-link-status.d.ts.map +1 -1
  170. package/dist/client/use-pending-navigation.d.ts +23 -0
  171. package/dist/client/use-pending-navigation.d.ts.map +1 -0
  172. package/dist/client/use-query-states.d.ts +1 -1
  173. package/dist/client/use-query-states.d.ts.map +1 -1
  174. package/dist/client/use-router.d.ts +1 -1
  175. package/dist/client/use-search-params.d.ts +7 -5
  176. package/dist/client/use-search-params.d.ts.map +1 -1
  177. package/dist/client/{use-params.d.ts → use-segment-params.d.ts} +8 -6
  178. package/dist/client/use-segment-params.d.ts.map +1 -0
  179. package/dist/codec.d.ts +69 -0
  180. package/dist/codec.d.ts.map +1 -0
  181. package/dist/codec.js +75 -0
  182. package/dist/codec.js.map +1 -0
  183. package/dist/config-types.d.ts +294 -0
  184. package/dist/config-types.d.ts.map +1 -0
  185. package/dist/config-validation.d.ts +51 -0
  186. package/dist/config-validation.d.ts.map +1 -0
  187. package/dist/content/index.d.ts +1 -10
  188. package/dist/content/index.d.ts.map +1 -1
  189. package/dist/content/index.js +0 -2
  190. package/dist/cookies/define-cookie.d.ts +58 -25
  191. package/dist/cookies/define-cookie.d.ts.map +1 -1
  192. package/dist/cookies/index.d.ts +2 -1
  193. package/dist/cookies/index.d.ts.map +1 -1
  194. package/dist/cookies/index.js +251 -36
  195. package/dist/cookies/index.js.map +1 -1
  196. package/dist/cookies/json-cookie.d.ts +64 -0
  197. package/dist/cookies/json-cookie.d.ts.map +1 -0
  198. package/dist/cookies/validation.d.ts +46 -0
  199. package/dist/cookies/validation.d.ts.map +1 -0
  200. package/dist/dev-tools/404-page.d.ts +46 -0
  201. package/dist/dev-tools/404-page.d.ts.map +1 -0
  202. package/dist/dev-tools/browser-logs.d.ts +84 -0
  203. package/dist/dev-tools/browser-logs.d.ts.map +1 -0
  204. package/dist/dev-tools/error-page.d.ts +58 -0
  205. package/dist/dev-tools/error-page.d.ts.map +1 -0
  206. package/dist/dev-tools/holding-server.d.ts +54 -0
  207. package/dist/dev-tools/holding-server.d.ts.map +1 -0
  208. package/dist/dev-tools/index.d.ts +31 -0
  209. package/dist/dev-tools/index.d.ts.map +1 -0
  210. package/dist/{server/dev-span-processor.d.ts → dev-tools/instrumentation.d.ts} +26 -6
  211. package/dist/dev-tools/instrumentation.d.ts.map +1 -0
  212. package/dist/{server/dev-logger.d.ts → dev-tools/logger.d.ts} +1 -1
  213. package/dist/dev-tools/logger.d.ts.map +1 -0
  214. package/dist/{plugins/dev-logs.d.ts → dev-tools/logs.d.ts} +2 -2
  215. package/dist/dev-tools/logs.d.ts.map +1 -0
  216. package/dist/dev-tools/overlay.d.ts +91 -0
  217. package/dist/dev-tools/overlay.d.ts.map +1 -0
  218. package/dist/dev-tools/stack-classifier.d.ts +34 -0
  219. package/dist/dev-tools/stack-classifier.d.ts.map +1 -0
  220. package/dist/dev-tools/terminal.d.ts +28 -0
  221. package/dist/dev-tools/terminal.d.ts.map +1 -0
  222. package/dist/{server/dev-warnings.d.ts → dev-tools/warnings.d.ts} +2 -22
  223. package/dist/dev-tools/warnings.d.ts.map +1 -0
  224. package/dist/fonts/ast.d.ts +98 -6
  225. package/dist/fonts/ast.d.ts.map +1 -1
  226. package/dist/fonts/bundle.d.ts +48 -0
  227. package/dist/fonts/bundle.d.ts.map +1 -0
  228. package/dist/fonts/dev-middleware.d.ts +22 -0
  229. package/dist/fonts/dev-middleware.d.ts.map +1 -0
  230. package/dist/fonts/local.d.ts +1 -1
  231. package/dist/fonts/pipeline.d.ts +167 -0
  232. package/dist/fonts/pipeline.d.ts.map +1 -0
  233. package/dist/fonts/transform.d.ts +78 -0
  234. package/dist/fonts/transform.d.ts.map +1 -0
  235. package/dist/fonts/types.d.ts +45 -1
  236. package/dist/fonts/types.d.ts.map +1 -1
  237. package/dist/fonts/virtual-modules.d.ts +94 -0
  238. package/dist/fonts/virtual-modules.d.ts.map +1 -0
  239. package/dist/index.d.ts +46 -164
  240. package/dist/index.d.ts.map +1 -1
  241. package/dist/index.js +5584 -13386
  242. package/dist/index.js.map +1 -1
  243. package/dist/params/codec-registry.d.ts +26 -0
  244. package/dist/params/codec-registry.d.ts.map +1 -0
  245. package/dist/params/define-schema.d.ts +81 -0
  246. package/dist/params/define-schema.d.ts.map +1 -0
  247. package/dist/params/index.d.ts +5 -0
  248. package/dist/params/index.d.ts.map +1 -0
  249. package/dist/params/index.js +34 -0
  250. package/dist/params/index.js.map +1 -0
  251. package/dist/params/resolve-schema.d.ts +34 -0
  252. package/dist/params/resolve-schema.d.ts.map +1 -0
  253. package/dist/plugin-context.d.ts +107 -0
  254. package/dist/plugin-context.d.ts.map +1 -0
  255. package/dist/plugins/adapter-build.d.ts +1 -1
  256. package/dist/plugins/adapter-build.d.ts.map +1 -1
  257. package/dist/plugins/build-manifest.d.ts +2 -2
  258. package/dist/plugins/build-manifest.d.ts.map +1 -1
  259. package/dist/plugins/build-report.d.ts +9 -7
  260. package/dist/plugins/build-report.d.ts.map +1 -1
  261. package/dist/plugins/client-chunks.d.ts +32 -0
  262. package/dist/plugins/client-chunks.d.ts.map +1 -0
  263. package/dist/plugins/cloudflare-wasm.d.ts +18 -0
  264. package/dist/plugins/cloudflare-wasm.d.ts.map +1 -0
  265. package/dist/plugins/content.d.ts +1 -1
  266. package/dist/plugins/content.d.ts.map +1 -1
  267. package/dist/plugins/dev-server.d.ts +1 -1
  268. package/dist/plugins/dev-server.d.ts.map +1 -1
  269. package/dist/plugins/entries.d.ts +1 -1
  270. package/dist/plugins/entries.d.ts.map +1 -1
  271. package/dist/plugins/fonts.d.ts +17 -73
  272. package/dist/plugins/fonts.d.ts.map +1 -1
  273. package/dist/plugins/mdx.d.ts +1 -1
  274. package/dist/plugins/mdx.d.ts.map +1 -1
  275. package/dist/plugins/routing.d.ts +1 -1
  276. package/dist/plugins/routing.d.ts.map +1 -1
  277. package/dist/plugins/server-bundle.d.ts.map +1 -1
  278. package/dist/plugins/shims.d.ts +6 -5
  279. package/dist/plugins/shims.d.ts.map +1 -1
  280. package/dist/plugins/static-build.d.ts +5 -26
  281. package/dist/plugins/static-build.d.ts.map +1 -1
  282. package/dist/routing/codegen-shared.d.ts +67 -0
  283. package/dist/routing/codegen-shared.d.ts.map +1 -0
  284. package/dist/routing/codegen-types.d.ts +60 -0
  285. package/dist/routing/codegen-types.d.ts.map +1 -0
  286. package/dist/routing/codegen.d.ts +7 -2
  287. package/dist/routing/codegen.d.ts.map +1 -1
  288. package/dist/routing/convention-lint.d.ts +41 -0
  289. package/dist/routing/convention-lint.d.ts.map +1 -0
  290. package/dist/routing/index.d.ts +7 -1
  291. package/dist/routing/index.d.ts.map +1 -1
  292. package/dist/routing/index.js +4 -2
  293. package/dist/routing/link-codegen.d.ts +90 -0
  294. package/dist/routing/link-codegen.d.ts.map +1 -0
  295. package/dist/routing/scanner.d.ts +1 -10
  296. package/dist/routing/scanner.d.ts.map +1 -1
  297. package/dist/routing/schema-validation.d.ts +35 -0
  298. package/dist/routing/schema-validation.d.ts.map +1 -0
  299. package/dist/routing/segment-classify.d.ts +75 -0
  300. package/dist/routing/segment-classify.d.ts.map +1 -0
  301. package/dist/routing/segment-codegen.d.ts +38 -0
  302. package/dist/routing/segment-codegen.d.ts.map +1 -0
  303. package/dist/routing/types.d.ts +77 -25
  304. package/dist/routing/types.d.ts.map +1 -1
  305. package/dist/routing/walkers.d.ts +51 -0
  306. package/dist/routing/walkers.d.ts.map +1 -0
  307. package/dist/rsc-runtime/rsc.d.ts +1 -1
  308. package/dist/rsc-runtime/rsc.d.ts.map +1 -1
  309. package/dist/rsc-runtime/ssr.d.ts +12 -0
  310. package/dist/rsc-runtime/ssr.d.ts.map +1 -1
  311. package/dist/schema-bridge.d.ts +76 -0
  312. package/dist/schema-bridge.d.ts.map +1 -0
  313. package/dist/search-params/define.d.ts +157 -0
  314. package/dist/search-params/define.d.ts.map +1 -0
  315. package/dist/search-params/index.d.ts +4 -7
  316. package/dist/search-params/index.d.ts.map +1 -1
  317. package/dist/search-params/index.js +34 -441
  318. package/dist/search-params/index.js.map +1 -1
  319. package/dist/search-params/registry.d.ts +2 -2
  320. package/dist/search-params/registry.d.ts.map +1 -1
  321. package/dist/search-params/wrappers.d.ts +53 -0
  322. package/dist/search-params/wrappers.d.ts.map +1 -0
  323. package/dist/segment-params/define.d.ts +89 -0
  324. package/dist/segment-params/define.d.ts.map +1 -0
  325. package/dist/segment-params/index.d.ts +3 -0
  326. package/dist/segment-params/index.d.ts.map +1 -0
  327. package/dist/segment-params/index.js +2 -0
  328. package/dist/server/access-gate.d.ts +8 -3
  329. package/dist/server/access-gate.d.ts.map +1 -1
  330. package/dist/server/action-client.d.ts +41 -6
  331. package/dist/server/action-client.d.ts.map +1 -1
  332. package/dist/server/action-encryption.d.ts +76 -0
  333. package/dist/server/action-encryption.d.ts.map +1 -0
  334. package/dist/server/action-handler.d.ts +35 -1
  335. package/dist/server/action-handler.d.ts.map +1 -1
  336. package/dist/server/actions.d.ts +6 -14
  337. package/dist/server/actions.d.ts.map +1 -1
  338. package/dist/server/als-registry.d.ts +70 -11
  339. package/dist/server/als-registry.d.ts.map +1 -1
  340. package/dist/server/asset-headers.d.ts +1 -15
  341. package/dist/server/asset-headers.d.ts.map +1 -1
  342. package/dist/server/build-manifest.d.ts +8 -2
  343. package/dist/server/build-manifest.d.ts.map +1 -1
  344. package/dist/server/coalesce-tick.d.ts +40 -0
  345. package/dist/server/coalesce-tick.d.ts.map +1 -0
  346. package/dist/server/cookie-context.d.ts +170 -0
  347. package/dist/server/cookie-context.d.ts.map +1 -0
  348. package/dist/server/cookie-parsing.d.ts +51 -0
  349. package/dist/server/cookie-parsing.d.ts.map +1 -0
  350. package/dist/server/debug.d.ts +1 -1
  351. package/dist/server/default-logger.d.ts +22 -0
  352. package/dist/server/default-logger.d.ts.map +1 -0
  353. package/dist/server/deny-boundary.d.ts +90 -0
  354. package/dist/server/deny-boundary.d.ts.map +1 -0
  355. package/dist/server/deny-renderer.d.ts +1 -1
  356. package/dist/server/deny-renderer.d.ts.map +1 -1
  357. package/dist/server/dev-source-map.d.ts +22 -0
  358. package/dist/server/dev-source-map.d.ts.map +1 -0
  359. package/dist/server/early-hints-sender.d.ts.map +1 -1
  360. package/dist/server/early-hints.d.ts +13 -5
  361. package/dist/server/early-hints.d.ts.map +1 -1
  362. package/dist/server/error-boundary-wrapper.d.ts +7 -1
  363. package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
  364. package/dist/server/fallback-error.d.ts +12 -7
  365. package/dist/server/fallback-error.d.ts.map +1 -1
  366. package/dist/server/flight-injection-state.d.ts +66 -0
  367. package/dist/server/flight-injection-state.d.ts.map +1 -0
  368. package/dist/server/flight-scripts.d.ts +42 -0
  369. package/dist/server/flight-scripts.d.ts.map +1 -0
  370. package/dist/server/flush.d.ts.map +1 -1
  371. package/dist/server/form-data.d.ts +29 -0
  372. package/dist/server/form-data.d.ts.map +1 -1
  373. package/dist/server/html-injector-core.d.ts +213 -0
  374. package/dist/server/html-injector-core.d.ts.map +1 -0
  375. package/dist/server/html-injectors.d.ts +81 -41
  376. package/dist/server/html-injectors.d.ts.map +1 -1
  377. package/dist/server/index.d.ts +10 -46
  378. package/dist/server/index.d.ts.map +1 -1
  379. package/dist/server/index.js +155 -2905
  380. package/dist/server/index.js.map +1 -1
  381. package/dist/server/internal.d.ts +48 -0
  382. package/dist/server/internal.d.ts.map +1 -0
  383. package/dist/server/internal.js +3073 -0
  384. package/dist/server/internal.js.map +1 -0
  385. package/dist/server/logger.d.ts +39 -7
  386. package/dist/server/logger.d.ts.map +1 -1
  387. package/dist/server/metadata-routes.d.ts +23 -7
  388. package/dist/server/metadata-routes.d.ts.map +1 -1
  389. package/dist/server/middleware-runner.d.ts +36 -4
  390. package/dist/server/middleware-runner.d.ts.map +1 -1
  391. package/dist/server/node-stream-transforms.d.ts +112 -0
  392. package/dist/server/node-stream-transforms.d.ts.map +1 -0
  393. package/dist/server/param-coercion.d.ts +54 -0
  394. package/dist/server/param-coercion.d.ts.map +1 -0
  395. package/dist/server/pipeline-helpers.d.ts +95 -0
  396. package/dist/server/pipeline-helpers.d.ts.map +1 -0
  397. package/dist/server/pipeline-interception.d.ts +1 -1
  398. package/dist/server/pipeline-interception.d.ts.map +1 -1
  399. package/dist/server/pipeline-metadata.d.ts +6 -0
  400. package/dist/server/pipeline-metadata.d.ts.map +1 -1
  401. package/dist/server/pipeline-outcome.d.ts +49 -0
  402. package/dist/server/pipeline-outcome.d.ts.map +1 -0
  403. package/dist/server/pipeline-phases.d.ts +52 -0
  404. package/dist/server/pipeline-phases.d.ts.map +1 -0
  405. package/dist/server/pipeline.d.ts +118 -23
  406. package/dist/server/pipeline.d.ts.map +1 -1
  407. package/dist/server/port-resolution.d.ts +117 -0
  408. package/dist/server/port-resolution.d.ts.map +1 -0
  409. package/dist/server/primitives.d.ts +69 -18
  410. package/dist/server/primitives.d.ts.map +1 -1
  411. package/dist/server/render-timeout.d.ts +51 -0
  412. package/dist/server/render-timeout.d.ts.map +1 -0
  413. package/dist/server/request-context.d.ts +62 -107
  414. package/dist/server/request-context.d.ts.map +1 -1
  415. package/dist/server/route-element-builder.d.ts +28 -2
  416. package/dist/server/route-element-builder.d.ts.map +1 -1
  417. package/dist/server/route-handler.d.ts.map +1 -1
  418. package/dist/server/route-matcher.d.ts +25 -36
  419. package/dist/server/route-matcher.d.ts.map +1 -1
  420. package/dist/server/rsc-entry/action-middleware-runner.d.ts +66 -0
  421. package/dist/server/rsc-entry/action-middleware-runner.d.ts.map +1 -0
  422. package/dist/server/rsc-entry/api-handler.d.ts +2 -2
  423. package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
  424. package/dist/server/rsc-entry/error-renderer.d.ts +26 -13
  425. package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
  426. package/dist/server/rsc-entry/helpers.d.ts +50 -6
  427. package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
  428. package/dist/server/rsc-entry/index.d.ts +19 -8
  429. package/dist/server/rsc-entry/index.d.ts.map +1 -1
  430. package/dist/server/rsc-entry/render-route.d.ts +50 -0
  431. package/dist/server/rsc-entry/render-route.d.ts.map +1 -0
  432. package/dist/server/rsc-entry/rsc-payload.d.ts +3 -3
  433. package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
  434. package/dist/server/rsc-entry/rsc-stream.d.ts +17 -1
  435. package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
  436. package/dist/server/rsc-entry/ssr-bridge.d.ts +5 -1
  437. package/dist/server/rsc-entry/ssr-bridge.d.ts.map +1 -1
  438. package/dist/server/rsc-entry/ssr-renderer.d.ts +19 -4
  439. package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
  440. package/dist/server/rsc-entry/wrap-action-dispatch.d.ts +119 -0
  441. package/dist/server/rsc-entry/wrap-action-dispatch.d.ts.map +1 -0
  442. package/dist/server/safe-load.d.ts +46 -0
  443. package/dist/server/safe-load.d.ts.map +1 -0
  444. package/dist/server/sensitive-fields.d.ts +74 -0
  445. package/dist/server/sensitive-fields.d.ts.map +1 -0
  446. package/dist/server/sitemap-generator.d.ts +129 -0
  447. package/dist/server/sitemap-generator.d.ts.map +1 -0
  448. package/dist/server/sitemap-handler.d.ts +22 -0
  449. package/dist/server/sitemap-handler.d.ts.map +1 -0
  450. package/dist/server/slot-resolver.d.ts +1 -1
  451. package/dist/server/slot-resolver.d.ts.map +1 -1
  452. package/dist/server/ssr-bridge-types.d.ts +121 -0
  453. package/dist/server/ssr-bridge-types.d.ts.map +1 -0
  454. package/dist/server/ssr-entry.d.ts +2 -43
  455. package/dist/server/ssr-entry.d.ts.map +1 -1
  456. package/dist/server/ssr-render.d.ts +64 -21
  457. package/dist/server/ssr-render.d.ts.map +1 -1
  458. package/dist/server/ssr-wrappers.d.ts +50 -0
  459. package/dist/server/ssr-wrappers.d.ts.map +1 -0
  460. package/dist/server/state-tree-diff.d.ts +12 -5
  461. package/dist/server/state-tree-diff.d.ts.map +1 -1
  462. package/dist/server/status-code-resolver.d.ts +16 -11
  463. package/dist/server/status-code-resolver.d.ts.map +1 -1
  464. package/dist/server/stream-utils.d.ts +36 -0
  465. package/dist/server/stream-utils.d.ts.map +1 -0
  466. package/dist/server/tracing.d.ts +5 -5
  467. package/dist/server/tracing.d.ts.map +1 -1
  468. package/dist/server/tree-builder.d.ts +62 -30
  469. package/dist/server/tree-builder.d.ts.map +1 -1
  470. package/dist/server/tree-match.d.ts +49 -0
  471. package/dist/server/tree-match.d.ts.map +1 -0
  472. package/dist/server/types.d.ts +49 -4
  473. package/dist/server/types.d.ts.map +1 -1
  474. package/dist/server/utils/escape-html.d.ts +14 -0
  475. package/dist/server/utils/escape-html.d.ts.map +1 -0
  476. package/dist/server/version-skew.d.ts +61 -0
  477. package/dist/server/version-skew.d.ts.map +1 -0
  478. package/dist/shared/merge-search-params.d.ts +22 -0
  479. package/dist/shared/merge-search-params.d.ts.map +1 -0
  480. package/dist/shims/font-google.d.ts +1 -1
  481. package/dist/shims/font-google.d.ts.map +1 -1
  482. package/dist/shims/font-google.js +42 -0
  483. package/dist/shims/font-google.js.map +1 -0
  484. package/dist/shims/font-local.d.ts +26 -0
  485. package/dist/shims/font-local.d.ts.map +1 -0
  486. package/dist/shims/font-local.js +20 -0
  487. package/dist/shims/font-local.js.map +1 -0
  488. package/dist/shims/headers.d.ts +2 -1
  489. package/dist/shims/headers.d.ts.map +1 -1
  490. package/dist/shims/navigation-client.d.ts +3 -1
  491. package/dist/shims/navigation-client.d.ts.map +1 -1
  492. package/dist/shims/navigation.d.ts +11 -5
  493. package/dist/shims/navigation.d.ts.map +1 -1
  494. package/dist/utils/state-machine.d.ts +80 -0
  495. package/dist/utils/state-machine.d.ts.map +1 -0
  496. package/package.json +56 -16
  497. package/src/adapters/build-output-helper.ts +139 -0
  498. package/src/adapters/cloudflare-dev.ts +177 -0
  499. package/src/adapters/cloudflare-kv-cache.ts +142 -0
  500. package/src/adapters/cloudflare.ts +350 -76
  501. package/src/adapters/compress-module.ts +24 -4
  502. package/src/adapters/nitro.ts +142 -59
  503. package/src/adapters/shared.ts +40 -0
  504. package/src/adapters/wrangler.d.ts +7 -0
  505. package/src/cache/cache-api.ts +38 -0
  506. package/src/cache/handler-store.ts +68 -0
  507. package/src/cache/index.ts +81 -18
  508. package/src/cache/singleflight.ts +62 -4
  509. package/src/cache/sizeof.ts +33 -0
  510. package/src/cache/timber-cache.ts +25 -20
  511. package/src/cli-schema-sync.ts +295 -0
  512. package/src/cli.ts +76 -8
  513. package/src/client/browser-dev.ts +153 -1
  514. package/src/client/browser-entry/action-dispatch.ts +125 -0
  515. package/src/client/browser-entry/hmr.ts +81 -0
  516. package/src/client/browser-entry/hydrate.ts +153 -0
  517. package/src/client/browser-entry/index.ts +151 -0
  518. package/src/client/browser-entry/post-hydration.ts +113 -0
  519. package/src/client/browser-entry/router-init.ts +219 -0
  520. package/src/client/browser-entry/rsc-stream.ts +157 -0
  521. package/src/client/browser-entry/scroll.ts +27 -0
  522. package/src/client/error-boundary.tsx +99 -22
  523. package/src/client/error-reconstituter.tsx +65 -0
  524. package/src/client/form.tsx +31 -32
  525. package/src/client/history.ts +26 -4
  526. package/src/client/index.ts +66 -45
  527. package/src/client/internal.ts +58 -0
  528. package/src/client/link-pending-store.ts +116 -0
  529. package/src/client/link.tsx +336 -119
  530. package/src/client/nav-link-store.ts +37 -0
  531. package/src/client/navigation-api-types.ts +112 -0
  532. package/src/client/navigation-api.ts +332 -0
  533. package/src/client/navigation-context.ts +33 -7
  534. package/src/client/navigation-root.tsx +347 -0
  535. package/src/client/nuqs-adapter.tsx +16 -3
  536. package/src/client/router-ref.ts +1 -1
  537. package/src/client/router.ts +418 -128
  538. package/src/client/rsc-fetch.ts +208 -10
  539. package/src/client/segment-cache.ts +6 -3
  540. package/src/client/segment-outlet.tsx +77 -0
  541. package/src/client/segment-update-context.ts +42 -0
  542. package/src/client/shallow-url.ts +22 -0
  543. package/src/client/ssr-data.ts +13 -5
  544. package/src/client/stale-reload.ts +72 -3
  545. package/src/client/state.ts +2 -2
  546. package/src/client/top-loader.tsx +11 -9
  547. package/src/client/use-cookie.ts +31 -2
  548. package/src/client/use-link-status.ts +7 -7
  549. package/src/client/use-pending-navigation.ts +40 -0
  550. package/src/client/use-query-states.ts +9 -3
  551. package/src/client/use-router.ts +1 -1
  552. package/src/client/use-search-params.ts +25 -44
  553. package/src/client/{use-params.ts → use-segment-params.ts} +8 -6
  554. package/src/codec.ts +147 -0
  555. package/src/config-types.ts +292 -0
  556. package/src/config-validation.ts +303 -0
  557. package/src/content/index.ts +5 -13
  558. package/src/cookies/define-cookie.ts +233 -53
  559. package/src/cookies/index.ts +12 -1
  560. package/src/cookies/json-cookie.ts +105 -0
  561. package/src/cookies/validation.ts +134 -0
  562. package/src/dev-tools/404-page.ts +387 -0
  563. package/src/dev-tools/browser-logs.ts +291 -0
  564. package/src/dev-tools/error-page.ts +506 -0
  565. package/src/dev-tools/holding-server.ts +187 -0
  566. package/src/dev-tools/index.ts +90 -0
  567. package/src/dev-tools/instrumentation.ts +176 -0
  568. package/src/{plugins/dev-logs.ts → dev-tools/logs.ts} +9 -5
  569. package/src/dev-tools/overlay.ts +469 -0
  570. package/src/dev-tools/stack-classifier.ts +75 -0
  571. package/src/dev-tools/terminal.ts +183 -0
  572. package/src/{server/dev-warnings.ts → dev-tools/warnings.ts} +5 -50
  573. package/src/fonts/ast.ts +525 -16
  574. package/src/fonts/bundle.ts +142 -0
  575. package/src/fonts/dev-middleware.ts +74 -0
  576. package/src/fonts/local.ts +1 -1
  577. package/src/fonts/pipeline.ts +314 -0
  578. package/src/fonts/transform.ts +317 -0
  579. package/src/fonts/types.ts +50 -1
  580. package/src/fonts/virtual-modules.ts +233 -0
  581. package/src/index.ts +411 -329
  582. package/src/params/codec-registry.ts +34 -0
  583. package/src/params/define-schema.ts +114 -0
  584. package/src/params/index.ts +17 -0
  585. package/src/params/resolve-schema.ts +116 -0
  586. package/src/plugin-context.ts +240 -0
  587. package/src/plugins/adapter-build.ts +12 -4
  588. package/src/plugins/build-manifest.ts +69 -6
  589. package/src/plugins/build-report.ts +16 -25
  590. package/src/plugins/client-chunks.ts +65 -0
  591. package/src/plugins/cloudflare-wasm.ts +103 -0
  592. package/src/plugins/content.ts +1 -1
  593. package/src/plugins/dev-server.ts +179 -37
  594. package/src/plugins/entries.ts +111 -8
  595. package/src/plugins/fonts.ts +165 -654
  596. package/src/plugins/mdx.ts +47 -10
  597. package/src/plugins/routing.ts +386 -47
  598. package/src/plugins/server-bundle.ts +59 -3
  599. package/src/plugins/shims.ts +136 -35
  600. package/src/plugins/static-build.ts +15 -89
  601. package/src/routing/codegen-shared.ts +115 -0
  602. package/src/routing/codegen-types.ts +61 -0
  603. package/src/routing/codegen.ts +321 -177
  604. package/src/routing/convention-lint.ts +357 -0
  605. package/src/routing/index.ts +10 -1
  606. package/src/routing/interception.ts +1 -1
  607. package/src/routing/link-codegen.ts +308 -0
  608. package/src/routing/scanner.ts +165 -110
  609. package/src/routing/schema-validation.ts +149 -0
  610. package/src/routing/segment-classify.ts +188 -0
  611. package/src/routing/segment-codegen.ts +98 -0
  612. package/src/routing/types.ts +78 -25
  613. package/src/routing/walkers.ts +90 -0
  614. package/src/rsc-runtime/rsc.ts +2 -0
  615. package/src/rsc-runtime/ssr.ts +50 -0
  616. package/src/rsc-runtime/vendor-types.d.ts +7 -0
  617. package/src/{search-params/codecs.ts → schema-bridge.ts} +57 -20
  618. package/src/search-params/define.ts +538 -0
  619. package/src/search-params/index.ts +14 -20
  620. package/src/search-params/registry.ts +2 -2
  621. package/src/search-params/wrappers.ts +92 -0
  622. package/src/segment-params/define.ts +309 -0
  623. package/src/segment-params/index.ts +9 -0
  624. package/src/server/access-gate.tsx +76 -34
  625. package/src/server/action-client.ts +88 -15
  626. package/src/server/action-encryption.ts +144 -0
  627. package/src/server/action-handler.ts +112 -14
  628. package/src/server/actions.ts +14 -23
  629. package/src/server/als-registry.ts +108 -20
  630. package/src/server/asset-headers.ts +8 -34
  631. package/src/server/build-manifest.ts +17 -4
  632. package/src/server/coalesce-tick.ts +75 -0
  633. package/src/server/compress.ts +25 -7
  634. package/src/server/cookie-context.ts +468 -0
  635. package/src/server/cookie-parsing.ts +135 -0
  636. package/src/server/debug.ts +1 -1
  637. package/src/server/default-logger.ts +99 -0
  638. package/src/server/deny-boundary.ts +218 -0
  639. package/src/server/deny-renderer.ts +32 -51
  640. package/src/server/dev-source-map.ts +31 -0
  641. package/src/server/early-hints-sender.ts +3 -2
  642. package/src/server/early-hints.ts +36 -15
  643. package/src/server/error-boundary-wrapper.ts +74 -22
  644. package/src/server/fallback-error.ts +74 -102
  645. package/src/server/flight-injection-state.ts +113 -0
  646. package/src/server/flight-scripts.ts +62 -0
  647. package/src/server/flush.ts +2 -1
  648. package/src/server/form-data.ts +101 -5
  649. package/src/server/html-injector-core.ts +417 -0
  650. package/src/server/html-injectors.ts +235 -223
  651. package/src/server/index.ts +29 -183
  652. package/src/server/internal.ts +182 -0
  653. package/src/server/logger.ts +67 -36
  654. package/src/server/metadata-routes.ts +44 -19
  655. package/src/server/middleware-runner.ts +75 -4
  656. package/src/server/node-stream-transforms.ts +361 -0
  657. package/src/server/param-coercion.ts +206 -0
  658. package/src/server/pipeline-helpers.ts +204 -0
  659. package/src/server/pipeline-interception.ts +31 -18
  660. package/src/server/pipeline-metadata.ts +13 -0
  661. package/src/server/pipeline-outcome.ts +197 -0
  662. package/src/server/pipeline-phases.ts +497 -0
  663. package/src/server/pipeline.ts +194 -394
  664. package/src/server/port-resolution.ts +215 -0
  665. package/src/server/primitives.ts +111 -28
  666. package/src/server/render-timeout.ts +108 -0
  667. package/src/server/request-context.ts +168 -337
  668. package/src/server/route-element-builder.ts +435 -208
  669. package/src/server/route-handler.ts +24 -4
  670. package/src/server/route-matcher.ts +128 -277
  671. package/src/server/rsc-entry/action-middleware-runner.ts +167 -0
  672. package/src/server/rsc-entry/api-handler.ts +16 -17
  673. package/src/server/rsc-entry/error-renderer.ts +315 -89
  674. package/src/server/rsc-entry/helpers.ts +155 -26
  675. package/src/server/rsc-entry/index.ts +316 -327
  676. package/src/server/rsc-entry/render-route.ts +313 -0
  677. package/src/server/rsc-entry/rsc-payload.ts +65 -18
  678. package/src/server/rsc-entry/rsc-stream.ts +85 -13
  679. package/src/server/rsc-entry/ssr-bridge.ts +18 -5
  680. package/src/server/rsc-entry/ssr-renderer.ts +195 -41
  681. package/src/server/rsc-entry/wrap-action-dispatch.ts +449 -0
  682. package/src/server/safe-load.ts +60 -0
  683. package/src/server/sensitive-fields.ts +230 -0
  684. package/src/server/sitemap-generator.ts +338 -0
  685. package/src/server/sitemap-handler.ts +126 -0
  686. package/src/server/slot-resolver.ts +228 -246
  687. package/src/server/ssr-bridge-types.ts +124 -0
  688. package/src/server/ssr-entry.ts +217 -78
  689. package/src/server/ssr-render.ts +344 -71
  690. package/src/server/ssr-wrappers.tsx +139 -0
  691. package/src/server/state-tree-diff.ts +30 -23
  692. package/src/server/status-code-resolver.ts +112 -128
  693. package/src/server/stream-utils.ts +213 -0
  694. package/src/server/tracing.ts +21 -10
  695. package/src/server/tree-builder.ts +202 -90
  696. package/src/server/tree-match.ts +210 -0
  697. package/src/server/types.ts +55 -6
  698. package/src/server/utils/escape-html.ts +20 -0
  699. package/src/server/version-skew.ts +104 -0
  700. package/src/shared/merge-search-params.ts +55 -0
  701. package/src/shims/font-google.ts +1 -1
  702. package/src/shims/font-local.ts +34 -0
  703. package/src/shims/headers.ts +5 -1
  704. package/src/shims/navigation-client.ts +4 -3
  705. package/src/shims/navigation.ts +14 -7
  706. package/src/utils/state-machine.ts +111 -0
  707. package/dist/_chunks/als-registry-B7DbZ2hS.js +0 -41
  708. package/dist/_chunks/als-registry-B7DbZ2hS.js.map +0 -1
  709. package/dist/_chunks/debug-gwlJkDuf.js +0 -108
  710. package/dist/_chunks/debug-gwlJkDuf.js.map +0 -1
  711. package/dist/_chunks/format-DviM89f0.js.map +0 -1
  712. package/dist/_chunks/interception-BOoWmLUA.js +0 -676
  713. package/dist/_chunks/interception-BOoWmLUA.js.map +0 -1
  714. package/dist/_chunks/metadata-routes-Cjmvi3rQ.js.map +0 -1
  715. package/dist/_chunks/request-context-DIkVh_jG.js +0 -330
  716. package/dist/_chunks/request-context-DIkVh_jG.js.map +0 -1
  717. package/dist/_chunks/ssr-data-MjmprTmO.js.map +0 -1
  718. package/dist/_chunks/tracing-CemImE6h.js +0 -187
  719. package/dist/_chunks/tracing-CemImE6h.js.map +0 -1
  720. package/dist/_chunks/use-cookie-DX-l1_5E.js +0 -91
  721. package/dist/_chunks/use-cookie-DX-l1_5E.js.map +0 -1
  722. package/dist/_chunks/use-query-states-D5KaffOK.js.map +0 -1
  723. package/dist/cache/register-cached-function.d.ts +0 -17
  724. package/dist/cache/register-cached-function.d.ts.map +0 -1
  725. package/dist/client/browser-entry.d.ts +0 -21
  726. package/dist/client/browser-entry.d.ts.map +0 -1
  727. package/dist/client/link-status-provider.d.ts +0 -11
  728. package/dist/client/link-status-provider.d.ts.map +0 -1
  729. package/dist/client/segment-merger.d.ts +0 -119
  730. package/dist/client/segment-merger.d.ts.map +0 -1
  731. package/dist/client/transition-root.d.ts.map +0 -1
  732. package/dist/client/use-navigation-pending.d.ts +0 -26
  733. package/dist/client/use-navigation-pending.d.ts.map +0 -1
  734. package/dist/client/use-params.d.ts.map +0 -1
  735. package/dist/plugins/cache-transform.d.ts +0 -36
  736. package/dist/plugins/cache-transform.d.ts.map +0 -1
  737. package/dist/plugins/dev-error-overlay.d.ts +0 -60
  738. package/dist/plugins/dev-error-overlay.d.ts.map +0 -1
  739. package/dist/plugins/dev-logs.d.ts.map +0 -1
  740. package/dist/plugins/dynamic-transform.d.ts +0 -72
  741. package/dist/plugins/dynamic-transform.d.ts.map +0 -1
  742. package/dist/plugins/server-action-exports.d.ts +0 -26
  743. package/dist/plugins/server-action-exports.d.ts.map +0 -1
  744. package/dist/routing/status-file-lint.d.ts +0 -33
  745. package/dist/routing/status-file-lint.d.ts.map +0 -1
  746. package/dist/search-params/analyze.d.ts +0 -54
  747. package/dist/search-params/analyze.d.ts.map +0 -1
  748. package/dist/search-params/builtin-codecs.d.ts +0 -105
  749. package/dist/search-params/builtin-codecs.d.ts.map +0 -1
  750. package/dist/search-params/codecs.d.ts +0 -53
  751. package/dist/search-params/codecs.d.ts.map +0 -1
  752. package/dist/search-params/create.d.ts +0 -106
  753. package/dist/search-params/create.d.ts.map +0 -1
  754. package/dist/server/dev-fetch-instrumentation.d.ts +0 -22
  755. package/dist/server/dev-fetch-instrumentation.d.ts.map +0 -1
  756. package/dist/server/dev-logger.d.ts.map +0 -1
  757. package/dist/server/dev-span-processor.d.ts.map +0 -1
  758. package/dist/server/dev-warnings.d.ts.map +0 -1
  759. package/dist/server/manifest-status-resolver.d.ts +0 -58
  760. package/dist/server/manifest-status-resolver.d.ts.map +0 -1
  761. package/dist/server/prerender.d.ts +0 -77
  762. package/dist/server/prerender.d.ts.map +0 -1
  763. package/dist/utils/directive-parser.d.ts +0 -70
  764. package/dist/utils/directive-parser.d.ts.map +0 -1
  765. package/src/cache/register-cached-function.ts +0 -103
  766. package/src/client/browser-entry.ts +0 -678
  767. package/src/client/link-status-provider.tsx +0 -30
  768. package/src/client/segment-merger.ts +0 -339
  769. package/src/client/transition-root.tsx +0 -166
  770. package/src/client/use-navigation-pending.ts +0 -38
  771. package/src/plugins/cache-transform.ts +0 -199
  772. package/src/plugins/dev-error-overlay.ts +0 -230
  773. package/src/plugins/dynamic-transform.ts +0 -161
  774. package/src/plugins/server-action-exports.ts +0 -220
  775. package/src/routing/status-file-lint.ts +0 -112
  776. package/src/search-params/analyze.ts +0 -192
  777. package/src/search-params/builtin-codecs.ts +0 -228
  778. package/src/search-params/create.ts +0 -321
  779. package/src/server/dev-fetch-instrumentation.ts +0 -96
  780. package/src/server/dev-span-processor.ts +0 -78
  781. package/src/server/manifest-status-resolver.ts +0 -215
  782. package/src/server/prerender.ts +0 -139
  783. package/src/utils/directive-parser.ts +0 -529
  784. /package/src/{server/dev-logger.ts → dev-tools/logger.ts} +0 -0
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Link Pending Store — per-link pending state.
3
+ *
4
+ * Tracks which link instance is currently navigating so that only the
5
+ * clicked link shows pending. Uses useState in Link — the pending
6
+ * state is set as an urgent update (outside startTransition) so it
7
+ * shows immediately, then reset inside the transition so it commits
8
+ * atomically with the new tree.
9
+ *
10
+ * Flow:
11
+ * 1. Link click → setLinkForCurrentNavigation(instance) stores the ref
12
+ * 2. NavigationRoot → activateLinkPending() calls
13
+ * instance.setIsPending(LINK_PENDING) as an urgent update
14
+ * 3. Inside startTransition → resetLinkPending() commits with new tree
15
+ *
16
+ * SINGLETON GUARANTEE: Uses `globalThis` via `Symbol.for` keys because
17
+ * the RSC client bundler can duplicate this module across chunks.
18
+ *
19
+ * See design/19-client-navigation.md §"Per-Link Pending State"
20
+ */
21
+
22
+ import type { LinkStatus } from './use-link-status.js';
23
+
24
+ // ─── Types ───────────────────────────────────────────────────────
25
+
26
+ export interface LinkPendingInstance {
27
+ setIsPending: (status: LinkStatus) => void;
28
+ }
29
+
30
+ // ─── Constants ───────────────────────────────────────────────────
31
+
32
+ const LINK_PENDING_KEY = Symbol.for('__timber_link_pending');
33
+
34
+ /** Status object: link navigation in flight */
35
+ export const LINK_PENDING: LinkStatus = { isPending: true };
36
+
37
+ /** Status object: link idle */
38
+ export const LINK_IDLE: LinkStatus = { isPending: false };
39
+
40
+ // ─── Singleton Storage ───────────────────────────────────────────
41
+
42
+ function getStore(): { current: LinkPendingInstance | null } {
43
+ const g = globalThis as Record<symbol, unknown>;
44
+ if (!g[LINK_PENDING_KEY]) {
45
+ g[LINK_PENDING_KEY] = { current: null };
46
+ }
47
+ return g[LINK_PENDING_KEY] as { current: LinkPendingInstance | null };
48
+ }
49
+
50
+ // ─── Public API ──────────────────────────────────────────────────
51
+
52
+ /**
53
+ * Register the link instance that initiated the current navigation.
54
+ * Called from Link's click handler. Does NOT call setIsPending —
55
+ * that happens via activateLinkPending() called from NavigationRoot.
56
+ *
57
+ * Resets the previous link to idle immediately if a different link
58
+ * is being registered (handles overlapping link clicks).
59
+ */
60
+ export function setLinkForCurrentNavigation(link: LinkPendingInstance | null): void {
61
+ const store = getStore();
62
+ if (store.current && store.current !== link) {
63
+ store.current.setIsPending(LINK_IDLE);
64
+ }
65
+ store.current = link;
66
+ }
67
+
68
+ /**
69
+ * Activate pending state on the current link instance.
70
+ * Called as an urgent update (outside startTransition) so the link
71
+ * shows pending immediately. The corresponding resetLinkPending()
72
+ * is called inside the transition so it commits atomically with
73
+ * the new tree.
74
+ */
75
+ export function activateLinkPending(): void {
76
+ const store = getStore();
77
+ store.current?.setIsPending(LINK_PENDING);
78
+ }
79
+
80
+ /**
81
+ * Reset the current link's pending state and clear the store.
82
+ * Call inside startTransition so the reset commits atomically
83
+ * with the new tree (no frame where pending=false but old content
84
+ * is still visible).
85
+ */
86
+ export function resetLinkPending(): void {
87
+ const store = getStore();
88
+ if (store.current) {
89
+ store.current.setIsPending(LINK_IDLE);
90
+ store.current = null;
91
+ }
92
+ }
93
+
94
+ /**
95
+ * @deprecated No longer needed with useOptimistic. Kept for callers.
96
+ */
97
+ export function getCurrentNavId(): number {
98
+ return 0;
99
+ }
100
+
101
+ /**
102
+ * Clean up the link pending store entirely.
103
+ */
104
+ export function clearLinkPendingSetter(): void {
105
+ getStore().current = null;
106
+ }
107
+
108
+ /**
109
+ * Unmount a link instance from navigation tracking.
110
+ */
111
+ export function unmountLinkForCurrentNavigation(link: LinkPendingInstance): void {
112
+ const store = getStore();
113
+ if (store.current === link) {
114
+ store.current = null;
115
+ }
116
+ }
@@ -18,10 +18,41 @@
18
18
  // - params and fully-resolved string href are mutually exclusive
19
19
  // - searchParams and inline query string are mutually exclusive
20
20
 
21
- import type { AnchorHTMLAttributes, ReactNode, MouseEvent as ReactMouseEvent } from 'react';
22
- import type { SearchParamsDefinition } from '#/search-params/create.js';
23
- import { LinkStatusProvider } from './link-status-provider.js';
21
+ import {
22
+ useTransition,
23
+ type AnchorHTMLAttributes,
24
+ type ReactNode,
25
+ type MouseEvent as ReactMouseEvent,
26
+ } from 'react';
27
+ import type { SearchParamsDefinition } from '../search-params/define.js';
28
+ import { getSearchParamsDefinition } from '../search-params/registry.js';
29
+ import type { LinkFunction } from './index.js';
30
+ import { classifyUrlSegment, type UrlSegment } from '../routing/segment-classify.js';
31
+ import { LinkStatusContext } from './use-link-status.js';
24
32
  import { getRouterOrNull } from './router-ref.js';
33
+ import { getSsrData } from './ssr-data.js';
34
+ import { mergePreservedSearchParams } from '../shared/merge-search-params.js';
35
+ import { getLinkCodec } from '../params/codec-registry.js';
36
+ import type { LinkStatus } from './use-link-status.js';
37
+
38
+ const LINK_PENDING: LinkStatus = { isPending: true };
39
+ const LINK_IDLE: LinkStatus = { isPending: false };
40
+
41
+ // ─── Current Search Params ────────────────────────────────────────
42
+
43
+ /**
44
+ * Read the current URL's search string without requiring a React hook.
45
+ * On the client, reads window.location.search. During SSR, reads from
46
+ * the request context (getSsrData). Returns empty string if unavailable.
47
+ */
48
+ function getCurrentSearch(): string {
49
+ if (typeof window !== 'undefined') return window.location.search;
50
+ const data = getSsrData();
51
+ if (!data) return '';
52
+ const sp = new URLSearchParams(data.searchParams);
53
+ const str = sp.toString();
54
+ return str ? `?${str}` : '';
55
+ }
25
56
 
26
57
  // ─── Types ───────────────────────────────────────────────────────
27
58
 
@@ -33,8 +64,12 @@ export type OnNavigateHandler = (e: OnNavigateEvent) => void;
33
64
 
34
65
  /**
35
66
  * Base props shared by all Link variants.
67
+ *
68
+ * Exported so the public `LinkFunction` interface (declared in
69
+ * `./index.ts`, where module augmentation can merge into it) can
70
+ * compose this without duplication.
36
71
  */
37
- interface LinkBaseProps extends Omit<AnchorHTMLAttributes<HTMLAnchorElement>, 'href'> {
72
+ export interface LinkBaseProps extends Omit<AnchorHTMLAttributes<HTMLAnchorElement>, 'href'> {
38
73
  /** Prefetch the RSC payload on hover */
39
74
  prefetch?: boolean;
40
75
  /**
@@ -42,6 +77,20 @@ interface LinkBaseProps extends Omit<AnchorHTMLAttributes<HTMLAnchorElement>, 'h
42
77
  * Set to false for tabbed interfaces where content changes within a fixed layout.
43
78
  */
44
79
  scroll?: boolean;
80
+ /**
81
+ * Preserve search params from the current URL across navigation.
82
+ *
83
+ * - `true` — preserve ALL current search params (target params take precedence)
84
+ * - `string[]` — preserve only the named params (e.g. `['private', 'token']`)
85
+ *
86
+ * Useful for route-group gating where a search param (e.g. `?private=access`)
87
+ * must persist across internal navigations. The target href's own search params
88
+ * always take precedence over preserved ones.
89
+ *
90
+ * During SSR, reads search params from the request context. On the client,
91
+ * reads from the current URL and updates reactively when the URL changes.
92
+ */
93
+ preserveSearchParams?: true | string[];
45
94
  /**
46
95
  * Called before client-side navigation commits. Call `e.preventDefault()`
47
96
  * to cancel the default navigation — the caller is then responsible for
@@ -54,48 +103,70 @@ interface LinkBaseProps extends Omit<AnchorHTMLAttributes<HTMLAnchorElement>, 'h
54
103
  children?: ReactNode;
55
104
  }
56
105
 
106
+ // ─── Typed Link Props ────────────────────────────────────────────
107
+
57
108
  /**
58
- * Link with a fully-resolved string href.
59
- * When using a string href with params already interpolated,
60
- * the params prop is not available.
109
+ * Widen server-side string params to string | number for Link convenience.
110
+ * Exported for use by codegen-generated overloads.
61
111
  */
62
- export interface LinkPropsWithHref extends LinkBaseProps {
63
- href: string;
64
- params?: never;
65
- /**
66
- * Typed search params — serialized via the route's SearchParamsDefinition.
67
- * Mutually exclusive with an inline query string in href.
68
- */
69
- searchParams?: {
70
- definition: SearchParamsDefinition<Record<string, unknown>>;
71
- values: Record<string, unknown>;
72
- };
73
- }
112
+ export type LinkSegmentParams<T> = {
113
+ [K in keyof T]: [string] extends [T[K]] ? string | number : T[K];
114
+ };
115
+
116
+ // ─── External Href Types ─────────────────────────────────────────
117
+ //
118
+ // `ExternalHref` and the public `LinkFunction` interface live in
119
+ // `./index.ts` rather than this file. They MUST be originally declared
120
+ // in the same module that the codegen augments (`@timber-js/app/client`)
121
+ // so that codegen-generated per-route call signatures merge with the
122
+ // same interface that types the `Link` constant. Re-exporting an
123
+ // interface via `export type {}` does NOT participate in module
124
+ // augmentation merging — only originally-declared interfaces do.
125
+ // See TIM-624.
126
+
127
+ // ─── searchParams prop shapes ────────────────────────────────────
128
+ //
129
+ // Per-route Link overloads (emitted by codegen) pass the flat values shape:
130
+ // searchParams={{ page: 2, q: 'boots' }}
131
+ // The framework looks up the route's SearchParamsDefinition from the
132
+ // search-params registry at runtime (see TIM-830).
133
+ //
134
+ // The catch-all overload in client/index.ts (external/computed hrefs)
135
+ // additionally accepts the legacy wrapped shape:
136
+ // searchParams={{ definition: def, values: { page: 2 } }}
137
+ // because there is no way to look up a definition from a computed string.
138
+ //
139
+ // `resolveHref` discriminates at runtime by presence of a `definition` key.
140
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
141
+ export type ParamValue = string | number | string[] | { toString(): string; [key: string]: any };
142
+
143
+ type WrappedSearchParamsProp = {
144
+ definition: SearchParamsDefinition<Record<string, unknown>>;
145
+ values: Record<string, unknown>;
146
+ };
147
+ type FlatSearchParamsProp = Record<string, unknown>;
148
+ type LinkSearchParamsProp = WrappedSearchParamsProp | FlatSearchParamsProp;
74
149
 
75
150
  /**
76
- * Link with a route pattern + params for interpolation.
77
- * e.g. <Link href="/products/[id]" params={{ id: "123" }}>
78
- * <Link href="/products/[id]" params={{ id: 123 }}>
151
+ * Runtime-only loose props used internally by the Link implementation.
152
+ * Not exposed to callers — the public API uses LinkFunction.
79
153
  */
80
- export interface LinkPropsWithParams extends LinkBaseProps {
81
- /** Route pattern with dynamic segments (e.g. "/products/[id]") */
154
+ interface LinkRuntimeProps extends LinkBaseProps {
82
155
  href: string;
83
- /**
84
- * Dynamic segment values to interpolate into the href.
85
- * Single dynamic segments accept string | number (numbers are stringified).
86
- * Catch-all segments accept string[].
87
- */
88
- params: Record<string, string | number | string[]>;
89
- /**
90
- * Typed search params — serialized via the route's SearchParamsDefinition.
91
- */
92
- searchParams?: {
93
- definition: SearchParamsDefinition<Record<string, unknown>>;
94
- values: Record<string, unknown>;
95
- };
156
+ segmentParams?: Record<string, ParamValue>;
157
+ searchParams?: LinkSearchParamsProp;
96
158
  }
97
159
 
98
- export type LinkProps = LinkPropsWithHref | LinkPropsWithParams;
160
+ // Legacy exports for backward compat (used by buildLinkProps, tests, etc.)
161
+ export type LinkPropsWithHref = LinkBaseProps & {
162
+ href: string;
163
+ segmentParams?: never;
164
+ searchParams?: LinkSearchParamsProp;
165
+ };
166
+ export type LinkPropsWithParams = LinkRuntimeProps & {
167
+ segmentParams: Record<string, ParamValue>;
168
+ };
169
+ export type LinkProps = LinkRuntimeProps;
99
170
 
100
171
  // ─── Dangerous URL Scheme Detection ──────────────────────────────
101
172
 
@@ -141,57 +212,111 @@ export function isInternalHref(href: string): boolean {
141
212
  * - [...param] → catch-all (joined with /)
142
213
  * - [[...param]] → optional catch-all (omitted if undefined/empty)
143
214
  */
144
- export function interpolateParams(
145
- pattern: string,
146
- params: Record<string, string | number | string[]>
147
- ): string {
148
- return (
149
- pattern
150
- .replace(
151
- /\[\[\.\.\.(\w+)\]\]|\[\.\.\.(\w+)\]|\[(\w+)\]/g,
152
- (_match, optionalCatchAll, catchAll, single) => {
153
- if (optionalCatchAll) {
154
- const value = params[optionalCatchAll];
155
- if (value === undefined || (Array.isArray(value) && value.length === 0)) {
156
- return '';
157
- }
158
- const segments = Array.isArray(value) ? value : [value];
159
- return segments.map(encodeURIComponent).join('/');
160
- }
215
+ /**
216
+ * Parse a route pattern's path portion into classified segments.
217
+ * Exported for testing. Uses the shared character-based classifier.
218
+ */
219
+ export function parseSegments(pattern: string): UrlSegment[] {
220
+ return pattern.split('/').filter(Boolean).map(classifyUrlSegment);
221
+ }
161
222
 
162
- if (catchAll) {
163
- const value = params[catchAll];
164
- if (value === undefined) {
165
- throw new Error(
166
- `<Link> missing required catch-all param "${catchAll}" for pattern "${pattern}".`
167
- );
168
- }
169
- const segments = Array.isArray(value) ? value : [value];
170
- if (segments.length === 0) {
171
- throw new Error(
172
- `<Link> catch-all param "${catchAll}" must have at least one segment for pattern "${pattern}".`
173
- );
174
- }
175
- return segments.map(encodeURIComponent).join('/');
176
- }
223
+ /**
224
+ * Resolve a single classified segment into its string representation.
225
+ * Returns null for optional catch-all with no value (filtered out before join).
226
+ *
227
+ * When schema codecs are registered (via virtual:timber-schema), uses
228
+ * codec.serialize() for URL construction instead of plain String().
229
+ */
230
+ function resolveSegment(
231
+ seg: UrlSegment,
232
+ params: Record<string, ParamValue>,
233
+ pattern: string
234
+ ): string | null {
235
+ switch (seg.kind) {
236
+ case 'static':
237
+ return seg.value;
238
+
239
+ case 'optional-catch-all': {
240
+ const value = params[seg.name];
241
+ if (value === undefined || (Array.isArray(value) && value.length === 0)) {
242
+ return null;
243
+ }
244
+ const codec = getLinkCodec(`[[...${seg.name}]]`);
245
+ if (codec) {
246
+ const serialized = codec.serialize(value);
247
+ if (!serialized) return null;
248
+ // Codec returns a path string (may contain '/') — encode each segment
249
+ return serialized.split('/').map(encodeURIComponent).join('/');
250
+ }
251
+ const segments = Array.isArray(value) ? value : [value];
252
+ return segments.map(encodeURIComponent).join('/');
253
+ }
177
254
 
178
- // single dynamic segment
179
- const value = params[single];
180
- if (value === undefined) {
181
- throw new Error(`<Link> missing required param "${single}" for pattern "${pattern}".`);
182
- }
183
- if (Array.isArray(value)) {
184
- throw new Error(
185
- `<Link> param "${single}" expected a string but received an array for pattern "${pattern}".`
186
- );
187
- }
188
- // Accept numbers — coerce to string for URL interpolation
189
- return encodeURIComponent(String(value));
255
+ case 'catch-all': {
256
+ const value = params[seg.name];
257
+ if (value === undefined) {
258
+ throw new Error(
259
+ `<Link> missing required catch-all param "${seg.name}" for pattern "${pattern}".`
260
+ );
261
+ }
262
+ const codec = getLinkCodec(`[...${seg.name}]`);
263
+ if (codec) {
264
+ const serialized = codec.serialize(value);
265
+ if (!serialized) {
266
+ throw new Error(
267
+ `<Link> catch-all param "${seg.name}" codec returned null for pattern "${pattern}".`
268
+ );
190
269
  }
191
- )
192
- // Clean up trailing slash from empty optional catch-all
193
- .replace(/\/+$/, '') || '/'
194
- );
270
+ // Codec returns a path string (may contain '/') — encode each segment
271
+ return serialized.split('/').map(encodeURIComponent).join('/');
272
+ }
273
+ const segments = Array.isArray(value) ? value : [value];
274
+ if (segments.length === 0) {
275
+ throw new Error(
276
+ `<Link> catch-all param "${seg.name}" must have at least one segment for pattern "${pattern}".`
277
+ );
278
+ }
279
+ return segments.map(encodeURIComponent).join('/');
280
+ }
281
+
282
+ case 'dynamic': {
283
+ const value = params[seg.name];
284
+ if (value === undefined) {
285
+ throw new Error(`<Link> missing required param "${seg.name}" for pattern "${pattern}".`);
286
+ }
287
+ if (Array.isArray(value)) {
288
+ throw new Error(
289
+ `<Link> param "${seg.name}" expected a string but received an array for pattern "${pattern}".`
290
+ );
291
+ }
292
+ const codec = getLinkCodec(`[${seg.name}]`);
293
+ const str = codec ? (codec.serialize(value) ?? String(value)) : String(value);
294
+ return encodeURIComponent(str);
295
+ }
296
+ }
297
+ }
298
+
299
+ /**
300
+ * Split a URL pattern into the path portion and any trailing ?query/#hash suffix.
301
+ * Uses URL parsing for correctness rather than manual index arithmetic.
302
+ */
303
+ function splitPatternSuffix(pattern: string): [path: string, suffix: string] {
304
+ if (!pattern.includes('?') && !pattern.includes('#')) {
305
+ return [pattern, ''];
306
+ }
307
+ const url = new URL(pattern, 'http://x');
308
+ const suffix = url.search + url.hash;
309
+ const path = pattern.slice(0, pattern.length - suffix.length);
310
+ return [path, suffix];
311
+ }
312
+
313
+ export function interpolateParams(pattern: string, params: Record<string, ParamValue>): string {
314
+ const [pathPart, suffix] = splitPatternSuffix(pattern);
315
+
316
+ const resolved = parseSegments(pathPart)
317
+ .map((seg) => resolveSegment(seg, params, pattern))
318
+ .filter((s): s is string => s !== null);
319
+ return ('/' + resolved.join('/') || '/') + suffix;
195
320
  }
196
321
 
197
322
  // ─── Resolve Href ───────────────────────────────────────────────
@@ -204,13 +329,19 @@ export function interpolateParams(
204
329
  * - searchParams serialization via SearchParamsDefinition
205
330
  * - Validation that searchParams and inline query strings are exclusive
206
331
  */
332
+ /**
333
+ * Runtime discriminator: treat `searchParams` as the legacy wrapped shape
334
+ * only when it literally has a `definition` key. Everything else is the
335
+ * flat `Partial<T>` values shape (TIM-830).
336
+ */
337
+ function isWrappedSearchParamsProp(sp: LinkSearchParamsProp): sp is WrappedSearchParamsProp {
338
+ return 'definition' in sp;
339
+ }
340
+
207
341
  export function resolveHref(
208
342
  href: string,
209
- params?: Record<string, string | number | string[]>,
210
- searchParams?: {
211
- definition: SearchParamsDefinition<Record<string, unknown>>;
212
- values: Record<string, unknown>;
213
- }
343
+ params?: Record<string, ParamValue>,
344
+ searchParams?: LinkSearchParamsProp
214
345
  ): string {
215
346
  let resolvedPath = href;
216
347
 
@@ -229,9 +360,46 @@ export function resolveHref(
229
360
  );
230
361
  }
231
362
 
232
- const qs = searchParams.definition.serialize(searchParams.values);
233
- if (qs) {
234
- resolvedPath = `${resolvedPath}?${qs}`;
363
+ let definition: SearchParamsDefinition<Record<string, unknown>> | undefined;
364
+ let values: Record<string, unknown>;
365
+
366
+ if (isWrappedSearchParamsProp(searchParams)) {
367
+ // Legacy wrapped shape — used by the catch-all overload for
368
+ // computed/external hrefs where no route lookup is possible.
369
+ definition = searchParams.definition;
370
+ values = searchParams.values;
371
+ } else {
372
+ // Flat shape (TIM-830): look up the definition from the runtime
373
+ // registry using the un-interpolated href pattern (e.g. '/products/[id]').
374
+ // The search-params registry is populated eagerly at startup by the
375
+ // virtual:timber-search-params-registry module generated by the
376
+ // timber-routing Vite plugin.
377
+ definition = getSearchParamsDefinition(href) as
378
+ | SearchParamsDefinition<Record<string, unknown>>
379
+ | undefined;
380
+ values = searchParams;
381
+ }
382
+
383
+ if (definition) {
384
+ const qs = definition.serialize(values);
385
+ if (qs) {
386
+ resolvedPath = `${resolvedPath}?${qs}`;
387
+ }
388
+ } else {
389
+ // No registered definition — serialize flat object as plain query params.
390
+ const usp = new URLSearchParams();
391
+ for (const [key, val] of Object.entries(values)) {
392
+ if (val === undefined || val === null) continue;
393
+ if (Array.isArray(val)) {
394
+ for (const item of val) usp.append(key, String(item));
395
+ } else {
396
+ usp.set(key, String(val));
397
+ }
398
+ }
399
+ const qs = usp.toString();
400
+ if (qs) {
401
+ resolvedPath = `${resolvedPath}?${qs}`;
402
+ }
235
403
  }
236
404
  }
237
405
 
@@ -250,11 +418,8 @@ interface LinkOutputProps {
250
418
  */
251
419
  export function buildLinkProps(
252
420
  props: Pick<LinkPropsWithHref, 'href'> & {
253
- params?: Record<string, string | number | string[]>;
254
- searchParams?: {
255
- definition: SearchParamsDefinition<Record<string, unknown>>;
256
- values: Record<string, unknown>;
257
- };
421
+ params?: Record<string, ParamValue>;
422
+ searchParams?: LinkSearchParamsProp;
258
423
  }
259
424
  ): LinkOutputProps {
260
425
  const resolvedHref = resolveHref(props.href, props.params, props.searchParams);
@@ -302,23 +467,52 @@ function shouldInterceptClick(
302
467
  * navigation via the router. No global event delegation — each Link owns
303
468
  * its own click handling.
304
469
  *
305
- * Supports typed routes via codegen overloads. At runtime:
306
- * - `params` prop interpolates dynamic segments in the href pattern
470
+ * Supports typed routes via the Routes interface (populated by codegen).
471
+ * At runtime:
472
+ * - `segmentParams` prop interpolates dynamic segments in the href pattern
307
473
  * - `searchParams` prop serializes query parameters via a SearchParamsDefinition
474
+ *
475
+ * Typed via the LinkFunction callable interface. The base call signature
476
+ * forbids segmentParams; per-route signatures are added by codegen via
477
+ * interface merging. See TIM-624.
308
478
  */
309
- export function Link({
310
- href,
311
- prefetch,
312
- scroll,
313
- params,
314
- searchParams,
315
- onNavigate,
316
- onClick: userOnClick,
317
- onMouseEnter: userOnMouseEnter,
318
- children,
319
- ...rest
320
- }: LinkProps) {
321
- const { href: resolvedHref } = buildLinkProps({ href, params, searchParams });
479
+ // Cast to LinkFunction — the callable interface provides the public type,
480
+ // but the implementation destructures LinkRuntimeProps internally.
481
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
482
+ export const Link: LinkFunction = function LinkImpl(props: any) {
483
+ const {
484
+ href,
485
+ prefetch,
486
+ scroll,
487
+ segmentParams,
488
+ searchParams,
489
+ preserveSearchParams,
490
+ onNavigate,
491
+ onClick: userOnClick,
492
+ onMouseEnter: userOnMouseEnter,
493
+ children,
494
+ ...rest
495
+ } = props as LinkRuntimeProps;
496
+ const { href: baseHref } = buildLinkProps({ href, params: segmentParams, searchParams });
497
+
498
+ // ─── Per-link pending state ─────────────────────────────────────────
499
+ // Each Link owns a useTransition. On click, it wraps
500
+ // router.navigate() in startTransition — only this Link re-renders
501
+ // for isPending, zero siblings touched. The transition tracks the
502
+ // full navigation lifecycle (fetch + render + commit).
503
+ const [isPending, startTransition] = useTransition();
504
+ const linkStatus = isPending ? LINK_PENDING : LINK_IDLE;
505
+
506
+ // Preserve search params from the current URL when requested.
507
+ // useSearchParams() works during both SSR (reads from request context)
508
+ // and on the client (reads from window.location, reactive to URL changes).
509
+ // We read current search params directly to avoid unconditional hook calls.
510
+ // On the client, window.location.search is always current; during SSR,
511
+ // getSsrData() provides the request's search params.
512
+ const resolvedHref = preserveSearchParams
513
+ ? mergePreservedSearchParams(baseHref, getCurrentSearch(), preserveSearchParams)
514
+ : baseHref;
515
+
322
516
  const internal = isInternalHref(resolvedHref);
323
517
 
324
518
  // ─── Click handler ───────────────────────────────────────────
@@ -347,11 +541,30 @@ export function Link({
347
541
  }
348
542
 
349
543
  const router = getRouterOrNull();
350
- if (!router) return; // SSR or pre-hydration — fall through to browser nav
544
+ if (!router) return;
545
+
546
+ const navHref = preserveSearchParams
547
+ ? mergePreservedSearchParams(baseHref, getCurrentSearch(), preserveSearchParams)
548
+ : resolvedHref;
549
+
550
+ const resolved = new URL(navHref, window.location.href);
551
+
552
+ if (
553
+ resolved.pathname === window.location.pathname &&
554
+ resolved.search === window.location.search &&
555
+ resolved.hash
556
+ ) {
557
+ return;
558
+ }
351
559
 
352
560
  event.preventDefault();
561
+
353
562
  const shouldScroll = scroll !== false;
354
- void router.navigate(resolvedHref, { scroll: shouldScroll });
563
+ const absoluteHref = resolved.pathname + resolved.search;
564
+
565
+ startTransition(async () => {
566
+ await router.navigate(absoluteHref, { scroll: shouldScroll });
567
+ });
355
568
  }
356
569
  : userOnClick; // External links — just pass through user's onClick
357
570
 
@@ -362,14 +575,18 @@ export function Link({
362
575
  userOnMouseEnter?.(event);
363
576
  const router = getRouterOrNull();
364
577
  if (router) {
365
- router.prefetch(resolvedHref);
578
+ const prefetchHref = preserveSearchParams
579
+ ? mergePreservedSearchParams(baseHref, getCurrentSearch(), preserveSearchParams)
580
+ : resolvedHref;
581
+ const resolved = new URL(prefetchHref, window.location.href);
582
+ router.prefetch(resolved.pathname + resolved.search);
366
583
  }
367
584
  }
368
585
  : userOnMouseEnter;
369
586
 
370
587
  return (
371
588
  <a {...rest} href={resolvedHref} onClick={handleClick} onMouseEnter={handleMouseEnter}>
372
- <LinkStatusProvider href={resolvedHref}>{children}</LinkStatusProvider>
589
+ <LinkStatusContext.Provider value={linkStatus}>{children}</LinkStatusContext.Provider>
373
590
  </a>
374
591
  );
375
- }
592
+ };