Commit Graph

33 Commits

Author SHA1 Message Date
James Anderson 373e8264a1 feat(use-cache): support callable cached functions with rsc plugin api (#2156)
* fix(use-cache): support nested cache functions passed as props

* fix(use-cache): use inline registerServerReference instead of broken forward-reference module-level code

The previous approach used `noExport: true` and appended module-level
`const ${name}_$$vcf` declarations at the end of the transformed file,
then referenced them via forward reference at the call-site. This caused
a temporal dead zone (TDZ) error because `const` bindings are not
hoisted — the call-site assignment evaluated before the TLA const was
initialized, crashing all RSC files that contain function-level "use
cache" (HTTP 500 for use-cache pages, route handlers, etc.).

Fix: keep the existing hoisting/export behaviour (`noExport` stays
false) and instead wrap `registerCachedFunction(...)` with
`registerServerReference(...)` inline at call-site in the RSC
environment. This adds the RSC serialisation metadata ($$typeof, $$id)
so cached functions can be passed as props to client components
(useActionState / formAction), while not disturbing the existing
exported binding that loadServerAction relies on.

* fix(use-cache): use correct normalised id and register in manifest for nested function props

The previous approach passed the raw absolute file path as the $$id to
registerServerReference. @vitejs/plugin-rsc resolves server references by a
normalised key (sha256(toRelativeId) in build; URL-path in dev), so production
would throw "server reference not found" for any cached function passed as a
client-component prop.

Also, the module was never added to the virtual:vite-rsc/server-references
manifest because only the plugin's own "use server" transform writes to
manager.serverReferenceMetaMap. Without a manifest entry, the production
serverReferences lookup has no entry for the module at all.

Fix:
- Capture the plugin-rsc manager via the rsc:minimal plugin API in
  configResolved so we can write to serverReferenceMetaMap directly.
- Compute normalizedRefKey to match vitePluginUseServer's getNormalizedId():
    build → sha256(toRelativeId(id)).hex.slice(0,12)
    dev   → id.slice(root.length)  (Vite URL path)
- After transformHoistInlineDirective succeeds, register the hoisted export
  names in manager.serverReferenceMetaMap[id] so the manifest is populated.
- Pass normalizedRefKey (not raw id) to registerServerReference.

Add unit tests verifying the hash formula matches plugin-rsc's own logic.

* fix(use-cache): wrap hoisted exports as cached server references and register manifest after rsc:use-server

- Derive the build-mode reference key via plugin-rsc's own
  manager.toRelativeId() instead of a string slice, so the hash input is
  byte-for-byte identical to the plugin's hashString(toRelativeId(id)).
- Reassign each hoisted inline 'use cache' export at module level to
  registerServerReference(registerCachedFunction(fn)) so the module
  export itself is the cached wrapper (Next.js parity: direct action
  invocation goes through the cache) and call sites/manifest imports all
  observe the same wrapped function.
- Register serverReferenceMetaMap entries from a new
  vinext:use-cache-server-references plugin placed after the plugin-rsc
  plugins: rsc:use-server deletes metaMap entries for modules without
  'use server', which wiped the entries written during the use-cache
  transform (prod actions 404'd with 'server reference not found').
- Deduplicate the RSC/non-RSC transform branches into a single
  transformHoistInlineDirective call and hoist the
  @vitejs/plugin-rsc/react/rsc resolution out of the per-module path.
- Replace the self-referential key-formula unit test with the ported
  Next.js fixture (use-cache-with-server-function-props/nested-cache), a
  dev-mode Playwright round-trip test, and a production-server
  integration test that resolves the serialized references via action
  POSTs and asserts cached-invoke semantics.

* docs(use-cache): document dev-key normalisation scope for inline cache server references

* fix(use-cache): throw instead of emitting unresolvable inline cache server references when the plugin-rsc manager is missing

When the @vitejs/plugin-rsc manager is unavailable in the rsc environment,
the inline 'use cache' transform previously fell back to a locally computed
reference key and still wrapped the hoisted exports — but the manifest
registration plugin bails without the manager, so the emitted reference
would serialize into the RSC payload yet never resolve (silent 404 on
action POST in production). Fail loudly at transform time instead; the
manager is a structural invariant whenever the rsc environment exists.

Adds transform-level unit tests for the fail-loud path (build + dev), the
non-rsc no-manager control, and build reference-key parity with plugin-rsc.

* test(use-cache): pin unencrypted closure-captured bound args and document the divergence

Extends the nested-fn-props fixture with a cached function that closes over
a value from the cached component's scope, exercising the .bind(null, ...)
bound-arg path end to end: the production round-trip test asserts the
captured value appears in plaintext in the flight payload (pinning the
documented divergence from Next.js, which encrypts bound args by default)
and that invoking the bound reference observes the captured value; the
Playwright test covers the real flight-client encodeReply round-trip in
dev. A transform-level test pins that captures are emitted as plain bind
args. The divergence is now also documented in the README's Known
limitations section.

* refactor(use-cache): route registerServerReference through a vinext shim to decouple from plugin-rsc module-id normalisation

The inline 'use cache' prepend imported registerServerReference from a
file:// URL of @vitejs/plugin-rsc/react/rsc while the cache runtime
imports the same package via the bare specifier, relying on Vite
normalising both to a single module id. Re-export it instead from a new
vinext-owned cache-server-reference shim whose only react/rsc specifier
is the same bare one cache-runtime uses, resolved from the same importer
location — one module instance by construction. The transform unit test
now pins that the emitted import targets the shim and never a plugin-rsc
file URL.

* test(use-cache): pin cached-invoke semantics for the closure-bound getMessage path

Mirror the getDate cache assertion on the closure-bound path: the
fixture's getMessage now appends a Math.random() suffix so cache hits
are observable, and the production-server round-trip asserts that two
identical bound-arg invocations return the same cached value while a
different bound arg misses instead of reusing the entry. The Playwright
assertion matches the suffixed message via regex.

* fix(use-cache): encrypt closure-bound arguments

* refactor(use-cache): use plugin-rsc directive transforms

* test(use-cache): cover directive transforms across environments

* fix(cache): update RSC directive prerelease

* fix(cache): stabilize directive reference tests

* style(cache): format HMR test

* refactor(use-cache): move server function directives to user land

* refactor(use-cache): clarify generic directive plugin naming

* refactor(use-cache): own directive plugin types

* refactor(use-cache): use plugin-rsc metadata map directly

* refactor(use-cache): own server reference metadata lifecycle

* chore(use-cache): keep directive type internal

* refactor(use-cache): adopt server reference claims

* fix(init): install required plugin-rsc prerelease

* feat(rsc): harden use cache server functions

* feat(cache): adopt plugin-rsc transform primitives

* refactor(cache): rename callable plugin

* test(init): update plugin-rsc install expectations

* test(cache): avoid reloading during HMR retries

* test(cache): align callable references with plugin-rsc

* fix(cache): align mixed directives with plugin-rsc 0.5.34

* fix(cache): harden callable use cache transforms

* fix(cache): support manually configured RSC

* fix(cache): harden manual RSC ordering
2026-08-10 00:52:19 +01:00
James Anderson 1c69ce3fef fix(pages-router): load custom _app/_document via resolved file paths in dev (#2692)
* fix(pages-router): load custom _app/_document via resolved file paths in dev

The dev server imported pages/_app and pages/_document by extensionless id
and relied on the module runner applying custom resolve.extensions (e.g.
".page.tsx" from pageExtensions). The runner no longer resolves those, so
apps using pageExtensions silently lost their custom App/Document (the load
failure is swallowed). Import the file path resolved by findFileWithExts
instead, at all three call sites.

* test(e2e): add pages-router-complex example app and behaviour suite

A deliberately convoluted Pages Router app that serves as a compatibility
target: the kinds of patterns that only surface in large, long-lived
enterprise pages-router codebases, each pinned by a Playwright spec whose
behaviour is verified against real Next.js (73/73 under next dev --webpack).

Highlights: custom pageExtensions everywhere (middleware.page.ts,
instrumentation.page.ts), app-shell getInitialProps with a TTL-memoised
chrome fetch and embedded-shell/draft bypasses, class _document with its own
GIP, a zone route dimension driven by middleware rewrites and a real
i18next/react-i18next runtime, catch-all routes with static-sibling
precedence and cacheable-404/redirect hygiene, record-driven template
branching on a dynamic/static/dynamic route, an urql-style server-snapshot
data layer, shallow routing + router.events + next/compat/router +
next/navigation hooks in pages, next/image with a custom loader, draft-mode
gateway APIs, a function-form next.config, and a Cloudflare setup matching
the vinext init scaffold.

The playwright project (pages-router-complex, port 4199) is intentionally
not in the CI e2e matrix: vinext currently passes 59/73, and the failures
are the compat backlog documented in the example README.

* fix(pages-router): cover compound page extensions in CI
2026-07-24 15:35:16 +01:00
Boy Steven 2fcc4443cc test(isr): cover production cache lifecycle (#2651)
* fix(isr): preserve cache headers on initial render

* fix(isr): preserve streaming on initial cache misses

* test(isr): run production lifecycle coverage in CI

* test(isr): wait for asynchronous cache writes

---------

Co-authored-by: James <james@eli.cx>
2026-07-20 21:33:50 +01:00
James Anderson 71dbb45ca8 fix(pages): isolate on-demand revalidation requests (#2495)
* fix(pages): pin revalidate loopback origin

* test(pages): cover production revalidation origin

* fix(pages): preserve internal revalidation boundaries

* fix(pages): preserve on-demand revalidation boundaries

* fix(pages): dispatch Worker revalidation internally

* fix(pages): authenticate revalidation request context

* fix(pages): isolate revalidation transport headers

* test(pages): account for generated route table size

* fix(pages): align on-demand revalidation semantics

* fix(pages): align revalidation response cache parity

* fix(pages): preserve regenerated ISR representations

* fix(pages): align ISR cache representations

* fix(pages): preserve canonical ISR representations

* fix(pages): align cached response parity

* fix(pages): preserve custom App render props

* fix(pages): preserve optional App page props

* fix(pages): preserve optional App props on the client

* fix(pages): normalize client App page props

* fix(pages): preserve App data merge semantics

* fix(pages): keep redirect status helper internal

* fix(pages): match Next.js terminal ISR behavior

* fix(pages): preserve custom app error envelopes

* fix(pages): match Next.js dev revalidation semantics

* test(pages): align dev revalidation parity coverage

* chore(pages): remove stale cache helper exports

* fix(cache): preserve explicit no-store context
2026-07-20 18:45:06 +01:00
James Anderson 0b6faab89d fix(cache): isolate draft route responses (#2591)
* fix(cache): isolate draft route handler responses

* fix(cache): enforce draft policy on route errors

* fix(cache): privatize draft mode transitions

* fix(cache): respect live draft transitions

* fix(cache): discard route cookies on failed handlers

* Reviewed PR #2591: solid fix, no blocks

Co-authored-by: james-elicx <james-elicx@users.noreply.github.com>

* test(cloudflare): use public CDN adapter export

* fix(ci): align Cloudflare fixture lock entry

---------

Co-authored-by: ask-bonk[bot] <ask-bonk[bot]@users.noreply.github.com>
Co-authored-by: james-elicx <james-elicx@users.noreply.github.com>
2026-07-15 14:06:00 +01:00
James Anderson 4f7eec967e fix(router): avoid repeated App path decoding (#2556)
* fix(router): avoid repeated App path decoding

* test(router): align encoded middleware pathname

* fix(router): match Next encoded path semantics

* fix(prerender): accept canonical encoded app params

* fix(router): preserve encoded interception params

* test(build): tolerate watch output replacement

* test(router): cover repeatedly encoded production paths

* fix(router): preserve action request route identity

* refactor(middleware): remove stale pathname argument

* refactor(router): align fallback interception paths

* refactor(router): derive request path identity from value

* fix(router): preserve encoded route parity

* fix(router): preserve raw config path matching

* fix(router): preserve raw encoded route identity

* fix(router): canonicalize encoded dot segments

* fix(router): restore encoded path parity after main merge

* fix(app-router): exact-match generated params

* fix(app-router): chain generated parent params

* fix(app-router): preserve generated param ownership

* fix(app-router): preserve per-result param ownership

* fix(app-router): preserve params after empty parallel generation

* fix(app-router): chain parallel static params by branch
2026-07-14 22:09:29 +01:00
James Anderson b0367f1448 fix(link): avoid reusing dynamic app route prefetches (#2450)
* fix(link): avoid reusing dynamic app route prefetches

* fix(link): preserve static dynamic app prefetches

* test(e2e): scope segment cache client params to prod
2026-07-01 11:14:11 +01:00
James Anderson 49945a9e05 fix(link): reuse full prefetch loading shells (#2332)
* fix(link): reuse full prefetch loading shells

* fix(link): share loading shell prefetch ownership
2026-06-30 19:34:50 +01:00
James Anderson b0de1af028 fix(cloudflare): support Sentry request errors on Workers (#2425)
* fix(cloudflare): support sentry request errors on workers

* fix(cloudflare): avoid worker conditions in node pages builds

* test(cloudflare): run sentry worker e2es in ci

* test(cloudflare): cover sentry render errors

* test(cloudflare): mirror sentry next setup in fixtures

* update lockfile

* update lockfile

* test(cloudflare): cover sentry client instrumentation
2026-06-30 10:58:04 +01:00
James Anderson bcd4e44d96 feat(build): support prerender vite config (#2415)
* feat(build): support prerender vite config

* feat(init): offer prerender config opt-in

* fix(cloudflare): export prerender deploy helper

* fix(cloudflare): avoid redundant prerender config load

* fix(build): quiet adapter fallback warnings
2026-06-29 19:16:08 +01:00
James Anderson f0ba7b4afe fix(app-router): reuse committed client cache payloads (#2251)
* fix(app-router): seed client navigation cache

* fix(cache): parse prerender cache metadata marker

* test(cache): cover prerender metadata done marker

* fix(cache): preserve static committed stale time

* fix(link): honor dynamic stale time for auto prefetches

* fix(router): retain committed client cache state

* fix(router): publish client cache after commit

* fix(router): gate hydration cache publication

* fix(router): guard late client cache publication

* fix(router): isolate client cache parity coverage

* fix(router): preserve authoritative navigation commits

* fix(router): preserve committed navigation streams
2026-06-28 22:01:58 +00:00
James Anderson 2cbd2a0356 fix(build): apply default server externals (#2257)
* fix(build): externalize Next.js default server packages

* test(node): cover externalized shiki in standalone output
2026-06-23 10:20:55 +00:00
MaxtuneLee 42f8700f15 fix(router): enhance navigation with as mask for URL handling (#2076)
* fix(router): enhance navigation with `as` mask for URL handling

* fix(router): implement bracket-pattern interpolation for dynamic routes in Pages Router

* fix(router): preserve masked state in beforePopState

* fix(router): cover basepath navigation in ci

* docs(router): clarify navigation state invariants

* refactor(router): require complete history state

* refactor(router): share dynamic href interpolation

* test(router): cover localized masked navigation

* fix(router): keep interpolation internals private

---------

Co-authored-by: James <james@eli.cx>
2026-06-19 00:07:03 +01:00
James Anderson c3dcdba1fe fix(pages): honor basePath in dev module loaders (#2033)
* fix(pages): honor basePath in dev module loaders

* fix(pages): preserve basePath in ISR loaders

* style(pages): format dev module loader changes

* fix(pages): preserve dynamic route module paths

* test(pages): run basePath dev coverage in CI
2026-06-15 22:42:33 +01:00
Nathan Nguyen a3d2f92152 fix(router): honor hybrid pages route priority (#1997)
* fix(router): honor hybrid pages route priority

* fix(router): share hybrid owner decision with client navigation

PR #1997 fixed the server-side route ownership for direct document loads,
but the same invariant broke for client-side soft navigations and the
matching prefetch path:

- navigateClientSide() always delegated to the App runtime's RSC fetch,
  even when the Pages route had higher priority. renderPagesFallback()
  short-circuits RSC requests with null, so the App catch-all won.
- prefetchUrl() prefetched an RSC stream for any URL that matched an App
  route, again ignoring Pages ownership.
- The Pages entry was loaded on every hybrid request, even when a static
  App route had already matched (Pages can never win in that case).

Expose the Pages route manifest on the client via a new
__VINEXT_PAGES_LINK_PREFETCH_ROUTES__ window global emitted by both the
App and Pages browser entries. The link shim consults a shared
resolveHybridClientRouteOwner helper that mirrors the server-side
pagesRouteHasPriorityOverAppRoute comparison. When Pages owns the URL,
the click handler issues a window.location navigation and the prefetch
path returns early.

Gate the renderPagesFallback call behind a static-App-route check in
handleAppRscRequest: when a static App route matches, the bridge
cannot win, so skip the eager Pages entry load. Centralise the
comparison in a new resolveHybridRouteOwner helper so server and
client reach the same answer for the same (URL, route pair).

Adds the missing client-navigation coverage to the use-params e2e
fixture (Link from /app/ to /pages-dir/foobar) and unit tests for
the shared owner decision.

* fix(router): mirror server hybrid owner decision on the client

PR review flagged two split-brain bugs in the previous hybrid
ownership fix: a hand-copied client comparator and a Link-only
ownership gate that left programmatic App Router navigations on
the wrong path.

The hand-copied routePrecedence in hybrid-client-route-owner.ts
omitted the static-prefix reduction that lives in
routing/utils.ts#routePrecedence, and used a strict-less-than
comparison that returned App for identical dynamic patterns. The
server returns Pages for both cases (Pages providers sort ahead
of App providers, and routePrecedence subtracts 50 per static
prefix segment). The split produced a real ownership disagreement
on overlapping patterns like /_sites/:slug* (Pages) vs /:slug*
(App).

Add a shared compareHybridRoutePatterns to routing/utils.ts as
the single source of truth: the static/dynamic short-circuits plus
a sortRoutes call (which carries the static-prefix reduction and
the Pages-first equal-pattern tiebreak). The server
pagesRouteHasPriorityOverAppRoute and the client
resolveHybridClientRouteOwner both delegate to it, so they
cannot diverge. Drop the hand-copied routePrecedence entirely.

Wire the ownership check at the App navigation runtime boundary
so useRouter().push, useRouter().replace, gesturePush, and form
submits all get the same hard-nav contract as the Link click
handler. Specifically:

- navigateClientSide: after same-origin normalization, if Pages
  owns the URL, hard-navigate via window.location and return
  (matching the existing external-URL branch).
- _appRouter.prefetch: short-circuit RSC URL construction for
  Pages-owned targets so we do not warm an unusable cache entry.

Centralise the existing two inline hard-nav branches in
navigateClientSide into a hardNavigateTo helper for clarity.

Tests:

- Direct unit tests for compareHybridRoutePatterns covering
  identical-dynamic tiebreak, static-prefix dynamic overlap,
  static-prefix catch-all overlap, and infix-static bonus.
- Direct unit tests for resolveHybridClientRouteOwner mirroring
  the server assertions plus a basePath-stripping test.
- e2e: useRouter().push('/pages-dir/foobar') from an App page
  resolves to the Pages document.
- e2e: useRouter().prefetch('/pages-dir/foobar') issues zero
  RSC requests for the target URL.

* docs(router): fix stale score in static-prefix catch-all test comment

The hand-copied comparator note quoted the dynamic-segment scores
(51 / 1000) for the optional-catch-all example (/_sites/:slug*
vs /:slug*). The current optional-catch-all scoring actually
produces 1951 vs 2000. The test assertion was correct; only the
comment was stale.

* test(use-params): fix direct-load single dynamic param to use /a instead of /a/b

* fix(router): compare hybrid routes structurally

* fix(router): reject hybrid route conflicts

* fix(router): refresh hybrid route ownership

* fix(router): preserve hybrid routing lifecycle

* fix(router): recheck pages routes after rewrites

* fix(router): preserve rewritten pages queries

* fix(router): preserve rewritten route ownership

* fix(router): resolve client rewrites sequentially

* fix(router): apply rewrite phases sequentially

* fix(router): preserve rewrite params and endpoints

* fix(router): hand off endpoint navigations

* fix(router): preserve rewrite fragment params

* test(e2e): avoid hybrid fixture route conflicts

* test(pages): await async config validation

* test(hybrid): avoid duplicate page fixtures

* chore(router): clarify hybrid priority semantics

* refactor(router): remove duplicate app route matcher

* docs(router): clarify client hybrid comparator

---------

Co-authored-by: James <james@eli.cx>
2026-06-15 00:22:00 +01:00
Nathan Nguyen 930e03c449 fix(ppr): gate fallback shells until request-time resume is supported (#1716)
* fix(app-router): prerender cacheComponents root-param fallback shells

PR 1 of 4: core model + build integration.
Model: app-ppr-fallback-shell, pregenerated-concrete-paths, prerender-manifest
Build: prerender/run-prerender fallback shell artifact generation
Tests: createAppPprFallbackShells, pregenerated-concrete-paths core

* feat(ppr): add fallback shell payload identity

* feat(ppr): safely serve fallback shell cache entries

* refactor(ppr): extract fallback shell render pipeline and dedupe getViteMajorVersion

* fix(ppr): restore safe-serving CI checks

The safe-serving branch failed CI because a client-side server-only guard rejected valid 'use server' action modules, a fallback-shell dependency cast no longer matched its helper type, apps/web lost the Cloudflare cache adapter source path during typecheck, and Knip could not resolve the documented Cloudflare cache adapter subpaths.

The server-only guard now reads the directive prologue and skips top-level 'use server' modules, fallback-shell regeneration passes an explicit typed dependency object, apps/web gets the workspace Cloudflare cache path, the Cloudflare package exports explicit adapter subpaths, Knip uses a relative source import in the dispatch unit test, and the readiness test awaits the actual cache-ready promise.

* fix(ppr): guard fallback shell reads for queries

* fix(ppr): normalize pregenerated concrete paths

* fix(ppr): address review comments on fallback shell serving and react runtime check

* fix(ci): restore knip ignores for unlisted binaries and prune dependencies

* fix(ppr): restrict bracket check in fallback detection to legacy manifests

* fix(ppr): prefer stable ESM react-dom/static.edge before CJS fallback

The loadStaticPrerender dev-mode path hard-codes react-dom's internal
CJS file layout (cjs/react-dom-server.edge.development.js). A React
upgrade could silently break fallback-shell rendering in dev without
affecting production because the function never tried the stable ESM
entry in development.

Change the order so that react-dom/static.edge is attempted first in
all environments. Only fall back to the CJS path when the ESM entry
does not export prerender() and we are in a development runtime. This
lets future React dev builds that expose prerender() from the ESM entry
work automatically, and it surfaces the CJS-path failure only when the
stable path is genuinely unavailable.

Also handle the CJS default-export interop shape that Node.js ESM
produces when dynamically importing a CommonJS module.

* refactor(ppr): address four review cleanup items

1. Remove redundant double-normalization in seed-cache.ts
   addPregeneratedConcretePath already normalizes internally, so the
   call-site normalizePregeneratedPathname() was redundant. Dropping it
   gives a single source of truth for pathname normalization.

2. Lazily construct FallbackShellRenderDeps in tryServePprFallbackShell
   Extract the large FallbackShellRenderDeps object into a top-level
   buildFallbackShellRenderDeps helper. The closure in the probe loop
   now just delegates, so the heavy object is only created when a STALE
   entry actually triggers regeneration, not on every HIT probe.

3. Add dev-only warning for legacy bracket heuristic
   When isFallbackShellArtifactPath falls back to the bracket substring
   scan (route.fallback === undefined), emit a console.warn in dev so
   developers know a legacy manifest is being used and concrete URLs
   with literal brackets may be misclassified.

4. Update pregenerated-concrete-paths.test.ts to colon notation
   The production manifest writer uses colon notation (/:slug) for the
   route field, but the test fixtures used bracket notation (/[slug]).
   Update the fixtures so the test format matches production, exercising
   the real key format that the safe-serving guard depends on.

* test(ppr): compact fallback shell dispatch fixtures

* refactor(ppr): name fallback shell render phases

* refactor(app-router): deduplicate PPR fallback shell and app page cache render paths

* fix(ppr): avoid serving incomplete fallback shells

* chore: drop redundant cloudflare cache aliases

* fix(ppr): track fallback navigation hooks

* test(ppr): render navigation hook probes

* test(ppr): type navigation hook probes

* refactor(ppr): remove unused shell regeneration path

* refactor(ppr): remove unused shell result type

* fix(ppr): safely gate fallback shell prerendering

* fix(ppr): keep fallback shell gate internal

* fix(ppr): mark generated dynamic fallback shells

* test(ppr): align fallback fixture and search params

---------

Co-authored-by: James <james@eli.cx>
2026-06-14 00:44:54 +01:00
Nathan Nguyen d1a80cd668 fix(app-router): preserve front redirects through fallback route handlers (#2000)
* fix(app-router): preserve front redirects through fallback route handlers

* test(e2e): assert single bootstrap hydration in front-redirect test

* chore: remove dead stripDeploymentIdQuery export

* fix(app-router): handle cancelled bootstrap streams

* docs(app-router): clarify bootstrap recovery

* test(e2e): tolerate dangling fixture symlink

* test(e2e): run front redirect regression in CI

* fix(app-router): always hide internal RSC queries

* fix(app-router): preserve visible hydration URL

* test(e2e): scope visible URL regression

* refactor(app-router): trim front redirect residue

* test(e2e): group fixture setup command

* test(e2e): tighten front redirect assertions

* fix(app-router): preserve ordinary route handler URLs

* fix(app-router): normalize edge route handler URLs

* docs(app-router): explain route URL parity

* fix(app-router): preserve Node RSC request URLs

* fix(app-router): normalize route handler RSC paths

* fix(app-router): forward RSC tokens through rewrites

---------

Co-authored-by: James <james@eli.cx>
2026-06-13 22:08:02 +01:00
Nathan Nguyen 79d78b0cce chore: standardize prod-build project commands in playwright.config.ts (#1932)
Replace error TS5058: The specified path does not exist: '../../../packages/vinext/tsconfig.json'. with
~/packages/vinext$ vp pack ⊘ cache disabled
ℹ entry: src/cache.ts, src/check.ts, src/cli-args.ts, src/cli.ts, src/deploy.ts, src/index.ts, src/init.ts, src/typegen.ts, src/build/assets-ignore.ts, src/build/clean-output.ts, src/build/client-build-config.ts, src/build/css-url-assets.ts, src/build/inline-css.ts, src/build/layout-classification-types.ts, src/build/layout-classification.ts, src/build/next-client-runtime-manifests.ts, src/build/nitro-route-rules.ts, src/build/precompress.ts, src/build/prerender.ts, src/build/report.ts, src/build/route-classification-injector.ts, src/build/route-classification-manifest.ts, src/build/run-prerender.ts, src/build/server-manifest.ts, src/build/ssr-manifest.ts, src/build/standalone.ts, src/build/static-export.ts, src/cache/cache-adapters-virtual.ts, src/client/empty-module.ts, src/client/instrumentation-client-inject.ts, src/client/instrumentation-client-state.ts, src/client/instrumentation-client.ts, src/client/navigation-runtime.ts, src/client/pages-router-link-navigation.ts, src/client/validate-module-path.ts, src/client/vinext-next-data.ts, src/client/window-next.ts, src/cloudflare/index.ts, src/cloudflare/tpr.ts, src/config/config-matchers.ts, src/config/dotenv.ts, src/config/next-config.ts, src/config/tsconfig-paths.ts, src/routing/app-route-graph.ts, src/routing/app-router.ts, src/routing/file-matcher.ts, src/routing/pages-router.ts, src/routing/route-matching.ts, src/routing/route-pattern.ts, src/routing/route-trie.ts, src/routing/route-validation.ts, src/routing/utils.ts, src/entries/app-browser-entry.ts, src/entries/app-rsc-entry.ts, src/entries/app-rsc-manifest.ts, src/entries/app-ssr-entry.ts, src/entries/pages-client-entry.ts, src/entries/pages-entry-helpers.ts, src/entries/pages-server-entry.ts, src/entries/runtime-entry-module.ts, src/plugins/ast-utils.ts, src/plugins/async-hooks-stub.ts, src/plugins/client-reference-dedup.ts, src/plugins/css-data-url.ts, src/plugins/dynamic-preload-metadata.ts, src/plugins/fonts.ts, src/plugins/import-meta-url.ts, src/plugins/instrumentation-client.ts, src/plugins/middleware-server-only.ts, src/plugins/og-assets.ts, src/plugins/optimize-imports.ts, src/plugins/postcss.ts, src/plugins/remove-console.ts, src/plugins/require-context.ts, src/plugins/rsc-client-reference-loaders.ts, src/plugins/rsc-client-shim-excludes.ts, src/plugins/sass.ts, src/plugins/server-externals-manifest.ts, src/plugins/strip-server-exports.ts, src/plugins/wasm-module-import.ts, src/shims/amp.ts, src/shims/app-router-scroll-state.ts, src/shims/app-router-scroll.tsx, src/shims/app.tsx, src/shims/before-interactive-context.tsx, src/shims/cache-for-request.ts, src/shims/cache-runtime.ts, src/shims/cache.ts, src/shims/cdn-cache.ts, src/shims/client-hook-error.ts, src/shims/client-locale.ts, src/shims/client-only.ts, src/shims/compat-router.ts, src/shims/config.ts, src/shims/constants.ts, src/shims/default-global-error.tsx, src/shims/default-not-found.tsx, src/shims/document.tsx, src/shims/dynamic-preload-chunks.tsx, src/shims/dynamic.ts, src/shims/error-boundary.tsx, src/shims/error.tsx, src/shims/fetch-cache.ts, src/shims/font-google-base.ts, src/shims/font-google.ts, src/shims/font-local.ts, src/shims/font-utils.ts, src/shims/form.tsx, src/shims/hash-scroll.ts, src/shims/head-state.ts, src/shims/head.ts, src/shims/headers.ts, src/shims/i18n-context.ts, src/shims/i18n-state.ts, src/shims/image-config.ts, src/shims/image.tsx, src/shims/layout-segment-context.tsx, src/shims/legacy-image.tsx, src/shims/link-prefetch.ts, src/shims/link.tsx, src/shims/metadata.tsx, src/shims/navigation-state.ts, src/shims/navigation.react-server.ts, src/shims/navigation.ts, src/shims/offline.ts, src/shims/og.tsx, src/shims/pages-router-runtime.ts, src/shims/ppr-fallback-shell.ts, src/shims/readonly-url-search-params.ts, src/shims/request-context.ts, src/shims/request-state-types.ts, src/shims/root-params.ts, src/shims/router-state.ts, src/shims/router.ts, src/shims/script-nonce-context.tsx, src/shims/script.tsx, src/shims/server-only.ts, src/shims/server.ts, src/shims/slot.tsx, src/shims/thenable-params.ts, src/shims/unified-request-context.ts, src/shims/unrecognized-action-error.ts, src/shims/url-safety.ts, src/shims/url-utils.ts, src/shims/use-merged-ref.ts, src/shims/web-vitals.ts, src/server/api-handler.ts, src/server/app-bfcache-id.ts, src/server/app-browser-action-result.ts, src/server/app-browser-client-reuse-manifest.ts, src/server/app-browser-entry.ts, src/server/app-browser-error.ts, src/server/app-browser-history-controller.ts, src/server/app-browser-hydration.ts, src/server/app-browser-interception-context.ts, src/server/app-browser-mpa-navigation.ts, src/server/app-browser-navigation-controller.ts, src/server/app-browser-popstate.ts, src/server/app-browser-rsc-redirect.ts, src/server/app-browser-state.ts, src/server/app-browser-stream.ts, src/server/app-browser-visible-commit.ts, src/server/app-client-reference-preloader.ts, src/server/app-elements-wire.ts, src/server/app-elements.ts, src/server/app-fallback-renderer.ts, src/server/app-history-state.ts, src/server/app-hook-warning-suppression.ts, src/server/app-inline-css-client.ts, src/server/app-interception-context-header.ts, src/server/app-layout-param-observation.ts, src/server/app-middleware.ts, src/server/app-mounted-slots-header.ts, src/server/app-optimistic-routing.ts, src/server/app-page-boundary-render.ts, src/server/app-page-boundary.ts, src/server/app-page-cache.ts, src/server/app-page-dispatch.ts, src/server/app-page-element-builder.ts, src/server/app-page-execution.ts, src/server/app-page-head.ts, src/server/app-page-method.ts, src/server/app-page-params.ts, src/server/app-page-probe.ts, src/server/app-page-render-identity.ts, src/server/app-page-render-observation.ts, src/server/app-page-render.ts, src/server/app-page-request.ts, src/server/app-page-response.ts, src/server/app-page-route-wiring.tsx, src/server/app-page-search-params-observation.ts, src/server/app-page-segment-state.ts, src/server/app-page-stream.ts, src/server/app-pages-bridge.ts, src/server/app-post-middleware-context.ts, src/server/app-ppr-fallback-shell.ts, src/server/app-prerender-endpoints.ts, src/server/app-prerender-static-params.ts, src/server/app-render-dependency.tsx, src/server/app-request-context.ts, src/server/app-route-handler-cache.ts, src/server/app-route-handler-dispatch.ts, src/server/app-route-handler-execution.ts, src/server/app-route-handler-policy.ts, src/server/app-route-handler-response.ts, src/server/app-route-handler-runtime.ts, src/server/app-route-module-loader.ts, src/server/app-router-entry.ts, src/server/app-rsc-cache-busting.ts, src/server/app-rsc-embedded-chunks.ts, src/server/app-rsc-error-handler.ts, src/server/app-rsc-errors.ts, src/server/app-rsc-handler.ts, src/server/app-rsc-render-mode.ts, src/server/app-rsc-request-normalization.ts, src/server/app-rsc-response-finalizer.ts, src/server/app-rsc-route-matching.ts, src/server/app-segment-config.ts, src/server/app-server-action-execution.ts, src/server/app-ssr-entry.ts, src/server/app-ssr-error-meta.ts, src/server/app-ssr-stream.ts, src/server/app-static-generation.ts, src/server/app-visited-response-cache.ts, src/server/artifact-compatibility.ts, src/server/cache-control.ts, src/server/cache-headers.ts, src/server/cache-proof.ts, src/server/client-reuse-manifest.ts, src/server/client-trace-metadata.ts, src/server/cookie-utils.ts, src/server/csp.ts, src/server/default-global-error-module.ts, src/server/default-not-found-module.ts, src/server/dev-error-overlay-store.ts, src/server/dev-error-overlay.tsx, src/server/dev-initial-server-error.ts, src/server/dev-lockfile.ts, src/server/dev-module-runner.ts, src/server/dev-origin-check.ts, src/server/dev-route-files.ts, src/server/dev-server.ts, src/server/dev-stack-sourcemap-endpoint.ts, src/server/dev-stack-sourcemap.ts, src/server/document-initial-head.ts, src/server/edge-api-runtime.ts, src/server/file-based-metadata.ts, src/server/headers.ts, src/server/html.ts, src/server/http-error-responses.ts, src/server/image-optimization.ts, src/server/implicit-tags.ts, src/server/instrumentation-runtime.ts, src/server/instrumentation.ts, src/server/isr-cache.ts, src/server/isr-decision.ts, src/server/metadata-route-build-data.ts, src/server/metadata-route-response.ts, src/server/metadata-routes.ts, src/server/middleware-matcher.ts, src/server/middleware-request-headers.ts, src/server/middleware-response-headers.ts, src/server/middleware-runtime.ts, src/server/middleware.ts, src/server/navigation-planner.ts, src/server/navigation-trace.ts, src/server/next-error-digest.ts, src/server/normalize-path.ts, src/server/otel-tracer-extension.ts, src/server/pages-api-route.ts, src/server/pages-asset-tags.ts, src/server/pages-body-parser-config.ts, src/server/pages-data-route.ts, src/server/pages-default-404.ts, src/server/pages-document-initial-props.ts, src/server/pages-get-initial-props.ts, src/server/pages-i18n.ts, src/server/pages-media-type.ts, src/server/pages-node-compat.ts, src/server/pages-page-data.ts, src/server/pages-page-handler.ts, src/server/pages-page-method.ts, src/server/pages-page-response.ts, src/server/pages-readiness.ts, src/server/pages-request-pipeline.ts, src/server/pages-revalidate.ts, src/server/pages-serializable-props.ts, src/server/pregenerated-concrete-paths.ts, src/server/prerender-route-params.ts, src/server/prerender-work-unit-setup.ts, src/server/prod-server.ts, src/server/proxy-trust.ts, src/server/request-log.ts, src/server/request-pipeline.ts, src/server/rsc-stream-hints.ts, src/server/seed-cache.ts, src/server/server-action-not-found.ts, src/server/server-globals.ts, src/server/skip-cache-proof.ts, src/server/socket-error-backstop.ts, src/server/static-file-cache.ts, src/server/static-layout-client-reuse-proof.ts, src/server/streaming-metadata.ts, src/server/worker-utils.ts, src/utils/asset-prefix.ts, src/utils/base-path.ts, src/utils/cache-control-metadata.ts, src/utils/client-build-manifest.ts, src/utils/client-entry-manifest.ts, src/utils/client-runtime-metadata.ts, src/utils/compare.ts, src/utils/dev-error-recovery-event.ts, src/utils/domain-locale.ts, src/utils/encode-cache-tag.ts, src/utils/error-cause.ts, src/utils/hash.ts, src/utils/html-limited-bots.ts, src/utils/lazy-chunks.ts, src/utils/manifest-paths.ts, src/utils/mdx-scan.ts, src/utils/navigation-signal.ts, src/utils/number.ts, src/utils/path.ts, src/utils/prerender-output-paths.ts, src/utils/project.ts, src/utils/promise.ts, src/utils/public-routes.ts, src/utils/query.ts, src/utils/record.ts, src/utils/regex.ts, src/utils/safe-json-file.ts, src/utils/sorted-array.ts, src/utils/text-stream.ts, src/utils/vinext-root.ts, src/utils/vite-version.ts, src/build/google-fonts/build-url.ts, src/build/google-fonts/fallback-metrics.ts, src/build/google-fonts/font-metadata.ts, src/build/google-fonts/get-axes.ts, src/build/google-fonts/sort-variants.ts, src/build/google-fonts/validate.ts, src/shims/internal/als-registry.ts, src/shims/internal/api-utils.ts, src/shims/internal/app-route-detection.ts, src/shims/internal/app-router-context.ts, src/shims/internal/cookie-serialize.ts, src/shims/internal/cookies.ts, src/shims/internal/link-status-registry.ts, src/shims/internal/make-hanging-promise.ts, src/shims/internal/pages-data-fetch-dedup.ts, src/shims/internal/pages-data-target.ts, src/shims/internal/pages-data-url.ts, src/shims/internal/parse-cookie-header.ts, src/shims/internal/route-pattern-for-warning.ts, src/shims/internal/router-context.ts, src/shims/internal/utils.ts, src/shims/internal/work-unit-async-storage.ts
ℹ target: node22.0.0
ℹ tsconfig: tsconfig.json
ℹ Build start
ℹ Cleaning 736 files
ℹ Granting execute permission to dist/cli.js
ℹ dist/index.js                                           104.22 kB │ gzip: 26.12 kB
ℹ dist/shims/navigation.js                                 67.62 kB │ gzip: 16.87 kB
ℹ dist/routing/app-route-graph.js                          59.75 kB │ gzip: 14.51 kB
ℹ dist/shims/router.js                                     55.70 kB │ gzip: 14.83 kB
ℹ dist/server/app-browser-entry.js                         53.69 kB │ gzip: 11.83 kB
ℹ dist/server/dev-error-overlay.js                         45.33 kB │ gzip: 10.72 kB
ℹ dist/server/prod-server.js                               44.54 kB │ gzip: 12.46 kB
ℹ dist/config/next-config.js                               41.77 kB │ gzip: 13.01 kB
ℹ dist/server/dev-server.js                                40.31 kB │ gzip:  9.69 kB
ℹ dist/config/config-matchers.js                           38.47 kB │ gzip: 12.36 kB
ℹ dist/deploy.js                                           38.45 kB │ gzip: 11.53 kB
ℹ dist/entries/app-rsc-entry.js                            36.62 kB │ gzip:  9.31 kB
ℹ dist/build/prerender.js                                  36.17 kB │ gzip:  9.45 kB
ℹ dist/check.js                                            35.06 kB │ gzip: 10.01 kB
ℹ dist/server/app-server-action-execution.js               32.42 kB │ gzip:  7.65 kB
ℹ dist/shims/metadata.js                                   31.86 kB │ gzip:  7.14 kB
ℹ dist/shims/cache.js                                      30.74 kB │ gzip:  9.04 kB
ℹ dist/plugins/fonts.js                                    30.73 kB │ gzip:  9.33 kB
ℹ dist/shims/fetch-cache.js                                28.38 kB │ gzip:  7.76 kB
ℹ dist/server/navigation-planner.js                        28.04 kB │ gzip:  5.52 kB
ℹ dist/server/cache-proof.js                               27.73 kB │ gzip:  5.76 kB
ℹ dist/shims/headers.js                                    27.63 kB │ gzip:  7.75 kB
ℹ dist/server/app-page-dispatch.js                         27.24 kB │ gzip:  6.20 kB
ℹ dist/cli.js                                              26.01 kB │ gzip:  7.96 kB
ℹ dist/shims/link.js                                       25.90 kB │ gzip:  7.08 kB
ℹ dist/server/app-page-route-wiring.js                     24.02 kB │ gzip:  4.81 kB
ℹ dist/server/app-page-render.js                           23.08 kB │ gzip:  5.49 kB
ℹ dist/shims/server.js                                     22.28 kB │ gzip:  6.87 kB
ℹ dist/build/report.js                                     20.84 kB │ gzip:  5.66 kB
ℹ dist/cloudflare/tpr.js                                   20.37 kB │ gzip:  6.76 kB
ℹ dist/shims/cache-runtime.js                              20.19 kB │ gzip:  6.45 kB
ℹ dist/server/request-pipeline.js                          19.80 kB │ gzip:  6.40 kB
ℹ dist/plugins/optimize-imports.js                         19.75 kB │ gzip:  5.46 kB
ℹ dist/server/app-elements-wire.js                         19.54 kB │ gzip:  4.57 kB
ℹ dist/server/app-browser-state.js                         19.06 kB │ gzip:  4.59 kB
ℹ dist/entries/pages-server-entry.js                       18.37 kB │ gzip:  5.09 kB
ℹ dist/shims/image.js                                      17.87 kB │ gzip:  5.31 kB
ℹ dist/server/file-based-metadata.js                       17.80 kB │ gzip:  4.08 kB
ℹ dist/server/app-browser-navigation-controller.js         17.72 kB │ gzip:  4.10 kB
ℹ dist/server/app-rsc-handler.js                           17.28 kB │ gzip:  4.29 kB
ℹ dist/server/dev-stack-sourcemap.js                       17.27 kB │ gzip:  4.62 kB
ℹ dist/server/metadata-routes.js                           17.19 kB │ gzip:  4.66 kB
ℹ dist/server/app-ssr-stream.js                            16.86 kB │ gzip:  5.41 kB
ℹ dist/plugins/dynamic-preload-metadata.js                 16.32 kB │ gzip:  3.96 kB
ℹ dist/server/pages-page-handler.js                        16.10 kB │ gzip:  4.22 kB
ℹ dist/server/app-page-cache.js                            14.52 kB │ gzip:  3.28 kB
ℹ dist/server/app-page-execution.js                        13.76 kB │ gzip:  4.25 kB
ℹ dist/shims/head.js                                       13.65 kB │ gzip:  4.89 kB
ℹ dist/entries/app-rsc-manifest.js                         13.52 kB │ gzip:  3.02 kB
ℹ dist/server/pages-page-response.js                       13.46 kB │ gzip:  4.44 kB
ℹ dist/server/app-ssr-entry.js                             13.39 kB │ gzip:  4.32 kB
ℹ dist/server/pages-page-data.js                           13.39 kB │ gzip:  3.97 kB
ℹ dist/shims/script.js                                     13.00 kB │ gzip:  4.03 kB
ℹ dist/plugins/import-meta-url.js                          12.53 kB │ gzip:  3.29 kB
ℹ dist/plugins/sass.js                                     12.45 kB │ gzip:  4.76 kB
ℹ dist/server/isr-cache.js                                 12.32 kB │ gzip:  4.45 kB
ℹ dist/shims/font-google-base.js                           12.12 kB │ gzip:  4.06 kB
ℹ dist/server/app-page-boundary-render.js                  11.97 kB │ gzip:  2.88 kB
ℹ dist/server/app-page-probe.js                            11.67 kB │ gzip:  3.83 kB
ℹ dist/shims/form.js                                       11.06 kB │ gzip:  3.51 kB
ℹ dist/server/pages-request-pipeline.js                    10.92 kB │ gzip:  2.97 kB
ℹ dist/server/app-rsc-cache-busting.js                     10.79 kB │ gzip:  2.97 kB
ℹ dist/shims/slot.js                                       10.73 kB │ gzip:  2.92 kB
ℹ dist/server/app-page-head.js                             10.70 kB │ gzip:  2.78 kB
ℹ dist/build/client-build-config.js                        10.50 kB │ gzip:  4.10 kB
ℹ dist/server/app-browser-history-controller.js            10.18 kB │ gzip:  2.51 kB
ℹ dist/server/app-page-element-builder.js                  10.16 kB │ gzip:  3.14 kB
ℹ dist/server/app-browser-visible-commit.js                 9.72 kB │ gzip:  2.23 kB
ℹ dist/shims/error-boundary.js                              9.70 kB │ gzip:  2.05 kB
ℹ dist/server/middleware-runtime.js                         9.64 kB │ gzip:  2.77 kB
ℹ dist/server/app-history-state.js                          9.60 kB │ gzip:  2.29 kB
ℹ dist/typegen.js                                           9.46 kB │ gzip:  2.85 kB
ℹ dist/server/client-reuse-manifest.js                      9.39 kB │ gzip:  2.41 kB
ℹ dist/server/api-handler.js                                9.12 kB │ gzip:  3.23 kB
ℹ dist/build/css-url-assets.js                              8.98 kB │ gzip:  3.46 kB
ℹ dist/server/metadata-route-response.js                    8.92 kB │ gzip:  2.48 kB
ℹ dist/server/app-route-handler-runtime.js                  8.82 kB │ gzip:  2.39 kB
ℹ dist/server/image-optimization.js                         8.71 kB │ gzip:  3.09 kB
ℹ dist/server/app-optimistic-routing.js                     8.69 kB │ gzip:  2.37 kB
ℹ dist/server/app-page-request.js                           8.57 kB │ gzip:  2.19 kB
ℹ dist/init.js                                              8.57 kB │ gzip:  3.07 kB
ℹ dist/build/standalone.js                                  8.41 kB │ gzip:  2.58 kB
ℹ dist/server/socket-error-backstop.js                      8.35 kB │ gzip:  3.49 kB
ℹ dist/build/run-prerender.js                               8.35 kB │ gzip:  3.04 kB
ℹ dist/server/pages-i18n.js                                 8.29 kB │ gzip:  2.92 kB
ℹ dist/plugins/og-assets.js                                 8.25 kB │ gzip:  3.22 kB
ℹ dist/routing/utils.js                                     8.09 kB │ gzip:  3.05 kB
ℹ dist/client/navigation-runtime.js                         8.09 kB │ gzip:  2.08 kB
ℹ dist/server/headers.js                                    7.98 kB │ gzip:  2.88 kB
ℹ dist/server/pages-node-compat.js                          7.96 kB │ gzip:  2.53 kB
ℹ dist/server/static-file-cache.js                          7.80 kB │ gzip:  3.11 kB
ℹ dist/shims/font-local.js                                  7.77 kB │ gzip:  2.69 kB
ℹ dist/server/app-layout-param-observation.js               7.75 kB │ gzip:  1.88 kB
ℹ dist/server/skip-cache-proof.js                           7.73 kB │ gzip:  1.94 kB
ℹ dist/plugins/client-reference-dedup.js                    7.73 kB │ gzip:  2.40 kB
ℹ dist/shims/dynamic.js                                     7.72 kB │ gzip:  2.21 kB
ℹ dist/shims/constants.js                                   7.65 kB │ gzip:  2.38 kB
ℹ dist/routing/route-pattern.js                             7.47 kB │ gzip:  2.10 kB
ℹ dist/utils/project.js                                     7.00 kB │ gzip:  2.40 kB
ℹ dist/entries/pages-client-entry.js                        6.75 kB │ gzip:  2.70 kB
ℹ dist/server/app-middleware.js                             6.70 kB │ gzip:  1.82 kB
ℹ dist/server/app-route-handler-response.js                 6.68 kB │ gzip:  2.22 kB
ℹ dist/server/app-route-handler-dispatch.js                 6.66 kB │ gzip:  1.76 kB
ℹ dist/shims/thenable-params.js                             6.50 kB │ gzip:  1.56 kB
ℹ dist/server/pages-data-route.js                           6.38 kB │ gzip:  2.39 kB
ℹ dist/server/dev-origin-check.js                           6.28 kB │ gzip:  2.24 kB
ℹ dist/server/dev-lockfile.js                               6.23 kB │ gzip:  2.57 kB
ℹ dist/shims/url-utils.js                                   6.20 kB │ gzip:  2.18 kB
ℹ dist/plugins/remove-console.js                            6.13 kB │ gzip:  2.27 kB
ℹ dist/server/app-page-stream.js                            6.08 kB │ gzip:  2.24 kB
ℹ dist/server/app-page-response.js                          5.99 kB │ gzip:  1.51 kB
ℹ dist/build/route-classification-manifest.js               5.96 kB │ gzip:  2.26 kB
ℹ dist/server/app-route-handler-execution.js                5.93 kB │ gzip:  1.61 kB
ℹ dist/server/app-page-boundary.js                          5.88 kB │ gzip:  1.70 kB
ℹ dist/utils/asset-prefix.js                                5.79 kB │ gzip:  2.18 kB
ℹ dist/server/seed-cache.js                                 5.72 kB │ gzip:  2.06 kB
ℹ dist/plugins/require-context.js                           5.68 kB │ gzip:  1.98 kB
ℹ dist/server/metadata-route-build-data.js                  5.67 kB │ gzip:  1.54 kB
ℹ dist/config/tsconfig-paths.js                             5.63 kB │ gzip:  2.04 kB
ℹ dist/routing/pages-router.js                              5.58 kB │ gzip:  1.69 kB
ℹ dist/shims/ppr-fallback-shell.js                          5.58 kB │ gzip:  1.42 kB
ℹ dist/server/pages-document-initial-props.js               5.56 kB │ gzip:  2.19 kB
ℹ dist/server/pages-asset-tags.js                           5.54 kB │ gzip:  2.16 kB
ℹ dist/server/instrumentation.js                            5.52 kB │ gzip:  2.13 kB
ℹ dist/shims/default-global-error.js                        5.51 kB │ gzip:  1.90 kB
ℹ dist/server/app-fallback-renderer.js                      5.46 kB │ gzip:  1.29 kB
ℹ dist/server/prerender-route-params.js                     5.31 kB │ gzip:  1.47 kB
ℹ dist/utils/query.js                                       5.29 kB │ gzip:  1.79 kB
ℹ dist/server/app-rsc-route-matching.js                     5.02 kB │ gzip:  1.55 kB
ℹ dist/routing/route-validation.js                          4.95 kB │ gzip:  1.61 kB
ℹ dist/utils/lazy-chunks.js                                 4.91 kB │ gzip:  1.90 kB
ℹ dist/server/otel-tracer-extension.js                      4.71 kB │ gzip:  1.82 kB
ℹ dist/server/artifact-compatibility.js                     4.64 kB │ gzip:  1.11 kB
ℹ dist/server/middleware.js                                 4.61 kB │ gzip:  1.95 kB
ℹ dist/server/app-segment-config.js                         4.58 kB │ gzip:  1.33 kB
ℹ dist/shims/app-router-scroll.js                           4.57 kB │ gzip:  1.58 kB
ℹ dist/server/app-browser-action-result.js                  4.53 kB │ gzip:  1.61 kB
ℹ dist/routing/file-matcher.js                              4.48 kB │ gzip:  1.75 kB
ℹ dist/server/middleware-matcher.js                         4.42 kB │ gzip:  1.45 kB
ℹ dist/shims/cdn-cache.js                                   4.35 kB │ gzip:  1.86 kB
ℹ dist/build/precompress.js                                 4.32 kB │ gzip:  1.93 kB
ℹ dist/server/app-rsc-request-normalization.js              4.19 kB │ gzip:  1.71 kB
ℹ dist/routing/route-trie.js                                4.15 kB │ gzip:  1.40 kB
ℹ dist/shims/error.js                                       4.05 kB │ gzip:  1.61 kB
ℹ dist/build/layout-classification.js                       3.99 kB │ gzip:  1.60 kB
ℹ dist/shims/font-utils.js                                  3.94 kB │ gzip:  1.52 kB
ℹ dist/cli-args.js                                          3.94 kB │ gzip:  1.37 kB
ℹ dist/utils/client-runtime-metadata.js                     3.87 kB │ gzip:  1.40 kB
ℹ dist/shims/internal/pages-data-target.js                  3.80 kB │ gzip:  1.73 kB
ℹ dist/utils/client-build-manifest.js                       3.80 kB │ gzip:  1.17 kB
ℹ dist/server/app-prerender-endpoints.js                    3.80 kB │ gzip:  1.16 kB
ℹ dist/utils/manifest-paths.js                              3.73 kB │ gzip:  1.25 kB
ℹ dist/server/http-error-responses.js                       3.72 kB │ gzip:  1.45 kB
ℹ dist/server/app-browser-client-reuse-manifest.js          3.71 kB │ gzip:  1.19 kB
ℹ dist/plugins/middleware-server-only.js                    3.67 kB │ gzip:  1.59 kB
ℹ dist/server/app-route-handler-cache.js                    3.65 kB │ gzip:  1.14 kB
ℹ dist/server/worker-utils.js                               3.63 kB │ gzip:  1.35 kB
ℹ dist/build/route-classification-injector.js               3.55 kB │ gzip:  1.18 kB
ℹ dist/server/dev-module-runner.js                          3.53 kB │ gzip:  1.55 kB
ℹ dist/build/ssr-manifest.js                                3.45 kB │ gzip:  1.05 kB
ℹ dist/server/app-route-handler-policy.js                   3.41 kB │ gzip:  1.08 kB
ℹ dist/server/app-prerender-static-params.js                3.40 kB │ gzip:  1.20 kB
ℹ dist/plugins/postcss.js                                   3.39 kB │ gzip:  1.31 kB
ℹ dist/server/pregenerated-concrete-paths.js                3.38 kB │ gzip:  1.30 kB
ℹ dist/build/google-fonts/validate.js                       3.38 kB │ gzip:  1.12 kB
ℹ dist/server/pages-serializable-props.js                   3.37 kB │ gzip:  1.35 kB
ℹ dist/server/server-action-not-found.js                    3.31 kB │ gzip:  1.17 kB
ℹ dist/server/app-ppr-fallback-shell.js                     3.31 kB │ gzip:  1.10 kB
ℹ dist/utils/error-cause.js                                 3.25 kB │ gzip:  1.56 kB
ℹ dist/server/isr-decision.js                               3.25 kB │ gzip:  1.12 kB
ℹ dist/server/app-page-segment-state.js                     3.21 kB │ gzip:  0.86 kB
ℹ dist/server/normalize-path.js                             3.21 kB │ gzip:  1.33 kB
ℹ dist/shims/document.js                                    3.18 kB │ gzip:  1.47 kB
ℹ dist/plugins/server-externals-manifest.js                 3.16 kB │ gzip:  1.43 kB
ℹ dist/build/nitro-route-rules.js                           3.15 kB │ gzip:  1.30 kB
ℹ dist/shims/unified-request-context.js                     3.14 kB │ gzip:  1.29 kB
ℹ dist/shims/image-config.js                                3.14 kB │ gzip:  1.38 kB
ℹ dist/server/app-browser-stream.js                         3.13 kB │ gzip:  1.11 kB
ℹ dist/server/middleware-request-headers.js                 3.13 kB │ gzip:  0.97 kB
ℹ dist/server/client-trace-metadata.js                      3.09 kB │ gzip:  1.33 kB
ℹ dist/server/pages-body-parser-config.js                   3.05 kB │ gzip:  1.34 kB
ℹ dist/shims/url-safety.js                                  3.04 kB │ gzip:  1.41 kB
ℹ dist/server/app-mounted-slots-header.js                   3.03 kB │ gzip:  1.45 kB
ℹ dist/shims/internal/app-route-detection.js                3.02 kB │ gzip:  1.22 kB
ℹ dist/shims/dynamic-preload-chunks.js                      3.00 kB │ gzip:  1.35 kB
ℹ dist/shims/internal/pages-data-fetch-dedup.js             2.99 kB │ gzip:  1.44 kB
ℹ dist/client/instrumentation-client-inject.js              2.98 kB │ gzip:  1.22 kB
ℹ dist/utils/domain-locale.js                               2.94 kB │ gzip:  0.93 kB
ℹ dist/server/pages-api-route.js                            2.92 kB │ gzip:  1.02 kB
ℹ dist/shims/internal/pages-data-url.js                     2.91 kB │ gzip:  1.33 kB
ℹ dist/server/proxy-trust.js                                2.89 kB │ gzip:  1.17 kB
ℹ dist/config/dotenv.js                                     2.87 kB │ gzip:  1.35 kB
ℹ dist/server/cache-control.js                              2.82 kB │ gzip:  1.19 kB
ℹ dist/server/pages-default-404.js                          2.81 kB │ gzip:  1.42 kB
ℹ dist/server/app-rsc-errors.js                             2.76 kB │ gzip:  1.21 kB
ℹ dist/entries/app-browser-entry.js                         2.76 kB │ gzip:  1.05 kB
ℹ dist/plugins/css-data-url.js                              2.75 kB │ gzip:  1.35 kB
ℹ dist/cache/cache-adapters-virtual.js                      2.73 kB │ gzip:  1.08 kB
ℹ dist/server/dev-route-files.js                            2.71 kB │ gzip:  0.94 kB
ℹ dist/server/app-page-render-observation.js                2.69 kB │ gzip:  0.83 kB
ℹ dist/build/assets-ignore.js                               2.61 kB │ gzip:  1.32 kB
ℹ dist/server/navigation-trace.js                           2.60 kB │ gzip:  0.94 kB
ℹ dist/shims/default-not-found.js                           2.58 kB │ gzip:  1.22 kB
ℹ dist/server/app-pages-bridge.js                           2.53 kB │ gzip:  0.94 kB
ℹ dist/shims/cache-for-request.js                           2.42 kB │ gzip:  1.04 kB
ℹ dist/server/app-browser-interception-context.js           2.40 kB │ gzip:  0.70 kB
ℹ dist/plugins/strip-server-exports.js                      2.36 kB │ gzip:  0.99 kB
ℹ dist/server/pages-get-initial-props.js                    2.36 kB │ gzip:  0.76 kB
ℹ dist/plugins/ast-utils.js                                 2.35 kB │ gzip:  0.78 kB
ℹ dist/shims/internal/als-registry.js                       2.33 kB │ gzip:  1.11 kB
ℹ dist/shims/navigation-state.js                            2.31 kB │ gzip:  0.88 kB
ℹ dist/server/app-rsc-response-finalizer.js                 2.25 kB │ gzip:  0.92 kB
ℹ dist/routing/app-router.js                                2.25 kB │ gzip:  0.86 kB
ℹ dist/server/app-browser-rsc-redirect.js                   2.24 kB │ gzip:  0.68 kB
ℹ dist/build/google-fonts/fallback-metrics.js               2.18 kB │ gzip:  0.81 kB
ℹ dist/shims/internal/cookie-serialize.js                   2.16 kB │ gzip:  1.04 kB
ℹ dist/shims/navigation.react-server.js                     2.16 kB │ gzip:  0.59 kB
ℹ dist/server/app-router-entry.js                           2.15 kB │ gzip:  0.85 kB
ℹ dist/server/app-ssr-error-meta.js                         2.11 kB │ gzip:  0.84 kB
ℹ dist/server/app-browser-popstate.js                       2.11 kB │ gzip:  0.75 kB
ℹ dist/server/csp.js                                        2.10 kB │ gzip:  0.71 kB
ℹ dist/utils/text-stream.js                                 2.08 kB │ gzip:  0.92 kB
ℹ dist/server/app-elements.js                               1.98 kB │ gzip:  0.66 kB
ℹ dist/server/app-interception-context-header.js            1.98 kB │ gzip:  1.02 kB
ℹ dist/client/window-next.js                                1.96 kB │ gzip:  0.92 kB
ℹ dist/client/vinext-next-data.js                           1.94 kB │ gzip:  0.77 kB
ℹ dist/server/app-page-render-identity.js                   1.93 kB │ gzip:  0.60 kB
ℹ dist/plugins/rsc-client-reference-loaders.js              1.92 kB │ gzip:  0.85 kB
ℹ dist/utils/hash.js                                        1.92 kB │ gzip:  1.00 kB
ℹ dist/build/inline-css.js                                  1.90 kB │ gzip:  0.79 kB
ℹ dist/server/dev-error-overlay-store.js                    1.89 kB │ gzip:  0.68 kB
ℹ dist/shims/internal/make-hanging-promise.js               1.89 kB │ gzip:  0.82 kB
ℹ dist/server/html.js                                       1.85 kB │ gzip:  0.92 kB
ℹ dist/server/app-client-reference-preloader.js             1.83 kB │ gzip:  0.59 kB
ℹ dist/build/static-export.js                               1.82 kB │ gzip:  0.71 kB
ℹ dist/shims/internal/link-status-registry.js               1.81 kB │ gzip:  0.71 kB
ℹ dist/shims/app.js                                         1.81 kB │ gzip:  0.87 kB
ℹ dist/shims/link-prefetch.js                               1.80 kB │ gzip:  0.74 kB
ℹ dist/server/app-page-params.js                            1.79 kB │ gzip:  0.57 kB
ℹ dist/shims/internal/route-pattern-for-warning.js          1.76 kB │ gzip:  0.88 kB
ℹ dist/shims/request-context.js                             1.76 kB │ gzip:  0.77 kB
ℹ dist/utils/base-path.js                                   1.73 kB │ gzip:  0.75 kB
ℹ dist/plugins/wasm-module-import.js                        1.72 kB │ gzip:  0.88 kB
ℹ dist/build/google-fonts/get-axes.js                       1.69 kB │ gzip:  0.70 kB
ℹ dist/server/request-log.js                                1.69 kB │ gzip:  0.76 kB
ℹ dist/server/app-browser-mpa-navigation.js                 1.68 kB │ gzip:  0.63 kB
ℹ dist/server/implicit-tags.js                              1.67 kB │ gzip:  0.65 kB
ℹ dist/entries/runtime-entry-module.js                      1.66 kB │ gzip:  0.76 kB
ℹ dist/shims/layout-segment-context.js                      1.66 kB │ gzip:  0.76 kB
ℹ dist/utils/encode-cache-tag.js                            1.65 kB │ gzip:  0.93 kB
ℹ dist/plugins/instrumentation-client.js                    1.64 kB │ gzip:  0.69 kB
ℹ dist/shims/unrecognized-action-error.js                   1.63 kB │ gzip:  0.77 kB
ℹ dist/build/next-client-runtime-manifests.js               1.62 kB │ gzip:  0.56 kB
ℹ dist/routing/route-matching.js                            1.60 kB │ gzip:  0.75 kB
ℹ dist/server/server-globals.js                             1.58 kB │ gzip:  0.70 kB
ℹ dist/shims/internal/app-router-context.js                 1.58 kB │ gzip:  0.62 kB
ℹ dist/shims/legacy-image.js                                1.56 kB │ gzip:  0.70 kB
ℹ dist/server/next-error-digest.js                          1.55 kB │ gzip:  0.72 kB
ℹ dist/shims/app-router-scroll-state.js                     1.54 kB │ gzip:  0.49 kB
ℹ dist/server/instrumentation-runtime.js                    1.54 kB │ gzip:  0.72 kB
ℹ dist/server/app-render-dependency.js                      1.53 kB │ gzip:  0.54 kB
ℹ dist/utils/vite-version.js                                1.49 kB │ gzip:  0.75 kB
ℹ dist/shims/router-state.js                                1.48 kB │ gzip:  0.68 kB
ℹ dist/utils/client-entry-manifest.js                       1.46 kB │ gzip:  0.52 kB
ℹ dist/server/app-rsc-render-mode.js                        1.45 kB │ gzip:  0.44 kB
ℹ dist/shims/og.js                                          1.45 kB │ gzip:  0.71 kB
ℹ dist/server/static-layout-client-reuse-proof.js           1.42 kB │ gzip:  0.47 kB
ℹ dist/server/app-inline-css-client.js                      1.42 kB │ gzip:  0.58 kB
ℹ dist/server/middleware-response-headers.js                1.41 kB │ gzip:  0.66 kB
ℹ dist/server/document-initial-head.js                      1.41 kB │ gzip:  0.70 kB
ℹ dist/shims/i18n-context.js                                1.41 kB │ gzip:  0.47 kB
ℹ dist/server/rsc-stream-hints.js                           1.39 kB │ gzip:  0.65 kB
ℹ dist/plugins/async-hooks-stub.js                          1.38 kB │ gzip:  0.70 kB
ℹ dist/server/app-static-generation.js                      1.36 kB │ gzip:  0.62 kB
ℹ dist/shims/i18n-state.js                                  1.34 kB │ gzip:  0.65 kB
ℹ dist/server/app-page-method.js                            1.33 kB │ gzip:  0.53 kB
ℹ dist/shims/head-state.js                                  1.27 kB │ gzip:  0.51 kB
ℹ dist/utils/vinext-root.js                                 1.27 kB │ gzip:  0.62 kB
ℹ dist/shims/hash-scroll.js                                 1.26 kB │ gzip:  0.53 kB
ℹ dist/build/google-fonts/build-url.js                      1.24 kB │ gzip:  0.57 kB
ℹ dist/utils/mdx-scan.js                                    1.21 kB │ gzip:  0.63 kB
ℹ dist/server/app-route-module-loader.js                    1.20 kB │ gzip:  0.54 kB
ℹ dist/server/pages-revalidate.js                           1.19 kB │ gzip:  0.60 kB
ℹ dist/utils/public-routes.js                               1.19 kB │ gzip:  0.53 kB
ℹ dist/shims/root-params.js                                 1.16 kB │ gzip:  0.51 kB
ℹ dist/server/app-rsc-embedded-chunks.js                    1.16 kB │ gzip:  0.53 kB
ℹ dist/server/dev-initial-server-error.js                   1.07 kB │ gzip:  0.51 kB
ℹ dist/server/app-post-middleware-context.js                1.06 kB │ gzip:  0.55 kB
ℹ dist/server/app-request-context.js                        1.06 kB │ gzip:  0.52 kB
ℹ dist/build/clean-output.js                                1.05 kB │ gzip:  0.43 kB
ℹ dist/shims/script-nonce-context.js                        1.05 kB │ gzip:  0.38 kB
ℹ dist/server/prerender-work-unit-setup.js                  1.05 kB │ gzip:  0.57 kB
ℹ dist/plugins/rsc-client-shim-excludes.js                  1.03 kB │ gzip:  0.49 kB
ℹ dist/shims/pages-router-runtime.js                        1.02 kB │ gzip:  0.46 kB
ℹ dist/server/app-browser-hydration.js                      0.99 kB │ gzip:  0.45 kB
ℹ dist/server/default-not-found-module.js                   0.99 kB │ gzip:  0.56 kB
ℹ dist/shims/compat-router.js                               0.97 kB │ gzip:  0.49 kB
ℹ dist/server/default-global-error-module.js                0.97 kB │ gzip:  0.55 kB
ℹ dist/entries/app-ssr-entry.js                             0.95 kB │ gzip:  0.53 kB
ℹ dist/shims/use-merged-ref.js                              0.95 kB │ gzip:  0.37 kB
ℹ dist/server/app-rsc-error-handler.js                      0.91 kB │ gzip:  0.49 kB
ℹ dist/shims/internal/parse-cookie-header.js                0.89 kB │ gzip:  0.52 kB
ℹ dist/server/app-visited-response-cache.js                 0.88 kB │ gzip:  0.39 kB
ℹ dist/utils/path.js                                        0.85 kB │ gzip:  0.53 kB
ℹ dist/client/validate-module-path.js                       0.84 kB │ gzip:  0.47 kB
ℹ dist/shims/readonly-url-search-params.js                  0.83 kB │ gzip:  0.38 kB
ℹ dist/server/app-page-search-params-observation.js         0.82 kB │ gzip:  0.36 kB
ℹ dist/server/pages-media-type.js                           0.82 kB │ gzip:  0.46 kB
ℹ dist/utils/html-limited-bots.js                           0.81 kB │ gzip:  0.48 kB
ℹ dist/server/pages-readiness.js                            0.80 kB │ gzip:  0.36 kB
ℹ dist/build/server-manifest.js                             0.79 kB │ gzip:  0.44 kB
ℹ dist/server/app-browser-error.js                          0.77 kB │ gzip:  0.34 kB
ℹ dist/shims/client-hook-error.js                           0.75 kB │ gzip:  0.41 kB
ℹ dist/shims/internal/work-unit-async-storage.js            0.75 kB │ gzip:  0.41 kB
ℹ dist/client/instrumentation-client-state.js               0.74 kB │ gzip:  0.28 kB
ℹ dist/server/cookie-utils.js                               0.73 kB │ gzip:  0.44 kB
ℹ dist/utils/safe-json-file.js                              0.70 kB │ gzip:  0.45 kB
ℹ dist/utils/prerender-output-paths.js                      0.69 kB │ gzip:  0.33 kB
ℹ dist/server/pages-page-method.js                          0.67 kB │ gzip:  0.37 kB
ℹ dist/shims/client-locale.js                               0.66 kB │ gzip:  0.35 kB
ℹ dist/shims/internal/utils.js                              0.66 kB │ gzip:  0.34 kB
ℹ dist/shims/web-vitals.js                                  0.61 kB │ gzip:  0.28 kB
ℹ dist/server/cache-headers.js                              0.60 kB │ gzip:  0.27 kB
ℹ dist/shims/amp.js                                         0.50 kB │ gzip:  0.30 kB
ℹ dist/shims/config.js                                      0.50 kB │ gzip:  0.29 kB
ℹ dist/utils/navigation-signal.js                           0.48 kB │ gzip:  0.29 kB
ℹ dist/utils/sorted-array.js                                0.48 kB │ gzip:  0.27 kB
ℹ dist/build/google-fonts/sort-variants.js                  0.46 kB │ gzip:  0.25 kB
ℹ dist/server/app-hook-warning-suppression.js               0.46 kB │ gzip:  0.29 kB
ℹ dist/utils/cache-control-metadata.js                      0.45 kB │ gzip:  0.25 kB
ℹ dist/client/instrumentation-client.js                     0.43 kB │ gzip:  0.18 kB
ℹ dist/shims/offline.js                                     0.43 kB │ gzip:  0.30 kB
ℹ dist/client/pages-router-link-navigation.js               0.42 kB │ gzip:  0.24 kB
ℹ dist/server/streaming-metadata.js                         0.34 kB │ gzip:  0.21 kB
ℹ dist/shims/internal/router-context.js                     0.33 kB │ gzip:  0.22 kB
ℹ dist/shims/before-interactive-context.js                  0.31 kB │ gzip:  0.18 kB
ℹ dist/shims/font-google.js                                 0.28 kB │ gzip:  0.15 kB
ℹ dist/utils/promise.js                                     0.24 kB │ gzip:  0.17 kB
ℹ dist/utils/number.js                                      0.20 kB │ gzip:  0.15 kB
ℹ dist/server/dev-stack-sourcemap-endpoint.js               0.19 kB │ gzip:  0.16 kB
ℹ dist/build/google-fonts/font-metadata.js                  0.19 kB │ gzip:  0.14 kB
ℹ dist/utils/compare.js                                     0.19 kB │ gzip:  0.14 kB
ℹ dist/server/app-bfcache-id.js                             0.18 kB │ gzip:  0.13 kB
ℹ dist/server/edge-api-runtime.js                           0.18 kB │ gzip:  0.15 kB
ℹ dist/utils/record.js                                      0.18 kB │ gzip:  0.16 kB
ℹ dist/utils/dev-error-recovery-event.js                    0.17 kB │ gzip:  0.14 kB
ℹ dist/utils/regex.js                                       0.15 kB │ gzip:  0.15 kB
ℹ dist/cloudflare/index.js                                  0.14 kB │ gzip:  0.12 kB
ℹ dist/shims/internal/cookies.js                            0.11 kB │ gzip:  0.08 kB
ℹ dist/cache.js                                             0.09 kB │ gzip:  0.08 kB
ℹ dist/entries/pages-entry-helpers.js                       0.09 kB │ gzip:  0.09 kB
ℹ dist/build/layout-classification-types.js                 0.01 kB │ gzip:  0.03 kB
ℹ dist/client/empty-module.js                               0.01 kB │ gzip:  0.03 kB
ℹ dist/shims/client-only.js                                 0.01 kB │ gzip:  0.03 kB
ℹ dist/shims/internal/api-utils.js                          0.01 kB │ gzip:  0.03 kB
ℹ dist/shims/request-state-types.js                         0.01 kB │ gzip:  0.03 kB
ℹ dist/shims/server-only.js                                 0.01 kB │ gzip:  0.03 kB
ℹ dist/build/google-fonts/font-data.js                    358.51 kB │ gzip: 24.18 kB
ℹ dist/build/google-fonts/fallback-metrics-data.js        103.01 kB │ gzip: 23.28 kB
ℹ dist/cloudflare/src/cache/kv-data-adapter.runtime.js     15.65 kB │ gzip:  5.30 kB
ℹ dist/cloudflare/src/cache/cdn-adapter.runtime.js          4.23 kB │ gzip:  1.96 kB
ℹ dist/cloudflare/src/utils/cache-control-metadata.js       0.82 kB │ gzip:  0.42 kB
ℹ dist/shims/navigation.d.ts                               28.82 kB │ gzip:  8.69 kB
ℹ dist/config/next-config.d.ts                             23.30 kB │ gzip:  8.14 kB
ℹ dist/server/cache-proof.d.ts                             16.27 kB │ gzip:  3.06 kB
ℹ dist/shims/cache.d.ts                                    15.81 kB │ gzip:  5.09 kB
ℹ dist/routing/app-route-graph.d.ts                        15.25 kB │ gzip:  4.52 kB
ℹ dist/config/config-matchers.d.ts                         12.18 kB │ gzip:  4.64 kB
ℹ dist/server/request-pipeline.d.ts                        11.14 kB │ gzip:  4.08 kB
ℹ dist/shims/headers.d.ts                                  11.11 kB │ gzip:  3.91 kB
ℹ dist/server/app-server-action-execution.d.ts             10.63 kB │ gzip:  3.33 kB
ℹ dist/shims/server.d.ts                                   10.54 kB │ gzip:  3.45 kB
ℹ dist/server/app-elements-wire.d.ts                        9.41 kB │ gzip:  2.53 kB
ℹ dist/server/pages-page-data.d.ts                          8.87 kB │ gzip:  3.05 kB
ℹ dist/shims/metadata.d.ts                                  8.62 kB │ gzip:  2.51 kB
ℹ dist/deploy.d.ts                                          8.54 kB │ gzip:  3.07 kB
ℹ dist/server/prod-server.d.ts                              8.47 kB │ gzip:  3.41 kB
ℹ dist/build/prerender.d.ts                                 8.13 kB │ gzip:  3.08 kB
ℹ dist/server/app-page-dispatch.d.ts                        8.07 kB │ gzip:  2.43 kB
ℹ dist/shims/router.d.ts                                    8.04 kB │ gzip:  2.77 kB
ℹ dist/build/client-build-config.d.ts                       7.81 kB │ gzip:  2.96 kB
ℹ dist/server/app-page-route-wiring.d.ts                    7.81 kB │ gzip:  2.11 kB
ℹ dist/server/navigation-planner.d.ts                       7.79 kB │ gzip:  1.99 kB
ℹ dist/server/headers.d.ts                                  7.73 kB │ gzip:  2.76 kB
ℹ dist/shims/constants.d.ts                                 7.54 kB │ gzip:  2.10 kB
ℹ dist/server/app-browser-state.d.ts                        7.37 kB │ gzip:  1.76 kB
ℹ dist/server/app-page-stream.d.ts                          7.26 kB │ gzip:  2.36 kB
ℹ dist/server/app-page-request.d.ts                         7.20 kB │ gzip:  1.57 kB
ℹ dist/client/window-next.d.ts                              7.12 kB │ gzip:  2.64 kB
ℹ dist/server/app-page-execution.d.ts                       6.96 kB │ gzip:  2.67 kB
ℹ dist/server/app-rsc-handler.d.ts                          6.86 kB │ gzip:  2.12 kB
ℹ dist/server/isr-cache.d.ts                                6.67 kB │ gzip:  2.56 kB
ℹ dist/server/app-page-probe.d.ts                           6.66 kB │ gzip:  2.57 kB
ℹ dist/shims/error-boundary.d.ts                            6.37 kB │ gzip:  1.16 kB
ℹ dist/server/pages-page-response.d.ts                      6.24 kB │ gzip:  2.54 kB
ℹ dist/server/client-reuse-manifest.d.ts                    6.04 kB │ gzip:  1.49 kB
ℹ dist/shims/fetch-cache.d.ts                               6.03 kB │ gzip:  2.26 kB
ℹ dist/server/app-page-boundary.d.ts                        5.88 kB │ gzip:  1.41 kB
ℹ dist/build/report.d.ts                                    5.77 kB │ gzip:  2.23 kB
ℹ dist/server/app-page-cache.d.ts                           5.63 kB │ gzip:  1.42 kB
ℹ dist/server/app-page-element-builder.d.ts                 5.59 kB │ gzip:  1.81 kB
ℹ dist/server/image-optimization.d.ts                       5.56 kB │ gzip:  2.22 kB
ℹ dist/server/pages-data-route.d.ts                         5.54 kB │ gzip:  2.08 kB
ℹ dist/shims/cdn-cache.d.ts                                 5.48 kB │ gzip:  2.17 kB
ℹ dist/server/pages-page-handler.d.ts                       5.41 kB │ gzip:  1.94 kB
ℹ dist/server/app-browser-history-controller.d.ts           5.35 kB │ gzip:  1.78 kB
ℹ dist/server/metadata-routes.d.ts                          5.34 kB │ gzip:  1.78 kB
ℹ dist/server/app-fallback-renderer.d.ts                    5.30 kB │ gzip:  1.80 kB
ℹ dist/server/app-browser-navigation-controller.d.ts        5.21 kB │ gzip:  1.60 kB
ℹ dist/plugins/fonts.d.ts                                   5.19 kB │ gzip:  2.31 kB
ℹ dist/server/pages-request-pipeline.d.ts                   5.05 kB │ gzip:  1.86 kB
ℹ dist/shims/link.d.ts                                      5.01 kB │ gzip:  1.52 kB
ℹ dist/utils/asset-prefix.d.ts                              5.00 kB │ gzip:  1.93 kB
ℹ dist/server/dev-lockfile.d.ts                             4.90 kB │ gzip:  2.01 kB
ℹ dist/server/app-page-render.d.ts                          4.84 kB │ gzip:  1.63 kB
ℹ dist/server/pages-document-initial-props.d.ts             4.76 kB │ gzip:  1.68 kB
ℹ dist/server/pages-i18n.d.ts                               4.73 kB │ gzip:  1.83 kB
ℹ dist/routing/utils.d.ts                                   4.59 kB │ gzip:  1.83 kB
ℹ dist/index.d.ts                                           4.54 kB │ gzip:  1.83 kB
ℹ dist/entries/app-rsc-entry.d.ts                           4.36 kB │ gzip:  1.97 kB
ℹ dist/server/app-page-boundary-render.d.ts                 4.31 kB │ gzip:  1.41 kB
ℹ dist/client/navigation-runtime.d.ts                       4.29 kB │ gzip:  1.51 kB
ℹ dist/server/http-error-responses.d.ts                     4.18 kB │ gzip:  1.73 kB
ℹ dist/shims/cache-runtime.d.ts                             4.13 kB │ gzip:  1.77 kB
ℹ dist/server/app-history-state.d.ts                        3.97 kB │ gzip:  1.14 kB
ℹ dist/shims/document.d.ts                                  3.94 kB │ gzip:  1.66 kB
ℹ dist/server/app-rsc-cache-busting.d.ts                    3.86 kB │ gzip:  1.27 kB
ℹ dist/shims/unified-request-context.d.ts                   3.82 kB │ gzip:  1.40 kB
ℹ dist/server/instrumentation.d.ts                          3.79 kB │ gzip:  1.48 kB
ℹ dist/server/isr-decision.d.ts                             3.79 kB │ gzip:  1.47 kB
ℹ dist/check.d.ts                                           3.72 kB │ gzip:  1.69 kB
ℹ dist/server/app-route-handler-execution.d.ts              3.71 kB │ gzip:  1.30 kB
ℹ dist/server/pages-asset-tags.d.ts                         3.70 kB │ gzip:  1.57 kB
ℹ dist/shims/head.d.ts                                      3.69 kB │ gzip:  1.65 kB
ℹ dist/server/middleware.d.ts                               3.67 kB │ gzip:  1.56 kB
ℹ dist/server/navigation-trace.d.ts                         3.56 kB │ gzip:  1.15 kB
ℹ dist/cloudflare/tpr.d.ts                                  3.43 kB │ gzip:  1.59 kB
ℹ dist/server/app-ssr-stream.d.ts                           3.33 kB │ gzip:  1.41 kB
ℹ dist/server/pages-api-route.d.ts                          3.31 kB │ gzip:  1.43 kB
ℹ dist/init.d.ts                                            3.31 kB │ gzip:  1.46 kB
ℹ dist/server/artifact-compatibility.d.ts                   3.28 kB │ gzip:  0.76 kB
ℹ dist/server/app-rsc-request-normalization.d.ts            3.27 kB │ gzip:  1.46 kB
ℹ dist/shims/font-google-base.d.ts                          3.22 kB │ gzip:  1.35 kB
ℹ dist/server/app-rsc-route-matching.d.ts                   3.21 kB │ gzip:  1.18 kB
ℹ dist/routing/route-pattern.d.ts                           3.20 kB │ gzip:  1.20 kB
ℹ dist/server/app-browser-visible-commit.d.ts               3.17 kB │ gzip:  0.86 kB
ℹ dist/server/skip-cache-proof.d.ts                         3.13 kB │ gzip:  0.78 kB
ℹ dist/utils/lazy-chunks.d.ts                               3.02 kB │ gzip:  1.33 kB
ℹ dist/server/middleware-runtime.d.ts                       3.02 kB │ gzip:  1.23 kB
ℹ dist/shims/internal/pages-data-target.d.ts                3.01 kB │ gzip:  1.44 kB
ℹ dist/server/app-browser-action-result.d.ts                3.00 kB │ gzip:  0.96 kB
ℹ dist/plugins/sass.d.ts                                    3.00 kB │ gzip:  1.39 kB
ℹ dist/build/layout-classification.d.ts                     2.95 kB │ gzip:  1.16 kB
ℹ dist/server/app-page-response.d.ts                        2.94 kB │ gzip:  0.99 kB
ℹ dist/server/app-page-head.d.ts                            2.89 kB │ gzip:  0.83 kB
ℹ dist/utils/project.d.ts                                   2.88 kB │ gzip:  1.25 kB
ℹ dist/server/dev-origin-check.d.ts                         2.86 kB │ gzip:  1.20 kB
ℹ dist/build/route-classification-manifest.d.ts             2.85 kB │ gzip:  1.21 kB
ℹ dist/shims/internal/pages-data-fetch-dedup.d.ts           2.72 kB │ gzip:  1.33 kB
ℹ dist/server/pages-default-404.d.ts                        2.72 kB │ gzip:  1.34 kB
ℹ dist/shims/url-utils.d.ts                                 2.69 kB │ gzip:  1.06 kB
ℹ dist/utils/query.d.ts                                     2.64 kB │ gzip:  1.17 kB
ℹ dist/plugins/middleware-server-only.d.ts                  2.63 kB │ gzip:  1.23 kB
ℹ dist/server/dev-server.d.ts                               2.61 kB │ gzip:  1.21 kB
ℹ dist/server/static-file-cache.d.ts                        2.60 kB │ gzip:  1.23 kB
ℹ dist/cache/cache-adapters-virtual.d.ts                    2.59 kB │ gzip:  1.14 kB
ℹ dist/shims/font-utils.d.ts                                2.57 kB │ gzip:  1.01 kB
ℹ dist/routing/file-matcher.d.ts                            2.54 kB │ gzip:  1.04 kB
ℹ dist/server/app-route-handler-policy.d.ts                 2.52 kB │ gzip:  0.72 kB
ℹ dist/server/app-route-handler-runtime.d.ts                2.45 kB │ gzip:  0.99 kB
ℹ dist/server/pages-body-parser-config.d.ts                 2.41 kB │ gzip:  1.14 kB
ℹ dist/server/app-layout-param-observation.d.ts             2.40 kB │ gzip:  0.81 kB
ℹ dist/entries/app-rsc-manifest.d.ts                        2.40 kB │ gzip:  1.09 kB
ℹ dist/shims/request-context.d.ts                           2.37 kB │ gzip:  1.02 kB
ℹ dist/server/app-route-module-loader.d.ts                  2.36 kB │ gzip:  1.07 kB
ℹ dist/server/dev-error-overlay.d.ts                        2.32 kB │ gzip:  0.76 kB
ℹ dist/server/pages-node-compat.d.ts                        2.29 kB │ gzip:  0.91 kB
ℹ dist/plugins/og-assets.d.ts                               2.29 kB │ gzip:  1.11 kB
ℹ dist/server/otel-tracer-extension.d.ts                    2.28 kB │ gzip:  1.03 kB
ℹ dist/routing/route-trie.d.ts                              2.26 kB │ gzip:  1.07 kB
ℹ dist/shims/slot.d.ts                                      2.25 kB │ gzip:  0.81 kB
ℹ dist/server/app-route-handler-cache.d.ts                  2.23 kB │ gzip:  0.79 kB
ℹ dist/server/instrumentation-runtime.d.ts                  2.22 kB │ gzip:  1.08 kB
ℹ dist/server/cache-control.d.ts                            2.20 kB │ gzip:  1.03 kB
ℹ dist/shims/internal/link-status-registry.d.ts             2.19 kB │ gzip:  0.95 kB
ℹ dist/server/app-pages-bridge.d.ts                         2.16 kB │ gzip:  0.95 kB
ℹ dist/build/nitro-route-rules.d.ts                         2.14 kB │ gzip:  0.95 kB
ℹ dist/shims/internal/pages-data-url.d.ts                   2.14 kB │ gzip:  0.98 kB
ℹ dist/build/run-prerender.d.ts                             2.13 kB │ gzip:  1.00 kB
ℹ dist/config/dotenv.d.ts                                   2.13 kB │ gzip:  1.10 kB
ℹ dist/server/app-ssr-entry.d.ts                            2.12 kB │ gzip:  1.07 kB
ℹ dist/routing/pages-router.d.ts                            2.04 kB │ gzip:  0.85 kB
ℹ dist/server/app-optimistic-routing.d.ts                   2.02 kB │ gzip:  0.53 kB
ℹ dist/server/app-route-handler-dispatch.d.ts               2.02 kB │ gzip:  0.79 kB
ℹ dist/server/app-mounted-slots-header.d.ts                 2.02 kB │ gzip:  1.06 kB
ℹ dist/shims/cache-for-request.d.ts                         2.01 kB │ gzip:  0.88 kB
ℹ dist/build/static-export.d.ts                             1.99 kB │ gzip:  0.75 kB
ℹ dist/server/app-elements.d.ts                             1.98 kB │ gzip:  0.60 kB
ℹ dist/shims/internal/cookie-serialize.d.ts                 1.97 kB │ gzip:  0.95 kB
ℹ dist/build/layout-classification-types.d.ts               1.96 kB │ gzip:  0.86 kB
ℹ dist/client/instrumentation-client-inject.d.ts            1.95 kB │ gzip:  0.89 kB
ℹ dist/server/next-error-digest.d.ts                        1.94 kB │ gzip:  0.89 kB
ℹ dist/server/normalize-path.d.ts                           1.91 kB │ gzip:  0.90 kB
ℹ dist/plugins/optimize-imports.d.ts                        1.91 kB │ gzip:  0.93 kB
ℹ dist/utils/client-runtime-metadata.d.ts                   1.91 kB │ gzip:  0.90 kB
ℹ dist/shims/script.d.ts                                    1.86 kB │ gzip:  0.88 kB
ℹ dist/shims/navigation.react-server.d.ts                   1.86 kB │ gzip:  0.54 kB
ℹ dist/server/pregenerated-concrete-paths.d.ts              1.81 kB │ gzip:  0.82 kB
ℹ dist/shims/image.d.ts                                     1.81 kB │ gzip:  0.83 kB
ℹ dist/shims/image-config.d.ts                              1.80 kB │ gzip:  0.87 kB
ℹ dist/shims/internal/app-route-detection.d.ts              1.80 kB │ gzip:  0.92 kB
ℹ dist/shims/ppr-fallback-shell.d.ts                        1.80 kB │ gzip:  0.55 kB
ℹ dist/shims/url-safety.d.ts                                1.79 kB │ gzip:  0.90 kB
ℹ dist/server/dev-stack-sourcemap.d.ts                      1.77 kB │ gzip:  0.62 kB
ℹ dist/server/app-middleware.d.ts                           1.77 kB │ gzip:  0.72 kB
ℹ dist/utils/manifest-paths.d.ts                            1.76 kB │ gzip:  0.82 kB
ℹ dist/server/socket-error-backstop.d.ts                    1.76 kB │ gzip:  0.91 kB
ℹ dist/server/prerender-route-params.d.ts                   1.76 kB │ gzip:  0.47 kB
ℹ dist/server/proxy-trust.d.ts                              1.73 kB │ gzip:  0.84 kB
ℹ dist/build/assets-ignore.d.ts                             1.72 kB │ gzip:  0.92 kB
ℹ dist/server/app-segment-config.d.ts                       1.68 kB │ gzip:  0.66 kB
ℹ dist/server/pages-page-method.d.ts                        1.67 kB │ gzip:  0.85 kB
ℹ dist/server/app-interception-context-header.d.ts          1.65 kB │ gzip:  0.91 kB
ℹ dist/server/app-route-handler-response.d.ts               1.62 kB │ gzip:  0.52 kB
ℹ dist/shims/unrecognized-action-error.d.ts                 1.58 kB │ gzip:  0.74 kB
ℹ dist/shims/before-interactive-context.d.ts                1.56 kB │ gzip:  0.71 kB
ℹ dist/plugins/client-reference-dedup.d.ts                  1.55 kB │ gzip:  0.74 kB
ℹ dist/server/app-rsc-response-finalizer.d.ts               1.54 kB │ gzip:  0.78 kB
ℹ dist/server/app-page-render-observation.d.ts              1.54 kB │ gzip:  0.50 kB
ℹ dist/shims/link-prefetch.d.ts                             1.53 kB │ gzip:  0.54 kB
ℹ dist/server/pages-readiness.d.ts                          1.51 kB │ gzip:  0.77 kB
ℹ dist/utils/encode-cache-tag.d.ts                          1.49 kB │ gzip:  0.86 kB
ℹ dist/server/dev-error-overlay-store.d.ts                  1.49 kB │ gzip:  0.53 kB
ℹ dist/server/client-trace-metadata.d.ts                    1.48 kB │ gzip:  0.63 kB
ℹ dist/server/app-prerender-static-params.d.ts              1.46 kB │ gzip:  0.67 kB
ℹ dist/build/css-url-assets.d.ts                            1.46 kB │ gzip:  0.77 kB
ℹ dist/server/file-based-metadata.d.ts                      1.45 kB │ gzip:  0.66 kB
ℹ dist/server/app-browser-hydration.d.ts                    1.43 kB │ gzip:  0.51 kB
ℹ dist/server/html.d.ts                                     1.41 kB │ gzip:  0.71 kB
ℹ dist/client/vinext-next-data.d.ts                         1.39 kB │ gzip:  0.62 kB
ℹ dist/shims/internal/route-pattern-for-warning.d.ts        1.39 kB │ gzip:  0.73 kB
ℹ dist/utils/text-stream.d.ts                               1.37 kB │ gzip:  0.73 kB
ℹ dist/shims/internal/work-unit-async-storage.d.ts          1.37 kB │ gzip:  0.55 kB
ℹ dist/utils/base-path.d.ts                                 1.36 kB │ gzip:  0.60 kB
ℹ dist/utils/domain-locale.d.ts                             1.35 kB │ gzip:  0.57 kB
ℹ dist/shims/internal/utils.d.ts                            1.34 kB │ gzip:  0.61 kB
ℹ dist/build/precompress.d.ts                               1.33 kB │ gzip:  0.68 kB
ℹ dist/routing/app-router.d.ts                              1.31 kB │ gzip:  0.55 kB
ℹ dist/server/server-action-not-found.d.ts                  1.31 kB │ gzip:  0.59 kB
ℹ dist/server/app-browser-popstate.d.ts                     1.31 kB │ gzip:  0.48 kB
ℹ dist/server/app-browser-stream.d.ts                       1.30 kB │ gzip:  0.60 kB
ℹ dist/shims/font-local.d.ts                                1.29 kB │ gzip:  0.59 kB
ℹ dist/shims/internal/app-router-context.d.ts               1.24 kB │ gzip:  0.47 kB
ℹ dist/shims/legacy-image.d.ts                              1.24 kB │ gzip:  0.55 kB
ℹ dist/shims/layout-segment-context.d.ts                    1.24 kB │ gzip:  0.55 kB
ℹ dist/server/app-browser-rsc-redirect.d.ts                 1.23 kB │ gzip:  0.41 kB
ℹ dist/shims/default-global-error.d.ts                      1.22 kB │ gzip:  0.66 kB
ℹ dist/server/seed-cache.d.ts                               1.22 kB │ gzip:  0.64 kB
ℹ dist/server/app-browser-interception-context.d.ts         1.21 kB │ gzip:  0.51 kB
ℹ dist/shims/app.d.ts                                       1.20 kB │ gzip:  0.50 kB
ℹ dist/build/route-classification-injector.d.ts             1.19 kB │ gzip:  0.55 kB
ℹ dist/shims/navigation-state.d.ts                          1.19 kB │ gzip:  0.50 kB
ℹ dist/server/dev-module-runner.d.ts                        1.18 kB │ gzip:  0.62 kB
ℹ dist/utils/hash.d.ts                                      1.17 kB │ gzip:  0.65 kB
ℹ dist/plugins/postcss.d.ts                                 1.17 kB │ gzip:  0.61 kB
ℹ dist/shims/dynamic.d.ts                                   1.17 kB │ gzip:  0.54 kB
ℹ dist/server/pages-serializable-props.d.ts                 1.13 kB │ gzip:  0.56 kB
ℹ dist/entries/runtime-entry-module.d.ts                    1.13 kB │ gzip:  0.58 kB
ℹ dist/cli-args.d.ts                                        1.12 kB │ gzip:  0.57 kB
ℹ dist/entries/app-browser-entry.d.ts                       1.10 kB │ gzip:  0.58 kB
ℹ dist/plugins/server-externals-manifest.d.ts               1.09 kB │ gzip:  0.61 kB
ℹ dist/utils/vinext-root.d.ts                               1.07 kB │ gzip:  0.53 kB
ℹ dist/server/app-rsc-errors.d.ts                           1.05 kB │ gzip:  0.45 kB
ℹ dist/build/standalone.d.ts                                1.05 kB │ gzip:  0.53 kB
ℹ dist/utils/client-build-manifest.d.ts                     1.04 kB │ gzip:  0.30 kB
ℹ dist/server/app-rsc-render-mode.d.ts                      1.03 kB │ gzip:  0.38 kB
ℹ dist/server/metadata-route-build-data.d.ts                1.02 kB │ gzip:  0.41 kB
ℹ dist/shims/router-state.d.ts                              1.01 kB │ gzip:  0.53 kB
ℹ dist/shims/form.d.ts                                      0.99 kB │ gzip:  0.56 kB
ℹ dist/server/app-visited-response-cache.d.ts               0.97 kB │ gzip:  0.38 kB
ℹ dist/shims/error.d.ts                                     0.97 kB │ gzip:  0.53 kB
ℹ dist/server/app-render-dependency.d.ts                    0.97 kB │ gzip:  0.35 kB
ℹ dist/server/request-log.d.ts                              0.97 kB │ gzip:  0.53 kB
ℹ dist/server/default-not-found-module.d.ts                 0.94 kB │ gzip:  0.56 kB
ℹ dist/server/app-ppr-fallback-shell.d.ts                   0.94 kB │ gzip:  0.32 kB
ℹ dist/shims/config.d.ts                                    0.94 kB │ gzip:  0.45 kB
ℹ dist/routing/route-matching.d.ts                          0.93 kB │ gzip:  0.49 kB
ℹ dist/server/default-global-error-module.d.ts              0.92 kB │ gzip:  0.55 kB
ℹ dist/shims/request-state-types.d.ts                       0.89 kB │ gzip:  0.29 kB
ℹ dist/server/app-request-context.d.ts                      0.88 kB │ gzip:  0.48 kB
ℹ dist/server/app-page-render-identity.d.ts                 0.87 kB │ gzip:  0.33 kB
ℹ dist/shims/app-router-scroll-state.d.ts                   0.86 kB │ gzip:  0.28 kB
ℹ dist/plugins/ast-utils.d.ts                               0.85 kB │ gzip:  0.37 kB
ℹ dist/shims/thenable-params.d.ts                           0.84 kB │ gzip:  0.45 kB
ℹ dist/config/tsconfig-paths.d.ts                           0.84 kB │ gzip:  0.43 kB
ℹ dist/server/static-layout-client-reuse-proof.d.ts         0.83 kB │ gzip:  0.31 kB
ℹ dist/server/app-rsc-error-handler.d.ts                    0.82 kB │ gzip:  0.46 kB
ℹ dist/server/app-static-generation.d.ts                    0.78 kB │ gzip:  0.31 kB
ℹ dist/plugins/async-hooks-stub.d.ts                        0.78 kB │ gzip:  0.45 kB
ℹ dist/utils/client-entry-manifest.d.ts                     0.78 kB │ gzip:  0.29 kB
ℹ dist/server/app-prerender-endpoints.d.ts                  0.77 kB │ gzip:  0.38 kB
ℹ dist/server/csp.d.ts                                      0.76 kB │ gzip:  0.26 kB
ℹ dist/shims/root-params.…
2026-06-12 11:48:04 +01:00
Nathan Nguyen e018a08708 fix(pages-router): restore scroll across reload history traversal (#1905)
* fix(pages-router): restore scroll across reload history traversal

Pages Router pages with experimental.scrollRestoration currently expose window.next.router before the popstate runtime is installed and only keep Vinext scroll coordinates in the in-memory history state. After a reload, a back or forward traversal can run before the runtime is ready and has no durable scroll snapshot for the target history entry.

The violated invariant is that the Pages Router owns browser scroll restoration whenever the Next.js scroll restoration flag is enabled, with one stable history key per entry and routeChangeComplete emitted after the new page commits.

Resolve the Next.js config flag into process.env.__NEXT_SCROLL_RESTORATION, install the Pages Router runtime during next/router evaluation, persist Next-style sessionStorage scroll snapshots per history key, and render navigations through a stable commit boundary before emitting routeChangeComplete.

Regression coverage ports Next.js reload-scroll-backforward-restoration and verifies manual restoration plus exact scroll positions across reload, back, and forward traversal.

* fix(pages-router): sequence routeChangeComplete after scroll restoration and settle on render failures

* fix(router): guard against missing window.history in stampInitialHistoryState

* fix(router): defer hash scroll until after routeChangeComplete

Move hash scrolling out of renderPagesRouterElement's commit callback
and into the post-routeChangeComplete path, matching Next.js ordering:
x/y restoration happens during render commit, hash scrolling happens
after the completion event.

Also fix E2E test expectRouteChangeComplete to use one-shot event
listeners instead of checking for stale text, and add listener cleanup
to the fixture to prevent accumulation.

* fix(test): remove post-push deadlock and throw on missing events in E2E helper

expectRouteChangeComplete() now throws if window.next.router.events is
absent instead of silently resolving. Remove the redundant
expectRouteChangeComplete call after pushWithPagesRouter in the third
test — the awaited router.push already resolves after routeChangeComplete,
so registering a listener after it would deadlock.

* fix(test): replace as any casts with type-safe window.next narrowing in E2E scroll tests

* fix(router): narrow renderPagesRouterElement scroll param, drop dead hash branch

* fix(router): reset x/y scroll on hash routes before routeChangeComplete and cancel pending render on supersede

- Pass {x:0, y:0} through commit boundary for all scrollable
  navigations, not just hash-less ones (hash scroll deferred to after
  routeChangeComplete as before).
- Cancel pending render-commit Promise when a newer navigation starts,
  preventing hang when the first root.render() commit is dropped by
  React re-reconciliation.
- Add regression tests for both edge cases.

* fix(router): use SSR-safe layout effect in commit boundary and pin shallow scroll ordering

Address bonk review on #1905:
- swap the commit boundary's raw useLayoutEffect for the SSR-safe
  useNonWarningLayoutEffect pattern from shims/image.tsx so Pages Router
  SSR renders no longer log React's useLayoutEffect warning
- document that the default-noop commit boundary intentionally also wraps
  SSR and initial hydration
- document the intentional shallow-scroll-before-routeChangeComplete
  ordering and add a unit test pinning it

* fix(router): keep history-state scroll restore on popstate when scrollRestoration flag is off

Without experimental.scrollRestoration, popstate must still honour the
__vinext_scrollX/Y saved into history state on push, since a soft popstate
re-renders content the browser's native restoration can't position. Also
document why the popstate-time sessionStorage snapshot depends on
history.scrollRestoration = "manual".

* fix(router): guard render-commit canceller against late commits from superseded trees

* fix(router): defer current-history-key commit until beforePopState allows navigation

When beforePopState cancels a popstate the app stays on the previous
history entry, but _currentHistoryKey had already been updated to the
target key, skewing subsequent scroll-position bookkeeping. Move the
key commit below the beforePopState early-return, matching the
deliberate deferral of _lastPathnameAndSearch.

* chore(router): note intentional eager scroll snapshot; fix fixture link increment

- Document that the outgoing-entry scroll snapshot is deliberately written
  before the beforePopState gate: on cancellation the app stays on
  currentKey, so the saved value remains that entry's live scroll.
- Coerce id to a number in the pages-scroll-restoration fixture Link so
  the href increments numerically instead of string-concatenating.

* fix(router): keep manual scroll restoration opt-in Pages-Router-only

Gate installManualScrollRestoration on the document not being an App
Router one (window.next.appDir === true): with the now-global
__NEXT_SCROLL_RESTORATION define, an App Router app that value-imports
next/router for compat would otherwise have its native browser scroll
restoration disabled at module eval. Upstream only flips
history.scrollRestoration inside the Pages Router constructor, which
never runs on App Router documents.

Also document the hash-only popstate path discarding the per-entry
__next_scroll_<key> snapshot as intentional upstream parity (change()'s
onlyAHashChange branch passes null to this.set and only scrollToHash
runs), and add unit coverage for both behaviors.

* ci: run pages-scroll-restoration E2E project in the CI matrix

Add the missing E2E matrix entry so the ported Next.js regression spec
(reload-scroll-backforward-restoration.spec.ts) actually executes in CI,
matching the shape of the sibling single-shard Pages Router entries.

Also document why the soft-popstate scroll fallback differs between
manual restoration on ({ x: 0, y: 0 }) and off (null -> native auto
restoration handles unstamped entries), per review.

* refactor(router): fold App Router gate into manualScrollRestoration constant

The popstate handler's sessionStorage save/read branches gated on the
module-level constant, which lacked the window.next?.appDir check that
installManualScrollRestoration used, leaving those branches relying
solely on the __N state filter to stay inert on App Router documents.
Fold the appDir check into the constant so every consumer is
Pages-Router-only by the same gate; the App Router bootstrap stamps
window.next.appDir before any client module evaluates, so the
module-eval-time check is reliable.

* test(pages-scroll-restoration): default getServerSideProps id to string "0"

Route params always arrive as strings, so the numeric 0 fallback was
inconsistent with the string values the component relies on
(Number(id) + 1 href, id === "error" check). Default to "0" for type
consistency.

* test(pages-scroll-restoration): align fixture deps and vinext import with pages-basic

Import vinext via the workspace package name instead of reaching into
dist by relative path, and declare the same react/react-dom/vinext
dependencies as the other fixtures so the fixture is self-describing
and the pnpm-lock.yaml importer entry is populated.

* fix(router): snapshot outgoing scroll on hash-only pushes

Upstream Next.js snapshots the outgoing entry's scroll into
__next_scroll_<key> inside Router.push() itself, before change()'s
onlyAHashChange short-circuit, so hash-only pushes still capture the
departed entry's position. Our hash-only push branch returned before
saveScrollPosition() ran, so a later back-popstate to that entry
restored {x: 0, y: 0} instead of the position the user had reached.

Save the outgoing scroll before updateHistory mints the new key,
matching the full-navigation push path and upstream ordering.

* docs(router): clarify manual scroll-target fallback chain precedence

* test(shims): tag scrollRestoration App Router test as eval-order guard

* docs(router): note missing-snapshot fallback intent at forcedScroll default

---------

Co-authored-by: James <james@eli.cx>
2026-06-12 11:31:33 +01:00
Nathan Nguyen f5bee1a26f fix(app-router): preserve unstable_catchError boundaries (#1906)
* fix(app-router): preserve unstable_catchError boundaries

* test(e2e): add Next-parity test for shouldRerenderAppPageWithGlobalError (#1906)

Add a test proving that for uncaught post-shell RSC errors (with no
client boundary), the server preserves the original HTML stream and the
client renders global-error. This is the Next.js behavior that justifies
keeping shouldRerenderAppPageWithGlobalError unconditional at false.

The server cannot detect userland client boundaries like
unstable_catchError from the route manifest, so the only safe way to
get a global-error rerender is to make a targeted error-boundary test.

The test uses a loading.tsx boundary so the error is truly post-shell,
not caught by the pre-shell error-recovery catch block.

* fix(error): restore sentinel wrapper for falsy thrown values in unstable_catchError

Restores the _CatchErrorState sentinel wrapper ({ thrownValue: unknown }) so
falsy thrown values (null, undefined, 0, "") are routed to the fallback
instead of being treated as no error. Also restores ErrorInfo.error as unknown.

Adds back unit tests for falsy values, class-component lifecycle, and
unstable_retry behavior parity with the component-rendered fallback shape.

Refs: #1906

* fix(error): align ambient ErrorInfo.error type with runtime implementation

* refactor(app-router): remove shouldRerenderAppPageWithGlobalError dead code

The function always returned false and its _options parameter and
ShouldRerenderAppPageWithGlobalErrorOptions type were vestigial.
The call site at app-page-render.ts:892-904 was therefore never taken.

Remove the function, type, import, call site, and the now-redundant
unit test, leaving the shell-level recovery path in
renderAppPageHtmlStreamWithRecovery as the sole error recovery seam.

Addresses ask-bonk review comment on #1906.

* fix(test): restore typed globalAny view and document Fallback as any intent

Addresses two non-blocking review findings from ask-bonk on PR #1906:

- Restored the typed `globalThis as unknown as { window?: unknown }`
  pattern for window stubs in the unstable_catchError test section,
  replacing the `(globalThis as any).window` pattern that was a type-safety
  regression from the prior rewrite.
- Added an inline comment explaining why `Fallback as any` is necessary
  in the class-component lifecycle test: the test probes the inner
  _CatchError class directly, where the fallback function is used as a
  React component type (receiving a single `{ props, errorInfo }` object)
  rather than the public API signature `(props, errorInfo)`.

* chore: trigger CI

* fix(test): rename forwardedProps to props in unstable-catchError test

Addresses ask-bonk review finding on PR #1906: the test was seeding
the inner _CatchError class with the stale key name forwardedProps,
but the production wrapper now passes props (and isPagesRouter).
Since this test only exercises the App Router unstable_retry path
(which reads neither key), behavior was unaffected, but renaming
aligns the test with the current boundary shape for future readers.

* refactor(server): remove dead routeHasLocalBoundary field

Removing shouldRerenderAppPageWithGlobalError (commit abb416b)
deleted its only reader of routeHasLocalBoundary. The field is still
declared in the options type and populated on every render, but
nothing consumes it anymore. Removes:

- routeHasLocalBoundary from AppPageRenderOptions type
- The computation in app-page-dispatch.ts
- Two test stubs in app-page-render.test.ts

Addresses ask-bonk review finding on PR #1906.
2026-06-11 23:21:52 +01:00
James Anderson 835e6b9943 fix(app-router): suppress redirect console errors in production onCaughtError (root-layout-redirect) (#1878)
* fix(app-router): suppress redirect console errors in production onCaughtError (#1830)

When redirect() is called from a 'use client' root layout (or any client
component), React catches the NEXT_REDIRECT sentinel via RedirectErrorBoundary
and then calls the hydrateRoot onCaughtError callback. In dev mode vinext
already filtered these via devOnCaughtError, but the production path had no
onCaughtError at all — React's built-in fallback calls console.error, producing
a spurious browser console error that fails the Next.js compat test assertion
`expect(foundErrors).toBe(false)`.

Fix: add prodOnCaughtError to app-browser-error.ts that silently drops
navigation signal errors (NEXT_REDIRECT, NEXT_NOT_FOUND, NEXT_HTTP_ERROR_FALLBACK)
and logs all other caught errors, preserving React's default behavior.

Add fixture tests/fixtures/root-layout-redirect/ (dedicated 'use client' root
layout with redirect()) and Playwright project root-layout-redirect (port 4184)
with spec porting the Next.js root-layout-redirect > should work using browser.

Part of #1830

* fix: include result/ page in root-layout-redirect fixture

* fix: add lockfile entry for root-layout-redirect fixture, use prod server, import isNavigationSignalError

Three fixes to unblock catastrophically-failing CI:

1. pnpm-lock.yaml: Add missing importer entry for
   tests/fixtures/root-layout-redirect. The fixture was added without
   updating the lockfile, causing ERR_PNPM_OUTDATED_LOCKFILE on every
   CI job during `vp install`.

2. playwright.config.ts: Switch the root-layout-redirect server from
   `npx vp dev` (dev mode) to `vinext build + vinext start` (production
   mode). The fix under test — prodOnCaughtError — is only active in
   production builds; running in dev mode exercised the pre-existing
   devOnCaughtError path and never touched the new code.

3. app-browser-error.ts: Replace the inline isNavigationSignalDigest
   helper with an import of isNavigationSignalError from
   utils/navigation-signal.ts. The module is dependency-free and
   already in the production browser bundle; inlining it reintroduced
   the drift risk that navigation-signal.ts was created to prevent.

Addresses ask-bonk findings: blocking (test ran in dev mode) and
maintainability (inline classifier duplication).

* test: add prodOnCaughtError unit tests, run root-layout-redirect e2e in CI, scope gitignore negation
2026-06-11 01:03:03 +01:00
Nathan Nguyen cda19e1c58 fix(app-router): preserve recent segment state with Activity BFCache (#1739)
* fix(app-router): preserve recent segment state with Activity BFCache

Fresh App Router navigations were reusing the active React tree when moving between dynamic segment values. That leaked client state into a newly entered segment and made the upstream back-forward-cache suite fail before it even reached browser traversal assertions.

The root cause was that vinext had history-entry bfcacheId plumbing but no separate segment state-key cache. Next.js treats those identities separately: render state is keyed by segment identity/pathname, while useRouter().bfcacheId identifies a concrete history entry.

Add state-key maps for app router slots, render retained entries through React.Activity when cacheComponents is enabled, keep the active one-entry keyed reset path otherwise, and port focused Next.js regression coverage for the three-entry BFCache behavior.

* fix(bfcache): store stateKeyMap in retained slot entries and re-provide on render

Review feedback requested two changes:

1. Add stateKeyMap to BfcacheSlotEntry so each retained BFCache entry carries
the state-key map that belonged to it when active, rather than borrowing the
current navigation's map. This prevents nested hidden entries from being rendered
with old elements but new pathname-derived state keys — an identity corruption
bug that upstream Next.js avoids by rendering each retained entry from its own
state.

2. Add a nested dynamic regression test: /nested/[section]/item/[id] with client
counters in both the [section] layout and [id] page. The existing flat /page/[n]
tests do not exercise nested retained-entry identity, which is exactly where the
missing state-key-map bug lives.

Changes:
- BfcacheSlotEntry gains stateKeyMap?: Readonly<Record<string, string>>
- updateBfcacheSlotEntries accepts and stores an optional stateKeyMap argument
- BfcacheSlotBoundary stores the current stateKeyMap alongside elements when
caching the active entry
- Both the Activity visible/hidden path and the non-cacheComponents single-entry
path now wrap rendered entries in BfcacheStateKeyMapContext.Provider using the
entry's own stateKeyMap (falling back to current map for forward compatibility)
- New e2e test verifies nested layout + page counter preservation across
segment navigations

* refactor(bfcache): extract shared provider stack into BfcacheEntryProviders

BfcacheSlotBoundary rendered the BfcacheStateKeyMapContext / ElementsContext /
SegmentContext provider stack in two places: the one-entry keyed reset path and
the per-entry Activity retention list. The two stacks were identical except for
where the React key sat, so the retained-entry bookkeeping and its render shape
were tangled together and harder to audit than needed.

Extract BfcacheEntryProviders as a pure presentational helper and render it from
both paths. The keyed-reset path keeps its remount semantics: the key now sits on
the BfcacheEntryProviders element, so a fresh active stateKey still remounts the
whole provider subtree.

Hook ordering is unchanged. All hooks stay above the early returns in
BfcacheSlotBoundary, so the boundary still satisfies the Rules of Hooks across the
activeStateKey undefined-to-defined transition. Covered by the slot BFCache
entry-state suite in tests/shims.test.ts.

* test(bfcache): isolate cacheComponents BFCache coverage in a dedicated fixture

The back/forward-cache e2e suite ran against the shared app-basic fixture with
cacheComponents: true. app-basic backs the single app-router Playwright server
that every app-router spec uses, so enabling cacheComponents globally changed a
core DOM invariant for unrelated tests: inactive route trees stay mounted as
hidden Activity DOM. The contamination already leaked a :visible workaround into
the interception-modal bfcacheId spec, which had nothing to do with Activity.

cacheComponents is an opt-in semantic mode, not default app-router behaviour, so
it does not belong on the shared baseline fixture. Move the BFCache routes into a
dedicated tests/fixtures/app-bfcache fixture with cacheComponents: true, served by
a new app-router-bfcache Playwright project on port 4183, and run the
back-forward-cache spec there against the project baseURL. The :visible locators
stay in that spec, where duplicate hidden DOM is the expected contract.

Remove cacheComponents and the BFCache routes from app-basic so the shared fixture
models default behaviour again, and revert the :visible workaround in
use-router-bfcache-id.spec.ts now that the modal route no longer retains hidden
DOM. Fix the nested item page import while moving it: nested/[section]/item/[id]/
page.tsx imported ../counter, but the counter lives two levels up at
nested/[section]/counter.tsx, so it must be ../../counter.

Validation: PLAYWRIGHT_PROJECT=app-router-bfcache (5 passed) and the full
use-router-bfcache-id spec under app-router (11 passed), plus the slot BFCache
unit suite (1172 passed) and vp check (formatting + lint + types clean).

* ci: run the app-router-bfcache e2e project in the matrix

The dedicated app-router-bfcache Playwright project was added to
playwright.config.ts but not to the CI E2E matrix, so the back/forward-cache
specs never ran in CI. Add it to the matrix project list so the BFCache suite
runs on every push. It uses the default chromium browser, so the existing setup
and browser-cache steps apply unchanged.

* fix(bfcache): keep persisted slots mounted when cacheComponents is off

Without cacheComponents there is no Activity retention, yet BfcacheSlotBoundary
still keyed the active entry by its segment stateKey. That stateKey tracks the
pathname (createBfcacheSegmentIdentity), so any slot whose identity moves with
the URL (shared layouts, interception source slots) was remounted on navigation,
discarding client state that survives a normal route change. The baseline router
reconciles these slots in place.

This regressed seven existing app-router e2e tests once cacheComponents was no
longer masking it on the shared fixture: interception source-context and modal
preservation in advanced.spec.ts, and layout-persistence.spec.ts dynamic-segment
layout counter survival. Fresh-entry reset is driven by userland bfcacheId keying
in the fixtures, not by remounting the slot subtree, so the keying was pure
overreach in the non-cacheComponents path.

Render the single active entry unkeyed when cacheComponents is off so the boundary
reconciles in place like the baseline. The keyed Activity retention path is
unchanged for cacheComponents.

Validation: full app-router project 436 passed / 0 failed (the seven regressions
now pass); use-router-bfcache-id 11 passed (fresh-push reset intact); app-bfcache
5 passed (Activity retention intact); shims unit suite 1024 passed.

* docs(test): point bfcacheId spec comment at the app-router-bfcache project

The header noted that Activity-backed preservation is covered in
back-forward-cache.spec.ts, but that spec moved to the dedicated app-bfcache
fixture under the app-router-bfcache project. Name the project and path so the
cross-reference stays accurate.

* docs: align cacheComponents comment with unkeyed active-segment behavior

* test(bfcache): assert fresh bfcacheId after Activity-restored return

* style: collapse locator chains per oxfmt

* refactor(bfcache): split slot entry order from snapshots

* fix(bfcache): keep non-cacheComponents slot path baseline

* fix(bfcache): use string cacheComponents define

* test: remove external fetch from revalidate tag fixture

* fix(bfcache): harden Activity state key retention

* docs(bfcache): document cacheComponents Activity caveats

* fix(bfcache): preserve navigation context for fallback SSR

Fallback boundary rendering can outlive the original request-scoped navigation context. That made app SSR fail fast with a missing navigation context when loading-boundary digest routes rendered their HTTP fallback shell.

The SSR boundary contract still requires a navigation context for real request renders, but boundary renderers now synthesize the same typed shape from the request URL and matched params when request scope has already been cleared.

* refactor(bfcache): normalize pathname in state-key map, document invariant callers

Moves hydration-pathname normalization into createBfcacheSegmentStateKeyMap so SSR and client always produce byte-identical Activity keys. Documents the requireNavigationContext guaranteeing callers per review feedback.

* fix(bfcache): tolerate malformed state-key pathnames

* docs(bfcache): document known Next.js divergence and dead-branch contract

* chore(deps): update lockfile for vite 0.1.24

* fix(app-router): preserve encoded delimiters in bfcache keys

* docs(bfcache): track router-owned retention follow-up

* chore: retrigger ci

* fix(app-router): preserve redirect bridge fallback
2026-06-07 23:07:25 +01:00
Stephen Zhou 9126344cd8 fix: use loader for client reference (#1141)
* fix: split client chunk

* add test

* fix ci deps

* install deps

* use loader

* tweaks
2026-05-14 13:18:58 +01:00
Divanshu Chauhan (divkix) f972d45034 fix: resolve symlink paths in standalone BFS package copy (#724) (#942)
* fix: resolve symlink paths in standalone BFS package copy (#724)

When resolvePackageJsonPath finds a package via the lookup-paths
fallback, the returned path may be a symlink (e.g., under a hoisted
node_modules/ directory). Calling createRequire() on a symlink
path causes Node module resolution to miss transitive dependencies
because it walks up from the symlink ancestor directories rather
than the real (e.g., .pnpm/) path.

Fix: call fs.realpathSync() on the resolved package.json path
before using it for createRequire() and readPackageJson().

Also adds E2E test coverage for the standalone output mode.

* fix: address review feedback

Add standalone-output to CI E2E matrix, rename server header test
to reflect what it actually asserts, fix unused req parameter.
2026-04-28 21:19:09 +01:00
Stephen Zhou 207588d164 feat: add instrumentation-client support (#679)
* feat: add instrumentation-client support

* trigger ci

* fix deps

* tweaks

* tweaks

* tweaks

* tweaks

* rebuild lockfile

* fix: add app-with-src to CI E2E matrix

---------

Co-authored-by: James <james@eli.cx>
2026-03-28 21:21:36 +00:00
Raed Alharbi a515f07a49 test: add static export E2E tests (#564) (#686)
* test: add static export E2E tests (#564)

Add Playwright E2E tests for `output: "export"` static builds covering
both App Router and Pages Router. Includes a lightweight static file
server with path traversal protection, proper error handling, and
startup validation.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Update tests/e2e/static-export/serve-static.mjs

Co-authored-by: ask-bonk[bot] <249159057+ask-bonk[bot]@users.noreply.github.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: ask-bonk[bot] <249159057+ask-bonk[bot]@users.noreply.github.com>
2026-03-28 09:06:06 +00:00
Stephen Zhou c17d6941be chore: migrate to vite plus (#535)
* chore: migrate to vite plus

* Disable typeAware and typeCheck

* Update CI

* Fix CI

* Fix test

* Clean

* Run test with vp

* Try revert

* react: false In test

* Fix test

* Revert "Try revert"

This reverts commit 009da10473.

* Update

* Update

* Try revert ci changes

* revert

* Run vp migrate

* Disable typeAware and typeCheck for now

* Better resolve for test

* Use vp dev instead of vite

* Update expect

* Fix NormalizeManifestModuleId

* Try increase timeout

* Update to use vp

* Try new check

* Bring back npx vp

* Migrate CI

* Make next-intl resolvable

* Update

* Update

* Update
2026-03-15 10:50:13 +00:00
James Anderson 764a496ce7 add oxfmt formatter (#380)
* add oxfmt formatter: config, scripts, CI, editor setup, docs

* rebuild lockfile

* fix: add Format to required checks list, remove dead ignore pattern

* run fmt

* add format to agents.md again
2026-03-09 14:56:14 +00:00
James Anderson 7fdcdd3c69 feat(og): add @next/og / @vercel/og support with Cloudflare Workers compatibility (#356)
* feat(og): add @next/og support with Cloudflare Workers compatibility

- Add vinext:og-font-fix transform plugin that patches @vercel/og/dist/index.edge.js
  at Vite transform time: inlines the fallback font as base64 (avoids fetch() with
  import.meta.url which breaks in workerd) and defers WASM init to first use (avoids
  WebAssembly.instantiate() being blocked in Node.js module runner)
- Add @vercel/og to optimizeDeps.exclude so Vite's esbuild pre-bundler doesn't cache
  the module before the transform hook runs
- Add vinext:og-assets build plugin that copies font/WASM assets to RSC output dir
- Add /app/api/og route to app-router-cloudflare example and app-basic fixture
- Add shared Playwright e2e spec (tests/e2e/og-image.spec.ts) asserting PNG validity,
  correct 1200x630 dimensions, param-driven content, and determinism
- Register og-image.spec.ts in app-router, cloudflare-workers, and cloudflare-dev
  Playwright projects (18 tests total, all passing)

* refactor(og): generalize fetch+import.meta.url asset inlining, drop WASM lazy-init patch

Replace the @vercel/og-specific vinext:og-font-fix plugin with a general
vinext:og-inline-fetch-assets plugin that:

- Matches ANY fetch(new URL('./asset', import.meta.url)).then(res => res.arrayBuffer())
  pattern, not just the hardcoded noto-sans filename
- Resolves each asset relative to the module's on-disk path (via the transform id)
  and inlines it as base64 — works for any font version or additional assets
- Applies to any library using this pattern, not just @vercel/og

Also removes the WASM lazy-init patch: now that @vercel/og is in optimizeDeps.exclude,
the module runs through workerd (not the Node.js pre-bundler cache) where
WebAssembly.instantiate() works fine. The lazy-init workaround was only needed
when the pre-bundler cache bypassed the transform hook.

The og-assets build plugin is updated to only copy resvg.wasm (not the font,
which is now inlined and will no longer appear in the bundle by filename).

* fix(og): inline readFileSync assets from @vercel/og node build

The production RSC bundle resolves @vercel/og under the 'import' export
condition, getting dist/index.node.js instead of dist/index.edge.js.
The node build loads font and WASM via fs.readFileSync(fileURLToPath(
new URL('./file', import.meta.url))), which breaks after bundling because
import.meta.url points to the bundle output file, not the dist/ dir.

Extend vinext:og-inline-fetch-assets with a second regex pattern that
matches readFileSync(fileURLToPath(new URL(...))) and replaces it with
Buffer.from('<base64>', 'base64'), inlining both noto-sans font and
resvg.wasm at transform time. This eliminates the ENOENT errors seen
in the production build CI tests.

* refactor(og): address code review feedback

- Remove Fix 1 (font inlining) from vinext:og-font-patch — it was dead
  code since vinext:og-inline-fetch-assets (earlier in the plugin array)
  already handles the same fetch(new URL(...)) pattern generically. Only
  Fix 2 (yoga WASM extraction) remains in og-font-patch.

- Use split().join() instead of String.replace() in both Pattern 1 and
  Pattern 2 loops of og-inline-fetch-assets. String.replace(string, ...)
  only replaces the first occurrence; split().join() replaces all of them,
  which matters for libraries that may use the same pattern multiple times.

* refactor(og): use replaceAll instead of split().join()
2026-03-08 20:50:10 +00:00
James Anderson 4e0294fc4f fix: middleware crash in dev mode with cloudflare plugin (#344)
* test: middleware with cloudflare plugin and routing bypass

* fix: use module runner for pages middleware

* add pages router dev test
2026-03-08 14:04:11 +00:00
James Anderson cb2bbc65b6 test: app router instrumentation with cloudflare plugin (#333) 2026-03-07 23:04:41 +00:00
James Anderson 80acf27933 fix: register instrumentation in rsc entry and put error handler in global scope (#330)
* test: instrumentation

* store onRequestError on globalThis

* add instrumentation registration app-dev-server

* guard against double calling runinstrumentation for appdir
2026-03-07 22:40:27 +00:00
Steve Faulkner 12fea722b6 Initial public release of vinext 2026-02-24 09:29:39 -06:00