@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
@@ -9,7 +9,7 @@
9
9
  * once-per-component warning.
10
10
  */
11
11
 
12
- import type { RequestContextStore } from '../als-registry.js';
12
+ import type { RequestContextStore } from '../als-registry.ts';
13
13
 
14
14
  /** Components already warned — exported so tests can reset between cases. */
15
15
  export const keyDisciplineWarned = new Set<string>();
@@ -12,7 +12,7 @@
12
12
  * See design/45-cache-lifetimes.md §ISR mechanics.
13
13
  */
14
14
 
15
- import type { PrebuiltManifest } from './payload-source.js';
15
+ import type { PrebuiltManifest } from './payload-source.ts';
16
16
 
17
17
  export interface SeedKeyInfo {
18
18
  componentId: string;
@@ -13,12 +13,12 @@
13
13
  * See design/45-cache-lifetimes.md §ISR mechanics.
14
14
  */
15
15
 
16
- import { getCacheHandler, isCacheHandlerConfigured } from '../../cache/handler-store.js';
17
- import { MemoryCacheHandler } from '../../cache/index.js';
18
- import { getDeploymentId } from '../version-skew.js';
19
- import { buildTagIndex, type SeedKeyInfo } from './manifest-tag-index.js';
20
- import type { PrebuiltManifest } from './payload-source.js';
21
- import { ensureManifestLoaded } from './payload-source.js';
16
+ import { getCacheHandler, isCacheHandlerConfigured } from '../../cache/handler-store.ts';
17
+ import { MemoryCacheHandler } from '../../cache/index.ts';
18
+ import { getDeploymentId } from '../version-skew.ts';
19
+ import { buildTagIndex, type SeedKeyInfo } from './manifest-tag-index.ts';
20
+ import type { PrebuiltManifest } from './payload-source.ts';
21
+ import { ensureManifestLoaded } from './payload-source.ts';
22
22
 
23
23
  /** Default ceiling TTL for tag-only entries (24 hours), in seconds. */
24
24
  const CEILING_TTL_SECONDS = 24 * 60 * 60;
@@ -16,8 +16,8 @@
16
16
  * single-lookup-function shape here is that seam.
17
17
  */
18
18
 
19
- import { initTagIndex, resetTagIndex } from './overlay.js';
20
- import type { CoercedParams } from '../../shared/param-value.js';
19
+ import { initTagIndex, resetTagIndex } from './overlay.ts';
20
+ import type { CoercedParams } from '../../shared/param-value.ts';
21
21
 
22
22
  export interface PrebuiltManifestEntry {
23
23
  /** Segment params this entry was captured under. */
@@ -15,11 +15,11 @@
15
15
 
16
16
  import { createElement } from 'react';
17
17
 
18
- import type { SlotValues } from '../../client/slot-context.js';
19
- import { SlotOutlet } from '../../client/slot-outlet.js';
20
- import { SlotsProvider } from '../../client/slot-provider.js';
21
- import { splitSlotProps } from './cache-key.js';
22
- import type { PrebuiltComponentOptions } from '../prebuilt-runtime.js';
18
+ import type { SlotValues } from '../../client/slot-context.ts';
19
+ import { SlotOutlet } from '../../client/slot-outlet.tsx';
20
+ import { SlotsProvider } from '../../client/slot-provider.tsx';
21
+ import { splitSlotProps } from './cache-key.ts';
22
+ import type { PrebuiltComponentOptions } from '../prebuilt-runtime.ts';
23
23
 
24
24
  /**
25
25
  * Framework-internal slot name for layout children. Uses a prefix that
@@ -34,8 +34,8 @@
34
34
  * itself (via the public accessors).
35
35
  */
36
36
 
37
- import type { RequestContextStore } from '../als-registry.js';
38
- import type { CoercedParams } from '../../shared/param-value.js';
37
+ import type { RequestContextStore } from '../als-registry.ts';
38
+ import type { CoercedParams } from '../../shared/param-value.ts';
39
39
 
40
40
  /**
41
41
  * Thrown when a prerendered component touches per-request context at
@@ -44,31 +44,31 @@
44
44
 
45
45
  import { createElement } from 'react';
46
46
 
47
- import { requestContextAls } from './als-registry.js';
48
- import type { CoercedParams } from '../shared/param-value.js';
49
- import { ParamCoercionError } from './route-element-builder.js';
50
- import { SlotOutlet } from '../client/slot-outlet.js';
51
- import { coerceSegmentParams } from './param-coercion.js';
52
- import { DenySignal, RedirectSignal } from './primitives.js';
47
+ import { requestContextAls } from './als-registry.ts';
48
+ import type { CoercedParams } from '../shared/param-value.ts';
49
+ import { ParamCoercionError } from './route-element-builder.ts';
50
+ import { SlotOutlet } from '../client/slot-outlet.tsx';
51
+ import { coerceSegmentParams } from './param-coercion.ts';
52
+ import { DenySignal, RedirectSignal } from './primitives.ts';
53
53
  import {
54
54
  beginCapture,
55
55
  endCapture,
56
56
  PrebuiltCaptureCycleError,
57
57
  type NestedWrapperRender,
58
- } from './prebuilt/capture-state.js';
59
- import { computeComponentCacheKey } from './prebuilt/cache-key.js';
60
- import { LAYOUT_CHILDREN_SLOT } from './prebuilt/slots.js';
61
- import { BuildTimeContextError, createBuildTimeStore } from './prebuilt/synthetic-store.js';
58
+ } from './prebuilt/capture-state.ts';
59
+ import { computeComponentCacheKey } from './prebuilt/cache-key.ts';
60
+ import { LAYOUT_CHILDREN_SLOT } from './prebuilt/slots.ts';
61
+ import { BuildTimeContextError, createBuildTimeStore } from './prebuilt/synthetic-store.ts';
62
62
  import {
63
63
  getPrebuiltRegistration,
64
64
  type PrebuiltComponentOptions,
65
65
  type PrebuiltRegistration,
66
- } from './prebuilt-runtime.js';
67
- import { createRouteMatcher } from './route-matcher.js';
68
- import type { ManifestFile, ManifestRoot, ManifestSegmentNode } from './route-matcher.js';
69
- import { createFromReadableStream, renderToReadableStream } from '../rsc-runtime/rsc.js';
70
- import { loadModule } from './safe-load.js';
71
- import { hasDynamicSegments, resolvePathWithParams } from './sitemap-generator.js';
66
+ } from './prebuilt-runtime.ts';
67
+ import { createRouteMatcher } from './route-matcher.ts';
68
+ import type { ManifestFile, ManifestRoot, ManifestSegmentNode } from './route-matcher.ts';
69
+ import { createFromReadableStream, renderToReadableStream } from '../rsc-runtime/rsc.ts';
70
+ import { loadModule } from './safe-load.ts';
71
+ import { hasDynamicSegments, resolvePathWithParams } from './sitemap-generator.ts';
72
72
 
73
73
  // ─── Types ────────────────────────────────────────────────────────────────
74
74
 
@@ -35,41 +35,41 @@
35
35
 
36
36
  import { createElement } from 'react';
37
37
 
38
- import { requestContextAls, type RequestContextStore } from './als-registry.js';
39
- import type { CoercedParams } from '../shared/param-value.js';
40
- import type { SlotParamsRecord } from '../shared/slot-params.js';
41
- import { computeComponentCacheKey, splitSlotProps, tryCanonicalize } from './prebuilt/cache-key.js';
38
+ import { requestContextAls, type RequestContextStore } from './als-registry.ts';
39
+ import type { CoercedParams } from '../shared/param-value.ts';
40
+ import type { SlotParamsRecord } from '../shared/slot-params.ts';
41
+ import { computeComponentCacheKey, splitSlotProps, tryCanonicalize } from './prebuilt/cache-key.ts';
42
42
  import {
43
43
  isChildrenSlotOutletElement,
44
44
  resolveSlotNames,
45
45
  prepareSlotRender,
46
46
  wrapInSlotsProvider,
47
- } from './prebuilt/slots.js';
47
+ } from './prebuilt/slots.ts';
48
48
  import {
49
49
  createKeyDisciplineProxy,
50
50
  emitKeyDisciplineWarning,
51
51
  keyDisciplineWarned,
52
- } from './prebuilt/key-discipline.js';
52
+ } from './prebuilt/key-discipline.ts';
53
53
  import {
54
54
  isCaptureActive,
55
55
  noteWrapperRender,
56
56
  beginCapture,
57
57
  endCapture,
58
- } from './prebuilt/capture-state.js';
58
+ } from './prebuilt/capture-state.ts';
59
59
  import {
60
60
  hasPrebuiltPayloadSource,
61
61
  lookupPrebuiltPayload,
62
62
  getManifestEntry,
63
63
  isParamIndependent,
64
- } from './prebuilt/payload-source.js';
65
- import { lookupOverlay, storeOverlayEntry, overlayKey } from './prebuilt/overlay.js';
66
- import { getWaitUntil } from './waituntil-bridge.js';
67
- import { createSingleflight } from '../cache/singleflight.js';
64
+ } from './prebuilt/payload-source.ts';
65
+ import { lookupOverlay, storeOverlayEntry, overlayKey } from './prebuilt/overlay.ts';
66
+ import { getWaitUntil } from './waituntil-bridge.ts';
67
+ import { createSingleflight } from '../cache/singleflight.ts';
68
68
  import {
69
69
  currentInvalidationEpoch,
70
70
  wasInvalidatedSince,
71
71
  lastInvalidationEpochFor,
72
- } from '../cache/invalidation-epoch.js';
72
+ } from '../cache/invalidation-epoch.ts';
73
73
 
74
74
  /** Default timeout for component re-renders (overridden by renderTimeoutMs). */
75
75
  const DEFAULT_COMPONENT_TIMEOUT_MS = 30_000;
@@ -3,15 +3,15 @@
3
3
  // These are the core runtime signals that components, middleware, and access gates
4
4
  // use to control request flow. See design/10-error-handling.md.
5
5
 
6
- import type { JsonSerializable } from './types.js';
7
- import { getWaitUntil as _getWaitUntil } from './waituntil-bridge.js';
8
- import { isDebug } from './debug.js';
9
- import { getRequestSearchString } from './request-context.js';
10
- import { mergePreservedSearchParams } from '../shared/merge-search-params.js';
6
+ import type { JsonSerializable } from './types.ts';
7
+ import { getWaitUntil as _getWaitUntil } from './waituntil-bridge.ts';
8
+ import { isDebug } from './debug.ts';
9
+ import { getRequestSearchString } from './request-context.ts';
10
+ import { mergePreservedSearchParams } from '../shared/merge-search-params.ts';
11
11
  import {
12
12
  assertRelativeRedirectPath,
13
13
  validateExternalRedirectUrl,
14
- } from '../shared/href-validation.js';
14
+ } from '../shared/href-validation.ts';
15
15
 
16
16
  // ─── Dev-mode validation ────────────────────────────────────────────────────
17
17
 
@@ -228,7 +228,7 @@ export function deny(statusOrOptions?: number | DenyOptions, data?: JsonSerializ
228
228
 
229
229
  // Single source of truth shared with the client next/navigation shim —
230
230
  // see shared/redirect-type.ts.
231
- export { RedirectType } from '../shared/redirect-type.js';
231
+ export { RedirectType } from '../shared/redirect-type.ts';
232
232
 
233
233
  // ─── RedirectSignal ─────────────────────────────────────────────────────────
234
234
 
@@ -13,9 +13,9 @@
13
13
  * with. See design/41-global-params.md §"Transport".
14
14
  */
15
15
 
16
- import { toPlainRecord } from '../shared/param-value.js';
17
- import type { RscPayloadRoot } from '../shared/payload-root.js';
18
- import { getSegmentParamsForClient, getSlotParamsForClient } from './request-context.js';
16
+ import { toPlainRecord } from '../shared/param-value.ts';
17
+ import type { RscPayloadRoot } from '../shared/payload-root.ts';
18
+ import { getSegmentParamsForClient, getSlotParamsForClient } from './request-context.ts';
19
19
 
20
20
  /**
21
21
  * Build the payload root: the tree, and the params it rendered with beside it.
@@ -14,17 +14,17 @@
14
14
  * and design/11-platform.md §"AsyncLocalStorage".
15
15
  */
16
16
 
17
- import type { CoercedParams } from '../shared/param-value.js';
18
- import { requestContextAls, type RequestContextStore } from './als-registry.js';
19
- import { _setGetSearchParamsFn, _setGetSegmentParamsFn } from '../shared/als-slots.js';
20
- import { consumeSeededCookies } from './cookie-context.js';
21
- import { appVisibleSearch } from '../shared/rsc-cache-key.js';
17
+ import type { CoercedParams } from '../shared/param-value.ts';
18
+ import { requestContextAls, type RequestContextStore } from './als-registry.ts';
19
+ import { _setGetSearchParamsFn, _setGetSegmentParamsFn } from '../shared/als-slots.ts';
20
+ import { consumeSeededCookies } from './cookie-context.ts';
21
+ import { appVisibleSearch } from '../shared/rsc-cache-key.ts';
22
22
  import {
23
23
  mergeSlotParams,
24
24
  resolveSegmentParams,
25
25
  type SlotParamsRecord,
26
- } from '../shared/slot-params.js';
27
- import { isDebug } from './debug.js';
26
+ } from '../shared/slot-params.ts';
27
+ import { isDebug } from './debug.ts';
28
28
 
29
29
  // Re-export the ALS for framework-internal consumers that need direct access.
30
30
  export { requestContextAls };
@@ -17,43 +17,40 @@
17
17
 
18
18
  import { createElement, Fragment } from 'react';
19
19
 
20
- import { withSpan } from './tracing.js';
21
- import type { RouteMatch } from './pipeline.js';
22
- import type { ManifestSegmentNode } from './route-matcher.js';
23
- import type { Metadata } from './types.js';
24
- import { DenySignal, RedirectSignal } from './primitives.js';
25
- import { MetadataCollector, MetadataHead } from './metadata-collector.js';
26
- import { AccessGate } from './access-gate.js';
27
- import { requestContextAls } from './als-registry.js';
28
- import { PageDenyBoundary, buildDenyPageChain, handleCaughtDeny } from './deny-boundary.js';
29
- import type { DenyPageEntry } from './deny-boundary.js';
30
- import { LAYOUT_CHILDREN_SLOT } from './prebuilt/slots.js';
20
+ import { withSpan } from './tracing.ts';
21
+ import type { RouteMatch } from './pipeline.ts';
22
+ import type { ManifestSegmentNode } from './route-matcher.ts';
23
+ import type { Metadata } from './types.ts';
24
+ import { DenySignal, RedirectSignal } from './primitives.ts';
25
+ import { MetadataCollector, MetadataHead } from './metadata-collector.ts';
26
+ import { AccessGate } from './access-gate.tsx';
27
+ import { requestContextAls } from './als-registry.ts';
28
+ import { PageDenyBoundary, buildDenyPageChain, handleCaughtDeny } from './deny-boundary.ts';
29
+ import type { DenyPageEntry } from './deny-boundary.ts';
31
30
  import {
32
31
  resolveSlotProps,
33
32
  publishSlotSegmentParams,
34
33
  emitSlotInfoForSkippedLayout,
35
34
  type SlotSkipEntry,
36
- } from './slot-resolver.js';
37
- import { consumedUrlParts } from './chain-url-parts.js';
38
- import { withPublishedParams } from './publish-params.js';
39
- import type { RscPayloadRoot } from '../shared/payload-root.js';
40
- import { SegmentProvider } from '../client/segment-context.js';
41
- import { SegmentOutlet } from '../client/segment-outlet.js';
42
- import { SlotOutlet } from '../client/slot-outlet.js';
43
- import { SlotsProvider } from '../client/slot-provider.js';
44
-
45
- import { TimberErrorBoundary } from '../client/error-boundary.js';
46
- import { wrapSegmentWithErrorBoundaries } from './error-boundary-wrapper.js';
47
- import type { InterceptionContext } from './pipeline.js';
48
- import { shouldSkipSegment, type ClientStateTree } from './state-tree-diff.js';
49
- import { truncateSkippableForChangedSlots } from './skippable-prefix.js';
35
+ } from './slot-resolver.ts';
36
+ import { consumedUrlParts } from './chain-url-parts.ts';
37
+ import { withPublishedParams } from './publish-params.ts';
38
+ import type { RscPayloadRoot } from '../shared/payload-root.ts';
39
+ import { SegmentProvider } from '../client/segment-context.ts';
40
+ import { SegmentOutlet } from '../client/segment-outlet.tsx';
41
+
42
+ import { TimberErrorBoundary } from '../client/error-boundary.tsx';
43
+ import { wrapSegmentWithErrorBoundaries } from './error-boundary-wrapper.ts';
44
+ import type { InterceptionContext } from './pipeline.ts';
45
+ import { shouldSkipSegment, type ClientStateTree } from './state-tree-diff.ts';
46
+ import { truncateSkippableForChangedSlots } from './skippable-prefix.ts';
50
47
  import {
51
48
  computeSegmentKeys,
52
49
  computeSegmentTreePaths,
53
50
  computeSlotKey,
54
- } from '../routing/segment-keys.js';
55
- import { setFirstDeniedSegmentIndex } from './deny-boundary.js';
56
- import { loadModule } from './safe-load.js';
51
+ } from '../routing/segment-keys.ts';
52
+ import { setFirstDeniedSegmentIndex } from './deny-boundary.ts';
53
+ import { loadModule } from './safe-load.ts';
57
54
 
