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