From 8635f555b486aa64c5da2a069c5ead718cef2721 Mon Sep 17 00:00:00 2001 From: Jakub Piasecki Date: Wed, 2 Sep 2026 01:45:18 -0700 Subject: [PATCH 1/6] Make the umbrella context nest Summary: Umbrellas bracketed their includes with a bare `#define`/`#undef` of `RN_UMBRELLA_CONTEXT`. That does not nest: an umbrella reached from inside another umbrella's context cleared it on the way out, so every public header the outer umbrella included afterwards hit `UmbrellaGuard.h`. Switch the bracket to `#pragma push_macro`/`pop_macro` so the inner umbrella restores the outer context instead of clearing it. Nothing nests today, it starts once a for-frameworks header reaches a public module through its umbrella. Changelog: [Internal] Differential Revision: D118114589 --- .../callinvoker/React/CallInvoker.h | 10 +++++++-- .../react/cxxstableapi/UmbrellaGuard.h | 22 ++++++++++++++----- .../ReactCommon/react/debug/React/Debug.h | 10 +++++++-- .../bridging/React/RendererBridging.h | 12 ++++++---- .../renderer/components/image/React/Image.h | 10 +++++++-- .../renderer/components/modal/React/Modal.h | 10 +++++++-- .../renderer/components/root/React/Root.h | 10 +++++++-- .../components/scrollview/React/ScrollView.h | 10 +++++++-- .../renderer/components/text/React/Text.h | 10 +++++++-- .../renderer/components/view/React/View.h | 11 +++++++--- .../renderer/mapbuffer/React/MapBuffer.h | 10 +++++++-- .../ReactCommon/react/timing/React/Timing.h | 11 +++++++--- 12 files changed, 104 insertions(+), 32 deletions(-) diff --git a/packages/react-native/ReactCommon/callinvoker/React/CallInvoker.h b/packages/react-native/ReactCommon/callinvoker/React/CallInvoker.h index e8bf92e95dae..f77c0725d1ee 100644 --- a/packages/react-native/ReactCommon/callinvoker/React/CallInvoker.h +++ b/packages/react-native/ReactCommon/callinvoker/React/CallInvoker.h @@ -18,10 +18,16 @@ // ============================================================================= // Marks that the following headers are pulled in through the umbrella, so their -// shared guard () accepts them. -#define RN_UMBRELLA_CONTEXT +// 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 #undef RN_UMBRELLA_CONTEXT +#pragma pop_macro("RN_UMBRELLA_CONTEXT") diff --git a/packages/react-native/ReactCommon/react/cxxstableapi/UmbrellaGuard.h b/packages/react-native/ReactCommon/react/cxxstableapi/UmbrellaGuard.h index fa925805f1e2..a0b08eec4dd0 100644 --- a/packages/react-native/ReactCommon/react/cxxstableapi/UmbrellaGuard.h +++ b/packages/react-native/ReactCommon/react/cxxstableapi/UmbrellaGuard.h @@ -29,15 +29,25 @@ // defining RN_STRICT_API. // // RN_UMBRELLA_CONTEXT Internal marker (implementation detail; consumers never -// set it). A module umbrella defines it around its own -// `#include`s to signal the blessed inclusion path: -// #define RN_UMBRELLA_CONTEXT +// set it). A module umbrella brackets its own `#include`s +// with it to signal the blessed inclusion path: +// #pragma push_macro("RN_UMBRELLA_CONTEXT") +// #undef RN_UMBRELLA_CONTEXT +// #define RN_UMBRELLA_CONTEXT 1 // #include // #include // #undef RN_UMBRELLA_CONTEXT -// The `#undef` matters: it keeps the marker scoped to the -// umbrella's includes so later *direct* includes in the -// same translation unit are still caught. +// #pragma pop_macro("RN_UMBRELLA_CONTEXT") +// Saving and restoring, rather than a bare +// `#define`/`#undef` pair, is what makes the scope both +// end at the umbrella -- later *direct* includes in the +// same translation unit are still caught -- and nest: an +// umbrella reached from inside another umbrella's +// context leaves the outer one armed. A bare `#undef` +// would disarm it, and every public header the outer +// umbrella included afterwards would hard-error. +// `scripts/add-cxxstableapi-guard.js --tier=public` +// emits this block; do not hand-write or "simplify" it. // // RN_BUILDING Defined by React Native's own build targets so internal // sources may keep including the fine-grained headers diff --git a/packages/react-native/ReactCommon/react/debug/React/Debug.h b/packages/react-native/ReactCommon/react/debug/React/Debug.h index 8ba388a6e3a4..4957eaa6a669 100644 --- a/packages/react-native/ReactCommon/react/debug/React/Debug.h +++ b/packages/react-native/ReactCommon/react/debug/React/Debug.h @@ -21,11 +21,17 @@ // ============================================================================= // Marks that the following headers are pulled in through the umbrella, so their -// shared guard () accepts them. -#define RN_UMBRELLA_CONTEXT +// 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 #undef RN_UMBRELLA_CONTEXT +#pragma pop_macro("RN_UMBRELLA_CONTEXT") diff --git a/packages/react-native/ReactCommon/react/renderer/bridging/React/RendererBridging.h b/packages/react-native/ReactCommon/react/renderer/bridging/React/RendererBridging.h index cc15bb5bae36..7f711c8b3c17 100644 --- a/packages/react-native/ReactCommon/react/renderer/bridging/React/RendererBridging.h +++ b/packages/react-native/ReactCommon/react/renderer/bridging/React/RendererBridging.h @@ -23,11 +23,15 @@ // ============================================================================= // Marks that the following headers are pulled in through the umbrella, so their -// shared guard () accepts them. Scoped to -// this block so later *direct* includes in the same translation unit are still -// caught. -#define RN_UMBRELLA_CONTEXT +// 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 #undef RN_UMBRELLA_CONTEXT +#pragma pop_macro("RN_UMBRELLA_CONTEXT") 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 index de6e2a47c362..11fd0c2dca55 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/image/React/Image.h +++ b/packages/react-native/ReactCommon/react/renderer/components/image/React/Image.h @@ -18,8 +18,13 @@ // ============================================================================= // Marks that the following headers are pulled in through the umbrella, so their -// shared guard () accepts them. -#define RN_UMBRELLA_CONTEXT +// 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 @@ -29,3 +34,4 @@ #include #undef RN_UMBRELLA_CONTEXT +#pragma pop_macro("RN_UMBRELLA_CONTEXT") diff --git a/packages/react-native/ReactCommon/react/renderer/components/modal/React/Modal.h b/packages/react-native/ReactCommon/react/renderer/components/modal/React/Modal.h index 71518feb1c4b..c763e4d9ffb3 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/modal/React/Modal.h +++ b/packages/react-native/ReactCommon/react/renderer/components/modal/React/Modal.h @@ -19,8 +19,13 @@ // ============================================================================= // Marks that the following headers are pulled in through the umbrella, so their -// shared guard () accepts them. -#define RN_UMBRELLA_CONTEXT +// 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 @@ -28,3 +33,4 @@ #include #undef RN_UMBRELLA_CONTEXT +#pragma pop_macro("RN_UMBRELLA_CONTEXT") diff --git a/packages/react-native/ReactCommon/react/renderer/components/root/React/Root.h b/packages/react-native/ReactCommon/react/renderer/components/root/React/Root.h index 96f08af7caf6..c81a6d623464 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/root/React/Root.h +++ b/packages/react-native/ReactCommon/react/renderer/components/root/React/Root.h @@ -19,11 +19,17 @@ // ============================================================================= // Marks that the following headers are pulled in through the umbrella, so their -// shared guard () accepts them. -#define RN_UMBRELLA_CONTEXT +// 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 #undef RN_UMBRELLA_CONTEXT +#pragma pop_macro("RN_UMBRELLA_CONTEXT") diff --git a/packages/react-native/ReactCommon/react/renderer/components/scrollview/React/ScrollView.h b/packages/react-native/ReactCommon/react/renderer/components/scrollview/React/ScrollView.h index 96bf19f107d2..d382ee45a3d7 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/scrollview/React/ScrollView.h +++ b/packages/react-native/ReactCommon/react/renderer/components/scrollview/React/ScrollView.h @@ -20,8 +20,13 @@ // ============================================================================= // Marks that the following headers are pulled in through the umbrella, so their -// shared guard () accepts them. -#define RN_UMBRELLA_CONTEXT +// 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 @@ -40,3 +45,4 @@ #endif #undef RN_UMBRELLA_CONTEXT +#pragma pop_macro("RN_UMBRELLA_CONTEXT") diff --git a/packages/react-native/ReactCommon/react/renderer/components/text/React/Text.h b/packages/react-native/ReactCommon/react/renderer/components/text/React/Text.h index 6670d8a7b367..183a9e557892 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/text/React/Text.h +++ b/packages/react-native/ReactCommon/react/renderer/components/text/React/Text.h @@ -19,8 +19,13 @@ // ============================================================================= // Marks that the following headers are pulled in through the umbrella, so their -// shared guard () accepts them. -#define RN_UMBRELLA_CONTEXT +// 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 @@ -51,3 +56,4 @@ #endif #undef RN_UMBRELLA_CONTEXT +#pragma pop_macro("RN_UMBRELLA_CONTEXT") diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/React/View.h b/packages/react-native/ReactCommon/react/renderer/components/view/React/View.h index 11325cb22230..de36f85ecddc 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/React/View.h +++ b/packages/react-native/ReactCommon/react/renderer/components/view/React/View.h @@ -19,9 +19,13 @@ // ============================================================================= // Marks that the following headers are pulled in through the umbrella, so their -// shared guard () accepts them. Scoped to -// this block so later *direct* includes in the same TU are still caught. -#define RN_UMBRELLA_CONTEXT +// 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 #if defined(__APPLE__) #include @@ -76,3 +80,4 @@ #endif #undef RN_UMBRELLA_CONTEXT +#pragma pop_macro("RN_UMBRELLA_CONTEXT") diff --git a/packages/react-native/ReactCommon/react/renderer/mapbuffer/React/MapBuffer.h b/packages/react-native/ReactCommon/react/renderer/mapbuffer/React/MapBuffer.h index 898a7befe37e..aed8b6dc8219 100644 --- a/packages/react-native/ReactCommon/react/renderer/mapbuffer/React/MapBuffer.h +++ b/packages/react-native/ReactCommon/react/renderer/mapbuffer/React/MapBuffer.h @@ -18,10 +18,16 @@ // ============================================================================= // Marks that the following headers are pulled in through the umbrella, so their -// shared guard () accepts them. -#define RN_UMBRELLA_CONTEXT +// 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 #undef RN_UMBRELLA_CONTEXT +#pragma pop_macro("RN_UMBRELLA_CONTEXT") diff --git a/packages/react-native/ReactCommon/react/timing/React/Timing.h b/packages/react-native/ReactCommon/react/timing/React/Timing.h index 56a676dc92d1..bfac6c96fcb1 100644 --- a/packages/react-native/ReactCommon/react/timing/React/Timing.h +++ b/packages/react-native/ReactCommon/react/timing/React/Timing.h @@ -18,10 +18,15 @@ // ============================================================================= // Marks that the following headers are pulled in through the umbrella, so their -// shared guard () accepts them. Scoped to -// this block so later *direct* includes in the same TU are still caught. -#define RN_UMBRELLA_CONTEXT +// 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 #undef RN_UMBRELLA_CONTEXT +#pragma pop_macro("RN_UMBRELLA_CONTEXT") From 00daacb2acae0ede4225acecc3378f71ed9295c6 Mon Sep 17 00:00:00 2001 From: Jakub Piasecki Date: Wed, 2 Sep 2026 01:45:18 -0700 Subject: [PATCH 2/6] Update umbrella subspecs configuration (#58260) Summary: Pull Request resolved: https://github.com/react/react-native/pull/58260 Changelog: [Internal] Changes the configuration of the umbrella podspecs to make the umbrella headers discoverable with `use_frameworks`. Updates the cocoapods scripts to make sure all public headers are discoverable with `use_frameworks`. Differential Revision: D118096693 --- .../ReactCommon/React-Fabric.podspec | 16 ++++++++-------- .../ReactCommon/React-FabricComponents.podspec | 8 ++++---- .../ReactCommon/React-FabricImage.podspec | 6 +++--- .../ReactCommon/React-Mapbuffer.podspec | 6 +++--- .../callinvoker/React-callinvoker.podspec | 6 +++--- .../ReactCommon/react/debug/React-debug.podspec | 6 +++--- .../react/timing/React-timing.podspec | 4 ++-- .../scripts/cocoapods/new_architecture.rb | 3 +++ packages/react-native/scripts/cocoapods/utils.rb | 12 +++++++++++- .../scripts/ios-prebuild/headers-config.js | 8 ++++---- 10 files changed, 44 insertions(+), 31 deletions(-) diff --git a/packages/react-native/ReactCommon/React-Fabric.podspec b/packages/react-native/ReactCommon/React-Fabric.podspec index 9e4c28c6a733..bb7c16f10bea 100644 --- a/packages/react-native/ReactCommon/React-Fabric.podspec +++ b/packages/react-native/ReactCommon/React-Fabric.podspec @@ -90,8 +90,8 @@ Pod::Spec.new do |s| s.subspec "bridgingUmbrella" do |ss| ss.source_files = "react/renderer/bridging/React/*.h" - ss.header_dir = "React" - ss.header_mappings_dir = "react/renderer/bridging/React" + ss.header_dir = "" + ss.header_mappings_dir = "react/renderer/bridging" end s.subspec "core" do |ss| @@ -140,8 +140,8 @@ Pod::Spec.new do |s| ss.subspec "rootUmbrella" do |sss| sss.source_files = "react/renderer/components/root/React/*.h" - sss.header_dir = "React" - sss.header_mappings_dir = "react/renderer/components/root/React" + sss.header_dir = "" + sss.header_mappings_dir = "react/renderer/components/root" end ss.subspec "view" do |sss| @@ -153,8 +153,8 @@ Pod::Spec.new do |s| ss.subspec "viewUmbrella" do |sss| sss.source_files = "react/renderer/components/view/React/*.h" - sss.header_dir = "React" - sss.header_mappings_dir = "react/renderer/components/view/React" + sss.header_dir = "" + sss.header_mappings_dir = "react/renderer/components/view" end ss.subspec "scrollview" do |sss| @@ -165,8 +165,8 @@ Pod::Spec.new do |s| ss.subspec "scrollviewUmbrella" do |sss| sss.source_files = "react/renderer/components/scrollview/React/*.h" - sss.header_dir = "React" - sss.header_mappings_dir = "react/renderer/components/scrollview/React" + sss.header_dir = "" + sss.header_mappings_dir = "react/renderer/components/scrollview" end ss.subspec "legacyviewmanagerinterop" do |sss| diff --git a/packages/react-native/ReactCommon/React-FabricComponents.podspec b/packages/react-native/ReactCommon/React-FabricComponents.podspec index d2298b2b0889..6cbe42390275 100644 --- a/packages/react-native/ReactCommon/React-FabricComponents.podspec +++ b/packages/react-native/ReactCommon/React-FabricComponents.podspec @@ -97,8 +97,8 @@ Pod::Spec.new do |s| ss.subspec "modalUmbrella" do |sss| sss.source_files = "react/renderer/components/modal/React/*.h" - sss.header_dir = "React" - sss.header_mappings_dir = "react/renderer/components/modal/React" + sss.header_dir = "" + sss.header_mappings_dir = "react/renderer/components/modal" end ss.subspec "safeareaview" do |sss| @@ -118,8 +118,8 @@ Pod::Spec.new do |s| ss.subspec "textUmbrella" do |sss| sss.source_files = "react/renderer/components/text/React/*.h" - sss.header_dir = "React" - sss.header_mappings_dir = "react/renderer/components/text/React" + sss.header_dir = "" + sss.header_mappings_dir = "react/renderer/components/text" end ss.subspec "iostextinput" do |sss| diff --git a/packages/react-native/ReactCommon/React-FabricImage.podspec b/packages/react-native/ReactCommon/React-FabricImage.podspec index db43a6c28666..a82ef901c4c9 100644 --- a/packages/react-native/ReactCommon/React-FabricImage.podspec +++ b/packages/react-native/ReactCommon/React-FabricImage.podspec @@ -50,10 +50,10 @@ Pod::Spec.new do |s| "HEADER_SEARCH_PATHS" => header_search_path.join(" ") } - s.subspec "ImageUmbrella" do |ss| + 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" + ss.header_dir = "" + ss.header_mappings_dir = "react/renderer/components/image" end resolve_use_frameworks(s, header_mappings_dir: './', module_name: "React_FabricImage") diff --git a/packages/react-native/ReactCommon/React-Mapbuffer.podspec b/packages/react-native/ReactCommon/React-Mapbuffer.podspec index 133f9e5010f0..3268a1543b2e 100644 --- a/packages/react-native/ReactCommon/React-Mapbuffer.podspec +++ b/packages/react-native/ReactCommon/React-Mapbuffer.podspec @@ -32,10 +32,10 @@ Pod::Spec.new do |s| 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| + 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" + ss.header_dir = "" + ss.header_mappings_dir = "react/renderer/mapbuffer" end resolve_use_frameworks(s, header_mappings_dir: './', module_name: "React_Mapbuffer") diff --git a/packages/react-native/ReactCommon/callinvoker/React-callinvoker.podspec b/packages/react-native/ReactCommon/callinvoker/React-callinvoker.podspec index aac5db20478e..931b15bb1888 100644 --- a/packages/react-native/ReactCommon/callinvoker/React-callinvoker.podspec +++ b/packages/react-native/ReactCommon/callinvoker/React-callinvoker.podspec @@ -36,10 +36,10 @@ Pod::Spec.new do |s| s.pod_target_xcconfig = { "HEADER_SEARCH_PATHS" => header_search_paths.join(' ') } s.header_dir = "ReactCommon" - s.subspec "CallInvokerUmbrella" do |ss| + s.subspec "callinvokerUmbrella" do |ss| ss.source_files = "React/*.h" - ss.header_dir = "React" - ss.header_mappings_dir = "React" + ss.header_dir = "" + ss.header_mappings_dir = "." end s.dependency "React-cxxstableapi" diff --git a/packages/react-native/ReactCommon/react/debug/React-debug.podspec b/packages/react-native/ReactCommon/react/debug/React-debug.podspec index 591f5798504b..1386f6181cb9 100644 --- a/packages/react-native/ReactCommon/react/debug/React-debug.podspec +++ b/packages/react-native/ReactCommon/react/debug/React-debug.podspec @@ -39,10 +39,10 @@ Pod::Spec.new do |s| resolve_use_frameworks(s, header_mappings_dir: "../..", module_name: "React_debug") - s.subspec "DebugUmbrella" do |ss| + s.subspec "debugUmbrella" do |ss| ss.source_files = "React/*.h" - ss.header_dir = "React" - ss.header_mappings_dir = "React" + ss.header_dir = "" + ss.header_mappings_dir = "." end s.subspec "redbox" do |ss| diff --git a/packages/react-native/ReactCommon/react/timing/React-timing.podspec b/packages/react-native/ReactCommon/react/timing/React-timing.podspec index a61ad9fe2230..b0110594ec4a 100644 --- a/packages/react-native/ReactCommon/react/timing/React-timing.podspec +++ b/packages/react-native/ReactCommon/react/timing/React-timing.podspec @@ -44,8 +44,8 @@ Pod::Spec.new do |s| s.subspec "timingUmbrella" do |ss| ss.source_files = "React/*.h" - ss.header_dir = "React" - ss.header_mappings_dir = "React" + ss.header_dir = "" + ss.header_mappings_dir = "." end s.resource_bundles = {'React-timing_privacy' => 'PrivacyInfo.xcprivacy'} diff --git a/packages/react-native/scripts/cocoapods/new_architecture.rb b/packages/react-native/scripts/cocoapods/new_architecture.rb index 0052196a2065..98f9c743cf94 100644 --- a/packages/react-native/scripts/cocoapods/new_architecture.rb +++ b/packages/react-native/scripts/cocoapods/new_architecture.rb @@ -86,6 +86,9 @@ def self.install_modules_dependencies(spec, new_arch_enabled, folly_version = He ReactNativePodsUtils.create_header_search_path_for_frameworks("PODS_CONFIGURATION_BUILD_DIR", "React-graphics", "React_graphics", ["react/renderer/graphics/platform/ios"]) .concat(ReactNativePodsUtils.create_header_search_path_for_frameworks("PODS_CONFIGURATION_BUILD_DIR", "React-Fabric", "React_Fabric", ["react/renderer/components/view/platform/cxx"])) .concat(ReactNativePodsUtils.create_header_search_path_for_frameworks("PODS_CONFIGURATION_BUILD_DIR", "React-FabricImage", "React_FabricImage", [])) + .concat(ReactNativePodsUtils.create_header_search_path_for_frameworks("PODS_CONFIGURATION_BUILD_DIR", "React-FabricComponents", "React_FabricComponents", [])) + .concat(ReactNativePodsUtils.create_header_search_path_for_frameworks("PODS_CONFIGURATION_BUILD_DIR", "React-Mapbuffer", "React_Mapbuffer", [])) + .concat(ReactNativePodsUtils.create_header_search_path_for_frameworks("PODS_CONFIGURATION_BUILD_DIR", "React-RCTFBReactNativeSpec", "React_RCTFBReactNativeSpec", [])) .concat(ReactNativePodsUtils.create_header_search_path_for_frameworks("PODS_CONFIGURATION_BUILD_DIR", "ReactCommon", "ReactCommon", ["react/nativemodule/core"])) .concat(ReactNativePodsUtils.create_header_search_path_for_frameworks("PODS_CONFIGURATION_BUILD_DIR", "React-runtimeexecutor", "React_runtimeexecutor", ["platform/ios"])) .concat(ReactNativePodsUtils.create_header_search_path_for_frameworks("PODS_CONFIGURATION_BUILD_DIR", "React-NativeModulesApple", "React_NativeModulesApple", [])) diff --git a/packages/react-native/scripts/cocoapods/utils.rb b/packages/react-native/scripts/cocoapods/utils.rb index f65d0798fcb5..a31cab7442f6 100644 --- a/packages/react-native/scripts/cocoapods/utils.rb +++ b/packages/react-native/scripts/cocoapods/utils.rb @@ -386,7 +386,17 @@ def self.update_search_paths(installer) ReactNativePodsUtils.create_header_search_path_for_frameworks("PODS_CONFIGURATION_BUILD_DIR", "ReactCommon", "ReactCommon", ["react/nativemodule/core"]) .concat(ReactNativePodsUtils.create_header_search_path_for_frameworks("PODS_CONFIGURATION_BUILD_DIR", "React-runtimeexecutor", "React_runtimeexecutor", ["platform/ios"])) .concat(ReactNativePodsUtils.create_header_search_path_for_frameworks("PODS_CONFIGURATION_BUILD_DIR", "ReactCommon-Samples", "ReactCommon_Samples", ["platform/ios"])) - .concat(ReactNativePodsUtils.create_header_search_path_for_frameworks("PODS_CONFIGURATION_BUILD_DIR", "React-Fabric", "React_Fabric", ["react/renderer/components/view/platform/cxx"], false)) + .concat(ReactNativePodsUtils.create_header_search_path_for_frameworks("PODS_CONFIGURATION_BUILD_DIR", "React-Fabric", "React_Fabric", [ + "react/renderer/components/view/platform/cxx", + "react/renderer/components/scrollview/platform/cxx", + "react/renderer/components/scrollview/platform/ios", + ], false)) + .concat(ReactNativePodsUtils.create_header_search_path_for_frameworks("PODS_CONFIGURATION_BUILD_DIR", "React-FabricComponents", "React_FabricComponents", [ + "react/renderer/textlayoutmanager/platform/ios", + "react/renderer/components/text/platform/cxx", + "react/renderer/components/textinput/platform/ios", + "react/renderer/components/switch/iosswitch", + ], false)) .concat(ReactNativePodsUtils.create_header_search_path_for_frameworks("PODS_CONFIGURATION_BUILD_DIR", "React-NativeModulesApple", "React_NativeModulesApple", [])) .concat(ReactNativePodsUtils.create_header_search_path_for_frameworks("PODS_CONFIGURATION_BUILD_DIR", "React-bridging", "React_bridging", [])) .concat(ReactNativePodsUtils.create_header_search_path_for_frameworks("PODS_CONFIGURATION_BUILD_DIR", "React-graphics", "React_graphics", ["react/renderer/graphics/platform/ios"])) diff --git a/packages/react-native/scripts/ios-prebuild/headers-config.js b/packages/react-native/scripts/ios-prebuild/headers-config.js index cb52d5d8983c..78e72e95d615 100644 --- a/packages/react-native/scripts/ios-prebuild/headers-config.js +++ b/packages/react-native/scripts/ios-prebuild/headers-config.js @@ -485,7 +485,7 @@ const PodspecExceptions /*: {[key: string]: PodSpecConfiguration} */ = { headerDir: 'react/renderer/mapbuffer', subSpecs: [ { - name: 'MapBufferUmbrella', + name: 'mapbufferUmbrella', headerPatterns: ['react/renderer/mapbuffer/React/*.h'], headerDir: 'React', }, @@ -501,7 +501,7 @@ const PodspecExceptions /*: {[key: string]: PodSpecConfiguration} */ = { headerDir: 'react/renderer/components/image', subSpecs: [ { - name: 'ImageUmbrella', + name: 'imageUmbrella', headerPatterns: ['react/renderer/components/image/React/*.h'], headerDir: 'React', }, @@ -514,7 +514,7 @@ const PodspecExceptions /*: {[key: string]: PodSpecConfiguration} */ = { headerDir: 'ReactCommon', subSpecs: [ { - name: 'CallInvokerUmbrella', + name: 'callinvokerUmbrella', headerPatterns: ['React/*.h'], headerDir: 'React', }, @@ -526,7 +526,7 @@ const PodspecExceptions /*: {[key: string]: PodSpecConfiguration} */ = { headerDir: 'react/debug', subSpecs: [ { - name: 'DebugUmbrella', + name: 'debugUmbrella', headerPatterns: ['React/*.h'], headerDir: 'React', }, From b4f0dddb282af173413ed92727ea770ac6065415 Mon Sep 17 00:00:00 2001 From: Jakub Piasecki Date: Wed, 2 Sep 2026 02:30:45 -0700 Subject: [PATCH 3/6] Upgrade Image visibility to "for frameworks" Summary: Reclassifies `react/renderer/components/image:image` from public to "for frameworks" under the C++ stable API three-tier visibility model. Consumers that opt into `RN_STRICT_API` now get a suppressible warning where they previously got an error pointing at the umbrella, and can acknowledge it with `RN_ALLOW_FRAMEWORKS`; without that flag the guards are inert, so no existing build changes behaviour. Changelog: [Internal] Differential Revision: D118440296 --- .../ReactAndroid/build.gradle.kts | 4 -- .../ReactCommon/React-FabricImage.podspec | 8 +--- .../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 | 37 ------------------- .../renderer/components/image/conversions.h | 2 +- .../scripts/ios-prebuild/headers-config.js | 16 -------- 10 files changed, 7 insertions(+), 70 deletions(-) delete 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 3d04af49ff47..39e769c837f8 100644 --- a/packages/react-native/ReactAndroid/build.gradle.kts +++ b/packages/react-native/ReactAndroid/build.gradle.kts @@ -169,10 +169,6 @@ 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 a82ef901c4c9..3e2f70039ef3 100644 --- a/packages/react-native/ReactCommon/React-FabricImage.podspec +++ b/packages/react-native/ReactCommon/React-FabricImage.podspec @@ -43,19 +43,13 @@ 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", "react/renderer/components/image/React"] + s.exclude_files = "react/renderer/components/image/tests" 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 = "" - ss.header_mappings_dir = "react/renderer/components/image" - end - resolve_use_frameworks(s, header_mappings_dir: './', module_name: "React_FabricImage") s.dependency "React-jsiexecutor", version 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 da793a387562..5df65b321d50 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/image/ImageComponentDescriptor.h +++ b/packages/react-native/ReactCommon/react/renderer/components/image/ImageComponentDescriptor.h @@ -7,7 +7,7 @@ #pragma once -#include +#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 cbd7eb781869..78c947798b40 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/image/ImageEventEmitter.h +++ b/packages/react-native/ReactCommon/react/renderer/components/image/ImageEventEmitter.h @@ -7,7 +7,7 @@ #pragma once -#include +#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 9da186430d42..474eff3677e8 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/image/ImageProps.h +++ b/packages/react-native/ReactCommon/react/renderer/components/image/ImageProps.h @@ -7,7 +7,7 @@ #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 61bcaba18a47..6ba7e313c945 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/image/ImageShadowNode.h +++ b/packages/react-native/ReactCommon/react/renderer/components/image/ImageShadowNode.h @@ -7,7 +7,7 @@ #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 d49393e65d9e..f4facfa38da9 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/image/ImageState.h +++ b/packages/react-native/ReactCommon/react/renderer/components/image/ImageState.h @@ -7,7 +7,7 @@ #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 deleted file mode 100644 index 11fd0c2dca55..000000000000 --- a/packages/react-native/ReactCommon/react/renderer/components/image/React/Image.h +++ /dev/null @@ -1,37 +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/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. 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 - -#undef RN_UMBRELLA_CONTEXT -#pragma pop_macro("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 5d38e469e3f2..6f3b290e2170 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/image/conversions.h +++ b/packages/react-native/ReactCommon/react/renderer/components/image/conversions.h @@ -7,7 +7,7 @@ #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 78e72e95d615..ffe5b36b81b7 100644 --- a/packages/react-native/scripts/ios-prebuild/headers-config.js +++ b/packages/react-native/scripts/ios-prebuild/headers-config.js @@ -491,22 +491,6 @@ 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', - }, - ], - }, 'ReactCommon/callinvoker/React-callinvoker.podspec': { name: 'React-callinvoker', headerPatterns: ['**/*.h'], From 9329ac57f84e975103bff8f28fde33768317a0e1 Mon Sep 17 00:00:00 2001 From: Jakub Piasecki Date: Wed, 2 Sep 2026 02:31:04 -0700 Subject: [PATCH 4/6] Upgrade Modal visibility to "for frameworks" Summary: Reclassifies `react/renderer/components/modal:modal` from public to "for frameworks" under the C++ stable API three-tier visibility model. Consumers that opt into `RN_STRICT_API` now get a suppressible warning where they previously got an error pointing at the umbrella, and can acknowledge it with `RN_ALLOW_FRAMEWORKS`; without that flag the guards are inert, so no existing build changes behaviour. Changelog: [Internal] Differential Revision: D118440328 --- .../React-FabricComponents.podspec | 6 ---- .../modal/ModalHostViewComponentDescriptor.h | 2 +- .../modal/ModalHostViewShadowNode.h | 2 +- .../components/modal/ModalHostViewState.h | 2 +- .../components/modal/ModalHostViewUtils.h | 2 +- .../renderer/components/modal/React/Modal.h | 36 ------------------- .../scripts/ios-prebuild/headers-config.js | 6 ---- 7 files changed, 4 insertions(+), 52 deletions(-) delete mode 100644 packages/react-native/ReactCommon/react/renderer/components/modal/React/Modal.h diff --git a/packages/react-native/ReactCommon/React-FabricComponents.podspec b/packages/react-native/ReactCommon/React-FabricComponents.podspec index 6cbe42390275..65e74704c143 100644 --- a/packages/react-native/ReactCommon/React-FabricComponents.podspec +++ b/packages/react-native/ReactCommon/React-FabricComponents.podspec @@ -95,12 +95,6 @@ Pod::Spec.new do |s| sss.header_dir = "react/renderer/components/modal" end - ss.subspec "modalUmbrella" do |sss| - sss.source_files = "react/renderer/components/modal/React/*.h" - sss.header_dir = "" - sss.header_mappings_dir = "react/renderer/components/modal" - end - ss.subspec "safeareaview" do |sss| sss.source_files = podspec_sources("react/renderer/components/safeareaview/**/*.{m,mm,cpp,h}", "react/renderer/components/safeareaview/**/*.h") # Exclude tests to avoid conflicts with the react-native-safe-area-context package diff --git a/packages/react-native/ReactCommon/react/renderer/components/modal/ModalHostViewComponentDescriptor.h b/packages/react-native/ReactCommon/react/renderer/components/modal/ModalHostViewComponentDescriptor.h index 4de147053a82..095c60b26432 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/modal/ModalHostViewComponentDescriptor.h +++ b/packages/react-native/ReactCommon/react/renderer/components/modal/ModalHostViewComponentDescriptor.h @@ -7,7 +7,7 @@ #pragma once -#include +#include #include #include diff --git a/packages/react-native/ReactCommon/react/renderer/components/modal/ModalHostViewShadowNode.h b/packages/react-native/ReactCommon/react/renderer/components/modal/ModalHostViewShadowNode.h index f2d447362296..0219d44ca775 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/modal/ModalHostViewShadowNode.h +++ b/packages/react-native/ReactCommon/react/renderer/components/modal/ModalHostViewShadowNode.h @@ -7,7 +7,7 @@ #pragma once -#include +#include #include #include diff --git a/packages/react-native/ReactCommon/react/renderer/components/modal/ModalHostViewState.h b/packages/react-native/ReactCommon/react/renderer/components/modal/ModalHostViewState.h index c3e8f4de7cf2..4b12b0539692 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/modal/ModalHostViewState.h +++ b/packages/react-native/ReactCommon/react/renderer/components/modal/ModalHostViewState.h @@ -7,7 +7,7 @@ #pragma once -#include +#include #include #include diff --git a/packages/react-native/ReactCommon/react/renderer/components/modal/ModalHostViewUtils.h b/packages/react-native/ReactCommon/react/renderer/components/modal/ModalHostViewUtils.h index 9631bcc42707..0174a4154cf6 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/modal/ModalHostViewUtils.h +++ b/packages/react-native/ReactCommon/react/renderer/components/modal/ModalHostViewUtils.h @@ -7,7 +7,7 @@ #pragma once -#include +#include #include diff --git a/packages/react-native/ReactCommon/react/renderer/components/modal/React/Modal.h b/packages/react-native/ReactCommon/react/renderer/components/modal/React/Modal.h deleted file mode 100644 index c763e4d9ffb3..000000000000 --- a/packages/react-native/ReactCommon/react/renderer/components/modal/React/Modal.h +++ /dev/null @@ -1,36 +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/renderer/components/modal` 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. 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 - -#undef RN_UMBRELLA_CONTEXT -#pragma pop_macro("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 ffe5b36b81b7..226e091657b1 100644 --- a/packages/react-native/scripts/ios-prebuild/headers-config.js +++ b/packages/react-native/scripts/ios-prebuild/headers-config.js @@ -357,12 +357,6 @@ const PodspecExceptions /*: {[key: string]: PodSpecConfiguration} */ = { headerDir: 'react/renderer/components/modal', }, - { - name: 'modalUmbrella', - headerPatterns: ['react/renderer/components/modal/React/*.h'], - headerDir: 'React', - }, - { name: 'safeareaview', headerPatterns: ['react/renderer/components/safeareaview/**/*.h'], From 6d73f9cb957e2333e46fbb0c99ffd7546243a86d Mon Sep 17 00:00:00 2001 From: Jakub Piasecki Date: Wed, 2 Sep 2026 02:31:22 -0700 Subject: [PATCH 5/6] Upgrade Text visibility to "for frameworks" Summary: Reclassifies `react/renderer/components/text:text` from public to "for frameworks" under the C++ stable API three-tier visibility model. Consumers that opt into `RN_STRICT_API` now get a suppressible warning where they previously got an error pointing at the umbrella, and can acknowledge it with `RN_ALLOW_FRAMEWORKS`; without that flag the guards are inert, so no existing build changes behaviour. Changelog: [Internal] Differential Revision: D118440348 --- .../ReactAndroid/build.gradle.kts | 4 -- .../React-FabricComponents.podspec | 6 -- .../text/BaseParagraphComponentDescriptor.h | 2 +- .../components/text/BaseParagraphProps.h | 2 +- .../renderer/components/text/BaseTextProps.h | 2 +- .../components/text/BaseTextShadowNode.h | 2 +- .../text/ParagraphComponentDescriptor.h | 2 +- .../components/text/ParagraphEventEmitter.h | 2 +- .../renderer/components/text/ParagraphProps.h | 2 +- .../components/text/ParagraphShadowNode.h | 2 +- .../text/RawTextComponentDescriptor.h | 2 +- .../renderer/components/text/RawTextProps.h | 2 +- .../components/text/RawTextShadowNode.h | 2 +- .../renderer/components/text/React/Text.h | 59 ------------------- .../SelectableParagraphComponentDescriptor.h | 2 +- .../text/SelectableParagraphShadowNode.h | 2 +- .../components/text/TextComponentDescriptor.h | 2 +- .../text/TextEffectComponentDescriptor.h | 2 +- .../components/text/TextEffectProps.h | 2 +- .../components/text/TextEffectShadowNode.h | 2 +- .../renderer/components/text/TextProps.h | 2 +- .../renderer/components/text/TextShadowNode.h | 2 +- .../text/HostPlatformParagraphProps.h | 2 +- .../renderer/components/text/ParagraphState.h | 2 +- .../renderer/components/text/conversions.h | 2 +- .../renderer/components/text/primitives.h | 2 +- .../text/HostPlatformParagraphProps.h | 2 +- .../renderer/components/text/ParagraphState.h | 2 +- .../components/text/stateConversions.h | 2 +- .../scripts/ios-prebuild/headers-config.js | 6 -- 30 files changed, 26 insertions(+), 101 deletions(-) delete mode 100644 packages/react-native/ReactCommon/react/renderer/components/text/React/Text.h diff --git a/packages/react-native/ReactAndroid/build.gradle.kts b/packages/react-native/ReactAndroid/build.gradle.kts index 39e769c837f8..2fbd85317e21 100644 --- a/packages/react-native/ReactAndroid/build.gradle.kts +++ b/packages/react-native/ReactAndroid/build.gradle.kts @@ -201,10 +201,6 @@ val preparePrefab by "../ReactCommon/react/renderer/components/text/", "react/renderer/components/text/", ), - Pair( - "../ReactCommon/react/renderer/components/text/React/", - "React/", - ), Pair("../ReactCommon/react/renderer/components/text/platform/android/", ""), Pair( "../ReactCommon/react/renderer/attributedstring", diff --git a/packages/react-native/ReactCommon/React-FabricComponents.podspec b/packages/react-native/ReactCommon/React-FabricComponents.podspec index 65e74704c143..6f550a031b57 100644 --- a/packages/react-native/ReactCommon/React-FabricComponents.podspec +++ b/packages/react-native/ReactCommon/React-FabricComponents.podspec @@ -110,12 +110,6 @@ Pod::Spec.new do |s| sss.header_dir = "react/renderer/components/text" end - ss.subspec "textUmbrella" do |sss| - sss.source_files = "react/renderer/components/text/React/*.h" - sss.header_dir = "" - sss.header_mappings_dir = "react/renderer/components/text" - end - ss.subspec "iostextinput" do |sss| sss.source_files = podspec_sources(["react/renderer/components/textinput/*.{m,mm,cpp,h}", "react/renderer/components/textinput/platform/ios/**/*.{m,mm,cpp,h}"], diff --git a/packages/react-native/ReactCommon/react/renderer/components/text/BaseParagraphComponentDescriptor.h b/packages/react-native/ReactCommon/react/renderer/components/text/BaseParagraphComponentDescriptor.h index 553ee1909936..0685a5e8eb60 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/text/BaseParagraphComponentDescriptor.h +++ b/packages/react-native/ReactCommon/react/renderer/components/text/BaseParagraphComponentDescriptor.h @@ -7,7 +7,7 @@ #pragma once -#include +#include #include #include diff --git a/packages/react-native/ReactCommon/react/renderer/components/text/BaseParagraphProps.h b/packages/react-native/ReactCommon/react/renderer/components/text/BaseParagraphProps.h index 63fac5e94b34..d5bb11aeb258 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/text/BaseParagraphProps.h +++ b/packages/react-native/ReactCommon/react/renderer/components/text/BaseParagraphProps.h @@ -7,7 +7,7 @@ #pragma once -#include +#include #include #include diff --git a/packages/react-native/ReactCommon/react/renderer/components/text/BaseTextProps.h b/packages/react-native/ReactCommon/react/renderer/components/text/BaseTextProps.h index 8d65e9d24309..ac8cfc0931cb 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/text/BaseTextProps.h +++ b/packages/react-native/ReactCommon/react/renderer/components/text/BaseTextProps.h @@ -7,7 +7,7 @@ #pragma once -#include +#include #include #include diff --git a/packages/react-native/ReactCommon/react/renderer/components/text/BaseTextShadowNode.h b/packages/react-native/ReactCommon/react/renderer/components/text/BaseTextShadowNode.h index f583de995da6..030af7a73be2 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/text/BaseTextShadowNode.h +++ b/packages/react-native/ReactCommon/react/renderer/components/text/BaseTextShadowNode.h @@ -7,7 +7,7 @@ #pragma once -#include +#include #include #include diff --git a/packages/react-native/ReactCommon/react/renderer/components/text/ParagraphComponentDescriptor.h b/packages/react-native/ReactCommon/react/renderer/components/text/ParagraphComponentDescriptor.h index b2461269f869..4daf0d189f87 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/text/ParagraphComponentDescriptor.h +++ b/packages/react-native/ReactCommon/react/renderer/components/text/ParagraphComponentDescriptor.h @@ -7,7 +7,7 @@ #pragma once -#include +#include #include #include diff --git a/packages/react-native/ReactCommon/react/renderer/components/text/ParagraphEventEmitter.h b/packages/react-native/ReactCommon/react/renderer/components/text/ParagraphEventEmitter.h index 97ed8e8272af..a24323496b22 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/text/ParagraphEventEmitter.h +++ b/packages/react-native/ReactCommon/react/renderer/components/text/ParagraphEventEmitter.h @@ -7,7 +7,7 @@ #pragma once -#include +#include #include #include diff --git a/packages/react-native/ReactCommon/react/renderer/components/text/ParagraphProps.h b/packages/react-native/ReactCommon/react/renderer/components/text/ParagraphProps.h index dcb82a445794..e0b912b06115 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/text/ParagraphProps.h +++ b/packages/react-native/ReactCommon/react/renderer/components/text/ParagraphProps.h @@ -7,7 +7,7 @@ #pragma once -#include +#include #include diff --git a/packages/react-native/ReactCommon/react/renderer/components/text/ParagraphShadowNode.h b/packages/react-native/ReactCommon/react/renderer/components/text/ParagraphShadowNode.h index e6f410ac86af..adc375d94de0 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/text/ParagraphShadowNode.h +++ b/packages/react-native/ReactCommon/react/renderer/components/text/ParagraphShadowNode.h @@ -7,7 +7,7 @@ #pragma once -#include +#include #include #include diff --git a/packages/react-native/ReactCommon/react/renderer/components/text/RawTextComponentDescriptor.h b/packages/react-native/ReactCommon/react/renderer/components/text/RawTextComponentDescriptor.h index 4c242a061869..cca375e86f37 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/text/RawTextComponentDescriptor.h +++ b/packages/react-native/ReactCommon/react/renderer/components/text/RawTextComponentDescriptor.h @@ -7,7 +7,7 @@ #pragma once -#include +#include #include #include diff --git a/packages/react-native/ReactCommon/react/renderer/components/text/RawTextProps.h b/packages/react-native/ReactCommon/react/renderer/components/text/RawTextProps.h index f350702dce94..5e01570b4f2d 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/text/RawTextProps.h +++ b/packages/react-native/ReactCommon/react/renderer/components/text/RawTextProps.h @@ -7,7 +7,7 @@ #pragma once -#include +#include #include diff --git a/packages/react-native/ReactCommon/react/renderer/components/text/RawTextShadowNode.h b/packages/react-native/ReactCommon/react/renderer/components/text/RawTextShadowNode.h index 08eceac345e6..d30e4e92bf6d 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/text/RawTextShadowNode.h +++ b/packages/react-native/ReactCommon/react/renderer/components/text/RawTextShadowNode.h @@ -7,7 +7,7 @@ #pragma once -#include +#include #include #include diff --git a/packages/react-native/ReactCommon/react/renderer/components/text/React/Text.h b/packages/react-native/ReactCommon/react/renderer/components/text/React/Text.h deleted file mode 100644 index 183a9e557892..000000000000 --- a/packages/react-native/ReactCommon/react/renderer/components/text/React/Text.h +++ /dev/null @@ -1,59 +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/renderer/components/text` 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. 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef ANDROID -#include -#include -#endif - -#undef RN_UMBRELLA_CONTEXT -#pragma pop_macro("RN_UMBRELLA_CONTEXT") diff --git a/packages/react-native/ReactCommon/react/renderer/components/text/SelectableParagraphComponentDescriptor.h b/packages/react-native/ReactCommon/react/renderer/components/text/SelectableParagraphComponentDescriptor.h index 182e5c7af9c6..f7a4005fa628 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/text/SelectableParagraphComponentDescriptor.h +++ b/packages/react-native/ReactCommon/react/renderer/components/text/SelectableParagraphComponentDescriptor.h @@ -7,7 +7,7 @@ #pragma once -#include +#include #include #include diff --git a/packages/react-native/ReactCommon/react/renderer/components/text/SelectableParagraphShadowNode.h b/packages/react-native/ReactCommon/react/renderer/components/text/SelectableParagraphShadowNode.h index 4e1417476efc..c82e457e9dfa 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/text/SelectableParagraphShadowNode.h +++ b/packages/react-native/ReactCommon/react/renderer/components/text/SelectableParagraphShadowNode.h @@ -7,7 +7,7 @@ #pragma once -#include +#include #include diff --git a/packages/react-native/ReactCommon/react/renderer/components/text/TextComponentDescriptor.h b/packages/react-native/ReactCommon/react/renderer/components/text/TextComponentDescriptor.h index e072df2f5751..589f2cbb721a 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/text/TextComponentDescriptor.h +++ b/packages/react-native/ReactCommon/react/renderer/components/text/TextComponentDescriptor.h @@ -7,7 +7,7 @@ #pragma once -#include +#include #include #include diff --git a/packages/react-native/ReactCommon/react/renderer/components/text/TextEffectComponentDescriptor.h b/packages/react-native/ReactCommon/react/renderer/components/text/TextEffectComponentDescriptor.h index c5970c859b57..51b3b6bd666c 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/text/TextEffectComponentDescriptor.h +++ b/packages/react-native/ReactCommon/react/renderer/components/text/TextEffectComponentDescriptor.h @@ -7,7 +7,7 @@ #pragma once -#include +#include #include #include diff --git a/packages/react-native/ReactCommon/react/renderer/components/text/TextEffectProps.h b/packages/react-native/ReactCommon/react/renderer/components/text/TextEffectProps.h index d1d503af5f40..b3129b903a73 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/text/TextEffectProps.h +++ b/packages/react-native/ReactCommon/react/renderer/components/text/TextEffectProps.h @@ -7,7 +7,7 @@ #pragma once -#include +#include #include #include diff --git a/packages/react-native/ReactCommon/react/renderer/components/text/TextEffectShadowNode.h b/packages/react-native/ReactCommon/react/renderer/components/text/TextEffectShadowNode.h index 39a980d2a37c..a23f3fe8a2e6 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/text/TextEffectShadowNode.h +++ b/packages/react-native/ReactCommon/react/renderer/components/text/TextEffectShadowNode.h @@ -7,7 +7,7 @@ #pragma once -#include +#include #include #include diff --git a/packages/react-native/ReactCommon/react/renderer/components/text/TextProps.h b/packages/react-native/ReactCommon/react/renderer/components/text/TextProps.h index 17a9e6c7ca92..eba82ae0f678 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/text/TextProps.h +++ b/packages/react-native/ReactCommon/react/renderer/components/text/TextProps.h @@ -7,7 +7,7 @@ #pragma once -#include +#include #include #include diff --git a/packages/react-native/ReactCommon/react/renderer/components/text/TextShadowNode.h b/packages/react-native/ReactCommon/react/renderer/components/text/TextShadowNode.h index 168a6ddc79ad..3b01c7f5d6e6 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/text/TextShadowNode.h +++ b/packages/react-native/ReactCommon/react/renderer/components/text/TextShadowNode.h @@ -7,7 +7,7 @@ #pragma once -#include +#include #include diff --git a/packages/react-native/ReactCommon/react/renderer/components/text/platform/android/react/renderer/components/text/HostPlatformParagraphProps.h b/packages/react-native/ReactCommon/react/renderer/components/text/platform/android/react/renderer/components/text/HostPlatformParagraphProps.h index 6cb286ef0efb..f3e30191b30e 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/text/platform/android/react/renderer/components/text/HostPlatformParagraphProps.h +++ b/packages/react-native/ReactCommon/react/renderer/components/text/platform/android/react/renderer/components/text/HostPlatformParagraphProps.h @@ -7,7 +7,7 @@ #pragma once -#include +#include #include #include diff --git a/packages/react-native/ReactCommon/react/renderer/components/text/platform/android/react/renderer/components/text/ParagraphState.h b/packages/react-native/ReactCommon/react/renderer/components/text/platform/android/react/renderer/components/text/ParagraphState.h index 6b6ff366c132..1f79987a1d84 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/text/platform/android/react/renderer/components/text/ParagraphState.h +++ b/packages/react-native/ReactCommon/react/renderer/components/text/platform/android/react/renderer/components/text/ParagraphState.h @@ -7,7 +7,7 @@ #pragma once -#include +#include #include #include diff --git a/packages/react-native/ReactCommon/react/renderer/components/text/platform/android/react/renderer/components/text/conversions.h b/packages/react-native/ReactCommon/react/renderer/components/text/platform/android/react/renderer/components/text/conversions.h index e88c8ce8f191..0e8c8dd560a8 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/text/platform/android/react/renderer/components/text/conversions.h +++ b/packages/react-native/ReactCommon/react/renderer/components/text/platform/android/react/renderer/components/text/conversions.h @@ -7,7 +7,7 @@ #pragma once -#include +#include #include #include diff --git a/packages/react-native/ReactCommon/react/renderer/components/text/platform/android/react/renderer/components/text/primitives.h b/packages/react-native/ReactCommon/react/renderer/components/text/platform/android/react/renderer/components/text/primitives.h index 213c6e9783ce..22241c7b7f36 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/text/platform/android/react/renderer/components/text/primitives.h +++ b/packages/react-native/ReactCommon/react/renderer/components/text/platform/android/react/renderer/components/text/primitives.h @@ -7,7 +7,7 @@ #pragma once -#include +#include namespace facebook::react { diff --git a/packages/react-native/ReactCommon/react/renderer/components/text/platform/cxx/react/renderer/components/text/HostPlatformParagraphProps.h b/packages/react-native/ReactCommon/react/renderer/components/text/platform/cxx/react/renderer/components/text/HostPlatformParagraphProps.h index 48f82a5f79c6..3d88cc6439ce 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/text/platform/cxx/react/renderer/components/text/HostPlatformParagraphProps.h +++ b/packages/react-native/ReactCommon/react/renderer/components/text/platform/cxx/react/renderer/components/text/HostPlatformParagraphProps.h @@ -7,7 +7,7 @@ #pragma once -#include +#include #include diff --git a/packages/react-native/ReactCommon/react/renderer/components/text/platform/cxx/react/renderer/components/text/ParagraphState.h b/packages/react-native/ReactCommon/react/renderer/components/text/platform/cxx/react/renderer/components/text/ParagraphState.h index b48650195ddc..3b351aee9843 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/text/platform/cxx/react/renderer/components/text/ParagraphState.h +++ b/packages/react-native/ReactCommon/react/renderer/components/text/platform/cxx/react/renderer/components/text/ParagraphState.h @@ -7,7 +7,7 @@ #pragma once -#include +#include #include #include diff --git a/packages/react-native/ReactCommon/react/renderer/components/text/stateConversions.h b/packages/react-native/ReactCommon/react/renderer/components/text/stateConversions.h index 58e555b34f3a..510bd2fe0c0a 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/text/stateConversions.h +++ b/packages/react-native/ReactCommon/react/renderer/components/text/stateConversions.h @@ -7,7 +7,7 @@ #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 226e091657b1..0f1f5933ded2 100644 --- a/packages/react-native/scripts/ios-prebuild/headers-config.js +++ b/packages/react-native/scripts/ios-prebuild/headers-config.js @@ -383,12 +383,6 @@ const PodspecExceptions /*: {[key: string]: PodSpecConfiguration} */ = { headerDir: 'react/renderer/components/text', }, - { - name: 'textUmbrella', - headerPatterns: ['react/renderer/components/text/React/*.h'], - headerDir: 'React', - }, - { name: 'iostextinput', headerPatterns: [ From 5cd09495beea37d8afb3d69165dad4d7c1817d67 Mon Sep 17 00:00:00 2001 From: Jakub Piasecki Date: Wed, 2 Sep 2026 02:36:33 -0700 Subject: [PATCH 6/6] Upgrade Root visibility to "for frameworks" Summary: Reclassifies `react/renderer/components/root:root` from public to "for frameworks" under the C++ stable API three-tier visibility model. Consumers that opt into `RN_STRICT_API` now get a suppressible warning where they previously got an error pointing at the umbrella, and can acknowledge it with `RN_ALLOW_FRAMEWORKS`; without that flag the guards are inert, so no existing build changes behaviour. Changelog: [Internal] Differential Revision: D118440376 --- .../ReactAndroid/build.gradle.kts | 4 --- .../ReactCommon/React-Fabric.podspec | 8 +---- .../renderer/components/root/React/Root.h | 35 ------------------- .../components/root/RootComponentDescriptor.h | 2 +- .../renderer/components/root/RootProps.h | 2 +- .../renderer/components/root/RootShadowNode.h | 2 +- .../scripts/ios-prebuild/headers-config.js | 11 +----- 7 files changed, 5 insertions(+), 59 deletions(-) delete mode 100644 packages/react-native/ReactCommon/react/renderer/components/root/React/Root.h diff --git a/packages/react-native/ReactAndroid/build.gradle.kts b/packages/react-native/ReactAndroid/build.gradle.kts index 2fbd85317e21..717af4ef1024 100644 --- a/packages/react-native/ReactAndroid/build.gradle.kts +++ b/packages/react-native/ReactAndroid/build.gradle.kts @@ -184,10 +184,6 @@ val preparePrefab by "../ReactCommon/react/renderer/components/root/", "react/renderer/components/root/", ), - Pair( - "../ReactCommon/react/renderer/components/root/React/", - "React/", - ), // runtimeexecutor Pair("../ReactCommon/runtimeexecutor/", ""), // react_renderer_textlayoutmanager diff --git a/packages/react-native/ReactCommon/React-Fabric.podspec b/packages/react-native/ReactCommon/React-Fabric.podspec index bb7c16f10bea..4df5bdde731e 100644 --- a/packages/react-native/ReactCommon/React-Fabric.podspec +++ b/packages/react-native/ReactCommon/React-Fabric.podspec @@ -134,16 +134,10 @@ Pod::Spec.new do |s| s.subspec "components" do |ss| ss.subspec "root" do |sss| sss.source_files = podspec_sources("react/renderer/components/root/**/*.{m,mm,cpp,h}", "react/renderer/components/root/**/*.{h}") - sss.exclude_files = ["react/renderer/components/root/tests", "react/renderer/components/root/React"] + sss.exclude_files = "react/renderer/components/root/tests" sss.header_dir = "react/renderer/components/root" end - ss.subspec "rootUmbrella" do |sss| - sss.source_files = "react/renderer/components/root/React/*.h" - sss.header_dir = "" - sss.header_mappings_dir = "react/renderer/components/root" - end - ss.subspec "view" do |sss| sss.dependency "React-renderercss" sss.dependency "Yoga" diff --git a/packages/react-native/ReactCommon/react/renderer/components/root/React/Root.h b/packages/react-native/ReactCommon/react/renderer/components/root/React/Root.h deleted file mode 100644 index c81a6d623464..000000000000 --- a/packages/react-native/ReactCommon/react/renderer/components/root/React/Root.h +++ /dev/null @@ -1,35 +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/renderer/components/root` 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. 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 - -#undef RN_UMBRELLA_CONTEXT -#pragma pop_macro("RN_UMBRELLA_CONTEXT") diff --git a/packages/react-native/ReactCommon/react/renderer/components/root/RootComponentDescriptor.h b/packages/react-native/ReactCommon/react/renderer/components/root/RootComponentDescriptor.h index aa1213d51676..07309a87af5d 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/root/RootComponentDescriptor.h +++ b/packages/react-native/ReactCommon/react/renderer/components/root/RootComponentDescriptor.h @@ -7,7 +7,7 @@ #pragma once -#include +#include #include #include diff --git a/packages/react-native/ReactCommon/react/renderer/components/root/RootProps.h b/packages/react-native/ReactCommon/react/renderer/components/root/RootProps.h index c862b6977ee5..5a43e19ac606 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/root/RootProps.h +++ b/packages/react-native/ReactCommon/react/renderer/components/root/RootProps.h @@ -7,7 +7,7 @@ #pragma once -#include +#include #include diff --git a/packages/react-native/ReactCommon/react/renderer/components/root/RootShadowNode.h b/packages/react-native/ReactCommon/react/renderer/components/root/RootShadowNode.h index 0b1465a3a448..fa980b713d23 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/root/RootShadowNode.h +++ b/packages/react-native/ReactCommon/react/renderer/components/root/RootShadowNode.h @@ -7,7 +7,7 @@ #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 0f1f5933ded2..ceb5639217b9 100644 --- a/packages/react-native/scripts/ios-prebuild/headers-config.js +++ b/packages/react-native/scripts/ios-prebuild/headers-config.js @@ -110,18 +110,9 @@ const PodspecExceptions /*: {[key: string]: PodSpecConfiguration} */ = { { name: 'root', headerPatterns: ['react/renderer/components/root/**/*.h'], - excludePatterns: [ - 'react/renderer/components/root/tests', - 'react/renderer/components/root/React', - ], + excludePatterns: ['react/renderer/components/root/tests'], headerDir: 'react/renderer/components/root', }, - - { - name: 'rootUmbrella', - headerPatterns: ['react/renderer/components/root/React/*.h'], - headerDir: 'React', - }, { name: 'view', headerPatterns: [