From a8d1b714c9c5865495d483d8861b7b95be8d351f Mon Sep 17 00:00:00 2001 From: Pieter De Baets Date: Fri, 26 Jun 2026 12:37:43 -0700 Subject: [PATCH] Extract react/bridging into its own React-bridging pod Summary: Split the `react/bridging` headers out of the `ReactCommon` pod's `turbomodule/bridging` subspec into a standalone `React-bridging` podspec, mirroring the existing `React-bridging` SwiftPM target. This makes bridging a dependency-graph leaf so other modules can depend on it without pulling in `ReactCommon` / `React-cxxreact`. Consumers that previously reached `react/bridging` headers transitively through `ReactCommon` now resolve them through the standalone pod. The CocoaPods header-search-path injection in `update_search_paths` lists `React-bridging` alongside the other core frameworks so the headers resolve everywhere, and pods that link the `LongLivedObject` / `CallbackWrapper` symbols (`React-Fabric`, the nativemodule feature pods, `React-NativeModulesApple`, `React-RCTFBReactNativeSpec`) gain an explicit `React-bridging` dependency. All `ReactCommon/turbomodule/bridging` references in podspecs, the autolinker, the codegen template, and their test snapshots are repointed to `React-bridging`. Changelog: [Internal] Differential Revision: D109868509 --- packages/react-native/Package.swift | 7 ++- .../React/React-RCTFBReactNativeSpec.podspec | 2 +- .../ReactCommon/React-Fabric.podspec | 1 + .../ReactCommon/ReactCommon.podspec | 14 +----- .../React-jserrorhandler.podspec | 2 +- .../react/bridging/React-bridging.podspec | 46 +++++++++++++++++++ .../ios/React-NativeModulesApple.podspec | 2 +- .../dom/React-domnativemodule.podspec | 1 + .../React-idlecallbacksnativemodule.podspec | 1 + ...t-intersectionobservernativemodule.podspec | 1 + ...React-mutationobservernativemodule.podspec | 1 + .../React-webperformancenativemodule.podspec | 1 + .../cocoapods/__tests__/codegen_utils-test.rb | 2 +- .../__tests__/new_architecture-test.rb | 4 +- .../scripts/cocoapods/new_architecture.rb | 2 +- .../react-native/scripts/cocoapods/utils.rb | 1 + .../generate-artifacts-executor-test.js.snap | 4 +- .../templates/ReactCodegen.podspec.template | 2 +- .../react-native/scripts/react_native_pods.rb | 1 + 19 files changed, 69 insertions(+), 26 deletions(-) create mode 100644 packages/react-native/ReactCommon/react/bridging/React-bridging.podspec diff --git a/packages/react-native/Package.swift b/packages/react-native/Package.swift index d2c487b8970b..7e56e3b39c44 100644 --- a/packages/react-native/Package.swift +++ b/packages/react-native/Package.swift @@ -262,13 +262,12 @@ let reactRuntimeScheduler = RNTarget( dependencies: [.reactNativeDependencies, .reactFeatureFlags, .reactCxxReact, .reactPerfLogger, .reactPerformanceTimeline, .reactRendererConsistency, .reactUtils, .reactRuntimeExecutor] ) -/// ReactCommon.podspec -/// This target represent the ReactCommon/turbomodule/bridging subspec +/// React-bridging.podspec let reactTurboModuleBridging = RNTarget( name: .reactTurboModuleBridging, path: "ReactCommon/react/bridging", excludedPaths: ["tests"], - dependencies: [.reactNativeDependencies, .reactPerfLogger, .reactCxxReact, .jsi, .logger] + dependencies: [.reactNativeDependencies, .reactPerfLogger, .jsi, .logger] ) /// React-jserrorhandler.podspec @@ -904,7 +903,7 @@ extension String { static let reactRCTLinking = "React-RCTLinking" static let reactCoreModules = "React-CoreModules" static let reactRCTAnimatedModuleProvider = "RCTAnimatedModuleProvider" - static let reactTurboModuleBridging = "ReactCommon/turbomodule/bridging" + static let reactTurboModuleBridging = "React-bridging" static let reactTurboModuleCore = "ReactCommon/turbomodule/core" static let reactTurboModuleCoreDefaults = "ReactCommon/turbomodule/core/defaults" static let reactTurboModuleCoreMicrotasks = "ReactCommon/turbomodule/core/microtasks" diff --git a/packages/react-native/React/React-RCTFBReactNativeSpec.podspec b/packages/react-native/React/React-RCTFBReactNativeSpec.podspec index 1abb84e7e473..f9978b78aca4 100644 --- a/packages/react-native/React/React-RCTFBReactNativeSpec.podspec +++ b/packages/react-native/React/React-RCTFBReactNativeSpec.podspec @@ -54,7 +54,7 @@ Pod::Spec.new do |s| s.dependency "React-NativeModulesApple" add_dependency(s, "ReactCommon", :subspec => "turbomodule/core", :additional_framework_paths => ["react/nativemodule/core"]) - add_dependency(s, "ReactCommon", :subspec => "turbomodule/bridging", :additional_framework_paths => ["react/nativemodule/bridging"]) + s.dependency "React-bridging" depend_on_js_engine(s) add_rn_third_party_dependencies(s) diff --git a/packages/react-native/ReactCommon/React-Fabric.podspec b/packages/react-native/ReactCommon/React-Fabric.podspec index a92fe2abc49d..183c039786eb 100644 --- a/packages/react-native/ReactCommon/React-Fabric.podspec +++ b/packages/react-native/ReactCommon/React-Fabric.podspec @@ -45,6 +45,7 @@ Pod::Spec.new do |s| s.dependency "React-featureflags" s.dependency "React-runtimescheduler" s.dependency "React-cxxreact" + s.dependency "React-bridging" add_dependency(s, "React-runtimeexecutor", :additional_framework_paths => ["platform/ios"]) add_dependency(s, "React-rendererdebug") diff --git a/packages/react-native/ReactCommon/ReactCommon.podspec b/packages/react-native/ReactCommon/ReactCommon.podspec index 83e81864640d..a6a9ce6b5668 100644 --- a/packages/react-native/ReactCommon/ReactCommon.podspec +++ b/packages/react-native/ReactCommon/ReactCommon.podspec @@ -43,27 +43,17 @@ Pod::Spec.new do |s| s.subspec "turbomodule" do |ss| ss.dependency "React-callinvoker", version ss.dependency "React-perflogger", version - ss.dependency "React-cxxreact", version ss.dependency "React-jsi", version ss.dependency "React-logger", version if use_hermes() ss.dependency "hermes-engine" end - ss.subspec "bridging" do |sss| - sss.dependency "React-jsi", version - sss.source_files = podspec_sources("react/bridging/**/*.{cpp,h}", "react/bridging/**/*.h") - sss.exclude_files = "react/bridging/tests" - sss.header_dir = "react/bridging" - sss.pod_target_xcconfig = { "HEADER_SEARCH_PATHS" => "\"$(PODS_TARGET_SRCROOT)/ReactCommon\"" } - if use_hermes() - sss.dependency "hermes-engine" - end - end - ss.subspec "core" do |sss| sss.source_files = podspec_sources("react/nativemodule/core/ReactCommon/**/*.{cpp,h}", "react/nativemodule/core/ReactCommon/**/*.h") sss.pod_target_xcconfig = { "HEADER_SEARCH_PATHS" => "\"$(PODS_TARGET_SRCROOT)/ReactCommon\" \"$(PODS_CONFIGURATION_BUILD_DIR)/React-debug/React_debug.framework/Headers\" \"$(PODS_CONFIGURATION_BUILD_DIR)/React-debug/React_featureflags.framework/Headers\" \"$(PODS_CONFIGURATION_BUILD_DIR)/React-utils/React_utils.framework/Headers\"" } + sss.dependency "React-bridging" + sss.dependency "React-cxxreact", version sss.dependency "React-debug", version sss.dependency "React-featureflags", version sss.dependency "React-utils", version diff --git a/packages/react-native/ReactCommon/jserrorhandler/React-jserrorhandler.podspec b/packages/react-native/ReactCommon/jserrorhandler/React-jserrorhandler.podspec index a5cc33ecc99a..9f6e92d59a20 100644 --- a/packages/react-native/ReactCommon/jserrorhandler/React-jserrorhandler.podspec +++ b/packages/react-native/ReactCommon/jserrorhandler/React-jserrorhandler.podspec @@ -38,7 +38,7 @@ Pod::Spec.new do |s| s.dependency "React-jsi" s.dependency "React-cxxreact" - s.dependency "ReactCommon/turbomodule/bridging" + s.dependency "React-bridging" add_dependency(s, "React-featureflags") add_dependency(s, "React-debug") diff --git a/packages/react-native/ReactCommon/react/bridging/React-bridging.podspec b/packages/react-native/ReactCommon/react/bridging/React-bridging.podspec new file mode 100644 index 000000000000..be8e741782a0 --- /dev/null +++ b/packages/react-native/ReactCommon/react/bridging/React-bridging.podspec @@ -0,0 +1,46 @@ +# 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. + +require "json" + +package = JSON.parse(File.read(File.join(__dir__, "..", "..", "..", "package.json"))) +version = package['version'] + +source = { :git => 'https://github.com/facebook/react-native.git' } +if version == '1000.0.0' + # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in. + source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1") +else + source[:tag] = "v#{version}" +end + +Pod::Spec.new do |s| + s.name = "React-bridging" + s.version = version + s.summary = "-" + s.homepage = "https://reactnative.dev/" + s.license = package["license"] + s.author = "Meta Platforms, Inc. and its affiliates" + s.platforms = min_supported_versions + s.source = source + s.source_files = podspec_sources("*.{cpp,h}", "*.h") + s.header_dir = "react/bridging" + s.pod_target_xcconfig = { + "USE_HEADERMAP" => "YES", + "CLANG_CXX_LANGUAGE_STANDARD" => rct_cxx_language_standard(), + "DEFINES_MODULE" => "YES" + } + + resolve_use_frameworks(s, header_mappings_dir: "../..", module_name: "React_bridging") + + s.dependency "React-jsi" + s.dependency "React-callinvoker" + s.dependency "React-timing" + s.dependency "React-logger" + s.dependency "React-perflogger" + + add_rn_third_party_dependencies(s) + add_rncore_dependency(s) +end diff --git a/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/React-NativeModulesApple.podspec b/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/React-NativeModulesApple.podspec index 7fd2869614b6..92bf47ef5764 100644 --- a/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/React-NativeModulesApple.podspec +++ b/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/React-NativeModulesApple.podspec @@ -37,7 +37,7 @@ Pod::Spec.new do |s| s.source_files = podspec_sources("ReactCommon/**/*.{mm,cpp,h}", "ReactCommon/**/*.{h}") s.dependency "ReactCommon/turbomodule/core" - s.dependency "ReactCommon/turbomodule/bridging" + s.dependency "React-bridging" s.dependency "React-callinvoker" s.dependency "React-Core" s.dependency "React-cxxreact" diff --git a/packages/react-native/ReactCommon/react/nativemodule/dom/React-domnativemodule.podspec b/packages/react-native/ReactCommon/react/nativemodule/dom/React-domnativemodule.podspec index 6119ccb41057..6cc38a3b0fa7 100644 --- a/packages/react-native/ReactCommon/react/nativemodule/dom/React-domnativemodule.podspec +++ b/packages/react-native/ReactCommon/react/nativemodule/dom/React-domnativemodule.podspec @@ -51,6 +51,7 @@ Pod::Spec.new do |s| s.dependency "Yoga" s.dependency "ReactCommon/turbomodule/core" + s.dependency "React-bridging" s.dependency "React-Fabric" s.dependency "React-Fabric/bridging" s.dependency "React-FabricComponents" diff --git a/packages/react-native/ReactCommon/react/nativemodule/idlecallbacks/React-idlecallbacksnativemodule.podspec b/packages/react-native/ReactCommon/react/nativemodule/idlecallbacks/React-idlecallbacksnativemodule.podspec index 46327b2c74d6..654e412d5fea 100644 --- a/packages/react-native/ReactCommon/react/nativemodule/idlecallbacks/React-idlecallbacksnativemodule.podspec +++ b/packages/react-native/ReactCommon/react/nativemodule/idlecallbacks/React-idlecallbacksnativemodule.podspec @@ -48,6 +48,7 @@ Pod::Spec.new do |s| add_rncore_dependency(s) s.dependency "ReactCommon/turbomodule/core" + s.dependency "React-bridging" s.dependency "React-runtimescheduler" add_dependency(s, "React-RCTFBReactNativeSpec") add_dependency(s, "React-runtimeexecutor", :additional_framework_paths => ["platform/ios"]) diff --git a/packages/react-native/ReactCommon/react/nativemodule/intersectionobserver/React-intersectionobservernativemodule.podspec b/packages/react-native/ReactCommon/react/nativemodule/intersectionobserver/React-intersectionobservernativemodule.podspec index 089512b1cf9e..4a98cc332a52 100644 --- a/packages/react-native/ReactCommon/react/nativemodule/intersectionobserver/React-intersectionobservernativemodule.podspec +++ b/packages/react-native/ReactCommon/react/nativemodule/intersectionobserver/React-intersectionobservernativemodule.podspec @@ -55,6 +55,7 @@ Pod::Spec.new do |s| add_rncore_dependency(s) s.dependency "ReactCommon/turbomodule/core" + s.dependency "React-bridging" s.dependency "React-Fabric" s.dependency "React-Fabric/bridging" diff --git a/packages/react-native/ReactCommon/react/nativemodule/mutationobserver/React-mutationobservernativemodule.podspec b/packages/react-native/ReactCommon/react/nativemodule/mutationobserver/React-mutationobservernativemodule.podspec index 4ce39514ae20..67b2cbd6052b 100644 --- a/packages/react-native/ReactCommon/react/nativemodule/mutationobserver/React-mutationobservernativemodule.podspec +++ b/packages/react-native/ReactCommon/react/nativemodule/mutationobserver/React-mutationobservernativemodule.podspec @@ -55,6 +55,7 @@ Pod::Spec.new do |s| add_rncore_dependency(s) s.dependency "ReactCommon/turbomodule/core" + s.dependency "React-bridging" s.dependency "React-Fabric" s.dependency "React-Fabric/bridging" diff --git a/packages/react-native/ReactCommon/react/nativemodule/webperformance/React-webperformancenativemodule.podspec b/packages/react-native/ReactCommon/react/nativemodule/webperformance/React-webperformancenativemodule.podspec index 97b52ac93a04..e1615a6ba578 100644 --- a/packages/react-native/ReactCommon/react/nativemodule/webperformance/React-webperformancenativemodule.podspec +++ b/packages/react-native/ReactCommon/react/nativemodule/webperformance/React-webperformancenativemodule.podspec @@ -52,6 +52,7 @@ Pod::Spec.new do |s| add_rncore_dependency(s) s.dependency "ReactCommon/turbomodule/core" + s.dependency "React-bridging" add_dependency(s, "React-RCTFBReactNativeSpec") add_dependency(s, "React-performancetimeline") diff --git a/packages/react-native/scripts/cocoapods/__tests__/codegen_utils-test.rb b/packages/react-native/scripts/cocoapods/__tests__/codegen_utils-test.rb index ad4a5a62c3ad..3dde2a593588 100644 --- a/packages/react-native/scripts/cocoapods/__tests__/codegen_utils-test.rb +++ b/packages/react-native/scripts/cocoapods/__tests__/codegen_utils-test.rb @@ -266,7 +266,7 @@ def get_podspec_no_fabric_no_script "React-Core": [], "React-jsi": [], "React-jsiexecutor": [], - "ReactCommon/turbomodule/bridging": [], + "React-bridging": [], "ReactCommon/turbomodule/core": [], "hermes-engine": [], "React-NativeModulesApple": [], diff --git a/packages/react-native/scripts/cocoapods/__tests__/new_architecture-test.rb b/packages/react-native/scripts/cocoapods/__tests__/new_architecture-test.rb index b062c6e3f243..ba95cfc3331f 100644 --- a/packages/react-native/scripts/cocoapods/__tests__/new_architecture-test.rb +++ b/packages/react-native/scripts/cocoapods/__tests__/new_architecture-test.rb @@ -152,7 +152,7 @@ def test_installModulesDependencies_whenNewArchEnabledAndNewArchAndNoSearchPaths { :dependency_name => "ReactCodegen" }, { :dependency_name => "RCTRequired" }, { :dependency_name => "RCTTypeSafety" }, - { :dependency_name => "ReactCommon/turbomodule/bridging" }, + { :dependency_name => "React-bridging" }, { :dependency_name => "ReactCommon/turbomodule/core" }, { :dependency_name => "React-NativeModulesApple" }, { :dependency_name => "Yoga" }, @@ -203,7 +203,7 @@ def test_installModulesDependencies_whenNewArchDisabledAndSearchPathsAndCompiler { :dependency_name => "ReactCodegen" }, { :dependency_name => "RCTRequired" }, { :dependency_name => "RCTTypeSafety" }, - { :dependency_name => "ReactCommon/turbomodule/bridging" }, + { :dependency_name => "React-bridging" }, { :dependency_name => "ReactCommon/turbomodule/core" }, { :dependency_name => "React-NativeModulesApple" }, { :dependency_name => "Yoga" }, diff --git a/packages/react-native/scripts/cocoapods/new_architecture.rb b/packages/react-native/scripts/cocoapods/new_architecture.rb index 3873632a7d7b..e4353427a977 100644 --- a/packages/react-native/scripts/cocoapods/new_architecture.rb +++ b/packages/react-native/scripts/cocoapods/new_architecture.rb @@ -119,7 +119,7 @@ def self.install_modules_dependencies(spec, new_arch_enabled, folly_version = He spec.dependency "RCTRequired" spec.dependency "RCTTypeSafety" - spec.dependency "ReactCommon/turbomodule/bridging" + spec.dependency "React-bridging" spec.dependency "ReactCommon/turbomodule/core" spec.dependency "React-NativeModulesApple" spec.dependency "Yoga" diff --git a/packages/react-native/scripts/cocoapods/utils.rb b/packages/react-native/scripts/cocoapods/utils.rb index 0e388d6a7ef5..43d71ac01ba9 100644 --- a/packages/react-native/scripts/cocoapods/utils.rb +++ b/packages/react-native/scripts/cocoapods/utils.rb @@ -333,6 +333,7 @@ def self.update_search_paths(installer) .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-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"])) .concat(ReactNativePodsUtils.create_header_search_path_for_frameworks("PODS_CONFIGURATION_BUILD_DIR", "React-featureflags", "React_featureflags", [])) .concat(ReactNativePodsUtils.create_header_search_path_for_frameworks("PODS_CONFIGURATION_BUILD_DIR", "React-renderercss", "React_renderercss", [])) diff --git a/packages/react-native/scripts/codegen/__tests__/__snapshots__/generate-artifacts-executor-test.js.snap b/packages/react-native/scripts/codegen/__tests__/__snapshots__/generate-artifacts-executor-test.js.snap index 40e82c15eff7..9ce1c901040e 100644 --- a/packages/react-native/scripts/codegen/__tests__/__snapshots__/generate-artifacts-executor-test.js.snap +++ b/packages/react-native/scripts/codegen/__tests__/__snapshots__/generate-artifacts-executor-test.js.snap @@ -465,7 +465,7 @@ Pod::Spec.new do |s| s.dependency \\"RCTTypeSafety\\" s.dependency \\"React-Core\\" s.dependency \\"React-jsi\\" - s.dependency \\"ReactCommon/turbomodule/bridging\\" + s.dependency \\"React-bridging\\" s.dependency \\"ReactCommon/turbomodule/core\\" s.dependency \\"React-NativeModulesApple\\" s.dependency 'React-graphics' @@ -948,7 +948,7 @@ Pod::Spec.new do |s| s.dependency \\"RCTTypeSafety\\" s.dependency \\"React-Core\\" s.dependency \\"React-jsi\\" - s.dependency \\"ReactCommon/turbomodule/bridging\\" + s.dependency \\"React-bridging\\" s.dependency \\"ReactCommon/turbomodule/core\\" s.dependency \\"React-NativeModulesApple\\" s.dependency 'React-graphics' diff --git a/packages/react-native/scripts/codegen/templates/ReactCodegen.podspec.template b/packages/react-native/scripts/codegen/templates/ReactCodegen.podspec.template index de434d4b91d8..5909a466ee82 100644 --- a/packages/react-native/scripts/codegen/templates/ReactCodegen.podspec.template +++ b/packages/react-native/scripts/codegen/templates/ReactCodegen.podspec.template @@ -69,7 +69,7 @@ Pod::Spec.new do |s| s.dependency "RCTTypeSafety" s.dependency "React-Core" s.dependency "React-jsi" - s.dependency "ReactCommon/turbomodule/bridging" + s.dependency "React-bridging" s.dependency "ReactCommon/turbomodule/core" s.dependency "React-NativeModulesApple" s.dependency 'React-graphics' diff --git a/packages/react-native/scripts/react_native_pods.rb b/packages/react-native/scripts/react_native_pods.rb index f9dac08218be..4d3e3362bf60 100644 --- a/packages/react-native/scripts/react_native_pods.rb +++ b/packages/react-native/scripts/react_native_pods.rb @@ -161,6 +161,7 @@ def use_react_native! ( pod 'React-domnativemodule', :path => "#{prefix}/ReactCommon/react/nativemodule/dom" pod 'React-defaultsnativemodule', :path => "#{prefix}/ReactCommon/react/nativemodule/defaults" pod 'React-Mapbuffer', :path => "#{prefix}/ReactCommon" + pod 'React-bridging', :path => "#{prefix}/ReactCommon/react/bridging", :modular_headers => true pod 'React-jserrorhandler', :path => "#{prefix}/ReactCommon/jserrorhandler" pod 'RCTDeprecation', :path => "#{prefix}/ReactApple/Libraries/RCTFoundation/RCTDeprecation" pod 'React-RCTFBReactNativeSpec', :path => "#{prefix}/React"