@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
@@ -6,143 +6,26 @@
6
6
  // See design/11-platform.md and design/25-production-deployments.md.
7
7
 
8
8
  import { writeFile, readFile, cp, glob } from 'node:fs/promises';
9
- import { execFile } from 'node:child_process';
10
- import { join, relative, dirname, basename } from 'node:path';
11
- import type { TimberPlatformAdapter, TimberConfig } from './types';
12
- import { generateCompressModule } from './compress-module.js';
13
- import { adapterBase, IMMUTABLE_CACHE, generateHeadersFile } from './shared.js';
9
+ import { join, dirname, basename } from 'node:path';
10
+ import type { TimberPlatformAdapter, TimberConfig } from './types.ts';
11
+ import { generateCompressModule } from './compress-module.ts';
12
+ import { adapterBase, IMMUTABLE_CACHE, generateHeadersFile } from './shared.ts';
14
13
  import {
15
14
  runSharedBuildSteps,
16
15
  buildStaticDirectoryOutput,
17
16
  findUnhashedStaticFiles,
18
17
  writeHeadersFile,
19
- } from './build-output-helper.js';
20
-
21
- // ─── Presets ─────────────────────────────────────────────────────────────────
22
-
23
- /**
24
- * Supported Nitro deployment presets.
25
- *
26
- * Each preset maps to a Nitro deployment target. The adapter generates
27
- * the appropriate configuration and entry point for the selected platform.
28
- */
29
- export type NitroPreset =
30
- | 'vercel'
31
- | 'vercel-edge'
32
- | 'netlify'
33
- | 'netlify-edge'
34
- | 'aws-lambda'
35
- | 'deno-deploy'
36
- | 'azure-functions'
37
- | 'node-server'
38
- | 'bun';
39
-
40
- /** Preset-specific Nitro configuration. */
41
- interface PresetConfig {
42
- /** Nitro preset name passed to the Nitro build. */
43
- nitroPreset: string;
44
- /** Output directory name within the build dir. */
45
- outputDir: string;
46
- /**
47
- * Path to the server bundle directory relative to outputDir.
48
- * Nitro places the bundled server entry + _chunks/ here.
49
- * Most presets use `server`; Vercel uses `functions/__server.func`.
50
- */
51
- serverBundleDir: string;
52
- /** Whether the runtime supports waitUntil. */
53
- supportsWaitUntil: boolean;
54
- /** Whether the runtime supports application-level 103 Early Hints. */
55
- supportsEarlyHints: boolean;
56
- /** Value for TIMBER_RUNTIME env var. See design/25-production-deployments.md. */
57
- runtimeName: string;
58
- /** Additional nitro.config fields for this preset. */
59
- extraConfig?: Record<string, unknown>;
60
- }
18
+ } from './build-output-helper.ts';
19
+ import { PRESET_CONFIGS, LOCALLY_PREVIEWABLE, type NitroPreset } from './nitro-presets.ts';
20
+ import {
21
+ generatePreviewScript,
22
+ generateSendResponseModule,
23
+ spawnNitroPreview,
24
+ } from './nitro-preview.ts';
61
25
 
