@timber-js/app 0.2.0-alpha.98 → 0.2.0-alpha.99

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 (322) hide show
  1. package/LICENSE +8 -0
  2. package/dist/_chunks/actions-CQ8Z8VGL.js +1061 -0
  3. package/dist/_chunks/actions-CQ8Z8VGL.js.map +1 -0
  4. package/dist/_chunks/build-output-helper-DXnW0qjz.js +61 -0
  5. package/dist/_chunks/build-output-helper-DXnW0qjz.js.map +1 -0
  6. package/dist/_chunks/{define-Itxvcd7F.js → define-B-Q_UMOD.js} +19 -23
  7. package/dist/_chunks/define-B-Q_UMOD.js.map +1 -0
  8. package/dist/_chunks/{define-C77ScO0m.js → define-CfBPoJb0.js} +24 -7
  9. package/dist/_chunks/define-CfBPoJb0.js.map +1 -0
  10. package/dist/_chunks/define-cookie-BjpIt4UC.js +194 -0
  11. package/dist/_chunks/define-cookie-BjpIt4UC.js.map +1 -0
  12. package/dist/_chunks/{format-CYBGxKtc.js → format-Bcn-Iv1x.js} +1 -1
  13. package/dist/_chunks/{format-CYBGxKtc.js.map → format-Bcn-Iv1x.js.map} +1 -1
  14. package/dist/_chunks/handler-store-B-lqaGyh.js +54 -0
  15. package/dist/_chunks/handler-store-B-lqaGyh.js.map +1 -0
  16. package/dist/_chunks/logger-0m8MsKdc.js +291 -0
  17. package/dist/_chunks/logger-0m8MsKdc.js.map +1 -0
  18. package/dist/_chunks/merge-search-params-BphMdht_.js +122 -0
  19. package/dist/_chunks/merge-search-params-BphMdht_.js.map +1 -0
  20. package/dist/_chunks/navigation-root-BCYczjml.js +96 -0
  21. package/dist/_chunks/navigation-root-BCYczjml.js.map +1 -0
  22. package/dist/_chunks/registry-I2ss-lvy.js +20 -0
  23. package/dist/_chunks/registry-I2ss-lvy.js.map +1 -0
  24. package/dist/_chunks/router-ref-h3-UaCQv.js +28 -0
  25. package/dist/_chunks/router-ref-h3-UaCQv.js.map +1 -0
  26. package/dist/_chunks/{schema-bridge-C3xl_vfb.js → schema-bridge-Cxu4l-7p.js} +1 -1
  27. package/dist/_chunks/{schema-bridge-C3xl_vfb.js.map → schema-bridge-Cxu4l-7p.js.map} +1 -1
  28. package/dist/_chunks/{segment-context-fHFLF1PE.js → segment-context-Dx_OizxD.js} +1 -1
  29. package/dist/_chunks/{segment-context-fHFLF1PE.js.map → segment-context-Dx_OizxD.js.map} +1 -1
  30. package/dist/_chunks/{router-ref-C8OCm7g7.js → ssr-data-B4CdH7rE.js} +2 -26
  31. package/dist/_chunks/ssr-data-B4CdH7rE.js.map +1 -0
  32. package/dist/_chunks/{stale-reload-BX5gL1r-.js → stale-reload-Bab885FO.js} +1 -1
  33. package/dist/_chunks/{stale-reload-BX5gL1r-.js.map → stale-reload-Bab885FO.js.map} +1 -1
  34. package/dist/_chunks/tracing-C8V-YGsP.js +329 -0
  35. package/dist/_chunks/tracing-C8V-YGsP.js.map +1 -0
  36. package/dist/_chunks/{use-query-states-BiV5GJgm.js → use-query-states-B2XTqxDR.js} +3 -19
  37. package/dist/_chunks/use-query-states-B2XTqxDR.js.map +1 -0
  38. package/dist/_chunks/{use-params-IOPu7E8t.js → use-segment-params-BkpKAQ7D.js} +9 -95
  39. package/dist/_chunks/use-segment-params-BkpKAQ7D.js.map +1 -0
  40. package/dist/_chunks/{walkers-VOXgavMF.js → walkers-Tg0Alwcg.js} +6 -3
  41. package/dist/_chunks/walkers-Tg0Alwcg.js.map +1 -0
  42. package/dist/_chunks/{dev-warnings-DpGRGoDi.js → warnings-Cg47l5sk.js} +3 -3
  43. package/dist/_chunks/warnings-Cg47l5sk.js.map +1 -0
  44. package/dist/adapters/build-output-helper.d.ts +28 -0
  45. package/dist/adapters/build-output-helper.d.ts.map +1 -0
  46. package/dist/adapters/cloudflare.d.ts.map +1 -1
  47. package/dist/adapters/cloudflare.js +8 -28
  48. package/dist/adapters/cloudflare.js.map +1 -1
  49. package/dist/adapters/nitro.d.ts.map +1 -1
  50. package/dist/adapters/nitro.js +8 -26
  51. package/dist/adapters/nitro.js.map +1 -1
  52. package/dist/adapters/shared.d.ts +16 -0
  53. package/dist/adapters/shared.d.ts.map +1 -0
  54. package/dist/cache/index.js +9 -2
  55. package/dist/cache/index.js.map +1 -1
  56. package/dist/cache/timber-cache.d.ts.map +1 -1
  57. package/dist/client/error-boundary.js +2 -1
  58. package/dist/client/error-boundary.js.map +1 -1
  59. package/dist/client/form.d.ts +10 -24
  60. package/dist/client/form.d.ts.map +1 -1
  61. package/dist/client/index.d.ts +1 -5
  62. package/dist/client/index.d.ts.map +1 -1
  63. package/dist/client/index.js +40 -90
  64. package/dist/client/index.js.map +1 -1
  65. package/dist/client/internal.d.ts +2 -1
  66. package/dist/client/internal.d.ts.map +1 -1
  67. package/dist/client/internal.js +81 -7
  68. package/dist/client/internal.js.map +1 -1
  69. package/dist/client/rsc-fetch.d.ts.map +1 -1
  70. package/dist/client/state.d.ts +1 -1
  71. package/dist/client/use-cookie.d.ts +8 -0
  72. package/dist/client/use-cookie.d.ts.map +1 -1
  73. package/dist/client/{use-params.d.ts → use-segment-params.d.ts} +1 -1
  74. package/dist/client/use-segment-params.d.ts.map +1 -0
  75. package/dist/codec.d.ts +1 -1
  76. package/dist/codec.d.ts.map +1 -1
  77. package/dist/codec.js +2 -2
  78. package/dist/config-types.d.ts +28 -0
  79. package/dist/config-types.d.ts.map +1 -1
  80. package/dist/cookies/define-cookie.d.ts +87 -35
  81. package/dist/cookies/define-cookie.d.ts.map +1 -1
  82. package/dist/cookies/index.d.ts +2 -1
  83. package/dist/cookies/index.d.ts.map +1 -1
  84. package/dist/cookies/index.js +48 -2
  85. package/dist/cookies/index.js.map +1 -0
  86. package/dist/cookies/json-cookie.d.ts +64 -0
  87. package/dist/cookies/json-cookie.d.ts.map +1 -0
  88. package/dist/cookies/validation.d.ts +46 -0
  89. package/dist/cookies/validation.d.ts.map +1 -0
  90. package/dist/{plugins/dev-404-page.d.ts → dev-tools/404-page.d.ts} +1 -1
  91. package/dist/dev-tools/404-page.d.ts.map +1 -0
  92. package/dist/{plugins/dev-browser-logs.d.ts → dev-tools/browser-logs.d.ts} +1 -1
  93. package/dist/dev-tools/browser-logs.d.ts.map +1 -0
  94. package/dist/{plugins/dev-error-page.d.ts → dev-tools/error-page.d.ts} +2 -2
  95. package/dist/dev-tools/error-page.d.ts.map +1 -0
  96. package/dist/{server/dev-holding-server.d.ts → dev-tools/holding-server.d.ts} +1 -1
  97. package/dist/dev-tools/holding-server.d.ts.map +1 -0
  98. package/dist/dev-tools/index.d.ts +31 -0
  99. package/dist/dev-tools/index.d.ts.map +1 -0
  100. package/dist/{server/dev-span-processor.d.ts → dev-tools/instrumentation.d.ts} +26 -6
  101. package/dist/dev-tools/instrumentation.d.ts.map +1 -0
  102. package/dist/{server/dev-logger.d.ts → dev-tools/logger.d.ts} +1 -1
  103. package/dist/dev-tools/logger.d.ts.map +1 -0
  104. package/dist/{plugins/dev-logs.d.ts → dev-tools/logs.d.ts} +1 -1
  105. package/dist/dev-tools/logs.d.ts.map +1 -0
  106. package/dist/{plugins/dev-error-overlay.d.ts → dev-tools/overlay.d.ts} +3 -12
  107. package/dist/dev-tools/overlay.d.ts.map +1 -0
  108. package/dist/dev-tools/stack-classifier.d.ts +34 -0
  109. package/dist/dev-tools/stack-classifier.d.ts.map +1 -0
  110. package/dist/{plugins/dev-terminal-error.d.ts → dev-tools/terminal.d.ts} +2 -2
  111. package/dist/dev-tools/terminal.d.ts.map +1 -0
  112. package/dist/{server/dev-warnings.d.ts → dev-tools/warnings.d.ts} +1 -1
  113. package/dist/dev-tools/warnings.d.ts.map +1 -0
  114. package/dist/index.d.ts +1 -0
  115. package/dist/index.d.ts.map +1 -1
  116. package/dist/index.js +97 -72
  117. package/dist/index.js.map +1 -1
  118. package/dist/plugin-context.d.ts +1 -1
  119. package/dist/plugin-context.d.ts.map +1 -1
  120. package/dist/plugins/adapter-build.d.ts.map +1 -1
  121. package/dist/routing/convention-lint.d.ts.map +1 -1
  122. package/dist/routing/index.js +1 -1
  123. package/dist/routing/scanner.d.ts.map +1 -1
  124. package/dist/routing/status-file-lint.d.ts.map +1 -1
  125. package/dist/search-params/define.d.ts +25 -7
  126. package/dist/search-params/define.d.ts.map +1 -1
  127. package/dist/search-params/index.js +5 -3
  128. package/dist/search-params/index.js.map +1 -1
  129. package/dist/search-params/wrappers.d.ts +2 -2
  130. package/dist/search-params/wrappers.d.ts.map +1 -1
  131. package/dist/segment-params/define.d.ts +23 -6
  132. package/dist/segment-params/define.d.ts.map +1 -1
  133. package/dist/segment-params/index.js +1 -1
  134. package/dist/server/access-gate.d.ts +4 -3
  135. package/dist/server/access-gate.d.ts.map +1 -1
  136. package/dist/server/action-handler.d.ts +15 -6
  137. package/dist/server/action-handler.d.ts.map +1 -1
  138. package/dist/server/als-registry.d.ts +5 -5
  139. package/dist/server/als-registry.d.ts.map +1 -1
  140. package/dist/server/asset-headers.d.ts +1 -15
  141. package/dist/server/asset-headers.d.ts.map +1 -1
  142. package/dist/server/cookie-context.d.ts +170 -0
  143. package/dist/server/cookie-context.d.ts.map +1 -0
  144. package/dist/server/cookie-parsing.d.ts +51 -0
  145. package/dist/server/cookie-parsing.d.ts.map +1 -0
  146. package/dist/server/deny-boundary.d.ts +90 -0
  147. package/dist/server/deny-boundary.d.ts.map +1 -0
  148. package/dist/server/deny-renderer.d.ts.map +1 -1
  149. package/dist/server/early-hints-sender.d.ts.map +1 -1
  150. package/dist/server/index.d.ts +5 -4
  151. package/dist/server/index.d.ts.map +1 -1
  152. package/dist/server/index.js +4 -149
  153. package/dist/server/index.js.map +1 -1
  154. package/dist/server/internal.d.ts +6 -4
  155. package/dist/server/internal.d.ts.map +1 -1
  156. package/dist/server/internal.js +261 -408
  157. package/dist/server/internal.js.map +1 -1
  158. package/dist/server/logger.d.ts +14 -0
  159. package/dist/server/logger.d.ts.map +1 -1
  160. package/dist/server/middleware-runner.d.ts +17 -0
  161. package/dist/server/middleware-runner.d.ts.map +1 -1
  162. package/dist/server/param-coercion.d.ts +26 -0
  163. package/dist/server/param-coercion.d.ts.map +1 -0
  164. package/dist/server/pipeline-helpers.d.ts +14 -7
  165. package/dist/server/pipeline-helpers.d.ts.map +1 -1
  166. package/dist/server/pipeline-outcome.d.ts +49 -0
  167. package/dist/server/pipeline-outcome.d.ts.map +1 -0
  168. package/dist/server/pipeline-phases.d.ts +4 -49
  169. package/dist/server/pipeline-phases.d.ts.map +1 -1
  170. package/dist/server/pipeline.d.ts +0 -2
  171. package/dist/server/pipeline.d.ts.map +1 -1
  172. package/dist/server/request-context.d.ts +22 -159
  173. package/dist/server/request-context.d.ts.map +1 -1
  174. package/dist/server/route-element-builder.d.ts.map +1 -1
  175. package/dist/server/rsc-entry/action-middleware-runner.d.ts +66 -0
  176. package/dist/server/rsc-entry/action-middleware-runner.d.ts.map +1 -0
  177. package/dist/server/rsc-entry/helpers.d.ts +1 -1
  178. package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
  179. package/dist/server/rsc-entry/index.d.ts.map +1 -1
  180. package/dist/server/rsc-entry/render-route.d.ts +50 -0
  181. package/dist/server/rsc-entry/render-route.d.ts.map +1 -0
  182. package/dist/server/rsc-entry/wrap-action-dispatch.d.ts +59 -14
  183. package/dist/server/rsc-entry/wrap-action-dispatch.d.ts.map +1 -1
  184. package/dist/server/state-tree-diff.d.ts.map +1 -1
  185. package/dist/server/tracing.d.ts +1 -1
  186. package/dist/server/tracing.d.ts.map +1 -1
  187. package/dist/server/tree-builder.d.ts +45 -16
  188. package/dist/server/tree-builder.d.ts.map +1 -1
  189. package/dist/server/types.d.ts +48 -0
  190. package/dist/server/types.d.ts.map +1 -1
  191. package/dist/server/utils/escape-html.d.ts +14 -0
  192. package/dist/server/utils/escape-html.d.ts.map +1 -0
  193. package/dist/shims/headers.d.ts +2 -2
  194. package/dist/shims/headers.d.ts.map +1 -1
  195. package/dist/shims/navigation-client.d.ts +3 -1
  196. package/dist/shims/navigation-client.d.ts.map +1 -1
  197. package/dist/shims/navigation.d.ts +9 -4
  198. package/dist/shims/navigation.d.ts.map +1 -1
  199. package/package.json +6 -7
  200. package/src/adapters/build-output-helper.ts +77 -0
  201. package/src/adapters/cloudflare.ts +10 -50
  202. package/src/adapters/nitro.ts +11 -45
  203. package/src/adapters/shared.ts +40 -0
  204. package/src/cache/timber-cache.ts +3 -2
  205. package/src/cli.ts +0 -0
  206. package/src/client/form.tsx +17 -25
  207. package/src/client/index.ts +16 -9
  208. package/src/client/internal.ts +3 -2
  209. package/src/client/router.ts +1 -1
  210. package/src/client/rsc-fetch.ts +15 -0
  211. package/src/client/state.ts +2 -2
  212. package/src/client/use-cookie.ts +29 -0
  213. package/src/codec.ts +3 -7
  214. package/src/config-types.ts +28 -0
  215. package/src/cookies/define-cookie.ts +271 -78
  216. package/src/cookies/index.ts +11 -8
  217. package/src/cookies/json-cookie.ts +105 -0
  218. package/src/cookies/validation.ts +134 -0
  219. package/src/{plugins/dev-404-page.ts → dev-tools/404-page.ts} +2 -7
  220. package/src/{plugins/dev-error-page.ts → dev-tools/error-page.ts} +5 -32
  221. package/src/dev-tools/index.ts +90 -0
  222. package/src/dev-tools/instrumentation.ts +176 -0
  223. package/src/{plugins/dev-logs.ts → dev-tools/logs.ts} +2 -2
  224. package/src/{plugins/dev-error-overlay.ts → dev-tools/overlay.ts} +5 -23
  225. package/src/dev-tools/stack-classifier.ts +75 -0
  226. package/src/{plugins/dev-terminal-error.ts → dev-tools/terminal.ts} +4 -38
  227. package/src/{server/dev-warnings.ts → dev-tools/warnings.ts} +1 -1
  228. package/src/index.ts +11 -3
  229. package/src/plugin-context.ts +1 -1
  230. package/src/plugins/adapter-build.ts +3 -1
  231. package/src/plugins/dev-server.ts +3 -3
  232. package/src/plugins/shims.ts +1 -1
  233. package/src/plugins/static-build.ts +1 -1
  234. package/src/routing/convention-lint.ts +5 -4
  235. package/src/routing/scanner.ts +5 -2
  236. package/src/routing/status-file-lint.ts +4 -2
  237. package/src/search-params/define.ts +71 -15
  238. package/src/search-params/wrappers.ts +9 -2
  239. package/src/segment-params/define.ts +66 -13
  240. package/src/server/access-gate.tsx +9 -8
  241. package/src/server/action-handler.ts +28 -38
  242. package/src/server/als-registry.ts +5 -5
  243. package/src/server/asset-headers.ts +8 -34
  244. package/src/server/cookie-context.ts +468 -0
  245. package/src/server/cookie-parsing.ts +135 -0
  246. package/src/server/{deny-page-resolver.ts → deny-boundary.ts} +78 -14
  247. package/src/server/deny-renderer.ts +2 -7
  248. package/src/server/early-hints-sender.ts +3 -2
  249. package/src/server/fallback-error.ts +1 -1
  250. package/src/server/index.ts +13 -14
  251. package/src/server/internal.ts +10 -3
  252. package/src/server/logger.ts +23 -0
  253. package/src/server/middleware-runner.ts +44 -0
  254. package/src/server/param-coercion.ts +76 -0
  255. package/src/server/pipeline-helpers.ts +37 -13
  256. package/src/server/pipeline-outcome.ts +167 -0
  257. package/src/server/pipeline-phases.ts +27 -209
  258. package/src/server/pipeline.ts +2 -9
  259. package/src/server/request-context.ts +46 -451
  260. package/src/server/route-element-builder.ts +7 -3
  261. package/src/server/rsc-entry/action-middleware-runner.ts +167 -0
  262. package/src/server/rsc-entry/error-renderer.ts +1 -1
  263. package/src/server/rsc-entry/helpers.ts +2 -7
  264. package/src/server/rsc-entry/index.ts +34 -273
  265. package/src/server/rsc-entry/render-route.ts +304 -0
  266. package/src/server/rsc-entry/rsc-payload.ts +1 -1
  267. package/src/server/rsc-entry/ssr-renderer.ts +2 -2
  268. package/src/server/rsc-entry/wrap-action-dispatch.ts +316 -23
  269. package/src/server/ssr-entry.ts +1 -1
  270. package/src/server/state-tree-diff.ts +4 -1
  271. package/src/server/tracing.ts +3 -3
  272. package/src/server/tree-builder.ts +128 -52
  273. package/src/server/types.ts +52 -0
  274. package/src/server/utils/escape-html.ts +20 -0
  275. package/src/shims/headers.ts +3 -3
  276. package/src/shims/navigation-client.ts +4 -3
  277. package/src/shims/navigation.ts +9 -7
  278. package/dist/_chunks/actions-DLnUaR65.js +0 -421
  279. package/dist/_chunks/actions-DLnUaR65.js.map +0 -1
  280. package/dist/_chunks/als-registry-HS0LGUl2.js +0 -41
  281. package/dist/_chunks/als-registry-HS0LGUl2.js.map +0 -1
  282. package/dist/_chunks/debug-ECi_61pb.js +0 -108
  283. package/dist/_chunks/debug-ECi_61pb.js.map +0 -1
  284. package/dist/_chunks/define-C77ScO0m.js.map +0 -1
  285. package/dist/_chunks/define-Itxvcd7F.js.map +0 -1
  286. package/dist/_chunks/define-cookie-BowvzoP0.js +0 -94
  287. package/dist/_chunks/define-cookie-BowvzoP0.js.map +0 -1
  288. package/dist/_chunks/dev-warnings-DpGRGoDi.js.map +0 -1
  289. package/dist/_chunks/merge-search-params-Cm_KIWDX.js +0 -41
  290. package/dist/_chunks/merge-search-params-Cm_KIWDX.js.map +0 -1
  291. package/dist/_chunks/request-context-CK5tZqIP.js +0 -478
  292. package/dist/_chunks/request-context-CK5tZqIP.js.map +0 -1
  293. package/dist/_chunks/router-ref-C8OCm7g7.js.map +0 -1
  294. package/dist/_chunks/tracing-CCYbKn5n.js +0 -238
  295. package/dist/_chunks/tracing-CCYbKn5n.js.map +0 -1
  296. package/dist/_chunks/use-params-IOPu7E8t.js.map +0 -1
  297. package/dist/_chunks/use-query-states-BiV5GJgm.js.map +0 -1
  298. package/dist/_chunks/walkers-VOXgavMF.js.map +0 -1
  299. package/dist/client/use-params.d.ts.map +0 -1
  300. package/dist/plugins/dev-404-page.d.ts.map +0 -1
  301. package/dist/plugins/dev-browser-logs.d.ts.map +0 -1
  302. package/dist/plugins/dev-error-overlay.d.ts.map +0 -1
  303. package/dist/plugins/dev-error-page.d.ts.map +0 -1
  304. package/dist/plugins/dev-logs.d.ts.map +0 -1
  305. package/dist/plugins/dev-terminal-error.d.ts.map +0 -1
  306. package/dist/server/deny-page-resolver.d.ts +0 -52
  307. package/dist/server/deny-page-resolver.d.ts.map +0 -1
  308. package/dist/server/dev-fetch-instrumentation.d.ts +0 -22
  309. package/dist/server/dev-fetch-instrumentation.d.ts.map +0 -1
  310. package/dist/server/dev-holding-server.d.ts.map +0 -1
  311. package/dist/server/dev-logger.d.ts.map +0 -1
  312. package/dist/server/dev-span-processor.d.ts.map +0 -1
  313. package/dist/server/dev-warnings.d.ts.map +0 -1
  314. package/dist/server/page-deny-boundary.d.ts +0 -31
  315. package/dist/server/page-deny-boundary.d.ts.map +0 -1
  316. package/src/server/dev-fetch-instrumentation.ts +0 -96
  317. package/src/server/dev-span-processor.ts +0 -78
  318. package/src/server/page-deny-boundary.tsx +0 -56
  319. /package/src/client/{use-params.ts → use-segment-params.ts} +0 -0
  320. /package/src/{plugins/dev-browser-logs.ts → dev-tools/browser-logs.ts} +0 -0
  321. /package/src/{server/dev-holding-server.ts → dev-tools/holding-server.ts} +0 -0
  322. /package/src/{server/dev-logger.ts → dev-tools/logger.ts} +0 -0
