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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (854) hide show
  1. package/LICENSE +8 -0
  2. package/dist/_chunks/actions-a0RczDnB.js +1106 -0
  3. package/dist/_chunks/actions-a0RczDnB.js.map +1 -0
  4. package/dist/_chunks/build-output-helper-B20ZuTSA.js +102 -0
  5. package/dist/_chunks/build-output-helper-B20ZuTSA.js.map +1 -0
  6. package/dist/_chunks/cache-api-Co-yI-gP.js +424 -0
  7. package/dist/_chunks/cache-api-Co-yI-gP.js.map +1 -0
  8. package/dist/_chunks/{metadata-routes-Cjmvi3rQ.js → canonicalize-P41GR6tY.js} +94 -18
  9. package/dist/_chunks/canonicalize-P41GR6tY.js.map +1 -0
  10. package/dist/_chunks/cli-schema-sync-DJDdyEae.js +629 -0
  11. package/dist/_chunks/cli-schema-sync-DJDdyEae.js.map +1 -0
  12. package/dist/_chunks/cli-schema-sync-D_IhHEUW.js +2 -0
  13. package/dist/_chunks/codec-registry-oOUxugz3.js +21 -0
  14. package/dist/_chunks/codec-registry-oOUxugz3.js.map +1 -0
  15. package/dist/_chunks/define-Bssfp6ot.js +82 -0
  16. package/dist/_chunks/define-Bssfp6ot.js.map +1 -0
  17. package/dist/_chunks/define-CFmvb4Bt.js +203 -0
  18. package/dist/_chunks/define-CFmvb4Bt.js.map +1 -0
  19. package/dist/_chunks/fast-hash-D6hIVt1Y.js +36 -0
  20. package/dist/_chunks/fast-hash-D6hIVt1Y.js.map +1 -0
  21. package/dist/_chunks/format-CfwjgPz9.js +14 -0
  22. package/dist/_chunks/format-CfwjgPz9.js.map +1 -0
  23. package/dist/_chunks/href-validation-FiA_rToW.js +141 -0
  24. package/dist/_chunks/href-validation-FiA_rToW.js.map +1 -0
  25. package/dist/_chunks/logger-CM0clugc.js +645 -0
  26. package/dist/_chunks/logger-CM0clugc.js.map +1 -0
  27. package/dist/_chunks/navigation-root-bUDZLw74.js +124 -0
  28. package/dist/_chunks/navigation-root-bUDZLw74.js.map +1 -0
  29. package/dist/_chunks/plugin-context-DurqFBuY.js +2 -0
  30. package/dist/_chunks/plugin-context-GfDWsdd2.js +268 -0
  31. package/dist/_chunks/plugin-context-GfDWsdd2.js.map +1 -0
  32. package/dist/_chunks/registry-DbJPKoBp.js +20 -0
  33. package/dist/_chunks/registry-DbJPKoBp.js.map +1 -0
  34. package/dist/_chunks/resolve-schema-3iUvBV5T.js +50 -0
  35. package/dist/_chunks/resolve-schema-3iUvBV5T.js.map +1 -0
  36. package/dist/_chunks/router-ref-CtmF-aPv.js +28 -0
  37. package/dist/_chunks/router-ref-CtmF-aPv.js.map +1 -0
  38. package/dist/_chunks/schema-bridge-BY3QLBL7.js +119 -0
  39. package/dist/_chunks/schema-bridge-BY3QLBL7.js.map +1 -0
  40. package/dist/_chunks/segment-classify-CDDRVKs7.js +137 -0
  41. package/dist/_chunks/segment-classify-CDDRVKs7.js.map +1 -0
  42. package/dist/_chunks/segment-context-ZDnXDkbz.js +34 -0
  43. package/dist/_chunks/segment-context-ZDnXDkbz.js.map +1 -0
  44. package/dist/_chunks/{ssr-data-MjmprTmO.js → ssr-data-BOWsq18U.js} +1 -1
  45. package/dist/_chunks/ssr-data-BOWsq18U.js.map +1 -0
  46. package/dist/_chunks/tree-match-D2l830j2.js +102 -0
  47. package/dist/_chunks/tree-match-D2l830j2.js.map +1 -0
  48. package/dist/_chunks/{use-query-states-D5KaffOK.js → use-query-states-CbeQmext.js} +7 -20
  49. package/dist/_chunks/use-query-states-CbeQmext.js.map +1 -0
  50. package/dist/_chunks/use-segment-params-D1CzlgBo.js +151 -0
  51. package/dist/_chunks/use-segment-params-D1CzlgBo.js.map +1 -0
  52. package/dist/_chunks/validation-taUkvA4Q.js +113 -0
  53. package/dist/_chunks/validation-taUkvA4Q.js.map +1 -0
  54. package/dist/_chunks/walkers-DvWDj453.js +790 -0
  55. package/dist/_chunks/walkers-DvWDj453.js.map +1 -0
  56. package/dist/adapters/build-output-helper.d.ts +28 -0
  57. package/dist/adapters/build-output-helper.d.ts.map +1 -0
  58. package/dist/adapters/cloudflare-dev.d.ts +109 -0
  59. package/dist/adapters/cloudflare-dev.d.ts.map +1 -0
  60. package/dist/adapters/cloudflare-dev.js +73 -0
  61. package/dist/adapters/cloudflare-dev.js.map +1 -0
  62. package/dist/adapters/cloudflare-kv-cache.d.ts +64 -0
  63. package/dist/adapters/cloudflare-kv-cache.d.ts.map +1 -0
  64. package/dist/adapters/cloudflare-kv-cache.js +117 -0
  65. package/dist/adapters/cloudflare-kv-cache.js.map +1 -0
  66. package/dist/adapters/cloudflare.d.ts +142 -20
  67. package/dist/adapters/cloudflare.d.ts.map +1 -1
  68. package/dist/adapters/cloudflare.js +150 -64
  69. package/dist/adapters/cloudflare.js.map +1 -1
  70. package/dist/adapters/compress-module.d.ts +5 -4
  71. package/dist/adapters/compress-module.d.ts.map +1 -1
  72. package/dist/adapters/nitro.d.ts +17 -3
  73. package/dist/adapters/nitro.d.ts.map +1 -1
  74. package/dist/adapters/nitro.js +146 -147
  75. package/dist/adapters/nitro.js.map +1 -1
  76. package/dist/adapters/shared.d.ts +16 -0
  77. package/dist/adapters/shared.d.ts.map +1 -0
  78. package/dist/cache/cache-api.d.ts +24 -0
  79. package/dist/cache/cache-api.d.ts.map +1 -0
  80. package/dist/cache/handler-store.d.ts +31 -0
  81. package/dist/cache/handler-store.d.ts.map +1 -0
  82. package/dist/cache/index.d.ts +25 -7
  83. package/dist/cache/index.d.ts.map +1 -1
  84. package/dist/cache/index.js +100 -240
  85. package/dist/cache/index.js.map +1 -1
  86. package/dist/cache/invalidation-epoch.d.ts +43 -0
  87. package/dist/cache/invalidation-epoch.d.ts.map +1 -0
  88. package/dist/cache/redis-handler.d.ts +85 -8
  89. package/dist/cache/redis-handler.d.ts.map +1 -1
  90. package/dist/cache/singleflight.d.ts +18 -1
  91. package/dist/cache/singleflight.d.ts.map +1 -1
  92. package/dist/cache/sizeof.d.ts +22 -0
  93. package/dist/cache/sizeof.d.ts.map +1 -0
  94. package/dist/cache/stable-stringify.d.ts +9 -0
  95. package/dist/cache/stable-stringify.d.ts.map +1 -1
  96. package/dist/cache/timber-cache.d.ts +20 -10
  97. package/dist/cache/timber-cache.d.ts.map +1 -1
  98. package/dist/cli-schema-sync.d.ts +59 -0
  99. package/dist/cli-schema-sync.d.ts.map +1 -0
  100. package/dist/cli.d.ts +26 -2
  101. package/dist/cli.d.ts.map +1 -1
  102. package/dist/cli.js +70 -33
  103. package/dist/cli.js.map +1 -1
  104. package/dist/client/browser-dev.d.ts +34 -1
  105. package/dist/client/browser-dev.d.ts.map +1 -1
  106. package/dist/client/browser-entry/action-dispatch.d.ts +17 -0
  107. package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -0
  108. package/dist/client/browser-entry/hmr.d.ts +21 -0
  109. package/dist/client/browser-entry/hmr.d.ts.map +1 -0
  110. package/dist/client/browser-entry/hydrate.d.ts +46 -0
  111. package/dist/client/browser-entry/hydrate.d.ts.map +1 -0
  112. package/dist/client/browser-entry/index.d.ts +29 -0
  113. package/dist/client/browser-entry/index.d.ts.map +1 -0
  114. package/dist/client/browser-entry/post-hydration.d.ts +26 -0
  115. package/dist/client/browser-entry/post-hydration.d.ts.map +1 -0
  116. package/dist/client/browser-entry/router-init.d.ts +26 -0
  117. package/dist/client/browser-entry/router-init.d.ts.map +1 -0
  118. package/dist/client/browser-entry/rsc-stream.d.ts +24 -0
  119. package/dist/client/browser-entry/rsc-stream.d.ts.map +1 -0
  120. package/dist/client/browser-entry/scroll.d.ts +28 -0
  121. package/dist/client/browser-entry/scroll.d.ts.map +1 -0
  122. package/dist/client/error-boundary.d.ts +12 -5
  123. package/dist/client/error-boundary.d.ts.map +1 -1
  124. package/dist/client/error-boundary.js +47 -10
  125. package/dist/client/error-boundary.js.map +1 -1
  126. package/dist/client/error-reconstituter.d.ts +61 -0
  127. package/dist/client/error-reconstituter.d.ts.map +1 -0
  128. package/dist/client/form.d.ts +16 -27
  129. package/dist/client/form.d.ts.map +1 -1
  130. package/dist/client/history.d.ts +11 -3
  131. package/dist/client/history.d.ts.map +1 -1
  132. package/dist/client/index.d.ts +10 -24
  133. package/dist/client/index.d.ts.map +1 -1
  134. package/dist/client/index.js +183 -1134
  135. package/dist/client/index.js.map +1 -1
  136. package/dist/client/internal.d.ts +19 -0
  137. package/dist/client/internal.d.ts.map +1 -0
  138. package/dist/client/internal.js +900 -0
  139. package/dist/client/internal.js.map +1 -0
  140. package/dist/client/link.d.ts +69 -60
  141. package/dist/client/link.d.ts.map +1 -1
  142. package/dist/client/navigation-api-types.d.ts +90 -0
  143. package/dist/client/navigation-api-types.d.ts.map +1 -0
  144. package/dist/client/navigation-api.d.ts +122 -0
  145. package/dist/client/navigation-api.d.ts.map +1 -0
  146. package/dist/client/navigation-context.d.ts +3 -2
  147. package/dist/client/navigation-context.d.ts.map +1 -1
  148. package/dist/client/navigation-root.d.ts +119 -0
  149. package/dist/client/navigation-root.d.ts.map +1 -0
  150. package/dist/client/nuqs-adapter.d.ts +1 -1
  151. package/dist/client/nuqs-adapter.d.ts.map +1 -1
  152. package/dist/client/router-ref.d.ts +1 -1
  153. package/dist/client/router.d.ts +86 -10
  154. package/dist/client/router.d.ts.map +1 -1
  155. package/dist/client/rsc-fetch.d.ts +46 -3
  156. package/dist/client/rsc-fetch.d.ts.map +1 -1
  157. package/dist/client/segment-cache.d.ts +3 -1
  158. package/dist/client/segment-cache.d.ts.map +1 -1
  159. package/dist/client/segment-outlet.d.ts +49 -0
  160. package/dist/client/segment-outlet.d.ts.map +1 -0
  161. package/dist/client/segment-update-context.d.ts +21 -0
  162. package/dist/client/segment-update-context.d.ts.map +1 -0
  163. package/dist/client/shallow-url.d.ts +10 -0
  164. package/dist/client/shallow-url.d.ts.map +1 -0
  165. package/dist/client/ssr-data.d.ts +13 -4
  166. package/dist/client/ssr-data.d.ts.map +1 -1
  167. package/dist/client/state.d.ts +1 -1
  168. package/dist/client/top-loader.d.ts +5 -5
  169. package/dist/client/top-loader.d.ts.map +1 -1
  170. package/dist/client/use-cookie.d.ts +12 -0
  171. package/dist/client/use-cookie.d.ts.map +1 -1
  172. package/dist/client/use-link-status.d.ts +5 -5
  173. package/dist/client/use-link-status.d.ts.map +1 -1
  174. package/dist/client/use-pathname.d.ts.map +1 -1
  175. package/dist/client/use-pending-navigation.d.ts +23 -0
  176. package/dist/client/use-pending-navigation.d.ts.map +1 -0
  177. package/dist/client/use-query-states.d.ts +1 -1
  178. package/dist/client/use-query-states.d.ts.map +1 -1
  179. package/dist/client/use-router.d.ts +1 -1
  180. package/dist/client/use-router.d.ts.map +1 -1
  181. package/dist/client/use-search-params.d.ts +12 -5
  182. package/dist/client/use-search-params.d.ts.map +1 -1
  183. package/dist/client/{use-params.d.ts → use-segment-params.d.ts} +8 -6
  184. package/dist/client/use-segment-params.d.ts.map +1 -0
  185. package/dist/codec.d.ts +69 -0
  186. package/dist/codec.d.ts.map +1 -0
  187. package/dist/codec.js +75 -0
  188. package/dist/codec.js.map +1 -0
  189. package/dist/config-types.d.ts +294 -0
  190. package/dist/config-types.d.ts.map +1 -0
  191. package/dist/config-validation.d.ts +51 -0
  192. package/dist/config-validation.d.ts.map +1 -0
  193. package/dist/content/index.d.ts +1 -10
  194. package/dist/content/index.d.ts.map +1 -1
  195. package/dist/content/index.js +0 -2
  196. package/dist/cookies/define-cookie.d.ts +58 -25
  197. package/dist/cookies/define-cookie.d.ts.map +1 -1
  198. package/dist/cookies/index.d.ts +2 -1
  199. package/dist/cookies/index.d.ts.map +1 -1
  200. package/dist/cookies/index.js +249 -36
  201. package/dist/cookies/index.js.map +1 -1
  202. package/dist/cookies/json-cookie.d.ts +64 -0
  203. package/dist/cookies/json-cookie.d.ts.map +1 -0
  204. package/dist/cookies/validation.d.ts +34 -0
  205. package/dist/cookies/validation.d.ts.map +1 -0
  206. package/dist/dev-tools/404-page.d.ts +50 -0
  207. package/dist/dev-tools/404-page.d.ts.map +1 -0
  208. package/dist/dev-tools/browser-logs.d.ts +84 -0
  209. package/dist/dev-tools/browser-logs.d.ts.map +1 -0
  210. package/dist/dev-tools/dev-page-shell.d.ts +78 -0
  211. package/dist/dev-tools/dev-page-shell.d.ts.map +1 -0
  212. package/dist/dev-tools/error-page.d.ts +32 -0
  213. package/dist/dev-tools/error-page.d.ts.map +1 -0
  214. package/dist/dev-tools/holding-server.d.ts +54 -0
  215. package/dist/dev-tools/holding-server.d.ts.map +1 -0
  216. package/dist/dev-tools/hydration-overlay.d.ts +11 -0
  217. package/dist/dev-tools/hydration-overlay.d.ts.map +1 -0
  218. package/dist/dev-tools/index.d.ts +31 -0
  219. package/dist/dev-tools/index.d.ts.map +1 -0
  220. package/dist/dev-tools/instrumentation.d.ts +59 -0
  221. package/dist/dev-tools/instrumentation.d.ts.map +1 -0
  222. package/dist/{server/dev-logger.d.ts → dev-tools/logger.d.ts} +1 -1
  223. package/dist/dev-tools/logger.d.ts.map +1 -0
  224. package/dist/{plugins/dev-logs.d.ts → dev-tools/logs.d.ts} +2 -2
  225. package/dist/dev-tools/logs.d.ts.map +1 -0
  226. package/dist/dev-tools/overlay.d.ts +91 -0
  227. package/dist/dev-tools/overlay.d.ts.map +1 -0
  228. package/dist/dev-tools/stack-classifier.d.ts +34 -0
  229. package/dist/dev-tools/stack-classifier.d.ts.map +1 -0
  230. package/dist/dev-tools/terminal.d.ts +28 -0
  231. package/dist/dev-tools/terminal.d.ts.map +1 -0
  232. package/dist/fonts/ast-walk.d.ts +68 -0
  233. package/dist/fonts/ast-walk.d.ts.map +1 -0
  234. package/dist/fonts/ast.d.ts +110 -6
  235. package/dist/fonts/ast.d.ts.map +1 -1
  236. package/dist/fonts/bundle.d.ts +50 -0
  237. package/dist/fonts/bundle.d.ts.map +1 -0
  238. package/dist/fonts/dev-middleware.d.ts +22 -0
  239. package/dist/fonts/dev-middleware.d.ts.map +1 -0
  240. package/dist/fonts/fallbacks.d.ts +0 -7
  241. package/dist/fonts/fallbacks.d.ts.map +1 -1
  242. package/dist/fonts/google.d.ts +4 -2
  243. package/dist/fonts/google.d.ts.map +1 -1
  244. package/dist/fonts/local.d.ts +4 -4
  245. package/dist/fonts/local.d.ts.map +1 -1
  246. package/dist/fonts/paths.d.ts +43 -0
  247. package/dist/fonts/paths.d.ts.map +1 -0
  248. package/dist/fonts/pipeline.d.ts +158 -0
  249. package/dist/fonts/pipeline.d.ts.map +1 -0
  250. package/dist/fonts/transform.d.ts +78 -0
  251. package/dist/fonts/transform.d.ts.map +1 -0
  252. package/dist/fonts/types.d.ts +47 -1
  253. package/dist/fonts/types.d.ts.map +1 -1
  254. package/dist/fonts/virtual-modules.d.ts +77 -0
  255. package/dist/fonts/virtual-modules.d.ts.map +1 -0
  256. package/dist/index.d.ts +46 -180
  257. package/dist/index.d.ts.map +1 -1
  258. package/dist/index.js +6452 -13421
  259. package/dist/index.js.map +1 -1
  260. package/dist/params/codec-registry.d.ts +26 -0
  261. package/dist/params/codec-registry.d.ts.map +1 -0
  262. package/dist/params/define-schema.d.ts +81 -0
  263. package/dist/params/define-schema.d.ts.map +1 -0
  264. package/dist/params/index.d.ts +5 -0
  265. package/dist/params/index.d.ts.map +1 -0
  266. package/dist/params/index.js +34 -0
  267. package/dist/params/index.js.map +1 -0
  268. package/dist/params/resolve-schema.d.ts +34 -0
  269. package/dist/params/resolve-schema.d.ts.map +1 -0
  270. package/dist/plugin-context.d.ts +137 -0
  271. package/dist/plugin-context.d.ts.map +1 -0
  272. package/dist/plugins/adapter-build.d.ts +20 -1
  273. package/dist/plugins/adapter-build.d.ts.map +1 -1
  274. package/dist/plugins/build-manifest.d.ts +7 -3
  275. package/dist/plugins/build-manifest.d.ts.map +1 -1
  276. package/dist/plugins/build-report.d.ts +9 -7
  277. package/dist/plugins/build-report.d.ts.map +1 -1
  278. package/dist/plugins/cache.d.ts +73 -0
  279. package/dist/plugins/cache.d.ts.map +1 -0
  280. package/dist/plugins/client-chunks.d.ts +39 -0
  281. package/dist/plugins/client-chunks.d.ts.map +1 -0
  282. package/dist/plugins/cloudflare-wasm.d.ts +21 -0
  283. package/dist/plugins/cloudflare-wasm.d.ts.map +1 -0
  284. package/dist/plugins/content.d.ts +1 -1
  285. package/dist/plugins/content.d.ts.map +1 -1
  286. package/dist/plugins/dev-server.d.ts +17 -1
  287. package/dist/plugins/dev-server.d.ts.map +1 -1
  288. package/dist/plugins/entries.d.ts +1 -1
  289. package/dist/plugins/entries.d.ts.map +1 -1
  290. package/dist/plugins/fonts.d.ts +16 -73
  291. package/dist/plugins/fonts.d.ts.map +1 -1
  292. package/dist/plugins/mdx.d.ts +1 -1
  293. package/dist/plugins/mdx.d.ts.map +1 -1
  294. package/dist/plugins/routing.d.ts +1 -1
  295. package/dist/plugins/routing.d.ts.map +1 -1
  296. package/dist/plugins/server-bundle.d.ts.map +1 -1
  297. package/dist/plugins/shims.d.ts +29 -5
  298. package/dist/plugins/shims.d.ts.map +1 -1
  299. package/dist/plugins/static-build.d.ts +5 -26
  300. package/dist/plugins/static-build.d.ts.map +1 -1
  301. package/dist/routing/codegen-shared.d.ts +67 -0
  302. package/dist/routing/codegen-shared.d.ts.map +1 -0
  303. package/dist/routing/codegen-types.d.ts +64 -0
  304. package/dist/routing/codegen-types.d.ts.map +1 -0
  305. package/dist/routing/codegen.d.ts +7 -2
  306. package/dist/routing/codegen.d.ts.map +1 -1
  307. package/dist/routing/convention-lint.d.ts +41 -0
  308. package/dist/routing/convention-lint.d.ts.map +1 -0
  309. package/dist/routing/file-cache.d.ts +8 -0
  310. package/dist/routing/file-cache.d.ts.map +1 -0
  311. package/dist/routing/index.d.ts +7 -1
  312. package/dist/routing/index.d.ts.map +1 -1
  313. package/dist/routing/index.js +4 -2
  314. package/dist/routing/interception.d.ts +0 -5
  315. package/dist/routing/interception.d.ts.map +1 -1
  316. package/dist/routing/link-codegen.d.ts +90 -0
  317. package/dist/routing/link-codegen.d.ts.map +1 -0
  318. package/dist/routing/manifest-codegen.d.ts +32 -0
  319. package/dist/routing/manifest-codegen.d.ts.map +1 -0
  320. package/dist/routing/scanner.d.ts +1 -10
  321. package/dist/routing/scanner.d.ts.map +1 -1
  322. package/dist/routing/schema-validation.d.ts +35 -0
  323. package/dist/routing/schema-validation.d.ts.map +1 -0
  324. package/dist/routing/segment-classify.d.ts +75 -0
  325. package/dist/routing/segment-classify.d.ts.map +1 -0
  326. package/dist/routing/segment-codegen.d.ts +38 -0
  327. package/dist/routing/segment-codegen.d.ts.map +1 -0
  328. package/dist/routing/types.d.ts +77 -25
  329. package/dist/routing/types.d.ts.map +1 -1
  330. package/dist/routing/walkers.d.ts +51 -0
  331. package/dist/routing/walkers.d.ts.map +1 -0
  332. package/dist/rsc-runtime/rsc.d.ts +1 -1
  333. package/dist/rsc-runtime/rsc.d.ts.map +1 -1
  334. package/dist/rsc-runtime/ssr.d.ts +12 -0
  335. package/dist/rsc-runtime/ssr.d.ts.map +1 -1
  336. package/dist/schema-bridge.d.ts +91 -0
  337. package/dist/schema-bridge.d.ts.map +1 -0
  338. package/dist/search-params/define.d.ts +157 -0
  339. package/dist/search-params/define.d.ts.map +1 -0
  340. package/dist/search-params/index.d.ts +4 -7
  341. package/dist/search-params/index.d.ts.map +1 -1
  342. package/dist/search-params/index.js +37 -440
  343. package/dist/search-params/index.js.map +1 -1
  344. package/dist/search-params/registry.d.ts +2 -2
  345. package/dist/search-params/registry.d.ts.map +1 -1
  346. package/dist/search-params/wrappers.d.ts +53 -0
  347. package/dist/search-params/wrappers.d.ts.map +1 -0
  348. package/dist/segment-params/define.d.ts +89 -0
  349. package/dist/segment-params/define.d.ts.map +1 -0
  350. package/dist/segment-params/index.d.ts +3 -0
  351. package/dist/segment-params/index.d.ts.map +1 -0
  352. package/dist/segment-params/index.js +2 -0
  353. package/dist/server/access-gate.d.ts +8 -3
  354. package/dist/server/access-gate.d.ts.map +1 -1
  355. package/dist/server/action-client.d.ts +41 -6
  356. package/dist/server/action-client.d.ts.map +1 -1
  357. package/dist/server/action-encryption.d.ts +76 -0
  358. package/dist/server/action-encryption.d.ts.map +1 -0
  359. package/dist/server/action-handler.d.ts +35 -1
  360. package/dist/server/action-handler.d.ts.map +1 -1
  361. package/dist/server/actions.d.ts +9 -30
  362. package/dist/server/actions.d.ts.map +1 -1
  363. package/dist/server/als-registry.d.ts +70 -11
  364. package/dist/server/als-registry.d.ts.map +1 -1
  365. package/dist/server/asset-headers.d.ts +1 -15
  366. package/dist/server/asset-headers.d.ts.map +1 -1
  367. package/dist/server/body-limits.d.ts.map +1 -1
  368. package/dist/server/build-manifest.d.ts +6 -29
  369. package/dist/server/build-manifest.d.ts.map +1 -1
  370. package/dist/server/canonicalize.d.ts +10 -0
  371. package/dist/server/canonicalize.d.ts.map +1 -1
  372. package/dist/server/coalesce-tick.d.ts +40 -0
  373. package/dist/server/coalesce-tick.d.ts.map +1 -0
  374. package/dist/server/cookie-context.d.ts +170 -0
  375. package/dist/server/cookie-context.d.ts.map +1 -0
  376. package/dist/server/cookie-parsing.d.ts +51 -0
  377. package/dist/server/cookie-parsing.d.ts.map +1 -0
  378. package/dist/server/csrf.d.ts +3 -2
  379. package/dist/server/csrf.d.ts.map +1 -1
  380. package/dist/server/default-logger.d.ts +22 -0
  381. package/dist/server/default-logger.d.ts.map +1 -0
  382. package/dist/server/deny-boundary.d.ts +115 -0
  383. package/dist/server/deny-boundary.d.ts.map +1 -0
  384. package/dist/server/deny-renderer.d.ts +2 -2
  385. package/dist/server/deny-renderer.d.ts.map +1 -1
  386. package/dist/server/dev-source-map.d.ts +22 -0
  387. package/dist/server/dev-source-map.d.ts.map +1 -0
  388. package/dist/server/early-hints-sender.d.ts.map +1 -1
  389. package/dist/server/early-hints.d.ts +13 -11
  390. package/dist/server/early-hints.d.ts.map +1 -1
  391. package/dist/server/error-boundary-wrapper.d.ts +7 -1
  392. package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
  393. package/dist/server/fallback-error.d.ts +12 -7
  394. package/dist/server/fallback-error.d.ts.map +1 -1
  395. package/dist/server/flight-injection-state.d.ts +66 -0
  396. package/dist/server/flight-injection-state.d.ts.map +1 -0
  397. package/dist/server/flight-scripts.d.ts +42 -0
  398. package/dist/server/flight-scripts.d.ts.map +1 -0
  399. package/dist/server/form-data.d.ts +29 -0
  400. package/dist/server/form-data.d.ts.map +1 -1
  401. package/dist/server/html-injector-core.d.ts +221 -0
  402. package/dist/server/html-injector-core.d.ts.map +1 -0
  403. package/dist/server/html-injectors.d.ts +81 -41
  404. package/dist/server/html-injectors.d.ts.map +1 -1
  405. package/dist/server/index.d.ts +10 -46
  406. package/dist/server/index.d.ts.map +1 -1
  407. package/dist/server/index.js +170 -2911
  408. package/dist/server/index.js.map +1 -1
  409. package/dist/server/internal.d.ts +44 -0
  410. package/dist/server/internal.d.ts.map +1 -0
  411. package/dist/server/internal.js +3015 -0
  412. package/dist/server/internal.js.map +1 -0
  413. package/dist/server/logger.d.ts +39 -7
  414. package/dist/server/logger.d.ts.map +1 -1
  415. package/dist/server/metadata-routes.d.ts +23 -7
  416. package/dist/server/metadata-routes.d.ts.map +1 -1
  417. package/dist/server/middleware-runner.d.ts +36 -4
  418. package/dist/server/middleware-runner.d.ts.map +1 -1
  419. package/dist/server/node-stream-transforms.d.ts +119 -0
  420. package/dist/server/node-stream-transforms.d.ts.map +1 -0
  421. package/dist/server/param-coercion.d.ts +54 -0
  422. package/dist/server/param-coercion.d.ts.map +1 -0
  423. package/dist/server/pipeline-helpers.d.ts +95 -0
  424. package/dist/server/pipeline-helpers.d.ts.map +1 -0
  425. package/dist/server/pipeline-interception.d.ts +1 -1
  426. package/dist/server/pipeline-interception.d.ts.map +1 -1
  427. package/dist/server/pipeline-metadata.d.ts +6 -0
  428. package/dist/server/pipeline-metadata.d.ts.map +1 -1
  429. package/dist/server/pipeline-outcome.d.ts +49 -0
  430. package/dist/server/pipeline-outcome.d.ts.map +1 -0
  431. package/dist/server/pipeline-phases.d.ts +56 -0
  432. package/dist/server/pipeline-phases.d.ts.map +1 -0
  433. package/dist/server/pipeline.d.ts +122 -19
  434. package/dist/server/pipeline.d.ts.map +1 -1
  435. package/dist/server/port-resolution.d.ts +117 -0
  436. package/dist/server/port-resolution.d.ts.map +1 -0
  437. package/dist/server/primitives.d.ts +75 -31
  438. package/dist/server/primitives.d.ts.map +1 -1
  439. package/dist/server/render-timeout.d.ts +51 -0
  440. package/dist/server/render-timeout.d.ts.map +1 -0
  441. package/dist/server/render-utils.d.ts +25 -0
  442. package/dist/server/render-utils.d.ts.map +1 -0
  443. package/dist/server/request-context.d.ts +62 -107
  444. package/dist/server/request-context.d.ts.map +1 -1
  445. package/dist/server/route-element-builder.d.ts +30 -18
  446. package/dist/server/route-element-builder.d.ts.map +1 -1
  447. package/dist/server/route-handler.d.ts.map +1 -1
  448. package/dist/server/route-matcher.d.ts +25 -36
  449. package/dist/server/route-matcher.d.ts.map +1 -1
  450. package/dist/server/rsc-entry/action-middleware-runner.d.ts +66 -0
  451. package/dist/server/rsc-entry/action-middleware-runner.d.ts.map +1 -0
  452. package/dist/server/rsc-entry/api-handler.d.ts +12 -3
  453. package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
  454. package/dist/server/rsc-entry/error-renderer.d.ts +26 -13
  455. package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
  456. package/dist/server/rsc-entry/helpers.d.ts +51 -23
  457. package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
  458. package/dist/server/rsc-entry/index.d.ts +19 -8
  459. package/dist/server/rsc-entry/index.d.ts.map +1 -1
  460. package/dist/server/rsc-entry/render-route.d.ts +50 -0
  461. package/dist/server/rsc-entry/render-route.d.ts.map +1 -0
  462. package/dist/server/rsc-entry/revalidate-renderer.d.ts +108 -0
  463. package/dist/server/rsc-entry/revalidate-renderer.d.ts.map +1 -0
  464. package/dist/server/rsc-entry/rsc-payload.d.ts +3 -3
  465. package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
  466. package/dist/server/rsc-entry/rsc-stream.d.ts +17 -1
  467. package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
  468. package/dist/server/rsc-entry/ssr-bridge.d.ts +5 -1
  469. package/dist/server/rsc-entry/ssr-bridge.d.ts.map +1 -1
  470. package/dist/server/rsc-entry/ssr-renderer.d.ts +34 -4
  471. package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
  472. package/dist/server/rsc-entry/wrap-action-dispatch.d.ts +119 -0
  473. package/dist/server/rsc-entry/wrap-action-dispatch.d.ts.map +1 -0
  474. package/dist/server/safe-load.d.ts +46 -0
  475. package/dist/server/safe-load.d.ts.map +1 -0
  476. package/dist/server/sensitive-fields.d.ts +74 -0
  477. package/dist/server/sensitive-fields.d.ts.map +1 -0
  478. package/dist/server/sitemap-generator.d.ts +129 -0
  479. package/dist/server/sitemap-generator.d.ts.map +1 -0
  480. package/dist/server/sitemap-handler.d.ts +22 -0
  481. package/dist/server/sitemap-handler.d.ts.map +1 -0
  482. package/dist/server/slot-resolver.d.ts +7 -5
  483. package/dist/server/slot-resolver.d.ts.map +1 -1
  484. package/dist/server/ssr-bridge-types.d.ts +121 -0
  485. package/dist/server/ssr-bridge-types.d.ts.map +1 -0
  486. package/dist/server/ssr-entry.d.ts +2 -43
  487. package/dist/server/ssr-entry.d.ts.map +1 -1
  488. package/dist/server/ssr-render.d.ts +64 -21
  489. package/dist/server/ssr-render.d.ts.map +1 -1
  490. package/dist/server/ssr-wrappers.d.ts +50 -0
  491. package/dist/server/ssr-wrappers.d.ts.map +1 -0
  492. package/dist/server/state-tree-diff.d.ts +12 -5
  493. package/dist/server/state-tree-diff.d.ts.map +1 -1
  494. package/dist/server/status-code-resolver.d.ts +22 -11
  495. package/dist/server/status-code-resolver.d.ts.map +1 -1
  496. package/dist/server/stream-utils.d.ts +36 -0
  497. package/dist/server/stream-utils.d.ts.map +1 -0
  498. package/dist/server/tracing.d.ts +7 -6
  499. package/dist/server/tracing.d.ts.map +1 -1
  500. package/dist/server/tree-builder.d.ts +62 -30
  501. package/dist/server/tree-builder.d.ts.map +1 -1
  502. package/dist/server/tree-match.d.ts +49 -0
  503. package/dist/server/tree-match.d.ts.map +1 -0
  504. package/dist/server/types.d.ts +71 -6
  505. package/dist/server/types.d.ts.map +1 -1
  506. package/dist/server/utils/escape-html.d.ts +14 -0
  507. package/dist/server/utils/escape-html.d.ts.map +1 -0
  508. package/dist/server/utils/mdx-file.d.ts +15 -0
  509. package/dist/server/utils/mdx-file.d.ts.map +1 -0
  510. package/dist/server/version-skew.d.ts +61 -0
  511. package/dist/server/version-skew.d.ts.map +1 -0
  512. package/dist/shared/head-header.d.ts +54 -0
  513. package/dist/shared/head-header.d.ts.map +1 -0
  514. package/dist/shared/href-validation.d.ts +49 -0
  515. package/dist/shared/href-validation.d.ts.map +1 -0
  516. package/dist/shared/merge-search-params.d.ts +22 -0
  517. package/dist/shared/merge-search-params.d.ts.map +1 -0
  518. package/dist/shared/redirect-type.d.ts +17 -0
  519. package/dist/shared/redirect-type.d.ts.map +1 -0
  520. package/dist/shims/font-google.d.ts +1 -1
  521. package/dist/shims/font-google.d.ts.map +1 -1
  522. package/dist/shims/font-google.js +42 -0
  523. package/dist/shims/font-google.js.map +1 -0
  524. package/dist/shims/font-local.d.ts +26 -0
  525. package/dist/shims/font-local.d.ts.map +1 -0
  526. package/dist/shims/font-local.js +20 -0
  527. package/dist/shims/font-local.js.map +1 -0
  528. package/dist/shims/headers.d.ts +53 -1
  529. package/dist/shims/headers.d.ts.map +1 -1
  530. package/dist/shims/image.d.ts +16 -16
  531. package/dist/shims/navigation-client.d.ts +35 -11
  532. package/dist/shims/navigation-client.d.ts.map +1 -1
  533. package/dist/shims/navigation.d.ts +11 -5
  534. package/dist/shims/navigation.d.ts.map +1 -1
  535. package/dist/utils/state-machine.d.ts +80 -0
  536. package/dist/utils/state-machine.d.ts.map +1 -0
  537. package/package.json +63 -24
  538. package/src/adapters/build-output-helper.ts +139 -0
  539. package/src/adapters/cloudflare-dev.ts +177 -0
  540. package/src/adapters/cloudflare-kv-cache.ts +179 -0
  541. package/src/adapters/cloudflare.ts +356 -116
  542. package/src/adapters/compress-module.ts +27 -92
  543. package/src/adapters/nitro.ts +155 -99
  544. package/src/adapters/raw-imports.d.ts +5 -0
  545. package/src/adapters/shared.ts +40 -0
  546. package/src/adapters/wrangler.d.ts +7 -0
  547. package/src/cache/cache-api.ts +47 -0
  548. package/src/cache/handler-store.ts +68 -0
  549. package/src/cache/index.ts +84 -18
  550. package/src/cache/invalidation-epoch.ts +93 -0
  551. package/src/cache/redis-handler.ts +110 -15
  552. package/src/cache/singleflight.ts +62 -4
  553. package/src/cache/sizeof.ts +33 -0
  554. package/src/cache/stable-stringify.ts +65 -2
  555. package/src/cache/timber-cache.ts +132 -36
  556. package/src/cli-schema-sync.ts +388 -0
  557. package/src/cli.ts +98 -34
  558. package/src/client/browser-dev.ts +153 -1
  559. package/src/client/browser-entry/action-dispatch.ts +119 -0
  560. package/src/client/browser-entry/hmr.ts +70 -0
  561. package/src/client/browser-entry/hydrate.ts +187 -0
  562. package/src/client/browser-entry/index.ts +111 -0
  563. package/src/client/browser-entry/post-hydration.ts +104 -0
  564. package/src/client/browser-entry/router-init.ts +292 -0
  565. package/src/client/browser-entry/rsc-stream.ts +157 -0
  566. package/src/client/browser-entry/scroll.ts +50 -0
  567. package/src/client/error-boundary.tsx +127 -22
  568. package/src/client/error-reconstituter.tsx +79 -0
  569. package/src/client/form.tsx +31 -32
  570. package/src/client/history.ts +11 -3
  571. package/src/client/index.ts +67 -45
  572. package/src/client/internal.ts +58 -0
  573. package/src/client/link.tsx +346 -150
  574. package/src/client/navigation-api-types.ts +112 -0
  575. package/src/client/navigation-api.ts +347 -0
  576. package/src/client/navigation-context.ts +15 -7
  577. package/src/client/navigation-root.tsx +355 -0
  578. package/src/client/nuqs-adapter.tsx +16 -3
  579. package/src/client/router-ref.ts +1 -1
  580. package/src/client/router.ts +490 -140
  581. package/src/client/rsc-fetch.ts +220 -17
  582. package/src/client/segment-cache.ts +6 -3
  583. package/src/client/segment-outlet.tsx +77 -0
  584. package/src/client/segment-update-context.ts +42 -0
  585. package/src/client/shallow-url.ts +22 -0
  586. package/src/client/ssr-data.ts +13 -5
  587. package/src/client/state.ts +2 -2
  588. package/src/client/top-loader.tsx +11 -9
  589. package/src/client/use-cookie.ts +31 -2
  590. package/src/client/use-link-status.ts +7 -7
  591. package/src/client/use-pathname.ts +1 -0
  592. package/src/client/use-pending-navigation.ts +40 -0
  593. package/src/client/use-query-states.ts +9 -3
  594. package/src/client/use-router.ts +4 -1
  595. package/src/client/use-search-params.ts +31 -44
  596. package/src/client/{use-params.ts → use-segment-params.ts} +9 -6
  597. package/src/codec.ts +147 -0
  598. package/src/config-types.ts +292 -0
  599. package/src/config-validation.ts +311 -0
  600. package/src/content/index.ts +5 -13
  601. package/src/cookies/define-cookie.ts +217 -53
  602. package/src/cookies/index.ts +12 -1
  603. package/src/cookies/json-cookie.ts +105 -0
  604. package/src/cookies/validation.ts +192 -0
  605. package/src/dev-tools/404-page.ts +286 -0
  606. package/src/dev-tools/browser-logs.ts +291 -0
  607. package/src/dev-tools/dev-page-shell.ts +260 -0
  608. package/src/dev-tools/error-page.ts +331 -0
  609. package/src/dev-tools/holding-server.ts +187 -0
  610. package/src/dev-tools/hydration-overlay.ts +158 -0
  611. package/src/dev-tools/index.ts +83 -0
  612. package/src/dev-tools/instrumentation.ts +213 -0
  613. package/src/{plugins/dev-logs.ts → dev-tools/logs.ts} +9 -5
  614. package/src/dev-tools/overlay.ts +469 -0
  615. package/src/dev-tools/stack-classifier.ts +75 -0
  616. package/src/dev-tools/terminal.ts +183 -0
  617. package/src/fonts/ast-walk.ts +235 -0
  618. package/src/fonts/ast.ts +477 -126
  619. package/src/fonts/bundle.ts +138 -0
  620. package/src/fonts/dev-middleware.ts +85 -0
  621. package/src/fonts/fallbacks.ts +0 -23
  622. package/src/fonts/google.ts +7 -3
  623. package/src/fonts/local.ts +9 -8
  624. package/src/fonts/paths.ts +58 -0
  625. package/src/fonts/pipeline.ts +316 -0
  626. package/src/fonts/transform.ts +344 -0
  627. package/src/fonts/types.ts +52 -1
  628. package/src/fonts/virtual-modules.ts +179 -0
  629. package/src/index.ts +417 -346
  630. package/src/params/codec-registry.ts +34 -0
  631. package/src/params/define-schema.ts +115 -0
  632. package/src/params/index.ts +17 -0
  633. package/src/params/resolve-schema.ts +84 -0
  634. package/src/plugin-context.ts +325 -0
  635. package/src/plugins/adapter-build.ts +98 -4
  636. package/src/plugins/build-manifest.ts +168 -23
  637. package/src/plugins/build-report.ts +16 -25
  638. package/src/plugins/cache.ts +285 -0
  639. package/src/plugins/client-chunks.ts +113 -0
  640. package/src/plugins/cloudflare-wasm.ts +141 -0
  641. package/src/plugins/content.ts +1 -1
  642. package/src/plugins/dev-server.ts +293 -46
  643. package/src/plugins/entries.ts +110 -8
  644. package/src/plugins/fonts.ts +170 -663
  645. package/src/plugins/mdx.ts +47 -10
  646. package/src/plugins/routing.ts +237 -241
  647. package/src/plugins/server-bundle.ts +85 -12
  648. package/src/plugins/shims.ts +207 -64
  649. package/src/plugins/static-build.ts +15 -89
  650. package/src/routing/codegen-shared.ts +115 -0
  651. package/src/routing/codegen-types.ts +65 -0
  652. package/src/routing/codegen.ts +380 -178
  653. package/src/routing/convention-lint.ts +358 -0
  654. package/src/routing/file-cache.ts +23 -0
  655. package/src/routing/index.ts +10 -1
  656. package/src/routing/interception.ts +3 -22
  657. package/src/routing/link-codegen.ts +310 -0
  658. package/src/routing/manifest-codegen.ts +290 -0
  659. package/src/routing/scanner.ts +248 -188
  660. package/src/routing/schema-validation.ts +149 -0
  661. package/src/routing/segment-classify.ts +188 -0
  662. package/src/routing/segment-codegen.ts +98 -0
  663. package/src/routing/types.ts +78 -25
  664. package/src/routing/walkers.ts +90 -0
  665. package/src/rsc-runtime/rsc.ts +2 -0
  666. package/src/rsc-runtime/ssr.ts +50 -0
  667. package/src/rsc-runtime/vendor-types.d.ts +7 -0
  668. package/src/schema-bridge.ts +252 -0
  669. package/src/search-params/define.ts +570 -0
  670. package/src/search-params/index.ts +14 -20
  671. package/src/search-params/registry.ts +2 -2
  672. package/src/search-params/wrappers.ts +110 -0
  673. package/src/segment-params/define.ts +249 -0
  674. package/src/segment-params/index.ts +9 -0
  675. package/src/server/access-gate.tsx +84 -34
  676. package/src/server/action-client.ts +119 -28
  677. package/src/server/action-encryption.ts +144 -0
  678. package/src/server/action-handler.ts +122 -16
  679. package/src/server/actions.ts +39 -53
  680. package/src/server/als-registry.ts +108 -20
  681. package/src/server/asset-headers.ts +8 -34
  682. package/src/server/body-limits.ts +10 -2
  683. package/src/server/build-manifest.ts +13 -56
  684. package/src/server/canonicalize.ts +6 -3
  685. package/src/server/coalesce-tick.ts +75 -0
  686. package/src/server/compress.ts +34 -7
  687. package/src/server/cookie-context.ts +484 -0
  688. package/src/server/cookie-parsing.ts +147 -0
  689. package/src/server/csrf.ts +39 -6
  690. package/src/server/default-logger.ts +99 -0
  691. package/src/server/deny-boundary.ts +311 -0
  692. package/src/server/deny-renderer.ts +80 -64
  693. package/src/server/dev-source-map.ts +31 -0
  694. package/src/server/early-hints-sender.ts +3 -2
  695. package/src/server/early-hints.ts +37 -27
  696. package/src/server/error-boundary-wrapper.ts +61 -22
  697. package/src/server/fallback-error.ts +79 -102
  698. package/src/server/flight-injection-state.ts +113 -0
  699. package/src/server/flight-scripts.ts +62 -0
  700. package/src/server/form-data.ts +101 -5
  701. package/src/server/html-injector-core.ts +437 -0
  702. package/src/server/html-injectors.ts +256 -251
  703. package/src/server/index.ts +29 -183
  704. package/src/server/internal.ts +165 -0
  705. package/src/server/logger.ts +67 -36
  706. package/src/server/metadata-routes.ts +44 -19
  707. package/src/server/middleware-runner.ts +75 -4
  708. package/src/server/node-stream-transforms.ts +331 -0
  709. package/src/server/param-coercion.ts +206 -0
  710. package/src/server/pipeline-helpers.ts +204 -0
  711. package/src/server/pipeline-interception.ts +32 -18
  712. package/src/server/pipeline-metadata.ts +13 -0
  713. package/src/server/pipeline-outcome.ts +197 -0
  714. package/src/server/pipeline-phases.ts +527 -0
  715. package/src/server/pipeline.ts +213 -382
  716. package/src/server/port-resolution.ts +215 -0
  717. package/src/server/primitives.ts +126 -63
  718. package/src/server/render-timeout.ts +108 -0
  719. package/src/server/render-utils.ts +31 -0
  720. package/src/server/request-context.ts +168 -337
  721. package/src/server/route-element-builder.ts +481 -222
  722. package/src/server/route-handler.ts +31 -4
  723. package/src/server/route-matcher.ts +144 -277
  724. package/src/server/rsc-entry/action-middleware-runner.ts +167 -0
  725. package/src/server/rsc-entry/api-handler.ts +69 -32
  726. package/src/server/rsc-entry/error-renderer.ts +306 -89
  727. package/src/server/rsc-entry/helpers.ts +160 -59
  728. package/src/server/rsc-entry/index.ts +299 -329
  729. package/src/server/rsc-entry/render-route.ts +311 -0
  730. package/src/server/rsc-entry/revalidate-renderer.ts +344 -0
  731. package/src/server/rsc-entry/rsc-payload.ts +71 -26
  732. package/src/server/rsc-entry/rsc-stream.ts +85 -13
  733. package/src/server/rsc-entry/ssr-bridge.ts +18 -5
  734. package/src/server/rsc-entry/ssr-renderer.ts +273 -43
  735. package/src/server/rsc-entry/wrap-action-dispatch.ts +449 -0
  736. package/src/server/safe-load.ts +60 -0
  737. package/src/server/sensitive-fields.ts +230 -0
  738. package/src/server/sitemap-generator.ts +338 -0
  739. package/src/server/sitemap-handler.ts +148 -0
  740. package/src/server/slot-resolver.ts +258 -257
  741. package/src/server/ssr-bridge-types.ts +124 -0
  742. package/src/server/ssr-entry.ts +206 -78
  743. package/src/server/ssr-render.ts +345 -82
  744. package/src/server/ssr-wrappers.tsx +141 -0
  745. package/src/server/state-tree-diff.ts +30 -23
  746. package/src/server/status-code-resolver.ts +115 -130
  747. package/src/server/stream-utils.ts +213 -0
  748. package/src/server/tracing.ts +38 -11
  749. package/src/server/tree-builder.ts +204 -90
  750. package/src/server/tree-match.ts +220 -0
  751. package/src/server/types.ts +78 -9
  752. package/src/server/utils/escape-html.ts +20 -0
  753. package/src/server/utils/mdx-file.ts +22 -0
  754. package/src/server/version-skew.ts +104 -0
  755. package/src/shared/head-header.ts +69 -0
  756. package/src/shared/href-validation.ts +159 -0
  757. package/src/shared/merge-search-params.ts +55 -0
  758. package/src/shared/redirect-type.ts +17 -0
  759. package/src/shims/font-google.ts +1 -1
  760. package/src/shims/font-local.ts +34 -0
  761. package/src/shims/headers.ts +122 -1
  762. package/src/shims/navigation-client.ts +51 -29
  763. package/src/shims/navigation.ts +14 -7
  764. package/src/utils/state-machine.ts +111 -0
  765. package/dist/_chunks/als-registry-B7DbZ2hS.js +0 -41
  766. package/dist/_chunks/als-registry-B7DbZ2hS.js.map +0 -1
  767. package/dist/_chunks/debug-B3Gypr3D.js +0 -108
  768. package/dist/_chunks/debug-B3Gypr3D.js.map +0 -1
  769. package/dist/_chunks/format-RyoGQL74.js +0 -164
  770. package/dist/_chunks/format-RyoGQL74.js.map +0 -1
  771. package/dist/_chunks/interception-BOoWmLUA.js +0 -676
  772. package/dist/_chunks/interception-BOoWmLUA.js.map +0 -1
  773. package/dist/_chunks/metadata-routes-Cjmvi3rQ.js.map +0 -1
  774. package/dist/_chunks/request-context-BQUC8PHn.js +0 -330
  775. package/dist/_chunks/request-context-BQUC8PHn.js.map +0 -1
  776. package/dist/_chunks/ssr-data-MjmprTmO.js.map +0 -1
  777. package/dist/_chunks/tracing-CemImE6h.js +0 -187
  778. package/dist/_chunks/tracing-CemImE6h.js.map +0 -1
  779. package/dist/_chunks/use-cookie-DX-l1_5E.js +0 -91
  780. package/dist/_chunks/use-cookie-DX-l1_5E.js.map +0 -1
  781. package/dist/_chunks/use-query-states-D5KaffOK.js.map +0 -1
  782. package/dist/cache/register-cached-function.d.ts +0 -17
  783. package/dist/cache/register-cached-function.d.ts.map +0 -1
  784. package/dist/client/browser-entry.d.ts +0 -21
  785. package/dist/client/browser-entry.d.ts.map +0 -1
  786. package/dist/client/link-status-provider.d.ts +0 -11
  787. package/dist/client/link-status-provider.d.ts.map +0 -1
  788. package/dist/client/segment-merger.d.ts +0 -119
  789. package/dist/client/segment-merger.d.ts.map +0 -1
  790. package/dist/client/stale-reload.d.ts +0 -44
  791. package/dist/client/stale-reload.d.ts.map +0 -1
  792. package/dist/client/transition-root.d.ts +0 -74
  793. package/dist/client/transition-root.d.ts.map +0 -1
  794. package/dist/client/use-navigation-pending.d.ts +0 -26
  795. package/dist/client/use-navigation-pending.d.ts.map +0 -1
  796. package/dist/client/use-params.d.ts.map +0 -1
  797. package/dist/plugins/cache-transform.d.ts +0 -36
  798. package/dist/plugins/cache-transform.d.ts.map +0 -1
  799. package/dist/plugins/dev-error-overlay.d.ts +0 -60
  800. package/dist/plugins/dev-error-overlay.d.ts.map +0 -1
  801. package/dist/plugins/dev-logs.d.ts.map +0 -1
  802. package/dist/plugins/dynamic-transform.d.ts +0 -72
  803. package/dist/plugins/dynamic-transform.d.ts.map +0 -1
  804. package/dist/plugins/server-action-exports.d.ts +0 -26
  805. package/dist/plugins/server-action-exports.d.ts.map +0 -1
  806. package/dist/routing/status-file-lint.d.ts +0 -33
  807. package/dist/routing/status-file-lint.d.ts.map +0 -1
  808. package/dist/search-params/analyze.d.ts +0 -54
  809. package/dist/search-params/analyze.d.ts.map +0 -1
  810. package/dist/search-params/builtin-codecs.d.ts +0 -105
  811. package/dist/search-params/builtin-codecs.d.ts.map +0 -1
  812. package/dist/search-params/codecs.d.ts +0 -53
  813. package/dist/search-params/codecs.d.ts.map +0 -1
  814. package/dist/search-params/create.d.ts +0 -106
  815. package/dist/search-params/create.d.ts.map +0 -1
  816. package/dist/server/dev-fetch-instrumentation.d.ts +0 -22
  817. package/dist/server/dev-fetch-instrumentation.d.ts.map +0 -1
  818. package/dist/server/dev-logger.d.ts.map +0 -1
  819. package/dist/server/dev-span-processor.d.ts +0 -29
  820. package/dist/server/dev-span-processor.d.ts.map +0 -1
  821. package/dist/server/dev-warnings.d.ts +0 -129
  822. package/dist/server/dev-warnings.d.ts.map +0 -1
  823. package/dist/server/flush.d.ts +0 -74
  824. package/dist/server/flush.d.ts.map +0 -1
  825. package/dist/server/manifest-status-resolver.d.ts +0 -58
  826. package/dist/server/manifest-status-resolver.d.ts.map +0 -1
  827. package/dist/server/prerender.d.ts +0 -77
  828. package/dist/server/prerender.d.ts.map +0 -1
  829. package/dist/utils/directive-parser.d.ts +0 -70
  830. package/dist/utils/directive-parser.d.ts.map +0 -1
  831. package/src/cache/register-cached-function.ts +0 -103
  832. package/src/client/browser-entry.ts +0 -678
  833. package/src/client/link-status-provider.tsx +0 -30
  834. package/src/client/segment-merger.ts +0 -339
  835. package/src/client/stale-reload.ts +0 -87
  836. package/src/client/transition-root.tsx +0 -166
  837. package/src/client/use-navigation-pending.ts +0 -38
  838. package/src/plugins/cache-transform.ts +0 -199
  839. package/src/plugins/dev-error-overlay.ts +0 -230
  840. package/src/plugins/dynamic-transform.ts +0 -161
  841. package/src/plugins/server-action-exports.ts +0 -220
  842. package/src/routing/status-file-lint.ts +0 -112
  843. package/src/search-params/analyze.ts +0 -192
  844. package/src/search-params/builtin-codecs.ts +0 -228
  845. package/src/search-params/codecs.ts +0 -153
  846. package/src/search-params/create.ts +0 -321
  847. package/src/server/dev-fetch-instrumentation.ts +0 -96
  848. package/src/server/dev-span-processor.ts +0 -78
  849. package/src/server/dev-warnings.ts +0 -283
  850. package/src/server/flush.ts +0 -182
  851. package/src/server/manifest-status-resolver.ts +0 -215
  852. package/src/server/prerender.ts +0 -139
  853. package/src/utils/directive-parser.ts +0 -529
  854. /package/src/{server/dev-logger.ts → dev-tools/logger.ts} +0 -0
