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