58
55
  /**
59
56
  * Replace the outermost SegmentOutlet in a partial payload with its
@@ -81,6 +78,59 @@ function replaceOutermostSegmentOutlet(
81
78
  return element;
82
79
  }
83
80
 
81
+ /**
82
+ * Whether a layout's returned tree still contains its children boundary.
83
+ *
84
+ * Layouts may forward `children` through a non-children prop or clone it with
85
+ * React.Children/cloneElement. Checking only `props.children` or object
86
+ * identity would incorrectly classify those layouts as suppressing their
87
+ * descendants and let shell settlement complete before an async child deny.
88
+ */
89
+ export function containsLayoutChildren(
90
+ node: unknown,
91
+ boundaryType: React.ElementType,
92
+ seen = new WeakSet<object>()
93
+ ): boolean {
94
+ if (node == null || typeof node !== 'object') return false;
95
+ if (seen.has(node)) return false;
96
+ seen.add(node);
97
+ try {
98
+ if (Array.isArray(node)) {
99
+ return node.some((child) => containsLayoutChildren(child, boundaryType, seen));
100
+ }
101
+ if ('$$typeof' in node && 'type' in node && 'props' in node) {
102
+ if (node.type === boundaryType) return true;
103
+ // React's development element also exposes `_owner`; following it can
104
+ // walk back into the currently rendering layout's pending props and
105
+ // falsely "find" a child that the returned tree actually suppressed.
106
+ return containsLayoutChildren(node.props, boundaryType, seen);
107
+ }
108
+ const descriptors = Object.getOwnPropertyDescriptors(node);
109
+ return Object.values(descriptors).some(
110
+ (descriptor) =>
111
+ 'value' in descriptor &&
112
+ descriptor.enumerable === true &&
113
+ containsLayoutChildren(descriptor.value, boundaryType, seen)
114
+ );
115
+ } catch {
116
+ // An opaque return value cannot safely prove that it retained the
117
+ // boundary. Treat it as suppression so an uninspectable Proxy cannot
118
+ // strand every descendant settlement promise and hang the response.
119
+ return false;
120
+ }
121
+ }
122
+
123
+ export function descendantSettleCallbacks(
124
+ callbacks: Array<() => void>,
125
+ layoutSettled: (() => void) | undefined
126
+ ): Array<() => void> {
127
+ // A tracked layout appended its own callback last; descendants are every
128
+ // callback before it. An untracked layout appended nothing, so all current
129
+ // callbacks belong to descendants. `slice(0, undefined)` is not equivalent
130
+ // to `slice()` — it returns an empty array.
131
+ return layoutSettled ? callbacks.slice(0, -1) : callbacks.slice();
132
+ }
133
+
84
134
  // ─── Client Reference Detection ──────────────────────────────────────────
