From 5cf5283ac0801e1643c033d3f076c72de1ed4c53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dawid=20Ma=C5=82ecki?= Date: Wed, 19 Aug 2026 07:04:07 -0700 Subject: [PATCH] Add stable API guards for the Image component (#57966) Summary: This diff rolls umbrella guards for `react/renderer/components/image`. Initially, we consider image component target as public so the Umbrella file is added as the proxy for all includes. Changelog: [Internal] Reviewed By: cipolleschi Differential Revision: D109849952 --- .../ReactAndroid/build.gradle.kts | 4 +++ .../ReactCommon/React-FabricImage.podspec | 9 +++++- .../renderer/components/image/CMakeLists.txt | 1 + .../image/ImageComponentDescriptor.h | 2 ++ .../components/image/ImageEventEmitter.h | 2 ++ .../renderer/components/image/ImageProps.h | 2 ++ .../components/image/ImageShadowNode.h | 2 ++ .../renderer/components/image/ImageState.h | 2 ++ .../renderer/components/image/React/Image.h | 31 +++++++++++++++++++ .../renderer/components/image/conversions.h | 2 ++ .../scripts/ios-prebuild/headers-config.js | 16 ++++++++++ 11 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 packages/react-native/ReactCommon/react/renderer/components/image/React/Image.h diff --git a/packages/react-native/ReactAndroid/build.gradle.kts b/packages/react-native/ReactAndroid/build.gradle.kts index 87f737cf763a..d142225dcfbb 100644 --- a/packages/react-native/ReactAndroid/build.gradle.kts +++ b/packages/react-native/ReactAndroid/build.gradle.kts @@ -167,6 +167,10 @@ val preparePrefab by "../ReactCommon/react/renderer/components/image/", "react/renderer/components/image/", ), + Pair( + "../ReactCommon/react/renderer/components/image/React/", + "React/", + ), // rrc_view Pair( "../ReactCommon/react/renderer/components/view/", diff --git a/packages/react-native/ReactCommon/React-FabricImage.podspec b/packages/react-native/ReactCommon/React-FabricImage.podspec index 8182a11a5a74..db43a6c28666 100644 --- a/packages/react-native/ReactCommon/React-FabricImage.podspec +++ b/packages/react-native/ReactCommon/React-FabricImage.podspec @@ -43,13 +43,19 @@ Pod::Spec.new do |s| s.platforms = min_supported_versions s.source = source s.source_files = podspec_sources("react/renderer/components/image/**/*.{m,mm,cpp,h}", "react/renderer/components/image/**/*.h") - s.exclude_files = "react/renderer/components/image/tests" + s.exclude_files = ["react/renderer/components/image/tests", "react/renderer/components/image/React"] s.header_dir = "react/renderer/components/image" s.pod_target_xcconfig = { "USE_HEADERMAP" => "YES", "CLANG_CXX_LANGUAGE_STANDARD" => rct_cxx_language_standard(), "HEADER_SEARCH_PATHS" => header_search_path.join(" ") } + s.subspec "ImageUmbrella" do |ss| + ss.source_files = "react/renderer/components/image/React/*.h" + ss.header_dir = "React" + ss.header_mappings_dir = "react/renderer/components/image/React" + end + resolve_use_frameworks(s, header_mappings_dir: './', module_name: "React_FabricImage") s.dependency "React-jsiexecutor", version @@ -60,6 +66,7 @@ Pod::Spec.new do |s| s.dependency "React-featureflags" s.dependency "React-utils" s.dependency "Yoga" + s.dependency "React-cxxstableapi" add_dependency(s, "React-ImageManager", :additional_framework_paths => [ "react/renderer/components/view/platform/cxx", diff --git a/packages/react-native/ReactCommon/react/renderer/components/image/CMakeLists.txt b/packages/react-native/ReactCommon/react/renderer/components/image/CMakeLists.txt index 6babcc158ad1..6544b818d138 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/image/CMakeLists.txt +++ b/packages/react-native/ReactCommon/react/renderer/components/image/CMakeLists.txt @@ -18,6 +18,7 @@ target_link_libraries(rrc_image folly_runtime glog_init jsi + react_cxxstableapi react_debug react_utils react_renderer_core diff --git a/packages/react-native/ReactCommon/react/renderer/components/image/ImageComponentDescriptor.h b/packages/react-native/ReactCommon/react/renderer/components/image/ImageComponentDescriptor.h index ff6417774db8..da793a387562 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/image/ImageComponentDescriptor.h +++ b/packages/react-native/ReactCommon/react/renderer/components/image/ImageComponentDescriptor.h @@ -7,6 +7,8 @@ #pragma once +#include + #include #include diff --git a/packages/react-native/ReactCommon/react/renderer/components/image/ImageEventEmitter.h b/packages/react-native/ReactCommon/react/renderer/components/image/ImageEventEmitter.h index b995bfad3fbc..cbd7eb781869 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/image/ImageEventEmitter.h +++ b/packages/react-native/ReactCommon/react/renderer/components/image/ImageEventEmitter.h @@ -7,6 +7,8 @@ #pragma once +#include + #include #include diff --git a/packages/react-native/ReactCommon/react/renderer/components/image/ImageProps.h b/packages/react-native/ReactCommon/react/renderer/components/image/ImageProps.h index e53e1995d38c..9da186430d42 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/image/ImageProps.h +++ b/packages/react-native/ReactCommon/react/renderer/components/image/ImageProps.h @@ -7,6 +7,8 @@ #pragma once +#include + #include #include #include diff --git a/packages/react-native/ReactCommon/react/renderer/components/image/ImageShadowNode.h b/packages/react-native/ReactCommon/react/renderer/components/image/ImageShadowNode.h index 3ecd4672d12d..61bcaba18a47 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/image/ImageShadowNode.h +++ b/packages/react-native/ReactCommon/react/renderer/components/image/ImageShadowNode.h @@ -7,6 +7,8 @@ #pragma once +#include + #include #include #include diff --git a/packages/react-native/ReactCommon/react/renderer/components/image/ImageState.h b/packages/react-native/ReactCommon/react/renderer/components/image/ImageState.h index 718dd12620b5..d49393e65d9e 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/image/ImageState.h +++ b/packages/react-native/ReactCommon/react/renderer/components/image/ImageState.h @@ -7,6 +7,8 @@ #pragma once +#include + #include #include #include diff --git a/packages/react-native/ReactCommon/react/renderer/components/image/React/Image.h b/packages/react-native/ReactCommon/react/renderer/components/image/React/Image.h new file mode 100644 index 000000000000..de6e2a47c362 --- /dev/null +++ b/packages/react-native/ReactCommon/react/renderer/components/image/React/Image.h @@ -0,0 +1,31 @@ +/* + * 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/components/image` 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 + +#undef RN_UMBRELLA_CONTEXT diff --git a/packages/react-native/ReactCommon/react/renderer/components/image/conversions.h b/packages/react-native/ReactCommon/react/renderer/components/image/conversions.h index 902a99949d8b..5d38e469e3f2 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/image/conversions.h +++ b/packages/react-native/ReactCommon/react/renderer/components/image/conversions.h @@ -7,6 +7,8 @@ #pragma once +#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 3353f2257036..1201eb984b3d 100644 --- a/packages/react-native/scripts/ios-prebuild/headers-config.js +++ b/packages/react-native/scripts/ios-prebuild/headers-config.js @@ -444,6 +444,22 @@ const PodspecExceptions /*: {[key: string]: PodSpecConfiguration} */ = { }, ], }, + 'ReactCommon/React-FabricImage.podspec': { + name: 'React-FabricImage', + headerPatterns: ['react/renderer/components/image/**/*.h'], + excludePatterns: [ + 'react/renderer/components/image/tests', + 'react/renderer/components/image/React', + ], + headerDir: 'react/renderer/components/image', + subSpecs: [ + { + name: 'ImageUmbrella', + headerPatterns: ['react/renderer/components/image/React/*.h'], + headerDir: 'React', + }, + ], + }, 'React-Core.podspec': { name: 'React-Core', headerPatterns: [],