From 92e4484b6158f9c62e7be43a26570e494fcf4426 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dawid=20Ma=C5=82ecki?= Date: Fri, 21 Aug 2026 01:23:09 -0700 Subject: [PATCH 1/2] Add stable public MapBuffer C++ entry point (#58013) Summary: Add `` as the public C++ entry point for MapBuffer and MapBufferBuilder. Guard direct leaf-header inclusion for strict API consumers while preserving existing React Native builds and legacy include paths. Export and stage the umbrella consistently through Buck, CMake, Android Prefab, CocoaPods, and the Apple prebuilt-header inventory. Changelog: [Internal] Reviewed By: cipolleschi Differential Revision: D116632721 --- .../ReactAndroid/build.gradle.kts | 1 + .../ReactCommon/React-Mapbuffer.podspec | 9 ++++++- .../react/renderer/mapbuffer/CMakeLists.txt | 2 +- .../react/renderer/mapbuffer/MapBuffer.h | 1 + .../renderer/mapbuffer/MapBufferBuilder.h | 1 + .../renderer/mapbuffer/React/MapBuffer.h | 27 +++++++++++++++++++ .../scripts/ios-prebuild/headers-config.js | 16 +++++++++++ 7 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 packages/react-native/ReactCommon/react/renderer/mapbuffer/React/MapBuffer.h diff --git a/packages/react-native/ReactAndroid/build.gradle.kts b/packages/react-native/ReactAndroid/build.gradle.kts index 35d649309b60..3ed3fbe9d3c1 100644 --- a/packages/react-native/ReactAndroid/build.gradle.kts +++ b/packages/react-native/ReactAndroid/build.gradle.kts @@ -252,6 +252,7 @@ val preparePrefab by "react/renderer/leakchecker/", ), Pair("../ReactCommon/react/renderer/mapbuffer/", "react/renderer/mapbuffer/"), + Pair("../ReactCommon/react/renderer/mapbuffer/React/", "React/"), Pair("../ReactCommon/react/renderer/mounting/", "react/renderer/mounting/"), Pair( "../ReactCommon/react/renderer/runtimescheduler/", diff --git a/packages/react-native/ReactCommon/React-Mapbuffer.podspec b/packages/react-native/ReactCommon/React-Mapbuffer.podspec index 74cef67a4e40..133f9e5010f0 100644 --- a/packages/react-native/ReactCommon/React-Mapbuffer.podspec +++ b/packages/react-native/ReactCommon/React-Mapbuffer.podspec @@ -26,14 +26,21 @@ Pod::Spec.new do |s| s.platforms = min_supported_versions s.source = source s.source_files = podspec_sources("react/renderer/mapbuffer/*.{cpp,h}", "react/renderer/mapbuffer/*.h") - s.exclude_files = "react/renderer/mapbuffer/tests" + s.exclude_files = ["react/renderer/mapbuffer/tests", "react/renderer/mapbuffer/React"] s.public_header_files = 'react/renderer/mapbuffer/*.h' s.header_dir = "react/renderer/mapbuffer" s.pod_target_xcconfig = { "HEADER_SEARCH_PATHS" => ["\"$(PODS_TARGET_SRCROOT)\""], "USE_HEADERMAP" => "YES", "CLANG_CXX_LANGUAGE_STANDARD" => rct_cxx_language_standard() } + s.subspec "MapBufferUmbrella" do |ss| + ss.source_files = "react/renderer/mapbuffer/React/*.h" + ss.header_dir = "React" + ss.header_mappings_dir = "react/renderer/mapbuffer/React" + end + resolve_use_frameworks(s, header_mappings_dir: './', module_name: "React_Mapbuffer") + s.dependency "React-cxxstableapi" add_dependency(s, "React-debug") add_rn_third_party_dependencies(s) add_rncore_dependency(s) diff --git a/packages/react-native/ReactCommon/react/renderer/mapbuffer/CMakeLists.txt b/packages/react-native/ReactCommon/react/renderer/mapbuffer/CMakeLists.txt index 0930ec9ee1b2..0d0ef6c27be2 100644 --- a/packages/react-native/ReactCommon/react/renderer/mapbuffer/CMakeLists.txt +++ b/packages/react-native/ReactCommon/react/renderer/mapbuffer/CMakeLists.txt @@ -11,6 +11,6 @@ file(GLOB react_renderer_mapbuffer_SRC CONFIGURE_DEPENDS *.cpp) add_library(react_renderer_mapbuffer OBJECT ${react_renderer_mapbuffer_SRC}) target_include_directories(react_renderer_mapbuffer PUBLIC ${REACT_COMMON_DIR}) -target_link_libraries(react_renderer_mapbuffer glog glog_init react_debug) +target_link_libraries(react_renderer_mapbuffer glog glog_init react_cxxstableapi react_debug) target_compile_reactnative_options(react_renderer_mapbuffer PRIVATE) target_compile_options(react_renderer_mapbuffer PRIVATE -Wpedantic) diff --git a/packages/react-native/ReactCommon/react/renderer/mapbuffer/MapBuffer.h b/packages/react-native/ReactCommon/react/renderer/mapbuffer/MapBuffer.h index 07b64bdfba99..d57b5ef2e9a7 100644 --- a/packages/react-native/ReactCommon/react/renderer/mapbuffer/MapBuffer.h +++ b/packages/react-native/ReactCommon/react/renderer/mapbuffer/MapBuffer.h @@ -7,6 +7,7 @@ #pragma once +#include #include #include diff --git a/packages/react-native/ReactCommon/react/renderer/mapbuffer/MapBufferBuilder.h b/packages/react-native/ReactCommon/react/renderer/mapbuffer/MapBufferBuilder.h index 2963c77a9b36..66a36a94b2f7 100644 --- a/packages/react-native/ReactCommon/react/renderer/mapbuffer/MapBufferBuilder.h +++ b/packages/react-native/ReactCommon/react/renderer/mapbuffer/MapBufferBuilder.h @@ -7,6 +7,7 @@ #pragma once +#include #include #include #include "MapBuffer.h" diff --git a/packages/react-native/ReactCommon/react/renderer/mapbuffer/React/MapBuffer.h b/packages/react-native/ReactCommon/react/renderer/mapbuffer/React/MapBuffer.h new file mode 100644 index 000000000000..898a7befe37e --- /dev/null +++ b/packages/react-native/ReactCommon/react/renderer/mapbuffer/React/MapBuffer.h @@ -0,0 +1,27 @@ +/* + * 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/renderer/mapbuffer` 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; +// only outside consumers use this umbrella. +// ============================================================================= + +// Marks that the following headers are pulled in through the umbrella, so their +// shared guard () accepts them. +#define RN_UMBRELLA_CONTEXT + +#include +#include + +#undef RN_UMBRELLA_CONTEXT diff --git a/packages/react-native/scripts/ios-prebuild/headers-config.js b/packages/react-native/scripts/ios-prebuild/headers-config.js index d794aad3b174..ccf4d23a6ac4 100644 --- a/packages/react-native/scripts/ios-prebuild/headers-config.js +++ b/packages/react-native/scripts/ios-prebuild/headers-config.js @@ -466,6 +466,22 @@ const PodspecExceptions /*: {[key: string]: PodSpecConfiguration} */ = { }, ], }, + 'ReactCommon/React-Mapbuffer.podspec': { + name: 'React-Mapbuffer', + headerPatterns: ['react/renderer/mapbuffer/**/*.h'], + excludePatterns: [ + 'react/renderer/mapbuffer/tests', + 'react/renderer/mapbuffer/React', + ], + headerDir: 'react/renderer/mapbuffer', + subSpecs: [ + { + name: 'MapBufferUmbrella', + headerPatterns: ['react/renderer/mapbuffer/React/*.h'], + headerDir: 'React', + }, + ], + }, 'ReactCommon/React-FabricImage.podspec': { name: 'React-FabricImage', headerPatterns: ['react/renderer/components/image/**/*.h'], From 7dcfcc48be9aad4fe8458c4e6f35f94ae201fccd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dawid=20Ma=C5=82ecki?= Date: Fri, 21 Aug 2026 01:23:09 -0700 Subject: [PATCH 2/2] Add umbrella for `react/renderer/uimanager` subtree (#58025) Summary: Rolls the umbrella-header + include-guard mechanism across the `react/renderer/uimanager` module, classifying the target as public. - Adds ``, re-exporting the module's public interface headers. - Adds `` to the module's public headers. - Wires the umbrella header directory into the Buck, CMake, CocoaPods, Gradle, and iOS prebuild header configurations. - Deprecated `SurfaceRegistryBinding.h` does not include umbrella guard because it will fail anyway when included directly (it includes AppRegistryBinding that does include guard). React Native's own sources keep using the fine-grained `` includes; only outside consumers use the umbrella. Changelog: [Internal] Reviewed By: cipolleschi Differential Revision: D116763079 --- .../ReactAndroid/build.gradle.kts | 1 + .../ReactCommon/React-Fabric.podspec | 6 +++ .../renderer/uimanager/AppRegistryBinding.h | 2 + .../react/renderer/uimanager/CMakeLists.txt | 1 + .../uimanager/LayoutAnimationStatusDelegate.h | 2 + .../renderer/uimanager/LayoutEventEmitter.h | 2 + .../uimanager/PointerEventsProcessor.h | 2 + .../renderer/uimanager/PointerHoverTracker.h | 2 + .../renderer/uimanager/React/UIManager.h | 41 +++++++++++++++++++ .../react/renderer/uimanager/UIManager.h | 2 + .../uimanager/UIManagerAnimationBackend.h | 2 + .../uimanager/UIManagerAnimationDelegate.h | 2 + .../renderer/uimanager/UIManagerBinding.h | 2 + .../renderer/uimanager/UIManagerCommitHook.h | 2 + .../renderer/uimanager/UIManagerDelegate.h | 2 + .../renderer/uimanager/UIManagerMountHook.h | 2 + .../UIManagerNativeAnimatedDelegate.h | 2 + .../UIManagerViewTransitionDelegate.h | 2 + .../react/renderer/uimanager/primitives.h | 2 + .../scripts/ios-prebuild/headers-config.js | 6 +++ 20 files changed, 85 insertions(+) create mode 100644 packages/react-native/ReactCommon/react/renderer/uimanager/React/UIManager.h diff --git a/packages/react-native/ReactAndroid/build.gradle.kts b/packages/react-native/ReactAndroid/build.gradle.kts index 3ed3fbe9d3c1..245f986adf20 100644 --- a/packages/react-native/ReactAndroid/build.gradle.kts +++ b/packages/react-native/ReactAndroid/build.gradle.kts @@ -160,6 +160,7 @@ val preparePrefab by Pair("../ReactCommon/react/renderer/scheduler/", "react/renderer/scheduler/"), // react_renderer_uimanager Pair("../ReactCommon/react/renderer/uimanager/", "react/renderer/uimanager/"), + Pair("../ReactCommon/react/renderer/uimanager/React/", "React/"), // react_utils Pair("../ReactCommon/react/utils/", "react/utils/"), // rrc_image diff --git a/packages/react-native/ReactCommon/React-Fabric.podspec b/packages/react-native/ReactCommon/React-Fabric.podspec index f86733e6c181..275c83ab9a41 100644 --- a/packages/react-native/ReactCommon/React-Fabric.podspec +++ b/packages/react-native/ReactCommon/React-Fabric.podspec @@ -250,6 +250,12 @@ Pod::Spec.new do |s| ss.header_dir = "react/renderer/uimanager" end + s.subspec "uimanagerUmbrella" do |ss| + ss.source_files = "react/renderer/uimanager/React/*.h" + ss.header_dir = "React" + ss.header_mappings_dir = "react/renderer/uimanager/React" + end + s.subspec "leakchecker" do |ss| ss.source_files = podspec_sources("react/renderer/leakchecker/**/*.{cpp,h}", "react/renderer/leakchecker/**/*.h") ss.exclude_files = "react/renderer/leakchecker/tests" diff --git a/packages/react-native/ReactCommon/react/renderer/uimanager/AppRegistryBinding.h b/packages/react-native/ReactCommon/react/renderer/uimanager/AppRegistryBinding.h index f71565b9149b..68e59c572105 100644 --- a/packages/react-native/ReactCommon/react/renderer/uimanager/AppRegistryBinding.h +++ b/packages/react-native/ReactCommon/react/renderer/uimanager/AppRegistryBinding.h @@ -7,6 +7,8 @@ #pragma once +#include + #include #include #include diff --git a/packages/react-native/ReactCommon/react/renderer/uimanager/CMakeLists.txt b/packages/react-native/ReactCommon/react/renderer/uimanager/CMakeLists.txt index 388602c0d6e3..f8e0b076c868 100644 --- a/packages/react-native/ReactCommon/react/renderer/uimanager/CMakeLists.txt +++ b/packages/react-native/ReactCommon/react/renderer/uimanager/CMakeLists.txt @@ -18,6 +18,7 @@ target_link_libraries(react_renderer_uimanager folly_runtime jsi react_cxxreact + react_cxxstableapi react_debug react_featureflags react_renderer_componentregistry diff --git a/packages/react-native/ReactCommon/react/renderer/uimanager/LayoutAnimationStatusDelegate.h b/packages/react-native/ReactCommon/react/renderer/uimanager/LayoutAnimationStatusDelegate.h index 821cb2531a57..880fff380eb9 100644 --- a/packages/react-native/ReactCommon/react/renderer/uimanager/LayoutAnimationStatusDelegate.h +++ b/packages/react-native/ReactCommon/react/renderer/uimanager/LayoutAnimationStatusDelegate.h @@ -7,6 +7,8 @@ #pragma once +#include + namespace facebook::react { class LayoutAnimationStatusDelegate { diff --git a/packages/react-native/ReactCommon/react/renderer/uimanager/LayoutEventEmitter.h b/packages/react-native/ReactCommon/react/renderer/uimanager/LayoutEventEmitter.h index 4506cfabc8de..dc4d1d4e6731 100644 --- a/packages/react-native/ReactCommon/react/renderer/uimanager/LayoutEventEmitter.h +++ b/packages/react-native/ReactCommon/react/renderer/uimanager/LayoutEventEmitter.h @@ -7,6 +7,8 @@ #pragma once +#include + #include namespace facebook::react { diff --git a/packages/react-native/ReactCommon/react/renderer/uimanager/PointerEventsProcessor.h b/packages/react-native/ReactCommon/react/renderer/uimanager/PointerEventsProcessor.h index e39dcf5f21db..8f65f8458b1a 100644 --- a/packages/react-native/ReactCommon/react/renderer/uimanager/PointerEventsProcessor.h +++ b/packages/react-native/ReactCommon/react/renderer/uimanager/PointerEventsProcessor.h @@ -7,6 +7,8 @@ #pragma once +#include + #include #include diff --git a/packages/react-native/ReactCommon/react/renderer/uimanager/PointerHoverTracker.h b/packages/react-native/ReactCommon/react/renderer/uimanager/PointerHoverTracker.h index 712a3cdfffc2..cc590924dfe9 100644 --- a/packages/react-native/ReactCommon/react/renderer/uimanager/PointerHoverTracker.h +++ b/packages/react-native/ReactCommon/react/renderer/uimanager/PointerHoverTracker.h @@ -7,6 +7,8 @@ #pragma once +#include + #include #include #include diff --git a/packages/react-native/ReactCommon/react/renderer/uimanager/React/UIManager.h b/packages/react-native/ReactCommon/react/renderer/uimanager/React/UIManager.h new file mode 100644 index 000000000000..0eb6cedb315b --- /dev/null +++ b/packages/react-native/ReactCommon/react/renderer/uimanager/React/UIManager.h @@ -0,0 +1,41 @@ +/* + * 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/renderer/uimanager` 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; +// only outside consumers use this umbrella. +// ============================================================================= + +// Marks that the following headers are pulled in through the umbrella, so their +// shared guard () accepts them. +#define RN_UMBRELLA_CONTEXT + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#undef RN_UMBRELLA_CONTEXT diff --git a/packages/react-native/ReactCommon/react/renderer/uimanager/UIManager.h b/packages/react-native/ReactCommon/react/renderer/uimanager/UIManager.h index f7452c8defe6..223dcae26a83 100644 --- a/packages/react-native/ReactCommon/react/renderer/uimanager/UIManager.h +++ b/packages/react-native/ReactCommon/react/renderer/uimanager/UIManager.h @@ -7,6 +7,8 @@ #pragma once +#include + #include #include diff --git a/packages/react-native/ReactCommon/react/renderer/uimanager/UIManagerAnimationBackend.h b/packages/react-native/ReactCommon/react/renderer/uimanager/UIManagerAnimationBackend.h index 27c39b18e5e0..a6ffded2ac8e 100644 --- a/packages/react-native/ReactCommon/react/renderer/uimanager/UIManagerAnimationBackend.h +++ b/packages/react-native/ReactCommon/react/renderer/uimanager/UIManagerAnimationBackend.h @@ -7,6 +7,8 @@ #pragma once +#include + #include #include #include diff --git a/packages/react-native/ReactCommon/react/renderer/uimanager/UIManagerAnimationDelegate.h b/packages/react-native/ReactCommon/react/renderer/uimanager/UIManagerAnimationDelegate.h index ac310eb4ad96..36cb9140a929 100644 --- a/packages/react-native/ReactCommon/react/renderer/uimanager/UIManagerAnimationDelegate.h +++ b/packages/react-native/ReactCommon/react/renderer/uimanager/UIManagerAnimationDelegate.h @@ -7,6 +7,8 @@ #pragma once +#include + #include #include diff --git a/packages/react-native/ReactCommon/react/renderer/uimanager/UIManagerBinding.h b/packages/react-native/ReactCommon/react/renderer/uimanager/UIManagerBinding.h index 0d1910b442b6..8133ac07a443 100644 --- a/packages/react-native/ReactCommon/react/renderer/uimanager/UIManagerBinding.h +++ b/packages/react-native/ReactCommon/react/renderer/uimanager/UIManagerBinding.h @@ -7,6 +7,8 @@ #pragma once +#include + #include #include #include diff --git a/packages/react-native/ReactCommon/react/renderer/uimanager/UIManagerCommitHook.h b/packages/react-native/ReactCommon/react/renderer/uimanager/UIManagerCommitHook.h index 30f5d0e6d61e..2bb6940bf5d6 100644 --- a/packages/react-native/ReactCommon/react/renderer/uimanager/UIManagerCommitHook.h +++ b/packages/react-native/ReactCommon/react/renderer/uimanager/UIManagerCommitHook.h @@ -7,6 +7,8 @@ #pragma once +#include + #include namespace facebook::react { diff --git a/packages/react-native/ReactCommon/react/renderer/uimanager/UIManagerDelegate.h b/packages/react-native/ReactCommon/react/renderer/uimanager/UIManagerDelegate.h index ef4dd73de763..e5c761302439 100644 --- a/packages/react-native/ReactCommon/react/renderer/uimanager/UIManagerDelegate.h +++ b/packages/react-native/ReactCommon/react/renderer/uimanager/UIManagerDelegate.h @@ -7,6 +7,8 @@ #pragma once +#include + #include #include #include diff --git a/packages/react-native/ReactCommon/react/renderer/uimanager/UIManagerMountHook.h b/packages/react-native/ReactCommon/react/renderer/uimanager/UIManagerMountHook.h index 763efb8b3535..ab2071590d95 100644 --- a/packages/react-native/ReactCommon/react/renderer/uimanager/UIManagerMountHook.h +++ b/packages/react-native/ReactCommon/react/renderer/uimanager/UIManagerMountHook.h @@ -7,6 +7,8 @@ #pragma once +#include + #include #include "UIManager.h" diff --git a/packages/react-native/ReactCommon/react/renderer/uimanager/UIManagerNativeAnimatedDelegate.h b/packages/react-native/ReactCommon/react/renderer/uimanager/UIManagerNativeAnimatedDelegate.h index a163a3741a59..0e524ba0a864 100644 --- a/packages/react-native/ReactCommon/react/renderer/uimanager/UIManagerNativeAnimatedDelegate.h +++ b/packages/react-native/ReactCommon/react/renderer/uimanager/UIManagerNativeAnimatedDelegate.h @@ -7,6 +7,8 @@ #pragma once +#include + #include #include diff --git a/packages/react-native/ReactCommon/react/renderer/uimanager/UIManagerViewTransitionDelegate.h b/packages/react-native/ReactCommon/react/renderer/uimanager/UIManagerViewTransitionDelegate.h index 3fa4c0e1261b..94229732f313 100644 --- a/packages/react-native/ReactCommon/react/renderer/uimanager/UIManagerViewTransitionDelegate.h +++ b/packages/react-native/ReactCommon/react/renderer/uimanager/UIManagerViewTransitionDelegate.h @@ -7,6 +7,8 @@ #pragma once +#include + #include #include #include diff --git a/packages/react-native/ReactCommon/react/renderer/uimanager/primitives.h b/packages/react-native/ReactCommon/react/renderer/uimanager/primitives.h index ae798d078ebf..39e57403116f 100644 --- a/packages/react-native/ReactCommon/react/renderer/uimanager/primitives.h +++ b/packages/react-native/ReactCommon/react/renderer/uimanager/primitives.h @@ -7,6 +7,8 @@ #pragma once +#include + #include #include #include diff --git a/packages/react-native/scripts/ios-prebuild/headers-config.js b/packages/react-native/scripts/ios-prebuild/headers-config.js index ccf4d23a6ac4..2045b50ceae2 100644 --- a/packages/react-native/scripts/ios-prebuild/headers-config.js +++ b/packages/react-native/scripts/ios-prebuild/headers-config.js @@ -231,6 +231,12 @@ const PodspecExceptions /*: {[key: string]: PodSpecConfiguration} */ = { headerDir: 'react/renderer/uimanager', }, + { + name: 'uimanagerUmbrella', + headerPatterns: ['react/renderer/uimanager/React/*.h'], + headerDir: 'React', + }, + { name: 'leakchecker', headerPatterns: ['react/renderer/leakchecker/**/*.h'],