85
135
 
86
136
  /**
@@ -367,21 +417,27 @@ export async function buildRouteElement(
367
417
  const h = createElement as (...args: unknown[]) => React.ReactElement;
368
418
 
369
419
  // Shell settlement tracking (TIM-1045 pages, TIM-1208 layouts).
370
- // SlotsProvider is 'use client', so React Flight eagerly
371
- // serializes both the layout and child content as independent subtrees —
372
- // the page can settle before an outer layout. We need all deny-capable
373
- // components to settle before committing the HTTP status.
420
+ // Multiple deny-capable components can suspend independently. We need all
421
+ // of them to settle before committing the HTTP status.
374
422
  //
375
423
  // Each tracked component gets its own deferred. shellSettled resolves
376
424
  // when ALL settle (Promise.all) OR when any in-tree deny fires
377
425
  // (short-circuit via onDenyStatus — covers AccessGate, TracedLayout,
378
426
  // and PageDenyBoundary without threading callbacks into each).
379
427
  const shellPromises: Promise<void>[] = [];
428
+ const shellSettleCallbacks: Array<() => void> = [];
380
429
  let resolveShortCircuit: (() => void) | undefined;
381
430
  const trackShellComponent = (): (() => void) => {
382
431
  let resolve!: () => void;
383
432
  shellPromises.push(new Promise<void>((r) => (resolve = r)));
384
- return resolve;
433
+ let settled = false;
434
+ const settle = () => {
435
+ if (settled) return;
436
+ settled = true;
437
+ resolve();
438
+ };
439
+ shellSettleCallbacks.push(settle);
440
+ return settle;
385
441
  };
386
442
 
387
443
  // Build the page element.
@@ -681,18 +737,18 @@ export async function buildRouteElement(
681
737
  const parallelRouteKeys = Object.keys(segment.slots ?? {});
682
738
 
683
739
  // Build the layout element.
684
- // Layouts receive <SlotOutlet slot={LAYOUT_CHILDREN_SLOT} /> as
685
- // children — a stable client reference — instead of the varying
686
- // inner content. The actual child content is provided via
687
- // SlotsProvider above the layout. Uses a reserved slot name to
688
- // avoid collision with user-declared cache.component slots.
689
- // See design/45-cache-lifetimes.md §Layout Propagation.
690
- const childOutlet = h(SlotOutlet, { slot: LAYOUT_CHILDREN_SLOT });
740
+ // Keep the descendant tree in a SERVER layout's children prop. Moving it
741
+ // to a client-provider prop above that layout makes React Flight evaluate
742
+ // and serialize it independently, even when the layout denies access or
743
+ // deliberately omits children. Client layouts cannot provide this
744
+ // containment: Flight must serialize their server-valued children props
745
+ // before they execute in the browser. Convention lint warns users not to
746
+ // treat a client layout as an authorization or data-hiding boundary.
691
747
  let layoutElement: React.ReactElement;
692
748
  if (isClientReference(layoutComponent)) {
693
749
  layoutElement = h(layoutComponent, {
694
750
  ...slotProps,
695
- children: childOutlet,
751
+ children: element,
696
752
  });
697
753
  } else {
698
754
  // Server component layout — wrap with OTEL tracing AND DenySignal
@@ -705,11 +761,20 @@ export async function buildRouteElement(
705
761
  const layoutDenyPages = denyPageChains.get(i);
706
762
  const hasLayoutDenyChain = !!layoutDenyPages && layoutDenyPages.length > 0;
707
763
  const onLayoutSettled = hasLayoutDenyChain ? trackShellComponent() : undefined;
764
+ const descendantSettlers = descendantSettleCallbacks(shellSettleCallbacks, onLayoutSettled);
765
+ const LayoutChildrenBoundary = ({ children }: { children: React.ReactNode }) => children;
708
766
  const TracedLayout = async (props: Record<string, unknown>) => {
709
767
  try {
710
- return await withSpan('timber.layout', { 'timber.segment': segmentId }, () =>
768
+ const rendered = await withSpan('timber.layout', { 'timber.segment': segmentId }, () =>
711
769
  (layoutComponentRef as (props: Record<string, unknown>) => unknown)(props)
712
770
  );
771
+ // A layout is allowed to suppress children. Descendant deny-capable
772
+ // components will never execute in that case, so settle their
773
+ // bookkeeping rather than leaving the RSC response waiting forever.
774
+ if (!containsLayoutChildren(rendered, LayoutChildrenBoundary)) {
775
+ for (const settle of descendantSettlers) settle();
776
+ }
777
+ return rendered;
713
778
  } catch (error: unknown) {
714
779
  // A layout that denied never renders its own chrome — it threw
715
780
  // instead of returning it — so an entry this segment owns is
@@ -728,17 +793,10 @@ export async function buildRouteElement(
728
793
  };
729
794
  layoutElement = h(TracedLayout, {
730
795
  ...slotProps,
731
- children: childOutlet,
796
+ children: h(LayoutChildrenBoundary, { children: element }),
732
797
  });
733
798
  }
734
799
 
735
- // Wrap the layout in SlotsProvider so the SlotOutlet inside the
736
- // layout's children can read the actual child content.
737
- layoutElement = h(SlotsProvider, {
738
- values: { [LAYOUT_CHILDREN_SLOT]: element },
739
- children: layoutElement,
740
- });
741
-
742
800
  const segmentProviderElement = h(SegmentProvider, {
743
801
  segments: segmentPath,
744
802
  segmentId,
@@ -8,10 +8,10 @@
8
8
  * See design/07-routing.md §"route.ts — API Endpoints"
9
9
  */
