vinext 0.0.45 → 0.0.47

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 (311) hide show
  1. package/README.md +7 -5
  2. package/dist/build/prerender.d.ts +2 -1
  3. package/dist/build/prerender.js +80 -17
  4. package/dist/build/prerender.js.map +1 -1
  5. package/dist/build/report.d.ts +1 -1
  6. package/dist/build/route-classification-injector.d.ts +35 -0
  7. package/dist/build/route-classification-injector.js +61 -0
  8. package/dist/build/route-classification-injector.js.map +1 -0
  9. package/dist/build/route-classification-manifest.d.ts +1 -1
  10. package/dist/build/standalone.js +4 -3
  11. package/dist/build/standalone.js.map +1 -1
  12. package/dist/build/static-export.d.ts +1 -1
  13. package/dist/check.js +30 -18
  14. package/dist/check.js.map +1 -1
  15. package/dist/cli-args.d.ts +31 -0
  16. package/dist/cli-args.js +104 -0
  17. package/dist/cli-args.js.map +1 -0
  18. package/dist/cli.js +6 -19
  19. package/dist/cli.js.map +1 -1
  20. package/dist/cloudflare/kv-cache-handler.js +29 -9
  21. package/dist/cloudflare/kv-cache-handler.js.map +1 -1
  22. package/dist/config/config-matchers.js +1 -0
  23. package/dist/config/config-matchers.js.map +1 -1
  24. package/dist/config/next-config.d.ts +42 -4
  25. package/dist/config/next-config.js +27 -0
  26. package/dist/config/next-config.js.map +1 -1
  27. package/dist/deploy.js +18 -23
  28. package/dist/deploy.js.map +1 -1
  29. package/dist/entries/app-rsc-entry.d.ts +4 -3
  30. package/dist/entries/app-rsc-entry.js +435 -2317
  31. package/dist/entries/app-rsc-entry.js.map +1 -1
  32. package/dist/entries/app-rsc-manifest.d.ts +24 -0
  33. package/dist/entries/app-rsc-manifest.js +155 -0
  34. package/dist/entries/app-rsc-manifest.js.map +1 -0
  35. package/dist/entries/pages-server-entry.js +18 -105
  36. package/dist/entries/pages-server-entry.js.map +1 -1
  37. package/dist/index.js +82 -85
  38. package/dist/index.js.map +1 -1
  39. package/dist/plugins/fonts.js +54 -32
  40. package/dist/plugins/fonts.js.map +1 -1
  41. package/dist/plugins/rsc-client-shim-excludes.d.ts +6 -0
  42. package/dist/plugins/rsc-client-shim-excludes.js +28 -0
  43. package/dist/plugins/rsc-client-shim-excludes.js.map +1 -0
  44. package/dist/routing/app-route-graph.d.ts +109 -0
  45. package/dist/routing/app-route-graph.js +819 -0
  46. package/dist/routing/app-route-graph.js.map +1 -0
  47. package/dist/routing/app-router.d.ts +2 -79
  48. package/dist/routing/app-router.js +7 -621
  49. package/dist/routing/app-router.js.map +1 -1
  50. package/dist/routing/route-pattern.d.ts +9 -0
  51. package/dist/routing/route-pattern.js +90 -0
  52. package/dist/routing/route-pattern.js.map +1 -0
  53. package/dist/routing/route-trie.js +10 -11
  54. package/dist/routing/route-trie.js.map +1 -1
  55. package/dist/server/app-browser-entry.js +94 -232
  56. package/dist/server/app-browser-entry.js.map +1 -1
  57. package/dist/server/app-browser-error.d.ts +3 -4
  58. package/dist/server/app-browser-error.js +8 -4
  59. package/dist/server/app-browser-error.js.map +1 -1
  60. package/dist/server/app-browser-navigation-controller.d.ts +73 -0
  61. package/dist/server/app-browser-navigation-controller.js +282 -0
  62. package/dist/server/app-browser-navigation-controller.js.map +1 -0
  63. package/dist/server/app-browser-state.d.ts +1 -1
  64. package/dist/server/app-browser-state.js.map +1 -1
  65. package/dist/server/app-elements.js +1 -5
  66. package/dist/server/app-elements.js.map +1 -1
  67. package/dist/server/app-fallback-renderer.d.ts +57 -0
  68. package/dist/server/app-fallback-renderer.js +79 -0
  69. package/dist/server/app-fallback-renderer.js.map +1 -0
  70. package/dist/server/app-hook-warning-suppression.d.ts +7 -0
  71. package/dist/server/app-hook-warning-suppression.js +12 -0
  72. package/dist/server/app-hook-warning-suppression.js.map +1 -0
  73. package/dist/server/app-middleware.d.ts +32 -0
  74. package/dist/server/app-middleware.js +147 -0
  75. package/dist/server/app-middleware.js.map +1 -0
  76. package/dist/server/app-mounted-slots-header.d.ts +17 -0
  77. package/dist/server/app-mounted-slots-header.js +21 -0
  78. package/dist/server/app-mounted-slots-header.js.map +1 -0
  79. package/dist/server/app-page-boundary-render.d.ts +4 -2
  80. package/dist/server/app-page-boundary-render.js +50 -30
  81. package/dist/server/app-page-boundary-render.js.map +1 -1
  82. package/dist/server/app-page-boundary.d.ts +12 -1
  83. package/dist/server/app-page-boundary.js +27 -12
  84. package/dist/server/app-page-boundary.js.map +1 -1
  85. package/dist/server/app-page-cache.d.ts +22 -5
  86. package/dist/server/app-page-cache.js +90 -11
  87. package/dist/server/app-page-cache.js.map +1 -1
  88. package/dist/server/app-page-dispatch.d.ts +123 -0
  89. package/dist/server/app-page-dispatch.js +348 -0
  90. package/dist/server/app-page-dispatch.js.map +1 -0
  91. package/dist/server/app-page-element-builder.d.ts +61 -0
  92. package/dist/server/app-page-element-builder.js +139 -0
  93. package/dist/server/app-page-element-builder.js.map +1 -0
  94. package/dist/server/app-page-execution.d.ts +4 -3
  95. package/dist/server/app-page-execution.js +5 -8
  96. package/dist/server/app-page-execution.js.map +1 -1
  97. package/dist/server/app-page-head.d.ts +55 -0
  98. package/dist/server/app-page-head.js +196 -0
  99. package/dist/server/app-page-head.js.map +1 -0
  100. package/dist/server/app-page-method.d.ts +16 -0
  101. package/dist/server/app-page-method.js +30 -0
  102. package/dist/server/app-page-method.js.map +1 -0
  103. package/dist/server/app-page-params.d.ts +8 -0
  104. package/dist/server/app-page-params.js +28 -0
  105. package/dist/server/app-page-params.js.map +1 -0
  106. package/dist/server/app-page-render.d.ts +7 -2
  107. package/dist/server/app-page-render.js +131 -32
  108. package/dist/server/app-page-render.js.map +1 -1
  109. package/dist/server/app-page-request.d.ts +23 -8
  110. package/dist/server/app-page-request.js +51 -6
  111. package/dist/server/app-page-request.js.map +1 -1
  112. package/dist/server/app-page-response.d.ts +1 -0
  113. package/dist/server/app-page-response.js +3 -7
  114. package/dist/server/app-page-response.js.map +1 -1
  115. package/dist/server/app-page-route-wiring.d.ts +29 -5
  116. package/dist/server/app-page-route-wiring.js +30 -8
  117. package/dist/server/app-page-route-wiring.js.map +1 -1
  118. package/dist/server/app-page-stream.d.ts +10 -0
  119. package/dist/server/app-page-stream.js +5 -1
  120. package/dist/server/app-page-stream.js.map +1 -1
  121. package/dist/server/app-post-middleware-context.d.ts +16 -0
  122. package/dist/server/app-post-middleware-context.js +28 -0
  123. package/dist/server/app-post-middleware-context.js.map +1 -0
  124. package/dist/server/app-prerender-endpoints.d.ts +19 -0
  125. package/dist/server/app-prerender-endpoints.js +96 -0
  126. package/dist/server/app-prerender-endpoints.js.map +1 -0
  127. package/dist/server/app-prerender-static-params.d.ts +16 -0
  128. package/dist/server/app-prerender-static-params.js +14 -0
  129. package/dist/server/app-prerender-static-params.js.map +1 -0
  130. package/dist/server/app-request-context.d.ts +22 -0
  131. package/dist/server/app-request-context.js +30 -0
  132. package/dist/server/app-request-context.js.map +1 -0
  133. package/dist/server/app-route-handler-cache.d.ts +4 -0
  134. package/dist/server/app-route-handler-cache.js +11 -3
  135. package/dist/server/app-route-handler-cache.js.map +1 -1
  136. package/dist/server/app-route-handler-dispatch.d.ts +43 -0
  137. package/dist/server/app-route-handler-dispatch.js +149 -0
  138. package/dist/server/app-route-handler-dispatch.js.map +1 -0
  139. package/dist/server/app-route-handler-execution.d.ts +8 -3
  140. package/dist/server/app-route-handler-execution.js +25 -4
  141. package/dist/server/app-route-handler-execution.js.map +1 -1
  142. package/dist/server/app-route-handler-response.d.ts +6 -3
  143. package/dist/server/app-route-handler-response.js +52 -11
  144. package/dist/server/app-route-handler-response.js.map +1 -1
  145. package/dist/server/app-route-handler-runtime.d.ts +4 -1
  146. package/dist/server/app-route-handler-runtime.js +107 -1
  147. package/dist/server/app-route-handler-runtime.js.map +1 -1
  148. package/dist/server/app-router-entry.js.map +1 -1
  149. package/dist/server/app-rsc-error-handler.d.ts +21 -0
  150. package/dist/server/app-rsc-error-handler.js +30 -0
  151. package/dist/server/app-rsc-error-handler.js.map +1 -0
  152. package/dist/server/app-rsc-errors.d.ts +27 -0
  153. package/dist/server/app-rsc-errors.js +42 -0
  154. package/dist/server/app-rsc-errors.js.map +1 -0
  155. package/dist/server/app-rsc-handler.d.ts +117 -0
  156. package/dist/server/app-rsc-handler.js +260 -0
  157. package/dist/server/app-rsc-handler.js.map +1 -0
  158. package/dist/server/app-rsc-request-normalization.d.ts +40 -0
  159. package/dist/server/app-rsc-request-normalization.js +63 -0
  160. package/dist/server/app-rsc-request-normalization.js.map +1 -0
  161. package/dist/server/app-rsc-response-finalizer.d.ts +30 -0
  162. package/dist/server/app-rsc-response-finalizer.js +38 -0
  163. package/dist/server/app-rsc-response-finalizer.js.map +1 -0
  164. package/dist/server/app-rsc-route-matching.d.ts +40 -0
  165. package/dist/server/app-rsc-route-matching.js +66 -0
  166. package/dist/server/app-rsc-route-matching.js.map +1 -0
  167. package/dist/server/app-segment-config.d.ts +33 -0
  168. package/dist/server/app-segment-config.js +86 -0
  169. package/dist/server/app-segment-config.js.map +1 -0
  170. package/dist/server/app-server-action-execution.d.ts +88 -1
  171. package/dist/server/app-server-action-execution.js +257 -5
  172. package/dist/server/app-server-action-execution.js.map +1 -1
  173. package/dist/server/app-ssr-entry.d.ts +7 -0
  174. package/dist/server/app-ssr-entry.js +30 -9
  175. package/dist/server/app-ssr-entry.js.map +1 -1
  176. package/dist/server/app-ssr-stream.d.ts +4 -2
  177. package/dist/server/app-ssr-stream.js +29 -2
  178. package/dist/server/app-ssr-stream.js.map +1 -1
  179. package/dist/server/app-static-generation.d.ts +15 -0
  180. package/dist/server/app-static-generation.js +20 -0
  181. package/dist/server/app-static-generation.js.map +1 -0
  182. package/dist/server/cache-control.d.ts +24 -0
  183. package/dist/server/cache-control.js +33 -0
  184. package/dist/server/cache-control.js.map +1 -0
  185. package/dist/server/dev-error-overlay-store.d.ts +23 -0
  186. package/dist/server/dev-error-overlay-store.js +67 -0
  187. package/dist/server/dev-error-overlay-store.js.map +1 -0
  188. package/dist/server/dev-error-overlay.d.ts +15 -0
  189. package/dist/server/dev-error-overlay.js +548 -0
  190. package/dist/server/dev-error-overlay.js.map +1 -0
  191. package/dist/server/dev-route-files.d.ts +7 -0
  192. package/dist/server/dev-route-files.js +73 -0
  193. package/dist/server/dev-route-files.js.map +1 -0
  194. package/dist/server/dev-server.js +4 -0
  195. package/dist/server/dev-server.js.map +1 -1
  196. package/dist/server/file-based-metadata.d.ts +17 -0
  197. package/dist/server/file-based-metadata.js +356 -0
  198. package/dist/server/file-based-metadata.js.map +1 -0
  199. package/dist/server/implicit-tags.d.ts +6 -0
  200. package/dist/server/implicit-tags.js +42 -0
  201. package/dist/server/implicit-tags.js.map +1 -0
  202. package/dist/server/instrumentation-runtime.d.ts +44 -0
  203. package/dist/server/instrumentation-runtime.js +29 -0
  204. package/dist/server/instrumentation-runtime.js.map +1 -0
  205. package/dist/server/instrumentation.js.map +1 -1
  206. package/dist/server/isr-cache.d.ts +16 -3
  207. package/dist/server/isr-cache.js +56 -8
  208. package/dist/server/isr-cache.js.map +1 -1
  209. package/dist/server/metadata-route-build-data.d.ts +25 -0
  210. package/dist/server/metadata-route-build-data.js +150 -0
  211. package/dist/server/metadata-route-build-data.js.map +1 -0
  212. package/dist/server/metadata-route-response.d.ts +17 -0
  213. package/dist/server/metadata-route-response.js +187 -0
  214. package/dist/server/metadata-route-response.js.map +1 -0
  215. package/dist/server/metadata-routes.d.ts +42 -4
  216. package/dist/server/metadata-routes.js +127 -11
  217. package/dist/server/metadata-routes.js.map +1 -1
  218. package/dist/server/middleware-matcher.d.ts +15 -0
  219. package/dist/server/middleware-matcher.js +102 -0
  220. package/dist/server/middleware-matcher.js.map +1 -0
  221. package/dist/server/middleware-request-headers.js +2 -1
  222. package/dist/server/middleware-request-headers.js.map +1 -1
  223. package/dist/server/middleware-runtime.d.ts +39 -0
  224. package/dist/server/middleware-runtime.js +159 -0
  225. package/dist/server/middleware-runtime.js.map +1 -0
  226. package/dist/server/middleware.d.ts +4 -36
  227. package/dist/server/middleware.js +18 -228
  228. package/dist/server/middleware.js.map +1 -1
  229. package/dist/server/pages-page-data.d.ts +7 -2
  230. package/dist/server/pages-page-data.js +10 -5
  231. package/dist/server/pages-page-data.js.map +1 -1
  232. package/dist/server/pages-page-response.d.ts +2 -1
  233. package/dist/server/pages-page-response.js +5 -3
  234. package/dist/server/pages-page-response.js.map +1 -1
  235. package/dist/server/prerender-work-unit-setup.d.ts +7 -0
  236. package/dist/server/prerender-work-unit-setup.js +30 -0
  237. package/dist/server/prerender-work-unit-setup.js.map +1 -0
  238. package/dist/server/prod-server.js +10 -14
  239. package/dist/server/prod-server.js.map +1 -1
  240. package/dist/server/request-pipeline.d.ts +46 -5
  241. package/dist/server/request-pipeline.js +84 -5
  242. package/dist/server/request-pipeline.js.map +1 -1
  243. package/dist/server/rsc-stream-hints.d.ts +7 -0
  244. package/dist/server/rsc-stream-hints.js +38 -0
  245. package/dist/server/rsc-stream-hints.js.map +1 -0
  246. package/dist/server/seed-cache.js +19 -8
  247. package/dist/server/seed-cache.js.map +1 -1
  248. package/dist/server/server-action-not-found.d.ts +9 -0
  249. package/dist/server/server-action-not-found.js +40 -0
  250. package/dist/server/server-action-not-found.js.map +1 -0
  251. package/dist/shims/cache-runtime.js +28 -11
  252. package/dist/shims/cache-runtime.js.map +1 -1
  253. package/dist/shims/cache.d.ts +39 -4
  254. package/dist/shims/cache.js +93 -16
  255. package/dist/shims/cache.js.map +1 -1
  256. package/dist/shims/error-boundary.d.ts +66 -5
  257. package/dist/shims/error-boundary.js +106 -4
  258. package/dist/shims/error-boundary.js.map +1 -1
  259. package/dist/shims/fetch-cache.d.ts +4 -1
  260. package/dist/shims/fetch-cache.js +55 -13
  261. package/dist/shims/fetch-cache.js.map +1 -1
  262. package/dist/shims/font-google-base.d.ts +5 -4
  263. package/dist/shims/font-google-base.js +61 -13
  264. package/dist/shims/font-google-base.js.map +1 -1
  265. package/dist/shims/headers.d.ts +14 -2
  266. package/dist/shims/headers.js +127 -17
  267. package/dist/shims/headers.js.map +1 -1
  268. package/dist/shims/image.js +116 -10
  269. package/dist/shims/image.js.map +1 -1
  270. package/dist/shims/internal/make-hanging-promise.d.ts +16 -0
  271. package/dist/shims/internal/make-hanging-promise.js +46 -0
  272. package/dist/shims/internal/make-hanging-promise.js.map +1 -0
  273. package/dist/shims/internal/work-unit-async-storage.d.ts +26 -3
  274. package/dist/shims/internal/work-unit-async-storage.js +6 -3
  275. package/dist/shims/internal/work-unit-async-storage.js.map +1 -1
  276. package/dist/shims/metadata.d.ts +38 -26
  277. package/dist/shims/metadata.js +75 -45
  278. package/dist/shims/metadata.js.map +1 -1
  279. package/dist/shims/navigation.d.ts +10 -1
  280. package/dist/shims/navigation.js +18 -1
  281. package/dist/shims/navigation.js.map +1 -1
  282. package/dist/shims/navigation.react-server.d.ts +2 -2
  283. package/dist/shims/navigation.react-server.js +2 -2
  284. package/dist/shims/navigation.react-server.js.map +1 -1
  285. package/dist/shims/offline.d.ts +5 -0
  286. package/dist/shims/offline.js +17 -0
  287. package/dist/shims/offline.js.map +1 -0
  288. package/dist/shims/request-state-types.d.ts +3 -2
  289. package/dist/shims/root-params.d.ts +11 -0
  290. package/dist/shims/root-params.js +24 -0
  291. package/dist/shims/root-params.js.map +1 -0
  292. package/dist/shims/router.js +1 -1
  293. package/dist/shims/server.d.ts +3 -1
  294. package/dist/shims/server.js +83 -5
  295. package/dist/shims/server.js.map +1 -1
  296. package/dist/shims/thenable-params.d.ts +5 -0
  297. package/dist/shims/thenable-params.js +37 -0
  298. package/dist/shims/thenable-params.js.map +1 -0
  299. package/dist/shims/unified-request-context.d.ts +3 -2
  300. package/dist/shims/unified-request-context.js +3 -0
  301. package/dist/shims/unified-request-context.js.map +1 -1
  302. package/dist/shims/use-merged-ref.d.ts +7 -0
  303. package/dist/shims/use-merged-ref.js +40 -0
  304. package/dist/shims/use-merged-ref.js.map +1 -0
  305. package/dist/utils/cache-control-metadata.d.ts +6 -0
  306. package/dist/utils/cache-control-metadata.js +16 -0
  307. package/dist/utils/cache-control-metadata.js.map +1 -0
  308. package/package.json +6 -1
  309. package/dist/server/middleware-codegen.d.ts +0 -54
  310. package/dist/server/middleware-codegen.js +0 -414
  311. package/dist/server/middleware-codegen.js.map +0 -1
