1eeffdb10STomasz Sapetaimport { TransformPipeline } from '.';
2eeffdb10STomasz Sapeta
3eeffdb10STomasz Sapetaexport function podspecTransforms(versionName: string): TransformPipeline {
4eeffdb10STomasz Sapeta  return {
5eeffdb10STomasz Sapeta    transforms: [
6eeffdb10STomasz Sapeta      // Common transforms
7eeffdb10STomasz Sapeta      {
8eeffdb10STomasz Sapeta        // Transforms some podspec fields by adding versionName at the beginning
9eeffdb10STomasz Sapeta        replace: /\.(name|header_dir|module_name)(\s*=\s*["'])([^"']+)(["'])/g,
10eeffdb10STomasz Sapeta        with: `.$1$2${versionName}$3$4`,
11eeffdb10STomasz Sapeta      },
12eeffdb10STomasz Sapeta      {
13eeffdb10STomasz Sapeta        // Prefixes dependencies listed in the podspecs
149eae8a6aSKudo Chien        replace:
159eae8a6aSKudo Chien          /(\.dependency\s+["'])(Yoga|React\-|ReactCommon|RCT|FB|hermes-engine)(?!-Folly)([^"']*["'])/g,
16eeffdb10STomasz Sapeta        with: `$1${versionName}$2$3`,
17eeffdb10STomasz Sapeta      },
18eeffdb10STomasz Sapeta      {
199eae8a6aSKudo Chien        // Removes source conditional, but not the `source = {}` in hermes-engine.podspec
20eeffdb10STomasz Sapeta        replace: /source\s*\=\s*\{ [.\S\s]+?end/g,
21eeffdb10STomasz Sapeta        with: '',
22eeffdb10STomasz Sapeta      },
23eeffdb10STomasz Sapeta      {
24eeffdb10STomasz Sapeta        // Points spec source at correct directory
25eeffdb10STomasz Sapeta        replace: /(\.source\s*\=\s*)\S+\n/g,
26eeffdb10STomasz Sapeta        with: '$1{ :path => "." }\n',
27eeffdb10STomasz Sapeta      },
28eeffdb10STomasz Sapeta
29eeffdb10STomasz Sapeta      // React-Core & ReactCommon
30eeffdb10STomasz Sapeta      {
31eeffdb10STomasz Sapeta        // Fixes header_subspecs for RCTBlobHeaders
32eeffdb10STomasz Sapeta        paths: 'React-Core.podspec',
33eeffdb10STomasz Sapeta        replace: /\{(RCTBlobManager),(RCTFileReaderModule)\}/g,
34eeffdb10STomasz Sapeta        with: `{${versionName}$1,${versionName}$2}`,
35eeffdb10STomasz Sapeta      },
36eeffdb10STomasz Sapeta      {
37eeffdb10STomasz Sapeta        // Prefixes conflicting AccessibilityResources
38eeffdb10STomasz Sapeta        paths: 'React-Core.podspec',
39eeffdb10STomasz Sapeta        replace: /"AccessibilityResources"/g,
40eeffdb10STomasz Sapeta        with: `"${versionName}AccessibilityResources"`,
41eeffdb10STomasz Sapeta      },
42eeffdb10STomasz Sapeta      {
43e4312942SKudo Chien        // DEFINES_MODULE for swift integration
44e4312942SKudo Chien        // Learn more: `packages/expo-modules-autolinking/scripts/ios/cocoapods/sandbox.rb`
45e4312942SKudo Chien        paths: 'ReactCommon.podspec',
46e4312942SKudo Chien        replace: /("USE_HEADERMAP" => "YES",)/g,
47e4312942SKudo Chien        with: '$1 "DEFINES_MODULE" => "YES",',
48e4312942SKudo Chien      },
49e4312942SKudo Chien      {
506185d13dSKudo Chien        // DEFINES_MODULE for swift integration
516185d13dSKudo Chien        // Learn more: `packages/expo-modules-autolinking/scripts/ios/cocoapods/sandbox.rb`
526185d13dSKudo Chien        paths: 'React-RCTAppDelegate.podspec',
536185d13dSKudo Chien        replace: /("CLANG_CXX_LANGUAGE_STANDARD" => "c\+\+17")/g,
546185d13dSKudo Chien        with: '$1, "DEFINES_MODULE" => "YES",',
556185d13dSKudo Chien      },
566185d13dSKudo Chien      {
57eeffdb10STomasz Sapeta        // Fixes HEADER_SEARCH_PATHS
58eeffdb10STomasz Sapeta        paths: ['React-Core.podspec', 'ReactCommon.podspec'],
599eae8a6aSKudo Chien        replace:
609eae8a6aSKudo Chien          /(Headers\/Private\/|Headers\/Public\/|_BUILD_DIR\)\/)(React-Core|React-bridging|React-hermes|hermes-engine)/g,
619eae8a6aSKudo Chien        with: `$1${versionName}$2`,
620e34784dSTomasz Sapeta      },
63eeffdb10STomasz Sapeta      // React-cxxreact
64eeffdb10STomasz Sapeta      {
65eeffdb10STomasz Sapeta        // Fixes excluding SampleCxxModule.* files
66eeffdb10STomasz Sapeta        paths: 'React-cxxreact.podspec',
67eeffdb10STomasz Sapeta        replace: /\.exclude_files(\s*=\s*["'])(SampleCxxModule\.\*)(["'])/g,
68eeffdb10STomasz Sapeta        with: `.exclude_files$1${versionName}$2$3`,
69eeffdb10STomasz Sapeta      },
706185d13dSKudo Chien      {
716185d13dSKudo Chien        // using jsc to expose jsi.h
726185d13dSKudo Chien        paths: 'React-jsi.podspec',
736185d13dSKudo Chien        replace: /^(\s+Pod::Spec.new do \|s\|.*)$/gm,
746185d13dSKudo Chien        with: '\n# using jsc to expose jsi.h\njs_engine = :jsc$1',
756185d13dSKudo Chien      },
766185d13dSKudo Chien      {
776185d13dSKudo Chien        paths: 'React-jsc.podspec',
786185d13dSKudo Chien        replace: /\b(JSCRuntime\.)/g,
796185d13dSKudo Chien        with: `${versionName}$1`,
806185d13dSKudo Chien      },
81eeffdb10STomasz Sapeta      // Yoga
82eeffdb10STomasz Sapeta      {
83eeffdb10STomasz Sapeta        // Unprefixes inner directory for source_files
84eeffdb10STomasz Sapeta        paths: 'Yoga.podspec',
8507d44be4SKudo Chien        replace: /\{(Yoga),(YGEnums),(YGMacros),(YGNode),(YGStyle),(YGValue)\}/g,
8607d44be4SKudo Chien        with: `{${versionName}$1,${versionName}$2,${versionName}$3,${versionName}$4,${versionName}$5,${versionName}$6}`,
87eeffdb10STomasz Sapeta      },
88eeffdb10STomasz Sapeta
89eeffdb10STomasz Sapeta      // FBReactNativeSpec
90eeffdb10STomasz Sapeta      {
91370fa39dSKudo Chien        // Remove codegen from build phase script
9207d44be4SKudo Chien        paths: 'FBReactNativeSpec.podspec',
93a272999eSBartosz Kaszubowski        replace: /\n  use_react_native_codegen!\((.|\n)+?\n  }\)\n/gm,
94370fa39dSKudo Chien        with: '',
9507d44be4SKudo Chien      },
969eae8a6aSKudo Chien
979eae8a6aSKudo Chien      // hermes
989eae8a6aSKudo Chien      {
999eae8a6aSKudo Chien        paths: 'hermes-engine.podspec',
1009eae8a6aSKudo Chien        replace: /\b(hermes\.xcframework)/g,
1019eae8a6aSKudo Chien        with: `${versionName}$1`,
1029eae8a6aSKudo Chien      },
1039eae8a6aSKudo Chien      {
1049eae8a6aSKudo Chien        paths: 'hermes-engine.podspec',
105*fe5cfb17STomasz Sapeta        replace: /  source\[:http\]\s*=\s*"http[^"]+"/,
1069eae8a6aSKudo Chien        with: `\
1072c41a0c9SKilian Finger  if File.exist?(File.join(__dir__, "destroot"))
1089eae8a6aSKudo Chien    source[:path] = '.'
1099eae8a6aSKudo Chien  else
1109eae8a6aSKudo Chien    source[:http] = 'https://github.com/expo/react-native/releases/download/sdk-${versionName
1119eae8a6aSKudo Chien      .replace('ABI', '')
1129eae8a6aSKudo Chien      .replace(/_/g, '.')}/${versionName}hermes.tar.gz'
1139eae8a6aSKudo Chien  end`,
1149eae8a6aSKudo Chien      },
11575c0fc72SKudo Chien      {
11675c0fc72SKudo Chien        // Revert the previous podspec source transform
11775c0fc72SKudo Chien        paths: 'hermes-engine.podspec',
11875c0fc72SKudo Chien        replace: /(\.source\s*)= \{ :path => "." \}\n/g,
11975c0fc72SKudo Chien        with: '$1= source\n',
12075c0fc72SKudo Chien      },
121eeffdb10STomasz Sapeta    ],
122eeffdb10STomasz Sapeta  };
123eeffdb10STomasz Sapeta}
124