@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,17 +17,17 @@
17
17
  * Design doc: 07-routing.md, 10-error-handling.md
18
18
  */
19
19
 
20
- import { existsSync } from 'node:fs';
21
- import type { RouteFile, RouteTree, SegmentNode } from './types.js';
22
- import { swallow } from '../server/logger.js';
23
- import { isMdxFilePath } from '../server/utils/mdx-file.js';
20
+ import { existsSync, readFileSync } from 'node:fs';
21
+ import type { RouteFile, RouteTree, SegmentNode } from './types.ts';
22
+ import { swallow } from '../server/logger.ts';
23
+ import { isMdxFilePath } from '../server/utils/mdx-file.ts';
24
24
  import {
25
25
  fileDefaultExportIsLocalValue,
26
26
  fileHasAnyExport,
27
27
  fileHasDefaultExport,
28
28
  fileHasDirective,
29
29
  fileHasStarExport,
30
- } from './export-detect.js';
30
+ } from './export-detect.ts';
31
31
 
32
32
  // ─── Types ──────────────────────────────────────────────────────────────────
33
33
 
@@ -69,15 +69,56 @@ export function lintConventions(tree: RouteTree, appDir: string): ConventionWarn
69
69
  // Check 5: page.tsx / layout.tsx without default export
70
70
  checkDefaultExports(tree.root, warnings);
71
71
 
72
- // Check 6: error.tsx / 404.tsx / 4xx.tsx / … without 'use client' directive
72
+ // Check 6: Client layouts cannot suppress server children before Flight
73
+ // serializes them. They remain valid UI boundaries, but not authorization
74
+ // or data-hiding boundaries.
75
+ checkClientLayouts(tree.root, warnings);
76
+
77
+ // Check 7: error.tsx / 404.tsx / 4xx.tsx / … without 'use client' directive
73
78
  checkClientBoundaryFiles(tree.root, warnings);
74
79
  if (tree.globalError) {
75
80
  checkFileUseClientDirective(tree.globalError, 'global-error', warnings);
76
81
  }
77
82
 
83
+ // Check 8: Wildcard MDX status files (4xx.mdx, 5xx.mdx, error.mdx) that
84
+ // reference `props` — props resolve on deny and throw paths but are empty
85
+ // on the boundary path. See design/10-error-handling.md §"MDX Props by Path".
86
+ checkWildcardMdxProps(tree.root, warnings);
87
+
78
88
  return warnings;
79
89
  }
80
90
 
91
+ function checkClientLayouts(node: SegmentNode, warnings: ConventionWarning[]): void {
92
+ if (node.layout && isScriptExtension(node.layout.extension)) {
93
+ try {
94
+ const isClient = fileHasDirective(node.layout.filePath, 'use client');
95
+ const isProvablyServer = fileDefaultExportIsLocalValue(node.layout.filePath);
96
+ if (isClient || !isProvablyServer) {
97
+ const certainty = isClient
98
+ ? `This layout is a client component.`
99
+ : `Timber cannot prove this layout is a server component because its default export comes from another module or an opaque expression.`;
100
+ warnings.push({
101
+ id: `CLIENT_LAYOUT_NOT_AUTH_BOUNDARY:${node.layout.filePath}`,
102
+ summary: isClient
103
+ ? `Client layout cannot securely suppress server children: ${node.layout.filePath}`
104
+ : `Layout may resolve to a client component and cannot be trusted as an auth boundary: ${node.layout.filePath}`,
105
+ details:
106
+ ` File: ${node.layout.filePath}\n\n` +
107
+ ` ${certainty}\n` +
108
+ ` React Flight resolves server content passed to a client layout before the layout runs in the browser.\n` +
109
+ ` Conditionally omitting children here does not prevent descendant server components from executing or being serialized.\n\n` +
110
+ ` To fix: Put authorization in access.ts or a provably server layout with a locally defined default component, and keep client components inside that boundary.\n`,
111
+ level: 'warn',
112
+ });
113
+ }
114
+ } catch (err) {
115
+ swallow(err, `convention-lint: unreadable layout file ${node.layout.filePath}`);
116
+ }
117
+ }
118
+ for (const child of node.children) checkClientLayouts(child, warnings);
119
+ for (const slot of Object.values(node.slots)) checkClientLayouts(slot, warnings);
120
+ }
121
+
81
122
  // ─── Check: Empty App ───────────────────────────────────────────────────────