@@ -0,0 +1,96 @@
1
+ import { callAppPrerenderStaticParams } from "./app-prerender-static-params.js";
2
+ //#region src/server/app-prerender-endpoints.ts
3
+ const STATIC_PARAMS_ENDPOINT = "/__vinext/prerender/static-params";
4
+ const PAGES_STATIC_PATHS_ENDPOINT = "/__vinext/prerender/pages-static-paths";
5
+ const JSON_HEADERS = { "content-type": "application/json" };
6
+ async function handleAppPrerenderEndpoint(request, options) {
7
+ if (options.pathname === STATIC_PARAMS_ENDPOINT) return handleStaticParamsEndpoint(request, options);
8
+ if (options.pathname === PAGES_STATIC_PATHS_ENDPOINT) {
9
+ if (!options.loadPagesRoutes) return null;
10
+ return handlePagesStaticPathsEndpoint(request, options);
11
+ }
12
+ return null;
13
+ }
14
+ async function handleStaticParamsEndpoint(request, options) {
15
+ if (!isEnabled(options)) return new Response("Not Found", { status: 404 });
16
+ const url = new URL(request.url);
17
+ const pattern = url.searchParams.get("pattern");
18
+ if (!pattern) return new Response("missing pattern", { status: 400 });
19
+ const generateStaticParams = options.staticParamsMap[pattern];
20
+ if (typeof generateStaticParams !== "function") return jsonNullResponse();
21
+ try {
22
+ return jsonResponse(await callAppPrerenderStaticParams({
23
+ fn: generateStaticParams,
24
+ params: parseParentParams(url.searchParams.get("parentParams")),
25
+ pattern,
26
+ rootParamNamesByPattern: options.rootParamNamesByPattern ?? {}
27
+ }));
28
+ } catch (error) {
29
+ return jsonResponse({ error: String(error) }, 500);
30
+ }
31
+ }
32
+ async function handlePagesStaticPathsEndpoint(request, options) {
33
+ if (!isEnabled(options)) return new Response("Not Found", { status: 404 });
34
+ const url = new URL(request.url);
35
+ const pattern = url.searchParams.get("pattern");
36
+ if (!pattern) return new Response("missing pattern", { status: 400 });
37
+ try {
38
+ const getStaticPaths = findPageRoute(await options.loadPagesRoutes?.(), pattern)?.module?.getStaticPaths;
39
+ if (typeof getStaticPaths !== "function") return jsonNullResponse();
40
+ return jsonResponse(await getStaticPaths({
41
+ locales: parseLocales(url.searchParams.get("locales")),
42
+ defaultLocale: url.searchParams.get("defaultLocale") ?? ""
43
+ }));
44
+ } catch (error) {
45
+ return jsonResponse({ error: String(error) }, 500);
46
+ }
47
+ }
48
+ function isEnabled(options) {
49
+ return options.isPrerenderEnabled?.() ?? false;
50
+ }
51
+ function jsonResponse(body, status = 200) {
52
+ return new Response(JSON.stringify(body), {
53
+ headers: JSON_HEADERS,
54
+ status
55
+ });
56
+ }
57
+ function jsonNullResponse() {
58
+ return new Response("null", {
59
+ headers: JSON_HEADERS,
60
+ status: 200
61
+ });
62
+ }
63
+ function parseParentParams(raw) {
64
+ if (!raw) return {};
65
+ const value = JSON.parse(raw);
66
+ if (!isPlainObject(value)) return {};
67
+ const params = {};
68
+ for (const [key, paramValue] of Object.entries(value)) if (typeof paramValue === "string" || paramValue === void 0 || isStringArray(paramValue)) params[key] = paramValue;
69
+ return params;
70
+ }
71
+ function parseLocales(raw) {
72
+ if (!raw) return [];
73
+ const value = JSON.parse(raw);
74
+ if (!Array.isArray(value)) return [];
75
+ return value.filter((locale) => typeof locale === "string");
76
+ }
77
+ function findPageRoute(value, pattern) {
78
+ if (!Array.isArray(value)) return void 0;
79
+ for (const route of value) if (isPageRoute(route) && route.pattern === pattern) return route;
80
+ }
81
+ function isPageRoute(value) {
82
+ if (!isPlainObject(value) || typeof value.pattern !== "string") return false;
83
+ if (value.module === void 0) return true;
84
+ if (!isPlainObject(value.module)) return false;
85
+ return value.module.getStaticPaths === void 0 || typeof value.module.getStaticPaths === "function";
86
+ }
87
+ function isPlainObject(value) {
88
+ return typeof value === "object" && value !== null && !Array.isArray(value);
89
+ }
90
+ function isStringArray(value) {
91
+ return Array.isArray(value) && value.every((item) => typeof item === "string");
92
+ }
93
+ //#endregion
94
+ export { handleAppPrerenderEndpoint };
95
+
96
+ //# sourceMappingURL=app-prerender-endpoints.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-prerender-endpoints.js","names":[],"sources":["../../src/server/app-prerender-endpoints.ts"],"sourcesContent":["import { callAppPrerenderStaticParams } from \"./app-prerender-static-params.js\";\nimport type { RootParams } from \"vinext/shims/root-params\";\n\ntype GenerateStaticParams = (args: { params: RootParams }) => unknown;\n\ntype AppPrerenderStaticParamsMap = Record<string, GenerateStaticParams | null | undefined>;\ntype RootParamNamesMap = Record<string, readonly string[] | undefined>;\n\ntype AppPrerenderPageRoute = {\n pattern: string;\n module?: {\n getStaticPaths?: (opts: { locales: string[]; defaultLocale: string }) => unknown;\n };\n};\n\ntype HandleAppPrerenderEndpointOptions = {\n isPrerenderEnabled?: () => boolean;\n loadPagesRoutes?: () => Promise<unknown>;\n pathname: string;\n rootParamNamesByPattern?: RootParamNamesMap;\n staticParamsMap: AppPrerenderStaticParamsMap;\n};\n\nconst STATIC_PARAMS_ENDPOINT = \"/__vinext/prerender/static-params\";\nconst PAGES_STATIC_PATHS_ENDPOINT = \"/__vinext/prerender/pages-static-paths\";\nconst JSON_HEADERS = { \"content-type\": \"application/json\" };\n\nexport async function handleAppPrerenderEndpoint(\n request: Request,\n options: HandleAppPrerenderEndpointOptions,\n): Promise<Response | null> {\n if (options.pathname === STATIC_PARAMS_ENDPOINT) {\n return handleStaticParamsEndpoint(request, options);\n }\n\n if (options.pathname === PAGES_STATIC_PATHS_ENDPOINT) {\n if (!options.loadPagesRoutes) return null;\n return handlePagesStaticPathsEndpoint(request, options);\n }\n\n return null;\n}\n\nasync function handleStaticParamsEndpoint(\n request: Request,\n options: HandleAppPrerenderEndpointOptions,\n): Promise<Response> {\n if (!isEnabled(options)) {\n return new Response(\"Not Found\", { status: 404 });\n }\n\n const url = new URL(request.url);\n const pattern = url.searchParams.get(\"pattern\");\n if (!pattern) return new Response(\"missing pattern\", { status: 400 });\n\n const generateStaticParams = options.staticParamsMap[pattern];\n if (typeof generateStaticParams !== \"function\") {\n return jsonNullResponse();\n }\n\n try {\n const params = parseParentParams(url.searchParams.get(\"parentParams\"));\n const result = await callAppPrerenderStaticParams({\n fn: generateStaticParams,\n params,\n pattern,\n rootParamNamesByPattern: options.rootParamNamesByPattern ?? {},\n });\n return jsonResponse(result);\n } catch (error) {\n return jsonResponse({ error: String(error) }, 500);\n }\n}\n\nasync function handlePagesStaticPathsEndpoint(\n request: Request,\n options: HandleAppPrerenderEndpointOptions,\n): Promise<Response> {\n if (!isEnabled(options)) {\n return new Response(\"Not Found\", { status: 404 });\n }\n\n const url = new URL(request.url);\n const pattern = url.searchParams.get(\"pattern\");\n if (!pattern) return new Response(\"missing pattern\", { status: 400 });\n\n try {\n const pageRoutes = await options.loadPagesRoutes?.();\n const route = findPageRoute(pageRoutes, pattern);\n const getStaticPaths = route?.module?.getStaticPaths;\n if (typeof getStaticPaths !== \"function\") {\n return jsonNullResponse();\n }\n\n const locales = parseLocales(url.searchParams.get(\"locales\"));\n const defaultLocale = url.searchParams.get(\"defaultLocale\") ?? \"\";\n const result = await getStaticPaths({ locales, defaultLocale });\n return jsonResponse(result);\n } catch (error) {\n return jsonResponse({ error: String(error) }, 500);\n }\n}\n\nfunction isEnabled(options: HandleAppPrerenderEndpointOptions): boolean {\n return options.isPrerenderEnabled?.() ?? false;\n}\n\nfunction jsonResponse(body: unknown, status = 200): Response {\n return new Response(JSON.stringify(body), {\n headers: JSON_HEADERS,\n status,\n });\n}\n\nfunction jsonNullResponse(): Response {\n return new Response(\"null\", {\n headers: JSON_HEADERS,\n status: 200,\n });\n}\n\nfunction parseParentParams(raw: string | null): RootParams {\n if (!raw) return {};\n\n const value = JSON.parse(raw);\n if (!isPlainObject(value)) return {};\n\n const params: RootParams = {};\n for (const [key, paramValue] of Object.entries(value)) {\n if (typeof paramValue === \"string\" || paramValue === undefined || isStringArray(paramValue)) {\n params[key] = paramValue;\n }\n }\n return params;\n}\n\nfunction parseLocales(raw: string | null): string[] {\n if (!raw) return [];\n\n const value = JSON.parse(raw);\n if (!Array.isArray(value)) return [];\n\n return value.filter((locale) => typeof locale === \"string\");\n}\n\nfunction findPageRoute(value: unknown, pattern: string): AppPrerenderPageRoute | undefined {\n if (!Array.isArray(value)) return undefined;\n\n for (const route of value) {\n if (isPageRoute(route) && route.pattern === pattern) {\n return route;\n }\n }\n\n return undefined;\n}\n\nfunction isPageRoute(value: unknown): value is AppPrerenderPageRoute {\n if (!isPlainObject(value) || typeof value.pattern !== \"string\") return false;\n if (value.module === undefined) return true;\n if (!isPlainObject(value.module)) return false;\n\n return (\n value.module.getStaticPaths === undefined || typeof value.module.getStaticPaths === \"function\"\n );\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isStringArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every((item) => typeof item === \"string\");\n}\n"],"mappings":";;AAuBA,MAAM,yBAAyB;AAC/B,MAAM,8BAA8B;AACpC,MAAM,eAAe,EAAE,gBAAgB,oBAAoB;AAE3D,eAAsB,2BACpB,SACA,SAC0B;AAC1B,KAAI,QAAQ,aAAa,uBACvB,QAAO,2BAA2B,SAAS,QAAQ;AAGrD,KAAI,QAAQ,aAAa,6BAA6B;AACpD,MAAI,CAAC,QAAQ,gBAAiB,QAAO;AACrC,SAAO,+BAA+B,SAAS,QAAQ;;AAGzD,QAAO;;AAGT,eAAe,2BACb,SACA,SACmB;AACnB,KAAI,CAAC,UAAU,QAAQ,CACrB,QAAO,IAAI,SAAS,aAAa,EAAE,QAAQ,KAAK,CAAC;CAGnD,MAAM,MAAM,IAAI,IAAI,QAAQ,IAAI;CAChC,MAAM,UAAU,IAAI,aAAa,IAAI,UAAU;AAC/C,KAAI,CAAC,QAAS,QAAO,IAAI,SAAS,mBAAmB,EAAE,QAAQ,KAAK,CAAC;CAErE,MAAM,uBAAuB,QAAQ,gBAAgB;AACrD,KAAI,OAAO,yBAAyB,WAClC,QAAO,kBAAkB;AAG3B,KAAI;AAQF,SAAO,aANQ,MAAM,6BAA6B;GAChD,IAAI;GACJ,QAHa,kBAAkB,IAAI,aAAa,IAAI,eAAe,CAAC;GAIpE;GACA,yBAAyB,QAAQ,2BAA2B,EAAE;GAC/D,CAAC,CACyB;UACpB,OAAO;AACd,SAAO,aAAa,EAAE,OAAO,OAAO,MAAM,EAAE,EAAE,IAAI;;;AAItD,eAAe,+BACb,SACA,SACmB;AACnB,KAAI,CAAC,UAAU,QAAQ,CACrB,QAAO,IAAI,SAAS,aAAa,EAAE,QAAQ,KAAK,CAAC;CAGnD,MAAM,MAAM,IAAI,IAAI,QAAQ,IAAI;CAChC,MAAM,UAAU,IAAI,aAAa,IAAI,UAAU;AAC/C,KAAI,CAAC,QAAS,QAAO,IAAI,SAAS,mBAAmB,EAAE,QAAQ,KAAK,CAAC;AAErE,KAAI;EAGF,MAAM,iBADQ,cADK,MAAM,QAAQ,mBAAmB,EACZ,QAAQ,EAClB,QAAQ;AACtC,MAAI,OAAO,mBAAmB,WAC5B,QAAO,kBAAkB;AAM3B,SAAO,aADQ,MAAM,eAAe;GAAE,SAFtB,aAAa,IAAI,aAAa,IAAI,UAAU,CAAC;GAEd,eADzB,IAAI,aAAa,IAAI,gBAAgB,IAAI;GACD,CAAC,CACpC;UACpB,OAAO;AACd,SAAO,aAAa,EAAE,OAAO,OAAO,MAAM,EAAE,EAAE,IAAI;;;AAItD,SAAS,UAAU,SAAqD;AACtE,QAAO,QAAQ,sBAAsB,IAAI;;AAG3C,SAAS,aAAa,MAAe,SAAS,KAAe;AAC3D,QAAO,IAAI,SAAS,KAAK,UAAU,KAAK,EAAE;EACxC,SAAS;EACT;EACD,CAAC;;AAGJ,SAAS,mBAA6B;AACpC,QAAO,IAAI,SAAS,QAAQ;EAC1B,SAAS;EACT,QAAQ;EACT,CAAC;;AAGJ,SAAS,kBAAkB,KAAgC;AACzD,KAAI,CAAC,IAAK,QAAO,EAAE;CAEnB,MAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,KAAI,CAAC,cAAc,MAAM,CAAE,QAAO,EAAE;CAEpC,MAAM,SAAqB,EAAE;AAC7B,MAAK,MAAM,CAAC,KAAK,eAAe,OAAO,QAAQ,MAAM,CACnD,KAAI,OAAO,eAAe,YAAY,eAAe,KAAA,KAAa,cAAc,WAAW,CACzF,QAAO,OAAO;AAGlB,QAAO;;AAGT,SAAS,aAAa,KAA8B;AAClD,KAAI,CAAC,IAAK,QAAO,EAAE;CAEnB,MAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,KAAI,CAAC,MAAM,QAAQ,MAAM,CAAE,QAAO,EAAE;AAEpC,QAAO,MAAM,QAAQ,WAAW,OAAO,WAAW,SAAS;;AAG7D,SAAS,cAAc,OAAgB,SAAoD;AACzF,KAAI,CAAC,MAAM,QAAQ,MAAM,CAAE,QAAO,KAAA;AAElC,MAAK,MAAM,SAAS,MAClB,KAAI,YAAY,MAAM,IAAI,MAAM,YAAY,QAC1C,QAAO;;AAOb,SAAS,YAAY,OAAgD;AACnE,KAAI,CAAC,cAAc,MAAM,IAAI,OAAO,MAAM,YAAY,SAAU,QAAO;AACvE,KAAI,MAAM,WAAW,KAAA,EAAW,QAAO;AACvC,KAAI,CAAC,cAAc,MAAM,OAAO,CAAE,QAAO;AAEzC,QACE,MAAM,OAAO,mBAAmB,KAAA,KAAa,OAAO,MAAM,OAAO,mBAAmB;;AAIxF,SAAS,cAAc,OAAkD;AACvE,QAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,MAAM;;AAG7E,SAAS,cAAc,OAAmC;AACxD,QAAO,MAAM,QAAQ,MAAM,IAAI,MAAM,OAAO,SAAS,OAAO,SAAS,SAAS"}
@@ -0,0 +1,16 @@
1
+ import { RootParams } from "../shims/root-params.js";
2
+
3
+ //#region src/server/app-prerender-static-params.d.ts
4
+ type GenerateStaticParamsFunction = (input: {
5
+ params: RootParams;
6
+ }) => unknown;
7
+ type CallAppPrerenderStaticParamsOptions = {
8
+ fn: GenerateStaticParamsFunction;
9
+ params: RootParams;
10
+ pattern: string;
11
+ rootParamNamesByPattern: Record<string, readonly string[] | undefined>;
12
+ };
13
+ declare function callAppPrerenderStaticParams(options: CallAppPrerenderStaticParamsOptions): Promise<unknown>;
14
+ //#endregion
15
+ export { callAppPrerenderStaticParams };
16
+ //# sourceMappingURL=app-prerender-static-params.d.ts.map
@@ -0,0 +1,14 @@
1
+ import { pickRootParams, setRootParams } from "../shims/root-params.js";
2
+ //#region src/server/app-prerender-static-params.ts
3
+ async function callAppPrerenderStaticParams(options) {
4
+ setRootParams(pickRootParams(options.params, options.rootParamNamesByPattern[options.pattern]));
5
+ try {
6
+ return await options.fn({ params: options.params });
7
+ } finally {
8
+ setRootParams(null);
9
+ }
10
+ }
11
+ //#endregion
12
+ export { callAppPrerenderStaticParams };
13
+
14
+ //# sourceMappingURL=app-prerender-static-params.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-prerender-static-params.js","names":[],"sources":["../../src/server/app-prerender-static-params.ts"],"sourcesContent":["import { pickRootParams, setRootParams, type RootParams } from \"vinext/shims/root-params\";\n\ntype GenerateStaticParamsFunction = (input: { params: RootParams }) => unknown;\n\ntype CallAppPrerenderStaticParamsOptions = {\n fn: GenerateStaticParamsFunction;\n params: RootParams;\n pattern: string;\n rootParamNamesByPattern: Record<string, readonly string[] | undefined>;\n};\n\nexport async function callAppPrerenderStaticParams(\n options: CallAppPrerenderStaticParamsOptions,\n): Promise<unknown> {\n setRootParams(pickRootParams(options.params, options.rootParamNamesByPattern[options.pattern]));\n try {\n return await options.fn({ params: options.params });\n } finally {\n setRootParams(null);\n }\n}\n"],"mappings":";;AAWA,eAAsB,6BACpB,SACkB;AAClB,eAAc,eAAe,QAAQ,QAAQ,QAAQ,wBAAwB,QAAQ,SAAS,CAAC;AAC/F,KAAI;AACF,SAAO,MAAM,QAAQ,GAAG,EAAE,QAAQ,QAAQ,QAAQ,CAAC;WAC3C;AACR,gBAAc,KAAK"}
@@ -0,0 +1,22 @@
1
+ import { NavigationContext } from "../shims/navigation.js";
2
+
3
+ //#region src/server/app-request-context.d.ts
4
+ /**
5
+ * Set navigation context in the ALS-backed store. "use client" components
6
+ * rendered during SSR need the pathname/searchParams/params but the SSR
7
+ * environment has a separate module instance of next/navigation.
8
+ *
9
+ * Clearing nav context (ctx === null) also clears root params.
10
+ */
11
+ declare function setAppNavigationContext(ctx: NavigationContext | null): void;
12
+ /**
13
+ * Clear all per-request ALS state owned by the App Router handler.
14
+ * Must be called before returning a non-page response (redirect, public
15
+ * file proxy, etc.) to prevent state leaking between requests on Workers.
16
+ *
17
+ * Clears: headers, navigation context, root params.
18
+ */
19
+ declare function clearAppRequestContext(): void;
20
+ //#endregion
21
+ export { clearAppRequestContext, setAppNavigationContext };
22
+ //# sourceMappingURL=app-request-context.d.ts.map
@@ -0,0 +1,30 @@
1
+ import { setHeadersContext } from "../shims/headers.js";
2
+ import { setNavigationContext } from "../shims/navigation.js";
3
+ import { setRootParams } from "../shims/root-params.js";
4
+ //#region src/server/app-request-context.ts
5
+ /**
6
+ * Set navigation context in the ALS-backed store. "use client" components
7
+ * rendered during SSR need the pathname/searchParams/params but the SSR
8
+ * environment has a separate module instance of next/navigation.
9
+ *
10
+ * Clearing nav context (ctx === null) also clears root params.
11
+ */
12
+ function setAppNavigationContext(ctx) {
13
+ setNavigationContext(ctx);
14
+ if (ctx === null) setRootParams(null);
15
+ }
16
+ /**
17
+ * Clear all per-request ALS state owned by the App Router handler.
18
+ * Must be called before returning a non-page response (redirect, public
19
+ * file proxy, etc.) to prevent state leaking between requests on Workers.
20
+ *
21
+ * Clears: headers, navigation context, root params.
22
+ */
23
+ function clearAppRequestContext() {
24
+ setHeadersContext(null);
25
+ setAppNavigationContext(null);
26
+ }
27
+ //#endregion
28
+ export { clearAppRequestContext, setAppNavigationContext };
29
+
30
+ //# sourceMappingURL=app-request-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-request-context.js","names":[],"sources":["../../src/server/app-request-context.ts"],"sourcesContent":["import { setHeadersContext } from \"vinext/shims/headers\";\nimport {\n setNavigationContext as setNavigationContextOrig,\n type NavigationContext,\n} from \"vinext/shims/navigation\";\nimport { setRootParams } from \"vinext/shims/root-params\";\n\n/**\n * Set navigation context in the ALS-backed store. \"use client\" components\n * rendered during SSR need the pathname/searchParams/params but the SSR\n * environment has a separate module instance of next/navigation.\n *\n * Clearing nav context (ctx === null) also clears root params.\n */\nexport function setAppNavigationContext(ctx: NavigationContext | null): void {\n setNavigationContextOrig(ctx);\n if (ctx === null) setRootParams(null);\n}\n\n/**\n * Clear all per-request ALS state owned by the App Router handler.\n * Must be called before returning a non-page response (redirect, public\n * file proxy, etc.) to prevent state leaking between requests on Workers.\n *\n * Clears: headers, navigation context, root params.\n */\nexport function clearAppRequestContext(): void {\n setHeadersContext(null);\n setAppNavigationContext(null);\n}\n"],"mappings":";;;;;;;;;;;AAcA,SAAgB,wBAAwB,KAAqC;AAC3E,sBAAyB,IAAI;AAC7B,KAAI,QAAQ,KAAM,eAAc,KAAK;;;;;;;;;AAUvC,SAAgB,yBAA+B;AAC7C,mBAAkB,KAAK;AACvB,yBAAwB,KAAK"}
@@ -1,5 +1,6 @@
1
1
  import { NextI18nConfig } from "../config/next-config.js";
