Repository navigation
EPBDS-16211 React 19: declare it, and gate it like 16 and 17 - #131
Merged
Merged
Conversation
The peers now read `^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0`, widened additively, so hosts on 16.14, 17 and 18 change nothing. §8's fast path is complete: gates 1 and 3 were met, gate 2 lapsed with the dependency trim, and this is gate 4. - The suite. React 19.3.0 is a fixture leg like the 16.14 and 17 ones: an install-only package (scripts/fixtures/react19) that plain `npm ci` nests, mapped in at resolve time, and `npm run test:react19` runs it locally. The harness self-checks the loaded version in every worker, as before. React 19 has no legacy root and ships react-dom/client, so this leg renders through createRoot: floors.js records `legacyRoot: false`, which skips the RTL patch, the ReactDOM.render assertion and the react-dom/client stub. - CI. `react-19` replaces the `continue-on-error` `react-19-advisory` job, which installed 19 over the lock with --legacy-peer-deps. The new job needs neither. - The packed artifact. `test:pack:peers` now server-renders it on 16.14.0, 17.0.2 and 19.3.0; `test:pack:consumer` covers 18.3.1. - The types. `test:types` compiles the published declarations against @types/react 19 as well, both import styles; 19 is the version that removed the global JSX namespace. gen-ts stays on the dev tree's 18. README, the demo's docs and changelog, CLAUDE.md and the plan record it. The changelog also records #129's `react/jsx-runtime` import, which a host that aliases `react` can see. Local gates exit 0: the React 18, 16, 17 and 19 legs pass 2907 tests each. Two first runs lost a worker to SIGSEGV (the Node 24 V8 crash, nodejs/node#62393): test:react19 once and test:react17 once. Both passed 2907/2907 on rerun.
AlexSamBY
force-pushed
the
react-19-flip
branch
from
September 30, 2026 12:34
8558528 to
73d80e2
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
On master since #130 merged, which fixed the
npm installpeer conflict this change needed gone to add a devDependency. The rebased tree is identical to the one the local gates below ran on.The flip
peerDependencies:reactandreact-domnow read^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0. The range is widened additively, so hosts on 16.14, 17 and 18 change nothing. This closes §8's fast path:defaultProps, then the automatic JSX runtime in EPBDS-16211 G: compile JSX with the automatic runtime #129) were met;dependencieswas emptied (EPBDS-16211 H9: burn the dev-tooling audit down to zero, and record today's decisions #128 records why);How 19 is gated, in three matrices
test:react16test:react17npx jest/test:coveragetest:react19(new)test:pack:peerstest:pack:peerstest:pack:consumertest:pack:peers(added 19.3.0).d.tscompiledtest:typestest:typestest:typestest:types(added@types/react19.3.0)scripts/fixtures/react19is an install-only package pinningreact/react-dom19.3.0. Plainnpm cinests it, it is mapped in at resolve time, andnpm run test:react19runs it locally too. The harness still asserts the loaded React (19.3.0) and scheduler (0.28) in every worker.react-dom/client, so the leg renders throughcreateRootas the default suite does.floors.jsrecordslegacyRoot: false, which skips three things that exist only for 16/17: the RTLlegacyRootpatch, theReactDOM.renderassertion and thereact-dom/clientstub.react-19job replaces thecontinue-on-errorreact-19-advisoryjob, which installed React 19 over the lock with--legacy-peer-deps; the new job needs neither. No required checks are configured on master today, soreact-19gates exactly asreact-16-floorandreact-17do. If branch protection ever namedreact-19-advisory, it should namereact-19now.@types/react19, with both the interop default import and the direct CommonJS import. That matters because 19 removed the globalJSXnamespace.gen-tsstays on the dev tree's 18; the plan's "pin@types/react@19forgen-ts" item was written assuming the dev tree would move to 19, and it does not.Docs
react/jsx-runtimefrom the host's React, which a host that aliasesreactto one copy has to alias too. Two older Unreleased paragraphs that said the range was not widened yet are updated, so the section does not contradict itself.CLAUDE.mdlists the three React legs.gen-tsrow, the Appendix C "React 19 flip" checklist and §10's Phase 7 React 19 item.Gates
All exited 0:
lint:js,lint:css,typecheck,typecheck:contract;css:fixture:check,docs:props:check,docs:views:check;test:env-flags,test:types,test:coverage,build;test:pack,test:pack:peers(16.14.0, 17.0.2, 19.3.0);test:react16,test:react17,test:react19, 2907 tests on each, as on 18;test:e2e, 41 Playwright tests;Two first runs lost a jest worker to
SIGSEGV, each killing one suite before its tests ran:test:react19once andtest:react17once. That is the Node 24 V8 garbage-collector crash (nodejs/node#62393), fixed onv24.x-stagingbut not in a release yet. Both passed 2907/2907 on rerun. CI runs Linux, where it has not been seen.🤖 Generated with Claude Code