10
10
 
11
- import type { RouteContext } from './types.js';
12
- import { logRouteError } from './logger.js';
13
- import { DenySignal, RedirectSignal } from './primitives.js';
14
- import { stripHeadBody } from './head-response.js';
11
+ import type { RouteContext } from './types.ts';
12
+ import { logRouteError } from './logger.ts';
13
+ import { DenySignal, RedirectSignal } from './primitives.ts';
14
+ import { stripHeadBody } from './head-response.ts';
15
15
 
16
16
  // ─── Types ───────────────────────────────────────────────────────────────
17
17
 
@@ -8,17 +8,17 @@
8
8
  * See design/07-routing.md §"Request Lifecycle"
9
9
  */
10
10
 
11
- import type { RouteMatch } from './pipeline.js';
12
- import type { MiddlewareFn } from './middleware-runner.js';
13
- import type { SegmentNode, RouteTree } from '../routing/types.js';
11
+ import type { RouteMatch } from './pipeline.ts';
12
+ import type { MiddlewareFn } from './middleware-runner.ts';
13
+ import type { SegmentNode, RouteTree } from '../routing/types.ts';
14
14
  import {
15
15
  METADATA_ROUTE_CONVENTIONS,
16
16
  isStaticMetadataExtension,
17
17
  resolveStaticContentType,
18
18
  resolveServePathForFile,
19
19
  type MetadataRouteType,
20
- } from './metadata-routes.js';
21
- import { matchUrlParts } from './tree-match.js';
20
+ } from './metadata-routes.ts';
21
+ import { matchUrlParts } from './tree-match.ts';
22
22
 
