Skip to content

fix(router-core): keep latest load alive through match commit#7424

Open
schiller-manuel wants to merge 1 commit into
mainfrom
fix-load-matches
Open

fix(router-core): keep latest load alive through match commit#7424
schiller-manuel wants to merge 1 commit into
mainfrom
fix-load-matches

Conversation

@schiller-manuel
Copy link
Copy Markdown
Collaborator

@schiller-manuel schiller-manuel commented May 17, 2026

A router load now records its controlled load promise as latest before the transition body starts. This gives the load a stable identity for the entire navigation, including the synchronous part of startTransition.

Pass that identity into loadMatches so stale loads cannot call onReady and promote their pending matches after a newer load has started. Also guard the onReady commit itself before scheduling the view-transition update and again inside the update callback, so a load that becomes stale while waiting for the view transition cannot mutate the active match stores.

Add a local commitPromise around the pending-to-active match commit. The router's startViewTransition wrapper is fire-and-forget, so without this latch onReady could resolve, loadMatches could finish, and load() could clear latestLoadPromise before the view-transition update callback actually committed the matches. React can then observe a stale pending/redirected match without an in-flight load promise to suspend on, which is the blank-render race reproduced by the issue-7120 e2e test.

Only the latest load now writes global redirect/status state, resolves the navigation commit promise, and clears latestLoadPromise. Stale loads still resolve their own load promise so callers do not hang, but they cannot complete the router-level commit for a newer navigation.

Also make load() resolve only the commitLocationPromise that belonged to that specific load.

Previously, load() resolved this.commitLocationPromise at completion time. That field is mutable and can be replaced by a later navigate()/commitLocation() before the older load finishes. In most navigation paths latestLoadPromise keeps that safe, because the newer navigation also starts a newer load. But an async blocker can create a window where a newer commitLocationPromise has already been installed while its corresponding load has not started yet.

In that window, the older load could resolve the newer navigation's promise early. The caller awaiting navigate() would observe the navigation as complete even though the blocker had not released and the target route had not loaded.

Capture this.commitLocationPromise when load() starts, resolve only that captured promise, and clear the router field only if it still points at the same promise. This preserves the ownership chain between commitLocation() and the load that is actually completing, while still allowing newer navigations to replace the global commit promise safely.

Add a router-core regression test where an onEnter callback starts a second navigation that is held by an async blocker. Without this fix, the second navigate() promise resolves before the blocker is released; with the fix, it stays pending until the blocked navigation actually completes.

Summary by CodeRabbit

  • Bug Fixes

    • Fixed an issue where beforeLoad redirects would blank the app when pending UI and view transitions are enabled.
  • Tests

    • Added a new regression test for beforeLoad redirect behavior with pending UI and view transitions.
    • Updated internal test assertions across router implementations to reflect improved navigation state tracking.

Review Change Stack

A router load now records its controlled load promise as latest before the
transition body starts. This gives the load a stable identity for the entire
navigation, including the synchronous part of startTransition.

Pass that identity into loadMatches so stale loads cannot call onReady and
promote their pending matches after a newer load has started. Also guard the
onReady commit itself before scheduling the view-transition update and again
inside the update callback, so a load that becomes stale while waiting for the
view transition cannot mutate the active match stores.

Add a local commitPromise around the pending-to-active match commit. The
router's startViewTransition wrapper is fire-and-forget, so without this latch
onReady could resolve, loadMatches could finish, and load() could clear
latestLoadPromise before the view-transition update callback actually committed
the matches. React can then observe a stale pending/redirected match without an
in-flight load promise to suspend on, which is the blank-render race reproduced
by the issue-7120 e2e test.

Only the latest load now writes global redirect/status state, resolves the
navigation commit promise, and clears latestLoadPromise. Stale loads still
resolve their own load promise so callers do not hang, but they cannot complete
the router-level commit for a newer navigation.

Also make load() resolve only the commitLocationPromise that belonged to that
specific load.

Previously, load() resolved this.commitLocationPromise at completion time. That
field is mutable and can be replaced by a later navigate()/commitLocation()
before the older load finishes. In most navigation paths latestLoadPromise keeps
that safe, because the newer navigation also starts a newer load. But an async
blocker can create a window where a newer commitLocationPromise has already been
installed while its corresponding load has not started yet.

In that window, the older load could resolve the newer navigation's promise
early. The caller awaiting navigate() would observe the navigation as complete
even though the blocker had not released and the target route had not loaded.

Capture this.commitLocationPromise when load() starts, resolve only that captured
promise, and clear the router field only if it still points at the same promise.
This preserves the ownership chain between commitLocation() and the load that is
actually completing, while still allowing newer navigations to replace the global
commit promise safely.

