1*f194f574SWojciech Kozyraimport escapeRegExp from 'lodash/escapeRegExp'; 2*f194f574SWojciech Kozyraimport path from 'path'; 3*f194f574SWojciech Kozyra 4*f194f574SWojciech Kozyraimport { transformString } from '../../Transforms'; 5*f194f574SWojciech Kozyraimport { FileTransform, FileTransforms, StringTransform } from '../../Transforms.types'; 6*f194f574SWojciech Kozyraimport { baseCmakeTransforms } from './cmakeTransforms'; 7*f194f574SWojciech Kozyraimport { JniLibNames } from './libraries'; 8*f194f574SWojciech Kozyraimport { packagesToRename } from './packagesConfig'; 9*f194f574SWojciech Kozyra 10*f194f574SWojciech Kozyrafunction pathFromPkg(pkg: string): string { 11*f194f574SWojciech Kozyra return pkg.replace(/\./g, '/'); 12*f194f574SWojciech Kozyra} 13*f194f574SWojciech Kozyra 14*f194f574SWojciech Kozyraexport function reactNativeTransforms( 15*f194f574SWojciech Kozyra versionedReactNativeRoot: string, 16*f194f574SWojciech Kozyra abiVersion: string 17*f194f574SWojciech Kozyra): FileTransforms { 18*f194f574SWojciech Kozyra return { 19*f194f574SWojciech Kozyra path: [], 20*f194f574SWojciech Kozyra content: [ 21*f194f574SWojciech Kozyra // Update codegen folder to our customized folder 22*f194f574SWojciech Kozyra { 23*f194f574SWojciech Kozyra paths: './ReactAndroid/build.gradle', 24*f194f574SWojciech Kozyra find: /"REACT_GENERATED_SRC_DIR=.+?",/, 25*f194f574SWojciech Kozyra replaceWith: `"REACT_GENERATED_SRC_DIR=${versionedReactNativeRoot}",`, 26*f194f574SWojciech Kozyra }, 27*f194f574SWojciech Kozyra // Add generated java to sourceSets 28*f194f574SWojciech Kozyra { 29*f194f574SWojciech Kozyra paths: './ReactAndroid/build.gradle', 30*f194f574SWojciech Kozyra find: /(\bsrcDirs = \["src\/main\/java",.+)(\])/, 31*f194f574SWojciech Kozyra replaceWith: `$1, "${path.join(versionedReactNativeRoot, 'codegen')}/java"$2`, 32*f194f574SWojciech Kozyra }, 33*f194f574SWojciech Kozyra // Disable codegen plugin 34*f194f574SWojciech Kozyra { 35*f194f574SWojciech Kozyra paths: './ReactAndroid/build.gradle', 36*f194f574SWojciech Kozyra find: /(\bid\("com\.facebook\.react"\)$)/m, 37*f194f574SWojciech Kozyra replaceWith: '// $1', 38*f194f574SWojciech Kozyra }, 39*f194f574SWojciech Kozyra { 40*f194f574SWojciech Kozyra paths: './ReactAndroid/build.gradle', 41*f194f574SWojciech Kozyra find: /(^react {[^]+?\n\})/m, 42*f194f574SWojciech Kozyra replaceWith: '/* $1 */', 43*f194f574SWojciech Kozyra }, 44*f194f574SWojciech Kozyra { 45*f194f574SWojciech Kozyra paths: './ReactAndroid/build.gradle', 46*f194f574SWojciech Kozyra find: /(\bpreBuild\.dependsOn\("generateCodegenArtifactsFromSchema"\))/, 47*f194f574SWojciech Kozyra replaceWith: '// $1', 48*f194f574SWojciech Kozyra }, 49*f194f574SWojciech Kozyra { 50*f194f574SWojciech Kozyra paths: './ReactAndroid/build.gradle', 51*f194f574SWojciech Kozyra find: /(externalNativeBuild\s*\{)([\s\S]*?)(\}\s)/g, 52*f194f574SWojciech Kozyra replaceWith: (_, p1, p2, p3) => 53*f194f574SWojciech Kozyra [ 54*f194f574SWojciech Kozyra p1, 55*f194f574SWojciech Kozyra transformString( 56*f194f574SWojciech Kozyra p2, 57*f194f574SWojciech Kozyra JniLibNames.map((lib: string) => ({ 58*f194f574SWojciech Kozyra find: new RegExp(`"${escapeRegExp(lib)}"`, 'g'), 59*f194f574SWojciech Kozyra replaceWith: `"${lib}_${abiVersion}"`, 60*f194f574SWojciech Kozyra })) 61*f194f574SWojciech Kozyra ), 62*f194f574SWojciech Kozyra p3, 63*f194f574SWojciech Kozyra ].join(''), 64*f194f574SWojciech Kozyra }, 65*f194f574SWojciech Kozyra ...packagesToRename.map((pkg: string) => ({ 66*f194f574SWojciech Kozyra paths: ['./ReactCommon/**/*.{java,h,cpp}', './ReactAndroid/src/main/**/*.{java,h,cpp}'], 67*f194f574SWojciech Kozyra find: new RegExp(`${escapeRegExp(pathFromPkg(pkg))}`, 'g'), 68*f194f574SWojciech Kozyra replaceWith: `${abiVersion}/${pathFromPkg(pkg)}`, 69*f194f574SWojciech Kozyra })), 70*f194f574SWojciech Kozyra ...reactNativeCmakeTransforms(abiVersion), 71*f194f574SWojciech Kozyra { 72*f194f574SWojciech Kozyra paths: './ReactAndroid/hermes-engine/build.gradle', 73*f194f574SWojciech Kozyra find: 'libraryName "libhermes"', 74*f194f574SWojciech Kozyra replaceWith: `libraryName "libhermes_${abiVersion}"`, 75*f194f574SWojciech Kozyra }, 76*f194f574SWojciech Kozyra { 77*f194f574SWojciech Kozyra paths: './ReactAndroid/hermes-engine/build.gradle', 78*f194f574SWojciech Kozyra find: /(prefab {\s+libhermes)/, 79*f194f574SWojciech Kozyra replaceWith: `$1_${abiVersion}`, 80*f194f574SWojciech Kozyra }, 81*f194f574SWojciech Kozyra { 82*f194f574SWojciech Kozyra paths: './ReactAndroid/hermes-engine/build.gradle', 83*f194f574SWojciech Kozyra find: 'targets "libhermes"', 84*f194f574SWojciech Kozyra replaceWith: `targets "libhermes_${abiVersion}"`, 85*f194f574SWojciech Kozyra }, 86*f194f574SWojciech Kozyra ...[...JniLibNames, 'fb', 'fbjni'].map((libName) => ({ 87*f194f574SWojciech Kozyra paths: '*.java', 88*f194f574SWojciech Kozyra find: new RegExp(`SoLoader.loadLibrary\\\("${escapeRegExp(libName)}"\\\)`), 89*f194f574SWojciech Kozyra replaceWith: `SoLoader.loadLibrary("${libName}_${abiVersion}")`, 90*f194f574SWojciech Kozyra })), 91*f194f574SWojciech Kozyra ], 92*f194f574SWojciech Kozyra }; 93*f194f574SWojciech Kozyra} 94*f194f574SWojciech Kozyra 95*f194f574SWojciech Kozyraexport function codegenTransforms(abiVersion: string): FileTransforms { 96*f194f574SWojciech Kozyra return { 97*f194f574SWojciech Kozyra path: [], 98*f194f574SWojciech Kozyra content: [ 99*f194f574SWojciech Kozyra ...packagesToRename.map((pkg: string) => ({ 100*f194f574SWojciech Kozyra paths: ['**/*.{java,h,cpp}'], 101*f194f574SWojciech Kozyra find: new RegExp(`${escapeRegExp(pathFromPkg(pkg))}`, 'g'), 102*f194f574SWojciech Kozyra replaceWith: `${abiVersion}/${pathFromPkg(pkg)}`, 103*f194f574SWojciech Kozyra })), 104*f194f574SWojciech Kozyra ...reactNativeCmakeTransforms(abiVersion), 105*f194f574SWojciech Kozyra ], 106*f194f574SWojciech Kozyra }; 107*f194f574SWojciech Kozyra} 108*f194f574SWojciech Kozyra 109*f194f574SWojciech Kozyrafunction reactNativeCmakeTransforms(abiVersion: string): FileTransform[] { 110*f194f574SWojciech Kozyra const libNames = JniLibNames.map((lib: string): string => 111*f194f574SWojciech Kozyra lib.startsWith('lib') ? lib.slice(3) : lib 112*f194f574SWojciech Kozyra ).filter((lib: string) => !['fbjni'].includes(lib)); 113*f194f574SWojciech Kozyra libNames.push('${HERMES_TARGET_NAME}'); // variable used in hermes-executor CMakeLists.txt 114*f194f574SWojciech Kozyra libNames.push('hermes-engine::libhermes'); 115*f194f574SWojciech Kozyra 116*f194f574SWojciech Kozyra return [ 117*f194f574SWojciech Kozyra ...baseCmakeTransforms(abiVersion, libNames).map((transform: StringTransform) => ({ 118*f194f574SWojciech Kozyra paths: 'CMakeLists.txt', 119*f194f574SWojciech Kozyra ...transform, 120*f194f574SWojciech Kozyra })), 121*f194f574SWojciech Kozyra { 122*f194f574SWojciech Kozyra paths: 'CMakeLists.txt', 123*f194f574SWojciech Kozyra find: 'add_react_android_subdir(build/generated/source/codegen/jni)', 124*f194f574SWojciech Kozyra replaceWith: 'add_react_android_subdir(../codegen/jni)', 125*f194f574SWojciech Kozyra }, 126*f194f574SWojciech Kozyra { 127*f194f574SWojciech Kozyra paths: 'CMakeLists.txt', 128*f194f574SWojciech Kozyra find: /libhermes\.so/g, 129*f194f574SWojciech Kozyra replaceWith: `libhermes_${abiVersion}.so`, 130*f194f574SWojciech Kozyra }, 131*f194f574SWojciech Kozyra ]; 132*f194f574SWojciech Kozyra} 133*f194f574SWojciech Kozyra 134*f194f574SWojciech Kozyraexport function hermesTransforms(abiVersion: string): StringTransform[] { 135*f194f574SWojciech Kozyra return [ 136*f194f574SWojciech Kozyra { 137*f194f574SWojciech Kozyra find: /OUTPUT_NAME hermes/g, 138*f194f574SWojciech Kozyra replaceWith: `OUTPUT_NAME hermes_${abiVersion}`, 139*f194f574SWojciech Kozyra }, 140*f194f574SWojciech Kozyra { 141*f194f574SWojciech Kozyra find: /libhermes/g, 142*f194f574SWojciech Kozyra replaceWith: `libhermes_${abiVersion}`, 143*f194f574SWojciech Kozyra }, 144*f194f574SWojciech Kozyra { 145*f194f574SWojciech Kozyra find: /jsi/g, 146*f194f574SWojciech Kozyra replaceWith: `jsi_${abiVersion}`, 147*f194f574SWojciech Kozyra }, 148*f194f574SWojciech Kozyra ]; 149*f194f574SWojciech Kozyra} 150