vinext 0.1.7 → 0.2.0
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 +51 -30
- package/dist/build/inject-pregenerated-paths.d.ts +4 -0
- package/dist/build/inject-pregenerated-paths.js +18 -0
- package/dist/build/layout-classification.js +1 -1
- package/dist/build/nitro-route-rules.js +1 -1
- package/dist/build/pages-client-assets-module.d.ts +11 -0
- package/dist/build/pages-client-assets-module.js +27 -0
- package/dist/build/prerender.d.ts +2 -1
- package/dist/build/prerender.js +13 -6
- package/dist/build/report.d.ts +13 -2
- package/dist/build/report.js +99 -2
- package/dist/build/run-prerender.d.ts +7 -0
- package/dist/build/run-prerender.js +10 -1
- package/dist/build/standalone.js +2 -0
- package/dist/cache/cache-adapters-virtual.js +3 -3
- package/dist/check.d.ts +18 -0
- package/dist/check.js +77 -19
- package/dist/cli-args.d.ts +1 -2
- package/dist/cli-args.js +1 -1
- package/dist/cli-dev-config.d.ts +12 -0
- package/dist/cli-dev-config.js +23 -0
- package/dist/cli.js +113 -97
- package/dist/{server → client}/dev-error-overlay-store.d.ts +1 -1
- package/dist/{server → client}/dev-error-overlay-store.js +1 -1
- package/dist/{server → client}/dev-error-overlay.d.ts +1 -1
- package/dist/{server → client}/dev-error-overlay.js +2 -2
- package/dist/client/navigation-runtime.d.ts +2 -0
- package/dist/client/navigation-runtime.js +3 -1
- package/dist/client/window-next.d.ts +2 -1
- package/dist/cloudflare/index.d.ts +2 -2
- package/dist/cloudflare/index.js +2 -2
- package/dist/config/config-matchers.js +14 -10
- package/dist/config/next-config.d.ts +6 -3
- package/dist/config/next-config.js +47 -1
- package/dist/config/prerender.d.ts +34 -0
- package/dist/config/prerender.js +55 -0
- package/dist/config/server-external-packages.d.ts +4 -0
- package/dist/config/server-external-packages.js +91 -0
- package/dist/entries/app-rsc-entry.d.ts +2 -1
- package/dist/entries/app-rsc-entry.js +89 -15
- package/dist/entries/app-rsc-manifest.js +10 -0
- package/dist/entries/pages-client-entry.d.ts +3 -0
- package/dist/entries/pages-client-entry.js +16 -1
- package/dist/entries/pages-server-entry.js +6 -2
- package/dist/image/image-adapters-virtual.d.ts +59 -0
- package/dist/image/image-adapters-virtual.js +59 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.js +211 -118
- package/dist/init-cloudflare.d.ts +43 -0
- package/dist/init-cloudflare.js +839 -0
- package/dist/init-platform.d.ts +40 -0
- package/dist/init-platform.js +195 -0
- package/dist/init.d.ts +16 -38
- package/dist/init.js +208 -97
- package/dist/node_modules/.pnpm/am-i-vibing@0.5.0/node_modules/am-i-vibing/dist/detector-1yx2Hoe0.js +294 -0
- package/dist/node_modules/.pnpm/process-ancestry@0.1.0/node_modules/process-ancestry/dist/index.js +94 -0
- package/dist/{cloudflare → packages/cloudflare}/src/cache/cdn-adapter.runtime.js +1 -1
- package/dist/{cloudflare → packages/cloudflare}/src/cache/kv-data-adapter.runtime.d.ts +2 -2
- package/dist/{cloudflare → packages/cloudflare}/src/cache/kv-data-adapter.runtime.js +1 -1
- package/dist/packages/cloudflare/src/deploy-config.js +150 -0
- package/dist/packages/cloudflare/src/deploy-help.js +55 -0
- package/dist/packages/cloudflare/src/deploy.js +276 -0
- package/dist/{cloudflare → packages/cloudflare/src}/tpr.d.ts +4 -41
- package/dist/{cloudflare → packages/cloudflare/src}/tpr.js +18 -15
- package/dist/plugins/ast-scope.d.ts +16 -0
- package/dist/plugins/ast-scope.js +62 -0
- package/dist/plugins/ast-utils.d.ts +27 -1
- package/dist/plugins/ast-utils.js +32 -1
- package/dist/plugins/css-module-imports.d.ts +14 -0
- package/dist/plugins/css-module-imports.js +59 -0
- package/dist/plugins/extensionless-dynamic-import.js +2 -2
- package/dist/plugins/ignore-dynamic-requests.d.ts +11 -0
- package/dist/plugins/ignore-dynamic-requests.js +530 -0
- package/dist/plugins/middleware-server-only.d.ts +8 -6
- package/dist/plugins/middleware-server-only.js +8 -7
- package/dist/plugins/optimize-imports.js +1 -1
- package/dist/plugins/typeof-window.d.ts +1 -1
- package/dist/plugins/typeof-window.js +28 -56
- package/dist/routing/app-route-graph.d.ts +29 -4
- package/dist/routing/app-route-graph.js +182 -40
- package/dist/routing/app-router.d.ts +5 -0
- package/dist/routing/app-router.js +5 -0
- package/dist/routing/file-matcher.d.ts +8 -0
- package/dist/routing/file-matcher.js +10 -1
- package/dist/routing/pages-router.js +2 -2
- package/dist/server/api-handler.js +9 -14
- package/dist/server/app-browser-action-result.d.ts +4 -1
- package/dist/server/app-browser-action-result.js +8 -1
- package/dist/server/app-browser-entry.js +194 -190
- package/dist/server/app-browser-history-controller.d.ts +2 -1
- package/dist/server/app-browser-history-controller.js +6 -2
- package/dist/server/app-browser-interception-context.d.ts +1 -0
- package/dist/server/app-browser-interception-context.js +4 -2
- package/dist/server/app-browser-navigation-controller.d.ts +2 -0
- package/dist/server/app-browser-navigation-controller.js +60 -31
- package/dist/server/app-browser-server-action-client.d.ts +32 -0
- package/dist/server/app-browser-server-action-client.js +127 -0
- package/dist/server/app-browser-state.d.ts +11 -1
- package/dist/server/app-browser-state.js +25 -8
- package/dist/server/app-browser-visible-commit.d.ts +6 -1
- package/dist/server/app-browser-visible-commit.js +43 -25
- package/dist/server/app-elements-wire.d.ts +9 -2
- package/dist/server/app-elements-wire.js +8 -1
- package/dist/server/app-elements.d.ts +2 -2
- package/dist/server/app-elements.js +4 -3
- package/dist/server/app-fallback-renderer.d.ts +5 -2
- package/dist/server/app-fallback-renderer.js +15 -7
- package/dist/server/app-hydration-cache-publication.d.ts +11 -0
- package/dist/server/app-hydration-cache-publication.js +43 -0
- package/dist/server/app-middleware.d.ts +4 -3
- package/dist/server/app-middleware.js +8 -3
- package/dist/server/app-optimistic-routing.js +11 -4
- package/dist/server/app-page-boundary-render.d.ts +3 -0
- package/dist/server/app-page-boundary-render.js +14 -3
- package/dist/server/app-page-cache-finalizer.d.ts +1 -0
- package/dist/server/app-page-cache-finalizer.js +10 -3
- package/dist/server/app-page-cache-render.d.ts +1 -0
- package/dist/server/app-page-cache-render.js +8 -4
- package/dist/server/app-page-cache.d.ts +1 -0
- package/dist/server/app-page-cache.js +5 -2
- package/dist/server/app-page-dispatch.d.ts +33 -4
- package/dist/server/app-page-dispatch.js +63 -90
- package/dist/server/app-page-element-builder.d.ts +9 -2
- package/dist/server/app-page-element-builder.js +114 -23
- package/dist/server/app-page-head.d.ts +16 -1
- package/dist/server/app-page-head.js +44 -22
- package/dist/server/app-page-params.d.ts +2 -1
- package/dist/server/app-page-params.js +8 -1
- package/dist/server/app-page-ppr-runtime.d.ts +7 -0
- package/dist/server/app-page-ppr-runtime.js +70 -0
- package/dist/server/app-page-probe.d.ts +1 -0
- package/dist/server/app-page-probe.js +6 -1
- package/dist/server/app-page-render-identity.d.ts +1 -0
- package/dist/server/app-page-render-identity.js +1 -1
- package/dist/server/app-page-render.d.ts +4 -1
- package/dist/server/app-page-render.js +26 -3
- package/dist/server/app-page-request.d.ts +22 -1
- package/dist/server/app-page-request.js +92 -15
- package/dist/server/app-page-route-wiring.d.ts +14 -2
- package/dist/server/app-page-route-wiring.js +61 -25
- package/dist/server/app-page-search-params-observation.d.ts +4 -2
- package/dist/server/app-page-search-params-observation.js +11 -7
- package/dist/server/app-page-segment-state.d.ts +2 -1
- package/dist/server/app-page-segment-state.js +3 -1
- package/dist/server/app-page-stream.d.ts +5 -0
- package/dist/server/app-page-stream.js +3 -1
- package/dist/server/app-ppr-fallback-shell-render.d.ts +4 -3
- package/dist/server/app-route-handler-dispatch.js +1 -0
- package/dist/server/app-route-handler-execution.js +7 -2
- package/dist/server/app-route-handler-response.js +1 -0
- package/dist/server/app-route-handler-runtime.js +1 -1
- package/dist/server/app-route-module-loader.d.ts +2 -0
- package/dist/server/app-route-module-loader.js +1 -0
- package/dist/server/app-router-entry.js +16 -8
- package/dist/server/app-rsc-errors.js +7 -1
- package/dist/server/app-rsc-handler.d.ts +3 -1
- package/dist/server/app-rsc-handler.js +67 -39
- package/dist/server/app-rsc-request-normalization.d.ts +3 -2
- package/dist/server/app-rsc-request-normalization.js +6 -3
- package/dist/server/app-rsc-route-matching.d.ts +7 -0
- package/dist/server/app-rsc-route-matching.js +36 -3
- package/dist/server/app-segment-config.d.ts +12 -0
- package/dist/server/app-segment-config.js +91 -5
- package/dist/server/app-server-action-execution.d.ts +5 -0
- package/dist/server/app-server-action-execution.js +94 -33
- package/dist/server/app-ssr-entry.d.ts +3 -0
- package/dist/server/app-ssr-entry.js +19 -8
- package/dist/server/app-ssr-stream.d.ts +7 -3
- package/dist/server/app-ssr-stream.js +10 -6
- package/dist/server/app-static-generation.d.ts +1 -0
- package/dist/server/app-static-generation.js +1 -0
- package/dist/server/app-visited-response-cache.d.ts +6 -0
- package/dist/server/app-visited-response-cache.js +3 -1
- package/dist/server/client-trace-metadata.js +26 -0
- package/dist/server/default-global-not-found-module.d.ts +14 -0
- package/dist/server/default-global-not-found-module.js +14 -0
- package/dist/server/dev-route-files.js +4 -0
- package/dist/server/dev-server.js +19 -18
- package/dist/server/dev-stack-sourcemap.d.ts +1 -1
- package/dist/server/dev-stack-sourcemap.js +1 -1
- package/dist/server/fetch-handler.d.ts +2 -0
- package/dist/server/fetch-handler.js +18 -0
- package/dist/server/headers.d.ts +5 -15
- package/dist/server/headers.js +4 -15
- package/dist/server/image-optimization.d.ts +51 -1
- package/dist/server/image-optimization.js +52 -2
- package/dist/server/implicit-tags.js +1 -1
- package/dist/server/isr-cache.d.ts +1 -1
- package/dist/server/isr-cache.js +2 -2
- package/dist/server/metadata-routes.d.ts +3 -1
- package/dist/server/metadata-routes.js +12 -2
- package/dist/server/middleware-runtime.js +6 -1
- package/dist/server/navigation-planner.d.ts +1 -0
- package/dist/server/navigation-planner.js +14 -3
- package/dist/server/pages-api-route.js +2 -2
- package/dist/server/pages-asset-tags.d.ts +4 -6
- package/dist/server/pages-asset-tags.js +12 -12
- package/dist/server/pages-client-assets.d.ts +12 -0
- package/dist/server/pages-client-assets.js +10 -0
- package/dist/server/pages-node-compat.d.ts +8 -1
- package/dist/server/pages-node-compat.js +32 -4
- package/dist/server/pages-page-data.d.ts +24 -1
- package/dist/server/pages-page-data.js +45 -24
- package/dist/server/pages-page-handler.d.ts +2 -1
- package/dist/server/pages-page-handler.js +19 -12
- package/dist/server/pages-page-response.d.ts +7 -0
- package/dist/server/pages-page-response.js +4 -1
- package/dist/server/pages-request-pipeline.d.ts +2 -0
- package/dist/server/pages-request-pipeline.js +25 -1
- package/dist/server/pages-router-entry.d.ts +30 -0
- package/dist/server/pages-router-entry.js +108 -0
- package/dist/server/prerender-manifest.d.ts +3 -1
- package/dist/server/prerender-route-params.js +1 -1
- package/dist/server/prod-server.d.ts +1 -1
- package/dist/server/prod-server.js +48 -26
- package/dist/server/request-pipeline.js +1 -0
- package/dist/server/seed-cache.js +4 -4
- package/dist/server/worker-utils.d.ts +2 -1
- package/dist/server/worker-utils.js +7 -1
- package/dist/shims/app-router-scroll-state.d.ts +1 -0
- package/dist/shims/app-router-scroll-state.js +1 -0
- package/dist/shims/app-router-scroll.js +2 -1
- package/dist/shims/cache.js +19 -15
- package/dist/shims/cdn-cache.js +1 -1
- package/dist/shims/dynamic-preload-chunks.js +2 -1
- package/dist/shims/error-boundary.d.ts +19 -1
- package/dist/shims/error-boundary.js +11 -1
- package/dist/shims/form.d.ts +3 -1
- package/dist/shims/form.js +37 -43
- package/dist/shims/headers.d.ts +9 -1
- package/dist/shims/headers.js +31 -6
- package/dist/shims/image.js +75 -14
- package/dist/shims/internal/app-route-detection.d.ts +2 -17
- package/dist/shims/internal/app-route-detection.js +4 -17
- package/dist/shims/internal/hybrid-client-route-owner-direct.d.ts +23 -0
- package/dist/shims/internal/hybrid-client-route-owner-direct.js +51 -0
- package/dist/shims/internal/hybrid-client-route-owner.d.ts +2 -15
- package/dist/shims/internal/hybrid-client-route-owner.js +9 -60
- package/dist/shims/internal/pages-data-fetch-dedup.d.ts +9 -5
- package/dist/shims/internal/pages-data-fetch-dedup.js +73 -14
- package/dist/shims/internal/pages-data-target.d.ts +10 -9
- package/dist/shims/internal/pages-data-target.js +91 -12
- package/dist/shims/internal/pages-router-components.d.ts +7 -0
- package/dist/shims/internal/pages-router-components.js +13 -0
- package/dist/shims/layout-segment-context.d.ts +4 -1
- package/dist/shims/layout-segment-context.js +18 -4
- package/dist/shims/link.js +70 -37
- package/dist/shims/metadata.d.ts +3 -2
- package/dist/shims/metadata.js +8 -4
- package/dist/shims/navigation.d.ts +5 -1
- package/dist/shims/navigation.js +45 -10
- package/dist/shims/navigation.react-server.js +1 -1
- package/dist/shims/root-params.d.ts +15 -1
- package/dist/shims/root-params.js +21 -1
- package/dist/shims/router.d.ts +5 -7
- package/dist/shims/router.js +374 -94
- package/dist/shims/server.js +3 -2
- package/dist/shims/slot.js +3 -6
- package/dist/typegen.js +6 -5
- package/dist/utils/client-runtime-metadata.d.ts +2 -18
- package/dist/utils/client-runtime-metadata.js +31 -22
- package/dist/utils/dev-stack-sourcemap-endpoint.d.ts +4 -0
- package/dist/{server → utils}/dev-stack-sourcemap-endpoint.js +1 -1
- package/dist/utils/domain-locale.d.ts +6 -3
- package/dist/{server → utils}/middleware-request-headers.d.ts +1 -1
- package/dist/{server → utils}/middleware-request-headers.js +2 -2
- package/dist/utils/path.d.ts +2 -1
- package/dist/utils/path.js +1 -1
- package/dist/utils/project.d.ts +52 -2
- package/dist/utils/project.js +230 -5
- package/dist/utils/protocol-headers.d.ts +17 -0
- package/dist/utils/protocol-headers.js +17 -0
- package/dist/utils/react-version.d.ts +4 -0
- package/dist/utils/react-version.js +44 -0
- package/package.json +53 -4
- package/dist/deploy.d.ts +0 -190
- package/dist/deploy.js +0 -1033
- package/dist/server/dev-stack-sourcemap-endpoint.d.ts +0 -4
- /package/dist/{cloudflare → packages/cloudflare}/src/utils/cache-control-metadata.js +0 -0
|
@@ -16,20 +16,24 @@ import DefaultGlobalError from "../shims/default-global-error.js";
|
|
|
16
16
|
import { BfcacheStateKeyMapContext, ElementsContext, Slot } from "../shims/slot.js";
|
|
17
17
|
import { createSsrErrorMetaRenderer } from "./app-ssr-error-meta.js";
|
|
18
18
|
import { createNavigationRuntimeRscMetadataScript, createRscEmbedTransform, createTickBufferedTransform } from "./app-ssr-stream.js";
|
|
19
|
-
import {
|
|
20
|
-
import { runWithRootParamsScope } from "../shims/root-params.js";
|
|
19
|
+
import { setPagesClientAssets } from "./pages-client-assets.js";
|
|
21
20
|
import { createInitialBfcacheMaps } from "./app-bfcache-identity.js";
|
|
22
21
|
import { RSC_FORM_STATE_GLOBAL } from "./app-browser-hydration.js";
|
|
23
22
|
import { createClientReferencePreloader } from "./app-client-reference-preloader.js";
|
|
24
23
|
import { deferUntilStreamConsumed } from "./defer-until-stream-consumed.js";
|
|
24
|
+
import { runWithRootParamsScope } from "../shims/root-params.js";
|
|
25
|
+
import { BeforeInteractiveContext } from "../shims/before-interactive-context.js";
|
|
25
26
|
import { renderBeforeInteractiveInlineScripts } from "./before-interactive-head.js";
|
|
26
27
|
import { createInitialDevServerErrorScript } from "./dev-initial-server-error.js";
|
|
27
28
|
import { ssrAppRouterInstance } from "./app-ssr-router-instance.js";
|
|
28
29
|
import { Fragment, createElement, use } from "react";
|
|
29
30
|
import { renderToReadableStream, renderToStaticMarkup } from "react-dom/server.edge";
|
|
31
|
+
import { preinitModule } from "react-dom";
|
|
30
32
|
import { createFromReadableStream } from "@vitejs/plugin-rsc/ssr";
|
|
31
33
|
import clientReferences from "virtual:vite-rsc/client-references";
|
|
34
|
+
import pagesClientAssets from "virtual:vinext-pages-client-assets";
|
|
32
35
|
//#region src/server/app-ssr-entry.ts
|
|
36
|
+
setPagesClientAssets(pagesClientAssets);
|
|
33
37
|
/**
|
|
34
38
|
* Default cap for the preload `Link` header, matching Next.js's
|
|
35
39
|
* `defaultConfig.reactMaxHeadersLength`. Used when no config value threads
|
|
@@ -52,7 +56,10 @@ async function loadStaticPrerender() {
|
|
|
52
56
|
const [{ createRequire }, path] = await Promise.all([import("node:module"), import("node:path")]);
|
|
53
57
|
const reactDomPackageJson = createRequire(import.meta.url).resolve("react-dom/package.json");
|
|
54
58
|
const reactDomDir = path.dirname(reactDomPackageJson);
|
|
55
|
-
const devRenderer = await import(
|
|
59
|
+
const devRenderer = await import(
|
|
60
|
+
/* @vite-ignore */
|
|
61
|
+
path.join(reactDomDir, "cjs/react-dom-server.edge.development.js")
|
|
62
|
+
);
|
|
56
63
|
if (isStaticPrerenderModule(devRenderer)) return devRenderer.prerender;
|
|
57
64
|
const devRendererDefault = typeof devRenderer === "object" && devRenderer !== null && "default" in devRenderer && devRenderer.default;
|
|
58
65
|
if (isStaticPrerenderModule(devRendererDefault)) return devRendererDefault.prerender;
|
|
@@ -146,12 +153,12 @@ function buildModulePreloadHtml(bootstrapModuleUrl, nonce) {
|
|
|
146
153
|
if (!bootstrapModuleUrl) return "";
|
|
147
154
|
return `<link rel="modulepreload"${createNonceAttribute(nonce)} href="${escapeHtmlAttr(bootstrapModuleUrl)}" />\n`;
|
|
148
155
|
}
|
|
149
|
-
function buildHeadInjectionHtml(navContext, bootstrapModuleUrl, formState, insertedHTML, fontHTML, scriptNonce) {
|
|
156
|
+
function buildHeadInjectionHtml(navContext, bootstrapModuleUrl, formState, insertedHTML, fontHTML, dynamicStaleTimeSeconds, scriptNonce) {
|
|
150
157
|
const navPayload = {
|
|
151
158
|
pathname: navContext.pathname,
|
|
152
159
|
searchParams: [...navContext.searchParams.entries()]
|
|
153
160
|
};
|
|
154
|
-
return createInlineScriptTag(createNavigationRuntimeRscMetadataScript(navContext.params, navPayload), scriptNonce) + (formState === null ? "" : createInlineScriptTag("self[" + safeJsonStringify(RSC_FORM_STATE_GLOBAL) + "]=" + safeJsonStringify(formState), scriptNonce)) + buildModulePreloadHtml(bootstrapModuleUrl, scriptNonce) + insertedHTML + fontHTML;
|
|
161
|
+
return createInlineScriptTag(createNavigationRuntimeRscMetadataScript(navContext.params, navPayload, dynamicStaleTimeSeconds), scriptNonce) + (formState === null ? "" : createInlineScriptTag("self[" + safeJsonStringify(RSC_FORM_STATE_GLOBAL) + "]=" + safeJsonStringify(formState), scriptNonce)) + buildModulePreloadHtml(bootstrapModuleUrl, scriptNonce) + insertedHTML + fontHTML;
|
|
155
162
|
}
|
|
156
163
|
function requireNavigationContext(navContext) {
|
|
157
164
|
if (!navContext) throw new Error("App SSR requires navigation context for BFCache state keys");
|
|
@@ -173,15 +180,19 @@ async function handleSsr(rscStream, navContext, fontData, options) {
|
|
|
173
180
|
let rscEmbed;
|
|
174
181
|
if (options?.sideStream) {
|
|
175
182
|
ssrStream = rscStream;
|
|
176
|
-
rscEmbed = createRscEmbedTransform(options.sideStream, options?.scriptNonce);
|
|
183
|
+
rscEmbed = createRscEmbedTransform(options.sideStream, options?.scriptNonce, options?.getInitialNavigationCacheMetadata);
|
|
177
184
|
if (options.capturedRscDataRef) options.capturedRscDataRef.value = rscEmbed.getRawBuffer();
|
|
178
185
|
} else {
|
|
179
186
|
const [s1, s2] = rscStream.tee();
|
|
180
187
|
ssrStream = s1;
|
|
181
|
-
rscEmbed = createRscEmbedTransform(s2, options?.scriptNonce);
|
|
188
|
+
rscEmbed = createRscEmbedTransform(s2, options?.scriptNonce, options?.getInitialNavigationCacheMetadata);
|
|
182
189
|
}
|
|
183
190
|
let flightRoot = null;
|
|
184
191
|
function VinextFlightRoot() {
|
|
192
|
+
for (const moduleUrl of pagesClientAssets.appBootstrapPreinitModules ?? []) preinitModule(moduleUrl, {
|
|
193
|
+
as: "script",
|
|
194
|
+
nonce: options?.scriptNonce
|
|
195
|
+
});
|
|
185
196
|
if (!flightRoot) flightRoot = createFromReadableStream(ssrStream);
|
|
186
197
|
const wireElements = use(flightRoot);
|
|
187
198
|
const elements = AppElementsWire.decode(wireElements);
|
|
@@ -267,7 +278,7 @@ async function handleSsr(rscStream, navContext, fontData, options) {
|
|
|
267
278
|
const initialDevServerErrorHTML = createInitialDevServerErrorScript(options?.initialDevServerError, options?.scriptNonce);
|
|
268
279
|
if (didInjectHeadHTML) return insertedHTML + errorMetaHTML;
|
|
269
280
|
didInjectHeadHTML = true;
|
|
270
|
-
return buildHeadInjectionHtml(ssrNavigationContext, bootstrapModuleUrl, options?.formState ?? null, insertedHTML + errorMetaHTML + getTraceMetaHTML() + initialDevServerErrorHTML, fontHTML, options?.scriptNonce);
|
|
281
|
+
return buildHeadInjectionHtml(ssrNavigationContext, bootstrapModuleUrl, options?.formState ?? null, insertedHTML + errorMetaHTML + getTraceMetaHTML() + initialDevServerErrorHTML, fontHTML, options?.dynamicStaleTimeSeconds, options?.scriptNonce);
|
|
271
282
|
};
|
|
272
283
|
const getBeforeInteractiveHeadHTML = () => renderBeforeInteractiveInlineScripts(beforeInteractiveInlineScripts);
|
|
273
284
|
return {
|
|
@@ -6,11 +6,15 @@ type RscEmbedTransform = {
|
|
|
6
6
|
};
|
|
7
7
|
type HtmlInsertion = string | (() => string);
|
|
8
8
|
type InlineCssManifest = Record<string, string>;
|
|
9
|
+
type InitialNavigationCacheMetadata = {
|
|
10
|
+
kind: "dynamic" | "static";
|
|
11
|
+
dynamicStaleTimeSeconds?: number;
|
|
12
|
+
};
|
|
9
13
|
declare function navigationRuntimeRscBootstrapExpression(): string;
|
|
10
14
|
declare function createNavigationRuntimeRscMetadataScript(params: Record<string, string | string[]>, nav: {
|
|
11
15
|
pathname: string;
|
|
12
16
|
searchParams: [string, string][];
|
|
13
|
-
}): string;
|
|
17
|
+
}, dynamicStaleTimeSeconds?: number): string;
|
|
14
18
|
/**
|
|
15
19
|
* Fix invalid preload "as" values in RSC Flight hint lines before they reach
|
|
16
20
|
* the client. React Flight emits HL hints with as="stylesheet" for CSS, but
|
|
@@ -21,7 +25,7 @@ declare function fixFlightHints(text: string): string;
|
|
|
21
25
|
* Create a helper that progressively embeds RSC chunks as inline <script> tags.
|
|
22
26
|
* The browser entry turns the embedded chunks back into Uint8Array data.
|
|
23
27
|
*/
|
|
24
|
-
declare function createRscEmbedTransform(embedStream: ReadableStream<Uint8Array>, scriptNonce?: string): RscEmbedTransform;
|
|
28
|
+
declare function createRscEmbedTransform(embedStream: ReadableStream<Uint8Array>, scriptNonce?: string, getInitialNavigationCacheMetadata?: () => InitialNavigationCacheMetadata): RscEmbedTransform;
|
|
25
29
|
/**
|
|
26
30
|
* Fix invalid preload "as" values in server-rendered HTML.
|
|
27
31
|
* React Fizz emits <link rel="preload" as="stylesheet"> for CSS, but the
|
|
@@ -57,4 +61,4 @@ declare function fixPreloadAs(html: string): string;
|
|
|
57
61
|
*/
|
|
58
62
|
declare function createTickBufferedTransform(rscEmbed: RscEmbedTransform, injectHTML?: HtmlInsertion, injectAfterHeadOpenHTML?: HtmlInsertion, inlineCssManifest?: InlineCssManifest, inlineCssPrependCss?: string, inlineCssPrependFallbackHTML?: string, inlineCssScriptNonce?: string): TransformStream<Uint8Array, Uint8Array>;
|
|
59
63
|
//#endregion
|
|
60
|
-
export { createNavigationRuntimeRscMetadataScript, createRscEmbedTransform, createTickBufferedTransform, fixFlightHints, fixPreloadAs, navigationRuntimeRscBootstrapExpression };
|
|
64
|
+
export { InitialNavigationCacheMetadata, createNavigationRuntimeRscMetadataScript, createRscEmbedTransform, createTickBufferedTransform, fixFlightHints, fixPreloadAs, navigationRuntimeRscBootstrapExpression };
|
|
@@ -6,14 +6,18 @@ const NAVIGATION_RUNTIME_REFERENCE = `self[Symbol.for(${safeJsonStringify(NAVIGA
|
|
|
6
6
|
function navigationRuntimeRscBootstrapExpression() {
|
|
7
7
|
return `((${NAVIGATION_RUNTIME_REFERENCE}??={bootstrap:{routeManifest:null},functions:{}}).bootstrap.rsc??={rsc:[]})`;
|
|
8
8
|
}
|
|
9
|
-
function createNavigationRuntimeRscMetadataScript(params, nav) {
|
|
10
|
-
return "Object.assign(" + navigationRuntimeRscBootstrapExpression() + ",{params:" + safeJsonStringify(params) + ",nav:" + safeJsonStringify(nav) + "})";
|
|
9
|
+
function createNavigationRuntimeRscMetadataScript(params, nav, dynamicStaleTimeSeconds) {
|
|
10
|
+
return "Object.assign(" + navigationRuntimeRscBootstrapExpression() + ",{params:" + safeJsonStringify(params) + ",nav:" + safeJsonStringify(nav) + (dynamicStaleTimeSeconds === void 0 ? "" : ",dynamicStaleTimeSeconds:" + safeJsonStringify(dynamicStaleTimeSeconds)) + "})";
|
|
11
11
|
}
|
|
12
12
|
function createNavigationRuntimeRscChunkScript(chunk) {
|
|
13
13
|
return navigationRuntimeRscBootstrapExpression() + ".rsc.push(" + safeJsonStringify(chunk) + ")";
|
|
14
14
|
}
|
|
15
|
-
function createNavigationRuntimeRscDoneScript() {
|
|
16
|
-
|
|
15
|
+
function createNavigationRuntimeRscDoneScript(metadata) {
|
|
16
|
+
const bootstrap = navigationRuntimeRscBootstrapExpression();
|
|
17
|
+
return (metadata === void 0 ? "" : "Object.assign(" + bootstrap + "," + safeJsonStringify({
|
|
18
|
+
initialCacheKind: metadata.kind,
|
|
19
|
+
...metadata.dynamicStaleTimeSeconds === void 0 ? {} : { dynamicStaleTimeSeconds: metadata.dynamicStaleTimeSeconds }
|
|
20
|
+
}) + ");") + bootstrap + ".done=true";
|
|
17
21
|
}
|
|
18
22
|
/**
|
|
19
23
|
* Fix invalid preload "as" values in RSC Flight hint lines before they reach
|
|
@@ -27,7 +31,7 @@ function fixFlightHints(text) {
|
|
|
27
31
|
* Create a helper that progressively embeds RSC chunks as inline <script> tags.
|
|
28
32
|
* The browser entry turns the embedded chunks back into Uint8Array data.
|
|
29
33
|
*/
|
|
30
|
-
function createRscEmbedTransform(embedStream, scriptNonce) {
|
|
34
|
+
function createRscEmbedTransform(embedStream, scriptNonce, getInitialNavigationCacheMetadata) {
|
|
31
35
|
const reader = embedStream.getReader();
|
|
32
36
|
let pendingChunks = [];
|
|
33
37
|
const rawChunks = [];
|
|
@@ -67,7 +71,7 @@ function createRscEmbedTransform(embedStream, scriptNonce) {
|
|
|
67
71
|
async finalize() {
|
|
68
72
|
await pumpPromise;
|
|
69
73
|
let scripts = this.flush();
|
|
70
|
-
scripts += createInlineScriptTag(createNavigationRuntimeRscDoneScript(), scriptNonce);
|
|
74
|
+
scripts += createInlineScriptTag(createNavigationRuntimeRscDoneScript(getInitialNavigationCacheMetadata?.()), scriptNonce);
|
|
71
75
|
return scripts;
|
|
72
76
|
},
|
|
73
77
|
async getRawBuffer() {
|
|
@@ -3,6 +3,7 @@ import { HeadersContext } from "../shims/headers.js";
|
|
|
3
3
|
//#region src/server/app-static-generation.d.ts
|
|
4
4
|
type AppStaticGenerationRouteKind = "page" | "route";
|
|
5
5
|
type CreateStaticGenerationHeadersContextOptions = {
|
|
6
|
+
draftModeEnabled?: boolean;
|
|
6
7
|
draftModeSecret?: string;
|
|
7
8
|
dynamicConfig?: string;
|
|
8
9
|
routeKind: AppStaticGenerationRouteKind;
|
|
@@ -9,6 +9,7 @@ function createStaticGenerationHeadersContext(options) {
|
|
|
9
9
|
const context = {
|
|
10
10
|
headers: new Headers(),
|
|
11
11
|
cookies: /* @__PURE__ */ new Map(),
|
|
12
|
+
draftModeEnabled: options.draftModeEnabled,
|
|
12
13
|
draftModeSecret: options.draftModeSecret
|
|
13
14
|
};
|
|
14
15
|
if (options.dynamicConfig === "force-static") context.forceStatic = true;
|
|
@@ -1,17 +1,23 @@
|
|
|
1
|
+
import { AppElements } from "./app-elements-wire.js";
|
|
1
2
|
import { CachedRscResponse } from "../shims/navigation.js";
|
|
2
3
|
|
|
3
4
|
//#region src/server/app-visited-response-cache.d.ts
|
|
4
5
|
type VisitedResponseCacheNavigationKind = "navigate" | "refresh" | "traverse";
|
|
5
6
|
type VisitedResponseCacheEntry = {
|
|
6
7
|
createdAt: number;
|
|
8
|
+
elements?: AppElements;
|
|
7
9
|
expiresAt: number;
|
|
10
|
+
mountedSlotsHeader: string | null;
|
|
8
11
|
params: Record<string, string | string[]>;
|
|
9
12
|
response: CachedRscResponse;
|
|
10
13
|
};
|
|
11
14
|
declare const VISITED_RESPONSE_CACHE_TTL: number;
|
|
12
15
|
declare const MAX_TRAVERSAL_CACHE_TTL: number;
|
|
13
16
|
declare function createVisitedResponseCacheEntry(options: {
|
|
17
|
+
elements?: AppElements;
|
|
18
|
+
fallbackTtlMs?: number;
|
|
14
19
|
now: number;
|
|
20
|
+
mountedSlotsHeader?: string | null;
|
|
15
21
|
params: Record<string, string | string[]>;
|
|
16
22
|
response: CachedRscResponse;
|
|
17
23
|
}): VisitedResponseCacheEntry;
|
|
@@ -5,7 +5,9 @@ const MAX_TRAVERSAL_CACHE_TTL = 30 * 6e4;
|
|
|
5
5
|
function createVisitedResponseCacheEntry(options) {
|
|
6
6
|
return {
|
|
7
7
|
createdAt: options.now,
|
|
8
|
-
|
|
8
|
+
...options.elements ? { elements: options.elements } : {},
|
|
9
|
+
expiresAt: resolveCachedRscResponseExpiresAt(options.now, options.response, options.fallbackTtlMs ?? 3e5),
|
|
10
|
+
mountedSlotsHeader: options.mountedSlotsHeader ?? null,
|
|
9
11
|
params: options.params,
|
|
10
12
|
response: options.response
|
|
11
13
|
};
|
|
@@ -24,7 +24,32 @@ const carrierSetter = { set(carrier, key, value) {
|
|
|
24
24
|
value
|
|
25
25
|
});
|
|
26
26
|
} };
|
|
27
|
+
const OPEN_TELEMETRY_API_SYMBOL = Symbol.for("opentelemetry.js.api.1");
|
|
28
|
+
const OPEN_TELEMETRY_SPAN_SYMBOL = Symbol.for("OpenTelemetry Context Key SPAN");
|
|
29
|
+
function getRegisteredOpenTelemetryTraceData() {
|
|
30
|
+
let metadataSpan = null;
|
|
31
|
+
try {
|
|
32
|
+
const registry = globalThis[OPEN_TELEMETRY_API_SYMBOL];
|
|
33
|
+
if (!registry?.context || !registry.propagation) return null;
|
|
34
|
+
const contextApi = registry.context;
|
|
35
|
+
const propagation = registry.propagation;
|
|
36
|
+
const activeContext = contextApi.active();
|
|
37
|
+
metadataSpan = activeContext.getValue(OPEN_TELEMETRY_SPAN_SYMBOL) !== void 0 ? null : registry.trace?.getTracer("vinext").startSpan("vinext.clientTraceMetadata", void 0, activeContext) ?? null;
|
|
38
|
+
const context = metadataSpan ? activeContext.setValue(OPEN_TELEMETRY_SPAN_SYMBOL, metadataSpan) : activeContext;
|
|
39
|
+
const entries = [];
|
|
40
|
+
contextApi.with(context, () => {
|
|
41
|
+
propagation.inject(context, entries, carrierSetter);
|
|
42
|
+
});
|
|
43
|
+
return entries;
|
|
44
|
+
} catch {
|
|
45
|
+
return [];
|
|
46
|
+
} finally {
|
|
47
|
+
metadataSpan?.end();
|
|
48
|
+
}
|
|
49
|
+
}
|
|
27
50
|
function getOpenTelemetryTraceData() {
|
|
51
|
+
const registeredEntries = getRegisteredOpenTelemetryTraceData();
|
|
52
|
+
if (registeredEntries) return registeredEntries;
|
|
28
53
|
let api;
|
|
29
54
|
try {
|
|
30
55
|
const req = globalThis.require;
|
|
@@ -75,6 +100,7 @@ function renderClientTraceMetadataTags(entries) {
|
|
|
75
100
|
*/
|
|
76
101
|
function getClientTraceMetadataHTML(allowList) {
|
|
77
102
|
if (!allowList || allowList.length === 0) return "";
|
|
103
|
+
if (typeof process !== "undefined" && process.env.VINEXT_PRERENDER === "1") return "";
|
|
78
104
|
return renderClientTraceMetadataTags(filterClientTraceMetadata(getOpenTelemetryTraceData(), allowList));
|
|
79
105
|
}
|
|
80
106
|
//#endregion
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
|
|
3
|
+
//#region src/server/default-global-not-found-module.d.ts
|
|
4
|
+
declare function DefaultGlobalNotFound(): React.ReactElement;
|
|
5
|
+
/**
|
|
6
|
+
* Module-shaped wrapper around Next.js's built-in global not-found document.
|
|
7
|
+
* Unlike the regular default not-found boundary, this component owns the
|
|
8
|
+
* document shell because global not-found responses skip the root layout.
|
|
9
|
+
*/
|
|
10
|
+
declare const DEFAULT_GLOBAL_NOT_FOUND_MODULE: {
|
|
11
|
+
readonly default: typeof DefaultGlobalNotFound;
|
|
12
|
+
};
|
|
13
|
+
//#endregion
|
|
14
|
+
export { DEFAULT_GLOBAL_NOT_FOUND_MODULE };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import DefaultNotFound from "../shims/default-not-found.js";
|
|
2
|
+
import React from "react";
|
|
3
|
+
//#region src/server/default-global-not-found-module.ts
|
|
4
|
+
function DefaultGlobalNotFound() {
|
|
5
|
+
return React.createElement("html", null, React.createElement("body", null, React.createElement(DefaultNotFound)));
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Module-shaped wrapper around Next.js's built-in global not-found document.
|
|
9
|
+
* Unlike the regular default not-found boundary, this component owns the
|
|
10
|
+
* document shell because global not-found responses skip the root layout.
|
|
11
|
+
*/
|
|
12
|
+
const DEFAULT_GLOBAL_NOT_FOUND_MODULE = { default: DefaultGlobalNotFound };
|
|
13
|
+
//#endregion
|
|
14
|
+
export { DEFAULT_GLOBAL_NOT_FOUND_MODULE };
|
|
@@ -48,6 +48,10 @@ function isRootGlobalError(parts, matcher) {
|
|
|
48
48
|
function isMetadataRouteFile(parts) {
|
|
49
49
|
const fileName = parts[parts.length - 1];
|
|
50
50
|
if (!fileName) return false;
|
|
51
|
+
if (fileName.endsWith(".alt.txt")) {
|
|
52
|
+
const imageBaseName = fileName.slice(0, -8);
|
|
53
|
+
return matchMetadataFileBaseName("opengraph-image", imageBaseName) !== null || matchMetadataFileBaseName("twitter-image", imageBaseName) !== null;
|
|
54
|
+
}
|
|
51
55
|
const { baseName, extension } = stripLastExtension(fileName);
|
|
52
56
|
if (!extension) return false;
|
|
53
57
|
const routePrefix = visibleRoutePrefix(parts);
|
|
@@ -3,7 +3,6 @@ import { createValidFileMatcher, findFileWithExtensions } from "../routing/file-
|
|
|
3
3
|
import { patternToNextFormat } from "../routing/route-validation.js";
|
|
4
4
|
import { matchRoute } from "../routing/pages-router.js";
|
|
5
5
|
import { NEXTJS_DEPLOYMENT_ID_HEADER } from "./headers.js";
|
|
6
|
-
import { normalizeStaticPathname } from "../routing/route-pattern.js";
|
|
7
6
|
import { importModule, reportRequestError } from "./instrumentation.js";
|
|
8
7
|
import { buildCacheStateHeaders } from "./cache-headers.js";
|
|
9
8
|
import { isUnknownRecord } from "../utils/record.js";
|
|
@@ -26,12 +25,14 @@ import { detectLocaleFromAcceptLanguage, extractLocaleFromUrl as extractLocaleFr
|
|
|
26
25
|
import { buildDefaultPagesNotFoundResponse } from "./pages-default-404.js";
|
|
27
26
|
import { buildPagesReadinessNextData } from "./pages-readiness.js";
|
|
28
27
|
import { resolvePagesPageMethodResponse } from "./pages-page-method.js";
|
|
29
|
-
import { createPagesDevModuleUrl } from "./pages-dev-module-url.js";
|
|
30
|
-
import { isSerializableProps } from "./pages-serializable-props.js";
|
|
31
28
|
import { loadUserDocumentInitialProps, runDocumentRenderPage } from "./pages-document-initial-props.js";
|
|
32
29
|
import { callDocumentGetInitialProps } from "./document-initial-head.js";
|
|
33
30
|
import { hasPagesGetInitialProps, loadDevAppInitialProps, loadPagesGetInitialProps } from "./pages-get-initial-props.js";
|
|
31
|
+
import { isSerializableProps } from "./pages-serializable-props.js";
|
|
34
32
|
import { isBotUserAgent } from "../utils/html-limited-bots.js";
|
|
33
|
+
import { getPagesRouteParams, matchesPagesStaticPath } from "./pages-page-data.js";
|
|
34
|
+
import { createPagesDevModuleUrl } from "./pages-dev-module-url.js";
|
|
35
|
+
import { attachPagesRequestCookies } from "./pages-node-compat.js";
|
|
35
36
|
import path from "node:path";
|
|
36
37
|
import React from "react";
|
|
37
38
|
import { renderToReadableStream } from "react-dom/server.edge";
|
|
@@ -101,7 +102,7 @@ const STREAM_BODY_MARKER = "<!--VINEXT_STREAM_BODY-->";
|
|
|
101
102
|
* shell sooner).
|
|
102
103
|
*/
|
|
103
104
|
async function streamPageToResponse(res, element, options) {
|
|
104
|
-
const { url, server, fontHeadHTML, scripts, DocumentComponent, statusCode
|
|
105
|
+
const { url, server, fontHeadHTML, scripts, DocumentComponent, statusCode, extraHeaders, getHeadHTML, enhancePageElement, scriptNonce, documentContext, setDocumentInitialHead, bufferBodyBeforeHeaders = false } = options;
|
|
105
106
|
const documentRenderPage = await runDocumentRenderPage({
|
|
106
107
|
DocumentComponent,
|
|
107
108
|
enhancePageElement,
|
|
@@ -110,6 +111,7 @@ async function streamPageToResponse(res, element, options) {
|
|
|
110
111
|
scriptNonce,
|
|
111
112
|
context: documentContext
|
|
112
113
|
});
|
|
114
|
+
if (res.headersSent || res.writableEnded) return;
|
|
113
115
|
let bodyStream;
|
|
114
116
|
if (documentRenderPage.status === "rendered") {
|
|
115
117
|
const synthesised = documentRenderPage.bodyHtml;
|
|
@@ -152,7 +154,7 @@ async function streamPageToResponse(res, element, options) {
|
|
|
152
154
|
};
|
|
153
155
|
if (extraHeaders) for (const [key, val] of Object.entries(extraHeaders)) if (Array.isArray(val)) res.setHeader(key, val);
|
|
154
156
|
else headers[key] = val;
|
|
155
|
-
res.writeHead(statusCode, headers);
|
|
157
|
+
res.writeHead(statusCode ?? res.statusCode, headers);
|
|
156
158
|
res.write(prefix);
|
|
157
159
|
if (bufferedBody !== null) {
|
|
158
160
|
res.end(bufferedBody + suffix);
|
|
@@ -211,6 +213,7 @@ function createSSRHandler(server, runner, routes, pagesDir, i18nConfig, fileMatc
|
|
|
211
213
|
const _reqStart = now();
|
|
212
214
|
let _compileEnd;
|
|
213
215
|
let _renderEnd;
|
|
216
|
+
attachPagesRequestCookies(req);
|
|
214
217
|
res.on("finish", () => {
|
|
215
218
|
const totalMs = now() - _reqStart;
|
|
216
219
|
const compileMs = _compileEnd !== void 0 ? Math.round(_compileEnd - _reqStart) : void 0;
|
|
@@ -248,8 +251,9 @@ function createSSRHandler(server, runner, routes, pagesDir, i18nConfig, fileMatc
|
|
|
248
251
|
if (isDataReq) {
|
|
249
252
|
const deploymentId = process.env.__VINEXT_DEPLOYMENT_ID || process.env.NEXT_DEPLOYMENT_ID;
|
|
250
253
|
const notFoundHeaders = { "Content-Type": "application/json" };
|
|
254
|
+
if (hasMiddleware) notFoundHeaders["x-nextjs-matched-path"] = `${locale ? `/${locale}` : ""}${localeStrippedUrl}`;
|
|
251
255
|
if (deploymentId) notFoundHeaders[NEXTJS_DEPLOYMENT_ID_HEADER] = deploymentId;
|
|
252
|
-
res.writeHead(404, notFoundHeaders);
|
|
256
|
+
res.writeHead(hasMiddleware ? 200 : 404, notFoundHeaders);
|
|
253
257
|
res.end("{}");
|
|
254
258
|
return;
|
|
255
259
|
}
|
|
@@ -340,17 +344,8 @@ function createSSRHandler(server, runner, routes, pagesDir, i18nConfig, fileMatc
|
|
|
340
344
|
});
|
|
341
345
|
const fallback = pathsResult?.fallback ?? false;
|
|
342
346
|
const paths = pathsResult?.paths ?? [];
|
|
343
|
-
const
|
|
344
|
-
const isValidPath = paths.some((
|
|
345
|
-
if (typeof p === "string") return normalizeStaticPathname(p) === currentPathname;
|
|
346
|
-
const entryParams = p.params;
|
|
347
|
-
if (entryParams === void 0 || entryParams === null) return false;
|
|
348
|
-
return Object.entries(entryParams).every(([key, val]) => {
|
|
349
|
-
const actual = params[key];
|
|
350
|
-
if (Array.isArray(val)) return Array.isArray(actual) && val.join("/") === actual.join("/");
|
|
351
|
-
return String(val) === String(actual);
|
|
352
|
-
});
|
|
353
|
-
});
|
|
347
|
+
const routeParams = getPagesRouteParams(patternToNextFormat(route.pattern));
|
|
348
|
+
const isValidPath = paths.some((pathEntry) => matchesPagesStaticPath(pathEntry, params, routeParams, url));
|
|
354
349
|
if (fallback === false && !isValidPath) {
|
|
355
350
|
if (isDataReq) {
|
|
356
351
|
const deploymentId = process.env.__VINEXT_DEPLOYMENT_ID || process.env.NEXT_DEPLOYMENT_ID;
|
|
@@ -762,6 +757,7 @@ function createSSRHandler(server, runner, routes, pagesDir, i18nConfig, fileMatc
|
|
|
762
757
|
setRevalidateDuration(cacheKey, revalidateSeconds);
|
|
763
758
|
}
|
|
764
759
|
const dataHeaders = { "Content-Type": "application/json" };
|
|
760
|
+
if ((statusCode ?? 200) === 200) dataHeaders["x-nextjs-matched-path"] = `${locale ? `/${locale}` : ""}${patternToNextFormat(route.pattern)}`;
|
|
765
761
|
if (gsspExtraHeaders) for (const [k, v] of Object.entries(gsspExtraHeaders)) dataHeaders[k] = v;
|
|
766
762
|
const dataRoutePattern = patternToNextFormat(route.pattern);
|
|
767
763
|
if (dataRoutePattern !== "/_error" && dataRoutePattern !== "/500") {
|
|
@@ -935,7 +931,11 @@ hydrate();
|
|
|
935
931
|
documentContext: {
|
|
936
932
|
pathname: patternToNextFormat(route.pattern),
|
|
937
933
|
query,
|
|
938
|
-
asPath: requestAsPath
|
|
934
|
+
asPath: requestAsPath,
|
|
935
|
+
...pagesNextData.autoExport === true ? {} : {
|
|
936
|
+
req,
|
|
937
|
+
res
|
|
938
|
+
}
|
|
939
939
|
},
|
|
940
940
|
enhancePageElement: (renderPageOpts) => {
|
|
941
941
|
let FinalApp = AppComponent;
|
|
@@ -1004,6 +1004,7 @@ hydrate();
|
|
|
1004
1004
|
* - other: pages/_error.tsx -> default
|
|
1005
1005
|
*/
|
|
1006
1006
|
async function renderErrorPage(server, runner, req, res, url, pagesDir, statusCode, wrapWithRouterContext, fileMatcher, err) {
|
|
1007
|
+
attachPagesRequestCookies(req);
|
|
1007
1008
|
const matcher = fileMatcher ?? createValidFileMatcher();
|
|
1008
1009
|
const candidates = statusCode === 404 ? ["404", "_error"] : statusCode === 500 ? ["500", "_error"] : ["_error"];
|
|
1009
1010
|
for (const candidate of candidates) try {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { VINEXT_ORIGINAL_STACK_TRACE_ENDPOINT } from "
|
|
1
|
+
import { VINEXT_ORIGINAL_STACK_TRACE_ENDPOINT } from "../utils/dev-stack-sourcemap-endpoint.js";
|
|
2
2
|
import { ViteDevServer } from "vite";
|
|
3
3
|
|
|
4
4
|
//#region src/server/dev-stack-sourcemap.d.ts
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { VINEXT_ORIGINAL_STACK_TRACE_ENDPOINT } from "
|
|
1
|
+
import { VINEXT_ORIGINAL_STACK_TRACE_ENDPOINT } from "../utils/dev-stack-sourcemap-endpoint.js";
|
|
2
2
|
import { readFile } from "node:fs/promises";
|
|
3
3
|
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
4
4
|
//#region src/server/dev-stack-sourcemap.ts
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import handler from "virtual:vinext-worker-entry";
|
|
2
|
+
//#region src/server/fetch-handler.ts
|
|
3
|
+
/**
|
|
4
|
+
* Default Cloudflare fetch handler for vinext.
|
|
5
|
+
*
|
|
6
|
+
* Use this directly in wrangler.jsonc:
|
|
7
|
+
* "main": "vinext/server/fetch-handler"
|
|
8
|
+
*
|
|
9
|
+
* Or import and delegate to it from a custom worker:
|
|
10
|
+
* import handler from "vinext/server/fetch-handler";
|
|
11
|
+
* return handler.fetch(request, env, ctx);
|
|
12
|
+
*
|
|
13
|
+
* The vinext plugin resolves this to the App Router or Pages Router handler
|
|
14
|
+
* for the current project at build time.
|
|
15
|
+
*/
|
|
16
|
+
var fetch_handler_default = handler;
|
|
17
|
+
//#endregion
|
|
18
|
+
export { fetch_handler_default as default };
|
package/dist/server/headers.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { MIDDLEWARE_HEADER_PREFIX, MIDDLEWARE_SET_COOKIE_HEADER, VINEXT_MW_CTX_HEADER, VINEXT_PRERENDER_ROUTE_PARAMS_HEADER, VINEXT_PRERENDER_SECRET_HEADER } from "../utils/protocol-headers.js";
|
|
2
|
+
|
|
1
3
|
//#region src/server/headers.d.ts
|
|
2
4
|
/**
|
|
3
5
|
* Internal HTTP header name constants used throughout vinext.
|
|
@@ -15,14 +17,8 @@ declare const VINEXT_CACHE_HEADER = "X-Vinext-Cache";
|
|
|
15
17
|
declare const NEXTJS_CACHE_HEADER = "x-nextjs-cache";
|
|
16
18
|
/** Static file signal — value is URL-encoded pathname. */
|
|
17
19
|
declare const VINEXT_STATIC_FILE_HEADER = "x-vinext-static-file";
|
|
18
|
-
/** Serialized middleware context (JSON) forwarded from dev server to RSC entry. */
|
|
19
|
-
declare const VINEXT_MW_CTX_HEADER = "x-vinext-mw-ctx";
|
|
20
20
|
/** Timing metrics: `handlerStart,compileMs,renderMs`. */
|
|
21
21
|
declare const VINEXT_TIMING_HEADER = "x-vinext-timing";
|
|
22
|
-
/** Build-time prerender authentication secret. */
|
|
23
|
-
declare const VINEXT_PRERENDER_SECRET_HEADER = "x-vinext-prerender-secret";
|
|
24
|
-
/** URL-encoded JSON route params for build-time prerender renders. */
|
|
25
|
-
declare const VINEXT_PRERENDER_ROUTE_PARAMS_HEADER = "x-vinext-prerender-route-params";
|
|
26
22
|
/** Internal endpoint used to evaluate App Router generateStaticParams exports. */
|
|
27
23
|
declare const VINEXT_PRERENDER_STATIC_PARAMS_PATH = "/__vinext/prerender/static-params";
|
|
28
24
|
/** Internal endpoint used to evaluate Pages Router getStaticPaths exports. */
|
|
@@ -81,22 +77,16 @@ declare const ACTION_REDIRECT_HEADER = "x-action-redirect";
|
|
|
81
77
|
declare const ACTION_REDIRECT_TYPE_HEADER = "x-action-redirect-type";
|
|
82
78
|
/** HTTP status for a Server Action redirect (e.g. "308"). */
|
|
83
79
|
declare const ACTION_REDIRECT_STATUS_HEADER = "x-action-redirect-status";
|
|
84
|
-
/** Prefix for forwarded request headers (e.g. `x-middleware-request-cookie`). */
|
|
85
|
-
declare const MIDDLEWARE_REQUEST_HEADER_PREFIX = "x-middleware-request-";
|
|
86
|
-
/** Comma-separated list of header names that middleware wants to override. */
|
|
87
|
-
declare const MIDDLEWARE_OVERRIDE_HEADERS = "x-middleware-override-headers";
|
|
88
|
-
/** Carries cookies set by middleware for same-render reads. */
|
|
89
|
-
declare const MIDDLEWARE_SET_COOKIE_HEADER = "x-middleware-set-cookie";
|
|
90
80
|
/** Signal from `NextResponse.next()` — value "1" means "continue to next handler". */
|
|
91
81
|
declare const MIDDLEWARE_NEXT_HEADER = "x-middleware-next";
|
|
92
82
|
/** Rewrite destination URL set by `NextResponse.rewrite()`. */
|
|
93
83
|
declare const MIDDLEWARE_REWRITE_HEADER = "x-middleware-rewrite";
|
|
94
|
-
/** Generic prefix for all middleware internal headers. */
|
|
95
|
-
declare const MIDDLEWARE_HEADER_PREFIX = "x-middleware-";
|
|
96
84
|
declare const NEXT_ROUTER_STATE_TREE_HEADER = "Next-Router-State-Tree";
|
|
97
85
|
declare const NEXT_ROUTER_PREFETCH_HEADER = "Next-Router-Prefetch";
|
|
98
86
|
declare const NEXT_ROUTER_SEGMENT_PREFETCH_HEADER = "Next-Router-Segment-Prefetch";
|
|
99
87
|
declare const NEXT_URL_HEADER = "Next-Url";
|
|
88
|
+
declare const NEXT_REQUEST_ID_HEADER = "x-nextjs-request-id";
|
|
89
|
+
declare const NEXT_HTML_REQUEST_ID_HEADER = "x-nextjs-html-request-id";
|
|
100
90
|
/** Lowercase flight header variants used in middleware forwarding. */
|
|
101
91
|
declare const FLIGHT_HEADERS: readonly string[];
|
|
102
92
|
/**
|
|
@@ -111,4 +101,4 @@ declare const INTERNAL_HEADERS: string[];
|
|
|
111
101
|
/** Vinext-only internal headers stripped alongside Next.js protocol internals. */
|
|
112
102
|
declare const VINEXT_INTERNAL_HEADERS: string[];
|
|
113
103
|
//#endregion
|
|
114
|
-
export { ACTION_FORWARDED_HEADER, ACTION_REDIRECT_HEADER, ACTION_REDIRECT_STATUS_HEADER, ACTION_REDIRECT_TYPE_HEADER, ACTION_REVALIDATED_HEADER, FLIGHT_HEADERS, INTERNAL_HEADERS, MIDDLEWARE_HEADER_PREFIX, MIDDLEWARE_NEXT_HEADER,
|
|
104
|
+
export { ACTION_FORWARDED_HEADER, ACTION_REDIRECT_HEADER, ACTION_REDIRECT_STATUS_HEADER, ACTION_REDIRECT_TYPE_HEADER, ACTION_REVALIDATED_HEADER, FLIGHT_HEADERS, INTERNAL_HEADERS, MIDDLEWARE_HEADER_PREFIX, MIDDLEWARE_NEXT_HEADER, MIDDLEWARE_REWRITE_HEADER, MIDDLEWARE_SET_COOKIE_HEADER, NEXTJS_ACTION_NOT_FOUND_HEADER, NEXTJS_CACHE_HEADER, NEXTJS_DEPLOYMENT_ID_HEADER, NEXT_ACTION_HEADER, NEXT_HTML_REQUEST_ID_HEADER, NEXT_REQUEST_ID_HEADER, NEXT_ROUTER_PREFETCH_HEADER, NEXT_ROUTER_SEGMENT_PREFETCH_HEADER, NEXT_ROUTER_STATE_TREE_HEADER, NEXT_URL_HEADER, RSC_ACTION_HEADER, RSC_HEADER, VINEXT_CACHE_HEADER, VINEXT_CLIENT_REUSE_MANIFEST_HEADER, VINEXT_DYNAMIC_STALE_TIME_HEADER, VINEXT_INTERCEPTION_CONTEXT_HEADER, VINEXT_INTERNAL_HEADERS, VINEXT_MOUNTED_SLOTS_HEADER, VINEXT_MW_CTX_HEADER, VINEXT_PARAMS_HEADER, VINEXT_PRERENDER_PAGES_STATIC_PATHS_PATH, VINEXT_PRERENDER_ROUTE_PARAMS_HEADER, VINEXT_PRERENDER_SECRET_HEADER, VINEXT_PRERENDER_STATIC_PARAMS_PATH, VINEXT_REVALIDATE_HEADER, VINEXT_RSC_MARKER_HEADER, VINEXT_RSC_REDIRECT_HEADER, VINEXT_RSC_RENDER_MODE_HEADER, VINEXT_STATIC_FILE_HEADER, VINEXT_TIMING_HEADER };
|
package/dist/server/headers.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { MIDDLEWARE_HEADER_PREFIX, MIDDLEWARE_OVERRIDE_HEADERS, MIDDLEWARE_SET_COOKIE_HEADER, VINEXT_MW_CTX_HEADER, VINEXT_PRERENDER_ROUTE_PARAMS_HEADER, VINEXT_PRERENDER_SECRET_HEADER } from "../utils/protocol-headers.js";
|
|
1
2
|
//#region src/server/headers.ts
|
|
2
3
|
/**
|
|
3
4
|
* Internal HTTP header name constants used throughout vinext.
|
|
@@ -15,14 +16,8 @@ const VINEXT_CACHE_HEADER = "X-Vinext-Cache";
|
|
|
15
16
|
const NEXTJS_CACHE_HEADER = "x-nextjs-cache";
|
|
16
17
|
/** Static file signal — value is URL-encoded pathname. */
|
|
17
18
|
const VINEXT_STATIC_FILE_HEADER = "x-vinext-static-file";
|
|
18
|
-
/** Serialized middleware context (JSON) forwarded from dev server to RSC entry. */
|
|
19
|
-
const VINEXT_MW_CTX_HEADER = "x-vinext-mw-ctx";
|
|
20
19
|
/** Timing metrics: `handlerStart,compileMs,renderMs`. */
|
|
21
20
|
const VINEXT_TIMING_HEADER = "x-vinext-timing";
|
|
22
|
-
/** Build-time prerender authentication secret. */
|
|
23
|
-
const VINEXT_PRERENDER_SECRET_HEADER = "x-vinext-prerender-secret";
|
|
24
|
-
/** URL-encoded JSON route params for build-time prerender renders. */
|
|
25
|
-
const VINEXT_PRERENDER_ROUTE_PARAMS_HEADER = "x-vinext-prerender-route-params";
|
|
26
21
|
/** Internal endpoint used to evaluate App Router generateStaticParams exports. */
|
|
27
22
|
const VINEXT_PRERENDER_STATIC_PARAMS_PATH = "/__vinext/prerender/static-params";
|
|
28
23
|
/** Internal endpoint used to evaluate Pages Router getStaticPaths exports. */
|
|
@@ -81,12 +76,6 @@ const ACTION_REDIRECT_HEADER = "x-action-redirect";
|
|
|
81
76
|
const ACTION_REDIRECT_TYPE_HEADER = "x-action-redirect-type";
|
|
82
77
|
/** HTTP status for a Server Action redirect (e.g. "308"). */
|
|
83
78
|
const ACTION_REDIRECT_STATUS_HEADER = "x-action-redirect-status";
|
|
84
|
-
/** Prefix for forwarded request headers (e.g. `x-middleware-request-cookie`). */
|
|
85
|
-
const MIDDLEWARE_REQUEST_HEADER_PREFIX = "x-middleware-request-";
|
|
86
|
-
/** Comma-separated list of header names that middleware wants to override. */
|
|
87
|
-
const MIDDLEWARE_OVERRIDE_HEADERS = "x-middleware-override-headers";
|
|
88
|
-
/** Carries cookies set by middleware for same-render reads. */
|
|
89
|
-
const MIDDLEWARE_SET_COOKIE_HEADER = "x-middleware-set-cookie";
|
|
90
79
|
/** Signal from `NextResponse.next()` — value "1" means "continue to next handler". */
|
|
91
80
|
const MIDDLEWARE_NEXT_HEADER = "x-middleware-next";
|
|
92
81
|
/** Rewrite destination URL set by `NextResponse.rewrite()`. */
|
|
@@ -95,12 +84,12 @@ const MIDDLEWARE_REWRITE_HEADER = "x-middleware-rewrite";
|
|
|
95
84
|
const MIDDLEWARE_REDIRECT_HEADER = "x-middleware-redirect";
|
|
96
85
|
/** Skip-middleware signal. */
|
|
97
86
|
const MIDDLEWARE_SKIP_HEADER = "x-middleware-skip";
|
|
98
|
-
/** Generic prefix for all middleware internal headers. */
|
|
99
|
-
const MIDDLEWARE_HEADER_PREFIX = "x-middleware-";
|
|
100
87
|
const NEXT_ROUTER_STATE_TREE_HEADER = "Next-Router-State-Tree";
|
|
101
88
|
const NEXT_ROUTER_PREFETCH_HEADER = "Next-Router-Prefetch";
|
|
102
89
|
const NEXT_ROUTER_SEGMENT_PREFETCH_HEADER = "Next-Router-Segment-Prefetch";
|
|
103
90
|
const NEXT_URL_HEADER = "Next-Url";
|
|
91
|
+
const NEXT_REQUEST_ID_HEADER = "x-nextjs-request-id";
|
|
92
|
+
const NEXT_HTML_REQUEST_ID_HEADER = "x-nextjs-html-request-id";
|
|
104
93
|
/** Lowercase flight header variants used in middleware forwarding. */
|
|
105
94
|
const FLIGHT_HEADERS = [
|
|
106
95
|
"rsc",
|
|
@@ -133,4 +122,4 @@ const INTERNAL_HEADERS = [
|
|
|
133
122
|
/** Vinext-only internal headers stripped alongside Next.js protocol internals. */
|
|
134
123
|
const VINEXT_INTERNAL_HEADERS = [VINEXT_PRERENDER_ROUTE_PARAMS_HEADER];
|
|
135
124
|
//#endregion
|
|
136
|
-
export { ACTION_FORWARDED_HEADER, ACTION_REDIRECT_HEADER, ACTION_REDIRECT_STATUS_HEADER, ACTION_REDIRECT_TYPE_HEADER, ACTION_REVALIDATED_HEADER, FLIGHT_HEADERS, INTERNAL_HEADERS, MIDDLEWARE_HEADER_PREFIX, MIDDLEWARE_NEXT_HEADER,
|
|
125
|
+
export { ACTION_FORWARDED_HEADER, ACTION_REDIRECT_HEADER, ACTION_REDIRECT_STATUS_HEADER, ACTION_REDIRECT_TYPE_HEADER, ACTION_REVALIDATED_HEADER, FLIGHT_HEADERS, INTERNAL_HEADERS, MIDDLEWARE_HEADER_PREFIX, MIDDLEWARE_NEXT_HEADER, MIDDLEWARE_REWRITE_HEADER, MIDDLEWARE_SET_COOKIE_HEADER, NEXTJS_ACTION_NOT_FOUND_HEADER, NEXTJS_CACHE_HEADER, NEXTJS_DEPLOYMENT_ID_HEADER, NEXT_ACTION_HEADER, NEXT_HTML_REQUEST_ID_HEADER, NEXT_REQUEST_ID_HEADER, NEXT_ROUTER_PREFETCH_HEADER, NEXT_ROUTER_SEGMENT_PREFETCH_HEADER, NEXT_ROUTER_STATE_TREE_HEADER, NEXT_URL_HEADER, RSC_ACTION_HEADER, RSC_HEADER, VINEXT_CACHE_HEADER, VINEXT_CLIENT_REUSE_MANIFEST_HEADER, VINEXT_DYNAMIC_STALE_TIME_HEADER, VINEXT_INTERCEPTION_CONTEXT_HEADER, VINEXT_INTERNAL_HEADERS, VINEXT_MOUNTED_SLOTS_HEADER, VINEXT_MW_CTX_HEADER, VINEXT_PARAMS_HEADER, VINEXT_PRERENDER_PAGES_STATIC_PATHS_PATH, VINEXT_PRERENDER_ROUTE_PARAMS_HEADER, VINEXT_PRERENDER_SECRET_HEADER, VINEXT_PRERENDER_STATIC_PARAMS_PATH, VINEXT_REVALIDATE_HEADER, VINEXT_RSC_MARKER_HEADER, VINEXT_RSC_REDIRECT_HEADER, VINEXT_RSC_RENDER_MODE_HEADER, VINEXT_STATIC_FILE_HEADER, VINEXT_TIMING_HEADER };
|
|
@@ -121,5 +121,55 @@ type ImageHandlers = {
|
|
|
121
121
|
* cache headers.
|
|
122
122
|
*/
|
|
123
123
|
declare function handleImageOptimization(request: Request, handlers: ImageHandlers, allowedWidths?: number[], imageConfig?: ImageConfig): Promise<Response>;
|
|
124
|
+
/**
|
|
125
|
+
* A server-side image optimizer: the transform backend that resizes/transcodes
|
|
126
|
+
* a source image. Produced by an adapter factory (e.g. `imagesOptimizer()` from
|
|
127
|
+
* `@vinext/cloudflare/images/images-optimizer`) and registered via
|
|
128
|
+
* {@link setImageOptimizer}.
|
|
129
|
+
*/
|
|
130
|
+
type ImageOptimizer = {
|
|
131
|
+
/** Transform the source image (resize, format, quality). */transformImage: (body: ReadableStream, options: {
|
|
132
|
+
width: number;
|
|
133
|
+
format: string;
|
|
134
|
+
quality: number;
|
|
135
|
+
}) => Promise<Response>;
|
|
136
|
+
};
|
|
137
|
+
/**
|
|
138
|
+
* Register the active image optimizer (transform backend). An explicit
|
|
139
|
+
* registration always wins; passing `null` clears it (falling back to
|
|
140
|
+
* unoptimized passthrough).
|
|
141
|
+
*
|
|
142
|
+
* Configure this declaratively via the `images.optimizer` option on the
|
|
143
|
+
* `vinext()` plugin in your `vite.config.ts` rather than calling it directly.
|
|
144
|
+
* On Cloudflare Workers:
|
|
145
|
+
*
|
|
146
|
+
* ```ts
|
|
147
|
+
* import { vinext } from "vinext";
|
|
148
|
+
* import { imagesOptimizer } from "@vinext/cloudflare/images/images-optimizer";
|
|
149
|
+
*
|
|
150
|
+
* export default defineConfig({
|
|
151
|
+
* plugins: [vinext({ images: { optimizer: imagesOptimizer() } })],
|
|
152
|
+
* });
|
|
153
|
+
* ```
|
|
154
|
+
*
|
|
155
|
+
* The plugin registers the optimizer across every runtime/router entry, so you
|
|
156
|
+
* don't have to wire `env.IMAGES` into a custom worker entry. This setter
|
|
157
|
+
* remains the internal registration target.
|
|
158
|
+
*/
|
|
159
|
+
declare function setImageOptimizer(optimizer: ImageOptimizer | null): void;
|
|
160
|
+
/** Get the active image optimizer, or `null` when none is configured. */
|
|
161
|
+
declare function getImageOptimizer(): ImageOptimizer | null;
|
|
162
|
+
/**
|
|
163
|
+
* Handle an image optimization request using the configured optimizer (if any).
|
|
164
|
+
*
|
|
165
|
+
* This is the single entry point every runtime/router seam (App Router worker,
|
|
166
|
+
* Pages worker, Node prod server) should call: it reads the registered
|
|
167
|
+
* {@link ImageOptimizer} and wires its `transformImage` into
|
|
168
|
+
* {@link handleImageOptimization}, with the caller supplying the runtime's
|
|
169
|
+
* `fetchAsset` (e.g. the Cloudflare `ASSETS` binding, or filesystem reads on
|
|
170
|
+
* Node). When no optimizer is registered, the request is served unoptimized
|
|
171
|
+
* (passthrough) with the same security/cache headers.
|
|
172
|
+
*/
|
|
173
|
+
declare function handleConfiguredImageOptimization(request: Request, fetchAsset: (path: string, request: Request) => Promise<Response>, allowedWidths?: number[], imageConfig?: ImageConfig): Promise<Response>;
|
|
124
174
|
//#endregion
|
|
125
|
-
export { DEFAULT_DEVICE_SIZES, DEFAULT_IMAGE_SIZES, IMAGE_CACHE_CONTROL, IMAGE_CONTENT_SECURITY_POLICY, IMAGE_OPTIMIZATION_PATH, ImageConfig, ImageHandlers, ParseImageParamsOptions, VINEXT_IMAGE_OPTIMIZATION_PATH, handleImageOptimization, isImageOptimizationPath, isSafeImageContentType, negotiateImageFormat, parseImageParams, resolveDevImageRedirect };
|
|
175
|
+
export { DEFAULT_DEVICE_SIZES, DEFAULT_IMAGE_SIZES, IMAGE_CACHE_CONTROL, IMAGE_CONTENT_SECURITY_POLICY, IMAGE_OPTIMIZATION_PATH, ImageConfig, ImageHandlers, ImageOptimizer, ParseImageParamsOptions, VINEXT_IMAGE_OPTIMIZATION_PATH, getImageOptimizer, handleConfiguredImageOptimization, handleImageOptimization, isImageOptimizationPath, isSafeImageContentType, negotiateImageFormat, parseImageParams, resolveDevImageRedirect, setImageOptimizer };
|