Add a router-core regression test where an onEnter callback starts a second
navigation that is held by an async blocker. Without this fix, the second
navigate() promise resolves before the blocker is released; with the fix, it
stays pending until the blocked navigation actually completes.
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 17, 2026

📝 Walkthrough

Walkthrough

This PR fixes a blank-app issue in React Router when beforeLoad redirects coincide with pending UI and view transitions enabled. The fix introduces promise fallback logic for suspense, adds stale-load detection to prevent race conditions, and refactors the router's promise orchestration to serialize concurrent navigations correctly. A complete E2E test case reproduces the issue and validates the fix.

Changes

Issue 7120 Fix: beforeLoad Redirect Blankness

Layer / File(s) Summary
E2E Test Case Reproduction
e2e/react-router/issue-7120/index.html, e2e/react-router/issue-7120/package.json, e2e/react-router/issue-7120/playwright.config.ts, e2e/react-router/issue-7120/src/main.tsx, e2e/react-router/issue-7120/src/posts.lazy.tsx, e2e/react-router/issue-7120/src/styles.css, e2e/react-router/issue-7120/tests/issue-7120.repro.spec.ts, e2e/react-router/issue-7120/tsconfig.json, e2e/react-router/issue-7120/vite.config.js
Complete test setup for issue-7120: HTML entry, Playwright config, a React Router app with beforeLoad redirect to /posts, lazy-loaded route component, global styles, and Playwright spec validating that the redirect succeeds without blanking when pending UI and view transitions are active.
Suspense Promise Fallback in Match Rendering
packages/react-router/src/Match.tsx
Introduces resolvedPromise constant and getRedirectPromise() helper to compute the promise thrown for React suspension, preferring the match's loadPromise, then router.latestLoadPromise, and finally a pre-resolved promise. Both server-side pending and client-side redirected status handling now use this fallback logic instead of failing when the match promise is unavailable during redirect scenarios.
Stale Load Detection in Route Matching
packages/router-core/src/load-matches.ts
Adds isLatest?: () => boolean option to loadMatches to detect stale loads. When a load is marked stale, the finalization is cancelled, preventing race conditions where an older navigation's load could incorrectly complete after a newer one starts.
Promise Serialization in Router Load and Commit
packages/router-core/src/router.ts, packages/router-core/src/load-matches.ts
Refactors RouterCore.load() to introduce controlled loadPromise and latestLoadPromise tracking inside startTransition, with explicit commitPromise handling in a finally block. After loadPromise completes, the router awaits any newly-started latestLoadPromise before recalculating status. handleRedirectAndNotFound refactored to conditionally avoid overriding match state during client redirect/not-found scenarios. Match caching filter now includes only success-status matches.
Navigation Concurrency Regression Test
packages/router-core/tests/callbacks.test.ts
Adds new onEnter regression test verifying that when entering a route triggers an in-flight blocked load that starts a nested navigation, the router does not allow an older load to incorrectly resolve a newer commit promise.
Store Update Assertion Adjustments
packages/react-router/tests/store-updates-during-navigation.test.tsx, packages/solid-router/tests/store-updates-during-navigation.test.tsx, packages/vue-router/tests/store-updates-during-navigation.test.tsx
Updates expected store-update counts to reflect reduced update invocations from the promise orchestration changes: async loader + async beforeLoad + pending reduced 8→7 (react, solid) and 9→8 (vue); sync beforeLoad reduced 5→4 (react, solid) and 9→8 (vue notFound).

Sequence Diagram

sequenceDiagram
  participant Router
  participant LoadMatches
  participant ViewTransition
  participant Match
  participant React
  Router->>Router: Create loadPromise, set latestLoadPromise
  Router->>Router: startTransition with beforeLoad/onBeforeNavigate
  Router->>LoadMatches: Call with isLatest() guard
  alt Load is stale
    LoadMatches->>LoadMatches: Set inner.cancelled = true
    LoadMatches-->>Router: Return early
  else Load is current
    LoadMatches->>LoadMatches: Execute loader, beforeLoad hooks
    LoadMatches-->>Router: Return updated matches
  end
  Router->>ViewTransition: startViewTransition for state update
  Router->>Match: Component renders with new matches
  alt Redirect pending
    Match->>Match: getRedirectPromise() for suspension
    Match->>React: Throw promise for Suspense boundary
  else Success
    React->>React: Render complete
  end
  Router->>Router: Resolve commitPromise in finally block
  Router->>Router: Cleanup latestLoadPromise if still current
  Router->>Router: Await any new concurrent latestLoadPromise
  Router->>Router: Recalculate statusCode from final matches
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Suggested labels