@@ -1,13 +1,11 @@
1
- import { n as isDevMode, t as isDebug } from "../_chunks/debug-ECi_61pb.js";
2
- import { a as warnRedirectInSuspense, c as warnSuspenseWrappingChildren, i as warnRedirectInAccess, n as setViteServer, o as warnSlowSlotWithoutSuspense, r as warnDenyInSuspense, s as warnStaticRequestApi, t as WarningId } from "../_chunks/dev-warnings-DpGRGoDi.js";
1
+ import { c as replaceTraceId, d as withSpan, f as earlyHintsSenderAls, g as timingAls, i as getOtelTraceId, l as runWithTraceId, m as requestContextAls, o as getTraceId, r as generateTraceId, u as setSpanAttribute, v as isDebug } from "../_chunks/tracing-C8V-YGsP.js";
2
+ import { a as warnRedirectInSuspense, c as warnSuspenseWrappingChildren, i as warnRedirectInAccess, n as setViteServer, o as warnSlowSlotWithoutSuspense, r as warnDenyInSuspense, s as warnStaticRequestApi, t as WarningId } from "../_chunks/warnings-Cg47l5sk.js";
3
3
  import { n as classifyUrlSegment } from "../_chunks/segment-classify-BjfuctV2.js";
4
4
  import { i as getMetadataRouteServePath, n as classifyMetadataRoute, r as getMetadataRouteAutoLink, t as METADATA_ROUTE_CONVENTIONS } from "../_chunks/metadata-routes-BU684ls2.js";
