Summary:
XCode 26 introduces building explicit swift modules turned on (SWIFT_ENABLE_EXPLICIT_MODULES). This breaks building with precompiled binaries.
This commit fixes this by adding a step when not building from source where we explicitly set the `SWIFT_ENABLE_EXPLICIT_MODULES` flag to `NO`.
## Changelog:
[IOS] [FIXED] - Added setting SWIFT_ENABLE_EXPLICIT_MODULES=NO when using precompiled to support Xcode 26
Pull Request resolved: https://github.com/facebook/react-native/pull/53457
Test Plan:
```bash
npx react-native-community/cli init MyApp --version nightly --skip-install
cd MyApp
yarn
cd ios
bundle install
RCT_USE_RN_DEP=1 RCT_USE_PREBUILT_RNCORE=1 bundle exec pod install
```
Build above app with Xcode 26 and verify that it no longer fails
Reviewed By: motiz88
Differential Revision: D81025367
Pulled By: cipolleschi
fbshipit-source-id: 1db7c4d7de07d62f43b355aa784d7d9de478023c
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/53345
Changelog: [Internal] - Introduce hysteresis window that is nested between the prerender and hidden window sizes. Currently set to enlargening the prerender window by hysteresis ratio
When a VirtualView intersects with the hysteresis window, it mode remains unchanged.
This prevents us dispatch mode changes for things like overscroll.
I put the hysteresis between prerender and hidden because we already avoid dispatching mode changes from visible -> prerender. For prerender -> visible, we use renderState
Reviewed By: yungsters
Differential Revision: D80511627
fbshipit-source-id: cd14256abc898e7120705e277147d52a06c865a9
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/53424
Use the namespaced version of these macros to avoid symbol conflicts when multiple instances of `PERFETTO_DEFINE_CATEGORIES` are in the same binary.
The current macro is effectively deprecated: https://github.com/a6f/perfetto_protos/blob/master/CHANGELOG#L691-L696
Changelog: [Internal]
Reviewed By: rshest
Differential Revision: D80697205
fbshipit-source-id: 713fec4d41137ddd2f025c7e7130dc44c5a3a656
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/53426
Experiment review for this was completed internally, and we can now change the default behaviour to no longer allocate an intermediate folly::dynamic when parsing props.
RawValue will continue supporting a folly::dynamic constructor as some paths go through code path (eg animations)
There should be no user-visible difference in parsing behaviour.
Changelog: [Internal]
Reviewed By: rshest
Differential Revision: D80799833
fbshipit-source-id: 8eeae656157757eb38f69a2af14409da23b510c8
Summary:
The `react-native/metro-config` peer was added in https://github.com/facebook/react-native/commit/fe2bcbf4ba7ce983fac0cd09727c165517b6337f / https://github.com/facebook/react-native/issues/51836 by robhogan
Side-note: It's pulled in via `react-native/community-cli-plugin` which is a direct dependency of `react-native` for the `scripts/bundle.js` script. While, for expo, we'd love to find a way to make this an optional dependency (to avoid excessive deps that `expo` replaces otherwise), for now, it's a direct dependency.
The problem here is that this isn't optional, which means:
- with auto-installing peer dependencies it is directly fulfilled (while `react-native-community/cli` is already marked as optional and skipped)
- with legacy/non-auto peer-dependencies it is flagged as missing, but in an Expo project it wouldn't make sense to install directly
This causes a **package manager regression in the form of either a peer dependency warning**, that shouldn't be fulfilled in an Expo project, or (in the best case scenario) pulls in dependencies [that a user does not need](https://npmgraph.js.org/?q=%40react-native%2Fmetro-config#zoom=w&select=exact%3A%40react-native%2Fmetro-config%400.81.0).
An error message is already in place to inform the user of this being missing when it's not installed, so marking it as optional seems appropriate.
## Changelog:
[INTERNAL] [FIXED] Mark added `react-native/metro-config` peer dependency as optional
<!-- Help reviewers and the release process by writing your own changelog entry.
Pick one each for the category and type tags:
[ANDROID|GENERAL|IOS|INTERNAL] [BREAKING|ADDED|CHANGED|DEPRECATED|REMOVED|FIXED|SECURITY] - Message
For more details, see:
https://reactnative.dev/contributing/changelogs-in-pull-requests
Pull Request resolved: https://github.com/facebook/react-native/pull/53314
Test Plan:
Warnings like the following won't occur in fresh Expo (54/preview/`next`) projects
```
warning "workspace-aggregator-484d9ec3-587b-43cb-97de-4dcce3876578 > microfoam-mobile > react-native > react-native/community-cli-plugin@0.81.0" has unmet peer dependency "react-native/metro-config@*".
```
Reviewed By: cortinico
Differential Revision: D80450287
Pulled By: robhogan
fbshipit-source-id: c622fd4c24025676c0ec74de826f863f1e291669
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/53395
# Changelog
[Internal] -
This enables view recycling for both ScrollView and HorizontalScrollView on Android.
The feature is gated by the corresponding RN feature flag, `enableViewRecyclingForScrollView` (which is false by default for now, will be enabled in an experiment).
Reviewed By: lenaic
Differential Revision: D80611087
fbshipit-source-id: b3026affc0ea61bc7739126d6529c83f2a653183
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/53403
This code is Legacy and totally unused. It should be safe to remove it altogether.
This class is public but no one is using it in OSS + no one should be using it, so I don't think we'll need the full deprecation cycle for it.
Changelog:
[Android] [Removed] - Removed unused `Inspector` public class from React Android
Reviewed By: cipolleschi
Differential Revision: D80711515
fbshipit-source-id: 83134851877fcbccd50f7a5b75b2ab8906b3416a
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/53420
# Changelog: [Internal]
HostRuntimeBinding owns a connection, which is stored as a session on HostTarget, so we need to release it first in order to satifsy the assertion in the destructor.
Reviewed By: huntie
Differential Revision: D80778273
fbshipit-source-id: be7bf085fadd8808fd5e5c621c3990a5e7e0186d
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/53416
# Changelog: [Internal]
Creates methods on Bridgeless Android Host for starting / stopping tracing and implements logic for storing the recording that will be transferred to `jsinspector-modern` stack via HostTargetDelegate when CDP session is created.
Reviewed By: sbuggay
Differential Revision: D79725161
fbshipit-source-id: f3e3b39f6d94a6548cf227394f7328f6913c33e4
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/53078
# Changelog: [Internal]
When CDP session is created via `HostTarget::connect`, it will ask `HostTargetDelegate` is there is a previously recorded trace that Host wants to display in the Frontend.
`TracingAgent` will serialize and send the recording at the initialization time in constructor.
Reviewed By: huntie
Differential Revision: D79672597
fbshipit-source-id: 241c9d367ab65ef1e95c62d5025b3bc14bf42608
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/53407
Changelog: [Internal]
## Context
Upon receiving a launch command, the RNDT shell either:
1. Creates a new window and navigates to the requested frontend URL.
2. Brings an existing window to the foreground *with no further navigation*.
In the happy path, (2) is a pretty nice experience: it preserves all prior UI state in the frontend and leaves the user with an instantly responsive debugger - this can be quite a bit faster than (1) because of the overhead of loading and parsing source maps for example. However, this breaks down if the frontend is not in a usable state to begin with. This is, sadly, a frequent-enough occurrence that we must account for it: the CDP connection may have been lost, the frontend app itself might have failed to load the last time, etc.
Preserving everything that's nice about (2) while also making it fully reliable - incrementally bringing the frontend to the state specified by a new URL - would require delicate engineering across the shell and frontend codebases, which is an amount of complexity I would like to sidestep for now.
NOTE: The more complex solution **is 100% worth implementing in the long term,** as it has tangible benefits for the user, and matches Chrome best.
## This diff
Here we take a much cheaper approach than the one described above: the shell will *always* initiate navigation to the new frontend URL, regardless of whether it does so in a new window or a previously opened one. This will consistently bring the user to a state where the frontend is open and working (although it will reset any ephemeral UI state in the process, and typically take a noticeable amount of time to load).
Even with this simplified approach, the standalone shell still offers a better experience than launching in a browser (if only because it is zero-install and avoids the "dead tab spam" problem).
Reviewed By: huntie
Differential Revision: D80711185
fbshipit-source-id: 8f376ccf1717c48a1742c798da3171ac6d2f8af0
Summary:
After fixing an isssue with ReactnativeDependencies and how it built symbols (https://github.com/facebook/react-native/issues/53353) this commit will align the output of the Symbols folder for the two frameworks.
Previously we had an output in the Symbols folder that looked like this (from a local build on my machine)
- catalyst
- iphone
- iphonesimulator
After this we now have the more correct arcitecture names on these folders:
- ios-arm64
- ios-arm64_x86_64-simulator
- ios-arm64_x86_64-maccatalyst
This is in line with how the ReactNativeDependencies Symbol folder is set up.
## Changelog:
[IOS] [FIXED] - Aligned Symbols folder in React.xcframework symbols with ReactNativeDependencies.xcframework symbols.
Pull Request resolved: https://github.com/facebook/react-native/pull/53354
Test Plan: Nightlies
Reviewed By: cortinico
Differential Revision: D80692098
Pulled By: cipolleschi
fbshipit-source-id: e952b087d5dbdeb929b45d9e6d3d7e077c9d05cc
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/53400
In D79329081, we accidentally hardcoded the `landingView` parameter in the default Dev Menu handler to open React Native DevTools. Reset this.
Changelog: [Internal]
Reviewed By: hoxyq
Differential Revision: D80710487
fbshipit-source-id: 9066ffafcb17a6ff46650f7081d9a662f186d995
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/53394
# Changelog:
[Internal] -
This just fixes a linter warning I noticed when working on related code.
Reviewed By: cortinico
Differential Revision: D80702545
fbshipit-source-id: fecfed9e9946b971864706306b03b57cd3111aee
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/52911
Add a new `deleteProperty` API to JSI. As the name implies, allows users
to delete properties from Objects through JSI.
The default implementation uses `Reflect.deleteProperty.` For the
`PropNameID` overload, convert the propNameID to a String and pass into
the `deleteProperty` function.
Changelog: [Internal]
Reviewed By: dannysu
Differential Revision: D79120814
fbshipit-source-id: e30f383247d94bb5971e4909f004c75e8165adda
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/53412
Changelog:
[General][Internal] - Encapsulated internal class into anonymous namespace to ensure no collisions with public symbols.
Differential Revision: D80689084
fbshipit-source-id: 53ebd8a16a3c217efead0bfe91f66bd50bb6dd2f
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/53411
# Changelog: [Internal]
This regressed after D80263154, when we introduced a local struct for PerforamanceTracerEvent.
We should use id of the thread where event was captured (registered), not where the transform to TraceEvent happened.
This makes sure that events like Event Loop tick or Microtasks phase tick are correctly point to JavaScript thread, not the thread where the transform could've taken place.
Reviewed By: sbuggay
Differential Revision: D80728931
fbshipit-source-id: d3af16e68adece9ebc37368fec2b8a17c1293b4b
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/53409
This interface is public and is part of Legacy Architecture.
Having this interface as `public` was a mistake, as users can't really do much with it.
There is only one old library that is going to be affected by this change:
https://github.com/spoke-ph/react-native-threads
The library appears unmaintained since RN 0.69 + no NewArch support so I won't consider this a breaking change
given this will land in 0.82.
I'm making it internal so we can remove it more easily later.
Changelog:
[Android] [Changed] - Make OnBatchCompleteListener interface internal
Differential Revision: D80715625
fbshipit-source-id: 94fe80eeba95222deab7ca89c5fcafca8fcee0b7
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/53404
This interface is part of Legacy Architecture. No one is using it either internally or externally,
so it's safe to remove now. Interface was also `internal` so this is not a breaking change.
Changelog:
[Internal] [Changed] -
Reviewed By: mdvacca
Differential Revision: D80714721
fbshipit-source-id: 82cc6152af7d7980119d2eda704ae50d8e81fd2b
Summary:
Changelog: [GENERAL] [FIXED] - Fixed babel plugin validation error when coverage instrumentation is enabled
Pull Request resolved: https://github.com/facebook/react-native/pull/53381
### Problem
[Workplace post](https://fb.workplace.com/groups/235694244595999/permalink/1278937163605030/)
React Native tests were failing **only when coverage collection was enabled** with the error:
`'Commands' is a reserved export and may only be used to export the result of codegenNativeCommands.`
### Root Cause
The React Native Babel plugin's `codegenNativeCommands` validation logic only handled direct `CallExpression` AST nodes. When coverage instrumentation was enabled, it transformed:
**Normal code:**
`export const Commands = codegenNativeCommands<NativeCommands>({...})`
**With coverage:**
`export const Commands = (cov_xxx().s[0]++, codegenNativeCommands<NativeCommands>({...}))`
The plugin failed to recognize the valid `codegenNativeCommands` call wrapped in a `SequenceExpression` by coverage instrumentation.
### **Solution**
Added `isCodegenNativeCommandsDeclaration` function to handle:
1. **Coverage instrumentation**: `SequenceExpression` nodes containing the function call
2. **Flow type casts**: `TypeCastExpression` and `AsExpression`
3. **TypeScript assertions**: `TSAsExpression`
4. **Direct calls**: Original `CallExpression` (backward compatibility)
Reviewed By: andrewdacenko
Differential Revision: D80572666
fbshipit-source-id: 465f4312a0229d8a92e495c685f46b607ce326e4
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/53398
ReactNativeHost is a legacy architecture class.
This migrates the app away from it and converts it to use DefaultReactHost instead.
Changelog:
[Internal] [Changed] -
Reviewed By: mdvacca
Differential Revision: D80708460
fbshipit-source-id: 7d88c440414c979a2968fc9c910e828f5851195c
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/53396
This overload for `getDefaultReactHost` is missing the last 2 parameters
and provides the same default as the full method.
In OSS is unused as we used the one with `ReactNativeHost`.
I'm removing it as it's causing an overload resolution failure internally.
This won't be a breaking change for Kotlin users are the signatures are compatibles,
but it will be breaking for Java users. I've verified that there are no OSS users.
Developers should use Kotlin default parameters + the method `getDefaultReactHost()`
with all the params + defaults for ease of use of this API.
Changelog:
[Android] [Removed] - Delete unused `DefaultReactHost.getDefaultReactHost()` overload
Reviewed By: mdvacca
Differential Revision: D80704987
fbshipit-source-id: 0b3a61aad3f18cde77bac78e3ba413d7f9166ede
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/53406
The `ReactNativeJNISoLoader` class (previously called BridgeSoLoader)
is actually a Legacy Architecture class.
However is used by `CxxModuleWrapperBase` which is needed by interop, so we need to keep it around.
I'm adding the annotation so we won't forget about it.
Changelog:
[Internal] [Changed] -
Reviewed By: cipolleschi
Differential Revision: D80710951
fbshipit-source-id: ed353e2b14c742b25962f0b81beba6dc90157709
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/53408
This class is internal + legacy arch so can safely be removed now.
I've replaced the throw/catch site with the superclass of this exception.
Changelog:
[Internal] [Changed] -
Reviewed By: mdvacca
Differential Revision: D80710950
fbshipit-source-id: 96615835588ce409de40d31ee83b82c88d3a07a0
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/53372
We verified that those feature flags are not regressing the experience + we got confirmation from Software Mansion that the fix
is effectively mitigating the regression on Android mounting.
Hence we can ship this to production.
Fixes: https://github.com/facebook/react-native/issues/51869
Changelog:
[Android] [Fixed] - Fix mounting is very slow on Android by shipping native transform optimizations
Reviewed By: javache
Differential Revision: D80624739
fbshipit-source-id: 2e185434f08b5ea0339d59a6ea006017e5abeff2
Summary:
This is a reland of D80622058 + D80623826 + fixes for all the apps.
This method was deprecated in React Native 0.79. We should be able to remove it without impact in 0.82.
I also verified that there are no users of this API in OSS.
There is also a 1:1 replacement for this API which is the other non-deprecated `getDefaultReactHost()` method.
bypass-github-export-checks
Changelog:
[Internal] - Skipping changelog as main already contains a changelog entry
Reviewed By: javache
Differential Revision: D80704320
fbshipit-source-id: c9aa26b83dbd9f4bf97d0a9e9c6dcaa6eb0afdca
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/53391
Changelog: [internal]
Some mount items dispatched to Fabric don't have an associated surface ID (they use -1), which causes some log spam when we try to validate that the surface ID exist when we report mount for those surfaces.
This checks if the surface ID has a valid surface ID before adding it to the list of surfaces to report mount.
Reviewed By: rshest
Differential Revision: D80698363
fbshipit-source-id: 63dc13d53b8bbc2742171b1f444c80ce867e2351
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/53387
This interface was internal and legacy arch only, so it can safely be removed.
I've also removed the logic inside `ReactInstanceManager` that was using it as no longer necessary.
Changelog:
[Internal] [Changed] -
Reviewed By: mdvacca
Differential Revision: D80626639
fbshipit-source-id: b173e71b92e29cebbfc5ed589e01ac295eda2bf0
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/53388
This method is deprecated and should not be invoked in NewArch, therefore I'm deprecating it now.
Changelog:
[Android] [Deprecated] - Deprecate `BridgelessReactContext.getCatalystInstance()` method
Reviewed By: cipolleschi
Differential Revision: D80626638
fbshipit-source-id: d4ed26021c376f54c732154c153bf60fea2bf5e3
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/53384
Occasionally, the `preparePrefab` task might run before other tasks that
are responsible of populating the 3p headers, such as `prepareNative3pDependencies`.
This was evident in the latest nightly which is missing the fast_float headers in the
Android prefab.
Adding a dependsOn fixes it.
Changelog:
[Internal] [Changed] -
Reviewed By: cipolleschi
Differential Revision: D80695212
fbshipit-source-id: 6e0dd17e5cf8c33d14812e5cb8fdc8b800897816