@@ -11,7 +11,9 @@
11
11
  import type { Plugin } from 'vite';
12
12
  import { existsSync } from 'node:fs';
13
13
  import { join } from 'node:path';
14
- import type { PluginContext } from '#/index.js';
14
+ import { createRequire } from 'node:module';
15
+ import { pathToFileURL } from 'node:url';
16
+ import type { PluginContext } from '../plugin-context.js';
15
17
 
16
18
  const MDX_EXTENSIONS = ['mdx', 'md'];
17
19
 
@@ -54,15 +56,49 @@ function shouldActivate(ctx: PluginContext): boolean {
54
56
  }
55
57
 
56
58
  /**
57
- * Try to dynamically import a module by name. Returns the default export
58
- * or the module itself, or undefined if the module is not installed.
59
+ * Try to dynamically import a module by name, resolving from the user's
60
+ * project root rather than from `@timber-js/app`'s own location.
61
+ *
62
+ * Why this matters: pnpm only hoists declared (peer) dependencies into a
63
+ * package's resolution scope. The MDX integration's optional companions
64
+ * — `remark-frontmatter`, `remark-mdx-frontmatter`, `@mdx-js/rollup` — are
65
+ * installed as direct deps of the consumer (e.g. `packages/website`), not
66
+ * `@timber-js/app`. A bare `import('remark-frontmatter')` from inside this
67
+ * file resolves against `packages/timber-app/node_modules` and silently
68
+ * fails with `ERR_MODULE_NOT_FOUND`, which made `tryImport` return
69
+ * `undefined` and skipped frontmatter parsing entirely — leaving MDX to
70
+ * choke on YAML as JS expressions (TIM-840).
71
+ *
72
+ * Resolving relative to `projectRoot` (via `createRequire`) makes the
73
+ * lookup walk the consumer's `node_modules` tree first, which is where
74
+ * pnpm puts the user's deps.
75
+ *
76
+ * Returns the default export, the module itself, or undefined if the
77
+ * module is not installed.
59
78
  */
