vinext 0.0.49 → 0.0.50

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 (390) hide show
  1. package/dist/build/client-build-config.js.map +1 -1
  2. package/dist/build/google-fonts/build-url.js.map +1 -1
  3. package/dist/build/google-fonts/get-axes.js.map +1 -1
  4. package/dist/build/google-fonts/sort-variants.js.map +1 -1
  5. package/dist/build/google-fonts/validate.js.map +1 -1
  6. package/dist/build/layout-classification.js.map +1 -1
  7. package/dist/build/nitro-route-rules.js.map +1 -1
  8. package/dist/build/precompress.js.map +1 -1
  9. package/dist/build/prerender.d.ts +17 -1
  10. package/dist/build/prerender.js +77 -16
  11. package/dist/build/prerender.js.map +1 -1
  12. package/dist/build/report.js.map +1 -1
  13. package/dist/build/route-classification-injector.js.map +1 -1
  14. package/dist/build/route-classification-manifest.js.map +1 -1
  15. package/dist/build/run-prerender.js.map +1 -1
  16. package/dist/build/server-manifest.js.map +1 -1
  17. package/dist/build/ssr-manifest.js.map +1 -1
  18. package/dist/build/standalone.js.map +1 -1
  19. package/dist/build/static-export.js.map +1 -1
  20. package/dist/check.js +1 -1
  21. package/dist/check.js.map +1 -1
  22. package/dist/cli-args.js.map +1 -1
  23. package/dist/cli.js +8 -4
  24. package/dist/cli.js.map +1 -1
  25. package/dist/client/instrumentation-client-state.js.map +1 -1
  26. package/dist/client/validate-module-path.js.map +1 -1
  27. package/dist/client/vinext-next-data.d.ts +5 -1
  28. package/dist/client/window-next.d.ts +149 -0
  29. package/dist/client/window-next.js +48 -0
  30. package/dist/client/window-next.js.map +1 -0
  31. package/dist/cloudflare/kv-cache-handler.js.map +1 -1
  32. package/dist/cloudflare/tpr.js +2 -1
  33. package/dist/cloudflare/tpr.js.map +1 -1
  34. package/dist/config/config-matchers.d.ts +3 -1
  35. package/dist/config/config-matchers.js +5 -4
  36. package/dist/config/config-matchers.js.map +1 -1
  37. package/dist/config/dotenv.js.map +1 -1
  38. package/dist/config/next-config.d.ts +6 -3
  39. package/dist/config/next-config.js +13 -2
  40. package/dist/config/next-config.js.map +1 -1
  41. package/dist/deploy.js +13 -5
  42. package/dist/deploy.js.map +1 -1
  43. package/dist/entries/app-browser-entry.d.ts +3 -1
  44. package/dist/entries/app-browser-entry.js +11 -2
  45. package/dist/entries/app-browser-entry.js.map +1 -1
  46. package/dist/entries/app-rsc-entry.js +11 -0
  47. package/dist/entries/app-rsc-entry.js.map +1 -1
  48. package/dist/entries/app-rsc-manifest.js +4 -0
  49. package/dist/entries/app-rsc-manifest.js.map +1 -1
  50. package/dist/entries/app-ssr-entry.js.map +1 -1
  51. package/dist/entries/pages-client-entry.js.map +1 -1
  52. package/dist/entries/pages-entry-helpers.js.map +1 -1
  53. package/dist/entries/pages-server-entry.js +15 -0
  54. package/dist/entries/pages-server-entry.js.map +1 -1
  55. package/dist/entries/runtime-entry-module.js.map +1 -1
  56. package/dist/index.js +76 -18
  57. package/dist/index.js.map +1 -1
  58. package/dist/init.js.map +1 -1
  59. package/dist/plugins/async-hooks-stub.js.map +1 -1
  60. package/dist/plugins/client-reference-dedup.js.map +1 -1
  61. package/dist/plugins/fonts.js.map +1 -1
  62. package/dist/plugins/instrumentation-client.js.map +1 -1
  63. package/dist/plugins/og-assets.js.map +1 -1
  64. package/dist/plugins/optimize-imports.js.map +1 -1
  65. package/dist/plugins/postcss.js.map +1 -1
  66. package/dist/plugins/rsc-client-reference-loaders.d.ts +7 -0
  67. package/dist/plugins/rsc-client-reference-loaders.js +48 -0
  68. package/dist/plugins/rsc-client-reference-loaders.js.map +1 -0
  69. package/dist/plugins/rsc-client-shim-excludes.js.map +1 -1
  70. package/dist/plugins/server-externals-manifest.js.map +1 -1
  71. package/dist/plugins/strip-server-exports.js.map +1 -1
  72. package/dist/routing/app-route-graph.d.ts +48 -5
  73. package/dist/routing/app-route-graph.js +159 -15
  74. package/dist/routing/app-route-graph.js.map +1 -1
  75. package/dist/routing/app-router.js.map +1 -1
  76. package/dist/routing/file-matcher.js.map +1 -1
  77. package/dist/routing/pages-router.js.map +1 -1
  78. package/dist/routing/route-matching.js.map +1 -1
  79. package/dist/routing/route-pattern.js.map +1 -1
  80. package/dist/routing/route-trie.js.map +1 -1
  81. package/dist/routing/route-validation.js.map +1 -1
  82. package/dist/routing/utils.js.map +1 -1
  83. package/dist/server/api-handler.js.map +1 -1
  84. package/dist/server/app-browser-action-result.d.ts +19 -0
  85. package/dist/server/app-browser-action-result.js +18 -0
  86. package/dist/server/app-browser-action-result.js.map +1 -0
  87. package/dist/server/app-browser-entry.js +91 -48
  88. package/dist/server/app-browser-entry.js.map +1 -1
  89. package/dist/server/app-browser-error.js.map +1 -1
  90. package/dist/server/app-browser-hydration.d.ts +19 -0
  91. package/dist/server/app-browser-hydration.js +22 -0
  92. package/dist/server/app-browser-hydration.js.map +1 -0
  93. package/dist/server/app-browser-navigation-controller.d.ts +6 -3
  94. package/dist/server/app-browser-navigation-controller.js +67 -19
  95. package/dist/server/app-browser-navigation-controller.js.map +1 -1
  96. package/dist/server/app-browser-state.d.ts +17 -17
  97. package/dist/server/app-browser-state.js +122 -36
  98. package/dist/server/app-browser-state.js.map +1 -1
  99. package/dist/server/app-browser-stream.d.ts +4 -0
  100. package/dist/server/app-browser-stream.js +24 -2
  101. package/dist/server/app-browser-stream.js.map +1 -1
  102. package/dist/server/app-browser-visible-commit.d.ts +6 -1
  103. package/dist/server/app-browser-visible-commit.js +34 -19
  104. package/dist/server/app-browser-visible-commit.js.map +1 -1
  105. package/dist/server/app-client-reference-preloader.js.map +1 -1
  106. package/dist/server/app-elements-wire.d.ts +6 -1
  107. package/dist/server/app-elements-wire.js +17 -1
  108. package/dist/server/app-elements-wire.js.map +1 -1
  109. package/dist/server/app-elements.d.ts +2 -2
  110. package/dist/server/app-elements.js +2 -2
  111. package/dist/server/app-elements.js.map +1 -1
  112. package/dist/server/app-fallback-renderer.js.map +1 -1
  113. package/dist/server/app-hook-warning-suppression.js.map +1 -1
  114. package/dist/server/app-middleware.d.ts +1 -1
  115. package/dist/server/app-middleware.js +4 -9
  116. package/dist/server/app-middleware.js.map +1 -1
  117. package/dist/server/app-mounted-slots-header.js.map +1 -1
  118. package/dist/server/app-page-boundary-render.d.ts +1 -0
  119. package/dist/server/app-page-boundary-render.js +14 -13
  120. package/dist/server/app-page-boundary-render.js.map +1 -1
  121. package/dist/server/app-page-boundary.d.ts +1 -0
  122. package/dist/server/app-page-boundary.js +7 -5
  123. package/dist/server/app-page-boundary.js.map +1 -1
  124. package/dist/server/app-page-cache.d.ts +10 -3
  125. package/dist/server/app-page-cache.js +42 -23
  126. package/dist/server/app-page-cache.js.map +1 -1
  127. package/dist/server/app-page-dispatch.d.ts +6 -1
  128. package/dist/server/app-page-dispatch.js +21 -7
  129. package/dist/server/app-page-dispatch.js.map +1 -1
  130. package/dist/server/app-page-element-builder.d.ts +3 -1
  131. package/dist/server/app-page-element-builder.js +6 -2
  132. package/dist/server/app-page-element-builder.js.map +1 -1
  133. package/dist/server/app-page-execution.js.map +1 -1
  134. package/dist/server/app-page-head.js +4 -0
  135. package/dist/server/app-page-head.js.map +1 -1
  136. package/dist/server/app-page-method.js.map +1 -1
  137. package/dist/server/app-page-params.js.map +1 -1
  138. package/dist/server/app-page-probe.js.map +1 -1
  139. package/dist/server/app-page-render.d.ts +7 -1
  140. package/dist/server/app-page-render.js +11 -4
  141. package/dist/server/app-page-render.js.map +1 -1
  142. package/dist/server/app-page-request.js +2 -1
  143. package/dist/server/app-page-request.js.map +1 -1
  144. package/dist/server/app-page-response.d.ts +2 -0
  145. package/dist/server/app-page-response.js +15 -5
  146. package/dist/server/app-page-response.js.map +1 -1
  147. package/dist/server/app-page-route-wiring.d.ts +6 -2
  148. package/dist/server/app-page-route-wiring.js +50 -49
  149. package/dist/server/app-page-route-wiring.js.map +1 -1
  150. package/dist/server/app-page-segment-state.d.ts +10 -0
  151. package/dist/server/app-page-segment-state.js +87 -0
  152. package/dist/server/app-page-segment-state.js.map +1 -0
  153. package/dist/server/app-page-stream.d.ts +7 -2
  154. package/dist/server/app-page-stream.js +3 -1
  155. package/dist/server/app-page-stream.js.map +1 -1
  156. package/dist/server/app-post-middleware-context.js.map +1 -1
  157. package/dist/server/app-prerender-endpoints.js.map +1 -1
  158. package/dist/server/app-prerender-static-params.js.map +1 -1
  159. package/dist/server/app-render-dependency.js.map +1 -1
  160. package/dist/server/app-request-context.js.map +1 -1
  161. package/dist/server/app-route-handler-cache.js.map +1 -1
  162. package/dist/server/app-route-handler-dispatch.js +3 -1
  163. package/dist/server/app-route-handler-dispatch.js.map +1 -1
  164. package/dist/server/app-route-handler-execution.js.map +1 -1
  165. package/dist/server/app-route-handler-policy.js +1 -0
  166. package/dist/server/app-route-handler-policy.js.map +1 -1
  167. package/dist/server/app-route-handler-response.js +4 -3
  168. package/dist/server/app-route-handler-response.js.map +1 -1
  169. package/dist/server/app-route-handler-runtime.js.map +1 -1
  170. package/dist/server/app-router-entry.js +6 -2
  171. package/dist/server/app-router-entry.js.map +1 -1
  172. package/dist/server/app-rsc-cache-busting.d.ts +5 -2
  173. package/dist/server/app-rsc-cache-busting.js +40 -19
  174. package/dist/server/app-rsc-cache-busting.js.map +1 -1
  175. package/dist/server/app-rsc-error-handler.js.map +1 -1
  176. package/dist/server/app-rsc-errors.js.map +1 -1
  177. package/dist/server/app-rsc-handler.d.ts +10 -1
  178. package/dist/server/app-rsc-handler.js +51 -17
  179. package/dist/server/app-rsc-handler.js.map +1 -1
  180. package/dist/server/app-rsc-render-mode.d.ts +11 -0
  181. package/dist/server/app-rsc-render-mode.js +21 -0
  182. package/dist/server/app-rsc-render-mode.js.map +1 -0
  183. package/dist/server/app-rsc-request-normalization.d.ts +4 -1
  184. package/dist/server/app-rsc-request-normalization.js +7 -2
  185. package/dist/server/app-rsc-request-normalization.js.map +1 -1
  186. package/dist/server/app-rsc-response-finalizer.d.ts +2 -1
  187. package/dist/server/app-rsc-response-finalizer.js +6 -1
  188. package/dist/server/app-rsc-response-finalizer.js.map +1 -1
  189. package/dist/server/app-rsc-route-matching.js.map +1 -1
  190. package/dist/server/app-segment-config.js.map +1 -1
  191. package/dist/server/app-server-action-execution.d.ts +16 -2
  192. package/dist/server/app-server-action-execution.js +79 -23
  193. package/dist/server/app-server-action-execution.js.map +1 -1
  194. package/dist/server/app-ssr-entry.d.ts +6 -0
  195. package/dist/server/app-ssr-entry.js +10 -4
  196. package/dist/server/app-ssr-entry.js.map +1 -1
  197. package/dist/server/app-ssr-stream.js.map +1 -1
  198. package/dist/server/app-static-generation.js.map +1 -1
  199. package/dist/server/artifact-compatibility.js.map +1 -1
  200. package/dist/server/cache-control.js +1 -0
  201. package/dist/server/cache-control.js.map +1 -1
  202. package/dist/server/cache-proof.js.map +1 -1
  203. package/dist/server/csp.js.map +1 -1
  204. package/dist/server/dev-error-overlay-store.js.map +1 -1
  205. package/dist/server/dev-error-overlay.js +5 -0
  206. package/dist/server/dev-error-overlay.js.map +1 -1
  207. package/dist/server/dev-module-runner.js.map +1 -1
  208. package/dist/server/dev-origin-check.js.map +1 -1
  209. package/dist/server/dev-route-files.js.map +1 -1
  210. package/dist/server/dev-server.js +8 -5
  211. package/dist/server/dev-server.js.map +1 -1
  212. package/dist/server/file-based-metadata.js.map +1 -1
  213. package/dist/server/headers.d.ts +79 -0
  214. package/dist/server/headers.js +101 -0
  215. package/dist/server/headers.js.map +1 -0
  216. package/dist/server/html.js.map +1 -1
  217. package/dist/server/http-error-responses.js.map +1 -1
  218. package/dist/server/image-optimization.d.ts +11 -1
  219. package/dist/server/image-optimization.js.map +1 -1
  220. package/dist/server/implicit-tags.js +2 -1
  221. package/dist/server/implicit-tags.js.map +1 -1
  222. package/dist/server/instrumentation-runtime.js.map +1 -1
  223. package/dist/server/instrumentation.js.map +1 -1
  224. package/dist/server/isr-cache.d.ts +10 -1
  225. package/dist/server/isr-cache.js +12 -3
  226. package/dist/server/isr-cache.js.map +1 -1
  227. package/dist/server/metadata-route-build-data.js.map +1 -1
  228. package/dist/server/metadata-route-response.js.map +1 -1
  229. package/dist/server/metadata-routes.js.map +1 -1
  230. package/dist/server/middleware-matcher.js.map +1 -1
  231. package/dist/server/middleware-request-headers.d.ts +4 -1
  232. package/dist/server/middleware-request-headers.js +15 -8
  233. package/dist/server/middleware-request-headers.js.map +1 -1
  234. package/dist/server/middleware-response-headers.d.ts +2 -1
  235. package/dist/server/middleware-response-headers.js +1 -1
  236. package/dist/server/middleware-response-headers.js.map +1 -1
  237. package/dist/server/middleware-runtime.d.ts +1 -0
  238. package/dist/server/middleware-runtime.js +6 -3
  239. package/dist/server/middleware-runtime.js.map +1 -1
  240. package/dist/server/middleware.js.map +1 -1
  241. package/dist/server/navigation-planner.d.ts +119 -0
  242. package/dist/server/navigation-planner.js +171 -0
  243. package/dist/server/navigation-planner.js.map +1 -0
  244. package/dist/server/navigation-trace.d.ts +12 -2
  245. package/dist/server/navigation-trace.js +13 -1
  246. package/dist/server/navigation-trace.js.map +1 -1
  247. package/dist/server/next-error-digest.d.ts +3 -2
  248. package/dist/server/next-error-digest.js +4 -2
  249. package/dist/server/next-error-digest.js.map +1 -1
  250. package/dist/server/normalize-path.js.map +1 -1
  251. package/dist/server/pages-api-route.js.map +1 -1
  252. package/dist/server/pages-i18n.js.map +1 -1
  253. package/dist/server/pages-media-type.js.map +1 -1
  254. package/dist/server/pages-node-compat.js.map +1 -1
  255. package/dist/server/pages-page-data.js +5 -2
  256. package/dist/server/pages-page-data.js.map +1 -1
  257. package/dist/server/pages-page-response.js +3 -2
  258. package/dist/server/pages-page-response.js.map +1 -1
  259. package/dist/server/prerender-work-unit-setup.js +1 -1
  260. package/dist/server/prerender-work-unit-setup.js.map +1 -1
  261. package/dist/server/prod-server.js +35 -13
  262. package/dist/server/prod-server.js.map +1 -1
  263. package/dist/server/request-log.js.map +1 -1
  264. package/dist/server/request-pipeline.d.ts +1 -13
  265. package/dist/server/request-pipeline.js +3 -25
  266. package/dist/server/request-pipeline.js.map +1 -1
  267. package/dist/server/rsc-stream-hints.js.map +1 -1
  268. package/dist/server/seed-cache.js.map +1 -1
  269. package/dist/server/server-action-not-found.js +3 -3
  270. package/dist/server/server-action-not-found.js.map +1 -1
  271. package/dist/server/socket-error-backstop.js.map +1 -1
  272. package/dist/server/static-file-cache.js.map +1 -1
  273. package/dist/server/worker-utils.d.ts +0 -7
  274. package/dist/server/worker-utils.js +3 -2
  275. package/dist/server/worker-utils.js.map +1 -1
  276. package/dist/shims/amp.js.map +1 -1
  277. package/dist/shims/app.d.ts +37 -4
  278. package/dist/shims/app.js +50 -1
  279. package/dist/shims/app.js.map +1 -0
  280. package/dist/shims/cache-for-request.js.map +1 -1
  281. package/dist/shims/cache-runtime.js +20 -8
  282. package/dist/shims/cache-runtime.js.map +1 -1
  283. package/dist/shims/cache.d.ts +15 -3
  284. package/dist/shims/cache.js +99 -15
  285. package/dist/shims/cache.js.map +1 -1
  286. package/dist/shims/client-hook-error.js.map +1 -1
  287. package/dist/shims/compat-router.js.map +1 -1
  288. package/dist/shims/config.js.map +1 -1
  289. package/dist/shims/constants.js.map +1 -1
  290. package/dist/shims/document.js.map +1 -1
  291. package/dist/shims/dynamic.d.ts +18 -10
  292. package/dist/shims/dynamic.js +107 -51
  293. package/dist/shims/dynamic.js.map +1 -1
  294. package/dist/shims/error-boundary.d.ts +35 -6
  295. package/dist/shims/error-boundary.js +118 -33
  296. package/dist/shims/error-boundary.js.map +1 -1
  297. package/dist/shims/error.js.map +1 -1
  298. package/dist/shims/fetch-cache.d.ts +22 -1
  299. package/dist/shims/fetch-cache.js +124 -13
  300. package/dist/shims/fetch-cache.js.map +1 -1
  301. package/dist/shims/font-google-base.js.map +1 -1
  302. package/dist/shims/font-local.js.map +1 -1
  303. package/dist/shims/form.js +3 -1
  304. package/dist/shims/form.js.map +1 -1
  305. package/dist/shims/head-state.js.map +1 -1
  306. package/dist/shims/head.d.ts +3 -1
  307. package/dist/shims/head.js +28 -16
  308. package/dist/shims/head.js.map +1 -1
  309. package/dist/shims/headers.d.ts +4 -2
  310. package/dist/shims/headers.js +24 -7
  311. package/dist/shims/headers.js.map +1 -1
  312. package/dist/shims/i18n-context.js.map +1 -1
  313. package/dist/shims/i18n-state.js.map +1 -1
  314. package/dist/shims/image-config.d.ts +14 -1
  315. package/dist/shims/image-config.js +24 -1
  316. package/dist/shims/image-config.js.map +1 -1
  317. package/dist/shims/image.js +15 -2
  318. package/dist/shims/image.js.map +1 -1
  319. package/dist/shims/internal/als-registry.js.map +1 -1
  320. package/dist/shims/internal/app-router-context.d.ts +1 -0
  321. package/dist/shims/internal/app-router-context.js.map +1 -1
  322. package/dist/shims/internal/cookie-serialize.js.map +1 -1
  323. package/dist/shims/internal/make-hanging-promise.d.ts +1 -1
  324. package/dist/shims/internal/make-hanging-promise.js +1 -1
  325. package/dist/shims/internal/make-hanging-promise.js.map +1 -1
  326. package/dist/shims/internal/parse-cookie-header.js.map +1 -1
  327. package/dist/shims/internal/utils.js.map +1 -1
  328. package/dist/shims/internal/work-unit-async-storage.js +2 -2
  329. package/dist/shims/internal/work-unit-async-storage.js.map +1 -1
  330. package/dist/shims/layout-segment-context.js.map +1 -1
  331. package/dist/shims/legacy-image.js.map +1 -1
  332. package/dist/shims/link-prefetch.d.ts +34 -0
  333. package/dist/shims/link-prefetch.js +40 -0
  334. package/dist/shims/link-prefetch.js.map +1 -0
  335. package/dist/shims/link.d.ts +27 -4
  336. package/dist/shims/link.js +91 -27
  337. package/dist/shims/link.js.map +1 -1
  338. package/dist/shims/metadata.js.map +1 -1
  339. package/dist/shims/navigation-state.js.map +1 -1
  340. package/dist/shims/navigation.d.ts +22 -1
  341. package/dist/shims/navigation.js +30 -15
  342. package/dist/shims/navigation.js.map +1 -1
  343. package/dist/shims/navigation.react-server.js.map +1 -1
  344. package/dist/shims/offline.js.map +1 -1
  345. package/dist/shims/readonly-url-search-params.js.map +1 -1
  346. package/dist/shims/request-context.js.map +1 -1
  347. package/dist/shims/root-params.js.map +1 -1
  348. package/dist/shims/router-state.js.map +1 -1
  349. package/dist/shims/router.d.ts +38 -2
  350. package/dist/shims/router.js +45 -17
  351. package/dist/shims/router.js.map +1 -1
  352. package/dist/shims/script-nonce-context.js.map +1 -1
  353. package/dist/shims/script.js.map +1 -1
  354. package/dist/shims/server.js +10 -14
  355. package/dist/shims/server.js.map +1 -1
  356. package/dist/shims/slot.d.ts +6 -1
  357. package/dist/shims/slot.js +20 -7
  358. package/dist/shims/slot.js.map +1 -1
  359. package/dist/shims/thenable-params.js.map +1 -1
  360. package/dist/shims/unified-request-context.js +3 -0
  361. package/dist/shims/unified-request-context.js.map +1 -1
  362. package/dist/shims/url-safety.js.map +1 -1
  363. package/dist/shims/url-utils.d.ts +2 -1
  364. package/dist/shims/url-utils.js +10 -1
  365. package/dist/shims/url-utils.js.map +1 -1
  366. package/dist/shims/use-merged-ref.js.map +1 -1
  367. package/dist/shims/web-vitals.d.ts +4 -21
  368. package/dist/shims/web-vitals.js +19 -6
  369. package/dist/shims/web-vitals.js.map +1 -1
  370. package/dist/utils/base-path.js.map +1 -1
  371. package/dist/utils/cache-control-metadata.js.map +1 -1
  372. package/dist/utils/domain-locale.js.map +1 -1
  373. package/dist/utils/encode-cache-tag.d.ts +31 -0
  374. package/dist/utils/encode-cache-tag.js +38 -0
  375. package/dist/utils/encode-cache-tag.js.map +1 -0
  376. package/dist/utils/error-cause.js.map +1 -1
  377. package/dist/utils/hash.js.map +1 -1
  378. package/dist/utils/lazy-chunks.js.map +1 -1
  379. package/dist/utils/manifest-paths.js.map +1 -1
  380. package/dist/utils/mdx-scan.js.map +1 -1
  381. package/dist/utils/navigation-signal.d.ts +6 -0
  382. package/dist/utils/navigation-signal.js +14 -0
  383. package/dist/utils/navigation-signal.js.map +1 -0
  384. package/dist/utils/project.js.map +1 -1
  385. package/dist/utils/public-routes.js.map +1 -1
  386. package/dist/utils/query.js.map +1 -1
  387. package/dist/utils/safe-json-file.js.map +1 -1
  388. package/dist/utils/text-stream.js.map +1 -1
  389. package/dist/utils/vinext-root.js.map +1 -1
  390. package/package.json +6 -4