5
- import { a as timingAls, r as requestContextAls, t as earlyHintsSenderAls } from "../_chunks/als-registry-HS0LGUl2.js";
6
- import { f as runWithRequestContext, l as getSetCookieHeaders, m as setSegmentParams, p as setMutableCookieContext, t as applyRequestHeaderOverlay, u as markResponseFlushed } from "../_chunks/request-context-CK5tZqIP.js";
7
- import { l as RenderError, n as executeAction, o as DenySignal, r as isRscActionRequest, s as RedirectSignal, t as buildNoJsResponse } from "../_chunks/actions-DLnUaR65.js";
8
- import { c as replaceTraceId, d as withSpan, i as getOtelTraceId, l as runWithTraceId, o as getTraceId, r as generateTraceId, s as getTraceStore, u as setSpanAttribute } from "../_chunks/tracing-CCYbKn5n.js";
5
+ import { a as logProxyError, c as logRequestReceived, d as logSwrRefetchFailed, f as logWaitUntilRejected, h as swallow, i as logMiddlewareShortCircuit, l as logRouteError, m as setLogger, n as logCacheMiss, o as logRenderError, p as logWaitUntilUnsupported, r as logMiddlewareError, s as logRequestCompleted, t as getLogger, u as logSlowRequest } from "../_chunks/logger-0m8MsKdc.js";
6
+ import { C as setMutableCookieContext, D as getSetCookieHeaders, S as runWithRequestContext, T as getCookie, _ as getHeader, b as getSegmentParams, c as DenySignal, d as RenderError, g as applyRequestHeaderOverlay, l as RedirectSignal, n as executeAction, o as coerce, r as isRscActionRequest, t as buildNoJsResponse, w as setSegmentParams, x as markResponseFlushed, y as getSearchParams } from "../_chunks/actions-CQ8Z8VGL.js";
9
7
  import "../client/error-boundary.js";