23
23
  // ─── Manifest Types ───────────────────────────────────────────────────────
24
24
  //
@@ -25,8 +25,8 @@
25
25
  * See design/19-client-navigation.md §"The `_rsc` cache key".
26
26
  */
27
27
 
28
- import { rscCacheKey, isRscCacheKeyShape, RSC_KEY_PARAM } from '../shared/rsc-cache-key.js';
29
- import { RSC_CONTENT_TYPE } from '../shared/rsc-media-type.js';
28
+ import { rscCacheKey, isRscCacheKeyShape, RSC_KEY_PARAM } from '../shared/rsc-cache-key.ts';
29
+ import { isRscContentType } from '../shared/rsc-media-type.ts';
30
30
 
31
31
  /**
32
32
  * Legacy shared-cache control fields that predate RFC 9213 and so do not
@@ -122,9 +122,7 @@ export async function hasValidRscCacheKey(req: Request): Promise<boolean> {
122
122
  * #36c.
123
123
  */
124
124
  export function hardenRscPayloadResponse(response: Response): void {
125
- const contentType = response.headers.get('content-type');
126
- if (!contentType) return;
127
- if (contentType.split(';')[0].trim().toLowerCase() !== RSC_CONTENT_TYPE) return;
125
+ if (!isRscContentType(response.headers.get('content-type'))) return;
128
126
  response.headers.set('X-Content-Type-Options', 'nosniff');
129
127
  }
