@timber-js/app 0.2.0-alpha.1 → 0.2.0-alpha.100

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 (742) hide show
  1. package/LICENSE +8 -0
  2. package/dist/_chunks/actions-CQ8Z8VGL.js +1061 -0
  3. package/dist/_chunks/actions-CQ8Z8VGL.js.map +1 -0
  4. package/dist/_chunks/build-output-helper-DXnW0qjz.js +61 -0
  5. package/dist/_chunks/build-output-helper-DXnW0qjz.js.map +1 -0
  6. package/dist/_chunks/chunk-BYIpzuS7.js +39 -0
  7. package/dist/_chunks/define-B-Q_UMOD.js +195 -0
  8. package/dist/_chunks/define-B-Q_UMOD.js.map +1 -0
  9. package/dist/_chunks/define-CfBPoJb0.js +123 -0
  10. package/dist/_chunks/define-CfBPoJb0.js.map +1 -0
  11. package/dist/_chunks/define-cookie-BjpIt4UC.js +194 -0
  12. package/dist/_chunks/define-cookie-BjpIt4UC.js.map +1 -0
  13. package/dist/_chunks/format-Bcn-Iv1x.js +14 -0
  14. package/dist/_chunks/format-Bcn-Iv1x.js.map +1 -0
  15. package/dist/_chunks/handler-store-B-lqaGyh.js +54 -0
  16. package/dist/_chunks/handler-store-B-lqaGyh.js.map +1 -0
  17. package/dist/_chunks/logger-0m8MsKdc.js +291 -0
  18. package/dist/_chunks/logger-0m8MsKdc.js.map +1 -0
  19. package/dist/_chunks/merge-search-params-BphMdht_.js +122 -0
  20. package/dist/_chunks/merge-search-params-BphMdht_.js.map +1 -0
  21. package/dist/_chunks/{metadata-routes-CQCnF4VK.js → metadata-routes-BU684ls2.js} +1 -1
  22. package/dist/_chunks/{metadata-routes-CQCnF4VK.js.map → metadata-routes-BU684ls2.js.map} +1 -1
  23. package/dist/_chunks/navigation-root-BCYczjml.js +96 -0
  24. package/dist/_chunks/navigation-root-BCYczjml.js.map +1 -0
  25. package/dist/_chunks/registry-I2ss-lvy.js +20 -0
  26. package/dist/_chunks/registry-I2ss-lvy.js.map +1 -0
  27. package/dist/_chunks/router-ref-h3-UaCQv.js +28 -0
  28. package/dist/_chunks/router-ref-h3-UaCQv.js.map +1 -0
  29. package/dist/_chunks/schema-bridge-Cxu4l-7p.js +86 -0
  30. package/dist/_chunks/schema-bridge-Cxu4l-7p.js.map +1 -0
  31. package/dist/_chunks/segment-classify-BjfuctV2.js +137 -0
  32. package/dist/_chunks/segment-classify-BjfuctV2.js.map +1 -0
  33. package/dist/_chunks/segment-context-Dx_OizxD.js +34 -0
  34. package/dist/_chunks/segment-context-Dx_OizxD.js.map +1 -0
  35. package/dist/_chunks/{ssr-data-DLnbYpj1.js → ssr-data-B4CdH7rE.js} +1 -1
  36. package/dist/_chunks/ssr-data-B4CdH7rE.js.map +1 -0
  37. package/dist/_chunks/stale-reload-Bab885FO.js +64 -0
  38. package/dist/_chunks/stale-reload-Bab885FO.js.map +1 -0
  39. package/dist/_chunks/tracing-C8V-YGsP.js +329 -0
  40. package/dist/_chunks/tracing-C8V-YGsP.js.map +1 -0
  41. package/dist/_chunks/{use-query-states-DAhgj8Gx.js → use-query-states-B2XTqxDR.js} +7 -20
  42. package/dist/_chunks/use-query-states-B2XTqxDR.js.map +1 -0
  43. package/dist/_chunks/use-segment-params-BkpKAQ7D.js +185 -0
  44. package/dist/_chunks/use-segment-params-BkpKAQ7D.js.map +1 -0
  45. package/dist/_chunks/walkers-Tg0Alwcg.js +850 -0
  46. package/dist/_chunks/walkers-Tg0Alwcg.js.map +1 -0
  47. package/dist/_chunks/{format-DNt20Kt8.js → warnings-Cg47l5sk.js} +7 -45
  48. package/dist/_chunks/warnings-Cg47l5sk.js.map +1 -0
  49. package/dist/adapters/build-output-helper.d.ts +28 -0
  50. package/dist/adapters/build-output-helper.d.ts.map +1 -0
  51. package/dist/adapters/cloudflare-dev.d.ts +109 -0
  52. package/dist/adapters/cloudflare-dev.d.ts.map +1 -0
  53. package/dist/adapters/cloudflare-dev.js +73 -0
  54. package/dist/adapters/cloudflare-dev.js.map +1 -0
  55. package/dist/adapters/cloudflare-kv-cache.d.ts +64 -0
  56. package/dist/adapters/cloudflare-kv-cache.d.ts.map +1 -0
  57. package/dist/adapters/cloudflare-kv-cache.js +95 -0
  58. package/dist/adapters/cloudflare-kv-cache.js.map +1 -0
  59. package/dist/adapters/cloudflare.d.ts +148 -12
  60. package/dist/adapters/cloudflare.d.ts.map +1 -1
  61. package/dist/adapters/cloudflare.js +142 -38
  62. package/dist/adapters/cloudflare.js.map +1 -1
  63. package/dist/adapters/compress-module.d.ts.map +1 -1
  64. package/dist/adapters/nitro.d.ts +17 -1
  65. package/dist/adapters/nitro.d.ts.map +1 -1
  66. package/dist/adapters/nitro.js +143 -45
  67. package/dist/adapters/nitro.js.map +1 -1
  68. package/dist/adapters/shared.d.ts +16 -0
  69. package/dist/adapters/shared.d.ts.map +1 -0
  70. package/dist/cache/cache-api.d.ts +24 -0
  71. package/dist/cache/cache-api.d.ts.map +1 -0
  72. package/dist/cache/fast-hash.d.ts +22 -0
  73. package/dist/cache/fast-hash.d.ts.map +1 -0
  74. package/dist/cache/handler-store.d.ts +31 -0
  75. package/dist/cache/handler-store.d.ts.map +1 -0
  76. package/dist/cache/index.d.ts +23 -7
  77. package/dist/cache/index.d.ts.map +1 -1
  78. package/dist/cache/index.js +195 -84
  79. package/dist/cache/index.js.map +1 -1
  80. package/dist/cache/singleflight.d.ts +18 -1
  81. package/dist/cache/singleflight.d.ts.map +1 -1
  82. package/dist/cache/sizeof.d.ts +22 -0
  83. package/dist/cache/sizeof.d.ts.map +1 -0
  84. package/dist/cache/timber-cache.d.ts +1 -1
  85. package/dist/cache/timber-cache.d.ts.map +1 -1
  86. package/dist/cli.d.ts +6 -1
  87. package/dist/cli.d.ts.map +1 -1
  88. package/dist/cli.js +8 -3
  89. package/dist/cli.js.map +1 -1
  90. package/dist/client/browser-dev.d.ts +34 -1
  91. package/dist/client/browser-dev.d.ts.map +1 -1
  92. package/dist/client/browser-entry/action-dispatch.d.ts +17 -0
  93. package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -0
  94. package/dist/client/browser-entry/hmr.d.ts +21 -0
  95. package/dist/client/browser-entry/hmr.d.ts.map +1 -0
  96. package/dist/client/browser-entry/hydrate.d.ts +46 -0
  97. package/dist/client/browser-entry/hydrate.d.ts.map +1 -0
  98. package/dist/client/browser-entry/index.d.ts +30 -0
  99. package/dist/client/browser-entry/index.d.ts.map +1 -0
  100. package/dist/client/browser-entry/post-hydration.d.ts +26 -0
  101. package/dist/client/browser-entry/post-hydration.d.ts.map +1 -0
  102. package/dist/client/browser-entry/router-init.d.ts +23 -0
  103. package/dist/client/browser-entry/router-init.d.ts.map +1 -0
  104. package/dist/client/browser-entry/rsc-stream.d.ts +24 -0
  105. package/dist/client/browser-entry/rsc-stream.d.ts.map +1 -0
  106. package/dist/client/browser-entry/scroll.d.ts +19 -0
  107. package/dist/client/browser-entry/scroll.d.ts.map +1 -0
  108. package/dist/client/error-boundary.d.ts +12 -5
  109. package/dist/client/error-boundary.d.ts.map +1 -1
  110. package/dist/client/error-boundary.js +26 -5
  111. package/dist/client/error-boundary.js.map +1 -1
  112. package/dist/client/error-reconstituter.d.ts +54 -0
  113. package/dist/client/error-reconstituter.d.ts.map +1 -0
  114. package/dist/client/form.d.ts +16 -27
  115. package/dist/client/form.d.ts.map +1 -1
  116. package/dist/client/history.d.ts +19 -4
  117. package/dist/client/history.d.ts.map +1 -1
  118. package/dist/client/index.d.ts +9 -24
  119. package/dist/client/index.d.ts.map +1 -1
  120. package/dist/client/index.js +312 -1109
  121. package/dist/client/index.js.map +1 -1
  122. package/dist/client/internal.d.ts +19 -0
  123. package/dist/client/internal.d.ts.map +1 -0
  124. package/dist/client/internal.js +964 -0
  125. package/dist/client/internal.js.map +1 -0
  126. package/dist/client/link-pending-store.d.ts +63 -0
  127. package/dist/client/link-pending-store.d.ts.map +1 -0
  128. package/dist/client/link.d.ts +73 -63
  129. package/dist/client/link.d.ts.map +1 -1
  130. package/dist/client/nav-link-store.d.ts +36 -0
  131. package/dist/client/nav-link-store.d.ts.map +1 -0
  132. package/dist/client/navigation-api-types.d.ts +90 -0
  133. package/dist/client/navigation-api-types.d.ts.map +1 -0
  134. package/dist/client/navigation-api.d.ts +115 -0
  135. package/dist/client/navigation-api.d.ts.map +1 -0
  136. package/dist/client/navigation-context.d.ts +22 -5
  137. package/dist/client/navigation-context.d.ts.map +1 -1
  138. package/dist/client/{transition-root.d.ts → navigation-root.d.ts} +42 -8
  139. package/dist/client/navigation-root.d.ts.map +1 -0
  140. package/dist/client/nuqs-adapter.d.ts.map +1 -1
  141. package/dist/client/router-ref.d.ts +1 -1
  142. package/dist/client/router.d.ts +70 -4
  143. package/dist/client/router.d.ts.map +1 -1
  144. package/dist/client/rsc-fetch.d.ts +38 -3
  145. package/dist/client/rsc-fetch.d.ts.map +1 -1
  146. package/dist/client/segment-cache.d.ts +1 -1
  147. package/dist/client/segment-cache.d.ts.map +1 -1
  148. package/dist/client/segment-context.d.ts +1 -1
  149. package/dist/client/segment-context.d.ts.map +1 -1
  150. package/dist/client/segment-merger.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 +8 -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} +7 -5
  170. package/dist/client/use-segment-params.d.ts.map +1 -0
  171. package/dist/codec.d.ts +33 -0
  172. package/dist/codec.d.ts.map +1 -0
  173. package/dist/codec.js +2 -0
  174. package/dist/config-types.d.ts +294 -0
  175. package/dist/config-types.d.ts.map +1 -0
  176. package/dist/config-validation.d.ts +51 -0
  177. package/dist/config-validation.d.ts.map +1 -0
  178. package/dist/content/index.d.ts +1 -10
  179. package/dist/content/index.d.ts.map +1 -1
  180. package/dist/content/index.js +0 -2
  181. package/dist/cookies/define-cookie.d.ts +98 -25
  182. package/dist/cookies/define-cookie.d.ts.map +1 -1
  183. package/dist/cookies/index.d.ts +2 -1
  184. package/dist/cookies/index.d.ts.map +1 -1
  185. package/dist/cookies/index.js +36 -72
  186. package/dist/cookies/index.js.map +1 -1
  187. package/dist/cookies/json-cookie.d.ts +64 -0
  188. package/dist/cookies/json-cookie.d.ts.map +1 -0
  189. package/dist/cookies/validation.d.ts +46 -0
  190. package/dist/cookies/validation.d.ts.map +1 -0
  191. package/dist/dev-tools/404-page.d.ts +46 -0
  192. package/dist/dev-tools/404-page.d.ts.map +1 -0
  193. package/dist/dev-tools/browser-logs.d.ts +84 -0
  194. package/dist/dev-tools/browser-logs.d.ts.map +1 -0
  195. package/dist/dev-tools/error-page.d.ts +58 -0
  196. package/dist/dev-tools/error-page.d.ts.map +1 -0
  197. package/dist/dev-tools/holding-server.d.ts +54 -0
  198. package/dist/dev-tools/holding-server.d.ts.map +1 -0
  199. package/dist/dev-tools/index.d.ts +31 -0
  200. package/dist/dev-tools/index.d.ts.map +1 -0
  201. package/dist/{server/dev-span-processor.d.ts → dev-tools/instrumentation.d.ts} +26 -6
  202. package/dist/dev-tools/instrumentation.d.ts.map +1 -0
  203. package/dist/{server/dev-logger.d.ts → dev-tools/logger.d.ts} +1 -1
  204. package/dist/dev-tools/logger.d.ts.map +1 -0
  205. package/dist/{plugins/dev-logs.d.ts → dev-tools/logs.d.ts} +2 -2
  206. package/dist/dev-tools/logs.d.ts.map +1 -0
  207. package/dist/dev-tools/overlay.d.ts +91 -0
  208. package/dist/dev-tools/overlay.d.ts.map +1 -0
  209. package/dist/dev-tools/stack-classifier.d.ts +34 -0
  210. package/dist/dev-tools/stack-classifier.d.ts.map +1 -0
  211. package/dist/dev-tools/terminal.d.ts +28 -0
  212. package/dist/dev-tools/terminal.d.ts.map +1 -0
  213. package/dist/{server/dev-warnings.d.ts → dev-tools/warnings.d.ts} +2 -22
  214. package/dist/dev-tools/warnings.d.ts.map +1 -0
  215. package/dist/fonts/bundle.d.ts +48 -0
  216. package/dist/fonts/bundle.d.ts.map +1 -0
  217. package/dist/fonts/css.d.ts +1 -0
  218. package/dist/fonts/css.d.ts.map +1 -1
  219. package/dist/fonts/dev-middleware.d.ts +22 -0
  220. package/dist/fonts/dev-middleware.d.ts.map +1 -0
  221. package/dist/fonts/local.d.ts +4 -2
  222. package/dist/fonts/local.d.ts.map +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 +64 -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 +103 -0
  230. package/dist/fonts/virtual-modules.d.ts.map +1 -0
  231. package/dist/index.d.ts +46 -152
  232. package/dist/index.d.ts.map +1 -1
  233. package/dist/index.js +14702 -12350
  234. package/dist/index.js.map +1 -1
  235. package/dist/plugin-context.d.ts +107 -0
  236. package/dist/plugin-context.d.ts.map +1 -0
  237. package/dist/plugins/adapter-build.d.ts +1 -1
  238. package/dist/plugins/adapter-build.d.ts.map +1 -1
  239. package/dist/plugins/build-manifest.d.ts +2 -2
  240. package/dist/plugins/build-manifest.d.ts.map +1 -1
  241. package/dist/plugins/build-report.d.ts +16 -4
  242. package/dist/plugins/build-report.d.ts.map +1 -1
  243. package/dist/plugins/chunks.d.ts +9 -1
  244. package/dist/plugins/chunks.d.ts.map +1 -1
  245. package/dist/plugins/client-chunks.d.ts +32 -0
  246. package/dist/plugins/client-chunks.d.ts.map +1 -0
  247. package/dist/plugins/content.d.ts +1 -1
  248. package/dist/plugins/content.d.ts.map +1 -1
  249. package/dist/plugins/dev-server.d.ts +1 -1
  250. package/dist/plugins/dev-server.d.ts.map +1 -1
  251. package/dist/plugins/entries.d.ts +8 -1
  252. package/dist/plugins/entries.d.ts.map +1 -1
  253. package/dist/plugins/fonts.d.ts +17 -65
  254. package/dist/plugins/fonts.d.ts.map +1 -1
  255. package/dist/plugins/mdx.d.ts +7 -1
  256. package/dist/plugins/mdx.d.ts.map +1 -1
  257. package/dist/plugins/routing.d.ts +1 -1
  258. package/dist/plugins/routing.d.ts.map +1 -1
  259. package/dist/plugins/server-bundle.d.ts.map +1 -1
  260. package/dist/plugins/shims.d.ts +6 -5
  261. package/dist/plugins/shims.d.ts.map +1 -1
  262. package/dist/plugins/static-build.d.ts +4 -4
  263. package/dist/plugins/static-build.d.ts.map +1 -1
  264. package/dist/routing/codegen-shared.d.ts +55 -0
  265. package/dist/routing/codegen-shared.d.ts.map +1 -0
  266. package/dist/routing/codegen-types.d.ts +52 -0
  267. package/dist/routing/codegen-types.d.ts.map +1 -0
  268. package/dist/routing/codegen.d.ts +2 -2
  269. package/dist/routing/codegen.d.ts.map +1 -1
  270. package/dist/routing/convention-lint.d.ts +41 -0
  271. package/dist/routing/convention-lint.d.ts.map +1 -0
  272. package/dist/routing/index.d.ts +5 -1
  273. package/dist/routing/index.d.ts.map +1 -1
  274. package/dist/routing/index.js +3 -2
  275. package/dist/routing/link-codegen.d.ts +90 -0
  276. package/dist/routing/link-codegen.d.ts.map +1 -0
  277. package/dist/routing/scanner.d.ts +1 -10
  278. package/dist/routing/scanner.d.ts.map +1 -1
  279. package/dist/routing/segment-classify.d.ts +75 -0
  280. package/dist/routing/segment-classify.d.ts.map +1 -0
  281. package/dist/routing/status-file-lint.d.ts +2 -1
  282. package/dist/routing/status-file-lint.d.ts.map +1 -1
  283. package/dist/routing/types.d.ts +77 -25
  284. package/dist/routing/types.d.ts.map +1 -1
  285. package/dist/routing/walkers.d.ts +51 -0
  286. package/dist/routing/walkers.d.ts.map +1 -0
  287. package/dist/rsc-runtime/rsc.d.ts +1 -1
  288. package/dist/rsc-runtime/rsc.d.ts.map +1 -1
  289. package/dist/rsc-runtime/ssr.d.ts +12 -0
  290. package/dist/rsc-runtime/ssr.d.ts.map +1 -1
  291. package/dist/schema-bridge.d.ts +76 -0
  292. package/dist/schema-bridge.d.ts.map +1 -0
  293. package/dist/search-params/define.d.ts +157 -0
  294. package/dist/search-params/define.d.ts.map +1 -0
  295. package/dist/search-params/index.d.ts +4 -7
  296. package/dist/search-params/index.d.ts.map +1 -1
  297. package/dist/search-params/index.js +34 -441
  298. package/dist/search-params/index.js.map +1 -1
  299. package/dist/search-params/registry.d.ts +2 -2
  300. package/dist/search-params/registry.d.ts.map +1 -1
  301. package/dist/search-params/wrappers.d.ts +53 -0
  302. package/dist/search-params/wrappers.d.ts.map +1 -0
  303. package/dist/segment-params/define.d.ts +95 -0
  304. package/dist/segment-params/define.d.ts.map +1 -0
  305. package/dist/segment-params/index.d.ts +3 -0
  306. package/dist/segment-params/index.d.ts.map +1 -0
  307. package/dist/segment-params/index.js +2 -0
  308. package/dist/server/access-gate.d.ts +8 -3
  309. package/dist/server/access-gate.d.ts.map +1 -1
  310. package/dist/server/action-client.d.ts +41 -6
  311. package/dist/server/action-client.d.ts.map +1 -1
  312. package/dist/server/action-encryption.d.ts +76 -0
  313. package/dist/server/action-encryption.d.ts.map +1 -0
  314. package/dist/server/action-handler.d.ts +35 -1
  315. package/dist/server/action-handler.d.ts.map +1 -1
  316. package/dist/server/actions.d.ts +3 -6
  317. package/dist/server/actions.d.ts.map +1 -1
  318. package/dist/server/als-registry.d.ts +33 -5
  319. package/dist/server/als-registry.d.ts.map +1 -1
  320. package/dist/server/asset-headers.d.ts +1 -15
  321. package/dist/server/asset-headers.d.ts.map +1 -1
  322. package/dist/server/build-manifest.d.ts +2 -2
  323. package/dist/server/build-manifest.d.ts.map +1 -1
  324. package/dist/server/cookie-context.d.ts +170 -0
  325. package/dist/server/cookie-context.d.ts.map +1 -0
  326. package/dist/server/cookie-parsing.d.ts +51 -0
  327. package/dist/server/cookie-parsing.d.ts.map +1 -0
  328. package/dist/server/debug.d.ts +82 -0
  329. package/dist/server/debug.d.ts.map +1 -0
  330. package/dist/server/default-logger.d.ts +22 -0
  331. package/dist/server/default-logger.d.ts.map +1 -0
  332. package/dist/server/deny-boundary.d.ts +90 -0
  333. package/dist/server/deny-boundary.d.ts.map +1 -0
  334. package/dist/server/deny-renderer.d.ts.map +1 -1
  335. package/dist/server/dev-source-map.d.ts +22 -0
  336. package/dist/server/dev-source-map.d.ts.map +1 -0
  337. package/dist/server/early-hints-sender.d.ts.map +1 -1
  338. package/dist/server/early-hints.d.ts +13 -5
  339. package/dist/server/early-hints.d.ts.map +1 -1
  340. package/dist/server/error-boundary-wrapper.d.ts +7 -1
  341. package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
  342. package/dist/server/fallback-error.d.ts +12 -7
  343. package/dist/server/fallback-error.d.ts.map +1 -1
  344. package/dist/server/flight-injection-state.d.ts +66 -0
  345. package/dist/server/flight-injection-state.d.ts.map +1 -0
  346. package/dist/server/flight-scripts.d.ts +42 -0
  347. package/dist/server/flight-scripts.d.ts.map +1 -0
  348. package/dist/server/flush.d.ts.map +1 -1
  349. package/dist/server/form-data.d.ts +29 -0
  350. package/dist/server/form-data.d.ts.map +1 -1
  351. package/dist/server/html-injector-core.d.ts +212 -0
  352. package/dist/server/html-injector-core.d.ts.map +1 -0
  353. package/dist/server/html-injectors.d.ts +81 -41
  354. package/dist/server/html-injectors.d.ts.map +1 -1
  355. package/dist/server/index.d.ts +9 -46
  356. package/dist/server/index.d.ts.map +1 -1
  357. package/dist/server/index.js +158 -2899
  358. package/dist/server/index.js.map +1 -1
  359. package/dist/server/internal.d.ts +48 -0
  360. package/dist/server/internal.d.ts.map +1 -0
  361. package/dist/server/internal.js +2900 -0
  362. package/dist/server/internal.js.map +1 -0
  363. package/dist/server/logger.d.ts +39 -7
  364. package/dist/server/logger.d.ts.map +1 -1
  365. package/dist/server/middleware-runner.d.ts +36 -4
  366. package/dist/server/middleware-runner.d.ts.map +1 -1
  367. package/dist/server/node-stream-transforms.d.ts +110 -0
  368. package/dist/server/node-stream-transforms.d.ts.map +1 -0
  369. package/dist/server/param-coercion.d.ts +26 -0
  370. package/dist/server/param-coercion.d.ts.map +1 -0
  371. package/dist/server/pipeline-helpers.d.ts +95 -0
  372. package/dist/server/pipeline-helpers.d.ts.map +1 -0
  373. package/dist/server/pipeline-interception.d.ts +1 -1
  374. package/dist/server/pipeline-interception.d.ts.map +1 -1
  375. package/dist/server/pipeline-metadata.d.ts +6 -0
  376. package/dist/server/pipeline-metadata.d.ts.map +1 -1
  377. package/dist/server/pipeline-outcome.d.ts +49 -0
  378. package/dist/server/pipeline-outcome.d.ts.map +1 -0
  379. package/dist/server/pipeline-phases.d.ts +52 -0
  380. package/dist/server/pipeline-phases.d.ts.map +1 -0
  381. package/dist/server/pipeline.d.ts +93 -23
  382. package/dist/server/pipeline.d.ts.map +1 -1
  383. package/dist/server/port-resolution.d.ts +117 -0
  384. package/dist/server/port-resolution.d.ts.map +1 -0
  385. package/dist/server/primitives.d.ts +69 -18
  386. package/dist/server/primitives.d.ts.map +1 -1
  387. package/dist/server/render-timeout.d.ts +51 -0
  388. package/dist/server/render-timeout.d.ts.map +1 -0
  389. package/dist/server/request-context.d.ts +41 -109
  390. package/dist/server/request-context.d.ts.map +1 -1
  391. package/dist/server/route-element-builder.d.ts +27 -1
  392. package/dist/server/route-element-builder.d.ts.map +1 -1
  393. package/dist/server/route-handler.d.ts.map +1 -1
  394. package/dist/server/route-matcher.d.ts +21 -34
  395. package/dist/server/route-matcher.d.ts.map +1 -1
  396. package/dist/server/rsc-entry/action-middleware-runner.d.ts +66 -0
  397. package/dist/server/rsc-entry/action-middleware-runner.d.ts.map +1 -0
  398. package/dist/server/rsc-entry/api-handler.d.ts +2 -2
  399. package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
  400. package/dist/server/rsc-entry/error-renderer.d.ts +26 -13
  401. package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
  402. package/dist/server/rsc-entry/helpers.d.ts +49 -6
  403. package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
  404. package/dist/server/rsc-entry/index.d.ts +20 -3
  405. package/dist/server/rsc-entry/index.d.ts.map +1 -1
  406. package/dist/server/rsc-entry/render-route.d.ts +50 -0
  407. package/dist/server/rsc-entry/render-route.d.ts.map +1 -0
  408. package/dist/server/rsc-entry/rsc-payload.d.ts +3 -3
  409. package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
  410. package/dist/server/rsc-entry/rsc-stream.d.ts +20 -1
  411. package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
  412. package/dist/server/rsc-entry/ssr-bridge.d.ts +1 -1
  413. package/dist/server/rsc-entry/ssr-bridge.d.ts.map +1 -1
  414. package/dist/server/rsc-entry/ssr-renderer.d.ts +19 -4
  415. package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
  416. package/dist/server/rsc-entry/wrap-action-dispatch.d.ts +119 -0
  417. package/dist/server/rsc-entry/wrap-action-dispatch.d.ts.map +1 -0
  418. package/dist/server/rsc-prop-warnings.d.ts.map +1 -1
  419. package/dist/server/safe-load.d.ts +46 -0
  420. package/dist/server/safe-load.d.ts.map +1 -0
  421. package/dist/server/sensitive-fields.d.ts +74 -0
  422. package/dist/server/sensitive-fields.d.ts.map +1 -0
  423. package/dist/server/sitemap-generator.d.ts +129 -0
  424. package/dist/server/sitemap-generator.d.ts.map +1 -0
  425. package/dist/server/sitemap-handler.d.ts +22 -0
  426. package/dist/server/sitemap-handler.d.ts.map +1 -0
  427. package/dist/server/slot-resolver.d.ts +1 -1
  428. package/dist/server/slot-resolver.d.ts.map +1 -1
  429. package/dist/server/ssr-entry.d.ts +23 -0
  430. package/dist/server/ssr-entry.d.ts.map +1 -1
  431. package/dist/server/ssr-render.d.ts +39 -21
  432. package/dist/server/ssr-render.d.ts.map +1 -1
  433. package/dist/server/ssr-wrappers.d.ts +50 -0
  434. package/dist/server/ssr-wrappers.d.ts.map +1 -0
  435. package/dist/server/state-tree-diff.d.ts.map +1 -1
  436. package/dist/server/status-code-resolver.d.ts +16 -11
  437. package/dist/server/status-code-resolver.d.ts.map +1 -1
  438. package/dist/server/stream-utils.d.ts +36 -0
  439. package/dist/server/stream-utils.d.ts.map +1 -0
  440. package/dist/server/tracing.d.ts +15 -5
  441. package/dist/server/tracing.d.ts.map +1 -1
  442. package/dist/server/tree-builder.d.ts +62 -30
  443. package/dist/server/tree-builder.d.ts.map +1 -1
  444. package/dist/server/types.d.ts +49 -4
  445. package/dist/server/types.d.ts.map +1 -1
  446. package/dist/server/utils/escape-html.d.ts +14 -0
  447. package/dist/server/utils/escape-html.d.ts.map +1 -0
  448. package/dist/server/version-skew.d.ts +61 -0
  449. package/dist/server/version-skew.d.ts.map +1 -0
  450. package/dist/server/waituntil-bridge.d.ts.map +1 -1
  451. package/dist/shared/merge-search-params.d.ts +22 -0
  452. package/dist/shared/merge-search-params.d.ts.map +1 -0
  453. package/dist/shims/font-google.d.ts +1 -1
  454. package/dist/shims/font-google.d.ts.map +1 -1
  455. package/dist/shims/font-google.js +42 -0
  456. package/dist/shims/font-google.js.map +1 -0
  457. package/dist/shims/font-local.d.ts +26 -0
  458. package/dist/shims/font-local.d.ts.map +1 -0
  459. package/dist/shims/font-local.js +20 -0
  460. package/dist/shims/font-local.js.map +1 -0
  461. package/dist/shims/headers.d.ts +2 -1
  462. package/dist/shims/headers.d.ts.map +1 -1
  463. package/dist/shims/navigation-client.d.ts +3 -1
  464. package/dist/shims/navigation-client.d.ts.map +1 -1
  465. package/dist/shims/navigation.d.ts +11 -5
  466. package/dist/shims/navigation.d.ts.map +1 -1
  467. package/dist/utils/directive-parser.d.ts +1 -43
  468. package/dist/utils/directive-parser.d.ts.map +1 -1
  469. package/dist/utils/state-machine.d.ts +80 -0
  470. package/dist/utils/state-machine.d.ts.map +1 -0
  471. package/package.json +56 -22
  472. package/src/adapters/build-output-helper.ts +77 -0
  473. package/src/adapters/cloudflare-dev.ts +177 -0
  474. package/src/adapters/cloudflare-kv-cache.ts +142 -0
  475. package/src/adapters/cloudflare.ts +350 -76
  476. package/src/adapters/compress-module.ts +24 -4
  477. package/src/adapters/nitro.ts +148 -60
  478. package/src/adapters/shared.ts +40 -0
  479. package/src/adapters/wrangler.d.ts +7 -0
  480. package/src/cache/cache-api.ts +38 -0
  481. package/src/cache/fast-hash.ts +34 -0
  482. package/src/cache/handler-store.ts +68 -0
  483. package/src/cache/index.ts +81 -18
  484. package/src/cache/singleflight.ts +62 -4
  485. package/src/cache/sizeof.ts +31 -0
  486. package/src/cache/timber-cache.ts +41 -29
  487. package/src/cli.ts +16 -6
  488. package/src/client/browser-dev.ts +153 -1
  489. package/src/client/browser-entry/action-dispatch.ts +116 -0
  490. package/src/client/browser-entry/hmr.ts +81 -0
  491. package/src/client/browser-entry/hydrate.ts +145 -0
  492. package/src/client/browser-entry/index.ts +143 -0
  493. package/src/client/browser-entry/post-hydration.ts +119 -0
  494. package/src/client/browser-entry/router-init.ts +193 -0
  495. package/src/client/browser-entry/rsc-stream.ts +157 -0
  496. package/src/client/browser-entry/scroll.ts +27 -0
  497. package/src/client/error-boundary.tsx +97 -20
  498. package/src/client/error-reconstituter.tsx +65 -0
  499. package/src/client/form.tsx +31 -32
  500. package/src/client/history.ts +26 -4
  501. package/src/client/index.ts +77 -43
  502. package/src/client/internal.ts +58 -0
  503. package/src/client/link-pending-store.ts +111 -0
  504. package/src/client/link.tsx +432 -140
  505. package/src/client/nav-link-store.ts +47 -0
  506. package/src/client/navigation-api-types.ts +112 -0
  507. package/src/client/navigation-api.ts +332 -0
  508. package/src/client/navigation-context.ts +83 -18
  509. package/src/client/navigation-root.tsx +342 -0
  510. package/src/client/nuqs-adapter.tsx +16 -3
  511. package/src/client/router-ref.ts +1 -1
  512. package/src/client/router.ts +303 -78
  513. package/src/client/rsc-fetch.ts +112 -8
  514. package/src/client/segment-cache.ts +1 -1
  515. package/src/client/segment-context.ts +6 -1
  516. package/src/client/segment-merger.ts +2 -8
  517. package/src/client/segment-outlet.tsx +86 -0
  518. package/src/client/ssr-data.ts +13 -5
  519. package/src/client/stale-reload.ts +74 -7
  520. package/src/client/state.ts +2 -2
  521. package/src/client/top-loader.tsx +41 -25
  522. package/src/client/use-cookie.ts +29 -0
  523. package/src/client/use-link-status.ts +7 -7
  524. package/src/client/{use-navigation-pending.ts → use-pending-navigation.ts} +6 -6
  525. package/src/client/use-query-states.ts +9 -3
  526. package/src/client/use-router.ts +1 -1
  527. package/src/client/{use-params.ts → use-segment-params.ts} +7 -5
  528. package/src/codec.ts +45 -0
  529. package/src/config-types.ts +292 -0
  530. package/src/config-validation.ts +303 -0
  531. package/src/content/index.ts +5 -13
  532. package/src/cookies/define-cookie.ts +301 -55
  533. package/src/cookies/index.ts +12 -1
  534. package/src/cookies/json-cookie.ts +105 -0
  535. package/src/cookies/validation.ts +134 -0
  536. package/src/dev-tools/404-page.ts +387 -0
  537. package/src/dev-tools/browser-logs.ts +288 -0
  538. package/src/dev-tools/error-page.ts +509 -0
  539. package/src/dev-tools/holding-server.ts +187 -0
  540. package/src/dev-tools/index.ts +90 -0
  541. package/src/dev-tools/instrumentation.ts +176 -0
  542. package/src/{plugins/dev-logs.ts → dev-tools/logs.ts} +3 -3
  543. package/src/dev-tools/overlay.ts +456 -0
  544. package/src/dev-tools/stack-classifier.ts +75 -0
  545. package/src/dev-tools/terminal.ts +183 -0
  546. package/src/{server/dev-warnings.ts → dev-tools/warnings.ts} +6 -50
  547. package/src/fonts/bundle.ts +142 -0
  548. package/src/fonts/css.ts +2 -1
  549. package/src/fonts/dev-middleware.ts +74 -0
  550. package/src/fonts/local.ts +7 -3
  551. package/src/fonts/pipeline.ts +314 -0
  552. package/src/fonts/transform.ts +406 -0
  553. package/src/fonts/types.ts +50 -1
  554. package/src/fonts/virtual-modules.ts +227 -0
  555. package/src/index.ts +376 -315
  556. package/src/plugin-context.ts +240 -0
  557. package/src/plugins/adapter-build.ts +12 -4
  558. package/src/plugins/build-manifest.ts +13 -2
  559. package/src/plugins/build-report.ts +32 -21
  560. package/src/plugins/chunks.ts +9 -1
  561. package/src/plugins/client-chunks.ts +65 -0
  562. package/src/plugins/content.ts +1 -1
  563. package/src/plugins/dev-server.ts +154 -21
  564. package/src/plugins/entries.ts +119 -12
  565. package/src/plugins/fonts.ts +177 -524
  566. package/src/plugins/mdx.ts +52 -15
  567. package/src/plugins/routing.ts +225 -41
  568. package/src/plugins/server-action-exports.ts +1 -1
  569. package/src/plugins/server-bundle.ts +36 -1
  570. package/src/plugins/shims.ts +136 -35
  571. package/src/plugins/static-build.ts +17 -11
  572. package/src/routing/codegen-shared.ts +98 -0
  573. package/src/routing/codegen-types.ts +53 -0
  574. package/src/routing/codegen.ts +143 -176
  575. package/src/routing/convention-lint.ts +357 -0
  576. package/src/routing/index.ts +5 -1
  577. package/src/routing/interception.ts +1 -1
  578. package/src/routing/link-codegen.ts +294 -0
  579. package/src/routing/scanner.ts +107 -110
  580. package/src/routing/segment-classify.ts +188 -0
  581. package/src/routing/status-file-lint.ts +10 -7
  582. package/src/routing/types.ts +78 -25
  583. package/src/routing/walkers.ts +90 -0
  584. package/src/rsc-runtime/rsc.ts +2 -0
  585. package/src/rsc-runtime/ssr.ts +50 -0
  586. package/src/rsc-runtime/vendor-types.d.ts +7 -0
  587. package/src/{search-params/codecs.ts → schema-bridge.ts} +57 -20
  588. package/src/search-params/define.ts +538 -0
  589. package/src/search-params/index.ts +14 -20
  590. package/src/search-params/registry.ts +2 -2
  591. package/src/search-params/wrappers.ts +92 -0
  592. package/src/segment-params/define.ts +332 -0
  593. package/src/segment-params/index.ts +9 -0
  594. package/src/server/access-gate.tsx +79 -36
  595. package/src/server/action-client.ts +103 -20
  596. package/src/server/action-encryption.ts +144 -0
  597. package/src/server/action-handler.ts +112 -14
  598. package/src/server/actions.ts +10 -9
  599. package/src/server/als-registry.ts +35 -7
  600. package/src/server/asset-headers.ts +8 -34
  601. package/src/server/build-manifest.ts +10 -4
  602. package/src/server/compress.ts +25 -7
  603. package/src/server/cookie-context.ts +468 -0
  604. package/src/server/cookie-parsing.ts +135 -0
  605. package/src/server/debug.ts +137 -0
  606. package/src/server/default-logger.ts +99 -0
  607. package/src/server/deny-boundary.ts +218 -0
  608. package/src/server/deny-renderer.ts +33 -51
  609. package/src/server/dev-source-map.ts +31 -0
  610. package/src/server/early-hints-sender.ts +3 -2
  611. package/src/server/early-hints.ts +36 -15
  612. package/src/server/error-boundary-wrapper.ts +74 -22
  613. package/src/server/fallback-error.ts +74 -102
  614. package/src/server/flight-injection-state.ts +113 -0
  615. package/src/server/flight-scripts.ts +62 -0
  616. package/src/server/flush.ts +2 -1
  617. package/src/server/form-data.ts +76 -0
  618. package/src/server/html-injector-core.ts +403 -0
  619. package/src/server/html-injectors.ts +244 -223
  620. package/src/server/index.ts +31 -184
  621. package/src/server/internal.ts +176 -0
  622. package/src/server/logger.ts +67 -35
  623. package/src/server/middleware-runner.ts +75 -4
  624. package/src/server/node-stream-transforms.ts +369 -0
  625. package/src/server/param-coercion.ts +76 -0
  626. package/src/server/pipeline-helpers.ts +204 -0
  627. package/src/server/pipeline-interception.ts +17 -16
  628. package/src/server/pipeline-metadata.ts +13 -0
  629. package/src/server/pipeline-outcome.ts +167 -0
  630. package/src/server/pipeline-phases.ts +409 -0
  631. package/src/server/pipeline.ts +128 -387
  632. package/src/server/port-resolution.ts +215 -0
  633. package/src/server/primitives.ts +113 -29
  634. package/src/server/render-timeout.ts +108 -0
  635. package/src/server/request-context.ts +94 -337
  636. package/src/server/route-element-builder.ts +289 -198
  637. package/src/server/route-handler.ts +24 -4
  638. package/src/server/route-matcher.ts +44 -65
  639. package/src/server/rsc-entry/action-middleware-runner.ts +167 -0
  640. package/src/server/rsc-entry/api-handler.ts +16 -17
  641. package/src/server/rsc-entry/error-renderer.ts +305 -89
  642. package/src/server/rsc-entry/helpers.ts +136 -12
  643. package/src/server/rsc-entry/index.ts +330 -312
  644. package/src/server/rsc-entry/render-route.ts +304 -0
  645. package/src/server/rsc-entry/rsc-payload.ts +100 -18
  646. package/src/server/rsc-entry/rsc-stream.ts +90 -17
  647. package/src/server/rsc-entry/ssr-bridge.ts +14 -5
  648. package/src/server/rsc-entry/ssr-renderer.ts +177 -37
  649. package/src/server/rsc-entry/wrap-action-dispatch.ts +449 -0
  650. package/src/server/rsc-prop-warnings.ts +3 -1
  651. package/src/server/safe-load.ts +60 -0
  652. package/src/server/sensitive-fields.ts +230 -0
  653. package/src/server/sitemap-generator.ts +338 -0
  654. package/src/server/sitemap-handler.ts +126 -0
  655. package/src/server/slot-resolver.ts +245 -230
  656. package/src/server/ssr-entry.ts +215 -32
  657. package/src/server/ssr-render.ts +289 -67
  658. package/src/server/ssr-wrappers.tsx +139 -0
  659. package/src/server/state-tree-diff.ts +4 -1
  660. package/src/server/status-code-resolver.ts +112 -128
  661. package/src/server/stream-utils.ts +213 -0
  662. package/src/server/tracing.ts +44 -10
  663. package/src/server/tree-builder.ts +202 -90
  664. package/src/server/types.ts +55 -6
  665. package/src/server/utils/escape-html.ts +20 -0
  666. package/src/server/version-skew.ts +104 -0
  667. package/src/server/waituntil-bridge.ts +4 -1
  668. package/src/shared/merge-search-params.ts +55 -0
  669. package/src/shims/font-google.ts +1 -1
  670. package/src/shims/font-local.ts +34 -0
  671. package/src/shims/headers.ts +5 -1
  672. package/src/shims/navigation-client.ts +4 -3
  673. package/src/shims/navigation.ts +14 -7
  674. package/src/utils/directive-parser.ts +1 -390
  675. package/src/utils/state-machine.ts +111 -0
  676. package/dist/_chunks/als-registry-k-AtAQ9R.js +0 -41
  677. package/dist/_chunks/als-registry-k-AtAQ9R.js.map +0 -1
  678. package/dist/_chunks/format-DNt20Kt8.js.map +0 -1
  679. package/dist/_chunks/interception-DGDIjDbR.js +0 -676
  680. package/dist/_chunks/interception-DGDIjDbR.js.map +0 -1
  681. package/dist/_chunks/request-context-CRj2Zh1E.js +0 -329
  682. package/dist/_chunks/request-context-CRj2Zh1E.js.map +0 -1
  683. package/dist/_chunks/ssr-data-DLnbYpj1.js.map +0 -1
  684. package/dist/_chunks/tracing-DF0G3FB7.js +0 -173
  685. package/dist/_chunks/tracing-DF0G3FB7.js.map +0 -1
  686. package/dist/_chunks/use-cookie-dDbpCTx-.js +0 -91
  687. package/dist/_chunks/use-cookie-dDbpCTx-.js.map +0 -1
  688. package/dist/_chunks/use-query-states-DAhgj8Gx.js.map +0 -1
  689. package/dist/cache/register-cached-function.d.ts +0 -17
  690. package/dist/cache/register-cached-function.d.ts.map +0 -1
  691. package/dist/client/browser-entry.d.ts +0 -22
  692. package/dist/client/browser-entry.d.ts.map +0 -1
  693. package/dist/client/browser-links.d.ts +0 -32
  694. package/dist/client/browser-links.d.ts.map +0 -1
  695. package/dist/client/link-navigate-interceptor.d.ts +0 -28
  696. package/dist/client/link-navigate-interceptor.d.ts.map +0 -1
  697. package/dist/client/link-status-provider.d.ts +0 -11
  698. package/dist/client/link-status-provider.d.ts.map +0 -1
  699. package/dist/client/transition-root.d.ts.map +0 -1
  700. package/dist/client/use-navigation-pending.d.ts.map +0 -1
  701. package/dist/client/use-params.d.ts.map +0 -1
  702. package/dist/plugins/cache-transform.d.ts +0 -36
  703. package/dist/plugins/cache-transform.d.ts.map +0 -1
  704. package/dist/plugins/dev-error-overlay.d.ts +0 -60
  705. package/dist/plugins/dev-error-overlay.d.ts.map +0 -1
  706. package/dist/plugins/dev-logs.d.ts.map +0 -1
  707. package/dist/plugins/dynamic-transform.d.ts +0 -72
  708. package/dist/plugins/dynamic-transform.d.ts.map +0 -1
  709. package/dist/search-params/analyze.d.ts +0 -54
  710. package/dist/search-params/analyze.d.ts.map +0 -1
  711. package/dist/search-params/builtin-codecs.d.ts +0 -105
  712. package/dist/search-params/builtin-codecs.d.ts.map +0 -1
  713. package/dist/search-params/codecs.d.ts +0 -53
  714. package/dist/search-params/codecs.d.ts.map +0 -1
  715. package/dist/search-params/create.d.ts +0 -106
  716. package/dist/search-params/create.d.ts.map +0 -1
  717. package/dist/server/dev-fetch-instrumentation.d.ts +0 -22
  718. package/dist/server/dev-fetch-instrumentation.d.ts.map +0 -1
  719. package/dist/server/dev-logger.d.ts.map +0 -1
  720. package/dist/server/dev-span-processor.d.ts.map +0 -1
  721. package/dist/server/dev-warnings.d.ts.map +0 -1
  722. package/dist/server/manifest-status-resolver.d.ts +0 -58
  723. package/dist/server/manifest-status-resolver.d.ts.map +0 -1
  724. package/dist/server/prerender.d.ts +0 -77
  725. package/dist/server/prerender.d.ts.map +0 -1
  726. package/src/cache/register-cached-function.ts +0 -99
  727. package/src/client/browser-entry.ts +0 -686
  728. package/src/client/browser-links.ts +0 -90
  729. package/src/client/link-navigate-interceptor.tsx +0 -62
  730. package/src/client/link-status-provider.tsx +0 -30
  731. package/src/client/transition-root.tsx +0 -160
  732. package/src/plugins/cache-transform.ts +0 -199
  733. package/src/plugins/dev-error-overlay.ts +0 -230
  734. package/src/plugins/dynamic-transform.ts +0 -161
  735. package/src/search-params/analyze.ts +0 -192
  736. package/src/search-params/builtin-codecs.ts +0 -228
  737. package/src/search-params/create.ts +0 -321
  738. package/src/server/dev-fetch-instrumentation.ts +0 -96
  739. package/src/server/dev-span-processor.ts +0 -78
  740. package/src/server/manifest-status-resolver.ts +0 -215
  741. package/src/server/prerender.ts +0 -139
  742. /package/src/{server/dev-logger.ts → dev-tools/logger.ts} +0 -0
@@ -11,24 +11,30 @@
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
 
18
20
  /**
19
- * Check if mdx-components.tsx (or .ts, .jsx, .js) exists at the project root.
21
+ * Check if mdx-components.tsx (or .ts, .jsx, .js) exists at the project root
22
+ * or in src/. Root takes precedence, matching Next.js behavior.
20
23
  * Returns the absolute path if found, otherwise undefined.
21
24
  */
22
- function findMdxComponents(root: string): string | undefined {
25
+ export function findMdxComponents(root: string): string | undefined {
23
26
  const candidates = [
24
27
  'mdx-components.tsx',
25
28
  'mdx-components.ts',
26
29
  'mdx-components.jsx',
27
30
  'mdx-components.js',
28
31
  ];
29
- for (const name of candidates) {
30
- const p = join(root, name);
31
- if (existsSync(p)) return p;
32
+ const dirs = [root, join(root, 'src')];
33
+ for (const dir of dirs) {
34
+ for (const name of candidates) {
35
+ const p = join(dir, name);
36
+ if (existsSync(p)) return p;
37
+ }
32
38
  }
33
39
  return undefined;
34
40
  }
@@ -50,15 +56,45 @@ function shouldActivate(ctx: PluginContext): boolean {
50
56
  }
51
57
 
52
58
  /**
53
- * Try to dynamically import a module by name. Returns the default export
54
- * 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.
55
78
  */
56
- async function tryImport(name: string): Promise<unknown | undefined> {
79
+ async function tryImport(name: string, projectRoot: string): Promise<unknown | undefined> {
57
80
  try {
58
- 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);
59
88
  return mod.default ?? mod;
60
89
  } catch {
61
- 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 {
96
+ return undefined;
97
+ }
62
98
  }
63
99
  }
64
100
 
@@ -76,7 +112,7 @@ export function timberMdx(ctx: PluginContext): Plugin {
76
112
  async function activate(): Promise<void> {
77
113
  if (innerPlugin !== null || !shouldActivate(ctx)) return;
78
114
 
79
- const createMdxPlugin = (await tryImport('@mdx-js/rollup')) as
115
+ const createMdxPlugin = (await tryImport('@mdx-js/rollup', ctx.root)) as
80
116
  | ((options?: Record<string, unknown>) => Plugin)
81
117
  | undefined;
82
118
 
@@ -95,10 +131,11 @@ export function timberMdx(ctx: PluginContext): Plugin {
95
131
 
96
132
  const mdxConfig = ctx.config.mdx ?? {};
97
133
 
98
- // Auto-register frontmatter plugins
134
+ // Auto-register frontmatter plugins. Resolve from the consumer's root
135
+ // so pnpm finds packages declared in the user's package.json (TIM-840).
99
136
  const remarkPlugins: unknown[] = [];
100
- const remarkFrontmatter = await tryImport('remark-frontmatter');
101
- const remarkMdxFrontmatter = await tryImport('remark-mdx-frontmatter');
137
+ const remarkFrontmatter = await tryImport('remark-frontmatter', ctx.root);
138
+ const remarkMdxFrontmatter = await tryImport('remark-mdx-frontmatter', ctx.root);
102
139
  if (remarkFrontmatter) remarkPlugins.push(remarkFrontmatter);
103
140
  if (remarkMdxFrontmatter) remarkPlugins.push(remarkMdxFrontmatter);
104
141
 
@@ -10,25 +10,46 @@
10
10
 
11
11
  import type { Plugin, ViteDevServer } from 'vite';
12
12
  import { writeFile, mkdir } from 'node:fs/promises';
13
+ import { existsSync, readFileSync } from 'node:fs';
13
14
  import { join } from 'node:path';
14
- import { scanRoutes } from '#/routing/scanner.js';
15
- import { generateRouteMap } from '#/routing/codegen.js';
16
- import { collectInterceptionRewrites } from '#/routing/interception.js';
15
+ import { scanRoutes } from '../routing/scanner.js';
16
+ import { generateRouteMap } from '../routing/codegen.js';
17
+ import { collectInterceptionRewrites } from '../routing/interception.js';
17
18
  import {
18
19
  lintStatusFileDirectives,
19
20
  formatStatusFileLintWarnings,
20
- } from '#/routing/status-file-lint.js';
21
- import type { RouteTree, SegmentNode, RouteFile } from '#/routing/types.js';
22
- import type { PluginContext } from '#/index.js';
21
+ } from '../routing/status-file-lint.js';
22
+ import {
23
+ lintConventions,
24
+ checkAppDirExists,
25
+ formatConventionWarnings,
26
+ } from '../routing/convention-lint.js';
27
+ import type { RouteTree, SegmentNode, RouteFile } from '../routing/types.js';
28
+ import type { PluginContext } from '../plugin-context.js';
23
29
 
24
30
  const VIRTUAL_MODULE_ID = 'virtual:timber-route-manifest';
25
31
  const RESOLVED_VIRTUAL_ID = `\0${VIRTUAL_MODULE_ID}`;
26
32
 
33
+ // TIM-830: Search-params registry virtual module.
34
+ //
35
+ // Statically imports the `searchParams` named export from every page
36
+ // that exports one, and registers each definition into the shared
37
+ // search-params registry keyed by the un-interpolated route pattern
38
+ // (e.g. '/products/[id]'). This lets `<Link>` serialize flat
39
+ // `Partial<T>` values at runtime without callers importing the
40
+ // definition at the call site.
41
+ //
42
+ // The imports are STATIC (`import { searchParams as r0 } from '...'`)
43
+ // so Vite/Rolldown tree-shakes each page's component body out of the
44
+ // registry chunk — only the `searchParams` named export is pulled in.
45
+ const SEARCH_PARAMS_REGISTRY_ID = 'virtual:timber-search-params-registry';
46
+ const RESOLVED_SEARCH_PARAMS_REGISTRY_ID = `\0${SEARCH_PARAMS_REGISTRY_ID}`;
47
+
27
48
  /**
28
49
  * File convention names we track for changes that require manifest regeneration.
29
50
  */
30
51
  const ROUTE_FILE_PATTERNS =
31
- /\/(page|layout|middleware|access|route|error|default|denied|search-params|\d{3}|[45]xx|not-found|forbidden|unauthorized|sitemap|robots|manifest|favicon|icon|opengraph-image|twitter-image|apple-icon)\./;
52
+ /\/(page|layout|middleware|access|route|error|global-error|default|denied|params|\d{3}|[45]xx|not-found|forbidden|unauthorized|sitemap|robots|manifest|favicon|icon|opengraph-image|twitter-image|apple-icon)\./;
32
53
 
33
54
  /**
34
55
  * Create the timber-routing Vite plugin.
@@ -83,6 +104,24 @@ export function timberRouting(ctx: PluginContext): Plugin {
83
104
  const warnedFiles = new Set<string>();
84
105
 
85
106
  function rescan(): void {
107
+ // Check app/ directory exists before scanning
108
+ const appDirWarning = checkAppDirExists(ctx.appDir);
109
+ if (appDirWarning) {
110
+ const formatted = formatConventionWarnings([appDirWarning]);
111
+ if (formatted) process.stderr.write(`${formatted}\n`);
112
+ // Still create an empty tree so the rest of the pipeline doesn't crash
113
+ ctx.routeTree = {
114
+ root: {
115
+ segmentName: '',
116
+ segmentType: 'static',
117
+ urlPath: '/',
118
+ children: [],
119
+ slots: {},
120
+ },
121
+ };
122
+ return;
123
+ }
124
+
86
125
  ctx.timer.start('route-scan');
87
126
  ctx.routeTree = scanRoutes(ctx.appDir, {
88
127
  pageExtensions: ctx.config.pageExtensions,
@@ -91,11 +130,20 @@ export function timberRouting(ctx: PluginContext): Plugin {
91
130
  writeCodegen(ctx);
92
131
 
93
132
  // Lint status files for missing 'use client' directive
94
- const warnings = lintStatusFileDirectives(ctx.routeTree);
95
- const newWarnings = warnings.filter((w) => !warnedFiles.has(w.filePath));
96
- if (newWarnings.length > 0) {
97
- for (const w of newWarnings) warnedFiles.add(w.filePath);
98
- console.warn(formatStatusFileLintWarnings(newWarnings));
133
+ const statusWarnings = lintStatusFileDirectives(ctx.routeTree);
134
+ const newStatusWarnings = statusWarnings.filter((w) => !warnedFiles.has(w.filePath));
135
+ if (newStatusWarnings.length > 0) {
136
+ for (const w of newStatusWarnings) warnedFiles.add(w.filePath);
137
+ console.warn(formatStatusFileLintWarnings(newStatusWarnings));
138
+ }
139
+
140
+ // Lint conventions (empty app, missing methods, missing root layout)
141
+ const conventionWarnings = lintConventions(ctx.routeTree, ctx.appDir);
142
+ const newConventionWarnings = conventionWarnings.filter((w) => !warnedFiles.has(w.id));
143
+ if (newConventionWarnings.length > 0) {
144
+ for (const w of newConventionWarnings) warnedFiles.add(w.id);
145
+ const formatted = formatConventionWarnings(newConventionWarnings);
146
+ if (formatted) process.stderr.write(`${formatted}\n`);
99
147
  }
100
148
  }
101
149
 
@@ -123,6 +171,14 @@ export function timberRouting(ctx: PluginContext): Plugin {
123
171
  return RESOLVED_VIRTUAL_ID;
124
172
  }
125
173
 
174
+ // TIM-830: Search-params registry virtual module
175
+ if (
176
+ cleanId === SEARCH_PARAMS_REGISTRY_ID ||
177
+ cleanId.endsWith(`/${SEARCH_PARAMS_REGISTRY_ID}`)
178
+ ) {
179
+ return RESOLVED_SEARCH_PARAMS_REGISTRY_ID;
180
+ }
181
+
126
182
  return null;
127
183
  },
128
184
 
@@ -133,14 +189,22 @@ export function timberRouting(ctx: PluginContext): Plugin {
133
189
  * with absolute import paths for all file references.
134
190
  */
135
191
  load(id: string) {
136
- if (id !== RESOLVED_VIRTUAL_ID) return null;
192
+ if (id === RESOLVED_VIRTUAL_ID) {
193
+ // If routeTree hasn't been built yet (shouldn't happen), scan now
194
+ if (!ctx.routeTree) {
195
+ rescan();
196
+ }
197
+ return generateManifestModule(ctx.routeTree!, ctx.root);
198
+ }
137
199
 
138
- // If routeTree hasn't been built yet (shouldn't happen), scan now
139
- if (!ctx.routeTree) {
140
- rescan();
200
+ if (id === RESOLVED_SEARCH_PARAMS_REGISTRY_ID) {
201
+ if (!ctx.routeTree) {
202
+ rescan();
203
+ }
204
+ return generateSearchParamsRegistryModule(ctx.routeTree!);
141
205
  }
142
206
 
143
- return generateManifestModule(ctx.routeTree!);
207
+ return null;
144
208
  },
145
209
 
146
210
  /**
@@ -168,20 +232,49 @@ export function timberRouting(ctx: PluginContext): Plugin {
168
232
  // Watch the app directory
169
233
  devServer.watcher.add(ctx.appDir);
170
234
 
171
- const handleFileChange = (filePath: string) => {
172
- // Only react to route-significant files in the app directory
235
+ /** Snapshot of the last generated manifest, used to detect structural changes. */
236
+ let lastManifest = ctx.routeTree ? generateManifestModule(ctx.routeTree, ctx.root) : '';
237
+
238
+ /**
239
+ * Handle a route-significant file being added or removed.
240
+ * Always triggers a full-reload since the route tree structure changed.
241
+ */
242
+ const handleStructuralChange = (filePath: string) => {
173
243
  if (!filePath.startsWith(ctx.appDir)) return;
174
244
  if (!ROUTE_FILE_PATTERNS.test(filePath)) return;
175
245
 
176
- // Rescan the route tree
177
246
  rescan();
178
-
179
- // Invalidate the virtual module in all environments
247
+ lastManifest = ctx.routeTree ? generateManifestModule(ctx.routeTree, ctx.root) : '';
180
248
  invalidateManifest(devServer);
181
249
  };
182
250
 
183
- devServer.watcher.on('add', handleFileChange);
184
- devServer.watcher.on('unlink', handleFileChange);
251
+ /**
252
+ * Handle a route file's content changing.
253
+ *
254
+ * Most content edits (JSX changes, fixing typos) don't affect route
255
+ * metadata — Vite's React Fast Refresh handles those via normal HMR.
256
+ * Only rescan and full-reload when route metadata actually changed
257
+ * (e.g., searchParams export added/removed, metadata export changed).
258
+ */
259
+ const handleContentChange = (filePath: string) => {
260
+ if (!filePath.startsWith(ctx.appDir)) return;
261
+ if (!ROUTE_FILE_PATTERNS.test(filePath)) return;
262
+
263
+ rescan();
264
+ const newManifest = ctx.routeTree ? generateManifestModule(ctx.routeTree, ctx.root) : '';
265
+ if (newManifest !== lastManifest) {
266
+ lastManifest = newManifest;
267
+ invalidateManifest(devServer);
268
+ }
269
+ // Otherwise: content edit didn't change route metadata — let Vite HMR handle it
270
+ };
271
+
272
+ devServer.watcher.on('add', handleStructuralChange);
273
+ devServer.watcher.on('unlink', handleStructuralChange);
274
+ // Watch content changes to page files — searchParams detection depends
275
+ // on file contents (export const searchParams), not just file presence.
276
+ // But only full-reload when route metadata actually changes.
277
+ devServer.watcher.on('change', handleContentChange);
185
278
  // Also watch renames (which are add+unlink) — handled by the above
186
279
  },
187
280
  };
@@ -198,9 +291,11 @@ function invalidateManifest(server: ViteDevServer): void {
198
291
  const env = server.environments[envName];
199
292
  if (!env?.moduleGraph) continue;
200
293
 
201
- const mod = env.moduleGraph.getModuleById(RESOLVED_VIRTUAL_ID);
202
- if (mod) {
203
- env.moduleGraph.invalidateModule(mod);
294
+ for (const virtualId of [RESOLVED_VIRTUAL_ID, RESOLVED_SEARCH_PARAMS_REGISTRY_ID]) {
295
+ const mod = env.moduleGraph.getModuleById(virtualId);
296
+ if (mod) {
297
+ env.moduleGraph.invalidateModule(mod);
298
+ }
204
299
  }
205
300
  }
206
301
 
@@ -208,13 +303,88 @@ function invalidateManifest(server: ViteDevServer): void {
208
303
  server.hot.send({ type: 'full-reload' });
209
304
  }
210
305
 
306
+ /**
307
+ * TIM-830: Walk the route tree and collect every page that exports a
308
+ * `searchParams` definition, then emit a module that statically imports
309
+ * each export and registers it into the shared search-params registry.
310
+ *
311
+ * Keys use the un-interpolated route pattern (e.g. '/products/[id]') so
312
+ * <Link> can look up the definition from the original `href` prop before
313
+ * segmentParams are interpolated.
314
+ */
315
+ function generateSearchParamsRegistryModule(tree: RouteTree): string {
316
+ const entries: Array<{ urlPath: string; filePath: string }> = [];
317
+
318
+ function walk(node: SegmentNode): void {
319
+ // params.ts is the canonical location for `export const searchParams`;
320
+ // page.tsx is the legacy fallback (see codegen.ts `collectRoutes`).
321
+ if (node.page) {
322
+ if (node.params && fileHasSearchParamsExport(node.params.filePath)) {
323
+ entries.push({ urlPath: node.urlPath, filePath: node.params.filePath });
324
+ } else if (fileHasSearchParamsExport(node.page.filePath)) {
325
+ entries.push({ urlPath: node.urlPath, filePath: node.page.filePath });
326
+ }
327
+ }
328
+ for (const child of node.children) walk(child);
329
+ for (const slot of Object.values(node.slots)) walk(slot);
330
+ }
331
+ walk(tree.root);
332
+
333
+ // Deterministic order for stable output / snapshots
334
+ entries.sort((a, b) => a.urlPath.localeCompare(b.urlPath));
335
+
336
+ const lines: string[] = [];
337
+ lines.push('// Auto-generated search-params registry — do not edit.');
338
+ lines.push('// Generated by timber-routing plugin (TIM-830).');
339
+ lines.push('');
340
+ lines.push("import { registerSearchParams } from '@timber-js/app/search-params';");
341
+ lines.push('');
342
+
343
+ // Static imports — Vite/Rolldown tree-shakes the page component body out
344
+ // of this chunk, leaving only the `searchParams` named export.
345
+ entries.forEach((entry, i) => {
346
+ lines.push(`import { searchParams as r${i} } from ${JSON.stringify(entry.filePath)};`);
347
+ });
348
+ lines.push('');
349
+
350
+ entries.forEach((entry, i) => {
351
+ lines.push(`registerSearchParams(${JSON.stringify(entry.urlPath)}, r${i});`);
352
+ });
353
+ lines.push('');
354
+
355
+ // Exporting an empty object keeps the module a real ESM module even
356
+ // when there are zero entries (no top-level imports in that case).
357
+ lines.push('export {};');
358
+ lines.push('');
359
+
360
+ return lines.join('\n');
361
+ }
362
+
363
+ /**
364
+ * Lightweight check for a `searchParams` named export. Mirrors
365
+ * `fileHasExport('searchParams')` in routing/codegen.ts so we stay
366
+ * in sync with what the type codegen detects.
367
+ */
368
+ function fileHasSearchParamsExport(filePath: string): boolean {
369
+ try {
370
+ if (!existsSync(filePath)) return false;
371
+ const content = readFileSync(filePath, 'utf-8');
372
+ return (
373
+ /export\s+(const|let|var)\s+searchParams\b/.test(content) ||
374
+ /export\s*\{[^}]*\bsearchParams\b[^}]*\}/.test(content)
375
+ );
376
+ } catch {
377
+ return false;
378
+ }
379
+ }
380
+
211
381
  /**
212
382
  * Generate the virtual module source code for the route manifest.
213
383
  *
214
384
  * The output is a default-exported object containing the serialized route tree.
215
385
  * All file references use absolute paths (required for virtual modules).
216
386
  */
217
- function generateManifestModule(tree: RouteTree): string {
387
+ function generateManifestModule(tree: RouteTree, viteRoot: string): string {
218
388
  const imports: string[] = [];
219
389
  let importIndex = 0;
220
390
 
@@ -301,17 +471,20 @@ function generateManifestModule(tree: RouteTree): string {
301
471
  `${nextIndent}denied: { load: ${v}, filePath: ${JSON.stringify(node.denied.filePath)} },`
302
472
  );
303
473
  }
304
- if (node.searchParams) {
305
- const v = addImport(node.searchParams);
474
+ if (node.params) {
475
+ const v = addImport(node.params);
306
476
  parts.push(
307
- `${nextIndent}searchParams: { load: ${v}, filePath: ${JSON.stringify(node.searchParams.filePath)} },`
477
+ `${nextIndent}params: { load: ${v}, filePath: ${JSON.stringify(node.params.filePath)} },`
308
478
  );
309
479
  }
480
+ // searchParams is now a named export from page.tsx, not a separate file.
481
+ // The page module's searchParams export is loaded via the page's lazy import.
482
+ // Runtime registration happens in the route loader using the page module.
310
483
 
311
484
  // Status-code files
312
- if (node.statusFiles && node.statusFiles.size > 0) {
485
+ if (node.statusFiles && Object.keys(node.statusFiles).length > 0) {
313
486
  const statusEntries: string[] = [];
314
- for (const [code, file] of node.statusFiles) {
487
+ for (const [code, file] of Object.entries(node.statusFiles)) {
315
488
  const v = addImport(file);
316
489
  statusEntries.push(
317
490
  `${nextIndent} ${JSON.stringify(code)}: { load: ${v}, filePath: ${JSON.stringify(file.filePath)} }`
@@ -321,9 +494,9 @@ function generateManifestModule(tree: RouteTree): string {
321
494
  }
322
495
 
323
496
  // JSON status-code files
324
- if (node.jsonStatusFiles && node.jsonStatusFiles.size > 0) {
497
+ if (node.jsonStatusFiles && Object.keys(node.jsonStatusFiles).length > 0) {
325
498
  const jsonEntries: string[] = [];
326
- for (const [code, file] of node.jsonStatusFiles) {
499
+ for (const [code, file] of Object.entries(node.jsonStatusFiles)) {
327
500
  const v = addImport(file);
328
501
  jsonEntries.push(
329
502
  `${nextIndent} ${JSON.stringify(code)}: { load: ${v}, filePath: ${JSON.stringify(file.filePath)} }`
@@ -333,9 +506,9 @@ function generateManifestModule(tree: RouteTree): string {
333
506
  }
334
507
 
335
508
  // Legacy status files
336
- if (node.legacyStatusFiles && node.legacyStatusFiles.size > 0) {
509
+ if (node.legacyStatusFiles && Object.keys(node.legacyStatusFiles).length > 0) {
337
510
  const legacyEntries: string[] = [];
338
- for (const [name, file] of node.legacyStatusFiles) {
511
+ for (const [name, file] of Object.entries(node.legacyStatusFiles)) {
339
512
  const v = addImport(file);
340
513
  legacyEntries.push(
341
514
  `${nextIndent} ${JSON.stringify(name)}: { load: ${v}, filePath: ${JSON.stringify(file.filePath)} }`
@@ -347,9 +520,9 @@ function generateManifestModule(tree: RouteTree): string {
347
520
  }
348
521
 
349
522
  // Metadata route files (sitemap.ts, robots.ts, icon.tsx, etc.)
350
- if (node.metadataRoutes && node.metadataRoutes.size > 0) {
523
+ if (node.metadataRoutes && Object.keys(node.metadataRoutes).length > 0) {
351
524
  const metaEntries: string[] = [];
352
- for (const [name, file] of node.metadataRoutes) {
525
+ for (const [name, file] of Object.entries(node.metadataRoutes)) {
353
526
  const v = addImport(file);
354
527
  metaEntries.push(
355
528
  `${nextIndent} ${JSON.stringify(name)}: { load: ${v}, filePath: ${JSON.stringify(file.filePath)} }`
@@ -367,9 +540,11 @@ function generateManifestModule(tree: RouteTree): string {
367
540
  }
368
541
 
369
542
  // Parallel slots
370
- if (node.slots.size > 0) {
543
+ const slotKeys = Object.keys(node.slots);
544
+ if (slotKeys.length > 0) {
371
545
  const slotEntries: string[] = [];
372
- for (const [slotName, slotNode] of node.slots) {
546
+ for (const slotName of slotKeys) {
547
+ const slotNode = node.slots[slotName]!;
373
548
  slotEntries.push(
374
549
  `${nextIndent} ${JSON.stringify(slotName)}: ${serializeNode(slotNode, nextIndent + ' ')}`
375
550
  );
@@ -391,6 +566,13 @@ function generateManifestModule(tree: RouteTree): string {
391
566
  proxyLine = ` proxy: { load: ${v}, filePath: ${JSON.stringify(tree.proxy.filePath)} },`;
392
567
  }
393
568
 
569
+ // Global error page (Tier 2)
570
+ let globalErrorLine = '';
571
+ if (tree.globalError) {
572
+ const v = addImport(tree.globalError);
573
+ globalErrorLine = ` globalError: { load: ${v}, filePath: ${JSON.stringify(tree.globalError.filePath)} },`;
574
+ }
575
+
394
576
  // Interception rewrites — computed at build time from the route tree.
395
577
  // Only interceptedPattern and interceptingPrefix are needed at runtime.
396
578
  const rewrites = collectInterceptionRewrites(tree.root);
@@ -406,7 +588,9 @@ function generateManifestModule(tree: RouteTree): string {
406
588
  ...imports,
407
589
  '',
408
590
  'const manifest = {',
591
+ ` viteRoot: ${JSON.stringify(viteRoot)},`,
409
592
  proxyLine,
593
+ globalErrorLine,
410
594
  rewritesLine,
411
595
  ` root: ${rootSerialized},`,
412
596
  '};',
@@ -1,7 +1,7 @@
1
1
  import type { Plugin } from 'vite';
2
2
  import { Parser } from 'acorn';
3
3
  import acornJsx from 'acorn-jsx';
4
- import { detectFileDirective } from '#/utils/directive-parser.js';
4
+ import { detectFileDirective } from '../utils/directive-parser.js';
5
5
 
6
6
  const jsxParser = Parser.extend(acornJsx());
7
7
 
@@ -65,6 +65,10 @@ export function timberServerBundle(): Plugin[] {
65
65
  // eliminated by Rollup's tree-shaking. Without this, the runtime
66
66
  // check falls through on platforms where process.env is empty
67
67
  // (e.g. Cloudflare Workers), causing dev code to run in production.
68
+ // Define process.env.NODE_ENV so dev-only React code is tree-shaken.
69
+ // TIMBER_DEBUG is intentionally NOT defined here — it must remain a
70
+ // runtime check so `isDebug()` in server/debug.ts can read it at
71
+ // request time. See TIM-365.
68
72
  const serverDefine = {
69
73
  'process.env.NODE_ENV': JSON.stringify('production'),
70
74
  };
@@ -133,5 +137,36 @@ export function timberServerBundle(): Plugin[] {
133
137
  },
134
138
  };
135
139
 
136
- return [bundlePlugin, esmInitFixPlugin];
140
+ // Fix Rolldown's `createRequire(import.meta.url)` CJS interop shim for
141
+ // Cloudflare Workers. Rolldown emits this for CJS dependencies (e.g.
142
+ // @opentelemetry/context-async-hooks) that use `require()`. On Workers,
143
+ // `import.meta.url` is `undefined` for non-entry modules, causing:
144
+ // TypeError: The argument 'path' must be a file URL object, a file URL
145
+ // string, or an absolute path string. Received 'undefined'
146
+ //
147
+ // The fix: provide a fallback URL when `import.meta.url` is undefined.
148
+ // The actual URL doesn't matter — `createRequire` only needs it for
149
+ // resolving relative paths, but the only `__require()` calls are for
150
+ // Node built-ins (events, async_hooks) which resolve from any base.
151
+ //
152
+ // The top-level `ssr: { target: 'webworker' }` was supposed to prevent
153
+ // this, but it doesn't propagate to custom environments (rsc) in Vite's
154
+ // Environment API. See LOCAL-405.
155
+ const createRequireFixPlugin: Plugin = {
156
+ name: 'timber-create-require-fix',
157
+ applyToEnvironment(environment) {
158
+ return environment.name === 'rsc' || environment.name === 'ssr';
159
+ },
160
+ renderChunk(code) {
161
+ const pattern = 'createRequire(import.meta.url)';
162
+ if (!code.includes(pattern)) return null;
163
+
164
+ return {
165
+ code: code.replace(pattern, 'createRequire(import.meta.url || "file:///app")'),
166
+ map: null,
167
+ };
168
+ },
169
+ };
170
+
171
+ return [bundlePlugin, esmInitFixPlugin, createRequireFixPlugin];
137
172
  }