@timber-js/app 0.2.0-alpha.191 → 0.2.0-alpha.194

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 (672) hide show
  1. package/agent-skill.md +2 -0
  2. package/dist/_chunks/{actions-BjbbNRFN.js → actions-CWYtq6ii.js} +3 -3
  3. package/dist/_chunks/actions-CWYtq6ii.js.map +1 -0
  4. package/dist/_chunks/als-registry-C6kcfprT.js.map +1 -1
  5. package/dist/_chunks/als-slots-BEEIPKYm.js.map +1 -1
  6. package/dist/_chunks/{build-output-helper-C3DrfzZR.js → build-output-helper-9dqCv1pZ.js} +3 -2
  7. package/dist/_chunks/build-output-helper-9dqCv1pZ.js.map +1 -0
  8. package/dist/_chunks/{cache-api-DllJ-Lyw.js → cache-api-CQeYzA5g.js} +6 -8
  9. package/dist/_chunks/cache-api-CQeYzA5g.js.map +1 -0
  10. package/dist/_chunks/chains-h7EO-u3n.js +412 -0
  11. package/dist/_chunks/chains-h7EO-u3n.js.map +1 -0
  12. package/dist/_chunks/{cli-check-DJZDc22E.js → cli-check-BVthpfLS.js} +43 -6
  13. package/dist/_chunks/cli-check-BVthpfLS.js.map +1 -0
  14. package/dist/_chunks/{cli-schema-sync-D4_AZVUb.js → cli-schema-sync-ZwM9u_ob.js} +6 -5
  15. package/dist/_chunks/{cli-schema-sync-D4_AZVUb.js.map → cli-schema-sync-ZwM9u_ob.js.map} +1 -1
  16. package/dist/_chunks/{cloudflare-CGP6BZKO.js → cloudflare-BKJC3SC_.js} +28 -22
  17. package/dist/_chunks/{cloudflare-CGP6BZKO.js.map → cloudflare-BKJC3SC_.js.map} +1 -1
  18. package/dist/_chunks/codec-registry-oOUxugz3.js.map +1 -1
  19. package/dist/_chunks/{convention-lint-CpteIpTm.js → convention-lint-DO10_pVl.js} +93 -7
  20. package/dist/_chunks/convention-lint-DO10_pVl.js.map +1 -0
  21. package/dist/_chunks/dist-DtrJyBbw.js +386 -0
  22. package/dist/_chunks/dist-DtrJyBbw.js.map +1 -0
  23. package/dist/_chunks/error-boundary-D-ODYX41.js.map +1 -1
  24. package/dist/_chunks/{file-cache-DmX7OqZP.js → file-cache-Dw6BJPG7.js} +5 -1
  25. package/dist/_chunks/{file-cache-DmX7OqZP.js.map → file-cache-Dw6BJPG7.js.map} +1 -1
  26. package/dist/_chunks/{format-CfwjgPz9.js → format-BKclgVbk.js} +3 -3
  27. package/dist/_chunks/{format-CfwjgPz9.js.map → format-BKclgVbk.js.map} +1 -1
  28. package/dist/_chunks/graph-cache-CP4GEmf9.js +304 -0
  29. package/dist/_chunks/graph-cache-CP4GEmf9.js.map +1 -0
  30. package/dist/_chunks/href-validation-CMc5JRls.js.map +1 -1
  31. package/dist/_chunks/live-graph-Bx4HodF1.js +150 -0
  32. package/dist/_chunks/live-graph-Bx4HodF1.js.map +1 -0
  33. package/dist/_chunks/{logger-CH7IcMmg.js → logger-pumCm3Il.js} +25 -7
  34. package/dist/_chunks/{logger-CH7IcMmg.js.map → logger-pumCm3Il.js.map} +1 -1
  35. package/dist/_chunks/{mdx-file-C005ay-P.js → mdx-file-CXyHGUpS.js} +3 -3
  36. package/dist/_chunks/mdx-file-CXyHGUpS.js.map +1 -0
  37. package/dist/_chunks/{plugin-context-rCinWLiE.js → plugin-context-8idfR3UZ.js} +2 -2
  38. package/dist/_chunks/plugin-context-8idfR3UZ.js.map +1 -0
  39. package/dist/_chunks/poison-rules-DoEhbqaY.js +110 -0
  40. package/dist/_chunks/poison-rules-DoEhbqaY.js.map +1 -0
  41. package/dist/_chunks/poison-scan-BAxfTT5L.js +101 -0
  42. package/dist/_chunks/poison-scan-BAxfTT5L.js.map +1 -0
  43. package/dist/_chunks/resolve-schema-CBR6Lm4i.js.map +1 -1
  44. package/dist/_chunks/rolldown-runtime-D7D4PA-g.js +13 -0
  45. package/dist/_chunks/router-ref-DuYuV_0Q.js.map +1 -1
  46. package/dist/_chunks/{rsc-media-type-DRqE_lD_.js → rsc-media-type-DDc7duTD.js} +17 -2
  47. package/dist/_chunks/{rsc-media-type-DRqE_lD_.js.map → rsc-media-type-DDc7duTD.js.map} +1 -1
  48. package/dist/_chunks/scan-BoP17W3w.js +140 -0
  49. package/dist/_chunks/scan-BoP17W3w.js.map +1 -0
  50. package/dist/_chunks/{scanner-CAietmj4.js → scanner-BRIOmHE2.js} +43 -4
  51. package/dist/_chunks/scanner-BRIOmHE2.js.map +1 -0
  52. package/dist/_chunks/schema-bridge-C83xa9lT.js.map +1 -1
  53. package/dist/_chunks/segment-classify-C539Pa2O.js.map +1 -1
  54. package/dist/_chunks/{segment-keys-BawYuNFO.js → segment-keys-BhqoHiLc.js} +14 -2
  55. package/dist/_chunks/{segment-keys-BawYuNFO.js.map → segment-keys-BhqoHiLc.js.map} +1 -1
  56. package/dist/_chunks/slot-params-BCTmZkQB.js.map +1 -1
  57. package/dist/_chunks/ssr-data-14MXm7Pj.js.map +1 -1
  58. package/dist/_chunks/use-query-states-I3JMng6J.js.map +1 -1
  59. package/dist/_chunks/use-segment-params-C4r4BD9T.js.map +1 -1
  60. package/dist/_chunks/{walkers-BsVLmD1S.js → walkers-uCu3WW6_.js} +9 -6
  61. package/dist/_chunks/{walkers-BsVLmD1S.js.map → walkers-uCu3WW6_.js.map} +1 -1
  62. package/dist/adapters/build-output-helper.d.ts +1 -1
  63. package/dist/adapters/build-output-helper.d.ts.map +1 -1
  64. package/dist/adapters/cloudflare-dev.d.ts.map +1 -1
  65. package/dist/adapters/cloudflare-dev.js +2 -1
  66. package/dist/adapters/cloudflare-dev.js.map +1 -1
  67. package/dist/adapters/cloudflare-kv-cache.d.ts +1 -1
  68. package/dist/adapters/cloudflare-kv-cache.d.ts.map +1 -1
  69. package/dist/adapters/cloudflare-kv-cache.js +7 -8
  70. package/dist/adapters/cloudflare-kv-cache.js.map +1 -1
  71. package/dist/adapters/cloudflare.d.ts +1 -1
  72. package/dist/adapters/cloudflare.d.ts.map +1 -1
  73. package/dist/adapters/cloudflare.js +1 -1
  74. package/dist/adapters/nitro-presets.d.ts +37 -0
  75. package/dist/adapters/nitro-presets.d.ts.map +1 -0
  76. package/dist/adapters/nitro-preview.d.ts +32 -0
  77. package/dist/adapters/nitro-preview.d.ts.map +1 -0
  78. package/dist/adapters/nitro.d.ts +28 -51
  79. package/dist/adapters/nitro.d.ts.map +1 -1
  80. package/dist/adapters/nitro.js +224 -171
  81. package/dist/adapters/nitro.js.map +1 -1
  82. package/dist/analyze/chains.d.ts +124 -0
  83. package/dist/analyze/chains.d.ts.map +1 -0
  84. package/dist/analyze/classify.d.ts +150 -0
  85. package/dist/analyze/classify.d.ts.map +1 -0
  86. package/dist/analyze/crawl-entry.d.ts +17 -0
  87. package/dist/analyze/crawl-entry.d.ts.map +1 -0
  88. package/dist/analyze/crawl-entry.js +313 -0
  89. package/dist/analyze/crawl-entry.js.map +1 -0
  90. package/dist/analyze/crawl.d.ts +134 -0
  91. package/dist/analyze/crawl.d.ts.map +1 -0
  92. package/dist/analyze/graph-cache.d.ts +104 -0
  93. package/dist/analyze/graph-cache.d.ts.map +1 -0
  94. package/dist/analyze/graph-command.d.ts +43 -0
  95. package/dist/analyze/graph-command.d.ts.map +1 -0
  96. package/dist/analyze/graph-command.js +472 -0
  97. package/dist/analyze/graph-command.js.map +1 -0
  98. package/dist/analyze/live-graph.d.ts +81 -0
  99. package/dist/analyze/live-graph.d.ts.map +1 -0
  100. package/dist/analyze/poison-rules.d.ts +72 -0
  101. package/dist/analyze/poison-rules.d.ts.map +1 -0
  102. package/dist/analyze/poison-scan.d.ts +48 -0
  103. package/dist/analyze/poison-scan.d.ts.map +1 -0
  104. package/dist/analyze/scan.d.ts +73 -0
  105. package/dist/analyze/scan.d.ts.map +1 -0
  106. package/dist/cache/cache-api.d.ts +2 -2
  107. package/dist/cache/cache-api.d.ts.map +1 -1
  108. package/dist/cache/index.d.ts +8 -8
  109. package/dist/cache/index.d.ts.map +1 -1
  110. package/dist/cache/index.js +1 -1
  111. package/dist/cache/redis-handler.d.ts +1 -1
  112. package/dist/cache/redis-handler.d.ts.map +1 -1
  113. package/dist/cache/stores/cloudflare-kv.d.ts +1 -1
  114. package/dist/cache/stores/cloudflare-kv.d.ts.map +1 -1
  115. package/dist/cache/stores/cloudflare-kv.js.map +1 -1
  116. package/dist/cache/stores/memory.d.ts +1 -1
  117. package/dist/cache/stores/memory.d.ts.map +1 -1
  118. package/dist/cache/stores/memory.js.map +1 -1
  119. package/dist/cache/stores/redis.d.ts +1 -1
  120. package/dist/cache/stores/redis.d.ts.map +1 -1
  121. package/dist/cache/stores/redis.js.map +1 -1
  122. package/dist/cache/stores/vercel.d.ts +1 -1
  123. package/dist/cache/stores/vercel.d.ts.map +1 -1
  124. package/dist/cache/stores/vercel.js.map +1 -1
  125. package/dist/cache/tag-aware-handler.d.ts +2 -2
  126. package/dist/cache/tag-aware-handler.d.ts.map +1 -1
  127. package/dist/cache/timber-cache.d.ts +1 -1
  128. package/dist/cache/timber-cache.d.ts.map +1 -1
  129. package/dist/cdn/cloudflare-purge.d.ts +1 -1
  130. package/dist/cdn/cloudflare-purge.d.ts.map +1 -1
  131. package/dist/cdn/cloudflare-purge.js.map +1 -1
  132. package/dist/cdn/fastly-purge.d.ts +1 -1
  133. package/dist/cdn/fastly-purge.d.ts.map +1 -1
  134. package/dist/cdn/fastly-purge.js.map +1 -1
  135. package/dist/cdn/index.d.ts +4 -4
  136. package/dist/cdn/index.d.ts.map +1 -1
  137. package/dist/cdn/workers-cache-purge.d.ts +5 -1
  138. package/dist/cdn/workers-cache-purge.d.ts.map +1 -1
  139. package/dist/cdn/workers-cache-purge.js.map +1 -1
  140. package/dist/cli-check.d.ts +10 -0
  141. package/dist/cli-check.d.ts.map +1 -1
  142. package/dist/cli.d.ts +12 -4
  143. package/dist/cli.d.ts.map +1 -1
  144. package/dist/cli.js +30 -6
  145. package/dist/cli.js.map +1 -1
  146. package/dist/client/browser-entry/hydrate.d.ts +2 -2
  147. package/dist/client/browser-entry/hydrate.d.ts.map +1 -1
  148. package/dist/client/browser-entry/post-hydration.d.ts +2 -2
  149. package/dist/client/browser-entry/router-init.d.ts +2 -2
  150. package/dist/client/browser-entry/rsc-stream.d.ts +1 -1
  151. package/dist/client/form.d.ts +2 -2
  152. package/dist/client/form.d.ts.map +1 -1
  153. package/dist/client/history.d.ts +2 -2
  154. package/dist/client/index.d.ts +18 -18
  155. package/dist/client/index.d.ts.map +1 -1
  156. package/dist/client/index.js.map +1 -1
  157. package/dist/client/internal.d.ts +19 -19
  158. package/dist/client/internal.d.ts.map +1 -1
  159. package/dist/client/internal.js +11 -15
  160. package/dist/client/internal.js.map +1 -1
  161. package/dist/client/link.d.ts +3 -3
  162. package/dist/client/navigation-commit.d.ts +5 -5
  163. package/dist/client/navigation-root.d.ts +1 -1
  164. package/dist/client/navigation-root.d.ts.map +1 -1
  165. package/dist/client/params-context.d.ts +3 -3
  166. package/dist/client/router-pipeline.d.ts +7 -7
  167. package/dist/client/router-ref.d.ts +1 -1
  168. package/dist/client/router-types.d.ts +6 -6
  169. package/dist/client/router-types.d.ts.map +1 -1
  170. package/dist/client/router.d.ts +1 -1
  171. package/dist/client/rsc-fetch.d.ts +4 -4
  172. package/dist/client/rsc-fetch.d.ts.map +1 -1
  173. package/dist/client/segment-cache.d.ts +2 -2
  174. package/dist/client/slot-provider.d.ts +1 -1
  175. package/dist/client/ssr-data.d.ts +2 -2
  176. package/dist/client/state.d.ts +4 -4
  177. package/dist/client/use-query-states.d.ts +1 -1
  178. package/dist/client/use-segment-params.d.ts +3 -3
  179. package/dist/codec.d.ts +2 -2
  180. package/dist/codec.js.map +1 -1
  181. package/dist/config-types.d.ts +24 -6
  182. package/dist/config-types.d.ts.map +1 -1
  183. package/dist/config-validation.d.ts +1 -1
  184. package/dist/cookies/define-cookie.d.ts +3 -3
  185. package/dist/cookies/index.d.ts +3 -3
  186. package/dist/cookies/index.js +3 -4
  187. package/dist/cookies/index.js.map +1 -1
  188. package/dist/cookies/json-cookie.d.ts +1 -1
  189. package/dist/dev-tools/404-page.d.ts +2 -2
  190. package/dist/dev-tools/error-page.d.ts +2 -2
  191. package/dist/dev-tools/index.d.ts +12 -12
  192. package/dist/dev-tools/instrumentation.d.ts +1 -1
  193. package/dist/dev-tools/logs.d.ts +1 -1
  194. package/dist/dev-tools/overlay.d.ts +2 -2
  195. package/dist/dev-tools/terminal.d.ts +1 -1
  196. package/dist/fonts/ast.d.ts +4 -4
  197. package/dist/fonts/bundle.d.ts +3 -3
  198. package/dist/fonts/css.d.ts +1 -1
  199. package/dist/fonts/dev-middleware.d.ts +1 -1
  200. package/dist/fonts/google.d.ts +1 -1
  201. package/dist/fonts/local.d.ts +1 -1
  202. package/dist/fonts/pipeline.d.ts +3 -3
  203. package/dist/fonts/transform.d.ts +2 -2
  204. package/dist/fonts/types.d.ts +1 -1
  205. package/dist/fonts/virtual-modules.d.ts +1 -1
  206. package/dist/index.d.ts +3 -3
  207. package/dist/index.d.ts.map +1 -1
  208. package/dist/index.js +816 -310
  209. package/dist/index.js.map +1 -1
  210. package/dist/params/codec-registry.d.ts +1 -1
  211. package/dist/params/define-schema.d.ts +2 -2
  212. package/dist/params/index.d.ts +4 -4
  213. package/dist/params/index.js.map +1 -1
  214. package/dist/params/resolve-schema.d.ts +1 -1
  215. package/dist/plugin-context.d.ts +9 -9
  216. package/dist/plugin-context.d.ts.map +1 -1
  217. package/dist/plugins/adapter-build.d.ts +2 -2
  218. package/dist/plugins/build-manifest.d.ts +2 -2
  219. package/dist/plugins/build-report.d.ts +5 -5
  220. package/dist/plugins/cache.d.ts +1 -1
  221. package/dist/plugins/callsite-jsx.d.ts +2 -2
  222. package/dist/plugins/chunks.d.ts +1 -1
  223. package/dist/plugins/chunks.d.ts.map +1 -1
  224. package/dist/plugins/cloudflare-wasm.d.ts +1 -1
  225. package/dist/plugins/content.d.ts +1 -1
  226. package/dist/plugins/content.d.ts.map +1 -1
  227. package/dist/plugins/dev-discovery.d.ts +123 -0
  228. package/dist/plugins/dev-discovery.d.ts.map +1 -0
  229. package/dist/plugins/dev-server.d.ts +1 -1
  230. package/dist/plugins/dev-server.d.ts.map +1 -1
  231. package/dist/plugins/entries.d.ts +1 -1
  232. package/dist/plugins/fonts.d.ts +3 -3
  233. package/dist/plugins/fonts.d.ts.map +1 -1
  234. package/dist/plugins/graph-endpoint.d.ts +112 -0
  235. package/dist/plugins/graph-endpoint.d.ts.map +1 -0
  236. package/dist/plugins/mdx.d.ts +18 -5
  237. package/dist/plugins/mdx.d.ts.map +1 -1
  238. package/dist/plugins/prebuilt-capture.d.ts +2 -2
  239. package/dist/plugins/prebuilt-options-analysis.d.ts +1 -1
  240. package/dist/plugins/prebuilt.d.ts +1 -1
  241. package/dist/plugins/prerender-sugar.d.ts +11 -14
  242. package/dist/plugins/prerender-sugar.d.ts.map +1 -1
  243. package/dist/plugins/request-dep/analysis.d.ts +1 -1
  244. package/dist/plugins/request-dep/index.d.ts +5 -5
  245. package/dist/plugins/request-dep/origin.d.ts +1 -1
  246. package/dist/plugins/routing.d.ts +1 -1
  247. package/dist/plugins/routing.d.ts.map +1 -1
  248. package/dist/plugins/server-bundle.d.ts.map +1 -1
  249. package/dist/plugins/shims.d.ts +1 -1
  250. package/dist/plugins/shims.d.ts.map +1 -1
  251. package/dist/plugins/static-build.d.ts +5 -5
  252. package/dist/routing/codegen-shared.d.ts +1 -1
  253. package/dist/routing/codegen-write.d.ts +1 -1
  254. package/dist/routing/codegen.d.ts +1 -1
  255. package/dist/routing/collision-probe.d.ts +1 -1
  256. package/dist/routing/collision-spaces.d.ts +1 -1
  257. package/dist/routing/convention-lint.d.ts +1 -1
  258. package/dist/routing/convention-lint.d.ts.map +1 -1
  259. package/dist/routing/index.d.ts +13 -13
  260. package/dist/routing/index.js +3 -3
  261. package/dist/routing/interception.d.ts +1 -1
  262. package/dist/routing/interception.d.ts.map +1 -1
  263. package/dist/routing/link-codegen.d.ts +1 -1
  264. package/dist/routing/manifest-codegen.d.ts +1 -1
  265. package/dist/routing/scanner.d.ts +14 -1
  266. package/dist/routing/scanner.d.ts.map +1 -1
  267. package/dist/routing/schema-validation.d.ts +1 -1
  268. package/dist/routing/segment-classify.d.ts +1 -1
  269. package/dist/routing/segment-codegen.d.ts +1 -1
  270. package/dist/routing/segment-keys.d.ts +1 -1
  271. package/dist/routing/slot-placement.d.ts +1 -1
  272. package/dist/routing/walkers.d.ts +1 -1
  273. package/dist/rsc-runtime/transforms.d.ts +13 -0
  274. package/dist/rsc-runtime/transforms.d.ts.map +1 -0
  275. package/dist/schema-bridge.d.ts +1 -1
  276. package/dist/search-params/define.d.ts +3 -3
  277. package/dist/search-params/index.d.ts +3 -3
  278. package/dist/search-params/index.js.map +1 -1
  279. package/dist/search-params/wrappers.d.ts +1 -1
  280. package/dist/server/access-gate.d.ts +1 -1
  281. package/dist/server/action-client.d.ts +1 -1
  282. package/dist/server/action-handler.d.ts +5 -5
  283. package/dist/server/actions.d.ts +2 -2
  284. package/dist/server/als-registry.d.ts +8 -8
  285. package/dist/server/asset-headers.d.ts +1 -1
  286. package/dist/server/chain-url-parts.d.ts +3 -3
  287. package/dist/server/children-interception.d.ts +2 -2
  288. package/dist/server/cookie-context.d.ts +1 -1
  289. package/dist/server/cookie-parsing.d.ts +2 -2
  290. package/dist/server/default-logger.d.ts +1 -1
  291. package/dist/server/deny-boundary.d.ts +2 -2
  292. package/dist/server/deny-renderer.d.ts +5 -5
  293. package/dist/server/early-hints.d.ts +1 -1
  294. package/dist/server/error-boundary-wrapper.d.ts +2 -4
  295. package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
  296. package/dist/server/fallback-error.d.ts +5 -5
  297. package/dist/server/flight-injection-state.d.ts +1 -1
  298. package/dist/server/form-flash.d.ts +1 -1
  299. package/dist/server/html-injector-core.d.ts +2 -2
  300. package/dist/server/html-injectors.d.ts +1 -1
  301. package/dist/server/index.d.ts +18 -18
  302. package/dist/server/index.d.ts.map +1 -1
  303. package/dist/server/index.js +33 -32
  304. package/dist/server/index.js.map +1 -1
  305. package/dist/server/instrumentation.d.ts +1 -1
  306. package/dist/server/internal.d.ts +50 -50
  307. package/dist/server/internal.d.ts.map +1 -1
  308. package/dist/server/internal.js +1023 -1025
  309. package/dist/server/internal.js.map +1 -1
  310. package/dist/server/metadata-collector.d.ts +2 -2
  311. package/dist/server/metadata-platform.d.ts +2 -2
  312. package/dist/server/metadata-render.d.ts +2 -2
  313. package/dist/server/metadata-routes.d.ts +3 -3
  314. package/dist/server/metadata-social.d.ts +2 -2
  315. package/dist/server/metadata.d.ts +2 -2
  316. package/dist/server/middleware-runner.d.ts +1 -1
  317. package/dist/server/node-stream-transforms.d.ts +1 -1
  318. package/dist/server/param-coercion.d.ts +4 -4
  319. package/dist/server/pipeline-helpers.d.ts +3 -3
  320. package/dist/server/pipeline-interception.d.ts +1 -1
  321. package/dist/server/pipeline-metadata.d.ts +1 -1
  322. package/dist/server/pipeline-outcome.d.ts +2 -2
  323. package/dist/server/pipeline-phases.d.ts +3 -3
  324. package/dist/server/pipeline-phases.d.ts.map +1 -1
  325. package/dist/server/pipeline.d.ts +9 -9
  326. package/dist/server/prebuilt/cache-key.d.ts +1 -1
  327. package/dist/server/prebuilt/capture-state.d.ts +1 -1
  328. package/dist/server/prebuilt/key-discipline.d.ts +1 -1
  329. package/dist/server/prebuilt/manifest-tag-index.d.ts +1 -1
  330. package/dist/server/prebuilt/overlay.d.ts +2 -2
  331. package/dist/server/prebuilt/payload-source.d.ts +1 -1
  332. package/dist/server/prebuilt/slots.d.ts +1 -1
  333. package/dist/server/prebuilt/synthetic-store.d.ts +2 -2
  334. package/dist/server/prebuilt-builder.d.ts +2 -2
  335. package/dist/server/primitives.d.ts +2 -2
  336. package/dist/server/publish-params.d.ts +1 -1
  337. package/dist/server/request-context.d.ts +3 -3
  338. package/dist/server/route-element-builder.d.ts +16 -6
  339. package/dist/server/route-element-builder.d.ts.map +1 -1
  340. package/dist/server/route-handler.d.ts +1 -1
  341. package/dist/server/route-matcher.d.ts +4 -4
  342. package/dist/server/rsc-cache-key-guard.d.ts.map +1 -1
  343. package/dist/server/rsc-entry/action-middleware-runner.d.ts +2 -2
  344. package/dist/server/rsc-entry/api-handler.d.ts +1 -1
  345. package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
  346. package/dist/server/rsc-entry/deny-fallback.d.ts +3 -3
  347. package/dist/server/rsc-entry/error-renderer.d.ts +4 -4
  348. package/dist/server/rsc-entry/helpers.d.ts +6 -6
  349. package/dist/server/rsc-entry/index.d.ts +7 -6
  350. package/dist/server/rsc-entry/index.d.ts.map +1 -1
  351. package/dist/server/rsc-entry/render-route.d.ts +4 -4
  352. package/dist/server/rsc-entry/revalidate-renderer.d.ts +4 -4
  353. package/dist/server/rsc-entry/rsc-payload.d.ts +4 -4
  354. package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
  355. package/dist/server/rsc-entry/rsc-stream.d.ts +3 -3
  356. package/dist/server/rsc-entry/ssr-bridge.d.ts +1 -1
  357. package/dist/server/rsc-entry/ssr-renderer.d.ts +7 -7
  358. package/dist/server/rsc-entry/wrap-action-dispatch.d.ts +5 -5
  359. package/dist/server/sitemap-generator.d.ts +2 -2
  360. package/dist/server/sitemap-handler.d.ts +1 -1
  361. package/dist/server/skippable-prefix.d.ts +3 -3
  362. package/dist/server/slot-interception.d.ts +2 -2
  363. package/dist/server/slot-resolver.d.ts +3 -7
  364. package/dist/server/slot-resolver.d.ts.map +1 -1
  365. package/dist/server/ssr-bridge-types.d.ts +2 -2
  366. package/dist/server/ssr-entry.d.ts +1 -1
  367. package/dist/server/static-generator.d.ts +1 -1
  368. package/dist/server/static-not-found.d.ts +1 -1
  369. package/dist/server/status-code-resolver.d.ts +1 -1
  370. package/dist/server/tracing.d.ts +3 -3
  371. package/dist/server/tree-builder.d.ts +3 -3
  372. package/dist/server/tree-match.d.ts +1 -1
  373. package/dist/server/types.d.ts +2 -2
  374. package/dist/server/utils/mdx-file.d.ts +2 -0
  375. package/dist/server/utils/mdx-file.d.ts.map +1 -1
  376. package/dist/server/workers-cache-bridge.d.ts +1 -1
  377. package/dist/shared/als-slots.d.ts +1 -1
  378. package/dist/shared/payload-root.d.ts +2 -2
  379. package/dist/shared/rsc-media-type.d.ts +12 -0
  380. package/dist/shared/rsc-media-type.d.ts.map +1 -1
  381. package/dist/shared/slot-params.d.ts +1 -1
  382. package/dist/shims/font-google.d.ts +1 -1
  383. package/dist/shims/font-google.js.map +1 -1
  384. package/dist/shims/font-local.d.ts +1 -1
  385. package/dist/shims/font-local.js.map +1 -1
  386. package/dist/shims/navigation-client.d.ts +4 -4
  387. package/dist/shims/navigation.d.ts +2 -2
  388. package/docs/api/34-api-config.mdx +9 -8
  389. package/docs/api/36-cli.mdx +23 -3
  390. package/docs/learn/11-error-handling.mdx +11 -0
  391. package/docs/more/01-advanced-routing.mdx +1 -0
  392. package/docs/more/04b-mdx.mdx +38 -18
  393. package/package.json +23 -18
  394. package/src/adapters/build-output-helper.ts +4 -4
  395. package/src/adapters/cloudflare-dev.ts +7 -1
  396. package/src/adapters/cloudflare-kv-cache.ts +11 -8
  397. package/src/adapters/cloudflare.ts +21 -15
  398. package/src/adapters/compress-module.ts +2 -2
  399. package/src/adapters/nitro-presets.ts +139 -0
  400. package/src/adapters/nitro-preview.ts +340 -0
  401. package/src/adapters/nitro.ts +100 -465
  402. package/src/adapters/shared.ts +1 -1
  403. package/src/analyze/chains.ts +411 -0
  404. package/src/analyze/classify.ts +258 -0
  405. package/src/analyze/crawl-entry.ts +68 -0
  406. package/src/analyze/crawl.ts +500 -0
  407. package/src/analyze/graph-cache.ts +332 -0
  408. package/src/analyze/graph-command.ts +762 -0
  409. package/src/analyze/live-graph.ts +232 -0
  410. package/src/analyze/poison-rules.ts +165 -0
  411. package/src/analyze/poison-scan.ts +162 -0
  412. package/src/analyze/scan.ts +149 -0
  413. package/src/cache/cache-api.ts +7 -7
  414. package/src/cache/index.ts +9 -9
  415. package/src/cache/redis-handler.ts +2 -2
  416. package/src/cache/stores/cloudflare-kv.ts +1 -1
  417. package/src/cache/stores/memory.ts +2 -2
  418. package/src/cache/stores/redis.ts +1 -1
  419. package/src/cache/stores/vercel.ts +1 -1
  420. package/src/cache/tag-aware-handler.ts +2 -2
  421. package/src/cache/timber-cache.ts +8 -8
  422. package/src/cdn/cloudflare-purge.ts +1 -1
  423. package/src/cdn/fastly-purge.ts +1 -1
  424. package/src/cdn/index.ts +10 -4
  425. package/src/cdn/workers-cache-purge.ts +6 -2
  426. package/src/cli-check.ts +53 -4
  427. package/src/cli-schema-sync.ts +3 -3
  428. package/src/cli.ts +50 -11
  429. package/src/client/browser-dev.ts +1 -1
  430. package/src/client/browser-entry/action-dispatch.ts +5 -5
  431. package/src/client/browser-entry/hmr.ts +1 -1
  432. package/src/client/browser-entry/hydrate.ts +9 -9
  433. package/src/client/browser-entry/index.ts +10 -10
  434. package/src/client/browser-entry/post-hydration.ts +5 -5
  435. package/src/client/browser-entry/router-init.ts +9 -9
  436. package/src/client/browser-entry/rsc-stream.ts +3 -3
  437. package/src/client/error-boundary.tsx +4 -4
  438. package/src/client/form.tsx +7 -2
  439. package/src/client/history.ts +2 -2
  440. package/src/client/index.ts +21 -18
  441. package/src/client/internal.ts +19 -19
  442. package/src/client/link.tsx +9 -9
  443. package/src/client/navigation-api.ts +1 -1
  444. package/src/client/navigation-commit.ts +5 -5
  445. package/src/client/navigation-context.ts +1 -1
  446. package/src/client/navigation-root.tsx +1 -1
  447. package/src/client/nuqs-adapter.tsx +2 -2
  448. package/src/client/params-context.ts +4 -4
  449. package/src/client/router-effects.ts +3 -3
  450. package/src/client/router-lifecycle.ts +2 -2
  451. package/src/client/router-pipeline.ts +10 -10
  452. package/src/client/router-ref.ts +2 -2
  453. package/src/client/router-skew.ts +2 -2
  454. package/src/client/router-types.ts +6 -6
  455. package/src/client/router.ts +13 -13
  456. package/src/client/rsc-fetch.ts +11 -16
  457. package/src/client/segment-cache.ts +2 -2
  458. package/src/client/segment-outlet.tsx +1 -1
  459. package/src/client/shallow-url.ts +1 -1
  460. package/src/client/slot-outlet.tsx +1 -1
  461. package/src/client/slot-provider.tsx +1 -1
  462. package/src/client/ssr-data.ts +3 -3
  463. package/src/client/stale-client.ts +1 -1
  464. package/src/client/state.ts +4 -4
  465. package/src/client/top-loader.tsx +1 -1
  466. package/src/client/unload-guard.ts +1 -1
  467. package/src/client/use-cookie.ts +2 -2
  468. package/src/client/use-pathname.ts +2 -2
  469. package/src/client/use-pending-navigation.ts +1 -1
  470. package/src/client/use-query-states.ts +3 -3
  471. package/src/client/use-router.ts +2 -2
  472. package/src/client/use-search-params.ts +3 -3
  473. package/src/client/use-segment-params.ts +6 -6
  474. package/src/client/use-selected-layout-segment.ts +2 -2
  475. package/src/codec.ts +2 -2
  476. package/src/config-types.ts +27 -7
  477. package/src/config-validation.ts +1 -1
  478. package/src/cookies/define-cookie.ts +6 -6
  479. package/src/cookies/index.ts +3 -3
  480. package/src/cookies/json-cookie.ts +1 -1
  481. package/src/dev-tools/404-page.ts +4 -4
  482. package/src/dev-tools/dev-page-shell.ts +1 -1
  483. package/src/dev-tools/error-page.ts +4 -4
  484. package/src/dev-tools/index.ts +12 -12
  485. package/src/dev-tools/instrumentation.ts +1 -1
  486. package/src/dev-tools/logs.ts +1 -1
  487. package/src/dev-tools/overlay.ts +3 -3
  488. package/src/dev-tools/terminal.ts +2 -2
  489. package/src/fonts/ast.ts +5 -5
  490. package/src/fonts/bundle.ts +5 -5
  491. package/src/fonts/css.ts +1 -1
  492. package/src/fonts/dev-middleware.ts +2 -2
  493. package/src/fonts/google.ts +2 -2
  494. package/src/fonts/local.ts +4 -4
  495. package/src/fonts/pipeline.ts +8 -8
  496. package/src/fonts/transform.ts +5 -5
  497. package/src/fonts/types.ts +1 -1
  498. package/src/fonts/virtual-modules.ts +1 -1
  499. package/src/index.ts +46 -37
  500. package/src/params/codec-registry.ts +1 -1
  501. package/src/params/define-schema.ts +2 -2
  502. package/src/params/index.ts +4 -4
  503. package/src/params/resolve-schema.ts +2 -2
  504. package/src/plugin-context.ts +10 -10
  505. package/src/plugins/adapter-build.ts +5 -5
  506. package/src/plugins/build-manifest.ts +4 -4
  507. package/src/plugins/build-report.ts +6 -6
  508. package/src/plugins/cache.ts +3 -3
  509. package/src/plugins/callsite-ast.ts +1 -1
  510. package/src/plugins/callsite-jsx.ts +2 -2
  511. package/src/plugins/chunks.ts +1 -1
  512. package/src/plugins/cloudflare-wasm.ts +1 -1
  513. package/src/plugins/content.ts +5 -1
  514. package/src/plugins/dev-discovery.ts +218 -0
  515. package/src/plugins/dev-server.ts +97 -12
  516. package/src/plugins/entries.ts +1 -1
  517. package/src/plugins/fonts.ts +17 -10
  518. package/src/plugins/graph-endpoint.ts +532 -0
  519. package/src/plugins/mdx.ts +73 -38
  520. package/src/plugins/prebuilt-capture.ts +3 -3
  521. package/src/plugins/prebuilt-options-analysis.ts +1 -1
  522. package/src/plugins/prebuilt.ts +7 -7
  523. package/src/plugins/prerender-sugar.ts +11 -19
  524. package/src/plugins/request-dep/analysis.ts +1 -1
  525. package/src/plugins/request-dep/index.ts +8 -8
  526. package/src/plugins/request-dep/origin.ts +1 -1
  527. package/src/plugins/routing.ts +12 -7
  528. package/src/plugins/server-bundle.ts +11 -3
  529. package/src/plugins/shims.ts +16 -31
  530. package/src/plugins/static-build.ts +10 -10
  531. package/src/routing/codegen-shared.ts +1 -1
  532. package/src/routing/codegen-write.ts +3 -3
  533. package/src/routing/codegen.ts +14 -5
  534. package/src/routing/collision-probe.ts +3 -3
  535. package/src/routing/collision-spaces.ts +3 -3
  536. package/src/routing/convention-lint.ts +136 -6
  537. package/src/routing/export-detect.ts +1 -1
  538. package/src/routing/index.ts +13 -13
  539. package/src/routing/interception.ts +41 -4
  540. package/src/routing/link-codegen.ts +3 -3
  541. package/src/routing/manifest-codegen.ts +2 -2
  542. package/src/routing/scanner.ts +33 -9
  543. package/src/routing/schema-validation.ts +4 -4
  544. package/src/routing/segment-classify.ts +2 -2
  545. package/src/routing/segment-codegen.ts +1 -1
  546. package/src/routing/segment-keys.ts +1 -1
  547. package/src/routing/slot-placement.ts +1 -1
  548. package/src/routing/walkers.ts +1 -1
  549. package/src/rsc-runtime/transforms.ts +13 -0
  550. package/src/rsc-runtime/vendor-types.d.ts +12 -0
  551. package/src/schema-bridge.ts +1 -1
  552. package/src/search-params/define.ts +8 -8
  553. package/src/search-params/index.ts +3 -3
  554. package/src/search-params/wrappers.ts +3 -3
  555. package/src/server/access-gate.tsx +6 -6
  556. package/src/server/action-client.ts +5 -5
  557. package/src/server/action-handler.ts +16 -16
  558. package/src/server/actions.ts +5 -5
  559. package/src/server/als-registry.ts +8 -8
  560. package/src/server/asset-headers.ts +2 -2
  561. package/src/server/chain-url-parts.ts +5 -5
  562. package/src/server/children-interception.ts +4 -4
  563. package/src/server/compress.ts +1 -1
  564. package/src/server/cookie-context.ts +4 -4
  565. package/src/server/cookie-parsing.ts +2 -2
  566. package/src/server/default-logger.ts +3 -3
  567. package/src/server/deny-boundary.ts +10 -10
  568. package/src/server/deny-renderer.ts +38 -25
  569. package/src/server/early-hints-sender.ts +2 -2
  570. package/src/server/early-hints.ts +2 -2
  571. package/src/server/error-boundary-wrapper.ts +4 -12
  572. package/src/server/fallback-error.ts +13 -13
  573. package/src/server/flight-injection-state.ts +1 -1
  574. package/src/server/form-flash.ts +2 -2
  575. package/src/server/html-injector-core.ts +4 -4
  576. package/src/server/html-injectors.ts +5 -5
  577. package/src/server/index.ts +18 -18
  578. package/src/server/instrumentation.ts +1 -1
  579. package/src/server/internal.ts +50 -50
  580. package/src/server/logger.ts +4 -4
  581. package/src/server/metadata-collector.ts +7 -7
  582. package/src/server/metadata-platform.ts +2 -2
  583. package/src/server/metadata-render.ts +4 -4
  584. package/src/server/metadata-routes.ts +3 -3
  585. package/src/server/metadata-social.ts +2 -2
  586. package/src/server/metadata.ts +2 -2
  587. package/src/server/middleware-runner.ts +1 -1
  588. package/src/server/node-stream-transforms.ts +4 -4
  589. package/src/server/param-coercion.ts +8 -8
  590. package/src/server/pipeline-helpers.ts +7 -7
  591. package/src/server/pipeline-interception.ts +2 -2
  592. package/src/server/pipeline-metadata.ts +1 -1
  593. package/src/server/pipeline-outcome.ts +8 -8
  594. package/src/server/pipeline-phases.ts +24 -28
  595. package/src/server/pipeline.ts +22 -22
  596. package/src/server/prebuilt/cache-key.ts +1 -1
  597. package/src/server/prebuilt/capture-state.ts +1 -1
  598. package/src/server/prebuilt/key-discipline.ts +1 -1
  599. package/src/server/prebuilt/manifest-tag-index.ts +1 -1
  600. package/src/server/prebuilt/overlay.ts +6 -6
  601. package/src/server/prebuilt/payload-source.ts +2 -2
  602. package/src/server/prebuilt/slots.ts +5 -5
  603. package/src/server/prebuilt/synthetic-store.ts +2 -2
  604. package/src/server/prebuilt-builder.ts +16 -16
  605. package/src/server/prebuilt-runtime.ts +12 -12
  606. package/src/server/primitives.ts +7 -7
  607. package/src/server/publish-params.ts +3 -3
  608. package/src/server/request-context.ts +7 -7
  609. package/src/server/route-element-builder.ts +108 -50
  610. package/src/server/route-handler.ts +4 -4
  611. package/src/server/route-matcher.ts +5 -5
  612. package/src/server/rsc-cache-key-guard.ts +3 -5
  613. package/src/server/rsc-entry/action-middleware-runner.ts +7 -7
  614. package/src/server/rsc-entry/api-handler.ts +18 -9
  615. package/src/server/rsc-entry/deny-fallback.ts +10 -10
  616. package/src/server/rsc-entry/error-renderer.ts +27 -27
  617. package/src/server/rsc-entry/helpers.ts +10 -10
  618. package/src/server/rsc-entry/index.ts +51 -47
  619. package/src/server/rsc-entry/render-route.ts +20 -20
  620. package/src/server/rsc-entry/revalidate-renderer.ts +12 -12
  621. package/src/server/rsc-entry/rsc-payload.ts +19 -15
  622. package/src/server/rsc-entry/rsc-stream.ts +8 -8
  623. package/src/server/rsc-entry/ssr-bridge.ts +3 -3
  624. package/src/server/rsc-entry/ssr-renderer.ts +23 -23
  625. package/src/server/rsc-entry/wrap-action-dispatch.ts +9 -9
  626. package/src/server/rsc-prop-warnings.ts +1 -1
  627. package/src/server/sensitive-fields.ts +1 -1
  628. package/src/server/server-timing.ts +1 -1
  629. package/src/server/sitemap-generator.ts +3 -3
  630. package/src/server/sitemap-handler.ts +3 -3
  631. package/src/server/skippable-prefix.ts +7 -7
  632. package/src/server/slot-interception.ts +5 -5
  633. package/src/server/slot-resolver.ts +20 -28
  634. package/src/server/ssr-bridge-types.ts +2 -2
  635. package/src/server/ssr-entry.ts +18 -18
  636. package/src/server/ssr-render.ts +4 -4
  637. package/src/server/ssr-wrappers.tsx +1 -1
  638. package/src/server/state-tree-diff.ts +1 -1
  639. package/src/server/static-generator.ts +6 -6
  640. package/src/server/static-not-found.ts +3 -3
  641. package/src/server/status-code-resolver.ts +1 -1
  642. package/src/server/tracing.ts +5 -5
  643. package/src/server/tree-builder.ts +4 -4
  644. package/src/server/tree-match.ts +1 -1
  645. package/src/server/types.ts +2 -2
  646. package/src/server/utils/mdx-file.ts +2 -2
  647. package/src/server/waituntil-bridge.ts +1 -1
  648. package/src/server/workers-cache-bridge.ts +2 -2
  649. package/src/shared/als-slots.ts +1 -1
  650. package/src/shared/payload-root.ts +2 -2
  651. package/src/shared/rsc-media-type.ts +16 -0
  652. package/src/shared/slot-params.ts +1 -1
  653. package/src/shims/font-google.ts +1 -1
  654. package/src/shims/font-local.ts +1 -1
  655. package/src/shims/navigation-client.ts +5 -5
  656. package/src/shims/navigation.ts +2 -2
  657. package/LICENSE +0 -8
  658. package/dist/_chunks/actions-BjbbNRFN.js.map +0 -1
  659. package/dist/_chunks/build-output-helper-C3DrfzZR.js.map +0 -1
  660. package/dist/_chunks/cache-api-DllJ-Lyw.js.map +0 -1
  661. package/dist/_chunks/cli-check-DJZDc22E.js.map +0 -1
  662. package/dist/_chunks/convention-lint-CpteIpTm.js.map +0 -1
  663. package/dist/_chunks/dist-BA3u1z3W.js +0 -423
  664. package/dist/_chunks/dist-BA3u1z3W.js.map +0 -1
  665. package/dist/_chunks/mdx-file-C005ay-P.js.map +0 -1
  666. package/dist/_chunks/plugin-context-rCinWLiE.js.map +0 -1
  667. package/dist/_chunks/scanner-CAietmj4.js.map +0 -1
  668. package/dist/content/index.d.ts +0 -2
  669. package/dist/content/index.d.ts.map +0 -1
  670. package/dist/content/index.js +0 -0
  671. package/src/content/index.ts +0 -5
  672. package/src/shims/server-only-noop.js +0 -6