130
128
 
@@ -18,18 +18,18 @@
18
18
  * this in try/catch.
19
19
  */
20
20
 
21
- import { getCookiesForSsr, getSetCookieHeaders } from '../cookie-context.js';
21
+ import { getCookiesForSsr, getSetCookieHeaders } from '../cookie-context.ts';
22
22
  import {
23
23
  applyRequestHeaderOverlay,
24
24
  runWithRequestContext,
25
25
  setMutableCookieContext,
26
26
  setSegmentParams,
27
- } from '../request-context.js';
28
- import { runMiddlewareChain } from '../middleware-runner.js';
29
- import { DenySignal, RedirectSignal } from '../primitives.js';
30
- import { ParamCoercionError } from '../route-element-builder.js';
31
- import type { RouteMatch } from '../pipeline.js';
32
- import type { MiddlewareContext } from '../types.js';
27
+ } from '../request-context.ts';
28
+ import { runMiddlewareChain } from '../middleware-runner.ts';
29
+ import { DenySignal, RedirectSignal } from '../primitives.ts';
30
+ import { ParamCoercionError } from '../route-element-builder.ts';
31
+ import type { RouteMatch } from '../pipeline.ts';
32
+ import type { MiddlewareContext } from '../types.ts';
33
33
 
34
34
  /** Coerce a matched route's segment params via its `params.ts` codecs. */
