FirebaseExtended / FirebaseExtended/reactfire

React 19 foundation: run tests against 19, then drop React 16/17

Open
#789 0 comments 0 reactions 0 assignees View on GitHub
v5
Dominant language
TypeScript
Stars
3.6k
Forks
403
Avg merge
14h 53m
Merged PRs (30d)
5

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 || experimental` becomes `^18 || ^19`
- delete the `use-sync-external-store` shim 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.react` reads `^18 || ^19`
- `use-sync-external-store` is absent from `package.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.

Contributor guide

Open the contributing guide

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.

Assessment

Tech stack
github-actions, react, typescript
Domain
ci-cd, testing
Issue type
Refactor
Difficulty
4/5
Estimated time
3-5 days
Activity status
Quiet
Clarity
Clearly specified
Newbie friendliness
55/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.