@timber-js/app 0.2.0-alpha.12 → 0.2.0-alpha.121

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 (760) hide show
  1. package/dist/_chunks/actions-Dy8vOjFt.js +1101 -0
  2. package/dist/_chunks/actions-Dy8vOjFt.js.map +1 -0
  3. package/dist/_chunks/build-output-helper-B1n0sUqj.js +61 -0
  4. package/dist/_chunks/build-output-helper-B1n0sUqj.js.map +1 -0
  5. package/dist/_chunks/cli-schema-sync-ByZPGGmS.js +724 -0
  6. package/dist/_chunks/cli-schema-sync-ByZPGGmS.js.map +1 -0
  7. package/dist/_chunks/cli-schema-sync-DHQLjFu3.js +2 -0
  8. package/dist/_chunks/codec-registry-G9hD5LOq.js +21 -0
  9. package/dist/_chunks/codec-registry-G9hD5LOq.js.map +1 -0
  10. package/dist/_chunks/define-CPVQaWbx.js +124 -0
  11. package/dist/_chunks/define-CPVQaWbx.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-CcwNX-gk.js +54 -0
  17. package/dist/_chunks/handler-store-CcwNX-gk.js.map +1 -0
  18. package/dist/_chunks/logger-DDmK5skc.js +291 -0
  19. package/dist/_chunks/logger-DDmK5skc.js.map +1 -0
  20. package/dist/_chunks/merge-search-params-az6ZiBeU.js +41 -0
  21. package/dist/_chunks/merge-search-params-az6ZiBeU.js.map +1 -0
  22. package/dist/_chunks/navigation-root-DoRTeBm5.js +96 -0
  23. package/dist/_chunks/navigation-root-DoRTeBm5.js.map +1 -0
  24. package/dist/_chunks/registry-BI9cgCt7.js +20 -0
  25. package/dist/_chunks/registry-BI9cgCt7.js.map +1 -0
  26. package/dist/_chunks/resolve-schema-Bf8eC6q6.js +73 -0
  27. package/dist/_chunks/resolve-schema-Bf8eC6q6.js.map +1 -0
  28. package/dist/_chunks/router-ref-CpvjBqdu.js +28 -0
  29. package/dist/_chunks/router-ref-CpvjBqdu.js.map +1 -0
  30. package/dist/_chunks/schema-bridge-o0SwFtXW.js +86 -0
  31. package/dist/_chunks/schema-bridge-o0SwFtXW.js.map +1 -0
  32. package/dist/_chunks/segment-classify-CnfLLvir.js +137 -0
  33. package/dist/_chunks/segment-classify-CnfLLvir.js.map +1 -0
  34. package/dist/_chunks/segment-context-EsfQpS--.js +34 -0
  35. package/dist/_chunks/segment-context-EsfQpS--.js.map +1 -0
  36. package/dist/_chunks/{ssr-data-MjmprTmO.js → ssr-data-m9-cNEIw.js} +1 -1
  37. package/dist/_chunks/ssr-data-m9-cNEIw.js.map +1 -0
  38. package/dist/_chunks/stale-reload-BN2kcE06.js +64 -0
  39. package/dist/_chunks/stale-reload-BN2kcE06.js.map +1 -0
  40. package/dist/_chunks/tracing-DvKLzCFa.js +329 -0
  41. package/dist/_chunks/tracing-DvKLzCFa.js.map +1 -0
  42. package/dist/_chunks/{use-query-states-D5KaffOK.js → use-query-states-C9G6LP0F.js} +7 -20
  43. package/dist/_chunks/use-query-states-C9G6LP0F.js.map +1 -0
  44. package/dist/_chunks/use-segment-params-CtIAjqK0.js +185 -0
  45. package/dist/_chunks/use-segment-params-CtIAjqK0.js.map +1 -0
  46. package/dist/_chunks/validation-BMU5MPzP.js +84 -0
  47. package/dist/_chunks/validation-BMU5MPzP.js.map +1 -0
  48. package/dist/_chunks/walkers-DNp9tHyV.js +719 -0
  49. package/dist/_chunks/walkers-DNp9tHyV.js.map +1 -0
  50. package/dist/_chunks/{format-DviM89f0.js → warnings-B30wpfaS.js} +6 -45
  51. package/dist/_chunks/warnings-B30wpfaS.js.map +1 -0
  52. package/dist/adapters/build-output-helper.d.ts +28 -0
  53. package/dist/adapters/build-output-helper.d.ts.map +1 -0
  54. package/dist/adapters/cloudflare-dev.d.ts +109 -0
  55. package/dist/adapters/cloudflare-dev.d.ts.map +1 -0
  56. package/dist/adapters/cloudflare-dev.js +73 -0
  57. package/dist/adapters/cloudflare-dev.js.map +1 -0
  58. package/dist/adapters/cloudflare-kv-cache.d.ts +64 -0
  59. package/dist/adapters/cloudflare-kv-cache.d.ts.map +1 -0
  60. package/dist/adapters/cloudflare-kv-cache.js +95 -0
  61. package/dist/adapters/cloudflare-kv-cache.js.map +1 -0
  62. package/dist/adapters/cloudflare.d.ts +148 -12
  63. package/dist/adapters/cloudflare.d.ts.map +1 -1
  64. package/dist/adapters/cloudflare.js +142 -38
  65. package/dist/adapters/cloudflare.js.map +1 -1
  66. package/dist/adapters/compress-module.d.ts.map +1 -1
  67. package/dist/adapters/nitro.d.ts +17 -1
  68. package/dist/adapters/nitro.d.ts.map +1 -1
  69. package/dist/adapters/nitro.js +143 -45
  70. package/dist/adapters/nitro.js.map +1 -1
  71. package/dist/adapters/shared.d.ts +16 -0
  72. package/dist/adapters/shared.d.ts.map +1 -0
  73. package/dist/cache/cache-api.d.ts +24 -0
  74. package/dist/cache/cache-api.d.ts.map +1 -0
  75. package/dist/cache/handler-store.d.ts +31 -0
  76. package/dist/cache/handler-store.d.ts.map +1 -0
  77. package/dist/cache/index.d.ts +23 -7
  78. package/dist/cache/index.d.ts.map +1 -1
  79. package/dist/cache/index.js +151 -81
  80. package/dist/cache/index.js.map +1 -1
  81. package/dist/cache/singleflight.d.ts +18 -1
  82. package/dist/cache/singleflight.d.ts.map +1 -1
  83. package/dist/cache/sizeof.d.ts +22 -0
  84. package/dist/cache/sizeof.d.ts.map +1 -0
  85. package/dist/cache/timber-cache.d.ts +1 -1
  86. package/dist/cache/timber-cache.d.ts.map +1 -1
  87. package/dist/cli-schema-sync.d.ts +37 -0
  88. package/dist/cli-schema-sync.d.ts.map +1 -0
  89. package/dist/cli.d.ts +14 -2
  90. package/dist/cli.d.ts.map +1 -1
  91. package/dist/cli.js +42 -6
  92. package/dist/cli.js.map +1 -1
  93. package/dist/client/browser-dev.d.ts +34 -1
  94. package/dist/client/browser-dev.d.ts.map +1 -1
  95. package/dist/client/browser-entry/action-dispatch.d.ts +17 -0
  96. package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -0
  97. package/dist/client/browser-entry/hmr.d.ts +21 -0
  98. package/dist/client/browser-entry/hmr.d.ts.map +1 -0
  99. package/dist/client/browser-entry/hydrate.d.ts +46 -0
  100. package/dist/client/browser-entry/hydrate.d.ts.map +1 -0
  101. package/dist/client/browser-entry/index.d.ts +30 -0
  102. package/dist/client/browser-entry/index.d.ts.map +1 -0
  103. package/dist/client/browser-entry/post-hydration.d.ts +26 -0
  104. package/dist/client/browser-entry/post-hydration.d.ts.map +1 -0
  105. package/dist/client/browser-entry/router-init.d.ts +23 -0
  106. package/dist/client/browser-entry/router-init.d.ts.map +1 -0
  107. package/dist/client/browser-entry/rsc-stream.d.ts +24 -0
  108. package/dist/client/browser-entry/rsc-stream.d.ts.map +1 -0
  109. package/dist/client/browser-entry/scroll.d.ts +19 -0
  110. package/dist/client/browser-entry/scroll.d.ts.map +1 -0
  111. package/dist/client/error-boundary.d.ts +12 -5
  112. package/dist/client/error-boundary.d.ts.map +1 -1
  113. package/dist/client/error-boundary.js +29 -6
  114. package/dist/client/error-boundary.js.map +1 -1
  115. package/dist/client/error-reconstituter.d.ts +54 -0
  116. package/dist/client/error-reconstituter.d.ts.map +1 -0
  117. package/dist/client/form.d.ts +16 -27
  118. package/dist/client/form.d.ts.map +1 -1
  119. package/dist/client/history.d.ts +19 -4
  120. package/dist/client/history.d.ts.map +1 -1
  121. package/dist/client/index.d.ts +9 -24
  122. package/dist/client/index.d.ts.map +1 -1
  123. package/dist/client/index.js +172 -1100
  124. package/dist/client/index.js.map +1 -1
  125. package/dist/client/internal.d.ts +19 -0
  126. package/dist/client/internal.d.ts.map +1 -0
  127. package/dist/client/internal.js +964 -0
  128. package/dist/client/internal.js.map +1 -0
  129. package/dist/client/link-pending-store.d.ts +63 -0
  130. package/dist/client/link-pending-store.d.ts.map +1 -0
  131. package/dist/client/link.d.ts +62 -55
  132. package/dist/client/link.d.ts.map +1 -1
  133. package/dist/client/nav-link-store.d.ts +36 -0
  134. package/dist/client/nav-link-store.d.ts.map +1 -0
  135. package/dist/client/navigation-api-types.d.ts +90 -0
  136. package/dist/client/navigation-api-types.d.ts.map +1 -0
  137. package/dist/client/navigation-api.d.ts +115 -0
  138. package/dist/client/navigation-api.d.ts.map +1 -0
  139. package/dist/client/navigation-context.d.ts +13 -2
  140. package/dist/client/navigation-context.d.ts.map +1 -1
  141. package/dist/client/{transition-root.d.ts → navigation-root.d.ts} +42 -8
  142. package/dist/client/navigation-root.d.ts.map +1 -0
  143. package/dist/client/nuqs-adapter.d.ts.map +1 -1
  144. package/dist/client/router-ref.d.ts +1 -1
  145. package/dist/client/router.d.ts +70 -4
  146. package/dist/client/router.d.ts.map +1 -1
  147. package/dist/client/rsc-fetch.d.ts +38 -3
  148. package/dist/client/rsc-fetch.d.ts.map +1 -1
  149. package/dist/client/segment-cache.d.ts +1 -1
  150. package/dist/client/segment-cache.d.ts.map +1 -1
  151. package/dist/client/segment-outlet.d.ts +63 -0
  152. package/dist/client/segment-outlet.d.ts.map +1 -0
  153. package/dist/client/ssr-data.d.ts +13 -4
  154. package/dist/client/ssr-data.d.ts.map +1 -1
  155. package/dist/client/stale-reload.d.ts +15 -0
  156. package/dist/client/stale-reload.d.ts.map +1 -1
  157. package/dist/client/state.d.ts +1 -1
  158. package/dist/client/top-loader.d.ts +5 -5
  159. package/dist/client/top-loader.d.ts.map +1 -1
  160. package/dist/client/use-cookie.d.ts +12 -0
  161. package/dist/client/use-cookie.d.ts.map +1 -1
  162. package/dist/client/use-link-status.d.ts +5 -5
  163. package/dist/client/use-link-status.d.ts.map +1 -1
  164. package/dist/client/{use-navigation-pending.d.ts → use-pending-navigation.d.ts} +4 -4
  165. package/dist/client/use-pending-navigation.d.ts.map +1 -0
  166. package/dist/client/use-query-states.d.ts +1 -1
  167. package/dist/client/use-query-states.d.ts.map +1 -1
  168. package/dist/client/use-router.d.ts +1 -1
  169. package/dist/client/{use-params.d.ts → use-segment-params.d.ts} +8 -6
  170. package/dist/client/use-segment-params.d.ts.map +1 -0
  171. package/dist/codec.d.ts +69 -0
  172. package/dist/codec.d.ts.map +1 -0
  173. package/dist/codec.js +75 -0
  174. package/dist/codec.js.map +1 -0
  175. package/dist/config-types.d.ts +294 -0
  176. package/dist/config-types.d.ts.map +1 -0
  177. package/dist/config-validation.d.ts +51 -0
  178. package/dist/config-validation.d.ts.map +1 -0
  179. package/dist/content/index.d.ts +1 -10
  180. package/dist/content/index.d.ts.map +1 -1
  181. package/dist/content/index.js +0 -2
  182. package/dist/cookies/define-cookie.d.ts +58 -25
  183. package/dist/cookies/define-cookie.d.ts.map +1 -1
  184. package/dist/cookies/index.d.ts +2 -1
  185. package/dist/cookies/index.d.ts.map +1 -1
  186. package/dist/cookies/index.js +251 -36
  187. package/dist/cookies/index.js.map +1 -1
  188. package/dist/cookies/json-cookie.d.ts +64 -0
  189. package/dist/cookies/json-cookie.d.ts.map +1 -0
  190. package/dist/cookies/validation.d.ts +46 -0
  191. package/dist/cookies/validation.d.ts.map +1 -0
  192. package/dist/dev-tools/404-page.d.ts +46 -0
  193. package/dist/dev-tools/404-page.d.ts.map +1 -0
  194. package/dist/dev-tools/browser-logs.d.ts +84 -0
  195. package/dist/dev-tools/browser-logs.d.ts.map +1 -0
  196. package/dist/dev-tools/error-page.d.ts +58 -0
  197. package/dist/dev-tools/error-page.d.ts.map +1 -0
  198. package/dist/dev-tools/holding-server.d.ts +54 -0
  199. package/dist/dev-tools/holding-server.d.ts.map +1 -0
  200. package/dist/dev-tools/index.d.ts +31 -0
  201. package/dist/dev-tools/index.d.ts.map +1 -0
  202. package/dist/{server/dev-span-processor.d.ts → dev-tools/instrumentation.d.ts} +26 -6
  203. package/dist/dev-tools/instrumentation.d.ts.map +1 -0
  204. package/dist/{server/dev-logger.d.ts → dev-tools/logger.d.ts} +1 -1
  205. package/dist/dev-tools/logger.d.ts.map +1 -0
  206. package/dist/{plugins/dev-logs.d.ts → dev-tools/logs.d.ts} +2 -2
  207. package/dist/dev-tools/logs.d.ts.map +1 -0
  208. package/dist/dev-tools/overlay.d.ts +91 -0
  209. package/dist/dev-tools/overlay.d.ts.map +1 -0
  210. package/dist/dev-tools/stack-classifier.d.ts +34 -0
  211. package/dist/dev-tools/stack-classifier.d.ts.map +1 -0
  212. package/dist/dev-tools/terminal.d.ts +28 -0
  213. package/dist/dev-tools/terminal.d.ts.map +1 -0
  214. package/dist/{server/dev-warnings.d.ts → dev-tools/warnings.d.ts} +2 -22
  215. package/dist/dev-tools/warnings.d.ts.map +1 -0
  216. package/dist/fonts/ast.d.ts +98 -6
  217. package/dist/fonts/ast.d.ts.map +1 -1
  218. package/dist/fonts/bundle.d.ts +48 -0
  219. package/dist/fonts/bundle.d.ts.map +1 -0
  220. package/dist/fonts/dev-middleware.d.ts +22 -0
  221. package/dist/fonts/dev-middleware.d.ts.map +1 -0
  222. package/dist/fonts/local.d.ts +1 -1
  223. package/dist/fonts/pipeline.d.ts +167 -0
  224. package/dist/fonts/pipeline.d.ts.map +1 -0
  225. package/dist/fonts/transform.d.ts +78 -0
  226. package/dist/fonts/transform.d.ts.map +1 -0
  227. package/dist/fonts/types.d.ts +45 -1
  228. package/dist/fonts/types.d.ts.map +1 -1
  229. package/dist/fonts/virtual-modules.d.ts +94 -0
  230. package/dist/fonts/virtual-modules.d.ts.map +1 -0
  231. package/dist/index.d.ts +46 -190
  232. package/dist/index.d.ts.map +1 -1
  233. package/dist/index.js +4807 -12729
  234. package/dist/index.js.map +1 -1
  235. package/dist/params/codec-registry.d.ts +26 -0
  236. package/dist/params/codec-registry.d.ts.map +1 -0
  237. package/dist/params/define-schema.d.ts +81 -0
  238. package/dist/params/define-schema.d.ts.map +1 -0
  239. package/dist/params/index.d.ts +5 -0
  240. package/dist/params/index.d.ts.map +1 -0
  241. package/dist/params/index.js +34 -0
  242. package/dist/params/index.js.map +1 -0
  243. package/dist/params/resolve-schema.d.ts +34 -0
  244. package/dist/params/resolve-schema.d.ts.map +1 -0
  245. package/dist/plugin-context.d.ts +107 -0
  246. package/dist/plugin-context.d.ts.map +1 -0
  247. package/dist/plugins/adapter-build.d.ts +1 -1
  248. package/dist/plugins/adapter-build.d.ts.map +1 -1
  249. package/dist/plugins/build-manifest.d.ts +2 -2
  250. package/dist/plugins/build-manifest.d.ts.map +1 -1
  251. package/dist/plugins/build-report.d.ts +9 -7
  252. package/dist/plugins/build-report.d.ts.map +1 -1
  253. package/dist/plugins/client-chunks.d.ts +32 -0
  254. package/dist/plugins/client-chunks.d.ts.map +1 -0
  255. package/dist/plugins/content.d.ts +1 -1
  256. package/dist/plugins/content.d.ts.map +1 -1
  257. package/dist/plugins/dev-server.d.ts +1 -1
  258. package/dist/plugins/dev-server.d.ts.map +1 -1
  259. package/dist/plugins/entries.d.ts +1 -1
  260. package/dist/plugins/entries.d.ts.map +1 -1
  261. package/dist/plugins/fonts.d.ts +17 -73
  262. package/dist/plugins/fonts.d.ts.map +1 -1
  263. package/dist/plugins/mdx.d.ts +1 -1
  264. package/dist/plugins/mdx.d.ts.map +1 -1
  265. package/dist/plugins/routing.d.ts +1 -1
  266. package/dist/plugins/routing.d.ts.map +1 -1
  267. package/dist/plugins/server-bundle.d.ts.map +1 -1
  268. package/dist/plugins/shims.d.ts +6 -5
  269. package/dist/plugins/shims.d.ts.map +1 -1
  270. package/dist/plugins/static-build.d.ts +5 -26
  271. package/dist/plugins/static-build.d.ts.map +1 -1
  272. package/dist/routing/codegen-shared.d.ts +63 -0
  273. package/dist/routing/codegen-shared.d.ts.map +1 -0
  274. package/dist/routing/codegen-types.d.ts +60 -0
  275. package/dist/routing/codegen-types.d.ts.map +1 -0
  276. package/dist/routing/codegen.d.ts +7 -2
  277. package/dist/routing/codegen.d.ts.map +1 -1
  278. package/dist/routing/convention-lint.d.ts +41 -0
  279. package/dist/routing/convention-lint.d.ts.map +1 -0
  280. package/dist/routing/index.d.ts +7 -1
  281. package/dist/routing/index.d.ts.map +1 -1
  282. package/dist/routing/index.js +4 -2
  283. package/dist/routing/link-codegen.d.ts +90 -0
  284. package/dist/routing/link-codegen.d.ts.map +1 -0
  285. package/dist/routing/scanner.d.ts +1 -10
  286. package/dist/routing/scanner.d.ts.map +1 -1
  287. package/dist/routing/schema-validation.d.ts +35 -0
  288. package/dist/routing/schema-validation.d.ts.map +1 -0
  289. package/dist/routing/segment-classify.d.ts +75 -0
  290. package/dist/routing/segment-classify.d.ts.map +1 -0
  291. package/dist/routing/segment-codegen.d.ts +38 -0
  292. package/dist/routing/segment-codegen.d.ts.map +1 -0
  293. package/dist/routing/types.d.ts +77 -25
  294. package/dist/routing/types.d.ts.map +1 -1
  295. package/dist/routing/walkers.d.ts +51 -0
  296. package/dist/routing/walkers.d.ts.map +1 -0
  297. package/dist/rsc-runtime/rsc.d.ts +1 -1
  298. package/dist/rsc-runtime/rsc.d.ts.map +1 -1
  299. package/dist/rsc-runtime/ssr.d.ts +12 -0
  300. package/dist/rsc-runtime/ssr.d.ts.map +1 -1
  301. package/dist/schema-bridge.d.ts +76 -0
  302. package/dist/schema-bridge.d.ts.map +1 -0
  303. package/dist/search-params/define.d.ts +157 -0
  304. package/dist/search-params/define.d.ts.map +1 -0
  305. package/dist/search-params/index.d.ts +4 -7
  306. package/dist/search-params/index.d.ts.map +1 -1
  307. package/dist/search-params/index.js +34 -441
  308. package/dist/search-params/index.js.map +1 -1
  309. package/dist/search-params/registry.d.ts +2 -2
  310. package/dist/search-params/registry.d.ts.map +1 -1
  311. package/dist/search-params/wrappers.d.ts +53 -0
  312. package/dist/search-params/wrappers.d.ts.map +1 -0
  313. package/dist/segment-params/define.d.ts +95 -0
  314. package/dist/segment-params/define.d.ts.map +1 -0
  315. package/dist/segment-params/index.d.ts +3 -0
  316. package/dist/segment-params/index.d.ts.map +1 -0
  317. package/dist/segment-params/index.js +2 -0
  318. package/dist/server/access-gate.d.ts +8 -3
  319. package/dist/server/access-gate.d.ts.map +1 -1
  320. package/dist/server/action-client.d.ts +41 -6
  321. package/dist/server/action-client.d.ts.map +1 -1
  322. package/dist/server/action-encryption.d.ts +76 -0
  323. package/dist/server/action-encryption.d.ts.map +1 -0
  324. package/dist/server/action-handler.d.ts +35 -1
  325. package/dist/server/action-handler.d.ts.map +1 -1
  326. package/dist/server/actions.d.ts +3 -6
  327. package/dist/server/actions.d.ts.map +1 -1
  328. package/dist/server/als-registry.d.ts +53 -5
  329. package/dist/server/als-registry.d.ts.map +1 -1
  330. package/dist/server/asset-headers.d.ts +1 -15
  331. package/dist/server/asset-headers.d.ts.map +1 -1
  332. package/dist/server/build-manifest.d.ts +2 -2
  333. package/dist/server/build-manifest.d.ts.map +1 -1
  334. package/dist/server/coalesce-tick.d.ts +40 -0
  335. package/dist/server/coalesce-tick.d.ts.map +1 -0
  336. package/dist/server/cookie-context.d.ts +170 -0
  337. package/dist/server/cookie-context.d.ts.map +1 -0
  338. package/dist/server/cookie-parsing.d.ts +51 -0
  339. package/dist/server/cookie-parsing.d.ts.map +1 -0
  340. package/dist/server/debug.d.ts +1 -1
  341. package/dist/server/default-logger.d.ts +22 -0
  342. package/dist/server/default-logger.d.ts.map +1 -0
  343. package/dist/server/deny-boundary.d.ts +90 -0
  344. package/dist/server/deny-boundary.d.ts.map +1 -0
  345. package/dist/server/deny-renderer.d.ts.map +1 -1
  346. package/dist/server/dev-source-map.d.ts +22 -0
  347. package/dist/server/dev-source-map.d.ts.map +1 -0
  348. package/dist/server/early-hints-sender.d.ts.map +1 -1
  349. package/dist/server/early-hints.d.ts +13 -5
  350. package/dist/server/early-hints.d.ts.map +1 -1
  351. package/dist/server/error-boundary-wrapper.d.ts +7 -1
  352. package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
  353. package/dist/server/fallback-error.d.ts +12 -7
  354. package/dist/server/fallback-error.d.ts.map +1 -1
  355. package/dist/server/flight-injection-state.d.ts +66 -0
  356. package/dist/server/flight-injection-state.d.ts.map +1 -0
  357. package/dist/server/flight-scripts.d.ts +42 -0
  358. package/dist/server/flight-scripts.d.ts.map +1 -0
  359. package/dist/server/flush.d.ts.map +1 -1
  360. package/dist/server/form-data.d.ts +29 -0
  361. package/dist/server/form-data.d.ts.map +1 -1
  362. package/dist/server/html-injector-core.d.ts +213 -0
  363. package/dist/server/html-injector-core.d.ts.map +1 -0
  364. package/dist/server/html-injectors.d.ts +81 -41
  365. package/dist/server/html-injectors.d.ts.map +1 -1
  366. package/dist/server/index.d.ts +10 -46
  367. package/dist/server/index.d.ts.map +1 -1
  368. package/dist/server/index.js +155 -2905
  369. package/dist/server/index.js.map +1 -1
  370. package/dist/server/internal.d.ts +48 -0
  371. package/dist/server/internal.d.ts.map +1 -0
  372. package/dist/server/internal.js +2947 -0
  373. package/dist/server/internal.js.map +1 -0
  374. package/dist/server/logger.d.ts +39 -7
  375. package/dist/server/logger.d.ts.map +1 -1
  376. package/dist/server/middleware-runner.d.ts +36 -4
  377. package/dist/server/middleware-runner.d.ts.map +1 -1
  378. package/dist/server/node-stream-transforms.d.ts +112 -0
  379. package/dist/server/node-stream-transforms.d.ts.map +1 -0
  380. package/dist/server/param-coercion.d.ts +54 -0
  381. package/dist/server/param-coercion.d.ts.map +1 -0
  382. package/dist/server/pipeline-helpers.d.ts +95 -0
  383. package/dist/server/pipeline-helpers.d.ts.map +1 -0
  384. package/dist/server/pipeline-interception.d.ts +1 -1
  385. package/dist/server/pipeline-interception.d.ts.map +1 -1
  386. package/dist/server/pipeline-metadata.d.ts +6 -0
  387. package/dist/server/pipeline-metadata.d.ts.map +1 -1
  388. package/dist/server/pipeline-outcome.d.ts +49 -0
  389. package/dist/server/pipeline-outcome.d.ts.map +1 -0
  390. package/dist/server/pipeline-phases.d.ts +52 -0
  391. package/dist/server/pipeline-phases.d.ts.map +1 -0
  392. package/dist/server/pipeline.d.ts +118 -23
  393. package/dist/server/pipeline.d.ts.map +1 -1
  394. package/dist/server/port-resolution.d.ts +117 -0
  395. package/dist/server/port-resolution.d.ts.map +1 -0
  396. package/dist/server/primitives.d.ts +69 -18
  397. package/dist/server/primitives.d.ts.map +1 -1
  398. package/dist/server/render-timeout.d.ts +51 -0
  399. package/dist/server/render-timeout.d.ts.map +1 -0
  400. package/dist/server/request-context.d.ts +62 -107
  401. package/dist/server/request-context.d.ts.map +1 -1
  402. package/dist/server/route-element-builder.d.ts +27 -1
  403. package/dist/server/route-element-builder.d.ts.map +1 -1
  404. package/dist/server/route-handler.d.ts.map +1 -1
  405. package/dist/server/route-matcher.d.ts +21 -34
  406. package/dist/server/route-matcher.d.ts.map +1 -1
  407. package/dist/server/rsc-entry/action-middleware-runner.d.ts +66 -0
  408. package/dist/server/rsc-entry/action-middleware-runner.d.ts.map +1 -0
  409. package/dist/server/rsc-entry/api-handler.d.ts +2 -2
  410. package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
  411. package/dist/server/rsc-entry/error-renderer.d.ts +26 -13
  412. package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
  413. package/dist/server/rsc-entry/helpers.d.ts +49 -6
  414. package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
  415. package/dist/server/rsc-entry/index.d.ts +19 -8
  416. package/dist/server/rsc-entry/index.d.ts.map +1 -1
  417. package/dist/server/rsc-entry/render-route.d.ts +50 -0
  418. package/dist/server/rsc-entry/render-route.d.ts.map +1 -0
  419. package/dist/server/rsc-entry/rsc-payload.d.ts +3 -3
  420. package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
  421. package/dist/server/rsc-entry/rsc-stream.d.ts +17 -1
  422. package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
  423. package/dist/server/rsc-entry/ssr-bridge.d.ts +1 -1
  424. package/dist/server/rsc-entry/ssr-bridge.d.ts.map +1 -1
  425. package/dist/server/rsc-entry/ssr-renderer.d.ts +19 -4
  426. package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
  427. package/dist/server/rsc-entry/wrap-action-dispatch.d.ts +119 -0
  428. package/dist/server/rsc-entry/wrap-action-dispatch.d.ts.map +1 -0
  429. package/dist/server/safe-load.d.ts +46 -0
  430. package/dist/server/safe-load.d.ts.map +1 -0
  431. package/dist/server/sensitive-fields.d.ts +74 -0
  432. package/dist/server/sensitive-fields.d.ts.map +1 -0
  433. package/dist/server/sitemap-generator.d.ts +129 -0
  434. package/dist/server/sitemap-generator.d.ts.map +1 -0
  435. package/dist/server/sitemap-handler.d.ts +22 -0
  436. package/dist/server/sitemap-handler.d.ts.map +1 -0
  437. package/dist/server/slot-resolver.d.ts +1 -1
  438. package/dist/server/slot-resolver.d.ts.map +1 -1
  439. package/dist/server/ssr-entry.d.ts +30 -0
  440. package/dist/server/ssr-entry.d.ts.map +1 -1
  441. package/dist/server/ssr-render.d.ts +39 -21
  442. package/dist/server/ssr-render.d.ts.map +1 -1
  443. package/dist/server/ssr-wrappers.d.ts +50 -0
  444. package/dist/server/ssr-wrappers.d.ts.map +1 -0
  445. package/dist/server/state-tree-diff.d.ts.map +1 -1
  446. package/dist/server/status-code-resolver.d.ts +16 -11
  447. package/dist/server/status-code-resolver.d.ts.map +1 -1
  448. package/dist/server/stream-utils.d.ts +36 -0
  449. package/dist/server/stream-utils.d.ts.map +1 -0
  450. package/dist/server/tracing.d.ts +5 -5
  451. package/dist/server/tracing.d.ts.map +1 -1
  452. package/dist/server/tree-builder.d.ts +62 -30
  453. package/dist/server/tree-builder.d.ts.map +1 -1
  454. package/dist/server/tree-match.d.ts +41 -0
  455. package/dist/server/tree-match.d.ts.map +1 -0
  456. package/dist/server/types.d.ts +49 -4
  457. package/dist/server/types.d.ts.map +1 -1
  458. package/dist/server/utils/escape-html.d.ts +14 -0
  459. package/dist/server/utils/escape-html.d.ts.map +1 -0
  460. package/dist/server/version-skew.d.ts +61 -0
  461. package/dist/server/version-skew.d.ts.map +1 -0
  462. package/dist/shared/merge-search-params.d.ts +22 -0
  463. package/dist/shared/merge-search-params.d.ts.map +1 -0
  464. package/dist/shims/font-google.d.ts +1 -1
  465. package/dist/shims/font-google.d.ts.map +1 -1
  466. package/dist/shims/font-google.js +42 -0
  467. package/dist/shims/font-google.js.map +1 -0
  468. package/dist/shims/font-local.d.ts +26 -0
  469. package/dist/shims/font-local.d.ts.map +1 -0
  470. package/dist/shims/font-local.js +20 -0
  471. package/dist/shims/font-local.js.map +1 -0
  472. package/dist/shims/headers.d.ts +2 -1
  473. package/dist/shims/headers.d.ts.map +1 -1
  474. package/dist/shims/navigation-client.d.ts +3 -1
  475. package/dist/shims/navigation-client.d.ts.map +1 -1
  476. package/dist/shims/navigation.d.ts +11 -5
  477. package/dist/shims/navigation.d.ts.map +1 -1
  478. package/dist/utils/state-machine.d.ts +80 -0
  479. package/dist/utils/state-machine.d.ts.map +1 -0
  480. package/package.json +62 -21
  481. package/src/adapters/build-output-helper.ts +77 -0
  482. package/src/adapters/cloudflare-dev.ts +177 -0
  483. package/src/adapters/cloudflare-kv-cache.ts +142 -0
  484. package/src/adapters/cloudflare.ts +350 -76
  485. package/src/adapters/compress-module.ts +24 -4
  486. package/src/adapters/nitro.ts +142 -59
  487. package/src/adapters/shared.ts +40 -0
  488. package/src/adapters/wrangler.d.ts +7 -0
  489. package/src/cache/cache-api.ts +38 -0
  490. package/src/cache/handler-store.ts +68 -0
  491. package/src/cache/index.ts +81 -18
  492. package/src/cache/singleflight.ts +62 -4
  493. package/src/cache/sizeof.ts +33 -0
  494. package/src/cache/timber-cache.ts +25 -20
  495. package/src/cli-schema-sync.ts +207 -0
  496. package/src/cli.ts +65 -8
  497. package/src/client/browser-dev.ts +153 -1
  498. package/src/client/browser-entry/action-dispatch.ts +126 -0
  499. package/src/client/browser-entry/hmr.ts +81 -0
  500. package/src/client/browser-entry/hydrate.ts +145 -0
  501. package/src/client/browser-entry/index.ts +149 -0
  502. package/src/client/browser-entry/post-hydration.ts +119 -0
  503. package/src/client/browser-entry/router-init.ts +193 -0
  504. package/src/client/browser-entry/rsc-stream.ts +157 -0
  505. package/src/client/browser-entry/scroll.ts +27 -0
  506. package/src/client/error-boundary.tsx +99 -22
  507. package/src/client/error-reconstituter.tsx +65 -0
  508. package/src/client/form.tsx +31 -32
  509. package/src/client/history.ts +26 -4
  510. package/src/client/index.ts +69 -44
  511. package/src/client/internal.ts +58 -0
  512. package/src/client/link-pending-store.ts +111 -0
  513. package/src/client/link.tsx +366 -113
  514. package/src/client/nav-link-store.ts +47 -0
  515. package/src/client/navigation-api-types.ts +112 -0
  516. package/src/client/navigation-api.ts +332 -0
  517. package/src/client/navigation-context.ts +31 -6
  518. package/src/client/navigation-root.tsx +342 -0
  519. package/src/client/nuqs-adapter.tsx +16 -3
  520. package/src/client/router-ref.ts +1 -1
  521. package/src/client/router.ts +300 -73
  522. package/src/client/rsc-fetch.ts +112 -8
  523. package/src/client/segment-cache.ts +1 -1
  524. package/src/client/segment-outlet.tsx +86 -0
  525. package/src/client/ssr-data.ts +13 -5
  526. package/src/client/stale-reload.ts +72 -3
  527. package/src/client/state.ts +2 -2
  528. package/src/client/top-loader.tsx +18 -6
  529. package/src/client/use-cookie.ts +31 -2
  530. package/src/client/use-link-status.ts +7 -7
  531. package/src/client/{use-navigation-pending.ts → use-pending-navigation.ts} +6 -6
  532. package/src/client/use-query-states.ts +9 -3
  533. package/src/client/use-router.ts +1 -1
  534. package/src/client/{use-params.ts → use-segment-params.ts} +8 -6
  535. package/src/codec.ts +147 -0
  536. package/src/config-types.ts +292 -0
  537. package/src/config-validation.ts +303 -0
  538. package/src/content/index.ts +5 -13
  539. package/src/cookies/define-cookie.ts +233 -53
  540. package/src/cookies/index.ts +12 -1
  541. package/src/cookies/json-cookie.ts +105 -0
  542. package/src/cookies/validation.ts +134 -0
  543. package/src/dev-tools/404-page.ts +387 -0
  544. package/src/dev-tools/browser-logs.ts +291 -0
  545. package/src/dev-tools/error-page.ts +506 -0
  546. package/src/dev-tools/holding-server.ts +187 -0
  547. package/src/dev-tools/index.ts +90 -0
  548. package/src/dev-tools/instrumentation.ts +176 -0
  549. package/src/{plugins/dev-logs.ts → dev-tools/logs.ts} +9 -5
  550. package/src/dev-tools/overlay.ts +469 -0
  551. package/src/dev-tools/stack-classifier.ts +75 -0
  552. package/src/dev-tools/terminal.ts +183 -0
  553. package/src/{server/dev-warnings.ts → dev-tools/warnings.ts} +5 -50
  554. package/src/fonts/ast.ts +525 -16
  555. package/src/fonts/bundle.ts +142 -0
  556. package/src/fonts/dev-middleware.ts +74 -0
  557. package/src/fonts/local.ts +1 -1
  558. package/src/fonts/pipeline.ts +314 -0
  559. package/src/fonts/transform.ts +317 -0
  560. package/src/fonts/types.ts +50 -1
  561. package/src/fonts/virtual-modules.ts +233 -0
  562. package/src/index.ts +409 -357
  563. package/src/params/codec-registry.ts +34 -0
  564. package/src/params/define-schema.ts +114 -0
  565. package/src/params/index.ts +17 -0
  566. package/src/params/resolve-schema.ts +101 -0
  567. package/src/plugin-context.ts +240 -0
  568. package/src/plugins/adapter-build.ts +12 -4
  569. package/src/plugins/build-manifest.ts +13 -2
  570. package/src/plugins/build-report.ts +16 -25
  571. package/src/plugins/client-chunks.ts +65 -0
  572. package/src/plugins/content.ts +1 -1
  573. package/src/plugins/dev-server.ts +175 -35
  574. package/src/plugins/entries.ts +111 -9
  575. package/src/plugins/fonts.ts +157 -654
  576. package/src/plugins/mdx.ts +47 -10
  577. package/src/plugins/routing.ts +371 -45
  578. package/src/plugins/server-bundle.ts +32 -1
  579. package/src/plugins/shims.ts +136 -35
  580. package/src/plugins/static-build.ts +15 -89
  581. package/src/routing/codegen-shared.ts +109 -0
  582. package/src/routing/codegen-types.ts +61 -0
  583. package/src/routing/codegen.ts +316 -177
  584. package/src/routing/convention-lint.ts +357 -0
  585. package/src/routing/index.ts +10 -1
  586. package/src/routing/interception.ts +1 -1
  587. package/src/routing/link-codegen.ts +308 -0
  588. package/src/routing/scanner.ts +165 -110
  589. package/src/routing/schema-validation.ts +149 -0
  590. package/src/routing/segment-classify.ts +188 -0
  591. package/src/routing/segment-codegen.ts +98 -0
  592. package/src/routing/types.ts +78 -25
  593. package/src/routing/walkers.ts +90 -0
  594. package/src/rsc-runtime/rsc.ts +2 -0
  595. package/src/rsc-runtime/ssr.ts +50 -0
  596. package/src/rsc-runtime/vendor-types.d.ts +7 -0
  597. package/src/{search-params/codecs.ts → schema-bridge.ts} +57 -20
  598. package/src/search-params/define.ts +538 -0
  599. package/src/search-params/index.ts +14 -20
  600. package/src/search-params/registry.ts +2 -2
  601. package/src/search-params/wrappers.ts +92 -0
  602. package/src/segment-params/define.ts +336 -0
  603. package/src/segment-params/index.ts +9 -0
  604. package/src/server/access-gate.tsx +76 -34
  605. package/src/server/action-client.ts +88 -15
  606. package/src/server/action-encryption.ts +144 -0
  607. package/src/server/action-handler.ts +112 -14
  608. package/src/server/actions.ts +10 -9
  609. package/src/server/als-registry.ts +55 -7
  610. package/src/server/asset-headers.ts +8 -34
  611. package/src/server/build-manifest.ts +10 -4
  612. package/src/server/coalesce-tick.ts +75 -0
  613. package/src/server/compress.ts +25 -7
  614. package/src/server/cookie-context.ts +468 -0
  615. package/src/server/cookie-parsing.ts +135 -0
  616. package/src/server/debug.ts +1 -1
  617. package/src/server/default-logger.ts +99 -0
  618. package/src/server/deny-boundary.ts +218 -0
  619. package/src/server/deny-renderer.ts +31 -50
  620. package/src/server/dev-source-map.ts +31 -0
  621. package/src/server/early-hints-sender.ts +3 -2
  622. package/src/server/early-hints.ts +36 -15
  623. package/src/server/error-boundary-wrapper.ts +74 -22
  624. package/src/server/fallback-error.ts +74 -102
  625. package/src/server/flight-injection-state.ts +113 -0
  626. package/src/server/flight-scripts.ts +62 -0
  627. package/src/server/flush.ts +2 -1
  628. package/src/server/form-data.ts +76 -0
  629. package/src/server/html-injector-core.ts +417 -0
  630. package/src/server/html-injectors.ts +235 -223
  631. package/src/server/index.ts +29 -183
  632. package/src/server/internal.ts +176 -0
  633. package/src/server/logger.ts +67 -36
  634. package/src/server/middleware-runner.ts +75 -4
  635. package/src/server/node-stream-transforms.ts +361 -0
  636. package/src/server/param-coercion.ts +206 -0
  637. package/src/server/pipeline-helpers.ts +204 -0
  638. package/src/server/pipeline-interception.ts +17 -16
  639. package/src/server/pipeline-metadata.ts +13 -0
  640. package/src/server/pipeline-outcome.ts +176 -0
  641. package/src/server/pipeline-phases.ts +460 -0
  642. package/src/server/pipeline.ts +154 -394
  643. package/src/server/port-resolution.ts +215 -0
  644. package/src/server/primitives.ts +111 -28
  645. package/src/server/render-timeout.ts +108 -0
  646. package/src/server/request-context.ts +168 -333
  647. package/src/server/route-element-builder.ts +309 -195
  648. package/src/server/route-handler.ts +24 -4
  649. package/src/server/route-matcher.ts +50 -231
  650. package/src/server/rsc-entry/action-middleware-runner.ts +167 -0
  651. package/src/server/rsc-entry/api-handler.ts +16 -17
  652. package/src/server/rsc-entry/error-renderer.ts +305 -89
  653. package/src/server/rsc-entry/helpers.ts +137 -12
  654. package/src/server/rsc-entry/index.ts +316 -352
  655. package/src/server/rsc-entry/render-route.ts +307 -0
  656. package/src/server/rsc-entry/rsc-payload.ts +65 -18
  657. package/src/server/rsc-entry/rsc-stream.ts +85 -13
  658. package/src/server/rsc-entry/ssr-bridge.ts +14 -5
  659. package/src/server/rsc-entry/ssr-renderer.ts +187 -38
  660. package/src/server/rsc-entry/wrap-action-dispatch.ts +449 -0
  661. package/src/server/safe-load.ts +60 -0
  662. package/src/server/sensitive-fields.ts +230 -0
  663. package/src/server/sitemap-generator.ts +338 -0
  664. package/src/server/sitemap-handler.ts +126 -0
  665. package/src/server/slot-resolver.ts +228 -246
  666. package/src/server/ssr-entry.ts +229 -32
  667. package/src/server/ssr-render.ts +289 -67
  668. package/src/server/ssr-wrappers.tsx +139 -0
  669. package/src/server/state-tree-diff.ts +4 -1
  670. package/src/server/status-code-resolver.ts +112 -128
  671. package/src/server/stream-utils.ts +213 -0
  672. package/src/server/tracing.ts +21 -10
  673. package/src/server/tree-builder.ts +202 -90
  674. package/src/server/tree-match.ts +198 -0
  675. package/src/server/types.ts +55 -6
  676. package/src/server/utils/escape-html.ts +20 -0
  677. package/src/server/version-skew.ts +104 -0
  678. package/src/shared/merge-search-params.ts +55 -0
  679. package/src/shims/font-google.ts +1 -1
  680. package/src/shims/font-local.ts +34 -0
  681. package/src/shims/headers.ts +5 -1
  682. package/src/shims/navigation-client.ts +4 -3
  683. package/src/shims/navigation.ts +14 -7
  684. package/src/utils/state-machine.ts +111 -0
  685. package/LICENSE +0 -8
  686. package/dist/_chunks/als-registry-B7DbZ2hS.js +0 -41
  687. package/dist/_chunks/als-registry-B7DbZ2hS.js.map +0 -1
  688. package/dist/_chunks/debug-gwlJkDuf.js +0 -108
  689. package/dist/_chunks/debug-gwlJkDuf.js.map +0 -1
  690. package/dist/_chunks/format-DviM89f0.js.map +0 -1
  691. package/dist/_chunks/interception-BOoWmLUA.js +0 -676
  692. package/dist/_chunks/interception-BOoWmLUA.js.map +0 -1
  693. package/dist/_chunks/request-context-DIkVh_jG.js +0 -330
  694. package/dist/_chunks/request-context-DIkVh_jG.js.map +0 -1
  695. package/dist/_chunks/ssr-data-MjmprTmO.js.map +0 -1
  696. package/dist/_chunks/tracing-CemImE6h.js +0 -187
  697. package/dist/_chunks/tracing-CemImE6h.js.map +0 -1
  698. package/dist/_chunks/use-cookie-DX-l1_5E.js +0 -91
  699. package/dist/_chunks/use-cookie-DX-l1_5E.js.map +0 -1
  700. package/dist/_chunks/use-query-states-D5KaffOK.js.map +0 -1
  701. package/dist/cache/register-cached-function.d.ts +0 -17
  702. package/dist/cache/register-cached-function.d.ts.map +0 -1
  703. package/dist/client/browser-entry.d.ts +0 -21
  704. package/dist/client/browser-entry.d.ts.map +0 -1
  705. package/dist/client/link-status-provider.d.ts +0 -11
  706. package/dist/client/link-status-provider.d.ts.map +0 -1
  707. package/dist/client/transition-root.d.ts.map +0 -1
  708. package/dist/client/use-navigation-pending.d.ts.map +0 -1
  709. package/dist/client/use-params.d.ts.map +0 -1
  710. package/dist/plugins/cache-transform.d.ts +0 -36
  711. package/dist/plugins/cache-transform.d.ts.map +0 -1
  712. package/dist/plugins/dev-error-overlay.d.ts +0 -60
  713. package/dist/plugins/dev-error-overlay.d.ts.map +0 -1
  714. package/dist/plugins/dev-logs.d.ts.map +0 -1
  715. package/dist/plugins/dynamic-transform.d.ts +0 -72
  716. package/dist/plugins/dynamic-transform.d.ts.map +0 -1
  717. package/dist/plugins/server-action-exports.d.ts +0 -26
  718. package/dist/plugins/server-action-exports.d.ts.map +0 -1
  719. package/dist/routing/status-file-lint.d.ts +0 -33
  720. package/dist/routing/status-file-lint.d.ts.map +0 -1
  721. package/dist/search-params/analyze.d.ts +0 -54
  722. package/dist/search-params/analyze.d.ts.map +0 -1
  723. package/dist/search-params/builtin-codecs.d.ts +0 -105
  724. package/dist/search-params/builtin-codecs.d.ts.map +0 -1
  725. package/dist/search-params/codecs.d.ts +0 -53
  726. package/dist/search-params/codecs.d.ts.map +0 -1
  727. package/dist/search-params/create.d.ts +0 -106
  728. package/dist/search-params/create.d.ts.map +0 -1
  729. package/dist/server/dev-fetch-instrumentation.d.ts +0 -22
  730. package/dist/server/dev-fetch-instrumentation.d.ts.map +0 -1
  731. package/dist/server/dev-logger.d.ts.map +0 -1
  732. package/dist/server/dev-span-processor.d.ts.map +0 -1
  733. package/dist/server/dev-warnings.d.ts.map +0 -1
  734. package/dist/server/manifest-status-resolver.d.ts +0 -58
  735. package/dist/server/manifest-status-resolver.d.ts.map +0 -1
  736. package/dist/server/prerender.d.ts +0 -77
  737. package/dist/server/prerender.d.ts.map +0 -1
  738. package/dist/server/response-cache.d.ts +0 -54
  739. package/dist/server/response-cache.d.ts.map +0 -1
  740. package/dist/utils/directive-parser.d.ts +0 -70
  741. package/dist/utils/directive-parser.d.ts.map +0 -1
  742. package/src/cache/register-cached-function.ts +0 -103
  743. package/src/client/browser-entry.ts +0 -678
  744. package/src/client/link-status-provider.tsx +0 -30
  745. package/src/client/transition-root.tsx +0 -166
  746. package/src/plugins/cache-transform.ts +0 -199
  747. package/src/plugins/dev-error-overlay.ts +0 -230
  748. package/src/plugins/dynamic-transform.ts +0 -161
  749. package/src/plugins/server-action-exports.ts +0 -220
  750. package/src/routing/status-file-lint.ts +0 -112
  751. package/src/search-params/analyze.ts +0 -192
  752. package/src/search-params/builtin-codecs.ts +0 -228
  753. package/src/search-params/create.ts +0 -321
  754. package/src/server/dev-fetch-instrumentation.ts +0 -96
  755. package/src/server/dev-span-processor.ts +0 -78
  756. package/src/server/manifest-status-resolver.ts +0 -215
  757. package/src/server/prerender.ts +0 -139
  758. package/src/server/response-cache.ts +0 -410
  759. package/src/utils/directive-parser.ts +0 -529
  760. /package/src/{server/dev-logger.ts → dev-tools/logger.ts} +0 -0