@@ -17,10 +17,10 @@ export default {
17
17
  };
18
18
  ```
19
19
 
20
- Install the MDX compiler and frontmatter plugins:
20
+ Install the MDX compiler — timber.js uses [Satteri](https://satteri.bruits.org), a Rust-based Markdown/MDX compiler with a native Vite plugin:
21
21
 
22
22
  ```bash title="Terminal"
23
- pnpm add -D @mdx-js/rollup remark-frontmatter remark-mdx-frontmatter
23
+ pnpm add -D vite-plugin-satteri satteri
24
24
  ```
25
25
 
26
26
  That's it. Any `page.mdx` file in your `app/` directory is now a route.
@@ -57,7 +57,7 @@ This page is a **server component** — no JavaScript shipped to the browser.
57
57
 
58
58
  ## Frontmatter
59
59
 
60
- timber.js automatically registers `remark-frontmatter` and `remark-mdx-frontmatter` when installed. Frontmatter is exported as a single `frontmatter` object:
60
+ Frontmatter parsing is built in — YAML between `---` fences or TOML between `+++` fences. Frontmatter is exported as a single `frontmatter` object:
61
61
 
62
62
  ````mdx title="app/blog/hello/page.mdx"
63
63
  ---
@@ -127,33 +127,52 @@ pnpm add @timber-js/app
127
127
 
128
128
  Only the `CopyButton` ships JavaScript. The rest of the page renders as static HTML.
129
129
 
130
- ## Remark and Rehype Plugins
130
+ ## Plugins and Features
131
131
 
132
- Configure remark and rehype plugins through the `mdx` key in your config:
132
+ GFM (tables, footnotes, strikethrough, task lists) and frontmatter are on by default. Additional syntax is enabled through `features`, and custom transforms are written as Satteri visitor plugins through the `mdx` key in your config:
133
133
 
134
134
  ```ts title="timber.config.ts"
