1# Overrides CocoaPods `Sandbox` class to patch podspecs on the fly 2# See: https://github.com/CocoaPods/CocoaPods/blob/master/lib/cocoapods/sandbox.rb 3 4require 'json' 5 6REACT_DEFINE_MODULES_LIST = [ 7 'ReactCommon', 8 'React-RCTAppDelegate', 9 'React-hermes', 10 'React-jsc', 11 'React-Fabric', 12 'React-graphics', 13 'React-utils', 14 'React-debug', 15] 16 17module Pod 18 class Sandbox 19 private 20 21 _original_store_podspec = instance_method(:store_podspec) 22 23 public 24 25 define_method(:store_podspec) do |name, podspec, _external_source, json| 26 spec = _original_store_podspec.bind(self).(name, podspec, _external_source, json) 27 patched_spec = nil 28 29 # Patch `React-Core.podspec` for clang to generate correct submodules for swift integration 30 if name == 'React-Core' 31 spec_json = JSON.parse(spec.to_pretty_json) 32 33 # clang module does not support objc++. 34 # We should put Hermes headers inside private headers directory. 35 # Otherwise, clang will throw errors in building module. 36 hermes_subspec_index = spec_json['subspecs'].index { |subspec| subspec['name'] == 'Hermes' } 37 if hermes_subspec_index 38 spec_json['subspecs'][hermes_subspec_index]['private_header_files'] ||= [ 39 'ReactCommon/hermes/executor/*.h', 40 'ReactCommon/hermes/inspector/*.h', 41 'ReactCommon/hermes/inspector/chrome/*.h', 42 'ReactCommon/hermes/inspector/detail/*.h', 43 ] 44 end 45 46 patched_spec = Specification.from_json(spec_json.to_json) 47 48 # Patch podspecs to define module 49 elsif REACT_DEFINE_MODULES_LIST.include? name 50 spec_json = JSON.parse(podspec.to_pretty_json) 51 spec_json['pod_target_xcconfig'] ||= {} 52 spec_json['pod_target_xcconfig']['DEFINES_MODULE'] = 'YES' 53 patched_spec = Specification.from_json(spec_json.to_json) 54 end 55 56 if patched_spec != nil 57 # Store the patched spec with original checksum and local saved file path 58 patched_spec.defined_in_file = spec.defined_in_file 59 patched_spec.instance_variable_set(:@checksum, spec.checksum) 60 @stored_podspecs[spec.name] = patched_spec 61 return patched_spec 62 end 63 64 return spec 65 end # define_method(:store_podspec) 66 67 end # class Sandbox 68end # module Pod 69