@qzsy/vinext 0.1.88 → 0.1.89
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/dist/server/app-browser-entry.js +3 -3
- package/dist/server/app-browser-navigation-controller.js +1 -1
- package/dist/server/app-browser-server-action-client.js +12 -1
- package/dist/server/app-browser-state.js +1 -1
- package/dist/server/app-browser-visible-commit.js +1 -1
- package/dist/server/app-route-handler-execution.js +1 -1
- package/dist/server/app-rsc-handler.js +1 -1
- package/dist/server/app-server-action-execution.js +27 -7
- package/dist/server/app-ssr-entry.js +2 -2
- package/dist/server/headers.d.ts +3 -1
- package/dist/server/headers.js +3 -1
- package/dist/server/request-pipeline.d.ts +2 -1
- package/dist/server/request-pipeline.js +54 -24
- package/dist/shims/error-boundary.d.ts +4 -4
- package/dist/shims/form.d.ts +1 -1
- package/dist/shims/navigation.react-server.js +1 -1
- package/package.json +1 -1
|
@@ -17,15 +17,15 @@ import { VINEXT_RSC_COMPATIBILITY_ID_HEADER, VINEXT_RSC_CONTENT_TYPE, createRscR
|
|
|
17
17
|
import { getNavigationRuntime, registerNavigationRuntimeBootstrap, registerNavigationRuntimeFunctions } from "../client/navigation-runtime.js";
|
|
18
18
|
import { notifyAppRouterTransitionStart } from "../client/instrumentation-client-state.js";
|
|
19
19
|
import "../client/instrumentation-client.js";
|
|
20
|
+
import { createBfcacheSegmentStateKeyMap, createInitialBfcacheIdMap } from "./app-bfcache-identity.js";
|
|
21
|
+
import { createDiscardedServerActionRefreshScheduler, createServerActionInitiationSnapshot } from "./app-browser-action-result.js";
|
|
22
|
+
import { createClientReuseManifestHeaderFromVisibleAppState } from "./app-browser-client-reuse-manifest.js";
|
|
20
23
|
import { resolveManifestNavigationInterceptionContext, resolveMiddlewareRewriteNavigationInterceptionContext } from "./app-browser-interception-context.js";
|
|
21
24
|
import { readHistoryStatePreviousNextUrl } from "./app-history-state.js";
|
|
22
25
|
import { AppBrowserMpaNavigationScheduler } from "./app-browser-mpa-navigation.js";
|
|
23
26
|
import { blockDangerousStreamedRscRedirect } from "./app-browser-rsc-redirect.js";
|
|
24
27
|
import { navigationPlanner } from "./navigation-planner.js";
|
|
25
28
|
import { __basePath, appRouterInstance, commitClientNavigationState, consumePrefetchResponseForNavigation, createCachedRscResponseSnapshot, createClientNavigationRenderSnapshot, createSnapshotPathAndSearch, getClientNavigationRenderContext, getPrefetchCache, hasPrefetchCacheEntryForNavigation, invalidatePrefetchCache, pushHistoryStateWithoutNotify, replaceClientParamsWithoutNotify, replaceHistoryStateWithoutNotify, resolvePrefetchCacheEntryMountedSlotsHeader, restoreRscResponse, saveScrollPosition, setClientParams, setMountedSlotsHeader, setPendingPathname, useRouter } from "../shims/navigation.js";
|
|
26
|
-
import { createBfcacheSegmentStateKeyMap, createInitialBfcacheIdMap } from "./app-bfcache-identity.js";
|
|
27
|
-
import { createDiscardedServerActionRefreshScheduler, createServerActionInitiationSnapshot } from "./app-browser-action-result.js";
|
|
28
|
-
import { createClientReuseManifestHeaderFromVisibleAppState } from "./app-browser-client-reuse-manifest.js";
|
|
29
29
|
import { chunksToReadableStream, createProgressiveRscStream, getVinextBrowserGlobal } from "./app-browser-stream.js";
|
|
30
30
|
import { FRESH_APP_NAVIGATION_PAYLOAD_ORIGIN, VISITED_CACHE_APP_NAVIGATION_PAYLOAD_ORIGIN, isCacheRestorableAppPayloadMetadata, resolveInterceptionContextFromPreviousNextUrl } from "./app-browser-state.js";
|
|
31
31
|
import { clearHardNavigationLoopGuard, createAppBrowserNavigationController, createBasePathStrippedPathAndSearch } from "./app-browser-navigation-controller.js";
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { stripBasePath } from "../utils/base-path.js";
|
|
2
2
|
import { clearAppNavigationFailureTarget, getAppNavigationFailureTarget } from "../client/app-nav-failure-handler.js";
|
|
3
3
|
import { claimAppRouterScrollIntentForCommit, consumeAppRouterScrollIntent } from "../shims/app-router-scroll-state.js";
|
|
4
|
-
import { activateNavigationSnapshot, clearPendingPathname, commitClientNavigationState, createSnapshotPathAndSearch } from "../shims/navigation.js";
|
|
5
4
|
import { shouldScheduleRefreshForDiscardedServerAction } from "./app-browser-action-result.js";
|
|
5
|
+
import { activateNavigationSnapshot, clearPendingPathname, commitClientNavigationState, createSnapshotPathAndSearch } from "../shims/navigation.js";
|
|
6
6
|
import { FRESH_APP_NAVIGATION_PAYLOAD_ORIGIN, createPendingNavigationCommit } from "./app-browser-state.js";
|
|
7
7
|
import { applyApprovedVisibleCommit, approveHmrVisibleCommit, approvePendingNavigationCommit, resolveAndClassifyNavigationCommit } from "./app-browser-visible-commit.js";
|
|
8
8
|
import { startTransition, useInsertionEffect, useLayoutEffect } from "react";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ACTION_REDIRECT_HEADER, ACTION_REDIRECT_STATUS_HEADER } from "./headers.js";
|
|
1
|
+
import { ACTION_REDIRECT_HEADER, ACTION_REDIRECT_STATUS_HEADER, VINEXT_ACTION_BODY_HEADER } from "./headers.js";
|
|
2
2
|
import { DANGEROUS_URL_BLOCK_MESSAGE, isDangerousScheme } from "../shims/url-safety.js";
|
|
3
3
|
import { AppElementsWire } from "./app-elements-wire.js";
|
|
4
4
|
import "./app-elements.js";
|
|
@@ -51,6 +51,13 @@ var ServerActionRedirectError = class extends Error {
|
|
|
51
51
|
this.digest = `NEXT_REDIRECT;${redirectType};${encodeURIComponent(redirectHref)};${target.status};`;
|
|
52
52
|
}
|
|
53
53
|
};
|
|
54
|
+
function encodeActionBodyHeader(body) {
|
|
55
|
+
const bytes = new TextEncoder().encode(body);
|
|
56
|
+
if (bytes.byteLength > 6e3) return null;
|
|
57
|
+
let binary = "";
|
|
58
|
+
for (const byte of bytes) binary += String.fromCharCode(byte);
|
|
59
|
+
return btoa(binary);
|
|
60
|
+
}
|
|
54
61
|
async function invokeClientServerAction(id, args, actionInitiation, deps) {
|
|
55
62
|
deps.syncServerActionHttpFallbackHead(null);
|
|
56
63
|
const temporaryReferences = createTemporaryReferenceSet();
|
|
@@ -62,6 +69,10 @@ async function invokeClientServerAction(id, args, actionInitiation, deps) {
|
|
|
62
69
|
elements: actionInitiation.routerState.elements,
|
|
63
70
|
previousNextUrl: actionInitiation.routerState.previousNextUrl
|
|
64
71
|
}).headers;
|
|
72
|
+
if (process.env.NODE_ENV !== "production" && typeof body === "string") {
|
|
73
|
+
const actionBodyHeader = encodeActionBodyHeader(body);
|
|
74
|
+
if (actionBodyHeader !== null) headers.set(VINEXT_ACTION_BODY_HEADER, actionBodyHeader);
|
|
75
|
+
}
|
|
65
76
|
const fetchResponse = await fetch(createServerActionRequestUrl(actionInitiation.path), {
|
|
66
77
|
method: "POST",
|
|
67
78
|
headers,
|
|
@@ -6,12 +6,12 @@ import { AppElementsWire } from "./app-elements-wire.js";
|
|
|
6
6
|
import { getMountedSlotIds, getMountedSlotIdsHeader } from "./app-elements.js";
|
|
7
7
|
import { createRscRequestHeaders } from "./app-rsc-cache-busting.js";
|
|
8
8
|
import { createCacheEntryReuseProof } from "./cache-proof.js";
|
|
9
|
+
import { createBfcacheSegmentStateKeyMap, createInitialBfcacheIdMap, createNextBfcacheIdMap, preserveBfcacheIdsForMergedElements } from "./app-bfcache-identity.js";
|
|
9
10
|
import { createHistoryStateWithNavigationMetadata, createHistoryStateWithPreviousNextUrl, isHistoryStateBfcacheVersionCurrent, readHistoryStateBfcacheIds, readHistoryStateBfcacheVersion, readHistoryStatePreviousNextUrl, readHistoryStateTraversalIndex, resolveHistoryTraversalIntent } from "./app-history-state.js";
|
|
10
11
|
import { NavigationTraceReasonCodes, createNavigationLifecycleTraceFields, createNavigationTrace } from "./navigation-trace.js";
|
|
11
12
|
import { verifyOperationTokenForCommit } from "./operation-token.js";
|
|
12
13
|
import { navigationPlanner, resolveDefaultOrUnmatchedSlotPersistenceForLayouts } from "./navigation-planner.js";
|
|
13
14
|
import { createSnapshotPathAndSearch } from "../shims/navigation.js";
|
|
14
|
-
import { createBfcacheSegmentStateKeyMap, createInitialBfcacheIdMap, createNextBfcacheIdMap, preserveBfcacheIdsForMergedElements } from "./app-bfcache-identity.js";
|
|
15
15
|
//#region src/server/app-browser-state.ts
|
|
16
16
|
const FRESH_APP_NAVIGATION_PAYLOAD_ORIGIN = { origin: "fresh" };
|
|
17
17
|
const VISITED_CACHE_APP_NAVIGATION_PAYLOAD_ORIGIN = { origin: "visited-cache" };
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { normalizeAppElementsSlotBindings } from "./app-elements-wire.js";
|
|
2
2
|
import "./app-elements.js";
|
|
3
3
|
import { mergeElements } from "../shims/slot.js";
|
|
4
|
-
import { NavigationTraceReasonCodes, NavigationTraceTransactionCodes, createNavigationTrace, prependNavigationTraceEntry } from "./navigation-trace.js";
|
|
5
4
|
import { preserveBfcacheIdsForMergedElements } from "./app-bfcache-identity.js";
|
|
5
|
+
import { NavigationTraceReasonCodes, NavigationTraceTransactionCodes, createNavigationTrace, prependNavigationTraceEntry } from "./navigation-trace.js";
|
|
6
6
|
import { createPendingNavigationCommit, resolvePendingNavigationCommitDispositionDecision } from "./app-browser-state.js";
|
|
7
7
|
//#region src/server/app-browser-visible-commit.ts
|
|
8
8
|
const approvedVisibleCommitBrand = Symbol("ApprovedVisibleCommit");
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { isDraftModeRequest, setHeadersContext } from "../shims/headers.js";
|
|
2
|
-
import { runWithRootParamsUsage } from "../shims/root-params.js";
|
|
3
2
|
import { isPossibleAppRouteActionRequest } from "./app-action-request.js";
|
|
3
|
+
import { runWithRootParamsUsage } from "../shims/root-params.js";
|
|
4
4
|
import { applyRouteHandlerMiddlewareContext, applyRouteHandlerRevalidateHeader, assertSupportedAppRouteHandlerResponse, buildAppRouteCacheValue, finalizeRouteHandlerResponse, markRouteHandlerCacheMiss } from "./app-route-handler-response.js";
|
|
5
5
|
import { createTrackedAppRouteRequest, markKnownDynamicAppRoute } from "./app-route-handler-runtime.js";
|
|
6
6
|
import { createStaticGenerationHeadersContext, getAppRouteStaticGenerationErrorMessage } from "./app-static-generation.js";
|
|
@@ -20,10 +20,10 @@ import { parseNextHttpErrorDigest } from "./next-error-digest.js";
|
|
|
20
20
|
import { matchPrerenderRouteParamsPayload, readTrustedPrerenderRouteParams, serializePrerenderRouteParamsHeader } from "./prerender-route-params.js";
|
|
21
21
|
import { getRenderedConcreteUrlPathsForRoute } from "./pregenerated-concrete-paths.js";
|
|
22
22
|
import { flattenErrorCauses } from "../utils/error-cause.js";
|
|
23
|
-
import { pickRootParams, setRootParams } from "../shims/root-params.js";
|
|
24
23
|
import { createServerActionNotFoundResponse, getServerActionNotFoundMessage } from "./server-action-not-found.js";
|
|
25
24
|
import { buildPageCacheTags } from "./implicit-tags.js";
|
|
26
25
|
import { buildPostMwRequestContext } from "./app-post-middleware-context.js";
|
|
26
|
+
import { pickRootParams, setRootParams } from "../shims/root-params.js";
|
|
27
27
|
import { finalizeAppRscResponse } from "./app-rsc-response-finalizer.js";
|
|
28
28
|
import { normalizeRscRequest } from "./app-rsc-request-normalization.js";
|
|
29
29
|
import { runWithPrerenderWorkUnit } from "./prerender-work-unit-setup.js";
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { splitPathSegments } from "../routing/utils.js";
|
|
2
2
|
import { addBasePathToPathname, hasBasePath, stripBasePath } from "../utils/base-path.js";
|
|
3
|
-
import { ACTION_FORWARDED_HEADER, ACTION_REDIRECT_HEADER, ACTION_REDIRECT_STATUS_HEADER, ACTION_REDIRECT_TYPE_HEADER, ACTION_REVALIDATED_HEADER } from "./headers.js";
|
|
3
|
+
import { ACTION_FORWARDED_HEADER, ACTION_REDIRECT_HEADER, ACTION_REDIRECT_STATUS_HEADER, ACTION_REDIRECT_TYPE_HEADER, ACTION_REVALIDATED_HEADER, VINEXT_ACTION_BODY_HEADER } from "./headers.js";
|
|
4
4
|
import { isExternalUrl } from "../config/config-matchers.js";
|
|
5
5
|
import { internalServerErrorResponse, payloadTooLargeResponse } from "./http-error-responses.js";
|
|
6
|
-
import { validateCsrfOrigin, validateServerActionPayload } from "./request-pipeline.js";
|
|
6
|
+
import { readRawNodeRequestBytes, validateCsrfOrigin, validateServerActionPayload } from "./request-pipeline.js";
|
|
7
7
|
import { APP_RSC_RENDER_MODE_ACTION_RERENDER_PRESERVE_UI } from "./app-rsc-render-mode.js";
|
|
8
8
|
import { headersContextFromRequest, isDraftModeRequest, setHeadersContext } from "../shims/headers.js";
|
|
9
9
|
import { getAndClearActionRevalidationKind } from "../shims/cache-request-state.js";
|
|
@@ -14,13 +14,13 @@ import { VINEXT_RSC_CONTENT_TYPE, VINEXT_RSC_VARY_HEADER, applyRscCompatibilityI
|
|
|
14
14
|
import { mergeMiddlewareResponseHeaders } from "./middleware-response-headers.js";
|
|
15
15
|
import { applyEdgeRuntimeHeader } from "./app-page-response.js";
|
|
16
16
|
import { getNextErrorDigest, parseNextHttpErrorDigest, parseNextRedirectDigest } from "./next-error-digest.js";
|
|
17
|
-
import { createRootParamsUsageController, pickRootParams, runWithRootParamsScope, runWithRootParamsUsage } from "../shims/root-params.js";
|
|
18
17
|
import { createServerActionNotFoundResponse, getServerActionNotFoundMessage, isServerActionNotFoundError } from "./server-action-not-found.js";
|
|
19
18
|
import { deferUntilStreamConsumed } from "./defer-until-stream-consumed.js";
|
|
20
19
|
import "./app-page-stream.js";
|
|
21
20
|
import { buildAppPageTags } from "./implicit-tags.js";
|
|
22
21
|
import { resolveAppPageNavigationParams } from "./app-page-element-builder.js";
|
|
23
22
|
import { resolveAppPageActionRerenderTarget } from "./app-page-request.js";
|
|
23
|
+
import { createRootParamsUsageController, pickRootParams, runWithRootParamsScope, runWithRootParamsUsage } from "../shims/root-params.js";
|
|
24
24
|
import { getSetCookieName } from "./cookie-utils.js";
|
|
25
25
|
import { createStaticGenerationHeadersContext } from "./app-static-generation.js";
|
|
26
26
|
//#region src/server/app-server-action-execution.ts
|
|
@@ -186,11 +186,31 @@ function getServerActionFailureMessage(error) {
|
|
|
186
186
|
function validateServerActionArgs(args) {
|
|
187
187
|
if (args.length > SERVER_ACTION_ARGS_LIMIT) throw new Error(`Server Action arguments list is too long (${args.length}). Maximum allowed is ${SERVER_ACTION_ARGS_LIMIT}.`);
|
|
188
188
|
}
|
|
189
|
+
function decodeBase64Utf8(value) {
|
|
190
|
+
const binary = atob(value);
|
|
191
|
+
const bytes = new Uint8Array(binary.length);
|
|
192
|
+
for (let index = 0; index < binary.length; index++) bytes[index] = binary.charCodeAt(index);
|
|
193
|
+
return new TextDecoder().decode(bytes);
|
|
194
|
+
}
|
|
189
195
|
async function readActionBodyWithLimit(request, maxBytes) {
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
196
|
+
const actionBodyHeader = process.env.NODE_ENV === "production" ? null : request.headers.get(VINEXT_ACTION_BODY_HEADER);
|
|
197
|
+
if (actionBodyHeader) {
|
|
198
|
+
const restored = decodeBase64Utf8(actionBodyHeader);
|
|
199
|
+
if (new TextEncoder().encode(restored).byteLength > maxBytes) throw new Error("Request body too large");
|
|
200
|
+
return restored;
|
|
201
|
+
}
|
|
202
|
+
const contentLength = Number(request.headers.get("content-length") ?? "0");
|
|
203
|
+
if (request.body && !request.bodyUsed) {
|
|
204
|
+
const body = await readStreamAsTextWithLimit(request.body, maxBytes, () => {
|
|
205
|
+
throw new Error("Request body too large");
|
|
206
|
+
});
|
|
207
|
+
if (body.length > 0 || contentLength === 0) return body;
|
|
208
|
+
}
|
|
209
|
+
if (contentLength > 0) {
|
|
210
|
+
const rawBody = await readRawNodeRequestBytes(request, maxBytes);
|
|
211
|
+
if (rawBody !== null && rawBody.byteLength > 0) return new TextDecoder().decode(rawBody);
|
|
212
|
+
}
|
|
213
|
+
return "";
|
|
194
214
|
}
|
|
195
215
|
async function readActionFormDataWithLimit(request, maxBytes) {
|
|
196
216
|
if (!request.body) return new FormData();
|
|
@@ -17,12 +17,12 @@ import { BfcacheStateKeyMapContext, ElementsContext, Slot } from "../shims/slot.
|
|
|
17
17
|
import { createSsrErrorMetaRenderer } from "./app-ssr-error-meta.js";
|
|
18
18
|
import { createNavigationRuntimeRscMetadataScript, createRscEmbedTransform, createTickBufferedTransform } from "./app-ssr-stream.js";
|
|
19
19
|
import { setPagesClientAssets } from "./pages-client-assets.js";
|
|
20
|
-
import { BeforeInteractiveContext } from "../shims/before-interactive-context.js";
|
|
21
|
-
import { runWithRootParamsScope } from "../shims/root-params.js";
|
|
22
20
|
import { createInitialBfcacheMaps } from "./app-bfcache-identity.js";
|
|
23
21
|
import { RSC_FORM_STATE_GLOBAL } from "./app-browser-hydration.js";
|
|
24
22
|
import { createClientReferencePreloader } from "./app-client-reference-preloader.js";
|
|
25
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";
|
|
26
26
|
import { renderBeforeInteractiveInlineScripts } from "./before-interactive-head.js";
|
|
27
27
|
import { createInitialDevServerErrorScript } from "./dev-initial-server-error.js";
|
|
28
28
|
import { ssrAppRouterInstance } from "./app-ssr-router-instance.js";
|
package/dist/server/headers.d.ts
CHANGED
|
@@ -21,6 +21,8 @@ declare const VINEXT_STATIC_FILE_HEADER = "x-vinext-static-file";
|
|
|
21
21
|
declare const VINEXT_TIMING_HEADER = "x-vinext-timing";
|
|
22
22
|
/** Dev-only server action log payload (JSON). Stripped before the response reaches the client. */
|
|
23
23
|
declare const VINEXT_ACTION_LOG_HEADER = "x-vinext-action-log";
|
|
24
|
+
/** Small string Server Action body side-channel used when dev Request cloning drops the stream. */
|
|
25
|
+
declare const VINEXT_ACTION_BODY_HEADER = "x-vinext-action-body";
|
|
24
26
|
/** Internal endpoint used to evaluate App Router generateStaticParams exports. */
|
|
25
27
|
declare const VINEXT_PRERENDER_STATIC_PARAMS_PATH = "/__vinext/prerender/static-params";
|
|
26
28
|
/** Internal endpoint used to evaluate Pages Router getStaticPaths exports. */
|
|
@@ -103,4 +105,4 @@ declare const INTERNAL_HEADERS: string[];
|
|
|
103
105
|
/** Vinext-only internal headers stripped alongside Next.js protocol internals. */
|
|
104
106
|
declare const VINEXT_INTERNAL_HEADERS: string[];
|
|
105
107
|
//#endregion
|
|
106
|
-
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_ACTION_LOG_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 };
|
|
108
|
+
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_ACTION_BODY_HEADER, VINEXT_ACTION_LOG_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
|
@@ -20,6 +20,8 @@ const VINEXT_STATIC_FILE_HEADER = "x-vinext-static-file";
|
|
|
20
20
|
const VINEXT_TIMING_HEADER = "x-vinext-timing";
|
|
21
21
|
/** Dev-only server action log payload (JSON). Stripped before the response reaches the client. */
|
|
22
22
|
const VINEXT_ACTION_LOG_HEADER = "x-vinext-action-log";
|
|
23
|
+
/** Small string Server Action body side-channel used when dev Request cloning drops the stream. */
|
|
24
|
+
const VINEXT_ACTION_BODY_HEADER = "x-vinext-action-body";
|
|
23
25
|
/** Internal endpoint used to evaluate App Router generateStaticParams exports. */
|
|
24
26
|
const VINEXT_PRERENDER_STATIC_PARAMS_PATH = "/__vinext/prerender/static-params";
|
|
25
27
|
/** Internal endpoint used to evaluate Pages Router getStaticPaths exports. */
|
|
@@ -124,4 +126,4 @@ const INTERNAL_HEADERS = [
|
|
|
124
126
|
/** Vinext-only internal headers stripped alongside Next.js protocol internals. */
|
|
125
127
|
const VINEXT_INTERNAL_HEADERS = [VINEXT_PRERENDER_ROUTE_PARAMS_HEADER];
|
|
126
128
|
//#endregion
|
|
127
|
-
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_ACTION_LOG_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 };
|
|
129
|
+
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_ACTION_BODY_HEADER, VINEXT_ACTION_LOG_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 };
|
|
@@ -161,6 +161,7 @@ declare function processMiddlewareHeaders(headers: Headers): void;
|
|
|
161
161
|
* @returns A new Headers with internal framework headers removed
|
|
162
162
|
*/
|
|
163
163
|
declare function filterInternalHeaders(headers: Headers): Headers;
|
|
164
|
+
declare function readRawNodeRequestBytes(request: Request, maxBytes?: number): Promise<Uint8Array | null>;
|
|
164
165
|
/**
|
|
165
166
|
* Materialize the request body before header/url cloning.
|
|
166
167
|
*
|
|
@@ -196,4 +197,4 @@ declare function cloneRequestWithHeaders(request: Request, headers: Headers): Re
|
|
|
196
197
|
*/
|
|
197
198
|
declare function cloneRequestWithUrl(request: Request, url: string): Request;
|
|
198
199
|
//#endregion
|
|
199
|
-
export { HeaderRecord, INTERNAL_HEADERS, VINEXT_INTERNAL_HEADERS, applyConfigHeadersToHeaderRecord, applyConfigHeadersToResponse, bufferRequestBodyForHeaderClone, cloneRequestWithHeaders, cloneRequestWithUrl, createStaticFileSignal, filterInternalHeaders, guardProtocolRelativeUrl, hasBasePath, isOpenRedirectShaped, isOriginAllowed, normalizeTrailingSlash, normalizeTrailingSlashPathname, processMiddlewareHeaders, resolvePublicFileRoute, stripBasePath, validateCsrfOrigin, validateServerActionPayload };
|
|
200
|
+
export { HeaderRecord, INTERNAL_HEADERS, VINEXT_INTERNAL_HEADERS, applyConfigHeadersToHeaderRecord, applyConfigHeadersToResponse, bufferRequestBodyForHeaderClone, cloneRequestWithHeaders, cloneRequestWithUrl, createStaticFileSignal, filterInternalHeaders, guardProtocolRelativeUrl, hasBasePath, isOpenRedirectShaped, isOriginAllowed, normalizeTrailingSlash, normalizeTrailingSlashPathname, processMiddlewareHeaders, readRawNodeRequestBytes, resolvePublicFileRoute, stripBasePath, validateCsrfOrigin, validateServerActionPayload };
|
|
@@ -366,6 +366,44 @@ function getRequestCf(request) {
|
|
|
366
366
|
const cf = Reflect.get(request, "cf");
|
|
367
367
|
return cf === void 0 ? void 0 : cf;
|
|
368
368
|
}
|
|
369
|
+
function getRawNodeRequest(request) {
|
|
370
|
+
const raw = Reflect.get(request, "_request");
|
|
371
|
+
return raw === void 0 ? void 0 : raw;
|
|
372
|
+
}
|
|
373
|
+
function copyPrivateRequestMetadata(source, target) {
|
|
374
|
+
const cf = getRequestCf(source);
|
|
375
|
+
if (cf !== void 0) Object.defineProperty(target, "cf", {
|
|
376
|
+
value: cf,
|
|
377
|
+
enumerable: true,
|
|
378
|
+
configurable: true
|
|
379
|
+
});
|
|
380
|
+
const rawRequest = getRawNodeRequest(source);
|
|
381
|
+
if (rawRequest !== void 0) Object.defineProperty(target, "_request", {
|
|
382
|
+
value: rawRequest,
|
|
383
|
+
enumerable: true,
|
|
384
|
+
configurable: true
|
|
385
|
+
});
|
|
386
|
+
}
|
|
387
|
+
async function readRawNodeRequestBytes(request, maxBytes) {
|
|
388
|
+
const rawRequest = getRawNodeRequest(request);
|
|
389
|
+
if (!rawRequest || typeof rawRequest !== "object" || typeof rawRequest[Symbol.asyncIterator] !== "function") return null;
|
|
390
|
+
const encoder = new TextEncoder();
|
|
391
|
+
const chunks = [];
|
|
392
|
+
let totalSize = 0;
|
|
393
|
+
for await (const chunk of rawRequest) {
|
|
394
|
+
const bytes = typeof chunk === "string" ? encoder.encode(chunk) : chunk instanceof Uint8Array ? chunk : new Uint8Array(chunk);
|
|
395
|
+
totalSize += bytes.byteLength;
|
|
396
|
+
if (maxBytes !== void 0 && totalSize > maxBytes) throw new Error("Request body too large");
|
|
397
|
+
chunks.push(bytes);
|
|
398
|
+
}
|
|
399
|
+
const combined = new Uint8Array(totalSize);
|
|
400
|
+
let offset = 0;
|
|
401
|
+
for (const chunk of chunks) {
|
|
402
|
+
combined.set(chunk, offset);
|
|
403
|
+
offset += chunk.byteLength;
|
|
404
|
+
}
|
|
405
|
+
return combined;
|
|
406
|
+
}
|
|
369
407
|
const METHODS_THAT_MAY_HAVE_BODY = new Set([
|
|
370
408
|
"POST",
|
|
371
409
|
"PUT",
|
|
@@ -388,8 +426,9 @@ async function bufferRequestBodyForHeaderClone(request) {
|
|
|
388
426
|
if (request.body === null) return request;
|
|
389
427
|
if ((request.headers.get("content-type") ?? "").startsWith("multipart/form-data")) return request;
|
|
390
428
|
try {
|
|
391
|
-
const bytes = await request.clone().arrayBuffer();
|
|
392
429
|
const contentLength = Number(request.headers.get("content-length") ?? "0");
|
|
430
|
+
const rawBytes = contentLength > 0 ? await readRawNodeRequestBytes(request) : null;
|
|
431
|
+
const bytes = rawBytes && rawBytes.byteLength > 0 ? rawBytes : await request.clone().arrayBuffer();
|
|
393
432
|
if (bytes.byteLength === 0 && contentLength > 0) return request;
|
|
394
433
|
const init = {
|
|
395
434
|
method: request.method,
|
|
@@ -407,12 +446,7 @@ async function bufferRequestBodyForHeaderClone(request) {
|
|
|
407
446
|
};
|
|
408
447
|
if (bytes.byteLength > 0) init.duplex = "half";
|
|
409
448
|
const buffered = new Request(request.url, init);
|
|
410
|
-
|
|
411
|
-
if (cf !== void 0) Object.defineProperty(buffered, "cf", {
|
|
412
|
-
value: cf,
|
|
413
|
-
enumerable: true,
|
|
414
|
-
configurable: true
|
|
415
|
-
});
|
|
449
|
+
copyPrivateRequestMetadata(request, buffered);
|
|
416
450
|
return buffered;
|
|
417
451
|
} catch {
|
|
418
452
|
return request;
|
|
@@ -429,12 +463,15 @@ async function bufferRequestBodyForHeaderClone(request) {
|
|
|
429
463
|
function cloneRequestWithHeaders(request, headers) {
|
|
430
464
|
let cloned;
|
|
431
465
|
try {
|
|
466
|
+
if (request.body) throw new Error("clone with body may drop stream");
|
|
432
467
|
cloned = new Request(request, { headers });
|
|
433
468
|
} catch {
|
|
469
|
+
const hasReadableBody = Boolean(request.body && !request.bodyUsed);
|
|
470
|
+
const bodySource = hasReadableBody ? request.clone() : request;
|
|
434
471
|
const init = {
|
|
435
472
|
method: request.method,
|
|
436
473
|
headers,
|
|
437
|
-
body:
|
|
474
|
+
body: hasReadableBody ? bodySource.body ?? void 0 : void 0,
|
|
438
475
|
redirect: request.redirect,
|
|
439
476
|
signal: request.signal,
|
|
440
477
|
integrity: request.integrity,
|
|
@@ -444,15 +481,10 @@ function cloneRequestWithHeaders(request, headers) {
|
|
|
444
481
|
referrer: request.referrer,
|
|
445
482
|
referrerPolicy: request.referrerPolicy
|
|
446
483
|
};
|
|
447
|
-
if (
|
|
484
|
+
if (hasReadableBody) init.duplex = "half";
|
|
448
485
|
cloned = new Request(request.url, init);
|
|
449
486
|
}
|
|
450
|
-
|
|
451
|
-
if (cf !== void 0) Object.defineProperty(cloned, "cf", {
|
|
452
|
-
value: cf,
|
|
453
|
-
enumerable: true,
|
|
454
|
-
configurable: true
|
|
455
|
-
});
|
|
487
|
+
copyPrivateRequestMetadata(request, cloned);
|
|
456
488
|
return cloned;
|
|
457
489
|
}
|
|
458
490
|
/**
|
|
@@ -470,12 +502,15 @@ function cloneRequestWithHeaders(request, headers) {
|
|
|
470
502
|
function cloneRequestWithUrl(request, url) {
|
|
471
503
|
let cloned;
|
|
472
504
|
try {
|
|
505
|
+
if (request.body) throw new Error("clone with body may drop stream");
|
|
473
506
|
cloned = new Request(url, request);
|
|
474
507
|
} catch {
|
|
508
|
+
const hasReadableBody = Boolean(request.body && !request.bodyUsed);
|
|
509
|
+
const bodySource = hasReadableBody ? request.clone() : request;
|
|
475
510
|
const init = {
|
|
476
511
|
method: request.method,
|
|
477
512
|
headers: request.headers,
|
|
478
|
-
body:
|
|
513
|
+
body: hasReadableBody ? bodySource.body ?? void 0 : void 0,
|
|
479
514
|
redirect: request.redirect,
|
|
480
515
|
signal: request.signal,
|
|
481
516
|
integrity: request.integrity,
|
|
@@ -485,16 +520,11 @@ function cloneRequestWithUrl(request, url) {
|
|
|
485
520
|
referrer: request.referrer,
|
|
486
521
|
referrerPolicy: request.referrerPolicy
|
|
487
522
|
};
|
|
488
|
-
if (
|
|
523
|
+
if (hasReadableBody) init.duplex = "half";
|
|
489
524
|
cloned = new Request(url, init);
|
|
490
525
|
}
|
|
491
|
-
|
|
492
|
-
if (cf !== void 0) Object.defineProperty(cloned, "cf", {
|
|
493
|
-
value: cf,
|
|
494
|
-
enumerable: true,
|
|
495
|
-
configurable: true
|
|
496
|
-
});
|
|
526
|
+
copyPrivateRequestMetadata(request, cloned);
|
|
497
527
|
return cloned;
|
|
498
528
|
}
|
|
499
529
|
//#endregion
|
|
500
|
-
export { INTERNAL_HEADERS, VINEXT_INTERNAL_HEADERS, applyConfigHeadersToHeaderRecord, applyConfigHeadersToResponse, bufferRequestBodyForHeaderClone, cloneRequestWithHeaders, cloneRequestWithUrl, createStaticFileSignal, filterInternalHeaders, guardProtocolRelativeUrl, hasBasePath, isOpenRedirectShaped, isOriginAllowed, normalizeTrailingSlash, normalizeTrailingSlashPathname, processMiddlewareHeaders, resolvePublicFileRoute, stripBasePath, validateCsrfOrigin, validateServerActionPayload };
|
|
530
|
+
export { INTERNAL_HEADERS, VINEXT_INTERNAL_HEADERS, applyConfigHeadersToHeaderRecord, applyConfigHeadersToResponse, bufferRequestBodyForHeaderClone, cloneRequestWithHeaders, cloneRequestWithUrl, createStaticFileSignal, filterInternalHeaders, guardProtocolRelativeUrl, hasBasePath, isOpenRedirectShaped, isOriginAllowed, normalizeTrailingSlash, normalizeTrailingSlashPathname, processMiddlewareHeaders, readRawNodeRequestBytes, resolvePublicFileRoute, stripBasePath, validateCsrfOrigin, validateServerActionPayload };
|
|
@@ -50,7 +50,7 @@ declare class RedirectErrorBoundary extends React.Component<{
|
|
|
50
50
|
children?: React.ReactNode;
|
|
51
51
|
});
|
|
52
52
|
static getDerivedStateFromError(error: unknown): RedirectBoundaryState;
|
|
53
|
-
render(): string | number | bigint | boolean |
|
|
53
|
+
render(): string | number | bigint | boolean | Iterable<React.ReactNode> | Promise<string | number | bigint | boolean | React.ReactPortal | React.ReactElement<unknown, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | null | undefined> | React.JSX.Element | null | undefined;
|
|
54
54
|
}
|
|
55
55
|
declare function RedirectBoundary({
|
|
56
56
|
children
|
|
@@ -70,7 +70,7 @@ declare class ErrorBoundaryInner extends React.Component<ErrorBoundaryInnerProps
|
|
|
70
70
|
componentDidMount(): void;
|
|
71
71
|
componentWillUnmount(): void;
|
|
72
72
|
reset: () => void;
|
|
73
|
-
render(): string | number | bigint | boolean |
|
|
73
|
+
render(): string | number | bigint | boolean | Iterable<React.ReactNode> | Promise<string | number | bigint | boolean | React.ReactPortal | React.ReactElement<unknown, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | null | undefined> | React.JSX.Element | null | undefined;
|
|
74
74
|
}
|
|
75
75
|
declare function ErrorBoundary({
|
|
76
76
|
fallback,
|
|
@@ -118,7 +118,7 @@ declare class ForbiddenBoundaryInner extends React.Component<ForbiddenBoundaryIn
|
|
|
118
118
|
constructor(props: ForbiddenBoundaryInnerProps);
|
|
119
119
|
static getDerivedStateFromProps(props: ForbiddenBoundaryInnerProps, state: ForbiddenBoundaryState): ForbiddenBoundaryState | null;
|
|
120
120
|
static getDerivedStateFromError(error: unknown): Partial<ForbiddenBoundaryState>;
|
|
121
|
-
render(): string | number | bigint | boolean |
|
|
121
|
+
render(): string | number | bigint | boolean | Iterable<React.ReactNode> | Promise<string | number | bigint | boolean | React.ReactPortal | React.ReactElement<unknown, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | null | undefined> | React.JSX.Element | null | undefined;
|
|
122
122
|
}
|
|
123
123
|
declare function ForbiddenBoundary({
|
|
124
124
|
fallback,
|
|
@@ -142,7 +142,7 @@ declare class UnauthorizedBoundaryInner extends React.Component<UnauthorizedBoun
|
|
|
142
142
|
constructor(props: UnauthorizedBoundaryInnerProps);
|
|
143
143
|
static getDerivedStateFromProps(props: UnauthorizedBoundaryInnerProps, state: UnauthorizedBoundaryState): UnauthorizedBoundaryState | null;
|
|
144
144
|
static getDerivedStateFromError(error: unknown): Partial<UnauthorizedBoundaryState>;
|
|
145
|
-
render(): string | number | bigint | boolean |
|
|
145
|
+
render(): string | number | bigint | boolean | Iterable<React.ReactNode> | Promise<string | number | bigint | boolean | React.ReactPortal | React.ReactElement<unknown, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | null | undefined> | React.JSX.Element | null | undefined;
|
|
146
146
|
}
|
|
147
147
|
declare function UnauthorizedBoundary({
|
|
148
148
|
fallback,
|
package/dist/shims/form.d.ts
CHANGED
|
@@ -16,6 +16,6 @@ declare const Form: import("react").ForwardRefExoticComponent<{
|
|
|
16
16
|
* In pages dir, prefetch is not supported and the prop has no effect.
|
|
17
17
|
*/
|
|
18
18
|
prefetch?: false | null;
|
|
19
|
-
} & Omit<FormHTMLAttributes<HTMLFormElement>, "
|
|
19
|
+
} & Omit<FormHTMLAttributes<HTMLFormElement>, "method" | "encType" | "target"> & import("react").RefAttributes<HTMLFormElement>>;
|
|
20
20
|
//#endregion
|
|
21
21
|
export { createFormSubmitDestinationUrl, Form as default, useActionState };
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { GLOBAL_ACCESSORS_KEY, ServerInsertedHTMLContext, _registerStateAccessors, clearServerInsertedHTML, flushServerInsertedHTML, getLayoutSegmentContext, getNavigationContext, renderServerInsertedHTML, setNavigationContext } from "./navigation-context-state.js";
|
|
2
2
|
import { BailoutToCSRError, DynamicServerError, HTTP_ERROR_FALLBACK_ERROR_CODE, RedirectType, forbidden, getAccessFallbackHTTPStatus, isBailoutToCSRError, isDynamicServerError, isHTTPAccessFallbackError, isNextRouterError, isRedirectError, notFound, permanentRedirect, redirect, unauthorized, unstable_rethrow } from "./navigation-errors.js";
|
|
3
3
|
import "./navigation-server.js";
|
|
4
|
-
import { throwClientHookError } from "./client-hook-error.js";
|
|
5
4
|
import { ReadonlyURLSearchParams } from "./readonly-url-search-params.js";
|
|
5
|
+
import { throwClientHookError } from "./client-hook-error.js";
|
|
6
6
|
//#region src/shims/navigation.react-server.ts
|
|
7
7
|
function usePathname() {
|
|
8
8
|
throwClientHookError("usePathname()");
|