@@ -8,39 +8,33 @@
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 { join, relative } from 'node:path';
13
13
  import type { RouteTree, SegmentNode } from './types.js';
14
-
15
- /** A single route entry extracted from the segment tree. */
16
- interface RouteEntry {
17
- /** URL path pattern (e.g. "/products/[id]") */
18
- urlPath: string;
19
- /** Accumulated params from all ancestor dynamic segments */
20
- params: ParamEntry[];
21
- /** Whether this route has a co-located search-params.ts */
22
- hasSearchParams: boolean;
23
- /** Absolute path to search-params.ts (for computing relative import paths) */
24
- searchParamsAbsPath?: string;
25
- /** Whether this is an API route (route.ts) vs page route */
26
- isApiRoute: boolean;
27
- }
28
-
29
- interface ParamEntry {
30
- name: string;
31
- type: 'string' | 'string[]' | 'string[] | undefined';
32
- }
14
+ import type { ParamEntry, RouteEntry } from './codegen-types.js';
15
+ import {
16
+ buildCodecChainType,
17
+ buildSchemaParamType,
18
+ emitResolveSegmentFieldHelper,
19
+ formatSearchParamsType,
20
+ } from './codegen-shared.js';
21
+ import { formatLinkCatchAllOverloads, formatTypedLinkOverloads } from './link-codegen.js';
33
22
 
34
23
  /** Options for route map generation. */
35
24
  export interface CodegenOptions {
36
- /** Absolute path to the app/ directory. Required for search-params.ts detection. */
25
+ /** Absolute path to the app/ directory. Required for page searchParams detection. */
37
26
  appDir?: string;
38
27
  /**
39
28
  * 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.
29
+ * Used to compute correct relative import paths for page files.
41
30
  * Defaults to appDir when not provided (preserves backward compat for tests).
42
31
  */
43
32
  outputDir?: string;
33
+ /**
34
+ * Whether a global schema (app/schema.ts) exists.
35
+ * Auto-detected from appDir when not explicitly set.
36
+ */
37
+ hasSchema?: boolean;
44
38
  }
45
39
 
46
40
  /**
@@ -50,8 +44,11 @@ export interface CodegenOptions {
50
44
  * interface that maps every route path to its params and searchParams shape.
51
45
  */
52
46
  export function generateRouteMap(tree: RouteTree, options: CodegenOptions = {}): string {
47
+ // Auto-detect schema from appDir when not explicitly set
48
+ const hasSchema = options.hasSchema ?? detectSchema(options.appDir);
49
+
53
50
  const routes: RouteEntry[] = [];
54
- collectRoutes(tree.root, [], options.appDir, routes);
51
+ collectRoutes(tree.root, [], [], '', routes, hasSchema);
55
52
 
56
53
  // Sort routes alphabetically for deterministic output
57
54
  routes.sort((a, b) => a.urlPath.localeCompare(b.urlPath));
@@ -59,7 +56,18 @@ export function generateRouteMap(tree: RouteTree, options: CodegenOptions = {}):
59
56
  // When outputDir differs from appDir, import paths must be relative to outputDir
60
57
  const importBase = options.outputDir ?? options.appDir;
61
58
 
62
- return formatDeclarationFile(routes, importBase);
59
+ return formatDeclarationFile(routes, importBase, hasSchema, options.appDir);
60
+ }
61
+
62
+ /** Schema file extensions to check, in priority order. */
63
+ const SCHEMA_EXTENSIONS = ['.ts', '.tsx', '.js', '.jsx'];
64
+
65
+ /**
66
+ * Detect whether app/schema.{ts,tsx,js,jsx} exists.
67
+ */
68
+ function detectSchema(appDir: string | undefined): boolean {
69
+ if (!appDir) return false;
70
+ return SCHEMA_EXTENSIONS.some((ext) => existsSync(join(appDir, `schema${ext}`)));
63
71
  }
