From 63ff5eb1a1df857dfbb7c9fc7d8cb336a1974245 Mon Sep 17 00:00:00 2001 From: Jakub Piasecki Date: Wed, 30 Sep 2026 00:38:44 -0700 Subject: [PATCH 1/5] Generate public feature flags entry point Summary: Adds a `dangerouslyExposeInPublicCppHeaders` option to the feature flags config. Flags that opt in are generated into `ReactNativePublicFeatureFlags.h`, whose getters forward to `ReactNativeFeatureFlags` from a generated `.cpp`, so exported headers can read them without including the rest of the module. Opts in the flags that exported headers currently read inline. Changelog: [Internal] Differential Revision: D122353811 --- .../ReactNativePublicFeatureFlags.cpp | 49 ++++++++++++++ .../ReactNativePublicFeatureFlags.h | 66 +++++++++++++++++++ .../ReactNativeFeatureFlags.config.js | 6 ++ .../featureflags/generateCommonCxxModules.js | 6 ++ .../scripts/featureflags/generateFiles.js | 13 +++- ...ctNativePublicFeatureFlags.cpp-template.js | 47 +++++++++++++ ...eactNativePublicFeatureFlags.h-template.js | 57 ++++++++++++++++ .../scripts/featureflags/types.js | 2 + 8 files changed, 245 insertions(+), 1 deletion(-) create mode 100644 packages/react-native/ReactCommon/react/featureflags/ReactNativePublicFeatureFlags.cpp create mode 100644 packages/react-native/ReactCommon/react/featureflags/ReactNativePublicFeatureFlags.h create mode 100644 packages/react-native/scripts/featureflags/templates/common-cxx/ReactNativePublicFeatureFlags.cpp-template.js create mode 100644 packages/react-native/scripts/featureflags/templates/common-cxx/ReactNativePublicFeatureFlags.h-template.js diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativePublicFeatureFlags.cpp b/packages/react-native/ReactCommon/react/featureflags/ReactNativePublicFeatureFlags.cpp new file mode 100644 index 000000000000..ee4ccaf72737 --- /dev/null +++ b/packages/react-native/ReactCommon/react/featureflags/ReactNativePublicFeatureFlags.cpp @@ -0,0 +1,49 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @generated SignedSource<<95f86b3476aeff097f532b10cabf067e>> + */ + +/** + * IMPORTANT: Do NOT modify this file directly. + * + * To change the definition of the flags, edit + * packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js. + * + * To regenerate this code, run the following script from the repo root: + * yarn featureflags --update + */ + +#include "ReactNativeFeatureFlags.h" +#include "ReactNativePublicFeatureFlags.h" + +namespace facebook::react { + +bool ReactNativeFeatureFlags_DO_NOT_USE::enableAccumulatedUpdatesInRawPropsAndroid() { + return ReactNativeFeatureFlags::enableAccumulatedUpdatesInRawPropsAndroid(); +} + +bool ReactNativeFeatureFlags_DO_NOT_USE::enableCppPropsIteratorSetter() { + return ReactNativeFeatureFlags::enableCppPropsIteratorSetter(); +} + +bool ReactNativeFeatureFlags_DO_NOT_USE::enableExclusivePropsUpdateAndroid() { + return ReactNativeFeatureFlags::enableExclusivePropsUpdateAndroid(); +} + +bool ReactNativeFeatureFlags_DO_NOT_USE::enableNativeCSSParsing() { + return ReactNativeFeatureFlags::enableNativeCSSParsing(); +} + +bool ReactNativeFeatureFlags_DO_NOT_USE::enablePropsUpdateReconciliationAndroid() { + return ReactNativeFeatureFlags::enablePropsUpdateReconciliationAndroid(); +} + +bool ReactNativeFeatureFlags_DO_NOT_USE::useSharedAnimatedBackend() { + return ReactNativeFeatureFlags::useSharedAnimatedBackend(); +} + +} // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativePublicFeatureFlags.h b/packages/react-native/ReactCommon/react/featureflags/ReactNativePublicFeatureFlags.h new file mode 100644 index 000000000000..f8c27e60c167 --- /dev/null +++ b/packages/react-native/ReactCommon/react/featureflags/ReactNativePublicFeatureFlags.h @@ -0,0 +1,66 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @generated SignedSource<<39037a69a47b86d0c6643d90f4058002>> + */ + +/** + * IMPORTANT: Do NOT modify this file directly. + * + * To change the definition of the flags, edit + * packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js. + * + * To regenerate this code, run the following script from the repo root: + * yarn featureflags --update + */ + +#pragma once + +#include + +#ifndef RN_EXPORT +#define RN_EXPORT __attribute__((visibility("default"))) +#endif + +namespace facebook::react { + +/** + * This class provides public access to select internal React Native feature flags. + */ +class ReactNativeFeatureFlags_DO_NOT_USE { + public: + /** + * When enabled, Android will accumulate updates in rawProps to reduce the number of mounting instructions for cascading re-renders. + */ + RN_EXPORT static bool enableAccumulatedUpdatesInRawPropsAndroid(); + + /** + * Enable prop iterator setter-style construction of Props in C++ (this flag is not used in Java). + */ + RN_EXPORT static bool enableCppPropsIteratorSetter(); + + /** + * When enabled, Android will disable Props 1.5 raw value merging when Props 2.0 is available. + */ + RN_EXPORT static bool enableExclusivePropsUpdateAndroid(); + + /** + * Parse CSS strings using the Fabric CSS parser instead of ViewConfig processing + */ + RN_EXPORT static bool enableNativeCSSParsing(); + + /** + * When enabled, Android will receive prop updates based on the differences between the last rendered shadow node and the last committed shadow node. + */ + RN_EXPORT static bool enablePropsUpdateReconciliationAndroid(); + + /** + * Use shared animation backend in C++ Animated + */ + RN_EXPORT static bool useSharedAnimatedBackend(); +}; + +} // namespace facebook::react diff --git a/packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js b/packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js index b7e56a770ebe..9d776f20b10e 100644 --- a/packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js +++ b/packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js @@ -181,6 +181,7 @@ const definitions: FeatureFlagDefinitions = { ossReleaseStage: 'canary', }, enableAccumulatedUpdatesInRawPropsAndroid: { + dangerouslyExposeInPublicCppHeaders: true, defaultValue: false, metadata: { dateAdded: '2024-12-10', @@ -233,6 +234,7 @@ const definitions: FeatureFlagDefinitions = { ossReleaseStage: 'none', }, enableCppPropsIteratorSetter: { + dangerouslyExposeInPublicCppHeaders: true, defaultValue: false, metadata: { dateAdded: '2024-09-13', @@ -287,6 +289,7 @@ const definitions: FeatureFlagDefinitions = { ossReleaseStage: 'none', }, enableExclusivePropsUpdateAndroid: { + dangerouslyExposeInPublicCppHeaders: true, defaultValue: false, metadata: { dateAdded: '2025-11-11', @@ -517,6 +520,7 @@ const definitions: FeatureFlagDefinitions = { ossReleaseStage: 'none', }, enableNativeCSSParsing: { + dangerouslyExposeInPublicCppHeaders: true, defaultValue: false, metadata: { dateAdded: '2025-02-07', @@ -538,6 +542,7 @@ const definitions: FeatureFlagDefinitions = { ossReleaseStage: 'none', }, enablePropsUpdateReconciliationAndroid: { + dangerouslyExposeInPublicCppHeaders: true, defaultValue: false, metadata: { dateAdded: '2024-07-12', @@ -923,6 +928,7 @@ const definitions: FeatureFlagDefinitions = { ossReleaseStage: 'none', }, useSharedAnimatedBackend: { + dangerouslyExposeInPublicCppHeaders: true, defaultValue: false, metadata: { dateAdded: '2025-08-02', diff --git a/packages/react-native/scripts/featureflags/generateCommonCxxModules.js b/packages/react-native/scripts/featureflags/generateCommonCxxModules.js index d46aceb40a45..c6530b23c772 100644 --- a/packages/react-native/scripts/featureflags/generateCommonCxxModules.js +++ b/packages/react-native/scripts/featureflags/generateCommonCxxModules.js @@ -18,6 +18,8 @@ import ReactNativeFeatureFlagsDefaultsH from './templates/common-cxx/ReactNative import ReactNativeFeatureFlagsDynamicProviderH from './templates/common-cxx/ReactNativeFeatureFlagsDynamicProvider.h-template'; import ReactNativeFeatureFlagsOverrides from './templates/common-cxx/ReactNativeFeatureFlagsOverridesOSS_Stage_.h-template'; import ReactNativeFeatureFlagsProviderH from './templates/common-cxx/ReactNativeFeatureFlagsProvider.h-template'; +import ReactNativePublicFeatureFlagsCPP from './templates/common-cxx/ReactNativePublicFeatureFlags.cpp-template'; +import ReactNativePublicFeatureFlagsH from './templates/common-cxx/ReactNativePublicFeatureFlags.h-template'; import path from 'node:path'; export default function generateCommonCxxModules( @@ -30,6 +32,10 @@ export default function generateCommonCxxModules( ReactNativeFeatureFlagsH(featureFlagDefinitions), [path.join(commonCxxPath, 'ReactNativeFeatureFlags.cpp')]: ReactNativeFeatureFlagsCPP(featureFlagDefinitions), + [path.join(commonCxxPath, 'ReactNativePublicFeatureFlags.h')]: + ReactNativePublicFeatureFlagsH(featureFlagDefinitions), + [path.join(commonCxxPath, 'ReactNativePublicFeatureFlags.cpp')]: + ReactNativePublicFeatureFlagsCPP(featureFlagDefinitions), [path.join(commonCxxPath, 'ReactNativeFeatureFlagsAccessor.h')]: ReactNativeFeatureFlagsAccessorH(featureFlagDefinitions), [path.join(commonCxxPath, 'ReactNativeFeatureFlagsAccessor.cpp')]: diff --git a/packages/react-native/scripts/featureflags/generateFiles.js b/packages/react-native/scripts/featureflags/generateFiles.js index ead6d67e2288..ddcccbb94594 100644 --- a/packages/react-native/scripts/featureflags/generateFiles.js +++ b/packages/react-native/scripts/featureflags/generateFiles.js @@ -34,7 +34,18 @@ export default function generateFiles( ...generatorConfig.featureFlagDefinitions, common: Object.fromEntries( Object.entries(generatorConfig.featureFlagDefinitions.common).filter( - ([_, definition]) => !definition.skipNativeAPI, + ([name, definition]) => { + if ( + definition.skipNativeAPI && + definition.dangerouslyExposeInPublicCppHeaders + ) { + throw new Error( + `${name} cannot have both skipNativeAPI and dangerouslyExposeInPublicCppHeaders enabled at the same time.`, + ); + } + + return !definition.skipNativeAPI; + }, ), ), }, diff --git a/packages/react-native/scripts/featureflags/templates/common-cxx/ReactNativePublicFeatureFlags.cpp-template.js b/packages/react-native/scripts/featureflags/templates/common-cxx/ReactNativePublicFeatureFlags.cpp-template.js new file mode 100644 index 000000000000..cc5934aa6769 --- /dev/null +++ b/packages/react-native/scripts/featureflags/templates/common-cxx/ReactNativePublicFeatureFlags.cpp-template.js @@ -0,0 +1,47 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @flow strict + * @format + */ + +import type {FeatureFlagDefinitions} from '../../types'; + +import {DO_NOT_MODIFY_COMMENT, getCxxTypeFromDefaultValue} from '../../utils'; +import signedsource from 'signedsource'; + +export default function (definitions: FeatureFlagDefinitions): string { + return signedsource.signFile(`/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * ${signedsource.getSigningToken()} + */ + +${DO_NOT_MODIFY_COMMENT} + +#include "ReactNativeFeatureFlags.h" +#include "ReactNativePublicFeatureFlags.h" + +namespace facebook::react { + +${Object.entries(definitions.common) + .filter(([_, flagConfig]) => flagConfig.dangerouslyExposeInPublicCppHeaders) + .map( + ([flagName, flagConfig]) => + `${getCxxTypeFromDefaultValue( + flagConfig.defaultValue, + )} ReactNativeFeatureFlags_DO_NOT_USE::${flagName}() { + return ReactNativeFeatureFlags::${flagName}(); +}`, + ) + .join('\n\n')} + +} // namespace facebook::react +`); +} diff --git a/packages/react-native/scripts/featureflags/templates/common-cxx/ReactNativePublicFeatureFlags.h-template.js b/packages/react-native/scripts/featureflags/templates/common-cxx/ReactNativePublicFeatureFlags.h-template.js new file mode 100644 index 000000000000..920405706b2e --- /dev/null +++ b/packages/react-native/scripts/featureflags/templates/common-cxx/ReactNativePublicFeatureFlags.h-template.js @@ -0,0 +1,57 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @flow strict + * @format + */ + +import type {FeatureFlagDefinitions} from '../../types'; + +import {DO_NOT_MODIFY_COMMENT, getCxxTypeFromDefaultValue} from '../../utils'; +import signedsource from 'signedsource'; + +export default function (definitions: FeatureFlagDefinitions): string { + return signedsource.signFile(`/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * ${signedsource.getSigningToken()} + */ + +${DO_NOT_MODIFY_COMMENT} + +#pragma once + +#include + +#ifndef RN_EXPORT +#define RN_EXPORT __attribute__((visibility("default"))) +#endif + +namespace facebook::react { + +/** + * This class provides public access to select internal React Native feature flags. + */ +class ReactNativeFeatureFlags_DO_NOT_USE { + public: +${Object.entries(definitions.common) + .filter(([_, flagConfig]) => flagConfig.dangerouslyExposeInPublicCppHeaders) + .map( + ([flagName, flagConfig]) => + ` /** + * ${flagConfig.metadata.description} + */ + RN_EXPORT static ${getCxxTypeFromDefaultValue(flagConfig.defaultValue)} ${flagName}();`, + ) + .join('\n\n')} +}; + +} // namespace facebook::react +`); +} diff --git a/packages/react-native/scripts/featureflags/types.js b/packages/react-native/scripts/featureflags/types.js index acec7193a8ae..b072a8e05555 100644 --- a/packages/react-native/scripts/featureflags/types.js +++ b/packages/react-native/scripts/featureflags/types.js @@ -34,6 +34,8 @@ export type CommonFeatureFlagConfig< // Indicates if this API should only be defined in JavaScript, only to // preserve backwards compatibility with existing native code temporarily. skipNativeAPI?: true, + // Whether this flag should be exposed by the public feature flags entrypoint. + dangerouslyExposeInPublicCppHeaders?: true, }>; export type CommonFeatureFlagList = Readonly<{ From 29e145b967567e3c0679150574944ffd656bb570 Mon Sep 17 00:00:00 2001 From: Jakub Piasecki Date: Wed, 30 Sep 2026 00:43:26 -0700 Subject: [PATCH 2/5] Use public feature flags entry point in exported headers Summary: Exported headers that read feature flags inline now go through the generated `ReactNativePublicFeatureFlags.h` instead of `ReactNativeFeatureFlags.h`. Sources that relied on the transitive include now include `ReactNativeFeatureFlags.h` directly. Changelog: [Internal] Differential Revision: D122353873 --- .../react/renderer/attributedstring/conversions.h | 4 ++-- .../view/BackgroundImagePropsConversions.h | 4 ++-- .../components/view/BoxShadowPropsConversions.h | 4 ++-- .../components/view/FilterPropsConversions.h | 4 ++-- .../react/renderer/components/view/conversions.h | 8 ++++---- .../renderer/core/ConcreteComponentDescriptor.h | 13 +++++++------ .../react/renderer/graphics/fromRawValueShared.h | 4 ++-- .../react/renderer/mounting/ShadowTree.cpp | 1 + .../renderer/mounting/tests/StackingContextTest.cpp | 1 + 9 files changed, 23 insertions(+), 20 deletions(-) diff --git a/packages/react-native/ReactCommon/react/renderer/attributedstring/conversions.h b/packages/react-native/ReactCommon/react/renderer/attributedstring/conversions.h index e77b21d33653..c6d6f7ad9b3b 100644 --- a/packages/react-native/ReactCommon/react/renderer/attributedstring/conversions.h +++ b/packages/react-native/ReactCommon/react/renderer/attributedstring/conversions.h @@ -10,7 +10,7 @@ #include #include -#include +#include #include #include #include @@ -517,7 +517,7 @@ inline void parseUnprocessedFontVariant(const PropsParserContext &context, const inline void fromRawValue(const PropsParserContext &context, const RawValue &value, FontVariant &result) { - if (ReactNativeFeatureFlags::enableNativeCSSParsing()) { + if (ReactNativeFeatureFlags_DO_NOT_USE::enableNativeCSSParsing()) { parseUnprocessedFontVariant(context, value, result); } else { parseProcessedFontVariant(context, value, result); diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/BackgroundImagePropsConversions.h b/packages/react-native/ReactCommon/react/renderer/components/view/BackgroundImagePropsConversions.h index 7db2cc39881b..a8c38ae5d9c7 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/BackgroundImagePropsConversions.h +++ b/packages/react-native/ReactCommon/react/renderer/components/view/BackgroundImagePropsConversions.h @@ -9,7 +9,7 @@ #include -#include +#include #include #include #include @@ -30,7 +30,7 @@ void parseUnprocessedBackgroundImageString(const std::string &value, std::vector inline void fromRawValue(const PropsParserContext &context, const RawValue &value, std::vector &result) { - if (ReactNativeFeatureFlags::enableNativeCSSParsing()) { + if (ReactNativeFeatureFlags_DO_NOT_USE::enableNativeCSSParsing()) { if (value.hasType()) { parseUnprocessedBackgroundImageString((std::string)value, result); } else if (value.hasType>()) { diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/BoxShadowPropsConversions.h b/packages/react-native/ReactCommon/react/renderer/components/view/BoxShadowPropsConversions.h index a5b779d0b96d..a31e08d57139 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/BoxShadowPropsConversions.h +++ b/packages/react-native/ReactCommon/react/renderer/components/view/BoxShadowPropsConversions.h @@ -11,7 +11,7 @@ #include #include -#include +#include #include #include #include @@ -255,7 +255,7 @@ parseUnprocessedBoxShadow(const PropsParserContext &context, const RawValue &val inline void fromRawValue(const PropsParserContext &context, const RawValue &value, std::vector &result) { - if (ReactNativeFeatureFlags::enableNativeCSSParsing()) { + if (ReactNativeFeatureFlags_DO_NOT_USE::enableNativeCSSParsing()) { parseUnprocessedBoxShadow(context, value, result); } else { parseProcessedBoxShadow(context, value, result); diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/FilterPropsConversions.h b/packages/react-native/ReactCommon/react/renderer/components/view/FilterPropsConversions.h index 0bb301979286..2a35234576c4 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/FilterPropsConversions.h +++ b/packages/react-native/ReactCommon/react/renderer/components/view/FilterPropsConversions.h @@ -11,7 +11,7 @@ #include #include -#include +#include #include #include #include @@ -358,7 +358,7 @@ parseUnprocessedFilter(const PropsParserContext &context, const RawValue &value, inline void fromRawValue(const PropsParserContext &context, const RawValue &value, std::vector &result) { - if (ReactNativeFeatureFlags::enableNativeCSSParsing()) { + if (ReactNativeFeatureFlags_DO_NOT_USE::enableNativeCSSParsing()) { parseUnprocessedFilter(context, value, result); } else { parseProcessedFilter(context, value, result); diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/conversions.h b/packages/react-native/ReactCommon/react/renderer/components/view/conversions.h index 8ef320cf8c84..e1be3a01a291 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/conversions.h +++ b/packages/react-native/ReactCommon/react/renderer/components/view/conversions.h @@ -11,7 +11,7 @@ #include #include -#include +#include #include #include #include @@ -520,7 +520,7 @@ inline yoga::FloatOptional convertAspectRatio(const PropsParserContext & /*conte if (value.hasType()) { return yoga::FloatOptional((float)value); } - if (ReactNativeFeatureFlags::enableNativeCSSParsing() && value.hasType()) { + if (ReactNativeFeatureFlags_DO_NOT_USE::enableNativeCSSParsing() && value.hasType()) { auto ratio = parseCSSProperty((std::string)value); if (std::holds_alternative(ratio)) { auto r = std::get(ratio); @@ -995,7 +995,7 @@ inline void parseUnprocessedTransform(const PropsParserContext &context, const R inline void fromRawValue(const PropsParserContext &context, const RawValue &value, Transform &result) { - if (ReactNativeFeatureFlags::enableNativeCSSParsing()) { + if (ReactNativeFeatureFlags_DO_NOT_USE::enableNativeCSSParsing()) { parseUnprocessedTransform(context, value, result); } else { parseProcessedTransform(context, value, result); @@ -1079,7 +1079,7 @@ parseUnprocessedTransformOrigin(const PropsParserContext &context, const RawValu inline void fromRawValue(const PropsParserContext &context, const RawValue &value, TransformOrigin &result) { - if (ReactNativeFeatureFlags::enableNativeCSSParsing()) { + if (ReactNativeFeatureFlags_DO_NOT_USE::enableNativeCSSParsing()) { parseUnprocessedTransformOrigin(context, value, result); } else { parseProcessedTransformOrigin(context, value, result); diff --git a/packages/react-native/ReactCommon/react/renderer/core/ConcreteComponentDescriptor.h b/packages/react-native/ReactCommon/react/renderer/core/ConcreteComponentDescriptor.h index bf552e0e67e1..d608d1c84931 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/ConcreteComponentDescriptor.h +++ b/packages/react-native/ReactCommon/react/renderer/core/ConcreteComponentDescriptor.h @@ -13,7 +13,7 @@ #include #include -#include +#include #include #include #include @@ -56,7 +56,7 @@ class ConcreteComponentDescriptor : public ComponentDescriptor { // iterator-setter path and the runtime flag is on, `parse()` is never // called, so the O(n²) preparation here is wasted. Skip it. if constexpr (HasIteratorSetterCtor) { - if (!ReactNativeFeatureFlags::enableCppPropsIteratorSetter()) { + if (!ReactNativeFeatureFlags_DO_NOT_USE::enableCppPropsIteratorSetter()) { rawPropsParser_.prepare(); } } else { @@ -136,7 +136,8 @@ class ConcreteComponentDescriptor : public ComponentDescriptor { // and the only path when the flag is off): parse + per-field // `convertRawProp` via the 3-arg ctor. constexpr bool kSupportsIteratorSetter = HasIteratorSetterCtor; - const bool useIteratorSetter = kSupportsIteratorSetter && ReactNativeFeatureFlags::enableCppPropsIteratorSetter(); + const bool useIteratorSetter = + kSupportsIteratorSetter && ReactNativeFeatureFlags_DO_NOT_USE::enableCppPropsIteratorSetter(); std::shared_ptr shadowNodeProps; if constexpr (kSupportsIteratorSetter) { @@ -151,11 +152,11 @@ class ConcreteComponentDescriptor : public ComponentDescriptor { #ifdef RN_SERIALIZABLE_STATE bool fallbackToDynamicRawPropsAccumulation = true; - if (ReactNativeFeatureFlags::enableExclusivePropsUpdateAndroid() && - ReactNativeFeatureFlags::enableAccumulatedUpdatesInRawPropsAndroid()) { + if (ReactNativeFeatureFlags_DO_NOT_USE::enableExclusivePropsUpdateAndroid() && + ReactNativeFeatureFlags_DO_NOT_USE::enableAccumulatedUpdatesInRawPropsAndroid()) { // When exclusive props update is enabled, we only apply Props 1.5 processing // (raw props merging) when Props 2.0 is not available. - if (ReactNativeFeatureFlags::enablePropsUpdateReconciliationAndroid()) { + if (ReactNativeFeatureFlags_DO_NOT_USE::enablePropsUpdateReconciliationAndroid()) { // Cast to base Props reference to safely call virtual method const auto &baseProps = static_cast(*shadowNodeProps); if (strcmp(ShadowNodeT::Name(), baseProps.getDiffPropsImplementationTarget()) == 0) { diff --git a/packages/react-native/ReactCommon/react/renderer/graphics/fromRawValueShared.h b/packages/react-native/ReactCommon/react/renderer/graphics/fromRawValueShared.h index 91d73c080751..3cae3f91df6e 100644 --- a/packages/react-native/ReactCommon/react/renderer/graphics/fromRawValueShared.h +++ b/packages/react-native/ReactCommon/react/renderer/graphics/fromRawValueShared.h @@ -9,7 +9,7 @@ #include #include -#include +#include #include #include #include @@ -28,7 +28,7 @@ inline void fromRawValueShared( { ColorComponents colorComponents = {0, 0, 0, 0}; - if (ReactNativeFeatureFlags::enableNativeCSSParsing() && value.hasType()) { + if (ReactNativeFeatureFlags_DO_NOT_USE::enableNativeCSSParsing() && value.hasType()) { auto cssColor = parseCSSProperty((std::string)value); if (std::holds_alternative(cssColor)) { auto c = std::get(cssColor); diff --git a/packages/react-native/ReactCommon/react/renderer/mounting/ShadowTree.cpp b/packages/react-native/ReactCommon/react/renderer/mounting/ShadowTree.cpp index a258ab9043eb..8f08f6480679 100644 --- a/packages/react-native/ReactCommon/react/renderer/mounting/ShadowTree.cpp +++ b/packages/react-native/ReactCommon/react/renderer/mounting/ShadowTree.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include diff --git a/packages/react-native/ReactCommon/react/renderer/mounting/tests/StackingContextTest.cpp b/packages/react-native/ReactCommon/react/renderer/mounting/tests/StackingContextTest.cpp index 42421a23729b..f23afca4237d 100644 --- a/packages/react-native/ReactCommon/react/renderer/mounting/tests/StackingContextTest.cpp +++ b/packages/react-native/ReactCommon/react/renderer/mounting/tests/StackingContextTest.cpp @@ -9,6 +9,7 @@ #include +#include #include #include #include From b88ab864601256f09610581d76d1d05abaf80761 Mon Sep 17 00:00:00 2001 From: Jakub Piasecki Date: Wed, 30 Sep 2026 00:43:29 -0700 Subject: [PATCH 3/5] Make `react/featureflags` private Summary: Moves `react/featureflags` from the public tier of the C++ stable API to the private tier. The `` umbrella and its build plumbing are removed, and the headers include `PrivateGuard.h` instead of `UmbrellaGuard.h`. Changelog: [Internal] Differential Revision: D122353979 --- .../ReactAndroid/build.gradle.kts | 1 - .../react/featureflags/CMakeLists.txt | 1 - .../featureflags/React-featureflags.podspec | 6 --- .../react/featureflags/React/FeatureFlags.h | 48 ------------------- .../featureflags/ReactNativeFeatureFlags.h | 4 +- .../ReactNativeFeatureFlagsAccessor.h | 4 +- .../ReactNativeFeatureFlagsDefaults.h | 4 +- .../ReactNativeFeatureFlagsDynamicProvider.h | 4 +- ...eactNativeFeatureFlagsOverridesOSSCanary.h | 4 +- ...tiveFeatureFlagsOverridesOSSExperimental.h | 4 +- ...eactNativeFeatureFlagsOverridesOSSStable.h | 2 +- .../ReactNativeFeatureFlagsProvider.h | 4 +- .../ReactNativeFeatureFlags.h-template.js | 2 +- ...ctNativeFeatureFlagsAccessor.h-template.js | 2 +- ...ctNativeFeatureFlagsDefaults.h-template.js | 2 +- ...eFeatureFlagsDynamicProvider.h-template.js | 2 +- ...tureFlagsOverridesOSS_Stage_.h-template.js | 2 +- ...ctNativeFeatureFlagsProvider.h-template.js | 2 +- .../scripts/ios-prebuild/headers-config.js | 17 ------- .../scripts/ios-prebuild/setup.js | 1 - 20 files changed, 21 insertions(+), 95 deletions(-) delete mode 100644 packages/react-native/ReactCommon/react/featureflags/React/FeatureFlags.h diff --git a/packages/react-native/ReactAndroid/build.gradle.kts b/packages/react-native/ReactAndroid/build.gradle.kts index 2b31c54fe0f6..5d88d6f8f772 100644 --- a/packages/react-native/ReactAndroid/build.gradle.kts +++ b/packages/react-native/ReactAndroid/build.gradle.kts @@ -115,7 +115,6 @@ val preparePrefab by Pair("../ReactCommon/cxxreact/React/", "React/"), // react_featureflags Pair("../ReactCommon/react/featureflags/", "react/featureflags/"), - Pair("../ReactCommon/react/featureflags/React/", "React/"), // react_devtoolsruntimesettings Pair( "../ReactCommon/react/devtoolsruntimesettings/", diff --git a/packages/react-native/ReactCommon/react/featureflags/CMakeLists.txt b/packages/react-native/ReactCommon/react/featureflags/CMakeLists.txt index 2b8876355d40..adad8a65e9a5 100644 --- a/packages/react-native/ReactCommon/react/featureflags/CMakeLists.txt +++ b/packages/react-native/ReactCommon/react/featureflags/CMakeLists.txt @@ -12,7 +12,6 @@ file(GLOB react_featureflags_SRC CONFIGURE_DEPENDS *.cpp) add_library(react_featureflags OBJECT ${react_featureflags_SRC}) target_include_directories(react_featureflags PUBLIC ${REACT_COMMON_DIR}) -target_include_directories(react_featureflags INTERFACE ${REACT_COMMON_DIR}/react/featureflags) target_link_libraries(react_featureflags folly_runtime react_cxxstableapi) target_compile_reactnative_options(react_featureflags PRIVATE) diff --git a/packages/react-native/ReactCommon/react/featureflags/React-featureflags.podspec b/packages/react-native/ReactCommon/react/featureflags/React-featureflags.podspec index 722f327be12c..2ca2f65aeae8 100644 --- a/packages/react-native/ReactCommon/react/featureflags/React-featureflags.podspec +++ b/packages/react-native/ReactCommon/react/featureflags/React-featureflags.podspec @@ -43,11 +43,5 @@ Pod::Spec.new do |s| add_rn_third_party_dependencies(s) add_rncore_dependency(s) - s.subspec "featureflagsUmbrella" do |ss| - ss.source_files = "React/*.h" - ss.header_dir = "" - ss.header_mappings_dir = "." - end - mark_as_react_native_build(s) end diff --git a/packages/react-native/ReactCommon/react/featureflags/React/FeatureFlags.h b/packages/react-native/ReactCommon/react/featureflags/React/FeatureFlags.h deleted file mode 100644 index 2196f3fe14f4..000000000000 --- a/packages/react-native/ReactCommon/react/featureflags/React/FeatureFlags.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -#pragma once - -// ============================================================================= -// Umbrella header for the `react/featureflags` module - public entry point. -// -// #include -// -// Re-exports the module's public interface headers. React Native's own code -// should keep using the fine-grained `` includes, -// except in headers it exports to consumers: those are preprocessed in the -// consumer's translation unit, where the fine-grained include hits this -// module's . `RN_ALLOW_FRAMEWORKS` does not -// suppress that guard, so a "for frameworks" header must reach this module -// through the umbrella. -// -// The headers below are generated from -// `scripts/featureflags/ReactNativeFeatureFlags.config.js`, but this file is -// not - keep it in sync by hand when the set of generated headers in -// `scripts/featureflags/generateCommonCxxModules.js` changes. -// ============================================================================= - -// Marks that the following headers are pulled in through the umbrella, so their -// shared guard () accepts them. The marker -// is saved and restored rather than defined and undefined: the scope ends at -// this block, so later *direct* includes in the same TU are still caught, and -// it nests inside an enclosing umbrella rather than disarming it. -#pragma push_macro("RN_UMBRELLA_CONTEXT") -#undef RN_UMBRELLA_CONTEXT -#define RN_UMBRELLA_CONTEXT 1 - -#include -#include -#include -#include -#include -#include -#include -#include - -#undef RN_UMBRELLA_CONTEXT -#pragma pop_macro("RN_UMBRELLA_CONTEXT") diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.h b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.h index 9f667efb1b52..f16f57306b30 100644 --- a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.h +++ b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.h @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<03873d0e7381921dc1ed1372eec991c0>> + * @generated SignedSource<<4c93a39dd2a8ee5ba24f3f8bc99ac1ae>> */ /** @@ -19,7 +19,7 @@ #pragma once -#include +#include #include #include diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.h b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.h index 37b5bfe958f4..2bf0443bbf37 100644 --- a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.h +++ b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.h @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<<3e557788d6bd43975af8dcb392beef94>> */ /** @@ -19,7 +19,7 @@ #pragma once -#include +#include #include #include diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDefaults.h b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDefaults.h index 85fc19265b44..6406564a9659 100644 --- a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDefaults.h +++ b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDefaults.h @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<<07754aa6f05f6219f95a7b9a2e83ba49>> */ /** @@ -19,7 +19,7 @@ #pragma once -#include +#include #include diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDynamicProvider.h b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDynamicProvider.h index 69054b7f1f7d..0afb0a1f6d65 100644 --- a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDynamicProvider.h +++ b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDynamicProvider.h @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<> */ /** @@ -19,7 +19,7 @@ #pragma once -#include +#include #include #include diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsOverridesOSSCanary.h b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsOverridesOSSCanary.h index 00e5f1bf0dae..4b4a74abe343 100644 --- a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsOverridesOSSCanary.h +++ b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsOverridesOSSCanary.h @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<<94c1abd04adec2f81634da6786979552>> */ /** @@ -19,7 +19,7 @@ #pragma once -#include +#include #include diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsOverridesOSSExperimental.h b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsOverridesOSSExperimental.h index 38960c99d4cc..cdc3cf576cef 100644 --- a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsOverridesOSSExperimental.h +++ b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsOverridesOSSExperimental.h @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<<03cfd37618eb47d4612a78af04c9332f>> */ /** @@ -19,7 +19,7 @@ #pragma once -#include +#include #include diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsOverridesOSSStable.h b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsOverridesOSSStable.h index b9585918ed3f..928da2c941cf 100644 --- a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsOverridesOSSStable.h +++ b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsOverridesOSSStable.h @@ -7,7 +7,7 @@ #pragma once -#include +#include #include diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsProvider.h b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsProvider.h index d7516f95a5ab..497876aa4fcd 100644 --- a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsProvider.h +++ b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsProvider.h @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<51165e8390c454fe7f3bb07bb3a69bb9>> + * @generated SignedSource<> */ /** @@ -19,7 +19,7 @@ #pragma once -#include +#include namespace facebook::react { diff --git a/packages/react-native/scripts/featureflags/templates/common-cxx/ReactNativeFeatureFlags.h-template.js b/packages/react-native/scripts/featureflags/templates/common-cxx/ReactNativeFeatureFlags.h-template.js index 299d78dae172..c2c3d7a7f4af 100644 --- a/packages/react-native/scripts/featureflags/templates/common-cxx/ReactNativeFeatureFlags.h-template.js +++ b/packages/react-native/scripts/featureflags/templates/common-cxx/ReactNativeFeatureFlags.h-template.js @@ -27,7 +27,7 @@ ${DO_NOT_MODIFY_COMMENT} #pragma once -#include +#include #include #include diff --git a/packages/react-native/scripts/featureflags/templates/common-cxx/ReactNativeFeatureFlagsAccessor.h-template.js b/packages/react-native/scripts/featureflags/templates/common-cxx/ReactNativeFeatureFlagsAccessor.h-template.js index 751cb28156f6..2560c0d66cb2 100644 --- a/packages/react-native/scripts/featureflags/templates/common-cxx/ReactNativeFeatureFlagsAccessor.h-template.js +++ b/packages/react-native/scripts/featureflags/templates/common-cxx/ReactNativeFeatureFlagsAccessor.h-template.js @@ -27,7 +27,7 @@ ${DO_NOT_MODIFY_COMMENT} #pragma once -#include +#include #include #include diff --git a/packages/react-native/scripts/featureflags/templates/common-cxx/ReactNativeFeatureFlagsDefaults.h-template.js b/packages/react-native/scripts/featureflags/templates/common-cxx/ReactNativeFeatureFlagsDefaults.h-template.js index 37abc01c6358..95a06f1c29c4 100644 --- a/packages/react-native/scripts/featureflags/templates/common-cxx/ReactNativeFeatureFlagsDefaults.h-template.js +++ b/packages/react-native/scripts/featureflags/templates/common-cxx/ReactNativeFeatureFlagsDefaults.h-template.js @@ -31,7 +31,7 @@ ${DO_NOT_MODIFY_COMMENT} #pragma once -#include +#include #include diff --git a/packages/react-native/scripts/featureflags/templates/common-cxx/ReactNativeFeatureFlagsDynamicProvider.h-template.js b/packages/react-native/scripts/featureflags/templates/common-cxx/ReactNativeFeatureFlagsDynamicProvider.h-template.js index f590ad15fed1..099c2a6f7101 100644 --- a/packages/react-native/scripts/featureflags/templates/common-cxx/ReactNativeFeatureFlagsDynamicProvider.h-template.js +++ b/packages/react-native/scripts/featureflags/templates/common-cxx/ReactNativeFeatureFlagsDynamicProvider.h-template.js @@ -31,7 +31,7 @@ ${DO_NOT_MODIFY_COMMENT} #pragma once -#include +#include #include #include diff --git a/packages/react-native/scripts/featureflags/templates/common-cxx/ReactNativeFeatureFlagsOverridesOSS_Stage_.h-template.js b/packages/react-native/scripts/featureflags/templates/common-cxx/ReactNativeFeatureFlagsOverridesOSS_Stage_.h-template.js index a339dda9894b..354418fe236f 100644 --- a/packages/react-native/scripts/featureflags/templates/common-cxx/ReactNativeFeatureFlagsOverridesOSS_Stage_.h-template.js +++ b/packages/react-native/scripts/featureflags/templates/common-cxx/ReactNativeFeatureFlagsOverridesOSS_Stage_.h-template.js @@ -54,7 +54,7 @@ ${DO_NOT_MODIFY_COMMENT} #pragma once -#include +#include #include diff --git a/packages/react-native/scripts/featureflags/templates/common-cxx/ReactNativeFeatureFlagsProvider.h-template.js b/packages/react-native/scripts/featureflags/templates/common-cxx/ReactNativeFeatureFlagsProvider.h-template.js index 53a1755e9fa1..0948a8e7dfb2 100644 --- a/packages/react-native/scripts/featureflags/templates/common-cxx/ReactNativeFeatureFlagsProvider.h-template.js +++ b/packages/react-native/scripts/featureflags/templates/common-cxx/ReactNativeFeatureFlagsProvider.h-template.js @@ -27,7 +27,7 @@ ${DO_NOT_MODIFY_COMMENT} #pragma once -#include +#include namespace facebook::react { diff --git a/packages/react-native/scripts/ios-prebuild/headers-config.js b/packages/react-native/scripts/ios-prebuild/headers-config.js index bd4f5fa955f0..e6b5eb70b61c 100644 --- a/packages/react-native/scripts/ios-prebuild/headers-config.js +++ b/packages/react-native/scripts/ios-prebuild/headers-config.js @@ -336,23 +336,6 @@ const PodspecExceptions /*: {[key: string]: PodSpecConfiguration} */ = { headerPatterns: ['*.h'], headerDir: 'jsinspector-modern/tracing', }, - 'ReactCommon/react/featureflags/React-featureflags.podspec': { - name: 'React-featureflags', - headerPatterns: [], - headerDir: '', - subSpecs: [ - { - name: 'featureflags', - headerPatterns: ['*.h'], - headerDir: 'react/featureflags', - }, - { - name: 'featureflagsUmbrella', - headerPatterns: ['React/*.h'], - headerDir: 'React', - }, - ], - }, 'React/React-RCTFabric.podspec': { name: 'React-RCTFabric', headerPatterns: ['Fabric/**/*.h'], diff --git a/packages/react-native/scripts/ios-prebuild/setup.js b/packages/react-native/scripts/ios-prebuild/setup.js index 715eba6af0af..90be5ec8b93e 100644 --- a/packages/react-native/scripts/ios-prebuild/setup.js +++ b/packages/react-native/scripts/ios-prebuild/setup.js @@ -122,7 +122,6 @@ async function setup( link('ReactCommon/react/renderer/debug'); link('ReactCommon/react/renderer/debug/React', 'React'); link('ReactCommon/react/featureflags'); - link('ReactCommon/react/featureflags/React', 'React'); link('ReactCommon/react/renderer/graphics'); link( 'ReactCommon/react/renderer/graphics/platform/ios', From 566d66fa8b94f166dedd6ccd72247f25fe6e935a Mon Sep 17 00:00:00 2001 From: Jakub Piasecki Date: Wed, 30 Sep 2026 00:43:29 -0700 Subject: [PATCH 4/5] Use umbrellas instead of direct includes in renderer/imagemanager module Summary: Changelog: [Internal] Part of the C++ stable API migration to umbrella includes. The `renderer/imagemanager` headers included other public modules through their fine-grained, `UmbrellaGuard`-protected headers. They now include those modules' umbrellas instead: ``, ``, ``, ``, ``, `` and ``. Includes of the module's own headers and all `.cpp`/`.mm` files are unchanged. No functional change. Differential Revision: D122119728 --- .../react/renderer/imagemanager/ImageManager.h | 4 ++-- .../react/renderer/imagemanager/ImageRequest.h | 2 +- .../imagemanager/ImageResponseObserverCoordinator.h | 2 +- .../react/renderer/imagemanager/ImageTelemetry.h | 4 ++-- .../android/react/renderer/imagemanager/ImageFetcher.h | 2 +- .../react/renderer/imagemanager/ImageRequestParams.h | 3 +-- .../android/react/renderer/imagemanager/conversions.h | 7 +++---- .../cxx/react/renderer/imagemanager/ImageRequestParams.h | 2 +- .../ios/react/renderer/imagemanager/ImageRequestParams.h | 2 +- .../renderer/imagemanager/RCTImageManagerProtocol.h | 2 +- .../ReactCommon/react/renderer/imagemanager/primitives.h | 9 ++++----- 11 files changed, 18 insertions(+), 21 deletions(-) diff --git a/packages/react-native/ReactCommon/react/renderer/imagemanager/ImageManager.h b/packages/react-native/ReactCommon/react/renderer/imagemanager/ImageManager.h index c240b656da84..e72791d013a4 100644 --- a/packages/react-native/ReactCommon/react/renderer/imagemanager/ImageManager.h +++ b/packages/react-native/ReactCommon/react/renderer/imagemanager/ImageManager.h @@ -11,11 +11,11 @@ #include -#include +#include +#include #include #include #include -#include namespace facebook::react { diff --git a/packages/react-native/ReactCommon/react/renderer/imagemanager/ImageRequest.h b/packages/react-native/ReactCommon/react/renderer/imagemanager/ImageRequest.h index db67cde3d1fa..c8b87da7f06b 100644 --- a/packages/react-native/ReactCommon/react/renderer/imagemanager/ImageRequest.h +++ b/packages/react-native/ReactCommon/react/renderer/imagemanager/ImageRequest.h @@ -9,12 +9,12 @@ #include +#include #include #include #include #include #include -#include namespace facebook::react { diff --git a/packages/react-native/ReactCommon/react/renderer/imagemanager/ImageResponseObserverCoordinator.h b/packages/react-native/ReactCommon/react/renderer/imagemanager/ImageResponseObserverCoordinator.h index f92a7a939f22..b605478f7a76 100644 --- a/packages/react-native/ReactCommon/react/renderer/imagemanager/ImageResponseObserverCoordinator.h +++ b/packages/react-native/ReactCommon/react/renderer/imagemanager/ImageResponseObserverCoordinator.h @@ -9,9 +9,9 @@ #include +#include #include #include -#include #include #include diff --git a/packages/react-native/ReactCommon/react/renderer/imagemanager/ImageTelemetry.h b/packages/react-native/ReactCommon/react/renderer/imagemanager/ImageTelemetry.h index 90a1d9b84e25..d8a566d846df 100644 --- a/packages/react-native/ReactCommon/react/renderer/imagemanager/ImageTelemetry.h +++ b/packages/react-native/ReactCommon/react/renderer/imagemanager/ImageTelemetry.h @@ -9,8 +9,8 @@ #include -#include -#include +#include +#include namespace facebook::react { diff --git a/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/android/react/renderer/imagemanager/ImageFetcher.h b/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/android/react/renderer/imagemanager/ImageFetcher.h index 7b7aa318c6f1..14ee16304527 100644 --- a/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/android/react/renderer/imagemanager/ImageFetcher.h +++ b/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/android/react/renderer/imagemanager/ImageFetcher.h @@ -9,9 +9,9 @@ #include +#include #include #include -#include #include #include #include diff --git a/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/android/react/renderer/imagemanager/ImageRequestParams.h b/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/android/react/renderer/imagemanager/ImageRequestParams.h index 4a9fac49a221..42df8cecf013 100644 --- a/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/android/react/renderer/imagemanager/ImageRequestParams.h +++ b/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/android/react/renderer/imagemanager/ImageRequestParams.h @@ -11,8 +11,7 @@ #include -#include -#include +#include #include namespace facebook::react { diff --git a/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/android/react/renderer/imagemanager/conversions.h b/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/android/react/renderer/imagemanager/conversions.h index 21692968254f..6446b0fd822e 100644 --- a/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/android/react/renderer/imagemanager/conversions.h +++ b/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/android/react/renderer/imagemanager/conversions.h @@ -9,13 +9,12 @@ #include +#include +#include +#include #include -#include #include #include -#include -#include -#include #include namespace facebook::react { diff --git a/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/cxx/react/renderer/imagemanager/ImageRequestParams.h b/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/cxx/react/renderer/imagemanager/ImageRequestParams.h index a0df53c97708..1a78606ddf46 100644 --- a/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/cxx/react/renderer/imagemanager/ImageRequestParams.h +++ b/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/cxx/react/renderer/imagemanager/ImageRequestParams.h @@ -9,7 +9,7 @@ #include -#include +#include namespace facebook::react { diff --git a/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/ios/react/renderer/imagemanager/ImageRequestParams.h b/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/ios/react/renderer/imagemanager/ImageRequestParams.h index 417f0d73c990..dd7ae8f7cf66 100644 --- a/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/ios/react/renderer/imagemanager/ImageRequestParams.h +++ b/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/ios/react/renderer/imagemanager/ImageRequestParams.h @@ -9,7 +9,7 @@ #include -#include +#include namespace facebook::react { diff --git a/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/ios/react/renderer/imagemanager/RCTImageManagerProtocol.h b/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/ios/react/renderer/imagemanager/RCTImageManagerProtocol.h index 30bfbf391e35..408b6c45b9ab 100644 --- a/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/ios/react/renderer/imagemanager/RCTImageManagerProtocol.h +++ b/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/ios/react/renderer/imagemanager/RCTImageManagerProtocol.h @@ -6,7 +6,7 @@ */ #import -#import +#import #import @protocol RCTImageManagerProtocol diff --git a/packages/react-native/ReactCommon/react/renderer/imagemanager/primitives.h b/packages/react-native/ReactCommon/react/renderer/imagemanager/primitives.h index b044ae1071ec..2743da4430ee 100644 --- a/packages/react-native/ReactCommon/react/renderer/imagemanager/primitives.h +++ b/packages/react-native/ReactCommon/react/renderer/imagemanager/primitives.h @@ -12,12 +12,11 @@ #include #include -#include -#include -#include +#include +#include +#include +#include #include -#include -#include namespace facebook::react { From a3893ee566dfa01c9b6a2683e637b91a9184815a Mon Sep 17 00:00:00 2001 From: Jakub Piasecki Date: Wed, 30 Sep 2026 03:17:35 -0700 Subject: [PATCH 5/5] Use umbrellas instead of direct includes in nativemodule/core module (#58711) Summary: Pull Request resolved: https://github.com/react/react-native/pull/58711 Changelog: [Internal] Part of the C++ stable API migration to umbrella includes. The `nativemodule/core` headers included other public modules through their fine-grained, `UmbrellaGuard`-protected headers. They now include those modules' umbrellas instead: ``, `` and ``. This matters most for the iOS `RCTTurboModule*.h` headers, which are exported, have no guard, and are not reached through ``. Includes of the module's own headers and all `.cpp`/`.mm` files are unchanged. No functional change. Differential Revision: D122123056 --- .../react/nativemodule/core/ReactCommon/CxxTurboModuleUtils.h | 2 +- .../react/nativemodule/core/ReactCommon/TurboModule.h | 4 ++-- .../react/nativemodule/core/ReactCommon/TurboModuleBinding.h | 2 +- .../react/nativemodule/core/ReactCommon/TurboModuleUtils.h | 2 +- .../core/ReactCommon/TurboModuleWithJSIBindings.h | 2 +- .../core/platform/android/ReactCommon/JavaTurboModule.h | 4 ++-- .../core/platform/ios/React-NativeModulesApple.podspec | 1 + .../core/platform/ios/ReactCommon/RCTInteropTurboModule.h | 2 +- .../core/platform/ios/ReactCommon/RCTTurboModule.h | 4 ++-- .../core/platform/ios/ReactCommon/RCTTurboModuleManager.h | 4 ++-- .../platform/ios/ReactCommon/RCTTurboModuleWithJSIBindings.h | 2 +- 11 files changed, 15 insertions(+), 14 deletions(-) diff --git a/packages/react-native/ReactCommon/react/nativemodule/core/ReactCommon/CxxTurboModuleUtils.h b/packages/react-native/ReactCommon/react/nativemodule/core/ReactCommon/CxxTurboModuleUtils.h index 024c8cff8891..04c5997ade54 100644 --- a/packages/react-native/ReactCommon/react/nativemodule/core/ReactCommon/CxxTurboModuleUtils.h +++ b/packages/react-native/ReactCommon/react/nativemodule/core/ReactCommon/CxxTurboModuleUtils.h @@ -9,7 +9,7 @@ #include -#include +#include #include #include #include diff --git a/packages/react-native/ReactCommon/react/nativemodule/core/ReactCommon/TurboModule.h b/packages/react-native/ReactCommon/react/nativemodule/core/ReactCommon/TurboModule.h index 237868170b15..6bedaa1f704a 100644 --- a/packages/react-native/ReactCommon/react/nativemodule/core/ReactCommon/TurboModule.h +++ b/packages/react-native/ReactCommon/react/nativemodule/core/ReactCommon/TurboModule.h @@ -15,8 +15,8 @@ #include -#include -#include +#include +#include namespace facebook::react { diff --git a/packages/react-native/ReactCommon/react/nativemodule/core/ReactCommon/TurboModuleBinding.h b/packages/react-native/ReactCommon/react/nativemodule/core/ReactCommon/TurboModuleBinding.h index 74aee0f7c30f..ca0990fd4f63 100644 --- a/packages/react-native/ReactCommon/react/nativemodule/core/ReactCommon/TurboModuleBinding.h +++ b/packages/react-native/ReactCommon/react/nativemodule/core/ReactCommon/TurboModuleBinding.h @@ -11,8 +11,8 @@ #include +#include #include -#include #include diff --git a/packages/react-native/ReactCommon/react/nativemodule/core/ReactCommon/TurboModuleUtils.h b/packages/react-native/ReactCommon/react/nativemodule/core/ReactCommon/TurboModuleUtils.h index 60c730f93cdc..f000cda626ca 100644 --- a/packages/react-native/ReactCommon/react/nativemodule/core/ReactCommon/TurboModuleUtils.h +++ b/packages/react-native/ReactCommon/react/nativemodule/core/ReactCommon/TurboModuleUtils.h @@ -9,8 +9,8 @@ #include +#include #include -#include #include #include #include diff --git a/packages/react-native/ReactCommon/react/nativemodule/core/ReactCommon/TurboModuleWithJSIBindings.h b/packages/react-native/ReactCommon/react/nativemodule/core/ReactCommon/TurboModuleWithJSIBindings.h index 012666fd87a7..2e7c42a839c1 100644 --- a/packages/react-native/ReactCommon/react/nativemodule/core/ReactCommon/TurboModuleWithJSIBindings.h +++ b/packages/react-native/ReactCommon/react/nativemodule/core/ReactCommon/TurboModuleWithJSIBindings.h @@ -9,7 +9,7 @@ #include -#include +#include #include namespace facebook::react { diff --git a/packages/react-native/ReactCommon/react/nativemodule/core/platform/android/ReactCommon/JavaTurboModule.h b/packages/react-native/ReactCommon/react/nativemodule/core/platform/android/ReactCommon/JavaTurboModule.h index a60941880b71..f5c7fde52394 100644 --- a/packages/react-native/ReactCommon/react/nativemodule/core/platform/android/ReactCommon/JavaTurboModule.h +++ b/packages/react-native/ReactCommon/react/nativemodule/core/platform/android/ReactCommon/JavaTurboModule.h @@ -11,10 +11,10 @@ #include -#include +#include +#include #include #include -#include #include namespace facebook::react { diff --git a/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/React-NativeModulesApple.podspec b/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/React-NativeModulesApple.podspec index 4e637f576029..22056e32e323 100644 --- a/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/React-NativeModulesApple.podspec +++ b/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/React-NativeModulesApple.podspec @@ -37,6 +37,7 @@ Pod::Spec.new do |s| s.source_files = podspec_sources("ReactCommon/**/*.{mm,cpp,h}", "ReactCommon/**/*.{h}") s.dependency "ReactCommon/turbomodule/core" + s.dependency "ReactCommon/turbomodule/coreUmbrella" s.dependency "React-bridging" s.dependency "React-callinvoker" s.dependency "React-Core" diff --git a/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTInteropTurboModule.h b/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTInteropTurboModule.h index 62a82b7e61f0..957be1e85147 100644 --- a/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTInteropTurboModule.h +++ b/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTInteropTurboModule.h @@ -12,7 +12,7 @@ #import #import -#import +#import #import #import "RCTTurboModule.h" diff --git a/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTTurboModule.h b/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTTurboModule.h index fcd3231c3833..2050b7bcee89 100644 --- a/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTTurboModule.h +++ b/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTTurboModule.h @@ -9,11 +9,11 @@ #import +#import +#import #import #import #import -#import -#import #import #import #import diff --git a/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTTurboModuleManager.h b/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTTurboModuleManager.h index b7f4789ba0e4..b7208e05103e 100644 --- a/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTTurboModuleManager.h +++ b/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTTurboModuleManager.h @@ -9,11 +9,11 @@ #import +#import #import #import #import -#import -#import +#import #import "RCTTurboModule.h" diff --git a/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTTurboModuleWithJSIBindings.h b/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTTurboModuleWithJSIBindings.h index 6e23cdb2f1bc..14a50c8fd8c8 100644 --- a/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTTurboModuleWithJSIBindings.h +++ b/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTTurboModuleWithJSIBindings.h @@ -8,7 +8,7 @@ #import #ifdef __cplusplus -#include +#include #include #endif