@@ -1 +1 @@
1
- {"version":3,"file":"app-route-handler-dispatch.js","names":[],"sources":["../../src/server/app-route-handler-dispatch.ts"],"sourcesContent":["import type { NextI18nConfig } from \"../config/next-config.js\";\nimport {\n getCollectedFetchTags,\n ensureFetchPatch,\n setCurrentFetchSoftTags,\n} from \"vinext/shims/fetch-cache\";\nimport {\n consumeDynamicUsage,\n getAndClearPendingCookies,\n getDraftModeCookieHeader,\n markDynamicUsage,\n setHeadersAccessPhase,\n} from \"vinext/shims/headers\";\nimport { setNavigationContext } from \"vinext/shims/navigation\";\nimport { getRequestExecutionContext } from \"vinext/shims/request-context\";\nimport { createRequestContext, runWithRequestContext } from \"vinext/shims/unified-request-context\";\nimport type { ISRCacheEntry } from \"./isr-cache.js\";\nimport {\n getAppRouteHandlerRevalidateSeconds,\n hasAppRouteHandlerDefaultExport,\n resolveAppRouteHandlerMethod,\n shouldReadAppRouteHandlerCache,\n type AppRouteHandlerModule,\n} from \"./app-route-handler-policy.js\";\nimport { readAppRouteHandlerCacheResponse } from \"./app-route-handler-cache.js\";\nimport {\n executeAppRouteHandler,\n type AppRouteDebugLogger,\n type AppRouteHandlerFunction,\n type AppRouteParams,\n type RouteHandlerCacheSetter,\n} from \"./app-route-handler-execution.js\";\nimport { isKnownDynamicAppRoute, isValidHTTPMethod } from \"./app-route-handler-runtime.js\";\nimport {\n applyRouteHandlerMiddlewareContext,\n type RouteHandlerMiddlewareContext,\n} from \"./app-route-handler-response.js\";\nimport { createStaticGenerationHeadersContext } from \"./app-static-generation.js\";\nimport { buildPageCacheTags } from \"./implicit-tags.js\";\nimport { makeThenableParams } from \"vinext/shims/thenable-params\";\nimport { reportRequestError } from \"./instrumentation.js\";\n\ntype AppRouteHandlerDispatchRoute = {\n pattern: string;\n routeHandler: AppRouteHandlerModule;\n routeSegments: string[];\n};\n\ntype RouteHandlerCacheGetter = (key: string) => Promise<ISRCacheEntry | null>;\ntype RouteHandlerBackgroundRegenerationErrorContext = {\n routerKind: \"App Router\";\n routePath: string;\n routeType: \"route\";\n};\ntype RouteHandlerBackgroundRegenerator = (\n key: string,\n renderFn: () => Promise<void>,\n errorContext?: RouteHandlerBackgroundRegenerationErrorContext,\n) => void;\n\ntype DispatchAppRouteHandlerOptions = {\n basePath?: string;\n cleanPathname: string;\n clearRequestContext: () => void;\n expireSeconds?: number;\n i18n?: NextI18nConfig | null;\n isDevelopment?: boolean;\n isProduction?: boolean;\n isrDebug?: AppRouteDebugLogger;\n isrGet: RouteHandlerCacheGetter;\n isrRouteKey: (pathname: string) => string;\n isrSet: RouteHandlerCacheSetter;\n middlewareContext: RouteHandlerMiddlewareContext;\n middlewareRequestHeaders?: Headers | null;\n params: AppRouteParams;\n request: Request;\n route: AppRouteHandlerDispatchRoute;\n scheduleBackgroundRegeneration: RouteHandlerBackgroundRegenerator;\n searchParams: URLSearchParams;\n};\n\nfunction isAppRouteHandlerFunction(value: unknown): value is AppRouteHandlerFunction {\n return typeof value === \"function\";\n}\n\nfunction buildRouteHandlerPageCacheTags(\n pathname: string,\n extraTags: string[],\n routeSegments: string[],\n): string[] {\n return buildPageCacheTags(pathname, extraTags, routeSegments, \"route\");\n}\n\nasync function runInRouteHandlerRevalidationContext(\n options: {\n cleanPathname: string;\n dynamicConfig?: string;\n routePattern: string;\n routeSegments: string[];\n },\n renderFn: () => Promise<void>,\n): Promise<void> {\n const headersContext = createStaticGenerationHeadersContext({\n dynamicConfig: options.dynamicConfig,\n routeKind: \"route\",\n routePattern: options.routePattern,\n });\n const requestContext = createRequestContext({\n headersContext,\n executionContext: getRequestExecutionContext(),\n unstableCacheRevalidation: \"foreground\",\n });\n\n await runWithRequestContext(requestContext, async () => {\n ensureFetchPatch();\n setCurrentFetchSoftTags(\n buildRouteHandlerPageCacheTags(options.cleanPathname, [], options.routeSegments),\n );\n await renderFn();\n });\n}\n\nexport async function dispatchAppRouteHandler(\n options: DispatchAppRouteHandlerOptions,\n): Promise<Response> {\n const { route } = options;\n const handler = route.routeHandler;\n const method = options.request.method.toUpperCase();\n const revalidateSeconds = getAppRouteHandlerRevalidateSeconds(handler);\n const isDevelopment = options.isDevelopment ?? process.env.NODE_ENV === \"development\";\n const isProduction = options.isProduction ?? process.env.NODE_ENV === \"production\";\n\n if (hasAppRouteHandlerDefaultExport(handler) && isDevelopment) {\n console.error(\n \"[vinext] Detected default export in route handler \" +\n route.pattern +\n \". Export a named export for each HTTP method instead.\",\n );\n }\n\n // Reject non-standard HTTP methods before any auto-OPTIONS/405 logic.\n // Next.js returns 400 for invalid methods; vinext mirrors that behavior.\n // https://github.com/vercel/next.js/blob/canary/packages/next/src/server/route-modules/app-route/module.ts#L390-L392\n if (!isValidHTTPMethod(method)) {\n options.clearRequestContext();\n return applyRouteHandlerMiddlewareContext(\n new Response(null, { status: 400 }),\n options.middlewareContext,\n );\n }\n\n const { allowHeaderForOptions, handlerFn, isAutoHead, shouldAutoRespondToOptions } =\n resolveAppRouteHandlerMethod(handler, method);\n\n if (shouldAutoRespondToOptions) {\n options.clearRequestContext();\n return applyRouteHandlerMiddlewareContext(\n new Response(null, {\n status: 204,\n headers: { Allow: allowHeaderForOptions },\n }),\n options.middlewareContext,\n );\n }\n\n const resolvedHandlerFn = isAppRouteHandlerFunction(handlerFn) ? handlerFn : undefined;\n\n if (\n revalidateSeconds !== null &&\n shouldReadAppRouteHandlerCache({\n dynamicConfig: handler.dynamic,\n handlerFn: resolvedHandlerFn,\n isAutoHead,\n isKnownDynamic: isKnownDynamicAppRoute(route.pattern),\n isProduction,\n method,\n revalidateSeconds,\n }) &&\n resolvedHandlerFn\n ) {\n const cachedRouteResponse = await readAppRouteHandlerCacheResponse({\n basePath: options.basePath,\n buildPageCacheTags(pathname, extraTags) {\n return buildRouteHandlerPageCacheTags(pathname, extraTags, route.routeSegments);\n },\n cleanPathname: options.cleanPathname,\n clearRequestContext: options.clearRequestContext,\n consumeDynamicUsage,\n dynamicConfig: handler.dynamic,\n getCollectedFetchTags,\n handlerFn: resolvedHandlerFn,\n i18n: options.i18n,\n isAutoHead,\n isrDebug: options.isrDebug,\n isrGet: options.isrGet,\n isrRouteKey: options.isrRouteKey,\n isrSet: options.isrSet,\n markDynamicUsage,\n middlewareContext: options.middlewareContext,\n params: options.params,\n requestUrl: options.request.url,\n revalidateSearchParams: options.searchParams,\n expireSeconds: options.expireSeconds,\n revalidateSeconds,\n routePattern: route.pattern,\n runInRevalidationContext(renderFn) {\n return runInRouteHandlerRevalidationContext(\n {\n cleanPathname: options.cleanPathname,\n dynamicConfig: handler.dynamic,\n routePattern: route.pattern,\n routeSegments: route.routeSegments,\n },\n renderFn,\n );\n },\n scheduleBackgroundRegeneration(key, renderFn) {\n options.scheduleBackgroundRegeneration(key, renderFn, {\n routerKind: \"App Router\",\n routePath: route.pattern,\n routeType: \"route\",\n });\n },\n setHeadersAccessPhase,\n setNavigationContext,\n });\n if (cachedRouteResponse) {\n return cachedRouteResponse;\n }\n }\n\n if (resolvedHandlerFn) {\n return executeAppRouteHandler({\n basePath: options.basePath,\n buildPageCacheTags(pathname, extraTags) {\n return buildRouteHandlerPageCacheTags(pathname, extraTags, route.routeSegments);\n },\n cleanPathname: options.cleanPathname,\n clearRequestContext: options.clearRequestContext,\n consumeDynamicUsage,\n executionContext: getRequestExecutionContext(),\n getAndClearPendingCookies,\n getCollectedFetchTags,\n getDraftModeCookieHeader,\n handler,\n handlerFn: resolvedHandlerFn,\n i18n: options.i18n,\n isAutoHead,\n isProduction,\n isrDebug: options.isrDebug,\n isrRouteKey: options.isrRouteKey,\n isrSet: options.isrSet,\n markDynamicUsage,\n method,\n middlewareContext: options.middlewareContext,\n middlewareRequestHeaders: options.middlewareRequestHeaders,\n params: makeThenableParams(options.params),\n reportRequestError,\n request: options.request,\n expireSeconds: options.expireSeconds,\n revalidateSeconds,\n routePattern: route.pattern,\n setHeadersAccessPhase,\n });\n }\n\n options.clearRequestContext();\n return applyRouteHandlerMiddlewareContext(\n new Response(null, {\n status: 405,\n }),\n options.middlewareContext,\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"app-route-handler-dispatch.js","names":[],"sources":["../../src/server/app-route-handler-dispatch.ts"],"sourcesContent":["import type { NextI18nConfig } from \"../config/next-config.js\";\nimport {\n getCollectedFetchTags,\n ensureFetchPatch,\n setCurrentFetchSoftTags,\n} from \"vinext/shims/fetch-cache\";\nimport {\n consumeDynamicUsage,\n getAndClearPendingCookies,\n getDraftModeCookieHeader,\n markDynamicUsage,\n setHeadersAccessPhase,\n} from \"vinext/shims/headers\";\nimport { setNavigationContext } from \"vinext/shims/navigation\";\nimport { getRequestExecutionContext } from \"vinext/shims/request-context\";\nimport { createRequestContext, runWithRequestContext } from \"vinext/shims/unified-request-context\";\nimport type { ISRCacheEntry } from \"./isr-cache.js\";\nimport {\n getAppRouteHandlerRevalidateSeconds,\n hasAppRouteHandlerDefaultExport,\n resolveAppRouteHandlerMethod,\n shouldReadAppRouteHandlerCache,\n type AppRouteHandlerModule,\n} from \"./app-route-handler-policy.js\";\nimport { readAppRouteHandlerCacheResponse } from \"./app-route-handler-cache.js\";\nimport {\n executeAppRouteHandler,\n type AppRouteDebugLogger,\n type AppRouteHandlerFunction,\n type AppRouteParams,\n type RouteHandlerCacheSetter,\n} from \"./app-route-handler-execution.js\";\nimport { isKnownDynamicAppRoute, isValidHTTPMethod } from \"./app-route-handler-runtime.js\";\nimport {\n applyRouteHandlerMiddlewareContext,\n type RouteHandlerMiddlewareContext,\n} from \"./app-route-handler-response.js\";\nimport { createStaticGenerationHeadersContext } from \"./app-static-generation.js\";\nimport { buildPageCacheTags } from \"./implicit-tags.js\";\nimport { makeThenableParams } from \"vinext/shims/thenable-params\";\nimport { reportRequestError } from \"./instrumentation.js\";\n\ntype AppRouteHandlerDispatchRoute = {\n pattern: string;\n routeHandler: AppRouteHandlerModule;\n routeSegments: string[];\n};\n\ntype RouteHandlerCacheGetter = (key: string) => Promise<ISRCacheEntry | null>;\ntype RouteHandlerBackgroundRegenerationErrorContext = {\n routerKind: \"App Router\";\n routePath: string;\n routeType: \"route\";\n};\ntype RouteHandlerBackgroundRegenerator = (\n key: string,\n renderFn: () => Promise<void>,\n errorContext?: RouteHandlerBackgroundRegenerationErrorContext,\n) => void;\n\ntype DispatchAppRouteHandlerOptions = {\n basePath?: string;\n cleanPathname: string;\n clearRequestContext: () => void;\n expireSeconds?: number;\n i18n?: NextI18nConfig | null;\n isDevelopment?: boolean;\n isProduction?: boolean;\n isrDebug?: AppRouteDebugLogger;\n isrGet: RouteHandlerCacheGetter;\n isrRouteKey: (pathname: string) => string;\n isrSet: RouteHandlerCacheSetter;\n middlewareContext: RouteHandlerMiddlewareContext;\n middlewareRequestHeaders?: Headers | null;\n params: AppRouteParams;\n request: Request;\n route: AppRouteHandlerDispatchRoute;\n scheduleBackgroundRegeneration: RouteHandlerBackgroundRegenerator;\n searchParams: URLSearchParams;\n};\n\nfunction isAppRouteHandlerFunction(value: unknown): value is AppRouteHandlerFunction {\n return typeof value === \"function\";\n}\n\nfunction buildRouteHandlerPageCacheTags(\n pathname: string,\n extraTags: string[],\n routeSegments: string[],\n): string[] {\n return buildPageCacheTags(pathname, extraTags, routeSegments, \"route\");\n}\n\nasync function runInRouteHandlerRevalidationContext(\n options: {\n cleanPathname: string;\n dynamicConfig?: string;\n routePattern: string;\n routeSegments: string[];\n },\n renderFn: () => Promise<void>,\n): Promise<void> {\n const headersContext = createStaticGenerationHeadersContext({\n dynamicConfig: options.dynamicConfig,\n routeKind: \"route\",\n routePattern: options.routePattern,\n });\n const requestContext = createRequestContext({\n headersContext,\n executionContext: getRequestExecutionContext(),\n unstableCacheRevalidation: \"foreground\",\n });\n\n await runWithRequestContext(requestContext, async () => {\n ensureFetchPatch();\n setCurrentFetchSoftTags(\n buildRouteHandlerPageCacheTags(options.cleanPathname, [], options.routeSegments),\n );\n await renderFn();\n });\n}\n\nexport async function dispatchAppRouteHandler(\n options: DispatchAppRouteHandlerOptions,\n): Promise<Response> {\n const { route } = options;\n const handler = route.routeHandler;\n const method = options.request.method.toUpperCase();\n const revalidateSeconds = getAppRouteHandlerRevalidateSeconds(handler);\n const isDevelopment = options.isDevelopment ?? process.env.NODE_ENV === \"development\";\n const isProduction = options.isProduction ?? process.env.NODE_ENV === \"production\";\n\n if (hasAppRouteHandlerDefaultExport(handler) && isDevelopment) {\n console.error(\n \"[vinext] Detected default export in route handler \" +\n route.pattern +\n \". Export a named export for each HTTP method instead.\",\n );\n }\n\n // Reject non-standard HTTP methods before any auto-OPTIONS/405 logic.\n // Next.js returns 400 for invalid methods; vinext mirrors that behavior.\n // https://github.com/vercel/next.js/blob/canary/packages/next/src/server/route-modules/app-route/module.ts#L390-L392\n if (!isValidHTTPMethod(method)) {\n options.clearRequestContext();\n return applyRouteHandlerMiddlewareContext(\n new Response(null, { status: 400 }),\n options.middlewareContext,\n );\n }\n\n const { allowHeaderForOptions, handlerFn, isAutoHead, shouldAutoRespondToOptions } =\n resolveAppRouteHandlerMethod(handler, method);\n\n if (shouldAutoRespondToOptions) {\n options.clearRequestContext();\n return applyRouteHandlerMiddlewareContext(\n new Response(null, {\n status: 204,\n headers: { Allow: allowHeaderForOptions },\n }),\n options.middlewareContext,\n );\n }\n\n const resolvedHandlerFn = isAppRouteHandlerFunction(handlerFn) ? handlerFn : undefined;\n\n if (\n revalidateSeconds !== null &&\n shouldReadAppRouteHandlerCache({\n dynamicConfig: handler.dynamic,\n handlerFn: resolvedHandlerFn,\n isAutoHead,\n isKnownDynamic: isKnownDynamicAppRoute(route.pattern),\n isProduction,\n method,\n revalidateSeconds,\n }) &&\n resolvedHandlerFn\n ) {\n const cachedRouteResponse = await readAppRouteHandlerCacheResponse({\n basePath: options.basePath,\n buildPageCacheTags(pathname, extraTags) {\n return buildRouteHandlerPageCacheTags(pathname, extraTags, route.routeSegments);\n },\n cleanPathname: options.cleanPathname,\n clearRequestContext: options.clearRequestContext,\n consumeDynamicUsage,\n dynamicConfig: handler.dynamic,\n getCollectedFetchTags,\n handlerFn: resolvedHandlerFn,\n i18n: options.i18n,\n isAutoHead,\n isrDebug: options.isrDebug,\n isrGet: options.isrGet,\n isrRouteKey: options.isrRouteKey,\n isrSet: options.isrSet,\n markDynamicUsage,\n middlewareContext: options.middlewareContext,\n params: options.params,\n requestUrl: options.request.url,\n revalidateSearchParams: options.searchParams,\n expireSeconds: options.expireSeconds,\n revalidateSeconds,\n routePattern: route.pattern,\n runInRevalidationContext(renderFn) {\n return runInRouteHandlerRevalidationContext(\n {\n cleanPathname: options.cleanPathname,\n dynamicConfig: handler.dynamic,\n routePattern: route.pattern,\n routeSegments: route.routeSegments,\n },\n renderFn,\n );\n },\n scheduleBackgroundRegeneration(key, renderFn) {\n options.scheduleBackgroundRegeneration(key, renderFn, {\n routerKind: \"App Router\",\n routePath: route.pattern,\n routeType: \"route\",\n });\n },\n setHeadersAccessPhase,\n setNavigationContext,\n });\n if (cachedRouteResponse) {\n return cachedRouteResponse;\n }\n }\n\n if (resolvedHandlerFn) {\n return executeAppRouteHandler({\n basePath: options.basePath,\n buildPageCacheTags(pathname, extraTags) {\n return buildRouteHandlerPageCacheTags(pathname, extraTags, route.routeSegments);\n },\n cleanPathname: options.cleanPathname,\n clearRequestContext: options.clearRequestContext,\n consumeDynamicUsage,\n executionContext: getRequestExecutionContext(),\n getAndClearPendingCookies,\n getCollectedFetchTags,\n getDraftModeCookieHeader,\n handler,\n handlerFn: resolvedHandlerFn,\n i18n: options.i18n,\n isAutoHead,\n isProduction,\n isrDebug: options.isrDebug,\n isrRouteKey: options.isrRouteKey,\n isrSet: options.isrSet,\n markDynamicUsage,\n method,\n middlewareContext: options.middlewareContext,\n middlewareRequestHeaders: options.middlewareRequestHeaders,\n params: makeThenableParams(options.params),\n reportRequestError(error, request, context) {\n void reportRequestError(error, request, context);\n },\n request: options.request,\n expireSeconds: options.expireSeconds,\n revalidateSeconds,\n routePattern: route.pattern,\n setHeadersAccessPhase,\n });\n }\n\n options.clearRequestContext();\n return applyRouteHandlerMiddlewareContext(\n new Response(null, {\n status: 405,\n }),\n options.middlewareContext,\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"app-route-handler-execution.js","names":[],"sources":["../../src/server/app-route-handler-execution.ts"],"sourcesContent":["import type { NextI18nConfig } from \"../config/next-config.js\";\nimport { setHeadersContext, type HeadersAccessPhase } from \"vinext/shims/headers\";\nimport type { ExecutionContextLike } from \"vinext/shims/request-context\";\nimport type { CachedRouteValue } from \"vinext/shims/cache\";\nimport type { NextRequest } from \"vinext/shims/server\";\nimport {\n createStaticGenerationHeadersContext,\n getAppRouteStaticGenerationErrorMessage,\n} from \"./app-static-generation.js\";\nimport {\n isPossibleAppRouteActionRequest,\n resolveAppRouteHandlerSpecialError,\n shouldApplyAppRouteHandlerRevalidateHeader,\n shouldWriteAppRouteHandlerCache,\n type AppRouteHandlerModule,\n} from \"./app-route-handler-policy.js\";\nimport {\n applyRouteHandlerMiddlewareContext,\n applyRouteHandlerRevalidateHeader,\n assertSupportedAppRouteHandlerResponse,\n buildAppRouteCacheValue,\n finalizeRouteHandlerResponse,\n markRouteHandlerCacheMiss,\n type RouteHandlerMiddlewareContext,\n} from \"./app-route-handler-response.js\";\nimport {\n createTrackedAppRouteRequest,\n markKnownDynamicAppRoute,\n} from \"./app-route-handler-runtime.js\";\n\nexport type AppRouteParams = Record<string, string | string[]>;\nexport type AppRouteDynamicUsageFn = () => boolean;\nexport type MarkAppRouteDynamicUsageFn = () => void;\nexport type AppRouteHandlerFunction = (\n request: NextRequest,\n context: { params: AppRouteParams },\n) => Response | Promise<Response>;\nexport type RouteHandlerCacheSetter = (\n key: string,\n data: CachedRouteValue,\n revalidateSeconds: number,\n tags: string[],\n expireSeconds?: number,\n) => Promise<void>;\ntype AppRouteErrorReporter = (\n error: Error,\n request: { path: string; method: string; headers: Record<string, string> },\n route: { routerKind: \"App Router\"; routePath: string; routeType: \"route\" },\n) => void;\nexport type AppRouteDebugLogger = (event: string, detail: string) => void;\n\ntype RunAppRouteHandlerOptions = {\n basePath?: string;\n consumeDynamicUsage: AppRouteDynamicUsageFn;\n dynamicConfig?: string;\n handlerFn: AppRouteHandlerFunction;\n i18n?: NextI18nConfig | null;\n markDynamicUsage: MarkAppRouteDynamicUsageFn;\n middlewareRequestHeaders?: Headers | null;\n params: AppRouteParams;\n request: Request;\n routePattern?: string;\n setHeadersAccessPhase?: (phase: HeadersAccessPhase) => HeadersAccessPhase;\n};\n\ntype RunAppRouteHandlerResult = {\n dynamicUsedInHandler: boolean;\n response: Response;\n};\n\ntype ExecuteAppRouteHandlerOptions = {\n buildPageCacheTags: (pathname: string, extraTags: string[]) => string[];\n clearRequestContext: () => void;\n cleanPathname: string;\n executionContext: ExecutionContextLike | null;\n getAndClearPendingCookies: () => string[];\n getCollectedFetchTags: () => string[];\n getDraftModeCookieHeader: () => string | null | undefined;\n handler: AppRouteHandlerModule;\n isAutoHead: boolean;\n isProduction: boolean;\n isrDebug?: AppRouteDebugLogger;\n isrRouteKey: (pathname: string) => string;\n isrSet: RouteHandlerCacheSetter;\n method: string;\n middlewareContext: RouteHandlerMiddlewareContext;\n reportRequestError: AppRouteErrorReporter;\n expireSeconds?: number;\n revalidateSeconds: number | null;\n routePattern: string;\n setHeadersAccessPhase: (phase: HeadersAccessPhase) => HeadersAccessPhase;\n} & RunAppRouteHandlerOptions;\n\nfunction configureAppRouteStaticGenerationContext(options: RunAppRouteHandlerOptions): void {\n if (options.dynamicConfig === \"force-static\" || options.dynamicConfig === \"error\") {\n setHeadersContext(\n createStaticGenerationHeadersContext({\n dynamicConfig: options.dynamicConfig,\n routeKind: \"route\",\n routePattern: options.routePattern,\n }),\n );\n options.setHeadersAccessPhase?.(\"route-handler\");\n }\n}\n\nexport async function runAppRouteHandler(\n options: RunAppRouteHandlerOptions,\n): Promise<RunAppRouteHandlerResult> {\n options.consumeDynamicUsage();\n configureAppRouteStaticGenerationContext(options);\n const trackedRequest = createTrackedAppRouteRequest(options.request, {\n basePath: options.basePath,\n i18n: options.i18n,\n middlewareHeaders: options.middlewareRequestHeaders,\n onDynamicAccess() {\n options.markDynamicUsage();\n },\n requestMode:\n options.dynamicConfig === \"force-static\" || options.dynamicConfig === \"error\"\n ? options.dynamicConfig\n : \"auto\",\n staticGenerationErrorMessage(expression) {\n return getAppRouteStaticGenerationErrorMessage(options.routePattern, expression);\n },\n });\n const response = await options.handlerFn(trackedRequest.request, {\n params: options.params,\n });\n\n return {\n dynamicUsedInHandler: options.consumeDynamicUsage(),\n response,\n };\n}\n\nexport async function executeAppRouteHandler(\n options: ExecuteAppRouteHandlerOptions,\n): Promise<Response> {\n const previousHeadersPhase = options.setHeadersAccessPhase(\"route-handler\");\n\n try {\n const { dynamicUsedInHandler, response } = await runAppRouteHandler({\n ...options,\n dynamicConfig: options.handler.dynamic,\n });\n assertSupportedAppRouteHandlerResponse(response);\n const handlerSetCacheControl = response.headers.has(\"cache-control\");\n\n if (dynamicUsedInHandler) {\n markKnownDynamicAppRoute(options.routePattern);\n }\n\n if (\n shouldApplyAppRouteHandlerRevalidateHeader({\n dynamicUsedInHandler,\n handlerSetCacheControl,\n isAutoHead: options.isAutoHead,\n method: options.method,\n revalidateSeconds: options.revalidateSeconds,\n })\n ) {\n const revalidateSeconds = options.revalidateSeconds;\n if (revalidateSeconds == null) {\n throw new Error(\"Expected route handler revalidate seconds\");\n }\n applyRouteHandlerRevalidateHeader(response, revalidateSeconds, options.expireSeconds);\n }\n\n if (\n shouldWriteAppRouteHandlerCache({\n dynamicConfig: options.handler.dynamic,\n dynamicUsedInHandler,\n handlerSetCacheControl,\n isAutoHead: options.isAutoHead,\n isProduction: options.isProduction,\n method: options.method,\n revalidateSeconds: options.revalidateSeconds,\n })\n ) {\n markRouteHandlerCacheMiss(response);\n const routeClone = response.clone();\n const routeKey = options.isrRouteKey(options.cleanPathname);\n const revalidateSeconds = options.revalidateSeconds;\n if (revalidateSeconds == null) {\n throw new Error(\"Expected route handler cache revalidate seconds\");\n }\n const routeTags = options.buildPageCacheTags(\n options.cleanPathname,\n options.getCollectedFetchTags(),\n );\n const routeWritePromise = (async () => {\n try {\n const routeCacheValue = await buildAppRouteCacheValue(routeClone);\n await options.isrSet(\n routeKey,\n routeCacheValue,\n revalidateSeconds,\n routeTags,\n options.expireSeconds,\n );\n options.isrDebug?.(\"route cache written\", routeKey);\n } catch (cacheErr) {\n console.error(\"[vinext] ISR route cache write error:\", cacheErr);\n }\n })();\n options.executionContext?.waitUntil(routeWritePromise);\n }\n\n const pendingCookies = options.getAndClearPendingCookies();\n const draftCookie = options.getDraftModeCookieHeader();\n options.clearRequestContext();\n\n return applyRouteHandlerMiddlewareContext(\n finalizeRouteHandlerResponse(response, {\n pendingCookies,\n draftCookie,\n isHead: options.isAutoHead,\n }),\n options.middlewareContext,\n );\n } catch (error) {\n const pendingCookies = options.getAndClearPendingCookies();\n const draftCookie = options.getDraftModeCookieHeader();\n const specialError = resolveAppRouteHandlerSpecialError(error, options.request.url, {\n isAction: isPossibleAppRouteActionRequest(options.request),\n });\n options.clearRequestContext();\n\n if (specialError) {\n if (specialError.kind === \"redirect\") {\n return applyRouteHandlerMiddlewareContext(\n finalizeRouteHandlerResponse(\n new Response(null, {\n status: specialError.statusCode,\n headers: { Location: specialError.location },\n }),\n {\n pendingCookies,\n draftCookie,\n isHead: options.isAutoHead,\n },\n ),\n options.middlewareContext,\n );\n }\n\n return applyRouteHandlerMiddlewareContext(\n new Response(null, { status: specialError.statusCode }),\n options.middlewareContext,\n );\n }\n\n console.error(\"[vinext] Route handler error:\", error);\n options.reportRequestError(\n error instanceof Error ? error : new Error(String(error)),\n {\n path: options.cleanPathname,\n method: options.request.method,\n headers: Object.fromEntries(options.request.headers.entries()),\n },\n {\n routerKind: \"App Router\",\n routePath: options.routePattern,\n routeType: \"route\",\n },\n );\n\n return applyRouteHandlerMiddlewareContext(\n new Response(null, { status: 500 }),\n options.middlewareContext,\n );\n } finally {\n options.setHeadersAccessPhase(previousHeadersPhase);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"app-route-handler-execution.js","names":[],"sources":["../../src/server/app-route-handler-execution.ts"],"sourcesContent":["import type { NextI18nConfig } from \"../config/next-config.js\";\nimport { setHeadersContext, type HeadersAccessPhase } from \"vinext/shims/headers\";\nimport type { ExecutionContextLike } from \"vinext/shims/request-context\";\nimport type { CachedRouteValue } from \"vinext/shims/cache\";\nimport type { NextRequest } from \"vinext/shims/server\";\nimport {\n createStaticGenerationHeadersContext,\n getAppRouteStaticGenerationErrorMessage,\n} from \"./app-static-generation.js\";\nimport {\n isPossibleAppRouteActionRequest,\n resolveAppRouteHandlerSpecialError,\n shouldApplyAppRouteHandlerRevalidateHeader,\n shouldWriteAppRouteHandlerCache,\n type AppRouteHandlerModule,\n} from \"./app-route-handler-policy.js\";\nimport {\n applyRouteHandlerMiddlewareContext,\n applyRouteHandlerRevalidateHeader,\n assertSupportedAppRouteHandlerResponse,\n buildAppRouteCacheValue,\n finalizeRouteHandlerResponse,\n markRouteHandlerCacheMiss,\n type RouteHandlerMiddlewareContext,\n} from \"./app-route-handler-response.js\";\nimport {\n createTrackedAppRouteRequest,\n markKnownDynamicAppRoute,\n} from \"./app-route-handler-runtime.js\";\n\nexport type AppRouteParams = Record<string, string | string[]>;\nexport type AppRouteDynamicUsageFn = () => boolean;\nexport type MarkAppRouteDynamicUsageFn = () => void;\nexport type AppRouteHandlerFunction = (\n request: NextRequest,\n context: { params: AppRouteParams },\n) => Response | Promise<Response>;\nexport type RouteHandlerCacheSetter = (\n key: string,\n data: CachedRouteValue,\n revalidateSeconds: number,\n tags: string[],\n expireSeconds?: number,\n) => Promise<void>;\ntype AppRouteErrorReporter = (\n error: Error,\n request: { path: string; method: string; headers: Record<string, string> },\n route: { routerKind: \"App Router\"; routePath: string; routeType: \"route\" },\n) => void;\nexport type AppRouteDebugLogger = (event: string, detail: string) => void;\n\ntype RunAppRouteHandlerOptions = {\n basePath?: string;\n consumeDynamicUsage: AppRouteDynamicUsageFn;\n dynamicConfig?: string;\n handlerFn: AppRouteHandlerFunction;\n i18n?: NextI18nConfig | null;\n markDynamicUsage: MarkAppRouteDynamicUsageFn;\n middlewareRequestHeaders?: Headers | null;\n params: AppRouteParams;\n request: Request;\n routePattern?: string;\n setHeadersAccessPhase?: (phase: HeadersAccessPhase) => HeadersAccessPhase;\n};\n\ntype RunAppRouteHandlerResult = {\n dynamicUsedInHandler: boolean;\n response: Response;\n};\n\ntype ExecuteAppRouteHandlerOptions = {\n buildPageCacheTags: (pathname: string, extraTags: string[]) => string[];\n clearRequestContext: () => void;\n cleanPathname: string;\n executionContext: ExecutionContextLike | null;\n getAndClearPendingCookies: () => string[];\n getCollectedFetchTags: () => string[];\n getDraftModeCookieHeader: () => string | null | undefined;\n handler: AppRouteHandlerModule;\n isAutoHead: boolean;\n isProduction: boolean;\n isrDebug?: AppRouteDebugLogger;\n isrRouteKey: (pathname: string) => string;\n isrSet: RouteHandlerCacheSetter;\n method: string;\n middlewareContext: RouteHandlerMiddlewareContext;\n reportRequestError: AppRouteErrorReporter;\n expireSeconds?: number;\n revalidateSeconds: number | null;\n routePattern: string;\n setHeadersAccessPhase: (phase: HeadersAccessPhase) => HeadersAccessPhase;\n} & RunAppRouteHandlerOptions;\n\nfunction configureAppRouteStaticGenerationContext(options: RunAppRouteHandlerOptions): void {\n if (options.dynamicConfig === \"force-static\" || options.dynamicConfig === \"error\") {\n setHeadersContext(\n createStaticGenerationHeadersContext({\n dynamicConfig: options.dynamicConfig,\n routeKind: \"route\",\n routePattern: options.routePattern,\n }),\n );\n options.setHeadersAccessPhase?.(\"route-handler\");\n }\n}\n\nexport async function runAppRouteHandler(\n options: RunAppRouteHandlerOptions,\n): Promise<RunAppRouteHandlerResult> {\n options.consumeDynamicUsage();\n configureAppRouteStaticGenerationContext(options);\n const trackedRequest = createTrackedAppRouteRequest(options.request, {\n basePath: options.basePath,\n i18n: options.i18n,\n middlewareHeaders: options.middlewareRequestHeaders,\n onDynamicAccess() {\n options.markDynamicUsage();\n },\n requestMode:\n options.dynamicConfig === \"force-static\" || options.dynamicConfig === \"error\"\n ? options.dynamicConfig\n : \"auto\",\n staticGenerationErrorMessage(expression) {\n return getAppRouteStaticGenerationErrorMessage(options.routePattern, expression);\n },\n });\n const response = await options.handlerFn(trackedRequest.request, {\n params: options.params,\n });\n\n return {\n dynamicUsedInHandler: options.consumeDynamicUsage(),\n response,\n };\n}\n\nexport async function executeAppRouteHandler(\n options: ExecuteAppRouteHandlerOptions,\n): Promise<Response> {\n const previousHeadersPhase = options.setHeadersAccessPhase(\"route-handler\");\n\n try {\n const { dynamicUsedInHandler, response } = await runAppRouteHandler({\n ...options,\n dynamicConfig: options.handler.dynamic,\n });\n assertSupportedAppRouteHandlerResponse(response);\n const handlerSetCacheControl = response.headers.has(\"cache-control\");\n\n if (dynamicUsedInHandler) {\n markKnownDynamicAppRoute(options.routePattern);\n }\n\n if (\n shouldApplyAppRouteHandlerRevalidateHeader({\n dynamicUsedInHandler,\n handlerSetCacheControl,\n isAutoHead: options.isAutoHead,\n method: options.method,\n revalidateSeconds: options.revalidateSeconds,\n })\n ) {\n const revalidateSeconds = options.revalidateSeconds;\n if (revalidateSeconds == null) {\n throw new Error(\"Expected route handler revalidate seconds\");\n }\n applyRouteHandlerRevalidateHeader(response, revalidateSeconds, options.expireSeconds);\n }\n\n if (\n shouldWriteAppRouteHandlerCache({\n dynamicConfig: options.handler.dynamic,\n dynamicUsedInHandler,\n handlerSetCacheControl,\n isAutoHead: options.isAutoHead,\n isProduction: options.isProduction,\n method: options.method,\n revalidateSeconds: options.revalidateSeconds,\n })\n ) {\n markRouteHandlerCacheMiss(response);\n const routeClone = response.clone();\n const routeKey = options.isrRouteKey(options.cleanPathname);\n const revalidateSeconds = options.revalidateSeconds;\n if (revalidateSeconds == null) {\n throw new Error(\"Expected route handler cache revalidate seconds\");\n }\n const routeTags = options.buildPageCacheTags(\n options.cleanPathname,\n options.getCollectedFetchTags(),\n );\n const routeWritePromise = (async () => {\n try {\n const routeCacheValue = await buildAppRouteCacheValue(routeClone);\n await options.isrSet(\n routeKey,\n routeCacheValue,\n revalidateSeconds,\n routeTags,\n options.expireSeconds,\n );\n options.isrDebug?.(\"route cache written\", routeKey);\n } catch (cacheErr) {\n console.error(\"[vinext] ISR route cache write error:\", cacheErr);\n }\n })();\n options.executionContext?.waitUntil(routeWritePromise);\n }\n\n const pendingCookies = options.getAndClearPendingCookies();\n const draftCookie = options.getDraftModeCookieHeader();\n options.clearRequestContext();\n\n return applyRouteHandlerMiddlewareContext(\n finalizeRouteHandlerResponse(response, {\n pendingCookies,\n draftCookie,\n isHead: options.isAutoHead,\n }),\n options.middlewareContext,\n );\n } catch (error) {\n const pendingCookies = options.getAndClearPendingCookies();\n const draftCookie = options.getDraftModeCookieHeader();\n const specialError = resolveAppRouteHandlerSpecialError(error, options.request.url, {\n isAction: isPossibleAppRouteActionRequest(options.request),\n });\n options.clearRequestContext();\n\n if (specialError) {\n if (specialError.kind === \"redirect\") {\n return applyRouteHandlerMiddlewareContext(\n finalizeRouteHandlerResponse(\n new Response(null, {\n status: specialError.statusCode,\n headers: { Location: specialError.location },\n }),\n {\n pendingCookies,\n draftCookie,\n isHead: options.isAutoHead,\n },\n ),\n options.middlewareContext,\n );\n }\n\n return applyRouteHandlerMiddlewareContext(\n new Response(null, { status: specialError.statusCode }),\n options.middlewareContext,\n );\n }\n\n console.error(\"[vinext] Route handler error:\", error);\n options.reportRequestError(\n error instanceof Error ? error : new Error(String(error)),\n {\n path: options.cleanPathname,\n method: options.request.method,\n headers: Object.fromEntries(options.request.headers.entries()),\n },\n {\n routerKind: \"App Router\",\n routePath: options.routePattern,\n routeType: \"route\",\n },\n );\n\n return applyRouteHandlerMiddlewareContext(\n new Response(null, { status: 500 }),\n options.middlewareContext,\n );\n } finally {\n options.setHeadersAccessPhase(previousHeadersPhase);\n }\n}\n"],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import "./headers.js";
1
2
  import { parseNextHttpErrorDigest, parseNextRedirectDigest } from "./next-error-digest.js";
2
3
  import { buildRouteHandlerAllowHeader, collectRouteHandlerMethods } from "./app-route-handler-runtime.js";
3
4
  //#region src/server/app-route-handler-policy.ts
@@ -1 +1 @@
1
- {"version":3,"file":"app-route-handler-policy.js","names":[],"sources":["../../src/server/app-route-handler-policy.ts"],"sourcesContent":["import {\n buildRouteHandlerAllowHeader,\n collectRouteHandlerMethods,\n type RouteHandlerHttpMethod,\n type RouteHandlerModule,\n} from \"./app-route-handler-runtime.js\";\nimport { parseNextHttpErrorDigest, parseNextRedirectDigest } from \"./next-error-digest.js\";\n\nexport type AppRouteHandlerModule = {\n dynamic?: string;\n revalidate?: unknown;\n} & RouteHandlerModule;\n\ntype AppRouteHandlerFunction = (...args: unknown[]) => unknown;\n\ntype ResolvedAppRouteHandlerMethod = {\n allowHeaderForOptions: string;\n exportedMethods: RouteHandlerHttpMethod[];\n handlerFn: AppRouteHandlerFunction | undefined;\n isAutoHead: boolean;\n shouldAutoRespondToOptions: boolean;\n};\n\ntype AppRouteHandlerCacheReadOptions = {\n dynamicConfig?: string;\n handlerFn: unknown;\n isAutoHead: boolean;\n isKnownDynamic: boolean;\n isProduction: boolean;\n method: string;\n revalidateSeconds: number | null;\n};\n\ntype AppRouteHandlerResponseCacheOptions = {\n dynamicConfig?: string;\n dynamicUsedInHandler: boolean;\n handlerSetCacheControl: boolean;\n isAutoHead: boolean;\n isProduction: boolean;\n method: string;\n revalidateSeconds: number | null;\n};\n\ntype AppRouteHandlerSpecialError =\n | {\n kind: \"redirect\";\n location: string;\n statusCode: number;\n }\n | {\n kind: \"status\";\n statusCode: number;\n };\n\ntype AppRouteHandlerSpecialErrorOptions = {\n isAction: boolean;\n};\n\nexport function isPossibleAppRouteActionRequest(\n request: Pick<Request, \"headers\" | \"method\">,\n): boolean {\n if (request.method.toUpperCase() !== \"POST\") return false;\n\n const contentType = request.headers.get(\"content-type\");\n return (\n request.headers.has(\"x-rsc-action\") ||\n request.headers.has(\"next-action\") ||\n // Next.js uses strict equality here, so charset variants intentionally do\n // not classify as action requests even though they are valid form posts.\n contentType === \"application/x-www-form-urlencoded\" ||\n contentType?.startsWith(\"multipart/form-data\") === true\n );\n}\n\nexport function getAppRouteHandlerRevalidateSeconds(\n handler: Pick<AppRouteHandlerModule, \"revalidate\">,\n): number | null {\n // 0 is a meaningful value (\"never cache\") and must be preserved so the\n // header path can emit a no-store Cache-Control.\n // revalidate = false means \"cache indefinitely\" (Next.js segment config\n // parity) — return Infinity to signal the cache-later path.\n const { revalidate } = handler;\n if (revalidate === false) return Infinity;\n if (typeof revalidate !== \"number\" || !Number.isFinite(revalidate) || revalidate < 0) {\n return null;\n }\n return revalidate;\n}\n\nexport function hasAppRouteHandlerDefaultExport(handler: RouteHandlerModule): boolean {\n return typeof handler.default === \"function\";\n}\n\nexport function resolveAppRouteHandlerMethod(\n handler: AppRouteHandlerModule,\n method: string,\n): ResolvedAppRouteHandlerMethod {\n const exportedMethods = collectRouteHandlerMethods(handler);\n const allowHeaderForOptions = buildRouteHandlerAllowHeader(exportedMethods);\n const shouldAutoRespondToOptions = method === \"OPTIONS\" && typeof handler.OPTIONS !== \"function\";\n\n let handlerFn =\n typeof handler[method as RouteHandlerHttpMethod] === \"function\"\n ? (handler[method as RouteHandlerHttpMethod] as AppRouteHandlerFunction)\n : undefined;\n let isAutoHead = false;\n\n if (\n method === \"HEAD\" &&\n typeof handler.HEAD !== \"function\" &&\n typeof handler.GET === \"function\"\n ) {\n handlerFn = handler.GET as AppRouteHandlerFunction;\n isAutoHead = true;\n }\n\n return {\n allowHeaderForOptions,\n exportedMethods,\n handlerFn,\n isAutoHead,\n shouldAutoRespondToOptions,\n };\n}\n\nexport function shouldReadAppRouteHandlerCache(options: AppRouteHandlerCacheReadOptions): boolean {\n // revalidateSeconds === 0 means \"never cache\" and must skip the ISR read.\n // A previously written entry (e.g. from before the handler opted out)\n // must never be replayed once the author set revalidate = 0.\n return (\n options.isProduction &&\n options.revalidateSeconds !== null &&\n options.revalidateSeconds > 0 &&\n options.revalidateSeconds !== Infinity &&\n options.dynamicConfig !== \"force-dynamic\" &&\n !options.isKnownDynamic &&\n (options.method === \"GET\" || options.isAutoHead) &&\n typeof options.handlerFn === \"function\"\n );\n}\n\nexport function shouldApplyAppRouteHandlerRevalidateHeader(\n options: Omit<AppRouteHandlerResponseCacheOptions, \"dynamicConfig\" | \"isProduction\">,\n): boolean {\n // Includes revalidateSeconds === 0. That case emits the no-store\n // Cache-Control, which is exactly the header a never-cache handler\n // needs to suppress heuristic caching.\n return (\n options.revalidateSeconds !== null &&\n !options.dynamicUsedInHandler &&\n (options.method === \"GET\" || options.isAutoHead) &&\n !options.handlerSetCacheControl\n );\n}\n\nexport function shouldWriteAppRouteHandlerCache(\n options: AppRouteHandlerResponseCacheOptions,\n): boolean {\n // Excludes revalidateSeconds === 0. A never-cache response must not be\n // persisted to ISR, even though it still needs a Cache-Control header.\n return (\n options.isProduction &&\n options.revalidateSeconds !== null &&\n options.revalidateSeconds > 0 &&\n options.revalidateSeconds !== Infinity &&\n options.dynamicConfig !== \"force-dynamic\" &&\n shouldApplyAppRouteHandlerRevalidateHeader(options)\n );\n}\n\nexport function resolveAppRouteHandlerSpecialError(\n error: unknown,\n requestUrl: string,\n options?: AppRouteHandlerSpecialErrorOptions,\n): AppRouteHandlerSpecialError | null {\n if (!(error && typeof error === \"object\" && \"digest\" in error)) {\n return null;\n }\n\n const digest = String(error.digest);\n const redirect = parseNextRedirectDigest(digest);\n if (redirect) {\n return {\n kind: \"redirect\",\n location: new URL(redirect.url, requestUrl).toString(),\n statusCode: options?.isAction ? 303 : redirect.status,\n };\n }\n\n const httpError = parseNextHttpErrorDigest(digest);\n if (httpError) {\n return {\n kind: \"status\",\n statusCode: httpError.status,\n };\n }\n\n return null;\n}\n"],"mappings":";;;AA0DA,SAAgB,gCACd,SACS;AACT,KAAI,QAAQ,OAAO,aAAa,KAAK,OAAQ,QAAO;CAEpD,MAAM,cAAc,QAAQ,QAAQ,IAAI,eAAe;AACvD,QACE,QAAQ,QAAQ,IAAI,eAAe,IACnC,QAAQ,QAAQ,IAAI,cAAc,IAGlC,gBAAgB,uCAChB,aAAa,WAAW,sBAAsB,KAAK;;AAIvD,SAAgB,oCACd,SACe;CAKf,MAAM,EAAE,eAAe;AACvB,KAAI,eAAe,MAAO,QAAO;AACjC,KAAI,OAAO,eAAe,YAAY,CAAC,OAAO,SAAS,WAAW,IAAI,aAAa,EACjF,QAAO;AAET,QAAO;;AAGT,SAAgB,gCAAgC,SAAsC;AACpF,QAAO,OAAO,QAAQ,YAAY;;AAGpC,SAAgB,6BACd,SACA,QAC+B;CAC/B,MAAM,kBAAkB,2BAA2B,QAAQ;CAC3D,MAAM,wBAAwB,6BAA6B,gBAAgB;CAC3E,MAAM,6BAA6B,WAAW,aAAa,OAAO,QAAQ,YAAY;CAEtF,IAAI,YACF,OAAO,QAAQ,YAAsC,aAChD,QAAQ,UACT,KAAA;CACN,IAAI,aAAa;AAEjB,KACE,WAAW,UACX,OAAO,QAAQ,SAAS,cACxB,OAAO,QAAQ,QAAQ,YACvB;AACA,cAAY,QAAQ;AACpB,eAAa;;AAGf,QAAO;EACL;EACA;EACA;EACA;EACA;EACD;;AAGH,SAAgB,+BAA+B,SAAmD;AAIhG,QACE,QAAQ,gBACR,QAAQ,sBAAsB,QAC9B,QAAQ,oBAAoB,KAC5B,QAAQ,sBAAsB,YAC9B,QAAQ,kBAAkB,mBAC1B,CAAC,QAAQ,mBACR,QAAQ,WAAW,SAAS,QAAQ,eACrC,OAAO,QAAQ,cAAc;;AAIjC,SAAgB,2CACd,SACS;AAIT,QACE,QAAQ,sBAAsB,QAC9B,CAAC,QAAQ,yBACR,QAAQ,WAAW,SAAS,QAAQ,eACrC,CAAC,QAAQ;;AAIb,SAAgB,gCACd,SACS;AAGT,QACE,QAAQ,gBACR,QAAQ,sBAAsB,QAC9B,QAAQ,oBAAoB,KAC5B,QAAQ,sBAAsB,YAC9B,QAAQ,kBAAkB,mBAC1B,2CAA2C,QAAQ;;AAIvD,SAAgB,mCACd,OACA,YACA,SACoC;AACpC,KAAI,EAAE,SAAS,OAAO,UAAU,YAAY,YAAY,OACtD,QAAO;CAGT,MAAM,SAAS,OAAO,MAAM,OAAO;CACnC,MAAM,WAAW,wBAAwB,OAAO;AAChD,KAAI,SACF,QAAO;EACL,MAAM;EACN,UAAU,IAAI,IAAI,SAAS,KAAK,WAAW,CAAC,UAAU;EACtD,YAAY,SAAS,WAAW,MAAM,SAAS;EAChD;CAGH,MAAM,YAAY,yBAAyB,OAAO;AAClD,KAAI,UACF,QAAO;EACL,MAAM;EACN,YAAY,UAAU;EACvB;AAGH,QAAO"}
1
+ {"version":3,"file":"app-route-handler-policy.js","names":[],"sources":["../../src/server/app-route-handler-policy.ts"],"sourcesContent":["import {\n buildRouteHandlerAllowHeader,\n collectRouteHandlerMethods,\n type RouteHandlerHttpMethod,\n type RouteHandlerModule,\n} from \"./app-route-handler-runtime.js\";\nimport { NEXT_ACTION_HEADER, RSC_ACTION_HEADER } from \"./headers.js\";\nimport { parseNextHttpErrorDigest, parseNextRedirectDigest } from \"./next-error-digest.js\";\n\nexport type AppRouteHandlerModule = {\n dynamic?: string;\n revalidate?: unknown;\n} & RouteHandlerModule;\n\ntype AppRouteHandlerFunction = (...args: unknown[]) => unknown;\n\ntype ResolvedAppRouteHandlerMethod = {\n allowHeaderForOptions: string;\n exportedMethods: RouteHandlerHttpMethod[];\n handlerFn: AppRouteHandlerFunction | undefined;\n isAutoHead: boolean;\n shouldAutoRespondToOptions: boolean;\n};\n\ntype AppRouteHandlerCacheReadOptions = {\n dynamicConfig?: string;\n handlerFn: unknown;\n isAutoHead: boolean;\n isKnownDynamic: boolean;\n isProduction: boolean;\n method: string;\n revalidateSeconds: number | null;\n};\n\ntype AppRouteHandlerResponseCacheOptions = {\n dynamicConfig?: string;\n dynamicUsedInHandler: boolean;\n handlerSetCacheControl: boolean;\n isAutoHead: boolean;\n isProduction: boolean;\n method: string;\n revalidateSeconds: number | null;\n};\n\ntype AppRouteHandlerSpecialError =\n | {\n kind: \"redirect\";\n location: string;\n statusCode: number;\n }\n | {\n kind: \"status\";\n statusCode: number;\n };\n\ntype AppRouteHandlerSpecialErrorOptions = {\n isAction: boolean;\n};\n\nexport function isPossibleAppRouteActionRequest(\n request: Pick<Request, \"headers\" | \"method\">,\n): boolean {\n if (request.method.toUpperCase() !== \"POST\") return false;\n\n const contentType = request.headers.get(\"content-type\");\n return (\n request.headers.has(RSC_ACTION_HEADER) ||\n request.headers.has(NEXT_ACTION_HEADER) ||\n // Next.js uses strict equality here, so charset variants intentionally do\n // not classify as action requests even though they are valid form posts.\n contentType === \"application/x-www-form-urlencoded\" ||\n contentType?.startsWith(\"multipart/form-data\") === true\n );\n}\n\nexport function getAppRouteHandlerRevalidateSeconds(\n handler: Pick<AppRouteHandlerModule, \"revalidate\">,\n): number | null {\n // 0 is a meaningful value (\"never cache\") and must be preserved so the\n // header path can emit a no-store Cache-Control.\n // revalidate = false means \"cache indefinitely\" (Next.js segment config\n // parity) — return Infinity to signal the cache-later path.\n const { revalidate } = handler;\n if (revalidate === false) return Infinity;\n if (typeof revalidate !== \"number\" || !Number.isFinite(revalidate) || revalidate < 0) {\n return null;\n }\n return revalidate;\n}\n\nexport function hasAppRouteHandlerDefaultExport(handler: RouteHandlerModule): boolean {\n return typeof handler.default === \"function\";\n}\n\nexport function resolveAppRouteHandlerMethod(\n handler: AppRouteHandlerModule,\n method: string,\n): ResolvedAppRouteHandlerMethod {\n const exportedMethods = collectRouteHandlerMethods(handler);\n const allowHeaderForOptions = buildRouteHandlerAllowHeader(exportedMethods);\n const shouldAutoRespondToOptions = method === \"OPTIONS\" && typeof handler.OPTIONS !== \"function\";\n\n let handlerFn =\n typeof handler[method as RouteHandlerHttpMethod] === \"function\"\n ? (handler[method as RouteHandlerHttpMethod] as AppRouteHandlerFunction)\n : undefined;\n let isAutoHead = false;\n\n if (\n method === \"HEAD\" &&\n typeof handler.HEAD !== \"function\" &&\n typeof handler.GET === \"function\"\n ) {\n handlerFn = handler.GET as AppRouteHandlerFunction;\n isAutoHead = true;\n }\n\n return {\n allowHeaderForOptions,\n exportedMethods,\n handlerFn,\n isAutoHead,\n shouldAutoRespondToOptions,\n };\n}\n\nexport function shouldReadAppRouteHandlerCache(options: AppRouteHandlerCacheReadOptions): boolean {\n // revalidateSeconds === 0 means \"never cache\" and must skip the ISR read.\n // A previously written entry (e.g. from before the handler opted out)\n // must never be replayed once the author set revalidate = 0.\n return (\n options.isProduction &&\n options.revalidateSeconds !== null &&\n options.revalidateSeconds > 0 &&\n options.revalidateSeconds !== Infinity &&\n options.dynamicConfig !== \"force-dynamic\" &&\n !options.isKnownDynamic &&\n (options.method === \"GET\" || options.isAutoHead) &&\n typeof options.handlerFn === \"function\"\n );\n}\n\nexport function shouldApplyAppRouteHandlerRevalidateHeader(\n options: Omit<AppRouteHandlerResponseCacheOptions, \"dynamicConfig\" | \"isProduction\">,\n): boolean {\n // Includes revalidateSeconds === 0. That case emits the no-store\n // Cache-Control, which is exactly the header a never-cache handler\n // needs to suppress heuristic caching.\n return (\n options.revalidateSeconds !== null &&\n !options.dynamicUsedInHandler &&\n (options.method === \"GET\" || options.isAutoHead) &&\n !options.handlerSetCacheControl\n );\n}\n\nexport function shouldWriteAppRouteHandlerCache(\n options: AppRouteHandlerResponseCacheOptions,\n): boolean {\n // Excludes revalidateSeconds === 0. A never-cache response must not be\n // persisted to ISR, even though it still needs a Cache-Control header.\n return (\n options.isProduction &&\n options.revalidateSeconds !== null &&\n options.revalidateSeconds > 0 &&\n options.revalidateSeconds !== Infinity &&\n options.dynamicConfig !== \"force-dynamic\" &&\n shouldApplyAppRouteHandlerRevalidateHeader(options)\n );\n}\n\nexport function resolveAppRouteHandlerSpecialError(\n error: unknown,\n requestUrl: string,\n options?: AppRouteHandlerSpecialErrorOptions,\n): AppRouteHandlerSpecialError | null {\n if (!(error && typeof error === \"object\" && \"digest\" in error)) {\n return null;\n }\n\n const digest = String(error.digest);\n const redirect = parseNextRedirectDigest(digest);\n if (redirect) {\n return {\n kind: \"redirect\",\n location: new URL(redirect.url, requestUrl).toString(),\n statusCode: options?.isAction ? 303 : redirect.status,\n };\n }\n\n const httpError = parseNextHttpErrorDigest(digest);\n if (httpError) {\n return {\n kind: \"status\",\n statusCode: httpError.status,\n };\n }\n\n return null;\n}\n"],"mappings":";;;;AA2DA,SAAgB,gCACd,SACS;CACT,IAAI,QAAQ,OAAO,aAAa,KAAK,QAAQ,OAAO;CAEpD,MAAM,cAAc,QAAQ,QAAQ,IAAI,eAAe;CACvD,OACE,QAAQ,QAAQ,IAAA,eAAsB,IACtC,QAAQ,QAAQ,IAAA,cAAuB,IAGvC,gBAAgB,uCAChB,aAAa,WAAW,sBAAsB,KAAK;;AAIvD,SAAgB,oCACd,SACe;CAKf,MAAM,EAAE,eAAe;CACvB,IAAI,eAAe,OAAO,OAAO;CACjC,IAAI,OAAO,eAAe,YAAY,CAAC,OAAO,SAAS,WAAW,IAAI,aAAa,GACjF,OAAO;CAET,OAAO;;AAGT,SAAgB,gCAAgC,SAAsC;CACpF,OAAO,OAAO,QAAQ,YAAY;;AAGpC,SAAgB,6BACd,SACA,QAC+B;CAC/B,MAAM,kBAAkB,2BAA2B,QAAQ;CAC3D,MAAM,wBAAwB,6BAA6B,gBAAgB;CAC3E,MAAM,6BAA6B,WAAW,aAAa,OAAO,QAAQ,YAAY;CAEtF,IAAI,YACF,OAAO,QAAQ,YAAsC,aAChD,QAAQ,UACT,KAAA;CACN,IAAI,aAAa;CAEjB,IACE,WAAW,UACX,OAAO,QAAQ,SAAS,cACxB,OAAO,QAAQ,QAAQ,YACvB;EACA,YAAY,QAAQ;EACpB,aAAa;;CAGf,OAAO;EACL;EACA;EACA;EACA;EACA;EACD;;AAGH,SAAgB,+BAA+B,SAAmD;CAIhG,OACE,QAAQ,gBACR,QAAQ,sBAAsB,QAC9B,QAAQ,oBAAoB,KAC5B,QAAQ,sBAAsB,YAC9B,QAAQ,kBAAkB,mBAC1B,CAAC,QAAQ,mBACR,QAAQ,WAAW,SAAS,QAAQ,eACrC,OAAO,QAAQ,cAAc;;AAIjC,SAAgB,2CACd,SACS;CAIT,OACE,QAAQ,sBAAsB,QAC9B,CAAC,QAAQ,yBACR,QAAQ,WAAW,SAAS,QAAQ,eACrC,CAAC,QAAQ;;AAIb,SAAgB,gCACd,SACS;CAGT,OACE,QAAQ,gBACR,QAAQ,sBAAsB,QAC9B,QAAQ,oBAAoB,KAC5B,QAAQ,sBAAsB,YAC9B,QAAQ,kBAAkB,mBAC1B,2CAA2C,QAAQ;;AAIvD,SAAgB,mCACd,OACA,YACA,SACoC;CACpC,IAAI,EAAE,SAAS,OAAO,UAAU,YAAY,YAAY,QACtD,OAAO;CAGT,MAAM,SAAS,OAAO,MAAM,OAAO;CACnC,MAAM,WAAW,wBAAwB,OAAO;CAChD,IAAI,UACF,OAAO;EACL,MAAM;EACN,UAAU,IAAI,IAAI,SAAS,KAAK,WAAW,CAAC,UAAU;EACtD,YAAY,SAAS,WAAW,MAAM,SAAS;EAChD;CAGH,MAAM,YAAY,yBAAyB,OAAO;CAClD,IAAI,WACF,OAAO;EACL,MAAM;EACN,YAAY,UAAU;EACvB;CAGH,OAAO"}
@@ -1,3 +1,4 @@
1
+ import { VINEXT_CACHE_HEADER } from "./headers.js";
1
2
  import { processMiddlewareHeaders } from "./request-pipeline.js";
2
3
  import { mergeMiddlewareResponseHeaders } from "./middleware-response-headers.js";
3
4
  import { NEVER_CACHE_CONTROL, STATIC_CACHE_CONTROL, buildCachedRevalidateCacheControl } from "./cache-control.js";
@@ -31,7 +32,7 @@ function buildRouteHandlerCachedResponse(cachedValue, options) {
31
32
  const headers = new Headers();
32
33
  for (const [key, value] of Object.entries(cachedValue.headers)) if (Array.isArray(value)) for (const entry of value) headers.append(key, entry);
33
34
  else headers.set(key, value);
34
- headers.set("X-Vinext-Cache", options.cacheState);
35
+ headers.set(VINEXT_CACHE_HEADER, options.cacheState);
35
36
  const revalidateSeconds = options.cacheControl?.revalidate ?? options.revalidateSeconds;
36
37
  const expireSeconds = options.cacheControl === void 0 ? void 0 : options.cacheControl.expire ?? options.expireSeconds;
37
38
  headers.set("Cache-Control", buildRouteHandlerCacheControl(options.cacheState, revalidateSeconds, expireSeconds));
@@ -44,7 +45,7 @@ function applyRouteHandlerRevalidateHeader(response, revalidateSeconds, expireSe
44
45
  response.headers.set("cache-control", buildRouteHandlerCacheControl("HIT", revalidateSeconds, expireSeconds));
45
46
  }
46
47
  function markRouteHandlerCacheMiss(response) {
47
- response.headers.set("X-Vinext-Cache", "MISS");
48
+ response.headers.set(VINEXT_CACHE_HEADER, "MISS");
48
49
  }
49
50
  function getSetCookieName(cookie) {
50
51
  const equalsIndex = cookie.indexOf("=");
@@ -78,7 +79,7 @@ async function buildAppRouteCacheValue(response) {
78
79
  const body = await response.arrayBuffer();
79
80
  const headers = {};
80
81
  response.headers.forEach((value, key) => {
81
- if (key === "set-cookie" || key === "x-vinext-cache" || key === "cache-control" || key.startsWith("x-middleware-")) return;
82
+ if (key === "set-cookie" || key === "X-Vinext-Cache".toLowerCase() || key === "cache-control" || key.startsWith("x-middleware-")) return;
82
83
  headers[key] = value;
83
84
  });
84
85
  const setCookies = response.headers.getSetCookie?.() ?? [];
@@ -1 +1 @@
1
- {"version":3,"file":"app-route-handler-response.js","names":[],"sources":["../../src/server/app-route-handler-response.ts"],"sourcesContent":["import type { CachedRouteValue, CacheControlMetadata } from \"vinext/shims/cache\";\nimport {\n buildCachedRevalidateCacheControl,\n NEVER_CACHE_CONTROL,\n STATIC_CACHE_CONTROL,\n} from \"./cache-control.js\";\nimport { mergeMiddlewareResponseHeaders } from \"./middleware-response-headers.js\";\nimport { processMiddlewareHeaders } from \"./request-pipeline.js\";\n\nexport type RouteHandlerMiddlewareContext = {\n headers: Headers | null;\n status: number | null;\n};\n\ntype BuildRouteHandlerCachedResponseOptions = {\n cacheControl?: CacheControlMetadata;\n cacheState: \"HIT\" | \"STALE\";\n expireSeconds?: number;\n isHead: boolean;\n revalidateSeconds: number;\n};\n\ntype FinalizeRouteHandlerResponseOptions = {\n pendingCookies: string[];\n draftCookie?: string | null;\n isHead: boolean;\n};\n\nconst APP_ROUTE_REWRITE_ERROR =\n \"NextResponse.rewrite() was used in a app route handler, this is not currently supported. Please remove the invocation to continue.\";\nconst APP_ROUTE_NEXT_ERROR =\n \"NextResponse.next() was used in a app route handler, this is not supported. See here for more info: https://nextjs.org/docs/messages/next-response-next-in-app-route-handler\";\n\nfunction hasMiddlewareHeader(headers: Headers): boolean {\n for (const key of headers.keys()) {\n if (key.startsWith(\"x-middleware-\")) return true;\n }\n return false;\n}\n\nfunction buildRouteHandlerCacheControl(\n cacheState: BuildRouteHandlerCachedResponseOptions[\"cacheState\"],\n revalidateSeconds: number,\n expireSeconds?: number,\n): string {\n if (revalidateSeconds === 0) {\n // A cached response is never produced for revalidate = 0 (the ISR write\n // path skips it), so only the HIT/STALE->fresh rewrite can arrive here\n // with a 0 value, via applyRouteHandlerRevalidateHeader. In all such\n // cases the author opted out of caching entirely.\n return NEVER_CACHE_CONTROL;\n }\n\n if (revalidateSeconds === Infinity) {\n // revalidate = false / Infinity means \"cache indefinitely\" — emit the\n // same static Cache-Control used by pages, not a dynamic SWR value.\n return STATIC_CACHE_CONTROL;\n }\n\n return buildCachedRevalidateCacheControl(cacheState, revalidateSeconds, expireSeconds);\n}\n\nexport function applyRouteHandlerMiddlewareContext(\n response: Response,\n middlewareContext: RouteHandlerMiddlewareContext,\n): Response {\n if (!middlewareContext.headers && middlewareContext.status == null) {\n return response;\n }\n\n const responseHeaders = new Headers(response.headers);\n mergeMiddlewareResponseHeaders(responseHeaders, middlewareContext.headers);\n\n return new Response(response.body, {\n status: middlewareContext.status ?? response.status,\n statusText: response.statusText,\n headers: responseHeaders,\n });\n}\n\nexport function assertSupportedAppRouteHandlerResponse(response: Response): void {\n // NextResponse.next() and rewrite() are middleware control-flow signals.\n // Once an App Route handler has returned, Next.js rejects those responses.\n if (response.headers.has(\"x-middleware-rewrite\")) {\n throw new Error(APP_ROUTE_REWRITE_ERROR);\n }\n\n if (response.headers.get(\"x-middleware-next\") === \"1\") {\n throw new Error(APP_ROUTE_NEXT_ERROR);\n }\n}\n\nexport function buildRouteHandlerCachedResponse(\n cachedValue: CachedRouteValue,\n options: BuildRouteHandlerCachedResponseOptions,\n): Response {\n const headers = new Headers();\n for (const [key, value] of Object.entries(cachedValue.headers)) {\n if (Array.isArray(value)) {\n for (const entry of value) {\n headers.append(key, entry);\n }\n } else {\n headers.set(key, value);\n }\n }\n headers.set(\"X-Vinext-Cache\", options.cacheState);\n const revalidateSeconds = options.cacheControl?.revalidate ?? options.revalidateSeconds;\n const expireSeconds =\n options.cacheControl === undefined\n ? undefined\n : (options.cacheControl.expire ?? options.expireSeconds);\n headers.set(\n \"Cache-Control\",\n buildRouteHandlerCacheControl(options.cacheState, revalidateSeconds, expireSeconds),\n );\n\n return new Response(options.isHead ? null : cachedValue.body, {\n status: cachedValue.status,\n headers,\n });\n}\n\nexport function applyRouteHandlerRevalidateHeader(\n response: Response,\n revalidateSeconds: number,\n expireSeconds?: number,\n): void {\n response.headers.set(\n \"cache-control\",\n buildRouteHandlerCacheControl(\"HIT\", revalidateSeconds, expireSeconds),\n );\n}\n\nexport function markRouteHandlerCacheMiss(response: Response): void {\n response.headers.set(\"X-Vinext-Cache\", \"MISS\");\n}\n\nfunction getSetCookieName(cookie: string): string | null {\n const equalsIndex = cookie.indexOf(\"=\");\n if (equalsIndex <= 0) {\n return null;\n }\n return cookie.slice(0, equalsIndex);\n}\n\nfunction applyMutableCookieFallbacks(headers: Headers, pendingCookies: string[]): void {\n if (pendingCookies.length === 0) {\n return;\n }\n\n const returnedCookies = headers.getSetCookie();\n const returnedCookieNames = new Set<string>();\n for (const cookie of returnedCookies) {\n const name = getSetCookieName(cookie);\n if (name) {\n returnedCookieNames.add(name);\n }\n }\n\n const fallbackCookies = new Map<string, string>();\n const unkeyedFallbackCookies: string[] = [];\n for (const cookie of pendingCookies) {\n const name = getSetCookieName(cookie);\n if (!name) {\n unkeyedFallbackCookies.push(cookie);\n continue;\n }\n\n if (!returnedCookieNames.has(name)) {\n fallbackCookies.set(name, cookie);\n }\n }\n\n headers.delete(\"Set-Cookie\");\n for (const cookie of unkeyedFallbackCookies) {\n headers.append(\"Set-Cookie\", cookie);\n }\n for (const cookie of fallbackCookies.values()) {\n headers.append(\"Set-Cookie\", cookie);\n }\n for (const cookie of returnedCookies) {\n headers.append(\"Set-Cookie\", cookie);\n }\n}\n\nexport async function buildAppRouteCacheValue(response: Response): Promise<CachedRouteValue> {\n const body = await response.arrayBuffer();\n const headers: CachedRouteValue[\"headers\"] = {};\n\n response.headers.forEach((value, key) => {\n if (\n key === \"set-cookie\" ||\n key === \"x-vinext-cache\" ||\n key === \"cache-control\" ||\n key.startsWith(\"x-middleware-\")\n ) {\n return;\n }\n headers[key] = value;\n });\n const setCookies = response.headers.getSetCookie?.() ?? [];\n if (setCookies.length > 0) {\n headers[\"set-cookie\"] = setCookies;\n }\n\n return {\n kind: \"APP_ROUTE\",\n body,\n status: response.status,\n headers,\n };\n}\n\nexport function finalizeRouteHandlerResponse(\n response: Response,\n options: FinalizeRouteHandlerResponseOptions,\n): Response {\n const { pendingCookies, draftCookie, isHead } = options;\n if (\n pendingCookies.length === 0 &&\n !draftCookie &&\n !isHead &&\n !hasMiddlewareHeader(response.headers)\n ) {\n return response;\n }\n\n const headers = new Headers(response.headers);\n processMiddlewareHeaders(headers);\n applyMutableCookieFallbacks(headers, pendingCookies);\n if (draftCookie) {\n headers.append(\"Set-Cookie\", draftCookie);\n }\n\n return new Response(isHead ? null : response.body, {\n status: response.status,\n statusText: response.statusText,\n headers,\n });\n}\n"],"mappings":";;;;AA4BA,MAAM,0BACJ;AACF,MAAM,uBACJ;AAEF,SAAS,oBAAoB,SAA2B;AACtD,MAAK,MAAM,OAAO,QAAQ,MAAM,CAC9B,KAAI,IAAI,WAAW,gBAAgB,CAAE,QAAO;AAE9C,QAAO;;AAGT,SAAS,8BACP,YACA,mBACA,eACQ;AACR,KAAI,sBAAsB,EAKxB,QAAO;AAGT,KAAI,sBAAsB,SAGxB,QAAO;AAGT,QAAO,kCAAkC,YAAY,mBAAmB,cAAc;;AAGxF,SAAgB,mCACd,UACA,mBACU;AACV,KAAI,CAAC,kBAAkB,WAAW,kBAAkB,UAAU,KAC5D,QAAO;CAGT,MAAM,kBAAkB,IAAI,QAAQ,SAAS,QAAQ;AACrD,gCAA+B,iBAAiB,kBAAkB,QAAQ;AAE1E,QAAO,IAAI,SAAS,SAAS,MAAM;EACjC,QAAQ,kBAAkB,UAAU,SAAS;EAC7C,YAAY,SAAS;EACrB,SAAS;EACV,CAAC;;AAGJ,SAAgB,uCAAuC,UAA0B;AAG/E,KAAI,SAAS,QAAQ,IAAI,uBAAuB,CAC9C,OAAM,IAAI,MAAM,wBAAwB;AAG1C,KAAI,SAAS,QAAQ,IAAI,oBAAoB,KAAK,IAChD,OAAM,IAAI,MAAM,qBAAqB;;AAIzC,SAAgB,gCACd,aACA,SACU;CACV,MAAM,UAAU,IAAI,SAAS;AAC7B,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,YAAY,QAAQ,CAC5D,KAAI,MAAM,QAAQ,MAAM,CACtB,MAAK,MAAM,SAAS,MAClB,SAAQ,OAAO,KAAK,MAAM;KAG5B,SAAQ,IAAI,KAAK,MAAM;AAG3B,SAAQ,IAAI,kBAAkB,QAAQ,WAAW;CACjD,MAAM,oBAAoB,QAAQ,cAAc,cAAc,QAAQ;CACtE,MAAM,gBACJ,QAAQ,iBAAiB,KAAA,IACrB,KAAA,IACC,QAAQ,aAAa,UAAU,QAAQ;AAC9C,SAAQ,IACN,iBACA,8BAA8B,QAAQ,YAAY,mBAAmB,cAAc,CACpF;AAED,QAAO,IAAI,SAAS,QAAQ,SAAS,OAAO,YAAY,MAAM;EAC5D,QAAQ,YAAY;EACpB;EACD,CAAC;;AAGJ,SAAgB,kCACd,UACA,mBACA,eACM;AACN,UAAS,QAAQ,IACf,iBACA,8BAA8B,OAAO,mBAAmB,cAAc,CACvE;;AAGH,SAAgB,0BAA0B,UAA0B;AAClE,UAAS,QAAQ,IAAI,kBAAkB,OAAO;;AAGhD,SAAS,iBAAiB,QAA+B;CACvD,MAAM,cAAc,OAAO,QAAQ,IAAI;AACvC,KAAI,eAAe,EACjB,QAAO;AAET,QAAO,OAAO,MAAM,GAAG,YAAY;;AAGrC,SAAS,4BAA4B,SAAkB,gBAAgC;AACrF,KAAI,eAAe,WAAW,EAC5B;CAGF,MAAM,kBAAkB,QAAQ,cAAc;CAC9C,MAAM,sCAAsB,IAAI,KAAa;AAC7C,MAAK,MAAM,UAAU,iBAAiB;EACpC,MAAM,OAAO,iBAAiB,OAAO;AACrC,MAAI,KACF,qBAAoB,IAAI,KAAK;;CAIjC,MAAM,kCAAkB,IAAI,KAAqB;CACjD,MAAM,yBAAmC,EAAE;AAC3C,MAAK,MAAM,UAAU,gBAAgB;EACnC,MAAM,OAAO,iBAAiB,OAAO;AACrC,MAAI,CAAC,MAAM;AACT,0BAAuB,KAAK,OAAO;AACnC;;AAGF,MAAI,CAAC,oBAAoB,IAAI,KAAK,CAChC,iBAAgB,IAAI,MAAM,OAAO;;AAIrC,SAAQ,OAAO,aAAa;AAC5B,MAAK,MAAM,UAAU,uBACnB,SAAQ,OAAO,cAAc,OAAO;AAEtC,MAAK,MAAM,UAAU,gBAAgB,QAAQ,CAC3C,SAAQ,OAAO,cAAc,OAAO;AAEtC,MAAK,MAAM,UAAU,gBACnB,SAAQ,OAAO,cAAc,OAAO;;AAIxC,eAAsB,wBAAwB,UAA+C;CAC3F,MAAM,OAAO,MAAM,SAAS,aAAa;CACzC,MAAM,UAAuC,EAAE;AAE/C,UAAS,QAAQ,SAAS,OAAO,QAAQ;AACvC,MACE,QAAQ,gBACR,QAAQ,oBACR,QAAQ,mBACR,IAAI,WAAW,gBAAgB,CAE/B;AAEF,UAAQ,OAAO;GACf;CACF,MAAM,aAAa,SAAS,QAAQ,gBAAgB,IAAI,EAAE;AAC1D,KAAI,WAAW,SAAS,EACtB,SAAQ,gBAAgB;AAG1B,QAAO;EACL,MAAM;EACN;EACA,QAAQ,SAAS;EACjB;EACD;;AAGH,SAAgB,6BACd,UACA,SACU;CACV,MAAM,EAAE,gBAAgB,aAAa,WAAW;AAChD,KACE,eAAe,WAAW,KAC1B,CAAC,eACD,CAAC,UACD,CAAC,oBAAoB,SAAS,QAAQ,CAEtC,QAAO;CAGT,MAAM,UAAU,IAAI,QAAQ,SAAS,QAAQ;AAC7C,0BAAyB,QAAQ;AACjC,6BAA4B,SAAS,eAAe;AACpD,KAAI,YACF,SAAQ,OAAO,cAAc,YAAY;AAG3C,QAAO,IAAI,SAAS,SAAS,OAAO,SAAS,MAAM;EACjD,QAAQ,SAAS;EACjB,YAAY,SAAS;EACrB;EACD,CAAC"}
1
+ {"version":3,"file":"app-route-handler-response.js","names":[],"sources":["../../src/server/app-route-handler-response.ts"],"sourcesContent":["import type { CachedRouteValue, CacheControlMetadata } from \"vinext/shims/cache\";\nimport {\n buildCachedRevalidateCacheControl,\n NEVER_CACHE_CONTROL,\n STATIC_CACHE_CONTROL,\n} from \"./cache-control.js\";\nimport {\n MIDDLEWARE_HEADER_PREFIX,\n MIDDLEWARE_NEXT_HEADER,\n MIDDLEWARE_REWRITE_HEADER,\n VINEXT_CACHE_HEADER,\n} from \"./headers.js\";\nimport { mergeMiddlewareResponseHeaders } from \"./middleware-response-headers.js\";\nimport { processMiddlewareHeaders } from \"./request-pipeline.js\";\n\nexport type RouteHandlerMiddlewareContext = {\n headers: Headers | null;\n status: number | null;\n};\n\ntype BuildRouteHandlerCachedResponseOptions = {\n cacheControl?: CacheControlMetadata;\n cacheState: \"HIT\" | \"STALE\";\n expireSeconds?: number;\n isHead: boolean;\n revalidateSeconds: number;\n};\n\ntype FinalizeRouteHandlerResponseOptions = {\n pendingCookies: string[];\n draftCookie?: string | null;\n isHead: boolean;\n};\n\nconst APP_ROUTE_REWRITE_ERROR =\n \"NextResponse.rewrite() was used in a app route handler, this is not currently supported. Please remove the invocation to continue.\";\nconst APP_ROUTE_NEXT_ERROR =\n \"NextResponse.next() was used in a app route handler, this is not supported. See here for more info: https://nextjs.org/docs/messages/next-response-next-in-app-route-handler\";\n\nfunction hasMiddlewareHeader(headers: Headers): boolean {\n for (const key of headers.keys()) {\n if (key.startsWith(MIDDLEWARE_HEADER_PREFIX)) return true;\n }\n return false;\n}\n\nfunction buildRouteHandlerCacheControl(\n cacheState: BuildRouteHandlerCachedResponseOptions[\"cacheState\"],\n revalidateSeconds: number,\n expireSeconds?: number,\n): string {\n if (revalidateSeconds === 0) {\n // A cached response is never produced for revalidate = 0 (the ISR write\n // path skips it), so only the HIT/STALE->fresh rewrite can arrive here\n // with a 0 value, via applyRouteHandlerRevalidateHeader. In all such\n // cases the author opted out of caching entirely.\n return NEVER_CACHE_CONTROL;\n }\n\n if (revalidateSeconds === Infinity) {\n // revalidate = false / Infinity means \"cache indefinitely\" — emit the\n // same static Cache-Control used by pages, not a dynamic SWR value.\n return STATIC_CACHE_CONTROL;\n }\n\n return buildCachedRevalidateCacheControl(cacheState, revalidateSeconds, expireSeconds);\n}\n\nexport function applyRouteHandlerMiddlewareContext(\n response: Response,\n middlewareContext: RouteHandlerMiddlewareContext,\n): Response {\n if (!middlewareContext.headers && middlewareContext.status == null) {\n return response;\n }\n\n const responseHeaders = new Headers(response.headers);\n mergeMiddlewareResponseHeaders(responseHeaders, middlewareContext.headers);\n\n return new Response(response.body, {\n status: middlewareContext.status ?? response.status,\n statusText: response.statusText,\n headers: responseHeaders,\n });\n}\n\nexport function assertSupportedAppRouteHandlerResponse(response: Response): void {\n // NextResponse.next() and rewrite() are middleware control-flow signals.\n // Once an App Route handler has returned, Next.js rejects those responses.\n if (response.headers.has(MIDDLEWARE_REWRITE_HEADER)) {\n throw new Error(APP_ROUTE_REWRITE_ERROR);\n }\n\n if (response.headers.get(MIDDLEWARE_NEXT_HEADER) === \"1\") {\n throw new Error(APP_ROUTE_NEXT_ERROR);\n }\n}\n\nexport function buildRouteHandlerCachedResponse(\n cachedValue: CachedRouteValue,\n options: BuildRouteHandlerCachedResponseOptions,\n): Response {\n const headers = new Headers();\n for (const [key, value] of Object.entries(cachedValue.headers)) {\n if (Array.isArray(value)) {\n for (const entry of value) {\n headers.append(key, entry);\n }\n } else {\n headers.set(key, value);\n }\n }\n headers.set(VINEXT_CACHE_HEADER, options.cacheState);\n const revalidateSeconds = options.cacheControl?.revalidate ?? options.revalidateSeconds;\n const expireSeconds =\n options.cacheControl === undefined\n ? undefined\n : (options.cacheControl.expire ?? options.expireSeconds);\n headers.set(\n \"Cache-Control\",\n buildRouteHandlerCacheControl(options.cacheState, revalidateSeconds, expireSeconds),\n );\n\n return new Response(options.isHead ? null : cachedValue.body, {\n status: cachedValue.status,\n headers,\n });\n}\n\nexport function applyRouteHandlerRevalidateHeader(\n response: Response,\n revalidateSeconds: number,\n expireSeconds?: number,\n): void {\n response.headers.set(\n \"cache-control\",\n buildRouteHandlerCacheControl(\"HIT\", revalidateSeconds, expireSeconds),\n );\n}\n\nexport function markRouteHandlerCacheMiss(response: Response): void {\n response.headers.set(VINEXT_CACHE_HEADER, \"MISS\");\n}\n\nfunction getSetCookieName(cookie: string): string | null {\n const equalsIndex = cookie.indexOf(\"=\");\n if (equalsIndex <= 0) {\n return null;\n }\n return cookie.slice(0, equalsIndex);\n}\n\nfunction applyMutableCookieFallbacks(headers: Headers, pendingCookies: string[]): void {\n if (pendingCookies.length === 0) {\n return;\n }\n\n const returnedCookies = headers.getSetCookie();\n const returnedCookieNames = new Set<string>();\n for (const cookie of returnedCookies) {\n const name = getSetCookieName(cookie);\n if (name) {\n returnedCookieNames.add(name);\n }\n }\n\n const fallbackCookies = new Map<string, string>();\n const unkeyedFallbackCookies: string[] = [];\n for (const cookie of pendingCookies) {\n const name = getSetCookieName(cookie);\n if (!name) {\n unkeyedFallbackCookies.push(cookie);\n continue;\n }\n\n if (!returnedCookieNames.has(name)) {\n fallbackCookies.set(name, cookie);\n }\n }\n\n headers.delete(\"Set-Cookie\");\n for (const cookie of unkeyedFallbackCookies) {\n headers.append(\"Set-Cookie\", cookie);\n }\n for (const cookie of fallbackCookies.values()) {\n headers.append(\"Set-Cookie\", cookie);\n }\n for (const cookie of returnedCookies) {\n headers.append(\"Set-Cookie\", cookie);\n }\n}\n\nexport async function buildAppRouteCacheValue(response: Response): Promise<CachedRouteValue> {\n const body = await response.arrayBuffer();\n const headers: CachedRouteValue[\"headers\"] = {};\n\n response.headers.forEach((value, key) => {\n if (\n key === \"set-cookie\" ||\n key === VINEXT_CACHE_HEADER.toLowerCase() ||\n key === \"cache-control\" ||\n key.startsWith(MIDDLEWARE_HEADER_PREFIX)\n ) {\n return;\n }\n headers[key] = value;\n });\n const setCookies = response.headers.getSetCookie?.() ?? [];\n if (setCookies.length > 0) {\n headers[\"set-cookie\"] = setCookies;\n }\n\n return {\n kind: \"APP_ROUTE\",\n body,\n status: response.status,\n headers,\n };\n}\n\nexport function finalizeRouteHandlerResponse(\n response: Response,\n options: FinalizeRouteHandlerResponseOptions,\n): Response {\n const { pendingCookies, draftCookie, isHead } = options;\n if (\n pendingCookies.length === 0 &&\n !draftCookie &&\n !isHead &&\n !hasMiddlewareHeader(response.headers)\n ) {\n return response;\n }\n\n const headers = new Headers(response.headers);\n processMiddlewareHeaders(headers);\n applyMutableCookieFallbacks(headers, pendingCookies);\n if (draftCookie) {\n headers.append(\"Set-Cookie\", draftCookie);\n }\n\n return new Response(isHead ? null : response.body, {\n status: response.status,\n statusText: response.statusText,\n headers,\n });\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"app-route-handler-runtime.js","names":[],"sources":["../../src/server/app-route-handler-runtime.ts"],"sourcesContent":["import type { NextI18nConfig } from \"../config/next-config.js\";\nimport {\n NextRequest,\n RequestCookies,\n sealRequestCookies,\n sealRequestHeaders,\n type NextURL,\n} from \"vinext/shims/server\";\nimport { buildRequestHeadersFromMiddlewareResponse } from \"./middleware-request-headers.js\";\n\nconst ROUTE_HANDLER_HTTP_METHODS = [\n \"GET\",\n \"HEAD\",\n \"POST\",\n \"PUT\",\n \"DELETE\",\n \"PATCH\",\n \"OPTIONS\",\n] as const;\n\nexport type RouteHandlerHttpMethod = (typeof ROUTE_HANDLER_HTTP_METHODS)[number];\n\nexport type RouteHandlerModule = Partial<Record<RouteHandlerHttpMethod | \"default\", unknown>>;\n\n/**\n * Checks whether a string is a recognized HTTP method for App Router route\n * handlers. Invalid methods must be rejected with 400 before any auto-OPTIONS\n * or 405 logic runs.\n *\n * @see https://github.com/vercel/next.js/blob/canary/packages/next/src/server/web/http.ts\n */\nexport function isValidHTTPMethod(maybeMethod: string): maybeMethod is RouteHandlerHttpMethod {\n return (ROUTE_HANDLER_HTTP_METHODS as readonly string[]).includes(maybeMethod);\n}\n\nexport function collectRouteHandlerMethods(handler: RouteHandlerModule): RouteHandlerHttpMethod[] {\n const methods = ROUTE_HANDLER_HTTP_METHODS.filter(\n (method) => typeof handler[method] === \"function\",\n );\n\n if (methods.includes(\"GET\") && !methods.includes(\"HEAD\")) {\n methods.push(\"HEAD\");\n }\n\n return methods;\n}\n\nexport function buildRouteHandlerAllowHeader(exportedMethods: readonly string[]): string {\n const allow = new Set(exportedMethods);\n allow.add(\"OPTIONS\");\n return Array.from(allow).sort().join(\", \");\n}\n\nconst _KNOWN_DYNAMIC_APP_ROUTE_HANDLERS_KEY = Symbol.for(\n \"vinext.appRouteHandlerRuntime.knownDynamicHandlers\",\n);\nconst _g = globalThis as unknown as Record<PropertyKey, unknown>;\n\n// NOTE: This set starts empty on cold start. The first request may serve a\n// stale ISR cache entry before the handler runs and signals dynamic usage.\n// Next.js avoids this by determining dynamism statically at build time; vinext\n// learns it at runtime and remembers the result for the process lifetime.\nconst knownDynamicAppRouteHandlers = (_g[_KNOWN_DYNAMIC_APP_ROUTE_HANDLERS_KEY] ??=\n new Set<string>()) as Set<string>;\n\nexport function isKnownDynamicAppRoute(pattern: string): boolean {\n return knownDynamicAppRouteHandlers.has(pattern);\n}\n\nexport function markKnownDynamicAppRoute(pattern: string): void {\n knownDynamicAppRouteHandlers.add(pattern);\n}\n\ntype RequestDynamicAccess =\n | \"request.headers\"\n | \"request.cookies\"\n | \"request.ip\"\n | \"request.geo\"\n | \"request.url\"\n | \"request.body\"\n | \"request.blob\"\n | \"request.json\"\n | \"request.text\"\n | \"request.arrayBuffer\"\n | \"request.formData\";\n\ntype NextUrlDynamicAccess =\n | \"nextUrl.search\"\n | \"nextUrl.searchParams\"\n | \"nextUrl.url\"\n | \"nextUrl.href\"\n | \"nextUrl.toJSON\"\n | \"nextUrl.toString\"\n | \"nextUrl.origin\";\n\ntype AppRouteDynamicRequestAccess = RequestDynamicAccess | NextUrlDynamicAccess;\ntype AppRouteRequestMode = \"auto\" | \"force-static\" | \"error\";\n\ntype TrackedAppRouteRequestOptions = {\n basePath?: string;\n i18n?: NextI18nConfig | null;\n middlewareHeaders?: Headers | null;\n onDynamicAccess?: (access: AppRouteDynamicRequestAccess) => void;\n requestMode?: AppRouteRequestMode;\n staticGenerationErrorMessage?: (expression?: string) => string;\n};\n\ntype TrackedAppRouteRequest = {\n request: NextRequest;\n didAccessDynamicRequest(): boolean;\n};\n\nfunction bindMethodIfNeeded<T>(value: T, target: object): T {\n return typeof value === \"function\" ? (value.bind(target) as T) : value;\n}\n\nfunction buildNextConfig(options: TrackedAppRouteRequestOptions): {\n basePath?: string;\n i18n?: NextI18nConfig;\n} | null {\n if (!options.basePath && !options.i18n) {\n return null;\n }\n\n return {\n basePath: options.basePath,\n i18n: options.i18n ?? undefined,\n };\n}\n\nfunction rebuildRequestWithHeaders(input: Request, headers: Headers): Request {\n const method = input.method;\n const hasBody = method !== \"GET\" && method !== \"HEAD\";\n const init: RequestInit & { duplex?: \"half\" } = {\n method,\n headers,\n cache: input.cache,\n credentials: input.credentials,\n integrity: input.integrity,\n keepalive: input.keepalive,\n mode: input.mode,\n redirect: input.redirect,\n referrer: input.referrer,\n referrerPolicy: input.referrerPolicy,\n signal: input.signal,\n };\n\n if (hasBody && input.body) {\n init.body = input.body;\n init.duplex = \"half\";\n }\n\n return new Request(input.url, init);\n}\n\nfunction cleanStaticUrl(url: string): string {\n const cleanUrl = new URL(url);\n cleanUrl.protocol = \"http:\";\n cleanUrl.host = \"localhost:3000\";\n cleanUrl.username = \"\";\n cleanUrl.password = \"\";\n cleanUrl.search = \"\";\n cleanUrl.hash = \"\";\n return cleanUrl.href;\n}\n\nfunction readEmptyBodyAsArrayBuffer(): Promise<ArrayBuffer> {\n return new Response(null).arrayBuffer();\n}\n\nfunction readEmptyBodyAsBlob(): Promise<Blob> {\n return new Response(null).blob();\n}\n\n// Empty JSON/form-data parses reject naturally; that keeps force-static body\n// stubs aligned with a bodyless request instead of inventing synthetic data.\nfunction readEmptyBodyAsFormData(): Promise<FormData> {\n return new Response(null).formData();\n}\n\nfunction readEmptyBodyAsJson(): Promise<unknown> {\n return new Response(null).json();\n}\n\nfunction readEmptyBodyAsText(): Promise<string> {\n return new Response(null).text();\n}\n\nexport function createTrackedAppRouteRequest(\n request: Request,\n options: TrackedAppRouteRequestOptions = {},\n): TrackedAppRouteRequest {\n let didAccessDynamicRequest = false;\n const requestMode = options.requestMode ?? \"auto\";\n const nextConfig = buildNextConfig(options);\n\n const markDynamicAccess = (access: AppRouteDynamicRequestAccess): void => {\n didAccessDynamicRequest = true;\n options.onDynamicAccess?.(access);\n };\n\n // Mirror the dynamic request reads that Next.js tracks inside\n // packages/next/src/server/route-modules/app-route/module.ts\n // via proxyNextRequest(), but keep the logic in a normal typed module.\n const wrapNextUrl = (nextUrl: NextURL): NextURL => {\n const nextUrlHandler: ProxyHandler<NextURL> = {\n get(target, prop): unknown {\n switch (prop) {\n case \"search\":\n case \"searchParams\":\n case \"url\":\n case \"href\":\n case \"toJSON\":\n case \"toString\":\n case \"origin\":\n markDynamicAccess(`nextUrl.${String(prop)}` as NextUrlDynamicAccess);\n return bindMethodIfNeeded(Reflect.get(target, prop, target), target);\n case \"clone\":\n return () => wrapNextUrl(target.clone());\n default:\n return bindMethodIfNeeded(Reflect.get(target, prop, target), target);\n }\n },\n };\n\n return new Proxy(nextUrl, nextUrlHandler);\n };\n\n const wrapForceStaticNextUrl = (nextUrl: NextURL): NextURL => {\n const emptySearchParams = new URLSearchParams();\n const staticHref = cleanStaticUrl(nextUrl.href);\n const nextUrlHandler: ProxyHandler<NextURL> = {\n get(target, prop): unknown {\n switch (prop) {\n case \"search\":\n return \"\";\n case \"searchParams\":\n return emptySearchParams;\n case \"href\":\n return staticHref;\n case \"url\":\n return undefined;\n case \"toJSON\":\n case \"toString\":\n return () => staticHref;\n case \"clone\":\n return () => wrapForceStaticNextUrl(target.clone());\n default:\n return bindMethodIfNeeded(Reflect.get(target, prop, target), target);\n }\n },\n };\n\n return new Proxy(nextUrl, nextUrlHandler);\n };\n\n const throwStaticGenerationError = (expression: string): never => {\n throw new Error(\n options.staticGenerationErrorMessage?.(expression) ??\n `Route handler with \\`dynamic = \"error\"\\` used ${expression}.`,\n );\n };\n\n const wrapRequireStaticNextUrl = (nextUrl: NextURL): NextURL => {\n const nextUrlHandler: ProxyHandler<NextURL> = {\n get(target, prop): unknown {\n switch (prop) {\n case \"search\":\n case \"searchParams\":\n case \"url\":\n case \"href\":\n case \"toJSON\":\n case \"toString\":\n case \"origin\":\n return throwStaticGenerationError(`nextUrl.${String(prop)}`);\n case \"clone\":\n return () => wrapRequireStaticNextUrl(target.clone());\n default:\n return bindMethodIfNeeded(Reflect.get(target, prop, target), target);\n }\n },\n };\n\n return new Proxy(nextUrl, nextUrlHandler);\n };\n\n const wrapRequest = (input: Request): NextRequest => {\n const requestHeaders = options.middlewareHeaders\n ? buildRequestHeadersFromMiddlewareResponse(input.headers, options.middlewareHeaders)\n : null;\n const requestWithOverrides = requestHeaders\n ? rebuildRequestWithHeaders(input, requestHeaders)\n : input;\n const nextRequest =\n requestWithOverrides instanceof NextRequest\n ? requestWithOverrides\n : new NextRequest(requestWithOverrides, { nextConfig: nextConfig ?? undefined });\n let proxiedNextUrl: NextURL | null = null;\n let forceStaticNextUrl: NextURL | null = null;\n let requireStaticNextUrl: NextURL | null = null;\n let forceStaticHeaders: Headers | null = null;\n let forceStaticCookies: RequestCookies | null = null;\n\n const requestHandler: ProxyHandler<NextRequest> = {\n get(target, prop): unknown {\n if (requestMode === \"force-static\") {\n switch (prop) {\n case \"nextUrl\":\n forceStaticNextUrl ??= wrapForceStaticNextUrl(target.nextUrl);\n return forceStaticNextUrl;\n case \"headers\":\n forceStaticHeaders ??= sealRequestHeaders(new Headers());\n return forceStaticHeaders;\n case \"cookies\":\n forceStaticCookies ??= sealRequestCookies(new RequestCookies(new Headers()));\n return forceStaticCookies;\n case \"url\":\n return cleanStaticUrl(target.nextUrl.href);\n case \"ip\":\n case \"geo\":\n return undefined;\n case \"body\":\n return null;\n case \"arrayBuffer\":\n return readEmptyBodyAsArrayBuffer;\n case \"blob\":\n return readEmptyBodyAsBlob;\n case \"formData\":\n return readEmptyBodyAsFormData;\n case \"json\":\n return readEmptyBodyAsJson;\n case \"text\":\n return readEmptyBodyAsText;\n case \"clone\":\n return () => wrapRequest(target.clone());\n default:\n return bindMethodIfNeeded(Reflect.get(target, prop, target), target);\n }\n }\n\n if (requestMode === \"error\") {\n switch (prop) {\n case \"nextUrl\":\n requireStaticNextUrl ??= wrapRequireStaticNextUrl(target.nextUrl);\n return requireStaticNextUrl;\n case \"headers\":\n case \"cookies\":\n case \"url\":\n // Deliberate vinext divergence from Next.js: ip/geo are exposed\n // on NextRequest for Cloudflare compatibility, so require-static\n // treats them as dynamic request APIs instead of falling through.\n case \"ip\":\n case \"geo\":\n case \"body\":\n case \"blob\":\n case \"json\":\n case \"text\":\n case \"arrayBuffer\":\n case \"formData\":\n return throwStaticGenerationError(`request.${String(prop)}`);\n case \"clone\":\n return () => wrapRequest(target.clone());\n default:\n return bindMethodIfNeeded(Reflect.get(target, prop, target), target);\n }\n }\n\n switch (prop) {\n case \"nextUrl\":\n proxiedNextUrl ??= wrapNextUrl(target.nextUrl);\n return proxiedNextUrl;\n case \"headers\":\n case \"cookies\":\n case \"ip\":\n case \"geo\":\n case \"url\":\n case \"body\":\n case \"blob\":\n case \"json\":\n case \"text\":\n case \"arrayBuffer\":\n case \"formData\":\n markDynamicAccess(`request.${String(prop)}` as RequestDynamicAccess);\n return bindMethodIfNeeded(Reflect.get(target, prop, target), target);\n case \"clone\":\n return () => wrapRequest(target.clone());\n default:\n return bindMethodIfNeeded(Reflect.get(target, prop, target), target);\n }\n },\n };\n\n return new Proxy(nextRequest, requestHandler);\n };\n\n return {\n request: wrapRequest(request),\n didAccessDynamicRequest() {\n return didAccessDynamicRequest;\n },\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"app-route-handler-runtime.js","names":[],"sources":["../../src/server/app-route-handler-runtime.ts"],"sourcesContent":["import type { NextI18nConfig } from \"../config/next-config.js\";\nimport {\n NextRequest,\n RequestCookies,\n sealRequestCookies,\n sealRequestHeaders,\n type NextURL,\n} from \"vinext/shims/server\";\nimport { buildRequestHeadersFromMiddlewareResponse } from \"./middleware-request-headers.js\";\n\nconst ROUTE_HANDLER_HTTP_METHODS = [\n \"GET\",\n \"HEAD\",\n \"POST\",\n \"PUT\",\n \"DELETE\",\n \"PATCH\",\n \"OPTIONS\",\n] as const;\n\nexport type RouteHandlerHttpMethod = (typeof ROUTE_HANDLER_HTTP_METHODS)[number];\n\nexport type RouteHandlerModule = Partial<Record<RouteHandlerHttpMethod | \"default\", unknown>>;\n\n/**\n * Checks whether a string is a recognized HTTP method for App Router route\n * handlers. Invalid methods must be rejected with 400 before any auto-OPTIONS\n * or 405 logic runs.\n *\n * @see https://github.com/vercel/next.js/blob/canary/packages/next/src/server/web/http.ts\n */\nexport function isValidHTTPMethod(maybeMethod: string): maybeMethod is RouteHandlerHttpMethod {\n return (ROUTE_HANDLER_HTTP_METHODS as readonly string[]).includes(maybeMethod);\n}\n\nexport function collectRouteHandlerMethods(handler: RouteHandlerModule): RouteHandlerHttpMethod[] {\n const methods = ROUTE_HANDLER_HTTP_METHODS.filter(\n (method) => typeof handler[method] === \"function\",\n );\n\n if (methods.includes(\"GET\") && !methods.includes(\"HEAD\")) {\n methods.push(\"HEAD\");\n }\n\n return methods;\n}\n\nexport function buildRouteHandlerAllowHeader(exportedMethods: readonly string[]): string {\n const allow = new Set(exportedMethods);\n allow.add(\"OPTIONS\");\n return Array.from(allow).sort().join(\", \");\n}\n\nconst _KNOWN_DYNAMIC_APP_ROUTE_HANDLERS_KEY = Symbol.for(\n \"vinext.appRouteHandlerRuntime.knownDynamicHandlers\",\n);\nconst _g = globalThis as unknown as Record<PropertyKey, unknown>;\n\n// NOTE: This set starts empty on cold start. The first request may serve a\n// stale ISR cache entry before the handler runs and signals dynamic usage.\n// Next.js avoids this by determining dynamism statically at build time; vinext\n// learns it at runtime and remembers the result for the process lifetime.\nconst knownDynamicAppRouteHandlers = (_g[_KNOWN_DYNAMIC_APP_ROUTE_HANDLERS_KEY] ??=\n new Set<string>()) as Set<string>;\n\nexport function isKnownDynamicAppRoute(pattern: string): boolean {\n return knownDynamicAppRouteHandlers.has(pattern);\n}\n\nexport function markKnownDynamicAppRoute(pattern: string): void {\n knownDynamicAppRouteHandlers.add(pattern);\n}\n\ntype RequestDynamicAccess =\n | \"request.headers\"\n | \"request.cookies\"\n | \"request.ip\"\n | \"request.geo\"\n | \"request.url\"\n | \"request.body\"\n | \"request.blob\"\n | \"request.json\"\n | \"request.text\"\n | \"request.arrayBuffer\"\n | \"request.formData\";\n\ntype NextUrlDynamicAccess =\n | \"nextUrl.search\"\n | \"nextUrl.searchParams\"\n | \"nextUrl.url\"\n | \"nextUrl.href\"\n | \"nextUrl.toJSON\"\n | \"nextUrl.toString\"\n | \"nextUrl.origin\";\n\ntype AppRouteDynamicRequestAccess = RequestDynamicAccess | NextUrlDynamicAccess;\ntype AppRouteRequestMode = \"auto\" | \"force-static\" | \"error\";\n\ntype TrackedAppRouteRequestOptions = {\n basePath?: string;\n i18n?: NextI18nConfig | null;\n middlewareHeaders?: Headers | null;\n onDynamicAccess?: (access: AppRouteDynamicRequestAccess) => void;\n requestMode?: AppRouteRequestMode;\n staticGenerationErrorMessage?: (expression?: string) => string;\n};\n\ntype TrackedAppRouteRequest = {\n request: NextRequest;\n didAccessDynamicRequest(): boolean;\n};\n\nfunction bindMethodIfNeeded<T>(value: T, target: object): T {\n return typeof value === \"function\" ? (value.bind(target) as T) : value;\n}\n\nfunction buildNextConfig(options: TrackedAppRouteRequestOptions): {\n basePath?: string;\n i18n?: NextI18nConfig;\n} | null {\n if (!options.basePath && !options.i18n) {\n return null;\n }\n\n return {\n basePath: options.basePath,\n i18n: options.i18n ?? undefined,\n };\n}\n\nfunction rebuildRequestWithHeaders(input: Request, headers: Headers): Request {\n const method = input.method;\n const hasBody = method !== \"GET\" && method !== \"HEAD\";\n const init: RequestInit & { duplex?: \"half\" } = {\n method,\n headers,\n cache: input.cache,\n credentials: input.credentials,\n integrity: input.integrity,\n keepalive: input.keepalive,\n mode: input.mode,\n redirect: input.redirect,\n referrer: input.referrer,\n referrerPolicy: input.referrerPolicy,\n signal: input.signal,\n };\n\n if (hasBody && input.body) {\n init.body = input.body;\n init.duplex = \"half\";\n }\n\n return new Request(input.url, init);\n}\n\nfunction cleanStaticUrl(url: string): string {\n const cleanUrl = new URL(url);\n cleanUrl.protocol = \"http:\";\n cleanUrl.host = \"localhost:3000\";\n cleanUrl.username = \"\";\n cleanUrl.password = \"\";\n cleanUrl.search = \"\";\n cleanUrl.hash = \"\";\n return cleanUrl.href;\n}\n\nfunction readEmptyBodyAsArrayBuffer(): Promise<ArrayBuffer> {\n return new Response(null).arrayBuffer();\n}\n\nfunction readEmptyBodyAsBlob(): Promise<Blob> {\n return new Response(null).blob();\n}\n\n// Empty JSON/form-data parses reject naturally; that keeps force-static body\n// stubs aligned with a bodyless request instead of inventing synthetic data.\nfunction readEmptyBodyAsFormData(): Promise<FormData> {\n return new Response(null).formData();\n}\n\nfunction readEmptyBodyAsJson(): Promise<unknown> {\n return new Response(null).json();\n}\n\nfunction readEmptyBodyAsText(): Promise<string> {\n return new Response(null).text();\n}\n\nexport function createTrackedAppRouteRequest(\n request: Request,\n options: TrackedAppRouteRequestOptions = {},\n): TrackedAppRouteRequest {\n let didAccessDynamicRequest = false;\n const requestMode = options.requestMode ?? \"auto\";\n const nextConfig = buildNextConfig(options);\n\n const markDynamicAccess = (access: AppRouteDynamicRequestAccess): void => {\n didAccessDynamicRequest = true;\n options.onDynamicAccess?.(access);\n };\n\n // Mirror the dynamic request reads that Next.js tracks inside\n // packages/next/src/server/route-modules/app-route/module.ts\n // via proxyNextRequest(), but keep the logic in a normal typed module.\n const wrapNextUrl = (nextUrl: NextURL): NextURL => {\n const nextUrlHandler: ProxyHandler<NextURL> = {\n get(target, prop): unknown {\n switch (prop) {\n case \"search\":\n case \"searchParams\":\n case \"url\":\n case \"href\":\n case \"toJSON\":\n case \"toString\":\n case \"origin\":\n markDynamicAccess(`nextUrl.${String(prop)}` as NextUrlDynamicAccess);\n return bindMethodIfNeeded(Reflect.get(target, prop, target), target);\n case \"clone\":\n return () => wrapNextUrl(target.clone());\n default:\n return bindMethodIfNeeded(Reflect.get(target, prop, target), target);\n }\n },\n };\n\n return new Proxy(nextUrl, nextUrlHandler);\n };\n\n const wrapForceStaticNextUrl = (nextUrl: NextURL): NextURL => {\n const emptySearchParams = new URLSearchParams();\n const staticHref = cleanStaticUrl(nextUrl.href);\n const nextUrlHandler: ProxyHandler<NextURL> = {\n get(target, prop): unknown {\n switch (prop) {\n case \"search\":\n return \"\";\n case \"searchParams\":\n return emptySearchParams;\n case \"href\":\n return staticHref;\n case \"url\":\n return undefined;\n case \"toJSON\":\n case \"toString\":\n return () => staticHref;\n case \"clone\":\n return () => wrapForceStaticNextUrl(target.clone());\n default:\n return bindMethodIfNeeded(Reflect.get(target, prop, target), target);\n }\n },\n };\n\n return new Proxy(nextUrl, nextUrlHandler);\n };\n\n const throwStaticGenerationError = (expression: string): never => {\n throw new Error(\n options.staticGenerationErrorMessage?.(expression) ??\n `Route handler with \\`dynamic = \"error\"\\` used ${expression}.`,\n );\n };\n\n const wrapRequireStaticNextUrl = (nextUrl: NextURL): NextURL => {\n const nextUrlHandler: ProxyHandler<NextURL> = {\n get(target, prop): unknown {\n switch (prop) {\n case \"search\":\n case \"searchParams\":\n case \"url\":\n case \"href\":\n case \"toJSON\":\n case \"toString\":\n case \"origin\":\n return throwStaticGenerationError(`nextUrl.${String(prop)}`);\n case \"clone\":\n return () => wrapRequireStaticNextUrl(target.clone());\n default:\n return bindMethodIfNeeded(Reflect.get(target, prop, target), target);\n }\n },\n };\n\n return new Proxy(nextUrl, nextUrlHandler);\n };\n\n const wrapRequest = (input: Request): NextRequest => {\n const requestHeaders = options.middlewareHeaders\n ? buildRequestHeadersFromMiddlewareResponse(input.headers, options.middlewareHeaders)\n : null;\n const requestWithOverrides = requestHeaders\n ? rebuildRequestWithHeaders(input, requestHeaders)\n : input;\n const nextRequest =\n requestWithOverrides instanceof NextRequest\n ? requestWithOverrides\n : new NextRequest(requestWithOverrides, { nextConfig: nextConfig ?? undefined });\n let proxiedNextUrl: NextURL | null = null;\n let forceStaticNextUrl: NextURL | null = null;\n let requireStaticNextUrl: NextURL | null = null;\n let forceStaticHeaders: Headers | null = null;\n let forceStaticCookies: RequestCookies | null = null;\n\n const requestHandler: ProxyHandler<NextRequest> = {\n get(target, prop): unknown {\n if (requestMode === \"force-static\") {\n switch (prop) {\n case \"nextUrl\":\n forceStaticNextUrl ??= wrapForceStaticNextUrl(target.nextUrl);\n return forceStaticNextUrl;\n case \"headers\":\n forceStaticHeaders ??= sealRequestHeaders(new Headers());\n return forceStaticHeaders;\n case \"cookies\":\n forceStaticCookies ??= sealRequestCookies(new RequestCookies(new Headers()));\n return forceStaticCookies;\n case \"url\":\n return cleanStaticUrl(target.nextUrl.href);\n case \"ip\":\n case \"geo\":\n return undefined;\n case \"body\":\n return null;\n case \"arrayBuffer\":\n return readEmptyBodyAsArrayBuffer;\n case \"blob\":\n return readEmptyBodyAsBlob;\n case \"formData\":\n return readEmptyBodyAsFormData;\n case \"json\":\n return readEmptyBodyAsJson;\n case \"text\":\n return readEmptyBodyAsText;\n case \"clone\":\n return () => wrapRequest(target.clone());\n default:\n return bindMethodIfNeeded(Reflect.get(target, prop, target), target);\n }\n }\n\n if (requestMode === \"error\") {\n switch (prop) {\n case \"nextUrl\":\n requireStaticNextUrl ??= wrapRequireStaticNextUrl(target.nextUrl);\n return requireStaticNextUrl;\n case \"headers\":\n case \"cookies\":\n case \"url\":\n // Deliberate vinext divergence from Next.js: ip/geo are exposed\n // on NextRequest for Cloudflare compatibility, so require-static\n // treats them as dynamic request APIs instead of falling through.\n case \"ip\":\n case \"geo\":\n case \"body\":\n case \"blob\":\n case \"json\":\n case \"text\":\n case \"arrayBuffer\":\n case \"formData\":\n return throwStaticGenerationError(`request.${String(prop)}`);\n case \"clone\":\n return () => wrapRequest(target.clone());\n default:\n return bindMethodIfNeeded(Reflect.get(target, prop, target), target);\n }\n }\n\n switch (prop) {\n case \"nextUrl\":\n proxiedNextUrl ??= wrapNextUrl(target.nextUrl);\n return proxiedNextUrl;\n case \"headers\":\n case \"cookies\":\n case \"ip\":\n case \"geo\":\n case \"url\":\n case \"body\":\n case \"blob\":\n case \"json\":\n case \"text\":\n case \"arrayBuffer\":\n case \"formData\":\n markDynamicAccess(`request.${String(prop)}` as RequestDynamicAccess);\n return bindMethodIfNeeded(Reflect.get(target, prop, target), target);\n case \"clone\":\n return () => wrapRequest(target.clone());\n default:\n return bindMethodIfNeeded(Reflect.get(target, prop, target), target);\n }\n },\n };\n\n return new Proxy(nextRequest, requestHandler);\n };\n\n return {\n request: wrapRequest(request),\n didAccessDynamicRequest() {\n return didAccessDynamicRequest;\n },\n };\n}\n"],"mappings":";;;AAUA,MAAM,6BAA6B;CACjC;CACA;CACA;CACA;CACA;CACA;CACA;CACD;;;;;;;;AAaD,SAAgB,kBAAkB,aAA4D;CAC5F,OAAQ,2BAAiD,SAAS,YAAY;;AAGhF,SAAgB,2BAA2B,SAAuD;CAChG,MAAM,UAAU,2BAA2B,QACxC,WAAW,OAAO,QAAQ,YAAY,WACxC;CAED,IAAI,QAAQ,SAAS,MAAM,IAAI,CAAC,QAAQ,SAAS,OAAO,EACtD,QAAQ,KAAK,OAAO;CAGtB,OAAO;;AAGT,SAAgB,6BAA6B,iBAA4C;CACvF,MAAM,QAAQ,IAAI,IAAI,gBAAgB;CACtC,MAAM,IAAI,UAAU;CACpB,OAAO,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,KAAK,KAAK;;AAG5C,MAAM,wCAAwC,OAAO,IACnD,qDACD;AACD,MAAM,KAAK;AAMX,MAAM,+BAAgC,GAAG,2DACvC,IAAI,KAAa;AAEnB,SAAgB,uBAAuB,SAA0B;CAC/D,OAAO,6BAA6B,IAAI,QAAQ;;AAGlD,SAAgB,yBAAyB,SAAuB;CAC9D,6BAA6B,IAAI,QAAQ;;AA0C3C,SAAS,mBAAsB,OAAU,QAAmB;CAC1D,OAAO,OAAO,UAAU,aAAc,MAAM,KAAK,OAAO,GAAS;;AAGnE,SAAS,gBAAgB,SAGhB;CACP,IAAI,CAAC,QAAQ,YAAY,CAAC,QAAQ,MAChC,OAAO;CAGT,OAAO;EACL,UAAU,QAAQ;EAClB,MAAM,QAAQ,QAAQ,KAAA;EACvB;;AAGH,SAAS,0BAA0B,OAAgB,SAA2B;CAC5E,MAAM,SAAS,MAAM;CACrB,MAAM,UAAU,WAAW,SAAS,WAAW;CAC/C,MAAM,OAA0C;EAC9C;EACA;EACA,OAAO,MAAM;EACb,aAAa,MAAM;EACnB,WAAW,MAAM;EACjB,WAAW,MAAM;EACjB,MAAM,MAAM;EACZ,UAAU,MAAM;EAChB,UAAU,MAAM;EAChB,gBAAgB,MAAM;EACtB,QAAQ,MAAM;EACf;CAED,IAAI,WAAW,MAAM,MAAM;EACzB,KAAK,OAAO,MAAM;EAClB,KAAK,SAAS;;CAGhB,OAAO,IAAI,QAAQ,MAAM,KAAK,KAAK;;AAGrC,SAAS,eAAe,KAAqB;CAC3C,MAAM,WAAW,IAAI,IAAI,IAAI;CAC7B,SAAS,WAAW;CACpB,SAAS,OAAO;CAChB,SAAS,WAAW;CACpB,SAAS,WAAW;CACpB,SAAS,SAAS;CAClB,SAAS,OAAO;CAChB,OAAO,SAAS;;AAGlB,SAAS,6BAAmD;CAC1D,OAAO,IAAI,SAAS,KAAK,CAAC,aAAa;;AAGzC,SAAS,sBAAqC;CAC5C,OAAO,IAAI,SAAS,KAAK,CAAC,MAAM;;AAKlC,SAAS,0BAA6C;CACpD,OAAO,IAAI,SAAS,KAAK,CAAC,UAAU;;AAGtC,SAAS,sBAAwC;CAC/C,OAAO,IAAI,SAAS,KAAK,CAAC,MAAM;;AAGlC,SAAS,sBAAuC;CAC9C,OAAO,IAAI,SAAS,KAAK,CAAC,MAAM;;AAGlC,SAAgB,6BACd,SACA,UAAyC,EAAE,EACnB;CACxB,IAAI,0BAA0B;CAC9B,MAAM,cAAc,QAAQ,eAAe;CAC3C,MAAM,aAAa,gBAAgB,QAAQ;CAE3C,MAAM,qBAAqB,WAA+C;EACxE,0BAA0B;EAC1B,QAAQ,kBAAkB,OAAO;;CAMnC,MAAM,eAAe,YAA8B;EAqBjD,OAAO,IAAI,MAAM,SAAS,EAnBxB,IAAI,QAAQ,MAAe;GACzB,QAAQ,MAAR;IACE,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;KACH,kBAAkB,WAAW,OAAO,KAAK,GAA2B;KACpE,OAAO,mBAAmB,QAAQ,IAAI,QAAQ,MAAM,OAAO,EAAE,OAAO;IACtE,KAAK,SACH,aAAa,YAAY,OAAO,OAAO,CAAC;IAC1C,SACE,OAAO,mBAAmB,QAAQ,IAAI,QAAQ,MAAM,OAAO,EAAE,OAAO;;KAKpC,CAAC;;CAG3C,MAAM,0BAA0B,YAA8B;EAC5D,MAAM,oBAAoB,IAAI,iBAAiB;EAC/C,MAAM,aAAa,eAAe,QAAQ,KAAK;EAuB/C,OAAO,IAAI,MAAM,SAAS,EArBxB,IAAI,QAAQ,MAAe;GACzB,QAAQ,MAAR;IACE,KAAK,UACH,OAAO;IACT,KAAK,gBACH,OAAO;IACT,KAAK,QACH,OAAO;IACT,KAAK,OACH;IACF,KAAK;IACL,KAAK,YACH,aAAa;IACf,KAAK,SACH,aAAa,uBAAuB,OAAO,OAAO,CAAC;IACrD,SACE,OAAO,mBAAmB,QAAQ,IAAI,QAAQ,MAAM,OAAO,EAAE,OAAO;;KAKpC,CAAC;;CAG3C,MAAM,8BAA8B,eAA8B;EAChE,MAAM,IAAI,MACR,QAAQ,+BAA+B,WAAW,IAChD,iDAAiD,WAAW,GAC/D;;CAGH,MAAM,4BAA4B,YAA8B;EAoB9D,OAAO,IAAI,MAAM,SAAS,EAlBxB,IAAI,QAAQ,MAAe;GACzB,QAAQ,MAAR;IACE,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK,UACH,OAAO,2BAA2B,WAAW,OAAO,KAAK,GAAG;IAC9D,KAAK,SACH,aAAa,yBAAyB,OAAO,OAAO,CAAC;IACvD,SACE,OAAO,mBAAmB,QAAQ,IAAI,QAAQ,MAAM,OAAO,EAAE,OAAO;;KAKpC,CAAC;;CAG3C,MAAM,eAAe,UAAgC;EACnD,MAAM,iBAAiB,QAAQ,oBAC3B,0CAA0C,MAAM,SAAS,QAAQ,kBAAkB,GACnF;EACJ,MAAM,uBAAuB,iBACzB,0BAA0B,OAAO,eAAe,GAChD;EACJ,MAAM,cACJ,gCAAgC,cAC5B,uBACA,IAAI,YAAY,sBAAsB,EAAE,YAAY,cAAc,KAAA,GAAW,CAAC;EACpF,IAAI,iBAAiC;EACrC,IAAI,qBAAqC;EACzC,IAAI,uBAAuC;EAC3C,IAAI,qBAAqC;EACzC,IAAI,qBAA4C;EA2FhD,OAAO,IAAI,MAAM,aAAa,EAxF5B,IAAI,QAAQ,MAAe;GACzB,IAAI,gBAAgB,gBAClB,QAAQ,MAAR;IACE,KAAK;KACH,uBAAuB,uBAAuB,OAAO,QAAQ;KAC7D,OAAO;IACT,KAAK;KACH,uBAAuB,mBAAmB,IAAI,SAAS,CAAC;KACxD,OAAO;IACT,KAAK;KACH,uBAAuB,mBAAmB,IAAI,eAAe,IAAI,SAAS,CAAC,CAAC;KAC5E,OAAO;IACT,KAAK,OACH,OAAO,eAAe,OAAO,QAAQ,KAAK;IAC5C,KAAK;IACL,KAAK,OACH;IACF,KAAK,QACH,OAAO;IACT,KAAK,eACH,OAAO;IACT,KAAK,QACH,OAAO;IACT,KAAK,YACH,OAAO;IACT,KAAK,QACH,OAAO;IACT,KAAK,QACH,OAAO;IACT,KAAK,SACH,aAAa,YAAY,OAAO,OAAO,CAAC;IAC1C,SACE,OAAO,mBAAmB,QAAQ,IAAI,QAAQ,MAAM,OAAO,EAAE,OAAO;;GAI1E,IAAI,gBAAgB,SAClB,QAAQ,MAAR;IACE,KAAK;KACH,yBAAyB,yBAAyB,OAAO,QAAQ;KACjE,OAAO;IACT,KAAK;IACL,KAAK;IACL,KAAK;IAIL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK,YACH,OAAO,2BAA2B,WAAW,OAAO,KAAK,GAAG;IAC9D,KAAK,SACH,aAAa,YAAY,OAAO,OAAO,CAAC;IAC1C,SACE,OAAO,mBAAmB,QAAQ,IAAI,QAAQ,MAAM,OAAO,EAAE,OAAO;;GAI1E,QAAQ,MAAR;IACE,KAAK;KACH,mBAAmB,YAAY,OAAO,QAAQ;KAC9C,OAAO;IACT,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;KACH,kBAAkB,WAAW,OAAO,KAAK,GAA2B;KACpE,OAAO,mBAAmB,QAAQ,IAAI,QAAQ,MAAM,OAAO,EAAE,OAAO;IACtE,KAAK,SACH,aAAa,YAAY,OAAO,OAAO,CAAC;IAC1C,SACE,OAAO,mBAAmB,QAAQ,IAAI,QAAQ,MAAM,OAAO,EAAE,OAAO;;KAKhC,CAAC;;CAG/C,OAAO;EACL,SAAS,YAAY,QAAQ;EAC7B,0BAA0B;GACxB,OAAO;;EAEV"}
@@ -18,6 +18,9 @@ import rscHandler from "virtual:vinext-rsc-entry";
18
18
  * cloudflare({ viteEnvironment: { name: "rsc", childEnvironments: ["ssr"] } })
19
19
  */
20
20
  var app_router_entry_default = { async fetch(request, env, ctx) {
21
+ return handleRequest(request, env, ctx);
22
+ } };
23
+ async function handleRequest(request, env, ctx) {
21
24
  const url = new URL(request.url);
22
25
  if (isOpenRedirectShaped(url.pathname)) return notFoundResponse();
23
26
  try {
@@ -33,14 +36,15 @@ var app_router_entry_default = { async fetch(request, env, ctx) {
33
36
  const result = await (ctx ? runWithExecutionContext(ctx, handleFn) : handleFn());
34
37
  if (result instanceof Response) {
35
38
  if (env?.ASSETS) {
36
- const assetResponse = await resolveStaticAssetSignal(result, { fetchAsset: (path) => Promise.resolve(env.ASSETS.fetch(new Request(new URL(path, request.url)))) });
39
+ const assetFetcher = env.ASSETS;
40
+ const assetResponse = await resolveStaticAssetSignal(result, { fetchAsset: (path) => Promise.resolve(assetFetcher.fetch(new Request(new URL(path, request.url)))) });
37
41
  if (assetResponse) return assetResponse;
38
42
  }
39
43
  return result;
40
44
  }
41
45
  if (result === null || result === void 0) return notFoundResponse();
42
46
  return new Response(String(result), { status: 200 });
43
- } };
47
+ }
44
48
  //#endregion
45
49
  export { app_router_entry_default as default };
46
50
 
@@ -1 +1 @@
1
- {"version":3,"file":"app-router-entry.js","names":[],"sources":["../../src/server/app-router-entry.ts"],"sourcesContent":["/**\n * Default Cloudflare Worker entry point for vinext App Router.\n *\n * Use this directly in wrangler.jsonc:\n * \"main\": \"vinext/server/app-router-entry\"\n *\n * Or import and delegate to it from a custom worker:\n * import handler from \"vinext/server/app-router-entry\";\n * return handler.fetch(request, env, ctx);\n *\n * This file runs in the RSC environment. Configure the Cloudflare plugin with:\n * cloudflare({ viteEnvironment: { name: \"rsc\", childEnvironments: [\"ssr\"] } })\n */\n\n// @ts-expect-error — virtual module resolved by vinext\nimport rscHandler from \"virtual:vinext-rsc-entry\";\nimport { runWithExecutionContext, type ExecutionContextLike } from \"vinext/shims/request-context\";\nimport { resolveStaticAssetSignal } from \"./worker-utils.js\";\nimport {\n cloneRequestWithHeaders,\n filterInternalHeaders,\n isOpenRedirectShaped,\n} from \"./request-pipeline.js\";\nimport { badRequestResponse, notFoundResponse } from \"./http-error-responses.js\";\n\ntype WorkerAssetEnv = {\n ASSETS?: {\n fetch(request: Request): Promise<Response> | Response;\n };\n};\n\nexport default {\n async fetch(\n request: Request,\n env?: WorkerAssetEnv,\n ctx?: ExecutionContextLike,\n ): Promise<Response> {\n const url = new URL(request.url);\n\n // Block protocol-relative URL open redirects (//evil.com/, /\\evil.com/,\n // /%5Cevil.com/, /%2F/evil.com/). Check BEFORE decode so both literal and\n // percent-encoded variants are caught — encoded forms survive segment-wise\n // decoding and would otherwise reach trailing-slash redirect emitters.\n if (isOpenRedirectShaped(url.pathname)) {\n return notFoundResponse();\n }\n\n // Validate that percent-encoding is well-formed. The RSC handler performs\n // the actual decode + normalize; we only check here to return a clean 400\n // instead of letting a malformed sequence crash downstream.\n try {\n decodeURIComponent(url.pathname);\n } catch {\n // Malformed percent-encoding (e.g. /%E0%A4%A) — return 400 instead of throwing.\n return badRequestResponse();\n }\n\n // Strip internal headers from inbound requests before any handler or\n // middleware sees them. Must happen before the RSC handler runs.\n // Builds a new Headers — Request.headers is immutable in Workers.\n {\n const filteredHeaders = filterInternalHeaders(request.headers);\n request = cloneRequestWithHeaders(request, filteredHeaders);\n }\n\n // Do NOT decode/normalize the pathname here. The RSC handler\n // (virtual:vinext-rsc-entry) is the single point of decoding — it calls\n // decodeURIComponent + normalizePath on the incoming URL. Decoding here\n // AND in the handler would double-decode, causing inconsistent path\n // matching between middleware and routing.\n\n // Delegate to RSC handler (which decodes + normalizes the pathname itself),\n // wrapping in the ExecutionContext ALS scope so downstream code can reach\n // ctx.waitUntil() without having ctx threaded through every call site.\n const handleFn = () => rscHandler(request, ctx);\n const result = await (ctx ? runWithExecutionContext(ctx, handleFn) : handleFn());\n\n if (result instanceof Response) {\n if (env?.ASSETS) {\n const assetResponse = await resolveStaticAssetSignal(result, {\n fetchAsset: (path) =>\n Promise.resolve(env.ASSETS!.fetch(new Request(new URL(path, request.url)))),\n });\n if (assetResponse) return assetResponse;\n }\n return result;\n }\n\n if (result === null || result === undefined) {\n return notFoundResponse();\n }\n\n return new Response(String(result), { status: 200 });\n },\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;AA+BA,IAAA,2BAAe,EACb,MAAM,MACJ,SACA,KACA,KACmB;CACnB,MAAM,MAAM,IAAI,IAAI,QAAQ,IAAI;AAMhC,KAAI,qBAAqB,IAAI,SAAS,CACpC,QAAO,kBAAkB;AAM3B,KAAI;AACF,qBAAmB,IAAI,SAAS;SAC1B;AAEN,SAAO,oBAAoB;;CAM7B;EACE,MAAM,kBAAkB,sBAAsB,QAAQ,QAAQ;AAC9D,YAAU,wBAAwB,SAAS,gBAAgB;;CAY7D,MAAM,iBAAiB,WAAW,SAAS,IAAI;CAC/C,MAAM,SAAS,OAAO,MAAM,wBAAwB,KAAK,SAAS,GAAG,UAAU;AAE/E,KAAI,kBAAkB,UAAU;AAC9B,MAAI,KAAK,QAAQ;GACf,MAAM,gBAAgB,MAAM,yBAAyB,QAAQ,EAC3D,aAAa,SACX,QAAQ,QAAQ,IAAI,OAAQ,MAAM,IAAI,QAAQ,IAAI,IAAI,MAAM,QAAQ,IAAI,CAAC,CAAC,CAAC,EAC9E,CAAC;AACF,OAAI,cAAe,QAAO;;AAE5B,SAAO;;AAGT,KAAI,WAAW,QAAQ,WAAW,KAAA,EAChC,QAAO,kBAAkB;AAG3B,QAAO,IAAI,SAAS,OAAO,OAAO,EAAE,EAAE,QAAQ,KAAK,CAAC;GAEvD"}
1
+ {"version":3,"file":"app-router-entry.js","names":[],"sources":["../../src/server/app-router-entry.ts"],"sourcesContent":["/**\n * Default Cloudflare Worker entry point for vinext App Router.\n *\n * Use this directly in wrangler.jsonc:\n * \"main\": \"vinext/server/app-router-entry\"\n *\n * Or import and delegate to it from a custom worker:\n * import handler from \"vinext/server/app-router-entry\";\n * return handler.fetch(request, env, ctx);\n *\n * This file runs in the RSC environment. Configure the Cloudflare plugin with:\n * cloudflare({ viteEnvironment: { name: \"rsc\", childEnvironments: [\"ssr\"] } })\n */\n\n// @ts-expect-error — virtual module resolved by vinext\nimport rscHandler from \"virtual:vinext-rsc-entry\";\nimport { runWithExecutionContext, type ExecutionContextLike } from \"vinext/shims/request-context\";\nimport { resolveStaticAssetSignal } from \"./worker-utils.js\";\nimport {\n cloneRequestWithHeaders,\n filterInternalHeaders,\n isOpenRedirectShaped,\n} from \"./request-pipeline.js\";\nimport { badRequestResponse, notFoundResponse } from \"./http-error-responses.js\";\n\ntype WorkerAssetEnv = {\n ASSETS?: {\n fetch(request: Request): Promise<Response> | Response;\n };\n};\n\nexport default {\n async fetch(\n request: Request,\n env?: WorkerAssetEnv,\n ctx?: ExecutionContextLike,\n ): Promise<Response> {\n return handleRequest(request, env, ctx);\n },\n};\n\nasync function handleRequest(\n request: Request,\n env: WorkerAssetEnv | undefined,\n ctx: ExecutionContextLike | undefined,\n): Promise<Response> {\n const url = new URL(request.url);\n\n // Block protocol-relative URL open redirects (//evil.com/, /\\evil.com/,\n // /%5Cevil.com/, /%2F/evil.com/). Check BEFORE decode so both literal and\n // percent-encoded variants are caught — encoded forms survive segment-wise\n // decoding and would otherwise reach trailing-slash redirect emitters.\n if (isOpenRedirectShaped(url.pathname)) {\n return notFoundResponse();\n }\n\n // Validate that percent-encoding is well-formed. The RSC handler performs\n // the actual decode + normalize; we only check here to return a clean 400\n // instead of letting a malformed sequence crash downstream.\n try {\n decodeURIComponent(url.pathname);\n } catch {\n // Malformed percent-encoding (e.g. /%E0%A4%A) — return 400 instead of throwing.\n return badRequestResponse();\n }\n\n // Strip internal headers from inbound requests before any handler or\n // middleware sees them. Must happen before the RSC handler runs.\n // Builds a new Headers — Request.headers is immutable in Workers.\n {\n const filteredHeaders = filterInternalHeaders(request.headers);\n request = cloneRequestWithHeaders(request, filteredHeaders);\n }\n\n // Do NOT decode/normalize the pathname here. The RSC handler\n // (virtual:vinext-rsc-entry) is the single point of decoding — it calls\n // decodeURIComponent + normalizePath on the incoming URL. Decoding here\n // AND in the handler would double-decode, causing inconsistent path\n // matching between middleware and routing.\n\n // Delegate to RSC handler (which decodes + normalizes the pathname itself),\n // wrapping in the ExecutionContext ALS scope so downstream code can reach\n // ctx.waitUntil() without having ctx threaded through every call site.\n const handleFn = () => rscHandler(request, ctx);\n const result = await (ctx ? runWithExecutionContext(ctx, handleFn) : handleFn());\n\n if (result instanceof Response) {\n if (env?.ASSETS) {\n const assetFetcher = env.ASSETS;\n const assetResponse = await resolveStaticAssetSignal(result, {\n fetchAsset: (path) =>\n Promise.resolve(assetFetcher.fetch(new Request(new URL(path, request.url)))),\n });\n if (assetResponse) return assetResponse;\n }\n return result;\n }\n\n if (result === null || result === undefined) {\n return notFoundResponse();\n }\n\n return new Response(String(result), { status: 200 });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AA+BA,IAAA,2BAAe,EACb,MAAM,MACJ,SACA,KACA,KACmB;CACnB,OAAO,cAAc,SAAS,KAAK,IAAI;GAE1C;AAED,eAAe,cACb,SACA,KACA,KACmB;CACnB,MAAM,MAAM,IAAI,IAAI,QAAQ,IAAI;CAMhC,IAAI,qBAAqB,IAAI,SAAS,EACpC,OAAO,kBAAkB;CAM3B,IAAI;EACF,mBAAmB,IAAI,SAAS;SAC1B;EAEN,OAAO,oBAAoB;;CAM7B;EACE,MAAM,kBAAkB,sBAAsB,QAAQ,QAAQ;EAC9D,UAAU,wBAAwB,SAAS,gBAAgB;;CAY7D,MAAM,iBAAiB,WAAW,SAAS,IAAI;CAC/C,MAAM,SAAS,OAAO,MAAM,wBAAwB,KAAK,SAAS,GAAG,UAAU;CAE/E,IAAI,kBAAkB,UAAU;EAC9B,IAAI,KAAK,QAAQ;GACf,MAAM,eAAe,IAAI;GACzB,MAAM,gBAAgB,MAAM,yBAAyB,QAAQ,EAC3D,aAAa,SACX,QAAQ,QAAQ,aAAa,MAAM,IAAI,QAAQ,IAAI,IAAI,MAAM,QAAQ,IAAI,CAAC,CAAC,CAAC,EAC/E,CAAC;GACF,IAAI,eAAe,OAAO;;EAE5B,OAAO;;CAGT,IAAI,WAAW,QAAQ,WAAW,KAAA,GAChC,OAAO,kBAAkB;CAG3B,OAAO,IAAI,SAAS,OAAO,OAAO,EAAE,EAAE,QAAQ,KAAK,CAAC"}
@@ -1,3 +1,6 @@
1
+ import { VINEXT_RSC_RENDER_MODE_HEADER } from "./headers.js";
2
+ import { AppRscRenderMode } from "./app-rsc-render-mode.js";
3
+
1
4
  //#region src/server/app-rsc-cache-busting.d.ts
2
5
  /**
3
6
  * RSC cache-busting hashes cover the headers that make a `.rsc` payload vary.
@@ -7,11 +10,11 @@
7
10
  */
8
11
  declare const VINEXT_RSC_CACHE_BUSTING_SEARCH_PARAM = "_rsc";
9
12
  declare const VINEXT_RSC_CONTENT_TYPE = "text/x-component";
10
- declare const VINEXT_RSC_MOUNTED_SLOTS_HEADER = "X-Vinext-Mounted-Slots";
11
13
  declare const VINEXT_RSC_VARY_HEADER: string;
12
14
  type CreateRscRequestHeadersOptions = {
13
15
  interceptionContext?: string | null;
14
16
  mountedSlotsHeader?: string | null;
17
+ renderMode?: AppRscRenderMode;
15
18
  };
16
19
  type ResolveInvalidRscCacheBustingRequestOptions = {
17
20
  isRscRequest: boolean;
@@ -30,5 +33,5 @@ declare function createRscRequestUrl(href: string, headers: Headers): Promise<st
30
33
  declare function createRscRedirectLocation(location: string, request: Request): Promise<string>;
31
34
  declare function resolveInvalidRscCacheBustingRequest(options: ResolveInvalidRscCacheBustingRequestOptions): Promise<Response | null>;
32
35
  //#endregion
33
- export { VINEXT_RSC_CACHE_BUSTING_SEARCH_PARAM, VINEXT_RSC_CONTENT_TYPE, VINEXT_RSC_MOUNTED_SLOTS_HEADER, VINEXT_RSC_VARY_HEADER, computeRscCacheBustingSearchParam, createRscRedirectLocation, createRscRequestHeaders, createRscRequestUrl, resolveInvalidRscCacheBustingRequest, setRscCacheBustingSearchParam, stripRscCacheBustingSearchParam, stripRscSuffix };
36
+ export { VINEXT_RSC_CACHE_BUSTING_SEARCH_PARAM, VINEXT_RSC_CONTENT_TYPE, VINEXT_RSC_RENDER_MODE_HEADER, VINEXT_RSC_VARY_HEADER, computeRscCacheBustingSearchParam, createRscRedirectLocation, createRscRequestHeaders, createRscRequestUrl, resolveInvalidRscCacheBustingRequest, setRscCacheBustingSearchParam, stripRscCacheBustingSearchParam, stripRscSuffix };
34
37
  //# sourceMappingURL=app-rsc-cache-busting.d.ts.map
@@ -1,4 +1,6 @@
1
+ import { NEXT_ROUTER_PREFETCH_HEADER, NEXT_ROUTER_SEGMENT_PREFETCH_HEADER, NEXT_ROUTER_STATE_TREE_HEADER, NEXT_URL_HEADER, VINEXT_INTERCEPTION_CONTEXT_HEADER, VINEXT_MOUNTED_SLOTS_HEADER, VINEXT_RSC_RENDER_MODE_HEADER } from "./headers.js";
1
2
  import { fnv1a64 } from "../utils/hash.js";
3
+ import { parseAppRscRenderMode } from "./app-rsc-render-mode.js";
2
4
  //#region src/server/app-rsc-cache-busting.ts
3
5
  /**
4
6
  * RSC cache-busting hashes cover the headers that make a `.rsc` payload vary.
@@ -8,22 +10,16 @@ import { fnv1a64 } from "../utils/hash.js";
8
10
  */
9
11
  const VINEXT_RSC_CACHE_BUSTING_SEARCH_PARAM = "_rsc";
10
12
  const VINEXT_RSC_CONTENT_TYPE = "text/x-component";
11
- const VINEXT_RSC_MOUNTED_SLOTS_HEADER = "X-Vinext-Mounted-Slots";
12
- const VINEXT_RSC_HEADER = "RSC";
13
- const VINEXT_RSC_INTERCEPTION_CONTEXT_HEADER = "X-Vinext-Interception-Context";
14
- const NEXT_ROUTER_STATE_TREE_HEADER = "Next-Router-State-Tree";
15
- const NEXT_ROUTER_PREFETCH_HEADER = "Next-Router-Prefetch";
16
- const NEXT_ROUTER_SEGMENT_PREFETCH_HEADER = "Next-Router-Segment-Prefetch";
17
- const NEXT_URL_HEADER = "Next-Url";
18
13
  const VINEXT_RSC_VARY_HEADER = [
19
- VINEXT_RSC_HEADER,
14
+ "RSC",
20
15
  "Accept",
21
16
  NEXT_ROUTER_STATE_TREE_HEADER,
22
17
  NEXT_ROUTER_PREFETCH_HEADER,
23
18
  NEXT_ROUTER_SEGMENT_PREFETCH_HEADER,
24
19
  NEXT_URL_HEADER,
25
- VINEXT_RSC_INTERCEPTION_CONTEXT_HEADER,
26
- VINEXT_RSC_MOUNTED_SLOTS_HEADER
20
+ VINEXT_INTERCEPTION_CONTEXT_HEADER,
21
+ VINEXT_MOUNTED_SLOTS_HEADER,
22
+ VINEXT_RSC_RENDER_MODE_HEADER
27
23
  ].join(", ");
28
24
  const CACHE_BUSTING_DIGEST_BYTES = 12;
29
25
  const textEncoder = new TextEncoder();
@@ -35,14 +31,19 @@ function encodeBase64Url(bytes) {
35
31
  function normalizeHeaderValue(value) {
36
32
  return value ?? "0";
37
33
  }
38
- function createCacheBustingInput(headers) {
34
+ function normalizeRenderModeHeaderValue(value) {
35
+ const renderMode = parseAppRscRenderMode(value);
36
+ return renderMode === "navigation" ? null : renderMode;
37
+ }
38
+ function createCacheBustingInput(headers, options = {}) {
39
39
  const values = [
40
40
  headers.get(NEXT_ROUTER_PREFETCH_HEADER),
41
41
  headers.get(NEXT_ROUTER_SEGMENT_PREFETCH_HEADER),
42
42
  headers.get(NEXT_ROUTER_STATE_TREE_HEADER),
43
43
  headers.get(NEXT_URL_HEADER),
44
- headers.get(VINEXT_RSC_INTERCEPTION_CONTEXT_HEADER),
45
- headers.get(VINEXT_RSC_MOUNTED_SLOTS_HEADER)
44
+ headers.get(VINEXT_INTERCEPTION_CONTEXT_HEADER),
45
+ headers.get(VINEXT_MOUNTED_SLOTS_HEADER),
46
+ ...options.includeRenderModeHeader === false ? [] : [normalizeRenderModeHeaderValue(headers.get(VINEXT_RSC_RENDER_MODE_HEADER))]
46
47
  ];
47
48
  if (values.every((value) => value === null)) return null;
48
49
  return values.map(normalizeHeaderValue).join(",");
@@ -55,6 +56,15 @@ function computeLegacyRscCacheBustingSearchParam(headers) {
55
56
  const input = createCacheBustingInput(headers);
56
57
  return input === null ? "" : fnv1a64(input);
57
58
  }
59
+ async function computePreviousRscCacheBustingSearchParam(headers) {
60
+ const input = createCacheBustingInput(headers, { includeRenderModeHeader: false });
61
+ if (input === null) return null;
62
+ return sha256CacheBustingHash(input);
63
+ }
64
+ function computePreviousLegacyRscCacheBustingSearchParam(headers) {
65
+ const input = createCacheBustingInput(headers, { includeRenderModeHeader: false });
66
+ return input === null ? null : fnv1a64(input);
67
+ }
58
68
  function getSearchPairsWithoutRscCacheBusting(url) {
59
69
  return (url.search.startsWith("?") ? url.search.slice(1) : url.search).split("&").filter((pair) => pair.length > 0 && !isRscCacheBustingSearchPair(pair));
60
70
  }
@@ -91,10 +101,12 @@ function stripRscSuffix(pathname) {
91
101
  function createRscRequestHeaders(options = {}) {
92
102
  const headers = new Headers({
93
103
  Accept: VINEXT_RSC_CONTENT_TYPE,
94
- [VINEXT_RSC_HEADER]: "1"
104
+ ["RSC"]: "1"
95
105
  });
96
- if (options.interceptionContext !== void 0 && options.interceptionContext !== null) headers.set(VINEXT_RSC_INTERCEPTION_CONTEXT_HEADER, options.interceptionContext);
97
- if (options.mountedSlotsHeader !== void 0 && options.mountedSlotsHeader !== null) headers.set(VINEXT_RSC_MOUNTED_SLOTS_HEADER, options.mountedSlotsHeader);
106
+ if (options.interceptionContext !== void 0 && options.interceptionContext !== null) headers.set(VINEXT_INTERCEPTION_CONTEXT_HEADER, options.interceptionContext);
107
+ if (options.mountedSlotsHeader !== void 0 && options.mountedSlotsHeader !== null) headers.set(VINEXT_MOUNTED_SLOTS_HEADER, options.mountedSlotsHeader);
108
+ const renderMode = options.renderMode ?? "navigation";
109
+ if (renderMode !== "navigation") headers.set(VINEXT_RSC_RENDER_MODE_HEADER, renderMode);
98
110
  return headers;
99
111
  }
100
112
  function toRscRequestPath(href) {
@@ -123,8 +135,17 @@ async function resolveInvalidRscCacheBustingRequest(options) {
123
135
  const actualHash = url.searchParams.get(VINEXT_RSC_CACHE_BUSTING_SEARCH_PARAM);
124
136
  const expectedHash = await computeRscCacheBustingSearchParam(options.request.headers);
125
137
  if (actualHash === null && expectedHash === "") return null;
126
- const legacyHash = actualHash !== null && actualHash !== expectedHash ? computeLegacyRscCacheBustingSearchParam(options.request.headers) : null;
127
- if (actualHash === expectedHash || legacyHash !== null && actualHash === legacyHash) return null;
138
+ const acceptedHashes = new Set([expectedHash]);
139
+ if (actualHash !== null && actualHash !== expectedHash) {
140
+ acceptedHashes.add(computeLegacyRscCacheBustingSearchParam(options.request.headers));
141
+ if (normalizeRenderModeHeaderValue(options.request.headers.get("X-Vinext-Rsc-Render-Mode")) === null) {
142
+ const previousHash = await computePreviousRscCacheBustingSearchParam(options.request.headers);
143
+ const previousLegacyHash = computePreviousLegacyRscCacheBustingSearchParam(options.request.headers);
144
+ if (previousHash !== null) acceptedHashes.add(previousHash);
145
+ if (previousLegacyHash !== null) acceptedHashes.add(previousLegacyHash);
146
+ }
147
+ }
148
+ if (actualHash !== null && acceptedHashes.has(actualHash)) return null;
128
149
  setRscCacheBustingSearchParam(url, expectedHash);
129
150
  return new Response(null, {
130
151
  status: 307,
@@ -132,6 +153,6 @@ async function resolveInvalidRscCacheBustingRequest(options) {
132
153
  });
133
154
  }
134
155
  //#endregion
135
- export { VINEXT_RSC_CACHE_BUSTING_SEARCH_PARAM, VINEXT_RSC_CONTENT_TYPE, VINEXT_RSC_MOUNTED_SLOTS_HEADER, VINEXT_RSC_VARY_HEADER, computeRscCacheBustingSearchParam, createRscRedirectLocation, createRscRequestHeaders, createRscRequestUrl, resolveInvalidRscCacheBustingRequest, setRscCacheBustingSearchParam, stripRscCacheBustingSearchParam, stripRscSuffix };
156
+ export { VINEXT_RSC_CACHE_BUSTING_SEARCH_PARAM, VINEXT_RSC_CONTENT_TYPE, VINEXT_RSC_RENDER_MODE_HEADER, VINEXT_RSC_VARY_HEADER, computeRscCacheBustingSearchParam, createRscRedirectLocation, createRscRequestHeaders, createRscRequestUrl, resolveInvalidRscCacheBustingRequest, setRscCacheBustingSearchParam, stripRscCacheBustingSearchParam, stripRscSuffix };
136
157
 
137
158
  //# sourceMappingURL=app-rsc-cache-busting.js.map