82
123
 
83
124
  /**
@@ -408,6 +449,95 @@ function checkFileUseClientDirective(
408
449
  });
409
450
  }
410
451
 
452
+ // ─── Check: Wildcard MDX Props ──────────────────────────────────────────────
453
+
454
+ /**
455
+ * Wildcard status file keys in `statusFiles` whose props differ by path.
456
+ * `error` is not here — the scanner stores it in `node.error`, not
457
+ * `node.statusFiles`, and the check handles it separately below.
458
+ */
459
+ const WILDCARD_MDX_STATUS_KEYS = new Set(['4xx', '5xx']);
460
+
461
+ /**
462
+ * Warn when a wildcard MDX status file (`4xx.mdx`, `5xx.mdx`, `error.mdx`)
463
+ * appears to reference `props` in its source.
464
+ *
465
+ * These files are pre-rendered into `fallbackElement` on the error-boundary
466
+ * path, before the error happens, so they receive empty or partial props.
467
+ * On the deny and error-renderer paths they receive the real props. An author
468
+ * writing `{props.status}` gets the number on some paths and `undefined` on
469
+ * others — same source, different output.
470
+ *
471
+ * A text scan for `props` is acceptable here because the check is `level:
472
+ * 'warn'` — a false positive costs a printed line, not a refused build. A
473
+ * sound check would need the MDX compiler, which is optional, async, and
474
+ * scoped to the RSC environment. See TIM-1333.
475
+ *
476
+ * Exact-code MDX files (e.g. `503.mdx`) are unaffected — all four paths
477
+ * agree on their status.
478
+ */
479
+ function checkWildcardMdxProps(node: SegmentNode, warnings: ConventionWarning[]): void {
480
+ if (node.statusFiles) {
481
+ for (const [key, file] of Object.entries(node.statusFiles)) {
482
+ if (WILDCARD_MDX_STATUS_KEYS.has(key) && isMdxFilePath(file.filePath)) {
483
+ checkMdxFileForProps(file.filePath, key, warnings);
484
+ }
485
+ }
486
+ }
487
+ if (node.error && isMdxFilePath(node.error.filePath)) {
488
+ checkMdxFileForProps(node.error.filePath, 'error', warnings);
489
+ }
490
+
491
+ for (const child of node.children) {
492
+ checkWildcardMdxProps(child, warnings);
493
+ }
494
+ for (const slot of Object.values(node.slots)) {
495
+ checkWildcardMdxProps(slot, warnings);
496
+ }
497
+ }
498
+
499
+ /**
500
+ * Check if an MDX file's source appears to reference `props`.
501
+ *
502
+ * MDX passes a `props` object to the default export function. A reference to
503
+ * `props.status` or `props.dangerouslyPassData` in a wildcard file works on
504
+ * the deny/throw paths but renders `undefined` on the boundary path.
505
+ */
506
+ function checkMdxFileForProps(
507
+ filePath: string,
508
+ convention: string,
509
+ warnings: ConventionWarning[]
510
+ ): void {
511
+ let source: string;
512
+ try {
513
+ source = readFileSync(filePath, 'utf-8');
514
+ } catch {
515
+ return;
516
+ }
517
+
518
+ // MDX exposes props via the default export: export default function(props) { ... }
519
+ // and via JSX expressions: {props.status}. A text scan is intentionally
520
+ // broad — false positives are cheap at warn level.
521
+ if (!/\bprops\b/.test(source)) return;
522
+
523
+ const label = `${convention}.${filePath.endsWith('.md') ? 'md' : 'mdx'}`;
524
+ warnings.push({
525
+ id: `MDX_WILDCARD_PROPS:${filePath}`,
526
+ summary: `${label} references props, which are empty on the error boundary path: ${filePath}`,
527
+ details:
528
+ ` File: ${filePath}\n\n` +
529
+ ` Wildcard MDX status files (${convention}.mdx) are pre-rendered into\n` +
530
+ ' fallbackElement before the error occurs. On that path, props are\n' +
531
+ ` empty${convention === 'error' ? '' : ' (no status, no dangerouslyPassData)'}. On the deny() and error-renderer\n` +
532
+ ' paths, props.status resolves correctly.\n\n' +
533
+ ' If this file uses only static content and "props" appears in prose,\n' +
534
+ ' this warning is a false positive — ignore it.\n\n' +
535
+ ' To fix: Use only static content in wildcard MDX status files, or\n' +
536
+ ' use an exact-code file (e.g. 404.mdx) where all paths agree.\n',
537
+ level: 'warn',
538
+ });
539
+ }
540
+
411
541
  // ─── Check: App Directory Exists ────────────────────────────────────────────