60
- async function tryImport(name: string): Promise<unknown | undefined> {
79
+ async function tryImport(name: string, projectRoot: string): Promise<unknown | undefined> {
61
80
  try {
62
- const mod = await import(name);
81
+ // Anchor resolution at the consumer's package.json so we walk their
82
+ // node_modules tree, not @timber-js/app's. createRequire().resolve()
83
+ // returns an absolute file path that ESM dynamic import accepts when
84
+ // wrapped as a file:// URL.
85
+ const require = createRequire(join(projectRoot, 'package.json'));
86
+ const resolved = require.resolve(name);
87
+ const mod = await import(pathToFileURL(resolved).href);
63
88
  return mod.default ?? mod;
64
89
  } catch {
65
- return undefined;
90
+ // Fall back to a bare import — covers the rare case where the package
91
+ // lives next to @timber-js/app (e.g. monorepo with hoisted deps).
92
+ try {
93
+ const mod = await import(name);
94
+ return mod.default ?? mod;
95
+ } catch (e) {
96
+ console.debug(
97
+ `[timber] optional MDX dependency '${name}' not available:`,
98
+ e instanceof Error ? e.message : e
99
+ );
100
+ return undefined;
101
+ }
66
102
  }
67
103
  }
68
104
 
@@ -80,7 +116,7 @@ export function timberMdx(ctx: PluginContext): Plugin {
80
116
  async function activate(): Promise<void> {
81
117
  if (innerPlugin !== null || !shouldActivate(ctx)) return;
82
118
 
83
- const createMdxPlugin = (await tryImport('@mdx-js/rollup')) as
119
+ const createMdxPlugin = (await tryImport('@mdx-js/rollup', ctx.root)) as
84
120
  | ((options?: Record<string, unknown>) => Plugin)
85
121
  | undefined;
86
122
 
@@ -99,10 +135,11 @@ export function timberMdx(ctx: PluginContext): Plugin {
99
135
 
100
136
  const mdxConfig = ctx.config.mdx ?? {};
101
137
 
102
- // Auto-register frontmatter plugins
138
+ // Auto-register frontmatter plugins. Resolve from the consumer's root
139
+ // so pnpm finds packages declared in the user's package.json (TIM-840).
103
140
  const remarkPlugins: unknown[] = [];
104
- const remarkFrontmatter = await tryImport('remark-frontmatter');
105
- const remarkMdxFrontmatter = await tryImport('remark-mdx-frontmatter');
141
+ const remarkFrontmatter = await tryImport('remark-frontmatter', ctx.root);
142
+ const remarkMdxFrontmatter = await tryImport('remark-mdx-frontmatter', ctx.root);
106
143
  if (remarkFrontmatter) remarkPlugins.push(remarkFrontmatter);
107
144
  if (remarkMdxFrontmatter) remarkPlugins.push(remarkMdxFrontmatter);
108
145
 
@@ -11,24 +11,65 @@
11
11
  import type { Plugin, ViteDevServer } from 'vite';
12
12
  import { writeFile, mkdir } from 'node:fs/promises';
13
13
  import { join } from 'node:path';
14
- import { scanRoutes } from '#/routing/scanner.js';
15
- import { generateRouteMap } from '#/routing/codegen.js';
16
- import { collectInterceptionRewrites } from '#/routing/interception.js';
14
+ import { scanRoutes } from '../routing/scanner.js';
15
+ import { generateRouteMap } from '../routing/codegen.js';
17
16
  import {
18
- lintStatusFileDirectives,
19
- formatStatusFileLintWarnings,
20
- } from '#/routing/status-file-lint.js';
21
- import type { RouteTree, SegmentNode, RouteFile } from '#/routing/types.js';
22
- import type { PluginContext } from '#/index.js';
17
+ buildDirToRouteMap,
18
+ writeSegmentTypes,
19
+ type SegmentInfo,
20
+ } from '../routing/segment-codegen.js';
21
+ import { validateSchemaAgainstRoutes } from '../routing/schema-validation.js';
22
+ import {
23
+ generateManifestModule,
24
+ generateSearchParamsRegistryModule,
25
+ generateSchemaModule,
26
+ } from '../routing/manifest-codegen.js';
27
+ import {
28
+ lintConventions,
29
+ checkAppDirExists,
30
+ formatConventionWarnings,
31
+ } from '../routing/convention-lint.js';
32
+ import type { PluginContext } from '../plugin-context.js';
23
33
 
24
34
  const VIRTUAL_MODULE_ID = 'virtual:timber-route-manifest';
25
35
  const RESOLVED_VIRTUAL_ID = `\0${VIRTUAL_MODULE_ID}`;
26
36
 
37
+ // TIM-830: Search-params registry virtual module.
38
+ //
39
+ // Statically imports the `searchParams` named export from every page
40
+ // that exports one, and registers each definition into the shared
41
+ // search-params registry keyed by the un-interpolated route pattern
42
+ // (e.g. '/products/[id]'). This lets `<Link>` serialize flat
43
+ // `Partial<T>` values at runtime without callers importing the
44
+ // definition at the call site.
45
+ //
46
+ // The imports are STATIC (`import { searchParams as r0 } from '...'`)
47
+ // so Vite/Rolldown tree-shakes each page's component body out of the
48
+ // registry chunk — only the `searchParams` named export is pulled in.
49
+ const SEARCH_PARAMS_REGISTRY_ID = 'virtual:timber-search-params-registry';
50
+ const RESOLVED_SEARCH_PARAMS_REGISTRY_ID = `\0${SEARCH_PARAMS_REGISTRY_ID}`;
51
+
52
+ // TIM-931: Schema virtual module.
53
+ //
54
+ // When app/schema.ts exists, this module imports it and resolves the
55
+ // bracket-keyed segmentParams codecs into a bare-name codec map for
56
+ // runtime coercion. When no schema exists, exports null.
57
+ const SCHEMA_ID = 'virtual:timber-schema';
58
+ const RESOLVED_SCHEMA_ID = `\0${SCHEMA_ID}`;
59
+
60
+ // TIM-935: $segment virtual module prefix.
61
+ // Resolved ID encodes segment info as JSON after the prefix.
62
+ //
63
+ // Each route directory gets a virtual module that exports the route
64
+ // and segmentPath. `import { route, segmentPath } from './$segment'`
65
+ // resolves to `\0$segment:<json>`.
66
+ const SEGMENT_PREFIX = '\0$segment:';
67
+
27
68
  /**
28
69
  * File convention names we track for changes that require manifest regeneration.
29
70
  */
30
71
  const ROUTE_FILE_PATTERNS =
31
- /\/(page|layout|middleware|access|route|error|default|denied|search-params|\d{3}|[45]xx|not-found|forbidden|unauthorized|sitemap|robots|manifest|favicon|icon|opengraph-image|twitter-image|apple-icon)\./;
72
+ /\/(page|layout|middleware|access|route|error|global-error|default|denied|params|schema|\d{3}|[45]xx|not-found|forbidden|unauthorized|sitemap|robots|manifest|favicon|icon|opengraph-image|apple-icon)\./;
32
73
 
33
74
  /**
34
75
  * Create the timber-routing Vite plugin.
@@ -44,12 +85,25 @@ const CODEGEN_OUTPUT = '.timber/timber-routes.d.ts';
44
85
  * Uses a triple-slash reference so TypeScript auto-discovers the generated
45
86
  * route map without the user needing to edit tsconfig.json — same pattern
46
87
  * as Next.js's next-env.d.ts.
88
+ *
89
+ * Also references `vite/client` so side-effect imports like
90
+ * `import './globals.css'` type-check without ts(2882), and so
91
+ * `import.meta.env`, `import.meta.hot`, `import.meta.glob`, asset
92
+ * imports (`*.png`, `*.svg`, …), CSS modules, and `?url`/`?raw`/
93
+ * `?inline` query variants all resolve without the user editing
94
+ * tsconfig.json themselves. Next.js's next-env.d.ts plays the same
95
+ * role via `next/types/global`.
96
+ *
97
+ * `vite` is a peer dep of `@timber-js/app`, so the reference always
98
+ * resolves in a correctly-installed project.
47
99
  */
48
100
  const TIMBER_ENV_DTS = [
49
101
  '// This file is auto-generated by timber.js. Do not edit.',
50
- '// It ensures TypeScript picks up the generated route types.',
51
- '// eslint-disable-next-line @typescript-eslint/triple-slash-reference',
102
+ '// It ensures TypeScript picks up the generated route types and',
103
+ '// Vite-provided ambient types (CSS, assets, import.meta.env, HMR).',
104
+ '/* eslint-disable @typescript-eslint/triple-slash-reference */',
52
105
  '/// <reference path=".timber/timber-routes.d.ts" />',
106
+ '/// <reference types="vite/client" />',
53
107
  '',
54
108
  ].join('\n');
55
109
 
@@ -70,6 +124,7 @@ function writeCodegen(ctx: PluginContext): void {
70
124
  Promise.all([
71
125
  writeFile(routesPath, content, 'utf-8'),
72
126
  writeFile(envPath, TIMBER_ENV_DTS, 'utf-8'),
127
+ writeSegmentTypes(ctx.routeTree!, ctx.appDir, ctx.root),
73
128
  ])
74
129
  )
75
130
  .catch((err) => {
@@ -82,20 +137,48 @@ export function timberRouting(ctx: PluginContext): Plugin {
82
137
  /** Track warned files to avoid repeating warnings on rescan. */
83
138
  const warnedFiles = new Set<string>();
84
139
 
140
+ /** Maps absolute filesystem directory → segment info for $segment resolution. */
141
+ let dirToRoute: Map<string, SegmentInfo> = new Map();
142
+
85
143
  function rescan(): void {
144
+ // Check app/ directory exists before scanning
145
+ const appDirWarning = checkAppDirExists(ctx.appDir);
146
+ if (appDirWarning) {
147
+ const formatted = formatConventionWarnings([appDirWarning]);
148
+ if (formatted) process.stderr.write(`${formatted}\n`);
149
+ // Still create an empty tree so the rest of the pipeline doesn't crash
150
+ ctx.routeTree = {
151
+ root: {
152
+ segmentName: '',
153
+ segmentType: 'static',
154
+ urlPath: '/',
155
+ children: [],
156
+ slots: {},
157
+ },
158
+ };
159
+ return;
160
+ }
161
+
86
162
  ctx.timer.start('route-scan');
87
163
  ctx.routeTree = scanRoutes(ctx.appDir, {
88
164
  pageExtensions: ctx.config.pageExtensions,
89
165
  });
90
166
  ctx.timer.end('route-scan');
167
+ dirToRoute = buildDirToRouteMap(ctx.routeTree, ctx.appDir);
91
168
  writeCodegen(ctx);
92
169
 
93
- // Lint status files for missing 'use client' directive
94
- const warnings = lintStatusFileDirectives(ctx.routeTree);
95
- const newWarnings = warnings.filter((w) => !warnedFiles.has(w.filePath));
96
- if (newWarnings.length > 0) {
97
- for (const w of newWarnings) warnedFiles.add(w.filePath);
98
- console.warn(formatStatusFileLintWarnings(newWarnings));
170
+ // Validate schema keys against filesystem segments.
171
+ // Warns on stale keys, bracket form mismatches, and missing keys.
172
+ // See design/41-global-params.md §Auto-Scaffolding
173
+ warnSchemaValidation(ctx);
174
+
175
+ // Lint conventions (empty app, missing methods, missing root layout)
176
+ const conventionWarnings = lintConventions(ctx.routeTree, ctx.appDir);
177
+ const newConventionWarnings = conventionWarnings.filter((w) => !warnedFiles.has(w.id));
178
+ if (newConventionWarnings.length > 0) {
179
+ for (const w of newConventionWarnings) warnedFiles.add(w.id);
180
+ const formatted = formatConventionWarnings(newConventionWarnings);
181
+ if (formatted) process.stderr.write(`${formatted}\n`);
99
182
  }
100
183
  }
101
184
 
@@ -110,7 +193,7 @@ export function timberRouting(ctx: PluginContext): Plugin {
110
193
  * - <root>/virtual:timber-route-manifest (Vite SSR build root prefix)
111
194
  * - \0virtual:timber-route-manifest (RSC plugin re-imports)
112
195
  */
113
- resolveId(id: string) {
196
+ resolveId(id: string, importer?: string) {
114
197
  // Strip \0 prefix if present (RSC plugin generates these)
115
198
  const cleanId = id.startsWith('\0') ? id.slice(1) : id;
116
199
 
@@ -123,6 +206,35 @@ export function timberRouting(ctx: PluginContext): Plugin {
123
206
  return RESOLVED_VIRTUAL_ID;
124
207
  }
125
208
 
209
+ // TIM-830: Search-params registry virtual module
210
+ if (
211
+ cleanId === SEARCH_PARAMS_REGISTRY_ID ||
212
+ cleanId.endsWith(`/${SEARCH_PARAMS_REGISTRY_ID}`)
213
+ ) {
214
+ return RESOLVED_SEARCH_PARAMS_REGISTRY_ID;
215
+ }
216
+
217
+ // TIM-931: Schema virtual module
218
+ if (cleanId === SCHEMA_ID || cleanId.endsWith(`/${SCHEMA_ID}`)) {
219
+ return RESOLVED_SCHEMA_ID;
220
+ }
221
+
222
+ // TIM-935: $segment virtual module.
223
+ // Resolves `import { route } from './$segment'` based on the
224
+ // importing file's directory in the app/ tree.
225
+ if (
226
+ importer &&
227
+ (cleanId === './$segment' || cleanId === './$segment.js' || cleanId === './$segment.ts')
228
+ ) {
229
+ // Strip \0 prefix from importer if present
230
+ const cleanImporter = importer.startsWith('\0') ? importer.slice(1) : importer;
231
+ const importerDir = cleanImporter.substring(0, cleanImporter.lastIndexOf('/'));
232
+ const segmentInfo = dirToRoute.get(importerDir);
233
+ if (segmentInfo !== undefined) {
234
+ return `${SEGMENT_PREFIX}${JSON.stringify(segmentInfo)}`;
235
+ }
236
+ }
237
+
126
238
  return null;
127
239
  },
128
240
 
@@ -133,14 +245,36 @@ export function timberRouting(ctx: PluginContext): Plugin {
133
245
  * with absolute import paths for all file references.
134
246
  */
135
247
  load(id: string) {
136
- if (id !== RESOLVED_VIRTUAL_ID) return null;
248
+ if (id === RESOLVED_VIRTUAL_ID) {
249
+ // If routeTree hasn't been built yet (shouldn't happen), scan now
250
+ if (!ctx.routeTree) {
251
+ rescan();
252
+ }
253
+ return generateManifestModule(ctx.routeTree!, ctx.root);
254
+ }
137
255
 
138
- // If routeTree hasn't been built yet (shouldn't happen), scan now
139
- if (!ctx.routeTree) {
140
- rescan();
256
+ if (id === RESOLVED_SEARCH_PARAMS_REGISTRY_ID) {
257
+ if (!ctx.routeTree) {
258
+ rescan();
259
+ }
260
+ return generateSearchParamsRegistryModule(ctx.routeTree!);
261
+ }
262
+
263
+ if (id === RESOLVED_SCHEMA_ID) {
264
+ return generateSchemaModule(ctx.appDir);
265
+ }
266
+
267
+ // TIM-935: $segment virtual module — exports route and segmentPath.
268
+ if (id.startsWith(SEGMENT_PREFIX)) {
269
+ const info: SegmentInfo = JSON.parse(id.slice(SEGMENT_PREFIX.length));
270
+ return [
271
+ `export const ROUTE = ${JSON.stringify(info.route)};`,
272
+ `export const SEGMENT_PATH = ${JSON.stringify(info.segmentPath)};`,
273
+ '',
274
+ ].join('\n');
141
275
  }
142
276
 
143
- return generateManifestModule(ctx.routeTree!);
277
+ return null;
144
278
  },
145
279
 
146
280
  /**
@@ -168,20 +302,49 @@ export function timberRouting(ctx: PluginContext): Plugin {
168
302
  // Watch the app directory
169
303
  devServer.watcher.add(ctx.appDir);
170
304
 
171
- const handleFileChange = (filePath: string) => {
172
- // Only react to route-significant files in the app directory
305
+ /** Snapshot of the last generated manifest, used to detect structural changes. */
306
+ let lastManifest = ctx.routeTree ? generateManifestModule(ctx.routeTree, ctx.root) : '';
307
+
308
+ /**
309
+ * Handle a route-significant file being added or removed.
310
+ * Always triggers a full-reload since the route tree structure changed.
311
+ */
312
+ const handleStructuralChange = (filePath: string) => {
173
313
  if (!filePath.startsWith(ctx.appDir)) return;
174
314
  if (!ROUTE_FILE_PATTERNS.test(filePath)) return;
175
315
 
176
- // Rescan the route tree
177
316
  rescan();
178
-
179
- // Invalidate the virtual module in all environments
317
+ lastManifest = ctx.routeTree ? generateManifestModule(ctx.routeTree, ctx.root) : '';
180
318
  invalidateManifest(devServer);
181
319
  };
182
320
 
183
- devServer.watcher.on('add', handleFileChange);
184
- devServer.watcher.on('unlink', handleFileChange);
321
+ /**
322
+ * Handle a route file's content changing.
323
+ *
324
+ * Most content edits (JSX changes, fixing typos) don't affect route
325
+ * metadata — Vite's React Fast Refresh handles those via normal HMR.
326
+ * Only rescan and full-reload when route metadata actually changed
327
+ * (e.g., searchParams export added/removed, metadata export changed).
328
+ */
329
+ const handleContentChange = (filePath: string) => {
330
+ if (!filePath.startsWith(ctx.appDir)) return;
331
+ if (!ROUTE_FILE_PATTERNS.test(filePath)) return;
332
+
333
+ rescan();
334
+ const newManifest = ctx.routeTree ? generateManifestModule(ctx.routeTree, ctx.root) : '';
335
+ if (newManifest !== lastManifest) {
336
+ lastManifest = newManifest;
337
+ invalidateManifest(devServer);
338
+ }
339
+ // Otherwise: content edit didn't change route metadata — let Vite HMR handle it
340
+ };
341
+
342
+ devServer.watcher.on('add', handleStructuralChange);
343
+ devServer.watcher.on('unlink', handleStructuralChange);
344
+ // Watch content changes to page files — searchParams detection depends
345
+ // on file contents (export const searchParams), not just file presence.
346
+ // But only full-reload when route metadata actually changes.
347
+ devServer.watcher.on('change', handleContentChange);
185
348
  // Also watch renames (which are add+unlink) — handled by the above
186
349
  },
187
350
  };
@@ -193,228 +356,61 @@ export function timberRouting(ctx: PluginContext): Plugin {
193
356
  * When the route tree changes, any environment that has imported the manifest
194
357
  * needs to be invalidated so the next request/transform picks up the new tree.
195
358
  */
196
- function invalidateManifest(server: ViteDevServer): void {
197
- for (const envName of Object.keys(server.environments)) {
198
- const env = server.environments[envName];
199
- if (!env?.moduleGraph) continue;
200
-
201
- const mod = env.moduleGraph.getModuleById(RESOLVED_VIRTUAL_ID);
202
- if (mod) {
203
- env.moduleGraph.invalidateModule(mod);
204
- }
205
- }
206
-
207
- // Trigger HMR full reload — route changes are structural
208
- server.hot.send({ type: 'full-reload' });
209
- }
359
+ /** Set of warning keys we've already emitted — avoid repeating on every rescan. */
360
+ const _warnedKeys = new Set<string>();
210
361
 
211
362
  /**
212
- * Generate the virtual module source code for the route manifest.
213
- *
214
- * The output is a default-exported object containing the serialized route tree.
215
- * All file references use absolute paths (required for virtual modules).
363
+ * Validate schema keys against the filesystem route tree.
364
+ * Warns on stale keys, bracket form mismatches, and missing keys.
365
+ * Uses the already-scanned route tree instead of re-scanning.
216
366
  */
217
- function generateManifestModule(tree: RouteTree): string {
218
- const imports: string[] = [];
219
- let importIndex = 0;
220
-
221
- /**
222
- * Create a lazy import expression for a route file.
223
- * Returns the import variable name.
224
- */
225
- function addImport(file: RouteFile): string {
226
- const varName = `_route${importIndex++}`;
227
- imports.push(`const ${varName} = () => import("${file.filePath}");`);
228
- return varName;
229
- }
230
-
231
- /**
232
- * Serialize a segment node to a JS object literal.
233
- */
234
- function serializeNode(node: SegmentNode, indent: string): string {
235
- const nextIndent = indent + ' ';
236
- const parts: string[] = [];
237
-
238
- parts.push(`${nextIndent}segmentName: ${JSON.stringify(node.segmentName)},`);
239
- parts.push(`${nextIndent}segmentType: ${JSON.stringify(node.segmentType)},`);
240
- parts.push(`${nextIndent}urlPath: ${JSON.stringify(node.urlPath)},`);
241
-
242
- if (node.paramName) {
243
- parts.push(`${nextIndent}paramName: ${JSON.stringify(node.paramName)},`);
244
- }
245
-
246
- if (node.interceptionMarker) {
247
- parts.push(`${nextIndent}interceptionMarker: ${JSON.stringify(node.interceptionMarker)},`);
248
- }
249
- if (node.interceptedSegmentName) {
250
- parts.push(
251
- `${nextIndent}interceptedSegmentName: ${JSON.stringify(node.interceptedSegmentName)},`
252
- );
253
- }
254
-
255
- // File conventions — absolute paths as lazy imports
256
- if (node.page) {
257
- const v = addImport(node.page);
258
- parts.push(
259
- `${nextIndent}page: { load: ${v}, filePath: ${JSON.stringify(node.page.filePath)} },`
260
- );
261
- }
262
- if (node.layout) {
263
- const v = addImport(node.layout);
264
- parts.push(
265
- `${nextIndent}layout: { load: ${v}, filePath: ${JSON.stringify(node.layout.filePath)} },`
266
- );
267
- }
268
- if (node.middleware) {
269
- const v = addImport(node.middleware);
270
- parts.push(
271
- `${nextIndent}middleware: { load: ${v}, filePath: ${JSON.stringify(node.middleware.filePath)} },`
272
- );
273
- }
274
- if (node.access) {
275
- const v = addImport(node.access);
276
- parts.push(
277
- `${nextIndent}access: { load: ${v}, filePath: ${JSON.stringify(node.access.filePath)} },`
278
- );
279
- }
280
- if (node.route) {
281
- const v = addImport(node.route);
282
- parts.push(
283
- `${nextIndent}route: { load: ${v}, filePath: ${JSON.stringify(node.route.filePath)} },`
284
- );
285
- }
286
- if (node.error) {
287
- const v = addImport(node.error);
288
- parts.push(
289
- `${nextIndent}error: { load: ${v}, filePath: ${JSON.stringify(node.error.filePath)} },`
290
- );
291
- }
292
- if (node.default) {
293
- const v = addImport(node.default);
294
- parts.push(
295
- `${nextIndent}default: { load: ${v}, filePath: ${JSON.stringify(node.default.filePath)} },`
296
- );
297
- }
298
- if (node.denied) {
299
- const v = addImport(node.denied);
300
- parts.push(
301
- `${nextIndent}denied: { load: ${v}, filePath: ${JSON.stringify(node.denied.filePath)} },`
302
- );
303
- }
304
- if (node.searchParams) {
305
- const v = addImport(node.searchParams);
306
- parts.push(
307
- `${nextIndent}searchParams: { load: ${v}, filePath: ${JSON.stringify(node.searchParams.filePath)} },`
308
- );
309
- }
310
-
311
- // Status-code files
312
- if (node.statusFiles && node.statusFiles.size > 0) {
313
- const statusEntries: string[] = [];
314
- for (const [code, file] of node.statusFiles) {
315
- const v = addImport(file);
316
- statusEntries.push(
317
- `${nextIndent} ${JSON.stringify(code)}: { load: ${v}, filePath: ${JSON.stringify(file.filePath)} }`
318
- );
319
- }
320
- parts.push(`${nextIndent}statusFiles: {\n${statusEntries.join(',\n')}\n${nextIndent}},`);
321
- }
322
-
323
- // JSON status-code files
324
- if (node.jsonStatusFiles && node.jsonStatusFiles.size > 0) {
325
- const jsonEntries: string[] = [];
326
- for (const [code, file] of node.jsonStatusFiles) {
327
- const v = addImport(file);
328
- jsonEntries.push(
329
- `${nextIndent} ${JSON.stringify(code)}: { load: ${v}, filePath: ${JSON.stringify(file.filePath)} }`
330
- );
331
- }
332
- parts.push(`${nextIndent}jsonStatusFiles: {\n${jsonEntries.join(',\n')}\n${nextIndent}},`);
367
+ function warnSchemaValidation(ctx: PluginContext): void {
368
+ if (!ctx.routeTree) return;
369
+ const warnings = validateSchemaAgainstRoutes(ctx.routeTree, ctx.appDir);
370
+
371
+ for (const w of warnings) {
372
+ const warnKey = `${w.type}:${w.key}`;
373
+ if (_warnedKeys.has(warnKey)) continue;
374
+ _warnedKeys.add(warnKey);
375
+
376
+ switch (w.type) {
377
+ case 'stale-key':
378
+ console.warn(`[timber] ${w.message}`);
379
+ break;
380
+ case 'bracket-mismatch':
381
+ console.warn(`[timber] ${w.message}`);
382
+ break;
383
+ case 'missing-key':
384
+ console.warn(`[timber] ${w.message}`);
385
+ break;
333
386
  }
387
+ }
388
+ }
334
389
 
335
- // Legacy status files
336
- if (node.legacyStatusFiles && node.legacyStatusFiles.size > 0) {
337
- const legacyEntries: string[] = [];
338
- for (const [name, file] of node.legacyStatusFiles) {
339
- const v = addImport(file);
340
- legacyEntries.push(
341
- `${nextIndent} ${JSON.stringify(name)}: { load: ${v}, filePath: ${JSON.stringify(file.filePath)} }`
342
- );
343
- }
344
- parts.push(
345
- `${nextIndent}legacyStatusFiles: {\n${legacyEntries.join(',\n')}\n${nextIndent}},`
346
- );
347
- }
390
+ function invalidateManifest(server: ViteDevServer): void {
391
+ for (const envName of Object.keys(server.environments)) {
392
+ const env = server.environments[envName];
393
+ if (!env?.moduleGraph) continue;
348
394
 
349
- // Metadata route files (sitemap.ts, robots.ts, icon.tsx, etc.)
350
- if (node.metadataRoutes && node.metadataRoutes.size > 0) {
351
- const metaEntries: string[] = [];
352
- for (const [name, file] of node.metadataRoutes) {
353
- const v = addImport(file);
354
- metaEntries.push(
355
- `${nextIndent} ${JSON.stringify(name)}: { load: ${v}, filePath: ${JSON.stringify(file.filePath)} }`
356
- );
395
+ for (const virtualId of [
396
+ RESOLVED_VIRTUAL_ID,
397
+ RESOLVED_SEARCH_PARAMS_REGISTRY_ID,
398
+ RESOLVED_SCHEMA_ID,
399
+ ]) {
400
+ const mod = env.moduleGraph.getModuleById(virtualId);
401
+ if (mod) {
402
+ env.moduleGraph.invalidateModule(mod);
357
403
  }
358
- parts.push(`${nextIndent}metadataRoutes: {\n${metaEntries.join(',\n')}\n${nextIndent}},`);
359
404
  }
360
405
 
361
- // Children
362
- if (node.children.length > 0) {
363
- const childNodes = node.children.map((c) => serializeNode(c, nextIndent));
364
- parts.push(`${nextIndent}children: [\n${childNodes.join(',\n')}\n${nextIndent}],`);
365
- } else {
366
- parts.push(`${nextIndent}children: [],`);
367
- }
368
-
369
- // Parallel slots
370
- if (node.slots.size > 0) {
371
- const slotEntries: string[] = [];
372
- for (const [slotName, slotNode] of node.slots) {
373
- slotEntries.push(
374
- `${nextIndent} ${JSON.stringify(slotName)}: ${serializeNode(slotNode, nextIndent + ' ')}`
375
- );
406
+ // TIM-935: Invalidate all $segment virtual modules (prefixed \0$segment:)
407
+ for (const mod of env.moduleGraph.idToModuleMap.values()) {
408
+ if (mod.id?.startsWith(SEGMENT_PREFIX)) {
409
+ env.moduleGraph.invalidateModule(mod);
376
410
  }
377
- parts.push(`${nextIndent}slots: {\n${slotEntries.join(',\n')}\n${nextIndent}},`);
378
- } else {
379
- parts.push(`${nextIndent}slots: {},`);
380
411
  }
381
-
382
- return `${indent}{\n${parts.join('\n')}\n${indent}}`;
383
412
  }
384
413
 
385
- const rootSerialized = serializeNode(tree.root, ' ');
386
-
387
- // Proxy file
388
- let proxyLine = '';
389
- if (tree.proxy) {
390
- const v = addImport(tree.proxy);
391
- proxyLine = ` proxy: { load: ${v}, filePath: ${JSON.stringify(tree.proxy.filePath)} },`;
392
- }
393
-
394
- // Interception rewrites — computed at build time from the route tree.
395
- // Only interceptedPattern and interceptingPrefix are needed at runtime.
396
- const rewrites = collectInterceptionRewrites(tree.root);
397
- const rewritesLine =
398
- rewrites.length > 0
399
- ? ` interceptionRewrites: ${JSON.stringify(rewrites.map((r) => ({ interceptedPattern: r.interceptedPattern, interceptingPrefix: r.interceptingPrefix })))},`
400
- : '';
401
-
402
- const code = [
403
- '// Auto-generated route manifest — do not edit.',
404
- '// Generated by timber-routing plugin.',
405
- '',
406
- ...imports,
407
- '',
408
- 'const manifest = {',
409
- proxyLine,
410
- rewritesLine,
411
- ` root: ${rootSerialized},`,
412
- '};',
413
- '',
414
- 'export default manifest;',
415
- ]
416
- .filter((line) => line !== undefined && line !== '')
417
- .join('\n');
418
-
419
- return code;
414
+ // Trigger HMR full reload — route changes are structural
415
+ server.hot.send({ type: 'full-reload' });
420
416
  }