64
72
 
65
73
  /**
@@ -71,37 +79,94 @@ export function generateRouteMap(tree: RouteTree, options: CodegenOptions = {}):
71
79
  function collectRoutes(
72
80
  node: SegmentNode,
73
81
  ancestorParams: ParamEntry[],
74
- appDir: string | undefined,
75
- routes: RouteEntry[]
82
+ ancestorParamsFiles: string[],
83
+ parentTreePath: string,
84
+ routes: RouteEntry[],
85
+ hasSchema: boolean
76
86
  ): void {
77
- // Accumulate params from this segment
87
+ // Build the tree path (includes groups, slots — uniquely identifies this segment).
88
+ // Root node has empty segmentName, producing treePath = ''.
89
+ const treePath = node.segmentName ? `${parentTreePath}/${node.segmentName}` : parentTreePath;
90
+ // TIM-834: Identify this segment's own params.ts (if it has a
91
+ // segmentParams export). The full chain of params.ts files in the
92
+ // route ancestry is threaded down via `ancestorParamsFiles`; codec
93
+ // resolution for each ParamEntry is deferred until leaf time so that
94
+ // descendant params.ts files can override ancestor codecs (closest-
95
+ // to-leaf wins, matching the runtime semantics of
96
+ // coerceSegmentParams which walks segments top-down and overwrites
97
+ // earlier coercions).
98
+ const ownParamsFile =
99
+ node.params && fileHasExport(node.params.filePath, 'segmentParams')
100
+ ? node.params.filePath
101
+ : undefined;
102
+
103
+ // Accumulate params from this segment. We attach `codecFilePaths`
104
+ // later (at leaf time) using the FULL chain so descendant overrides
105
+ // are visible. The legacy layout/page fallback is recorded now
106
+ // because it is per-segment (and does not participate in inheritance).
78
107
  const params = [...ancestorParams];
79
108
  if (node.paramName) {
109
+ const legacyFallback = ownParamsFile ? undefined : findLegacyParamsExport(node);
80
110
  params.push({
81
111
  name: node.paramName,
112
+ bracketName: node.segmentName,
82
113
  type: paramTypeForSegment(node.segmentType),
114
+ // Codec chain populated at leaf time. We carry the per-segment
115
+ // legacy fallback (if any) so leaf-time resolution can fall back
116
+ // to it when no params.ts in the chain declares this key.
117
+ legacyCodecFilePath: legacyFallback,
83
118
  });
84
119
  }
85
120
 
121
+ // Extend the chain for descendants of this segment.
122
+ const nextAncestorFiles = ownParamsFile
123
+ ? [...ancestorParamsFiles, ownParamsFile]
124
+ : ancestorParamsFiles;
125
+
86
126
  // Check if this segment is a leaf route (has page or route file)
87
127
  const isPage = !!node.page;
88
128
  const isApiRoute = !!node.route;
89
129
 
90
130
  if (isPage || isApiRoute) {
131
+ // TIM-834 P1 fix: at LEAF time, the full chain of params.ts files
132
+ // (root-to-leaf) is known. Resolve every ParamEntry's
133
+ // `codecFilePaths` to the chain in LEAF-FIRST order so the
134
+ // closest-to-leaf entry is checked first — matching runtime
135
+ // closest-wins semantics. The chain is shared by all params in the
136
+ // route, so we compute it once.
137
+ const leafFirstChain = nextAncestorFiles.length > 0 ? [...nextAncestorFiles].reverse() : [];
138
+ const resolvedParams: ParamEntry[] = params.map((p) => {
139
+ const codecFilePaths =
140
+ leafFirstChain.length > 0
141
+ ? leafFirstChain
142
+ : p.legacyCodecFilePath
143
+ ? [p.legacyCodecFilePath]
144
+ : undefined;
145
+ return {
146
+ name: p.name,
147
+ bracketName: p.bracketName,
148
+ type: p.type,
149
+ codecFilePaths,
150
+ };
151
+ });
152
+
91
153
  const entry: RouteEntry = {
92
154
  urlPath: node.urlPath,
93
- params: [...params],
155
+ segmentPath: treePath || '/',
156
+ params: resolvedParams,
94
157
  hasSearchParams: false,
95
158
  isApiRoute,
159
+ hasSchema,
96
160
  };
97
161
 
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) {
162
+ // Detect searchParams export from params.ts (primary) or page.tsx (fallback)
163
+ if (isPage) {
164
+ if (node.params && fileHasExport(node.params.filePath, 'searchParams')) {
165
+ entry.hasSearchParams = true;
166
+ entry.searchParamsPagePath = node.params.filePath;
167
+ } else if (node.page && fileHasExport(node.page.filePath, 'searchParams')) {
103
168
  entry.hasSearchParams = true;
104
- entry.searchParamsAbsPath = searchParamsFile;
169
+ entry.searchParamsPagePath = node.page.filePath;
105
170
  }
106
171
  }
107
172
 
@@ -110,12 +175,12 @@ function collectRoutes(
110
175
 
111
176
  // Recurse into children
112
177
  for (const child of node.children) {
113
- collectRoutes(child, params, appDir, routes);
178
+ collectRoutes(child, params, nextAncestorFiles, treePath, routes, hasSchema);
114
179
  }
115
180
 
116
181
  // Recurse into slots (they share the parent's URL path, but may have their own pages)
117
- for (const [, slot] of node.slots) {
118
- collectRoutes(slot, params, appDir, routes);
182
+ for (const slot of Object.values(node.slots)) {
183
+ collectRoutes(slot, params, nextAncestorFiles, treePath, routes, hasSchema);
119
184
  }
120
185
  }
121
186
 
@@ -134,41 +199,108 @@ function paramTypeForSegment(segmentType: string): ParamEntry['type'] {
134
199
  }
135
200
 
136
201
  /**
137
- * Resolve the absolute directory path for a segment node.
202
+ * Check if a file exports a specific named export.
138
203
  *
139
- * Reconstructs the filesystem path by walking from appDir through
140
- * the segment names encoded in the urlPath, accounting for groups and slots.
204
+ * Uses a lightweight regex check — not full AST parsing. The actual type
205
+ * extraction happens via the TypeScript compiler in the generated .d.ts.
141
206
  */
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('/');
207
+ function fileHasExport(filePath: string, exportName: string): boolean {
208
+ if (!existsSync(filePath)) return false;
209
+ try {
210
+ const content = readFileSync(filePath, 'utf-8');
211
+ const e = exportName.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
212
+ return (
213
+ new RegExp(`export\\s+(const|let|var)\\s+${e}\\b`).test(content) ||
214
+ new RegExp(`export\\s*\\{[^}]*\\b${e}\\b[^}]*\\}`).test(content)
215
+ );
216
+ } catch {
217
+ return false;
150
218
  }
151
- // Fallback: construct from urlPath (imprecise for groups, but acceptable)
152
- return appDir;
153
219
  }