412
542
 
413
543
  /**
@@ -8,7 +8,7 @@
8
8
 
9
9
  import { existsSync } from 'node:fs';
10
10
  import { parseAst } from 'vite';
11
- import { readFileCached } from './file-cache.js';
11
+ import { readFileCached } from './file-cache.ts';
12
12
 
13
13
  interface AstNode {
14
14
  type: string;
@@ -1,6 +1,6 @@
1
- export { scanRoutes } from './scanner.js';
2
- export { generateRouteMap } from './codegen.js';
3
- export type { CodegenOptions } from './codegen.js';
1
+ export { scanRoutes } from './scanner.ts';
2
+ export { generateRouteMap } from './codegen.ts';
3
+ export type { CodegenOptions } from './codegen.ts';
4
4
  export type {
5
5
  RouteTree,
6
6
  SegmentNode,
@@ -8,16 +8,16 @@ export type {
8
8
  RouteFile,
9
9
  ScannerConfig,
10
10
  InterceptionMarker,
11
- } from './types.js';
12
- export { DEFAULT_PAGE_EXTENSIONS, INTERCEPTION_MARKERS } from './types.js';
13
- export { collectInterceptionRewrites } from './interception.js';
14
- export type { InterceptionRewrite } from './interception.js';
15
- export { classifyUrlSegment, classifySegment } from './segment-classify.js';
16
- export type { UrlSegment, SegmentClassification } from './segment-classify.js';
17
- export { collectLeafRoutes } from './walkers.js';
18
- export type { LeafRoute, CollectLeafRoutesOptions } from './walkers.js';
11
+ } from './types.ts';
12
+ export { DEFAULT_PAGE_EXTENSIONS, INTERCEPTION_MARKERS } from './types.ts';
13
+ export { collectInterceptionRewrites } from './interception.ts';
14
+ export type { InterceptionRewrite } from './interception.ts';
15
+ export { classifyUrlSegment, classifySegment } from './segment-classify.ts';
16
+ export type { UrlSegment, SegmentClassification } from './segment-classify.ts';
17
+ export { collectLeafRoutes } from './walkers.ts';
18
+ export type { LeafRoute, CollectLeafRoutesOptions } from './walkers.ts';
19
19
  export {
20
20
  validateSchemaAgainstRoutes,
21
21
  collectDynamicSegmentsFromTree,
22
- } from './schema-validation.js';
23
- export type { SchemaWarning } from './schema-validation.js';
22
+ } from './schema-validation.ts';
23
+ export type { SchemaWarning } from './schema-validation.ts';
@@ -17,13 +17,13 @@
17
17
  * See design/07-routing.md §"Intercepting Routes"
18
18
  */
19
19
 
20
- import type { SegmentNode, InterceptionMarker, RouteFile } from './types.js';
21
- import { computeSegmentTreePaths, treePathDepth } from './segment-keys.js';
22
- import { classifyUrlSegment, effectiveUrlSegment } from './segment-classify.js';
20
+ import type { SegmentNode, InterceptionMarker, RouteFile } from './types.ts';
21
+ import { computeSegmentTreePaths, treePathDepth } from './segment-keys.ts';
22
+ import { classifyUrlSegment, effectiveUrlSegment } from './segment-classify.ts';
23
23
  // Every collision space — the main tree, each slot, each intercepting subtree
24
24
  // — decides order-dependence with the same oracle, so the spaces cannot drift
25
25
  // on what counts as two pages answering one URL. See TIM-1308.
26
- import { findOrderDependentCollision, type ProbeLeaf } from './collision-probe.js';
26
+ import { findOrderDependentCollision, type ProbeLeaf } from './collision-probe.ts';
27
27
 
28
28
  /** Fields shared by both interception shapes. */
29
29
  interface InterceptionRewriteBase {
@@ -505,6 +505,42 @@ function assertInterceptedCatchAllsAreTerminal(node: SegmentNode, nodePath: stri
505
505
  }
506
506
  }
507
507
 
508
+ /**
509
+ * Reject a `route.ts` anywhere inside an intercepting subtree.
510
+ *
511
+ * An interception is a soft-navigation variant of a page — it swaps which
512
+ * page component renders. A route handler returns a `Response` and cannot
513
+ * be an interception target: `walkInterceptedLeaves` visits `node.page`
514
+ * only, so no rewrite is emitted for it, but `isTerminal` in
515
+ * `tree-match.ts` counts both `page` and `route`, so `matchUrlParts` can
516
+ * resolve to the route handler. `slot-interception.ts` then drops the
517
+ * match (`if (!leaf.page) continue`), silently disabling the page's
518
+ * interception. Fail-safe (the canonical route renders) but silent.
519
+ *
520
+ * The walk mirrors `assertInterceptedCatchAllsAreTerminal`: it descends
521
+ * `children` (not `slots`), matching `collectLeavesWithRewrites` exactly.
522
+ */
523
+ function assertNoRouteHandlersInSubtree(node: SegmentNode, nodePath: string): void {
524
+ if (node.route) {
525
+ throw new Error(
526
+ `Build error: route handler inside an intercepting route.\n` +
527
+ ` File: ${node.route.filePath}\n` +
528
+ ` Directory: app/${nodePath}\n` +
529
+ `An intercepting subtree renders a page component on soft navigation — a ` +
530
+ `route handler returns a Response and cannot be an interception target. ` +
531
+ `The route handler would silently shadow the interception: the resolver ` +
532
+ `would match it and then discard it because it has no page, so the modal ` +
533
+ `would stop opening with no diagnostic.\n` +
534
+ `Remove the route.ts, or move it outside the intercepting subtree.\n` +
535
+ `See design/07-routing.md §"Intercepting Routes".`
536
+ );
537
+ }
538
+
539
+ for (const child of node.children) {
540
+ assertNoRouteHandlersInSubtree(child, `${nodePath}/${child.segmentName}`);
541
+ }
542
+ }
543
+
508
544
  /**
509
545
  * Reject two pages that answer one URL among the interceptors an owner
510
546
  * resolves in a single walk.
@@ -723,6 +759,7 @@ function walkForPlacement(node: SegmentNode, path: string, ctx: PlacementContext
723
759
  // interception. The same input rewrite generation bases from.
724
760
  assertInterceptedBaseIsCountable(child, node.urlPath, childPath);
725
761
  assertInterceptedCatchAllsAreTerminal(child, childPath);
762
+ assertNoRouteHandlersInSubtree(child, childPath);
726
763
  }
727
764
 
728
765
  walkForPlacement(child, childPath, {
@@ -23,9 +23,9 @@
23
23
  * overload TS reports against on failure.
24
24
  */
25
25
 
26
- import type { ParamEntry, RouteEntry } from './codegen-types.js';
27
- import { buildSchemaParamType } from './codegen-shared.js';
28
- import { classifyUrlSegment } from './segment-classify.js';
26
+ import type { ParamEntry, RouteEntry } from './codegen-types.ts';
27
+ import { buildSchemaParamType } from './codegen-shared.ts';
28
+ import { classifyUrlSegment } from './segment-classify.ts';
29
29
 