10
- import "../_chunks/segment-context-fHFLF1PE.js";
8
+ import "../_chunks/segment-context-Dx_OizxD.js";
11
9
  import { readFile } from "node:fs/promises";
12
10
  import { createElement } from "react";
13
11
  //#region src/server/server-timing.ts
@@ -86,276 +84,6 @@ function getServerTimingHeader() {
86
84
  return result || null;
87
85
  }
88
86
  //#endregion
89
- //#region src/server/error-formatter.ts
90
- /**
91
- * Error Formatter — rewrites SSR/RSC error messages to surface user code.
92
- *
93
- * When React or Vite throw errors during SSR, stack traces reference
94
- * vendored dependency paths (e.g. `.vite/deps_ssr/@vitejs_plugin-rsc_vendor_...`)
95
- * and mangled export names (`__vite_ssr_export_default__`). This module
96
- * rewrites error messages and stack traces to point at user code instead.
97
- *
98
- * Dev-only — in production, errors go through the structured logger
99
- * without formatting.
100
- */
101
- /**
102
- * Patterns that identify internal Vite/RSC vendor paths in stack traces.
103
- * These are replaced with human-readable labels.
104
- */
105
- var VENDOR_PATH_PATTERNS = [
106
- {
107
- pattern: /node_modules\/\.vite\/deps_ssr\/@vitejs_plugin-rsc_vendor_react-server-dom[^\s)]+/g,
108
- replacement: "<react-server-dom>"
109
- },
110
- {
111
- pattern: /node_modules\/\.vite\/deps_ssr\/@vitejs_plugin-rsc_vendor[^\s)]+/g,
112
- replacement: "<rsc-vendor>"
113
- },
114
- {
115
- pattern: /node_modules\/\.vite\/deps_ssr\/[^\s)]+/g,
116
- replacement: "<vite-dep>"
117
- },
118
- {
119
- pattern: /node_modules\/\.vite\/deps\/[^\s)]+/g,
120
- replacement: "<vite-dep>"
121
- }
122
- ];
123
- /**
124
- * Patterns that identify Vite-mangled export names in error messages.
125
- */
126
- var MANGLED_NAME_PATTERNS = [{
127
- pattern: /__vite_ssr_export_default__/g,
128
- replacement: "<default export>"
129
- }, {
130
- pattern: /__vite_ssr_export_(\w+)__/g,
131
- replacement: "<export $1>"
132
- }];
133
- /**
134
- * Rewrite an error's message and stack to replace internal Vite paths
135
- * and mangled names with human-readable labels.
136
- */
137
- function formatSsrError(error) {
138
- if (!(error instanceof Error)) return String(error);
139
- let message = error.message;
140
- let stack = error.stack ?? "";
141
- for (const { pattern, replacement } of MANGLED_NAME_PATTERNS) message = message.replace(pattern, replacement);
142
- for (const { pattern, replacement } of VENDOR_PATH_PATTERNS) stack = stack.replace(pattern, replacement);
143
- for (const { pattern, replacement } of MANGLED_NAME_PATTERNS) stack = stack.replace(pattern, replacement);
144
- const hint = extractErrorHint(error.message);
145
- const parts = [];
146
- parts.push(message);
147
- if (hint) parts.push(` → ${hint}`);
148
- const userFrames = extractUserFrames(stack);
149
- if (userFrames.length > 0) {
150
- parts.push("");
151
- parts.push(" User code in stack:");
152
- for (const frame of userFrames) parts.push(` ${frame}`);
153
- }
154
- return parts.join("\n");
155
- }
156
- /**
157
- * Extract a human-readable hint from common React/RSC error messages.
158
- *
159
- * React error messages contain useful information but the surrounding
160
- * context (vendor paths, mangled names) obscures it. This extracts the
161
- * actionable part as a one-line hint.
162
- */
163
- function extractErrorHint(message) {
164
- if (message.match(/Functions cannot be passed directly to Client Components/)) {
165
- const propMatch = message.match(/<[^>]*?\s(\w+)=\{function/);
166
- if (propMatch) return `Prop "${propMatch[1]}" is a function — mark it "use server" or call it before passing`;
167
- return "A function prop was passed to a Client Component — mark it \"use server\" or call it before passing";
168
- }
169
- if (message.includes("Objects are not valid as a React child")) return "An object was rendered as JSX children — convert to string or extract the value";
170
- const nullRefMatch = message.match(/Cannot read propert(?:y|ies) of (undefined|null) \(reading '(\w+)'\)/);
171
- if (nullRefMatch) return `Accessed .${nullRefMatch[2]} on ${nullRefMatch[1]} — check that the value exists`;
172
- const notFnMatch = message.match(/(\w+) is not a function/);
173
- if (notFnMatch) return `"${notFnMatch[1]}" is not a function — check imports and exports`;
174
- if (message.includes("Element type is invalid")) return "A component resolved to undefined/null — check default exports and import paths";
175
- if (message.includes("Invalid hook call")) return "A hook was called outside of a React component render. If this is a 'use client' component, ensure the directive is at the very top of the file (before any imports) and that @vitejs/plugin-rsc is loaded correctly. Barrel re-exports from non-'use client' files do not propagate the directive.";
176
- return null;
177
- }
178
- /**
179
- * Extract stack frames that reference user code (not node_modules,
180
- * not framework internals).
181
- *
182
- * Returns at most 5 frames to keep output concise.
183
- */
184
- function extractUserFrames(stack) {
185
- const lines = stack.split("\n");
186
- const userFrames = [];
187
- for (const line of lines) {
188
- const trimmed = line.trim();
189
- if (!trimmed.startsWith("at ")) continue;
190
- if (trimmed.includes("node_modules") || trimmed.includes("<react-server-dom>") || trimmed.includes("<rsc-vendor>") || trimmed.includes("<vite-dep>") || trimmed.includes("node:internal")) continue;
191
- userFrames.push(trimmed);
192
- if (userFrames.length >= 5) break;
193
- }
194
- return userFrames;
195
- }
196
- //#endregion
197
- //#region src/server/default-logger.ts
198
- /**
199
- * DefaultLogger — human-readable stderr logging when no custom logger is configured.
200
- *
201
- * Ships as the fallback so production deployments always have error visibility,
202
- * even without an `instrumentation.ts` logger export. Output is one line per
203
- * event, designed for `fly logs`, `kubectl logs`, Cloudflare dashboard tails, etc.
204
- *
205
- * Format:
206
- * [timber] ERROR message key=value key=value trace_id=4bf92f35
207
- * [timber] WARN message key=value key=value trace_id=4bf92f35
208
- * [timber] INFO message method=GET path=/dashboard status=200 durationMs=43 trace_id=4bf92f35
209
- *
210
- * Behavior:
211
- * - Suppressed entirely in dev mode (dev logging handles all output)
212
- * - `debug` suppressed unless TIMBER_DEBUG is set
213
- * - Replaced entirely when a custom logger is set via `setLogger()`
214
- *
215
- * See design/17-logging.md §"DefaultLogger"
216
- */
217
- /**
218
- * Format data fields as `key=value` pairs for human-readable output.
219
- * - `error` key is serialized via formatSsrError for stack trace cleanup
220
- * - `trace_id` is truncated to 8 chars for readability (full ID in OTEL)
221
- * - Other values are stringified inline
222
- */
223
- function formatDataFields(data) {
224
- if (!data) return "";
225
- const parts = [];
226
- let traceId;
227
- for (const [key, value] of Object.entries(data)) {
228
- if (key === "trace_id") {
229
- traceId = typeof value === "string" ? value : String(value);
230
- continue;
231
- }
232
- if (key === "error") {
233
- parts.push(`error=${formatSsrError(value)}`);
234
- continue;
235
- }
236
- if (value === void 0 || value === null) continue;
237
- parts.push(`${key}=${value}`);
238
- }
239
- if (traceId) parts.push(`trace_id=${traceId.slice(0, 8)}`);
240
- return parts.length > 0 ? " " + parts.join(" ") : "";
241
- }
242
- /** Pad level string to fixed width for alignment. */
243
- function padLevel(level) {
244
- return level.padEnd(5);
245
- }
246
- function createDefaultLogger() {
247
- return {
248
- error(msg, data) {
249
- const fields = formatDataFields(data);
250
- process.stderr.write(`[timber] ${padLevel("ERROR")} ${msg}${fields}\n`);
251
- },
252
- warn(msg, data) {
253
- const fields = formatDataFields(data);
254
- process.stderr.write(`[timber] ${padLevel("WARN")} ${msg}${fields}\n`);
255
- },
256
- info(msg, data) {
257
- if (isDevMode()) return;
258
- if (!isDebug()) return;
259
- const fields = formatDataFields(data);
260
- process.stderr.write(`[timber] ${padLevel("INFO")} ${msg}${fields}\n`);
261
- },
262
- debug(msg, data) {
263
- if (isDevMode()) return;
264
- if (!isDebug()) return;
265
- const fields = formatDataFields(data);
266
- process.stderr.write(`[timber] ${padLevel("DEBUG")} ${msg}${fields}\n`);
267
- }
268
- };
269
- }
270
- //#endregion
271
- //#region src/server/logger.ts
272
- /**
273
- * Logger — structured logging with environment-aware formatting.
274
- *
275
- * timber.js ships a DefaultLogger that writes human-readable lines to stderr
276
- * in production. Users can export a custom logger from instrumentation.ts to
277
- * replace it with pino, winston, or any TimberLogger-compatible object.
278
- *
279
- * See design/17-logging.md §"Production Logging"
280
- */
281
- var _logger = createDefaultLogger();
282
- /**
283
- * Set the user-provided logger. Called by the instrumentation loader
284
- * when it finds a `logger` export in instrumentation.ts. Replaces
285
- * the DefaultLogger entirely.
286
- */
287
- function setLogger(logger) {
288
- _logger = logger;
289
- }
290
- /**
291
- * Get the current logger. Always non-null — returns DefaultLogger when
292
- * no custom logger is configured.
293
- */
294
- function getLogger() {
295
- return _logger;
296
- }
297
- /**
298
- * Inject trace_id and span_id into log data for log–trace correlation.
299
- * Always injects trace_id (never undefined). Injects span_id only when OTEL is active.
300
- */
301
- function withTraceContext(data) {
302
- const store = getTraceStore();
303
- const enriched = { ...data };
304
- if (store) {
305
- enriched.trace_id = store.traceId;
306
- if (store.spanId) enriched.span_id = store.spanId;
307
- }
308
- return enriched;
309
- }
310
- /** Log a completed request. Level: info. */
311
- function logRequestCompleted(data) {
312
- _logger.info("request completed", withTraceContext(data));
313
- }
314
- /** Log request received. Level: debug. */
315
- function logRequestReceived(data) {
316
- _logger.debug("request received", withTraceContext(data));
317
- }
318
- /** Log a slow request warning. Level: warn. */
319
- function logSlowRequest(data) {
320
- _logger.warn("slow request exceeded threshold", withTraceContext(data));
321
- }
322
- /** Log middleware short-circuit. Level: debug. */
323
- function logMiddlewareShortCircuit(data) {
324
- _logger.debug("middleware short-circuited", withTraceContext(data));
325
- }
326
- /** Log unhandled error in middleware phase. Level: error. */
327
- function logMiddlewareError(data) {
328
- _logger.error("unhandled error in middleware phase", withTraceContext(data));
329
- }
330
- /** Log unhandled render-phase error. Level: error. */
331
- function logRenderError(data) {
332
- _logger.error("unhandled render-phase error", withTraceContext(data));
333
- }
334
- /** Log proxy.ts uncaught error. Level: error. */
335
- function logProxyError(data) {
336
- _logger.error("proxy.ts threw uncaught error", withTraceContext(data));
337
- }
338
- /** Log unhandled error in route handler. Level: error. */
339
- function logRouteError(data) {
340
- _logger.error("unhandled route handler error", withTraceContext(data));
341
- }
342
- /** Log waitUntil() adapter missing (once at startup). Level: warn. */
343
- function logWaitUntilUnsupported() {
344
- _logger.warn("adapter does not support waitUntil()");
345
- }
346
- /** Log waitUntil() promise rejection. Level: warn. */
347
- function logWaitUntilRejected(data) {
348
- _logger.warn("waitUntil() promise rejected", withTraceContext(data));
349
- }
350
- /** Log staleWhileRevalidate refetch failure. Level: warn. */
351
- function logSwrRefetchFailed(data) {
352
- _logger.warn("staleWhileRevalidate refetch failed", withTraceContext(data));
353
- }
354
- /** Log cache miss. Level: debug. */
355
- function logCacheMiss(data) {
356
- _logger.debug("timber.cache MISS", withTraceContext(data));
357
- }
358
- //#endregion
359
87
  //#region src/server/instrumentation.ts
360
88
  /**
361
89
  * Instrumentation — loads and runs the user's instrumentation.ts file.
@@ -419,24 +147,37 @@ function hasOnRequestError() {
419
147
  }
420
148
  //#endregion
421
149
  //#region src/server/pipeline-helpers.ts
422
- /** Keys that must never be merged via Object.assign — they pollute Object.prototype. */
423
- var DANGEROUS_KEYS = new Set([
424
- "__proto__",
425
- "constructor",
426
- "prototype"
427
- ]);
428
150
  /**
429
- * Shallow merge that skips top-level prototype-polluting keys.
151
+ * Only __proto__ needs stripping — it has a language-level setter that
152
+ * changes the prototype chain of spread copies. constructor and prototype
153
+ * are harmless own properties on null-prototype objects.
154
+ */
155
+ var DANGEROUS_KEYS = new Set(["__proto__"]);
156
+ /**
157
+ * Deep-walk a value returned by a segment param codec, producing a
158
+ * sanitized copy where every plain object is null-prototype and
159
+ * dangerous keys (__proto__, constructor, prototype) are stripped at
160
+ * every depth.
161
+ *
162
+ * Non-plain objects (Date, Map, class instances, etc.) are returned
163
+ * as-is — they cannot be poisoned by `{...x}` spread and may carry
164
+ * author-intended prototype methods.
430
165
  *
431
- * This is intentionally NOT a deep sanitizer. It only blocks shallow
432
- * pollution via top-level `__proto__` / `constructor` / `prototype`
433
- * keys. The deeper guarantee for segment params comes from merging
434
- * codec output into a null-prototype target inside coerceSegmentParams().
166
+ * Arrays are walked element-wise.
435
167
  *
436
- * See TIM-655, TIM-855, design/13-security.md
168
+ * Performance: URL params are bounded by URL length (~8 KB). Realistic
169
+ * trees are <1 KB. The recursive walk is sub-microsecond.
170
+ *
171
+ * See TIM-655, TIM-855, TIM-873, design/13-security.md
437
172
  */
438
- function safeMerge(target, source) {
439
- for (const key of Object.keys(source)) if (!DANGEROUS_KEYS.has(key)) target[key] = source[key];
173
+ function sanitizeParamValue(value) {
174
+ if (value === null || typeof value !== "object") return value;
175
+ if (Array.isArray(value)) return value.map(sanitizeParamValue);
176
+ const proto = Object.getPrototypeOf(value);
177
+ if (proto !== Object.prototype && proto !== null) return value;
178
+ const out = Object.create(null);
179
+ for (const key of Object.keys(value)) if (!DANGEROUS_KEYS.has(key)) out[key] = sanitizeParamValue(value[key]);
180
+ return out;
440
181
  }
441
182
  /**
442
183
  * Build a proxy resolver closure from the declared source. Called exactly
@@ -661,6 +402,35 @@ async function runMiddlewareChain(chain, ctx) {
661
402
  if (result instanceof Response) return result;
662
403
  }
663
404
  }
405
+ /**
406
+ * Per-request marker for synthetic re-render requests that should NOT
407
+ * re-execute `middleware.ts`. The action-dispatch wrapper runs middleware
408
+ * once on the inbound action POST; when validation fails on the no-JS
409
+ * path, it builds a synthetic GET that flows through the normal pipeline
410
+ * to render the page with `getFormFlash()` data. Without this marker, the
411
+ * pipeline would run middleware a second time on that synthetic GET.
412
+ *
413
+ * The set is keyed by the synthetic Request object itself, so the entry
414
+ * lives exactly as long as the request and is garbage-collected with it.
415
+ * Cannot be set or detected by user code — there is no header, no URL
416
+ * parameter, nothing on the wire that an attacker could spoof.
417
+ *
418
+ * See TIM-871.
419
+ *
420
+ * @internal — framework use only.
421
+ */
422
+ var middlewareBypassRequests = /* @__PURE__ */ new WeakSet();
423
+ /**
424
+ * Check whether a request was marked to bypass middleware.
425
+ *
426
+ * Called by `handleRequest` in pipeline-phases.ts before invoking the
427
+ * middleware phase. Returns false for any request not explicitly marked.
428
+ *
429
+ * @internal
430
+ */
431
+ function shouldBypassMiddleware(req) {
432
+ return middlewareBypassRequests.has(req);
433
+ }
664
434
  //#endregion
665
435
  //#region src/server/metadata-social.ts
666
436
  /**
@@ -1389,20 +1159,36 @@ async function loadModule(loader) {
1389
1159
  }
1390
1160
  }
1391
1161
  //#endregion
1392
- //#region src/server/deny-page-resolver.ts
1162
+ //#region src/server/deny-boundary.ts
1393
1163
  /**
1394
- * Deny Page Resolverresolves status-code file components for in-tree deny handling.
1164
+ * Deny boundary subsystemthe in-tree DenySignal flow.
1165
+ *
1166
+ * Three things live together here because they form a single flow:
1167
+ *
1168
+ * 1. **Chain construction** (`buildDenyPageChain`) — walks the matched
1169
+ * segment chain at element-tree build time and produces a list of
1170
+ * `DenyPageEntry` records ordered by specificity (specific status →
1171
+ * category catch-all → `error.tsx`).
1172
+ *
1173
+ * 2. **Runtime matching** (`renderMatchingDenyPage`) — picks the first
1174
+ * chain entry whose status filter matches the thrown DenySignal and
1175
+ * returns a React element for the matching component. Used by
1176
+ * `AccessGate` and `PageDenyBoundary` when they catch a deny.
1177
+ *
1178
+ * 3. **The page boundary itself** (`PageDenyBoundary`) — the async server
1179
+ * component that wraps a server-component page, calls it, and catches
1180
+ * `DenySignal` so the deny page renders in-tree (no throw reaches
1181
+ * React Flight, single render pass).
1395
1182
  *
1396
- * When AccessGate or PageDenyBoundary catches a DenySignal, they need to
1397
- * render the matching deny page (403.tsx, 4xx.tsx, error.tsx) as a normal
1398
- * element in the React tree. This module resolves the deny page chain from
1399
- * the segment chain — a list of fallback components ordered by specificity.
1183
+ * Plus the ALS helpers (`setDenyStatus` / `getDenyStatus`) the boundary
1184
+ * uses to thread the matched status code back to the pipeline so the
1185
+ * HTTP status reflects the deny.
1400
1186
  *
1401
- * The chain is built during buildRouteElement and passed as a prop to
1402
- * AccessGate and PageDenyBoundary. At catch time, the first matching
1403
- * component is rendered.
1187
+ * Folded into one module from the former `deny-page-resolver.ts` and
1188
+ * `page-deny-boundary.tsx` (TIM-853) the names were misleading and the
1189
+ * three pieces only made sense together.
1404
1190
  *
1405
- * See design/10-error-handling.md §"Status-Code Files", TIM-666.
1191
+ * See design/04-authorization.md, design/10-error-handling.md, TIM-666.
1406
1192
  */
1407
1193
  /**
1408
1194
  * Find the first deny page in the chain that matches the given status code.
@@ -1749,19 +1535,7 @@ function pathnameMatchesPattern(pathname, pattern) {
1749
1535
  return pi === pathParts.length;
1750
1536
  }
1751
1537
  //#endregion
1752
- //#region src/server/pipeline-phases.ts
1753
- /**
1754
- * Pipeline phase functions — module-level free functions that take their
1755
- * dependencies as explicit parameters. Each phase returns a `PhaseOutcome`
1756
- * (a discriminated union over response / redirect / deny / error). The
1757
- * terminal `outcomeToResponse` translates outcomes into Responses.
1758
- *
1759
- * Lifted out of `createPipeline` so each phase can be unit-tested in
1760
- * isolation. The lift is mechanical — these functions used to be closures
1761
- * over `config`; they now take `config` as an explicit parameter.
1762
- *
1763
- * See design/07-routing.md §"Request Lifecycle", design/02-rendering-pipeline.md §"Request Flow".
1764
- */
1538
+ //#region src/server/param-coercion.ts
1765
1539
  /**
1766
1540
  * Run segment param coercion on the matched route's segments.
1767
1541
  *
@@ -1773,10 +1547,10 @@ function pathnameMatchesPattern(pathname, pattern) {
1773
1547
  * See design/07-routing.md §"Where Coercion Runs"
1774
1548
  */
1775
1549
  async function coerceSegmentParams(match) {
1776
- const segments = match.segments;
1777
- let mergeTarget = match.segmentParams;
1778
- let usesNullPrototypeTarget = Object.getPrototypeOf(mergeTarget) === null;
1779
- for (const segment of segments) {
1550
+ const mergeTarget = Object.create(null);
1551
+ for (const key of Object.keys(match.segmentParams)) if (key !== "__proto__") mergeTarget[key] = match.segmentParams[key];
1552
+ match.segmentParams = mergeTarget;
1553
+ for (const segment of match.segments) {
1780
1554
  if (!segment.params) continue;
1781
1555
  let mod;
1782
1556
  try {
@@ -1788,18 +1562,131 @@ async function coerceSegmentParams(match) {
1788
1562
  if (!segmentParamsDef || typeof segmentParamsDef.parse !== "function") continue;
1789
1563
  try {
1790
1564
  const coerced = segmentParamsDef.parse(match.segmentParams);
1791
- if (!usesNullPrototypeTarget) {
1792
- mergeTarget = Object.create(null);
1793
- safeMerge(mergeTarget, match.segmentParams);
1794
- match.segmentParams = mergeTarget;
1795
- usesNullPrototypeTarget = true;
1796
- }
1797
- safeMerge(mergeTarget, coerced);
1565
+ for (const key of Object.keys(coerced)) if (key !== "__proto__") mergeTarget[key] = sanitizeParamValue(coerced[key]);
1798
1566
  } catch (err) {
1799
1567
  throw new ParamCoercionError(err instanceof Error ? err.message : String(err));
1800
1568
  }
1801
1569
  }
1802
1570
  }
1571
+ //#endregion
1572
+ //#region src/server/pipeline-outcome.ts
1573
+ /**
1574
+ * Pipeline outcome translator — converts a `PhaseOutcome` (the value
1575
+ * each phase function returns) into a final `Response`.
1576
+ *
1577
+ * Lifted out of `pipeline-phases.ts` (TIM-853) so the per-phase try /
1578
+ * catch logic and the terminal Response-building logic each live in
1579
+ * their own file. The phases produce values; this module is the single
1580
+ * source of truth for how those values become wire responses.
1581
+ *
1582
+ * See design/07-routing.md §"Request Lifecycle".
1583
+ */
1584
+ /**
1585
+ * Terminal outcome handler — converts a `PhaseOutcome` into a final
1586
+ * `Response`, applying cookies, building redirects, rendering deny pages
1587
+ * and fallback error pages, and firing instrumentation hooks.
1588
+ *
1589
+ * This is the single source of truth for how phase outputs become wire
1590
+ * responses; the per-phase try/catch blocks now produce values, not
1591
+ * Responses, so the conversion logic lives in exactly one place.
1592
+ */
1593
+ async function outcomeToResponse(config, outcome, ctx) {
1594
+ switch (outcome.kind) {
1595
+ case "response": {
1596
+ const finalResponse = cloneWithMutableHeaders(outcome.response);
1597
+ if (outcome.phase === "proxy") return finalResponse;
1598
+ if (outcome.phase === "middleware" && ctx.responseHeaders) {
1599
+ applyCookieJar(finalResponse.headers);
1600
+ mergeMissingHeaders(finalResponse.headers, ctx.responseHeaders);
1601
+ logMiddlewareShortCircuit({
1602
+ method: ctx.method,
1603
+ path: ctx.path,
1604
+ status: finalResponse.status
1605
+ });
1606
+ }
1607
+ if (outcome.phase === "render") markResponseFlushed();
1608
+ return finalResponse;
1609
+ }
1610
+ case "redirect": {
1611
+ const headers = ctx.responseHeaders ?? new Headers();
1612
+ applyCookieJar(headers);
1613
+ return buildRedirectResponse(outcome.signal, ctx.req, headers);
1614
+ }
1615
+ case "deny": {
1616
+ const headers = ctx.responseHeaders ?? new Headers();
1617
+ applyCookieJar(headers);
1618
+ if (config.renderDenyFallback) try {
1619
+ return cloneWithMutableHeaders(await config.renderDenyFallback(outcome.signal, ctx.req, headers, ctx.match));
1620
+ } catch (denyRenderError) {
1621
+ logRenderError({
1622
+ method: ctx.method,
1623
+ path: ctx.path,
1624
+ error: denyRenderError
1625
+ });
1626
+ await fireOnRequestError(denyRenderError, ctx.req, "render");
1627
+ if (config.onPipelineError && denyRenderError instanceof Error) config.onPipelineError(denyRenderError, "render");
1628
+ }
1629
+ return new Response(null, {
1630
+ status: outcome.signal.status,
1631
+ headers
1632
+ });
1633
+ }
1634
+ case "error": {
1635
+ if (outcome.phase === "proxy") {
1636
+ logProxyError({ error: outcome.error });
1637
+ await fireOnRequestError(outcome.error, ctx.req, "proxy");
1638
+ if (config.onPipelineError && outcome.error instanceof Error) config.onPipelineError(outcome.error, "proxy");
1639
+ return new Response(null, { status: 500 });
1640
+ }
1641
+ if (outcome.phase === "middleware") {
1642
+ logMiddlewareError({
1643
+ method: ctx.method,
1644
+ path: ctx.path,
1645
+ error: outcome.error
1646
+ });
1647
+ await fireOnRequestError(outcome.error, ctx.req, "handler");
1648
+ if (config.onPipelineError && outcome.error instanceof Error) config.onPipelineError(outcome.error, "middleware");
1649
+ return new Response(null, { status: 500 });
1650
+ }
1651
+ const headers = ctx.responseHeaders ?? new Headers();
1652
+ applyCookieJar(headers);
1653
+ logRenderError({
1654
+ method: ctx.method,
1655
+ path: ctx.path,
1656
+ error: outcome.error
1657
+ });
1658
+ await fireOnRequestError(outcome.error, ctx.req, "render");
1659
+ if (config.onPipelineError && outcome.error instanceof Error) config.onPipelineError(outcome.error, "render");
1660
+ if (config.renderFallbackError) try {
1661
+ return cloneWithMutableHeaders(await config.renderFallbackError(outcome.error, ctx.req, headers));
1662
+ } catch (fallbackRenderError) {
1663
+ logRenderError({
1664
+ method: ctx.method,
1665
+ path: ctx.path,
1666
+ error: fallbackRenderError
1667
+ });
1668
+ await fireOnRequestError(fallbackRenderError, ctx.req, "render");
1669
+ if (config.onPipelineError && fallbackRenderError instanceof Error) config.onPipelineError(fallbackRenderError, "render");
1670
+ }
1671
+ return new Response(null, { status: 500 });
1672
+ }
1673
+ }
1674
+ }
1675
+ //#endregion
1676
+ //#region src/server/pipeline-phases.ts
1677
+ /**
1678
+ * Pipeline phase functions — module-level free functions that take their
1679
+ * dependencies as explicit parameters. Each phase returns a `PhaseOutcome`
1680
+ * (a discriminated union over response / redirect / deny / error) defined
1681
+ * in `pipeline-outcome.ts`. The terminal `outcomeToResponse` (also in
1682
+ * `pipeline-outcome.ts`) translates outcomes into Responses.
1683
+ *
1684
+ * Lifted out of `createPipeline` so each phase can be unit-tested in
1685
+ * isolation. The lift is mechanical — these functions used to be closures
1686
+ * over `config`; they now take `config` as an explicit parameter.
1687
+ *
1688
+ * See design/07-routing.md §"Request Lifecycle", design/02-rendering-pipeline.md §"Request Flow".
1689
+ */
1803
1690
  /**
1804
1691
  * Run the proxy.ts phase. Calls user proxy code and uses `handleRequest` as
1805
1692
  * the inner `next()` continuation. The proxy resolver was picked at pipeline
@@ -1943,7 +1830,7 @@ async function handleRequest(config, req, method, path) {
1943
1830
  if (typeof handlerResult === "string") body = handlerResult;
1944
1831
  else if (contentType === "application/xml") body = serializeSitemap(handlerResult);
1945
1832
  else if (contentType === "application/manifest+json") body = JSON.stringify(handlerResult, null, 2);
1946
- else body = typeof handlerResult === "string" ? handlerResult : String(handlerResult);
1833
+ else body = String(handlerResult);
1947
1834
  return new Response(body, {
1948
1835
  status: 200,
1949
1836
  headers: { "Content-Type": `${contentType}; charset=utf-8` }
@@ -2005,7 +1892,9 @@ async function handleRequest(config, req, method, path) {
2005
1892
  responseHeaders.set("Cache-Control", "private, no-cache, no-store, max-age=0, must-revalidate");
2006
1893
  if (config.earlyHints) try {
2007
1894
  await config.earlyHints(match, req, responseHeaders);
2008
- } catch {}
1895
+ } catch (err) {
1896
+ swallow(err, "early hints hook threw");
1897
+ }
2009
1898
  try {
2010
1899
  await coerceSegmentParams(match);
2011
1900
  } catch (error) {
@@ -2018,7 +1907,7 @@ async function handleRequest(config, req, method, path) {
2018
1907
  throw error;
2019
1908
  }
2020
1909
  setSegmentParams(match.segmentParams);
2021
- return outcomeToResponse(config, match.middlewareChain.length > 0 ? await runMiddlewarePhase(config, req, match, responseHeaders, requestHeaderOverlay, {
1910
+ return outcomeToResponse(config, !shouldBypassMiddleware(req) && match.middlewareChain.length > 0 ? await runMiddlewarePhase(config, req, match, responseHeaders, requestHeaderOverlay, {
2022
1911
  canonicalPathname,
2023
1912
  interception
2024
1913
  }) : await runRenderPhase(config, req, match, responseHeaders, requestHeaderOverlay, {
@@ -2032,81 +1921,6 @@ async function handleRequest(config, req, method, path) {
2032
1921
  match
2033
1922
  });
2034
1923
  }
2035
- /**
2036
- * Terminal outcome handler — converts a `PhaseOutcome` into a final
2037
- * `Response`, applying cookies, building redirects, rendering deny pages
2038
- * and fallback error pages, and firing instrumentation hooks.
2039
- *
2040
- * This is the single source of truth for how phase outputs become wire
2041
- * responses; the per-phase try/catch blocks now produce values, not
2042
- * Responses, so the conversion logic lives in exactly one place.
2043
- */
2044
- async function outcomeToResponse(config, outcome, ctx) {
2045
- switch (outcome.kind) {
2046
- case "response": {
2047
- const finalResponse = cloneWithMutableHeaders(outcome.response);
2048
- if (outcome.phase === "proxy") return finalResponse;
2049
- if (outcome.phase === "middleware" && ctx.responseHeaders) {
2050
- applyCookieJar(finalResponse.headers);
2051
- mergeMissingHeaders(finalResponse.headers, ctx.responseHeaders);
2052
- logMiddlewareShortCircuit({
2053
- method: ctx.method,
2054
- path: ctx.path,
2055
- status: finalResponse.status
2056
- });
2057
- }
2058
- if (outcome.phase === "render") markResponseFlushed();
2059
- return finalResponse;
2060
- }
2061
- case "redirect": {
2062
- const headers = ctx.responseHeaders ?? new Headers();
2063
- applyCookieJar(headers);
2064
- return buildRedirectResponse(outcome.signal, ctx.req, headers);
2065
- }
2066
- case "deny": {
2067
- const headers = ctx.responseHeaders ?? new Headers();
2068
- applyCookieJar(headers);
2069
- if (config.renderDenyFallback) try {
2070
- return cloneWithMutableHeaders(await config.renderDenyFallback(outcome.signal, ctx.req, headers, ctx.match));
2071
- } catch {}
2072
- return new Response(null, {
2073
- status: outcome.signal.status,
2074
- headers
2075
- });
2076
- }
2077
- case "error": {
2078
- if (outcome.phase === "proxy") {
2079
- logProxyError({ error: outcome.error });
2080
- await fireOnRequestError(outcome.error, ctx.req, "proxy");
2081
- if (config.onPipelineError && outcome.error instanceof Error) config.onPipelineError(outcome.error, "proxy");
2082
- return new Response(null, { status: 500 });
2083
- }
2084
- if (outcome.phase === "middleware") {
2085
- logMiddlewareError({
2086
- method: ctx.method,
2087
- path: ctx.path,
2088
- error: outcome.error
2089
- });
2090
- await fireOnRequestError(outcome.error, ctx.req, "handler");
2091
- if (config.onPipelineError && outcome.error instanceof Error) config.onPipelineError(outcome.error, "middleware");
2092
- return new Response(null, { status: 500 });
2093
- }
2094
- const headers = ctx.responseHeaders ?? new Headers();
2095
- applyCookieJar(headers);
2096
- logRenderError({
2097
- method: ctx.method,
2098
- path: ctx.path,
2099
- error: outcome.error
2100
- });
2101
- await fireOnRequestError(outcome.error, ctx.req, "render");
2102
- if (config.onPipelineError && outcome.error instanceof Error) config.onPipelineError(outcome.error, "render");
2103
- if (config.renderFallbackError) try {
2104
- return cloneWithMutableHeaders(await config.renderFallbackError(outcome.error, ctx.req, headers));
2105
- } catch {}
2106
- return new Response(null, { status: 500 });
2107
- }
2108
- }
2109
- }
2110
1924
  //#endregion
2111
1925
  //#region src/server/pipeline.ts
2112
1926
  /**
@@ -2386,10 +2200,46 @@ function sendEarlyHints103(links) {
2386
2200
  if (!sender) return;
2387
2201
  try {
2388
2202
  sender(links);
2389
- } catch {}
2203
+ } catch (err) {
2204
+ swallow(err, "early hints 103 send failed");
2205
+ }
2390
2206
  }
2391
2207
  //#endregion
2392
2208
  //#region src/server/tree-builder.ts
2209
+ var REACT_COMPONENT_TYPE_MARKERS = new Set([
2210
+ Symbol.for("react.forward_ref"),
2211
+ Symbol.for("react.memo"),
2212
+ Symbol.for("react.lazy"),
2213
+ Symbol.for("react.provider"),
2214
+ Symbol.for("react.context"),
2215
+ Symbol.for("react.suspense"),
2216
+ Symbol.for("react.suspense_list"),
2217
+ Symbol.for("react.client.reference")
2218
+ ]);
2219
+ /**
2220
+ * Validate that a loaded module's `default` export is something React
2221
+ * accepts as the first argument to `createElement` — i.e. a valid component
2222
+ * type. React doesn't export `isValidElementType` (only `isValidElement`,
2223
+ * which checks for *elements*, not *component types*), so this mirrors
2224
+ * React's internal check:
2225
+ *
2226
+ * - functions → function or class components
2227
+ * - objects with a `$$typeof` matching one of React's known component
2228
+ * markers → exotic components (`memo`, `forwardRef`, `lazy`, context,
2229
+ * suspense, client references via `@vitejs/plugin-rsc`)
2230
+ *
2231
+ * Strings (HTML tag names) are valid for `createElement` but never appear
2232
+ * as a route module's default export, so they're not recognized here.
2233
+ *
2234
+ * Anything else (numbers, plain config objects, JSON, etc.) is rejected so
2235
+ * the boundary wrapper is skipped rather than crashing inside React.
2236
+ */
2237
+ function isValidElementType(value) {
2238
+ if (typeof value === "function") return true;
2239
+ if (typeof value !== "object" || value === null) return false;
2240
+ const marker = value.$$typeof;
2241
+ return typeof marker === "symbol" && REACT_COMPONENT_TYPE_MARKERS.has(marker);
2242
+ }
2393
2243
  /**
2394
2244
  * Build the unified element tree from a matched segment chain.
2395
2245
  *
@@ -2504,7 +2354,8 @@ async function wrapWithErrorBoundaries(segment, element, loadModule, createEleme
2504
2354
  for (const [key, file] of Object.entries(segment.statusFiles)) if (key !== "4xx" && key !== "5xx") {
2505
2355
  const status = parseInt(key, 10);
2506
2356
  if (!isNaN(status)) {
2507
- const Component = (await loadModule(file)).default;
2357
+ const mod = await loadModule(file);
2358
+ const Component = isValidElementType(mod.default) ? mod.default : null;
2508
2359
  if (Component) element = createElement(errorBoundaryComponent, isMdxFile(file) ? {
2509
2360
  fallbackElement: createElement(Component, { status }),
2510
2361
  status,
@@ -2517,7 +2368,8 @@ async function wrapWithErrorBoundaries(segment, element, loadModule, createEleme
2517
2368
  }
2518
2369
  }
2519
2370
  for (const [key, file] of Object.entries(segment.statusFiles)) if (key === "4xx" || key === "5xx") {
2520
- const Component = (await loadModule(file)).default;
2371
+ const mod = await loadModule(file);
2372
+ const Component = isValidElementType(mod.default) ? mod.default : null;
2521
2373
  if (Component) {
2522
2374
  const categoryStatus = key === "4xx" ? 400 : 500;
2523
2375
  element = createElement(errorBoundaryComponent, isMdxFile(file) ? {
@@ -2533,7 +2385,8 @@ async function wrapWithErrorBoundaries(segment, element, loadModule, createEleme
2533
2385
  }
2534
2386
  }
2535
2387
  if (segment.error) {
2536
- const ErrorComponent = (await loadModule(segment.error)).default;
2388
+ const errorModule = await loadModule(segment.error);
2389
+ const ErrorComponent = isValidElementType(errorModule.default) ? errorModule.default : null;
2537
2390
  if (ErrorComponent) element = createElement(errorBoundaryComponent, isMdxFile(segment.error) ? {
2538
2391
  fallbackElement: createElement(ErrorComponent, {}),
2539
2392
  children: element
@@ -3042,6 +2895,6 @@ var RenderTimeoutError = class extends Error {
3042
2895
  }
3043
2896
  };
3044
2897
  //#endregion
3045
- export { AccessGate, DEFAULT_LIMITS, DenySignal, METADATA_ROUTE_CONVENTIONS, RedirectSignal, RenderError, RenderTimeoutError, SlotAccessGate, WarningId, buildElementTree, buildNoJsResponse, callOnRequestError, canonicalize, classifyMetadataRoute, collectEarlyHintHeaders, createPipeline, enforceBodyLimits, executeAction, flushResponse, formatLinkHeader, generateTraceId, getLogger, getMetadataRouteAutoLink, getMetadataRouteServePath, getSetCookieHeaders, handleRouteRequest, hasOnRequestError, isRscActionRequest, loadInstrumentation, logCacheMiss, logMiddlewareError, logMiddlewareShortCircuit, logProxyError, logRenderError, logRequestCompleted, logRequestReceived, logSlowRequest, logSwrRefetchFailed, logWaitUntilRejected, logWaitUntilUnsupported, markResponseFlushed, parseBodySize, renderMetadataToElements, replaceTraceId, resolveAllowedMethods, resolveMetadata, resolveMetadataUrls, resolveSlotDenied, resolveStatusFile, resolveTitle, runMiddleware, runProxy, runWithEarlyHintsSender, runWithRequestContext, runWithTraceId, sendEarlyHints103, setLogger, setMutableCookieContext, setSegmentParams, setViteServer, validateCsrf, warnDenyInSuspense, warnRedirectInAccess, warnRedirectInSuspense, warnSlowSlotWithoutSuspense, warnStaticRequestApi, warnSuspenseWrappingChildren };
2898
+ export { AccessGate, DEFAULT_LIMITS, DenySignal, METADATA_ROUTE_CONVENTIONS, RedirectSignal, RenderError, RenderTimeoutError, SlotAccessGate, WarningId, buildElementTree, buildNoJsResponse, callOnRequestError, canonicalize, classifyMetadataRoute, coerce, collectEarlyHintHeaders, createPipeline, enforceBodyLimits, executeAction, flushResponse, formatLinkHeader, generateTraceId, getCookie, getHeader, getLogger, getMetadataRouteAutoLink, getMetadataRouteServePath, getSearchParams, getSegmentParams, getSetCookieHeaders, handleRouteRequest, hasOnRequestError, isRscActionRequest, loadInstrumentation, logCacheMiss, logMiddlewareError, logMiddlewareShortCircuit, logProxyError, logRenderError, logRequestCompleted, logRequestReceived, logSlowRequest, logSwrRefetchFailed, logWaitUntilRejected, logWaitUntilUnsupported, markResponseFlushed, parseBodySize, renderMetadataToElements, replaceTraceId, resolveAllowedMethods, resolveMetadata, resolveMetadataUrls, resolveSlotDenied, resolveStatusFile, resolveTitle, runMiddleware, runProxy, runWithEarlyHintsSender, runWithRequestContext, runWithTraceId, sendEarlyHints103, setLogger, setMutableCookieContext, setSegmentParams, setViteServer, validateCsrf, warnDenyInSuspense, warnRedirectInAccess, warnRedirectInSuspense, warnSlowSlotWithoutSuspense, warnStaticRequestApi, warnSuspenseWrappingChildren };
3046
2899
 
3047
2900
  //# sourceMappingURL=internal.js.map