@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
@@ -1,10 +1,22 @@
1
1
  /**
2
- * timber-mdx — Vite sub-plugin for MDX page rendering.
2
+ * timber-mdx — Vite sub-plugin for MDX and Markdown rendering.
3
3
  *
4
- * Wires @mdx-js/rollup into the Vite pipeline when MDX is activated.
4
+ * Wires vite-plugin-satteri into the Vite pipeline when MDX is activated.
5
5
  * MDX is activated when pageExtensions includes 'mdx' or 'md', or
6
6
  * when a content/ directory exists at the project root.
7
7
  *
8
+ * Satteri is a Rust-based Markdown/MDX compiler with a native Vite plugin:
9
+ * - `.mdx` files compile to React components (ES modules with real import
10
+ * statements, so @vitejs/plugin-rsc client-boundary detection works).
11
+ * - `.md` files compile to modules exporting a rendered HTML string.
12
+ * - Frontmatter (YAML/TOML) parses natively and is emitted as a
13
+ * `frontmatter` named export — no remark plugins needed.
14
+ * - GFM (tables, footnotes, strikethrough, task lists) is on by default.
15
+ *
16
+ * Extensibility is satteri's visitor-based plugin API (defineMdastPlugin /
17
+ * defineHastPlugin), not unified — the AST lives on the Rust side, so
18
+ * remark/rehype plugins cannot run. See design/20-content-collections.md.
19
+ *
8
20
  * Design doc: 20-content-collections.md §"The timber-mdx Plugin"
9
21
  */
10
22
 
@@ -13,9 +25,10 @@ import { existsSync } from 'node:fs';
13
25
  import { join } from 'node:path';
14
26
  import { createRequire } from 'node:module';
15
27
  import { pathToFileURL } from 'node:url';
16
- import type { PluginContext } from '../plugin-context.js';
28
+ import type { PluginContext } from '../plugin-context.ts';
29
+ import { MDX_EXTENSIONS } from '../server/utils/mdx-file.ts';
17
30
 
18
- const MDX_EXTENSIONS = ['mdx', 'md'];
31
+ const MDX_EXTENSIONS_UNDOTTED = [...MDX_EXTENSIONS].map((ext) => ext.slice(1));
19
32
 
20
33
  /**
21
34
  * Check if mdx-components.tsx (or .ts, .jsx, .js) exists at the project root
@@ -43,8 +56,14 @@ export function findMdxComponents(root: string): string | undefined {
43
56
  * Determine if MDX should be activated based on config and project structure.
44
57
  */
45
58
  function shouldActivate(ctx: PluginContext): boolean {
59
+ // Explicit opt-out — the escape hatch for apps that register their own
60
+ // MDX compiler (e.g. @mdx-js/rollup for the unified pipeline) in
61
+ // vite.config.ts. Without this, a content/ directory would force
62
+ // activation no matter what pageExtensions says.
63
+ if (ctx.config.mdx === false) return false;
64
+
46
65
  const exts = ctx.config.pageExtensions;
47
- if (exts && exts.some((ext) => MDX_EXTENSIONS.includes(ext))) {
66
+ if (exts && exts.some((ext) => MDX_EXTENSIONS_UNDOTTED.includes(ext))) {
48
67
  return true;
49
68
  }
50
69
 
@@ -61,13 +80,11 @@ function shouldActivate(ctx: PluginContext): boolean {
61
80
  *
62
81
  * Why this matters: pnpm only hoists declared (peer) dependencies into a
63
82
  * package's resolution scope. The MDX integration's optional companions
64
- * — `remark-frontmatter`, `remark-mdx-frontmatter`, `@mdx-js/rollup` — are
65
- * installed as direct deps of the consumer (e.g. `packages/website`), not
66
- * `@timber-js/app`. A bare `import('remark-frontmatter')` from inside this
67
- * file resolves against `packages/timber-app/node_modules` and silently
68
- * fails with `ERR_MODULE_NOT_FOUND`, which made `tryImport` return
69
- * `undefined` and skipped frontmatter parsing entirely — leaving MDX to
70
- * choke on YAML as JS expressions (TIM-840).
83
+ * — `vite-plugin-satteri` and `satteri` — are installed as direct deps of
84
+ * the consumer (e.g. `packages/website`), not `@timber-js/app`. A bare
85
+ * `import('vite-plugin-satteri')` from inside this file resolves against
86
+ * `packages/timber-app/node_modules` and silently fails with
87
+ * `ERR_MODULE_NOT_FOUND` (TIM-840).
71
88
  *
72
89
  * Resolving relative to `projectRoot` (via `createRequire`) makes the
73
90
  * lookup walk the consumer's `node_modules` tree first, which is where
@@ -106,9 +123,10 @@ async function tryImport(name: string, projectRoot: string): Promise<unknown | u
106
123
  * Create the timber-mdx Vite plugin.
107
124
  *
108
125
  * Uses the transform and resolveId hooks to delegate MDX compilation
109
- * to @mdx-js/rollup. The inner plugin is loaded lazily on first activation.
126
+ * to vite-plugin-satteri. The inner plugin is loaded lazily on first
127
+ * activation.
110
128
  *
111
- * Hooks: buildStart (loads @mdx-js/rollup), resolveId, load, transform
129
+ * Hooks: buildStart (loads vite-plugin-satteri), resolveId, load, transform
112
130
  */
113
131
  export function timberMdx(ctx: PluginContext): Plugin {
114
132
  let innerPlugin: Plugin | null = null;
@@ -116,50 +134,60 @@ export function timberMdx(ctx: PluginContext): Plugin {
116
134
  async function activate(): Promise<void> {
117
135
  if (innerPlugin !== null || !shouldActivate(ctx)) return;
118
136
 
119
- const createMdxPlugin = (await tryImport('@mdx-js/rollup', ctx.root)) as
137
+ // Satteri compiles .md to an HTML string, not a component — a page.md
138
+ // route would make the renderer invoke a string as a component and
139
+ // TypeError at request time. Fail at startup instead. Imported .md
140
+ // files work without listing 'md' in pageExtensions.
141
+ if (ctx.config.pageExtensions?.includes('md')) {
142
+ throw new Error(
143
+ [
144
+ "[timber] pageExtensions includes 'md', but .md route pages are not supported:",
145
+ 'Markdown files compile to HTML strings, not components.',
146
+ '',
147
+ "Use .mdx for pages (pageExtensions: ['tsx', 'ts', 'mdx']).",
148
+ '.md files can still be imported as HTML strings — no pageExtensions entry needed.',
149
+ ].join('\n')
150
+ );
151
+ }
152
+
153
+ const createSatteriPlugin = (await tryImport('vite-plugin-satteri', ctx.root)) as
120
154
  | ((options?: Record<string, unknown>) => Plugin)
121
155
  | undefined;
122
156
 
123
- if (!createMdxPlugin) {
157
+ if (!createSatteriPlugin) {
124
158
  throw new Error(
125
159
  [
126
- '[timber] MDX is enabled but @mdx-js/rollup is not installed.',
160
+ '[timber] MDX is enabled but vite-plugin-satteri is not installed.',
127
161
  '',
128
162
  'Install it:',
129
- ' pnpm add -D @mdx-js/rollup remark-frontmatter remark-mdx-frontmatter',
163
+ ' pnpm add -D vite-plugin-satteri satteri',
130
164
  '',
131
165
  'MDX is activated because pageExtensions includes "mdx"/"md" or a content/ directory exists.',
132
166
  ].join('\n')
133
167
  );
134
168
  }
135
169
 
136
- const mdxConfig = ctx.config.mdx ?? {};
137
-
138
- // Auto-register frontmatter plugins. Resolve from the consumer's root
139
- // so pnpm finds packages declared in the user's package.json (TIM-840).
140
- const remarkPlugins: unknown[] = [];
141
- const remarkFrontmatter = await tryImport('remark-frontmatter', ctx.root);
142
- const remarkMdxFrontmatter = await tryImport('remark-mdx-frontmatter', ctx.root);
143
- if (remarkFrontmatter) remarkPlugins.push(remarkFrontmatter);
144
- if (remarkMdxFrontmatter) remarkPlugins.push(remarkMdxFrontmatter);
145
-
146
- if (mdxConfig.remarkPlugins) {
147
- remarkPlugins.push(...mdxConfig.remarkPlugins);
148
- }
170
+ // `|| {}` (not `??`): mdx can be `false`, though shouldActivate() has
171
+ // already bailed in that case.
172
+ const mdxConfig = ctx.config.mdx || {};
149
173
 
150
- const mdxOptions: Record<string, unknown> = {
151
- remarkPlugins,
152
- rehypePlugins: mdxConfig.rehypePlugins ?? [],
153
- recmaPlugins: mdxConfig.recmaPlugins ?? [],
154
- remarkRehypeOptions: mdxConfig.remarkRehypeOptions,
155
- };
174
+ // We pass `development` explicitly (satteri otherwise infers it from
175
+ // Vite's command via its own configResolved hook, which we don't
176
+ // delegate) and control providerImportSource — the mdx-components.tsx
177
+ // convention belongs to the framework, not the user config.
178
+ const mdxOptions: Record<string, unknown> = { development: ctx.dev };
156
179
 
157
180
  const mdxComponentsPath = findMdxComponents(ctx.root);
158
181
  if (mdxComponentsPath) {
159
182
  mdxOptions.providerImportSource = mdxComponentsPath;
160
183
  }
161
184
 
162
- innerPlugin = createMdxPlugin(mdxOptions);
185
+ innerPlugin = createSatteriPlugin({
186
+ mdx: mdxOptions,
187
+ ...(mdxConfig.mdastPlugins ? { mdastPlugins: mdxConfig.mdastPlugins } : {}),
188
+ ...(mdxConfig.hastPlugins ? { hastPlugins: mdxConfig.hastPlugins } : {}),
189
+ ...(mdxConfig.features ? { features: mdxConfig.features } : {}),
190
+ });
163
191
  }
164
192
 
165
193
  return {
@@ -208,6 +236,13 @@ export function timberMdx(ctx: PluginContext): Plugin {
208
236
 
209
237
  async transform(code, id) {
210
238
  if (!innerPlugin) return null;
239
+ // Ids with a Vite query (?raw, ?url, ?import) are asset requests, not
240
+ // modules to compile. vite-plugin-satteri's id regexes match them, but
241
+ // by the time this transform runs the code is already the asset module
242
+ // (e.g. `export default "<file text>"` for ?raw) — compiling that as
243
+ // markdown corrupts it. @mdx-js/rollup matched by extname and skipped
244
+ // queried ids; preserve that behavior.
245
+ if (id.includes('?')) return null;
211
246
  const envName = (this as unknown as { environment?: { name?: string } }).environment?.name;
212
247
  if (envName && envName !== 'rsc') return null;
213
248
  if (typeof innerPlugin.transform === 'function') {
@@ -30,9 +30,9 @@ import { mkdir, rename, rm, writeFile } from 'node:fs/promises';
30
30
  import { dirname, join } from 'node:path';
31
31
  import { pathToFileURL } from 'node:url';
32
32
 
33
- import type { PluginContext } from '../plugin-context.js';
34
- import type { CaptureOptions, CaptureSummary, CapturedEntry } from '../server/prebuilt-builder.js';
35
- import type { PrebuiltManifest } from '../server/prebuilt/payload-source.js';
33
+ import type { PluginContext } from '../plugin-context.ts';
34
+ import type { CaptureOptions, CaptureSummary, CapturedEntry } from '../server/prebuilt-builder.ts';
35
+ import type { PrebuiltManifest } from '../server/prebuilt/payload-source.ts';
36
36
 
37
37
  // ─── Artifact writer ──────────────────────────────────────────────────────
38
38
 
@@ -12,7 +12,7 @@
12
12
  * would silently skip prerendering.
13
13
  */
14
14
 
15
- import type { CallExpressionNode, PositionedNode } from './callsite-ast.js';
15
+ import type { CallExpressionNode, PositionedNode } from './callsite-ast.ts';
16
16
 
17
17
  const EXPRESSION_WRAPPER_TYPES = new Set([
18
18
  'TSAsExpression',
@@ -61,16 +61,16 @@ import { readFileSync } from 'node:fs';
61
61
  import { relative } from 'node:path';
62
62
  import MagicString from 'magic-string';
63
63
  import type { Plugin } from 'vite';
64
- import type { PluginContext } from '../plugin-context.js';
65
- import type { SegmentNode } from '../routing/types.js';
64
+ import type { PluginContext } from '../plugin-context.ts';
65
+ import type { SegmentNode } from '../routing/types.ts';
66
66
  import {
67
67
  CACHE_MODULE_SOURCES,
68
68
  findImportBindings,
69
69
  generateStableCallsiteId,
70
- } from './callsite-ast.js';
71
- import { collectJsxUsages, recordCallSiteProps } from './callsite-jsx.js';
72
- import { mayPrerender, unwrapExpression } from './prebuilt-options-analysis.js';
73
- import { cleanPrebuiltDir, runPrebuiltCapture } from './prebuilt-capture.js';
70
+ } from './callsite-ast.ts';
71
+ import { collectJsxUsages, recordCallSiteProps } from './callsite-jsx.ts';
72
+ import { mayPrerender, unwrapExpression } from './prebuilt-options-analysis.ts';
73
+ import { cleanPrebuiltDir, runPrebuiltCapture } from './prebuilt-capture.ts';
74
74
  import type {
75
75
  CallExpressionNode,
76
76
  IdentifierNode,
@@ -78,7 +78,7 @@ import type {
78
78
  MemberExpressionNode,
79
79
  PositionedNode,
80
80
  ProgramNode,
81
- } from './callsite-ast.js';
81
+ } from './callsite-ast.ts';
82
82
 
83
83
  /**
84
84
  * Is this callee `cache.component` (named import, aliases included) or
@@ -11,11 +11,10 @@
11
11
  * `export const prerender` to descendant pages via most-specific-wins:
12
12
  * walk the segment tree from leaf to root, first explicit value wins.
13
13
  *
14
- * A layout that declares `export const prerender` is ALSO wrapped — the
15
- * layout's flight payload is its own static shell (`children` is a
16
- * separate component boundary), so caching it is natural (nav, sidebar,
17
- * footer benefit from build-time rendering). See design/45 §Layout
18
- * Propagation.
14
+ * Layout declarations are propagation policy only. Layouts receive the real
15
+ * descendant React element as `children` to preserve the server-layout
16
+ * containment boundary, so their props are not cache-keyable and the layout
17
+ * itself must not be registered for capture.
19
18
  *
20
19
  * This transform runs BEFORE timber-prebuilt so the generated
21
20
  * `cache.component(...)` call is picked up by the callsite rewrite.
@@ -23,9 +22,9 @@
23
22
 
24
23
  import MagicString from 'magic-string';
25
24
  import type { Plugin } from 'vite';
26
- import type { PluginContext } from '../plugin-context.js';
27
- import type { SegmentNode, RouteFile } from '../routing/types.js';
28
- import { getPrerenderExport, type PrerenderExportValue } from '../routing/export-detect.js';
25
+ import type { PluginContext } from '../plugin-context.ts';
26
+ import type { SegmentNode, RouteFile } from '../routing/types.ts';
27
+ import { getPrerenderExport, type PrerenderExportValue } from '../routing/export-detect.ts';
29
28
 
30
29
  interface AstNode {
31
30
  type: string;
@@ -39,16 +38,14 @@ interface AstNode {
39
38
 
40
39
  /**
41
40
  * Walk the segment tree and resolve the effective prerender value for
42
- * every page and layout. Returns a map from file path to resolved value.
41
+ * every page. Returns a map from page file path to resolved value.
43
42
  *
44
43
  * **Pages:** walk from leaf toward root; first explicit `export const prerender`
45
44
  * wins (page > nearest layout > ... > root layout). If none, dynamic.
46
45
  *
47
- * **Layouts:** a layout that declares `export const prerender` is wrapped
48
- * directly (its own shell is a separate component boundary from `children`).
49
- * Layouts without their own declaration are NOT wrapped — they don't
50
- * inherit from ancestors, because wrapping a layout's shell without the
51
- * author's explicit opt-in would cache content they may expect to be dynamic.
46
+ * **Layouts:** declarations propagate to descendant pages but layouts are not
47
+ * included in the result. Their real React-element `children` preserve secure
48
+ * containment and deliberately make child-independent layout caching invalid.
52
49
  */
53
50
  export function resolvePagePrerender(root: SegmentNode): Map<string, PrerenderExportValue> {
54
51
  const result = new Map<string, PrerenderExportValue>();
@@ -60,11 +57,6 @@ export function resolvePagePrerender(root: SegmentNode): Map<string, PrerenderEx
60
57
  const layoutValue = node.layout ? getPrerenderExport(node.layout.filePath) : undefined;
61
58
  const stack = layoutValue !== undefined ? [layoutValue, ...ancestorStack] : ancestorStack;
62
59
 
63
- // Wrap the layout itself if it declares prerender (truthy)
64
- if (node.layout && layoutValue !== undefined && layoutValue !== false) {
65
- result.set(node.layout.filePath, layoutValue);
66
- }
67
-
68
60
  if (node.page) {
69
61
  const pageValue = getPrerenderExport(node.page.filePath);
70
62
  // Page's own value takes priority; otherwise use nearest ancestor
@@ -23,7 +23,7 @@ import type {
23
23
  IdentifierNode,
24
24
  CallExpressionNode,
25
25
  MemberExpressionNode,
26
- } from '../callsite-ast.js';
26
+ } from '../callsite-ast.ts';
27
27
 
28
28
  /**
29
29
  * One module-graph edge introduced by an `import` or `export … from`.
@@ -24,14 +24,14 @@
24
24
  */
25
25
 
26
26
  import type { Plugin } from 'vite';
27
- import type { PluginContext } from '../../plugin-context.js';
28
- import type { ProgramNode } from '../callsite-ast.js';
29
- import { analyzeModule, usedSources, contributesNothing, type ModuleFacts } from './analysis.js';
30
- import { createOriginResolver, FRAMEWORK_SOURCES } from './origin.js';
31
-
32
- export type { ModuleFacts } from './analysis.js';
33
- export { analyzeModule, usedSources } from './analysis.js';
34
- export { createOriginResolver } from './origin.js';
27
+ import type { PluginContext } from '../../plugin-context.ts';
28
+ import type { ProgramNode } from '../callsite-ast.ts';
29
+ import { analyzeModule, usedSources, contributesNothing, type ModuleFacts } from './analysis.ts';
30
+ import { createOriginResolver, FRAMEWORK_SOURCES } from './origin.ts';
31
+
32
+ export type { ModuleFacts } from './analysis.ts';
33
+ export { analyzeModule, usedSources } from './analysis.ts';
34
+ export { createOriginResolver } from './origin.ts';
35
35
 
36
36
  // ─── Framework module detection ─────────────────────────────────────────
37
37
 
@@ -16,7 +16,7 @@
16
16
  * See design/19-client-navigation.md §"Why the slot comparison ignores the query".
17
17
  */
18
18
 
19
- import type { CalleeRef, ImportEdge, ModuleFacts } from './analysis.js';
19
+ import type { CalleeRef, ImportEdge, ModuleFacts } from './analysis.ts';
20
20
 
21
21
  // ─── What counts as a request accessor ───────────────────────────────────
22
22
 
@@ -10,17 +10,17 @@
10
10
 
11
11
  import type { Plugin, ViteDevServer } from 'vite';
12
12
  import { join } from 'node:path';
13
- import { scanRoutes } from '../routing/scanner.js';
14
- import { buildDirToRouteMap, type SegmentInfo } from '../routing/segment-codegen.js';
15
- import { writeRouteCodegen, flushCodegenWrites } from '../routing/codegen-write.js';
16
- import { validateSchemaAgainstRoutes } from '../routing/schema-validation.js';
17
- import { generateManifestModule, generateSchemaModule } from '../routing/manifest-codegen.js';
13
+ import { scanRoutes } from '../routing/scanner.ts';
14
+ import { buildDirToRouteMap, type SegmentInfo } from '../routing/segment-codegen.ts';
15
+ import { writeRouteCodegen, flushCodegenWrites } from '../routing/codegen-write.ts';
16
+ import { validateSchemaAgainstRoutes } from '../routing/schema-validation.ts';
17
+ import { generateManifestModule, generateSchemaModule } from '../routing/manifest-codegen.ts';
18
18
  import {
19
19
  lintConventions,
20
20
  checkAppDirExists,
21
21
  formatConventionWarnings,
22
- } from '../routing/convention-lint.js';
23
- import type { PluginContext } from '../plugin-context.js';
22
+ } from '../routing/convention-lint.ts';
23
+ import type { PluginContext } from '../plugin-context.ts';
24
24
 
25
25
  const VIRTUAL_MODULE_ID = 'virtual:timber-route-manifest';
26
26
  const RESOLVED_VIRTUAL_ID = `\0${VIRTUAL_MODULE_ID}`;
@@ -62,6 +62,11 @@ const ROUTE_FILE_PATTERNS =
62
62
  */
63
63
  function writeCodegen(ctx: PluginContext): void {
64
64
  if (!ctx.routeTree) return;
65
+ // The analyze crawl child only needs the route tree for
66
+ // classification — codegen writes are fire-and-forget and can be
67
+ // truncated by the child's process.exit, leaving partial .d.ts
68
+ // files on disk.
69
+ if (process.env.TIMBER_ANALYZE === '1') return;
65
70
  void writeRouteCodegen(ctx.routeTree, ctx.appDir, ctx.root).catch((err) => {
66
71
  console.warn('[timber] Failed to write codegen output:', err);
67
72
  });
@@ -13,6 +13,13 @@
13
13
 
14
14
  import { builtinModules } from 'node:module';
15
15
  import type { Plugin } from 'vite';
16
+ import { EXPLICIT_MARKERS } from '../analyze/poison-rules.ts';
17
+
18
+ // The poison-pill marker packages (server-only, client-only) must never be
19
+ // externalized — they have to reach the timber-shims resolveId hook so it
20
+ // can substitute the poison virtual modules. Derived from poison-rules.ts
21
+ // so the list cannot drift from what shims.ts intercepts.
22
+ const POISON_MARKER_SPECIFIERS = EXPLICIT_MARKERS.map((m) => m.specifier);
16
23
 
17
24
  // Every Node built-in as both bare (`stream`) and prefixed (`node:stream`).
18
25
  // Available at runtime on all targets (Node natively, Workers via nodejs_compat).
@@ -43,7 +50,8 @@ const BUILD_ONLY_EXTERNALS: string[] = [
43
50
  'vite',
44
51
  'nitro',
45
52
  'rollup',
46
- '@mdx-js/rollup',
53
+ 'vite-plugin-satteri',
54
+ 'satteri',
47
55
  'fsevents',
48
56
  'chokidar',
49
57
  ];
@@ -79,12 +87,12 @@ export function timberServerBundle(): Plugin[] {
79
87
  environments: {
80
88
  rsc: {
81
89
  resolve: {
82
- noExternal: ['server-only', 'client-only'],
90
+ noExternal: [...POISON_MARKER_SPECIFIERS],
83
91
  },
84
92
  },
85
93
  ssr: {
86
94
  resolve: {
87
- noExternal: ['server-only', 'client-only', 'nuqs'],
95
+ noExternal: [...POISON_MARKER_SPECIFIERS, 'nuqs'],
88
96
  },
89
97
  },
90
98
  },
@@ -17,7 +17,8 @@
17
17
  import type { Plugin } from 'vite';
18
18
  import { resolve, dirname } from 'node:path';
19
19
  import { fileURLToPath } from 'node:url';
20
- import type { PluginContext } from '../plugin-context.js';
20
+ import type { PluginContext } from '../plugin-context.ts';
21
+ import { EXPLICIT_MARKERS, markerFor, poisonPillSource } from '../analyze/poison-rules.ts';
21
22
 
22
23
  const __dirname = dirname(fileURLToPath(import.meta.url));
23
24
  // Detect whether we're running from source (src/plugins/) or dist (dist/).
@@ -30,14 +31,13 @@ const PKG_ROOT = __dirname.endsWith('plugins')
30
31
  const SHIMS_DIR = resolve(PKG_ROOT, 'src', 'shims');
31
32
 
32
33
  /**
33
- * Virtual module IDs for server-only and client-only poison pills.
34
- *
35
- * These packages cause build errors when imported in the wrong environment:
36
- * - `server-only` errors when imported in a client component
37
- * - `client-only` errors when imported in a server component
34
+ * The server-only marker's virtual ID, needed directly by the
35
+ * `#server-only-guard` resolution branch below. All poison-pill rules
36
+ * (specifiers, virtual IDs, error messages, environment policy) live in
37
+ * analyze/poison-rules.ts — the single source of truth shared with the
38
+ * `timber graph` reporter (design/47 §3).
38
39
  */
39
- const SERVER_ONLY_VIRTUAL = '\0timber:server-only';
40
- const CLIENT_ONLY_VIRTUAL = '\0timber:client-only';
40
+ const SERVER_ONLY_VIRTUAL = markerFor('server-only').virtualId;
41
41
 
42
42
  /**
43
43
  * Map from @timber-js/app/<subpath> to relative src/ file paths.
@@ -191,8 +191,9 @@ export function timberShims(_ctx: PluginContext): Plugin {
191
191
  */
192
192
  resolveId(id: string) {
193
193
  // Poison pill packages — resolve to virtual modules handled by load()
194
- if (id === 'server-only') return SERVER_ONLY_VIRTUAL;
195
- if (id === 'client-only') return CLIENT_ONLY_VIRTUAL;
194
+ for (const marker of EXPLICIT_MARKERS) {
195
+ if (id === marker.specifier) return marker.virtualId;
196
+ }
196
197
 
197
198
  const cleanId = stripJsExtension(id);
198
199
 
@@ -351,28 +352,12 @@ export function timberShims(_ctx: PluginContext): Plugin {
351
352
  */
352
353
  load(id: string) {
353
354
  const env = envName(this);
354
- const isClient = env === 'client';
355
-
356
- if (id === SERVER_ONLY_VIRTUAL) {
357
- if (isClient) {
358
- return `throw new Error(
359
- "This module cannot be imported from a Client Component module. " +
360
- "It should only be used from a Server Component."
361
- );`;
362
- }
363
- // No-op in server environments (rsc, ssr)
364
- return 'export {};';
365
- }
366
355
 
367
- if (id === CLIENT_ONLY_VIRTUAL) {
368
- if (!isClient) {
369
- return `throw new Error(
370
- "This module cannot be imported from a Server Component module. " +
371
- "It should only be used from a Client Component."
372
- );`;
373
- }
374
- // No-op in client environment
375
- return 'export {};';
356
+ // Poison pill bodies — a top-level throw in the wrong environment,
357
+ // a no-op in the right one. Behavior (which environments throw, and
358
+ // the exact message) is defined entirely by poison-rules.ts.
359
+ for (const marker of EXPLICIT_MARKERS) {
360
+ if (id === marker.virtualId) return poisonPillSource(marker, env);
376
361
  }
377
362
 
378
363
  // Error module for @timber-js/app/server in client environment.
@@ -14,25 +14,25 @@ import { mkdir, readdir, readFile, writeFile, rename, rm, stat } from 'node:fs/p
14
14
  import { createHash, randomUUID } from 'node:crypto';
15
15
  import { dirname, extname, isAbsolute, join, resolve, relative } from 'node:path';
16
16
  import { pathToFileURL } from 'node:url';
17
- import type { PluginContext } from '../plugin-context.js';
17
+ import type { PluginContext } from '../plugin-context.ts';
18
18
  import type {
19
19
  StaticGenerationOptions,
20
20
  StaticGenerationSummary,
21
21
  StaticPageEntry,
22
22
  StaticRedirectEntry,
23
- } from '../server/static-generator.js';
24
- import { mergeRscAssetsManifest } from './adapter-build.js';
25
- import { isRelativeBase, normalizeBasePath, withBasePath } from '../shared/base-path.js';
26
- import type { RscManifest, RscManifestEntry } from '../shared/rsc-manifest.js';
27
- import { htmlEscapeJsonString } from '../server/flight-scripts.js';
28
- import { rscPayloadPath } from '../shared/rsc-payload-path.js';
29
- import { REDIRECTS_FILE, RESERVED_OUTPUT_PATHS } from '../shared/static-platform-files.js';
23
+ } from '../server/static-generator.ts';
24
+ import { mergeRscAssetsManifest } from './adapter-build.ts';
25
+ import { isRelativeBase, normalizeBasePath, withBasePath } from '../shared/base-path.ts';
26
+ import type { RscManifest, RscManifestEntry } from '../shared/rsc-manifest.ts';
27
+ import { htmlEscapeJsonString } from '../server/flight-scripts.ts';
28
+ import { rscPayloadPath } from '../shared/rsc-payload-path.ts';
29
+ import { REDIRECTS_FILE, RESERVED_OUTPUT_PATHS } from '../shared/static-platform-files.ts';
30
30
  import {
31
31
  detectFsIdentity,
32
32
  fsKey,
33
33
  EXACT_FS_IDENTITY,
34
34
  type FsIdentity,
35
- } from '../adapters/fs-identity.js';
35
+ } from '../adapters/fs-identity.ts';
36
36
 
37
37
  // ---------------------------------------------------------------------------
38
38
  // Types
@@ -45,7 +45,7 @@ import {
45
45
  */
46
46
  // Declared in shared/rsc-manifest.ts so the client that reads this manifest and
47
47
  // the build that writes it cannot drift. Re-exported for existing importers.
48
- export type { RscManifestEntry, RscManifest } from '../shared/rsc-manifest.js';
48
+ export type { RscManifestEntry, RscManifest } from '../shared/rsc-manifest.ts';
49
49
 
50
50
  export interface StaticValidationError {
51
51
  type: 'dynamic-api';
@@ -7,7 +7,7 @@
7
7
  */
8
8
 
9
9
  import { relative, posix } from 'node:path';
10
- import type { ParamEntry } from './codegen-types.js';
10
+ import type { ParamEntry } from './codegen-types.ts';
11
11
 
12
12
  /**
13
13
  * Compute a relative import specifier for a codec/page file, stripping
@@ -17,9 +17,9 @@
17
17
 
18
18
  import { writeFile, mkdir } from 'node:fs/promises';
19
19
  import { join } from 'node:path';
20
- import { generateRouteMap } from './codegen.js';
21
- import { writeSegmentTypes } from './segment-codegen.js';
22
- import type { RouteTree } from './types.js';
20
+ import { generateRouteMap } from './codegen.ts';
21
+ import { writeSegmentTypes } from './segment-codegen.ts';
22
+ import type { RouteTree } from './types.ts';
23
23
 
24
24
  /**
25
25
  * Path (relative to the project root) of the generated route map declaration
@@ -10,11 +10,11 @@
10
10
 
11
11
  import { existsSync } from 'node:fs';
12
12
  import { join, relative } from 'node:path';
13
- import type { RouteTree, SegmentNode } from './types.js';
14
- import type { ParamEntry, RouteEntry } from './codegen-types.js';
15
- import { buildSchemaParamType } from './codegen-shared.js';
16
- import { effectiveUrlSegment, type UrlSegmentIdentity } from './segment-classify.js';
17
- import { formatLinkCatchAllOverloads, formatTypedLinkOverloads } from './link-codegen.js';
13
+ import type { RouteTree, SegmentNode } from './types.ts';
14
+ import type { ParamEntry, RouteEntry } from './codegen-types.ts';
15
+ import { buildSchemaParamType } from './codegen-shared.ts';
16
+ import { effectiveUrlSegment, type UrlSegmentIdentity } from './segment-classify.ts';
17
+ import { formatLinkCatchAllOverloads, formatTypedLinkOverloads } from './link-codegen.ts';
18
18
 
19
19
  /** Options for route map generation. */
20
20
  export interface CodegenOptions {
@@ -325,6 +325,15 @@ function formatDeclarationFile(
325
325
  lines.push('}');
326
326
  lines.push('');
327
327
  }
328
+ // Guard: detect when the schema or params imports silently degraded to
329
+ // `any` because TypeScript could not resolve the import specifier.
330
+ // In a .d.ts an unresolved import does NOT error — every downstream
331
+ // type silently becomes `any`, which satisfies every assertion. Only
332
+ // an explicit IsAny check catches it.
333
+ lines.push('type _IsAny<T> = 0 extends 1 & T ? true : false;');
334
+ lines.push('type _AssertSchemaNotAny<_T extends false = _IsAny<typeof schema>> = true;');
335
+ lines.push('type _AssertCodecTypeNotAny<_T extends false = _IsAny<SegmentParamCodec>> = true;');
336
+ lines.push('');
328
337
  // Type-level validation: each schema value must be a Codec or Standard Schema.
329
338
  // Running `pnpm run typecheck` will surface errors for invalid values.
330
339
  lines.push('type _AssertSchemaValues = {');
@@ -41,13 +41,13 @@
41
41
  * See design/07-routing.md §"Comparing Routes by the URLs They Match".
42
42
  */
43
43
 
44
- import type { SegmentNode } from './types.js';
45
- import { effectiveUrlSegment } from './segment-classify.js';
44
+ import type { SegmentNode } from './types.ts';
45
+ import { effectiveUrlSegment } from './segment-classify.ts';
46
46
  // The validators ask the real matcher which page answers a URL rather than
47
47
  // modelling its precedence rules a second time. `tree-match.ts` is a pure
48
48
  // walker over `SegmentNode` with no request-time state, and
49
49
  // `server/chain-url-parts.ts` already imports the other direction.
50
- import { matchUrlParts } from '../server/tree-match.js';
50
+ import { matchUrlParts } from '../server/tree-match.ts';
51
51
 
52
52
  /** One page-or-route-bearing node in a collision space. */
53
53
  export interface ProbeLeaf {
@@ -11,9 +11,9 @@
11
11
  * See design/07-routing.md §"Route Collisions".
12
12
  */
13
13
 
14
- import type { SegmentNode } from './types.js';
15
- import { computeInterceptedUrlBase } from './interception.js';
16
- import { findOrderDependentCollision, type ProbeLeaf } from './collision-probe.js';
14
+ import type { SegmentNode } from './types.ts';
15
+ import { computeInterceptedUrlBase } from './interception.ts';
16
+ import { findOrderDependentCollision, type ProbeLeaf } from './collision-probe.ts';
17
17
 
18
18
  /**
19
19
  * Validate that no two pages/routes in one collision space answer the same URL.