1978fc17bSKudo Chienimport spawnAsync from '@expo/spawn-async'; 2978fc17bSKudo Chienimport fs from 'fs-extra'; 3978fc17bSKudo Chienimport path from 'path'; 4978fc17bSKudo Chien 56239b2d0SKudo Chienimport { runReactNativeCodegenAsync } from '../../Codegen'; 6*71ea6032SKudo Chienimport { REACT_NATIVE_SUBMODULE_DIR, REACT_NATIVE_SUBMODULE_MONOREPO_ROOT } from '../../Constants'; 7f194f574SWojciech Kozyraimport { copyFileWithTransformsAsync, transformFileAsync } from '../../Transforms'; 8f194f574SWojciech Kozyraimport { searchFilesAsync } from '../../Utils'; 9f194f574SWojciech Kozyraimport { 10f194f574SWojciech Kozyra codegenTransforms, 11f194f574SWojciech Kozyra hermesTransforms, 12f194f574SWojciech Kozyra reactNativeTransforms, 13f194f574SWojciech Kozyra} from './reactNativeTransforms'; 14978fc17bSKudo Chien 15978fc17bSKudo Chienexport async function updateVersionedReactNativeAsync( 1627eae4ddSKudo Chien androidDir: string, 17f194f574SWojciech Kozyra sdkVersion: string 18978fc17bSKudo Chien): Promise<void> { 19f194f574SWojciech Kozyra const abiVersion = `abi${sdkVersion.replace(/\./g, '_')}`; 20*71ea6032SKudo Chien const versionedReactNativeMonorepoRoot = path.join(androidDir, 'versioned-react-native'); 21*71ea6032SKudo Chien const versionedReactNativeRoot = path.join( 22*71ea6032SKudo Chien versionedReactNativeMonorepoRoot, 23*71ea6032SKudo Chien 'packages/react-native' 24*71ea6032SKudo Chien ); 25*71ea6032SKudo Chien await Promise.all([fs.remove(path.join(versionedReactNativeMonorepoRoot, 'packages'))]); 26f194f574SWojciech Kozyra 27*71ea6032SKudo Chien await fs.mkdirp(path.join(versionedReactNativeRoot, 'sdks')); 28f194f574SWojciech Kozyra await fs.copy( 296239b2d0SKudo Chien path.join(REACT_NATIVE_SUBMODULE_DIR, 'sdks/.hermesversion'), 30*71ea6032SKudo Chien path.join(versionedReactNativeRoot, 'sdks/.hermesversion') 31f194f574SWojciech Kozyra ); 32f194f574SWojciech Kozyra 33f194f574SWojciech Kozyra // Run and version codegen 34*71ea6032SKudo Chien const codegenOutputRoot = path.join(versionedReactNativeRoot, 'codegen'); 35*71ea6032SKudo Chien const tmpCodegenOutputRoot = path.join(versionedReactNativeMonorepoRoot, 'codegen-tmp'); 36f194f574SWojciech Kozyra try { 376239b2d0SKudo Chien await runReactNativeCodegenAsync({ 386239b2d0SKudo Chien reactNativeRoot: REACT_NATIVE_SUBMODULE_DIR, 39*71ea6032SKudo Chien codegenPkgRoot: path.join( 40*71ea6032SKudo Chien REACT_NATIVE_SUBMODULE_MONOREPO_ROOT, 41*71ea6032SKudo Chien 'packages', 42*71ea6032SKudo Chien 'react-native-codegen' 43*71ea6032SKudo Chien ), 446239b2d0SKudo Chien outputDir: tmpCodegenOutputRoot, 456239b2d0SKudo Chien name: 'rncore', 466239b2d0SKudo Chien platform: 'android', 476239b2d0SKudo Chien type: 'all', 486239b2d0SKudo Chien jsSrcsDir: path.join(REACT_NATIVE_SUBMODULE_DIR, 'Libraries'), 496239b2d0SKudo Chien javaPackageName: 'com.facebook.fbreact.specs', 506239b2d0SKudo Chien }); 51f194f574SWojciech Kozyra await versionCodegenDirectoryAsync(tmpCodegenOutputRoot, codegenOutputRoot, abiVersion); 52f194f574SWojciech Kozyra } finally { 53f194f574SWojciech Kozyra await fs.remove(tmpCodegenOutputRoot); 54f194f574SWojciech Kozyra } 55f194f574SWojciech Kozyra 56f194f574SWojciech Kozyra // Copy and version ReactAndroid and ReactCommon 57*71ea6032SKudo Chien await versionReactNativeAsync(versionedReactNativeRoot, abiVersion); 58f194f574SWojciech Kozyra 59*71ea6032SKudo Chien await versionHermesAsync(versionedReactNativeMonorepoRoot, abiVersion); 60f194f574SWojciech Kozyra} 61f194f574SWojciech Kozyra 62*71ea6032SKudo Chienasync function versionHermesAsync(versionedReactNativeMonorepoRoot: string, abiVersion: string) { 63*71ea6032SKudo Chien await spawnAsync('./gradlew', [':packages:react-native:ReactAndroid:hermes-engine:unzipHermes'], { 64f194f574SWojciech Kozyra shell: true, 65*71ea6032SKudo Chien cwd: versionedReactNativeMonorepoRoot, 66f194f574SWojciech Kozyra stdio: 'inherit', 67f194f574SWojciech Kozyra }); 68f194f574SWojciech Kozyra await transformFileAsync( 69*71ea6032SKudo Chien path.join( 70*71ea6032SKudo Chien versionedReactNativeMonorepoRoot, 71*71ea6032SKudo Chien 'packages/react-native', 72*71ea6032SKudo Chien 'sdks/hermes/API/hermes/CMakeLists.txt' 73*71ea6032SKudo Chien ), 74f194f574SWojciech Kozyra hermesTransforms(abiVersion) 75f194f574SWojciech Kozyra ); 76f194f574SWojciech Kozyra} 77f194f574SWojciech Kozyra 78*71ea6032SKudo Chienasync function versionReactNativeAsync(versionedReactNativeRoot: string, abiVersion: string) { 796239b2d0SKudo Chien const files = await searchFilesAsync(REACT_NATIVE_SUBMODULE_DIR, [ 806239b2d0SKudo Chien './ReactAndroid/**', 816239b2d0SKudo Chien './ReactCommon/**', 826239b2d0SKudo Chien ]); 83f194f574SWojciech Kozyra for (const file of files) { 84f194f574SWojciech Kozyra if ((file.match(/\/build\//) && !file.match(/src.*\/build\//)) || file.match(/\/\.cxx\//)) { 85f194f574SWojciech Kozyra files.delete(file); 86f194f574SWojciech Kozyra } 87f194f574SWojciech Kozyra } 88f194f574SWojciech Kozyra 89*71ea6032SKudo Chien const transforms = reactNativeTransforms(versionedReactNativeRoot, abiVersion); 90f194f574SWojciech Kozyra for (const sourceFile of files) { 91f194f574SWojciech Kozyra await copyFileWithTransformsAsync({ 92f194f574SWojciech Kozyra sourceFile, 93*71ea6032SKudo Chien targetDirectory: versionedReactNativeRoot, 946239b2d0SKudo Chien sourceDirectory: REACT_NATIVE_SUBMODULE_DIR, 95f194f574SWojciech Kozyra transforms, 96f194f574SWojciech Kozyra }); 97f194f574SWojciech Kozyra } 98f194f574SWojciech Kozyra} 99f194f574SWojciech Kozyra 100f194f574SWojciech Kozyraasync function versionCodegenDirectoryAsync( 101f194f574SWojciech Kozyra tmpCodegenDir: string, 102f194f574SWojciech Kozyra codegenDir: string, 103f194f574SWojciech Kozyra abiVersion: string 104f194f574SWojciech Kozyra) { 105f194f574SWojciech Kozyra const files = await searchFilesAsync(tmpCodegenDir, ['**']); 106f194f574SWojciech Kozyra const transforms = codegenTransforms(abiVersion); 107f194f574SWojciech Kozyra for (const sourceFile of files) { 108f194f574SWojciech Kozyra await copyFileWithTransformsAsync({ 109f194f574SWojciech Kozyra sourceFile, 110f194f574SWojciech Kozyra targetDirectory: codegenDir, 111f194f574SWojciech Kozyra sourceDirectory: tmpCodegenDir, 112f194f574SWojciech Kozyra transforms, 113f194f574SWojciech Kozyra }); 114f194f574SWojciech Kozyra } 115978fc17bSKudo Chien} 116