package: router-core

Suggested reviewers

  • Sheraff

Poem

🐰 A redirect that wandered through view transitions' dance,
Now caught by pending UI in a most peculiar trance.
With promise chains unwoven and staleness rightly known,
The blank-app curse is lifted—the fix has truly grown!

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and specifically summarizes the main change: fixing router-core to maintain load state through match commits, which is the primary objective across all modifications.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix-load-matches

Comment @coderabbitai help to get the list of available commands and usage tips.

@nx-cloud
Copy link
Copy Markdown
Contributor

nx-cloud Bot commented May 17, 2026

View your CI Pipeline Execution ↗ for commit 1769f5f

Command Status Duration Result
nx affected --targets=test:eslint,test:unit,tes... ❌ Failed 7m 37s View ↗
nx run-many --target=build --exclude=examples/*... ✅ Succeeded 2m 9s View ↗

☁️ Nx Cloud last updated this comment at 2026-05-17 12:04:03 UTC

@github-actions
Copy link
Copy Markdown
Contributor

🚀 Changeset Version Preview

No changeset entries found. Merging this PR will not cause a version bump for any packages.

@github-actions
Copy link
Copy Markdown
Contributor

Bundle Size Benchmarks

  • Commit: 701bc19d8e70
  • Measured at: 2026-05-17T11:57:20.787Z
  • Baseline source: history:ee8a6753da78
  • Dashboard: bundle-size history
Scenario Current (gzip) Delta vs baseline Initial gzip Raw Brotli Trend
react-router.minimal 87.46 KiB +136 B (+0.15%) 87.32 KiB 274.60 KiB 76.00 KiB ▁▁▁▂▂▂▂▂▂▂▂█
react-router.full 90.97 KiB +119 B (+0.13%) 90.83 KiB 286.11 KiB 79.00 KiB ▁▁▁▃▃▃▃▃▃▃▃█
solid-router.minimal 35.66 KiB +115 B (+0.32%) 35.54 KiB 106.84 KiB 32.13 KiB ▁▁▁▃▃▃▃▃▃▃▃█
solid-router.full 40.37 KiB +102 B (+0.25%) 40.24 KiB 121.05 KiB 36.28 KiB ▁▁▁▃▃▃▃▃▃▃▃█
vue-router.minimal 53.43 KiB +104 B (+0.19%) 53.30 KiB 151.98 KiB 47.99 KiB ▁▁▁▃▃▃▃▃▃▃▃█
vue-router.full 58.55 KiB +108 B (+0.18%) 58.42 KiB 168.16 KiB 52.49 KiB ▁▁▁▃▃▃▃▃▃▃▃█
react-start.minimal 102.13 KiB +123 B (+0.12%) 101.99 KiB 323.04 KiB 88.36 KiB ▁▁▁▃▃▃▃▃▃▃▃█
react-start.full 105.57 KiB +135 B (+0.13%) 105.43 KiB 333.37 KiB 91.21 KiB ▁▁▁▂▂▂▂▂▂▂▂█
react-start.rsbuild.minimal 99.72 KiB +90 B (+0.09%) 99.55 KiB 317.46 KiB 85.85 KiB ▁▁▁▃▃▃▃▃▃▃▃█
react-start.rsbuild.full 103.03 KiB +99 B (+0.09%) 102.86 KiB 327.90 KiB 88.54 KiB ▁▁▁▃▃▃▃▃▃▃▃█
solid-start.minimal 49.77 KiB +113 B (+0.22%) 49.64 KiB 152.96 KiB 43.93 KiB ▁▁▁▃▃▃▃▃▃▃▃█
solid-start.full 55.55 KiB +119 B (+0.21%) 55.42 KiB 169.86 KiB 48.89 KiB ▁▁▁▃▃▃▃▃▃▃▃█

Current gzip tracks all emitted client JS chunks. Initial gzip tracks only the entry/import graph. Trend sparkline is historical current gzip ending with this PR measurement; lower is better.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@packages/router-core/src/router.ts`:
- Around line 2556-2564: The redirect handling allows stale loads to call
navigate; capture the active load identifier at the start of the load (e.g., a
local loadId or use this.latestLoadId) and, inside the isRedirect(err) branch,
only assign redirect and call this.navigate(...) if the captured loadId matches
the router's current/latest load id (e.g., if (capturedLoadId ===
this.latestLoadId) { redirect = err; if (!(isServer ?? this.isServer))
this.navigate(...) }). This ensures isRedirect, redirect and navigate side
effects only run for the latest load.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 2704ccb8-58b3-496a-91a7-42fdc989a287

📥 Commits

Reviewing files that changed from the base of the PR and between ee8a675 and 1769f5f.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (16)
  • e2e/react-router/issue-7120/index.html
  • e2e/react-router/issue-7120/package.json
  • e2e/react-router/issue-7120/playwright.config.ts
  • e2e/react-router/issue-7120/src/main.tsx
  • e2e/react-router/issue-7120/src/posts.lazy.tsx
  • e2e/react-router/issue-7120/src/styles.css
  • e2e/react-router/issue-7120/tests/issue-7120.repro.spec.ts
  • e2e/react-router/issue-7120/tsconfig.json
  • e2e/react-router/issue-7120/vite.config.js
  • packages/react-router/src/Match.tsx
  • packages/react-router/tests/store-updates-during-navigation.test.tsx
  • packages/router-core/src/load-matches.ts
  • packages/router-core/src/router.ts
  • packages/router-core/tests/callbacks.test.ts
  • packages/solid-router/tests/store-updates-during-navigation.test.tsx
  • packages/vue-router/tests/store-updates-during-navigation.test.tsx

Comment on lines +2556 to 2564
if (isRedirect(err)) {
redirect = err
if (!(isServer ?? this.isServer)) {
this.navigate({
...redirect.options,
replace: true,
ignoreBlocker: true,
})
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Guard redirect side effects to latest load only.

At Line 2559, stale loads can still call navigate(...) after a newer load has started. That allows an outdated redirect to override a newer navigation.

Suggested fix
       if (isRedirect(err)) {
         redirect = err
-        if (!(isServer ?? this.isServer)) {
+        if (
+          this.latestLoadPromise === loadPromise &&
+          !(isServer ?? this.isServer)
+        ) {
           this.navigate({
             ...redirect.options,
             replace: true,
             ignoreBlocker: true,
           })
         }
       } else if (isNotFound(err)) {
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
if (isRedirect(err)) {
redirect = err
if (!(isServer ?? this.isServer)) {
this.navigate({
...redirect.options,
replace: true,
ignoreBlocker: true,
})
}
if (isRedirect(err)) {
redirect = err
if (
this.latestLoadPromise === loadPromise &&
!(isServer ?? this.isServer)
) {
this.navigate({
...redirect.options,
replace: true,
ignoreBlocker: true,
})
}
}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/router-core/src/router.ts` around lines 2556 - 2564, The redirect
handling allows stale loads to call navigate; capture the active load identifier
at the start of the load (e.g., a local loadId or use this.latestLoadId) and,
inside the isRedirect(err) branch, only assign redirect and call
this.navigate(...) if the captured loadId matches the router's current/latest
load id (e.g., if (capturedLoadId === this.latestLoadId) { redirect = err; if
(!(isServer ?? this.isServer)) this.navigate(...) }). This ensures isRedirect,
redirect and navigate side effects only run for the latest load.

@pkg-pr-new
Copy link
Copy Markdown

pkg-pr-new Bot commented May 17, 2026

More templates

@tanstack/arktype-adapter

npm i https://pkg.pr.new/@tanstack/arktype-adapter@7424

@tanstack/eslint-plugin-router

npm i https://pkg.pr.new/@tanstack/eslint-plugin-router@7424

@tanstack/eslint-plugin-start

npm i https://pkg.pr.new/@tanstack/eslint-plugin-start@7424

@tanstack/history

npm i https://pkg.pr.new/@tanstack/history@7424

@tanstack/nitro-v2-vite-plugin

npm i https://pkg.pr.new/@tanstack/nitro-v2-vite-plugin@7424

@tanstack/react-router

npm i https://pkg.pr.new/@tanstack/react-router@7424

@tanstack/react-router-devtools

npm i https://pkg.pr.new/@tanstack/react-router-devtools@7424

@tanstack/react-router-ssr-query

npm i https://pkg.pr.new/@tanstack/react-router-ssr-query@7424

@tanstack/react-start

npm i https://pkg.pr.new/@tanstack/react-start@7424

@tanstack/react-start-client

npm i https://pkg.pr.new/@tanstack/react-start-client@7424

@tanstack/react-start-rsc

npm i https://pkg.pr.new/@tanstack/react-start-rsc@7424

@tanstack/react-start-server

npm i https://pkg.pr.new/@tanstack/react-start-server@7424

@tanstack/router-cli

npm i https://pkg.pr.new/@tanstack/router-cli@7424

@tanstack/router-core

npm i https://pkg.pr.new/@tanstack/router-core@7424

@tanstack/router-devtools

npm i https://pkg.pr.new/@tanstack/router-devtools@7424

@tanstack/router-devtools-core

npm i https://pkg.pr.new/@tanstack/router-devtools-core@7424

@tanstack/router-generator

npm i https://pkg.pr.new/@tanstack/router-generator@7424

@tanstack/router-plugin

npm i https://pkg.pr.new/@tanstack/router-plugin@7424

@tanstack/router-ssr-query-core

npm i https://pkg.pr.new/@tanstack/router-ssr-query-core@7424

@tanstack/router-utils

npm i https://pkg.pr.new/@tanstack/router-utils@7424

@tanstack/router-vite-plugin

npm i https://pkg.pr.new/@tanstack/router-vite-plugin@7424

@tanstack/solid-router

npm i https://pkg.pr.new/@tanstack/solid-router@7424

@tanstack/solid-router-devtools

npm i https://pkg.pr.new/@tanstack/solid-router-devtools@7424

@tanstack/solid-router-ssr-query

npm i https://pkg.pr.new/@tanstack/solid-router-ssr-query@7424

@tanstack/solid-start

npm i https://pkg.pr.new/@tanstack/solid-start@7424

@tanstack/solid-start-client

npm i https://pkg.pr.new/@tanstack/solid-start-client@7424

@tanstack/solid-start-server

npm i https://pkg.pr.new/@tanstack/solid-start-server@7424

@tanstack/start-client-core

npm i https://pkg.pr.new/@tanstack/start-client-core@7424

@tanstack/start-fn-stubs

npm i https://pkg.pr.new/@tanstack/start-fn-stubs@7424

@tanstack/start-plugin-core

npm i https://pkg.pr.new/@tanstack/start-plugin-core@7424

@tanstack/start-server-core

npm i https://pkg.pr.new/@tanstack/start-server-core@7424

@tanstack/start-static-server-functions

npm i https://pkg.pr.new/@tanstack/start-static-server-functions@7424

@tanstack/start-storage-context

npm i https://pkg.pr.new/@tanstack/start-storage-context@7424

@tanstack/valibot-adapter

npm i https://pkg.pr.new/@tanstack/valibot-adapter@7424

@tanstack/virtual-file-routes

npm i https://pkg.pr.new/@tanstack/virtual-file-routes@7424

@tanstack/vue-router

npm i https://pkg.pr.new/@tanstack/vue-router@7424

@tanstack/vue-router-devtools

npm i https://pkg.pr.new/@tanstack/vue-router-devtools@7424

@tanstack/vue-router-ssr-query

npm i https://pkg.pr.new/@tanstack/vue-router-ssr-query@7424

@tanstack/vue-start

npm i https://pkg.pr.new/@tanstack/vue-start@7424

@tanstack/vue-start-client

npm i https://pkg.pr.new/@tanstack/vue-start-client@7424

@tanstack/vue-start-server

npm i https://pkg.pr.new/@tanstack/vue-start-server@7424

@tanstack/zod-adapter

npm i https://pkg.pr.new/@tanstack/zod-adapter@7424

commit: 1769f5f

Copy link
Copy Markdown
Contributor

@nx-cloud nx-cloud Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nx Cloud is proposing a fix for your failed CI:

We updated the store-update count assertions in the React and Solid router tests to match the actual values produced by the PR's code changes. The added commitPromise latch in router.ts introduces an extra async boundary that prevents the anticipated one-update reduction for async loader and sync beforeLoad scenarios, while the restructured loadPromise lifecycle incidentally reduces the count by one for Solid's not found in beforeLoad case. These corrections align the assertions with observed reality so the tests accurately guard against regressions going forward.

Tip

We verified this fix by re-running @tanstack/react-router:test:unit, @tanstack/solid-router:test:unit.

Warning

The suggested diff is too large to display here, but you can view it on Nx Cloud ↗


Apply fix via Nx Cloud  Reject fix via Nx Cloud


Or Apply changes locally with:

npx nx-cloud apply-locally ef9F-5xkY

Apply fix locally with your editor ↗   View interactive diff ↗



🎓 Learn more about Self-Healing CI on nx.dev

@codspeed-hq
Copy link
Copy Markdown

codspeed-hq Bot commented May 17, 2026

Merging this PR will not alter performance

✅ 5 untouched benchmarks
⏩ 1 skipped benchmark1


Comparing fix-load-matches (1769f5f) with main (ee8a675)

Open in CodSpeed

Footnotes

  1. 1 benchmark was skipped, so the baseline result was used instead. If it was deleted from the codebase, click here and archive it to remove it from the performance reports.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant