vinext 0.1.2 → 0.1.4
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/build/client-build-config.d.ts +11 -2
- package/dist/build/client-build-config.js +17 -6
- package/dist/build/prerender.d.ts +9 -1
- package/dist/build/prerender.js +42 -12
- package/dist/build/run-prerender.d.ts +10 -2
- package/dist/build/run-prerender.js +15 -1
- package/dist/client/app-nav-failure-handler.d.ts +8 -0
- package/dist/client/app-nav-failure-handler.js +44 -0
- package/dist/client/pages-router-link-navigation.d.ts +33 -7
- package/dist/client/pages-router-link-navigation.js +32 -2
- package/dist/client/vinext-next-data.d.ts +18 -1
- package/dist/client/vinext-next-data.js +2 -0
- package/dist/client/window-next.d.ts +2 -1
- package/dist/client/window-next.js +12 -1
- package/dist/cloudflare/src/cache/cdn-adapter.runtime.js +6 -1
- package/dist/config/config-matchers.d.ts +11 -1
- package/dist/config/config-matchers.js +87 -16
- package/dist/config/next-config.d.ts +46 -4
- package/dist/config/next-config.js +147 -48
- package/dist/config/tsconfig-paths.js +14 -1
- package/dist/deploy.d.ts +30 -11
- package/dist/deploy.js +200 -112
- package/dist/entries/app-browser-entry.d.ts +9 -3
- package/dist/entries/app-browser-entry.js +21 -3
- package/dist/entries/app-rsc-entry.d.ts +2 -0
- package/dist/entries/app-rsc-entry.js +65 -5
- package/dist/entries/app-rsc-manifest.js +2 -0
- package/dist/entries/app-ssr-entry.js +1 -1
- package/dist/entries/pages-client-entry.js +66 -20
- package/dist/entries/pages-server-entry.js +47 -31
- package/dist/index.js +417 -102
- package/dist/plugins/dynamic-preload-metadata.js +2 -4
- package/dist/plugins/extensionless-dynamic-import.d.ts +6 -0
- package/dist/plugins/extensionless-dynamic-import.js +152 -0
- package/dist/plugins/fonts.js +5 -4
- package/dist/plugins/optimize-imports.d.ts +2 -1
- package/dist/plugins/optimize-imports.js +11 -9
- package/dist/plugins/postcss.js +7 -7
- package/dist/plugins/strip-server-exports.d.ts +9 -7
- package/dist/plugins/strip-server-exports.js +493 -46
- package/dist/plugins/typeof-window.d.ts +14 -0
- package/dist/plugins/typeof-window.js +150 -0
- package/dist/routing/app-route-graph.d.ts +2 -1
- package/dist/routing/app-route-graph.js +46 -16
- package/dist/routing/file-matcher.d.ts +10 -1
- package/dist/routing/file-matcher.js +22 -1
- package/dist/routing/pages-router.js +3 -3
- package/dist/routing/utils.d.ts +35 -6
- package/dist/routing/utils.js +59 -7
- package/dist/server/api-handler.d.ts +6 -1
- package/dist/server/api-handler.js +21 -15
- package/dist/server/app-browser-action-result.d.ts +19 -6
- package/dist/server/app-browser-action-result.js +20 -11
- package/dist/server/app-browser-entry.js +175 -91
- package/dist/server/app-browser-error.d.ts +10 -6
- package/dist/server/app-browser-error.js +43 -8
- package/dist/server/app-browser-hydration.d.ts +2 -0
- package/dist/server/app-browser-hydration.js +1 -0
- package/dist/server/app-browser-navigation-controller.d.ts +5 -3
- package/dist/server/app-browser-navigation-controller.js +23 -2
- package/dist/server/app-browser-server-action-navigation.d.ts +6 -0
- package/dist/server/app-browser-server-action-navigation.js +9 -0
- package/dist/server/app-browser-state.d.ts +1 -1
- package/dist/server/app-browser-state.js +19 -11
- package/dist/server/app-browser-stream.js +86 -43
- package/dist/server/app-browser-visible-commit.d.ts +1 -1
- package/dist/server/app-elements-wire.d.ts +6 -1
- package/dist/server/app-elements-wire.js +14 -4
- package/dist/server/app-elements.d.ts +2 -2
- package/dist/server/app-elements.js +2 -2
- package/dist/server/app-fallback-renderer.d.ts +1 -0
- package/dist/server/app-fallback-renderer.js +3 -1
- package/dist/server/app-optimistic-routing.js +2 -2
- package/dist/server/app-page-boundary-render.d.ts +1 -0
- package/dist/server/app-page-boundary-render.js +27 -14
- package/dist/server/app-page-cache-render.d.ts +53 -0
- package/dist/server/app-page-cache-render.js +91 -0
- package/dist/server/app-page-cache.d.ts +16 -2
- package/dist/server/app-page-cache.js +62 -1
- package/dist/server/app-page-dispatch.d.ts +26 -0
- package/dist/server/app-page-dispatch.js +149 -92
- package/dist/server/app-page-element-builder.d.ts +1 -0
- package/dist/server/app-page-element-builder.js +5 -2
- package/dist/server/app-page-execution.d.ts +6 -1
- package/dist/server/app-page-execution.js +21 -1
- package/dist/server/app-page-probe.d.ts +1 -0
- package/dist/server/app-page-probe.js +4 -0
- package/dist/server/app-page-render-observation.d.ts +3 -1
- package/dist/server/app-page-render-observation.js +17 -1
- package/dist/server/app-page-render.d.ts +12 -1
- package/dist/server/app-page-render.js +42 -4
- package/dist/server/app-page-request.d.ts +2 -0
- package/dist/server/app-page-request.js +2 -1
- package/dist/server/app-page-route-wiring.d.ts +3 -1
- package/dist/server/app-page-route-wiring.js +14 -5
- package/dist/server/app-page-stream.d.ts +15 -3
- package/dist/server/app-page-stream.js +11 -5
- package/dist/server/app-pages-bridge.d.ts +23 -1
- package/dist/server/app-pages-bridge.js +26 -17
- package/dist/server/app-ppr-fallback-shell-render.d.ts +17 -0
- package/dist/server/app-ppr-fallback-shell-render.js +26 -0
- package/dist/server/app-ppr-fallback-shell.d.ts +13 -1
- package/dist/server/app-ppr-fallback-shell.js +8 -1
- package/dist/server/app-route-handler-dispatch.js +9 -2
- package/dist/server/app-route-handler-policy.d.ts +1 -0
- package/dist/server/app-router-entry.js +5 -0
- package/dist/server/app-rsc-cache-busting.js +2 -0
- package/dist/server/app-rsc-handler.d.ts +28 -0
- package/dist/server/app-rsc-handler.js +195 -59
- package/dist/server/app-rsc-route-matching.d.ts +3 -0
- package/dist/server/app-rsc-route-matching.js +8 -2
- package/dist/server/app-segment-config.d.ts +9 -1
- package/dist/server/app-segment-config.js +12 -3
- package/dist/server/app-server-action-execution.d.ts +1 -0
- package/dist/server/app-server-action-execution.js +47 -15
- package/dist/server/app-ssr-entry.d.ts +2 -0
- package/dist/server/app-ssr-entry.js +84 -39
- package/dist/server/before-interactive-head.d.ts +17 -0
- package/dist/server/before-interactive-head.js +35 -0
- package/dist/server/cache-control.js +4 -0
- package/dist/server/csp.js +1 -4
- package/dist/server/dev-server.d.ts +2 -2
- package/dist/server/dev-server.js +321 -83
- package/dist/server/hybrid-route-priority.d.ts +22 -0
- package/dist/server/hybrid-route-priority.js +33 -0
- package/dist/server/image-optimization.d.ts +18 -9
- package/dist/server/image-optimization.js +37 -23
- package/dist/server/implicit-tags.d.ts +2 -1
- package/dist/server/implicit-tags.js +4 -1
- package/dist/server/middleware-matcher.js +12 -3
- package/dist/server/middleware-runtime.d.ts +3 -4
- package/dist/server/middleware-runtime.js +2 -0
- package/dist/server/navigation-planner.d.ts +135 -41
- package/dist/server/navigation-planner.js +138 -0
- package/dist/server/navigation-trace.d.ts +9 -1
- package/dist/server/navigation-trace.js +9 -1
- package/dist/server/operation-token.d.ts +40 -0
- package/dist/server/operation-token.js +85 -0
- package/dist/server/pages-api-route.d.ts +6 -0
- package/dist/server/pages-api-route.js +13 -2
- package/dist/server/pages-asset-tags.d.ts +2 -1
- package/dist/server/pages-asset-tags.js +6 -2
- package/dist/server/pages-data-route.d.ts +9 -2
- package/dist/server/pages-data-route.js +18 -6
- package/dist/server/pages-dev-module-url.d.ts +4 -0
- package/dist/server/pages-dev-module-url.js +15 -0
- package/dist/server/pages-document-initial-props.d.ts +4 -15
- package/dist/server/pages-document-initial-props.js +27 -56
- package/dist/server/pages-get-initial-props.d.ts +54 -4
- package/dist/server/pages-get-initial-props.js +43 -1
- package/dist/server/pages-i18n.js +2 -2
- package/dist/server/pages-node-compat.js +2 -2
- package/dist/server/pages-page-data.d.ts +11 -2
- package/dist/server/pages-page-data.js +207 -34
- package/dist/server/pages-page-handler.d.ts +4 -2
- package/dist/server/pages-page-handler.js +62 -23
- package/dist/server/pages-page-response.d.ts +4 -1
- package/dist/server/pages-page-response.js +11 -8
- package/dist/server/pages-readiness.js +1 -1
- package/dist/server/pages-request-pipeline.d.ts +8 -7
- package/dist/server/pages-request-pipeline.js +126 -47
- package/dist/server/pregenerated-concrete-paths.d.ts +1 -17
- package/dist/server/pregenerated-concrete-paths.js +2 -19
- package/dist/server/prerender-manifest.d.ts +33 -0
- package/dist/server/prerender-manifest.js +54 -0
- package/dist/server/prerender-route-params.d.ts +1 -2
- package/dist/server/prod-server.d.ts +3 -1
- package/dist/server/prod-server.js +50 -13
- package/dist/server/request-pipeline.d.ts +3 -15
- package/dist/server/request-pipeline.js +58 -47
- package/dist/server/rsc-stream-hints.d.ts +5 -1
- package/dist/server/rsc-stream-hints.js +6 -1
- package/dist/server/seed-cache.js +10 -18
- package/dist/server/static-file-cache.js +16 -4
- package/dist/shims/app-router-scroll-state.d.ts +3 -1
- package/dist/shims/app-router-scroll-state.js +14 -2
- package/dist/shims/app-router-scroll.d.ts +3 -0
- package/dist/shims/app-router-scroll.js +28 -18
- package/dist/shims/before-interactive-context.d.ts +14 -3
- package/dist/shims/cache-runtime.js +3 -2
- package/dist/shims/cache.d.ts +1 -0
- package/dist/shims/cache.js +1 -1
- package/dist/shims/cdn-cache.d.ts +5 -5
- package/dist/shims/document.d.ts +15 -20
- package/dist/shims/document.js +5 -8
- package/dist/shims/dynamic-preload-chunks.js +6 -4
- package/dist/shims/error-boundary.d.ts +2 -0
- package/dist/shims/error-boundary.js +7 -0
- package/dist/shims/error.js +3 -2
- package/dist/shims/error.react-server.d.ts +9 -0
- package/dist/shims/error.react-server.js +6 -0
- package/dist/shims/fetch-cache.d.ts +3 -1
- package/dist/shims/fetch-cache.js +45 -20
- package/dist/shims/hash-scroll.js +6 -1
- package/dist/shims/headers.js +29 -4
- package/dist/shims/image.js +9 -2
- package/dist/shims/internal/als-registry.js +28 -1
- package/dist/shims/internal/app-route-detection.js +8 -17
- package/dist/shims/internal/hybrid-client-route-owner.d.ts +31 -0
- package/dist/shims/internal/hybrid-client-route-owner.js +143 -0
- package/dist/shims/internal/navigation-untracked.d.ts +35 -0
- package/dist/shims/internal/navigation-untracked.js +55 -0
- package/dist/shims/internal/pages-data-fetch-dedup.d.ts +6 -7
- package/dist/shims/internal/pages-data-fetch-dedup.js +67 -14
- package/dist/shims/internal/pages-data-target.d.ts +7 -2
- package/dist/shims/internal/pages-data-target.js +17 -8
- package/dist/shims/internal/pages-router-accessor.d.ts +19 -0
- package/dist/shims/internal/pages-router-accessor.js +13 -0
- package/dist/shims/internal/router-context.d.ts +2 -1
- package/dist/shims/internal/router-context.js +3 -1
- package/dist/shims/link.js +47 -19
- package/dist/shims/metadata.js +4 -4
- package/dist/shims/navigation.d.ts +8 -2
- package/dist/shims/navigation.js +63 -31
- package/dist/shims/ppr-fallback-shell.d.ts +5 -1
- package/dist/shims/ppr-fallback-shell.js +28 -7
- package/dist/shims/router.d.ts +18 -3
- package/dist/shims/router.js +512 -142
- package/dist/shims/script.js +8 -4
- package/dist/shims/server.d.ts +16 -1
- package/dist/shims/server.js +44 -12
- package/dist/shims/unified-request-context.js +1 -0
- package/dist/utils/built-asset-url.d.ts +4 -0
- package/dist/utils/built-asset-url.js +11 -0
- package/dist/utils/commonjs-loader.d.ts +16 -0
- package/dist/utils/commonjs-loader.js +100 -0
- package/dist/utils/deployment-id.d.ts +8 -0
- package/dist/utils/deployment-id.js +22 -0
- package/dist/utils/has-trailing-comma.d.ts +24 -0
- package/dist/utils/has-trailing-comma.js +62 -0
- package/dist/utils/html-limited-bots.d.ts +18 -1
- package/dist/utils/html-limited-bots.js +23 -1
- package/dist/utils/parse-cookie.d.ts +13 -0
- package/dist/utils/parse-cookie.js +52 -0
- package/dist/utils/path.d.ts +7 -1
- package/dist/utils/path.js +9 -1
- package/dist/utils/text-stream.d.ts +1 -1
- package/dist/utils/text-stream.js +2 -2
- package/dist/utils/vite-version.d.ts +12 -1
- package/dist/utils/vite-version.js +9 -1
- package/package.json +2 -2
- package/dist/shims/internal/parse-cookie-header.d.ts +0 -14
- package/dist/shims/internal/parse-cookie-header.js +0 -30
package/dist/shims/link.js
CHANGED
|
@@ -8,15 +8,16 @@ import { APP_RSC_RENDER_MODE_PREFETCH_LOADING_SHELL } from "../server/app-rsc-re
|
|
|
8
8
|
import "../server/app-elements.js";
|
|
9
9
|
import { addLocalePrefix, getDomainLocaleUrl } from "../utils/domain-locale.js";
|
|
10
10
|
import { prefetchPagesData, resolvePagesDataNavigationTarget } from "./internal/pages-data-target.js";
|
|
11
|
-
import { markAppRouteDetectedOnPrefetch } from "./internal/app-route-detection.js";
|
|
12
|
-
import { isAbsoluteOrProtocolRelativeUrl, normalizePathTrailingSlash, resolveRelativeHref, toBrowserNavigationHref, toSameOriginAppPath, withBasePath } from "./url-utils.js";
|
|
13
11
|
import { appendSearchParamsToUrl, urlQueryToSearchParams } from "../utils/query.js";
|
|
12
|
+
import { resolveHybridClientRouteOwner } from "./internal/hybrid-client-route-owner.js";
|
|
13
|
+
import { markAppRouteDetectedOnPrefetch } from "./internal/app-route-detection.js";
|
|
14
|
+
import { isAbsoluteOrProtocolRelativeUrl, normalizePathTrailingSlash, toBrowserNavigationHref, toSameOriginAppPath, withBasePath } from "./url-utils.js";
|
|
14
15
|
import { getCurrentBrowserLocale } from "./client-locale.js";
|
|
15
16
|
import { getCurrentRoutePathnameForWarning } from "./internal/route-pattern-for-warning.js";
|
|
16
17
|
import { getNavigationRuntime, hasAppNavigationRuntime, registerNavigationRuntimeFunctions } from "../client/navigation-runtime.js";
|
|
17
18
|
import { createRscRequestHeaders, createRscRequestUrl, stripRscCacheBustingSearchParam, stripRscSuffix } from "../server/app-rsc-cache-busting.js";
|
|
18
19
|
import { getMountedSlotsHeader, getPrefetchCache, getPrefetchInterceptionContext, getPrefetchedUrls, hasPrefetchCacheEntryForNavigation, navigateClientSide, prefetchRscResponse } from "./navigation.js";
|
|
19
|
-
import {
|
|
20
|
+
import { navigatePagesRouterLinkWithFallback, resolvePagesRouterQueryOnlyHref } from "../client/pages-router-link-navigation.js";
|
|
20
21
|
import { getI18nContext } from "./i18n-context.js";
|
|
21
22
|
import { canLinkIntentPrefetch, canLinkPrefetch, getLinkPrefetchHref } from "./link-prefetch.js";
|
|
22
23
|
import { clearLinkForCurrentNavigation, notifyLinkNavigationStart, setLinkForCurrentNavigation } from "./internal/link-status-registry.js";
|
|
@@ -55,6 +56,19 @@ function resolveHref(href) {
|
|
|
55
56
|
}
|
|
56
57
|
return url;
|
|
57
58
|
}
|
|
59
|
+
function resolvePagesQueryOnlyHref(href) {
|
|
60
|
+
if (!href.startsWith("?") || typeof window === "undefined") return href;
|
|
61
|
+
const pagesRouter = window.next?.appDir === true ? void 0 : window.next?.router;
|
|
62
|
+
return resolvePagesRouterQueryOnlyHref(href, {
|
|
63
|
+
asPath: pagesRouter && "reload" in pagesRouter && "asPath" in pagesRouter && typeof pagesRouter.asPath === "string" ? pagesRouter.asPath : void 0,
|
|
64
|
+
basePath: __basePath,
|
|
65
|
+
fallbackHref: window.location.href,
|
|
66
|
+
locales: window.__VINEXT_LOCALES__
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
function resolvePagesLinkNavigationHref(href, locale) {
|
|
70
|
+
return normalizePathTrailingSlash(applyLocaleToHref(resolvePagesQueryOnlyHref(href), locale), __trailingSlash);
|
|
71
|
+
}
|
|
58
72
|
/**
|
|
59
73
|
* Collapse repeated forward-slashes (and convert backslashes to forward-slashes)
|
|
60
74
|
* in the path portion of a URL, preserving any query string.
|
|
@@ -122,7 +136,7 @@ function getLinkPrefetchRouterMode() {
|
|
|
122
136
|
}
|
|
123
137
|
function resolveMatchedAutoAppRoutePrefetch(route) {
|
|
124
138
|
return {
|
|
125
|
-
cacheForNavigation: !
|
|
139
|
+
cacheForNavigation: !route.canPrefetchLoadingShell,
|
|
126
140
|
prefetchShellFirst: !route.isDynamic,
|
|
127
141
|
shouldPrefetch: true
|
|
128
142
|
};
|
|
@@ -189,6 +203,8 @@ function prefetchUrl(href, mode, priority = "low") {
|
|
|
189
203
|
} : window.requestIdleCallback ?? ((fn) => setTimeout(fn, 100)))(() => {
|
|
190
204
|
(async () => {
|
|
191
205
|
if (hasAppNavigationRuntime()) {
|
|
206
|
+
const hybridOwner = resolveHybridClientRouteOwner(prefetchHref, __basePath);
|
|
207
|
+
if (hybridOwner === "pages" || hybridOwner === "document") return;
|
|
192
208
|
const autoPrefetch = mode === "auto" ? resolveAutoAppRoutePrefetch(prefetchHref) : {
|
|
193
209
|
cacheForNavigation: true,
|
|
194
210
|
prefetchShellFirst: true,
|
|
@@ -490,8 +506,9 @@ const Link = forwardRef(function Link({ href, as, replace = false, prefetch: pre
|
|
|
490
506
|
navigateHref = localPath;
|
|
491
507
|
}
|
|
492
508
|
e.preventDefault();
|
|
493
|
-
const
|
|
494
|
-
const
|
|
509
|
+
const hasAppNavigationRuntime = Boolean(getNavigationRuntime()?.functions.navigate);
|
|
510
|
+
const pagesNavigateHref = resolvedHref.startsWith("?") ? resolvePagesLinkNavigationHref(resolvedHref, locale) : navigateHref;
|
|
511
|
+
const absoluteFullHref = toBrowserNavigationHref(hasAppNavigationRuntime ? navigateHref : pagesNavigateHref, window.location.href, __basePath);
|
|
495
512
|
if (onNavigate) try {
|
|
496
513
|
const navUrl = new URL(absoluteFullHref, window.location.origin);
|
|
497
514
|
let prevented = false;
|
|
@@ -507,7 +524,12 @@ const Link = forwardRef(function Link({ href, as, replace = false, prefetch: pre
|
|
|
507
524
|
onNavigate(navEvent);
|
|
508
525
|
if (navEvent.defaultPrevented) return;
|
|
509
526
|
} catch {}
|
|
510
|
-
if (
|
|
527
|
+
if (hasAppNavigationRuntime && ["pages", "document"].includes(resolveHybridClientRouteOwner(navigateHref, __basePath) ?? "")) {
|
|
528
|
+
if (replace) window.location.replace(absoluteFullHref);
|
|
529
|
+
else window.location.assign(absoluteFullHref);
|
|
530
|
+
return;
|
|
531
|
+
}
|
|
532
|
+
if (hasAppNavigationRuntime) {
|
|
511
533
|
const setter = setPendingRef.current;
|
|
512
534
|
if (setter) setLinkForCurrentNavigation(setter);
|
|
513
535
|
setPending(true);
|
|
@@ -518,19 +540,25 @@ const Link = forwardRef(function Link({ href, as, replace = false, prefetch: pre
|
|
|
518
540
|
});
|
|
519
541
|
});
|
|
520
542
|
return;
|
|
521
|
-
} else
|
|
522
|
-
const Router =
|
|
523
|
-
await
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
543
|
+
} else {
|
|
544
|
+
const Router = window.next?.appDir === true ? void 0 : window.next?.router;
|
|
545
|
+
await navigatePagesRouterLinkWithFallback({
|
|
546
|
+
router: Router && "reload" in Router ? Router : void 0,
|
|
547
|
+
loadRouter: async () => (await import("next/router.js")).default,
|
|
548
|
+
navigation: {
|
|
549
|
+
href: pagesNavigateHref,
|
|
550
|
+
replace,
|
|
551
|
+
scroll,
|
|
552
|
+
shallow,
|
|
553
|
+
locale,
|
|
554
|
+
interpolateDynamicRoute: resolvedHref.startsWith("?")
|
|
555
|
+
},
|
|
556
|
+
fallback: () => {
|
|
557
|
+
if (replace) window.history.replaceState({}, "", absoluteFullHref);
|
|
558
|
+
else window.history.pushState({}, "", absoluteFullHref);
|
|
559
|
+
window.dispatchEvent(new PopStateEvent("popstate"));
|
|
560
|
+
}
|
|
529
561
|
});
|
|
530
|
-
} catch {
|
|
531
|
-
if (replace) window.history.replaceState({}, "", absoluteFullHref);
|
|
532
|
-
else window.history.pushState({}, "", absoluteFullHref);
|
|
533
|
-
window.dispatchEvent(new PopStateEvent("popstate"));
|
|
534
562
|
}
|
|
535
563
|
};
|
|
536
564
|
const anchorProps = restWithoutLocale;
|
package/dist/shims/metadata.js
CHANGED
|
@@ -621,7 +621,7 @@ function MetadataHead({ metadata, pathname = "/", trailingSlash }) {
|
|
|
621
621
|
}
|
|
622
622
|
}
|
|
623
623
|
}
|
|
624
|
-
if (tw.players) {
|
|
624
|
+
if (tw.card === "player" && tw.players) {
|
|
625
625
|
const players = Array.isArray(tw.players) ? tw.players : [tw.players];
|
|
626
626
|
for (const player of players) {
|
|
627
627
|
const playerUrl = player.playerUrl.toString();
|
|
@@ -644,7 +644,7 @@ function MetadataHead({ metadata, pathname = "/", trailingSlash }) {
|
|
|
644
644
|
}, key++));
|
|
645
645
|
}
|
|
646
646
|
}
|
|
647
|
-
if (tw.app) {
|
|
647
|
+
if (tw.card === "app" && tw.app) {
|
|
648
648
|
const { app } = tw;
|
|
649
649
|
for (const platform of [
|
|
650
650
|
"iphone",
|
|
@@ -655,11 +655,11 @@ function MetadataHead({ metadata, pathname = "/", trailingSlash }) {
|
|
|
655
655
|
name: `twitter:app:name:${platform}`,
|
|
656
656
|
content: app.name
|
|
657
657
|
}, key++));
|
|
658
|
-
if (app.id[platform]
|
|
658
|
+
if (app.id[platform]) elements.push(/* @__PURE__ */ jsx("meta", {
|
|
659
659
|
name: `twitter:app:id:${platform}`,
|
|
660
660
|
content: String(app.id[platform])
|
|
661
661
|
}, key++));
|
|
662
|
-
if (app.url?.[platform]
|
|
662
|
+
if (app.url?.[platform]) {
|
|
663
663
|
const appUrl = app.url[platform].toString();
|
|
664
664
|
elements.push(/* @__PURE__ */ jsx("meta", {
|
|
665
665
|
name: `twitter:app:url:${platform}`,
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { AppRouterScrollIntent } from "./app-router-scroll-state.js";
|
|
1
2
|
import { NavigationRuntimeVisibleCommitMode } from "../client/navigation-runtime.js";
|
|
2
3
|
import { AppRouterInstance, NavigateOptions, PrefetchOptions as PrefetchOptions$1 } from "./internal/app-router-context.js";
|
|
3
4
|
import { ReadonlyURLSearchParams } from "./readonly-url-search-params.js";
|
|
@@ -97,7 +98,9 @@ declare function getPrefetchedUrls(): Set<string>;
|
|
|
97
98
|
declare function resolveCachedRscResponseTtlMs(cached: Pick<CachedRscResponse, "dynamicStaleTimeSeconds">, fallbackTtlMs: number): number;
|
|
98
99
|
declare function resolveCachedRscResponseExpiresAt(timestamp: number, cached: Pick<CachedRscResponse, "dynamicStaleTimeSeconds" | "expiresAt">, fallbackTtlMs: number): number;
|
|
99
100
|
declare function resolvePrefetchCacheEntryMountedSlotsHeader(entry: PrefetchCacheEntry): string | null;
|
|
100
|
-
declare function hasPrefetchCacheEntryForNavigation(rscUrl: string, interceptionContext?: string | null, mountedSlotsHeader?: string | null
|
|
101
|
+
declare function hasPrefetchCacheEntryForNavigation(rscUrl: string, interceptionContext?: string | null, mountedSlotsHeader?: string | null, options?: {
|
|
102
|
+
notifyInvalidation?: boolean;
|
|
103
|
+
}): boolean;
|
|
101
104
|
declare function invalidatePrefetchCache(): void;
|
|
102
105
|
/**
|
|
103
106
|
* Store a prefetched RSC response in the cache by snapshotting it to an
|
|
@@ -205,6 +208,8 @@ type ClientNavigationRenderSnapshot = {
|
|
|
205
208
|
params: Record<string, string | string[]>;
|
|
206
209
|
};
|
|
207
210
|
declare function getClientNavigationRenderContext(): React$1.Context<ClientNavigationRenderSnapshot | null> | null;
|
|
211
|
+
/** @internal */
|
|
212
|
+
declare function useClientNavigationRenderSnapshot(): ClientNavigationRenderSnapshot | null;
|
|
208
213
|
declare function createClientNavigationRenderSnapshot(href: string, params: Record<string, string | string[]>): ClientNavigationRenderSnapshot;
|
|
209
214
|
declare function createSnapshotPathAndSearch(snapshot: ClientNavigationRenderSnapshot): string;
|
|
210
215
|
declare function setClientParams(params: Record<string, string | string[]>): void;
|
|
@@ -255,6 +260,7 @@ declare function replaceHistoryStateWithoutNotify(data: unknown, unused: string,
|
|
|
255
260
|
* history.replaceState interception (which would cause spurious re-renders).
|
|
256
261
|
*/
|
|
257
262
|
declare function saveScrollPosition(): void;
|
|
263
|
+
declare function applyAppRouterScrollFallback(intent: AppRouterScrollIntent): void;
|
|
258
264
|
/**
|
|
259
265
|
* Navigate to a URL, handling external URLs, hash-only changes, and RSC navigation.
|
|
260
266
|
*/
|
|
@@ -565,4 +571,4 @@ declare function isDynamicServerError(error: unknown): error is DynamicServerErr
|
|
|
565
571
|
*/
|
|
566
572
|
declare function unstable_rethrow(error: unknown): void;
|
|
567
573
|
//#endregion
|
|
568
|
-
export { BailoutToCSRError, CachedRscResponse, ClientNavigationRenderSnapshot, DynamicServerError, GLOBAL_ACCESSORS_KEY, HTTP_ERROR_FALLBACK_ERROR_CODE, MAX_PREFETCH_CACHE_SIZE, NavigationContext, PREFETCH_CACHE_TTL, PrefetchCacheEntry, PrefetchOptions, ReadonlyURLSearchParams, RedirectType, SegmentMap, ServerInsertedHTMLContext, UnrecognizedActionError, __basePath, _registerStateAccessors, activateNavigationSnapshot, appRouterInstance, clearPendingPathname, clearServerInsertedHTML, commitClientNavigationState, consumePrefetchResponse, consumePrefetchResponseForNavigation, createCachedRscResponseSnapshot, createClientNavigationRenderSnapshot, createSnapshotPathAndSearch, decodeRedirectError, flushServerInsertedHTML, forbidden, getAccessFallbackHTTPStatus, getBfcacheIdMapContext, getBfcacheSegmentIdContext, getClientNavigationRenderContext, getClientNavigationState, getClientParams, getCurrentInterceptionContext, getCurrentNextUrl, getLayoutSegmentContext, getMountedSlotsHeader, getNavigationContext, getPrefetchCache, getPrefetchInterceptionContext, getPrefetchedUrls, hasPrefetchCacheEntryForNavigation, invalidatePrefetchCache, isBailoutToCSRError, isDynamicServerError, isHTTPAccessFallbackError, isNextRouterError, isRedirectError, navigateClientSide, notFound, permanentRedirect, prefetchRscResponse, pushHistoryStateWithoutNotify, redirect, renderServerInsertedHTML, replaceClientParamsWithoutNotify, replaceHistoryStateWithoutNotify, resolveCachedRscResponseExpiresAt, resolveCachedRscResponseTtlMs, resolvePrefetchCacheEntryMountedSlotsHeader, restoreRscResponse, saveScrollPosition, setClientParams, setMountedSlotsHeader, setNavigationContext, setPendingPathname, snapshotRscResponse, storePrefetchResponse, unauthorized, unstable_isUnrecognizedActionError, unstable_rethrow, useParams, usePathname, useRouter, useSearchParams, useSelectedLayoutSegment, useSelectedLayoutSegments, useServerInsertedHTML };
|
|
574
|
+
export { BailoutToCSRError, CachedRscResponse, ClientNavigationRenderSnapshot, DynamicServerError, GLOBAL_ACCESSORS_KEY, HTTP_ERROR_FALLBACK_ERROR_CODE, MAX_PREFETCH_CACHE_SIZE, NavigationContext, PREFETCH_CACHE_TTL, PrefetchCacheEntry, PrefetchOptions, ReadonlyURLSearchParams, RedirectType, SegmentMap, ServerInsertedHTMLContext, UnrecognizedActionError, __basePath, _registerStateAccessors, activateNavigationSnapshot, appRouterInstance, applyAppRouterScrollFallback, clearPendingPathname, clearServerInsertedHTML, commitClientNavigationState, consumePrefetchResponse, consumePrefetchResponseForNavigation, createCachedRscResponseSnapshot, createClientNavigationRenderSnapshot, createSnapshotPathAndSearch, decodeRedirectError, flushServerInsertedHTML, forbidden, getAccessFallbackHTTPStatus, getBfcacheIdMapContext, getBfcacheSegmentIdContext, getClientNavigationRenderContext, getClientNavigationState, getClientParams, getCurrentInterceptionContext, getCurrentNextUrl, getLayoutSegmentContext, getMountedSlotsHeader, getNavigationContext, getPrefetchCache, getPrefetchInterceptionContext, getPrefetchedUrls, hasPrefetchCacheEntryForNavigation, invalidatePrefetchCache, isBailoutToCSRError, isDynamicServerError, isHTTPAccessFallbackError, isNextRouterError, isRedirectError, navigateClientSide, notFound, permanentRedirect, prefetchRscResponse, pushHistoryStateWithoutNotify, redirect, renderServerInsertedHTML, replaceClientParamsWithoutNotify, replaceHistoryStateWithoutNotify, resolveCachedRscResponseExpiresAt, resolveCachedRscResponseTtlMs, resolvePrefetchCacheEntryMountedSlotsHeader, restoreRscResponse, saveScrollPosition, setClientParams, setMountedSlotsHeader, setNavigationContext, setPendingPathname, snapshotRscResponse, storePrefetchResponse, unauthorized, unstable_isUnrecognizedActionError, unstable_rethrow, useClientNavigationRenderSnapshot, useParams, usePathname, useRouter, useSearchParams, useSelectedLayoutSegment, useSelectedLayoutSegments, useServerInsertedHTML };
|
package/dist/shims/navigation.js
CHANGED
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
import { stripBasePath } from "../utils/base-path.js";
|
|
2
2
|
import { VINEXT_DYNAMIC_STALE_TIME_HEADER, VINEXT_MOUNTED_SLOTS_HEADER, VINEXT_PARAMS_HEADER } from "../server/headers.js";
|
|
3
3
|
import { assertSafeNavigationUrl } from "./url-safety.js";
|
|
4
|
+
import { markPprFallbackShellDynamicBoundary } from "./ppr-fallback-shell.js";
|
|
4
5
|
import { AppElementsWire } from "../server/app-elements-wire.js";
|
|
5
6
|
import "../server/app-elements.js";
|
|
6
7
|
import { AppRouterContext } from "./internal/app-router-context.js";
|
|
8
|
+
import { resolveHybridClientRouteOwner } from "./internal/hybrid-client-route-owner.js";
|
|
7
9
|
import { isAbsoluteOrProtocolRelativeUrl, toBrowserNavigationHref, toSameOriginAppPath, withBasePath } from "./url-utils.js";
|
|
8
10
|
import { retryScrollTo, scrollToHashTarget } from "./hash-scroll.js";
|
|
9
11
|
import { getNavigationRuntime, hasAppNavigationRuntime } from "../client/navigation-runtime.js";
|
|
10
12
|
import { notifyAppRouterTransitionStart } from "../client/instrumentation-client-state.js";
|
|
13
|
+
import { clearAppNavigationFailureTarget, stageAppNavigationFailureTarget } from "../client/app-nav-failure-handler.js";
|
|
11
14
|
import { PUBLIC_INITIAL_BFCACHE_ID } from "../server/app-bfcache-id.js";
|
|
12
15
|
import { resolveManifestNavigationInterceptionContext } from "../server/app-browser-interception-context.js";
|
|
13
16
|
import { createExternalHistoryStatePreservingMetadata, createHashOnlyHistoryStatePreservingNavigationMetadata } from "../server/app-history-state.js";
|
|
@@ -15,7 +18,8 @@ import { VINEXT_RSC_COMPATIBILITY_ID_HEADER, createRscRequestHeaders, createRscR
|
|
|
15
18
|
import { hasPendingAppRouterPageRedirect } from "../server/app-browser-mpa-navigation.js";
|
|
16
19
|
import { navigationPlanner } from "../server/navigation-planner.js";
|
|
17
20
|
import { ReadonlyURLSearchParams } from "./readonly-url-search-params.js";
|
|
18
|
-
import {
|
|
21
|
+
import { getPagesNavigationContext } from "./internal/pages-router-accessor.js";
|
|
22
|
+
import { beginAppRouterScrollIntent, clearAppRouterScrollIntent, consumeAppRouterScrollIntent, getPendingAppRouterScrollIntent } from "./app-router-scroll-state.js";
|
|
19
23
|
import { UnrecognizedActionError, unstable_isUnrecognizedActionError } from "./unrecognized-action-error.js";
|
|
20
24
|
import * as React$1 from "react";
|
|
21
25
|
//#region src/shims/navigation.ts
|
|
@@ -131,17 +135,7 @@ function _registerStateAccessors(accessors) {
|
|
|
131
135
|
_getInsertedHTMLCallbacks = accessors.getInsertedHTMLCallbacks;
|
|
132
136
|
_clearInsertedHTMLCallbacks = accessors.clearInsertedHTMLCallbacks;
|
|
133
137
|
}
|
|
134
|
-
const PAGES_NAVIGATION_ACCESSOR_KEY = Symbol.for("vinext.navigation.pagesNavigationContextAccessor");
|
|
135
138
|
const PAGES_NAVIGATION_NOTIFY_KEY = Symbol.for("vinext.navigation.pagesNavigationNotify");
|
|
136
|
-
function _getPagesNavigationContext() {
|
|
137
|
-
const accessor = globalThis[PAGES_NAVIGATION_ACCESSOR_KEY];
|
|
138
|
-
if (!accessor) return null;
|
|
139
|
-
try {
|
|
140
|
-
return accessor();
|
|
141
|
-
} catch {
|
|
142
|
-
return null;
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
139
|
/**
|
|
146
140
|
* Get the navigation context for the current SSR/RSC render.
|
|
147
141
|
* Reads from AsyncLocalStorage when available (concurrent-safe),
|
|
@@ -299,12 +293,12 @@ function findPrefetchCacheEntryForNavigation(rscUrl, interceptionContext, mounte
|
|
|
299
293
|
}
|
|
300
294
|
return null;
|
|
301
295
|
}
|
|
302
|
-
function hasPrefetchCacheEntryForNavigation(rscUrl, interceptionContext = null, mountedSlotsHeader = null) {
|
|
296
|
+
function hasPrefetchCacheEntryForNavigation(rscUrl, interceptionContext = null, mountedSlotsHeader = null, options = {}) {
|
|
303
297
|
const match = findPrefetchCacheEntryForNavigation(rscUrl, interceptionContext, mountedSlotsHeader);
|
|
304
298
|
if (match === null) return false;
|
|
305
299
|
if (match.entry.pending !== void 0) return true;
|
|
306
300
|
if (resolvePrefetchCacheEntryExpiresAt(match.entry) > Date.now()) return true;
|
|
307
|
-
deletePrefetchCacheEntry(getPrefetchCache(), getPrefetchedUrls(), match.cacheKey, match.entry, true);
|
|
301
|
+
deletePrefetchCacheEntry(getPrefetchCache(), getPrefetchedUrls(), match.cacheKey, match.entry, options.notifyInvalidation ?? true);
|
|
308
302
|
return false;
|
|
309
303
|
}
|
|
310
304
|
/**
|
|
@@ -617,7 +611,7 @@ function getReadonlyPagesSearchParams(searchParams) {
|
|
|
617
611
|
* be visible until the next commit.
|
|
618
612
|
*/
|
|
619
613
|
function getPathnameSnapshot() {
|
|
620
|
-
const pagesCtx =
|
|
614
|
+
const pagesCtx = getPagesNavigationContext();
|
|
621
615
|
if (pagesCtx) return pagesCtx.pathname;
|
|
622
616
|
return getClientNavigationState()?.cachedPathname ?? "/";
|
|
623
617
|
}
|
|
@@ -632,7 +626,7 @@ let _cachedEmptyClientSearchParams = null;
|
|
|
632
626
|
*/
|
|
633
627
|
function getSearchParamsSnapshot() {
|
|
634
628
|
if (_getServerContext()) return getServerSearchParamsSnapshot();
|
|
635
|
-
const pagesCtx =
|
|
629
|
+
const pagesCtx = getPagesNavigationContext();
|
|
636
630
|
if (pagesCtx) return getReadonlyPagesSearchParams(pagesCtx.searchParams);
|
|
637
631
|
const cached = getClientNavigationState()?.cachedReadonlySearchParams;
|
|
638
632
|
if (cached) return cached;
|
|
@@ -659,7 +653,7 @@ function syncCommittedUrlStateFromLocation() {
|
|
|
659
653
|
function getServerSearchParamsSnapshot() {
|
|
660
654
|
const ctx = _getServerContext();
|
|
661
655
|
if (!ctx) {
|
|
662
|
-
const pagesCtx =
|
|
656
|
+
const pagesCtx = getPagesNavigationContext();
|
|
663
657
|
if (pagesCtx) return getReadonlyPagesSearchParams(pagesCtx.searchParams);
|
|
664
658
|
if (_cachedEmptyServerSearchParams === null) _cachedEmptyServerSearchParams = new ReadonlyURLSearchParams();
|
|
665
659
|
return _cachedEmptyServerSearchParams;
|
|
@@ -698,6 +692,7 @@ function getClientNavigationRenderContext() {
|
|
|
698
692
|
if (!globalState[_CLIENT_NAV_RENDER_CTX_KEY]) globalState[_CLIENT_NAV_RENDER_CTX_KEY] = React$1.createContext(null);
|
|
699
693
|
return globalState[_CLIENT_NAV_RENDER_CTX_KEY] ?? null;
|
|
700
694
|
}
|
|
695
|
+
/** @internal */
|
|
701
696
|
function useClientNavigationRenderSnapshot() {
|
|
702
697
|
const ctx = getClientNavigationRenderContext();
|
|
703
698
|
if (!ctx || typeof React$1.useContext !== "function") return null;
|
|
@@ -783,14 +778,14 @@ function getClientParamsSnapshot() {
|
|
|
783
778
|
const state = getClientNavigationState();
|
|
784
779
|
const ctx = _getServerContext();
|
|
785
780
|
if (ctx) return ctx.params;
|
|
786
|
-
const pagesCtx =
|
|
781
|
+
const pagesCtx = getPagesNavigationContext();
|
|
787
782
|
if (pagesCtx) return pagesCtx.params;
|
|
788
783
|
return state?.clientParams ?? _EMPTY_PARAMS;
|
|
789
784
|
}
|
|
790
785
|
function getServerParamsSnapshot() {
|
|
791
786
|
const ctx = _getServerContext();
|
|
792
787
|
if (ctx) return ctx.params;
|
|
793
|
-
const pagesCtx =
|
|
788
|
+
const pagesCtx = getPagesNavigationContext();
|
|
794
789
|
if (pagesCtx) return pagesCtx.params;
|
|
795
790
|
return _EMPTY_PARAMS;
|
|
796
791
|
}
|
|
@@ -808,16 +803,17 @@ function subscribeToNavigation(cb) {
|
|
|
808
803
|
*/
|
|
809
804
|
function usePathname() {
|
|
810
805
|
if (isServer) {
|
|
806
|
+
markPprFallbackShellDynamicBoundary();
|
|
811
807
|
const ctx = _getServerContext();
|
|
812
808
|
if (ctx) return ctx.pathname;
|
|
813
|
-
const pagesCtx =
|
|
809
|
+
const pagesCtx = getPagesNavigationContext();
|
|
814
810
|
return pagesCtx ? pagesCtx.pathname : "/";
|
|
815
811
|
}
|
|
816
812
|
const renderSnapshot = useClientNavigationRenderSnapshot();
|
|
817
813
|
const pathname = React$1.useSyncExternalStore(subscribeToNavigation, getPathnameSnapshot, () => {
|
|
818
814
|
const ctx = _getServerContext();
|
|
819
815
|
if (ctx) return ctx.pathname;
|
|
820
|
-
const pagesCtx =
|
|
816
|
+
const pagesCtx = getPagesNavigationContext();
|
|
821
817
|
return pagesCtx ? pagesCtx.pathname : "/";
|
|
822
818
|
});
|
|
823
819
|
if (renderSnapshot && (getClientNavigationState()?.navigationSnapshotActiveCount ?? 0) > 0) return renderSnapshot.pathname;
|
|
@@ -827,7 +823,10 @@ function usePathname() {
|
|
|
827
823
|
* Returns the current search params as a read-only URLSearchParams.
|
|
828
824
|
*/
|
|
829
825
|
function useSearchParams() {
|
|
830
|
-
if (isServer)
|
|
826
|
+
if (isServer) {
|
|
827
|
+
markPprFallbackShellDynamicBoundary();
|
|
828
|
+
return getServerSearchParamsSnapshot();
|
|
829
|
+
}
|
|
831
830
|
const renderSnapshot = useClientNavigationRenderSnapshot();
|
|
832
831
|
const searchParams = React$1.useSyncExternalStore(subscribeToNavigation, getSearchParamsSnapshot, getServerSearchParamsSnapshot);
|
|
833
832
|
if (renderSnapshot && (getClientNavigationState()?.navigationSnapshotActiveCount ?? 0) > 0) return renderSnapshot.searchParams;
|
|
@@ -837,7 +836,10 @@ function useSearchParams() {
|
|
|
837
836
|
* Returns the dynamic params for the current route.
|
|
838
837
|
*/
|
|
839
838
|
function useParams() {
|
|
840
|
-
if (isServer)
|
|
839
|
+
if (isServer) {
|
|
840
|
+
markPprFallbackShellDynamicBoundary();
|
|
841
|
+
return getServerParamsSnapshot();
|
|
842
|
+
}
|
|
841
843
|
const renderSnapshot = useClientNavigationRenderSnapshot();
|
|
842
844
|
const params = React$1.useSyncExternalStore(subscribeToNavigation, getClientParamsSnapshot, getServerParamsSnapshot);
|
|
843
845
|
if (renderSnapshot && (getClientNavigationState()?.navigationSnapshotActiveCount ?? 0) > 0) return renderSnapshot.params;
|
|
@@ -930,8 +932,17 @@ function applyAppRouterScrollFallback(intent) {
|
|
|
930
932
|
scrollToHashTarget(intent.hash);
|
|
931
933
|
return;
|
|
932
934
|
}
|
|
935
|
+
if (intent.targetHoistedInHead) return;
|
|
933
936
|
document.documentElement.scrollTop = 0;
|
|
934
937
|
}
|
|
938
|
+
function scheduleAppRouterScrollFallback(intent) {
|
|
939
|
+
queueMicrotask(() => {
|
|
940
|
+
const pendingIntent = getPendingAppRouterScrollIntent();
|
|
941
|
+
if (pendingIntent === null || pendingIntent.id !== intent.id) return;
|
|
942
|
+
const fallbackIntent = consumeAppRouterScrollIntent(intent);
|
|
943
|
+
if (fallbackIntent) applyAppRouterScrollFallback(fallbackIntent);
|
|
944
|
+
});
|
|
945
|
+
}
|
|
935
946
|
/**
|
|
936
947
|
* Restore scroll position from a history state object (used on popstate).
|
|
937
948
|
*
|
|
@@ -958,6 +969,15 @@ function restoreScrollPosition(state) {
|
|
|
958
969
|
}
|
|
959
970
|
}
|
|
960
971
|
/**
|
|
972
|
+
* Hard-navigate to a URL via `window.location`, preserving push/replace
|
|
973
|
+
* semantics. Used for URLs the App Router cannot serve (Pages-owned
|
|
974
|
+
* targets in a hybrid build) and for catch-all RSC failures.
|
|
975
|
+
*/
|
|
976
|
+
function hardNavigateTo(fullHref, mode) {
|
|
977
|
+
if (mode === "replace") window.location.replace(fullHref);
|
|
978
|
+
else window.location.assign(fullHref);
|
|
979
|
+
}
|
|
980
|
+
/**
|
|
961
981
|
* Navigate to a URL, handling external URLs, hash-only changes, and RSC navigation.
|
|
962
982
|
*/
|
|
963
983
|
async function navigateClientSide(href, mode, scroll, programmaticTransition = false, visibleCommitMode = "transition") {
|
|
@@ -972,14 +992,23 @@ async function navigateClientSide(href, mode, scroll, programmaticTransition = f
|
|
|
972
992
|
await externalNavigate(href, mode);
|
|
973
993
|
return;
|
|
974
994
|
}
|
|
975
|
-
|
|
976
|
-
else window.location.assign(href);
|
|
995
|
+
hardNavigateTo(href, mode);
|
|
977
996
|
await new Promise(() => {});
|
|
978
997
|
return;
|
|
979
998
|
}
|
|
980
999
|
normalizedHref = localPath;
|
|
981
1000
|
}
|
|
1001
|
+
const hybridOwner = resolveHybridClientRouteOwner(normalizedHref, __basePath);
|
|
1002
|
+
if (hybridOwner === "pages" || hybridOwner === "document") {
|
|
1003
|
+
const fullHref = toBrowserNavigationHref(normalizedHref, window.location.href, __basePath);
|
|
1004
|
+
notifyAppRouterTransitionStart(fullHref, mode);
|
|
1005
|
+
if (mode === "push") saveScrollPosition();
|
|
1006
|
+
hardNavigateTo(fullHref, mode);
|
|
1007
|
+
await new Promise(() => {});
|
|
1008
|
+
return;
|
|
1009
|
+
}
|
|
982
1010
|
const fullHref = toBrowserNavigationHref(normalizedHref, window.location.href, __basePath);
|
|
1011
|
+
stageAppNavigationFailureTarget(fullHref);
|
|
983
1012
|
notifyAppRouterTransitionStart(fullHref, mode);
|
|
984
1013
|
if (mode === "push") saveScrollPosition();
|
|
985
1014
|
const earlyIntent = navigationPlanner.classifyEarlyNavigationIntent({
|
|
@@ -990,7 +1019,9 @@ async function navigateClientSide(href, mode, scroll, programmaticTransition = f
|
|
|
990
1019
|
targetHref: fullHref
|
|
991
1020
|
});
|
|
992
1021
|
if (earlyIntent.kind === "sameDocumentScroll") {
|
|
1022
|
+
clearAppRouterScrollIntent();
|
|
993
1023
|
commitHashOnlyHistoryState(fullHref, earlyIntent.mode, earlyIntent.scroll);
|
|
1024
|
+
clearAppNavigationFailureTarget(fullHref);
|
|
994
1025
|
commitClientNavigationState();
|
|
995
1026
|
if (earlyIntent.scroll) scrollToHashTarget(earlyIntent.hash);
|
|
996
1027
|
return;
|
|
@@ -1001,8 +1032,7 @@ async function navigateClientSide(href, mode, scroll, programmaticTransition = f
|
|
|
1001
1032
|
await mpaNavigate(fullHref, mode);
|
|
1002
1033
|
return;
|
|
1003
1034
|
}
|
|
1004
|
-
|
|
1005
|
-
else window.location.assign(fullHref);
|
|
1035
|
+
hardNavigateTo(fullHref, mode);
|
|
1006
1036
|
await new Promise(() => {});
|
|
1007
1037
|
return;
|
|
1008
1038
|
}
|
|
@@ -1022,10 +1052,7 @@ async function navigateClientSide(href, mode, scroll, programmaticTransition = f
|
|
|
1022
1052
|
if (scrollIntent) consumeAppRouterScrollIntent(scrollIntent);
|
|
1023
1053
|
throw error;
|
|
1024
1054
|
}
|
|
1025
|
-
if (scrollIntent)
|
|
1026
|
-
const fallbackIntent = consumeAppRouterScrollIntent(scrollIntent);
|
|
1027
|
-
if (fallbackIntent) applyAppRouterScrollFallback(fallbackIntent);
|
|
1028
|
-
}
|
|
1055
|
+
if (scrollIntent) scheduleAppRouterScrollFallback(scrollIntent);
|
|
1029
1056
|
}
|
|
1030
1057
|
let scheduledAppRouterNavigationCount = 0;
|
|
1031
1058
|
function trackScheduledAppRouterNavigation() {
|
|
@@ -1057,6 +1084,7 @@ const _appRouter = {
|
|
|
1057
1084
|
push(href, options) {
|
|
1058
1085
|
assertSafeNavigationUrl(href);
|
|
1059
1086
|
if (isServer) return;
|
|
1087
|
+
getNavigationRuntime()?.functions.notifyLinkNavigationStart?.();
|
|
1060
1088
|
const releaseNavigation = trackScheduledAppRouterNavigation();
|
|
1061
1089
|
try {
|
|
1062
1090
|
React$1.startTransition(() => {
|
|
@@ -1071,6 +1099,7 @@ const _appRouter = {
|
|
|
1071
1099
|
replace(href, options) {
|
|
1072
1100
|
assertSafeNavigationUrl(href);
|
|
1073
1101
|
if (isServer) return;
|
|
1102
|
+
getNavigationRuntime()?.functions.notifyLinkNavigationStart?.();
|
|
1074
1103
|
const releaseNavigation = trackScheduledAppRouterNavigation();
|
|
1075
1104
|
try {
|
|
1076
1105
|
React$1.startTransition(() => {
|
|
@@ -1117,6 +1146,8 @@ const _appRouter = {
|
|
|
1117
1146
|
if (localPath == null) return;
|
|
1118
1147
|
prefetchHref = localPath;
|
|
1119
1148
|
}
|
|
1149
|
+
const hybridOwner = resolveHybridClientRouteOwner(prefetchHref, __basePath);
|
|
1150
|
+
if (hybridOwner === "pages" || hybridOwner === "document") return;
|
|
1120
1151
|
const fullHref = toBrowserNavigationHref(prefetchHref, window.location.href, __basePath);
|
|
1121
1152
|
const interceptionContext = getPrefetchInterceptionContext(fullHref);
|
|
1122
1153
|
const mountedSlotsHeader = getMountedSlotsHeader();
|
|
@@ -1220,6 +1251,7 @@ function useSelectedLayoutSegment(parallelRoutesKey) {
|
|
|
1220
1251
|
* @param parallelRoutesKey - Which parallel route to read (default: "children")
|
|
1221
1252
|
*/
|
|
1222
1253
|
function useSelectedLayoutSegments(parallelRoutesKey) {
|
|
1254
|
+
if (isServer) markPprFallbackShellDynamicBoundary();
|
|
1223
1255
|
return useChildSegments(parallelRoutesKey);
|
|
1224
1256
|
}
|
|
1225
1257
|
/**
|
|
@@ -1602,4 +1634,4 @@ if (!isServer) {
|
|
|
1602
1634
|
}
|
|
1603
1635
|
}
|
|
1604
1636
|
//#endregion
|
|
1605
|
-
export { BailoutToCSRError, DynamicServerError, GLOBAL_ACCESSORS_KEY, HTTP_ERROR_FALLBACK_ERROR_CODE, MAX_PREFETCH_CACHE_SIZE, PREFETCH_CACHE_TTL, ReadonlyURLSearchParams, RedirectType, ServerInsertedHTMLContext, UnrecognizedActionError, __basePath, _registerStateAccessors, activateNavigationSnapshot, appRouterInstance, clearPendingPathname, clearServerInsertedHTML, commitClientNavigationState, consumePrefetchResponse, consumePrefetchResponseForNavigation, createCachedRscResponseSnapshot, createClientNavigationRenderSnapshot, createSnapshotPathAndSearch, decodeRedirectError, flushServerInsertedHTML, forbidden, getAccessFallbackHTTPStatus, getBfcacheIdMapContext, getBfcacheSegmentIdContext, getClientNavigationRenderContext, getClientNavigationState, getClientParams, getCurrentInterceptionContext, getCurrentNextUrl, getLayoutSegmentContext, getMountedSlotsHeader, getNavigationContext, getPrefetchCache, getPrefetchInterceptionContext, getPrefetchedUrls, hasPrefetchCacheEntryForNavigation, invalidatePrefetchCache, isBailoutToCSRError, isDynamicServerError, isHTTPAccessFallbackError, isNextRouterError, isRedirectError, navigateClientSide, notFound, permanentRedirect, prefetchRscResponse, pushHistoryStateWithoutNotify, redirect, renderServerInsertedHTML, replaceClientParamsWithoutNotify, replaceHistoryStateWithoutNotify, resolveCachedRscResponseExpiresAt, resolveCachedRscResponseTtlMs, resolvePrefetchCacheEntryMountedSlotsHeader, restoreRscResponse, saveScrollPosition, setClientParams, setMountedSlotsHeader, setNavigationContext, setPendingPathname, snapshotRscResponse, storePrefetchResponse, unauthorized, unstable_isUnrecognizedActionError, unstable_rethrow, useParams, usePathname, useRouter, useSearchParams, useSelectedLayoutSegment, useSelectedLayoutSegments, useServerInsertedHTML };
|
|
1637
|
+
export { BailoutToCSRError, DynamicServerError, GLOBAL_ACCESSORS_KEY, HTTP_ERROR_FALLBACK_ERROR_CODE, MAX_PREFETCH_CACHE_SIZE, PREFETCH_CACHE_TTL, ReadonlyURLSearchParams, RedirectType, ServerInsertedHTMLContext, UnrecognizedActionError, __basePath, _registerStateAccessors, activateNavigationSnapshot, appRouterInstance, applyAppRouterScrollFallback, clearPendingPathname, clearServerInsertedHTML, commitClientNavigationState, consumePrefetchResponse, consumePrefetchResponseForNavigation, createCachedRscResponseSnapshot, createClientNavigationRenderSnapshot, createSnapshotPathAndSearch, decodeRedirectError, flushServerInsertedHTML, forbidden, getAccessFallbackHTTPStatus, getBfcacheIdMapContext, getBfcacheSegmentIdContext, getClientNavigationRenderContext, getClientNavigationState, getClientParams, getCurrentInterceptionContext, getCurrentNextUrl, getLayoutSegmentContext, getMountedSlotsHeader, getNavigationContext, getPrefetchCache, getPrefetchInterceptionContext, getPrefetchedUrls, hasPrefetchCacheEntryForNavigation, invalidatePrefetchCache, isBailoutToCSRError, isDynamicServerError, isHTTPAccessFallbackError, isNextRouterError, isRedirectError, navigateClientSide, notFound, permanentRedirect, prefetchRscResponse, pushHistoryStateWithoutNotify, redirect, renderServerInsertedHTML, replaceClientParamsWithoutNotify, replaceHistoryStateWithoutNotify, resolveCachedRscResponseExpiresAt, resolveCachedRscResponseTtlMs, resolvePrefetchCacheEntryMountedSlotsHeader, restoreRscResponse, saveScrollPosition, setClientParams, setMountedSlotsHeader, setNavigationContext, setPendingPathname, snapshotRscResponse, storePrefetchResponse, unauthorized, unstable_isUnrecognizedActionError, unstable_rethrow, useClientNavigationRenderSnapshot, useParams, usePathname, useRouter, useSearchParams, useSelectedLayoutSegment, useSelectedLayoutSegments, useServerInsertedHTML };
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
//#region src/shims/ppr-fallback-shell.d.ts
|
|
2
2
|
type PprFallbackShellState = {
|
|
3
3
|
abortController: AbortController;
|
|
4
|
+
reactAbortController: AbortController;
|
|
4
5
|
cacheEpoch: number;
|
|
5
6
|
cacheReadyResolvers: Array<() => void>;
|
|
6
7
|
fallbackParamNames: ReadonlySet<string>;
|
|
7
8
|
hasDynamicBoundary: boolean;
|
|
9
|
+
isFinalRenderStarted: boolean;
|
|
8
10
|
isAbortScheduled: boolean;
|
|
9
11
|
pendingAbortCleanup: (() => void) | null;
|
|
10
12
|
pendingCacheReadyCleanup: (() => void) | null;
|
|
@@ -21,9 +23,11 @@ declare function runWithPprFallbackShellState<T>(state: PprFallbackShellState, f
|
|
|
21
23
|
declare function getPprFallbackShellState(): PprFallbackShellState | null;
|
|
22
24
|
declare function trackPprFallbackShellCacheTask<T>(fn: () => Promise<T>, cacheVariant: string): Promise<T>;
|
|
23
25
|
declare function createPprFallbackShellSuspensePromiseForState<T>(state: PprFallbackShellState, expression: string): Promise<T>;
|
|
26
|
+
declare function markPprFallbackShellDynamicBoundary(): void;
|
|
24
27
|
declare function createPprFallbackShellSuspensePromise<T>(expression: string): Promise<T> | null;
|
|
25
28
|
declare function waitForPprFallbackShellCacheReady(state: PprFallbackShellState): Promise<void>;
|
|
26
29
|
declare function preparePprFallbackShellFinalRender(state: PprFallbackShellState): void;
|
|
30
|
+
declare function beginPprFallbackShellFinalRender(state: PprFallbackShellState): void;
|
|
27
31
|
declare function isPprFallbackShellAbortError(error: unknown): boolean;
|
|
28
32
|
//#endregion
|
|
29
|
-
export { PprFallbackShellState, createPprFallbackShellState, createPprFallbackShellSuspensePromise, createPprFallbackShellSuspensePromiseForState, getPprFallbackShellState, isPprFallbackShellAbortError, preparePprFallbackShellFinalRender, runWithPprFallbackShellState, trackPprFallbackShellCacheTask, waitForPprFallbackShellCacheReady };
|
|
33
|
+
export { PprFallbackShellState, beginPprFallbackShellFinalRender, createPprFallbackShellState, createPprFallbackShellSuspensePromise, createPprFallbackShellSuspensePromiseForState, getPprFallbackShellState, isPprFallbackShellAbortError, markPprFallbackShellDynamicBoundary, preparePprFallbackShellFinalRender, runWithPprFallbackShellState, trackPprFallbackShellCacheTask, waitForPprFallbackShellCacheReady };
|
|
@@ -43,12 +43,15 @@ function scheduleCacheReadyIfSettled(state) {
|
|
|
43
43
|
});
|
|
44
44
|
}
|
|
45
45
|
function scheduleAbortIfReady(state) {
|
|
46
|
-
if (state.phase !== "final" || !state.hasDynamicBoundary || state.pendingCacheTasks > 0 || state.pendingCacheReadyCleanup !== null || state.isAbortScheduled) return;
|
|
46
|
+
if (state.phase !== "final" || !state.isFinalRenderStarted || !state.hasDynamicBoundary || state.pendingCacheTasks > 0 || state.pendingCacheReadyCleanup !== null || state.isAbortScheduled) return;
|
|
47
47
|
state.isAbortScheduled = true;
|
|
48
48
|
state.pendingAbortCleanup = scheduleAfterTask(() => {
|
|
49
49
|
state.pendingAbortCleanup = null;
|
|
50
50
|
state.isAbortScheduled = false;
|
|
51
|
-
if (state.phase === "final" && state.hasDynamicBoundary && state.pendingCacheTasks === 0 && state.pendingCacheReadyCleanup === null && !state.
|
|
51
|
+
if (state.phase === "final" && state.hasDynamicBoundary && state.pendingCacheTasks === 0 && state.pendingCacheReadyCleanup === null && !state.reactAbortController.signal.aborted) {
|
|
52
|
+
state.reactAbortController.abort();
|
|
53
|
+
state.abortController.abort();
|
|
54
|
+
}
|
|
52
55
|
});
|
|
53
56
|
}
|
|
54
57
|
function completeCacheTask(state, task) {
|
|
@@ -64,12 +67,15 @@ function ignoreCacheTask(state, task) {
|
|
|
64
67
|
completeCacheTask(state, task);
|
|
65
68
|
}
|
|
66
69
|
function createPprFallbackShellState(options) {
|
|
70
|
+
const abortController = new AbortController();
|
|
67
71
|
return {
|
|
68
|
-
abortController
|
|
72
|
+
abortController,
|
|
73
|
+
reactAbortController: abortController,
|
|
69
74
|
cacheEpoch: 0,
|
|
70
75
|
cacheReadyResolvers: [],
|
|
71
76
|
fallbackParamNames: new Set(options.fallbackParamNames),
|
|
72
77
|
hasDynamicBoundary: false,
|
|
78
|
+
isFinalRenderStarted: false,
|
|
73
79
|
isAbortScheduled: false,
|
|
74
80
|
pendingAbortCleanup: null,
|
|
75
81
|
pendingCacheReadyCleanup: null,
|
|
@@ -107,14 +113,22 @@ function trackPprFallbackShellCacheTask(fn, cacheVariant) {
|
|
|
107
113
|
});
|
|
108
114
|
}
|
|
109
115
|
function createPprFallbackShellSuspensePromiseForState(state, expression) {
|
|
110
|
-
state
|
|
111
|
-
for (const task of pprFallbackShellCacheTaskStackAls.getStore() ?? []) ignoreCacheTask(state, task);
|
|
112
|
-
scheduleCacheReadyIfSettled(state);
|
|
116
|
+
markPprFallbackShellDynamicBoundaryForState(state);
|
|
113
117
|
if (state.phase === "final") scheduleAbortIfReady(state);
|
|
114
118
|
const promise = makeHangingPromise(state.abortController.signal, state.routePattern, expression);
|
|
115
119
|
promise.catch(noop);
|
|
116
120
|
return promise;
|
|
117
121
|
}
|
|
122
|
+
function markPprFallbackShellDynamicBoundaryForState(state) {
|
|
123
|
+
state.hasDynamicBoundary = true;
|
|
124
|
+
for (const task of pprFallbackShellCacheTaskStackAls.getStore() ?? []) ignoreCacheTask(state, task);
|
|
125
|
+
scheduleCacheReadyIfSettled(state);
|
|
126
|
+
}
|
|
127
|
+
function markPprFallbackShellDynamicBoundary() {
|
|
128
|
+
const state = getPprFallbackShellState();
|
|
129
|
+
if (state === null || state.fallbackParamNames.size === 0) return;
|
|
130
|
+
markPprFallbackShellDynamicBoundaryForState(state);
|
|
131
|
+
}
|
|
118
132
|
function createPprFallbackShellSuspensePromise(expression) {
|
|
119
133
|
const state = getPprFallbackShellState();
|
|
120
134
|
if (state === null) return null;
|
|
@@ -134,16 +148,23 @@ function preparePprFallbackShellFinalRender(state) {
|
|
|
134
148
|
state.pendingAbortCleanup = null;
|
|
135
149
|
}
|
|
136
150
|
state.abortController = new AbortController();
|
|
151
|
+
state.reactAbortController = new AbortController();
|
|
137
152
|
state.cacheEpoch++;
|
|
138
153
|
state.cacheReadyResolvers.length = 0;
|
|
139
154
|
state.hasDynamicBoundary = false;
|
|
155
|
+
state.isFinalRenderStarted = false;
|
|
140
156
|
state.isAbortScheduled = false;
|
|
141
157
|
state.pendingCacheTasks = 0;
|
|
142
158
|
state.phase = "final";
|
|
143
159
|
}
|
|
160
|
+
function beginPprFallbackShellFinalRender(state) {
|
|
161
|
+
if (state.phase !== "final") return;
|
|
162
|
+
state.isFinalRenderStarted = true;
|
|
163
|
+
scheduleAbortIfReady(state);
|
|
164
|
+
}
|
|
144
165
|
function isPprFallbackShellAbortError(error) {
|
|
145
166
|
if (typeof DOMException !== "undefined" && error instanceof DOMException && error.name === "AbortError") return true;
|
|
146
167
|
return error instanceof Error && error.name === "HangingPromiseRejectionError";
|
|
147
168
|
}
|
|
148
169
|
//#endregion
|
|
149
|
-
export { createPprFallbackShellState, createPprFallbackShellSuspensePromise, createPprFallbackShellSuspensePromiseForState, getPprFallbackShellState, isPprFallbackShellAbortError, preparePprFallbackShellFinalRender, runWithPprFallbackShellState, trackPprFallbackShellCacheTask, waitForPprFallbackShellCacheReady };
|
|
170
|
+
export { beginPprFallbackShellFinalRender, createPprFallbackShellState, createPprFallbackShellSuspensePromise, createPprFallbackShellSuspensePromiseForState, getPprFallbackShellState, isPprFallbackShellAbortError, markPprFallbackShellDynamicBoundary, preparePprFallbackShellFinalRender, runWithPprFallbackShellState, trackPprFallbackShellCacheTask, waitForPprFallbackShellCacheReady };
|
package/dist/shims/router.d.ts
CHANGED
|
@@ -34,11 +34,15 @@ type NextRouter = {
|
|
|
34
34
|
type UrlObject = {
|
|
35
35
|
pathname?: string;
|
|
36
36
|
query?: UrlQuery;
|
|
37
|
+
search?: string;
|
|
38
|
+
hash?: string;
|
|
37
39
|
};
|
|
38
40
|
type TransitionOptions = {
|
|
41
|
+
_h?: 1;
|
|
39
42
|
shallow?: boolean;
|
|
40
43
|
scroll?: boolean;
|
|
41
44
|
locale?: string | false;
|
|
45
|
+
_vinextInterpolateDynamicRoute?: boolean;
|
|
42
46
|
};
|
|
43
47
|
type RouterEvents = {
|
|
44
48
|
on(event: string, handler: (...args: unknown[]) => void): void;
|
|
@@ -49,7 +53,7 @@ type RouterEvents = {
|
|
|
49
53
|
* Apply locale prefix to a URL for client-side navigation.
|
|
50
54
|
* Same logic as Link's applyLocaleToHref but reads from window globals.
|
|
51
55
|
*/
|
|
52
|
-
declare function applyNavigationLocale(url: string, locale?: string): string;
|
|
56
|
+
declare function applyNavigationLocale(url: string, locale?: string, replaceExistingLocale?: boolean): string;
|
|
53
57
|
/** Check if a URL is external (any URL scheme per RFC 3986, or protocol-relative) */
|
|
54
58
|
declare function isExternalUrl(url: string): boolean;
|
|
55
59
|
/** Check if a href is only a hash change relative to the current URL */
|
|
@@ -108,6 +112,8 @@ type PagesNavigationContextShape = {
|
|
|
108
112
|
*/
|
|
109
113
|
declare function getPagesNavigationContext(): PagesNavigationContextShape | null;
|
|
110
114
|
declare function getPagesNavigationIsReadyFromSerializedState(routePattern: string | undefined, searchString: string, nextData?: VinextNextData): boolean;
|
|
115
|
+
declare function markPagesRouterReady(): boolean;
|
|
116
|
+
declare function initializePagesRouterReadyFromNextData(nextData: VinextNextData): void;
|
|
111
117
|
/**
|
|
112
118
|
* useRouter hook - Pages Router compatible.
|
|
113
119
|
*
|
|
@@ -122,8 +128,17 @@ declare function useRouter(): NextRouter;
|
|
|
122
128
|
* The provider owns the reactive Pages Router snapshot so next/router and
|
|
123
129
|
* next/compat/router consumers share one context value instead of each hook
|
|
124
130
|
* installing its own global URL-change listener.
|
|
131
|
+
*
|
|
132
|
+
* The PagesRouterCommitBoundary exists for client navigations: its layout
|
|
133
|
+
* callback runs scroll restoration at commit time and resolves the navigation
|
|
134
|
+
* at the same root-commit boundary Next.js awaits before routeChangeComplete.
|
|
135
|
+
* Its onError rejection drives the hard-navigation fallback in runNavigateClient.
|
|
136
|
+
* The same boundary intentionally also wraps SSR and initial hydration, where
|
|
137
|
+
* callbacks default to noopCommit: a hydration-time render error is caught
|
|
138
|
+
* here (React still console.error's it) instead of propagating, matching the
|
|
139
|
+
* navigation-path containment.
|
|
125
140
|
*/
|
|
126
|
-
declare function wrapWithRouterContext(element: ReactElement): ReactElement;
|
|
141
|
+
declare function wrapWithRouterContext(element: ReactElement, onCommit?: () => void, onError?: (error: Error) => void): ReactElement;
|
|
127
142
|
/**
|
|
128
143
|
* Props injected by `withRouter` into the wrapped component.
|
|
129
144
|
*
|
|
@@ -176,4 +191,4 @@ declare const RouterMethods: {
|
|
|
176
191
|
};
|
|
177
192
|
declare const Router: typeof RouterMethods & Omit<NextRouter, keyof typeof RouterMethods>;
|
|
178
193
|
//#endregion
|
|
179
|
-
export { ExcludeRouterProps, NextRouter, WithRouterProps, _registerRouterStateAccessors, applyNavigationLocale, Router as default, getPagesNavigationContext, getPagesNavigationIsReadyFromSerializedState, isExternalUrl, isHashOnlyChange, setSSRContext, useRouter, withRouter, wrapWithRouterContext };
|
|
194
|
+
export { ExcludeRouterProps, NextRouter, WithRouterProps, initializePagesRouterReadyFromNextData as _initializePagesRouterReadyFromNextData, markPagesRouterReady as _markPagesRouterReady, _registerRouterStateAccessors, applyNavigationLocale, Router as default, getPagesNavigationContext, getPagesNavigationIsReadyFromSerializedState, isExternalUrl, isHashOnlyChange, setSSRContext, useRouter, withRouter, wrapWithRouterContext };
|