1*e4312942SKudo Chienimport fs from 'fs-extra';
2*e4312942SKudo Chienimport path from 'path';
3*e4312942SKudo Chien
4eeffdb10STomasz Sapetaimport { TransformPipeline } from '.';
5eeffdb10STomasz Sapeta
6eeffdb10STomasz Sapetaexport function podspecTransforms(versionName: string): TransformPipeline {
7eeffdb10STomasz Sapeta  return {
8eeffdb10STomasz Sapeta    transforms: [
9eeffdb10STomasz Sapeta      // Common transforms
10eeffdb10STomasz Sapeta      {
11eeffdb10STomasz Sapeta        // Transforms some podspec fields by adding versionName at the beginning
12eeffdb10STomasz Sapeta        replace: /\.(name|header_dir|module_name)(\s*=\s*["'])([^"']+)(["'])/g,
13eeffdb10STomasz Sapeta        with: `.$1$2${versionName}$3$4`,
14eeffdb10STomasz Sapeta      },
15eeffdb10STomasz Sapeta      {
16eeffdb10STomasz Sapeta        // Prefixes dependencies listed in the podspecs
1707d44be4SKudo Chien        replace: /(\.dependency\s+["'])(Yoga|React\-|ReactCommon|RCT|FB)(?!-Folly)([^"']*["'])/g,
18eeffdb10STomasz Sapeta        with: `$1${versionName}$2$3`,
19eeffdb10STomasz Sapeta      },
20eeffdb10STomasz Sapeta      {
21eeffdb10STomasz Sapeta        // Removes source conditional
22eeffdb10STomasz Sapeta        replace: /source\s*\=\s*\{[.\S\s]+?end/g,
23eeffdb10STomasz Sapeta        with: '',
24eeffdb10STomasz Sapeta      },
25eeffdb10STomasz Sapeta      {
26eeffdb10STomasz Sapeta        // Points spec source at correct directory
27eeffdb10STomasz Sapeta        replace: /(\.source\s*\=\s*)\S+\n/g,
28eeffdb10STomasz Sapeta        with: '$1{ :path => "." }\n',
29eeffdb10STomasz Sapeta      },
30eeffdb10STomasz Sapeta
31eeffdb10STomasz Sapeta      // React-Core & ReactCommon
32eeffdb10STomasz Sapeta      {
33eeffdb10STomasz Sapeta        // Fixes header_subspecs for RCTBlobHeaders
34eeffdb10STomasz Sapeta        paths: 'React-Core.podspec',
35eeffdb10STomasz Sapeta        replace: /\{(RCTBlobManager),(RCTFileReaderModule)\}/g,
36eeffdb10STomasz Sapeta        with: `{${versionName}$1,${versionName}$2}`,
37eeffdb10STomasz Sapeta      },
38eeffdb10STomasz Sapeta      {
39eeffdb10STomasz Sapeta        // Prefixes conflicting AccessibilityResources
40eeffdb10STomasz Sapeta        paths: 'React-Core.podspec',
41eeffdb10STomasz Sapeta        replace: /"AccessibilityResources"/g,
42eeffdb10STomasz Sapeta        with: `"${versionName}AccessibilityResources"`,
43eeffdb10STomasz Sapeta      },
44eeffdb10STomasz Sapeta      {
45*e4312942SKudo Chien        // Add custom modulemap for React-Core to generate correct submodules for swift integration
46*e4312942SKudo Chien        // Learn more: `packages/expo-modules-autolinking/scripts/ios/cocoapods/sandbox.rb`
47*e4312942SKudo Chien        paths: 'React-Core.podspec',
48*e4312942SKudo Chien        replace: /(s.default_subspec\s+=.*$)/mg,
49*e4312942SKudo Chien        with: `$1\n  s.module_map             = "${versionName}React-Core.modulemap"`,
50*e4312942SKudo Chien      },
51*e4312942SKudo Chien      {
52*e4312942SKudo Chien        // Hide Hermes headers from public headers because clang modoules does not support c++
53*e4312942SKudo Chien        // Learn more: `packages/expo-modules-autolinking/scripts/ios/cocoapods/sandbox.rb`
54*e4312942SKudo Chien        paths: 'React-Core.podspec',
55*e4312942SKudo Chien        replace: /(s.subspec\s+"Hermes".*$)/mg,
56*e4312942SKudo Chien        with: '$1\n    ss.private_header_files = "ReactCommon/hermes/executor/*.h", "ReactCommon/hermes/inspector/*.h", "ReactCommon/hermes/inspector/chrome/*.h", "ReactCommon/hermes/inspector/detail/*.h"',
57*e4312942SKudo Chien      },
58*e4312942SKudo Chien      {
59*e4312942SKudo Chien        // DEFINES_MODULE for swift integration
60*e4312942SKudo Chien        // Learn more: `packages/expo-modules-autolinking/scripts/ios/cocoapods/sandbox.rb`
61*e4312942SKudo Chien        paths: 'ReactCommon.podspec',
62*e4312942SKudo Chien        replace: /("USE_HEADERMAP" => "YES",)/g,
63*e4312942SKudo Chien        with: '$1 "DEFINES_MODULE" => "YES",',
64*e4312942SKudo Chien      },
65*e4312942SKudo Chien      {
66eeffdb10STomasz Sapeta        // Fixes HEADER_SEARCH_PATHS
67eeffdb10STomasz Sapeta        paths: ['React-Core.podspec', 'ReactCommon.podspec'],
68eeffdb10STomasz Sapeta        replace: /(Headers\/Private\/)(React-Core)/g,
69eeffdb10STomasz Sapeta        with: `$1${versionName}$2`,
70eeffdb10STomasz Sapeta      },
71eeffdb10STomasz Sapeta
72eeffdb10STomasz Sapeta      // React-cxxreact
73eeffdb10STomasz Sapeta      {
74eeffdb10STomasz Sapeta        // Fixes excluding SampleCxxModule.* files
75eeffdb10STomasz Sapeta        paths: 'React-cxxreact.podspec',
76eeffdb10STomasz Sapeta        replace: /\.exclude_files(\s*=\s*["'])(SampleCxxModule\.\*)(["'])/g,
77eeffdb10STomasz Sapeta        with: `.exclude_files$1${versionName}$2$3`,
78eeffdb10STomasz Sapeta      },
79eeffdb10STomasz Sapeta
80eeffdb10STomasz Sapeta      // Yoga
81eeffdb10STomasz Sapeta      {
82eeffdb10STomasz Sapeta        // Unprefixes inner directory for source_files
83eeffdb10STomasz Sapeta        paths: 'Yoga.podspec',
8407d44be4SKudo Chien        replace: /\{(Yoga),(YGEnums),(YGMacros),(YGNode),(YGStyle),(YGValue)\}/g,
8507d44be4SKudo Chien        with: `{${versionName}$1,${versionName}$2,${versionName}$3,${versionName}$4,${versionName}$5,${versionName}$6}`,
86eeffdb10STomasz Sapeta      },
87eeffdb10STomasz Sapeta
88eeffdb10STomasz Sapeta      // FBReactNativeSpec
89eeffdb10STomasz Sapeta      {
90eeffdb10STomasz Sapeta        // Fixes HEADER_SEARCH_PATHS
91eeffdb10STomasz Sapeta        paths: 'FBReactNativeSpec.podspec',
92eeffdb10STomasz Sapeta        replace: /(\/Libraries\/)(FBReactNativeSpec)/g,
93eeffdb10STomasz Sapeta        with: `$1${versionName}$2`,
94eeffdb10STomasz Sapeta      },
9507d44be4SKudo Chien      {
9607d44be4SKudo Chien        // Disable codegen from build phase script
9707d44be4SKudo Chien        paths: 'FBReactNativeSpec.podspec',
9807d44be4SKudo Chien        replace: /(use_react_native_codegen!)/g,
9907d44be4SKudo Chien        with: '# $1',
10007d44be4SKudo Chien      },
101eeffdb10STomasz Sapeta    ],
102eeffdb10STomasz Sapeta  };
103eeffdb10STomasz Sapeta}
104*e4312942SKudo Chien
105*e4312942SKudo Chienexport async function generateModulemapAsync(podspecFile: string, versionName: string) {
106*e4312942SKudo Chien    const basename = path.basename(podspecFile, '.podspec');
107*e4312942SKudo Chien    if (basename === 'React-Core') {
108*e4312942SKudo Chien      const modulemap = `\
109*e4312942SKudo Chienmodule ${versionName}React {
110*e4312942SKudo Chien  umbrella "../../Public/${versionName}React-Core/${versionName}React"
111*e4312942SKudo Chien
112*e4312942SKudo Chien  export *
113*e4312942SKudo Chien  module * { export * }
114*e4312942SKudo Chien}`;
115*e4312942SKudo Chien      const modulemapPath = path.join(path.dirname(podspecFile), `${versionName}React-Core.modulemap`);
116*e4312942SKudo Chien      await fs.writeFile(modulemapPath, modulemap);
117*e4312942SKudo Chien    }
118*e4312942SKudo Chien}
119