Summary:
Pull Request resolved: https://github.com/react/react-native/pull/57611
Directly follows D112733139 (Metro).
**Motivation**
- New Node builtins are *only* available under the prefix (e.g. `node:sqlite`), as this allows Node to introduce them without ecosystem-breaking changes, so this is the direction of travel and the only choice that'll allow consistency.
- Encouraging them and grouping them separately makes it easier to reason about a module's 3rd party dependencies.
Changelog: [Internal]
Reviewed By: robhogan
Differential Revision: D112803684
fbshipit-source-id: 40668d746a7151b3aa4800ff8af997902a18d198
Summary:
Pull Request resolved: https://github.com/react/react-native/pull/57421
UX polish: Refine RNDT desktop app with new menu items mapping to key features inside the DevTools UI, and add menu item icons (macOS 26+).
**New/changed menu items**
- **[New] File > Reload App** - Unify cmd+R logic — explicitly bound to "Reload App".
- **[New] File > Reload DevTools** - opt+R — reinstates above
- Note: Reloading and force-reloading the debugger-frontend's UI can also be done with cmd+R and cmd+shift+R *from a DevTools-on-DevTools window*.
- **[New] File > QuickOpen…**
- **[New] View > Command Palette…**
- **[Changed] View > Toggle Developer Tools** - Shown in debug builds only. Delete Reload and Force Reload items here (per above).
- **[New] Help > Keyboard Shortcuts**
- Simplify Edit menu options.
**Notes**
- Icons are configured on macOS 26+ only, and we've left the `{role: '<name>'}` icon templates alone (should be managed upstream in Electron, although today these icons are missing in some cases).
See https://github.com/electron/electron/issues/50609, https://github.com/electron/electron/issues/48909.
Changelog:
[General][Changed] - **React Native DevTools**: Expose new options in the app menu
Reviewed By: motiz88
Differential Revision: D94527813
fbshipit-source-id: e56a83c620efd2a2b41e3e7645a0fe987148de46
Summary:
Pull Request resolved: https://github.com/react/react-native/pull/57422
Upgrade from Electron 39.0.0 → 43.0.0.
Changelog: [Internal]
**Breaking changes from Electron 39.0.0 → 43.0.0:**
**Electron 40.0.0**
- Deprecated `clipboard` API access from renderer processes (use `contextBridge` from a preload script)
- macOS dSYM debug symbols now compressed with `tar.xz` (`dsym.zip` → `dsym.tar.xz`)
**Electron 41.0.0**
- PDFs no longer create a separate `WebContents` (now render in same WebContents via OOPIFs — use frame tree to detect)
- Cookie `'changed'` event has new causes: `inserted`, `inserted-no-change-overwrite`, `inserted-no-value-change-overwrite`
- Deprecated `showHiddenFiles` in dialogs on Linux (GTK removed the API)
**Electron 42.0.0**
- macOS notifications migrated from `NSUserNotification` to `UNNotification` API (requires code-signed app, else emits `failed` event)
- Offscreen rendering defaults to `1.0` device scale factor (use `webPreferences.offscreen.deviceScaleFactor` to override)
- `electron` npm package no longer downloads via `postinstall` (binary fetched on first `bin` run; `ELECTRON_SKIP_BINARY_DOWNLOAD` removed, use `ELECTRON_INSTALL_PLATFORM` / `ELECTRON_INSTALL_ARCH`)
- Removed `quotas` object from `Session.clearStorageData(options)`
**Electron 43.0.0-alpha.3**
- File downloads will open by default in the user's Downloads folder (or Home directory if Downloads doesn't exist)
Command run:
```
js1 upgrade electron --version 43.0.0-alpha.3
```
Reviewed By: robhogan
Differential Revision: D105587351
fbshipit-source-id: 80de51d5100dbbcd093a0aadcdd9d31591b4bb9f
Summary:
Pull Request resolved: https://github.com/react/react-native/pull/57310
Add `AppIcon.icon` file (Icon Composer) for macOS 26 Tahoe. Also rename previous `.icns` file for consistency.
`electron/packager` is updated to `^20.0.0` (`.icon` support was added in `18.4.0`).
**Notes**
- This change ensures the Icon Composer source is part of the codebase (following above Electron packager support which came in March).
Changelog:
[General][Changed] - **React Native DevTools**: Add macOS 26/27 app icon
Reviewed By: robhogan
Differential Revision: D97292364
fbshipit-source-id: ba1c34175a95da8c2860142d9db0c4d98d3f6de0
Summary:
Pull Request resolved: https://github.com/react/react-native/pull/57273
**Motivation**
A README is the first thing an npm visitor sees on each package; internal-repo boilerplate like the "Testing" sections and the "We're using yarn…" note doesn't belong on a published package page.
**Changes**
- Standardize every README: a `# react-native/<name>` heading, a user-facing description, and a blue version badge plus a green monthly-downloads badge.
- Keep the "internal dependency" prelude only on `community-cli-plugin`, `virtualized-lists`, and `js-polyfills`.
- Drop the monorepo-template "Testing" sections and yarn note.
- Rework `metro-config` around the Configuring Metro guide; add missing READMEs for `metro-babel-transformer` and `popup-menu-android`.
Changelog: [Internal]
Reviewed By: emily8rown
Differential Revision: D109017270
fbshipit-source-id: 6208294c4ad2e6235a6605ae54f22d730f0476e7
Summary:
Pull Request resolved: https://github.com/react/react-native/pull/57258
Reflecting the move to https://github.com/react/react-native , update references in first-party `package.json`s
The `repository.url` field in particular is load-bearing for Trusted Publish.
Changelog: [Internal]
___
Reviewed By: fabriziocucci
Differential Revision: D108986410
fbshipit-source-id: 78513ffefc32ddf417dc1479a4834ebc44240080
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/56706
Addresses an issue where on macOS, we briefly flashed the RNDT app icon in the Dock. (This has been raised to us recently by Expo.)
**More info**
The `unstable_prepareDebuggerShell` health check was spawning the Electron binary with `--version` after a successful `dotslash fetch`. Invoking the native binary causes the app icon flash.
- I couldn't find an Electron-side way to eliminate this (e.g. headless).
- DotSlash already performs mandatory verification of every fetched artifact. The additional `--version` spawn was therefore redundant/overkill.
Changelog:
[General][Fixed] - React Native DevTools will no longer briefly flash in the system dock/taskbar when starting Metro
Reviewed By: cortinico
Differential Revision: D104061238
fbshipit-source-id: 5baafbc9a452438bb6ddcfb584975cae12618e0c
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/56887
Drop support for Node.js 20. The minimum supported version is now `^22.13.0 || ^24.3.0 || >= 26.0.0`.
Node.js 20 reached end-of-life in April 2026 and is no longer actively maintained. This aligns React Native with the upcoming Metro requirement.
Changelog:
[General][Breaking] - Require Node.js >= 22.13.0
Reviewed By: christophpurrer, cortinico
Differential Revision: D105685641
fbshipit-source-id: f490e5a13e4289daba98c4d56dd8fdd341aef0db
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/55186
This is an AI-assisted change to align the Flow definitions for the `child_process` module with the Node.js docs as at v24.
**New v18+ Features:**
1. **AbortSignal Support** (v18.0.0) - Process cancellation
- Added `signal?: AbortSignal` option to all async functions (exec, execFile, fork, spawn)
- Enables cancellation of child processes using `AbortController`
- Example: `const controller = new AbortController(); spawn('cmd', [], {signal: controller.signal}); controller.abort();`
- https://nodejs.org/api/child_process.html#child_processexeccommand-options-callback
2. **Enhanced Process Properties** (v20.x)
- `spawnargs: Array<string>` - Full command-line arguments used to launch the process
- `spawnfile: string` - Executable file name of the child process
- `signalCode: string | null` - Signal that terminated the child process
- https://nodejs.org/api/child_process.html#subprocessspawnargs
**ChildProcess Class Updates:**
3. **Improved Property Types**
- `stdio` is now a properly typed tuple array with readonly modifier
- `channel` changed from `Object` to `mixed` for better type safety
4. **Enhanced Method Signatures**
- `kill(signal?: string | number): boolean` - Now returns boolean and accepts numeric signals
- `send()` overloads properly typed with `child_process$Serializable` messages
- `send()` accepts `keepOpen` option: `Readonly<{keepOpen?: boolean}>`
- https://nodejs.org/api/child_process.html#subprocesskillsignal
**Option Type Improvements:**
6. **Modern Readonly Syntax** - All input options use `Readonly<{...}>`
- `execOpts`, `execFileOpts`, `forkOpts`, `spawnOpts`, `spawnSyncOpts`, etc.
- Allows passing readonly types safely
7. **Enhanced Environment Variables**
- Changed `env?: Object` to `env?: {[key: string]: string | void}`
- More precise typing for environment variable dictionaries
8. **New Fork Options** (IPC enhancements)
- `serialization?: 'json' | 'advanced'` - IPC serialization format
- `killSignal` and `timeout` options added to fork
- https://nodejs.org/api/child_process.html#child_processforkmodulepath-args-options
9. **Enhanced Spawn Options**
- Added `killSignal`, `timeout`, `serialization` to `spawnOpts`
- Better consistency across all spawn functions
**Return Type Fixes:**
10. **spawnRet/spawnSyncRet** - Made fields properly nullable:
- `status: number | null` - null if process never exited
- `signal: string | null` - null if not terminated by signal
- `error: Error | void` - void if no error occurred
- Removed spread operator for exact types
**Helper Types:**
11. **`child_process$Serializable`** - Union type for IPC messages:
- `string | number | boolean | bigint | {...} | Array<mixed>`
- Used in send() method signatures
12. **`child_process$SendHandle`** - Type for handle passing:
- `net$Server | net$Socket`
- Used for passing server/socket handles to child processes
**References:**
- Node.js child_process module docs: https://nodejs.org/api/child_process.html
- AbortSignal integration: https://nodejs.org/api/child_process.html#child_processexeccommand-options-callback
Changelog: [Internal]
---
> Generated by [Confucius Code Assist (CCA)](https://www.internalfb.com/wiki/Confucius/Analect/Shared_Analects/Confucius_Code_Assist_(CCA)/)
[Confucius Session](https://www.internalfb.com/confucius?host=devvm45708.cln0.facebook.com&port=8086&tab=Chat&session_id=1a3aa26e-e5a9-11f0-8d47-71a4a90f0494&entry_name=Code+Assist), [Trace](https://www.internalfb.com/confucius?session_id=1a3aa26e-e5a9-11f0-8d47-71a4a90f0494&tab=Trace)
Reviewed By: vzaidman
Differential Revision: D89944331
fbshipit-source-id: 744ae04051c2214d97269c48c115060f5f30fb1f
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/55114
Our official [docs](https://reactnative.dev/docs/set-up-your-environment#node--watchman) require:
> Node 20.19.4 or newer
Currently, our `package.json#engines` fields express this as `"node": ">= 20.19.4"`
This is a bit imprecise because of Node's overlapping release lines - e.g. v24.0.0 is actually older than v20.19.4 (2025-07-15), and the whole v21 line was already EOL before v20.19.4.
The release *date* is relevant because Node.js frequently backports the most important updates - notably, `require(esm)` is already stable in Node 20.19 but is not unflagged in v22 until v22.12.
This makes the `package.json#engines` requirement truer to the documented requirement, dropping some old minors and EOL majors that prevent us using features included in v20.19.
Notably, `require(esm)` is stable and unflagged on all versions supported from this diff.
- v21 and v23 are EOL, so are dropped.
- v22.13 pre-dates 20.19.4 and is the first to have unflagged silent `require(esm)`
- v24.3.0 pre-dates 20.19.4 and is the first to unflag TS-stripping
- Support v25 and newer.
Changelog:
[General][Breaking] Drop support for EOL Node.js lines and old minors.
Reviewed By: cortinico, huntie
Differential Revision: D90467358
fbshipit-source-id: a5fdfb1b93a9d6cffe78eb6811ff7420ab906f44
Summary:
Use of `debug` was added in https://github.com/facebook/react-native/issues/54978 but never declared. This causes `react-native config` to fail in pnpm setups.
## Changelog:
[GENERAL] [FIXED] - Fixed missing dependency breaking `react-native config` in pnpm setups
Pull Request resolved: https://github.com/facebook/react-native/pull/55145
Test Plan: `yarn` in `xplat/js` didn't change any files
Reviewed By: cortinico
Differential Revision: D90589051
Pulled By: vzaidman
fbshipit-source-id: b53a46a9b034d385e64a72f85d29e63da02522d7
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/54978
There's a bug in Node.JS: https://github.com/nodejs/node/issues/51018 where spawning a process on Windows with detached mode and unref will not actually inherit stdio. You need to manually pipe these to get to see stdout and stderr. It works well on MacOS though.
Changelog: [Internal]
Reviewed By: robhogan
Differential Revision: D89765226
fbshipit-source-id: c330df6ed0dbb27b13df89cd2c544a821077dd3f
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/55047
Changelog: [Internal]
Fixed typos found through comprehensive recursive scan of the react-native-github directory.
**Fixed typos:**
1. "accomodate" → "accommodate" in CHANGELOG-0.6x.md
2. "occured" → "occurred" in LaunchUtils.js
3. "compatability" → "compatibility" in 7 Renderer files
4. "recieved" → "received" in PointerEvent test files (6 instances)
5. "seperated" → "separated" in ImageExample.js
**Total: 16 typo instances fixed across 10 files**
All typos were found by scanning ~3000 text files (excluding dist/third-party/node_modules) using pattern matching for common misspellings.
Reviewed By: javache
Differential Revision: D89799362
fbshipit-source-id: 73e9123dc0bae3c1ce8e374f4752404ab7345347
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/54929
There's a bug in Node.JS: https://github.com/nodejs/node/issues/51018 where spawning a process on Windows with detached mode and unref will not actually inherit stdio. You need to manually pipe these to get to see stdout and stderr. It works well on MacOS though.
Changelog: [Internal]
Reviewed By: huntie
Differential Revision: D88955169
fbshipit-source-id: cba661b13d8636d4d52122fe024f876300d4af1f
Summary:
### Motivation
Updates the shared JavaScript build setup to use the modern `publishConfig` convention.
This:
- Simplifies the build script.
- Makes the production values for `"exports"` more understandable in place (especially by separating from exports conditions).
- Prevents us from creating a dirty file state when running `yarn build`.
### Changes
- Add `publishConfig` to each `package.json` listing production `"exports"` targets.
- Add `scripts/build/prepack.js` script to action `publishConfig` (now on `npm pack`, `npm publish` exclusively).
- Remove `"exports"` rewriting (and un-rewriting safeguards) from build script.
**Note on `"prepack"`**
Slightly unfortunately, `publishConfig` doesn't work consistently between package managers currently, including npm — so this does not work implicitly (but may in future).
We're instead following `publishConfig` as a convention, and explicitly implementing a full copy (theoretically forking us towards pnpm and Yarn v4's approach).
However, I believe this is:
- Worthwhile, for the motivations above — and in particular being able to understand the final shape of `"exports"` (independent from the dimension of conditional exports, which may come into play later).
- Completely inspectable/maintainable as an explicit implementation (`scripts/build/prepack.js`).
Changelog: [Internal]
Pull Request resolved: https://github.com/facebook/react-native/pull/54857
Test Plan:
### CI
✅ GitHub Actions
### End-to-end release test script
(Note: Rebased on `0.83-stable` when tested)
```
yarn test-release-local -t "RNTestProject" -p "iOS" -c $GITHUB_TOKEN
```
{F1984106139}
✅ Test script runs `npm publish` on packages to a local proxy.
{F1984106146}
✅ Installed packages have `publishConfig` `"exports"` values applied
NOTE: ⬆️ This is **exactly** the same output as before.
{F1984106148}
✅ `/tmp/RNTestProject` runs using built + proxy-published + proxy-installed packages
Reviewed By: cipolleschi
Differential Revision: D88963450
Pulled By: huntie
fbshipit-source-id: f328252cf93a1f1039b79d7f369d1e6e7e5b4b52
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/54528
Changelog: [Internal]
Currently, `DefaultBrowserLauncher.js` holds arguments configuring how the debugger shell is launched. Instead, move some of them downstream, and make `DefaultBrowserLauncher.js` use the defaults.
Reviewed By: motiz88
Differential Revision: D86772692
fbshipit-source-id: 826bb6236dc3cba3c4b0d455aebf3f81c4e8ed6f
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/54756
Move blanket `packages/**/dist/` rule added in D77591742 into scoped `.gitignore` for `debugger-shell`.
This was preventing new files added to `packages/debugger-frontend/dist/` from being staged.
Changelog: [Internal]
Reviewed By: cortinico
Differential Revision: D88172611
fbshipit-source-id: 428fffd46f5f76ddf422a41b57e7b47446c40e43
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/54009
Packages haven't been bumped on main ahead of 0.83. This takes care of it.
Changelog:
[Internal] [Changed] -
Reviewed By: cipolleschi, huntie
Differential Revision: D83580515
fbshipit-source-id: 7471e77f74e3fb3b4ee6538a49369b5df1393098
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/53878
Changelog: [Internal]
Adds the `prebuiltBinaryPath` option to `unstable_spawnDebuggerShellWithArgs` and `unstable_prepareDebuggerShell`, for advanced integrations that need to change how the React Native DevTools prebuilt binary is distributed.
Reviewed By: huntie
Differential Revision: D82956699
fbshipit-source-id: 30f9c461c7d8f22a553f278bbe42b86742c98da7
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/53816
Changelog: [Internal]
D82236159 introduced the first `node_modules` dependency in the Electron part of `react-native/debugger-shell`. This is not currently handled correctly by the build script, so this resulted in an instacrashing binary.
I'm temporarily backing out D82236159 until we have a proper fix for the build script.
Reviewed By: robhogan
Differential Revision: D82632937
fbshipit-source-id: 6c7c182e2a7c89e6ea2761096dcc426dbf2ae5cb