FirebaseExtended / FirebaseExtended/reactfire
React 19 foundation: run tests against 19, then drop React 16/17
- Lingua principale
- TypeScript
- Stelle
- 3.6k
- Fork
- 403
- Merge medio
- 14h 53m
- PR unite (30g)
- 5
Descrizione
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.
Guida per i contributori
Apri la guida per i contributori
Direzione di ricerca
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.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- github-actions, react, typescript
- Ambito
- ci-cd, testing
- Tipo di issue
- Refactoring
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Stato di attività
- Tranquilla
- Chiarezza
- Specificata chiaramente
- Idoneità per principianti
- 55/100