30
30
  /**
31
31
  * The `searchParams` prop type, emitted identically on every Link variant
@@ -10,8 +10,8 @@
10
10
 
11
11
  import { existsSync } from 'node:fs';
12
12
  import { join } from 'node:path';
13
- import { collectInterceptionRewrites } from './interception.js';
14
- import type { RouteTree, SegmentNode, RouteFile } from './types.js';
13
+ import { collectInterceptionRewrites } from './interception.ts';
14
+ import type { RouteTree, SegmentNode, RouteFile } from './types.ts';
15
15
 
16
16
  // ── Single-file conventions ─────────────────────────────────────────────
17
17
  // Each entry maps to a node property that holds a single RouteFile.
@@ -17,15 +17,15 @@ import type {
17
17
  RouteFile,
18
18
  ScannerConfig,
19
19
  InterceptionMarker,
20
- } from './types.js';
21
- import { classifySegment, effectiveUrlSegment } from './segment-classify.js';
22
- import { validateInterceptionPlacement, computeInterceptedBase } from './interception.js';
23
- import { validateRouteGroupCollisions } from './collision-spaces.js';
24
- import { validateSlotPlacement } from './slot-placement.js';
25
- import { DEFAULT_PAGE_EXTENSIONS } from './types.js';
26
- import { classifyMetadataRoute, isDynamicMetadataExtension } from '../server/metadata-routes.js';
27
- import { swallow } from '../server/logger.js';
28
- import { ENCODED_SEPARATOR_RE, NULL_BYTE_RE } from '../server/canonicalize.js';
20
+ } from './types.ts';
21
+ import { classifySegment, effectiveUrlSegment } from './segment-classify.ts';
22
+ import { validateInterceptionPlacement, computeInterceptedBase } from './interception.ts';
23
+ import { validateRouteGroupCollisions } from './collision-spaces.ts';
24
+ import { validateSlotPlacement } from './slot-placement.ts';
25
+ import { DEFAULT_PAGE_EXTENSIONS } from './types.ts';
26
+ import { classifyMetadataRoute, isDynamicMetadataExtension } from '../server/metadata-routes.ts';
27
+ import { swallow } from '../server/logger.ts';
28
+ import { ENCODED_SEPARATOR_RE, NULL_BYTE_RE } from '../server/canonicalize.ts';
29
29
 
30
30
  /**
31
31
  * File convention names that use pageExtensions (can be .tsx, .ts, .jsx, .js, .mdx, etc.)
@@ -44,6 +44,30 @@ const FIXED_CONVENTIONS = new Set(['middleware', 'access', 'route']);
44
44
  */
45
45
  const STATUS_CODE_PATTERN = /^(\d{3}|[45]xx)$/;
46
46
 
47
+ /**
48
+ * Whether a basename + extension pair is a route-convention file the
49
+ * framework itself imports: page/layout/error/default/denied and
50
+ * global-error on pageExtensions, middleware/access/route/proxy on
51
+ * .ts/.tsx/.js/.jsx only, and status-code files (404, 4xx, …) on
52
+ * pageExtensions or .json — mirroring this scanner's own recognition
53
+ * rules per family.
54
+ *
55
+ * Exported for the analyze classifier so its provisional classification
56
+ * (design/47 §2) derives from the scanner's real conventions instead of
57
+ * a duplicate list that can drift.
58
+ */
59
+ export function isRouteConventionFile(
60
+ base: string,
61
+ ext: string,
62
+ pageExtensions: readonly string[] = DEFAULT_PAGE_EXTENSIONS
63
+ ): boolean {
64
+ const isPageExt = pageExtensions.includes(ext);
65
+ if ((PAGE_EXT_CONVENTIONS.has(base) || base === 'global-error') && isPageExt) return true;
66
+ if ((FIXED_CONVENTIONS.has(base) || base === 'proxy') && /^[jt]sx?$/.test(ext)) return true;
67
+ if (STATUS_CODE_PATTERN.test(base) && (isPageExt || ext === 'json')) return true;
68
+ return false;
69
+ }
70
+
47
71
  /**
48
72
  * Scan the app/ directory and build the route tree.
49
73
  *
@@ -7,10 +7,10 @@
7
7
  * Design doc: design/41-global-params.md
8
8
  */
9
9
 
10
- import { readFileCached } from './file-cache.js';
11
- import type { RouteTree, SegmentNode } from './types.js';
12
- import { findSchemaFile, parseExistingSchemaKeys } from '../cli-schema-sync.js';
13
- import { classifyUrlSegment } from './segment-classify.js';
10
+ import { readFileCached } from './file-cache.ts';
11
+ import type { RouteTree, SegmentNode } from './types.ts';
12
+ import { findSchemaFile, parseExistingSchemaKeys } from '../cli-schema-sync.ts';
13
+ import { classifyUrlSegment } from './segment-classify.ts';
14
14
 