154
220
 
155
221
  /**
156
- * Find a search-params.ts file in a directory.
222
+ * Find a legacy `segmentParams` export on layout.tsx or page.tsx.
223
+ *
224
+ * Backward-compat shim: TIM-508 made params.ts the canonical location
225
+ * for `segmentParams`. Layout/page exports are still accepted for the
226
+ * OWN segment only (not inherited by descendants — see TIM-834).
157
227
  */
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
- }
228
+ function findLegacyParamsExport(node: SegmentNode): string | undefined {
229
+ if (node.layout && fileHasExport(node.layout.filePath, 'segmentParams')) {
230
+ return node.layout.filePath;
231
+ }
232
+ if (node.page && fileHasExport(node.page.filePath, 'segmentParams')) {
233
+ return node.page.filePath;
164
234
  }
165
235
  return undefined;
166
236
  }
167
237
 
238
+ /**
239
+ * Emit the schema-based type exports: TimberSegmentParams, TimberRoute,
240
+ * AllSegmentParams, RoutesWithParams.
241
+ *
242
+ * These types use InferCodecType references so they stay in sync with
243
+ * the schema without hardcoding resolved types.
244
+ *
245
+ * Design doc: design/41-global-params.md §Codegen Output
246
+ */
247
+ function formatSchemaTypes(routes: RouteEntry[]): string[] {
248
+ const lines: string[] = [];
249
+
250
+ lines.push('/** Union of all valid route patterns. */');
251
+ lines.push('export type TimberRoute = keyof TimberSegmentParams;');
252
+ lines.push('');
253
+ lines.push('/** Maps each segment path to its accumulated segment params. */');
254
+ lines.push('export interface TimberSegmentParams {');
255
+
256
+ for (const route of routes) {
257
+ if (route.params.length === 0) {
258
+ lines.push(` '${route.segmentPath}': {};`);
259
+ } else {
260
+ lines.push(` '${route.segmentPath}': {`);
261
+ for (const p of route.params) {
262
+ lines.push(` ${p.name}: ${buildSchemaParamType(p)};`);
263
+ }
264
+ lines.push(' };');
265
+ }
266
+ }
267
+
268
+ lines.push('}');
269
+ lines.push('');
270
+
271
+ // AllSegmentParams — flat union of all param types across all routes
272
+ lines.push('/** All segment params (union of all route params). */');
273
+ lines.push('export type AllSegmentParams = {');
274
+ lines.push(
275
+ ' [K in keyof TimberSegmentParams as TimberSegmentParams[K] extends Record<string, never>'
276
+ );
277
+ lines.push(' ? never');
278
+ lines.push(' : K]: TimberSegmentParams[K];');
279
+ lines.push('} extends infer U');
280
+ lines.push(' ? { [K in keyof U[keyof U]]: U[keyof U][K] }');
281
+ lines.push(' : never;');
282
+ lines.push('');
283
+
284
+ // RoutesWithParams — filter routes by required param keys
285
+ lines.push(
286
+ '/** Filters TimberRoute to routes whose accumulated params include all listed keys. */'
287
+ );
288
+ lines.push('export type RoutesWithParams<K extends keyof AllSegmentParams> = {');
289
+ lines.push(' [R in TimberRoute]: K extends keyof TimberSegmentParams[R] ? R : never;');
290
+ lines.push('}[TimberRoute];');
291
+
292
+ return lines;
293
+ }
294
+
168
295
  /**
169
296
  * Format the collected routes into a TypeScript declaration file.
170
297
  */