62
- const PRESET_CONFIGS: Record<NitroPreset, PresetConfig> = {
63
- 'vercel': {
64
- nitroPreset: 'vercel',
65
- outputDir: '.vercel/output',
66
- serverBundleDir: 'functions/__server.func',
67
- supportsWaitUntil: true,
68
- supportsEarlyHints: false,
69
- runtimeName: 'vercel',
70
- extraConfig: { vercel: { functions: { maxDuration: 30 } } },
71
- },
72
- 'vercel-edge': {
73
- nitroPreset: 'vercel-edge',
74
- outputDir: '.vercel/output',
75
- serverBundleDir: 'functions/__server.func',
76
- supportsWaitUntil: true,
77
- supportsEarlyHints: false,
78
- runtimeName: 'vercel-edge',
79
- },
80
- 'netlify': {
81
- nitroPreset: 'netlify',
82
- outputDir: '.netlify/functions-internal',
83
- serverBundleDir: 'server',
84
- supportsWaitUntil: false,
85
- supportsEarlyHints: false,
86
- runtimeName: 'netlify',
87
- },
88
- 'netlify-edge': {
89
- nitroPreset: 'netlify-edge',
90
- outputDir: '.netlify/edge-functions',
91
- serverBundleDir: 'server',
92
- supportsWaitUntil: true,
93
- supportsEarlyHints: false,
94
- runtimeName: 'netlify-edge',
95
- },
96
- 'aws-lambda': {
97
- nitroPreset: 'aws-lambda',
98
- outputDir: '.output',
99
- serverBundleDir: 'server',
100
- supportsWaitUntil: false,
101
- supportsEarlyHints: false,
102
- runtimeName: 'aws-lambda',
103
- },
104
- 'deno-deploy': {
105
- nitroPreset: 'deno-deploy',
106
- outputDir: '.output',
107
- serverBundleDir: 'server',
108
- supportsWaitUntil: true,
109
- supportsEarlyHints: false,
110
- runtimeName: 'deno-deploy',
111
- },
112
- 'azure-functions': {
113
- nitroPreset: 'azure-functions',
114
- outputDir: '.output',
115
- serverBundleDir: 'server',
116
- supportsWaitUntil: false,
117
- supportsEarlyHints: false,
118
- runtimeName: 'azure-functions',
119
- },
120
- 'node-server': {
121
- nitroPreset: 'node-server',
122
- outputDir: '.output',
123
- serverBundleDir: 'server',
124
- supportsWaitUntil: true,
125
- // Disabled by default: most node-server deployments sit behind a
126
- // reverse proxy (nginx, caddy, traefik) that doesn't support 103
127
- // Early Hints over HTTP/1.1. Sending 103 causes nginx to intermittently
128
- // treat the response as an error and retry after proxy_connect_timeout
129
- // (~5s stalls on ~23% of requests). Link headers on the 200 response
130
- // are the safe fallback — Cloudflare and other CDNs convert them to
131
- // 103 automatically at the edge (over HTTP/2+ to the browser).
132
- supportsEarlyHints: false,
133
- runtimeName: 'node-server',
134
- },
135
- 'bun': {
136
- nitroPreset: 'bun',
137
- outputDir: '.output',
138
- serverBundleDir: 'server',
139
- supportsWaitUntil: true,
140
- // Disabled for same reason as node-server — reverse proxies choke on 103.
141
- // Link headers on the 200 response are converted to 103 by CDNs.
142
- supportsEarlyHints: false,
143
- runtimeName: 'bun',
144
- },
145
- };
26
+ // NitroPreset is part of the public adapter API (NitroAdapterOptions.preset),
27
+ // so it stays importable from this module.
28
+ export type { NitroPreset } from './nitro-presets.ts';
146
29
 
147
30
  // ─── Options ─────────────────────────────────────────────────────────────────
148
31
 
