@wular/pnext 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +153 -0
- package/bin/pnext +67 -0
- package/config/lint/base.js +48 -0
- package/config/ts/base.json +26 -0
- package/config/ts/react.json +13 -0
- package/package.json +70 -0
- package/reference/compat.md +63 -0
- package/reference/config.md +120 -0
- package/reference/css.md +58 -0
- package/reference/dev.md +69 -0
- package/reference/env.md +40 -0
- package/reference/metadata.md +86 -0
- package/reference/navigation.md +149 -0
- package/reference/overview.md +35 -0
- package/reference/performance.md +97 -0
- package/reference/rendering.md +127 -0
- package/reference/routing.md +167 -0
- package/reference/typegen.md +64 -0
- package/src/api/cache.ts +80 -0
- package/src/api/client-cache.ts +9 -0
- package/src/api/client-navigation.ts +279 -0
- package/src/api/dynamic.tsx +102 -0
- package/src/api/link.tsx +119 -0
- package/src/api/navigation.ts +198 -0
- package/src/api/router/events.ts +53 -0
- package/src/api/router/history.ts +70 -0
- package/src/api/router/hub.ts +194 -0
- package/src/api/router/policies.ts +107 -0
- package/src/api/router/runtime.ts +5238 -0
- package/src/api/router/types.ts +299 -0
- package/src/api/router.ts +167 -0
- package/src/api/server.ts +323 -0
- package/src/api/suspense.ts +16 -0
- package/src/cache/context.ts +61 -0
- package/src/cli/adapters/vercel-warm.ts +375 -0
- package/src/cli/adapters/vercel.ts +1310 -0
- package/src/cli/analyze-print.ts +181 -0
- package/src/cli/analyze.ts +328 -0
- package/src/cli/boot-trace.ts +29 -0
- package/src/cli/build.ts +3114 -0
- package/src/cli/dev.ts +276 -0
- package/src/cli/index.ts +196 -0
- package/src/cli/named-bin.ts +119 -0
- package/src/cli/serve-ui.ts +160 -0
- package/src/cli/start.ts +1425 -0
- package/src/client/build.ts +2136 -0
- package/src/client/chunk-fold.ts +526 -0
- package/src/client/entry.ts +1525 -0
- package/src/client/paths.ts +22 -0
- package/src/client/prebuilt.ts +621 -0
- package/src/client/profile.ts +75 -0
- package/src/client/react-compiler.ts +94 -0
- package/src/client/reference-stub.ts +145 -0
- package/src/client/reference.ts +47 -0
- package/src/compat/actions/action-client.ts +531 -0
- package/src/compat/actions/action-dispatch.ts +676 -0
- package/src/compat/actions/action-router.ts +40 -0
- package/src/compat/actions/action-shared.ts +95 -0
- package/src/compat/actions/client-plugin.ts +135 -0
- package/src/compat/actions/client-stub.ts +65 -0
- package/src/compat/actions/config.ts +164 -0
- package/src/compat/actions/detect.ts +208 -0
- package/src/compat/actions/discovery.ts +244 -0
- package/src/compat/actions/early-submit.ts +40 -0
- package/src/compat/actions/endpoint.ts +602 -0
- package/src/compat/actions/flight.ts +52 -0
- package/src/compat/actions/form-state.ts +73 -0
- package/src/compat/actions/hoist.ts +485 -0
- package/src/compat/actions/ids.ts +39 -0
- package/src/compat/actions/index.ts +41 -0
- package/src/compat/actions/instances.ts +144 -0
- package/src/compat/actions/origin.ts +109 -0
- package/src/compat/actions/protocol.ts +125 -0
- package/src/compat/actions/registry.ts +74 -0
- package/src/compat/actions/rewrite.ts +282 -0
- package/src/compat/actions/serve.ts +414 -0
- package/src/compat/actions/server-tag.ts +21 -0
- package/src/compat/actions/unrecognized-error.ts +30 -0
- package/src/compat/adapter/build-complete.ts +257 -0
- package/src/compat/bundler/bun-externals.ts +53 -0
- package/src/compat/bundler/cjs-exports.ts +542 -0
- package/src/compat/bundler/config.ts +363 -0
- package/src/compat/bundler/externals.ts +34 -0
- package/src/compat/bundler/import-meta-url.ts +60 -0
- package/src/compat/bundler/modularize-imports.ts +119 -0
- package/src/compat/bundler/new-url-asset.ts +87 -0
- package/src/compat/bundler/optimize-package-imports.ts +273 -0
- package/src/compat/bundler/polyfill.ts +88 -0
- package/src/compat/bundler/react-compiler.ts +61 -0
- package/src/compat/bundler/react-profiler.tsx +25 -0
- package/src/compat/bundler/relay-transform.ts +116 -0
- package/src/compat/bundler/require-context.ts +281 -0
- package/src/compat/bundler/resolve-extensions.ts +75 -0
- package/src/compat/bundler/source-cache.ts +61 -0
- package/src/compat/bundler/static-imports.ts +25 -0
- package/src/compat/bundler/symlink-imports.ts +119 -0
- package/src/compat/bundler/tsconfig-paths.ts +50 -0
- package/src/compat/bundler/wasm.ts +153 -0
- package/src/compat/bundler/webpack-loaders.ts +685 -0
- package/src/compat/bundler/worker.ts +278 -0
- package/src/compat/cache/build-flags.ts +81 -0
- package/src/compat/cache/build-prerender-errors.ts +163 -0
- package/src/compat/cache/custom-handler.ts +159 -0
- package/src/compat/cache/fetch-patch.ts +745 -0
- package/src/compat/cache/handler.ts +100 -0
- package/src/compat/cache/modern-handler.ts +275 -0
- package/src/compat/cache/resume-data-cache.ts +143 -0
- package/src/compat/cache/revalidate.ts +759 -0
- package/src/compat/cache/runtime-error.ts +124 -0
- package/src/compat/cache/use-cache-transform.ts +961 -0
- package/src/compat/cache/use-cache.ts +1695 -0
- package/src/compat/cache-control.ts +269 -0
- package/src/compat/client/base-path.ts +64 -0
- package/src/compat/client/css-order.ts +36 -0
- package/src/compat/client/errors/control-flow.ts +92 -0
- package/src/compat/client/errors/error-boundary.ts +222 -0
- package/src/compat/client/errors/global-error.ts +238 -0
- package/src/compat/client/errors/install.ts +217 -0
- package/src/compat/client/errors/lazy.ts +53 -0
- package/src/compat/client/errors/primitive-throw.ts +126 -0
- package/src/compat/client/errors/soft-refresh.ts +14 -0
- package/src/compat/client/link-status.ts +86 -0
- package/src/compat/client/nav-compat-runtime.ts +57 -0
- package/src/compat/client/nav-compat.ts +42 -0
- package/src/compat/client/navigation-scroll.ts +154 -0
- package/src/compat/client/optimistic-routing.ts +206 -0
- package/src/compat/client/prefetch-cache.ts +111 -0
- package/src/compat/client/route-announcer.ts +72 -0
- package/src/compat/client/segment-cache-policy.ts +159 -0
- package/src/compat/client/segment-cache.ts +1077 -0
- package/src/compat/client/segment-prefetch.ts +375 -0
- package/src/compat/client/trailing-slash.ts +24 -0
- package/src/compat/css/chunking.ts +254 -0
- package/src/compat/css/inline-css.ts +73 -0
- package/src/compat/css/lightningcss.ts +90 -0
- package/src/compat/css/modules.ts +373 -0
- package/src/compat/css/nonce.ts +30 -0
- package/src/compat/css/sass-plugin.ts +65 -0
- package/src/compat/css/sass.ts +392 -0
- package/src/compat/css/styled-jsx-runtime.ts +80 -0
- package/src/compat/css/styled-jsx.ts +49 -0
- package/src/compat/edge-runtime.ts +71 -0
- package/src/compat/export/client.ts +112 -0
- package/src/compat/export/index.ts +272 -0
- package/src/compat/export/standalone.ts +207 -0
- package/src/compat/image-optimizer/cache.ts +119 -0
- package/src/compat/image-optimizer/detect.ts +143 -0
- package/src/compat/image-optimizer/index.ts +601 -0
- package/src/compat/image-optimizer/source.ts +243 -0
- package/src/compat/index.ts +458 -0
- package/src/compat/lifecycle/after-scope.ts +86 -0
- package/src/compat/lifecycle/after.ts +173 -0
- package/src/compat/lifecycle/error-funnel.ts +306 -0
- package/src/compat/lifecycle/error-serialize.ts +87 -0
- package/src/compat/lifecycle/error-ui.ts +167 -0
- package/src/compat/lifecycle/instrumentation-client.ts +138 -0
- package/src/compat/lifecycle/instrumentation.ts +277 -0
- package/src/compat/lifecycle/node-console.ts +19 -0
- package/src/compat/lifecycle/testmode.ts +263 -0
- package/src/compat/mdx/compile.ts +219 -0
- package/src/compat/mdx/next-mdx-stub.ts +46 -0
- package/src/compat/mdx/plugin.ts +37 -0
- package/src/compat/metadata-route-artifacts.ts +458 -0
- package/src/compat/metadata.ts +295 -0
- package/src/compat/middleware/manifest.ts +210 -0
- package/src/compat/misc/action-return.ts +173 -0
- package/src/compat/next/cache.ts +211 -0
- package/src/compat/next/canonical-url.ts +35 -0
- package/src/compat/next/client-cache.ts +57 -0
- package/src/compat/next/client-navigation.ts +313 -0
- package/src/compat/next/client-only.ts +3 -0
- package/src/compat/next/client-script.tsx +215 -0
- package/src/compat/next/client-server.ts +39 -0
- package/src/compat/next/config-loader.ts +569 -0
- package/src/compat/next/config.ts +29 -0
- package/src/compat/next/constants.cjs +6 -0
- package/src/compat/next/constants.ts +6 -0
- package/src/compat/next/custom-server.ts +236 -0
- package/src/compat/next/dist/client/components/app-router-headers.ts +32 -0
- package/src/compat/next/dist/server/app-render/work-unit-async-storage.external.cjs +38 -0
- package/src/compat/next/dist/server/web/spec-extension/revalidate.ts +1 -0
- package/src/compat/next/dist/server/web/spec-extension/unstable-cache.ts +1 -0
- package/src/compat/next/dist/server/web/spec-extension/unstable-no-store.ts +1 -0
- package/src/compat/next/dynamic.tsx +46 -0
- package/src/compat/next/error.tsx +148 -0
- package/src/compat/next/font/cache.ts +171 -0
- package/src/compat/next/font/google.ts +2 -0
- package/src/compat/next/font/index.ts +8 -0
- package/src/compat/next/font/local.ts +5 -0
- package/src/compat/next/font/runtime-client.ts +71 -0
- package/src/compat/next/font/runtime.ts +974 -0
- package/src/compat/next/font/shared.ts +281 -0
- package/src/compat/next/form.tsx +156 -0
- package/src/compat/next/head.tsx +10 -0
- package/src/compat/next/headers.ts +247 -0
- package/src/compat/next/image/config.ts +196 -0
- package/src/compat/next/image/optimizer.ts +96 -0
- package/src/compat/next/image/patterns.ts +103 -0
- package/src/compat/next/image/shared.ts +141 -0
- package/src/compat/next/image/static-metadata.ts +283 -0
- package/src/compat/next/image/validate.ts +269 -0
- package/src/compat/next/image-client.tsx +215 -0
- package/src/compat/next/image-props.ts +575 -0
- package/src/compat/next/image-usage.ts +102 -0
- package/src/compat/next/image.tsx +56 -0
- package/src/compat/next/index.ts +1 -0
- package/src/compat/next/legacy-image.tsx +97 -0
- package/src/compat/next/link-usage.ts +29 -0
- package/src/compat/next/link-validation-transform.ts +200 -0
- package/src/compat/next/link.tsx +466 -0
- package/src/compat/next/navigation.cjs +21 -0
- package/src/compat/next/navigation.ts +188 -0
- package/src/compat/next/offline.ts +51 -0
- package/src/compat/next/og.ts +324 -0
- package/src/compat/next/optimistic-route-state.ts +188 -0
- package/src/compat/next/preferred-region.ts +39 -0
- package/src/compat/next/redirects.ts +131 -0
- package/src/compat/next/resource-hints.ts +136 -0
- package/src/compat/next/rewrites.ts +350 -0
- package/src/compat/next/root-params.ts +142 -0
- package/src/compat/next/router.cjs +49 -0
- package/src/compat/next/router.ts +143 -0
- package/src/compat/next/script.tsx +355 -0
- package/src/compat/next/server-only.ts +3 -0
- package/src/compat/next/server.ts +28 -0
- package/src/compat/next/svgr.ts +58 -0
- package/src/compat/next/telemetry.ts +77 -0
- package/src/compat/next/user-agent.ts +100 -0
- package/src/compat/next/web-vitals.ts +56 -0
- package/src/compat/otel/api.ts +95 -0
- package/src/compat/otel/client-trace-metadata.ts +71 -0
- package/src/compat/otel/fetch-span.ts +77 -0
- package/src/compat/otel/tracer.ts +944 -0
- package/src/compat/pages/client-plugin.ts +108 -0
- package/src/compat/pages/index.ts +527 -0
- package/src/compat/pages/router-state.ts +94 -0
- package/src/compat/ppr/io.ts +38 -0
- package/src/compat/ppr/missing-root-params.ts +105 -0
- package/src/compat/ppr/root-params-scan.ts +164 -0
- package/src/compat/ppr/root-params-transform.ts +75 -0
- package/src/compat/ppr/root-params.ts +129 -0
- package/src/compat/ppr/segment-config-incompat.ts +34 -0
- package/src/compat/protocol.ts +202 -0
- package/src/compat/react/client.ts +59 -0
- package/src/compat/react/compiler-runtime.ts +60 -0
- package/src/compat/react/dom-client.ts +115 -0
- package/src/compat/react/dom-react-server.ts +20 -0
- package/src/compat/react/dom-server.ts +40 -0
- package/src/compat/react/dom.ts +154 -0
- package/src/compat/react/preact.ts +522 -0
- package/src/compat/react/react-server.ts +84 -0
- package/src/compat/react/router-shim.ts +26 -0
- package/src/compat/react/server-component-use.ts +48 -0
- package/src/compat/react/server-inserted-html.ts +87 -0
- package/src/compat/react/server.ts +156 -0
- package/src/compat/react/view-transition.ts +60 -0
- package/src/compat/register/actions.ts +875 -0
- package/src/compat/register/boot.ts +141 -0
- package/src/compat/register/build-tier.ts +11 -0
- package/src/compat/register/build.ts +182 -0
- package/src/compat/register/bundler.ts +587 -0
- package/src/compat/register/cache.ts +85 -0
- package/src/compat/register/client-errors.ts +18 -0
- package/src/compat/register/config.ts +17 -0
- package/src/compat/register/css-extras.ts +120 -0
- package/src/compat/register/edge-runtime.ts +6 -0
- package/src/compat/register/errors.ts +46 -0
- package/src/compat/register/export.ts +23 -0
- package/src/compat/register/font.ts +36 -0
- package/src/compat/register/hooks.ts +34 -0
- package/src/compat/register/image.ts +133 -0
- package/src/compat/register/index.ts +111 -0
- package/src/compat/register/instrumentation-client.ts +35 -0
- package/src/compat/register/lifecycle.ts +86 -0
- package/src/compat/register/mdx.ts +48 -0
- package/src/compat/register/middleware.ts +36 -0
- package/src/compat/register/misc.ts +44 -0
- package/src/compat/register/otel.ts +288 -0
- package/src/compat/register/pages-api.ts +473 -0
- package/src/compat/register/ppr.ts +56 -0
- package/src/compat/register/protocol.ts +57 -0
- package/src/compat/register/proxy.ts +127 -0
- package/src/compat/register/render.ts +268 -0
- package/src/compat/register/routing.ts +410 -0
- package/src/compat/register/segment.ts +1903 -0
- package/src/compat/register/static-image.ts +21 -0
- package/src/compat/register/typed-routes.ts +35 -0
- package/src/compat/register/usecache.ts +131 -0
- package/src/compat/register/validation.ts +56 -0
- package/src/compat/segment/loading-boundary.ts +113 -0
- package/src/compat/segment/page-slot.ts +200 -0
- package/src/compat/segment/tree.ts +481 -0
- package/src/compat/segment/vary-key.ts +102 -0
- package/src/compat/segment/vary-params.ts +551 -0
- package/src/compat/static-params.ts +33 -0
- package/src/compat/tsconfig-defaults.ts +301 -0
- package/src/compat/typecheck/index.ts +1481 -0
- package/src/compat/typecheck/worker.ts +26 -0
- package/src/compat/typed-routes/index.ts +92 -0
- package/src/compat/typed-routes/manifest.ts +356 -0
- package/src/compat/typed-routes/typegen.ts +566 -0
- package/src/compat/validation/errors.ts +159 -0
- package/src/compat/validation/index.ts +1770 -0
- package/src/compat/validation/prerender-diagnostics.ts +1508 -0
- package/src/compat-bootstrap.ts +67 -0
- package/src/config.ts +218 -0
- package/src/css/build.ts +697 -0
- package/src/css/index.ts +2 -0
- package/src/css/postcss.ts +236 -0
- package/src/css/worker.ts +34 -0
- package/src/dev/client-actions.ts +35 -0
- package/src/dev/client-chunk-store.ts +92 -0
- package/src/dev/client-key-cache.ts +178 -0
- package/src/dev/global-css-cache.ts +212 -0
- package/src/dev/imports.ts +2430 -0
- package/src/dev/module-cache.ts +721 -0
- package/src/dev/module-generations.ts +38 -0
- package/src/dev/module-transform.ts +188 -0
- package/src/dev/node-module-bundle-cache.ts +63 -0
- package/src/dev/restart-cache.ts +10 -0
- package/src/dev/route-bundle-key-cache.ts +154 -0
- package/src/dev/route-facts-cache.ts +223 -0
- package/src/dev/server.ts +1710 -0
- package/src/dynamic/source.ts +307 -0
- package/src/dynamic/tree-shake.ts +262 -0
- package/src/env.ts +92 -0
- package/src/extensions.ts +1898 -0
- package/src/index.ts +34 -0
- package/src/internal.ts +43 -0
- package/src/islands/boundary-error.ts +8 -0
- package/src/islands/static-children.ts +37 -0
- package/src/islands/static-slots.ts +106 -0
- package/src/ppr-postpone.ts +24 -0
- package/src/ppr.ts +784 -0
- package/src/proxy.ts +752 -0
- package/src/render/hooks.ts +384 -0
- package/src/render/index.ts +1 -0
- package/src/render/island-context.ts +47 -0
- package/src/render/metadata.ts +857 -0
- package/src/render/renderer.ts +7391 -0
- package/src/render/resource-hints.ts +44 -0
- package/src/render/slots.tsx +679 -0
- package/src/request/context.ts +396 -0
- package/src/resolve/engine.ts +219 -0
- package/src/resolve/imports.ts +1104 -0
- package/src/resolve/scan-facts.ts +474 -0
- package/src/resolve/source-text.ts +86 -0
- package/src/routing/forwarded.ts +41 -0
- package/src/routing/handler.ts +271 -0
- package/src/routing/href.ts +203 -0
- package/src/routing/metadata.ts +1018 -0
- package/src/routing/request-runtime.ts +43 -0
- package/src/routing/routes.ts +2560 -0
- package/src/routing/slots.ts +432 -0
- package/src/runtime/server.ts +3453 -0
- package/src/runtime/vendor.ts +1160 -0
- package/src/style-modules.d.ts +9 -0
- package/src/typegen.ts +151 -0
- package/src/types.ts +725 -0
- package/src/utils/ansi.ts +9 -0
- package/src/utils/content-type.ts +31 -0
- package/src/utils/decode.ts +7 -0
- package/src/utils/dev-profile.ts +31 -0
- package/src/utils/error-log.ts +29 -0
- package/src/utils/fs-cache.ts +31 -0
- package/src/utils/fs.ts +119 -0
- package/src/utils/html.ts +46 -0
- package/src/utils/serialize.ts +378 -0
- package/src/utils/source.ts +35 -0
- package/src/utils/verbose.ts +39 -0
- package/tsconfig.json +10 -0
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
// Route announcer (next/navigation a11y): a `<next-route-announcer>` custom
|
|
2
|
+
// element whose shadow root holds an `aria-live="assertive"` node. Screen
|
|
3
|
+
// readers announce client-side route changes that would otherwise be silent
|
|
4
|
+
// (no full document load). The DOM name is Next-specific, so it lives in compat;
|
|
5
|
+
// core exposes an `onNavigationCommit` hook that this module subscribes to.
|
|
6
|
+
import { onNavigationCommit } from '../../api/router/events';
|
|
7
|
+
|
|
8
|
+
const ANNOUNCER_TAG = 'next-route-announcer';
|
|
9
|
+
|
|
10
|
+
let announcerNode: HTMLElement | undefined;
|
|
11
|
+
|
|
12
|
+
// Next skips the very first render (no initial announcement): the announcer
|
|
13
|
+
// starts empty and only updates on subsequent navigations. `onNavigationCommit`
|
|
14
|
+
// only fires inside softNavigate, so it never runs for the hard load — but we
|
|
15
|
+
// also guard against announcing an unchanged value.
|
|
16
|
+
let lastAnnouncement = '';
|
|
17
|
+
|
|
18
|
+
function ensureAnnouncer(): HTMLElement | undefined {
|
|
19
|
+
if (typeof document === 'undefined') return undefined;
|
|
20
|
+
if (announcerNode?.isConnected) return announcerNode;
|
|
21
|
+
|
|
22
|
+
const existing = document.getElementsByTagName(ANNOUNCER_TAG)[0];
|
|
23
|
+
if (existing instanceof HTMLElement && existing.shadowRoot) {
|
|
24
|
+
announcerNode = existing.shadowRoot.childNodes[0] as HTMLElement;
|
|
25
|
+
return announcerNode;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const host = document.createElement(ANNOUNCER_TAG);
|
|
29
|
+
host.style.cssText = 'position:absolute';
|
|
30
|
+
const shadow = host.attachShadow({ mode: 'open' });
|
|
31
|
+
// A <div>, matching Next's app-router announcer exactly — a <p> here leaks
|
|
32
|
+
// into shadow-piercing selectors (e.g. a test's `p` lookup racing an action
|
|
33
|
+
// result) that Next's DOM never matches.
|
|
34
|
+
const live = document.createElement('div');
|
|
35
|
+
live.setAttribute('aria-live', 'assertive');
|
|
36
|
+
live.setAttribute('id', '__next-route-announcer__');
|
|
37
|
+
live.setAttribute('role', 'alert');
|
|
38
|
+
// Visually hidden but available to assistive tech (Next's own styles).
|
|
39
|
+
live.style.cssText =
|
|
40
|
+
'position:absolute;border:0;height:1px;margin:-1px;padding:0;width:1px;clip:rect(0 0 0 0);overflow:hidden;white-space:nowrap;word-wrap:normal';
|
|
41
|
+
shadow.appendChild(live);
|
|
42
|
+
document.body.appendChild(host);
|
|
43
|
+
announcerNode = live;
|
|
44
|
+
return live;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Priority order matches Next: document.title, then the first <h1>, then the
|
|
48
|
+
// pathname. Read after the body swap + head sync so the new title/heading are
|
|
49
|
+
// already in the DOM.
|
|
50
|
+
function routeAnnouncement(): string {
|
|
51
|
+
if (document.title) return document.title;
|
|
52
|
+
const h1 = document.querySelector('h1');
|
|
53
|
+
const text = h1?.textContent?.trim();
|
|
54
|
+
if (text) return text;
|
|
55
|
+
return location.pathname;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function announce() {
|
|
59
|
+
const node = ensureAnnouncer();
|
|
60
|
+
if (!node) return;
|
|
61
|
+
const next = routeAnnouncement();
|
|
62
|
+
if (next === lastAnnouncement) return;
|
|
63
|
+
lastAnnouncement = next;
|
|
64
|
+
node.textContent = next;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export function installRouteAnnouncer() {
|
|
68
|
+
if (!process.browser && typeof window === 'undefined') return;
|
|
69
|
+
// Create the empty announcer up front so it exists on first load with `''`.
|
|
70
|
+
ensureAnnouncer();
|
|
71
|
+
onNavigationCommit(announce);
|
|
72
|
+
}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
// The router's SegmentCachePolicy implementation (COMPAT client policy). Adapts the pure per-segment
|
|
2
|
+
// cache in ./segment-cache.ts onto the core router seam. Kept apart from the cache itself so the cache
|
|
3
|
+
// stays importable - and unit-testable - without pulling the router, and the whole DOM runtime, into
|
|
4
|
+
// the module graph.
|
|
5
|
+
|
|
6
|
+
import type { SegmentCacheHit, SegmentCachePolicy, SegmentCacheRecord } from '../../api/router';
|
|
7
|
+
import {
|
|
8
|
+
BODY_SEGMENT_PATHS,
|
|
9
|
+
clearSegmentCache,
|
|
10
|
+
composeFetchedLayoutFrame,
|
|
11
|
+
composeCachedLayout,
|
|
12
|
+
decodeDocumentSegmentMeta,
|
|
13
|
+
decodeSegmentPayload,
|
|
14
|
+
evictPageSegments,
|
|
15
|
+
matchRoutePattern,
|
|
16
|
+
needsLayoutFrameOnly,
|
|
17
|
+
needsPageFrameOnly,
|
|
18
|
+
runtimePageFrameSatisfied,
|
|
19
|
+
recordDocumentLayoutFrame,
|
|
20
|
+
recordSegment,
|
|
21
|
+
resolvedRouteFor,
|
|
22
|
+
segmentPrefetchCovered,
|
|
23
|
+
takeComposedSegment,
|
|
24
|
+
takeSegment,
|
|
25
|
+
type SegmentPayloadMeta,
|
|
26
|
+
} from './segment-cache';
|
|
27
|
+
import { resetSegmentPrefetchDedupe, scheduleAppShellPrefetch } from './segment-prefetch';
|
|
28
|
+
|
|
29
|
+
export function installSegmentCachePolicy(): SegmentCachePolicy {
|
|
30
|
+
return {
|
|
31
|
+
record,
|
|
32
|
+
take,
|
|
33
|
+
// Route-tree reuse seam: the router's `/_tree` cache is keyed by pathname,
|
|
34
|
+
// but a route's TREE is param-independent, so a sibling URL of an already
|
|
35
|
+
// learned route needs no tree request. These two let the router ask the
|
|
36
|
+
// segment cache which route serves a pathname (the static-sibling guard)
|
|
37
|
+
// and whether a colon-form pattern covers it.
|
|
38
|
+
routeFor: resolvedRouteFor,
|
|
39
|
+
matchesRoute: (route, pathname) => matchRoutePattern(route, pathname) !== null,
|
|
40
|
+
// w9-segment-split: when this URL's PAGE frame is cached and only its
|
|
41
|
+
// LAYOUT varied, the prefetch fetches `/_layout` alone instead of the whole
|
|
42
|
+
// route. Inert until segment-split commit is enabled (the composition half
|
|
43
|
+
// is what makes the half-fetched document paintable).
|
|
44
|
+
needsLayoutFrameOnly: (input) => needsLayoutFrameOnly(input),
|
|
45
|
+
runtimePageFrameSatisfied,
|
|
46
|
+
// w9-segment-split (G2), the live half: when this URL's LAYOUT chain is
|
|
47
|
+
// already cached (or already on screen, for a same-URL click), the
|
|
48
|
+
// navigation fetches `/_page` and splices the answer back into it. The
|
|
49
|
+
// router falls back to the whole document whenever these answer no/null.
|
|
50
|
+
needsPageFrameOnly,
|
|
51
|
+
// w9-segment-split: join a layout-only prefetch response with this URL's
|
|
52
|
+
// cached page frame. The router commits the result as the whole document,
|
|
53
|
+
// and treats a null as "this prefetch is unusable" — a layout frame alone
|
|
54
|
+
// would paint a page-less document.
|
|
55
|
+
composeLayoutFrame: composeFetchedLayoutFrame,
|
|
56
|
+
composePageFrame: composeCachedLayout,
|
|
57
|
+
recordDocumentLayout: recordDocumentLayoutFrame,
|
|
58
|
+
prefetchCovered: segmentPrefetchCovered,
|
|
59
|
+
evictPageSegments,
|
|
60
|
+
// A revalidation invalidates every window: the prefetch dedupe state (tree cache + app-shell request
|
|
61
|
+
// set) must fall with the entries, or a revalidated route stays deduped - and stale - for its whole
|
|
62
|
+
// window. evictPageSegments deliberately keeps it, since a same-URL refresh keeps layout/head dedupe.
|
|
63
|
+
clear: () => {
|
|
64
|
+
clearSegmentCache();
|
|
65
|
+
resetSegmentPrefetchDedupe();
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function record(input: SegmentCacheRecord): void {
|
|
71
|
+
const decoded: SegmentPayloadMeta | null =
|
|
72
|
+
input.kind === 'document'
|
|
73
|
+
? // A navigation response / the hard-loaded document: no framed payload
|
|
74
|
+
// and no vary set, so it keys on its exact URL (fix-forward 2).
|
|
75
|
+
decodeDocumentSegmentMeta(input.body)
|
|
76
|
+
: decodeSegmentPayload(input.body, input.segmentPath);
|
|
77
|
+
// No decodable payload (a header-stripping proxy, a plain document): there is
|
|
78
|
+
// no vary metadata to key on, so nothing worth caching here — the router's
|
|
79
|
+
// own whole-URL caches already hold it.
|
|
80
|
+
if (!decoded) return;
|
|
81
|
+
// App Shells (fix-forward 5): a per-URL static prerender of a params-reading
|
|
82
|
+
// route also primes the route's SHARED shell, so navigations to its other
|
|
83
|
+
// params paint instantly. No-op unless experimental.appShells is on.
|
|
84
|
+
scheduleAppShellPrefetch({
|
|
85
|
+
pathname: input.pathname,
|
|
86
|
+
route: decoded.route,
|
|
87
|
+
vary: decoded.vary,
|
|
88
|
+
static: input.static,
|
|
89
|
+
complete: input.complete,
|
|
90
|
+
runtime: input.runtime,
|
|
91
|
+
});
|
|
92
|
+
// App Shells: the per-URL prerender carried the route's shared shell. File it
|
|
93
|
+
// at the route's fallback vary path (empty vary = every param value) as a
|
|
94
|
+
// SHELL — it paints, but a navigation still fetches the per-URL remainder.
|
|
95
|
+
if (decoded.shell) {
|
|
96
|
+
recordSegment({
|
|
97
|
+
segmentPath: input.segmentPath,
|
|
98
|
+
pathname: input.pathname,
|
|
99
|
+
search: '',
|
|
100
|
+
html: decoded.shell.html,
|
|
101
|
+
staleTimeMs: input.staleTimeMs,
|
|
102
|
+
complete: false,
|
|
103
|
+
static: true,
|
|
104
|
+
runtime: false,
|
|
105
|
+
vary: [],
|
|
106
|
+
route: decoded.shell.route,
|
|
107
|
+
params: decoded.params,
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
recordSegment({
|
|
111
|
+
segmentPath: input.segmentPath,
|
|
112
|
+
pathname: input.pathname,
|
|
113
|
+
search: input.search,
|
|
114
|
+
html: input.html,
|
|
115
|
+
staleTimeMs: input.staleTimeMs,
|
|
116
|
+
complete: input.complete,
|
|
117
|
+
static: input.static,
|
|
118
|
+
runtime: input.runtime,
|
|
119
|
+
vary: decoded.vary,
|
|
120
|
+
// w9-segment-split: pass the layout/page vary sets through so the cache can
|
|
121
|
+
// file the two frames alongside the whole-document entry.
|
|
122
|
+
...(decoded.layoutVary ? { layoutVary: decoded.layoutVary } : {}),
|
|
123
|
+
...(decoded.pageVary ? { pageVary: decoded.pageVary } : {}),
|
|
124
|
+
// The route's static siblings, so a learned dynamic pattern never keys onto
|
|
125
|
+
// a literal sibling's URL.
|
|
126
|
+
...(decoded.staticSiblings ? { staticSiblings: decoded.staticSiblings } : {}),
|
|
127
|
+
route: decoded.route,
|
|
128
|
+
params: decoded.params,
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function take(input: {
|
|
133
|
+
pathname: string;
|
|
134
|
+
search: string;
|
|
135
|
+
segmentPath: string;
|
|
136
|
+
}): SegmentCacheHit | null {
|
|
137
|
+
const hit = takeSegment(input);
|
|
138
|
+
if (hit) {
|
|
139
|
+
return {
|
|
140
|
+
html: hit.html,
|
|
141
|
+
networkFree: hit.networkFree,
|
|
142
|
+
prefetchSatisfied: hit.prefetchSatisfied,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
// w9-segment-split: the whole-document entry missed because ONE of the two
|
|
146
|
+
// frames varied. Compose the cached layout + page frames instead of going to
|
|
147
|
+
// the network for both. No-op until segment-split commit is enabled.
|
|
148
|
+
if (!BODY_SEGMENT_PATHS.includes(input.segmentPath as (typeof BODY_SEGMENT_PATHS)[number])) {
|
|
149
|
+
return null;
|
|
150
|
+
}
|
|
151
|
+
const composed = takeComposedSegment({ pathname: input.pathname, search: input.search });
|
|
152
|
+
return composed
|
|
153
|
+
? {
|
|
154
|
+
html: composed.html,
|
|
155
|
+
networkFree: composed.networkFree,
|
|
156
|
+
prefetchSatisfied: composed.prefetchSatisfied,
|
|
157
|
+
}
|
|
158
|
+
: null;
|
|
159
|
+
}
|