vinext 0.0.52 → 0.0.53
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.
- package/README.md +1 -1
- package/dist/build/clean-output.d.ts +14 -0
- package/dist/build/clean-output.js +36 -0
- package/dist/build/clean-output.js.map +1 -0
- package/dist/build/prerender.d.ts +6 -2
- package/dist/build/prerender.js +49 -11
- package/dist/build/prerender.js.map +1 -1
- package/dist/build/run-prerender.js +10 -1
- package/dist/build/run-prerender.js.map +1 -1
- package/dist/build/static-export.d.ts +5 -0
- package/dist/build/static-export.js +8 -3
- package/dist/build/static-export.js.map +1 -1
- package/dist/cli.js +19 -4
- package/dist/cli.js.map +1 -1
- package/dist/client/instrumentation-client-inject.d.ts +34 -0
- package/dist/client/instrumentation-client-inject.js +57 -0
- package/dist/client/instrumentation-client-inject.js.map +1 -0
- package/dist/client/navigation-runtime.d.ts +14 -1
- package/dist/client/navigation-runtime.js +16 -1
- package/dist/client/navigation-runtime.js.map +1 -1
- package/dist/client/vinext-next-data.d.ts +2 -1
- package/dist/client/vinext-next-data.js.map +1 -1
- package/dist/client/window-next.d.ts +10 -2
- package/dist/client/window-next.js.map +1 -1
- package/dist/cloudflare/tpr.js +1 -1
- package/dist/cloudflare/tpr.js.map +1 -1
- package/dist/config/config-matchers.js +2 -1
- package/dist/config/config-matchers.js.map +1 -1
- package/dist/config/next-config.d.ts +12 -3
- package/dist/config/next-config.js +44 -14
- package/dist/config/next-config.js.map +1 -1
- package/dist/deploy.js +29 -7
- package/dist/deploy.js.map +1 -1
- package/dist/entries/app-rsc-entry.d.ts +4 -2
- package/dist/entries/app-rsc-entry.js +23 -3
- package/dist/entries/app-rsc-entry.js.map +1 -1
- package/dist/entries/pages-client-entry.js +22 -1
- package/dist/entries/pages-client-entry.js.map +1 -1
- package/dist/entries/pages-server-entry.js +211 -31
- package/dist/entries/pages-server-entry.js.map +1 -1
- package/dist/index.js +29 -6
- package/dist/index.js.map +1 -1
- package/dist/plugins/fonts.js +25 -2
- package/dist/plugins/fonts.js.map +1 -1
- package/dist/routing/route-trie.js +13 -18
- package/dist/routing/route-trie.js.map +1 -1
- package/dist/routing/utils.d.ts +11 -1
- package/dist/routing/utils.js +15 -1
- package/dist/routing/utils.js.map +1 -1
- package/dist/server/api-handler.js +18 -9
- package/dist/server/api-handler.js.map +1 -1
- package/dist/server/app-browser-action-result.d.ts +16 -1
- package/dist/server/app-browser-action-result.js +15 -1
- package/dist/server/app-browser-action-result.js.map +1 -1
- package/dist/server/app-browser-entry.js +22 -12
- package/dist/server/app-browser-entry.js.map +1 -1
- package/dist/server/app-elements.js +1 -1
- package/dist/server/app-fallback-renderer.d.ts +12 -3
- package/dist/server/app-fallback-renderer.js +10 -5
- package/dist/server/app-fallback-renderer.js.map +1 -1
- package/dist/server/app-history-state.js +6 -2
- package/dist/server/app-history-state.js.map +1 -1
- package/dist/server/app-interception-context-header.d.ts +33 -0
- package/dist/server/app-interception-context-header.js +44 -0
- package/dist/server/app-interception-context-header.js.map +1 -0
- package/dist/server/app-mounted-slots-header.d.ts +19 -0
- package/dist/server/app-mounted-slots-header.js +40 -1
- package/dist/server/app-mounted-slots-header.js.map +1 -1
- package/dist/server/app-optimistic-routing.js +26 -18
- package/dist/server/app-optimistic-routing.js.map +1 -1
- package/dist/server/app-page-boundary-render.d.ts +1 -0
- package/dist/server/app-page-boundary-render.js +2 -0
- package/dist/server/app-page-boundary-render.js.map +1 -1
- package/dist/server/app-page-boundary.d.ts +1 -0
- package/dist/server/app-page-boundary.js +2 -0
- package/dist/server/app-page-boundary.js.map +1 -1
- package/dist/server/app-page-cache.d.ts +2 -0
- package/dist/server/app-page-cache.js +7 -1
- package/dist/server/app-page-cache.js.map +1 -1
- package/dist/server/app-page-dispatch.d.ts +3 -0
- package/dist/server/app-page-dispatch.js +11 -4
- package/dist/server/app-page-dispatch.js.map +1 -1
- package/dist/server/app-page-element-builder.d.ts +2 -1
- package/dist/server/app-page-element-builder.js +5 -2
- package/dist/server/app-page-element-builder.js.map +1 -1
- package/dist/server/app-page-execution.d.ts +1 -0
- package/dist/server/app-page-execution.js +2 -0
- package/dist/server/app-page-execution.js.map +1 -1
- package/dist/server/app-page-head.d.ts +1 -0
- package/dist/server/app-page-head.js +8 -0
- package/dist/server/app-page-head.js.map +1 -1
- package/dist/server/app-page-render-observation.js +1 -1
- package/dist/server/app-page-render.d.ts +1 -0
- package/dist/server/app-page-render.js +5 -2
- package/dist/server/app-page-render.js.map +1 -1
- package/dist/server/app-page-response.d.ts +11 -1
- package/dist/server/app-page-response.js +14 -2
- package/dist/server/app-page-response.js.map +1 -1
- package/dist/server/app-page-route-wiring.d.ts +1 -0
- package/dist/server/app-page-route-wiring.js +19 -6
- package/dist/server/app-page-route-wiring.js.map +1 -1
- package/dist/server/app-page-stream.d.ts +1 -0
- package/dist/server/app-page-stream.js +2 -0
- package/dist/server/app-page-stream.js.map +1 -1
- package/dist/server/app-route-handler-dispatch.d.ts +1 -0
- package/dist/server/app-route-handler-dispatch.js +3 -0
- package/dist/server/app-route-handler-dispatch.js.map +1 -1
- package/dist/server/app-route-handler-execution.d.ts +1 -0
- package/dist/server/app-route-handler-execution.js +1 -0
- package/dist/server/app-route-handler-execution.js.map +1 -1
- package/dist/server/app-route-handler-response.js +1 -1
- package/dist/server/app-rsc-handler.d.ts +2 -0
- package/dist/server/app-rsc-handler.js +18 -9
- package/dist/server/app-rsc-handler.js.map +1 -1
- package/dist/server/app-rsc-request-normalization.js +3 -2
- package/dist/server/app-rsc-request-normalization.js.map +1 -1
- package/dist/server/app-segment-config.d.ts +4 -1
- package/dist/server/app-segment-config.js +6 -1
- package/dist/server/app-segment-config.js.map +1 -1
- package/dist/server/app-server-action-execution.d.ts +1 -0
- package/dist/server/app-server-action-execution.js +4 -0
- package/dist/server/app-server-action-execution.js.map +1 -1
- package/dist/server/app-ssr-entry.js +39 -3
- package/dist/server/app-ssr-entry.js.map +1 -1
- package/dist/server/app-ssr-stream.d.ts +24 -1
- package/dist/server/app-ssr-stream.js +78 -5
- package/dist/server/app-ssr-stream.js.map +1 -1
- package/dist/server/app-static-generation.d.ts +1 -0
- package/dist/server/app-static-generation.js +2 -1
- package/dist/server/app-static-generation.js.map +1 -1
- package/dist/server/default-not-found-module.d.ts +20 -0
- package/dist/server/default-not-found-module.js +20 -0
- package/dist/server/default-not-found-module.js.map +1 -0
- package/dist/server/dev-server.d.ts +1 -1
- package/dist/server/dev-server.js +23 -7
- package/dist/server/dev-server.js.map +1 -1
- package/dist/server/headers.d.ts +5 -1
- package/dist/server/headers.js +5 -1
- package/dist/server/headers.js.map +1 -1
- package/dist/server/image-optimization.d.ts +13 -4
- package/dist/server/image-optimization.js +15 -4
- package/dist/server/image-optimization.js.map +1 -1
- package/dist/server/middleware.js +1 -1
- package/dist/server/middleware.js.map +1 -1
- package/dist/server/pages-api-route.d.ts +18 -0
- package/dist/server/pages-api-route.js +3 -1
- package/dist/server/pages-api-route.js.map +1 -1
- package/dist/server/pages-body-parser-config.d.ts +60 -0
- package/dist/server/pages-body-parser-config.js +79 -0
- package/dist/server/pages-body-parser-config.js.map +1 -0
- package/dist/server/pages-data-route.js +1 -0
- package/dist/server/pages-data-route.js.map +1 -1
- package/dist/server/pages-default-404.d.ts +31 -0
- package/dist/server/pages-default-404.js +40 -0
- package/dist/server/pages-default-404.js.map +1 -0
- package/dist/server/pages-node-compat.d.ts +10 -0
- package/dist/server/pages-node-compat.js +12 -1
- package/dist/server/pages-node-compat.js.map +1 -1
- package/dist/server/pages-page-data.d.ts +40 -0
- package/dist/server/pages-page-data.js +16 -14
- package/dist/server/pages-page-data.js.map +1 -1
- package/dist/server/pages-page-response.d.ts +2 -0
- package/dist/server/pages-page-response.js +11 -8
- package/dist/server/pages-page-response.js.map +1 -1
- package/dist/server/prerender-route-params.d.ts +14 -0
- package/dist/server/prerender-route-params.js +94 -0
- package/dist/server/prerender-route-params.js.map +1 -0
- package/dist/server/prod-server.d.ts +3 -23
- package/dist/server/prod-server.js +40 -57
- package/dist/server/prod-server.js.map +1 -1
- package/dist/server/proxy-trust.d.ts +41 -0
- package/dist/server/proxy-trust.js +70 -0
- package/dist/server/proxy-trust.js.map +1 -0
- package/dist/server/request-pipeline.d.ts +3 -3
- package/dist/server/request-pipeline.js +5 -4
- package/dist/server/request-pipeline.js.map +1 -1
- package/dist/server/seed-cache.js +12 -6
- package/dist/server/seed-cache.js.map +1 -1
- package/dist/server/static-file-cache.js +1 -1
- package/dist/server/static-file-cache.js.map +1 -1
- package/dist/server/streaming-metadata.d.ts +5 -0
- package/dist/server/streaming-metadata.js +10 -0
- package/dist/server/streaming-metadata.js.map +1 -0
- package/dist/shims/app-router-scroll-state.d.ts +12 -0
- package/dist/shims/app-router-scroll-state.js +38 -0
- package/dist/shims/app-router-scroll-state.js.map +1 -0
- package/dist/shims/app-router-scroll.d.ts +14 -0
- package/dist/shims/app-router-scroll.js +100 -0
- package/dist/shims/app-router-scroll.js.map +1 -0
- package/dist/shims/before-interactive-context.d.ts +30 -0
- package/dist/shims/before-interactive-context.js +10 -0
- package/dist/shims/before-interactive-context.js.map +1 -0
- package/dist/shims/cache-runtime.d.ts +1 -1
- package/dist/shims/cache-runtime.js +14 -1
- package/dist/shims/cache-runtime.js.map +1 -1
- package/dist/shims/default-not-found.d.ts +12 -0
- package/dist/shims/default-not-found.js +61 -0
- package/dist/shims/default-not-found.js.map +1 -0
- package/dist/shims/font-local.d.ts +5 -0
- package/dist/shims/font-local.js +6 -2
- package/dist/shims/font-local.js.map +1 -1
- package/dist/shims/head.js +4 -4
- package/dist/shims/head.js.map +1 -1
- package/dist/shims/headers.d.ts +6 -2
- package/dist/shims/headers.js +64 -21
- package/dist/shims/headers.js.map +1 -1
- package/dist/shims/image.d.ts +1 -1
- package/dist/shims/image.js +4 -4
- package/dist/shims/image.js.map +1 -1
- package/dist/shims/internal/pages-data-target.d.ts +58 -0
- package/dist/shims/internal/pages-data-target.js +91 -0
- package/dist/shims/internal/pages-data-target.js.map +1 -0
- package/dist/shims/internal/pages-data-url.d.ts +42 -0
- package/dist/shims/internal/pages-data-url.js +73 -0
- package/dist/shims/internal/pages-data-url.js.map +1 -0
- package/dist/shims/link.js +59 -9
- package/dist/shims/link.js.map +1 -1
- package/dist/shims/metadata.d.ts +2 -1
- package/dist/shims/metadata.js +61 -2
- package/dist/shims/metadata.js.map +1 -1
- package/dist/shims/navigation.js +32 -9
- package/dist/shims/navigation.js.map +1 -1
- package/dist/shims/router.js +376 -77
- package/dist/shims/router.js.map +1 -1
- package/dist/shims/script.js +86 -12
- package/dist/shims/script.js.map +1 -1
- package/dist/shims/server.js +1 -0
- package/dist/shims/server.js.map +1 -1
- package/dist/shims/url-utils.d.ts +2 -1
- package/dist/shims/url-utils.js +15 -4
- package/dist/shims/url-utils.js.map +1 -1
- package/dist/utils/html-limited-bots.d.ts +5 -0
- package/dist/utils/html-limited-bots.js +15 -0
- package/dist/utils/html-limited-bots.js.map +1 -0
- package/dist/utils/query.d.ts +6 -0
- package/dist/utils/query.js +10 -1
- package/dist/utils/query.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-page-boundary.js","names":[],"sources":["../../src/server/app-page-boundary.ts"],"sourcesContent":["import { runWithFetchDedupe } from \"vinext/shims/fetch-cache\";\nimport { mergeMiddlewareResponseHeaders } from \"./middleware-response-headers.js\";\nimport {\n VINEXT_RSC_CONTENT_TYPE,\n VINEXT_RSC_VARY_HEADER,\n applyRscCompatibilityIdHeader,\n} from \"./app-rsc-cache-busting.js\";\nimport { resolveAppPageSegmentParams } from \"./app-page-params.js\";\n\nexport type AppPageParams = Record<string, string | string[]>;\n\ntype ResolveAppPageHttpAccessBoundaryComponentOptions<TModule, TComponent> = {\n getDefaultExport: (module: TModule | null | undefined) => TComponent | null | undefined;\n rootForbiddenModule?: TModule | null;\n rootNotFoundModule?: TModule | null;\n rootUnauthorizedModule?: TModule | null;\n routeForbiddenModule?: TModule | null;\n routeNotFoundModule?: TModule | null;\n routeUnauthorizedModule?: TModule | null;\n statusCode: number;\n};\n\ntype ResolveAppPageParentHttpAccessBoundaryModuleOptions<TModule> = {\n layoutIndex: number;\n rootForbiddenModule?: TModule | null;\n rootNotFoundModule?: TModule | null;\n rootUnauthorizedModule?: TModule | null;\n routeForbiddenModules?: readonly (TModule | null | undefined)[] | null;\n routeNotFoundModules?: readonly (TModule | null | undefined)[] | null;\n routeUnauthorizedModules?: readonly (TModule | null | undefined)[] | null;\n statusCode: number;\n};\n\ntype ResolveAppPageErrorBoundaryOptions<TModule, TComponent> = {\n getDefaultExport: (module: TModule | null | undefined) => TComponent | null | undefined;\n globalErrorModule?: TModule | null;\n errorModules?: readonly (TModule | null | undefined)[] | null;\n layoutErrorModules?: readonly (TModule | null | undefined)[] | null;\n pageErrorModule?: TModule | null;\n};\n\ntype ResolveAppPageErrorBoundaryResult<TComponent> = {\n component: TComponent | null;\n isGlobalError: boolean;\n};\n\ntype WrapAppPageBoundaryElementOptions<\n TElement,\n TLayoutModule,\n TLayoutComponent,\n TChildSegments,\n TGlobalErrorComponent,\n> = {\n element: TElement;\n getDefaultExport: (\n module: TLayoutModule | null | undefined,\n ) => TLayoutComponent | null | undefined;\n globalErrorComponent?: TGlobalErrorComponent | null;\n includeGlobalErrorBoundary: boolean;\n isRscRequest: boolean;\n layoutModules: readonly (TLayoutModule | null | undefined)[];\n layoutTreePositions?: readonly number[] | null;\n makeThenableParams: (params: AppPageParams) => unknown;\n matchedParams: AppPageParams;\n renderErrorBoundary: (component: TGlobalErrorComponent, children: TElement) => TElement;\n renderLayout: (component: TLayoutComponent, children: TElement, params: unknown) => TElement;\n renderLayoutSegmentProvider?: (\n segmentMap: { children: TChildSegments },\n children: TElement,\n ) => TElement;\n resolveChildSegments?: (\n routeSegments: readonly string[],\n treePosition: number,\n params: AppPageParams,\n ) => TChildSegments;\n routeSegments?: readonly string[];\n skipLayoutWrapping?: boolean;\n};\n\ntype AppPageBoundaryOnError = (\n error: unknown,\n requestInfo: unknown,\n errorContext: unknown,\n) => unknown;\n\ntype RenderAppPageBoundaryResponseOptions<TElement> = {\n createHtmlResponse: (rscStream: ReadableStream<Uint8Array>, status: number) => Promise<Response>;\n createRscOnErrorHandler: () => AppPageBoundaryOnError;\n element: TElement;\n isRscRequest: boolean;\n middlewareHeaders?: Headers | null;\n renderToReadableStream: (\n element: TElement,\n options: { onError: AppPageBoundaryOnError },\n ) => ReadableStream<Uint8Array>;\n status: number;\n};\n\nexport function resolveAppPageHttpAccessBoundaryComponent<TModule, TComponent>(\n options: ResolveAppPageHttpAccessBoundaryComponentOptions<TModule, TComponent>,\n): TComponent | null {\n let boundaryModule: TModule | null | undefined;\n\n if (options.statusCode === 403) {\n boundaryModule = options.routeForbiddenModule ?? options.rootForbiddenModule;\n } else if (options.statusCode === 401) {\n boundaryModule = options.routeUnauthorizedModule ?? options.rootUnauthorizedModule;\n } else {\n boundaryModule = options.routeNotFoundModule ?? options.rootNotFoundModule;\n }\n\n return options.getDefaultExport(boundaryModule) ?? null;\n}\n\nexport function resolveAppPageParentHttpAccessBoundaryModule<TModule>(\n options: ResolveAppPageParentHttpAccessBoundaryModuleOptions<TModule>,\n): TModule | null {\n let routeModules = options.routeNotFoundModules;\n let rootModule = options.rootNotFoundModule;\n\n if (options.statusCode === 403) {\n routeModules = options.routeForbiddenModules;\n rootModule = options.rootForbiddenModule;\n } else if (options.statusCode === 401) {\n routeModules = options.routeUnauthorizedModules;\n rootModule = options.rootUnauthorizedModule;\n }\n\n if (routeModules) {\n for (let index = options.layoutIndex - 1; index >= 0; index--) {\n const module = routeModules[index];\n if (module) {\n return module;\n }\n }\n }\n\n return rootModule ?? null;\n}\n\nexport function resolveAppPageErrorBoundary<TModule, TComponent>(\n options: ResolveAppPageErrorBoundaryOptions<TModule, TComponent>,\n): ResolveAppPageErrorBoundaryResult<TComponent> {\n const pageErrorComponent = options.getDefaultExport(options.pageErrorModule);\n if (pageErrorComponent) {\n return {\n component: pageErrorComponent,\n isGlobalError: false,\n };\n }\n\n const segmentErrorModules = options.errorModules ?? options.layoutErrorModules;\n if (segmentErrorModules) {\n for (let index = segmentErrorModules.length - 1; index >= 0; index--) {\n const segmentErrorComponent = options.getDefaultExport(segmentErrorModules[index]);\n if (segmentErrorComponent) {\n return {\n component: segmentErrorComponent,\n isGlobalError: false,\n };\n }\n }\n }\n\n const globalErrorComponent = options.getDefaultExport(options.globalErrorModule);\n return {\n component: globalErrorComponent ?? null,\n isGlobalError: Boolean(globalErrorComponent),\n };\n}\n\nexport function wrapAppPageBoundaryElement<\n TElement,\n TLayoutModule,\n TLayoutComponent,\n TChildSegments,\n TGlobalErrorComponent,\n>(\n options: WrapAppPageBoundaryElementOptions<\n TElement,\n TLayoutModule,\n TLayoutComponent,\n TChildSegments,\n TGlobalErrorComponent\n >,\n): TElement {\n let element = options.element;\n\n if (!options.skipLayoutWrapping) {\n for (let index = options.layoutModules.length - 1; index >= 0; index--) {\n const layoutComponent = options.getDefaultExport(options.layoutModules[index]);\n if (!layoutComponent) {\n continue;\n }\n\n const treePosition = options.layoutTreePositions ? options.layoutTreePositions[index] : 0;\n const asyncParams = options.makeThenableParams(\n resolveAppPageSegmentParams(options.routeSegments, treePosition, options.matchedParams),\n );\n element = options.renderLayout(layoutComponent, element, asyncParams);\n\n if (\n options.isRscRequest &&\n options.renderLayoutSegmentProvider &&\n options.resolveChildSegments\n ) {\n const childSegments = options.resolveChildSegments(\n options.routeSegments ?? [],\n treePosition,\n options.matchedParams,\n );\n element = options.renderLayoutSegmentProvider({ children: childSegments }, element);\n }\n }\n }\n\n if (options.isRscRequest && options.includeGlobalErrorBoundary && options.globalErrorComponent) {\n element = options.renderErrorBoundary(options.globalErrorComponent, element);\n }\n\n return element;\n}\n\nexport async function renderAppPageBoundaryResponse<TElement>(\n options: RenderAppPageBoundaryResponseOptions<TElement>,\n): Promise<Response> {\n // Defensive wrap for standalone callers; idempotent under dispatchAppPage.\n // The async stream consumption that follows relies on the surrounding\n // runWithRequestContext to keep ALS state alive after this synchronous call\n // returns. See app-page-render.ts for the same pattern.\n const rscStream = runWithFetchDedupe(() =>\n options.renderToReadableStream(options.element, {\n onError: options.createRscOnErrorHandler(),\n }),\n );\n\n if (options.isRscRequest) {\n // Do NOT clear request-scoped context here. RSC responses are consumed lazily\n // by the client, so headers()/cookies() and async server components still need\n // their ALS-backed state while the stream is being read.\n const headers = new Headers({\n \"Content-Type\": VINEXT_RSC_CONTENT_TYPE,\n Vary: VINEXT_RSC_VARY_HEADER,\n });\n mergeMiddlewareResponseHeaders(headers, options.middlewareHeaders ?? null);\n applyRscCompatibilityIdHeader(headers);\n\n return new Response(rscStream, {\n status: options.status,\n headers,\n });\n }\n\n return options.createHtmlResponse(rscStream, options.status);\n}\n"],"mappings":";;;;;AAkGA,SAAgB,0CACd,SACmB;CACnB,IAAI;CAEJ,IAAI,QAAQ,eAAe,KACzB,iBAAiB,QAAQ,wBAAwB,QAAQ;MACpD,IAAI,QAAQ,eAAe,KAChC,iBAAiB,QAAQ,2BAA2B,QAAQ;MAE5D,iBAAiB,QAAQ,uBAAuB,QAAQ;CAG1D,OAAO,QAAQ,iBAAiB,eAAe,IAAI;;AAGrD,SAAgB,6CACd,SACgB;CAChB,IAAI,eAAe,QAAQ;CAC3B,IAAI,aAAa,QAAQ;CAEzB,IAAI,QAAQ,eAAe,KAAK;EAC9B,eAAe,QAAQ;EACvB,aAAa,QAAQ;QAChB,IAAI,QAAQ,eAAe,KAAK;EACrC,eAAe,QAAQ;EACvB,aAAa,QAAQ;;CAGvB,IAAI,cACF,KAAK,IAAI,QAAQ,QAAQ,cAAc,GAAG,SAAS,GAAG,SAAS;EAC7D,MAAM,SAAS,aAAa;EAC5B,IAAI,QACF,OAAO;;CAKb,OAAO,cAAc;;AAGvB,SAAgB,4BACd,SAC+C;CAC/C,MAAM,qBAAqB,QAAQ,iBAAiB,QAAQ,gBAAgB;CAC5E,IAAI,oBACF,OAAO;EACL,WAAW;EACX,eAAe;EAChB;CAGH,MAAM,sBAAsB,QAAQ,gBAAgB,QAAQ;CAC5D,IAAI,qBACF,KAAK,IAAI,QAAQ,oBAAoB,SAAS,GAAG,SAAS,GAAG,SAAS;EACpE,MAAM,wBAAwB,QAAQ,iBAAiB,oBAAoB,OAAO;EAClF,IAAI,uBACF,OAAO;GACL,WAAW;GACX,eAAe;GAChB;;CAKP,MAAM,uBAAuB,QAAQ,iBAAiB,QAAQ,kBAAkB;CAChF,OAAO;EACL,WAAW,wBAAwB;EACnC,eAAe,QAAQ,qBAAqB;EAC7C;;AAGH,SAAgB,2BAOd,SAOU;CACV,IAAI,UAAU,QAAQ;CAEtB,IAAI,CAAC,QAAQ,oBACX,KAAK,IAAI,QAAQ,QAAQ,cAAc,SAAS,GAAG,SAAS,GAAG,SAAS;EACtE,MAAM,kBAAkB,QAAQ,iBAAiB,QAAQ,cAAc,OAAO;EAC9E,IAAI,CAAC,iBACH;EAGF,MAAM,eAAe,QAAQ,sBAAsB,QAAQ,oBAAoB,SAAS;EACxF,MAAM,cAAc,QAAQ,mBAC1B,4BAA4B,QAAQ,eAAe,cAAc,QAAQ,cAAc,CACxF;EACD,UAAU,QAAQ,aAAa,iBAAiB,SAAS,YAAY;EAErE,IACE,QAAQ,gBACR,QAAQ,+BACR,QAAQ,sBACR;GACA,MAAM,gBAAgB,QAAQ,qBAC5B,QAAQ,iBAAiB,EAAE,EAC3B,cACA,QAAQ,cACT;GACD,UAAU,QAAQ,4BAA4B,EAAE,UAAU,eAAe,EAAE,QAAQ;;;CAKzF,IAAI,QAAQ,gBAAgB,QAAQ,8BAA8B,QAAQ,sBACxE,UAAU,QAAQ,oBAAoB,QAAQ,sBAAsB,QAAQ;CAG9E,OAAO;;AAGT,eAAsB,8BACpB,SACmB;CAKnB,MAAM,YAAY,yBAChB,QAAQ,uBAAuB,QAAQ,SAAS,EAC9C,SAAS,QAAQ,yBAAyB,EAC3C,CAAC,CACH;CAED,IAAI,QAAQ,cAAc;EAIxB,MAAM,UAAU,IAAI,QAAQ;GAC1B,gBAAgB;GAChB,MAAM;GACP,CAAC;EACF,+BAA+B,SAAS,QAAQ,qBAAqB,KAAK;EAC1E,8BAA8B,QAAQ;EAEtC,OAAO,IAAI,SAAS,WAAW;GAC7B,QAAQ,QAAQ;GAChB;GACD,CAAC;;CAGJ,OAAO,QAAQ,mBAAmB,WAAW,QAAQ,OAAO"}
|
|
1
|
+
{"version":3,"file":"app-page-boundary.js","names":[],"sources":["../../src/server/app-page-boundary.ts"],"sourcesContent":["import { runWithFetchDedupe } from \"vinext/shims/fetch-cache\";\nimport { applyEdgeRuntimeHeader } from \"./app-page-response.js\";\nimport { mergeMiddlewareResponseHeaders } from \"./middleware-response-headers.js\";\nimport {\n VINEXT_RSC_CONTENT_TYPE,\n VINEXT_RSC_VARY_HEADER,\n applyRscCompatibilityIdHeader,\n} from \"./app-rsc-cache-busting.js\";\nimport { resolveAppPageSegmentParams } from \"./app-page-params.js\";\n\nexport type AppPageParams = Record<string, string | string[]>;\n\ntype ResolveAppPageHttpAccessBoundaryComponentOptions<TModule, TComponent> = {\n getDefaultExport: (module: TModule | null | undefined) => TComponent | null | undefined;\n rootForbiddenModule?: TModule | null;\n rootNotFoundModule?: TModule | null;\n rootUnauthorizedModule?: TModule | null;\n routeForbiddenModule?: TModule | null;\n routeNotFoundModule?: TModule | null;\n routeUnauthorizedModule?: TModule | null;\n statusCode: number;\n};\n\ntype ResolveAppPageParentHttpAccessBoundaryModuleOptions<TModule> = {\n layoutIndex: number;\n rootForbiddenModule?: TModule | null;\n rootNotFoundModule?: TModule | null;\n rootUnauthorizedModule?: TModule | null;\n routeForbiddenModules?: readonly (TModule | null | undefined)[] | null;\n routeNotFoundModules?: readonly (TModule | null | undefined)[] | null;\n routeUnauthorizedModules?: readonly (TModule | null | undefined)[] | null;\n statusCode: number;\n};\n\ntype ResolveAppPageErrorBoundaryOptions<TModule, TComponent> = {\n getDefaultExport: (module: TModule | null | undefined) => TComponent | null | undefined;\n globalErrorModule?: TModule | null;\n errorModules?: readonly (TModule | null | undefined)[] | null;\n layoutErrorModules?: readonly (TModule | null | undefined)[] | null;\n pageErrorModule?: TModule | null;\n};\n\ntype ResolveAppPageErrorBoundaryResult<TComponent> = {\n component: TComponent | null;\n isGlobalError: boolean;\n};\n\ntype WrapAppPageBoundaryElementOptions<\n TElement,\n TLayoutModule,\n TLayoutComponent,\n TChildSegments,\n TGlobalErrorComponent,\n> = {\n element: TElement;\n getDefaultExport: (\n module: TLayoutModule | null | undefined,\n ) => TLayoutComponent | null | undefined;\n globalErrorComponent?: TGlobalErrorComponent | null;\n includeGlobalErrorBoundary: boolean;\n isRscRequest: boolean;\n layoutModules: readonly (TLayoutModule | null | undefined)[];\n layoutTreePositions?: readonly number[] | null;\n makeThenableParams: (params: AppPageParams) => unknown;\n matchedParams: AppPageParams;\n renderErrorBoundary: (component: TGlobalErrorComponent, children: TElement) => TElement;\n renderLayout: (component: TLayoutComponent, children: TElement, params: unknown) => TElement;\n renderLayoutSegmentProvider?: (\n segmentMap: { children: TChildSegments },\n children: TElement,\n ) => TElement;\n resolveChildSegments?: (\n routeSegments: readonly string[],\n treePosition: number,\n params: AppPageParams,\n ) => TChildSegments;\n routeSegments?: readonly string[];\n skipLayoutWrapping?: boolean;\n};\n\ntype AppPageBoundaryOnError = (\n error: unknown,\n requestInfo: unknown,\n errorContext: unknown,\n) => unknown;\n\ntype RenderAppPageBoundaryResponseOptions<TElement> = {\n createHtmlResponse: (rscStream: ReadableStream<Uint8Array>, status: number) => Promise<Response>;\n createRscOnErrorHandler: () => AppPageBoundaryOnError;\n element: TElement;\n isEdgeRuntime?: boolean;\n isRscRequest: boolean;\n middlewareHeaders?: Headers | null;\n renderToReadableStream: (\n element: TElement,\n options: { onError: AppPageBoundaryOnError },\n ) => ReadableStream<Uint8Array>;\n status: number;\n};\n\nexport function resolveAppPageHttpAccessBoundaryComponent<TModule, TComponent>(\n options: ResolveAppPageHttpAccessBoundaryComponentOptions<TModule, TComponent>,\n): TComponent | null {\n let boundaryModule: TModule | null | undefined;\n\n if (options.statusCode === 403) {\n boundaryModule = options.routeForbiddenModule ?? options.rootForbiddenModule;\n } else if (options.statusCode === 401) {\n boundaryModule = options.routeUnauthorizedModule ?? options.rootUnauthorizedModule;\n } else {\n boundaryModule = options.routeNotFoundModule ?? options.rootNotFoundModule;\n }\n\n return options.getDefaultExport(boundaryModule) ?? null;\n}\n\nexport function resolveAppPageParentHttpAccessBoundaryModule<TModule>(\n options: ResolveAppPageParentHttpAccessBoundaryModuleOptions<TModule>,\n): TModule | null {\n let routeModules = options.routeNotFoundModules;\n let rootModule = options.rootNotFoundModule;\n\n if (options.statusCode === 403) {\n routeModules = options.routeForbiddenModules;\n rootModule = options.rootForbiddenModule;\n } else if (options.statusCode === 401) {\n routeModules = options.routeUnauthorizedModules;\n rootModule = options.rootUnauthorizedModule;\n }\n\n if (routeModules) {\n for (let index = options.layoutIndex - 1; index >= 0; index--) {\n const module = routeModules[index];\n if (module) {\n return module;\n }\n }\n }\n\n return rootModule ?? null;\n}\n\nexport function resolveAppPageErrorBoundary<TModule, TComponent>(\n options: ResolveAppPageErrorBoundaryOptions<TModule, TComponent>,\n): ResolveAppPageErrorBoundaryResult<TComponent> {\n const pageErrorComponent = options.getDefaultExport(options.pageErrorModule);\n if (pageErrorComponent) {\n return {\n component: pageErrorComponent,\n isGlobalError: false,\n };\n }\n\n const segmentErrorModules = options.errorModules ?? options.layoutErrorModules;\n if (segmentErrorModules) {\n for (let index = segmentErrorModules.length - 1; index >= 0; index--) {\n const segmentErrorComponent = options.getDefaultExport(segmentErrorModules[index]);\n if (segmentErrorComponent) {\n return {\n component: segmentErrorComponent,\n isGlobalError: false,\n };\n }\n }\n }\n\n const globalErrorComponent = options.getDefaultExport(options.globalErrorModule);\n return {\n component: globalErrorComponent ?? null,\n isGlobalError: Boolean(globalErrorComponent),\n };\n}\n\nexport function wrapAppPageBoundaryElement<\n TElement,\n TLayoutModule,\n TLayoutComponent,\n TChildSegments,\n TGlobalErrorComponent,\n>(\n options: WrapAppPageBoundaryElementOptions<\n TElement,\n TLayoutModule,\n TLayoutComponent,\n TChildSegments,\n TGlobalErrorComponent\n >,\n): TElement {\n let element = options.element;\n\n if (!options.skipLayoutWrapping) {\n for (let index = options.layoutModules.length - 1; index >= 0; index--) {\n const layoutComponent = options.getDefaultExport(options.layoutModules[index]);\n if (!layoutComponent) {\n continue;\n }\n\n const treePosition = options.layoutTreePositions ? options.layoutTreePositions[index] : 0;\n const asyncParams = options.makeThenableParams(\n resolveAppPageSegmentParams(options.routeSegments, treePosition, options.matchedParams),\n );\n element = options.renderLayout(layoutComponent, element, asyncParams);\n\n if (\n options.isRscRequest &&\n options.renderLayoutSegmentProvider &&\n options.resolveChildSegments\n ) {\n const childSegments = options.resolveChildSegments(\n options.routeSegments ?? [],\n treePosition,\n options.matchedParams,\n );\n element = options.renderLayoutSegmentProvider({ children: childSegments }, element);\n }\n }\n }\n\n if (options.isRscRequest && options.includeGlobalErrorBoundary && options.globalErrorComponent) {\n element = options.renderErrorBoundary(options.globalErrorComponent, element);\n }\n\n return element;\n}\n\nexport async function renderAppPageBoundaryResponse<TElement>(\n options: RenderAppPageBoundaryResponseOptions<TElement>,\n): Promise<Response> {\n // Defensive wrap for standalone callers; idempotent under dispatchAppPage.\n // The async stream consumption that follows relies on the surrounding\n // runWithRequestContext to keep ALS state alive after this synchronous call\n // returns. See app-page-render.ts for the same pattern.\n const rscStream = runWithFetchDedupe(() =>\n options.renderToReadableStream(options.element, {\n onError: options.createRscOnErrorHandler(),\n }),\n );\n\n if (options.isRscRequest) {\n // Do NOT clear request-scoped context here. RSC responses are consumed lazily\n // by the client, so headers()/cookies() and async server components still need\n // their ALS-backed state while the stream is being read.\n const headers = new Headers({\n \"Content-Type\": VINEXT_RSC_CONTENT_TYPE,\n Vary: VINEXT_RSC_VARY_HEADER,\n });\n applyEdgeRuntimeHeader(headers, options.isEdgeRuntime);\n mergeMiddlewareResponseHeaders(headers, options.middlewareHeaders ?? null);\n applyRscCompatibilityIdHeader(headers);\n\n return new Response(rscStream, {\n status: options.status,\n headers,\n });\n }\n\n return options.createHtmlResponse(rscStream, options.status);\n}\n"],"mappings":";;;;;;AAoGA,SAAgB,0CACd,SACmB;CACnB,IAAI;CAEJ,IAAI,QAAQ,eAAe,KACzB,iBAAiB,QAAQ,wBAAwB,QAAQ;MACpD,IAAI,QAAQ,eAAe,KAChC,iBAAiB,QAAQ,2BAA2B,QAAQ;MAE5D,iBAAiB,QAAQ,uBAAuB,QAAQ;CAG1D,OAAO,QAAQ,iBAAiB,eAAe,IAAI;;AAGrD,SAAgB,6CACd,SACgB;CAChB,IAAI,eAAe,QAAQ;CAC3B,IAAI,aAAa,QAAQ;CAEzB,IAAI,QAAQ,eAAe,KAAK;EAC9B,eAAe,QAAQ;EACvB,aAAa,QAAQ;QAChB,IAAI,QAAQ,eAAe,KAAK;EACrC,eAAe,QAAQ;EACvB,aAAa,QAAQ;;CAGvB,IAAI,cACF,KAAK,IAAI,QAAQ,QAAQ,cAAc,GAAG,SAAS,GAAG,SAAS;EAC7D,MAAM,SAAS,aAAa;EAC5B,IAAI,QACF,OAAO;;CAKb,OAAO,cAAc;;AAGvB,SAAgB,4BACd,SAC+C;CAC/C,MAAM,qBAAqB,QAAQ,iBAAiB,QAAQ,gBAAgB;CAC5E,IAAI,oBACF,OAAO;EACL,WAAW;EACX,eAAe;EAChB;CAGH,MAAM,sBAAsB,QAAQ,gBAAgB,QAAQ;CAC5D,IAAI,qBACF,KAAK,IAAI,QAAQ,oBAAoB,SAAS,GAAG,SAAS,GAAG,SAAS;EACpE,MAAM,wBAAwB,QAAQ,iBAAiB,oBAAoB,OAAO;EAClF,IAAI,uBACF,OAAO;GACL,WAAW;GACX,eAAe;GAChB;;CAKP,MAAM,uBAAuB,QAAQ,iBAAiB,QAAQ,kBAAkB;CAChF,OAAO;EACL,WAAW,wBAAwB;EACnC,eAAe,QAAQ,qBAAqB;EAC7C;;AAGH,SAAgB,2BAOd,SAOU;CACV,IAAI,UAAU,QAAQ;CAEtB,IAAI,CAAC,QAAQ,oBACX,KAAK,IAAI,QAAQ,QAAQ,cAAc,SAAS,GAAG,SAAS,GAAG,SAAS;EACtE,MAAM,kBAAkB,QAAQ,iBAAiB,QAAQ,cAAc,OAAO;EAC9E,IAAI,CAAC,iBACH;EAGF,MAAM,eAAe,QAAQ,sBAAsB,QAAQ,oBAAoB,SAAS;EACxF,MAAM,cAAc,QAAQ,mBAC1B,4BAA4B,QAAQ,eAAe,cAAc,QAAQ,cAAc,CACxF;EACD,UAAU,QAAQ,aAAa,iBAAiB,SAAS,YAAY;EAErE,IACE,QAAQ,gBACR,QAAQ,+BACR,QAAQ,sBACR;GACA,MAAM,gBAAgB,QAAQ,qBAC5B,QAAQ,iBAAiB,EAAE,EAC3B,cACA,QAAQ,cACT;GACD,UAAU,QAAQ,4BAA4B,EAAE,UAAU,eAAe,EAAE,QAAQ;;;CAKzF,IAAI,QAAQ,gBAAgB,QAAQ,8BAA8B,QAAQ,sBACxE,UAAU,QAAQ,oBAAoB,QAAQ,sBAAsB,QAAQ;CAG9E,OAAO;;AAGT,eAAsB,8BACpB,SACmB;CAKnB,MAAM,YAAY,yBAChB,QAAQ,uBAAuB,QAAQ,SAAS,EAC9C,SAAS,QAAQ,yBAAyB,EAC3C,CAAC,CACH;CAED,IAAI,QAAQ,cAAc;EAIxB,MAAM,UAAU,IAAI,QAAQ;GAC1B,gBAAgB;GAChB,MAAM;GACP,CAAC;EACF,uBAAuB,SAAS,QAAQ,cAAc;EACtD,+BAA+B,SAAS,QAAQ,qBAAqB,KAAK;EAC1E,8BAA8B,QAAQ;EAEtC,OAAO,IAAI,SAAS,WAAW;GAC7B,QAAQ,QAAQ;GAChB;GACD,CAAC;;CAGJ,OAAO,QAAQ,mBAAmB,WAAW,QAAQ,OAAO"}
|
|
@@ -40,6 +40,7 @@ type BuildAppPageCachedResponseOptions = {
|
|
|
40
40
|
cacheControl?: CacheControlMetadata;
|
|
41
41
|
cacheState: "HIT" | "STALE";
|
|
42
42
|
expireSeconds?: number;
|
|
43
|
+
isEdgeRuntime?: boolean;
|
|
43
44
|
isRscRequest: boolean;
|
|
44
45
|
middlewareHeaders?: Headers | null;
|
|
45
46
|
middlewareStatus?: number | null;
|
|
@@ -49,6 +50,7 @@ type BuildAppPageCachedResponseOptions = {
|
|
|
49
50
|
type ReadAppPageCacheResponseOptions = {
|
|
50
51
|
cleanPathname: string;
|
|
51
52
|
clearRequestContext: () => void;
|
|
53
|
+
isEdgeRuntime?: boolean;
|
|
52
54
|
isRscRequest: boolean;
|
|
53
55
|
isrDebug?: AppPageDebugLogger;
|
|
54
56
|
isrGet: AppPageCacheGetter;
|
|
@@ -3,8 +3,9 @@ import { setCacheStateHeaders } from "./cache-headers.js";
|
|
|
3
3
|
import { encodeCacheTag } from "../utils/encode-cache-tag.js";
|
|
4
4
|
import { buildAppPageCacheValue } from "./isr-cache.js";
|
|
5
5
|
import { VINEXT_RSC_CONTENT_TYPE, VINEXT_RSC_VARY_HEADER, applyRscCompatibilityIdHeader } from "./app-rsc-cache-busting.js";
|
|
6
|
-
import { mergeMiddlewareResponseHeaders } from "./middleware-response-headers.js";
|
|
7
6
|
import { buildCachedRevalidateCacheControl } from "./cache-control.js";
|
|
7
|
+
import { mergeMiddlewareResponseHeaders } from "./middleware-response-headers.js";
|
|
8
|
+
import { applyEdgeRuntimeHeader } from "./app-page-response.js";
|
|
8
9
|
import { readStreamAsText } from "../utils/text-stream.js";
|
|
9
10
|
import { createEmptyAppPageRenderObservationState } from "./app-page-render-observation.js";
|
|
10
11
|
//#region src/server/app-page-cache.ts
|
|
@@ -43,6 +44,7 @@ function buildAppPageCachedHeaders(options) {
|
|
|
43
44
|
Vary: VINEXT_RSC_VARY_HEADER
|
|
44
45
|
});
|
|
45
46
|
setCacheStateHeaders(headers, options.cacheState);
|
|
47
|
+
applyEdgeRuntimeHeader(headers, options.isEdgeRuntime);
|
|
46
48
|
if (options.mountedSlotsHeader) headers.set(VINEXT_MOUNTED_SLOTS_HEADER, options.mountedSlotsHeader);
|
|
47
49
|
mergeMiddlewareResponseHeaders(headers, options.middlewareHeaders ?? null);
|
|
48
50
|
return headers;
|
|
@@ -73,6 +75,7 @@ function buildAppPageCachedResponse(cachedValue, options) {
|
|
|
73
75
|
cacheControl,
|
|
74
76
|
cacheState: options.cacheState,
|
|
75
77
|
contentType: VINEXT_RSC_CONTENT_TYPE,
|
|
78
|
+
isEdgeRuntime: options.isEdgeRuntime,
|
|
76
79
|
middlewareHeaders: options.middlewareHeaders,
|
|
77
80
|
mountedSlotsHeader: options.mountedSlotsHeader
|
|
78
81
|
});
|
|
@@ -87,6 +90,7 @@ function buildAppPageCachedResponse(cachedValue, options) {
|
|
|
87
90
|
cacheControl,
|
|
88
91
|
cacheState: options.cacheState,
|
|
89
92
|
contentType: "text/html; charset=utf-8",
|
|
93
|
+
isEdgeRuntime: options.isEdgeRuntime,
|
|
90
94
|
middlewareHeaders: options.middlewareHeaders
|
|
91
95
|
});
|
|
92
96
|
return new Response(cachedValue.html, {
|
|
@@ -115,6 +119,7 @@ async function readAppPageCacheResponse(options) {
|
|
|
115
119
|
cacheState: "HIT",
|
|
116
120
|
cacheControl: cached?.value.cacheControl,
|
|
117
121
|
expireSeconds: options.expireSeconds,
|
|
122
|
+
isEdgeRuntime: options.isEdgeRuntime,
|
|
118
123
|
isRscRequest: options.isRscRequest,
|
|
119
124
|
middlewareHeaders: options.middlewareHeaders,
|
|
120
125
|
middlewareStatus: options.middlewareStatus,
|
|
@@ -155,6 +160,7 @@ async function readAppPageCacheResponse(options) {
|
|
|
155
160
|
cacheState: "STALE",
|
|
156
161
|
cacheControl: cached.value.cacheControl,
|
|
157
162
|
expireSeconds: options.expireSeconds,
|
|
163
|
+
isEdgeRuntime: options.isEdgeRuntime,
|
|
158
164
|
isRscRequest: options.isRscRequest,
|
|
159
165
|
middlewareHeaders: options.middlewareHeaders,
|
|
160
166
|
middlewareStatus: options.middlewareStatus,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-page-cache.js","names":[],"sources":["../../src/server/app-page-cache.ts"],"sourcesContent":["import type { CachedAppPageValue, CacheControlMetadata } from \"vinext/shims/cache\";\nimport {\n VINEXT_RSC_CONTENT_TYPE,\n VINEXT_RSC_VARY_HEADER,\n applyRscCompatibilityIdHeader,\n} from \"./app-rsc-cache-busting.js\";\nimport { buildCachedRevalidateCacheControl } from \"./cache-control.js\";\nimport { VINEXT_MOUNTED_SLOTS_HEADER } from \"./headers.js\";\nimport { setCacheStateHeaders } from \"./cache-headers.js\";\nimport { buildAppPageCacheValue, type ISRCacheEntry } from \"./isr-cache.js\";\nimport { mergeMiddlewareResponseHeaders } from \"./middleware-response-headers.js\";\nimport { readStreamAsText } from \"../utils/text-stream.js\";\nimport { encodeCacheTag } from \"../utils/encode-cache-tag.js\";\nimport type { AppRscRenderMode } from \"./app-rsc-render-mode.js\";\nimport {\n createEmptyAppPageRenderObservationState,\n type AppPageRenderObservationState,\n} from \"./app-page-render-observation.js\";\nimport type { RenderObservation } from \"./cache-proof.js\";\n\ntype AppPageDebugLogger = (event: string, detail: string) => void;\ntype AppPageCacheGetter = (key: string) => Promise<ISRCacheEntry | null>;\ntype AppPageCacheSetter = (\n key: string,\n data: CachedAppPageValue,\n revalidateSeconds: number,\n tags: string[],\n expireSeconds?: number,\n) => Promise<void>;\ntype AppPageBackgroundRegenerator = (key: string, renderFn: () => Promise<void>) => void;\ntype AppPageRequestCacheLife = {\n revalidate?: number;\n expire?: number;\n};\nexport type AppPageCacheOutcomeMetric = Readonly<{\n artifact: \"html\" | \"rsc\";\n /**\n * Internal cache lookup key for debugging and tests. Runtime telemetry sinks should hash or\n * redact this value before export to avoid high-cardinality or user-derived labels.\n */\n cacheKey: string;\n outcome: \"hit\" | \"miss\" | \"stale\";\n reason:\n | \"empty-entry\"\n | \"no-entry\"\n | \"non-app-page-entry\"\n | \"read-error\"\n | \"served\"\n | \"stale-empty-entry\";\n}>;\ntype AppPageCacheOutcomeRecorder = (metric: AppPageCacheOutcomeMetric) => void;\n\ntype BuildAppPageCacheRenderObservation = (input: {\n cacheTags: readonly string[];\n state: AppPageRenderObservationState;\n}) => RenderObservation;\n\ntype AppPageCacheRenderResult = {\n cacheControl?: CacheControlMetadata;\n html: string;\n htmlRenderObservation?: RenderObservation;\n rscData: ArrayBuffer;\n rscRenderObservation?: RenderObservation;\n tags: string[];\n};\n\ntype BuildAppPageCachedResponseOptions = {\n cacheControl?: CacheControlMetadata;\n cacheState: \"HIT\" | \"STALE\";\n expireSeconds?: number;\n isRscRequest: boolean;\n middlewareHeaders?: Headers | null;\n middlewareStatus?: number | null;\n mountedSlotsHeader?: string | null;\n revalidateSeconds: number;\n};\n\ntype ReadAppPageCacheResponseOptions = {\n cleanPathname: string;\n clearRequestContext: () => void;\n isRscRequest: boolean;\n isrDebug?: AppPageDebugLogger;\n isrGet: AppPageCacheGetter;\n isrHtmlKey: (pathname: string) => string;\n isrRscKey: (\n pathname: string,\n mountedSlotsHeader?: string | null,\n renderMode?: AppRscRenderMode,\n ) => string;\n isrSet: AppPageCacheSetter;\n middlewareHeaders?: Headers | null;\n middlewareStatus?: number | null;\n mountedSlotsHeader?: string | null;\n recordCacheOutcome?: AppPageCacheOutcomeRecorder;\n renderMode?: AppRscRenderMode;\n expireSeconds?: number;\n revalidateSeconds: number;\n renderFreshPageForCache: () => Promise<AppPageCacheRenderResult>;\n scheduleBackgroundRegeneration: AppPageBackgroundRegenerator;\n};\n\ntype FinalizeAppPageHtmlCacheResponseOptions = {\n capturedDynamicUsageBeforeContextCleanup?: () => boolean;\n capturedRscDataPromise: Promise<ArrayBuffer> | null;\n cleanPathname: string;\n consumeDynamicUsage: () => boolean;\n consumeRenderObservationState?: () => AppPageRenderObservationState;\n createHtmlRenderObservation?: BuildAppPageCacheRenderObservation;\n createRscRenderObservation?: BuildAppPageCacheRenderObservation;\n getPageTags: () => string[];\n getRequestCacheLife?: () => AppPageRequestCacheLife | null;\n isrDebug?: AppPageDebugLogger;\n isrHtmlKey: (pathname: string) => string;\n isrRscKey: (\n pathname: string,\n mountedSlotsHeader?: string | null,\n renderMode?: AppRscRenderMode,\n ) => string;\n isrSet: AppPageCacheSetter;\n preserveClientResponseHeaders?: boolean;\n expireSeconds?: number;\n revalidateSeconds: number | null;\n waitUntil?: (promise: Promise<void>) => void;\n};\n\ntype ScheduleAppPageRscCacheWriteOptions = {\n capturedRscDataPromise: Promise<ArrayBuffer> | null;\n cleanPathname: string;\n consumeDynamicUsage: () => boolean;\n consumeRenderObservationState?: () => AppPageRenderObservationState;\n createRscRenderObservation?: BuildAppPageCacheRenderObservation;\n dynamicUsedDuringBuild: boolean;\n getPageTags: () => string[];\n getRequestCacheLife?: () => AppPageRequestCacheLife | null;\n isrDebug?: AppPageDebugLogger;\n isrRscKey: (\n pathname: string,\n mountedSlotsHeader?: string | null,\n renderMode?: AppRscRenderMode,\n ) => string;\n isrSet: AppPageCacheSetter;\n mountedSlotsHeader?: string | null;\n renderMode?: AppRscRenderMode;\n preserveClientResponseHeaders?: boolean;\n expireSeconds?: number;\n revalidateSeconds: number | null;\n waitUntil?: (promise: Promise<void>) => void;\n};\n\nconst NO_STORE_CACHE_CONTROL = \"no-store, must-revalidate\";\n\nfunction recordAppPageCacheOutcome(\n recordCacheOutcome: AppPageCacheOutcomeRecorder | undefined,\n input: AppPageCacheOutcomeMetric,\n): void {\n try {\n recordCacheOutcome?.(input);\n } catch {\n // Metrics are observational only; telemetry failures must not alter cache serving behavior.\n }\n}\n\nexport function buildAppPageCacheTags(pathname: string, extraTags: readonly string[]): string[] {\n const tags = [pathname, `_N_T_${pathname}`, \"_N_T_/layout\"];\n const segments = pathname.split(\"/\");\n let built = \"\";\n for (let index = 1; index < segments.length; index++) {\n const segment = segments[index];\n if (segment) {\n built += `/${segment}`;\n tags.push(`_N_T_${built}/layout`);\n }\n }\n\n tags.push(`_N_T_${built}/page`);\n for (const tag of extraTags) {\n if (!tags.includes(tag)) {\n tags.push(tag);\n }\n }\n // Canonicalise to ASCII-safe form so path-derived tags from non-ASCII\n // pathnames match what `revalidatePath`/`revalidateTag` produce after\n // their own encoding pass.\n return tags.map(encodeCacheTag);\n}\n\nfunction buildAppPageCacheControl(\n cacheState: BuildAppPageCachedResponseOptions[\"cacheState\"],\n revalidateSeconds: number,\n expireSeconds?: number,\n): string {\n return buildCachedRevalidateCacheControl(cacheState, revalidateSeconds, expireSeconds);\n}\n\nfunction buildAppPageCachedHeaders(options: {\n cacheControl: string;\n cacheState: BuildAppPageCachedResponseOptions[\"cacheState\"];\n contentType: string;\n middlewareHeaders?: Headers | null;\n mountedSlotsHeader?: string | null;\n}): Headers {\n const headers = new Headers({\n \"Cache-Control\": options.cacheControl,\n \"Content-Type\": options.contentType,\n Vary: VINEXT_RSC_VARY_HEADER,\n });\n setCacheStateHeaders(headers, options.cacheState);\n\n if (options.mountedSlotsHeader) {\n headers.set(VINEXT_MOUNTED_SLOTS_HEADER, options.mountedSlotsHeader);\n }\n\n mergeMiddlewareResponseHeaders(headers, options.middlewareHeaders ?? null);\n return headers;\n}\n\nfunction getCachedAppPageValue(entry: ISRCacheEntry | null): CachedAppPageValue | null {\n return entry?.value.value && entry.value.value.kind === \"APP_PAGE\" ? entry.value.value : null;\n}\n\nfunction resolveAppPageCacheWritePolicy(options: {\n expireSeconds?: number;\n requestCacheLife?: AppPageRequestCacheLife | null;\n revalidateSeconds: number | null;\n}): { expireSeconds?: number; revalidateSeconds: number } | null {\n let revalidateSeconds = options.revalidateSeconds;\n let expireSeconds = options.expireSeconds;\n const requestCacheLife = options.requestCacheLife;\n\n if (requestCacheLife?.revalidate !== undefined) {\n revalidateSeconds =\n revalidateSeconds === null\n ? requestCacheLife.revalidate\n : Math.min(revalidateSeconds, requestCacheLife.revalidate);\n }\n if (requestCacheLife?.expire !== undefined) {\n expireSeconds = requestCacheLife.expire;\n }\n\n if (revalidateSeconds === null || revalidateSeconds <= 0 || !Number.isFinite(revalidateSeconds)) {\n return null;\n }\n\n return { expireSeconds, revalidateSeconds };\n}\n\nexport function buildAppPageCachedResponse(\n cachedValue: CachedAppPageValue,\n options: BuildAppPageCachedResponseOptions,\n): Response | null {\n // Preserve the legacy fallback semantics from the generated entry: invalid\n // falsy statuses still fall back to 200 rather than being forwarded through.\n const status = options.middlewareStatus ?? (cachedValue.status || 200);\n const revalidateSeconds = options.cacheControl?.revalidate ?? options.revalidateSeconds;\n const expireSeconds =\n options.cacheControl === undefined\n ? undefined\n : (options.cacheControl.expire ?? options.expireSeconds);\n const cacheControl = buildAppPageCacheControl(\n options.cacheState,\n revalidateSeconds,\n expireSeconds,\n );\n if (options.isRscRequest) {\n if (!cachedValue.rscData) {\n return null;\n }\n\n const rscHeaders = buildAppPageCachedHeaders({\n cacheControl,\n cacheState: options.cacheState,\n contentType: VINEXT_RSC_CONTENT_TYPE,\n middlewareHeaders: options.middlewareHeaders,\n mountedSlotsHeader: options.mountedSlotsHeader,\n });\n applyRscCompatibilityIdHeader(rscHeaders);\n\n return new Response(cachedValue.rscData, {\n status,\n headers: rscHeaders,\n });\n }\n\n if (typeof cachedValue.html !== \"string\" || cachedValue.html.length === 0) {\n return null;\n }\n\n const htmlHeaders = buildAppPageCachedHeaders({\n cacheControl,\n cacheState: options.cacheState,\n contentType: \"text/html; charset=utf-8\",\n middlewareHeaders: options.middlewareHeaders,\n });\n\n return new Response(cachedValue.html, {\n status,\n headers: htmlHeaders,\n });\n}\n\nexport async function readAppPageCacheResponse(\n options: ReadAppPageCacheResponseOptions,\n): Promise<Response | null> {\n const isrKey = options.isRscRequest\n ? options.isrRscKey(options.cleanPathname, options.mountedSlotsHeader, options.renderMode)\n : options.isrHtmlKey(options.cleanPathname);\n const artifact = options.isRscRequest ? \"rsc\" : \"html\";\n\n try {\n const cached = await options.isrGet(isrKey);\n const cachedValue = getCachedAppPageValue(cached);\n\n if (cached && !cachedValue) {\n recordAppPageCacheOutcome(options.recordCacheOutcome, {\n artifact,\n cacheKey: isrKey,\n outcome: \"miss\",\n reason: \"non-app-page-entry\",\n });\n options.isrDebug?.(\"MISS (non app-page cache entry)\", options.cleanPathname);\n return null;\n }\n\n if (cachedValue && !cached?.isStale) {\n const hitResponse = buildAppPageCachedResponse(cachedValue, {\n cacheState: \"HIT\",\n cacheControl: cached?.value.cacheControl,\n expireSeconds: options.expireSeconds,\n isRscRequest: options.isRscRequest,\n middlewareHeaders: options.middlewareHeaders,\n middlewareStatus: options.middlewareStatus,\n mountedSlotsHeader: options.mountedSlotsHeader,\n revalidateSeconds: options.revalidateSeconds,\n });\n\n if (hitResponse) {\n recordAppPageCacheOutcome(options.recordCacheOutcome, {\n artifact,\n cacheKey: isrKey,\n outcome: \"hit\",\n reason: \"served\",\n });\n options.isrDebug?.(\n options.isRscRequest ? \"HIT (RSC)\" : \"HIT (HTML)\",\n options.cleanPathname,\n );\n options.clearRequestContext();\n return hitResponse;\n }\n\n recordAppPageCacheOutcome(options.recordCacheOutcome, {\n artifact,\n cacheKey: isrKey,\n outcome: \"miss\",\n reason: \"empty-entry\",\n });\n options.isrDebug?.(\"MISS (empty cached entry)\", options.cleanPathname);\n }\n\n if (cached?.isStale && cachedValue) {\n const regenerationKey = options.isRscRequest\n ? options.isrRscKey(options.cleanPathname, options.mountedSlotsHeader, options.renderMode)\n : options.isrHtmlKey(options.cleanPathname);\n\n // Preserve the legacy behavior from the inline generator: stale entries\n // still trigger background regeneration even if this request cannot use\n // the stale payload and will fall through to a fresh render.\n options.scheduleBackgroundRegeneration(regenerationKey, async () => {\n const revalidatedPage = await options.renderFreshPageForCache();\n const revalidateSeconds =\n revalidatedPage.cacheControl?.revalidate ?? options.revalidateSeconds;\n const expireSeconds = revalidatedPage.cacheControl?.expire ?? options.expireSeconds;\n const writes = [\n options.isrSet(\n options.isrRscKey(\n options.cleanPathname,\n options.mountedSlotsHeader,\n options.renderMode,\n ),\n buildAppPageCacheValue(\n \"\",\n revalidatedPage.rscData,\n 200,\n revalidatedPage.rscRenderObservation,\n ),\n revalidateSeconds,\n revalidatedPage.tags,\n expireSeconds,\n ),\n ];\n\n if (!options.isRscRequest) {\n // HTML cache is slot-state-independent (canonical), so only refresh it\n // during HTML-triggered regens. RSC-triggered regens only update the\n // requesting client's RSC slot variant; a stale HTML cache entry will\n // be regenerated independently by the next full-page HTML request.\n writes.push(\n options.isrSet(\n options.isrHtmlKey(options.cleanPathname),\n buildAppPageCacheValue(\n revalidatedPage.html,\n undefined,\n 200,\n revalidatedPage.htmlRenderObservation,\n ),\n revalidateSeconds,\n revalidatedPage.tags,\n expireSeconds,\n ),\n );\n }\n\n await Promise.all(writes);\n options.isrDebug?.(\"regen complete\", options.cleanPathname);\n });\n\n const staleResponse = buildAppPageCachedResponse(cachedValue, {\n cacheState: \"STALE\",\n cacheControl: cached.value.cacheControl,\n expireSeconds: options.expireSeconds,\n isRscRequest: options.isRscRequest,\n middlewareHeaders: options.middlewareHeaders,\n middlewareStatus: options.middlewareStatus,\n mountedSlotsHeader: options.mountedSlotsHeader,\n revalidateSeconds: options.revalidateSeconds,\n });\n\n if (staleResponse) {\n recordAppPageCacheOutcome(options.recordCacheOutcome, {\n artifact,\n cacheKey: isrKey,\n outcome: \"stale\",\n reason: \"served\",\n });\n options.isrDebug?.(\n options.isRscRequest ? \"STALE (RSC)\" : \"STALE (HTML)\",\n options.cleanPathname,\n );\n options.clearRequestContext();\n return staleResponse;\n }\n\n recordAppPageCacheOutcome(options.recordCacheOutcome, {\n artifact,\n cacheKey: isrKey,\n outcome: \"miss\",\n reason: \"stale-empty-entry\",\n });\n options.isrDebug?.(\"STALE MISS (empty stale entry)\", options.cleanPathname);\n }\n\n if (!cached) {\n recordAppPageCacheOutcome(options.recordCacheOutcome, {\n artifact,\n cacheKey: isrKey,\n outcome: \"miss\",\n reason: \"no-entry\",\n });\n options.isrDebug?.(\"MISS (no cache entry)\", options.cleanPathname);\n }\n } catch (isrReadError) {\n recordAppPageCacheOutcome(options.recordCacheOutcome, {\n artifact,\n cacheKey: isrKey,\n outcome: \"miss\",\n reason: \"read-error\",\n });\n console.error(\"[vinext] ISR cache read error:\", isrReadError);\n }\n\n return null;\n}\n\nexport function finalizeAppPageHtmlCacheResponse(\n response: Response,\n options: FinalizeAppPageHtmlCacheResponseOptions,\n): Response {\n if (!response.body) {\n return response;\n }\n\n const [streamForClient, streamForCache] = response.body.tee();\n const htmlKey = options.isrHtmlKey(options.cleanPathname);\n const rscKey = options.isrRscKey(options.cleanPathname, null);\n const clientHeaders = new Headers(response.headers);\n if (options.preserveClientResponseHeaders !== true) {\n // HTML Server Components can access request APIs while the stream is being\n // consumed. Until that late dynamic check finishes, downstream shared caches\n // must not cache a response whose ISR policy was known before streaming.\n clientHeaders.set(\"Cache-Control\", NO_STORE_CACHE_CONTROL);\n setCacheStateHeaders(clientHeaders, \"MISS\");\n }\n\n const cachePromise = (async () => {\n try {\n const cachedHtml = await readStreamAsText(streamForCache);\n\n if (\n options.capturedDynamicUsageBeforeContextCleanup?.() === true ||\n options.consumeDynamicUsage()\n ) {\n options.isrDebug?.(\"HTML cache write skipped (dynamic usage during render)\", htmlKey);\n return;\n }\n\n const cachePolicy = resolveAppPageCacheWritePolicy({\n expireSeconds: options.expireSeconds,\n requestCacheLife: options.getRequestCacheLife?.(),\n revalidateSeconds: options.revalidateSeconds,\n });\n if (!cachePolicy) {\n options.isrDebug?.(\"HTML cache write skipped (no cache policy)\", htmlKey);\n return;\n }\n\n const pageTags = options.getPageTags();\n // This continuation is scheduled while the request ALS scope is active.\n // It intentionally consumes observation state only after the HTML stream\n // drains, so late Server Component request API usage is included.\n // Consume once: HTML and captured RSC artifacts come from the same render\n // pass, so both cache artifacts share the same observation snapshot.\n const observationState =\n options.consumeRenderObservationState?.() ?? createEmptyAppPageRenderObservationState();\n const htmlRenderObservation = options.createHtmlRenderObservation?.({\n cacheTags: pageTags,\n state: observationState,\n });\n const rscRenderObservation = options.createRscRenderObservation?.({\n cacheTags: pageTags,\n state: observationState,\n });\n const writes = [\n options.isrSet(\n htmlKey,\n buildAppPageCacheValue(cachedHtml, undefined, 200, htmlRenderObservation),\n cachePolicy.revalidateSeconds,\n pageTags,\n cachePolicy.expireSeconds,\n ),\n ];\n\n if (options.capturedRscDataPromise) {\n writes.push(\n options.capturedRscDataPromise.then((rscData) =>\n options.isrSet(\n rscKey,\n buildAppPageCacheValue(\"\", rscData, 200, rscRenderObservation),\n cachePolicy.revalidateSeconds,\n pageTags,\n cachePolicy.expireSeconds,\n ),\n ),\n );\n }\n\n await Promise.all(writes);\n options.isrDebug?.(\"HTML cache written\", htmlKey);\n } catch (cacheError) {\n console.error(\"[vinext] ISR cache write error:\", cacheError);\n }\n })();\n\n options.waitUntil?.(cachePromise);\n\n return new Response(streamForClient, {\n status: response.status,\n statusText: response.statusText,\n headers: clientHeaders,\n });\n}\n\nexport function finalizeAppPageRscCacheResponse(\n response: Response,\n options: ScheduleAppPageRscCacheWriteOptions,\n): Response {\n const didSchedule = scheduleAppPageRscCacheWrite(options);\n if (!didSchedule) {\n return response;\n }\n\n if (options.preserveClientResponseHeaders === true) {\n return response;\n }\n\n const clientHeaders = new Headers(response.headers);\n // RSC payloads are also streamed lazily. Until the captured stream proves no\n // late request API was used, the client-facing MISS response must not enter a\n // shared cache when the ISR policy was known before streaming.\n clientHeaders.set(\"Cache-Control\", NO_STORE_CACHE_CONTROL);\n setCacheStateHeaders(clientHeaders, \"MISS\");\n\n return new Response(response.body, {\n status: response.status,\n statusText: response.statusText,\n headers: clientHeaders,\n });\n}\n\nexport function scheduleAppPageRscCacheWrite(\n options: ScheduleAppPageRscCacheWriteOptions,\n): boolean {\n const capturedRscDataPromise = options.capturedRscDataPromise;\n if (!capturedRscDataPromise || options.dynamicUsedDuringBuild) {\n return false;\n }\n\n const rscKey = options.isrRscKey(\n options.cleanPathname,\n options.mountedSlotsHeader,\n options.renderMode,\n );\n const cachePromise = (async () => {\n try {\n const rscData = await capturedRscDataPromise;\n\n // Two-phase dynamic detection:\n // 1. dynamicUsedDuringBuild catches searchParams-driven opt-in before the\n // RSC response is sent.\n // 2. consumeDynamicUsage() here catches APIs that fire while the RSC\n // stream is consumed (headers(), cookies(), noStore()).\n if (options.consumeDynamicUsage()) {\n options.isrDebug?.(\"RSC cache write skipped (dynamic usage during render)\", rscKey);\n return;\n }\n\n const cachePolicy = resolveAppPageCacheWritePolicy({\n expireSeconds: options.expireSeconds,\n requestCacheLife: options.getRequestCacheLife?.(),\n revalidateSeconds: options.revalidateSeconds,\n });\n if (!cachePolicy) {\n options.isrDebug?.(\"RSC cache write skipped (no cache policy)\", rscKey);\n return;\n }\n\n const pageTags = options.getPageTags();\n // This continuation is scheduled while the request ALS scope is active.\n // It intentionally consumes observation state only after the captured RSC\n // stream resolves, so late Server Component request API usage is included.\n const observationState =\n options.consumeRenderObservationState?.() ?? createEmptyAppPageRenderObservationState();\n const rscRenderObservation = options.createRscRenderObservation?.({\n cacheTags: pageTags,\n state: observationState,\n });\n await options.isrSet(\n rscKey,\n buildAppPageCacheValue(\"\", rscData, 200, rscRenderObservation),\n cachePolicy.revalidateSeconds,\n pageTags,\n cachePolicy.expireSeconds,\n );\n options.isrDebug?.(\"RSC cache written\", rscKey);\n } catch (cacheError) {\n console.error(\"[vinext] ISR RSC cache write error:\", cacheError);\n }\n })();\n\n options.waitUntil?.(cachePromise);\n return true;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"app-page-cache.js","names":[],"sources":["../../src/server/app-page-cache.ts"],"sourcesContent":["import type { CachedAppPageValue, CacheControlMetadata } from \"vinext/shims/cache\";\nimport {\n VINEXT_RSC_CONTENT_TYPE,\n VINEXT_RSC_VARY_HEADER,\n applyRscCompatibilityIdHeader,\n} from \"./app-rsc-cache-busting.js\";\nimport { buildCachedRevalidateCacheControl } from \"./cache-control.js\";\nimport { VINEXT_MOUNTED_SLOTS_HEADER } from \"./headers.js\";\nimport { applyEdgeRuntimeHeader } from \"./app-page-response.js\";\nimport { setCacheStateHeaders } from \"./cache-headers.js\";\nimport { buildAppPageCacheValue, type ISRCacheEntry } from \"./isr-cache.js\";\nimport { mergeMiddlewareResponseHeaders } from \"./middleware-response-headers.js\";\nimport { readStreamAsText } from \"../utils/text-stream.js\";\nimport { encodeCacheTag } from \"../utils/encode-cache-tag.js\";\nimport type { AppRscRenderMode } from \"./app-rsc-render-mode.js\";\nimport {\n createEmptyAppPageRenderObservationState,\n type AppPageRenderObservationState,\n} from \"./app-page-render-observation.js\";\nimport type { RenderObservation } from \"./cache-proof.js\";\n\ntype AppPageDebugLogger = (event: string, detail: string) => void;\ntype AppPageCacheGetter = (key: string) => Promise<ISRCacheEntry | null>;\ntype AppPageCacheSetter = (\n key: string,\n data: CachedAppPageValue,\n revalidateSeconds: number,\n tags: string[],\n expireSeconds?: number,\n) => Promise<void>;\ntype AppPageBackgroundRegenerator = (key: string, renderFn: () => Promise<void>) => void;\ntype AppPageRequestCacheLife = {\n revalidate?: number;\n expire?: number;\n};\nexport type AppPageCacheOutcomeMetric = Readonly<{\n artifact: \"html\" | \"rsc\";\n /**\n * Internal cache lookup key for debugging and tests. Runtime telemetry sinks should hash or\n * redact this value before export to avoid high-cardinality or user-derived labels.\n */\n cacheKey: string;\n outcome: \"hit\" | \"miss\" | \"stale\";\n reason:\n | \"empty-entry\"\n | \"no-entry\"\n | \"non-app-page-entry\"\n | \"read-error\"\n | \"served\"\n | \"stale-empty-entry\";\n}>;\ntype AppPageCacheOutcomeRecorder = (metric: AppPageCacheOutcomeMetric) => void;\n\ntype BuildAppPageCacheRenderObservation = (input: {\n cacheTags: readonly string[];\n state: AppPageRenderObservationState;\n}) => RenderObservation;\n\ntype AppPageCacheRenderResult = {\n cacheControl?: CacheControlMetadata;\n html: string;\n htmlRenderObservation?: RenderObservation;\n rscData: ArrayBuffer;\n rscRenderObservation?: RenderObservation;\n tags: string[];\n};\n\ntype BuildAppPageCachedResponseOptions = {\n cacheControl?: CacheControlMetadata;\n cacheState: \"HIT\" | \"STALE\";\n expireSeconds?: number;\n isEdgeRuntime?: boolean;\n isRscRequest: boolean;\n middlewareHeaders?: Headers | null;\n middlewareStatus?: number | null;\n mountedSlotsHeader?: string | null;\n revalidateSeconds: number;\n};\n\ntype ReadAppPageCacheResponseOptions = {\n cleanPathname: string;\n clearRequestContext: () => void;\n isEdgeRuntime?: boolean;\n isRscRequest: boolean;\n isrDebug?: AppPageDebugLogger;\n isrGet: AppPageCacheGetter;\n isrHtmlKey: (pathname: string) => string;\n isrRscKey: (\n pathname: string,\n mountedSlotsHeader?: string | null,\n renderMode?: AppRscRenderMode,\n ) => string;\n isrSet: AppPageCacheSetter;\n middlewareHeaders?: Headers | null;\n middlewareStatus?: number | null;\n mountedSlotsHeader?: string | null;\n recordCacheOutcome?: AppPageCacheOutcomeRecorder;\n renderMode?: AppRscRenderMode;\n expireSeconds?: number;\n revalidateSeconds: number;\n renderFreshPageForCache: () => Promise<AppPageCacheRenderResult>;\n scheduleBackgroundRegeneration: AppPageBackgroundRegenerator;\n};\n\ntype FinalizeAppPageHtmlCacheResponseOptions = {\n capturedDynamicUsageBeforeContextCleanup?: () => boolean;\n capturedRscDataPromise: Promise<ArrayBuffer> | null;\n cleanPathname: string;\n consumeDynamicUsage: () => boolean;\n consumeRenderObservationState?: () => AppPageRenderObservationState;\n createHtmlRenderObservation?: BuildAppPageCacheRenderObservation;\n createRscRenderObservation?: BuildAppPageCacheRenderObservation;\n getPageTags: () => string[];\n getRequestCacheLife?: () => AppPageRequestCacheLife | null;\n isrDebug?: AppPageDebugLogger;\n isrHtmlKey: (pathname: string) => string;\n isrRscKey: (\n pathname: string,\n mountedSlotsHeader?: string | null,\n renderMode?: AppRscRenderMode,\n ) => string;\n isrSet: AppPageCacheSetter;\n preserveClientResponseHeaders?: boolean;\n expireSeconds?: number;\n revalidateSeconds: number | null;\n waitUntil?: (promise: Promise<void>) => void;\n};\n\ntype ScheduleAppPageRscCacheWriteOptions = {\n capturedRscDataPromise: Promise<ArrayBuffer> | null;\n cleanPathname: string;\n consumeDynamicUsage: () => boolean;\n consumeRenderObservationState?: () => AppPageRenderObservationState;\n createRscRenderObservation?: BuildAppPageCacheRenderObservation;\n dynamicUsedDuringBuild: boolean;\n getPageTags: () => string[];\n getRequestCacheLife?: () => AppPageRequestCacheLife | null;\n isrDebug?: AppPageDebugLogger;\n isrRscKey: (\n pathname: string,\n mountedSlotsHeader?: string | null,\n renderMode?: AppRscRenderMode,\n ) => string;\n isrSet: AppPageCacheSetter;\n mountedSlotsHeader?: string | null;\n renderMode?: AppRscRenderMode;\n preserveClientResponseHeaders?: boolean;\n expireSeconds?: number;\n revalidateSeconds: number | null;\n waitUntil?: (promise: Promise<void>) => void;\n};\n\nconst NO_STORE_CACHE_CONTROL = \"no-store, must-revalidate\";\n\nfunction recordAppPageCacheOutcome(\n recordCacheOutcome: AppPageCacheOutcomeRecorder | undefined,\n input: AppPageCacheOutcomeMetric,\n): void {\n try {\n recordCacheOutcome?.(input);\n } catch {\n // Metrics are observational only; telemetry failures must not alter cache serving behavior.\n }\n}\n\nexport function buildAppPageCacheTags(pathname: string, extraTags: readonly string[]): string[] {\n const tags = [pathname, `_N_T_${pathname}`, \"_N_T_/layout\"];\n const segments = pathname.split(\"/\");\n let built = \"\";\n for (let index = 1; index < segments.length; index++) {\n const segment = segments[index];\n if (segment) {\n built += `/${segment}`;\n tags.push(`_N_T_${built}/layout`);\n }\n }\n\n tags.push(`_N_T_${built}/page`);\n for (const tag of extraTags) {\n if (!tags.includes(tag)) {\n tags.push(tag);\n }\n }\n // Canonicalise to ASCII-safe form so path-derived tags from non-ASCII\n // pathnames match what `revalidatePath`/`revalidateTag` produce after\n // their own encoding pass.\n return tags.map(encodeCacheTag);\n}\n\nfunction buildAppPageCacheControl(\n cacheState: BuildAppPageCachedResponseOptions[\"cacheState\"],\n revalidateSeconds: number,\n expireSeconds?: number,\n): string {\n return buildCachedRevalidateCacheControl(cacheState, revalidateSeconds, expireSeconds);\n}\n\nfunction buildAppPageCachedHeaders(options: {\n cacheControl: string;\n cacheState: BuildAppPageCachedResponseOptions[\"cacheState\"];\n contentType: string;\n isEdgeRuntime?: boolean;\n middlewareHeaders?: Headers | null;\n mountedSlotsHeader?: string | null;\n}): Headers {\n const headers = new Headers({\n \"Cache-Control\": options.cacheControl,\n \"Content-Type\": options.contentType,\n Vary: VINEXT_RSC_VARY_HEADER,\n });\n setCacheStateHeaders(headers, options.cacheState);\n applyEdgeRuntimeHeader(headers, options.isEdgeRuntime);\n\n if (options.mountedSlotsHeader) {\n headers.set(VINEXT_MOUNTED_SLOTS_HEADER, options.mountedSlotsHeader);\n }\n\n mergeMiddlewareResponseHeaders(headers, options.middlewareHeaders ?? null);\n return headers;\n}\n\nfunction getCachedAppPageValue(entry: ISRCacheEntry | null): CachedAppPageValue | null {\n return entry?.value.value && entry.value.value.kind === \"APP_PAGE\" ? entry.value.value : null;\n}\n\nfunction resolveAppPageCacheWritePolicy(options: {\n expireSeconds?: number;\n requestCacheLife?: AppPageRequestCacheLife | null;\n revalidateSeconds: number | null;\n}): { expireSeconds?: number; revalidateSeconds: number } | null {\n let revalidateSeconds = options.revalidateSeconds;\n let expireSeconds = options.expireSeconds;\n const requestCacheLife = options.requestCacheLife;\n\n if (requestCacheLife?.revalidate !== undefined) {\n revalidateSeconds =\n revalidateSeconds === null\n ? requestCacheLife.revalidate\n : Math.min(revalidateSeconds, requestCacheLife.revalidate);\n }\n if (requestCacheLife?.expire !== undefined) {\n expireSeconds = requestCacheLife.expire;\n }\n\n if (revalidateSeconds === null || revalidateSeconds <= 0 || !Number.isFinite(revalidateSeconds)) {\n return null;\n }\n\n return { expireSeconds, revalidateSeconds };\n}\n\nexport function buildAppPageCachedResponse(\n cachedValue: CachedAppPageValue,\n options: BuildAppPageCachedResponseOptions,\n): Response | null {\n // Preserve the legacy fallback semantics from the generated entry: invalid\n // falsy statuses still fall back to 200 rather than being forwarded through.\n const status = options.middlewareStatus ?? (cachedValue.status || 200);\n const revalidateSeconds = options.cacheControl?.revalidate ?? options.revalidateSeconds;\n const expireSeconds =\n options.cacheControl === undefined\n ? undefined\n : (options.cacheControl.expire ?? options.expireSeconds);\n const cacheControl = buildAppPageCacheControl(\n options.cacheState,\n revalidateSeconds,\n expireSeconds,\n );\n if (options.isRscRequest) {\n if (!cachedValue.rscData) {\n return null;\n }\n\n const rscHeaders = buildAppPageCachedHeaders({\n cacheControl,\n cacheState: options.cacheState,\n contentType: VINEXT_RSC_CONTENT_TYPE,\n isEdgeRuntime: options.isEdgeRuntime,\n middlewareHeaders: options.middlewareHeaders,\n mountedSlotsHeader: options.mountedSlotsHeader,\n });\n applyRscCompatibilityIdHeader(rscHeaders);\n\n return new Response(cachedValue.rscData, {\n status,\n headers: rscHeaders,\n });\n }\n\n if (typeof cachedValue.html !== \"string\" || cachedValue.html.length === 0) {\n return null;\n }\n\n const htmlHeaders = buildAppPageCachedHeaders({\n cacheControl,\n cacheState: options.cacheState,\n contentType: \"text/html; charset=utf-8\",\n isEdgeRuntime: options.isEdgeRuntime,\n middlewareHeaders: options.middlewareHeaders,\n });\n\n return new Response(cachedValue.html, {\n status,\n headers: htmlHeaders,\n });\n}\n\nexport async function readAppPageCacheResponse(\n options: ReadAppPageCacheResponseOptions,\n): Promise<Response | null> {\n const isrKey = options.isRscRequest\n ? options.isrRscKey(options.cleanPathname, options.mountedSlotsHeader, options.renderMode)\n : options.isrHtmlKey(options.cleanPathname);\n const artifact = options.isRscRequest ? \"rsc\" : \"html\";\n\n try {\n const cached = await options.isrGet(isrKey);\n const cachedValue = getCachedAppPageValue(cached);\n\n if (cached && !cachedValue) {\n recordAppPageCacheOutcome(options.recordCacheOutcome, {\n artifact,\n cacheKey: isrKey,\n outcome: \"miss\",\n reason: \"non-app-page-entry\",\n });\n options.isrDebug?.(\"MISS (non app-page cache entry)\", options.cleanPathname);\n return null;\n }\n\n if (cachedValue && !cached?.isStale) {\n const hitResponse = buildAppPageCachedResponse(cachedValue, {\n cacheState: \"HIT\",\n cacheControl: cached?.value.cacheControl,\n expireSeconds: options.expireSeconds,\n isEdgeRuntime: options.isEdgeRuntime,\n isRscRequest: options.isRscRequest,\n middlewareHeaders: options.middlewareHeaders,\n middlewareStatus: options.middlewareStatus,\n mountedSlotsHeader: options.mountedSlotsHeader,\n revalidateSeconds: options.revalidateSeconds,\n });\n\n if (hitResponse) {\n recordAppPageCacheOutcome(options.recordCacheOutcome, {\n artifact,\n cacheKey: isrKey,\n outcome: \"hit\",\n reason: \"served\",\n });\n options.isrDebug?.(\n options.isRscRequest ? \"HIT (RSC)\" : \"HIT (HTML)\",\n options.cleanPathname,\n );\n options.clearRequestContext();\n return hitResponse;\n }\n\n recordAppPageCacheOutcome(options.recordCacheOutcome, {\n artifact,\n cacheKey: isrKey,\n outcome: \"miss\",\n reason: \"empty-entry\",\n });\n options.isrDebug?.(\"MISS (empty cached entry)\", options.cleanPathname);\n }\n\n if (cached?.isStale && cachedValue) {\n const regenerationKey = options.isRscRequest\n ? options.isrRscKey(options.cleanPathname, options.mountedSlotsHeader, options.renderMode)\n : options.isrHtmlKey(options.cleanPathname);\n\n // Preserve the legacy behavior from the inline generator: stale entries\n // still trigger background regeneration even if this request cannot use\n // the stale payload and will fall through to a fresh render.\n options.scheduleBackgroundRegeneration(regenerationKey, async () => {\n const revalidatedPage = await options.renderFreshPageForCache();\n const revalidateSeconds =\n revalidatedPage.cacheControl?.revalidate ?? options.revalidateSeconds;\n const expireSeconds = revalidatedPage.cacheControl?.expire ?? options.expireSeconds;\n const writes = [\n options.isrSet(\n options.isrRscKey(\n options.cleanPathname,\n options.mountedSlotsHeader,\n options.renderMode,\n ),\n buildAppPageCacheValue(\n \"\",\n revalidatedPage.rscData,\n 200,\n revalidatedPage.rscRenderObservation,\n ),\n revalidateSeconds,\n revalidatedPage.tags,\n expireSeconds,\n ),\n ];\n\n if (!options.isRscRequest) {\n // HTML cache is slot-state-independent (canonical), so only refresh it\n // during HTML-triggered regens. RSC-triggered regens only update the\n // requesting client's RSC slot variant; a stale HTML cache entry will\n // be regenerated independently by the next full-page HTML request.\n writes.push(\n options.isrSet(\n options.isrHtmlKey(options.cleanPathname),\n buildAppPageCacheValue(\n revalidatedPage.html,\n undefined,\n 200,\n revalidatedPage.htmlRenderObservation,\n ),\n revalidateSeconds,\n revalidatedPage.tags,\n expireSeconds,\n ),\n );\n }\n\n await Promise.all(writes);\n options.isrDebug?.(\"regen complete\", options.cleanPathname);\n });\n\n const staleResponse = buildAppPageCachedResponse(cachedValue, {\n cacheState: \"STALE\",\n cacheControl: cached.value.cacheControl,\n expireSeconds: options.expireSeconds,\n isEdgeRuntime: options.isEdgeRuntime,\n isRscRequest: options.isRscRequest,\n middlewareHeaders: options.middlewareHeaders,\n middlewareStatus: options.middlewareStatus,\n mountedSlotsHeader: options.mountedSlotsHeader,\n revalidateSeconds: options.revalidateSeconds,\n });\n\n if (staleResponse) {\n recordAppPageCacheOutcome(options.recordCacheOutcome, {\n artifact,\n cacheKey: isrKey,\n outcome: \"stale\",\n reason: \"served\",\n });\n options.isrDebug?.(\n options.isRscRequest ? \"STALE (RSC)\" : \"STALE (HTML)\",\n options.cleanPathname,\n );\n options.clearRequestContext();\n return staleResponse;\n }\n\n recordAppPageCacheOutcome(options.recordCacheOutcome, {\n artifact,\n cacheKey: isrKey,\n outcome: \"miss\",\n reason: \"stale-empty-entry\",\n });\n options.isrDebug?.(\"STALE MISS (empty stale entry)\", options.cleanPathname);\n }\n\n if (!cached) {\n recordAppPageCacheOutcome(options.recordCacheOutcome, {\n artifact,\n cacheKey: isrKey,\n outcome: \"miss\",\n reason: \"no-entry\",\n });\n options.isrDebug?.(\"MISS (no cache entry)\", options.cleanPathname);\n }\n } catch (isrReadError) {\n recordAppPageCacheOutcome(options.recordCacheOutcome, {\n artifact,\n cacheKey: isrKey,\n outcome: \"miss\",\n reason: \"read-error\",\n });\n console.error(\"[vinext] ISR cache read error:\", isrReadError);\n }\n\n return null;\n}\n\nexport function finalizeAppPageHtmlCacheResponse(\n response: Response,\n options: FinalizeAppPageHtmlCacheResponseOptions,\n): Response {\n if (!response.body) {\n return response;\n }\n\n const [streamForClient, streamForCache] = response.body.tee();\n const htmlKey = options.isrHtmlKey(options.cleanPathname);\n const rscKey = options.isrRscKey(options.cleanPathname, null);\n const clientHeaders = new Headers(response.headers);\n if (options.preserveClientResponseHeaders !== true) {\n // HTML Server Components can access request APIs while the stream is being\n // consumed. Until that late dynamic check finishes, downstream shared caches\n // must not cache a response whose ISR policy was known before streaming.\n clientHeaders.set(\"Cache-Control\", NO_STORE_CACHE_CONTROL);\n setCacheStateHeaders(clientHeaders, \"MISS\");\n }\n\n const cachePromise = (async () => {\n try {\n const cachedHtml = await readStreamAsText(streamForCache);\n\n if (\n options.capturedDynamicUsageBeforeContextCleanup?.() === true ||\n options.consumeDynamicUsage()\n ) {\n options.isrDebug?.(\"HTML cache write skipped (dynamic usage during render)\", htmlKey);\n return;\n }\n\n const cachePolicy = resolveAppPageCacheWritePolicy({\n expireSeconds: options.expireSeconds,\n requestCacheLife: options.getRequestCacheLife?.(),\n revalidateSeconds: options.revalidateSeconds,\n });\n if (!cachePolicy) {\n options.isrDebug?.(\"HTML cache write skipped (no cache policy)\", htmlKey);\n return;\n }\n\n const pageTags = options.getPageTags();\n // This continuation is scheduled while the request ALS scope is active.\n // It intentionally consumes observation state only after the HTML stream\n // drains, so late Server Component request API usage is included.\n // Consume once: HTML and captured RSC artifacts come from the same render\n // pass, so both cache artifacts share the same observation snapshot.\n const observationState =\n options.consumeRenderObservationState?.() ?? createEmptyAppPageRenderObservationState();\n const htmlRenderObservation = options.createHtmlRenderObservation?.({\n cacheTags: pageTags,\n state: observationState,\n });\n const rscRenderObservation = options.createRscRenderObservation?.({\n cacheTags: pageTags,\n state: observationState,\n });\n const writes = [\n options.isrSet(\n htmlKey,\n buildAppPageCacheValue(cachedHtml, undefined, 200, htmlRenderObservation),\n cachePolicy.revalidateSeconds,\n pageTags,\n cachePolicy.expireSeconds,\n ),\n ];\n\n if (options.capturedRscDataPromise) {\n writes.push(\n options.capturedRscDataPromise.then((rscData) =>\n options.isrSet(\n rscKey,\n buildAppPageCacheValue(\"\", rscData, 200, rscRenderObservation),\n cachePolicy.revalidateSeconds,\n pageTags,\n cachePolicy.expireSeconds,\n ),\n ),\n );\n }\n\n await Promise.all(writes);\n options.isrDebug?.(\"HTML cache written\", htmlKey);\n } catch (cacheError) {\n console.error(\"[vinext] ISR cache write error:\", cacheError);\n }\n })();\n\n options.waitUntil?.(cachePromise);\n\n return new Response(streamForClient, {\n status: response.status,\n statusText: response.statusText,\n headers: clientHeaders,\n });\n}\n\nexport function finalizeAppPageRscCacheResponse(\n response: Response,\n options: ScheduleAppPageRscCacheWriteOptions,\n): Response {\n const didSchedule = scheduleAppPageRscCacheWrite(options);\n if (!didSchedule) {\n return response;\n }\n\n if (options.preserveClientResponseHeaders === true) {\n return response;\n }\n\n const clientHeaders = new Headers(response.headers);\n // RSC payloads are also streamed lazily. Until the captured stream proves no\n // late request API was used, the client-facing MISS response must not enter a\n // shared cache when the ISR policy was known before streaming.\n clientHeaders.set(\"Cache-Control\", NO_STORE_CACHE_CONTROL);\n setCacheStateHeaders(clientHeaders, \"MISS\");\n\n return new Response(response.body, {\n status: response.status,\n statusText: response.statusText,\n headers: clientHeaders,\n });\n}\n\nexport function scheduleAppPageRscCacheWrite(\n options: ScheduleAppPageRscCacheWriteOptions,\n): boolean {\n const capturedRscDataPromise = options.capturedRscDataPromise;\n if (!capturedRscDataPromise || options.dynamicUsedDuringBuild) {\n return false;\n }\n\n const rscKey = options.isrRscKey(\n options.cleanPathname,\n options.mountedSlotsHeader,\n options.renderMode,\n );\n const cachePromise = (async () => {\n try {\n const rscData = await capturedRscDataPromise;\n\n // Two-phase dynamic detection:\n // 1. dynamicUsedDuringBuild catches searchParams-driven opt-in before the\n // RSC response is sent.\n // 2. consumeDynamicUsage() here catches APIs that fire while the RSC\n // stream is consumed (headers(), cookies(), noStore()).\n if (options.consumeDynamicUsage()) {\n options.isrDebug?.(\"RSC cache write skipped (dynamic usage during render)\", rscKey);\n return;\n }\n\n const cachePolicy = resolveAppPageCacheWritePolicy({\n expireSeconds: options.expireSeconds,\n requestCacheLife: options.getRequestCacheLife?.(),\n revalidateSeconds: options.revalidateSeconds,\n });\n if (!cachePolicy) {\n options.isrDebug?.(\"RSC cache write skipped (no cache policy)\", rscKey);\n return;\n }\n\n const pageTags = options.getPageTags();\n // This continuation is scheduled while the request ALS scope is active.\n // It intentionally consumes observation state only after the captured RSC\n // stream resolves, so late Server Component request API usage is included.\n const observationState =\n options.consumeRenderObservationState?.() ?? createEmptyAppPageRenderObservationState();\n const rscRenderObservation = options.createRscRenderObservation?.({\n cacheTags: pageTags,\n state: observationState,\n });\n await options.isrSet(\n rscKey,\n buildAppPageCacheValue(\"\", rscData, 200, rscRenderObservation),\n cachePolicy.revalidateSeconds,\n pageTags,\n cachePolicy.expireSeconds,\n );\n options.isrDebug?.(\"RSC cache written\", rscKey);\n } catch (cacheError) {\n console.error(\"[vinext] ISR RSC cache write error:\", cacheError);\n }\n })();\n\n options.waitUntil?.(cachePromise);\n return true;\n}\n"],"mappings":"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"}
|
|
@@ -69,6 +69,7 @@ type DispatchAppPageOptions<TRoute extends AppPageDispatchRoute> = {
|
|
|
69
69
|
clearRequestContext: () => void;
|
|
70
70
|
createRscOnErrorHandler: (pathname: string, routePath: string) => AppPageBoundaryOnError;
|
|
71
71
|
debugClassification?: (layoutId: string, reason: ClassificationReason) => void;
|
|
72
|
+
draftModeSecret: string;
|
|
72
73
|
dynamicConfig?: string;
|
|
73
74
|
dynamicParamsConfig?: boolean;
|
|
74
75
|
fetchCache?: FetchCacheMode | null;
|
|
@@ -87,6 +88,7 @@ type DispatchAppPageOptions<TRoute extends AppPageDispatchRoute> = {
|
|
|
87
88
|
hasPageModule: boolean;
|
|
88
89
|
handlerStart: number;
|
|
89
90
|
interceptionContext: string | null;
|
|
91
|
+
isEdgeRuntime?: boolean;
|
|
90
92
|
isProgressiveActionRender?: boolean;
|
|
91
93
|
isProduction: boolean;
|
|
92
94
|
isRscRequest: boolean;
|
|
@@ -99,6 +101,7 @@ type DispatchAppPageOptions<TRoute extends AppPageDispatchRoute> = {
|
|
|
99
101
|
middlewareContext: AppPageMiddlewareContext;
|
|
100
102
|
mountedSlotsHeader?: string | null;
|
|
101
103
|
params: AppPageParams;
|
|
104
|
+
staticParamsValidationParams?: AppPageParams;
|
|
102
105
|
rootParams?: RootParams;
|
|
103
106
|
probeLayoutAt: (layoutIndex: number) => unknown;
|
|
104
107
|
probePage: () => unknown;
|
|
@@ -2,13 +2,14 @@ import { createRequestContext, runWithRequestContext } from "../shims/unified-re
|
|
|
2
2
|
import { getRequestExecutionContext } from "../shims/request-context.js";
|
|
3
3
|
import { consumeDynamicUsage, consumeInvalidDynamicUsageError, consumeRenderRequestApiUsage, getAndClearPendingCookies, getDraftModeCookieHeader, isDraftModeRequest, markDynamicUsage, peekRenderRequestApiUsage, setHeadersContext } from "../shims/headers.js";
|
|
4
4
|
import { _consumeRequestScopedCacheLife, _peekRequestScopedCacheLife } from "../shims/cache.js";
|
|
5
|
+
import { AppElementsWire } from "./app-elements-wire.js";
|
|
5
6
|
import { shouldSuppressLoadingBoundaries } from "./app-rsc-render-mode.js";
|
|
6
7
|
import { consumeDynamicFetchObservations, ensureFetchPatch, getCollectedFetchTags, peekDynamicFetchObservations, runWithFetchDedupe, setCurrentFetchCacheMode, setCurrentFetchSoftTags } from "../shims/fetch-cache.js";
|
|
7
|
-
import { AppElementsWire } from "./app-elements-wire.js";
|
|
8
8
|
import "./app-elements.js";
|
|
9
9
|
import { VINEXT_RSC_CONTENT_TYPE, VINEXT_RSC_VARY_HEADER, applyRscCompatibilityIdHeader } from "./app-rsc-cache-busting.js";
|
|
10
10
|
import { createAppPageTreePath } from "./app-page-route-wiring.js";
|
|
11
11
|
import { mergeMiddlewareResponseHeaders } from "./middleware-response-headers.js";
|
|
12
|
+
import "./app-page-response.js";
|
|
12
13
|
import { buildAppPageSpecialErrorResponse, resolveAppPageSpecialError, teeAppPageRscStreamForCapture } from "./app-page-execution.js";
|
|
13
14
|
import { resolveAppPageParentHttpAccessBoundaryModule } from "./app-page-boundary.js";
|
|
14
15
|
import { readStreamAsText } from "../utils/text-stream.js";
|
|
@@ -16,7 +17,6 @@ import { createAppPageHtmlOutputScope, createAppPageRenderObservation, createApp
|
|
|
16
17
|
import { readAppPageCacheResponse } from "./app-page-cache.js";
|
|
17
18
|
import { resolveAppPageMethodResponse } from "./app-page-method.js";
|
|
18
19
|
import { buildAppPageElement, resolveAppPageIntercept, validateAppPageDynamicParams } from "./app-page-request.js";
|
|
19
|
-
import "./app-page-response.js";
|
|
20
20
|
import { renderAppPageLifecycle } from "./app-page-render.js";
|
|
21
21
|
import { createStaticGenerationHeadersContext } from "./app-static-generation.js";
|
|
22
22
|
import { buildPageCacheTags } from "./implicit-tags.js";
|
|
@@ -31,6 +31,7 @@ function buildAppPageTags(cleanPathname, extraTags, routeSegments) {
|
|
|
31
31
|
async function runAppPageRevalidationContext(options, renderFn) {
|
|
32
32
|
return runWithRequestContext(createRequestContext({
|
|
33
33
|
headersContext: createStaticGenerationHeadersContext({
|
|
34
|
+
draftModeSecret: options.draftModeSecret,
|
|
34
35
|
dynamicConfig: options.dynamicConfig,
|
|
35
36
|
routeKind: "page",
|
|
36
37
|
routePattern: options.routePattern
|
|
@@ -74,7 +75,7 @@ async function dispatchAppPageInner(options) {
|
|
|
74
75
|
const isForceStatic = dynamicConfig === "force-static";
|
|
75
76
|
const isDynamicError = dynamicConfig === "error";
|
|
76
77
|
const isForceDynamic = dynamicConfig === "force-dynamic";
|
|
77
|
-
const isDraftMode = isDraftModeRequest(options.request);
|
|
78
|
+
const isDraftMode = isDraftModeRequest(options.request, options.draftModeSecret);
|
|
78
79
|
setCurrentFetchSoftTags(buildAppPageTags(options.cleanPathname, [], route.routeSegments));
|
|
79
80
|
setCurrentFetchCacheMode(options.fetchCache ?? null);
|
|
80
81
|
if (options.hasPageModule && !options.hasPageDefaultExport) {
|
|
@@ -95,6 +96,7 @@ async function dispatchAppPageInner(options) {
|
|
|
95
96
|
}
|
|
96
97
|
if ((isForceStatic || isDynamicError) && !isDraftMode) {
|
|
97
98
|
setHeadersContext(createStaticGenerationHeadersContext({
|
|
99
|
+
draftModeSecret: options.draftModeSecret,
|
|
98
100
|
dynamicConfig,
|
|
99
101
|
routeKind: "page",
|
|
100
102
|
routePattern: route.pattern
|
|
@@ -117,6 +119,7 @@ async function dispatchAppPageInner(options) {
|
|
|
117
119
|
const cachedPageResponse = await readAppPageCacheResponse({
|
|
118
120
|
cleanPathname: options.cleanPathname,
|
|
119
121
|
clearRequestContext: options.clearRequestContext,
|
|
122
|
+
isEdgeRuntime: options.isEdgeRuntime,
|
|
120
123
|
isRscRequest: options.isRscRequest,
|
|
121
124
|
isrDebug: options.isrDebug,
|
|
122
125
|
isrGet: options.isrGet,
|
|
@@ -132,6 +135,7 @@ async function dispatchAppPageInner(options) {
|
|
|
132
135
|
renderFreshPageForCache: async () => runAppPageRevalidationContext({
|
|
133
136
|
cleanPathname: options.cleanPathname,
|
|
134
137
|
currentFetchCacheMode: options.fetchCache ?? null,
|
|
138
|
+
draftModeSecret: options.draftModeSecret,
|
|
135
139
|
dynamicConfig,
|
|
136
140
|
params: options.params,
|
|
137
141
|
routePattern: route.pattern,
|
|
@@ -219,7 +223,7 @@ async function dispatchAppPageInner(options) {
|
|
|
219
223
|
enforceStaticParamsOnly: options.dynamicParamsConfig === false,
|
|
220
224
|
generateStaticParams: options.generateStaticParams,
|
|
221
225
|
isDynamicRoute: route.isDynamic,
|
|
222
|
-
params: options.params
|
|
226
|
+
params: options.staticParamsValidationParams ?? options.params
|
|
223
227
|
});
|
|
224
228
|
if (dynamicParamsResponse) return dynamicParamsResponse;
|
|
225
229
|
const interceptResult = await resolveAppPageIntercept({
|
|
@@ -312,6 +316,7 @@ async function dispatchAppPageInner(options) {
|
|
|
312
316
|
isDraftMode,
|
|
313
317
|
isForceDynamic,
|
|
314
318
|
isForceStatic,
|
|
319
|
+
isEdgeRuntime: options.isEdgeRuntime === true,
|
|
315
320
|
isPrerender: process.env.VINEXT_PRERENDER === "1",
|
|
316
321
|
isProduction: options.isProduction,
|
|
317
322
|
isRscRequest: options.isRscRequest,
|
|
@@ -410,6 +415,7 @@ async function renderLayoutSpecialError(options, specialError, layoutIndex) {
|
|
|
410
415
|
buildRscRedirectFlightStream: (rscOptions) => buildRscRedirectFlightStream(options, rscOptions.digest),
|
|
411
416
|
clearRequestContext: options.clearRequestContext,
|
|
412
417
|
getAndClearPendingCookies,
|
|
418
|
+
isEdgeRuntime: options.isEdgeRuntime,
|
|
413
419
|
isRscRequest: options.isRscRequest,
|
|
414
420
|
middlewareContext: options.middlewareContext,
|
|
415
421
|
renderFallbackPage(statusCode) {
|
|
@@ -439,6 +445,7 @@ async function renderPageSpecialError(options, specialError) {
|
|
|
439
445
|
buildRscRedirectFlightStream: (rscOptions) => buildRscRedirectFlightStream(options, rscOptions.digest),
|
|
440
446
|
clearRequestContext: options.clearRequestContext,
|
|
441
447
|
getAndClearPendingCookies,
|
|
448
|
+
isEdgeRuntime: options.isEdgeRuntime,
|
|
442
449
|
isRscRequest: options.isRscRequest,
|
|
443
450
|
middlewareContext: options.middlewareContext,
|
|
444
451
|
renderFallbackPage(statusCode) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-page-dispatch.js","names":[],"sources":["../../src/server/app-page-dispatch.ts"],"sourcesContent":["import React, { type ReactNode } from \"react\";\nimport type { ReactFormState } from \"react-dom/client\";\nimport type { ClassificationReason } from \"../build/layout-classification-types.js\";\nimport {\n _consumeRequestScopedCacheLife,\n _peekRequestScopedCacheLife,\n type CachedAppPageValue,\n} from \"vinext/shims/cache\";\nimport type { RootParams } from \"vinext/shims/root-params\";\nimport {\n consumeDynamicUsage,\n consumeInvalidDynamicUsageError,\n consumeRenderRequestApiUsage,\n getAndClearPendingCookies,\n getDraftModeCookieHeader,\n isDraftModeRequest,\n markDynamicUsage,\n peekRenderRequestApiUsage,\n setHeadersContext,\n} from \"vinext/shims/headers\";\nimport { getRequestExecutionContext } from \"vinext/shims/request-context\";\nimport { createRequestContext, runWithRequestContext } from \"vinext/shims/unified-request-context\";\nimport {\n ensureFetchPatch,\n consumeDynamicFetchObservations,\n type FetchCacheMode,\n getCollectedFetchTags,\n peekDynamicFetchObservations,\n runWithFetchDedupe,\n setCurrentFetchCacheMode,\n setCurrentFetchSoftTags,\n} from \"vinext/shims/fetch-cache\";\nimport { AppElementsWire, type AppOutgoingElements } from \"./app-elements.js\";\nimport { readAppPageCacheResponse } from \"./app-page-cache.js\";\nimport { resolveAppPageParentHttpAccessBoundaryModule } from \"./app-page-boundary.js\";\nimport { readStreamAsText } from \"../utils/text-stream.js\";\nimport {\n buildAppPageSpecialErrorResponse,\n resolveAppPageSpecialError,\n teeAppPageRscStreamForCapture,\n type AppPageFontPreload,\n type AppPageSpecialError,\n type LayoutClassificationOptions,\n} from \"./app-page-execution.js\";\nimport { resolveAppPageMethodResponse } from \"./app-page-method.js\";\nimport {\n buildAppPageElement,\n resolveAppPageIntercept,\n validateAppPageDynamicParams,\n type ValidateAppPageDynamicParamsOptions,\n} from \"./app-page-request.js\";\nimport { renderAppPageLifecycle } from \"./app-page-render.js\";\nimport {\n createAppPageHtmlOutputScope,\n createAppPageRenderObservation,\n createAppPageRscOutputScope,\n} from \"./app-page-render-observation.js\";\nimport {\n mergeMiddlewareResponseHeaders,\n type AppPageMiddlewareContext,\n} from \"./app-page-response.js\";\nimport {\n VINEXT_RSC_CONTENT_TYPE,\n VINEXT_RSC_VARY_HEADER,\n applyRscCompatibilityIdHeader,\n} from \"./app-rsc-cache-busting.js\";\nimport {\n APP_RSC_RENDER_MODE_NAVIGATION,\n shouldSuppressLoadingBoundaries,\n type AppRscRenderMode,\n} from \"./app-rsc-render-mode.js\";\nimport { createAppPageTreePath } from \"./app-page-route-wiring.js\";\nimport type { AppPageSsrHandler } from \"./app-page-stream.js\";\nimport { createStaticGenerationHeadersContext } from \"./app-static-generation.js\";\nimport { buildPageCacheTags } from \"./implicit-tags.js\";\nimport type { ISRCacheEntry } from \"./isr-cache.js\";\n\ntype AppPageParams = Record<string, string | string[]>;\ntype AppPageElement = ReactNode | Readonly<Record<string, ReactNode>>;\ntype AppPageRenderableElement = ReactNode | AppOutgoingElements;\ntype AppPageBoundaryOnError = (\n error: unknown,\n requestInfo: unknown,\n errorContext: unknown,\n) => unknown;\ntype AppPageDebugLogger = (event: string, detail: string) => void;\ntype AppPageCacheSetter = (\n key: string,\n data: CachedAppPageValue,\n revalidateSeconds: number,\n tags: string[],\n expireSeconds?: number,\n) => Promise<void>;\ntype AppPageCacheGetter = (key: string) => Promise<ISRCacheEntry | null>;\ntype AppPageBackgroundRegenerationErrorContext = {\n routerKind: \"App Router\";\n routePath: string;\n routeType: \"render\";\n};\ntype AppPageBackgroundRegenerator = (\n key: string,\n renderFn: () => Promise<void>,\n errorContext?: AppPageBackgroundRegenerationErrorContext,\n) => void;\n\ntype AppPageDispatchIntercept<TPage = unknown> = {\n interceptLayouts?: readonly AppPageModule[] | null;\n matchedParams: AppPageParams;\n page: TPage;\n slotId?: string | null;\n slotKey: string;\n sourceRouteIndex: number;\n};\n\ntype AppPageDispatchInterceptOptions<TPage = unknown> = {\n interceptionContext: string | null;\n interceptLayouts?: readonly AppPageModule[] | null;\n interceptPage: TPage;\n interceptParams: AppPageParams;\n interceptSlotId?: string | null;\n interceptSlotKey: string;\n interceptSourceMatchedUrl?: string | null;\n};\n\ntype AppPageModule = {\n default?: unknown;\n};\n\ntype AppPageDispatchRoute = {\n __buildTimeClassifications?: LayoutClassificationOptions[\"buildTimeClassifications\"];\n __buildTimeReasons?: LayoutClassificationOptions[\"buildTimeReasons\"];\n error?: AppPageModule | null;\n errors?: readonly (AppPageModule | null | undefined)[];\n forbiddens?: readonly (AppPageModule | null | undefined)[];\n isDynamic: boolean;\n layouts: readonly AppPageModule[];\n layoutTreePositions?: readonly number[];\n loading?: AppPageModule | null;\n notFounds?: readonly (AppPageModule | null | undefined)[];\n params: readonly string[];\n pattern: string;\n routeSegments: readonly string[];\n unauthorizeds?: readonly (AppPageModule | null | undefined)[];\n};\n\ntype DispatchAppPageOptions<TRoute extends AppPageDispatchRoute> = {\n /** Configured basePath (e.g. \"/blog\"). Used to prefix redirect Locations. */\n basePath?: string;\n buildPageElement: (\n route: TRoute,\n params: AppPageParams,\n opts: AppPageDispatchInterceptOptions | undefined,\n searchParams: URLSearchParams,\n ) => Promise<AppPageElement>;\n cleanPathname: string;\n clearRequestContext: () => void;\n createRscOnErrorHandler: (pathname: string, routePath: string) => AppPageBoundaryOnError;\n debugClassification?: (layoutId: string, reason: ClassificationReason) => void;\n dynamicConfig?: string;\n dynamicParamsConfig?: boolean;\n fetchCache?: FetchCacheMode | null;\n findIntercept: (pathname: string) => AppPageDispatchIntercept | null;\n formState?: ReactFormState | null;\n actionError?: unknown;\n actionFailed?: boolean;\n generateStaticParams?: ValidateAppPageDynamicParamsOptions[\"generateStaticParams\"];\n getFontLinks: () => string[];\n getFontPreloads: () => AppPageFontPreload[];\n getFontStyles: () => string[];\n getNavigationContext: () => unknown;\n getSourceRoute: (sourceRouteIndex: number) => TRoute | undefined;\n hasGenerateStaticParams: boolean;\n hasPageDefaultExport: boolean;\n hasPageModule: boolean;\n handlerStart: number;\n interceptionContext: string | null;\n isProgressiveActionRender?: boolean;\n isProduction: boolean;\n isRscRequest: boolean;\n isrDebug?: AppPageDebugLogger;\n isrGet: AppPageCacheGetter;\n isrHtmlKey: (pathname: string) => string;\n isrRscKey: (\n pathname: string,\n mountedSlotsHeader?: string | null,\n renderMode?: AppRscRenderMode,\n ) => string;\n isrSet: AppPageCacheSetter;\n loadSsrHandler: () => Promise<AppPageSsrHandler>;\n middlewareContext: AppPageMiddlewareContext;\n mountedSlotsHeader?: string | null;\n params: AppPageParams;\n rootParams?: RootParams;\n probeLayoutAt: (layoutIndex: number) => unknown;\n probePage: () => unknown;\n expireSeconds?: number;\n renderErrorBoundaryPage: (error: unknown) => Promise<Response | null>;\n renderHttpAccessFallbackPage: (\n statusCode: number,\n opts: {\n boundaryComponent?: unknown;\n layouts?: readonly AppPageModule[];\n matchedParams: AppPageParams;\n },\n middlewareContext: AppPageMiddlewareContext | null,\n ) => Promise<Response | null>;\n renderToReadableStream: (\n element: AppPageRenderableElement,\n options: { onError: AppPageBoundaryOnError },\n ) => ReadableStream<Uint8Array>;\n request: Request;\n revalidateSeconds: number | null;\n resolveRouteFetchCacheMode?: (route: TRoute) => FetchCacheMode | null;\n rootForbiddenModule?: AppPageModule | null;\n rootNotFoundModule?: AppPageModule | null;\n rootUnauthorizedModule?: AppPageModule | null;\n route: TRoute;\n runWithSuppressedHookWarning<T>(probe: () => Promise<T>): Promise<T>;\n scheduleBackgroundRegeneration: AppPageBackgroundRegenerator;\n scriptNonce?: string;\n searchParams: URLSearchParams;\n setNavigationContext: (context: {\n params: AppPageParams;\n pathname: string;\n searchParams: URLSearchParams;\n }) => void;\n renderMode?: AppRscRenderMode;\n};\n\nfunction shouldReadAppPageCache(options: {\n isProgressiveActionRender: boolean;\n isDraftMode: boolean;\n isForceDynamic: boolean;\n isProduction: boolean;\n isRscRequest: boolean;\n revalidateSeconds: number | null;\n scriptNonce?: string;\n}): boolean {\n return (\n options.isProduction &&\n !options.isProgressiveActionRender &&\n !options.isDraftMode &&\n !options.isForceDynamic &&\n (options.isRscRequest || !options.scriptNonce) &&\n (options.revalidateSeconds === null || options.revalidateSeconds > 0)\n );\n}\n\nfunction buildAppPageTags(\n cleanPathname: string,\n extraTags: string[],\n routeSegments: readonly string[],\n): string[] {\n return buildPageCacheTags(cleanPathname, extraTags, [...routeSegments], \"page\");\n}\n\nasync function runAppPageRevalidationContext<\n TResult extends {\n html: string;\n rscData: ArrayBuffer;\n tags: string[];\n },\n>(\n options: {\n cleanPathname: string;\n currentFetchCacheMode?: FetchCacheMode | null;\n dynamicConfig?: string;\n params: AppPageParams;\n routePattern: string;\n routeSegments: readonly string[];\n setNavigationContext: DispatchAppPageOptions<AppPageDispatchRoute>[\"setNavigationContext\"];\n },\n renderFn: () => Promise<TResult>,\n): Promise<TResult> {\n const headersContext = createStaticGenerationHeadersContext({\n dynamicConfig: options.dynamicConfig,\n routeKind: \"page\",\n routePattern: options.routePattern,\n });\n const requestContext = createRequestContext({\n headersContext,\n currentFetchCacheMode: options.currentFetchCacheMode ?? null,\n executionContext: getRequestExecutionContext(),\n unstableCacheRevalidation: \"foreground\",\n });\n\n return runWithRequestContext(requestContext, async () => {\n ensureFetchPatch();\n setCurrentFetchSoftTags(buildAppPageTags(options.cleanPathname, [], options.routeSegments));\n options.setNavigationContext({\n pathname: options.cleanPathname,\n searchParams: new URLSearchParams(),\n params: options.params,\n });\n return await runWithFetchDedupe(renderFn);\n });\n}\n\nfunction getCapturedRscDataPromise(\n capturedRscDataPromise: Promise<ArrayBuffer> | null,\n): Promise<ArrayBuffer> {\n if (!capturedRscDataPromise) {\n throw new Error(\n \"[vinext] Expected captured RSC data while regenerating an app page cache entry\",\n );\n }\n\n return capturedRscDataPromise;\n}\n\nfunction toInterceptOptions(\n interceptionContext: string | null,\n intercept: AppPageDispatchIntercept,\n): AppPageDispatchInterceptOptions {\n return {\n interceptionContext,\n interceptLayouts: intercept.interceptLayouts,\n interceptPage: intercept.page,\n interceptParams: intercept.matchedParams,\n interceptSlotId: intercept.slotId ?? null,\n interceptSlotKey: intercept.slotKey,\n interceptSourceMatchedUrl: interceptionContext,\n };\n}\n\nexport async function dispatchAppPage<TRoute extends AppPageDispatchRoute>(\n options: DispatchAppPageOptions<TRoute>,\n): Promise<Response> {\n return await runWithFetchDedupe(() => dispatchAppPageInner(options));\n}\n\nasync function dispatchAppPageInner<TRoute extends AppPageDispatchRoute>(\n options: DispatchAppPageOptions<TRoute>,\n): Promise<Response> {\n const route = options.route;\n const dynamicConfig = options.dynamicConfig;\n const currentRevalidateSeconds = options.revalidateSeconds;\n const isForceStatic = dynamicConfig === \"force-static\";\n const isDynamicError = dynamicConfig === \"error\";\n const isForceDynamic = dynamicConfig === \"force-dynamic\";\n const isDraftMode = isDraftModeRequest(options.request);\n\n setCurrentFetchSoftTags(buildAppPageTags(options.cleanPathname, [], route.routeSegments));\n setCurrentFetchCacheMode(options.fetchCache ?? null);\n\n if (options.hasPageModule && !options.hasPageDefaultExport) {\n options.clearRequestContext();\n return new Response(\"Page has no default export\", { status: 500 });\n }\n\n const methodResponse = resolveAppPageMethodResponse({\n dynamicConfig,\n hasGenerateStaticParams: options.hasGenerateStaticParams,\n isDynamicRoute: route.isDynamic,\n middlewareHeaders: options.middlewareContext.headers,\n request: options.request,\n revalidateSeconds: currentRevalidateSeconds,\n });\n if (methodResponse) {\n options.clearRequestContext();\n return methodResponse;\n }\n\n if ((isForceStatic || isDynamicError) && !isDraftMode) {\n setHeadersContext(\n createStaticGenerationHeadersContext({\n dynamicConfig,\n routeKind: \"page\",\n routePattern: route.pattern,\n }),\n );\n options.setNavigationContext({\n pathname: options.cleanPathname,\n searchParams: new URLSearchParams(),\n params: options.params,\n });\n }\n\n if (\n shouldReadAppPageCache({\n isDraftMode,\n isForceDynamic,\n isProgressiveActionRender: options.isProgressiveActionRender === true,\n isProduction: options.isProduction,\n isRscRequest: options.isRscRequest,\n revalidateSeconds: currentRevalidateSeconds,\n scriptNonce: options.scriptNonce,\n })\n ) {\n const cachedPageResponse = await readAppPageCacheResponse({\n cleanPathname: options.cleanPathname,\n clearRequestContext: options.clearRequestContext,\n isRscRequest: options.isRscRequest,\n isrDebug: options.isrDebug,\n isrGet: options.isrGet,\n isrHtmlKey: options.isrHtmlKey,\n isrRscKey: options.isrRscKey,\n isrSet: options.isrSet,\n middlewareHeaders: options.middlewareContext.headers,\n middlewareStatus: options.middlewareContext.status,\n mountedSlotsHeader: options.mountedSlotsHeader,\n renderMode: options.renderMode,\n expireSeconds: options.expireSeconds,\n // cacheLife-only routes discover their actual revalidate during the\n // fresh render; this seed only gets them into the cache read path.\n revalidateSeconds: currentRevalidateSeconds ?? 0,\n renderFreshPageForCache: async () =>\n runAppPageRevalidationContext(\n {\n cleanPathname: options.cleanPathname,\n currentFetchCacheMode: options.fetchCache ?? null,\n dynamicConfig,\n params: options.params,\n routePattern: route.pattern,\n routeSegments: route.routeSegments,\n setNavigationContext: options.setNavigationContext,\n },\n async () => {\n const revalidatedElement = await options.buildPageElement(\n route,\n options.params,\n undefined,\n new URLSearchParams(),\n );\n const revalidatedOnError = options.createRscOnErrorHandler(\n options.cleanPathname,\n route.pattern,\n );\n // No inner runWithFetchDedupe here: this renderFn is already\n // wrapped in runWithFetchDedupe by runAppPageRevalidationContext.\n const revalidatedRscStream = options.renderToReadableStream(revalidatedElement, {\n onError: revalidatedOnError,\n });\n const revalidatedRscCapture = teeAppPageRscStreamForCapture(revalidatedRscStream, true);\n const revalidatedSsrEntry = await options.loadSsrHandler();\n const revalidatedCapturedRscRef: { value: Promise<ArrayBuffer> | null } = {\n value: null,\n };\n const revalidatedHtmlStream = await revalidatedSsrEntry.handleSsr(\n revalidatedRscCapture.ssrStream,\n options.getNavigationContext(),\n {\n links: options.getFontLinks(),\n styles: options.getFontStyles(),\n preloads: options.getFontPreloads(),\n },\n {\n basePath: options.basePath,\n rootParams: options.rootParams,\n ...(revalidatedRscCapture.sideStream\n ? {\n sideStream: revalidatedRscCapture.sideStream,\n capturedRscDataRef: revalidatedCapturedRscRef,\n }\n : {}),\n },\n );\n const html = await readStreamAsText(revalidatedHtmlStream);\n const rscData = await getCapturedRscDataPromise(revalidatedCapturedRscRef.value);\n const cacheLife = _consumeRequestScopedCacheLife();\n options.clearRequestContext();\n const tags = buildAppPageTags(\n options.cleanPathname,\n getCollectedFetchTags(),\n route.routeSegments,\n );\n // Consume once: HTML and RSC artifacts are produced by the same\n // regeneration render and should carry the same observation set.\n const observationState = {\n dynamicFetches: consumeDynamicFetchObservations(),\n requestApis: consumeRenderRequestApiUsage(),\n };\n return {\n html,\n htmlRenderObservation: createAppPageRenderObservation({\n boundaryOutcome: { kind: \"success\" },\n cacheability: \"public\",\n cacheTags: tags,\n cleanPathname: options.cleanPathname,\n completeness: \"complete\",\n output: createAppPageHtmlOutputScope({\n element: revalidatedElement,\n renderEpoch: null,\n rootBoundaryId: null,\n routePattern: route.pattern,\n }),\n params: options.params,\n state: observationState,\n }),\n rscData,\n rscRenderObservation: createAppPageRenderObservation({\n boundaryOutcome: { kind: \"success\" },\n cacheability: \"public\",\n cacheTags: tags,\n cleanPathname: options.cleanPathname,\n completeness: \"complete\",\n output: createAppPageRscOutputScope({\n element: revalidatedElement,\n mountedSlotsHeader: options.mountedSlotsHeader,\n renderEpoch: null,\n rootBoundaryId: null,\n routePattern: route.pattern,\n }),\n params: options.params,\n state: observationState,\n }),\n tags,\n cacheControl:\n typeof cacheLife?.revalidate === \"number\"\n ? { revalidate: cacheLife.revalidate, expire: cacheLife.expire }\n : undefined,\n };\n },\n ),\n scheduleBackgroundRegeneration(key, renderFn) {\n options.scheduleBackgroundRegeneration(key, renderFn, {\n routerKind: \"App Router\",\n routePath: route.pattern,\n routeType: \"render\",\n });\n },\n });\n if (cachedPageResponse) {\n return cachedPageResponse;\n }\n }\n\n const dynamicParamsResponse = await validateAppPageDynamicParams({\n clearRequestContext: options.clearRequestContext,\n enforceStaticParamsOnly: options.dynamicParamsConfig === false,\n generateStaticParams: options.generateStaticParams,\n isDynamicRoute: route.isDynamic,\n params: options.params,\n });\n if (dynamicParamsResponse) {\n return dynamicParamsResponse;\n }\n\n const interceptResult = await resolveAppPageIntercept<\n TRoute,\n unknown,\n AppPageDispatchInterceptOptions,\n AppPageElement\n >({\n buildPageElement(interceptRoute, interceptParams, interceptOpts, interceptSearchParams) {\n setCurrentFetchCacheMode(options.resolveRouteFetchCacheMode?.(interceptRoute) ?? null);\n return options.buildPageElement(\n interceptRoute,\n interceptParams,\n interceptOpts,\n interceptSearchParams,\n );\n },\n cleanPathname: options.cleanPathname,\n currentRoute: route,\n findIntercept(pathname) {\n return options.findIntercept(pathname);\n },\n getRouteParamNames(sourceRoute) {\n return sourceRoute.params;\n },\n getSourceRoute(sourceRouteIndex) {\n return options.getSourceRoute(sourceRouteIndex);\n },\n isRscRequest: options.isRscRequest,\n renderInterceptResponse(sourceRoute, interceptElement) {\n const interceptOnError = options.createRscOnErrorHandler(\n options.cleanPathname,\n sourceRoute.pattern,\n );\n // No inner runWithFetchDedupe here: dispatchAppPage already activated\n // dedupe at line 294, and this callback runs inside dispatchAppPageInner.\n const interceptStream = options.renderToReadableStream(interceptElement, {\n onError: interceptOnError,\n });\n const interceptHeaders = new Headers({\n \"Content-Type\": VINEXT_RSC_CONTENT_TYPE,\n Vary: VINEXT_RSC_VARY_HEADER,\n });\n mergeMiddlewareResponseHeaders(interceptHeaders, options.middlewareContext.headers);\n applyRscCompatibilityIdHeader(interceptHeaders);\n return new Response(interceptStream, {\n status: options.middlewareContext.status ?? 200,\n headers: interceptHeaders,\n });\n },\n searchParams: options.searchParams,\n setNavigationContext: options.setNavigationContext,\n toInterceptOpts(intercept) {\n return toInterceptOptions(options.interceptionContext, intercept);\n },\n });\n if (interceptResult.response) {\n return interceptResult.response;\n }\n\n const pageBuildResult = await buildAppPageElement({\n buildPageElement() {\n if (options.actionFailed) {\n throw options.actionError;\n }\n return options.buildPageElement(\n route,\n options.params,\n interceptResult.interceptOpts,\n options.searchParams,\n );\n },\n renderErrorBoundaryPage(buildError) {\n return options.renderErrorBoundaryPage(buildError);\n },\n renderSpecialError(specialError) {\n return renderPageSpecialError(options, specialError);\n },\n resolveSpecialError: resolveAppPageSpecialError,\n });\n if (pageBuildResult.response) {\n return pageBuildResult.response;\n }\n\n return renderAppPageLifecycle({\n basePath: options.basePath,\n cleanPathname: options.cleanPathname,\n clearRequestContext: options.clearRequestContext,\n consumeDynamicUsage,\n consumeInvalidDynamicUsageError,\n consumeRenderObservationState() {\n return {\n dynamicFetches: consumeDynamicFetchObservations(),\n requestApis: consumeRenderRequestApiUsage(),\n };\n },\n createRscOnErrorHandler(pathname, routePath) {\n return options.createRscOnErrorHandler(pathname, routePath);\n },\n element: pageBuildResult.element,\n getDraftModeCookieHeader,\n getFontLinks: options.getFontLinks,\n getFontPreloads: options.getFontPreloads,\n getFontStyles: options.getFontStyles,\n getNavigationContext: options.getNavigationContext,\n getPageTags() {\n return buildAppPageTags(options.cleanPathname, getCollectedFetchTags(), route.routeSegments);\n },\n getRequestCacheLife() {\n return _consumeRequestScopedCacheLife();\n },\n peekRequestCacheLife() {\n return _peekRequestScopedCacheLife();\n },\n handlerStart: options.handlerStart,\n hasLoadingBoundary: shouldSuppressLoadingBoundaries(\n options.renderMode ?? APP_RSC_RENDER_MODE_NAVIGATION,\n )\n ? false\n : Boolean(route.loading?.default),\n formState: options.formState ?? null,\n isProgressiveActionRender: options.isProgressiveActionRender === true,\n isDynamicError,\n isDraftMode,\n isForceDynamic,\n isForceStatic,\n isPrerender: process.env.VINEXT_PRERENDER === \"1\",\n isProduction: options.isProduction,\n isRscRequest: options.isRscRequest,\n isrDebug: options.isrDebug,\n isrHtmlKey: options.isrHtmlKey,\n isrRscKey: options.isrRscKey,\n isrSet: options.isrSet,\n expireSeconds: options.expireSeconds,\n layoutCount: route.layouts.length,\n loadSsrHandler: options.loadSsrHandler,\n middlewareContext: options.middlewareContext,\n params: options.params,\n rootParams: options.rootParams,\n peekRenderObservationState() {\n return {\n dynamicFetches: peekDynamicFetchObservations(),\n requestApis: peekRenderRequestApiUsage(),\n };\n },\n probeLayoutAt(layoutIndex) {\n return options.probeLayoutAt(layoutIndex);\n },\n probePage() {\n return options.probePage();\n },\n classification: {\n getLayoutId(index) {\n const treePosition = route.layoutTreePositions?.[index] ?? 0;\n return AppElementsWire.encodeLayoutId(\n createAppPageTreePath([...route.routeSegments], treePosition),\n );\n },\n buildTimeClassifications: route.__buildTimeClassifications,\n buildTimeReasons: route.__buildTimeReasons,\n debugClassification: options.debugClassification,\n async runWithIsolatedDynamicScope(fn) {\n const priorDynamic = consumeDynamicUsage();\n try {\n const result = await fn();\n const dynamicDetected = consumeDynamicUsage();\n return { result, dynamicDetected };\n } finally {\n consumeDynamicUsage();\n if (priorDynamic) markDynamicUsage();\n }\n },\n },\n revalidateSeconds: currentRevalidateSeconds,\n mountedSlotsHeader: options.mountedSlotsHeader,\n renderMode: options.renderMode ?? APP_RSC_RENDER_MODE_NAVIGATION,\n renderErrorBoundaryResponse(renderError) {\n return options.renderErrorBoundaryPage(renderError);\n },\n renderLayoutSpecialError(specialError, layoutIndex) {\n return renderLayoutSpecialError(options, specialError, layoutIndex);\n },\n renderPageSpecialError(specialError) {\n return renderPageSpecialError(options, specialError);\n },\n renderToReadableStream: options.renderToReadableStream,\n routeHasLocalBoundary: Boolean(\n route.error?.default || route.errors?.some((errorModule) => errorModule?.default),\n ),\n routePattern: route.pattern,\n runWithSuppressedHookWarning(probe) {\n return options.runWithSuppressedHookWarning(probe);\n },\n scriptNonce: options.scriptNonce,\n waitUntil(cachePromise) {\n getRequestExecutionContext()?.waitUntil(cachePromise);\n },\n });\n}\n\n/**\n * Builds an RSC flight payload that encodes a redirect as a React error chunk.\n * We render a tiny element that immediately throws an `Error` whose `digest`\n * is the canonical `NEXT_REDIRECT;...` string. `renderToReadableStream`'s\n * `onError` returns that digest, react-server-dom-webpack serializes the\n * error into the stream, and the client's `RedirectErrorBoundary` decodes it\n * via `getURLFromRedirectError` / `getRedirectTypeFromError`.\n *\n * The thrown error's digest matches Next.js's well-known router error format,\n * so neither vinext's RSC error handler nor Next.js's reporter logs it as a\n * \"real\" server error. Mirrors `app-render.tsx generateDynamicFlightRenderResult`\n * where a redirect thrown during RSC rendering propagates through\n * `renderToFlightStream`'s `onError` callback into the flight payload.\n */\nfunction buildRscRedirectFlightStream<TRoute extends AppPageDispatchRoute>(\n options: DispatchAppPageOptions<TRoute>,\n digest: string,\n): ReadableStream<Uint8Array> {\n const throwingElement = React.createElement(function NextRedirectFlightThrower() {\n const err = new Error(\"NEXT_REDIRECT\") as Error & { digest: string };\n err.digest = digest;\n throw err;\n });\n\n return options.renderToReadableStream(throwingElement, {\n onError: () => digest,\n });\n}\n\nasync function renderLayoutSpecialError<TRoute extends AppPageDispatchRoute>(\n options: DispatchAppPageOptions<TRoute>,\n specialError: AppPageSpecialError,\n layoutIndex: number,\n): Promise<Response> {\n return buildAppPageSpecialErrorResponse({\n basePath: options.basePath,\n buildRscRedirectFlightStream: (rscOptions) =>\n buildRscRedirectFlightStream(options, rscOptions.digest),\n clearRequestContext: options.clearRequestContext,\n getAndClearPendingCookies,\n isRscRequest: options.isRscRequest,\n middlewareContext: options.middlewareContext,\n renderFallbackPage(statusCode) {\n const parentBoundary = resolveAppPageParentHttpAccessBoundaryModule({\n layoutIndex,\n rootForbiddenModule: options.rootForbiddenModule,\n rootNotFoundModule: options.rootNotFoundModule,\n rootUnauthorizedModule: options.rootUnauthorizedModule,\n routeForbiddenModules: options.route.forbiddens,\n routeNotFoundModules: options.route.notFounds,\n routeUnauthorizedModules: options.route.unauthorizeds,\n statusCode,\n })?.default;\n return options.renderHttpAccessFallbackPage(\n statusCode,\n {\n boundaryComponent: parentBoundary,\n layouts: options.route.layouts.slice(0, layoutIndex),\n matchedParams: options.params,\n },\n null,\n );\n },\n request: options.request,\n specialError,\n });\n}\n\nasync function renderPageSpecialError<TRoute extends AppPageDispatchRoute>(\n options: DispatchAppPageOptions<TRoute>,\n specialError: AppPageSpecialError,\n): Promise<Response> {\n return buildAppPageSpecialErrorResponse({\n basePath: options.basePath,\n buildRscRedirectFlightStream: (rscOptions) =>\n buildRscRedirectFlightStream(options, rscOptions.digest),\n clearRequestContext: options.clearRequestContext,\n getAndClearPendingCookies,\n isRscRequest: options.isRscRequest,\n middlewareContext: options.middlewareContext,\n renderFallbackPage(statusCode) {\n return options.renderHttpAccessFallbackPage(\n statusCode,\n { matchedParams: options.params },\n null,\n );\n },\n request: options.request,\n specialError,\n });\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"app-page-dispatch.js","names":[],"sources":["../../src/server/app-page-dispatch.ts"],"sourcesContent":["import React, { type ReactNode } from \"react\";\nimport type { ReactFormState } from \"react-dom/client\";\nimport type { ClassificationReason } from \"../build/layout-classification-types.js\";\nimport {\n _consumeRequestScopedCacheLife,\n _peekRequestScopedCacheLife,\n type CachedAppPageValue,\n} from \"vinext/shims/cache\";\nimport type { RootParams } from \"vinext/shims/root-params\";\nimport {\n consumeDynamicUsage,\n consumeInvalidDynamicUsageError,\n consumeRenderRequestApiUsage,\n getAndClearPendingCookies,\n getDraftModeCookieHeader,\n isDraftModeRequest,\n markDynamicUsage,\n peekRenderRequestApiUsage,\n setHeadersContext,\n} from \"vinext/shims/headers\";\nimport { getRequestExecutionContext } from \"vinext/shims/request-context\";\nimport { createRequestContext, runWithRequestContext } from \"vinext/shims/unified-request-context\";\nimport {\n ensureFetchPatch,\n consumeDynamicFetchObservations,\n type FetchCacheMode,\n getCollectedFetchTags,\n peekDynamicFetchObservations,\n runWithFetchDedupe,\n setCurrentFetchCacheMode,\n setCurrentFetchSoftTags,\n} from \"vinext/shims/fetch-cache\";\nimport { AppElementsWire, type AppOutgoingElements } from \"./app-elements.js\";\nimport { readAppPageCacheResponse } from \"./app-page-cache.js\";\nimport { resolveAppPageParentHttpAccessBoundaryModule } from \"./app-page-boundary.js\";\nimport { readStreamAsText } from \"../utils/text-stream.js\";\nimport {\n buildAppPageSpecialErrorResponse,\n resolveAppPageSpecialError,\n teeAppPageRscStreamForCapture,\n type AppPageFontPreload,\n type AppPageSpecialError,\n type LayoutClassificationOptions,\n} from \"./app-page-execution.js\";\nimport { resolveAppPageMethodResponse } from \"./app-page-method.js\";\nimport {\n buildAppPageElement,\n resolveAppPageIntercept,\n validateAppPageDynamicParams,\n type ValidateAppPageDynamicParamsOptions,\n} from \"./app-page-request.js\";\nimport { renderAppPageLifecycle } from \"./app-page-render.js\";\nimport {\n createAppPageHtmlOutputScope,\n createAppPageRenderObservation,\n createAppPageRscOutputScope,\n} from \"./app-page-render-observation.js\";\nimport {\n mergeMiddlewareResponseHeaders,\n type AppPageMiddlewareContext,\n} from \"./app-page-response.js\";\nimport {\n VINEXT_RSC_CONTENT_TYPE,\n VINEXT_RSC_VARY_HEADER,\n applyRscCompatibilityIdHeader,\n} from \"./app-rsc-cache-busting.js\";\nimport {\n APP_RSC_RENDER_MODE_NAVIGATION,\n shouldSuppressLoadingBoundaries,\n type AppRscRenderMode,\n} from \"./app-rsc-render-mode.js\";\nimport { createAppPageTreePath } from \"./app-page-route-wiring.js\";\nimport type { AppPageSsrHandler } from \"./app-page-stream.js\";\nimport { createStaticGenerationHeadersContext } from \"./app-static-generation.js\";\nimport { buildPageCacheTags } from \"./implicit-tags.js\";\nimport type { ISRCacheEntry } from \"./isr-cache.js\";\n\ntype AppPageParams = Record<string, string | string[]>;\ntype AppPageElement = ReactNode | Readonly<Record<string, ReactNode>>;\ntype AppPageRenderableElement = ReactNode | AppOutgoingElements;\ntype AppPageBoundaryOnError = (\n error: unknown,\n requestInfo: unknown,\n errorContext: unknown,\n) => unknown;\ntype AppPageDebugLogger = (event: string, detail: string) => void;\ntype AppPageCacheSetter = (\n key: string,\n data: CachedAppPageValue,\n revalidateSeconds: number,\n tags: string[],\n expireSeconds?: number,\n) => Promise<void>;\ntype AppPageCacheGetter = (key: string) => Promise<ISRCacheEntry | null>;\ntype AppPageBackgroundRegenerationErrorContext = {\n routerKind: \"App Router\";\n routePath: string;\n routeType: \"render\";\n};\ntype AppPageBackgroundRegenerator = (\n key: string,\n renderFn: () => Promise<void>,\n errorContext?: AppPageBackgroundRegenerationErrorContext,\n) => void;\n\ntype AppPageDispatchIntercept<TPage = unknown> = {\n interceptLayouts?: readonly AppPageModule[] | null;\n matchedParams: AppPageParams;\n page: TPage;\n slotId?: string | null;\n slotKey: string;\n sourceRouteIndex: number;\n};\n\ntype AppPageDispatchInterceptOptions<TPage = unknown> = {\n interceptionContext: string | null;\n interceptLayouts?: readonly AppPageModule[] | null;\n interceptPage: TPage;\n interceptParams: AppPageParams;\n interceptSlotId?: string | null;\n interceptSlotKey: string;\n interceptSourceMatchedUrl?: string | null;\n};\n\ntype AppPageModule = {\n default?: unknown;\n};\n\ntype AppPageDispatchRoute = {\n __buildTimeClassifications?: LayoutClassificationOptions[\"buildTimeClassifications\"];\n __buildTimeReasons?: LayoutClassificationOptions[\"buildTimeReasons\"];\n error?: AppPageModule | null;\n errors?: readonly (AppPageModule | null | undefined)[];\n forbiddens?: readonly (AppPageModule | null | undefined)[];\n isDynamic: boolean;\n layouts: readonly AppPageModule[];\n layoutTreePositions?: readonly number[];\n loading?: AppPageModule | null;\n notFounds?: readonly (AppPageModule | null | undefined)[];\n params: readonly string[];\n pattern: string;\n routeSegments: readonly string[];\n unauthorizeds?: readonly (AppPageModule | null | undefined)[];\n};\n\ntype DispatchAppPageOptions<TRoute extends AppPageDispatchRoute> = {\n /** Configured basePath (e.g. \"/blog\"). Used to prefix redirect Locations. */\n basePath?: string;\n buildPageElement: (\n route: TRoute,\n params: AppPageParams,\n opts: AppPageDispatchInterceptOptions | undefined,\n searchParams: URLSearchParams,\n ) => Promise<AppPageElement>;\n cleanPathname: string;\n clearRequestContext: () => void;\n createRscOnErrorHandler: (pathname: string, routePath: string) => AppPageBoundaryOnError;\n debugClassification?: (layoutId: string, reason: ClassificationReason) => void;\n draftModeSecret: string;\n dynamicConfig?: string;\n dynamicParamsConfig?: boolean;\n fetchCache?: FetchCacheMode | null;\n findIntercept: (pathname: string) => AppPageDispatchIntercept | null;\n formState?: ReactFormState | null;\n actionError?: unknown;\n actionFailed?: boolean;\n generateStaticParams?: ValidateAppPageDynamicParamsOptions[\"generateStaticParams\"];\n getFontLinks: () => string[];\n getFontPreloads: () => AppPageFontPreload[];\n getFontStyles: () => string[];\n getNavigationContext: () => unknown;\n getSourceRoute: (sourceRouteIndex: number) => TRoute | undefined;\n hasGenerateStaticParams: boolean;\n hasPageDefaultExport: boolean;\n hasPageModule: boolean;\n handlerStart: number;\n interceptionContext: string | null;\n isEdgeRuntime?: boolean;\n isProgressiveActionRender?: boolean;\n isProduction: boolean;\n isRscRequest: boolean;\n isrDebug?: AppPageDebugLogger;\n isrGet: AppPageCacheGetter;\n isrHtmlKey: (pathname: string) => string;\n isrRscKey: (\n pathname: string,\n mountedSlotsHeader?: string | null,\n renderMode?: AppRscRenderMode,\n ) => string;\n isrSet: AppPageCacheSetter;\n loadSsrHandler: () => Promise<AppPageSsrHandler>;\n middlewareContext: AppPageMiddlewareContext;\n mountedSlotsHeader?: string | null;\n params: AppPageParams;\n staticParamsValidationParams?: AppPageParams;\n rootParams?: RootParams;\n probeLayoutAt: (layoutIndex: number) => unknown;\n probePage: () => unknown;\n expireSeconds?: number;\n renderErrorBoundaryPage: (error: unknown) => Promise<Response | null>;\n renderHttpAccessFallbackPage: (\n statusCode: number,\n opts: {\n boundaryComponent?: unknown;\n layouts?: readonly AppPageModule[];\n matchedParams: AppPageParams;\n },\n middlewareContext: AppPageMiddlewareContext | null,\n ) => Promise<Response | null>;\n renderToReadableStream: (\n element: AppPageRenderableElement,\n options: { onError: AppPageBoundaryOnError },\n ) => ReadableStream<Uint8Array>;\n request: Request;\n revalidateSeconds: number | null;\n resolveRouteFetchCacheMode?: (route: TRoute) => FetchCacheMode | null;\n rootForbiddenModule?: AppPageModule | null;\n rootNotFoundModule?: AppPageModule | null;\n rootUnauthorizedModule?: AppPageModule | null;\n route: TRoute;\n runWithSuppressedHookWarning<T>(probe: () => Promise<T>): Promise<T>;\n scheduleBackgroundRegeneration: AppPageBackgroundRegenerator;\n scriptNonce?: string;\n searchParams: URLSearchParams;\n setNavigationContext: (context: {\n params: AppPageParams;\n pathname: string;\n searchParams: URLSearchParams;\n }) => void;\n renderMode?: AppRscRenderMode;\n};\n\nfunction shouldReadAppPageCache(options: {\n isProgressiveActionRender: boolean;\n isDraftMode: boolean;\n isForceDynamic: boolean;\n isProduction: boolean;\n isRscRequest: boolean;\n revalidateSeconds: number | null;\n scriptNonce?: string;\n}): boolean {\n return (\n options.isProduction &&\n !options.isProgressiveActionRender &&\n !options.isDraftMode &&\n !options.isForceDynamic &&\n (options.isRscRequest || !options.scriptNonce) &&\n (options.revalidateSeconds === null || options.revalidateSeconds > 0)\n );\n}\n\nfunction buildAppPageTags(\n cleanPathname: string,\n extraTags: string[],\n routeSegments: readonly string[],\n): string[] {\n return buildPageCacheTags(cleanPathname, extraTags, [...routeSegments], \"page\");\n}\n\nasync function runAppPageRevalidationContext<\n TResult extends {\n html: string;\n rscData: ArrayBuffer;\n tags: string[];\n },\n>(\n options: {\n cleanPathname: string;\n currentFetchCacheMode?: FetchCacheMode | null;\n draftModeSecret: string;\n dynamicConfig?: string;\n params: AppPageParams;\n routePattern: string;\n routeSegments: readonly string[];\n setNavigationContext: DispatchAppPageOptions<AppPageDispatchRoute>[\"setNavigationContext\"];\n },\n renderFn: () => Promise<TResult>,\n): Promise<TResult> {\n const headersContext = createStaticGenerationHeadersContext({\n draftModeSecret: options.draftModeSecret,\n dynamicConfig: options.dynamicConfig,\n routeKind: \"page\",\n routePattern: options.routePattern,\n });\n const requestContext = createRequestContext({\n headersContext,\n currentFetchCacheMode: options.currentFetchCacheMode ?? null,\n executionContext: getRequestExecutionContext(),\n unstableCacheRevalidation: \"foreground\",\n });\n\n return runWithRequestContext(requestContext, async () => {\n ensureFetchPatch();\n setCurrentFetchSoftTags(buildAppPageTags(options.cleanPathname, [], options.routeSegments));\n options.setNavigationContext({\n pathname: options.cleanPathname,\n searchParams: new URLSearchParams(),\n params: options.params,\n });\n return await runWithFetchDedupe(renderFn);\n });\n}\n\nfunction getCapturedRscDataPromise(\n capturedRscDataPromise: Promise<ArrayBuffer> | null,\n): Promise<ArrayBuffer> {\n if (!capturedRscDataPromise) {\n throw new Error(\n \"[vinext] Expected captured RSC data while regenerating an app page cache entry\",\n );\n }\n\n return capturedRscDataPromise;\n}\n\nfunction toInterceptOptions(\n interceptionContext: string | null,\n intercept: AppPageDispatchIntercept,\n): AppPageDispatchInterceptOptions {\n return {\n interceptionContext,\n interceptLayouts: intercept.interceptLayouts,\n interceptPage: intercept.page,\n interceptParams: intercept.matchedParams,\n interceptSlotId: intercept.slotId ?? null,\n interceptSlotKey: intercept.slotKey,\n interceptSourceMatchedUrl: interceptionContext,\n };\n}\n\nexport async function dispatchAppPage<TRoute extends AppPageDispatchRoute>(\n options: DispatchAppPageOptions<TRoute>,\n): Promise<Response> {\n return await runWithFetchDedupe(() => dispatchAppPageInner(options));\n}\n\nasync function dispatchAppPageInner<TRoute extends AppPageDispatchRoute>(\n options: DispatchAppPageOptions<TRoute>,\n): Promise<Response> {\n const route = options.route;\n const dynamicConfig = options.dynamicConfig;\n const currentRevalidateSeconds = options.revalidateSeconds;\n const isForceStatic = dynamicConfig === \"force-static\";\n const isDynamicError = dynamicConfig === \"error\";\n const isForceDynamic = dynamicConfig === \"force-dynamic\";\n const isDraftMode = isDraftModeRequest(options.request, options.draftModeSecret);\n\n setCurrentFetchSoftTags(buildAppPageTags(options.cleanPathname, [], route.routeSegments));\n setCurrentFetchCacheMode(options.fetchCache ?? null);\n\n if (options.hasPageModule && !options.hasPageDefaultExport) {\n options.clearRequestContext();\n return new Response(\"Page has no default export\", { status: 500 });\n }\n\n const methodResponse = resolveAppPageMethodResponse({\n dynamicConfig,\n hasGenerateStaticParams: options.hasGenerateStaticParams,\n isDynamicRoute: route.isDynamic,\n middlewareHeaders: options.middlewareContext.headers,\n request: options.request,\n revalidateSeconds: currentRevalidateSeconds,\n });\n if (methodResponse) {\n options.clearRequestContext();\n return methodResponse;\n }\n\n if ((isForceStatic || isDynamicError) && !isDraftMode) {\n setHeadersContext(\n createStaticGenerationHeadersContext({\n draftModeSecret: options.draftModeSecret,\n dynamicConfig,\n routeKind: \"page\",\n routePattern: route.pattern,\n }),\n );\n options.setNavigationContext({\n pathname: options.cleanPathname,\n searchParams: new URLSearchParams(),\n params: options.params,\n });\n }\n\n if (\n shouldReadAppPageCache({\n isDraftMode,\n isForceDynamic,\n isProgressiveActionRender: options.isProgressiveActionRender === true,\n isProduction: options.isProduction,\n isRscRequest: options.isRscRequest,\n revalidateSeconds: currentRevalidateSeconds,\n scriptNonce: options.scriptNonce,\n })\n ) {\n const cachedPageResponse = await readAppPageCacheResponse({\n cleanPathname: options.cleanPathname,\n clearRequestContext: options.clearRequestContext,\n isEdgeRuntime: options.isEdgeRuntime,\n isRscRequest: options.isRscRequest,\n isrDebug: options.isrDebug,\n isrGet: options.isrGet,\n isrHtmlKey: options.isrHtmlKey,\n isrRscKey: options.isrRscKey,\n isrSet: options.isrSet,\n middlewareHeaders: options.middlewareContext.headers,\n middlewareStatus: options.middlewareContext.status,\n mountedSlotsHeader: options.mountedSlotsHeader,\n renderMode: options.renderMode,\n expireSeconds: options.expireSeconds,\n // cacheLife-only routes discover their actual revalidate during the\n // fresh render; this seed only gets them into the cache read path.\n revalidateSeconds: currentRevalidateSeconds ?? 0,\n renderFreshPageForCache: async () =>\n runAppPageRevalidationContext(\n {\n cleanPathname: options.cleanPathname,\n currentFetchCacheMode: options.fetchCache ?? null,\n draftModeSecret: options.draftModeSecret,\n dynamicConfig,\n params: options.params,\n routePattern: route.pattern,\n routeSegments: route.routeSegments,\n setNavigationContext: options.setNavigationContext,\n },\n async () => {\n const revalidatedElement = await options.buildPageElement(\n route,\n options.params,\n undefined,\n new URLSearchParams(),\n );\n const revalidatedOnError = options.createRscOnErrorHandler(\n options.cleanPathname,\n route.pattern,\n );\n // No inner runWithFetchDedupe here: this renderFn is already\n // wrapped in runWithFetchDedupe by runAppPageRevalidationContext.\n const revalidatedRscStream = options.renderToReadableStream(revalidatedElement, {\n onError: revalidatedOnError,\n });\n const revalidatedRscCapture = teeAppPageRscStreamForCapture(revalidatedRscStream, true);\n const revalidatedSsrEntry = await options.loadSsrHandler();\n const revalidatedCapturedRscRef: { value: Promise<ArrayBuffer> | null } = {\n value: null,\n };\n const revalidatedHtmlStream = await revalidatedSsrEntry.handleSsr(\n revalidatedRscCapture.ssrStream,\n options.getNavigationContext(),\n {\n links: options.getFontLinks(),\n styles: options.getFontStyles(),\n preloads: options.getFontPreloads(),\n },\n {\n basePath: options.basePath,\n rootParams: options.rootParams,\n ...(revalidatedRscCapture.sideStream\n ? {\n sideStream: revalidatedRscCapture.sideStream,\n capturedRscDataRef: revalidatedCapturedRscRef,\n }\n : {}),\n },\n );\n const html = await readStreamAsText(revalidatedHtmlStream);\n const rscData = await getCapturedRscDataPromise(revalidatedCapturedRscRef.value);\n const cacheLife = _consumeRequestScopedCacheLife();\n options.clearRequestContext();\n const tags = buildAppPageTags(\n options.cleanPathname,\n getCollectedFetchTags(),\n route.routeSegments,\n );\n // Consume once: HTML and RSC artifacts are produced by the same\n // regeneration render and should carry the same observation set.\n const observationState = {\n dynamicFetches: consumeDynamicFetchObservations(),\n requestApis: consumeRenderRequestApiUsage(),\n };\n return {\n html,\n htmlRenderObservation: createAppPageRenderObservation({\n boundaryOutcome: { kind: \"success\" },\n cacheability: \"public\",\n cacheTags: tags,\n cleanPathname: options.cleanPathname,\n completeness: \"complete\",\n output: createAppPageHtmlOutputScope({\n element: revalidatedElement,\n renderEpoch: null,\n rootBoundaryId: null,\n routePattern: route.pattern,\n }),\n params: options.params,\n state: observationState,\n }),\n rscData,\n rscRenderObservation: createAppPageRenderObservation({\n boundaryOutcome: { kind: \"success\" },\n cacheability: \"public\",\n cacheTags: tags,\n cleanPathname: options.cleanPathname,\n completeness: \"complete\",\n output: createAppPageRscOutputScope({\n element: revalidatedElement,\n mountedSlotsHeader: options.mountedSlotsHeader,\n renderEpoch: null,\n rootBoundaryId: null,\n routePattern: route.pattern,\n }),\n params: options.params,\n state: observationState,\n }),\n tags,\n cacheControl:\n typeof cacheLife?.revalidate === \"number\"\n ? { revalidate: cacheLife.revalidate, expire: cacheLife.expire }\n : undefined,\n };\n },\n ),\n scheduleBackgroundRegeneration(key, renderFn) {\n options.scheduleBackgroundRegeneration(key, renderFn, {\n routerKind: \"App Router\",\n routePath: route.pattern,\n routeType: \"render\",\n });\n },\n });\n if (cachedPageResponse) {\n return cachedPageResponse;\n }\n }\n\n const dynamicParamsResponse = await validateAppPageDynamicParams({\n clearRequestContext: options.clearRequestContext,\n enforceStaticParamsOnly: options.dynamicParamsConfig === false,\n generateStaticParams: options.generateStaticParams,\n isDynamicRoute: route.isDynamic,\n params: options.staticParamsValidationParams ?? options.params,\n });\n if (dynamicParamsResponse) {\n return dynamicParamsResponse;\n }\n\n const interceptResult = await resolveAppPageIntercept<\n TRoute,\n unknown,\n AppPageDispatchInterceptOptions,\n AppPageElement\n >({\n buildPageElement(interceptRoute, interceptParams, interceptOpts, interceptSearchParams) {\n setCurrentFetchCacheMode(options.resolveRouteFetchCacheMode?.(interceptRoute) ?? null);\n return options.buildPageElement(\n interceptRoute,\n interceptParams,\n interceptOpts,\n interceptSearchParams,\n );\n },\n cleanPathname: options.cleanPathname,\n currentRoute: route,\n findIntercept(pathname) {\n return options.findIntercept(pathname);\n },\n getRouteParamNames(sourceRoute) {\n return sourceRoute.params;\n },\n getSourceRoute(sourceRouteIndex) {\n return options.getSourceRoute(sourceRouteIndex);\n },\n isRscRequest: options.isRscRequest,\n renderInterceptResponse(sourceRoute, interceptElement) {\n const interceptOnError = options.createRscOnErrorHandler(\n options.cleanPathname,\n sourceRoute.pattern,\n );\n // No inner runWithFetchDedupe here: dispatchAppPage already activated\n // dedupe at line 294, and this callback runs inside dispatchAppPageInner.\n const interceptStream = options.renderToReadableStream(interceptElement, {\n onError: interceptOnError,\n });\n const interceptHeaders = new Headers({\n \"Content-Type\": VINEXT_RSC_CONTENT_TYPE,\n Vary: VINEXT_RSC_VARY_HEADER,\n });\n mergeMiddlewareResponseHeaders(interceptHeaders, options.middlewareContext.headers);\n applyRscCompatibilityIdHeader(interceptHeaders);\n return new Response(interceptStream, {\n status: options.middlewareContext.status ?? 200,\n headers: interceptHeaders,\n });\n },\n searchParams: options.searchParams,\n setNavigationContext: options.setNavigationContext,\n toInterceptOpts(intercept) {\n return toInterceptOptions(options.interceptionContext, intercept);\n },\n });\n if (interceptResult.response) {\n return interceptResult.response;\n }\n\n const pageBuildResult = await buildAppPageElement({\n buildPageElement() {\n if (options.actionFailed) {\n throw options.actionError;\n }\n return options.buildPageElement(\n route,\n options.params,\n interceptResult.interceptOpts,\n options.searchParams,\n );\n },\n renderErrorBoundaryPage(buildError) {\n return options.renderErrorBoundaryPage(buildError);\n },\n renderSpecialError(specialError) {\n return renderPageSpecialError(options, specialError);\n },\n resolveSpecialError: resolveAppPageSpecialError,\n });\n if (pageBuildResult.response) {\n return pageBuildResult.response;\n }\n\n return renderAppPageLifecycle({\n basePath: options.basePath,\n cleanPathname: options.cleanPathname,\n clearRequestContext: options.clearRequestContext,\n consumeDynamicUsage,\n consumeInvalidDynamicUsageError,\n consumeRenderObservationState() {\n return {\n dynamicFetches: consumeDynamicFetchObservations(),\n requestApis: consumeRenderRequestApiUsage(),\n };\n },\n createRscOnErrorHandler(pathname, routePath) {\n return options.createRscOnErrorHandler(pathname, routePath);\n },\n element: pageBuildResult.element,\n getDraftModeCookieHeader,\n getFontLinks: options.getFontLinks,\n getFontPreloads: options.getFontPreloads,\n getFontStyles: options.getFontStyles,\n getNavigationContext: options.getNavigationContext,\n getPageTags() {\n return buildAppPageTags(options.cleanPathname, getCollectedFetchTags(), route.routeSegments);\n },\n getRequestCacheLife() {\n return _consumeRequestScopedCacheLife();\n },\n peekRequestCacheLife() {\n return _peekRequestScopedCacheLife();\n },\n handlerStart: options.handlerStart,\n hasLoadingBoundary: shouldSuppressLoadingBoundaries(\n options.renderMode ?? APP_RSC_RENDER_MODE_NAVIGATION,\n )\n ? false\n : Boolean(route.loading?.default),\n formState: options.formState ?? null,\n isProgressiveActionRender: options.isProgressiveActionRender === true,\n isDynamicError,\n isDraftMode,\n isForceDynamic,\n isForceStatic,\n isEdgeRuntime: options.isEdgeRuntime === true,\n isPrerender: process.env.VINEXT_PRERENDER === \"1\",\n isProduction: options.isProduction,\n isRscRequest: options.isRscRequest,\n isrDebug: options.isrDebug,\n isrHtmlKey: options.isrHtmlKey,\n isrRscKey: options.isrRscKey,\n isrSet: options.isrSet,\n expireSeconds: options.expireSeconds,\n layoutCount: route.layouts.length,\n loadSsrHandler: options.loadSsrHandler,\n middlewareContext: options.middlewareContext,\n params: options.params,\n rootParams: options.rootParams,\n peekRenderObservationState() {\n return {\n dynamicFetches: peekDynamicFetchObservations(),\n requestApis: peekRenderRequestApiUsage(),\n };\n },\n probeLayoutAt(layoutIndex) {\n return options.probeLayoutAt(layoutIndex);\n },\n probePage() {\n return options.probePage();\n },\n classification: {\n getLayoutId(index) {\n const treePosition = route.layoutTreePositions?.[index] ?? 0;\n return AppElementsWire.encodeLayoutId(\n createAppPageTreePath([...route.routeSegments], treePosition),\n );\n },\n buildTimeClassifications: route.__buildTimeClassifications,\n buildTimeReasons: route.__buildTimeReasons,\n debugClassification: options.debugClassification,\n async runWithIsolatedDynamicScope(fn) {\n const priorDynamic = consumeDynamicUsage();\n try {\n const result = await fn();\n const dynamicDetected = consumeDynamicUsage();\n return { result, dynamicDetected };\n } finally {\n consumeDynamicUsage();\n if (priorDynamic) markDynamicUsage();\n }\n },\n },\n revalidateSeconds: currentRevalidateSeconds,\n mountedSlotsHeader: options.mountedSlotsHeader,\n renderMode: options.renderMode ?? APP_RSC_RENDER_MODE_NAVIGATION,\n renderErrorBoundaryResponse(renderError) {\n return options.renderErrorBoundaryPage(renderError);\n },\n renderLayoutSpecialError(specialError, layoutIndex) {\n return renderLayoutSpecialError(options, specialError, layoutIndex);\n },\n renderPageSpecialError(specialError) {\n return renderPageSpecialError(options, specialError);\n },\n renderToReadableStream: options.renderToReadableStream,\n routeHasLocalBoundary: Boolean(\n route.error?.default || route.errors?.some((errorModule) => errorModule?.default),\n ),\n routePattern: route.pattern,\n runWithSuppressedHookWarning(probe) {\n return options.runWithSuppressedHookWarning(probe);\n },\n scriptNonce: options.scriptNonce,\n waitUntil(cachePromise) {\n getRequestExecutionContext()?.waitUntil(cachePromise);\n },\n });\n}\n\n/**\n * Builds an RSC flight payload that encodes a redirect as a React error chunk.\n * We render a tiny element that immediately throws an `Error` whose `digest`\n * is the canonical `NEXT_REDIRECT;...` string. `renderToReadableStream`'s\n * `onError` returns that digest, react-server-dom-webpack serializes the\n * error into the stream, and the client's `RedirectErrorBoundary` decodes it\n * via `getURLFromRedirectError` / `getRedirectTypeFromError`.\n *\n * The thrown error's digest matches Next.js's well-known router error format,\n * so neither vinext's RSC error handler nor Next.js's reporter logs it as a\n * \"real\" server error. Mirrors `app-render.tsx generateDynamicFlightRenderResult`\n * where a redirect thrown during RSC rendering propagates through\n * `renderToFlightStream`'s `onError` callback into the flight payload.\n */\nfunction buildRscRedirectFlightStream<TRoute extends AppPageDispatchRoute>(\n options: DispatchAppPageOptions<TRoute>,\n digest: string,\n): ReadableStream<Uint8Array> {\n const throwingElement = React.createElement(function NextRedirectFlightThrower() {\n const err = new Error(\"NEXT_REDIRECT\") as Error & { digest: string };\n err.digest = digest;\n throw err;\n });\n\n return options.renderToReadableStream(throwingElement, {\n onError: () => digest,\n });\n}\n\nasync function renderLayoutSpecialError<TRoute extends AppPageDispatchRoute>(\n options: DispatchAppPageOptions<TRoute>,\n specialError: AppPageSpecialError,\n layoutIndex: number,\n): Promise<Response> {\n return buildAppPageSpecialErrorResponse({\n basePath: options.basePath,\n buildRscRedirectFlightStream: (rscOptions) =>\n buildRscRedirectFlightStream(options, rscOptions.digest),\n clearRequestContext: options.clearRequestContext,\n getAndClearPendingCookies,\n isEdgeRuntime: options.isEdgeRuntime,\n isRscRequest: options.isRscRequest,\n middlewareContext: options.middlewareContext,\n renderFallbackPage(statusCode) {\n const parentBoundary = resolveAppPageParentHttpAccessBoundaryModule({\n layoutIndex,\n rootForbiddenModule: options.rootForbiddenModule,\n rootNotFoundModule: options.rootNotFoundModule,\n rootUnauthorizedModule: options.rootUnauthorizedModule,\n routeForbiddenModules: options.route.forbiddens,\n routeNotFoundModules: options.route.notFounds,\n routeUnauthorizedModules: options.route.unauthorizeds,\n statusCode,\n })?.default;\n return options.renderHttpAccessFallbackPage(\n statusCode,\n {\n boundaryComponent: parentBoundary,\n layouts: options.route.layouts.slice(0, layoutIndex),\n matchedParams: options.params,\n },\n null,\n );\n },\n request: options.request,\n specialError,\n });\n}\n\nasync function renderPageSpecialError<TRoute extends AppPageDispatchRoute>(\n options: DispatchAppPageOptions<TRoute>,\n specialError: AppPageSpecialError,\n): Promise<Response> {\n return buildAppPageSpecialErrorResponse({\n basePath: options.basePath,\n buildRscRedirectFlightStream: (rscOptions) =>\n buildRscRedirectFlightStream(options, rscOptions.digest),\n clearRequestContext: options.clearRequestContext,\n getAndClearPendingCookies,\n isEdgeRuntime: options.isEdgeRuntime,\n isRscRequest: options.isRscRequest,\n middlewareContext: options.middlewareContext,\n renderFallbackPage(statusCode) {\n return options.renderHttpAccessFallbackPage(\n statusCode,\n { matchedParams: options.params },\n null,\n );\n },\n request: options.request,\n specialError,\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAwOA,SAAS,uBAAuB,SAQpB;CACV,OACE,QAAQ,gBACR,CAAC,QAAQ,6BACT,CAAC,QAAQ,eACT,CAAC,QAAQ,mBACR,QAAQ,gBAAgB,CAAC,QAAQ,iBACjC,QAAQ,sBAAsB,QAAQ,QAAQ,oBAAoB;;AAIvE,SAAS,iBACP,eACA,WACA,eACU;CACV,OAAO,mBAAmB,eAAe,WAAW,CAAC,GAAG,cAAc,EAAE,OAAO;;AAGjF,eAAe,8BAOb,SAUA,UACkB;CAclB,OAAO,sBAPgB,qBAAqB;EAC1C,gBAPqB,qCAAqC;GAC1D,iBAAiB,QAAQ;GACzB,eAAe,QAAQ;GACvB,WAAW;GACX,cAAc,QAAQ;GACvB,CAEe;EACd,uBAAuB,QAAQ,yBAAyB;EACxD,kBAAkB,4BAA4B;EAC9C,2BAA2B;EAC5B,CAE0C,EAAE,YAAY;EACvD,kBAAkB;EAClB,wBAAwB,iBAAiB,QAAQ,eAAe,EAAE,EAAE,QAAQ,cAAc,CAAC;EAC3F,QAAQ,qBAAqB;GAC3B,UAAU,QAAQ;GAClB,cAAc,IAAI,iBAAiB;GACnC,QAAQ,QAAQ;GACjB,CAAC;EACF,OAAO,MAAM,mBAAmB,SAAS;GACzC;;AAGJ,SAAS,0BACP,wBACsB;CACtB,IAAI,CAAC,wBACH,MAAM,IAAI,MACR,iFACD;CAGH,OAAO;;AAGT,SAAS,mBACP,qBACA,WACiC;CACjC,OAAO;EACL;EACA,kBAAkB,UAAU;EAC5B,eAAe,UAAU;EACzB,iBAAiB,UAAU;EAC3B,iBAAiB,UAAU,UAAU;EACrC,kBAAkB,UAAU;EAC5B,2BAA2B;EAC5B;;AAGH,eAAsB,gBACpB,SACmB;CACnB,OAAO,MAAM,yBAAyB,qBAAqB,QAAQ,CAAC;;AAGtE,eAAe,qBACb,SACmB;CACnB,MAAM,QAAQ,QAAQ;CACtB,MAAM,gBAAgB,QAAQ;CAC9B,MAAM,2BAA2B,QAAQ;CACzC,MAAM,gBAAgB,kBAAkB;CACxC,MAAM,iBAAiB,kBAAkB;CACzC,MAAM,iBAAiB,kBAAkB;CACzC,MAAM,cAAc,mBAAmB,QAAQ,SAAS,QAAQ,gBAAgB;CAEhF,wBAAwB,iBAAiB,QAAQ,eAAe,EAAE,EAAE,MAAM,cAAc,CAAC;CACzF,yBAAyB,QAAQ,cAAc,KAAK;CAEpD,IAAI,QAAQ,iBAAiB,CAAC,QAAQ,sBAAsB;EAC1D,QAAQ,qBAAqB;EAC7B,OAAO,IAAI,SAAS,8BAA8B,EAAE,QAAQ,KAAK,CAAC;;CAGpE,MAAM,iBAAiB,6BAA6B;EAClD;EACA,yBAAyB,QAAQ;EACjC,gBAAgB,MAAM;EACtB,mBAAmB,QAAQ,kBAAkB;EAC7C,SAAS,QAAQ;EACjB,mBAAmB;EACpB,CAAC;CACF,IAAI,gBAAgB;EAClB,QAAQ,qBAAqB;EAC7B,OAAO;;CAGT,KAAK,iBAAiB,mBAAmB,CAAC,aAAa;EACrD,kBACE,qCAAqC;GACnC,iBAAiB,QAAQ;GACzB;GACA,WAAW;GACX,cAAc,MAAM;GACrB,CAAC,CACH;EACD,QAAQ,qBAAqB;GAC3B,UAAU,QAAQ;GAClB,cAAc,IAAI,iBAAiB;GACnC,QAAQ,QAAQ;GACjB,CAAC;;CAGJ,IACE,uBAAuB;EACrB;EACA;EACA,2BAA2B,QAAQ,8BAA8B;EACjE,cAAc,QAAQ;EACtB,cAAc,QAAQ;EACtB,mBAAmB;EACnB,aAAa,QAAQ;EACtB,CAAC,EACF;EACA,MAAM,qBAAqB,MAAM,yBAAyB;GACxD,eAAe,QAAQ;GACvB,qBAAqB,QAAQ;GAC7B,eAAe,QAAQ;GACvB,cAAc,QAAQ;GACtB,UAAU,QAAQ;GAClB,QAAQ,QAAQ;GAChB,YAAY,QAAQ;GACpB,WAAW,QAAQ;GACnB,QAAQ,QAAQ;GAChB,mBAAmB,QAAQ,kBAAkB;GAC7C,kBAAkB,QAAQ,kBAAkB;GAC5C,oBAAoB,QAAQ;GAC5B,YAAY,QAAQ;GACpB,eAAe,QAAQ;GAGvB,mBAAmB,4BAA4B;GAC/C,yBAAyB,YACvB,8BACE;IACE,eAAe,QAAQ;IACvB,uBAAuB,QAAQ,cAAc;IAC7C,iBAAiB,QAAQ;IACzB;IACA,QAAQ,QAAQ;IAChB,cAAc,MAAM;IACpB,eAAe,MAAM;IACrB,sBAAsB,QAAQ;IAC/B,EACD,YAAY;IACV,MAAM,qBAAqB,MAAM,QAAQ,iBACvC,OACA,QAAQ,QACR,KAAA,GACA,IAAI,iBAAiB,CACtB;IACD,MAAM,qBAAqB,QAAQ,wBACjC,QAAQ,eACR,MAAM,QACP;IAMD,MAAM,wBAAwB,8BAHD,QAAQ,uBAAuB,oBAAoB,EAC9E,SAAS,oBACV,CAC+E,EAAE,KAAK;IACvF,MAAM,sBAAsB,MAAM,QAAQ,gBAAgB;IAC1D,MAAM,4BAAoE,EACxE,OAAO,MACR;IAoBD,MAAM,OAAO,MAAM,iBAAiB,MAnBA,oBAAoB,UACtD,sBAAsB,WACtB,QAAQ,sBAAsB,EAC9B;KACE,OAAO,QAAQ,cAAc;KAC7B,QAAQ,QAAQ,eAAe;KAC/B,UAAU,QAAQ,iBAAiB;KACpC,EACD;KACE,UAAU,QAAQ;KAClB,YAAY,QAAQ;KACpB,GAAI,sBAAsB,aACtB;MACE,YAAY,sBAAsB;MAClC,oBAAoB;MACrB,GACD,EAAE;KACP,CACF,CACyD;IAC1D,MAAM,UAAU,MAAM,0BAA0B,0BAA0B,MAAM;IAChF,MAAM,YAAY,gCAAgC;IAClD,QAAQ,qBAAqB;IAC7B,MAAM,OAAO,iBACX,QAAQ,eACR,uBAAuB,EACvB,MAAM,cACP;IAGD,MAAM,mBAAmB;KACvB,gBAAgB,iCAAiC;KACjD,aAAa,8BAA8B;KAC5C;IACD,OAAO;KACL;KACA,uBAAuB,+BAA+B;MACpD,iBAAiB,EAAE,MAAM,WAAW;MACpC,cAAc;MACd,WAAW;MACX,eAAe,QAAQ;MACvB,cAAc;MACd,QAAQ,6BAA6B;OACnC,SAAS;OACT,aAAa;OACb,gBAAgB;OAChB,cAAc,MAAM;OACrB,CAAC;MACF,QAAQ,QAAQ;MAChB,OAAO;MACR,CAAC;KACF;KACA,sBAAsB,+BAA+B;MACnD,iBAAiB,EAAE,MAAM,WAAW;MACpC,cAAc;MACd,WAAW;MACX,eAAe,QAAQ;MACvB,cAAc;MACd,QAAQ,4BAA4B;OAClC,SAAS;OACT,oBAAoB,QAAQ;OAC5B,aAAa;OACb,gBAAgB;OAChB,cAAc,MAAM;OACrB,CAAC;MACF,QAAQ,QAAQ;MAChB,OAAO;MACR,CAAC;KACF;KACA,cACE,OAAO,WAAW,eAAe,WAC7B;MAAE,YAAY,UAAU;MAAY,QAAQ,UAAU;MAAQ,GAC9D,KAAA;KACP;KAEJ;GACH,+BAA+B,KAAK,UAAU;IAC5C,QAAQ,+BAA+B,KAAK,UAAU;KACpD,YAAY;KACZ,WAAW,MAAM;KACjB,WAAW;KACZ,CAAC;;GAEL,CAAC;EACF,IAAI,oBACF,OAAO;;CAIX,MAAM,wBAAwB,MAAM,6BAA6B;EAC/D,qBAAqB,QAAQ;EAC7B,yBAAyB,QAAQ,wBAAwB;EACzD,sBAAsB,QAAQ;EAC9B,gBAAgB,MAAM;EACtB,QAAQ,QAAQ,gCAAgC,QAAQ;EACzD,CAAC;CACF,IAAI,uBACF,OAAO;CAGT,MAAM,kBAAkB,MAAM,wBAK5B;EACA,iBAAiB,gBAAgB,iBAAiB,eAAe,uBAAuB;GACtF,yBAAyB,QAAQ,6BAA6B,eAAe,IAAI,KAAK;GACtF,OAAO,QAAQ,iBACb,gBACA,iBACA,eACA,sBACD;;EAEH,eAAe,QAAQ;EACvB,cAAc;EACd,cAAc,UAAU;GACtB,OAAO,QAAQ,cAAc,SAAS;;EAExC,mBAAmB,aAAa;GAC9B,OAAO,YAAY;;EAErB,eAAe,kBAAkB;GAC/B,OAAO,QAAQ,eAAe,iBAAiB;;EAEjD,cAAc,QAAQ;EACtB,wBAAwB,aAAa,kBAAkB;GACrD,MAAM,mBAAmB,QAAQ,wBAC/B,QAAQ,eACR,YAAY,QACb;GAGD,MAAM,kBAAkB,QAAQ,uBAAuB,kBAAkB,EACvE,SAAS,kBACV,CAAC;GACF,MAAM,mBAAmB,IAAI,QAAQ;IACnC,gBAAgB;IAChB,MAAM;IACP,CAAC;GACF,+BAA+B,kBAAkB,QAAQ,kBAAkB,QAAQ;GACnF,8BAA8B,iBAAiB;GAC/C,OAAO,IAAI,SAAS,iBAAiB;IACnC,QAAQ,QAAQ,kBAAkB,UAAU;IAC5C,SAAS;IACV,CAAC;;EAEJ,cAAc,QAAQ;EACtB,sBAAsB,QAAQ;EAC9B,gBAAgB,WAAW;GACzB,OAAO,mBAAmB,QAAQ,qBAAqB,UAAU;;EAEpE,CAAC;CACF,IAAI,gBAAgB,UAClB,OAAO,gBAAgB;CAGzB,MAAM,kBAAkB,MAAM,oBAAoB;EAChD,mBAAmB;GACjB,IAAI,QAAQ,cACV,MAAM,QAAQ;GAEhB,OAAO,QAAQ,iBACb,OACA,QAAQ,QACR,gBAAgB,eAChB,QAAQ,aACT;;EAEH,wBAAwB,YAAY;GAClC,OAAO,QAAQ,wBAAwB,WAAW;;EAEpD,mBAAmB,cAAc;GAC/B,OAAO,uBAAuB,SAAS,aAAa;;EAEtD,qBAAqB;EACtB,CAAC;CACF,IAAI,gBAAgB,UAClB,OAAO,gBAAgB;CAGzB,OAAO,uBAAuB;EAC5B,UAAU,QAAQ;EAClB,eAAe,QAAQ;EACvB,qBAAqB,QAAQ;EAC7B;EACA;EACA,gCAAgC;GAC9B,OAAO;IACL,gBAAgB,iCAAiC;IACjD,aAAa,8BAA8B;IAC5C;;EAEH,wBAAwB,UAAU,WAAW;GAC3C,OAAO,QAAQ,wBAAwB,UAAU,UAAU;;EAE7D,SAAS,gBAAgB;EACzB;EACA,cAAc,QAAQ;EACtB,iBAAiB,QAAQ;EACzB,eAAe,QAAQ;EACvB,sBAAsB,QAAQ;EAC9B,cAAc;GACZ,OAAO,iBAAiB,QAAQ,eAAe,uBAAuB,EAAE,MAAM,cAAc;;EAE9F,sBAAsB;GACpB,OAAO,gCAAgC;;EAEzC,uBAAuB;GACrB,OAAO,6BAA6B;;EAEtC,cAAc,QAAQ;EACtB,oBAAoB,gCAClB,QAAQ,cAAA,aACT,GACG,QACA,QAAQ,MAAM,SAAS,QAAQ;EACnC,WAAW,QAAQ,aAAa;EAChC,2BAA2B,QAAQ,8BAA8B;EACjE;EACA;EACA;EACA;EACA,eAAe,QAAQ,kBAAkB;EACzC,aAAa,QAAQ,IAAI,qBAAqB;EAC9C,cAAc,QAAQ;EACtB,cAAc,QAAQ;EACtB,UAAU,QAAQ;EAClB,YAAY,QAAQ;EACpB,WAAW,QAAQ;EACnB,QAAQ,QAAQ;EAChB,eAAe,QAAQ;EACvB,aAAa,MAAM,QAAQ;EAC3B,gBAAgB,QAAQ;EACxB,mBAAmB,QAAQ;EAC3B,QAAQ,QAAQ;EAChB,YAAY,QAAQ;EACpB,6BAA6B;GAC3B,OAAO;IACL,gBAAgB,8BAA8B;IAC9C,aAAa,2BAA2B;IACzC;;EAEH,cAAc,aAAa;GACzB,OAAO,QAAQ,cAAc,YAAY;;EAE3C,YAAY;GACV,OAAO,QAAQ,WAAW;;EAE5B,gBAAgB;GACd,YAAY,OAAO;IACjB,MAAM,eAAe,MAAM,sBAAsB,UAAU;IAC3D,OAAO,gBAAgB,eACrB,sBAAsB,CAAC,GAAG,MAAM,cAAc,EAAE,aAAa,CAC9D;;GAEH,0BAA0B,MAAM;GAChC,kBAAkB,MAAM;GACxB,qBAAqB,QAAQ;GAC7B,MAAM,4BAA4B,IAAI;IACpC,MAAM,eAAe,qBAAqB;IAC1C,IAAI;KAGF,OAAO;MAAE,QAAA,MAFY,IAAI;MAER,iBADO,qBACQ;MAAE;cAC1B;KACR,qBAAqB;KACrB,IAAI,cAAc,kBAAkB;;;GAGzC;EACD,mBAAmB;EACnB,oBAAoB,QAAQ;EAC5B,YAAY,QAAQ,cAAA;EACpB,4BAA4B,aAAa;GACvC,OAAO,QAAQ,wBAAwB,YAAY;;EAErD,yBAAyB,cAAc,aAAa;GAClD,OAAO,yBAAyB,SAAS,cAAc,YAAY;;EAErE,uBAAuB,cAAc;GACnC,OAAO,uBAAuB,SAAS,aAAa;;EAEtD,wBAAwB,QAAQ;EAChC,uBAAuB,QACrB,MAAM,OAAO,WAAW,MAAM,QAAQ,MAAM,gBAAgB,aAAa,QAAQ,CAClF;EACD,cAAc,MAAM;EACpB,6BAA6B,OAAO;GAClC,OAAO,QAAQ,6BAA6B,MAAM;;EAEpD,aAAa,QAAQ;EACrB,UAAU,cAAc;GACtB,4BAA4B,EAAE,UAAU,aAAa;;EAExD,CAAC;;;;;;;;;;;;;;;;AAiBJ,SAAS,6BACP,SACA,QAC4B;CAC5B,MAAM,kBAAkB,MAAM,cAAc,SAAS,4BAA4B;EAC/E,MAAM,sBAAM,IAAI,MAAM,gBAAgB;EACtC,IAAI,SAAS;EACb,MAAM;GACN;CAEF,OAAO,QAAQ,uBAAuB,iBAAiB,EACrD,eAAe,QAChB,CAAC;;AAGJ,eAAe,yBACb,SACA,cACA,aACmB;CACnB,OAAO,iCAAiC;EACtC,UAAU,QAAQ;EAClB,+BAA+B,eAC7B,6BAA6B,SAAS,WAAW,OAAO;EAC1D,qBAAqB,QAAQ;EAC7B;EACA,eAAe,QAAQ;EACvB,cAAc,QAAQ;EACtB,mBAAmB,QAAQ;EAC3B,mBAAmB,YAAY;GAC7B,MAAM,iBAAiB,6CAA6C;IAClE;IACA,qBAAqB,QAAQ;IAC7B,oBAAoB,QAAQ;IAC5B,wBAAwB,QAAQ;IAChC,uBAAuB,QAAQ,MAAM;IACrC,sBAAsB,QAAQ,MAAM;IACpC,0BAA0B,QAAQ,MAAM;IACxC;IACD,CAAC,EAAE;GACJ,OAAO,QAAQ,6BACb,YACA;IACE,mBAAmB;IACnB,SAAS,QAAQ,MAAM,QAAQ,MAAM,GAAG,YAAY;IACpD,eAAe,QAAQ;IACxB,EACD,KACD;;EAEH,SAAS,QAAQ;EACjB;EACD,CAAC;;AAGJ,eAAe,uBACb,SACA,cACmB;CACnB,OAAO,iCAAiC;EACtC,UAAU,QAAQ;EAClB,+BAA+B,eAC7B,6BAA6B,SAAS,WAAW,OAAO;EAC1D,qBAAqB,QAAQ;EAC7B;EACA,eAAe,QAAQ;EACvB,cAAc,QAAQ;EACtB,mBAAmB,QAAQ;EAC3B,mBAAmB,YAAY;GAC7B,OAAO,QAAQ,6BACb,YACA,EAAE,eAAe,QAAQ,QAAQ,EACjC,KACD;;EAEH,SAAS,QAAQ;EACjB;EACD,CAAC"}
|
|
@@ -46,7 +46,8 @@ type BuildPageElementsOptions<TModule extends AppPageModule = AppPageModule, TEr
|
|
|
46
46
|
* Configured next.config `basePath`. Threaded through `resolveAppPageHead`
|
|
47
47
|
* so file-based metadata route URLs emitted in <head> are prefixed.
|
|
48
48
|
*/
|
|
49
|
-
basePath?: string;
|
|
49
|
+
basePath?: string; /** Serialized next.config `htmlLimitedBots` regexp source. */
|
|
50
|
+
htmlLimitedBots?: string;
|
|
50
51
|
};
|
|
51
52
|
/**
|
|
52
53
|
* Build the App Router element tree for a matched route.
|