2
2
  import { ISRCacheEntry } from "./isr-cache.js";
3
+ import { HeadersAccessPhase } from "../shims/headers.js";
3
4
  import { RouteHandlerMiddlewareContext } from "./app-route-handler-response.js";
4
5
  import { AppRouteDebugLogger, AppRouteDynamicUsageFn, AppRouteHandlerFunction, AppRouteParams, MarkAppRouteDynamicUsageFn, RouteHandlerCacheSetter } from "./app-route-handler-execution.js";
5
6
 
@@ -13,6 +14,7 @@ type ReadAppRouteHandlerCacheOptions = {
13
14
  cleanPathname: string;
14
15
  clearRequestContext: () => void;
15
16
  consumeDynamicUsage: AppRouteDynamicUsageFn;
17
+ dynamicConfig?: string;
16
18
  getCollectedFetchTags: () => string[];
17
19
  handlerFn: AppRouteHandlerFunction;
18
20
  i18n?: NextI18nConfig | null;
@@ -26,10 +28,12 @@ type ReadAppRouteHandlerCacheOptions = {
26
28
  params: AppRouteParams;
27
29
  requestUrl: string;
28
30
  revalidateSearchParams: URLSearchParams;
31
+ expireSeconds?: number;
29
32
  revalidateSeconds: number;
30
33
  routePattern: string;
31
34
  runInRevalidationContext: RouteHandlerRevalidationContextRunner;
32
35
  scheduleBackgroundRegeneration: RouteHandlerBackgroundRegenerator;
36
+ setHeadersAccessPhase: (phase: HeadersAccessPhase) => HeadersAccessPhase;
33
37
  setNavigationContext: (context: {
34
38
  pathname: string;
35
39
  searchParams: URLSearchParams;
@@ -1,5 +1,5 @@
1
- import { applyRouteHandlerMiddlewareContext, buildAppRouteCacheValue, buildRouteHandlerCachedResponse } from "./app-route-handler-response.js";
2
1
  import { markKnownDynamicAppRoute } from "./app-route-handler-runtime.js";
2
+ import { applyRouteHandlerMiddlewareContext, assertSupportedAppRouteHandlerResponse, buildAppRouteCacheValue, buildRouteHandlerCachedResponse } from "./app-route-handler-response.js";
3
3
  import { runAppRouteHandler } from "./app-route-handler-execution.js";
4
4
  //#region src/server/app-route-handler-cache.ts
5
5
  function getCachedAppRouteValue(entry) {
@@ -15,6 +15,8 @@ async function readAppRouteHandlerCacheResponse(options) {
15
15
  options.clearRequestContext();
16
16
  return applyRouteHandlerMiddlewareContext(buildRouteHandlerCachedResponse(cachedValue, {
17
17
  cacheState: "HIT",
18
+ cacheControl: cached?.value.cacheControl,
19
+ expireSeconds: options.expireSeconds,
18
20
  isHead: options.isAutoHead,
19
21
  revalidateSeconds: options.revalidateSeconds
20
22
  }), options.middlewareContext);
@@ -32,13 +34,17 @@ async function readAppRouteHandlerCacheResponse(options) {
32
34
  const { dynamicUsedInHandler, response } = await runAppRouteHandler({
33
35
  basePath: options.basePath,
34
36
  consumeDynamicUsage: options.consumeDynamicUsage,
37
+ dynamicConfig: options.dynamicConfig,
35
38
  handlerFn: options.handlerFn,
36
39
  i18n: options.i18n,
37
40
  markDynamicUsage: options.markDynamicUsage,
38
41
  params: options.params,
39
- request: new Request(options.requestUrl, { method: "GET" })
42
+ request: new Request(options.requestUrl, { method: "GET" }),
43
+ routePattern: options.routePattern,
44
+ setHeadersAccessPhase: options.setHeadersAccessPhase
40
45
  });
41
46
  options.setNavigationContext(null);
47
+ assertSupportedAppRouteHandlerResponse(response);
42
48
  if (dynamicUsedInHandler) {
43
49
  markKnownDynamicAppRoute(options.routePattern);
44
50
  options.isrDebug?.("route regen skipped (dynamic usage)", options.cleanPathname);
@@ -46,7 +52,7 @@ async function readAppRouteHandlerCacheResponse(options) {
46
52
  }
47
53
  const routeTags = options.buildPageCacheTags(options.cleanPathname, options.getCollectedFetchTags());
48
54
  const routeCacheValue = await buildAppRouteCacheValue(response);
49
- await options.isrSet(routeKey, routeCacheValue, options.revalidateSeconds, routeTags);
55
+ await options.isrSet(routeKey, routeCacheValue, options.revalidateSeconds, routeTags, options.expireSeconds);
50
56
  options.isrDebug?.("route regen complete", routeKey);
51
57
  });
52
58
  });
@@ -54,6 +60,8 @@ async function readAppRouteHandlerCacheResponse(options) {
54
60
  options.clearRequestContext();
55
61
  return applyRouteHandlerMiddlewareContext(buildRouteHandlerCachedResponse(staleValue, {
56
62
  cacheState: "STALE",
63
+ cacheControl: cached.value.cacheControl,
64
+ expireSeconds: options.expireSeconds,
57
65
  isHead: options.isAutoHead,
58
66
  revalidateSeconds: options.revalidateSeconds
59
67
  }), options.middlewareContext);
@@ -1 +1 @@
1
- {"version":3,"file":"app-route-handler-cache.js","names":[],"sources":["../../src/server/app-route-handler-cache.ts"],"sourcesContent":["import type { NextI18nConfig } from \"../config/next-config.js\";\nimport type { ISRCacheEntry } from \"./isr-cache.js\";\nimport type { RouteHandlerMiddlewareContext } from \"./app-route-handler-response.js\";\nimport {\n applyRouteHandlerMiddlewareContext,\n buildAppRouteCacheValue,\n buildRouteHandlerCachedResponse,\n} from \"./app-route-handler-response.js\";\nimport { markKnownDynamicAppRoute } from \"./app-route-handler-runtime.js\";\nimport {\n runAppRouteHandler,\n type AppRouteDebugLogger,\n type AppRouteDynamicUsageFn,\n type AppRouteHandlerFunction,\n type AppRouteParams,\n type MarkAppRouteDynamicUsageFn,\n type RouteHandlerCacheSetter,\n} from \"./app-route-handler-execution.js\";\n\ntype RouteHandlerCacheGetter = (key: string) => Promise<ISRCacheEntry | null>;\ntype RouteHandlerBackgroundRegenerator = (key: string, renderFn: () => Promise<void>) => void;\ntype RouteHandlerRevalidationContextRunner = (renderFn: () => Promise<void>) => Promise<void>;\n\ntype ReadAppRouteHandlerCacheOptions = {\n basePath?: string;\n buildPageCacheTags: (pathname: string, extraTags: string[]) => string[];\n cleanPathname: string;\n clearRequestContext: () => void;\n consumeDynamicUsage: AppRouteDynamicUsageFn;\n getCollectedFetchTags: () => string[];\n handlerFn: AppRouteHandlerFunction;\n i18n?: NextI18nConfig | null;\n isAutoHead: boolean;\n isrDebug?: AppRouteDebugLogger;\n isrGet: RouteHandlerCacheGetter;\n isrRouteKey: (pathname: string) => string;\n isrSet: RouteHandlerCacheSetter;\n markDynamicUsage: MarkAppRouteDynamicUsageFn;\n middlewareContext: RouteHandlerMiddlewareContext;\n params: AppRouteParams;\n requestUrl: string;\n revalidateSearchParams: URLSearchParams;\n revalidateSeconds: number;\n routePattern: string;\n runInRevalidationContext: RouteHandlerRevalidationContextRunner;\n scheduleBackgroundRegeneration: RouteHandlerBackgroundRegenerator;\n setNavigationContext: (\n context: {\n pathname: string;\n searchParams: URLSearchParams;\n params: AppRouteParams;\n } | null,\n ) => void;\n};\n\nfunction getCachedAppRouteValue(entry: ISRCacheEntry | null) {\n return entry?.value.value && entry.value.value.kind === \"APP_ROUTE\" ? entry.value.value : null;\n}\n\nexport async function readAppRouteHandlerCacheResponse(\n options: ReadAppRouteHandlerCacheOptions,\n): Promise<Response | null> {\n const routeKey = options.isrRouteKey(options.cleanPathname);\n\n try {\n const cached = await options.isrGet(routeKey);\n const cachedValue = getCachedAppRouteValue(cached);\n\n if (cachedValue && !cached?.isStale) {\n options.isrDebug?.(\"HIT (route)\", options.cleanPathname);\n options.clearRequestContext();\n return applyRouteHandlerMiddlewareContext(\n buildRouteHandlerCachedResponse(cachedValue, {\n cacheState: \"HIT\",\n isHead: options.isAutoHead,\n revalidateSeconds: options.revalidateSeconds,\n }),\n options.middlewareContext,\n );\n }\n\n if (cached?.isStale && cachedValue) {\n const staleValue = cachedValue;\n const revalidateSearchParams = new URLSearchParams(options.revalidateSearchParams);\n\n options.scheduleBackgroundRegeneration(routeKey, async () => {\n await options.runInRevalidationContext(async () => {\n options.setNavigationContext({\n pathname: options.cleanPathname,\n searchParams: revalidateSearchParams,\n params: options.params,\n });\n\n const { dynamicUsedInHandler, response } = await runAppRouteHandler({\n basePath: options.basePath,\n consumeDynamicUsage: options.consumeDynamicUsage,\n handlerFn: options.handlerFn,\n i18n: options.i18n,\n markDynamicUsage: options.markDynamicUsage,\n params: options.params,\n request: new Request(options.requestUrl, { method: \"GET\" }),\n });\n\n options.setNavigationContext(null);\n\n if (dynamicUsedInHandler) {\n markKnownDynamicAppRoute(options.routePattern);\n options.isrDebug?.(\"route regen skipped (dynamic usage)\", options.cleanPathname);\n return;\n }\n\n const routeTags = options.buildPageCacheTags(\n options.cleanPathname,\n options.getCollectedFetchTags(),\n );\n const routeCacheValue = await buildAppRouteCacheValue(response);\n await options.isrSet(routeKey, routeCacheValue, options.revalidateSeconds, routeTags);\n options.isrDebug?.(\"route regen complete\", routeKey);\n });\n });\n\n options.isrDebug?.(\"STALE (route)\", options.cleanPathname);\n options.clearRequestContext();\n return applyRouteHandlerMiddlewareContext(\n buildRouteHandlerCachedResponse(staleValue, {\n cacheState: \"STALE\",\n isHead: options.isAutoHead,\n revalidateSeconds: options.revalidateSeconds,\n }),\n options.middlewareContext,\n );\n }\n } catch (routeCacheError) {\n console.error(\"[vinext] ISR route cache read error:\", routeCacheError);\n }\n\n return null;\n}\n"],"mappings":";;;;AAuDA,SAAS,uBAAuB,OAA6B;AAC3D,QAAO,OAAO,MAAM,SAAS,MAAM,MAAM,MAAM,SAAS,cAAc,MAAM,MAAM,QAAQ;;AAG5F,eAAsB,iCACpB,SAC0B;CAC1B,MAAM,WAAW,QAAQ,YAAY,QAAQ,cAAc;AAE3D,KAAI;EACF,MAAM,SAAS,MAAM,QAAQ,OAAO,SAAS;EAC7C,MAAM,cAAc,uBAAuB,OAAO;AAElD,MAAI,eAAe,CAAC,QAAQ,SAAS;AACnC,WAAQ,WAAW,eAAe,QAAQ,cAAc;AACxD,WAAQ,qBAAqB;AAC7B,UAAO,mCACL,gCAAgC,aAAa;IAC3C,YAAY;IACZ,QAAQ,QAAQ;IAChB,mBAAmB,QAAQ;IAC5B,CAAC,EACF,QAAQ,kBACT;;AAGH,MAAI,QAAQ,WAAW,aAAa;GAClC,MAAM,aAAa;GACnB,MAAM,yBAAyB,IAAI,gBAAgB,QAAQ,uBAAuB;AAElF,WAAQ,+BAA+B,UAAU,YAAY;AAC3D,UAAM,QAAQ,yBAAyB,YAAY;AACjD,aAAQ,qBAAqB;MAC3B,UAAU,QAAQ;MAClB,cAAc;MACd,QAAQ,QAAQ;MACjB,CAAC;KAEF,MAAM,EAAE,sBAAsB,aAAa,MAAM,mBAAmB;MAClE,UAAU,QAAQ;MAClB,qBAAqB,QAAQ;MAC7B,WAAW,QAAQ;MACnB,MAAM,QAAQ;MACd,kBAAkB,QAAQ;MAC1B,QAAQ,QAAQ;MAChB,SAAS,IAAI,QAAQ,QAAQ,YAAY,EAAE,QAAQ,OAAO,CAAC;MAC5D,CAAC;AAEF,aAAQ,qBAAqB,KAAK;AAElC,SAAI,sBAAsB;AACxB,+BAAyB,QAAQ,aAAa;AAC9C,cAAQ,WAAW,uCAAuC,QAAQ,cAAc;AAChF;;KAGF,MAAM,YAAY,QAAQ,mBACxB,QAAQ,eACR,QAAQ,uBAAuB,CAChC;KACD,MAAM,kBAAkB,MAAM,wBAAwB,SAAS;AAC/D,WAAM,QAAQ,OAAO,UAAU,iBAAiB,QAAQ,mBAAmB,UAAU;AACrF,aAAQ,WAAW,wBAAwB,SAAS;MACpD;KACF;AAEF,WAAQ,WAAW,iBAAiB,QAAQ,cAAc;AAC1D,WAAQ,qBAAqB;AAC7B,UAAO,mCACL,gCAAgC,YAAY;IAC1C,YAAY;IACZ,QAAQ,QAAQ;IAChB,mBAAmB,QAAQ;IAC5B,CAAC,EACF,QAAQ,kBACT;;UAEI,iBAAiB;AACxB,UAAQ,MAAM,wCAAwC,gBAAgB;;AAGxE,QAAO"}
1
+ {"version":3,"file":"app-route-handler-cache.js","names":[],"sources":["../../src/server/app-route-handler-cache.ts"],"sourcesContent":["import type { NextI18nConfig } from \"../config/next-config.js\";\nimport type { HeadersAccessPhase } from \"vinext/shims/headers\";\nimport type { ISRCacheEntry } from \"./isr-cache.js\";\nimport type { RouteHandlerMiddlewareContext } from \"./app-route-handler-response.js\";\nimport {\n applyRouteHandlerMiddlewareContext,\n assertSupportedAppRouteHandlerResponse,\n buildAppRouteCacheValue,\n buildRouteHandlerCachedResponse,\n} from \"./app-route-handler-response.js\";\nimport { markKnownDynamicAppRoute } from \"./app-route-handler-runtime.js\";\nimport {\n runAppRouteHandler,\n type AppRouteDebugLogger,\n type AppRouteDynamicUsageFn,\n type AppRouteHandlerFunction,\n type AppRouteParams,\n type MarkAppRouteDynamicUsageFn,\n type RouteHandlerCacheSetter,\n} from \"./app-route-handler-execution.js\";\n\ntype RouteHandlerCacheGetter = (key: string) => Promise<ISRCacheEntry | null>;\ntype RouteHandlerBackgroundRegenerator = (key: string, renderFn: () => Promise<void>) => void;\ntype RouteHandlerRevalidationContextRunner = (renderFn: () => Promise<void>) => Promise<void>;\n\ntype ReadAppRouteHandlerCacheOptions = {\n basePath?: string;\n buildPageCacheTags: (pathname: string, extraTags: string[]) => string[];\n cleanPathname: string;\n clearRequestContext: () => void;\n consumeDynamicUsage: AppRouteDynamicUsageFn;\n dynamicConfig?: string;\n getCollectedFetchTags: () => string[];\n handlerFn: AppRouteHandlerFunction;\n i18n?: NextI18nConfig | null;\n isAutoHead: boolean;\n isrDebug?: AppRouteDebugLogger;\n isrGet: RouteHandlerCacheGetter;\n isrRouteKey: (pathname: string) => string;\n isrSet: RouteHandlerCacheSetter;\n markDynamicUsage: MarkAppRouteDynamicUsageFn;\n middlewareContext: RouteHandlerMiddlewareContext;\n params: AppRouteParams;\n requestUrl: string;\n revalidateSearchParams: URLSearchParams;\n expireSeconds?: number;\n revalidateSeconds: number;\n routePattern: string;\n runInRevalidationContext: RouteHandlerRevalidationContextRunner;\n scheduleBackgroundRegeneration: RouteHandlerBackgroundRegenerator;\n setHeadersAccessPhase: (phase: HeadersAccessPhase) => HeadersAccessPhase;\n setNavigationContext: (\n context: {\n pathname: string;\n searchParams: URLSearchParams;\n params: AppRouteParams;\n } | null,\n ) => void;\n};\n\nfunction getCachedAppRouteValue(entry: ISRCacheEntry | null) {\n return entry?.value.value && entry.value.value.kind === \"APP_ROUTE\" ? entry.value.value : null;\n}\n\nexport async function readAppRouteHandlerCacheResponse(\n options: ReadAppRouteHandlerCacheOptions,\n): Promise<Response | null> {\n const routeKey = options.isrRouteKey(options.cleanPathname);\n\n try {\n const cached = await options.isrGet(routeKey);\n const cachedValue = getCachedAppRouteValue(cached);\n\n if (cachedValue && !cached?.isStale) {\n options.isrDebug?.(\"HIT (route)\", options.cleanPathname);\n options.clearRequestContext();\n return applyRouteHandlerMiddlewareContext(\n buildRouteHandlerCachedResponse(cachedValue, {\n cacheState: \"HIT\",\n cacheControl: cached?.value.cacheControl,\n expireSeconds: options.expireSeconds,\n isHead: options.isAutoHead,\n revalidateSeconds: options.revalidateSeconds,\n }),\n options.middlewareContext,\n );\n }\n\n if (cached?.isStale && cachedValue) {\n const staleValue = cachedValue;\n const revalidateSearchParams = new URLSearchParams(options.revalidateSearchParams);\n\n options.scheduleBackgroundRegeneration(routeKey, async () => {\n await options.runInRevalidationContext(async () => {\n options.setNavigationContext({\n pathname: options.cleanPathname,\n searchParams: revalidateSearchParams,\n params: options.params,\n });\n\n const { dynamicUsedInHandler, response } = await runAppRouteHandler({\n basePath: options.basePath,\n consumeDynamicUsage: options.consumeDynamicUsage,\n dynamicConfig: options.dynamicConfig,\n handlerFn: options.handlerFn,\n i18n: options.i18n,\n markDynamicUsage: options.markDynamicUsage,\n params: options.params,\n request: new Request(options.requestUrl, { method: \"GET\" }),\n routePattern: options.routePattern,\n setHeadersAccessPhase: options.setHeadersAccessPhase,\n });\n\n options.setNavigationContext(null);\n assertSupportedAppRouteHandlerResponse(response);\n\n if (dynamicUsedInHandler) {\n markKnownDynamicAppRoute(options.routePattern);\n options.isrDebug?.(\"route regen skipped (dynamic usage)\", options.cleanPathname);\n return;\n }\n\n const routeTags = options.buildPageCacheTags(\n options.cleanPathname,\n options.getCollectedFetchTags(),\n );\n const routeCacheValue = await buildAppRouteCacheValue(response);\n await options.isrSet(\n routeKey,\n routeCacheValue,\n options.revalidateSeconds,\n routeTags,\n options.expireSeconds,\n );\n options.isrDebug?.(\"route regen complete\", routeKey);\n });\n });\n\n options.isrDebug?.(\"STALE (route)\", options.cleanPathname);\n options.clearRequestContext();\n return applyRouteHandlerMiddlewareContext(\n buildRouteHandlerCachedResponse(staleValue, {\n cacheState: \"STALE\",\n cacheControl: cached.value.cacheControl,\n expireSeconds: options.expireSeconds,\n isHead: options.isAutoHead,\n revalidateSeconds: options.revalidateSeconds,\n }),\n options.middlewareContext,\n );\n }\n } catch (routeCacheError) {\n console.error(\"[vinext] ISR route cache read error:\", routeCacheError);\n }\n\n return null;\n}\n"],"mappings":";;;;AA4DA,SAAS,uBAAuB,OAA6B;AAC3D,QAAO,OAAO,MAAM,SAAS,MAAM,MAAM,MAAM,SAAS,cAAc,MAAM,MAAM,QAAQ;;AAG5F,eAAsB,iCACpB,SAC0B;CAC1B,MAAM,WAAW,QAAQ,YAAY,QAAQ,cAAc;AAE3D,KAAI;EACF,MAAM,SAAS,MAAM,QAAQ,OAAO,SAAS;EAC7C,MAAM,cAAc,uBAAuB,OAAO;AAElD,MAAI,eAAe,CAAC,QAAQ,SAAS;AACnC,WAAQ,WAAW,eAAe,QAAQ,cAAc;AACxD,WAAQ,qBAAqB;AAC7B,UAAO,mCACL,gCAAgC,aAAa;IAC3C,YAAY;IACZ,cAAc,QAAQ,MAAM;IAC5B,eAAe,QAAQ;IACvB,QAAQ,QAAQ;IAChB,mBAAmB,QAAQ;IAC5B,CAAC,EACF,QAAQ,kBACT;;AAGH,MAAI,QAAQ,WAAW,aAAa;GAClC,MAAM,aAAa;GACnB,MAAM,yBAAyB,IAAI,gBAAgB,QAAQ,uBAAuB;AAElF,WAAQ,+BAA+B,UAAU,YAAY;AAC3D,UAAM,QAAQ,yBAAyB,YAAY;AACjD,aAAQ,qBAAqB;MAC3B,UAAU,QAAQ;MAClB,cAAc;MACd,QAAQ,QAAQ;MACjB,CAAC;KAEF,MAAM,EAAE,sBAAsB,aAAa,MAAM,mBAAmB;MAClE,UAAU,QAAQ;MAClB,qBAAqB,QAAQ;MAC7B,eAAe,QAAQ;MACvB,WAAW,QAAQ;MACnB,MAAM,QAAQ;MACd,kBAAkB,QAAQ;MAC1B,QAAQ,QAAQ;MAChB,SAAS,IAAI,QAAQ,QAAQ,YAAY,EAAE,QAAQ,OAAO,CAAC;MAC3D,cAAc,QAAQ;MACtB,uBAAuB,QAAQ;MAChC,CAAC;AAEF,aAAQ,qBAAqB,KAAK;AAClC,4CAAuC,SAAS;AAEhD,SAAI,sBAAsB;AACxB,+BAAyB,QAAQ,aAAa;AAC9C,cAAQ,WAAW,uCAAuC,QAAQ,cAAc;AAChF;;KAGF,MAAM,YAAY,QAAQ,mBACxB,QAAQ,eACR,QAAQ,uBAAuB,CAChC;KACD,MAAM,kBAAkB,MAAM,wBAAwB,SAAS;AAC/D,WAAM,QAAQ,OACZ,UACA,iBACA,QAAQ,mBACR,WACA,QAAQ,cACT;AACD,aAAQ,WAAW,wBAAwB,SAAS;MACpD;KACF;AAEF,WAAQ,WAAW,iBAAiB,QAAQ,cAAc;AAC1D,WAAQ,qBAAqB;AAC7B,UAAO,mCACL,gCAAgC,YAAY;IAC1C,YAAY;IACZ,cAAc,OAAO,MAAM;IAC3B,eAAe,QAAQ;IACvB,QAAQ,QAAQ;IAChB,mBAAmB,QAAQ;IAC5B,CAAC,EACF,QAAQ,kBACT;;UAEI,iBAAiB;AACxB,UAAQ,MAAM,wCAAwC,gBAAgB;;AAGxE,QAAO"}
@@ -0,0 +1,43 @@
1
+ import { NextI18nConfig } from "../config/next-config.js";
2
+ import { ISRCacheEntry } from "./isr-cache.js";
3
+ import { RouteHandlerMiddlewareContext } from "./app-route-handler-response.js";
4
+ import { AppRouteHandlerModule } from "./app-route-handler-policy.js";
5
+ import { AppRouteDebugLogger, AppRouteParams, RouteHandlerCacheSetter } from "./app-route-handler-execution.js";
6
+
7
+ //#region src/server/app-route-handler-dispatch.d.ts
8
+ type AppRouteHandlerDispatchRoute = {
9
+ pattern: string;
10
+ routeHandler: AppRouteHandlerModule;
11
+ routeSegments: string[];
12
+ };
13
+ type RouteHandlerCacheGetter = (key: string) => Promise<ISRCacheEntry | null>;
14
+ type RouteHandlerBackgroundRegenerationErrorContext = {
15
+ routerKind: "App Router";
16
+ routePath: string;
17
+ routeType: "route";
18
+ };
19
+ type RouteHandlerBackgroundRegenerator = (key: string, renderFn: () => Promise<void>, errorContext?: RouteHandlerBackgroundRegenerationErrorContext) => void;
20
+ type DispatchAppRouteHandlerOptions = {
21
+ basePath?: string;
22
+ cleanPathname: string;
23
+ clearRequestContext: () => void;
24
+ expireSeconds?: number;
25
+ i18n?: NextI18nConfig | null;
26
+ isDevelopment?: boolean;
27
+ isProduction?: boolean;
28
+ isrDebug?: AppRouteDebugLogger;
29
+ isrGet: RouteHandlerCacheGetter;
30
+ isrRouteKey: (pathname: string) => string;
31
+ isrSet: RouteHandlerCacheSetter;
32
+ middlewareContext: RouteHandlerMiddlewareContext;
33
+ middlewareRequestHeaders?: Headers | null;
34
+ params: AppRouteParams;
35
+ request: Request;
36
+ route: AppRouteHandlerDispatchRoute;
37
+ scheduleBackgroundRegeneration: RouteHandlerBackgroundRegenerator;
38
+ searchParams: URLSearchParams;
39
+ };
40
+ declare function dispatchAppRouteHandler(options: DispatchAppRouteHandlerOptions): Promise<Response>;
41
+ //#endregion
42
+ export { dispatchAppRouteHandler };
43
+ //# sourceMappingURL=app-route-handler-dispatch.d.ts.map
@@ -0,0 +1,149 @@
1
+ import { createRequestContext, runWithRequestContext } from "../shims/unified-request-context.js";
2
+ import { getRequestExecutionContext } from "../shims/request-context.js";
3
+ import { reportRequestError } from "./instrumentation.js";
4
+ import { consumeDynamicUsage, getAndClearPendingCookies, getDraftModeCookieHeader, markDynamicUsage, setHeadersAccessPhase } from "../shims/headers.js";
5
+ import { ensureFetchPatch, getCollectedFetchTags, setCurrentFetchSoftTags } from "../shims/fetch-cache.js";
6
+ import { setNavigationContext } from "../shims/navigation.js";
7
+ import { isKnownDynamicAppRoute } from "./app-route-handler-runtime.js";
8
+ import { getAppRouteHandlerRevalidateSeconds, hasAppRouteHandlerDefaultExport, resolveAppRouteHandlerMethod, shouldReadAppRouteHandlerCache } from "./app-route-handler-policy.js";
9
+ import { createStaticGenerationHeadersContext } from "./app-static-generation.js";
10
+ import { buildPageCacheTags } from "./implicit-tags.js";
11
+ import { applyRouteHandlerMiddlewareContext } from "./app-route-handler-response.js";
12
+ import { executeAppRouteHandler } from "./app-route-handler-execution.js";
13
+ import { readAppRouteHandlerCacheResponse } from "./app-route-handler-cache.js";
14
+ //#region src/server/app-route-handler-dispatch.ts
15
+ function isAppRouteHandlerFunction(value) {
16
+ return typeof value === "function";
17
+ }
18
+ function makeThenableParams(params) {
19
+ const plain = { ...params };
20
+ return Object.assign(Promise.resolve(plain), plain);
21
+ }
22
+ function buildRouteHandlerPageCacheTags(pathname, extraTags, routeSegments) {
23
+ return buildPageCacheTags(pathname, extraTags, routeSegments, "route");
24
+ }
25
+ async function runInRouteHandlerRevalidationContext(options, renderFn) {
26
+ await runWithRequestContext(createRequestContext({
27
+ headersContext: createStaticGenerationHeadersContext({
28
+ dynamicConfig: options.dynamicConfig,
29
+ routeKind: "route",
30
+ routePattern: options.routePattern
31
+ }),
32
+ executionContext: getRequestExecutionContext(),
33
+ unstableCacheRevalidation: "foreground"
34
+ }), async () => {
35
+ ensureFetchPatch();
36
+ setCurrentFetchSoftTags(buildRouteHandlerPageCacheTags(options.cleanPathname, [], options.routeSegments));
37
+ await renderFn();
38
+ });
39
+ }
40
+ async function dispatchAppRouteHandler(options) {
41
+ const { route } = options;
42
+ const handler = route.routeHandler;
43
+ const method = options.request.method.toUpperCase();
44
+ const revalidateSeconds = getAppRouteHandlerRevalidateSeconds(handler);
45
+ const isDevelopment = options.isDevelopment ?? process.env.NODE_ENV === "development";
46
+ const isProduction = options.isProduction ?? process.env.NODE_ENV === "production";
47
+ if (hasAppRouteHandlerDefaultExport(handler) && isDevelopment) console.error("[vinext] Detected default export in route handler " + route.pattern + ". Export a named export for each HTTP method instead.");
48
+ const { allowHeaderForOptions, handlerFn, isAutoHead, shouldAutoRespondToOptions } = resolveAppRouteHandlerMethod(handler, method);
49
+ if (shouldAutoRespondToOptions) {
50
+ options.clearRequestContext();
51
+ return applyRouteHandlerMiddlewareContext(new Response(null, {
52
+ status: 204,
53
+ headers: { Allow: allowHeaderForOptions }
54
+ }), options.middlewareContext);
55
+ }
56
+ const resolvedHandlerFn = isAppRouteHandlerFunction(handlerFn) ? handlerFn : void 0;
57
+ if (revalidateSeconds !== null && shouldReadAppRouteHandlerCache({
58
+ dynamicConfig: handler.dynamic,
59
+ handlerFn: resolvedHandlerFn,
60
+ isAutoHead,
61
+ isKnownDynamic: isKnownDynamicAppRoute(route.pattern),
62
+ isProduction,
63
+ method,
64
+ revalidateSeconds
65
+ }) && resolvedHandlerFn) {
66
+ const cachedRouteResponse = await readAppRouteHandlerCacheResponse({
67
+ basePath: options.basePath,
68
+ buildPageCacheTags(pathname, extraTags) {
69
+ return buildRouteHandlerPageCacheTags(pathname, extraTags, route.routeSegments);
70
+ },
71
+ cleanPathname: options.cleanPathname,
72
+ clearRequestContext: options.clearRequestContext,
73
+ consumeDynamicUsage,
74
+ dynamicConfig: handler.dynamic,
75
+ getCollectedFetchTags,
76
+ handlerFn: resolvedHandlerFn,
77
+ i18n: options.i18n,
78
+ isAutoHead,
79
+ isrDebug: options.isrDebug,
80
+ isrGet: options.isrGet,
81
+ isrRouteKey: options.isrRouteKey,
82
+ isrSet: options.isrSet,
83
+ markDynamicUsage,
84
+ middlewareContext: options.middlewareContext,
85
+ params: options.params,
86
+ requestUrl: options.request.url,
87
+ revalidateSearchParams: options.searchParams,
88
+ expireSeconds: options.expireSeconds,
89
+ revalidateSeconds,
90
+ routePattern: route.pattern,
91
+ runInRevalidationContext(renderFn) {
92
+ return runInRouteHandlerRevalidationContext({
93
+ cleanPathname: options.cleanPathname,
94
+ dynamicConfig: handler.dynamic,
95
+ routePattern: route.pattern,
96
+ routeSegments: route.routeSegments
97
+ }, renderFn);
98
+ },
99
+ scheduleBackgroundRegeneration(key, renderFn) {
100
+ options.scheduleBackgroundRegeneration(key, renderFn, {
101
+ routerKind: "App Router",
102
+ routePath: route.pattern,
103
+ routeType: "route"
104
+ });
105
+ },
106
+ setHeadersAccessPhase,
107
+ setNavigationContext
108
+ });
109
+ if (cachedRouteResponse) return cachedRouteResponse;
110
+ }
111
+ if (resolvedHandlerFn) return executeAppRouteHandler({
112
+ basePath: options.basePath,
113
+ buildPageCacheTags(pathname, extraTags) {
114
+ return buildRouteHandlerPageCacheTags(pathname, extraTags, route.routeSegments);
115
+ },
116
+ cleanPathname: options.cleanPathname,
117
+ clearRequestContext: options.clearRequestContext,
118
+ consumeDynamicUsage,
119
+ executionContext: getRequestExecutionContext(),
120
+ getAndClearPendingCookies,
121
+ getCollectedFetchTags,
122
+ getDraftModeCookieHeader,
123
+ handler,
124
+ handlerFn: resolvedHandlerFn,
125
+ i18n: options.i18n,
126
+ isAutoHead,
127
+ isProduction,
128
+ isrDebug: options.isrDebug,
129
+ isrRouteKey: options.isrRouteKey,
130
+ isrSet: options.isrSet,
131
+ markDynamicUsage,
132
+ method,
133
+ middlewareContext: options.middlewareContext,
134
+ middlewareRequestHeaders: options.middlewareRequestHeaders,
135
+ params: makeThenableParams(options.params),
136
+ reportRequestError,
137
+ request: options.request,
138
+ expireSeconds: options.expireSeconds,
139
+ revalidateSeconds,
140
+ routePattern: route.pattern,
141
+ setHeadersAccessPhase
142
+ });
143
+ options.clearRequestContext();
144
+ return applyRouteHandlerMiddlewareContext(new Response(null, { status: 405 }), options.middlewareContext);
145
+ }
146
+ //#endregion
147
+ export { dispatchAppRouteHandler };
148
+
149
+ //# sourceMappingURL=app-route-handler-dispatch.js.map
@@ -0,0 +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 } 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 { 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 makeThenableParams<T extends AppRouteParams>(params: T): Promise<T> & T {\n const plain = { ...params };\n return Object.assign(Promise.resolve(plain), plain);\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 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":";;;;;;;;;;;;;;AAgFA,SAAS,0BAA0B,OAAkD;AACnF,QAAO,OAAO,UAAU;;AAG1B,SAAS,mBAA6C,QAA2B;CAC/E,MAAM,QAAQ,EAAE,GAAG,QAAQ;AAC3B,QAAO,OAAO,OAAO,QAAQ,QAAQ,MAAM,EAAE,MAAM;;AAGrD,SAAS,+BACP,UACA,WACA,eACU;AACV,QAAO,mBAAmB,UAAU,WAAW,eAAe,QAAQ;;AAGxE,eAAe,qCACb,SAMA,UACe;AAYf,OAAM,sBANiB,qBAAqB;EAC1C,gBANqB,qCAAqC;GAC1D,eAAe,QAAQ;GACvB,WAAW;GACX,cAAc,QAAQ;GACvB,CAAC;EAGA,kBAAkB,4BAA4B;EAC9C,2BAA2B;EAC5B,CAAC,EAE0C,YAAY;AACtD,oBAAkB;AAClB,0BACE,+BAA+B,QAAQ,eAAe,EAAE,EAAE,QAAQ,cAAc,CACjF;AACD,QAAM,UAAU;GAChB;;AAGJ,eAAsB,wBACpB,SACmB;CACnB,MAAM,EAAE,UAAU;CAClB,MAAM,UAAU,MAAM;CACtB,MAAM,SAAS,QAAQ,QAAQ,OAAO,aAAa;CACnD,MAAM,oBAAoB,oCAAoC,QAAQ;CACtE,MAAM,gBAAgB,QAAQ,iBAAiB,QAAQ,IAAI,aAAa;CACxE,MAAM,eAAe,QAAQ,gBAAgB,QAAQ,IAAI,aAAa;AAEtE,KAAI,gCAAgC,QAAQ,IAAI,cAC9C,SAAQ,MACN,uDACE,MAAM,UACN,wDACH;CAGH,MAAM,EAAE,uBAAuB,WAAW,YAAY,+BACpD,6BAA6B,SAAS,OAAO;AAE/C,KAAI,4BAA4B;AAC9B,UAAQ,qBAAqB;AAC7B,SAAO,mCACL,IAAI,SAAS,MAAM;GACjB,QAAQ;GACR,SAAS,EAAE,OAAO,uBAAuB;GAC1C,CAAC,EACF,QAAQ,kBACT;;CAGH,MAAM,oBAAoB,0BAA0B,UAAU,GAAG,YAAY,KAAA;AAE7E,KACE,sBAAsB,QACtB,+BAA+B;EAC7B,eAAe,QAAQ;EACvB,WAAW;EACX;EACA,gBAAgB,uBAAuB,MAAM,QAAQ;EACrD;EACA;EACA;EACD,CAAC,IACF,mBACA;EACA,MAAM,sBAAsB,MAAM,iCAAiC;GACjE,UAAU,QAAQ;GAClB,mBAAmB,UAAU,WAAW;AACtC,WAAO,+BAA+B,UAAU,WAAW,MAAM,cAAc;;GAEjF,eAAe,QAAQ;GACvB,qBAAqB,QAAQ;GAC7B;GACA,eAAe,QAAQ;GACvB;GACA,WAAW;GACX,MAAM,QAAQ;GACd;GACA,UAAU,QAAQ;GAClB,QAAQ,QAAQ;GAChB,aAAa,QAAQ;GACrB,QAAQ,QAAQ;GAChB;GACA,mBAAmB,QAAQ;GAC3B,QAAQ,QAAQ;GAChB,YAAY,QAAQ,QAAQ;GAC5B,wBAAwB,QAAQ;GAChC,eAAe,QAAQ;GACvB;GACA,cAAc,MAAM;GACpB,yBAAyB,UAAU;AACjC,WAAO,qCACL;KACE,eAAe,QAAQ;KACvB,eAAe,QAAQ;KACvB,cAAc,MAAM;KACpB,eAAe,MAAM;KACtB,EACD,SACD;;GAEH,+BAA+B,KAAK,UAAU;AAC5C,YAAQ,+BAA+B,KAAK,UAAU;KACpD,YAAY;KACZ,WAAW,MAAM;KACjB,WAAW;KACZ,CAAC;;GAEJ;GACA;GACD,CAAC;AACF,MAAI,oBACF,QAAO;;AAIX,KAAI,kBACF,QAAO,uBAAuB;EAC5B,UAAU,QAAQ;EAClB,mBAAmB,UAAU,WAAW;AACtC,UAAO,+BAA+B,UAAU,WAAW,MAAM,cAAc;;EAEjF,eAAe,QAAQ;EACvB,qBAAqB,QAAQ;EAC7B;EACA,kBAAkB,4BAA4B;EAC9C;EACA;EACA;EACA;EACA,WAAW;EACX,MAAM,QAAQ;EACd;EACA;EACA,UAAU,QAAQ;EAClB,aAAa,QAAQ;EACrB,QAAQ,QAAQ;EAChB;EACA;EACA,mBAAmB,QAAQ;EAC3B,0BAA0B,QAAQ;EAClC,QAAQ,mBAAmB,QAAQ,OAAO;EAC1C;EACA,SAAS,QAAQ;EACjB,eAAe,QAAQ;EACvB;EACA,cAAc,MAAM;EACpB;EACD,CAAC;AAGJ,SAAQ,qBAAqB;AAC7B,QAAO,mCACL,IAAI,SAAS,MAAM,EACjB,QAAQ,KACT,CAAC,EACF,QAAQ,kBACT"}
@@ -1,18 +1,19 @@
1
1
  import { NextI18nConfig } from "../config/next-config.js";
2
2
  import { ExecutionContextLike } from "../shims/request-context.js";
3
3
  import { CachedRouteValue } from "../shims/cache.js";
4
- import { RouteHandlerMiddlewareContext } from "./app-route-handler-response.js";
4
+ import { NextRequest } from "../shims/server.js";
5
5
  import { HeadersAccessPhase } from "../shims/headers.js";
6
+ import { RouteHandlerMiddlewareContext } from "./app-route-handler-response.js";
6
7
  import { AppRouteHandlerModule } from "./app-route-handler-policy.js";
7
8
 
8
9
  //#region src/server/app-route-handler-execution.d.ts
9
10
  type AppRouteParams = Record<string, string | string[]>;
10
11
  type AppRouteDynamicUsageFn = () => boolean;
11
12
  type MarkAppRouteDynamicUsageFn = () => void;
12
- type AppRouteHandlerFunction = (request: Request, context: {
13
+ type AppRouteHandlerFunction = (request: NextRequest, context: {
13
14
  params: AppRouteParams;
14
15
  }) => Response | Promise<Response>;
15
- type RouteHandlerCacheSetter = (key: string, data: CachedRouteValue, revalidateSeconds: number, tags: string[]) => Promise<void>;
16
+ type RouteHandlerCacheSetter = (key: string, data: CachedRouteValue, revalidateSeconds: number, tags: string[], expireSeconds?: number) => Promise<void>;
16
17
  type AppRouteErrorReporter = (error: Error, request: {
17
18
  path: string;
18
19
  method: string;
@@ -26,12 +27,15 @@ type AppRouteDebugLogger = (event: string, detail: string) => void;
26
27
  type RunAppRouteHandlerOptions = {
27
28
  basePath?: string;
28
29
  consumeDynamicUsage: AppRouteDynamicUsageFn;
30
+ dynamicConfig?: string;
29
31
  handlerFn: AppRouteHandlerFunction;
30
32
  i18n?: NextI18nConfig | null;
31
33
  markDynamicUsage: MarkAppRouteDynamicUsageFn;
32
34
  middlewareRequestHeaders?: Headers | null;
33
35
  params: AppRouteParams;
34
36
  request: Request;
37
+ routePattern?: string;
38
+ setHeadersAccessPhase?: (phase: HeadersAccessPhase) => HeadersAccessPhase;
35
39
  };
36
40
  type RunAppRouteHandlerResult = {
37
41
  dynamicUsedInHandler: boolean;
@@ -54,6 +58,7 @@ type ExecuteAppRouteHandlerOptions = {
54
58
  method: string;
55
59
  middlewareContext: RouteHandlerMiddlewareContext;
56
60
  reportRequestError: AppRouteErrorReporter;
61
+ expireSeconds?: number;
57
62
  revalidateSeconds: number | null;
58
63
  routePattern: string;
59
64
  setHeadersAccessPhase: (phase: HeadersAccessPhase) => HeadersAccessPhase;