171
- function formatDeclarationFile(routes: RouteEntry[], importBase?: string): string {
298
+ function formatDeclarationFile(
299
+ routes: RouteEntry[],
300
+ importBase?: string,
301
+ hasSchema?: boolean,
302
+ appDir?: string
303
+ ): string {
172
304
  const lines: string[] = [];
173
305
 
174
306
  lines.push('// This file is auto-generated by timber.js route map codegen.');
@@ -180,53 +312,131 @@ function formatDeclarationFile(routes: RouteEntry[], importBase?: string): strin
180
312
  // (removing exports like bindUseQueryStates that aren't listed here).
181
313
  lines.push('export {};');
182
314
  lines.push('');
315
+
316
+ if (hasSchema) {
317
+ // Schema-based codegen: import schema and InferCodecType
318
+ // Compute the schema import path relative to the output directory
319
+ const schemaImport =
320
+ appDir && importBase
321
+ ? './' + relative(importBase, join(appDir, 'schema')).replace(/\\/g, '/')
322
+ : '../app/schema';
323
+ lines.push(`import type schema from '${schemaImport}';`);
324
+ lines.push("import type { InferCodecType, SegmentParamCodec } from '@timber-js/app/params';");
325
+ lines.push('');
326
+ // Collect all unique bracket keys from routes for key validation
327
+ const allBracketKeys = new Set<string>();
328
+ for (const route of routes) {
329
+ for (const p of route.params) {
330
+ allBracketKeys.add(p.bracketName);
331
+ }
332
+ }
333
+
334
+ // Augment the ValidDynamicSegmentKeysRegistry so defineSchema constrains keys
335
+ // to known filesystem segments. Unknown keys produce inline TS errors.
336
+ if (allBracketKeys.size > 0) {
337
+ lines.push("declare module '@timber-js/app/params' {");
338
+ lines.push(' interface ValidDynamicSegmentKeysRegistry {');
339
+ for (const key of [...allBracketKeys].sort()) {
340
+ lines.push(` ${JSON.stringify(key)}: true;`);
341
+ }
342
+ lines.push(' }');
343
+ lines.push('}');
344
+ lines.push('');
345
+ }
346
+ // Type-level validation: each schema value must be a Codec or Standard Schema.
347
+ // Running `pnpm run typecheck` will surface errors for invalid values.
348
+ lines.push('type _AssertSchemaValues = {');
349
+ lines.push(
350
+ " [K in keyof typeof schema['segmentParams']]: typeof schema['segmentParams'][K] extends SegmentParamCodec ? true : ['Error: value for', K, 'is not a valid Codec or Standard Schema'];"
351
+ );
352
+ lines.push('};');
353
+ lines.push('');
354
+ }
355
+
356
+ if (!hasSchema) {
357
+ // TIM-834 P2: emit the shared codec-resolution helper type ONCE so the
358
+ // per-param chain conditionals reference it instead of inlining the
359
+ // fallback in both branches (which grows O(2^N) in chain depth).
360
+ lines.push(emitResolveSegmentFieldHelper());
361
+ lines.push('');
362
+ }
363
+
183
364
  lines.push("declare module '@timber-js/app' {");
184
365
  lines.push(' interface Routes {');
185
366
 
186
367
  for (const route of routes) {
187
- const paramsType = formatParamsType(route.params);
368
+ const paramsType = formatParamsType(route.params, importBase, hasSchema);
188
369
  const searchParamsType = formatSearchParamsType(route, importBase);
189
370
 
190
371
  lines.push(` '${route.urlPath}': {`);
191
- lines.push(` params: ${paramsType}`);
372
+ lines.push(` segmentParams: ${paramsType}`);
192
373
  lines.push(` searchParams: ${searchParamsType}`);
193
374
  lines.push(` }`);
194
375
  }
195
376
 
196
377
  lines.push(' }');
378
+
379
+ // When a global schema exists, emit segment param types inside the
380
+ // @timber-js/app module augmentation so that declare module blocks
381
+ // for @timber-js/app/server and @timber-js/app/client can reference
382
+ // AllSegmentParams via `import type { AllSegmentParams } from '@timber-js/app'`.
383
+ if (hasSchema) {
384
+ lines.push('');
385
+ lines.push(...formatSchemaTypes(routes).map((l) => ` ${l}`));
386
+ }
387
+
197
388
  lines.push('}');
198
389
  lines.push('');
199
390
 
200
- // Generate @timber-js/app/server augmentation — typed searchParams() generic
201
391
  const pageRoutes = routes.filter((r) => !r.isApiRoute);
392
+ const dynamicRoutes = routes.filter((r) => r.params.length > 0);
202
393
 
203
- if (pageRoutes.length > 0) {
394
+ // Generate @timber-js/app/server augmentation — typed getSegmentParams
395
+ if (dynamicRoutes.length > 0) {
204
396
  lines.push("declare module '@timber-js/app/server' {");
205
- lines.push(" import type { Routes } from '@timber-js/app'");
397
+ if (hasSchema) {
398
+ lines.push(" import type { AllSegmentParams } from '@timber-js/app'");
399
+ }
400
+ for (const route of dynamicRoutes) {
401
+ const paramsType = formatParamsType(route.params, importBase, hasSchema);
402
+ lines.push(
403
+ ` export function getSegmentParams(segmentPath: '${route.segmentPath}'): ${paramsType}`
404
+ );
405
+ }
206
406
  lines.push(
207
- " export function searchParams<R extends keyof Routes>(): Promise<Routes[R]['searchParams']>"
407
+ hasSchema
408
+ ? ' export function getSegmentParams(): Partial<AllSegmentParams>'
409
+ : ' export function getSegmentParams(): Record<string, string | string[]>'
208
410
  );
209
411
  lines.push('}');
210
412
  lines.push('');
211
413
  }
212
414
 
213
415
  // Generate overloads for @timber-js/app/client
214
- const dynamicRoutes = routes.filter((r) => r.params.length > 0);
215
416
 
216
417
  if (dynamicRoutes.length > 0 || pageRoutes.length > 0) {
217
418
  lines.push("declare module '@timber-js/app/client' {");
218
419
  lines.push(
219
420
  " import type { SearchParamsDefinition, SetParams, QueryStatesOptions, SearchParamCodec } from '@timber-js/app/search-params'"
220
421
  );
422
+ if (hasSchema) {
423
+ lines.push(" import type { AllSegmentParams } from '@timber-js/app'");
424
+ }
221
425
  lines.push('');
222
426
 
223
- // useParams overloads
427
+ // useSegmentParams overloads
224
428
  if (dynamicRoutes.length > 0) {
225
429
  for (const route of dynamicRoutes) {
226
- const paramsType = formatParamsType(route.params);
227
- lines.push(` export function useParams(route: '${route.urlPath}'): ${paramsType}`);
430
+ const paramsType = formatParamsType(route.params, importBase, hasSchema);
431
+ lines.push(
432
+ ` export function useSegmentParams(segmentPath: '${route.segmentPath}'): ${paramsType}`
433
+ );
228
434
  }
229
- lines.push(' export function useParams(): Record<string, string | string[]>');
435
+ lines.push(
436
+ hasSchema
437
+ ? ' export function useSegmentParams(): Partial<AllSegmentParams>'
438
+ : ' export function useSegmentParams(): Record<string, string | string[]>'
439
+ );
230
440
  lines.push('');
231
441
  }
232
442
 
@@ -236,78 +446,59 @@ function formatDeclarationFile(routes: RouteEntry[], importBase?: string): strin
236
446
  lines.push('');
237
447
  }
238
448
 
239
- // Typed Link overloads
449
+ // Typed Link overloads — per-route with DIRECT types (no conditionals).
450
+ // Direct types preserve TypeScript's excess property checking.
451
+ //
452
+ // TIM-832: per-route and catch-all are emitted as TWO separate
453
+ // augmentation blocks. Per TS's merging rule "later overload sets
454
+ // ordered first", the catch-all block (declared SECOND in this file)
455
+ // ends up FIRST in the merged call-signature list at resolution time,
456
+ // which puts the per-route block LAST — so its error message is the
457
+ // one TypeScript reports when no overload matches. This gives users a
458
+ // clear prop-mismatch error (e.g. "'string | undefined' is not
459
+ // assignable to 'string | number' on id") instead of the old
460
+ // confusing "Type 'string' is not assignable to type 'never'" cascade.
240
461
  if (pageRoutes.length > 0) {
241
- lines.push(' // Typed Link props per route');
242
- lines.push(...formatTypedLinkOverloads(pageRoutes, importBase));
462
+ lines.push(' // Typed Link overloads — per-route (block 1 / emitted first)');
463
+ lines.push(...formatTypedLinkOverloads(pageRoutes, importBase, hasSchema));
464
+ lines.push('');
243
465
  }
244
466
 
245
467
  lines.push('}');
246
468
  lines.push('');
247
469
  }
248
470
 
471
+ // TIM-832: catch-all block — emitted as a SEPARATE `declare module`
472
+ // augmentation so TS's "later overload set first" rule orders it ahead
473
+ // of the per-route block above at resolution time, leaving per-route as
474
+ // the "last overload" whose error TypeScript reports.
475
+ lines.push("declare module '@timber-js/app/client' {");
476
+ lines.push(" import type { SearchParamsDefinition } from '@timber-js/app/search-params'");
477
+ lines.push('');
478
+ lines.push(...formatLinkCatchAllOverloads());
479
+ lines.push('}');
480
+ lines.push('');
481
+
249
482
  return lines.join('\n');
250
483
  }
251
484
 
252
485
  /**
253
486
  * Format the params type for a route entry.
254
487
  */
255
- function formatParamsType(params: ParamEntry[]): string {
256
- if (params.length === 0) {
257
- return '{}';
258
- }
259
-
260
- const fields = params.map((p) => `${p.name}: ${p.type}`);
261
- return `{ ${fields.join('; ')} }`;
262
- }
263
-
264
- /**
265
- * Format the params type for Link props.
266
- *
267
- * Link params accept `string | number` for single dynamic segments
268
- * (convenience — values are stringified at runtime). Catch-all and
269
- * optional catch-all remain `string[]` / `string[] | undefined`.
270
- *
271
- * See design/07-routing.md §"Typed params and searchParams on <Link>"
272
- */
273
- function formatLinkParamsType(params: ParamEntry[]): string {
488
+ function formatParamsType(params: ParamEntry[], importBase?: string, hasSchema?: boolean): string {
274
489
  if (params.length === 0) {
275
490
  return '{}';
276
491
  }
277
492
 
278
493
  const fields = params.map((p) => {
279
- // Single dynamic segments accept string | number for convenience
280
- const type = p.type === 'string' ? 'string | number' : p.type;
281
- return `${p.name}: ${type}`;
494
+ const codecType = hasSchema
495
+ ? buildSchemaParamType(p)
496
+ : buildCodecChainType(p, importBase, p.type);
497
+ return `${p.name}: ${codecType}`;
282
498
  });
283
499
  return `{ ${fields.join('; ')} }`;
284
500
  }
285
501
 
286
- /**
287
- * Format the searchParams type for a route entry.
288
- *
289
- * When a search-params.ts exists, we reference its inferred type via an import type.
290
- * The import path is relative to `importBase` (the directory where the .d.ts will be
291
- * written). When importBase is undefined, falls back to a bare relative path.
292
- */
293
- function formatSearchParamsType(route: RouteEntry, importBase?: string): string {
294
- if (route.hasSearchParams && route.searchParamsAbsPath) {
295
- const absPath = route.searchParamsAbsPath.replace(/\.(ts|tsx)$/, '');
296
- let importPath: string;
297
- if (importBase) {
298
- // Make the path relative to the output directory, converted to posix separators
299
- importPath = './' + relative(importBase, absPath).replace(/\\/g, '/');
300
- } else {
301
- importPath = './' + posix.basename(absPath);
302
- }
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`;
307
- }
308
- return '{}';
309
- }
310
-
311
502
  /**
312
503
  * Generate useQueryStates overloads.
313
504
  *
@@ -337,60 +528,8 @@ function formatUseQueryStatesOverloads(routes: RouteEntry[], importBase?: string
337
528
  return lines;
338
529
  }
339
530
 
340
- /**
341
- * Generate typed Link overloads.
342
- *
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)
347
- *
348
- * Routes without dynamic segments accept href as a literal string with no params.
349
- * Routes with dynamic segments require a params prop.
350
- */
351
- function formatTypedLinkOverloads(routes: RouteEntry[], importBase?: string): string[] {
352
- const lines: string[] = [];
353
-
354
- for (const route of routes) {
355
- const hasDynamicParams = route.params.length > 0;
356
- const paramsType = formatLinkParamsType(route.params);
357
- const searchParamsType = route.hasSearchParams
358
- ? formatSearchParamsType(route, importBase)
359
- : null;
360
-
361
- 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`);
387
- }
388
- }
389
-
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
- );
394
-
395
- return lines;
396
- }
531
+ // Link overload formatters and helpers (`formatTypedLinkOverloads`,
532
+ // `formatLinkCatchAllOverloads`, `formatLinkParamsType`,
533
+ // `buildResolvedPattern`, `LINK_BASE_PROPS_TYPE`) were extracted to
534
+ // `./link-codegen.ts` (TIM-835) to keep this file under the 500-line
535
+ // cap. They are imported at the top of this file.