135
- import remarkGfm from 'remark-gfm';
136
- import rehypeShiki from '@shikijs/rehype';
135
+ import { defineHastPlugin } from 'satteri';
136
+
137
+ const externalLinks = defineHastPlugin({
138
+ name: 'external-links',
139
+ element: {
140
+ filter: ['a'],
141
+ visit(node, ctx) {
142
+ const href = node.properties.href;
143
+ if (typeof href === 'string' && href.startsWith('http')) {
144
+ ctx.setProperty(node, 'target', '_blank');
145
+ }
146
+ },
147
+ },
148
+ });
137
149
 
138
150
  export default {
139
151
  pageExtensions: ['tsx', 'ts', 'jsx', 'js', 'mdx'],
140
152
  mdx: {
141
- remarkPlugins: [remarkGfm],
142
- rehypePlugins: [[rehypeShiki, { theme: 'monokai' }]],
153
+ hastPlugins: [externalLinks],
154
+ features: { math: true },
143
155
  },
144
156
  };
145
157
  ```
146
158
 
147
- The `mdx` config maps directly to `@mdx-js/rollup` options. Available fields:
159
+ The `mdx` config maps directly to `vite-plugin-satteri` options. Available fields:
160
+
161
+ | Option | Type | Description |
162
+ | -------------- | -------------------- | ------------------------------------------------------------------------------- |
163
+ | `mdastPlugins` | `MdastPluginInput[]` | Markdown AST visitors (created with `defineMdastPlugin`) |
164
+ | `hastPlugins` | `HastPluginInput[]` | HTML AST visitors (created with `defineHastPlugin`) |
165
+ | `features` | `Features` | Parser toggles — `gfm`, `frontmatter`, `math`, `directive`, `wikilinks`, … |
148
166
 
149
- | Option | Type | Description |
150
- | --------------------- | --------------- | ------------------------------------------ |
151
- | `remarkPlugins` | `PluggableList` | remark plugins for Markdown AST transforms |
152
- | `rehypePlugins` | `PluggableList` | rehype plugins for HTML AST transforms |
153
- | `recmaPlugins` | `PluggableList` | recma plugins for ESTree transforms |
154
- | `remarkRehypeOptions` | `object` | Options passed to `remark-rehype` |
167
+ Satteri plugins are filtered visitors, not unified plugins — **remark/rehype plugins do not run** on Satteri's Rust-side AST. Visitors can be async and can replace nodes, which is enough to build things like shiki-based syntax highlighting (shiki transformers such as `@shikijs/twoslash` still work, since they run inside shiki).
155
168
 
156
- Plugins like `remark-gfm` and `rehype-shiki` are your choice to install — timber.js doesn't bundle them.
169
+ If you need the unified MDX pipeline (for example, CodeHike), bypass timber's MDX support entirely: set `mdx: false` in your config and register `@mdx-js/rollup` yourself in `vite.config.ts` with `enforce: 'pre'`:
170
+
171
+ ```ts title="timber.config.ts"
172
+ export default {
173
+ mdx: false, // disable timber's built-in MDX — bring your own compiler
174
+ };
175
+ ```
157
176
 
158
177
  ## Dynamic MDX Loading
159
178
 
@@ -205,5 +224,6 @@ For structured content outside the route tree (blog posts, docs, changelogs), us
205
224
  | `@next/mdx` wrapper package | Built-in — just add `'mdx'` to pageExtensions |
206
225
  | `next.config.mjs` `withMDX()` wrapper | `timber.config.ts` `mdx` key |
207
226
  | MDX pages are client components by default | MDX pages are server components by default |
208
- | Custom loader for `.md` files | `@mdx-js/rollup` handles both `.mdx` and `.md` |
227
+ | unified (remark/rehype) plugins | Satteri visitor plugins + built-in features |
228
+ | Custom loader for `.md` files | Built in — `.md` imports export an HTML string |
209
229
  | `mdx-components.tsx` at project root | Same convention |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@timber-js/app",
3
- "version": "0.2.0-alpha.191",
3
+ "version": "0.2.0-alpha.194",
4
4
  "description": "Vite-native React framework built for Servers and Serverless Platforms — correct HTTP semantics, real status codes, pages that work without JavaScript",
5
5
  "keywords": [
6
6
  "cloudflare-workers",
@@ -146,28 +146,35 @@
146
146
  "publishConfig": {
147
147
  "access": "public"
148
148
  },
149
+ "scripts": {
150
+ "copy-docs": "node scripts/copy-docs.js",
151
+ "build": "vite build --config vite.lib.config.ts && node scripts/build-types.js && pnpm run copy-docs",
152
+ "typecheck": "tsgo --noEmit",
153
+ "prepublishOnly": "pnpm run build"
154
+ },
149
155
  "dependencies": {
150
156
  "@opentelemetry/api": "^1.9.1",
151
- "@opentelemetry/context-async-hooks": "^2.9.0",
152
- "@opentelemetry/sdk-trace-base": "^2.9.0",
153
- "cookie": "^1.1.1",
157
+ "@opentelemetry/context-async-hooks": "^2.10.0",
158
+ "@opentelemetry/sdk-trace-base": "^2.10.0",
159
+ "cookie": "^2.0.1",
154
160
  "jsonc-parser": "^3.3.1",
155
- "magic-string": "^0.30.21",
161
+ "magic-string": "^1.2.0",
156
162
  "nitro": "3.0.260610-beta",
157
- "srvx": "^0.12.0"
163
+ "srvx": "^0.12.5"
158
164
  },
159
165
  "peerDependencies": {
160
166
  "@content-collections/core": "^0.14.0 || ^0.15.0",
161
167
  "@content-collections/mdx": "^0.2.0",
162
168
  "@content-collections/vite": "^0.2.0 || ^0.3.0",
163
- "@mdx-js/rollup": "^3.0.0",
164
169
  "@typescript/native-preview": "^7.0.0-dev.0",
165
170
  "@vitejs/plugin-react": "^6.0.0",
166
171
  "@vitejs/plugin-rsc": ">=0.5.28",
167
172
  "nuqs": "^2.0.0",
168
- "react": "19.2.7",
169
- "react-dom": "19.2.7",
170
- "vite": "^8.1.0",
173
+ "react": "19.2.8",
174
+ "react-dom": "19.2.8",
175
+ "satteri": "^0.9.5",
176
+ "vite": "8.2.1",
177
+ "vite-plugin-satteri": "^0.2.15",
171
178
  "wrangler": "^4.0.0",
172
179
  "zod": "^3.22.0 || ^4.0.0"
173
180
  },
@@ -181,7 +188,10 @@
181
188
  "@content-collections/vite": {
182
189
  "optional": true
183
190
  },
184
- "@mdx-js/rollup": {
191
+ "satteri": {
192
+ "optional": true
193
+ },
194
+ "vite-plugin-satteri": {
185
195
  "optional": true
186
196
  },
187
197
  "@typescript/native-preview": {
@@ -195,14 +205,9 @@
195
205
  }
196
206
  },
197
207
  "devDependencies": {
198
- "@typescript/native-preview": "7.0.0-dev.20260707.2"
208
+ "@typescript/native-preview": "catalog:"
199
209
  },
200
210
  "engines": {
201
211
  "node": ">=22.18.0"
202
- },
203
- "scripts": {
204
- "copy-docs": "node scripts/copy-docs.js",
205
- "build": "vite build --config vite.lib.config.ts && node scripts/build-types.js && pnpm run copy-docs",
206
- "typecheck": "tsgo --noEmit"
207
212
  }
208
- }
213
+ }
@@ -13,7 +13,7 @@
13
13
 
14
14
  import { writeFile, mkdir, cp, rm, readdir, readFile } from 'node:fs/promises';
15
15
  import { join, basename, relative } from 'node:path';
16
- import { adapterBase, generateHeadersFile } from './shared.js';
16
+ import { adapterBase, generateHeadersFile } from './shared.ts';
17
17
  // Isomorphic, zero-import module — safe to load from an adapter, which Node's
18
18
  // native ESM loader evaluates before Vite's resolver exists. Same precedent as
19
19
  // `adapters/shared.ts` importing `../shared/base-path.js`.
@@ -21,9 +21,9 @@ import {
21
21
  HEADERS_FILE,
22
22
  USER_MERGED_PLATFORM_FILES,
23
23
  USER_PLATFORM_DIR,
24
- } from '../shared/static-platform-files.js';
25
- import { detectFsIdentity, fsKey } from './fs-identity.js';
26
- import type { TimberConfig } from './types';
24
+ } from '../shared/static-platform-files.ts';
25
+ import { detectFsIdentity, fsKey } from './fs-identity.ts';
26
+ import type { TimberConfig } from './types.ts';
27
27
 
28
28
  /** Options for the shared build output steps. */
29
29
  export interface BuildOutputBaseOptions {
@@ -30,7 +30,7 @@
30
30
  */
31
31
 
32
32
  import type { Plugin, ViteDevServer } from 'vite';
33
- import { runWithBindings } from './cloudflare.js';
33
+ import { runWithBindings } from './cloudflare.ts';
34
34
 
35
35
  /**
36
36
  * Dynamically import wrangler. Extracted as a named export so tests
@@ -140,6 +140,12 @@ export function cloudflareDevBindings(options: CloudflareDevBindingsOptions = {}
140
140
  apply: 'serve',
141
141
 
142
142
  async configureServer(server: ViteDevServer) {
143
+ // The analyze crawl (design/47 §6) boots a middleware-mode server
144
+ // only to walk import edges — it never renders a request, so the
145
+ // workerd boot and the wrangler remote-bindings handshake (~6.8 s
146
+ // measured) are pure waste there. Skip the proxy entirely.
147
+ if (process.env.TIMBER_ANALYZE === '1') return;
148
+
143
149
  // Dynamic import — wrangler is an optional peer dependency.
144
150
  // Users must install it themselves: `pnpm add -D wrangler`
145
151
  const { getPlatformProxy } = await (options._loadWrangler ?? loadWrangler)();
@@ -1,6 +1,6 @@
1
- import type { CacheHandler } from '../cache/index';
2
- import { getCloudflareBindings } from './cloudflare';
3
- import { warnLossyJsonValue } from '../cache/json-lossy-check.js';
1
+ import type { CacheHandler } from '../cache/index.ts';
2
+ import { getCloudflareBindings } from './cloudflare.ts';
3
+ import { warnLossyJsonValue } from '../cache/json-lossy-check.ts';
4
4
 
5
5
  /**
6
6
  * Cloudflare Workers KV interface — the subset of KVNamespace we depend on.
@@ -38,9 +38,9 @@ const LEGACY_GRACE_MS = 30 * 86400 * 1000;
38
38
  * new format (TagIndexEntry[]). Old-format entries get a 30-day grace period
39
39
  * so they survive until explicitly invalidated or cycled through a new set().
40
40
  */
41
- function parseTagIndex(raw: unknown): TagIndexEntry[] {
41
+ function parseTagIndex(raw: unknown, now: number): TagIndexEntry[] {
42
42
  if (!Array.isArray(raw)) return [];
43
- const legacyDeadline = Date.now() + LEGACY_GRACE_MS;
43
+ const legacyDeadline = now + LEGACY_GRACE_MS;
44
44
  return raw.map((item: unknown) => {
45
45
  if (typeof item === 'string') return { key: item, expiresAt: legacyDeadline };
46
46
  return item as TagIndexEntry;
@@ -143,7 +143,7 @@ export class CloudflareKVCacheHandler implements CacheHandler {
143
143
  const kvExpiresAt = now + kvTtl * 1000;
144
144
  await Promise.all(
145
145
  opts.tags.map(async (tag) => {
146
- const existing = parseTagIndex(await kv.get(this.tagKey(tag), { type: 'json' }));
146
+ const existing = parseTagIndex(await kv.get(this.tagKey(tag), { type: 'json' }), now);
147
147
  const fresh = existing.filter((e) => e.expiresAt > now && e.key !== key);
148
148
  fresh.push({ key, expiresAt: kvExpiresAt });
149
149
  await kv.put(this.tagKey(tag), JSON.stringify(fresh), {
@@ -164,8 +164,8 @@ export class CloudflareKVCacheHandler implements CacheHandler {
164
164
  if (raw) {
165
165
  await Promise.all(
166
166
  raw.tags.map(async (tag) => {
167
- const entries = parseTagIndex(await kv.get(this.tagKey(tag), { type: 'json' }));
168
167
  const now = Date.now();
168
+ const entries = parseTagIndex(await kv.get(this.tagKey(tag), { type: 'json' }), now);
169
169
  const filtered = entries.filter((e) => e.key !== opts.key);
170
170
  if (filtered.length > 0) {
171
171
  await kv.put(this.tagKey(tag), JSON.stringify(filtered), {
@@ -181,7 +181,10 @@ export class CloudflareKVCacheHandler implements CacheHandler {
181
181
  }
182
182
 
183
183
  if (opts.tag) {
184
- const entries = parseTagIndex(await kv.get(this.tagKey(opts.tag), { type: 'json' }));
184
+ const entries = parseTagIndex(
185
+ await kv.get(this.tagKey(opts.tag), { type: 'json' }),
186
+ Date.now()
187
+ );
185
188
  if (entries.length > 0) {
186
189
  // Re-check each member's stored tags before deleting — the tag index
187
190
  // can contain stale references from partial writes or entries whose
@@ -8,21 +8,21 @@ import { execFile } from 'node:child_process';
8
8
  import { join, relative } from 'node:path';
9
9
  import { parse as parseJsonc } from 'jsonc-parser';
10
10
  import { AsyncLocalStorage } from 'node:async_hooks';
11
- import type { TimberPlatformAdapter, TimberConfig } from './types';
11
+ import type { TimberPlatformAdapter, TimberConfig } from './types.ts';
12
12
  import {
13
13
  runSharedBuildSteps,
14
14
  findUnhashedStaticFiles,
15
15
  buildStaticDirectoryOutput,
16
16
  writeHeadersFile,
17
- } from './build-output-helper.js';
18
- import { adapterBase, generateHeadersFile } from './shared.js';
17
+ } from './build-output-helper.ts';
18
+ import { adapterBase, generateHeadersFile } from './shared.ts';
19
19
  // Isomorphic, zero-import module — safe to load from an adapter, which Node's
20
20
  // native ESM loader evaluates before Vite's resolver exists. Same precedent as
21
21
  // `adapters/shared.ts` importing `../shared/base-path.js`.
22
- import { RSC_KEY_HEADERS } from '../shared/rsc-cache-key.js';
22
+ import { RSC_KEY_HEADERS } from '../shared/rsc-cache-key.ts';
23
23
  // Same reasoning: the media type the origin's own RSC gate matches on, so the
24
24
  // two predicates cannot drift apart. See `shared/rsc-media-type.ts`.
25
- import { RSC_CONTENT_TYPE } from '../shared/rsc-media-type.js';
25
+ import { RSC_CONTENT_TYPE } from '../shared/rsc-media-type.ts';
26
26
 
27
27
  // ─── Bindings passthrough ─────────────────────────────────────────────────
28
28
  // ALS stores the env object per-request so server components and middleware
@@ -381,7 +381,7 @@ import { AsyncLocalStorage } from 'node:async_hooks'
381
381
  // for cache.component payloads.
382
382
  import './_timber-runtime-init.js'
383
383
  import './_timber-prebuilt-source.js'
384
- ${manifestImport}import handler, { runWithWaitUntil, runWithWorkersCachePurge } from '${rscEntryRelative}'
384
+ ${manifestImport}import handler, { runWithWaitUntil, runWithWorkersCachePurge, stripHeadBody } from '${rscEntryRelative}'
385
385
  ${handlersImport}
386
386
 
387
387
  // Bind Cloudflare env to ALS so getCloudflareBindings() works at runtime.
@@ -479,12 +479,18 @@ ${handlersSpread} async fetch(request, env, ctx) {
479
479
  // One-time on first request; resolved-promise await thereafter.
480
480
  await initPlatformTracer()
481
481
 
482
- // Edge-cache GET/HEAD responses via the Cache API. RSC navigation
483
- // requests (Accept: text/x-component) are excluded. Their varying
484
- // inputs are now in the URL via ?_rsc= (TIM-1268), but this cache keys
485
- // on the request URL alone and cannot honour Vary, so a payload request
486
- // that arrives without the param — stripped query, hand-rolled client —
487
- // would share a key with the document.
482
+ // Edge-cache GET/HEAD responses via the Cache API (caches.default).
483
+ // caches.default and ctx.cache.purge() operate on the same underlying
484
+ // Cloudflare CDN cache — "independent" in the CF docs means independent
485
+ // write APIs, not independent stores (TIM-1172). Tag-based purging via
486
+ // revalidateTag() clears entries stored here when their Cache-Tag header
487
+ // matches the invalidated tag. See design/25 §TIM-1172.
488
+ //
489
+ // RSC navigation requests (Accept: text/x-component) are excluded.
490
+ // Their varying inputs are now in the URL via ?_rsc= (TIM-1268), but
491
+ // this cache keys on the request URL alone and cannot honour Vary, so a
492
+ // payload request that arrives without the param — stripped query,
493
+ // hand-rolled client — would share a key with the document.
488
494
  //
489
495
  // This exclusion is load-bearing in the other direction too: the store
490
496
  // predicate below treats "Vary: Accept" as honoured *because* of it
@@ -502,7 +508,7 @@ ${handlersSpread} async fetch(request, env, ctx) {
502
508
  // see canHonorVary. Entries written before that predicate existed are
503
509
  // exactly the ones that would be served to the wrong client.
504
510
  if (cached) {
505
- if (canHonorVary(cached.headers.get('Vary'))) return cached
511
+ if (canHonorVary(cached.headers.get('Vary'))) return stripHeadBody(cached, request.method)
506
512
  // Declining the hit means nobody will ever read this body. Release
507
513
  // it rather than leaving the stream dangling for the rest of the
508
514
  // request (design/02-rendering-pipeline.md §"Cancel Readers When You
@@ -527,7 +533,7 @@ ${handlersSpread} async fetch(request, env, ctx) {
527
533
  // it has 'public' or 's-maxage' (a shared-cache TTL directive) and no
528
534
  // 'no-store' or 'private'. Cloudflare's cache.put() only accepts GET
529
535
  // requests and rejects 206, so only store GET 200s. HEAD requests
530
- // benefit from cache.match() which handles HEAD→GET matching automatically.
536
+ // are served from cache.match() hits with the body stripped (TIM-1325).
531
537
  // See design/25-production-deployments.md §"CDN / Edge Cache".
532
538
  if (cache && request.method === 'GET' && response.status === 200) {
533
539
  const cc = response.headers.get('Cache-Control')
@@ -610,7 +616,7 @@ globalThis.__TIMBER_PREBUILT_SOURCE__ = {
610
616
 
611
617
  const entries: string[] = [];
612
618
  for (const { file, bytes } of data.payloads) {
613
- const b64 = bytes.toString('base64');
619
+ const b64 = Buffer.from(bytes).toString('base64');
614
620
  entries.push(` ${JSON.stringify(file)}: ${JSON.stringify(b64)}`);
615
621
  }
616
622
 
@@ -21,7 +21,7 @@ import { transformWithOxc } from 'vite';
21
21
  // in both dev (Vite resolves the TS source) and the published package
22
22
  // (the string is inlined into the compiled adapter entry).
23
23
  import compressSource from '../server/compress.ts?raw';
24
- import { RSC_CONTENT_TYPE } from '../shared/rsc-media-type.js';
24
+ import { RSC_CONTENT_TYPE } from '../shared/rsc-media-type.ts';
25
25
 
26
26
  /**
27
27
  * The one import `server/compress.ts` is allowed to carry, and its inlined
@@ -36,7 +36,7 @@ import { RSC_CONTENT_TYPE } from '../shared/rsc-media-type.js';
36
36
  const INLINED_IMPORTS: ReadonlyArray<{ pattern: RegExp; replacement: string }> = [
37
37
  {
38
38
  pattern:
39
- /^import\s*\{\s*RSC_CONTENT_TYPE\s*,?\s*\}\s*from\s*["'][^"']*shared\/rsc-media-type\.js["'];?[ \t]*$/m,
39
+ /^import\s*\{\s*RSC_CONTENT_TYPE\s*,?\s*\}\s*from\s*["'][^"']*shared\/rsc-media-type\.(?:js|ts)["'];?[ \t]*$/m,
40
40
  replacement: `const RSC_CONTENT_TYPE = ${JSON.stringify(RSC_CONTENT_TYPE)};`,
41
41
  },
42
42
  ];
@@ -0,0 +1,139 @@
1
+ // Nitro preset catalog — per-platform build configuration.
2
+ //
3
+ // Shared by the nitro adapter (build + entry generation) and the preview
4
+ // module. See design/25-production-deployments.md for the preset matrix.
5
+
6
+ /**
7
+ * Supported Nitro deployment presets.
8
+ *
9
+ * Each preset maps to a Nitro deployment target. The adapter generates
10
+ * the appropriate configuration and entry point for the selected platform.
11
+ */
12
+ export type NitroPreset =
13
+ | 'vercel'
14
+ | 'vercel-edge'
15
+ | 'netlify'
16
+ | 'netlify-edge'
17
+ | 'aws-lambda'
18
+ | 'deno-deploy'
19
+ | 'azure-functions'
20
+ | 'node-server'
21
+ | 'bun';
22
+
23
+ /** Preset-specific Nitro configuration. */
24
+ export interface PresetConfig {
25
+ /** Nitro preset name passed to the Nitro build. */
26
+ nitroPreset: string;
27
+ /** Output directory name within the build dir. */
28
+ outputDir: string;
29
+ /**
30
+ * Path to the server bundle directory relative to outputDir.
31
+ * Nitro places the bundled server entry + _chunks/ here.
32
+ * Most presets use `server`; Vercel uses `functions/__server.func`.
33
+ */
34
+ serverBundleDir: string;
35
+ /** Whether the runtime supports waitUntil. */
36
+ supportsWaitUntil: boolean;
37
+ /** Whether the runtime supports application-level 103 Early Hints. */
38
+ supportsEarlyHints: boolean;
39
+ /** Value for TIMBER_RUNTIME env var. See design/25-production-deployments.md. */
40
+ runtimeName: string;
41
+ /** Additional nitro.config fields for this preset. */
42
+ extraConfig?: Record<string, unknown>;
43
+ }
44
+
45
+ export const PRESET_CONFIGS: Record<NitroPreset, PresetConfig> = {
46
+ 'vercel': {
47
+ nitroPreset: 'vercel',
48
+ outputDir: '.vercel/output',
49
+ serverBundleDir: 'functions/__server.func',
50
+ supportsWaitUntil: true,
51
+ supportsEarlyHints: false,
52
+ runtimeName: 'vercel',
53
+ extraConfig: { vercel: { functions: { maxDuration: 30 } } },
54
+ },
55
+ 'vercel-edge': {
56
+ nitroPreset: 'vercel-edge',
57
+ outputDir: '.vercel/output',
58
+ serverBundleDir: 'functions/__server.func',
59
+ supportsWaitUntil: true,
60
+ supportsEarlyHints: false,
61
+ runtimeName: 'vercel-edge',
62
+ },
63
+ 'netlify': {
64
+ nitroPreset: 'netlify',
65
+ outputDir: '.netlify/functions-internal',
66
+ serverBundleDir: 'server',
67
+ supportsWaitUntil: false,
68
+ supportsEarlyHints: false,
69
+ runtimeName: 'netlify',
70
+ },
71
+ 'netlify-edge': {
72
+ nitroPreset: 'netlify-edge',
73
+ outputDir: '.netlify/edge-functions',
74
+ serverBundleDir: 'server',
75
+ supportsWaitUntil: true,
76
+ supportsEarlyHints: false,
77
+ runtimeName: 'netlify-edge',
78
+ },
79
+ 'aws-lambda': {
80
+ nitroPreset: 'aws-lambda',
81
+ outputDir: '.output',
82
+ serverBundleDir: 'server',
83
+ supportsWaitUntil: false,
84
+ supportsEarlyHints: false,
85
+ runtimeName: 'aws-lambda',
86
+ },
87
+ 'deno-deploy': {
88
+ nitroPreset: 'deno-deploy',
89
+ outputDir: '.output',
90
+ serverBundleDir: 'server',
91
+ supportsWaitUntil: true,
92
+ supportsEarlyHints: false,
93
+ runtimeName: 'deno-deploy',
94
+ },
95
+ 'azure-functions': {
96
+ nitroPreset: 'azure-functions',
97
+ outputDir: '.output',
98
+ serverBundleDir: 'server',
99
+ supportsWaitUntil: false,
100
+ supportsEarlyHints: false,
101
+ runtimeName: 'azure-functions',
102
+ },
103
+ 'node-server': {
104
+ nitroPreset: 'node-server',
105
+ outputDir: '.output',
106
+ serverBundleDir: 'server',
107
+ supportsWaitUntil: true,
108
+ // Disabled by default: most node-server deployments sit behind a
109
+ // reverse proxy (nginx, caddy, traefik) that doesn't support 103
110
+ // Early Hints over HTTP/1.1. Sending 103 causes nginx to intermittently
111
+ // treat the response as an error and retry after proxy_connect_timeout
112
+ // (~5s stalls on ~23% of requests). Link headers on the 200 response
113
+ // are the safe fallback — Cloudflare and other CDNs convert them to
114
+ // 103 automatically at the edge (over HTTP/2+ to the browser).
115
+ supportsEarlyHints: false,
116
+ runtimeName: 'node-server',
117
+ },
118
+ 'bun': {
119
+ nitroPreset: 'bun',
120
+ outputDir: '.output',
121
+ serverBundleDir: 'server',
122
+ supportsWaitUntil: true,
123
+ // Disabled for same reason as node-server — reverse proxies choke on 103.
124
+ // Link headers on the 200 response are converted to 103 by CDNs.
125
+ supportsEarlyHints: false,
126
+ runtimeName: 'bun',
127
+ },
128
+ };
129
+
130
+ /** Presets that produce a locally-runnable server entry. */
131
+ export const LOCALLY_PREVIEWABLE = new Set<NitroPreset>(['node-server', 'bun']);
132
+
133
+ /**
134
+ * Get the preset configuration for a given preset name.
135
+ * @internal Exported for testing.
136
+ */
137
+ export function getPresetConfig(preset: NitroPreset): PresetConfig {
138
+ return PRESET_CONFIGS[preset];
139
+ }