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
58*453643feSKudo Chien        paths: [
59*453643feSKudo Chien          'React-Core.podspec',
60*453643feSKudo Chien          'ReactCommon.podspec',
61*453643feSKudo Chien          'React-NativeModulesApple.podspec',
62*453643feSKudo Chien          'React-RCTAppDelegate.podspec',
63*453643feSKudo Chien        ],
649eae8a6aSKudo Chien        replace:
65*453643feSKudo Chien          /(Headers\/Private\/|Headers\/Public\/|_BUILD_DIR\)\/)(React-Core|React-bridging|React-hermes|hermes-engine|ReactCommon|React-RCTFabric)/g,
669eae8a6aSKudo Chien        with: `$1${versionName}$2`,
670e34784dSTomasz Sapeta      },
68eeffdb10STomasz Sapeta      // React-cxxreact
69eeffdb10STomasz Sapeta      {
70eeffdb10STomasz Sapeta        // Fixes excluding SampleCxxModule.* files
71eeffdb10STomasz Sapeta        paths: 'React-cxxreact.podspec',
72eeffdb10STomasz Sapeta        replace: /\.exclude_files(\s*=\s*["'])(SampleCxxModule\.\*)(["'])/g,
73eeffdb10STomasz Sapeta        with: `.exclude_files$1${versionName}$2$3`,
74eeffdb10STomasz Sapeta      },
756185d13dSKudo Chien      {
766185d13dSKudo Chien        // using jsc to expose jsi.h
776185d13dSKudo Chien        paths: 'React-jsi.podspec',
786185d13dSKudo Chien        replace: /^(\s+Pod::Spec.new do \|s\|.*)$/gm,
796185d13dSKudo Chien        with: '\n# using jsc to expose jsi.h\njs_engine = :jsc$1',
806185d13dSKudo Chien      },
816185d13dSKudo Chien      {
826185d13dSKudo Chien        paths: 'React-jsc.podspec',
836185d13dSKudo Chien        replace: /\b(JSCRuntime\.)/g,
846185d13dSKudo Chien        with: `${versionName}$1`,
856185d13dSKudo Chien      },
86eeffdb10STomasz Sapeta      // Yoga
87eeffdb10STomasz Sapeta      {
88eeffdb10STomasz Sapeta        // Unprefixes inner directory for source_files
89eeffdb10STomasz Sapeta        paths: 'Yoga.podspec',
9007d44be4SKudo Chien        replace: /\{(Yoga),(YGEnums),(YGMacros),(YGNode),(YGStyle),(YGValue)\}/g,
9107d44be4SKudo Chien        with: `{${versionName}$1,${versionName}$2,${versionName}$3,${versionName}$4,${versionName}$5,${versionName}$6}`,
92eeffdb10STomasz Sapeta      },
93eeffdb10STomasz Sapeta
94370fa39dSKudo Chien      // Remove codegen from build phase script
95*453643feSKudo Chien      {
96*453643feSKudo Chien        paths: ['FBReactNativeSpec.podspec', 'React-rncore.podspec'],
97a272999eSBartosz Kaszubowski        replace: /\n  use_react_native_codegen!\((.|\n)+?\n  }\)\n/gm,
98370fa39dSKudo Chien        with: '',
9907d44be4SKudo Chien      },
1009eae8a6aSKudo Chien
1019eae8a6aSKudo Chien      // hermes
1029eae8a6aSKudo Chien      {
1039eae8a6aSKudo Chien        paths: 'hermes-engine.podspec',
1049eae8a6aSKudo Chien        replace: /\b(hermes\.xcframework)/g,
1059eae8a6aSKudo Chien        with: `${versionName}$1`,
1069eae8a6aSKudo Chien      },
1079eae8a6aSKudo Chien      {
1089eae8a6aSKudo Chien        paths: 'hermes-engine.podspec',
109fe5cfb17STomasz Sapeta        replace: /  source\[:http\]\s*=\s*"http[^"]+"/,
1109eae8a6aSKudo Chien        with: `\
1112c41a0c9SKilian Finger  if File.exist?(File.join(__dir__, "destroot"))
1129eae8a6aSKudo Chien    source[:path] = '.'
1139eae8a6aSKudo Chien  else
1149eae8a6aSKudo Chien    source[:http] = 'https://github.com/expo/react-native/releases/download/sdk-${versionName
1159eae8a6aSKudo Chien      .replace('ABI', '')
1169eae8a6aSKudo Chien      .replace(/_/g, '.')}/${versionName}hermes.tar.gz'
1179eae8a6aSKudo Chien  end`,
1189eae8a6aSKudo Chien      },
11975c0fc72SKudo Chien      {
12075c0fc72SKudo Chien        // Revert the previous podspec source transform
12175c0fc72SKudo Chien        paths: 'hermes-engine.podspec',
12275c0fc72SKudo Chien        replace: /(\.source\s*)= \{ :path => "." \}\n/g,
12375c0fc72SKudo Chien        with: '$1= source\n',
12475c0fc72SKudo Chien      },
125eeffdb10STomasz Sapeta    ],
126eeffdb10STomasz Sapeta  };
127eeffdb10STomasz Sapeta}
128