15
15
  export interface SchemaWarning {
16
16
  type: 'stale-key' | 'missing-key' | 'bracket-mismatch';
@@ -22,8 +22,8 @@
22
22
  * See design/07-routing.md §"Route Segments"
23
23
  */
24
24
 
25
- import type { InterceptionMarker, SegmentType } from './types.js';
26
- import { INTERCEPTION_MARKERS } from './types.js';
25
+ import type { InterceptionMarker, SegmentType } from './types.ts';
26
+ import { INTERCEPTION_MARKERS } from './types.ts';
27
27
 
28
28
  export type UrlSegment =
29
29
  | { kind: 'static'; value: string }
@@ -10,7 +10,7 @@
10
10
 
11
11
  import { writeFile, mkdir } from 'node:fs/promises';
12
12
  import { join } from 'node:path';
13
- import type { RouteTree, SegmentNode } from './types.js';
13
+ import type { RouteTree, SegmentNode } from './types.ts';
14
14
 
15
15
  /** Info carried per directory for type generation. */
16
16
  export interface SegmentInfo {
@@ -23,7 +23,7 @@
23
23
  * URL path and the segment classification, never on file payloads.
24
24
  */
25
25
 
26
- import type { CoercedParams } from '../shared/param-value.js';
26
+ import type { CoercedParams } from '../shared/param-value.ts';
27
27
 
28
28
  export interface SegmentKeyInput {
29
29
  urlPath: string;
@@ -9,7 +9,7 @@
9
9
  * See design/07-routing.md §"Parallel Routes".
10
10
  */
11
11
 
12
- import type { SegmentNode } from './types.js';
12
+ import type { SegmentNode } from './types.ts';
13
13
 
14
14
  /**
15
15
  * Reject every parallel slot that no renderer reaches.
@@ -14,7 +14,7 @@
14
14
  * local; the other two now share `collectLeafRoutes` from this file.
15
15
  */
16
16
 
17
- import type { SegmentNode } from './types.js';
17
+ import type { SegmentNode } from './types.ts';
18
18
 
19
19
  /** A leaf route discovered while walking the segment tree. */
20
20
  export interface LeafRoute<TFile> {
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Transforms Adapter — Re-exports from @vitejs/plugin-rsc/transforms.
3
+ *
4
+ * This module insulates the rest of the framework from direct imports of
5
+ * @vitejs/plugin-rsc. The plugin is pre-1.0 and its API surface will change.
6
+ * By routing all transform-helper imports through this single file, a
7
+ * breaking upstream change only requires updating one place.
8
+ *
9
+ * Keep this as thin pass-through re-exports — the value is the single choke
10
+ * point, not abstraction.
11
+ */
12
+
13
+ export { hasDirective } from '@vitejs/plugin-rsc/transforms';
@@ -5,3 +5,15 @@ declare module '@vitejs/plugin-rsc/vendor/react-server-dom/client.node' {
5
5
  options?: Record<string, unknown>
6
6
  ): React.ReactNode;
7
7
  }
8
+
9
+ declare module '@vitejs/plugin-rsc/vendor/react-server-dom/server.edge' {
10
+ export function renderToReadableStream(
11
+ model: unknown,
12
+ manifest: unknown,
13
+ options?: {
14
+ signal?: AbortSignal;
15
+ onError?: (error: unknown) => string | void;
16
+ onPostpone?: (reason: string) => void;
17
+ }
18
+ ): ReadableStream<Uint8Array>;
19
+ }
@@ -24,7 +24,7 @@
24
24
  * Design doc: design/23a-search-params-triage.md §"Unify Codec<T> type"
25
25
  */
26
26
 
27
- import type { Codec } from './codec.js';
27
+ import type { Codec } from './codec.ts';
28
28
 
29
29
  // ---------------------------------------------------------------------------
30
30
  // Standard Schema interface (subset)
@@ -10,18 +10,18 @@
10
10
  * Design doc: design/23-search-params.md §"defineSearchParams — The Factory"
11
11
  */
12
12
 
13
- import { useQueryStates as clientUseQueryStates } from '../client/use-query-states.js';
14
- import { fromSchema, isStandardSchema, isCodec } from '../schema-bridge.js';
15
- import type { StandardSchemaV1 } from '../schema-bridge.js';
16
- import type { Codec } from '../codec.js';
13
+ import { useQueryStates as clientUseQueryStates } from '../client/use-query-states.ts';
14
+ import { fromSchema, isStandardSchema, isCodec } from '../schema-bridge.ts';
15
+ import type { StandardSchemaV1 } from '../schema-bridge.ts';
16
+ import type { Codec } from '../codec.ts';
17
17
  // Server-only reference for .get() — avoids pulling server ALS into client
18
18
  // bundles. In client environments, .get() throws before reaching this code
19
19
  // path. The slot lives in its own leaf module so that `request-context.ts`
20
20
  // can register the getter without importing this file, which would drag
21
21
  // `nuqs` into every server entry (TIM-1298). See shared/als-slots.ts.
22
- import { getSearchParamsFromAls } from '../shared/als-slots.js';
23
- import { parseTotal } from './parse-total.js';
24
- import { serializedEqual } from './serialize-equal.js';
22
+ import { getSearchParamsFromAls } from '../shared/als-slots.ts';
23
+ import { parseTotal } from './parse-total.ts';
24
+ import { serializedEqual } from './serialize-equal.ts';
25
25
 
26
26
  // ---------------------------------------------------------------------------
27
27
  // Types
@@ -186,7 +186,7 @@ export interface SearchParamsDefinition<T extends Record<string, unknown>> {
186
186
 
187
187
  // StandardSchemaV1 is imported from schema-bridge.ts — single source of truth.
188
188
  // Re-export for consumers that import it from this module.
189
- export type { StandardSchemaV1 } from '../schema-bridge.js';
189
+ export type { StandardSchemaV1 } from '../schema-bridge.ts';
190
190
 
191
191
  // ---------------------------------------------------------------------------
192
192
  // Type-level helpers
@@ -16,13 +16,13 @@ export type {
16
16
  SetParamsOptions,
17
17
  QueryStatesOptions,
18
18
  StandardSchemaV1,
19
- } from './define.js';
20
- export { defineSearchParams } from './define.js';
19
+ } from './define.ts';
20
+ export { defineSearchParams } from './define.ts';
21
21
 
22
22
  // Codec bridges moved to @timber-js/app/codec
23
23
  // Import fromSchema / fromArraySchema from '@timber-js/app/codec' instead.
24
24
 
25
25
  // Codec wrappers
26
- export { withDefault, withUrlKey } from './wrappers.js';
26
+ export { withDefault, withUrlKey } from './wrappers.ts';
27
27
 
28
28
  // Runtime registry (route-scoped useQueryStates)
@@ -13,9 +13,9 @@ import type {
13
13
  SearchParamCodec,
14
14
  SearchParamCodecWithUrlKey,
15
15
  SearchParamField,
16
- } from './define.js';
17
- import { isCodec, isStandardSchema, fromSchema } from '../schema-bridge.js';
18
- import { parseTotal } from './parse-total.js';
16
+ } from './define.ts';
17
+ import { isCodec, isStandardSchema, fromSchema } from '../schema-bridge.ts';
18
+ import { parseTotal } from './parse-total.ts';
19
19
 
20
20
  // ---------------------------------------------------------------------------
21
21
  // withDefault
@@ -13,12 +13,12 @@
13
13
  * See design/04-authorization.md and design/02-rendering-pipeline.md §"AccessGate"
14
14
  */
15
15
 
16
- import { DenySignal, RedirectSignal } from './primitives.js';
17
- import type { AccessGateProps, SlotAccessGateProps } from './tree-builder.js';
18
- import { withSpan, setSpanAttribute } from './tracing.js';
19
- import { isDebug } from './debug.js';
20
- import type { DenyPageEntry } from './deny-boundary.js';
21
- import { handleCaughtDeny, setFirstDeniedSegmentIndex } from './deny-boundary.js';
16
+ import { DenySignal, RedirectSignal } from './primitives.ts';
17
+ import type { AccessGateProps, SlotAccessGateProps } from './tree-builder.ts';
18
+ import { withSpan, setSpanAttribute } from './tracing.ts';
19
+ import { isDebug } from './debug.ts';
20
+ import type { DenyPageEntry } from './deny-boundary.ts';
21
+ import { handleCaughtDeny, setFirstDeniedSegmentIndex } from './deny-boundary.ts';
22
22
  import type { ReactNode } from 'react';
23
23
 
24
24
  // ─── AccessGate ─────────────────────────────────────────────────────────────
@@ -220,16 +220,16 @@ async function runActionMiddleware<TCtx>(
220
220
  }
221
221
 
222
222
  // Re-export parseFormData for use throughout the framework
223
- import { parseFormData } from './form-data.js';
224
- import { formatSize } from '../utils/format.js';
225
- import { isDebug, isDevMode } from './debug.js';
226
- import { RedirectSignal, DenySignal } from './primitives.js';
223
+ import { parseFormData } from './form-data.ts';
224
+ import { formatSize } from '../utils/format.ts';
225
+ import { isDebug, isDevMode } from './debug.ts';
226
+ import { RedirectSignal, DenySignal } from './primitives.ts';
227
227
  import {
228
228
  stripSensitiveFields,
229
229
  resolveSensitivePredicate,
230
230
  getGlobalSensitiveFieldsConfig,
231
231
  type SensitiveFieldsOption,
232
- } from './sensitive-fields.js';
232
+ } from './sensitive-fields.ts';
233
233
 
234
234
  /**
235
235
  * Extract validation errors from a schema error.
@@ -18,27 +18,27 @@ import {
18
18
  decodeReply,
19
19
  decodeAction,
20
20
  renderToReadableStream,
21
- } from '../rsc-runtime/rsc.js';
22
-
23
- import { validateCsrf, type CsrfConfig } from './csrf.js';
24
- import { DenySignal, RedirectSignal } from './primitives.js';
25
- import { executeAction, type RevalidateRenderer } from './actions.js';
26
- import { runWithRequestContext, setMutableCookieContext } from './request-context.js';
27
- import { getSetCookieHeaders, getCookiesForSsr } from './cookie-context.js';
28
- import { handleActionError } from './action-client.js';
29
- import { enforceBodyLimits, enforceFieldLimit, type BodyLimitsConfig } from './body-limits.js';
30
- import { parseFormData } from './form-data.js';
21
+ } from '../rsc-runtime/rsc.ts';
22
+
23
+ import { validateCsrf, type CsrfConfig } from './csrf.ts';
24
+ import { DenySignal, RedirectSignal } from './primitives.ts';
25
+ import { executeAction, type RevalidateRenderer } from './actions.ts';
26
+ import { runWithRequestContext, setMutableCookieContext } from './request-context.ts';
27
+ import { getSetCookieHeaders, getCookiesForSsr } from './cookie-context.ts';
28
+ import { handleActionError } from './action-client.ts';
29
+ import { enforceBodyLimits, enforceFieldLimit, type BodyLimitsConfig } from './body-limits.ts';
30
+ import { parseFormData } from './form-data.ts';
31
31
  import {
32
32
  stripSensitiveFields,
33
33
  resolveSensitivePredicate,
34
34
  getGlobalSensitiveFieldsConfig,
35
35
  type SensitiveFieldsOption,
36
- } from './sensitive-fields.js';
37
- import type { FormFlashData } from './form-flash.js';
38
- import { checkVersionSkew, applyReloadHeaders } from './version-skew.js';
39
- import { logActionError } from './logger.js';
40
- import { withTimeout, RenderTimeoutError } from './render-timeout.js';
41
- import { RSC_CONTENT_TYPE } from '../shared/rsc-media-type.js';
36
+ } from './sensitive-fields.ts';
37
+ import type { FormFlashData } from './form-flash.ts';
38
+ import { checkVersionSkew, applyReloadHeaders } from './version-skew.ts';
39
+ import { logActionError } from './logger.ts';
40
+ import { withTimeout, RenderTimeoutError } from './render-timeout.ts';
41
+ import { RSC_CONTENT_TYPE } from '../shared/rsc-media-type.ts';
42
42
 
43
43
  // ─── Types ────────────────────────────────────────────────────────────────
44
44