@@ -215,7 +98,6 @@ export interface NitroAdapterOptions {
215
98
  export function nitro(options: NitroAdapterOptions = {}): TimberPlatformAdapter {
216
99
  const preset = options.preset ?? 'node-server';
217
100
  const compress = options.compress ?? true;
218
- const presetConfig = PRESET_CONFIGS[preset];
219
101
  return {
220
102
  name: `nitro-${preset}`,
221
103
 
@@ -428,261 +310,88 @@ ${handlerCall}
428
310
  `;
429
311
  }
430
312
 
431
- // ─── Preview ─────────────────────────────────────────────────────────────────
432
-
433
- /** Presets that produce a locally-runnable server entry. */
434
- const LOCALLY_PREVIEWABLE = new Set<NitroPreset>(['node-server', 'bun']);
313
+ // ─── Build Hint Filtering ────────────────────────────────────────────────────
435
314
 
436
315
  /**
437
- * Generate a standalone preview server script that uses Node's built-in
438
- * HTTP server. This bypasses Nitro entirely — the Nitro entry.ts imports
439
- * h3 which isn't available outside a Nitro build. For local preview we
440
- * just need to serve static files and route requests to the RSC handler.
441
- *
442
- * @internal Exported for testing.
316
+ * Prefixes of nitro build-output lines that give wrong advice for timber
317
+ * builds. Every nitro bundler path emits these hints via `logger.success` —
318
+ * the rollup path hardcodes `npx nitro preview`; rolldown and vite default
319
+ * to it. That command resolves `.output/nitro.json` relative to cwd, but
320
+ * timber's nitro build lives at `.timber/dist/nitro/.output`, so the
321
+ * suggested command can never work from the project root.
322
+ * Prefix matching degrades gracefully: if upstream rewords the line
323
+ * entirely, it passes through rather than being silently eaten.
443
324
  */
444
- export function generatePreviewScript(buildDir: string, preset: NitroPreset): string {
445
- const rscEntryRelative = relative(join(buildDir, 'nitro'), join(buildDir, 'rsc', 'index.js'));
446
- const rscEntry = rscEntryRelative.startsWith('.') ? rscEntryRelative : './' + rscEntryRelative;
447
- const publicDir = './public';
448
- const manifestInitPath = './_timber-manifest-init.js';
449
- const runtimeName = PRESET_CONFIGS[preset].runtimeName;
450
-
451
- return `// Generated by @timber-js/app — standalone preview server.
452
- // Uses Node's built-in HTTP server to serve static assets and route
453
- // dynamic requests through the RSC handler. No Nitro/h3 dependency.
325
+ const NITRO_PREVIEW_HINT_PREFIX = 'You can preview this build using';
326
+ const NITRO_DEPLOY_HINT_PREFIX = 'You can deploy this build using';
327
+ const SUPPRESSED_NITRO_HINT_PREFIXES = [NITRO_PREVIEW_HINT_PREFIX, NITRO_DEPLOY_HINT_PREFIX];
454
328
 
455
- import { createServer } from 'node:http';
456
- import { readFile, stat } from 'node:fs/promises';
457
- import { join, extname } from 'node:path';
458
- import { fileURLToPath } from 'node:url';
459
- import { existsSync } from 'node:fs';
460
-
461
- // Set runtime before importing the handler.
462
- process.env.TIMBER_RUNTIME = '${runtimeName}';
463
-
464
- // Load the build manifest if it exists.
465
- const __dirname = fileURLToPath(new URL('.', import.meta.url));
466
- const manifestPath = join(__dirname, '${manifestInitPath}');
467
- if (existsSync(manifestPath)) {
468
- await import('${manifestInitPath}');
329
+ /** @internal Exported for testing. */
330
+ export function isSuppressedNitroHint(
331
+ message: unknown,
332
+ prefixes: readonly string[] = SUPPRESSED_NITRO_HINT_PREFIXES
333
+ ): boolean {
334
+ return typeof message === 'string' && prefixes.some((prefix) => message.startsWith(prefix));
469
335
  }
470
336
 
471
- // Import the RSC handler (default export is the fetch-like handler).
472
- const { default: handler, runWithEarlyHintsSender } = await import('${rscEntry}');
473
-
474
- // Import compression helper for self-hosted response compression.
475
- const { compressResponse } = await import('./_compress.mjs');
476
-
477
- // Web→Node response bridge with backpressure (TIM-1154).
478
- const { sendNodeResponse } = await import('./_send-response.mjs');
479
-
480
- const MIME_TYPES = {
481
- '.html': 'text/html',
482
- '.js': 'application/javascript',
483
- '.mjs': 'application/javascript',
484
- '.css': 'text/css',
485
- '.json': 'application/json',
486
- '.png': 'image/png',
487
- '.jpg': 'image/jpeg',
488
- '.jpeg': 'image/jpeg',
489
- '.gif': 'image/gif',
490
- '.svg': 'image/svg+xml',
491
- '.ico': 'image/x-icon',
492
- '.woff': 'font/woff',
493
- '.woff2': 'font/woff2',
494
- '.ttf': 'font/ttf',
495
- '.otf': 'font/otf',
496
- '.webp': 'image/webp',
497
- '.avif': 'image/avif',
498
- '.webm': 'video/webm',
499
- '.mp4': 'video/mp4',
500
- '.txt': 'text/plain',
501
- '.xml': 'application/xml',
502
- '.wasm': 'application/wasm',
503
- };
504
-
505
- const publicDir = join(__dirname, '${publicDir}');
506
-
507
- // Port resolution (TIM-842):
508
- // - Default to 3000
509
- // - If PORT env var is set, honor it strictly (fail loudly on conflict)
510
- // - Otherwise auto-bump from 3000 until a free port is found
511
- // Mirrors the dev server behavior so timber dev/preview/production all
512
- // behave the same way around port selection.
513
- const envPort = process.env.PORT ? parseInt(process.env.PORT, 10) : null;
514
- const portIsExplicit = envPort != null && Number.isFinite(envPort) && envPort > 0;
515
- const startPort = portIsExplicit ? envPort : 3000;
516
- const host = process.env.HOST || 'localhost';
517
-
518
- // Set after listenWithBump() resolves so request handlers can build
519
- // absolute URLs from the actual bound port (which may differ from
520
- // startPort after an auto-bump).
521
- let boundPort = startPort;
522
-
523
- const server = createServer(async (req, res) => {
524
- // Scheme from the socket's TLS state — a hardcoded http:// breaks CSRF
525
- // origin comparison and absolute-URL construction when TLS is terminated
526
- // at this server (TIM-1073; mirrors the dev-server fix in TIM-1067).
527
- // X-Forwarded-Proto is intentionally not consulted here: on a direct
528
- // connection it would be attacker-controlled. The CSRF layer honors it
529
- // separately for reverse-proxy deployments.
530
- const scheme = req.socket?.encrypted ? 'https' : 'http';
531
- const url = new URL(req.url || '/', \`\${scheme}://\${host}:\${boundPort}\`);
532
-
533
- // Try serving static files from the public directory first.
534
- const filePath = join(publicDir, url.pathname);
535
- // Prevent path traversal.
536
- if (filePath.startsWith(publicDir)) {
537
- try {
538
- const fileStat = await stat(filePath);
539
- if (fileStat.isFile()) {
540
- const ext = extname(filePath);
541
- const contentType = MIME_TYPES[ext] || 'application/octet-stream';
542
- const body = await readFile(filePath);
543
- // Hashed assets get immutable cache, others get short cache.
544
- const isImmutable =
545
- url.pathname.startsWith('/assets/') || url.pathname.startsWith('/_timber/fonts/');
546
- const cacheControl = isImmutable
547
- ? 'public, max-age=31536000, immutable'
548
- : 'public, max-age=3600, must-revalidate';
549
- res.writeHead(200, {
550
- 'Content-Type': contentType,
551
- 'Content-Length': body.length,
552
- 'Cache-Control': cacheControl,
553
- });
554
- res.end(body);
555
- return;
556
- }
557
- } catch {
558
- // File not found — fall through to the RSC handler.
559
- }
560
- }
561
-
562
- // Convert Node request to Web Request.
563
- const headers = new Headers();
564
- for (const [key, value] of Object.entries(req.headers)) {
565
- if (value) {
566
- if (Array.isArray(value)) {
567
- for (const v of value) headers.append(key, v);
568
- } else {
569
- headers.set(key, value);
570
- }
571
- }
572
- }
573
-
574
- let body = undefined;
575
- if (req.method !== 'GET' && req.method !== 'HEAD') {
576
- body = await new Promise((resolve) => {
577
- const chunks = [];
578
- req.on('data', (chunk) => chunks.push(chunk));
579
- req.on('end', () => resolve(Buffer.concat(chunks)));
580
- });
581
- }
582
-
583
- const webRequest = new Request(url.href, {
584
- method: req.method,
585
- headers,
586
- body,
587
- duplex: body ? 'half' : undefined,
588
- });
589
-
590
- try {
591
- // Support 103 Early Hints when available.
592
- const earlyHintsSender = (typeof res.writeEarlyHints === 'function')
593
- ? (links) => { try { res.writeEarlyHints({ link: links }); } catch {} }
594
- : undefined;
595
-
596
- const rawResponse = earlyHintsSender && runWithEarlyHintsSender
597
- ? await runWithEarlyHintsSender(earlyHintsSender, () => handler(webRequest))
598
- : await handler(webRequest);
599
-
600
- // Compress the response for self-hosted deployments.
601
- const webResponse = compressResponse(webRequest, rawResponse);
602
-
603
- // Write the response to Node's ServerResponse. sendNodeResponse handles
604
- // status, headers (including Set-Cookie splitting via [...headers]),
605
- // body streaming with backpressure, and client disconnect cleanup.
606
- // See TIM-1154.
607
- await sendNodeResponse(res, webResponse);
608
- } catch (err) {
609
- console.error('[timber preview] Request error:', err);
610
- if (!res.headersSent) {
611
- res.writeHead(500, { 'Content-Type': 'text/plain' });
612
- }
613
- res.end('Internal Server Error');
614
- }
615
- });
616
-
617
- function listenWithBump(port, attempt = 0) {
618
- return new Promise((resolveListen, rejectListen) => {
619
- const onError = (err) => {
620
- server.removeListener('listening', onListening);
621
- if (err && err.code === 'EADDRINUSE' && !portIsExplicit && attempt < 100) {
622
- if (attempt === 0) {
623
- console.log(\` [timber] Port \${port} in use, trying \${port + 1}...\`);
624
- }
625
- listenWithBump(port + 1, attempt + 1).then(resolveListen, rejectListen);
626
- return;
627
- }
628
- rejectListen(err);
629
- };
630
- const onListening = () => {
631
- server.removeListener('error', onError);
632
- resolveListen(port);
633
- };
634
- server.once('error', onError);
635
- server.once('listening', onListening);
636
- server.listen(port, host);
637
- });
337
+ /**
338
+ * Nitro's rolldown and vite builders render `framework.previewCommand` /
339
+ * `framework.deployCommand` into these hints. A user who explicitly set one
340
+ * via `nitroConfig` has provided valid guidance — only suppress the hints
341
+ * whose command is still nitro's broken default.
342
+ *
343
+ * @internal Exported for testing.
344
+ */
345
+ export function selectSuppressedHintPrefixes(framework?: {
346
+ previewCommand?: string;
347
+ deployCommand?: string;
348
+ }): string[] {
349
+ return [
350
+ ...(framework?.previewCommand ? [] : [NITRO_PREVIEW_HINT_PREFIX]),
351
+ ...(framework?.deployCommand ? [] : [NITRO_DEPLOY_HINT_PREFIX]),
352
+ ];
638
353
  }
639
354
 
640
- try {
641
- boundPort = await listenWithBump(startPort);
642
- if (boundPort !== startPort) {
643
- console.log();
644
- console.log(\` [timber] Port \${startPort} in use, using \${boundPort}\`);
645
- }
646
- console.log();
647
- console.log(' ⚡ timber preview server running at:');
648
- console.log();
649
- console.log(\` ➜ http://\${host}:\${boundPort}\`);
650
- console.log();
651
- } catch (err) {
652
- if (err && err.code === 'EADDRINUSE') {
653
- console.error(\`[timber] Port \${startPort} is already in use. \` +
654
- 'Set PORT to a free port, or unset PORT to auto-pick.');
655
- } else {
656
- console.error('[timber] Failed to start preview server:', err);
657
- }
658
- process.exit(1);
659
- }
660
- `;
355
+ /** Minimal structural view of the nitro (consola) logger the wrap needs. */
356
+ interface NitroBuildLogger {
357
+ success: (message: unknown, ...args: unknown[]) => void;
661
358
  }
662
359
 
663
- /** Command descriptor for Nitro preview — testable without spawning. */
664
- export interface NitroPreviewCommand {
665
- command: string;
666
- args: string[];
667
- cwd: string;
360
+ /**
361
+ * Wrap a nitro logger's `success` so hardcoded preview/deploy hints are
362
+ * dropped for this programmatic build only. Returns the original
363
+ * (unfiltered) success fn so timber can print its own hint — which shares
364
+ * the suppressed prefix on purpose, replacing nitro's wording.
365
+ *
366
+ * @internal Exported for testing.
367
+ */
368
+ export function wrapNitroLoggerForBuild(
369
+ logger: NitroBuildLogger,
370
+ prefixes: readonly string[] = SUPPRESSED_NITRO_HINT_PREFIXES
371
+ ): NitroBuildLogger['success'] {
372
+ const originalSuccess = logger.success.bind(logger);
373
+ const wrapped = (message: unknown, ...args: unknown[]) => {
374
+ if (isSuppressedNitroHint(message, prefixes)) return;
375
+ originalSuccess(message, ...args);
376
+ };
377
+ // Preserve consola LogFn properties (e.g. `.raw`) on the replacement.
378
+ logger.success = Object.assign(wrapped, logger.success);
379
+ return originalSuccess;
668
380
  }
669
381
 
670
- /** @internal Exported for testing. */
671
- export function generateNitroPreviewCommand(
672
- buildDir: string,
673
- preset: NitroPreset
674
- ): NitroPreviewCommand | null {
675
- if (!LOCALLY_PREVIEWABLE.has(preset)) return null;
676
-
677
- const nitroDir = join(buildDir, 'nitro');
678
- const entryPath = join(nitroDir, 'entry.ts');
679
-
680
- const command = preset === 'bun' ? 'bun' : 'node';
681
- return {
682
- command,
683
- args: [entryPath],
684
- cwd: nitroDir,
685
- };
382
+ /**
383
+ * Timber's own post-build hint. Locally-runnable presets are previewed via
384
+ * `timber preview`, which invokes this adapter's `preview()` to run the
385
+ * generated `_preview-server.mjs`. Serverless presets get no hint — their
386
+ * output lives under `.timber/dist/nitro/`, so any cwd-relative deploy
387
+ * command would be as wrong as the nitro hint this replaces.
388
+ *
389
+ * @internal Exported for testing.
390
+ */
391
+ export function getPostBuildHint(preset: NitroPreset): string | null {
392
+ return LOCALLY_PREVIEWABLE.has(preset)
393
+ ? 'You can preview this build using `timber preview`'
394
+ : null;
686
395
  }
687
396
 
688
397
  /**
@@ -731,6 +440,17 @@ async function runNitroBuild(
731
440
  ...userConfig,
732
441
  });
733
442
 
443
+ // Drop nitro's `npx nitro preview` / `npx nitro deploy` hints —
444
+ // they can never work from the project root (see TIM-1375). Hints whose
445
+ // command the user explicitly configured via framework.previewCommand /
446
+ // deployCommand pass through untouched — except on the rollup builder,
447
+ // which ignores framework commands and unconditionally prints the broken
448
+ // defaults (nitro/dist/_build/rollup.mjs), so user commands are treated
449
+ // as absent there: defaults stay suppressed, timber's hint still prints.
450
+ // logSuccess is the unfiltered fn used below to print timber's hint.
451
+ const framework = nitro.options.builder === 'rollup' ? undefined : nitro.options.framework;
452
+ const logSuccess = wrapNitroLoggerForBuild(nitro.logger, selectSuppressedHintPrefixes(framework));
453
+
734
454
  // Read the resolved serverDir AFTER config merging — userConfig may
735
455
  // override output.dir or output.serverDir. Nitro appends a trailing
736
456
  // slash during resolution; strip it for join() compatibility.
@@ -742,100 +462,15 @@ async function runNitroBuild(
742
462
  await nitroBuild(nitro);
743
463
  await nitro.close();
744
464
 
745
- return { serverDir };
746
- }
747
-
748
- /** Spawn a Nitro preview process and pipe stdio. */
749
- function spawnNitroPreview(command: string, args: string[], cwd: string): Promise<void> {
750
- return new Promise<void>((resolve, reject) => {
751
- const child = execFile(command, args, { cwd }, (err) => {
752
- if (err) reject(err);
753
- else resolve();
754
- });
755
- child.stdout?.pipe(process.stdout);
756
- child.stderr?.pipe(process.stderr);
757
- });
758
- }
759
-
760
- // ─── Send Response Module ───────────────────────────────────────────────────
761
-
762
- /**
763
- * Generate a standalone ESM module that exports sendNodeResponse.
764
- *
765
- * Mirrors srvx/node's sendNodeResponse: status + headers via writeHead,
766
- * body streaming with backpressure (waits for drain on write() === false),
767
- * and client disconnect cleanup. Written to `_send-response.mjs` during
768
- * buildOutput for use by the preview server script. See TIM-1154.
769
- *
770
- * @internal Exported for testing.
771
- */
772
- export function generateSendResponseModule(): string {
773
- return `// Generated by @timber-js/app — Web→Node response bridge.
774
- // Do not edit — this file is regenerated on each build.
775
- // Mirrors srvx/node's sendNodeResponse with backpressure support.
465
+ // A user-configured previewCommand already printed via nitro's own hint —
466
+ // don't print a second, conflicting one.
467
+ const hint = framework?.previewCommand ? null : getPostBuildHint(preset);
468
+ if (hint) logSuccess(hint);
776
469
 
777
- export function sendNodeResponse(nodeRes, webRes) {
778
- if (!webRes) {
779
- nodeRes.statusCode = 500;
780
- return new Promise((resolve) => nodeRes.end(resolve));
781
- }
782
- const rawHeaders = [...webRes.headers];
783
- const writeHeaders = rawHeaders.flat();
784
- if (!nodeRes.headersSent) {
785
- if (nodeRes.req?.httpVersion === '2.0') {
786
- nodeRes.writeHead(webRes.status, writeHeaders);
787
- } else {
788
- nodeRes.writeHead(webRes.status, webRes.statusText, writeHeaders);
789
- }
790
- }
791
- if (!webRes.body) {
792
- return new Promise((resolve) => nodeRes.end(resolve));
793
- }
794
- // Stream with backpressure: pause reading when the kernel buffer is
795
- // full (write() returns false) and resume on 'drain'.
796
- if (nodeRes.destroyed) {
797
- webRes.body.cancel();
798
- return;
799
- }
800
- const reader = webRes.body.getReader();
801
- function streamCancel(error) {
802
- reader.cancel(error).catch(() => {});
803
- if (error) nodeRes.destroy(error);
804
- }
805
- function streamHandle({ done, value }) {
806
- try {
807
- if (done) {
808
- nodeRes.end();
809
- } else if (nodeRes.write(value)) {
810
- reader.read().then(streamHandle, streamCancel);
811
- } else {
812
- nodeRes.once('drain', () => reader.read().then(streamHandle, streamCancel));
813
- }
814
- } catch (error) {
815
- streamCancel(error instanceof Error ? error : undefined);
816
- }
817
- }
818
- nodeRes.on('close', streamCancel);
819
- nodeRes.on('error', streamCancel);
820
- reader.read().then(streamHandle, streamCancel);
821
- return reader.closed.catch(streamCancel).finally(() => {
822
- nodeRes.off('close', streamCancel);
823
- nodeRes.off('error', streamCancel);
824
- });
825
- }
826
- `;
470
+ return { serverDir };
827
471
  }
828
-
829
472
  // ─── Helpers ─────────────────────────────────────────────────────────────────
830
473
 
831
- /**
832
- * Get the preset configuration for a given preset name.
833
- * @internal Exported for testing.
834
- */
835
- export function getPresetConfig(preset: NitroPreset): PresetConfig {
836
- return PRESET_CONFIGS[preset];
837
- }
838
-
839
474
  /**
840
475
  * Resolve the destination path for prebuilt flight payloads in the Nitro
841
476
  * output directory. The RSC entry resolves `../prebuilt/` relative to its
@@ -10,7 +10,7 @@
10
10
  // tests/adapters/shared-no-forbidden-imports.test.ts enforces this.
11
11
  // ../shared/ is exempt: it is dependency-free by the same rule.
12
12
 
13
- import { withBasePath } from '../shared/base-path.js';
13
+ import { withBasePath } from '../shared/base-path.ts';
14
14
 
15
15
  /**
16
16
  * The deployment base an adapter should write platform rules against.