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