35
35
  export type CoerceSegmentParamsFn = (match: RouteMatch) => Promise<void>;
@@ -6,14 +6,15 @@
6
6
  * See design/04-authorization.md §"Auth in API Routes".
7
7
  */
8
8
 
9
- import { withSpan, setSpanAttribute } from '../tracing.js';
10
- import type { ManifestSegmentNode } from '../route-matcher.js';
11
- import { loadModule } from '../safe-load.js';
12
- import { DenySignal, RedirectSignal } from '../primitives.js';
13
- import { handleRouteRequest } from '../route-handler.js';
14
- import { stripHeadBody } from '../head-response.js';
15
- import type { RouteModule } from '../route-handler.js';
16
- import type { RouteContext } from '../types.js';
9
+ import { withSpan, setSpanAttribute } from '../tracing.ts';
10
+ import type { ManifestSegmentNode } from '../route-matcher.ts';
11
+ import { loadModule } from '../safe-load.ts';
12
+ import { DenySignal, RedirectSignal } from '../primitives.ts';
13
+ import { handleRouteRequest } from '../route-handler.ts';
14
+ import { stripHeadBody } from '../head-response.ts';
15
+ import { isDebug } from '../debug.ts';
16
+ import type { RouteModule } from '../route-handler.ts';
17
+ import type { RouteContext } from '../types.ts';
17
18
 
18
19
  /**
19
20
  * Handle a `route.ts` request.
@@ -125,10 +126,18 @@ async function renderApiDeny(
125
126
  segments: ManifestSegmentNode[],
126
127
  responseHeaders: Headers
127
128
  ): Promise<Response> {
128
- const { resolveStatusFile } = await import('../status-code-resolver.js');
129
+ const { resolveStatusFile } = await import('../status-code-resolver.ts');
129
130
 
130
131
  const resolution = resolveStatusFile(deny.status, segments, 'json');
131
132
  if (resolution) {
133
+ if (isDebug() && deny.data !== undefined) {
134
+ console.warn(
135
+ `[timber] deny(${deny.status}, data) resolved to ${resolution.file.filePath}, ` +
136
+ `which is a static JSON file. The data argument is dropped — JSON status files ` +
137
+ `are returned verbatim with no interpolation. If you need the data in the ` +
138
+ `response, use a route handler (route.ts) that returns Response.json() directly.`
139
+ );
140
+ }
132
141
  const mod = await loadModule(resolution.file);
133
142
  const jsonContent = mod.default ?? mod;
134
143
  responseHeaders.set('content-type', 'application/json; charset=utf-8');