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      // Add generated java to sourceSets
22f194f574SWojciech Kozyra      {
23f194f574SWojciech Kozyra        paths: './ReactAndroid/build.gradle',
24f194f574SWojciech Kozyra        find: /(\bsrcDirs = \["src\/main\/java",.+)(\])/,
25f194f574SWojciech Kozyra        replaceWith: `$1, "${path.join(versionedReactNativeRoot, 'codegen')}/java"$2`,
26f194f574SWojciech Kozyra      },
27f194f574SWojciech Kozyra      // Disable codegen plugin
28f194f574SWojciech Kozyra      {
29f194f574SWojciech Kozyra        paths: './ReactAndroid/build.gradle',
30f194f574SWojciech Kozyra        find: /(\bid\("com\.facebook\.react"\)$)/m,
31f194f574SWojciech Kozyra        replaceWith: '// $1',
32f194f574SWojciech Kozyra      },
33f194f574SWojciech Kozyra      {
34f194f574SWojciech Kozyra        paths: './ReactAndroid/build.gradle',
35f194f574SWojciech Kozyra        find: /(^react {[^]+?\n\})/m,
36f194f574SWojciech Kozyra        replaceWith: '/* $1 */',
37f194f574SWojciech Kozyra      },
38f194f574SWojciech Kozyra      {
39f194f574SWojciech Kozyra        paths: './ReactAndroid/build.gradle',
405ff37293SKudo Chien        find: /(\b(preBuild\.)?dependsOn\("generateCodegenArtifactsFromSchema"\))/g,
41f194f574SWojciech Kozyra        replaceWith: '// $1',
42f194f574SWojciech Kozyra      },
43f194f574SWojciech Kozyra      {
44f194f574SWojciech Kozyra        paths: './ReactAndroid/build.gradle',
455ff37293SKudo Chien        find: 'new File(buildDir, "generated/source/codegen/jni/").absolutePath',
465ff37293SKudo Chien        replaceWith: '"../codegen/jni/"',
475ff37293SKudo Chien      },
485ff37293SKudo Chien      {
495ff37293SKudo Chien        paths: './ReactAndroid/build.gradle',
50f194f574SWojciech Kozyra        find: /(externalNativeBuild\s*\{)([\s\S]*?)(\}\s)/g,
51f194f574SWojciech Kozyra        replaceWith: (_, p1, p2, p3) =>
52f194f574SWojciech Kozyra          [
53f194f574SWojciech Kozyra            p1,
54f194f574SWojciech Kozyra            transformString(
55f194f574SWojciech Kozyra              p2,
56f194f574SWojciech Kozyra              JniLibNames.map((lib: string) => ({
57f194f574SWojciech Kozyra                find: new RegExp(`"${escapeRegExp(lib)}"`, 'g'),
58f194f574SWojciech Kozyra                replaceWith: `"${lib}_${abiVersion}"`,
59f194f574SWojciech Kozyra              }))
60f194f574SWojciech Kozyra            ),
61f194f574SWojciech Kozyra            p3,
62f194f574SWojciech Kozyra          ].join(''),
63f194f574SWojciech Kozyra      },
645ff37293SKudo Chien      {
655ff37293SKudo Chien        paths: './ReactAndroid/build.gradle',
665ff37293SKudo Chien        find: /(    prefab\s*\{)([\s\S]*?)(^    \}\s)/gm,
675ff37293SKudo Chien        replaceWith: (_, p1, p2, p3) =>
685ff37293SKudo Chien          [
695ff37293SKudo Chien            p1,
705ff37293SKudo Chien            transformString(
715ff37293SKudo Chien              p2,
725ff37293SKudo Chien              JniLibNames.map((lib: string) => ({
735ff37293SKudo Chien                find: new RegExp(`\\b${escapeRegExp(lib)}\\s+?\\{`, 'g'),
745ff37293SKudo Chien                replaceWith: `${lib}_${abiVersion} {`,
755ff37293SKudo Chien              }))
765ff37293SKudo Chien            ),
775ff37293SKudo Chien            p3,
785ff37293SKudo Chien          ].join(''),
795ff37293SKudo Chien      },
80f194f574SWojciech Kozyra      ...packagesToRename.map((pkg: string) => ({
8171ea6032SKudo Chien        paths: [
8271ea6032SKudo Chien          './ReactCommon/**/*.{java,kt,h,cpp}',
8371ea6032SKudo Chien          './ReactAndroid/src/main/**/*.{java,kt,h,cpp}',
8471ea6032SKudo Chien        ],
85f194f574SWojciech Kozyra        find: new RegExp(`${escapeRegExp(pathFromPkg(pkg))}`, 'g'),
86f194f574SWojciech Kozyra        replaceWith: `${abiVersion}/${pathFromPkg(pkg)}`,
87f194f574SWojciech Kozyra      })),
88f194f574SWojciech Kozyra      ...reactNativeCmakeTransforms(abiVersion),
89f194f574SWojciech Kozyra      {
90f194f574SWojciech Kozyra        paths: './ReactAndroid/hermes-engine/build.gradle',
91f194f574SWojciech Kozyra        find: 'libraryName "libhermes"',
92f194f574SWojciech Kozyra        replaceWith: `libraryName "libhermes_${abiVersion}"`,
93f194f574SWojciech Kozyra      },
94f194f574SWojciech Kozyra      {
95f194f574SWojciech Kozyra        paths: './ReactAndroid/hermes-engine/build.gradle',
96f194f574SWojciech Kozyra        find: /(prefab {\s+libhermes)/,
97f194f574SWojciech Kozyra        replaceWith: `$1_${abiVersion}`,
98f194f574SWojciech Kozyra      },
99f194f574SWojciech Kozyra      {
100f194f574SWojciech Kozyra        paths: './ReactAndroid/hermes-engine/build.gradle',
101f194f574SWojciech Kozyra        find: 'targets "libhermes"',
102f194f574SWojciech Kozyra        replaceWith: `targets "libhermes_${abiVersion}"`,
103f194f574SWojciech Kozyra      },
104f194f574SWojciech Kozyra      ...[...JniLibNames, 'fb', 'fbjni'].map((libName) => ({
10571ea6032SKudo Chien        paths: '*.{java,kt}',
106f194f574SWojciech Kozyra        find: new RegExp(`SoLoader.loadLibrary\\\("${escapeRegExp(libName)}"\\\)`),
107f194f574SWojciech Kozyra        replaceWith: `SoLoader.loadLibrary("${libName}_${abiVersion}")`,
108f194f574SWojciech Kozyra      })),
109a9719cfdSKudo Chien      // add HERMES_ENABLE_DEBUGGER for libhermes-executor-release.so
110a9719cfdSKudo Chien      {
111a9719cfdSKudo Chien        paths: './ReactAndroid/hermes-engine/build.gradle',
112a9719cfdSKudo Chien        find: /-DHERMES_ENABLE_DEBUGGER=False/,
113a9719cfdSKudo Chien        replaceWith: '-DHERMES_ENABLE_DEBUGGER=True',
114a9719cfdSKudo Chien      },
115a9719cfdSKudo Chien      {
1165ff37293SKudo Chien        paths: './ReactAndroid/hermes-engine/build.gradle',
1175ff37293SKudo Chien        find: /\b((configureBuildForHermes|prepareHeadersForPrefab)\.dependsOn\(unzipHermes\))/g,
1185ff37293SKudo Chien        replaceWith: '// $1',
1195ff37293SKudo Chien      },
1205ff37293SKudo Chien      {
121a9719cfdSKudo Chien        paths: './ReactCommon/hermes/executor/CMakeLists.txt',
122a9719cfdSKudo Chien        find: /\bdebug (hermes-inspector_)/g,
123a9719cfdSKudo Chien        replaceWith: '$1',
124a9719cfdSKudo Chien      },
125a9719cfdSKudo Chien      {
126*5064f84bSKudo Chien        paths: [
127*5064f84bSKudo Chien          './ReactCommon/hermes/executor/CMakeLists.txt',
128*5064f84bSKudo Chien          './ReactCommon/hermes/inspector/CMakeLists.txt',
129*5064f84bSKudo Chien        ],
130a9719cfdSKudo Chien        find: /if\(\${CMAKE_BUILD_TYPE} MATCHES Debug\)(\n\s*target_compile_options)/g,
131a9719cfdSKudo Chien        replaceWith: 'if(true)$1',
132a9719cfdSKudo Chien      },
133a9719cfdSKudo Chien      {
1345ff37293SKudo Chien        paths: './ReactAndroid/src/main/jni/react/hermes/reactexecutor/CMakeLists.txt',
135a9719cfdSKudo Chien        find: '$<$<CONFIG:Debug>:-DHERMES_ENABLE_DEBUGGER=1>',
136a9719cfdSKudo Chien        replaceWith: '-DHERMES_ENABLE_DEBUGGER=1',
137a9719cfdSKudo Chien      },
1385ff37293SKudo Chien      {
1395ff37293SKudo Chien        // workaround build dependency issue to explicitly link hermes_executor_common to hermes_executor
1405ff37293SKudo Chien        // originally, it's hermes_inspector -> hermes_executor_common -> hermes_executor
1415ff37293SKudo Chien        paths: './ReactAndroid/src/main/jni/react/hermes/reactexecutor/CMakeLists.txt',
1425ff37293SKudo Chien        find: /^(\s+hermes_executor_common.*)$/m,
1435ff37293SKudo Chien        replaceWith: `$1\n        hermes_inspector_${abiVersion}`,
1445ff37293SKudo Chien      },
145f194f574SWojciech Kozyra    ],
146f194f574SWojciech Kozyra  };
147f194f574SWojciech Kozyra}
148f194f574SWojciech Kozyra
149f194f574SWojciech Kozyraexport function codegenTransforms(abiVersion: string): FileTransforms {
150f194f574SWojciech Kozyra  return {
151f194f574SWojciech Kozyra    path: [],
152f194f574SWojciech Kozyra    content: [
153f194f574SWojciech Kozyra      ...packagesToRename.map((pkg: string) => ({
15471ea6032SKudo Chien        paths: ['**/*.{java,kt,h,cpp}'],
155f194f574SWojciech Kozyra        find: new RegExp(`${escapeRegExp(pathFromPkg(pkg))}`, 'g'),
156f194f574SWojciech Kozyra        replaceWith: `${abiVersion}/${pathFromPkg(pkg)}`,
157f194f574SWojciech Kozyra      })),
158f194f574SWojciech Kozyra      ...reactNativeCmakeTransforms(abiVersion),
159f194f574SWojciech Kozyra    ],
160f194f574SWojciech Kozyra  };
161f194f574SWojciech Kozyra}
162f194f574SWojciech Kozyra
163f194f574SWojciech Kozyrafunction reactNativeCmakeTransforms(abiVersion: string): FileTransform[] {
164f194f574SWojciech Kozyra  const libNames = JniLibNames.map((lib: string): string =>
165f194f574SWojciech Kozyra    lib.startsWith('lib') ? lib.slice(3) : lib
166f194f574SWojciech Kozyra  ).filter((lib: string) => !['fbjni'].includes(lib));
167f194f574SWojciech Kozyra  libNames.push('${HERMES_TARGET_NAME}'); // variable used in hermes-executor CMakeLists.txt
168f194f574SWojciech Kozyra  libNames.push('hermes-engine::libhermes');
169f194f574SWojciech Kozyra
170f194f574SWojciech Kozyra  return [
171f194f574SWojciech Kozyra    ...baseCmakeTransforms(abiVersion, libNames).map((transform: StringTransform) => ({
172f194f574SWojciech Kozyra      paths: 'CMakeLists.txt',
173f194f574SWojciech Kozyra      ...transform,
174f194f574SWojciech Kozyra    })),
175f194f574SWojciech Kozyra    {
176f194f574SWojciech Kozyra      paths: 'CMakeLists.txt',
1776239b2d0SKudo Chien      find: 'add_react_build_subdir(generated/source/codegen/jni)',
178f194f574SWojciech Kozyra      replaceWith: 'add_react_android_subdir(../codegen/jni)',
179f194f574SWojciech Kozyra    },
180f194f574SWojciech Kozyra    {
181f194f574SWojciech Kozyra      paths: 'CMakeLists.txt',
182f194f574SWojciech Kozyra      find: /libhermes\.so/g,
183f194f574SWojciech Kozyra      replaceWith: `libhermes_${abiVersion}.so`,
184f194f574SWojciech Kozyra    },
185f194f574SWojciech Kozyra  ];
186f194f574SWojciech Kozyra}
187f194f574SWojciech Kozyra
188f194f574SWojciech Kozyraexport function hermesTransforms(abiVersion: string): StringTransform[] {
189f194f574SWojciech Kozyra  return [
190f194f574SWojciech Kozyra    {
191f194f574SWojciech Kozyra      find: /OUTPUT_NAME hermes/g,
192f194f574SWojciech Kozyra      replaceWith: `OUTPUT_NAME hermes_${abiVersion}`,
193f194f574SWojciech Kozyra    },
194f194f574SWojciech Kozyra    {
195f194f574SWojciech Kozyra      find: /libhermes/g,
196f194f574SWojciech Kozyra      replaceWith: `libhermes_${abiVersion}`,
197f194f574SWojciech Kozyra    },
198f194f574SWojciech Kozyra    {
199f194f574SWojciech Kozyra      find: /jsi/g,
200f194f574SWojciech Kozyra      replaceWith: `jsi_${abiVersion}`,
201f194f574SWojciech Kozyra    },
202f194f574SWojciech Kozyra  ];
203f194f574SWojciech Kozyra}
204