React 19 foundation: run tests against 19, then drop React 16/17
Nobody has claimed this yet.
Assessment
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Newbie friendliness
- 55/100
- Issue type
- Refactor
- Clarity
- Clearly specified
- Activity status
- Quiet
- Tech stack
- github-actions, react, typescript
Research direction
Start with the test job matrix, package.json, and the lockfile to trace the current React and Node combinations. Land the React 19 test-job coverage first, then verify the stated peer dependency, shim removal, CI matrix, and green React 19 suite meet the acceptance criteria.
Written by the indexing model from the issue text.
Description
Tracking issue for the v5 React 19 foundation. Two PRs, in this order.
Why this is first
Every other v5 cluster sits on top of it, and one half of it is a gap rather than a migration: CI type-checks React 19 but has never executed a test against it. The type-check job carries matrix.react: ["18","19"]; the test job's matrix is Node versions only, and the lockfile resolves React 18.2.0. So executed coverage on 19 is zero today.
PR 1: React 19 as an executed test job (CI only)
Adds a react dimension to the test job so the suite actually runs on 19.
This lands first and alone, before any src/ change. The use-sync-external-store shim delegates to React.useSyncExternalStore when it exists, so the suite runs on React 19 with the shim still in place. That gives a measured baseline to compare against once the shim is deleted, instead of changing the runtime and the dependency in one step.
⚠️ Not a one-line matrix addition. The test job currently matrixes node: [22, 24] only. Adding a react dimension doubles the emulator jobs from two to four, each with its own Java setup and emulator cache.
⚠️ That interacts with #776. The firestore flake sits at 7.5% per full-suite run, so doubling the emulator jobs roughly doubles per-PR exposure to a red job. Deliberately not putting a number on it: contention is the suspected mechanism, so the jobs are correlated rather than independent, and multiplying the rate would overstate the precision. This argues for #787's timing data landing before the matrix widens.
Reviewable by anyone; no src/ change, no API surface.
PR 2: drop React 16/17
One PR, one review:
peerDependencies.react:>=16 || experimentalbecomes^18 || ^19- delete the
use-sync-external-storeshim and its dependency - drop the 16/17 entries from the CI matrix
Splitting these buys a second review round trip on what is a single decision.
Acceptance
peerDependencies.reactreads^18 || ^19use-sync-external-storeis absent frompackage.json- the test job runs on React 19 and is green, with the shim gone
Notes
- The
use()suspend-gate swap is out of scope. Spiked: it is a behavioural no-op on React 19.2.8 and React 19 emits no warning for the current throw form, so there is no deprecation pressure and no reason to bundle it here. - Related to #788. "CI type-checks React 19 but never runs a test against it" is a live instance of the pattern that issue collects: a check that passes while measuring nothing. #788 currently has no example attached to it.
- The React floor is
^18 || ^19, not 19-only. Dropping 18 is not part of this.
- Dominant language
- TypeScript
- Stars
- 3.6k
- Forks
- 403
- Avg merge
- 5d 1h
- Merged PRs (30d)
- 10
Getting set up
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from FirebaseExtended/reactfire
-
Difficulty 5/5 Over a week Newbie friendliness 38/100
FirebaseExtended/reactfire#801 ·
-
v5
Difficulty 4/5 3-5 days Newbie friendliness 48/100
FirebaseExtended/reactfire#793 ·
-
v5
Difficulty 4/5 3-5 days Newbie friendliness 35/100
FirebaseExtended/reactfire#790 · 2 comments ·
-
Difficulty 5/5 Over a week Newbie friendliness 35/100
FirebaseExtended/reactfire#788 ·
-
Difficulty 4/5 3-5 days Newbie friendliness 55/100
FirebaseExtended/reactfire#784 ·
All issues in FirebaseExtended/reactfire
Similar issues
-
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
melgarafael/DeskcommCRM#1812 ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 84/100
prisma/prisma-cli#309 ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
gregwebs/pi-quota-dispatcher#26 ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 74/100
openwatersio/slackwater.xyz#124 ·
Maintainers usually reply within 1 day
-
agent-reported area/browser area/docs documentation good first issue hacktoberfest help wanted P2
Difficulty 1/5 Under an hour Newbie friendliness 90/100
Maintainers usually reply within 2 days