@qzsy/vinext 0.1.12 → 0.1.81
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 +19 -5
- package/dist/build/inject-pregenerated-paths.d.ts +4 -0
- package/dist/build/inject-pregenerated-paths.js +18 -0
- 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 +11 -4
- package/dist/build/report.d.ts +2 -1
- package/dist/build/report.js +2 -1
- package/dist/build/run-prerender.d.ts +7 -0
- package/dist/build/run-prerender.js +9 -0
- package/dist/build/standalone.js +2 -0
- package/dist/check.d.ts +18 -0
- package/dist/check.js +77 -19
- package/dist/cli-dev-config.d.ts +12 -0
- package/dist/cli-dev-config.js +23 -0
- package/dist/cli.js +64 -28
- 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/cloudflare/deploy-config.d.ts +51 -0
- package/dist/cloudflare/deploy-config.js +153 -0
- package/dist/cloudflare/index.d.ts +1 -1
- package/dist/cloudflare/index.js +1 -1
- package/dist/cloudflare/project.d.ts +41 -0
- package/dist/cloudflare/project.js +243 -0
- package/dist/cloudflare/tpr.js +1 -1
- 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/server-external-packages.d.ts +4 -0
- package/dist/config/server-external-packages.js +91 -0
- package/dist/deploy.d.ts +2 -122
- package/dist/deploy.js +20 -793
- package/dist/entries/app-rsc-entry.d.ts +2 -1
- package/dist/entries/app-rsc-entry.js +70 -12
- package/dist/entries/app-rsc-manifest.js +8 -0
- package/dist/entries/pages-client-entry.d.ts +1 -0
- package/dist/entries/pages-client-entry.js +2 -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 +50 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.js +160 -160
- package/dist/init-cloudflare.d.ts +43 -0
- package/dist/init-cloudflare.js +1000 -0
- package/dist/init-platform.d.ts +38 -0
- package/dist/init-platform.js +150 -0
- package/dist/init.d.ts +14 -37
- package/dist/init.js +205 -95
- 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/plugins/ast-scope.d.ts +16 -0
- package/dist/plugins/ast-scope.js +62 -0
- package/dist/plugins/ast-utils.js +3 -0
- package/dist/plugins/css-module-imports.d.ts +14 -0
- package/dist/plugins/css-module-imports.js +59 -0
- 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 +13 -2
- package/dist/routing/app-route-graph.js +116 -32
- 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/app-browser-action-result.d.ts +2 -1
- package/dist/server/app-browser-action-result.js +5 -1
- package/dist/server/app-browser-entry.js +17 -12
- 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.js +1 -0
- package/dist/server/app-browser-server-action-client.js +2 -3
- package/dist/server/app-browser-state.d.ts +1 -0
- package/dist/server/app-browser-state.js +3 -2
- package/dist/server/app-fallback-renderer.d.ts +3 -2
- package/dist/server/app-fallback-renderer.js +12 -7
- package/dist/server/app-middleware.d.ts +2 -3
- package/dist/server/app-middleware.js +3 -2
- package/dist/server/app-optimistic-routing.js +1 -1
- package/dist/server/app-page-boundary-render.d.ts +1 -0
- package/dist/server/app-page-boundary-render.js +12 -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 +4 -1
- package/dist/server/app-page-dispatch.d.ts +11 -3
- package/dist/server/app-page-dispatch.js +55 -15
- package/dist/server/app-page-element-builder.d.ts +5 -1
- package/dist/server/app-page-element-builder.js +57 -20
- package/dist/server/app-page-head.d.ts +12 -0
- package/dist/server/app-page-head.js +42 -19
- package/dist/server/app-page-params.d.ts +2 -1
- package/dist/server/app-page-params.js +8 -1
- 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 +8 -3
- package/dist/server/app-page-request.d.ts +22 -1
- package/dist/server/app-page-request.js +89 -13
- package/dist/server/app-page-route-wiring.d.ts +6 -1
- package/dist/server/app-page-route-wiring.js +31 -15
- 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.js +2 -0
- 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.d.ts +12 -0
- package/dist/server/app-router-entry.js +22 -8
- package/dist/server/app-router-image-optimization.d.ts +37 -0
- package/dist/server/app-router-image-optimization.js +40 -0
- package/dist/server/app-rsc-errors.js +7 -1
- package/dist/server/app-rsc-handler.js +27 -14
- 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 +106 -33
- package/dist/server/app-ssr-entry.js +12 -1
- package/dist/server/app-static-generation.d.ts +1 -0
- package/dist/server/app-static-generation.js +1 -0
- 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-response-headers.d.ts +19 -0
- package/dist/server/dev-response-headers.js +78 -0
- package/dist/server/dev-server.js +8 -15
- package/dist/server/dev-stack-sourcemap.d.ts +1 -1
- package/dist/server/dev-stack-sourcemap.js +1 -1
- package/dist/server/headers.d.ts +7 -15
- package/dist/server/headers.js +6 -15
- package/dist/server/image-optimization.d.ts +51 -1
- package/dist/server/image-optimization.js +52 -2
- package/dist/server/isr-cache.d.ts +1 -1
- package/dist/server/isr-cache.js +2 -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-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-page-data.d.ts +23 -1
- package/dist/server/pages-page-data.js +43 -24
- package/dist/server/pages-page-handler.d.ts +2 -1
- package/dist/server/pages-page-handler.js +10 -4
- package/dist/server/pages-request-pipeline.d.ts +2 -0
- package/dist/server/pages-request-pipeline.js +25 -1
- 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 +47 -25
- package/dist/server/request-log.d.ts +5 -14
- package/dist/server/request-log.js +7 -1
- package/dist/server/request-pipeline.js +1 -0
- package/dist/server/seed-cache.js +4 -4
- package/dist/server/server-action-logger.d.ts +39 -0
- package/dist/server/server-action-logger.js +104 -0
- 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-optimization-url.d.ts +4 -0
- package/dist/shims/image-optimization-url.js +33 -1
- package/dist/shims/image.js +46 -13
- 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 -5
- package/dist/shims/internal/hybrid-client-route-owner.js +9 -60
- package/dist/shims/internal/pages-router-components.d.ts +7 -0
- package/dist/shims/internal/pages-router-components.js +13 -0
- package/dist/shims/link.js +23 -16
- package/dist/shims/metadata.d.ts +3 -2
- package/dist/shims/metadata.js +8 -4
- package/dist/shims/navigation.js +4 -2
- package/dist/shims/root-params.d.ts +15 -1
- package/dist/shims/root-params.js +21 -1
- package/dist/shims/router.d.ts +2 -5
- package/dist/shims/router.js +41 -22
- package/dist/shims/server.js +3 -2
- 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 +9 -1
- package/dist/utils/project.js +21 -4
- 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 +29 -23
- package/dist/server/dev-stack-sourcemap-endpoint.d.ts +0 -4
- /package/dist/{cloudflare → packages/cloudflare}/src/utils/cache-control-metadata.js +0 -0
|
@@ -5,14 +5,16 @@ import { isExternalUrl } from "../config/config-matchers.js";
|
|
|
5
5
|
import { internalServerErrorResponse, payloadTooLargeResponse } from "./http-error-responses.js";
|
|
6
6
|
import { validateCsrfOrigin, validateServerActionPayload } from "./request-pipeline.js";
|
|
7
7
|
import { APP_RSC_RENDER_MODE_ACTION_RERENDER_PRESERVE_UI } from "./app-rsc-render-mode.js";
|
|
8
|
-
import { headersContextFromRequest, setHeadersContext } from "../shims/headers.js";
|
|
8
|
+
import { headersContextFromRequest, isDraftModeRequest, setHeadersContext } from "../shims/headers.js";
|
|
9
9
|
import { getAndClearActionRevalidationKind } from "../shims/cache-request-state.js";
|
|
10
10
|
import { setCurrentFetchCacheMode, setCurrentFetchSoftTags, setCurrentForceDynamicFetchDefault } from "../shims/fetch-cache.js";
|
|
11
|
+
import { applyServerActionLogHeader, createServerActionLogInfo, isDevServerActionLoggingEnabled } from "./server-action-logger.js";
|
|
11
12
|
import { readStreamAsTextWithLimit } from "../utils/text-stream.js";
|
|
12
13
|
import { VINEXT_RSC_CONTENT_TYPE, VINEXT_RSC_VARY_HEADER, applyRscCompatibilityIdHeader } from "./app-rsc-cache-busting.js";
|
|
13
14
|
import { mergeMiddlewareResponseHeaders } from "./middleware-response-headers.js";
|
|
14
15
|
import { applyEdgeRuntimeHeader } from "./app-page-response.js";
|
|
15
16
|
import { getNextErrorDigest, parseNextHttpErrorDigest, parseNextRedirectDigest } from "./next-error-digest.js";
|
|
17
|
+
import { createRootParamsUsageController, pickRootParams, runWithRootParamsScope, runWithRootParamsUsage } from "../shims/root-params.js";
|
|
16
18
|
import { createServerActionNotFoundResponse, getServerActionNotFoundMessage, isServerActionNotFoundError } from "./server-action-not-found.js";
|
|
17
19
|
import { deferUntilStreamConsumed } from "./defer-until-stream-consumed.js";
|
|
18
20
|
import "./app-page-stream.js";
|
|
@@ -20,7 +22,29 @@ import { buildAppPageTags } from "./implicit-tags.js";
|
|
|
20
22
|
import { resolveAppPageNavigationParams } from "./app-page-element-builder.js";
|
|
21
23
|
import { resolveAppPageActionRerenderTarget } from "./app-page-request.js";
|
|
22
24
|
import { getSetCookieName } from "./cookie-utils.js";
|
|
25
|
+
import { createStaticGenerationHeadersContext } from "./app-static-generation.js";
|
|
23
26
|
//#region src/server/app-server-action-execution.ts
|
|
27
|
+
function prepareActionPageRerenderContext(options) {
|
|
28
|
+
if (options.dynamicConfig === "force-static" || options.dynamicConfig === "error") setHeadersContext(createStaticGenerationHeadersContext({
|
|
29
|
+
draftModeEnabled: isDraftModeRequest(createActionRerenderRequest({
|
|
30
|
+
draftModeCookie: options.draftModeCookie,
|
|
31
|
+
request: options.request
|
|
32
|
+
}), options.draftModeSecret),
|
|
33
|
+
draftModeSecret: options.draftModeSecret,
|
|
34
|
+
dynamicConfig: options.dynamicConfig,
|
|
35
|
+
routeKind: "page",
|
|
36
|
+
routePattern: options.routePattern
|
|
37
|
+
}));
|
|
38
|
+
return options.dynamicConfig === "force-static" ? new URLSearchParams() : options.searchParams;
|
|
39
|
+
}
|
|
40
|
+
function createActionRerenderRequest(options) {
|
|
41
|
+
if (!options.draftModeCookie) return options.request;
|
|
42
|
+
const headers = new Headers(options.request.headers);
|
|
43
|
+
const cookieHeader = applySetCookieMutationsToRequestCookieHeader(headers.get("cookie"), [options.draftModeCookie]);
|
|
44
|
+
if (cookieHeader === null) headers.delete("cookie");
|
|
45
|
+
else headers.set("cookie", cookieHeader);
|
|
46
|
+
return new Request(options.request.url, { headers });
|
|
47
|
+
}
|
|
24
48
|
/**
|
|
25
49
|
* Matches Next.js' server action argument cap to prevent stack overflow in
|
|
26
50
|
* Function.prototype.apply when decoding hostile action payloads.
|
|
@@ -351,11 +375,14 @@ async function handleProgressiveServerActionRequest(options) {
|
|
|
351
375
|
let actionRedirect = null;
|
|
352
376
|
let actionError = void 0;
|
|
353
377
|
let actionFailed = false;
|
|
378
|
+
let actionThrew = false;
|
|
354
379
|
let actionResult;
|
|
380
|
+
const rootParamsUsage = createRootParamsUsageController();
|
|
355
381
|
const previousHeadersPhase = options.setHeadersAccessPhase("action");
|
|
356
382
|
try {
|
|
357
|
-
actionResult = await action
|
|
383
|
+
actionResult = await runWithRootParamsUsage({ kind: "server-action" }, action, rootParamsUsage);
|
|
358
384
|
} catch (error) {
|
|
385
|
+
actionThrew = true;
|
|
359
386
|
actionRedirect = getActionRedirect(error);
|
|
360
387
|
if (!actionRedirect) {
|
|
361
388
|
actionError = error;
|
|
@@ -375,8 +402,10 @@ async function handleProgressiveServerActionRequest(options) {
|
|
|
375
402
|
}
|
|
376
403
|
} finally {
|
|
377
404
|
options.setHeadersAccessPhase(previousHeadersPhase);
|
|
405
|
+
if (actionThrew) rootParamsUsage.transitionToRender();
|
|
378
406
|
}
|
|
379
407
|
if (!actionRedirect) {
|
|
408
|
+
if (!actionThrew) rootParamsUsage.transitionToRender();
|
|
380
409
|
const actionPendingCookies = dedupePendingCookies(options.getAndClearPendingCookies());
|
|
381
410
|
const actionDraftCookie = options.getDraftModeCookieHeader();
|
|
382
411
|
const revalidationKind = resolveActionRevalidationKind(actionPendingCookies.length > 0 || Boolean(actionDraftCookie));
|
|
@@ -544,16 +573,22 @@ async function handleServerActionRscRequest(options) {
|
|
|
544
573
|
let returnValue;
|
|
545
574
|
let actionRedirect = null;
|
|
546
575
|
let actionStatus = 200;
|
|
576
|
+
let actionThrew = false;
|
|
547
577
|
const actionWasForwarded = Boolean(options.request.headers.get(ACTION_FORWARDED_HEADER));
|
|
578
|
+
const rootParamsUsage = createRootParamsUsageController();
|
|
579
|
+
const shouldLogAction = isDevServerActionLoggingEnabled();
|
|
580
|
+
const actionLogStart = shouldLogAction ? performance.now() : 0;
|
|
581
|
+
let actionLogInfo = null;
|
|
548
582
|
const previousHeadersPhase = options.setHeadersAccessPhase("action");
|
|
549
583
|
try {
|
|
550
584
|
try {
|
|
551
585
|
validateServerActionArgs(args);
|
|
552
586
|
returnValue = {
|
|
553
587
|
ok: true,
|
|
554
|
-
data: await action.apply(null, args)
|
|
588
|
+
data: await runWithRootParamsUsage({ kind: "server-action" }, () => action.apply(null, args), rootParamsUsage)
|
|
555
589
|
};
|
|
556
590
|
} catch (error) {
|
|
591
|
+
actionThrew = true;
|
|
557
592
|
actionRedirect = getActionRedirect(error);
|
|
558
593
|
if (actionRedirect) returnValue = {
|
|
559
594
|
ok: true,
|
|
@@ -568,6 +603,7 @@ async function handleServerActionRscRequest(options) {
|
|
|
568
603
|
data: error
|
|
569
604
|
};
|
|
570
605
|
} else {
|
|
606
|
+
actionStatus = 500;
|
|
571
607
|
console.error("[vinext] Server action error:", error);
|
|
572
608
|
returnValue = {
|
|
573
609
|
ok: false,
|
|
@@ -577,7 +613,13 @@ async function handleServerActionRscRequest(options) {
|
|
|
577
613
|
}
|
|
578
614
|
}
|
|
579
615
|
} finally {
|
|
616
|
+
if (shouldLogAction) actionLogInfo = createServerActionLogInfo({
|
|
617
|
+
actionId: options.actionId,
|
|
618
|
+
args,
|
|
619
|
+
durationMs: Math.round(performance.now() - actionLogStart)
|
|
620
|
+
});
|
|
580
621
|
options.setHeadersAccessPhase(previousHeadersPhase);
|
|
622
|
+
if (actionThrew && !actionWasForwarded) rootParamsUsage.transitionToRender();
|
|
581
623
|
}
|
|
582
624
|
if (actionRedirect) {
|
|
583
625
|
const actionPendingCookies = dedupePendingCookies(options.getAndClearPendingCookies());
|
|
@@ -597,6 +639,7 @@ async function handleServerActionRscRequest(options) {
|
|
|
597
639
|
for (const cookie of actionPendingCookies) redirectHeaders.append("Set-Cookie", cookie);
|
|
598
640
|
if (actionDraftCookie) redirectHeaders.append("Set-Cookie", actionDraftCookie);
|
|
599
641
|
setActionRevalidatedHeader(redirectHeaders, actionRevalidationKind);
|
|
642
|
+
applyServerActionLogHeader(redirectHeaders, actionLogInfo);
|
|
600
643
|
const redirectTarget = resolveInternalActionRedirectTarget(actionRedirectUrl, options.request.url, options.basePath ?? "");
|
|
601
644
|
if (!redirectTarget) {
|
|
602
645
|
options.clearRequestContext();
|
|
@@ -622,35 +665,48 @@ async function handleServerActionRscRequest(options) {
|
|
|
622
665
|
request: options.request,
|
|
623
666
|
url: redirectTarget
|
|
624
667
|
});
|
|
625
|
-
setHeadersContext(headersContextFromRequest(redirectRenderRequest));
|
|
668
|
+
setHeadersContext(headersContextFromRequest(redirectRenderRequest, { draftModeSecret: options.draftModeSecret }));
|
|
669
|
+
const redirectDynamicConfig = options.resolveRouteDynamicConfig?.(targetMatch.route);
|
|
670
|
+
const redirectSearchParams = prepareActionPageRerenderContext({
|
|
671
|
+
draftModeCookie: actionDraftCookie,
|
|
672
|
+
draftModeSecret: options.draftModeSecret,
|
|
673
|
+
dynamicConfig: redirectDynamicConfig,
|
|
674
|
+
request: redirectRenderRequest,
|
|
675
|
+
routePattern: targetMatch.route.pattern,
|
|
676
|
+
searchParams: redirectTarget.searchParams
|
|
677
|
+
});
|
|
626
678
|
const redirectNavigationParams = resolveAppPageNavigationParams(targetMatch.route, targetMatch.params, targetPathname, null);
|
|
627
679
|
options.setNavigationContext({
|
|
628
680
|
pathname: targetPathname,
|
|
629
|
-
searchParams:
|
|
681
|
+
searchParams: redirectSearchParams,
|
|
630
682
|
params: redirectNavigationParams
|
|
631
683
|
});
|
|
632
684
|
setCurrentFetchCacheMode(options.resolveRouteFetchCacheMode?.(targetMatch.route) ?? null);
|
|
633
|
-
setCurrentForceDynamicFetchDefault(
|
|
685
|
+
setCurrentForceDynamicFetchDefault(redirectDynamicConfig === "force-dynamic");
|
|
634
686
|
setCurrentFetchSoftTags(buildServerActionPageTags(targetMatch.route, targetPathname));
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
687
|
+
return createServerActionRscResponse(await runWithRootParamsScope(pickRootParams(targetMatch.params, targetMatch.route.rootParamNames), () => runWithRootParamsUsage({ kind: "route" }, async () => {
|
|
688
|
+
const element = options.buildPageElement({
|
|
689
|
+
cleanPathname: targetPathname,
|
|
690
|
+
interceptOpts: void 0,
|
|
691
|
+
isRscRequest: true,
|
|
692
|
+
mountedSlotsHeader: null,
|
|
693
|
+
params: targetMatch.params,
|
|
694
|
+
request: redirectRenderRequest,
|
|
695
|
+
route: targetMatch.route,
|
|
696
|
+
searchParams: redirectSearchParams,
|
|
697
|
+
renderMode: APP_RSC_RENDER_MODE_ACTION_RERENDER_PRESERVE_UI,
|
|
698
|
+
observeMetadataSearchParamsAccess: redirectDynamicConfig !== "force-static",
|
|
699
|
+
observePageSearchParamsAccess: redirectDynamicConfig !== "force-static"
|
|
700
|
+
});
|
|
701
|
+
const onRenderError = options.createRscOnErrorHandler(redirectRenderRequest, targetPathname, targetMatch.route.pattern);
|
|
702
|
+
return options.renderToReadableStream({
|
|
703
|
+
root: element,
|
|
704
|
+
returnValue
|
|
705
|
+
}, {
|
|
706
|
+
temporaryReferences,
|
|
707
|
+
onError: onRenderError
|
|
708
|
+
});
|
|
709
|
+
})), {
|
|
654
710
|
status: shouldUseForwardedActionRedirectStatus({
|
|
655
711
|
actionWasForwarded,
|
|
656
712
|
currentPathname: options.cleanPathname,
|
|
@@ -665,7 +721,8 @@ async function handleServerActionRscRequest(options) {
|
|
|
665
721
|
const actionPendingCookies = dedupePendingCookies(options.getAndClearPendingCookies());
|
|
666
722
|
const actionDraftCookie = options.getDraftModeCookieHeader();
|
|
667
723
|
const actionRevalidationKind = resolveActionRevalidationKind(actionPendingCookies.length > 0 || Boolean(actionDraftCookie));
|
|
668
|
-
|
|
724
|
+
const isHttpFallback = actionStatus === 401 || actionStatus === 403 || actionStatus === 404;
|
|
725
|
+
if (!isHttpFallback && (actionWasForwarded || actionRevalidationKind === ACTION_DID_NOT_REVALIDATE)) {
|
|
669
726
|
const onRenderError = options.createRscOnErrorHandler(options.request, options.cleanPathname, options.cleanPathname);
|
|
670
727
|
const rscStream = await options.renderToReadableStream({ returnValue }, {
|
|
671
728
|
temporaryReferences,
|
|
@@ -681,11 +738,13 @@ async function handleServerActionRscRequest(options) {
|
|
|
681
738
|
for (const cookie of actionPendingCookies) actionHeaders.append("Set-Cookie", cookie);
|
|
682
739
|
if (actionDraftCookie) actionHeaders.append("Set-Cookie", actionDraftCookie);
|
|
683
740
|
setActionRevalidatedHeader(actionHeaders, actionRevalidationKind);
|
|
741
|
+
applyServerActionLogHeader(actionHeaders, actionLogInfo);
|
|
684
742
|
return createServerActionRscResponse(rscStream, {
|
|
685
743
|
status: options.middlewareStatus ?? actionStatus,
|
|
686
744
|
headers: actionHeaders
|
|
687
745
|
}, options.clearRequestContext);
|
|
688
746
|
}
|
|
747
|
+
if (!actionThrew) rootParamsUsage.transitionToRender();
|
|
689
748
|
const match = options.matchRoute(options.cleanPathname);
|
|
690
749
|
let element;
|
|
691
750
|
let errorPattern = match ? match.route.pattern : options.cleanPathname;
|
|
@@ -702,16 +761,25 @@ async function handleServerActionRscRequest(options) {
|
|
|
702
761
|
toInterceptOpts: options.toInterceptOpts
|
|
703
762
|
});
|
|
704
763
|
const resolvedActionNavigationParams = resolveAppPageNavigationParams(actionRerenderTarget.route, actionRerenderTarget.navigationParams, options.cleanPathname, actionRerenderTarget.interceptOpts);
|
|
764
|
+
await options.ensureRouteLoaded?.(actionRerenderTarget.route);
|
|
765
|
+
const actionRerenderDynamicConfig = options.resolveRouteDynamicConfig?.(actionRerenderTarget.route);
|
|
766
|
+
const actionRerenderSearchParams = prepareActionPageRerenderContext({
|
|
767
|
+
draftModeCookie: actionDraftCookie,
|
|
768
|
+
draftModeSecret: options.draftModeSecret,
|
|
769
|
+
dynamicConfig: actionRerenderDynamicConfig,
|
|
770
|
+
request: options.request,
|
|
771
|
+
routePattern: actionRerenderTarget.route.pattern,
|
|
772
|
+
searchParams: options.searchParams
|
|
773
|
+
});
|
|
705
774
|
options.setNavigationContext({
|
|
706
775
|
pathname: options.cleanPathname,
|
|
707
|
-
searchParams:
|
|
776
|
+
searchParams: actionRerenderSearchParams,
|
|
708
777
|
params: resolvedActionNavigationParams
|
|
709
778
|
});
|
|
710
|
-
await options.ensureRouteLoaded?.(actionRerenderTarget.route);
|
|
711
779
|
setCurrentFetchCacheMode(options.resolveRouteFetchCacheMode?.(actionRerenderTarget.route) ?? null);
|
|
712
|
-
setCurrentForceDynamicFetchDefault(
|
|
780
|
+
setCurrentForceDynamicFetchDefault(actionRerenderDynamicConfig === "force-dynamic");
|
|
713
781
|
setCurrentFetchSoftTags(buildServerActionPageTags(actionRerenderTarget.route, options.cleanPathname));
|
|
714
|
-
|
|
782
|
+
const buildActionRerenderElement = () => options.buildPageElement({
|
|
715
783
|
cleanPathname: options.cleanPathname,
|
|
716
784
|
interceptOpts: actionRerenderTarget.interceptOpts,
|
|
717
785
|
isRscRequest: options.isRscRequest,
|
|
@@ -719,22 +787,26 @@ async function handleServerActionRscRequest(options) {
|
|
|
719
787
|
params: actionRerenderTarget.params,
|
|
720
788
|
request: options.request,
|
|
721
789
|
route: actionRerenderTarget.route,
|
|
722
|
-
searchParams:
|
|
723
|
-
renderMode: APP_RSC_RENDER_MODE_ACTION_RERENDER_PRESERVE_UI
|
|
790
|
+
searchParams: actionRerenderSearchParams,
|
|
791
|
+
renderMode: APP_RSC_RENDER_MODE_ACTION_RERENDER_PRESERVE_UI,
|
|
792
|
+
observeMetadataSearchParamsAccess: actionRerenderDynamicConfig !== "force-static",
|
|
793
|
+
observePageSearchParamsAccess: actionRerenderDynamicConfig !== "force-static"
|
|
724
794
|
});
|
|
795
|
+
element = actionWasForwarded && isHttpFallback ? await runWithRootParamsUsage({ kind: "route" }, async () => buildActionRerenderElement()) : buildActionRerenderElement();
|
|
725
796
|
errorPattern = actionRerenderTarget.route.pattern;
|
|
726
797
|
} else {
|
|
727
798
|
const actionRouteId = options.createPayloadRouteId(options.cleanPathname, null);
|
|
728
799
|
element = options.createNotFoundElement(actionRouteId);
|
|
729
800
|
}
|
|
730
801
|
const onRenderError = options.createRscOnErrorHandler(options.request, options.cleanPathname, errorPattern);
|
|
731
|
-
const
|
|
802
|
+
const renderActionRerender = () => options.renderToReadableStream({
|
|
732
803
|
root: element,
|
|
733
804
|
returnValue
|
|
734
805
|
}, {
|
|
735
806
|
temporaryReferences,
|
|
736
807
|
onError: onRenderError
|
|
737
808
|
});
|
|
809
|
+
const rscStream = await (actionWasForwarded && isHttpFallback ? runWithRootParamsUsage({ kind: "route" }, renderActionRerender) : renderActionRerender());
|
|
738
810
|
const actionHeaders = new Headers({
|
|
739
811
|
"Content-Type": VINEXT_RSC_CONTENT_TYPE,
|
|
740
812
|
Vary: VINEXT_RSC_VARY_HEADER
|
|
@@ -743,6 +815,7 @@ async function handleServerActionRscRequest(options) {
|
|
|
743
815
|
mergeMiddlewareResponseHeaders(actionHeaders, options.middlewareHeaders);
|
|
744
816
|
applyRscCompatibilityIdHeader(actionHeaders);
|
|
745
817
|
setActionRevalidatedHeader(actionHeaders, actionRevalidationKind);
|
|
818
|
+
applyServerActionLogHeader(actionHeaders, actionLogInfo);
|
|
746
819
|
const actionResponse = createServerActionRscResponse(rscStream, {
|
|
747
820
|
status: options.middlewareStatus ?? actionStatus,
|
|
748
821
|
headers: actionHeaders
|
|
@@ -16,6 +16,7 @@ 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 { setPagesClientAssets } from "./pages-client-assets.js";
|
|
19
20
|
import { BeforeInteractiveContext } from "../shims/before-interactive-context.js";
|
|
20
21
|
import { runWithRootParamsScope } from "../shims/root-params.js";
|
|
21
22
|
import { createInitialBfcacheMaps } from "./app-bfcache-identity.js";
|
|
@@ -27,9 +28,12 @@ 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;
|
|
@@ -182,6 +189,10 @@ async function handleSsr(rscStream, navContext, fontData, options) {
|
|
|
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);
|
|
@@ -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;
|
|
@@ -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 };
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { RequestLogOptions } from "./request-log.js";
|
|
2
|
+
import { ServerResponse } from "node:http";
|
|
3
|
+
|
|
4
|
+
//#region src/server/dev-response-headers.d.ts
|
|
5
|
+
type DevResponseMetrics = {
|
|
6
|
+
compileMs?: number;
|
|
7
|
+
renderMs?: number;
|
|
8
|
+
actionLogRaw?: string;
|
|
9
|
+
};
|
|
10
|
+
declare function parseVinextTimingHeader(raw: unknown, reqStart: number): Pick<DevResponseMetrics, "compileMs" | "renderMs">;
|
|
11
|
+
/** Intercept dev-only headers on a Node response and capture their payloads. */
|
|
12
|
+
declare function interceptDevResponseHeaders(res: ServerResponse, reqStart: number, metrics: DevResponseMetrics): void;
|
|
13
|
+
declare function flushDevRequestLogs(metrics: DevResponseMetrics, options: RequestLogOptions): void;
|
|
14
|
+
/** Install App Router request + server action logging on the Vite dev server. */
|
|
15
|
+
declare function installAppRouterDevRequestLogging(middlewares: {
|
|
16
|
+
use: (handler: (req: import("node:http").IncomingMessage, res: ServerResponse, next: (err?: unknown) => void) => void) => void;
|
|
17
|
+
}): void;
|
|
18
|
+
//#endregion
|
|
19
|
+
export { DevResponseMetrics, flushDevRequestLogs, installAppRouterDevRequestLogging, interceptDevResponseHeaders, parseVinextTimingHeader };
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import "./headers.js";
|
|
2
|
+
import { parseServerActionLogHeader } from "./server-action-logger.js";
|
|
3
|
+
import { logRequest, logServerAction, now } from "./request-log.js";
|
|
4
|
+
//#region src/server/dev-response-headers.ts
|
|
5
|
+
function parseVinextTimingHeader(raw, reqStart) {
|
|
6
|
+
const [handlerStart, inHandlerCompileMs, renderMs] = String(raw).split(",").map((v) => Number(v));
|
|
7
|
+
const metrics = {};
|
|
8
|
+
if (!Number.isNaN(handlerStart) && !Number.isNaN(inHandlerCompileMs) && inHandlerCompileMs !== -1) metrics.compileMs = Math.max(0, Math.round(handlerStart - reqStart)) + inHandlerCompileMs;
|
|
9
|
+
if (!Number.isNaN(renderMs) && renderMs !== -1) metrics.renderMs = renderMs;
|
|
10
|
+
return metrics;
|
|
11
|
+
}
|
|
12
|
+
function consumeDevInternalHeader(name, value, reqStart, metrics) {
|
|
13
|
+
const lowerName = name.toLowerCase();
|
|
14
|
+
if (lowerName === "x-vinext-timing") {
|
|
15
|
+
Object.assign(metrics, parseVinextTimingHeader(value, reqStart));
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
if (lowerName === "x-vinext-action-log") {
|
|
19
|
+
metrics.actionLogRaw = String(value);
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
function stripDevInternalHeadersFromObject(headers, reqStart, metrics) {
|
|
25
|
+
for (const key of Object.keys(headers)) if (consumeDevInternalHeader(key, headers[key], reqStart, metrics)) delete headers[key];
|
|
26
|
+
}
|
|
27
|
+
/** Intercept dev-only headers on a Node response and capture their payloads. */
|
|
28
|
+
function interceptDevResponseHeaders(res, reqStart, metrics) {
|
|
29
|
+
const origSetHeader = res.setHeader.bind(res);
|
|
30
|
+
res.setHeader = function(name, value) {
|
|
31
|
+
if (consumeDevInternalHeader(String(name), value, reqStart, metrics)) return res;
|
|
32
|
+
return origSetHeader(name, value);
|
|
33
|
+
};
|
|
34
|
+
const origWriteHead = res.writeHead.bind(res);
|
|
35
|
+
res.writeHead = function(statusCode, ...args) {
|
|
36
|
+
let headers;
|
|
37
|
+
const [reasonOrHeaders, maybeHeaders] = args;
|
|
38
|
+
if (typeof reasonOrHeaders === "string") headers = maybeHeaders;
|
|
39
|
+
else headers = reasonOrHeaders;
|
|
40
|
+
if (headers && typeof headers === "object" && !Array.isArray(headers)) stripDevInternalHeadersFromObject(headers, reqStart, metrics);
|
|
41
|
+
return origWriteHead(statusCode, ...args);
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
function flushDevRequestLogs(metrics, options) {
|
|
45
|
+
logRequest(options);
|
|
46
|
+
const actionLog = metrics.actionLogRaw ? parseServerActionLogHeader(metrics.actionLogRaw) : null;
|
|
47
|
+
if (actionLog) logServerAction(actionLog);
|
|
48
|
+
}
|
|
49
|
+
function shouldSkipDevRequestLogUrl(url) {
|
|
50
|
+
const [pathname] = url.split("?");
|
|
51
|
+
return url.startsWith("/@") || url.startsWith("/__vite") || url.startsWith("/node_modules") || url.includes(".") && !pathname.endsWith(".html") && !pathname.endsWith(".rsc");
|
|
52
|
+
}
|
|
53
|
+
/** Install App Router request + server action logging on the Vite dev server. */
|
|
54
|
+
function installAppRouterDevRequestLogging(middlewares) {
|
|
55
|
+
middlewares.use((req, res, next) => {
|
|
56
|
+
const url = req.url ?? "/";
|
|
57
|
+
if (shouldSkipDevRequestLogUrl(url)) return next();
|
|
58
|
+
const reqStart = now();
|
|
59
|
+
const metrics = {};
|
|
60
|
+
interceptDevResponseHeaders(res, reqStart, metrics);
|
|
61
|
+
res.on("finish", () => {
|
|
62
|
+
const logUrl = url.replace(/\.rsc(\?|$)/, "$1");
|
|
63
|
+
const totalMs = now() - reqStart;
|
|
64
|
+
const resolvedRenderMs = metrics.renderMs !== void 0 ? metrics.renderMs : metrics.compileMs !== void 0 ? Math.max(0, Math.round(totalMs - metrics.compileMs)) : void 0;
|
|
65
|
+
flushDevRequestLogs(metrics, {
|
|
66
|
+
method: req.method ?? "GET",
|
|
67
|
+
url: logUrl,
|
|
68
|
+
status: res.statusCode,
|
|
69
|
+
totalMs,
|
|
70
|
+
compileMs: metrics.compileMs,
|
|
71
|
+
renderMs: resolvedRenderMs
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
next();
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
//#endregion
|
|
78
|
+
export { flushDevRequestLogs, installAppRouterDevRequestLogging, interceptDevResponseHeaders, parseVinextTimingHeader };
|
|
@@ -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,13 @@ 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
35
|
import path from "node:path";
|
|
36
36
|
import React from "react";
|
|
37
37
|
import { renderToReadableStream } from "react-dom/server.edge";
|
|
@@ -248,8 +248,9 @@ function createSSRHandler(server, runner, routes, pagesDir, i18nConfig, fileMatc
|
|
|
248
248
|
if (isDataReq) {
|
|
249
249
|
const deploymentId = process.env.__VINEXT_DEPLOYMENT_ID || process.env.NEXT_DEPLOYMENT_ID;
|
|
250
250
|
const notFoundHeaders = { "Content-Type": "application/json" };
|
|
251
|
+
if (hasMiddleware) notFoundHeaders["x-nextjs-matched-path"] = `${locale ? `/${locale}` : ""}${localeStrippedUrl}`;
|
|
251
252
|
if (deploymentId) notFoundHeaders[NEXTJS_DEPLOYMENT_ID_HEADER] = deploymentId;
|
|
252
|
-
res.writeHead(404, notFoundHeaders);
|
|
253
|
+
res.writeHead(hasMiddleware ? 200 : 404, notFoundHeaders);
|
|
253
254
|
res.end("{}");
|
|
254
255
|
return;
|
|
255
256
|
}
|
|
@@ -340,17 +341,8 @@ function createSSRHandler(server, runner, routes, pagesDir, i18nConfig, fileMatc
|
|
|
340
341
|
});
|
|
341
342
|
const fallback = pathsResult?.fallback ?? false;
|
|
342
343
|
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
|
-
});
|
|
344
|
+
const routeParams = getPagesRouteParams(patternToNextFormat(route.pattern));
|
|
345
|
+
const isValidPath = paths.some((pathEntry) => matchesPagesStaticPath(pathEntry, params, routeParams, url));
|
|
354
346
|
if (fallback === false && !isValidPath) {
|
|
355
347
|
if (isDataReq) {
|
|
356
348
|
const deploymentId = process.env.__VINEXT_DEPLOYMENT_ID || process.env.NEXT_DEPLOYMENT_ID;
|
|
@@ -762,6 +754,7 @@ function createSSRHandler(server, runner, routes, pagesDir, i18nConfig, fileMatc
|
|
|
762
754
|
setRevalidateDuration(cacheKey, revalidateSeconds);
|
|
763
755
|
}
|
|
764
756
|
const dataHeaders = { "Content-Type": "application/json" };
|
|
757
|
+
if ((statusCode ?? 200) === 200) dataHeaders["x-nextjs-matched-path"] = `${locale ? `/${locale}` : ""}${patternToNextFormat(route.pattern)}`;
|
|
765
758
|
if (gsspExtraHeaders) for (const [k, v] of Object.entries(gsspExtraHeaders)) dataHeaders[k] = v;
|
|
766
759
|
const dataRoutePattern = patternToNextFormat(route.pattern);
|
|
767
760
|
if (dataRoutePattern !== "/_error" && dataRoutePattern !== "/500") {
|
|
@@ -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
|