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