Skip to content

Upgrade nuqs to ^2.9.2 before the shared hook lands #368

Description

@frankieramirez

Part of #353.

Question

Nothing to decide — upgrade nuqs from 2.9.0 to ^2.9.2 and confirm the seven tables still behave.

Why this blocks a decision. nuqs#1501: useQueryState(s) permanently desyncs after a discarded render under the React Router adapter with React 19 concurrent rendering. It reproduces on 2.9.0 and 2.9.1 and is fixed in 2.9.2 (released 2026-07-24). Surfaced while resolving #356; independently verified — frontend/package-lock.json resolves nuqs to exactly 2.9.0, so this repo is on an affected version now.

The URL-synchronisation half of #360 cannot be designed honestly against a version with a known desync bug: any decision to put more state in the URL, or to have the shared hook own URL sync at all, would be weighing a hazard that is already fixed upstream. And a hook mounted at seven call sites is the wrong moment to discover it.

package.json already declares ^2.9.2-compatible range (^2.9.0), so this is a lockfile move, not a dependency-policy change.

Work:

  1. npm --prefix frontend install nuqs@^2.9.2, committing the lockfile change.
  2. Run the frontend suite (npm --prefix frontend test) and npm run lint.
  3. Exercise SeriesTable's URL state by hand — page next/prev, sort change, filter change, browser back/forward, and a reload at a deep ?page=N — since that is the only table with URL-synced state and the existing tests do not cover the back/forward path.
  4. Note in the resolution whether anything in nuqs 2.9.1/2.9.2 changes the conclusions recorded in Is the nuqs shadow-state dance still necessary on nuqs 2.9? #356, particularly the batching behaviour (part 5) that the shared hook is expected to rely on.

Explicitly not in this ticket: removing the shadow useState in SeriesTable.tsx:98-104. #356 established it is unnecessary, but its removal is entangled with the page-clamp effect at :267-276 and belongs to the migration, not to a dependency bump. Keep this ticket to the upgrade so a regression has one obvious suspect.

Metadata

Metadata

Labels

wayfinder:taskWayfinder ticket: manual work unblocking a decision

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions