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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (610) hide show
  1. package/dist/_chunks/actions-DLnUaR65.js +421 -0
  2. package/dist/_chunks/actions-DLnUaR65.js.map +1 -0
  3. package/dist/_chunks/{als-registry-B7DbZ2hS.js → als-registry-HS0LGUl2.js} +1 -1
  4. package/dist/_chunks/als-registry-HS0LGUl2.js.map +1 -0
  5. package/dist/_chunks/chunk-BYIpzuS7.js +39 -0
  6. package/dist/_chunks/{debug-gwlJkDuf.js → debug-ECi_61pb.js} +2 -2
  7. package/dist/_chunks/debug-ECi_61pb.js.map +1 -0
  8. package/dist/_chunks/define-C77ScO0m.js +106 -0
  9. package/dist/_chunks/define-C77ScO0m.js.map +1 -0
  10. package/dist/_chunks/define-Itxvcd7F.js +199 -0
  11. package/dist/_chunks/define-Itxvcd7F.js.map +1 -0
  12. package/dist/_chunks/define-cookie-BowvzoP0.js +94 -0
  13. package/dist/_chunks/define-cookie-BowvzoP0.js.map +1 -0
  14. package/dist/_chunks/{format-DviM89f0.js → dev-warnings-DpGRGoDi.js} +5 -44
  15. package/dist/_chunks/dev-warnings-DpGRGoDi.js.map +1 -0
  16. package/dist/_chunks/format-CYBGxKtc.js +14 -0
  17. package/dist/_chunks/format-CYBGxKtc.js.map +1 -0
  18. package/dist/_chunks/{interception-BOoWmLUA.js → interception-DRlhJWbu.js} +219 -97
  19. package/dist/_chunks/interception-DRlhJWbu.js.map +1 -0
  20. package/dist/_chunks/merge-search-params-Cm_KIWDX.js +41 -0
  21. package/dist/_chunks/merge-search-params-Cm_KIWDX.js.map +1 -0
  22. package/dist/_chunks/{metadata-routes-Cjmvi3rQ.js → metadata-routes-DS3eKNmf.js} +1 -1
  23. package/dist/_chunks/{metadata-routes-Cjmvi3rQ.js.map → metadata-routes-DS3eKNmf.js.map} +1 -1
  24. package/dist/_chunks/request-context-CK5tZqIP.js +478 -0
  25. package/dist/_chunks/request-context-CK5tZqIP.js.map +1 -0
  26. package/dist/_chunks/schema-bridge-C3xl_vfb.js +86 -0
  27. package/dist/_chunks/schema-bridge-C3xl_vfb.js.map +1 -0
  28. package/dist/_chunks/segment-classify-BDNn6EzD.js +65 -0
  29. package/dist/_chunks/segment-classify-BDNn6EzD.js.map +1 -0
  30. package/dist/_chunks/segment-context-fHFLF1PE.js +34 -0
  31. package/dist/_chunks/segment-context-fHFLF1PE.js.map +1 -0
  32. package/dist/_chunks/{ssr-data-MjmprTmO.js → ssr-data-DzuI0bIV.js} +1 -1
  33. package/dist/_chunks/{ssr-data-MjmprTmO.js.map → ssr-data-DzuI0bIV.js.map} +1 -1
  34. package/dist/_chunks/stale-reload-BX5gL1r-.js +64 -0
  35. package/dist/_chunks/stale-reload-BX5gL1r-.js.map +1 -0
  36. package/dist/_chunks/{tracing-CemImE6h.js → tracing-CCYbKn5n.js} +60 -9
  37. package/dist/_chunks/tracing-CCYbKn5n.js.map +1 -0
  38. package/dist/_chunks/use-params-Br9YSUFV.js +295 -0
  39. package/dist/_chunks/use-params-Br9YSUFV.js.map +1 -0
  40. package/dist/_chunks/{use-query-states-D5KaffOK.js → use-query-states-BiV5GJgm.js} +7 -4
  41. package/dist/_chunks/use-query-states-BiV5GJgm.js.map +1 -0
  42. package/dist/adapters/cloudflare-dev.d.ts +109 -0
  43. package/dist/adapters/cloudflare-dev.d.ts.map +1 -0
  44. package/dist/adapters/cloudflare-dev.js +73 -0
  45. package/dist/adapters/cloudflare-dev.js.map +1 -0
  46. package/dist/adapters/cloudflare-kv-cache.d.ts +64 -0
  47. package/dist/adapters/cloudflare-kv-cache.d.ts.map +1 -0
  48. package/dist/adapters/cloudflare-kv-cache.js +95 -0
  49. package/dist/adapters/cloudflare-kv-cache.js.map +1 -0
  50. package/dist/adapters/cloudflare.d.ts +148 -12
  51. package/dist/adapters/cloudflare.d.ts.map +1 -1
  52. package/dist/adapters/cloudflare.js +135 -11
  53. package/dist/adapters/cloudflare.js.map +1 -1
  54. package/dist/adapters/compress-module.d.ts.map +1 -1
  55. package/dist/adapters/nitro.d.ts +17 -1
  56. package/dist/adapters/nitro.d.ts.map +1 -1
  57. package/dist/adapters/nitro.js +56 -13
  58. package/dist/adapters/nitro.js.map +1 -1
  59. package/dist/cache/cache-api.d.ts +24 -0
  60. package/dist/cache/cache-api.d.ts.map +1 -0
  61. package/dist/cache/handler-store.d.ts +31 -0
  62. package/dist/cache/handler-store.d.ts.map +1 -0
  63. package/dist/cache/index.d.ts +23 -7
  64. package/dist/cache/index.d.ts.map +1 -1
  65. package/dist/cache/index.js +142 -80
  66. package/dist/cache/index.js.map +1 -1
  67. package/dist/cache/singleflight.d.ts +18 -1
  68. package/dist/cache/singleflight.d.ts.map +1 -1
  69. package/dist/cache/sizeof.d.ts +22 -0
  70. package/dist/cache/sizeof.d.ts.map +1 -0
  71. package/dist/cache/timber-cache.d.ts +1 -1
  72. package/dist/cache/timber-cache.d.ts.map +1 -1
  73. package/dist/cli.d.ts +6 -1
  74. package/dist/cli.d.ts.map +1 -1
  75. package/dist/cli.js +8 -3
  76. package/dist/cli.js.map +1 -1
  77. package/dist/client/browser-dev.d.ts +27 -1
  78. package/dist/client/browser-dev.d.ts.map +1 -1
  79. package/dist/client/browser-entry/action-dispatch.d.ts +17 -0
  80. package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -0
  81. package/dist/client/browser-entry/hmr.d.ts +21 -0
  82. package/dist/client/browser-entry/hmr.d.ts.map +1 -0
  83. package/dist/client/browser-entry/hydrate.d.ts +46 -0
  84. package/dist/client/browser-entry/hydrate.d.ts.map +1 -0
  85. package/dist/client/browser-entry/index.d.ts +30 -0
  86. package/dist/client/browser-entry/index.d.ts.map +1 -0
  87. package/dist/client/browser-entry/post-hydration.d.ts +26 -0
  88. package/dist/client/browser-entry/post-hydration.d.ts.map +1 -0
  89. package/dist/client/browser-entry/router-init.d.ts +23 -0
  90. package/dist/client/browser-entry/router-init.d.ts.map +1 -0
  91. package/dist/client/browser-entry/rsc-stream.d.ts +24 -0
  92. package/dist/client/browser-entry/rsc-stream.d.ts.map +1 -0
  93. package/dist/client/browser-entry/scroll.d.ts +19 -0
  94. package/dist/client/browser-entry/scroll.d.ts.map +1 -0
  95. package/dist/client/error-boundary.d.ts +12 -5
  96. package/dist/client/error-boundary.d.ts.map +1 -1
  97. package/dist/client/error-boundary.js +10 -4
  98. package/dist/client/error-boundary.js.map +1 -1
  99. package/dist/client/error-reconstituter.d.ts +54 -0
  100. package/dist/client/error-reconstituter.d.ts.map +1 -0
  101. package/dist/client/form.d.ts +6 -3
  102. package/dist/client/form.d.ts.map +1 -1
  103. package/dist/client/history.d.ts +19 -4
  104. package/dist/client/history.d.ts.map +1 -1
  105. package/dist/client/index.d.ts +9 -21
  106. package/dist/client/index.d.ts.map +1 -1
  107. package/dist/client/index.js +229 -1018
  108. package/dist/client/index.js.map +1 -1
  109. package/dist/client/internal.d.ts +18 -0
  110. package/dist/client/internal.d.ts.map +1 -0
  111. package/dist/client/internal.js +890 -0
  112. package/dist/client/internal.js.map +1 -0
  113. package/dist/client/link-pending-store.d.ts +63 -0
  114. package/dist/client/link-pending-store.d.ts.map +1 -0
  115. package/dist/client/link.d.ts +62 -55
  116. package/dist/client/link.d.ts.map +1 -1
  117. package/dist/client/nav-link-store.d.ts +36 -0
  118. package/dist/client/nav-link-store.d.ts.map +1 -0
  119. package/dist/client/navigation-api-types.d.ts +90 -0
  120. package/dist/client/navigation-api-types.d.ts.map +1 -0
  121. package/dist/client/navigation-api.d.ts +115 -0
  122. package/dist/client/navigation-api.d.ts.map +1 -0
  123. package/dist/client/navigation-context.d.ts +13 -2
  124. package/dist/client/navigation-context.d.ts.map +1 -1
  125. package/dist/client/{transition-root.d.ts → navigation-root.d.ts} +42 -8
  126. package/dist/client/navigation-root.d.ts.map +1 -0
  127. package/dist/client/nuqs-adapter.d.ts.map +1 -1
  128. package/dist/client/router-ref.d.ts +1 -1
  129. package/dist/client/router.d.ts +70 -4
  130. package/dist/client/router.d.ts.map +1 -1
  131. package/dist/client/rsc-fetch.d.ts +38 -3
  132. package/dist/client/rsc-fetch.d.ts.map +1 -1
  133. package/dist/client/segment-cache.d.ts +1 -1
  134. package/dist/client/segment-cache.d.ts.map +1 -1
  135. package/dist/client/segment-outlet.d.ts +63 -0
  136. package/dist/client/segment-outlet.d.ts.map +1 -0
  137. package/dist/client/ssr-data.d.ts +13 -4
  138. package/dist/client/ssr-data.d.ts.map +1 -1
  139. package/dist/client/stale-reload.d.ts +15 -0
  140. package/dist/client/stale-reload.d.ts.map +1 -1
  141. package/dist/client/top-loader.d.ts +5 -5
  142. package/dist/client/top-loader.d.ts.map +1 -1
  143. package/dist/client/use-link-status.d.ts +5 -5
  144. package/dist/client/use-link-status.d.ts.map +1 -1
  145. package/dist/client/use-params.d.ts +6 -4
  146. package/dist/client/use-params.d.ts.map +1 -1
  147. package/dist/client/{use-navigation-pending.d.ts → use-pending-navigation.d.ts} +4 -4
  148. package/dist/client/use-pending-navigation.d.ts.map +1 -0
  149. package/dist/client/use-query-states.d.ts +1 -1
  150. package/dist/client/use-query-states.d.ts.map +1 -1
  151. package/dist/client/use-router.d.ts +1 -1
  152. package/dist/codec.d.ts +33 -0
  153. package/dist/codec.d.ts.map +1 -0
  154. package/dist/codec.js +2 -0
  155. package/dist/config-types.d.ts +266 -0
  156. package/dist/config-types.d.ts.map +1 -0
  157. package/dist/config-validation.d.ts +51 -0
  158. package/dist/config-validation.d.ts.map +1 -0
  159. package/dist/content/index.d.ts +1 -10
  160. package/dist/content/index.d.ts.map +1 -1
  161. package/dist/content/index.js +0 -2
  162. package/dist/cookies/define-cookie.d.ts +35 -14
  163. package/dist/cookies/define-cookie.d.ts.map +1 -1
  164. package/dist/cookies/index.js +1 -83
  165. package/dist/fonts/bundle.d.ts +48 -0
  166. package/dist/fonts/bundle.d.ts.map +1 -0
  167. package/dist/fonts/css.d.ts +1 -0
  168. package/dist/fonts/css.d.ts.map +1 -1
  169. package/dist/fonts/dev-middleware.d.ts +22 -0
  170. package/dist/fonts/dev-middleware.d.ts.map +1 -0
  171. package/dist/fonts/pipeline.d.ts +138 -0
  172. package/dist/fonts/pipeline.d.ts.map +1 -0
  173. package/dist/fonts/transform.d.ts +72 -0
  174. package/dist/fonts/transform.d.ts.map +1 -0
  175. package/dist/fonts/types.d.ts +45 -1
  176. package/dist/fonts/types.d.ts.map +1 -1
  177. package/dist/fonts/virtual-modules.d.ts +59 -0
  178. package/dist/fonts/virtual-modules.d.ts.map +1 -0
  179. package/dist/index.d.ts +45 -190
  180. package/dist/index.d.ts.map +1 -1
  181. package/dist/index.js +4294 -2453
  182. package/dist/index.js.map +1 -1
  183. package/dist/plugin-context.d.ts +107 -0
  184. package/dist/plugin-context.d.ts.map +1 -0
  185. package/dist/plugins/adapter-build.d.ts +1 -1
  186. package/dist/plugins/adapter-build.d.ts.map +1 -1
  187. package/dist/plugins/build-manifest.d.ts +2 -2
  188. package/dist/plugins/build-manifest.d.ts.map +1 -1
  189. package/dist/plugins/build-report.d.ts +3 -3
  190. package/dist/plugins/build-report.d.ts.map +1 -1
  191. package/dist/plugins/client-chunks.d.ts +32 -0
  192. package/dist/plugins/client-chunks.d.ts.map +1 -0
  193. package/dist/plugins/content.d.ts +1 -1
  194. package/dist/plugins/content.d.ts.map +1 -1
  195. package/dist/plugins/dev-404-page.d.ts +56 -0
  196. package/dist/plugins/dev-404-page.d.ts.map +1 -0
  197. package/dist/plugins/dev-browser-logs.d.ts +84 -0
  198. package/dist/plugins/dev-browser-logs.d.ts.map +1 -0
  199. package/dist/plugins/dev-error-overlay.d.ts +49 -9
  200. package/dist/plugins/dev-error-overlay.d.ts.map +1 -1
  201. package/dist/plugins/dev-error-page.d.ts +58 -0
  202. package/dist/plugins/dev-error-page.d.ts.map +1 -0
  203. package/dist/plugins/dev-logs.d.ts +1 -1
  204. package/dist/plugins/dev-logs.d.ts.map +1 -1
  205. package/dist/plugins/dev-server.d.ts +1 -1
  206. package/dist/plugins/dev-server.d.ts.map +1 -1
  207. package/dist/plugins/dev-terminal-error.d.ts +28 -0
  208. package/dist/plugins/dev-terminal-error.d.ts.map +1 -0
  209. package/dist/plugins/entries.d.ts +1 -1
  210. package/dist/plugins/entries.d.ts.map +1 -1
  211. package/dist/plugins/fonts.d.ts +17 -73
  212. package/dist/plugins/fonts.d.ts.map +1 -1
  213. package/dist/plugins/mdx.d.ts +1 -1
  214. package/dist/plugins/mdx.d.ts.map +1 -1
  215. package/dist/plugins/routing.d.ts +1 -1
  216. package/dist/plugins/routing.d.ts.map +1 -1
  217. package/dist/plugins/server-bundle.d.ts.map +1 -1
  218. package/dist/plugins/shims.d.ts +6 -5
  219. package/dist/plugins/shims.d.ts.map +1 -1
  220. package/dist/plugins/static-build.d.ts +4 -4
  221. package/dist/plugins/static-build.d.ts.map +1 -1
  222. package/dist/routing/codegen.d.ts +2 -2
  223. package/dist/routing/codegen.d.ts.map +1 -1
  224. package/dist/routing/convention-lint.d.ts +41 -0
  225. package/dist/routing/convention-lint.d.ts.map +1 -0
  226. package/dist/routing/index.d.ts +2 -0
  227. package/dist/routing/index.d.ts.map +1 -1
  228. package/dist/routing/index.js +3 -2
  229. package/dist/routing/scanner.d.ts.map +1 -1
  230. package/dist/routing/segment-classify.d.ts +46 -0
  231. package/dist/routing/segment-classify.d.ts.map +1 -0
  232. package/dist/routing/status-file-lint.d.ts +2 -1
  233. package/dist/routing/status-file-lint.d.ts.map +1 -1
  234. package/dist/routing/types.d.ts +16 -4
  235. package/dist/routing/types.d.ts.map +1 -1
  236. package/dist/rsc-runtime/rsc.d.ts +1 -1
  237. package/dist/rsc-runtime/rsc.d.ts.map +1 -1
  238. package/dist/rsc-runtime/ssr.d.ts +12 -0
  239. package/dist/rsc-runtime/ssr.d.ts.map +1 -1
  240. package/dist/schema-bridge.d.ts +76 -0
  241. package/dist/schema-bridge.d.ts.map +1 -0
  242. package/dist/search-params/define.d.ts +139 -0
  243. package/dist/search-params/define.d.ts.map +1 -0
  244. package/dist/search-params/index.d.ts +4 -7
  245. package/dist/search-params/index.d.ts.map +1 -1
  246. package/dist/search-params/index.js +32 -441
  247. package/dist/search-params/index.js.map +1 -1
  248. package/dist/search-params/registry.d.ts +2 -2
  249. package/dist/search-params/registry.d.ts.map +1 -1
  250. package/dist/search-params/wrappers.d.ts +53 -0
  251. package/dist/search-params/wrappers.d.ts.map +1 -0
  252. package/dist/segment-params/define.d.ts +78 -0
  253. package/dist/segment-params/define.d.ts.map +1 -0
  254. package/dist/segment-params/index.d.ts +3 -0
  255. package/dist/segment-params/index.d.ts.map +1 -0
  256. package/dist/segment-params/index.js +2 -0
  257. package/dist/server/access-gate.d.ts +4 -0
  258. package/dist/server/access-gate.d.ts.map +1 -1
  259. package/dist/server/action-client.d.ts +41 -6
  260. package/dist/server/action-client.d.ts.map +1 -1
  261. package/dist/server/action-encryption.d.ts +76 -0
  262. package/dist/server/action-encryption.d.ts.map +1 -0
  263. package/dist/server/action-handler.d.ts +7 -0
  264. package/dist/server/action-handler.d.ts.map +1 -1
  265. package/dist/server/actions.d.ts +3 -6
  266. package/dist/server/actions.d.ts.map +1 -1
  267. package/dist/server/als-registry.d.ts +32 -4
  268. package/dist/server/als-registry.d.ts.map +1 -1
  269. package/dist/server/build-manifest.d.ts +2 -2
  270. package/dist/server/build-manifest.d.ts.map +1 -1
  271. package/dist/server/debug.d.ts +1 -1
  272. package/dist/server/default-logger.d.ts +22 -0
  273. package/dist/server/default-logger.d.ts.map +1 -0
  274. package/dist/server/deny-page-resolver.d.ts +52 -0
  275. package/dist/server/deny-page-resolver.d.ts.map +1 -0
  276. package/dist/server/deny-renderer.d.ts.map +1 -1
  277. package/dist/server/dev-holding-server.d.ts +52 -0
  278. package/dist/server/dev-holding-server.d.ts.map +1 -0
  279. package/dist/server/dev-source-map.d.ts +22 -0
  280. package/dist/server/dev-source-map.d.ts.map +1 -0
  281. package/dist/server/dev-warnings.d.ts +1 -21
  282. package/dist/server/dev-warnings.d.ts.map +1 -1
  283. package/dist/server/early-hints.d.ts +13 -5
  284. package/dist/server/early-hints.d.ts.map +1 -1
  285. package/dist/server/error-boundary-wrapper.d.ts +7 -1
  286. package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
  287. package/dist/server/fallback-error.d.ts +12 -7
  288. package/dist/server/fallback-error.d.ts.map +1 -1
  289. package/dist/server/flight-injection-state.d.ts +66 -0
  290. package/dist/server/flight-injection-state.d.ts.map +1 -0
  291. package/dist/server/flight-scripts.d.ts +42 -0
  292. package/dist/server/flight-scripts.d.ts.map +1 -0
  293. package/dist/server/flush.d.ts.map +1 -1
  294. package/dist/server/form-data.d.ts +29 -0
  295. package/dist/server/form-data.d.ts.map +1 -1
  296. package/dist/server/html-injectors.d.ts +51 -11
  297. package/dist/server/html-injectors.d.ts.map +1 -1
  298. package/dist/server/index.d.ts +5 -43
  299. package/dist/server/index.d.ts.map +1 -1
  300. package/dist/server/index.js +195 -2800
  301. package/dist/server/index.js.map +1 -1
  302. package/dist/server/internal.d.ts +46 -0
  303. package/dist/server/internal.d.ts.map +1 -0
  304. package/dist/server/internal.js +2900 -0
  305. package/dist/server/internal.js.map +1 -0
  306. package/dist/server/logger.d.ts +25 -7
  307. package/dist/server/logger.d.ts.map +1 -1
  308. package/dist/server/middleware-runner.d.ts +19 -4
  309. package/dist/server/middleware-runner.d.ts.map +1 -1
  310. package/dist/server/node-stream-transforms.d.ts +113 -0
  311. package/dist/server/node-stream-transforms.d.ts.map +1 -0
  312. package/dist/server/page-deny-boundary.d.ts +31 -0
  313. package/dist/server/page-deny-boundary.d.ts.map +1 -0
  314. package/dist/server/pipeline-interception.d.ts +1 -1
  315. package/dist/server/pipeline-interception.d.ts.map +1 -1
  316. package/dist/server/pipeline-metadata.d.ts +6 -0
  317. package/dist/server/pipeline-metadata.d.ts.map +1 -1
  318. package/dist/server/pipeline.d.ts +52 -10
  319. package/dist/server/pipeline.d.ts.map +1 -1
  320. package/dist/server/primitives.d.ts +69 -18
  321. package/dist/server/primitives.d.ts.map +1 -1
  322. package/dist/server/render-timeout.d.ts +51 -0
  323. package/dist/server/render-timeout.d.ts.map +1 -0
  324. package/dist/server/request-context.d.ts +112 -43
  325. package/dist/server/request-context.d.ts.map +1 -1
  326. package/dist/server/route-element-builder.d.ts +27 -1
  327. package/dist/server/route-element-builder.d.ts.map +1 -1
  328. package/dist/server/route-handler.d.ts.map +1 -1
  329. package/dist/server/route-matcher.d.ts +16 -2
  330. package/dist/server/route-matcher.d.ts.map +1 -1
  331. package/dist/server/rsc-entry/api-handler.d.ts +2 -2
  332. package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
  333. package/dist/server/rsc-entry/error-renderer.d.ts +26 -13
  334. package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
  335. package/dist/server/rsc-entry/helpers.d.ts +48 -5
  336. package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
  337. package/dist/server/rsc-entry/index.d.ts +20 -3
  338. package/dist/server/rsc-entry/index.d.ts.map +1 -1
  339. package/dist/server/rsc-entry/rsc-payload.d.ts +3 -3
  340. package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
  341. package/dist/server/rsc-entry/rsc-stream.d.ts +14 -1
  342. package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
  343. package/dist/server/rsc-entry/ssr-bridge.d.ts +1 -1
  344. package/dist/server/rsc-entry/ssr-bridge.d.ts.map +1 -1
  345. package/dist/server/rsc-entry/ssr-renderer.d.ts +19 -4
  346. package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
  347. package/dist/server/safe-load.d.ts +46 -0
  348. package/dist/server/safe-load.d.ts.map +1 -0
  349. package/dist/server/sensitive-fields.d.ts +74 -0
  350. package/dist/server/sensitive-fields.d.ts.map +1 -0
  351. package/dist/server/sitemap-generator.d.ts +129 -0
  352. package/dist/server/sitemap-generator.d.ts.map +1 -0
  353. package/dist/server/sitemap-handler.d.ts +22 -0
  354. package/dist/server/sitemap-handler.d.ts.map +1 -0
  355. package/dist/server/slot-resolver.d.ts +1 -1
  356. package/dist/server/slot-resolver.d.ts.map +1 -1
  357. package/dist/server/ssr-entry.d.ts +23 -0
  358. package/dist/server/ssr-entry.d.ts.map +1 -1
  359. package/dist/server/ssr-render.d.ts +39 -21
  360. package/dist/server/ssr-render.d.ts.map +1 -1
  361. package/dist/server/ssr-wrappers.d.ts +50 -0
  362. package/dist/server/ssr-wrappers.d.ts.map +1 -0
  363. package/dist/server/status-code-resolver.d.ts +1 -1
  364. package/dist/server/status-code-resolver.d.ts.map +1 -1
  365. package/dist/server/stream-utils.d.ts +36 -0
  366. package/dist/server/stream-utils.d.ts.map +1 -0
  367. package/dist/server/tracing.d.ts +4 -4
  368. package/dist/server/tracing.d.ts.map +1 -1
  369. package/dist/server/tree-builder.d.ts +22 -19
  370. package/dist/server/tree-builder.d.ts.map +1 -1
  371. package/dist/server/types.d.ts +1 -4
  372. package/dist/server/types.d.ts.map +1 -1
  373. package/dist/server/version-skew.d.ts +61 -0
  374. package/dist/server/version-skew.d.ts.map +1 -0
  375. package/dist/shared/merge-search-params.d.ts +22 -0
  376. package/dist/shared/merge-search-params.d.ts.map +1 -0
  377. package/dist/shims/font-google.d.ts +1 -1
  378. package/dist/shims/font-google.d.ts.map +1 -1
  379. package/dist/shims/font-google.js +42 -0
  380. package/dist/shims/font-google.js.map +1 -0
  381. package/dist/shims/font-local.d.ts +26 -0
  382. package/dist/shims/font-local.d.ts.map +1 -0
  383. package/dist/shims/font-local.js +20 -0
  384. package/dist/shims/font-local.js.map +1 -0
  385. package/dist/shims/headers.d.ts +2 -1
  386. package/dist/shims/headers.d.ts.map +1 -1
  387. package/dist/shims/navigation-client.d.ts +1 -1
  388. package/dist/shims/navigation-client.d.ts.map +1 -1
  389. package/dist/shims/navigation.d.ts +3 -2
  390. package/dist/shims/navigation.d.ts.map +1 -1
  391. package/dist/utils/directive-parser.d.ts +5 -2
  392. package/dist/utils/directive-parser.d.ts.map +1 -1
  393. package/dist/utils/state-machine.d.ts +80 -0
  394. package/dist/utils/state-machine.d.ts.map +1 -0
  395. package/package.json +51 -16
  396. package/src/adapters/cloudflare-dev.ts +177 -0
  397. package/src/adapters/cloudflare-kv-cache.ts +142 -0
  398. package/src/adapters/cloudflare.ts +342 -28
  399. package/src/adapters/compress-module.ts +24 -4
  400. package/src/adapters/nitro.ts +52 -8
  401. package/src/adapters/wrangler.d.ts +7 -0
  402. package/src/cache/cache-api.ts +38 -0
  403. package/src/cache/handler-store.ts +68 -0
  404. package/src/cache/index.ts +81 -18
  405. package/src/cache/singleflight.ts +62 -4
  406. package/src/cache/sizeof.ts +31 -0
  407. package/src/cache/timber-cache.ts +24 -20
  408. package/src/cli.ts +16 -6
  409. package/src/client/browser-dev.ts +128 -1
  410. package/src/client/browser-entry/action-dispatch.ts +116 -0
  411. package/src/client/browser-entry/hmr.ts +81 -0
  412. package/src/client/browser-entry/hydrate.ts +145 -0
  413. package/src/client/browser-entry/index.ts +143 -0
  414. package/src/client/browser-entry/post-hydration.ts +119 -0
  415. package/src/client/browser-entry/router-init.ts +193 -0
  416. package/src/client/browser-entry/rsc-stream.ts +157 -0
  417. package/src/client/browser-entry/scroll.ts +27 -0
  418. package/src/client/error-boundary.tsx +48 -16
  419. package/src/client/error-reconstituter.tsx +65 -0
  420. package/src/client/form.tsx +14 -7
  421. package/src/client/history.ts +26 -4
  422. package/src/client/index.ts +65 -38
  423. package/src/client/internal.ts +57 -0
  424. package/src/client/link-pending-store.ts +111 -0
  425. package/src/client/link.tsx +342 -113
  426. package/src/client/nav-link-store.ts +47 -0
  427. package/src/client/navigation-api-types.ts +112 -0
  428. package/src/client/navigation-api.ts +332 -0
  429. package/src/client/navigation-context.ts +31 -6
  430. package/src/client/navigation-root.tsx +342 -0
  431. package/src/client/nuqs-adapter.tsx +16 -3
  432. package/src/client/router-ref.ts +1 -1
  433. package/src/client/router.ts +299 -72
  434. package/src/client/rsc-fetch.ts +97 -8
  435. package/src/client/segment-cache.ts +1 -1
  436. package/src/client/segment-outlet.tsx +86 -0
  437. package/src/client/ssr-data.ts +13 -5
  438. package/src/client/stale-reload.ts +72 -3
  439. package/src/client/top-loader.tsx +18 -6
  440. package/src/client/use-link-status.ts +7 -7
  441. package/src/client/use-params.ts +7 -5
  442. package/src/client/{use-navigation-pending.ts → use-pending-navigation.ts} +6 -6
  443. package/src/client/use-query-states.ts +9 -3
  444. package/src/client/use-router.ts +1 -1
  445. package/src/codec.ts +49 -0
  446. package/src/config-types.ts +264 -0
  447. package/src/config-validation.ts +303 -0
  448. package/src/content/index.ts +5 -13
  449. package/src/cookies/define-cookie.ts +78 -25
  450. package/src/cookies/index.ts +8 -0
  451. package/src/fonts/bundle.ts +142 -0
  452. package/src/fonts/css.ts +2 -1
  453. package/src/fonts/dev-middleware.ts +74 -0
  454. package/src/fonts/pipeline.ts +275 -0
  455. package/src/fonts/transform.ts +353 -0
  456. package/src/fonts/types.ts +50 -1
  457. package/src/fonts/virtual-modules.ts +159 -0
  458. package/src/index.ts +314 -355
  459. package/src/plugin-context.ts +240 -0
  460. package/src/plugins/adapter-build.ts +9 -3
  461. package/src/plugins/build-manifest.ts +13 -2
  462. package/src/plugins/build-report.ts +3 -3
  463. package/src/plugins/client-chunks.ts +65 -0
  464. package/src/plugins/content.ts +1 -1
  465. package/src/plugins/dev-404-page.ts +418 -0
  466. package/src/plugins/dev-browser-logs.ts +288 -0
  467. package/src/plugins/dev-error-overlay.ts +286 -42
  468. package/src/plugins/dev-error-page.ts +536 -0
  469. package/src/plugins/dev-logs.ts +1 -1
  470. package/src/plugins/dev-server.ts +146 -19
  471. package/src/plugins/dev-terminal-error.ts +217 -0
  472. package/src/plugins/entries.ts +111 -10
  473. package/src/plugins/fonts.ts +133 -638
  474. package/src/plugins/mdx.ts +1 -1
  475. package/src/plugins/routing.ts +213 -31
  476. package/src/plugins/server-action-exports.ts +1 -1
  477. package/src/plugins/server-bundle.ts +32 -1
  478. package/src/plugins/shims.ts +136 -35
  479. package/src/plugins/static-build.ts +17 -11
  480. package/src/routing/codegen.ts +273 -105
  481. package/src/routing/convention-lint.ts +356 -0
  482. package/src/routing/index.ts +2 -0
  483. package/src/routing/scanner.ts +93 -23
  484. package/src/routing/segment-classify.ts +89 -0
  485. package/src/routing/status-file-lint.ts +3 -2
  486. package/src/routing/types.ts +17 -4
  487. package/src/rsc-runtime/rsc.ts +2 -0
  488. package/src/rsc-runtime/ssr.ts +50 -0
  489. package/src/rsc-runtime/vendor-types.d.ts +7 -0
  490. package/src/{search-params/codecs.ts → schema-bridge.ts} +57 -20
  491. package/src/search-params/define.ts +482 -0
  492. package/src/search-params/index.ts +14 -20
  493. package/src/search-params/registry.ts +2 -2
  494. package/src/search-params/wrappers.ts +85 -0
  495. package/src/segment-params/define.ts +279 -0
  496. package/src/segment-params/index.ts +9 -0
  497. package/src/server/access-gate.tsx +70 -29
  498. package/src/server/action-client.ts +88 -15
  499. package/src/server/action-encryption.ts +144 -0
  500. package/src/server/action-handler.ts +53 -6
  501. package/src/server/actions.ts +10 -9
  502. package/src/server/als-registry.ts +34 -6
  503. package/src/server/build-manifest.ts +10 -4
  504. package/src/server/compress.ts +25 -7
  505. package/src/server/debug.ts +1 -1
  506. package/src/server/default-logger.ts +99 -0
  507. package/src/server/deny-page-resolver.ts +154 -0
  508. package/src/server/deny-renderer.ts +24 -38
  509. package/src/server/dev-holding-server.ts +185 -0
  510. package/src/server/dev-source-map.ts +31 -0
  511. package/src/server/dev-warnings.ts +4 -49
  512. package/src/server/early-hints.ts +36 -15
  513. package/src/server/error-boundary-wrapper.ts +74 -22
  514. package/src/server/fallback-error.ts +74 -102
  515. package/src/server/flight-injection-state.ts +113 -0
  516. package/src/server/flight-scripts.ts +62 -0
  517. package/src/server/flush.ts +2 -1
  518. package/src/server/form-data.ts +76 -0
  519. package/src/server/html-injectors.ts +280 -120
  520. package/src/server/index.ts +25 -177
  521. package/src/server/internal.ts +169 -0
  522. package/src/server/logger.ts +44 -36
  523. package/src/server/middleware-runner.ts +31 -4
  524. package/src/server/node-stream-transforms.ts +509 -0
  525. package/src/server/page-deny-boundary.tsx +56 -0
  526. package/src/server/pipeline-interception.ts +17 -16
  527. package/src/server/pipeline-metadata.ts +13 -0
  528. package/src/server/pipeline.ts +261 -66
  529. package/src/server/primitives.ts +111 -28
  530. package/src/server/render-timeout.ts +108 -0
  531. package/src/server/request-context.ts +293 -132
  532. package/src/server/route-element-builder.ts +283 -191
  533. package/src/server/route-handler.ts +24 -4
  534. package/src/server/route-matcher.ts +31 -20
  535. package/src/server/rsc-entry/api-handler.ts +15 -16
  536. package/src/server/rsc-entry/error-renderer.ts +305 -89
  537. package/src/server/rsc-entry/helpers.ts +134 -5
  538. package/src/server/rsc-entry/index.ts +304 -111
  539. package/src/server/rsc-entry/rsc-payload.ts +65 -18
  540. package/src/server/rsc-entry/rsc-stream.ts +81 -13
  541. package/src/server/rsc-entry/ssr-bridge.ts +14 -5
  542. package/src/server/rsc-entry/ssr-renderer.ts +171 -38
  543. package/src/server/safe-load.ts +60 -0
  544. package/src/server/sensitive-fields.ts +230 -0
  545. package/src/server/sitemap-generator.ts +338 -0
  546. package/src/server/sitemap-handler.ts +126 -0
  547. package/src/server/slot-resolver.ts +244 -229
  548. package/src/server/ssr-entry.ts +215 -32
  549. package/src/server/ssr-render.ts +289 -67
  550. package/src/server/ssr-wrappers.tsx +139 -0
  551. package/src/server/status-code-resolver.ts +1 -1
  552. package/src/server/stream-utils.ts +213 -0
  553. package/src/server/tracing.ts +20 -9
  554. package/src/server/tree-builder.ts +92 -58
  555. package/src/server/types.ts +3 -6
  556. package/src/server/version-skew.ts +104 -0
  557. package/src/shared/merge-search-params.ts +55 -0
  558. package/src/shims/font-google.ts +1 -1
  559. package/src/shims/font-local.ts +34 -0
  560. package/src/shims/headers.ts +5 -1
  561. package/src/shims/navigation-client.ts +1 -1
  562. package/src/shims/navigation.ts +7 -2
  563. package/src/utils/directive-parser.ts +5 -2
  564. package/src/utils/state-machine.ts +111 -0
  565. package/dist/_chunks/als-registry-B7DbZ2hS.js.map +0 -1
  566. package/dist/_chunks/debug-gwlJkDuf.js.map +0 -1
  567. package/dist/_chunks/format-DviM89f0.js.map +0 -1
  568. package/dist/_chunks/interception-BOoWmLUA.js.map +0 -1
  569. package/dist/_chunks/request-context-DIkVh_jG.js +0 -330
  570. package/dist/_chunks/request-context-DIkVh_jG.js.map +0 -1
  571. package/dist/_chunks/tracing-CemImE6h.js.map +0 -1
  572. package/dist/_chunks/use-cookie-DX-l1_5E.js +0 -91
  573. package/dist/_chunks/use-cookie-DX-l1_5E.js.map +0 -1
  574. package/dist/_chunks/use-query-states-D5KaffOK.js.map +0 -1
  575. package/dist/cache/register-cached-function.d.ts +0 -17
  576. package/dist/cache/register-cached-function.d.ts.map +0 -1
  577. package/dist/client/browser-entry.d.ts +0 -21
  578. package/dist/client/browser-entry.d.ts.map +0 -1
  579. package/dist/client/link-status-provider.d.ts +0 -11
  580. package/dist/client/link-status-provider.d.ts.map +0 -1
  581. package/dist/client/transition-root.d.ts.map +0 -1
  582. package/dist/client/use-navigation-pending.d.ts.map +0 -1
  583. package/dist/cookies/index.js.map +0 -1
  584. package/dist/plugins/cache-transform.d.ts +0 -36
  585. package/dist/plugins/cache-transform.d.ts.map +0 -1
  586. package/dist/plugins/dynamic-transform.d.ts +0 -72
  587. package/dist/plugins/dynamic-transform.d.ts.map +0 -1
  588. package/dist/search-params/analyze.d.ts +0 -54
  589. package/dist/search-params/analyze.d.ts.map +0 -1
  590. package/dist/search-params/builtin-codecs.d.ts +0 -105
  591. package/dist/search-params/builtin-codecs.d.ts.map +0 -1
  592. package/dist/search-params/codecs.d.ts +0 -53
  593. package/dist/search-params/codecs.d.ts.map +0 -1
  594. package/dist/search-params/create.d.ts +0 -106
  595. package/dist/search-params/create.d.ts.map +0 -1
  596. package/dist/server/prerender.d.ts +0 -77
  597. package/dist/server/prerender.d.ts.map +0 -1
  598. package/dist/server/response-cache.d.ts +0 -54
  599. package/dist/server/response-cache.d.ts.map +0 -1
  600. package/src/cache/register-cached-function.ts +0 -103
  601. package/src/client/browser-entry.ts +0 -678
  602. package/src/client/link-status-provider.tsx +0 -30
  603. package/src/client/transition-root.tsx +0 -166
  604. package/src/plugins/cache-transform.ts +0 -199
  605. package/src/plugins/dynamic-transform.ts +0 -161
  606. package/src/search-params/analyze.ts +0 -192
  607. package/src/search-params/builtin-codecs.ts +0 -228
  608. package/src/search-params/create.ts +0 -321
  609. package/src/server/prerender.ts +0 -139
  610. package/src/server/response-cache.ts +0 -410
@@ -0,0 +1,418 @@
1
+ /**
2
+ * Dev 404 page — self-contained HTML page for dev-mode route misses.
3
+ *
4
+ * When no route matches and the user has no 404.tsx, this page shows:
5
+ * - The requested path
6
+ * - All registered routes in the app
7
+ * - "Did you mean?" suggestions based on string similarity
8
+ * - Setup instructions for new projects with no routes
9
+ *
10
+ * Dev-only: this module is only imported in dev mode. It is never
11
+ * included in production builds.
12
+ *
13
+ * Design doc: 21-dev-server.md, 07-routing.md
14
+ */
15
+
16
+ // ─── Types ──────────────────────────────────────────────────────────────────
17
+
18
+ interface RouteInfo {
19
+ /** URL path pattern (e.g., "/dashboard/[id]") */
20
+ path: string;
21
+ /** Whether this is a page route or API route handler */
22
+ type: 'page' | 'route';
23
+ }
24
+
25
+ /** Minimal segment node shape — matches ManifestSegmentNode. */
26
+ interface SegmentNode {
27
+ segmentName: string;
28
+ segmentType: string;
29
+ urlPath: string;
30
+ page?: { filePath: string };
31
+ route?: { filePath: string };
32
+ children: SegmentNode[];
33
+ slots: Record<string, SegmentNode> | Map<string, SegmentNode>;
34
+ }
35
+
36
+ // ─── Route Collection ───────────────────────────────────────────────────────
37
+
38
+ /**
39
+ * Collect all routable paths from the manifest tree.
40
+ *
41
+ * Walks the segment tree and collects paths for segments that have
42
+ * a page or route handler.
43
+ */
44
+ export function collectRoutes(root: SegmentNode): RouteInfo[] {
45
+ const routes: RouteInfo[] = [];
46
+ walkRoutes(root, routes);
47
+ return routes.sort((a, b) => a.path.localeCompare(b.path));
48
+ }
49
+
50
+ function walkRoutes(node: SegmentNode, routes: RouteInfo[]): void {
51
+ if (node.page) {
52
+ routes.push({ path: node.urlPath || '/', type: 'page' });
53
+ }
54
+ if (node.route) {
55
+ routes.push({ path: node.urlPath || '/', type: 'route' });
56
+ }
57
+
58
+ for (const child of node.children) {
59
+ walkRoutes(child, routes);
60
+ }
61
+
62
+ // Handle both Map and plain object for slots
63
+ const slots = node.slots;
64
+ if (slots instanceof Map) {
65
+ for (const [, slotNode] of slots) {
66
+ walkRoutes(slotNode, routes);
67
+ }
68
+ } else if (slots && typeof slots === 'object') {
69
+ for (const key of Object.keys(slots)) {
70
+ walkRoutes((slots as Record<string, SegmentNode>)[key]!, routes);
71
+ }
72
+ }
73
+ }
74
+
75
+ // ─── String Similarity ──────────────────────────────────────────────────────
76
+
77
+ /**
78
+ * Compute Levenshtein distance between two strings.
79
+ *
80
+ * Used for "did you mean?" suggestions. Simple O(n*m) implementation
81
+ * — fine for short URL paths.
82
+ */
83
+ function levenshtein(a: string, b: string): number {
84
+ const m = a.length;
85
+ const n = b.length;
86
+
87
+ // Optimization: use single-row DP
88
+ const row = Array.from({ length: n + 1 }, (_, i) => i);
89
+
90
+ for (let i = 1; i <= m; i++) {
91
+ let prev = i;
92
+ for (let j = 1; j <= n; j++) {
93
+ const cost = a[i - 1] === b[j - 1] ? 0 : 1;
94
+ const val = Math.min(
95
+ row[j]! + 1, // deletion
96
+ prev + 1, // insertion
97
+ row[j - 1]! + cost // substitution
98
+ );
99
+ row[j - 1] = prev;
100
+ prev = val;
101
+ }
102
+ row[n] = prev;
103
+ }
104
+
105
+ return row[n]!;
106
+ }
107
+
108
+ /**
109
+ * Find routes similar to the requested path.
110
+ *
111
+ * Returns up to 3 suggestions, sorted by similarity.
112
+ * Only includes routes with distance ≤ 40% of the longer string.
113
+ */
114
+ export function findSimilarRoutes(requestedPath: string, routes: RouteInfo[]): RouteInfo[] {
115
+ if (routes.length === 0) return [];
116
+
117
+ const scored = routes
118
+ .map((route) => ({
119
+ route,
120
+ distance: levenshtein(requestedPath.toLowerCase(), route.path.toLowerCase()),
121
+ }))
122
+ .filter((s) => {
123
+ const maxLen = Math.max(requestedPath.length, s.route.path.length);
124
+ return s.distance <= maxLen * 0.4;
125
+ })
126
+ .sort((a, b) => a.distance - b.distance);
127
+
128
+ return scored.slice(0, 3).map((s) => s.route);
129
+ }
130
+
131
+ // ─── HTML Escaping ──────────────────────────────────────────────────────────
132
+
133
+ function esc(str: string): string {
134
+ return str
135
+ .replace(/&/g, '&amp;')
136
+ .replace(/</g, '&lt;')
137
+ .replace(/>/g, '&gt;')
138
+ .replace(/"/g, '&quot;');
139
+ }
140
+
141
+ // ─── HTML Generation ────────────────────────────────────────────────────────
142
+
143
+ /**
144
+ * Generate a dev-mode 404 page with route listing and suggestions.
145
+ *
146
+ * Returns an HTML string for a self-contained error page.
147
+ */
148
+ export function generateDev404Page(requestedPath: string, routes: RouteInfo[]): string {
149
+ const suggestions = findSimilarRoutes(requestedPath, routes);
150
+ const isEmpty = routes.length === 0;
151
+
152
+ return `<!DOCTYPE html>
153
+ <html lang="en">
154
+ <head>
155
+ <meta charset="utf-8">
156
+ <meta name="viewport" content="width=device-width, initial-scale=1">
157
+ <title>404 — ${esc(requestedPath)} | timber.js</title>
158
+ <style>${CSS}</style>
159
+ </head>
160
+ <body>
161
+ <div class="container">
162
+ <header class="header">
163
+ <div class="badge">404 Not Found</div>
164
+ <h1 class="message">No route matches <code>${esc(requestedPath)}</code></h1>
165
+ </header>
166
+
167
+ ${
168
+ isEmpty
169
+ ? `<div class="welcome">
170
+ <h2>Welcome to timber.js</h2>
171
+ <p>Your app has no pages yet. Create your first page to get started:</p>
172
+ <div class="code-block">
173
+ <div class="code-header">app/page.tsx</div>
174
+ <pre><code>export default function Home() {
175
+ return &lt;h1&gt;Hello, timber.js!&lt;/h1&gt;;
176
+ }</code></pre>
177
+ </div>
178
+ <p class="hint">Save the file and this page will reload automatically.</p>
179
+ </div>`
180
+ : ''
181
+ }
182
+
183
+ ${
184
+ suggestions.length > 0
185
+ ? `<div class="section">
186
+ <div class="section-header">Did you mean?</div>
187
+ <ul class="route-list suggestions">
188
+ ${suggestions.map((r) => `<li><a href="${esc(r.path)}">${esc(r.path)}</a> <span class="route-type">${r.type}</span></li>`).join('\n ')}
189
+ </ul>
190
+ </div>`
191
+ : ''
192
+ }
193
+
194
+ ${
195
+ routes.length > 0
196
+ ? `<div class="section">
197
+ <div class="section-header">Available Routes (${routes.length})</div>
198
+ <ul class="route-list">
199
+ ${routes.map((r) => `<li><a href="${esc(r.path)}">${esc(r.path)}</a> <span class="route-type">${r.type}</span></li>`).join('\n ')}
200
+ </ul>
201
+ </div>`
202
+ : ''
203
+ }
204
+
205
+ <footer class="footer">
206
+ <span class="timber-logo">🪵 timber.js</span>
207
+ <span class="footer-hint">Add or edit routes and this page will reload automatically.</span>
208
+ </footer>
209
+ </div>
210
+
211
+ <script>
212
+ // Auto-reload when Vite HMR fires (route added, file changed, etc.)
213
+ (function() {
214
+ try {
215
+ const ws = new WebSocket('ws://' + location.host, 'vite-hmr');
216
+ ws.addEventListener('message', function(e) {
217
+ try {
218
+ const data = JSON.parse(e.data);
219
+ if (data.type === 'full-reload' || data.type === 'update') {
220
+ location.reload();
221
+ }
222
+ } catch {}
223
+ });
224
+ } catch {}
225
+ })();
226
+ </script>
227
+ </body>
228
+ </html>`;
229
+ }
230
+
231
+ // ─── CSS ────────────────────────────────────────────────────────────────────
232
+
233
+ const CSS = `
234
+ :root {
235
+ --bg: #fff;
236
+ --fg: #1a1a1a;
237
+ --fg-dim: #6b7280;
238
+ --border: #e5e7eb;
239
+ --badge-bg: #fefce8;
240
+ --badge-fg: #854d0e;
241
+ --badge-border: #fde68a;
242
+ --source-bg: #fafafa;
243
+ --link: #2563eb;
244
+ --code-bg: #f3f4f6;
245
+ --btn-bg: #f3f4f6;
246
+ --route-type-bg: #e0f2fe;
247
+ --route-type-fg: #0369a1;
248
+ --code-font: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, 'Liberation Mono', monospace;
249
+ }
250
+
251
+ @media (prefers-color-scheme: dark) {
252
+ :root {
253
+ --bg: #0a0a0a;
254
+ --fg: #f5f5f5;
255
+ --fg-dim: #9ca3af;
256
+ --border: #27272a;
257
+ --badge-bg: #422006;
258
+ --badge-fg: #fde68a;
259
+ --badge-border: #854d0e;
260
+ --source-bg: #18181b;
261
+ --link: #60a5fa;
262
+ --code-bg: #27272a;
263
+ --btn-bg: #27272a;
264
+ --route-type-bg: #0c4a6e;
265
+ --route-type-fg: #bae6fd;
266
+ }
267
+ }
268
+
269
+ * { margin: 0; padding: 0; box-sizing: border-box; }
270
+
271
+ body {
272
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
273
+ background: var(--bg);
274
+ color: var(--fg);
275
+ line-height: 1.6;
276
+ padding: 2rem;
277
+ }
278
+
279
+ .container { max-width: 56rem; margin: 0 auto; }
280
+ .header { margin-bottom: 1.5rem; }
281
+
282
+ .badge {
283
+ display: inline-block;
284
+ font-size: 0.75rem;
285
+ font-weight: 600;
286
+ text-transform: uppercase;
287
+ letter-spacing: 0.05em;
288
+ padding: 0.25rem 0.625rem;
289
+ border-radius: 0.375rem;
290
+ background: var(--badge-bg);
291
+ color: var(--badge-fg);
292
+ border: 1px solid var(--badge-border);
293
+ margin-bottom: 0.75rem;
294
+ }
295
+
296
+ .message {
297
+ font-size: 1.375rem;
298
+ font-weight: 600;
299
+ line-height: 1.3;
300
+ }
301
+
302
+ .message code {
303
+ font-family: var(--code-font);
304
+ background: var(--code-bg);
305
+ padding: 0.125rem 0.375rem;
306
+ border-radius: 0.25rem;
307
+ font-size: 1.125rem;
308
+ }
309
+
310
+ .welcome {
311
+ margin-bottom: 1.5rem;
312
+ padding: 1.5rem;
313
+ border: 1px solid var(--border);
314
+ border-radius: 0.5rem;
315
+ background: var(--source-bg);
316
+ }
317
+
318
+ .welcome h2 {
319
+ font-size: 1.125rem;
320
+ margin-bottom: 0.5rem;
321
+ }
322
+
323
+ .welcome p { color: var(--fg-dim); margin-bottom: 1rem; }
324
+
325
+ .code-block {
326
+ border: 1px solid var(--border);
327
+ border-radius: 0.5rem;
328
+ overflow: hidden;
329
+ margin-bottom: 1rem;
330
+ }
331
+
332
+ .code-header {
333
+ font-size: 0.75rem;
334
+ font-weight: 600;
335
+ padding: 0.5rem 0.75rem;
336
+ background: var(--code-bg);
337
+ border-bottom: 1px solid var(--border);
338
+ color: var(--fg-dim);
339
+ font-family: var(--code-font);
340
+ }
341
+
342
+ .code-block pre {
343
+ padding: 0.75rem;
344
+ font-family: var(--code-font);
345
+ font-size: 0.8125rem;
346
+ line-height: 1.7;
347
+ overflow-x: auto;
348
+ margin: 0;
349
+ }
350
+
351
+ .section {
352
+ margin-bottom: 1rem;
353
+ border: 1px solid var(--border);
354
+ border-radius: 0.5rem;
355
+ overflow: hidden;
356
+ }
357
+
358
+ .section-header {
359
+ font-size: 0.75rem;
360
+ font-weight: 600;
361
+ text-transform: uppercase;
362
+ letter-spacing: 0.05em;
363
+ padding: 0.5rem 0.75rem;
364
+ background: var(--source-bg);
365
+ border-bottom: 1px solid var(--border);
366
+ color: var(--fg-dim);
367
+ }
368
+
369
+ .route-list {
370
+ list-style: none;
371
+ padding: 0.5rem 0;
372
+ }
373
+
374
+ .route-list li {
375
+ padding: 0.375rem 0.75rem;
376
+ font-family: var(--code-font);
377
+ font-size: 0.8125rem;
378
+ display: flex;
379
+ align-items: center;
380
+ gap: 0.5rem;
381
+ }
382
+
383
+ .route-list li:hover { background: var(--source-bg); }
384
+
385
+ .route-list a {
386
+ color: var(--link);
387
+ text-decoration: none;
388
+ }
389
+
390
+ .route-list a:hover { text-decoration: underline; }
391
+
392
+ .route-type {
393
+ font-size: 0.625rem;
394
+ font-weight: 600;
395
+ text-transform: uppercase;
396
+ letter-spacing: 0.05em;
397
+ padding: 0.125rem 0.375rem;
398
+ border-radius: 0.25rem;
399
+ background: var(--route-type-bg);
400
+ color: var(--route-type-fg);
401
+ }
402
+
403
+ .suggestions { background: var(--source-bg); }
404
+
405
+ .hint { font-size: 0.875rem; color: var(--fg-dim); }
406
+
407
+ .footer {
408
+ display: flex;
409
+ align-items: center;
410
+ gap: 0.75rem;
411
+ padding-top: 1rem;
412
+ border-top: 1px solid var(--border);
413
+ font-size: 0.75rem;
414
+ color: var(--fg-dim);
415
+ }
416
+
417
+ .timber-logo { font-weight: 600; white-space: nowrap; }
418
+ `;
@@ -0,0 +1,288 @@
1
+ /**
2
+ * timber-dev-browser-logs — Forwards browser console output to the server terminal.
3
+ *
4
+ * Injects a small inline script in dev mode that intercepts browser
5
+ * `console.error`, `console.warn`, and `console.info`, then forwards
6
+ * messages to the server via Vite's HMR WebSocket.
7
+ *
8
+ * The server-side listener formats and prints the messages with color-coded
9
+ * prefixes: [browser:error], [browser:warn], [browser:info].
10
+ *
11
+ * Dev-only: this plugin only runs during `vite dev`.
12
+ * No runtime overhead in production.
13
+ *
14
+ * See TIM-513 for design context.
15
+ * See design/18-build-system.md §"Dev Server" for sub-plugin architecture.
16
+ */
17
+
18
+ import type { Plugin, ViteDevServer } from 'vite';
19
+ import type { PluginContext } from '../plugin-context.js';
20
+
21
+ // ─── Types ───────────────────────────────────────────────────────────────
22
+
23
+ /** Log levels forwarded from the browser. */
24
+ export type BrowserLogLevel = 'error' | 'warn' | 'info';
25
+
26
+ /** Configuration value for devBrowserLogs in timber.config.ts. */
27
+ export type DevBrowserLogsConfig = BrowserLogLevel | 'none' | undefined;
28
+
29
+ /**
30
+ * Payload sent from browser to server via Vite's HMR WebSocket.
31
+ * Kept small — truncated before sending.
32
+ */
33
+ export interface BrowserLogPayload {
34
+ level: BrowserLogLevel;
35
+ /** Serialized message string. */
36
+ message: string;
37
+ /** Error stack trace, if the first argument was an Error. */
38
+ stack: string | null;
39
+ /** Source URL and line number, if available. */
40
+ source: string | null;
41
+ /** Timestamp in ms (Date.now()) from the browser. */
42
+ timestamp: number;
43
+ }
44
+
45
+ // ─── Constants ───────────────────────────────────────────────────────────
46
+
47
+ /** Max message size in bytes before truncation. */
48
+ const MAX_MESSAGE_BYTES = 2048;
49
+
50
+ /** HMR event name for browser→server log forwarding. */
51
+ const HMR_EVENT = 'timber:browser-log';
52
+
53
+ /** ANSI color codes for terminal output. */
54
+ const COLORS = {
55
+ red: '\x1b[31m',
56
+ yellow: '\x1b[33m',
57
+ blue: '\x1b[34m',
58
+ dim: '\x1b[2m',
59
+ reset: '\x1b[0m',
60
+ } as const;
61
+
62
+ /** Level severity ordering for threshold comparison. */
63
+ const LEVEL_SEVERITY: Record<BrowserLogLevel | 'none', number> = {
64
+ none: 0,
65
+ info: 1,
66
+ warn: 2,
67
+ error: 3,
68
+ };
69
+
70
+ // ─── Formatting ──────────────────────────────────────────────────────────
71
+
72
+ /**
73
+ * Format a browser log payload for server terminal output.
74
+ *
75
+ * Produces color-coded output like:
76
+ * [browser:error] Uncaught TypeError: x is not a function
77
+ * at App (app.tsx:10:5)
78
+ * [browser:warn] Deprecation warning (app/page.tsx:42:12)
79
+ */
80
+ export function formatBrowserLog(payload: BrowserLogPayload): string {
81
+ const { level, message, stack, source } = payload;
82
+
83
+ // Color-coded prefix
84
+ const color = level === 'error' ? COLORS.red : level === 'warn' ? COLORS.yellow : COLORS.blue;
85
+ const prefix = `${color}[browser:${level}]${COLORS.reset}`;
86
+
87
+ // Source suffix
88
+ const sourceSuffix = source ? ` ${COLORS.dim}(${source})${COLORS.reset}` : '';
89
+
90
+ let output = `${prefix} ${message}${sourceSuffix}`;
91
+
92
+ // Append stack trace indented
93
+ if (stack) {
94
+ const indented = stack
95
+ .split('\n')
96
+ .map((line) => ` ${COLORS.dim}${line}${COLORS.reset}`)
97
+ .join('\n');
98
+ output += `\n${indented}`;
99
+ }
100
+
101
+ return output;
102
+ }
103
+
104
+ // ─── Level Filtering ─────────────────────────────────────────────────────
105
+
106
+ /**
107
+ * Check if a log at `level` should be forwarded given the configured threshold.
108
+ *
109
+ * The threshold acts as a minimum severity:
110
+ * - 'error' → only errors
111
+ * - 'warn' → errors + warnings
112
+ * - 'info' → errors + warnings + info
113
+ * - 'none' → nothing
114
+ */
115
+ export function shouldForwardLevel(
116
+ level: BrowserLogLevel,
117
+ threshold: BrowserLogLevel | 'none'
118
+ ): boolean {
119
+ if (threshold === 'none') return false;
120
+ return LEVEL_SEVERITY[level] >= LEVEL_SEVERITY[threshold];
121
+ }
122
+
123
+ // ─── Truncation ──────────────────────────────────────────────────────────
124
+
125
+ /**
126
+ * Truncate a message to `maxBytes` to avoid flooding the terminal.
127
+ * Appends a suffix indicating how many bytes were dropped.
128
+ */
129
+ export function truncateMessage(message: string, maxBytes: number): string {
130
+ if (message.length <= maxBytes) return message;
131
+
132
+ const truncated = message.slice(0, maxBytes);
133
+ const droppedBytes = message.length - maxBytes;
134
+ return `${truncated}… [truncated ${droppedBytes} bytes]`;
135
+ }
136
+
137
+ // ─── Client Injection Script ─────────────────────────────────────────────
138
+
139
+ /**
140
+ * Generate the inline script injected into the browser in dev mode.
141
+ *
142
+ * This script:
143
+ * 1. Saves references to the original console methods
144
+ * 2. Wraps `console.error`, `console.warn`, `console.info`
145
+ * 3. Calls the original first (browser devtools still work)
146
+ * 4. Serializes and forwards via `import.meta.hot.send()`
147
+ * 5. Truncates messages to MAX_MESSAGE_BYTES
148
+ *
149
+ * The script is minimal and self-contained — no imports, no dependencies.
150
+ */
151
+ export function generateClientScript(threshold: BrowserLogLevel | 'none'): string {
152
+ if (threshold === 'none') return '';
153
+
154
+ // Only intercept levels that meet the threshold
155
+ const levels: BrowserLogLevel[] = ['error', 'warn', 'info'].filter((l) =>
156
+ shouldForwardLevel(l as BrowserLogLevel, threshold)
157
+ ) as BrowserLogLevel[];
158
+
159
+ if (levels.length === 0) return '';
160
+
161
+ return `
162
+ (function() {
163
+ if (!import.meta.hot) return;
164
+ var MAX_BYTES = ${MAX_MESSAGE_BYTES};
165
+ var levels = ${JSON.stringify(levels)};
166
+ var originals = {};
167
+
168
+ function serialize(arg) {
169
+ if (arg === null) return 'null';
170
+ if (arg === undefined) return 'undefined';
171
+ if (arg instanceof Error) return arg.stack || arg.message || String(arg);
172
+ if (typeof arg === 'object') {
173
+ try { return JSON.stringify(arg); } catch(e) { return String(arg); }
174
+ }
175
+ return String(arg);
176
+ }
177
+
178
+ function truncate(s) {
179
+ if (s.length <= MAX_BYTES) return s;
180
+ return s.slice(0, MAX_BYTES) + '... [truncated ' + (s.length - MAX_BYTES) + ' bytes]';
181
+ }
182
+
183
+ levels.forEach(function(level) {
184
+ originals[level] = console[level];
185
+ console[level] = function() {
186
+ originals[level].apply(console, arguments);
187
+ try {
188
+ var args = Array.prototype.slice.call(arguments);
189
+ var firstArg = args[0];
190
+ var stack = null;
191
+ var source = null;
192
+
193
+ if (firstArg instanceof Error) {
194
+ stack = firstArg.stack || null;
195
+ source = null;
196
+ }
197
+
198
+ var message = args.map(serialize).join(' ');
199
+ message = truncate(message);
200
+
201
+ import.meta.hot.send('${HMR_EVENT}', {
202
+ level: level,
203
+ message: message,
204
+ stack: stack,
205
+ source: source,
206
+ timestamp: Date.now()
207
+ });
208
+ } catch(e) {
209
+ // Never let log forwarding break the page
210
+ }
211
+ };
212
+ });
213
+ })();
214
+ `.trim();
215
+ }
216
+
217
+ // ─── Plugin ──────────────────────────────────────────────────────────────
218
+
219
+ /**
220
+ * Create the timber-dev-browser-logs Vite plugin.
221
+ *
222
+ * - `configureServer`: Listens for HMR messages and prints them to the terminal
223
+ * - `transformIndexHtml`: Injects the client-side interception script
224
+ *
225
+ * Only active during `vite dev` (apply: 'serve').
226
+ */
227
+ export function timberDevBrowserLogs(ctx: PluginContext): Plugin {
228
+ return {
229
+ name: 'timber-dev-browser-logs',
230
+ apply: 'serve',
231
+
232
+ configureServer(server: ViteDevServer) {
233
+ const threshold = ctx.config.devBrowserLogs ?? 'warn';
234
+ if (threshold === 'none') {
235
+ // Clear any stale script from a prior server instance (e.g. HMR reconfigure)
236
+ delete (globalThis as Record<string, unknown>).__timber_dev_browser_log_script;
237
+ return;
238
+ }
239
+
240
+ // Register the client injection script on globalThis so the RSC entry
241
+ // can include it in headHtml for all Timber route responses.
242
+ // transformIndexHtml only runs for Vite's index.html fallback, not
243
+ // for responses served by createTimberMiddleware (TIM-575).
244
+ const script = generateClientScript(threshold);
245
+ if (script) {
246
+ (globalThis as Record<string, unknown>).__timber_dev_browser_log_script =
247
+ `<script type="module">${script}</script>`;
248
+ }
249
+
250
+ // Listen for browser log messages via HMR WebSocket
251
+ server.hot.on(HMR_EVENT, (payload: BrowserLogPayload) => {
252
+ try {
253
+ // Validate level
254
+ if (!shouldForwardLevel(payload.level, threshold)) return;
255
+
256
+ // Truncate server-side too (defense in depth)
257
+ payload.message = truncateMessage(payload.message, MAX_MESSAGE_BYTES);
258
+
259
+ const formatted = formatBrowserLog(payload);
260
+
261
+ // Use the correct console method for the log level
262
+ if (payload.level === 'error') {
263
+ process.stderr.write(formatted + '\n');
264
+ } else {
265
+ process.stdout.write(formatted + '\n');
266
+ }
267
+ } catch {
268
+ // Never let log forwarding crash the server
269
+ }
270
+ });
271
+ },
272
+
273
+ transformIndexHtml() {
274
+ const threshold = ctx.config.devBrowserLogs ?? 'warn';
275
+ const script = generateClientScript(threshold);
276
+ if (!script) return [];
277
+
278
+ return [
279
+ {
280
+ tag: 'script',
281
+ attrs: { type: 'module' },
282
+ children: script,
283
+ injectTo: 'head' as const,
284
+ },
285
+ ];
286
+ },
287
+ };
288
+ }