Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/47329
Downgrading from fatal (introduced in D63148523). It's not yet clear why this is firing, and may point at deeper underlying issues, as the re-ordering we do in `disableMountItemReorderingAndroid` only occurs at a later point in `FabricMountingManager`.
Changelog: [Internal]
Reviewed By: sammy-SC
Differential Revision: D65267936
fbshipit-source-id: cb32b149a77c9e5a3ac6350baaeae9c7215df01b
Summary:
This pr is part of issue https://github.com/facebook/react-native/issues/46757 solving a task - [ME2E0008] [ME2E0009]
- Set up a test
- Starts the app
- Scrolls until flatlist is visilbe and clicks on flatlist
- Click basic button
- Scroll down until item 600 is visible
## Changelog:
[Internal] [Added] - Add e2e-test logic that click button & scroll down until specific item is visible
Pull Request resolved: https://github.com/facebook/react-native/pull/46804
Test Plan:
### Test Locally
- iOS
```bash
yarn install
cd packages/rn-tester
yarn e2e-build-ios
```
- Android
```bash
yarn install
cd packages/rn-tester
yarn e2e-build-android
```
### Start Maestro
- iOS
```bash
cd packages/rn-tester
yarn e2e-test-ios
```
- Android
```
cd packages/rn-tester
yarn e2e-test-android
```
### Test in CI
To test in CI, just add a comment on your PR with the text:
```
/test-e2e
```
Reviewed By: cortinico
Differential Revision: D63829274
Pulled By: cipolleschi
fbshipit-source-id: f7b4342ed353a48123f87dcfd8d503009f65637c
Summary:
This pull request fixes a style bug in the AnsiHighlight component when the application is in Right-To-Left (RTL) mode. The adjustments ensure that text highlighting is visually consistent and functions properly across all layout modes.
### Before
| Android RTL | iOS RTL | Android LTR | iOS LTR |
|----------|----------|----------|----------|
|  |  |  |  |
### After
| Android RTL | iOS RTL | Android LTR | iOS LTR |
|----------|----------|----------|----------|
|  |  |  |  |
## Changelog:
[GENERAL] [Fixed] - AnsiHighlight style in RTL layout
<!-- 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/47230
Test Plan:
To test the changes, open LogBox while the app is in RTL mode. The modifications ensure that any error messages display correctly. I have verified that the changes function properly in both LTR and RTL modes, and all existing functionality remains unaffected.
This is an example component to throw an error to show LogBox.
```tsx
import React from 'react';
import {Alert, Button, I18nManager, StyleSheet, Text, View} from 'react-native';
function SampleError() {
return (
<View>
<Button
title="Change to RTL"
onPress={() => {
I18nManager.allowRTL(true);
I18nManager.forceRTL(true);
Alert.alert('Restart app to apply changes');
}}
/>
<Button
title="Change to LTR"
onPress={() => {
I18nManager.allowRTL(false);
I18nManager.forceRTL(false);
Alert.alert('Restart app to apply changes');
}}
/>
<Text style={styles.text}>
isRTL: {I18nManager.isRTL ? 'true' : 'false'}
</Text>
<Button
title="Show Error"
onPress={() => {
console.error('sample خطا');
}}
/>
</View>
);
}
const styles = StyleSheet.create({
text: {
fontSize: 24,
textAlign: 'center',
paddingVertical: 20,
},
});
export default SampleError;
```
Reviewed By: sammy-SC
Differential Revision: D65145991
Pulled By: NickGerleman
fbshipit-source-id: cbca106813e587ed223be48b75ee5279072c2da0
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/47322
Changelog: [Internal]
these callsites were causing crashes in new bridgeless integrations, it appears they are not used, so cleaning up. after this, we can remove all callsites that insert ReactNativeConfig to the contextContainer.
Reviewed By: javache
Differential Revision: D65191733
fbshipit-source-id: 94e694ef27249773c2a39bd77f316f8f5cc2b1fb
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/47321
Changelog: [Internal]
this seems to be the last callsite where we read the ReactNativeConfig from the contextContainer. i don't think this killswitch should block cleanup of the ReactNativeConfig, so maybe we can just remove this?
Reviewed By: cortinico
Differential Revision: D65192744
fbshipit-source-id: d8b595edb6fecce05e67abc257d98805daa16a9a
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/47313
We're going to fix up a bunch of designated initializers. `RCTSurfaceHostingProxyRootView` is particularly problematic because different initializers will do different things even though reading the code it looks like they should be equivalent. Remove the encapsulated "start" to the provided "surface", and require it to be explicit at the callsite.
## Changelog:
[iOS][Changed] - `RCTSurfaceHostingProxyRootView` no longer has different behavior (whether it calls `start` on the provided *surface*) depending on which initializer is used. Call `start` yourself on the *surface* instead.
Reviewed By: cipolleschi
Differential Revision: D65214656
fbshipit-source-id: 179d5220d4f866b4452561e1bb6e2051020c8a11
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/47297
In this diff I'm proposing to remove configuration for RCTConstants.RCTGetMemoryPressureUnloadLevel API in iOS
changelog: [iOS][Breaking] Delete experimental API RCTConstants.RCTGetMemoryPressureUnloadLevel
Reviewed By: rubennorte, philIip
Differential Revision: D65181556
fbshipit-source-id: c435bec6ed03562b53f1924add7b69ab517b190b
Summary:
This PR introduces `RCTArchConfiguratorProtocol` for better separation of concerns inside of RCTAppDelegate.
It's also a prerequisite for https://github.com/facebook/react-native/issues/46298
Discussed with cipolleschi
## Changelog:
[IOS] [ADDED] - introduce RCTArchConfiguratorProtocol
Pull Request resolved: https://github.com/facebook/react-native/pull/47306
Test Plan:
- CI Green
- Test if methods can be overriden
Reviewed By: realsoelynn
Differential Revision: D65212703
Pulled By: cipolleschi
fbshipit-source-id: 9850fec31c421f0c6230e7e23d7a208d823d828f
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/47302
changelog: [internal]
The original cancellation logic cancelled image request when RCTImageComponentView was recycled but the image request was never resumed.
So in case the request was cancelled and later the same shadow node representing the image view was showed, the image request was never fulfilled and it stayed blank. It entered invalid state from where it would never recover. The image would go from state: Loading -> Cancelled and Cancelled is terminal state.
This diff adds a "resume" mechanism. If image goes from Loading -> Cancelled and something subscribes to the image state, the image request will be started again.
So we can go from Loading -> Cancelled -> Loading -> Completed.
This diff also moves the resume/cancel mechanism to ImageResponseObserverCoordinator. Where we can observe if anything is observing result of the image response.
Even though this case was highly unlikely, with <Activity /> component in React Native, it may occur.
Reviewed By: lyahdav
Differential Revision: D65149804
fbshipit-source-id: d59c1793785a367bb92602f6438666fa53db4ceb
Summary:
in the `image component`, add the ts definition with the `resizeMethod` attribute value as `none`.
## Changelog:
[Android][Fixed] - the definition of ts of resizeMethod attribute is none.
Pull Request resolved: https://github.com/facebook/react-native/pull/47227
Test Plan: <img width="579" alt="image" src="https://github.com/user-attachments/assets/e91dc47a-22c4-4d47-a4c2-6497d47cb842">
Reviewed By: javache
Differential Revision: D65058737
Pulled By: Abbondanzo
fbshipit-source-id: a077e4e4786a72ebffaf0698217809b1e7fde226
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/47241
Changelog: [internal]
The options for the internal constructor of `PerformanceMeasure` shouldn't be optional. This just cleans that up.
Reviewed By: rshest
Differential Revision: D64480048
fbshipit-source-id: d0275276b11bd329aa2e4667646c67608d562299
Summary:
This PR introduces `RCTUIConfiguratorProtocol` for better separation of concerns inside of RCTAppDelegate.
It's also a prerequisite for https://github.com/facebook/react-native/issues/46298
Discussed with cipolleschi
## Changelog:
[IOS] [ADDED] - introduce RCTUIConfiguratorProtocol
Pull Request resolved: https://github.com/facebook/react-native/pull/47139
Test Plan:
- CI Green
- Test if methods can be overriden
Reviewed By: blakef
Differential Revision: D65063839
Pulled By: cipolleschi
fbshipit-source-id: b63766e245d57f369ab94bd8047d5de9a3447b3e
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/47271
Let's keep the recent goals of centering (instead of arbitrary prioritizing ascent), ala spec, and make some changes to allow overlapping interior line-boxes, and make the implementation a lot simpler, instead of the cruft it has been accumulating.
The new simple versions is implemented as the only `CustomLineHeightSpan`. This replaces the code used when `enableAndroidLineHeightCentering` is enabled (which is now the default).
Legacy path is renamed to `LegacyLineHeightSpan`, slated to be deleted if rollout goes well.
We cannot yet cause text to overflow the bounds of the underlying TextView until potentially large later work related to ReactTextView reimplementation.
There's a somewhat arbitrary choice here, when rounding, to whether we ceil ascent vs descent when pixels don't evenly split. This does result in a visual difference, and for sake of avoiding breakage of screenshots, I left the same choice as before.
Changelog:
[Android][Fixed] - Reimplement Android lineHeight positioning/determination
Reviewed By: javache
Differential Revision: D64716557
fbshipit-source-id: 5a947377df7cfee9dff4484c840939f527caf94b
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/47270
Lets add some screenshot tests, along with one more example, and fixing some silly typos in test IDs.
Changelog: [Internal]
Reviewed By: javache
Differential Revision: D65094482
fbshipit-source-id: a5f3e06c4737158bf6419364d05668c3feb1bd5e
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/47282
D63318754 fixed a class of issues with RTL horizontal scrollviews by moving logic from native Android view layer to Fabric ShadowNode layer.
I realized quite a bit later this is problematic for legacy arch, since it now never runs RTL translation code, and all our RTL screenshot tests are against new arch.
It's tricky to port Fabric ShadowNode related code to Paper since its shadownodes are more coupled to Yoga nodes, and the existing solution for contextual layout direction didn't quite work, so I went with the original logic we had for this, where we use global layout direction to determine whether to offset, and disable removeClippedSubviews, and this is applied via onLayout. This is wrong in several ways, but not a regression compared to previous legacy arch behavior. The fully correct behavior will require new arch.
Changelog:
[Android][Fixed] - Fix legacy arch RTL horizontal ScrollView regression
Reviewed By: rshest
Differential Revision: D65139747
fbshipit-source-id: 5662c0744c3c402efe583e602b2272662b4d5476
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/47280
Noticed in the screenshots of https://github.com/facebook/react-native/pull/47230 that Android's logic of setting scroll content origin to zero, then right aligning scroll offset, won't correctly handle case where content is smaller than scrolling container. We can fix that by only resetting the origin when content overflows container, since we otherwise are not scrollable, and scroll adjustment will not translate.
Changelog:
[Android][Fixed] - Fix RTL ScrollView position when content smaller than container
Reviewed By: rshest
Differential Revision: D65136654
fbshipit-source-id: 2818ff6360cbfac64d7e57bdcbbe8c0a9b4bbb97
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/47284
If the surface hasn't been set up yet, attempting to fetch the ReactRootView will throw a null reference exception. Since the result is already nullable, it's perhaps better to just return null when the surface has not yet been initialized.
## Changelog
[Android][Fixed] Avoid null reference exception in bridgeless ReactDelegate
Reviewed By: javache
Differential Revision: D65141137
fbshipit-source-id: 9b002b0520a7eeea61767cb8934e9bb8d049fc6a
Summary:
## Changes
If the c++ pipeline is active:
If someone calls console.error:
- The c++ pipeline will report it as a soft error
If someone reports an error:
- The c++ pipeline will log it via console.error
Changelog: [Internal]
Reviewed By: javache
Differential Revision: D64506069
fbshipit-source-id: 293cd1774f19ee03d7eb61572b7b1f03a47a4756
Summary:
Now, all ios apps will just be integrated with the c++ error reporting pipeline, with zero configuration.
Changelog: [Internal]
Reviewed By: javache, philIip
Differential Revision: D64615457
fbshipit-source-id: db9d98115238d9a42563e39a4780234a9bc3c034
Summary:
Fixes https://github.com/facebook/react-native/issues/46908
The `justificationMode` is not set for multiline text without unicode characters with known width on both architectures. This caused the issue of drawing additional empty line at the end of `TextView` because Yoga thought that text takes 5 lines and falsely calculated it's height.
Currently, on the old architecture, the `justificationMode` is set only on text that is not boring (contains unicode characters) with unknown width. I am not sure why is that, so I am opening this as a draft for now as I am still checking if it doesn't break anything.
## Changelog:
<!-- 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
-->
[ANDROID] [FIXED] - fix generating empty line at the end of multiline text view when `textAlign` is set to `justify`
Pull Request resolved: https://github.com/facebook/react-native/pull/47122
Test Plan: I've tested on both architectures on repro provided in the issue.
Reviewed By: javache
Differential Revision: D65002386
Pulled By: NickGerleman
fbshipit-source-id: 0187956c88e6eb1e637c24e82b3052cc82581a64
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/47232
changelog: [internal]
TouchEventEmitter APIs take ownership of TouchEvent and PointerEvent, the use of const & qualifiers is misleading and may lead it unnecessary copy.
Reviewed By: rubennorte
Differential Revision: D65040506
fbshipit-source-id: 941e2eab6a057e31066751e26387604858f03e51
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/47265
Changelog: [iOS][Breaking]
This was originally landed before as part of the effort to coalesce configurations with the feature flag infra, but got reverted due to a build issue. I'm pretty sure it was just because the legacy configuration methods were not cleaned up from the header (RCTConstants.h). I fixed that here.
Reviewed By: javache
Differential Revision: D65092536
fbshipit-source-id: 5012ba54b0314c487f2ef488c2eb30a3c4133cb5
Summary:
This PR adds an example showcasing a TextInput whose width gets resized dynamically based on the text content width.
This example was added for this PR, which tries to address a flickering bug with dynamic sized TextInputs:
- https://github.com/facebook/react-native/pull/46973
## Changelog:
<!-- 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
-->
[INTERNAL] [ADDED] Added dynamic content width TextInput example
Pull Request resolved: https://github.com/facebook/react-native/pull/46976
Test Plan:
Test in RNTester app:
https://github.com/user-attachments/assets/7571b80b-7035-47df-b840-4218ab0802b5
Reviewed By: NickGerleman
Differential Revision: D64271454
Pulled By: arushikesarwani94
fbshipit-source-id: 28fe7bd93891ffe5284340d73e9ee947654f1788
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/47291
Changelog: [internal]
Small devx improvement to distinguish problems caused by calling `IntersectionObserver.observe` with null or undefined, vs. other values not supported by the API (like legacy refs).
Differential Revision: D65150750
fbshipit-source-id: b9452ff19d35ccd0dc2d47ee2d5a0e933e0ae180
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/47249
- It is likely that Dialog is being dismissed from an invalid state causing an exception
- apply similar changes from D63712422 which is to add try/catch around and ignore the exception as we are dismissing the dialog anyway
Changelog: [Internal]
Reviewed By: javache
Differential Revision: D65066186
fbshipit-source-id: 03ebbc3fec3adf6100e36ea38b43f410d98a5297
Summary:
The `XMLHttpRequest` example with a single file download doesn't seem to be working anymore. The test case is quite old so it seems like something changed in between with the example URLs.
- Changing the URL for the example. Using another file from `filesamples.com` as it's already being used in the chunk file download example as well.
- Adding an `onerror` callback as it was loading infinitely when something went wrong.
## Changelog:
[INTERNAL] [FIXED] - fixing `XMLHttpRequest` file download example
Pull Request resolved: https://github.com/facebook/react-native/pull/47152
Test Plan:
Using the `rn-tester`, see the before and after for comparison
<details>
<summary>Before and after videos</summary>
**Before**:
https://github.com/user-attachments/assets/01f89cd9-0f5e-4ddb-9ff2-c3e053be5413
**After**:
https://github.com/user-attachments/assets/59ef161c-d5ba-43e3-827e-e250cc663276
</details>
Reviewed By: cipolleschi
Differential Revision: D65126952
Pulled By: NickGerleman
fbshipit-source-id: 7a4b2187570fd85d4444bfe63ae7bc77b09af261
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/47276
This dates back all the way to D4021502 and is unused by any of our modern debugger tools.
Changelog: [Internal]
Reviewed By: rubennorte
Differential Revision: D65134285
fbshipit-source-id: 44d8bf2553b28558755e9a603b8ddc8f7dd79b20
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/47279
This file is used by BUCK only and should have not been exposed in the first place.
Fixes https://github.com/facebook/react-native/issues/47223
Changelog:
[Internal] [Changed] - Move `com/facebook/react/devsupport/AndroidManifest` to Internal
Reviewed By: NickGerleman
Differential Revision: D65136247
fbshipit-source-id: 01f1e3aed55e932e842132312166b786fd39e7ce
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/47240
Changelog: [internal]
Adding a new option for the feature flags script to print the current definitions of feature flags.
```
yarn featureflags --print
```
```
┌────────────────────────────────────────────────────────────┬───────────────────────────────────────────────────────────────────────────────────────────────────────────┬─────────┬──────────────┐
│ (index) │ Description │ Purpose │ Date added │
├────────────────────────────────────────────────────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────┼─────────┼──────────────┤
│ commonTestFlag │ 'Common flag for testing. Do NOT modify.' │ '🔨' │ undefined │
│ commonTestFlagWithoutNativeImplementation │ 'Common flag for testing (without native implementation). Do NOT modify.' │ '🔨' │ undefined │
│ enableFabricLogs │ 'This feature flag enables logs for Fabric.' │ '🔨' │ undefined │
│ jsOnlyTestFlag │ 'JS-only flag for testing. Do NOT modify.' │ '🔨' │ undefined │
│ traceTurboModulePromiseRejectionsOnAndroid │ 'Enables storing js caller stack when creating promise in native module. This is useful in case of Pr...' │ '🔨' │ undefined │
│ batchRenderingUpdatesInEventLoop │ 'When enabled, the RuntimeScheduler processing the event loop will batch all rendering updates and di...' │ '🚀' │ undefined │
│ disableEventLoopOnBridgeless │ 'The bridgeless architecture enables the event loop by default. This feature flag allows us to force ...' │ '🚀' │ undefined │
│ enableAccessToHostTreeInFabric │ 'Enables access to the host tree in Fabric using DOM-compatible APIs.' │ '🚀' │ undefined │
│ enableBridgelessArchitecture │ 'Feature flag to enable the new bridgeless architecture. Note: Enabling this will force enable the fo...' │ '🚀' │ undefined │
│ enableFabricRenderer │ 'Enables the use of the Fabric renderer in the whole app.' │ '🚀' │ undefined │
│ enableFabricRendererExclusively │ 'When the app is completely migrated to Fabric, set this flag to true to disable parts of Paper infra...' │ '🚀' │ undefined │
│ enableLayoutAnimationsOnAndroid │ 'When enabled, LayoutAnimations API will animate state changes on Android.' │ '🚀' │ undefined │
│ enableLayoutAnimationsOnIOS │ 'When enabled, LayoutAnimations API will animate state changes on iOS.' │ '🚀' │ undefined │
│ enableLongTaskAPI │ 'Enables the reporting of long tasks through `PerformanceObserver`. Only works if the event loop is e...' │ '🚀' │ undefined │
│ enableMicrotasks │ 'Enables the use of microtasks in Hermes (scheduling) and RuntimeScheduler (execution).' │ '🚀' │ undefined │
│ enableReportEventPaintTime │ 'Report paint time inside the Event Timing API implementation (PerformanceObserver).' │ '🚀' │ undefined │
│ fuseboxEnabledDebug │ 'Flag determining if the React Native DevTools (Fusebox) CDP backend should be enabled in debug build...' │ '🚀' │ undefined │
│ fuseboxEnabledRelease │ 'Flag determining if the React Native DevTools (Fusebox) CDP backend should be enabled in release bui...' │ '🚀' │ undefined │
│ isLayoutAnimationEnabled │ 'Function used to enable / disabled Layout Animations in React Native.' │ '🚀' │ undefined │
│ useFabricInterop │ 'Should this application enable the Fabric Interop Layer for Android? If yes, the application will be...' │ '🚀' │ undefined │
│ useModernRuntimeScheduler │ 'When enabled, it uses the modern fork of RuntimeScheduler that allows scheduling tasks with prioriti...' │ '🚀' │ undefined │
│ useTurboModules │ 'When enabled, NativeModules will be executed by using the TurboModule system' │ '🚀' │ undefined │
│ allowRecursiveCommitsWithSynchronousMountOnAndroid │ 'Adds support for recursively processing commits that mount synchronously (Android only).' │ '🧪' │ '2024-05-30' │
│ animatedShouldDebounceQueueFlush │ 'Enables an experimental flush-queue debouncing in Animated.js.' │ '🧪' │ '2024-02-05' │
│ animatedShouldUseSingleOp │ 'Enables an experimental mega-operation for Animated.js that replaces many calls to native with a sin...' │ '🧪' │ '2024-02-05' │
│ completeReactInstanceCreationOnBgThreadOnAndroid │ 'Do not wait for a main-thread dispatch to complete init to start executing work on the JS thread on ...' │ '🧪' │ '2024-07-22' │
│ enableAlignItemsBaselineOnFabricIOS │ 'Kill-switch to turn off support for aling-items:baseline on Fabric iOS.' │ '🧪' │ '2024-07-10' │
│ enableAndroidLineHeightCentering │ 'When enabled, custom line height calculation will be centered from top to bottom.' │ '🧪' │ '2024-09-11' │
│ enableAnimatedAllowlist │ 'Enables Animated to skip non-allowlisted props and styles.' │ '🧪' │ '2024-09-10' │
│ enableAnimatedClearImmediateFix │ 'Enables an experimental to use the proper clearIntermediate instead of calling the wrong clearTimeou...' │ '🧪' │ '2024-09-17' │
│ enableAnimatedPropsMemo │ 'Enables Animated to analyze props to minimize invalidating `AnimatedProps`.' │ '🧪' │ '2024-09-11' │
│ enableCleanTextInputYogaNode │ 'Clean yoga node when <TextInput /> does not change.' │ '🧪' │ '2024-04-06' │
│ enableCppPropsIteratorSetter │ 'Enable prop iterator setter-style construction of Props in C++ (this flag is not used in Java).' │ '🧪' │ '2024-09-13' │
│ enableDeletionOfUnmountedViews │ 'Deletes views that were pre-allocated but never mounted on the screen.' │ '🧪' │ '2024-09-13' │
│ enableEagerRootViewAttachment │ 'Feature flag to configure eager attachment of the root view/initialisation of the JS code.' │ '🧪' │ '2024-07-28' │
│ enableEventEmitterRetentionDuringGesturesOnAndroid │ 'Enables the retention of EventEmitterWrapper on Android till the touch gesture is over to fix a bug ...' │ '🧪' │ '2024-08-08' │
│ enableGranularShadowTreeStateReconciliation │ 'When enabled, the renderer would only fail commits when they propagate state and the last commit tha...' │ '🧪' │ '2024-05-01' │
│ enableIOSViewClipToPaddingBox │ 'iOS Views will clip to their padding box vs border box' │ '🧪' │ '2024-08-30' │
│ enableNewBackgroundAndBorderDrawables │ 'Use BackgroundDrawable and BorderDrawable instead of CSSBackgroundDrawable' │ '🧪' │ '2024-09-24' │
│ enableOptimisedVirtualizedCells │ 'Removing unnecessary rerenders Virtualized cells after any rerenders of Virualized list. Works with ...' │ '🧪' │ '2024-08-21' │
│ enablePreciseSchedulingForPremountItemsOnAndroid │ 'Moves execution of pre-mount items to outside the choregrapher in the main thread, so we can estimat...' │ '🧪' │ '2024-09-19' │
│ enablePropsUpdateReconciliationAndroid │ 'When enabled, Android will receive prop updates based on the differences between the last rendered s...' │ '🧪' │ '2024-07-12' │
│ enableSynchronousStateUpdates │ 'Dispatches state updates synchronously in Fabric (e.g.: updates the scroll position in the shadow tr...' │ '🧪' │ '2024-04-25' │
│ enableTextPreallocationOptimisation │ 'Text preallocation optimisation where unnecessary work is removed.' │ '🧪' │ '2024-09-12' │
│ enableUIConsistency │ 'Ensures that JavaScript always has a consistent view of the state of the UI (e.g.: commits done in o...' │ '🧪' │ '2024-04-25' │
│ enableViewRecycling │ 'Enables View Recycling. When enabled, individual ViewManagers must still opt-in.' │ '🧪' │ '2024-07-31' │
│ excludeYogaFromRawProps │ 'When enabled, rawProps in Props will not include Yoga specific props.' │ '🧪' │ '2024-07-22' │
│ fixMappingOfEventPrioritiesBetweenFabricAndReact │ 'Uses the default event priority instead of the discreet event priority by default when dispatching e...' │ '🧪' │ '2024-06-18' │
│ fixMountingCoordinatorReportedPendingTransactionsOnAndroid │ 'Fixes a limitation on Android where the mounting coordinator would report there are no pending trans...' │ '🧪' │ '2024-08-27' │
│ forceBatchingMountItemsOnAndroid │ 'Forces the mounting layer on Android to always batch mount items instead of dispatching them immedia...' │ '🧪' │ '2024-04-10' │
│ initEagerTurboModulesOnNativeModulesQueueAndroid │ 'Construct modules that requires eager init on the dedicate native modules thread' │ '🧪' │ '2024-07-11' │
│ lazyAnimationCallbacks │ 'Only enqueue Choreographer calls if there is an ongoing animation, instead of enqueueing every frame...' │ '🧪' │ '2024-05-01' │
│ loadVectorDrawablesOnImages │ 'Adds support for loading vector drawable assets in the Image component (only on Android)' │ '🧪' │ '2024-07-12' │
│ scheduleAnimatedEndCallbackInMicrotask │ 'Changes the completion callback supplied via `Animation#start` to be scheduled in a microtask instea...' │ '🧪' │ '2024-09-27' │
│ setAndroidLayoutDirection │ 'Propagate layout direction to Android views.' │ '🧪' │ '2024-05-17' │
│ shouldSkipStateUpdatesForLoopingAnimations │ 'If the animation is within Animated.loop, we do not send state updates to React.' │ '🧪' │ '2024-07-25' │
│ shouldUseAnimatedObjectForTransform │ 'Enables use of AnimatedObject for animating transform values.' │ '🧪' │ '2024-02-05' │
│ shouldUseRemoveClippedSubviewsAsDefaultOnIOS │ 'removeClippedSubviews prop will be used as the default in FlatList on iOS to match Android' │ '🧪' │ '2024-02-05' │
│ shouldUseSetNativePropsInFabric │ 'Enables use of setNativeProps in JS driven animations.' │ '🧪' │ '2024-03-05' │
│ shouldUseSetNativePropsInNativeAnimationsInFabric │ 'Enables use of setNativeProps in Native driven animations in Fabric.' │ '🧪' │ '2024-03-05' │
│ useImmediateExecutorInAndroidBridgeless │ 'Invoke callbacks immediately on the ReactInstance rather than going through a background thread for ...' │ '🧪' │ '2024-06-06' │
│ useInsertionEffectsForAnimations │ 'Changes construction of the animation graph to `useInsertionEffect` instead of `useLayoutEffect`.' │ '🧪' │ '2024-09-12' │
│ useNativeViewConfigsInBridgelessMode │ 'When enabled, the native view configs are used in bridgeless mode.' │ '🧪' │ '2024-04-03' │
│ useOptimisedViewPreallocationOnAndroid │ 'Moves more of the work in view preallocation to the main thread to free up JS thread.' │ '🧪' │ '2024-07-23' │
│ useOptimizedEventBatchingOnAndroid │ 'Uses an optimized mechanism for event batching on Android that does not need to wait for a Choreogra...' │ '🧪' │ '2024-08-29' │
│ useRefsForTextInputState │ 'Enable a variant of TextInput that moves some state to refs to avoid unnecessary re-renders' │ '🧪' │ '2024-07-08' │
│ useRuntimeShadowNodeReferenceUpdate │ 'When enabled, cloning shadow nodes within react native will update the reference held by the current...' │ '🧪' │ '2024-06-03' │
│ useTurboModuleInterop │ 'In Bridgeless mode, should legacy NativeModules use the TurboModule system?' │ '🧪' │ '2024-07-28' │
└────────────────────────────────────────────────────────────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────┴─────────┴──────────────┘
Summary
┌─────────────────┬────────┐
│ (index) │ Values │
├─────────────────┼────────┤
│ Total │ 68 │
│ Common │ 51 │
│ JS Only │ 17 │
│ Operational │ 5 │
│ Release │ 17 │
│ Experimentation │ 46 │
└─────────────────┴────────┘
Done in 1.62s.
```
```
yarn featureflags --print --json
```
```
{"common":{"commonTestFlag":{"defaultValue":false,"metadata":{"description":"Common flag for testing. Do NOT modify.","purpose":"operational"}},"commonTestFlagWithoutNativeImplementation":{"defaultValue":false,"metadata":{"description":"Common flag for testing (without native implementation). Do NOT modify.","purpose":"operational"},"skipNativeAPI":true},"allowRecursiveCommitsWithSynchronousMountOnAndroid":{"defaultValue":false,"metadata":{"dateAdded":"2024-05-30","description":"Adds support for recursively processing commits that mount synchronously (Android only).","purpose":"experimentation"}},"batchRenderingUpdatesInEventLoop":{"defaultValue":false,"metadata":{"description":"When enabled, the RuntimeScheduler processing the event loop will batch all rendering updates and dispatch them together at the end of each iteration of the loop.","purpose":"release"},"skipNativeAPI":true},"completeReactInstanceCreationOnBgThreadOnAndroid":{"defaultValue":false,"metadata":{"dateAdded":"2024-07-22","description":"Do not wait for a main-thread dispatch to complete init to start executing work on the JS thread on Android","purpose":"experimentation"}},"disableEventLoopOnBridgeless":{"defaultValue":false,"metadata":{"description":"The bridgeless architecture enables the event loop by default. This feature flag allows us to force disabling it in specific instances.","purpose":"release"}},"enableAlignItemsBaselineOnFabricIOS":{"defaultValue":true,"metadata":{"dateAdded":"2024-07-10","description":"Kill-switch to turn off support for aling-items:baseline on Fabric iOS.","purpose":"experimentation"}},"enableAndroidLineHeightCentering":{"defaultValue":false,"metadata":{"dateAdded":"2024-09-11","description":"When enabled, custom line height calculation will be centered from top to bottom.","purpose":"experimentation"}},"enableBridgelessArchitecture":{"defaultValue":false,"metadata":{"description":"Feature flag to enable the new bridgeless architecture. Note: Enabling this will force enable the following flags: `useTurboModules` & `enableFabricRenderer.","purpose":"release"}},"enableCleanTextInputYogaNode":{"defaultValue":false,"metadata":{"dateAdded":"2024-04-06","description":"Clean yoga node when <TextInput /> does not change.","purpose":"experimentation"}},"enableCppPropsIteratorSetter":{"defaultValue":false,"metadata":{"dateAdded":"2024-09-13","description":"Enable prop iterator setter-style construction of Props in C++ (this flag is not used in Java).","purpose":"experimentation"}},"enableDeletionOfUnmountedViews":{"defaultValue":false,"metadata":{"dateAdded":"2024-09-13","description":"Deletes views that were pre-allocated but never mounted on the screen.","purpose":"experimentation"}},"enableEagerRootViewAttachment":{"defaultValue":false,"metadata":{"dateAdded":"2024-07-28","description":"Feature flag to configure eager attachment of the root view/initialisation of the JS code.","purpose":"experimentation"}},"enableEventEmitterRetentionDuringGesturesOnAndroid":{"defaultValue":false,"metadata":{"dateAdded":"2024-08-08","description":"Enables the retention of EventEmitterWrapper on Android till the touch gesture is over to fix a bug on pressable (#44610)","purpose":"experimentation"}},"enableFabricLogs":{"defaultValue":false,"metadata":{"description":"This feature flag enables logs for Fabric.","purpose":"operational"}},"enableFabricRenderer":{"defaultValue":false,"metadata":{"description":"Enables the use of the Fabric renderer in the whole app.","purpose":"release"}},"enableFabricRendererExclusively":{"defaultValue":false,"metadata":{"description":"When the app is completely migrated to Fabric, set this flag to true to disable parts of Paper infrastructure that are not needed anymore but consume memory and CPU. Specifically, UIViewOperationQueue and EventDispatcherImpl will no longer work as they will not subscribe to ReactChoreographer for updates.","purpose":"release"}},"enableGranularShadowTreeStateReconciliation":{"defaultValue":false,"metadata":{"dateAdded":"2024-05-01","description":"When enabled, the renderer would only fail commits when they propagate state and the last commit that updated state changed before committing.","purpose":"experimentation"}},"enableIOSViewClipToPaddingBox":{"defaultValue":false,"metadata":{"dateAdded":"2024-08-30","description":"iOS Views will clip to their padding box vs border box","purpose":"experimentation"}},"enableLayoutAnimationsOnAndroid":{"defaultValue":false,"metadata":{"description":"When enabled, LayoutAnimations API will animate state changes on Android.","purpose":"release"}},"enableLayoutAnimationsOnIOS":{"defaultValue":true,"metadata":{"description":"When enabled, LayoutAnimations API will animate state changes on iOS.","purpose":"release"}},"enableLongTaskAPI":{"defaultValue":false,"metadata":{"description":"Enables the reporting of long tasks through `PerformanceObserver`. Only works if the event loop is enabled.","purpose":"release"}},"enableMicrotasks":{"defaultValue":false,"metadata":{"description":"Enables the use of microtasks in Hermes (scheduling) and RuntimeScheduler (execution).","purpose":"release"},"skipNativeAPI":true},"enableNewBackgroundAndBorderDrawables":{"defaultValue":false,"metadata":{"dateAdded":"2024-09-24","description":"Use BackgroundDrawable and BorderDrawable instead of CSSBackgroundDrawable","purpose":"experimentation"}},"enablePreciseSchedulingForPremountItemsOnAndroid":{"defaultValue":false,"metadata":{"dateAdded":"2024-09-19","description":"Moves execution of pre-mount items to outside the choregrapher in the main thread, so we can estimate idle time more precisely (Android only).","purpose":"experimentation"}},"enablePropsUpdateReconciliationAndroid":{"defaultValue":false,"metadata":{"dateAdded":"2024-07-12","description":"When enabled, Android will receive prop updates based on the differences between the last rendered shadow node and the last committed shadow node.","purpose":"experimentation"}},"enableReportEventPaintTime":{"defaultValue":false,"metadata":{"description":"Report paint time inside the Event Timing API implementation (PerformanceObserver).","purpose":"release"}},"enableSynchronousStateUpdates":{"defaultValue":false,"metadata":{"dateAdded":"2024-04-25","description":"Dispatches state updates synchronously in Fabric (e.g.: updates the scroll position in the shadow tree synchronously from the main thread).","purpose":"experimentation"}},"enableTextPreallocationOptimisation":{"defaultValue":false,"metadata":{"dateAdded":"2024-09-12","description":"Text preallocation optimisation where unnecessary work is removed.","purpose":"experimentation"}},"enableUIConsistency":{"defaultValue":false,"metadata":{"dateAdded":"2024-04-25","description":"Ensures that JavaScript always has a consistent view of the state of the UI (e.g.: commits done in other threads are not immediately propagated to JS during its execution).","purpose":"experimentation"}},"enableViewRecycling":{"defaultValue":false,"metadata":{"dateAdded":"2024-07-31","description":"Enables View Recycling. When enabled, individual ViewManagers must still opt-in.","purpose":"experimentation"}},"excludeYogaFromRawProps":{"defaultValue":false,"metadata":{"dateAdded":"2024-07-22","description":"When enabled, rawProps in Props will not include Yoga specific props.","purpose":"experimentation"}},"fixMappingOfEventPrioritiesBetweenFabricAndReact":{"defaultValue":false,"metadata":{"dateAdded":"2024-06-18","description":"Uses the default event priority instead of the discreet event priority by default when dispatching events from Fabric to React.","purpose":"experimentation"}},"fixMountingCoordinatorReportedPendingTransactionsOnAndroid":{"defaultValue":false,"metadata":{"dateAdded":"2024-08-27","description":"Fixes a limitation on Android where the mounting coordinator would report there are no pending transactions but some of them were actually not processed due to the use of the push model.","purpose":"experimentation"}},"forceBatchingMountItemsOnAndroid":{"defaultValue":false,"metadata":{"dateAdded":"2024-04-10","description":"Forces the mounting layer on Android to always batch mount items instead of dispatching them immediately. This might fix some crashes related to synchronous state updates, where some views dispatch state updates during mount.","purpose":"experimentation"}},"fuseboxEnabledDebug":{"defaultValue":true,"metadata":{"description":"Flag determining if the React Native DevTools (Fusebox) CDP backend should be enabled in debug builds. This flag is global and should not be changed across React Host lifetimes.","purpose":"release"}},"fuseboxEnabledRelease":{"defaultValue":false,"metadata":{"description":"Flag determining if the React Native DevTools (Fusebox) CDP backend should be enabled in release builds. This flag is global and should not be changed across React Host lifetimes.","purpose":"release"}},"initEagerTurboModulesOnNativeModulesQueueAndroid":{"defaultValue":false,"metadata":{"dateAdded":"2024-07-11","description":"Construct modules that requires eager init on the dedicate native modules thread","purpose":"experimentation"}},"lazyAnimationCallbacks":{"defaultValue":false,"metadata":{"dateAdded":"2024-05-01","description":"Only enqueue Choreographer calls if there is an ongoing animation, instead of enqueueing every frame.","purpose":"experimentation"}},"loadVectorDrawablesOnImages":{"defaultValue":false,"metadata":{"dateAdded":"2024-07-12","description":"Adds support for loading vector drawable assets in the Image component (only on Android)","purpose":"experimentation"}},"setAndroidLayoutDirection":{"defaultValue":true,"metadata":{"dateAdded":"2024-05-17","description":"Propagate layout direction to Android views.","purpose":"experimentation"}},"traceTurboModulePromiseRejectionsOnAndroid":{"defaultValue":false,"metadata":{"description":"Enables storing js caller stack when creating promise in native module. This is useful in case of Promise rejection and tracing the cause.","purpose":"operational"}},"useFabricInterop":{"defaultValue":false,"metadata":{"description":"Should this application enable the Fabric Interop Layer for Android? If yes, the application will behave so that it can accept non-Fabric components and render them on Fabric. This toggle is controlling extra logic such as custom event dispatching that are needed for the Fabric Interop Layer to work correctly.","purpose":"release"}},"useImmediateExecutorInAndroidBridgeless":{"defaultValue":false,"metadata":{"dateAdded":"2024-06-06","description":"Invoke callbacks immediately on the ReactInstance rather than going through a background thread for synchronization","purpose":"experimentation"}},"useModernRuntimeScheduler":{"defaultValue":false,"metadata":{"description":"When enabled, it uses the modern fork of RuntimeScheduler that allows scheduling tasks with priorities from any thread.","purpose":"release"},"skipNativeAPI":true},"useNativeViewConfigsInBridgelessMode":{"defaultValue":false,"metadata":{"dateAdded":"2024-04-03","description":"When enabled, the native view configs are used in bridgeless mode.","purpose":"experimentation"}},"useOptimisedViewPreallocationOnAndroid":{"defaultValue":false,"metadata":{"dateAdded":"2024-07-23","description":"Moves more of the work in view preallocation to the main thread to free up JS thread.","purpose":"experimentation"}},"useOptimizedEventBatchingOnAndroid":{"defaultValue":false,"metadata":{"dateAdded":"2024-08-29","description":"Uses an optimized mechanism for event batching on Android that does not need to wait for a Choreographer frame callback.","purpose":"experimentation"}},"useRuntimeShadowNodeReferenceUpdate":{"defaultValue":false,"metadata":{"dateAdded":"2024-06-03","description":"When enabled, cloning shadow nodes within react native will update the reference held by the current JS fiber tree.","purpose":"experimentation"}},"useTurboModuleInterop":{"defaultValue":false,"metadata":{"dateAdded":"2024-07-28","description":"In Bridgeless mode, should legacy NativeModules use the TurboModule system?","purpose":"experimentation"}},"useTurboModules":{"defaultValue":false,"metadata":{"description":"When enabled, NativeModules will be executed by using the TurboModule system","purpose":"release"}}},"jsOnly":{"jsOnlyTestFlag":{"defaultValue":false,"metadata":{"description":"JS-only flag for testing. Do NOT modify.","purpose":"operational"}},"animatedShouldDebounceQueueFlush":{"defaultValue":false,"metadata":{"dateAdded":"2024-02-05","description":"Enables an experimental flush-queue debouncing in Animated.js.","purpose":"experimentation"}},"animatedShouldUseSingleOp":{"defaultValue":false,"metadata":{"dateAdded":"2024-02-05","description":"Enables an experimental mega-operation for Animated.js that replaces many calls to native with a single call into native, to reduce JSI/JNI traffic.","purpose":"experimentation"}},"enableAccessToHostTreeInFabric":{"defaultValue":false,"metadata":{"description":"Enables access to the host tree in Fabric using DOM-compatible APIs.","purpose":"release"}},"enableAnimatedAllowlist":{"defaultValue":false,"metadata":{"dateAdded":"2024-09-10","description":"Enables Animated to skip non-allowlisted props and styles.","purpose":"experimentation"}},"enableAnimatedClearImmediateFix":{"defaultValue":true,"metadata":{"dateAdded":"2024-09-17","description":"Enables an experimental to use the proper clearIntermediate instead of calling the wrong clearTimeout and canceling another timer.","purpose":"experimentation"}},"enableAnimatedPropsMemo":{"defaultValue":false,"metadata":{"dateAdded":"2024-09-11","description":"Enables Animated to analyze props to minimize invalidating `AnimatedProps`.","purpose":"experimentation"}},"enableOptimisedVirtualizedCells":{"defaultValue":false,"metadata":{"dateAdded":"2024-08-21","description":"Removing unnecessary rerenders Virtualized cells after any rerenders of Virualized list. Works with strict=true option","purpose":"experimentation"}},"isLayoutAnimationEnabled":{"defaultValue":true,"metadata":{"description":"Function used to enable / disabled Layout Animations in React Native.","purpose":"release"}},"scheduleAnimatedEndCallbackInMicrotask":{"defaultValue":false,"metadata":{"dateAdded":"2024-09-27","description":"Changes the completion callback supplied via `Animation#start` to be scheduled in a microtask instead of synchronously executed.","purpose":"experimentation"}},"shouldSkipStateUpdatesForLoopingAnimations":{"defaultValue":false,"metadata":{"dateAdded":"2024-07-25","description":"If the animation is within Animated.loop, we do not send state updates to React.","purpose":"experimentation"}},"shouldUseAnimatedObjectForTransform":{"defaultValue":false,"metadata":{"dateAdded":"2024-02-05","description":"Enables use of AnimatedObject for animating transform values.","purpose":"experimentation"}},"shouldUseRemoveClippedSubviewsAsDefaultOnIOS":{"defaultValue":false,"metadata":{"dateAdded":"2024-02-05","description":"removeClippedSubviews prop will be used as the default in FlatList on iOS to match Android","purpose":"experimentation"}},"shouldUseSetNativePropsInFabric":{"defaultValue":true,"metadata":{"dateAdded":"2024-03-05","description":"Enables use of setNativeProps in JS driven animations.","purpose":"experimentation"}},"shouldUseSetNativePropsInNativeAnimationsInFabric":{"defaultValue":false,"metadata":{"dateAdded":"2024-03-05","description":"Enables use of setNativeProps in Native driven animations in Fabric.","purpose":"experimentation"}},"useInsertionEffectsForAnimations":{"defaultValue":false,"metadata":{"dateAdded":"2024-09-12","description":"Changes construction of the animation graph to `useInsertionEffect` instead of `useLayoutEffect`.","purpose":"experimentation"}},"useRefsForTextInputState":{"defaultValue":false,"metadata":{"dateAdded":"2024-07-08","description":"Enable a variant of TextInput that moves some state to refs to avoid unnecessary re-renders","purpose":"experimentation"}}}}
```
Reviewed By: mdvacca
Differential Revision: D64406244
fbshipit-source-id: 6f82da64d1212faf6d5a82862a71fbc1d168134b
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/47239
Changelog: [internal]
Small refactor of the types for feature flags in JS to make objects read-only.
Reviewed By: mdvacca
Differential Revision: D65058612
fbshipit-source-id: 0d72df2f4afebf0426b9ac76a8f8b195c74fea52
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/47208
Changelog: [internal]
Small change to unify the yarn commands for feature flags into a single `featureflags` command with options.
Reviewed By: NickGerleman, mdvacca
Differential Revision: D64982509
fbshipit-source-id: 3f9d7ac35f61950bd03fef243e1a95625144a0cd