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      })),
91*a9719cfdSKudo Chien      // add HERMES_ENABLE_DEBUGGER for libhermes-executor-release.so
92*a9719cfdSKudo Chien      {
93*a9719cfdSKudo Chien        paths: './ReactAndroid/hermes-engine/build.gradle',
94*a9719cfdSKudo Chien        find: /-DHERMES_ENABLE_DEBUGGER=False/,
95*a9719cfdSKudo Chien        replaceWith: '-DHERMES_ENABLE_DEBUGGER=True',
96*a9719cfdSKudo Chien      },
97*a9719cfdSKudo Chien      {
98*a9719cfdSKudo Chien        paths: './ReactCommon/hermes/executor/CMakeLists.txt',
99*a9719cfdSKudo Chien        find: /\bdebug (hermes-inspector_)/g,
100*a9719cfdSKudo Chien        replaceWith: '$1',
101*a9719cfdSKudo Chien      },
102*a9719cfdSKudo Chien      {
103*a9719cfdSKudo Chien        paths: './ReactCommon/hermes/executor/CMakeLists.txt',
104*a9719cfdSKudo Chien        find: /if\(\${CMAKE_BUILD_TYPE} MATCHES Debug\)(\n\s*target_compile_options)/g,
105*a9719cfdSKudo Chien        replaceWith: 'if(true)$1',
106*a9719cfdSKudo Chien      },
107*a9719cfdSKudo Chien      {
108*a9719cfdSKudo Chien        paths: [
109*a9719cfdSKudo Chien          './ReactAndroid/src/main/java/com/facebook/hermes/reactexecutor/CMakeLists.txt', // remove this when we drop sdk 45 for sdk 48
110*a9719cfdSKudo Chien          './ReactAndroid/src/main/jni/react/hermes/reactexecutor/CMakeLists.txt',
111*a9719cfdSKudo Chien        ],
112*a9719cfdSKudo Chien        find: '$<$<CONFIG:Debug>:-DHERMES_ENABLE_DEBUGGER=1>',
113*a9719cfdSKudo Chien        replaceWith: '-DHERMES_ENABLE_DEBUGGER=1',
114*a9719cfdSKudo Chien      },
115f194f574SWojciech Kozyra    ],
116f194f574SWojciech Kozyra  };
117f194f574SWojciech Kozyra}
118f194f574SWojciech Kozyra
119f194f574SWojciech Kozyraexport function codegenTransforms(abiVersion: string): FileTransforms {
120f194f574SWojciech Kozyra  return {
121f194f574SWojciech Kozyra    path: [],
122f194f574SWojciech Kozyra    content: [
123f194f574SWojciech Kozyra      ...packagesToRename.map((pkg: string) => ({
124f194f574SWojciech Kozyra        paths: ['**/*.{java,h,cpp}'],
125f194f574SWojciech Kozyra        find: new RegExp(`${escapeRegExp(pathFromPkg(pkg))}`, 'g'),
126f194f574SWojciech Kozyra        replaceWith: `${abiVersion}/${pathFromPkg(pkg)}`,
127f194f574SWojciech Kozyra      })),
128f194f574SWojciech Kozyra      ...reactNativeCmakeTransforms(abiVersion),
129f194f574SWojciech Kozyra    ],
130f194f574SWojciech Kozyra  };
131f194f574SWojciech Kozyra}
132f194f574SWojciech Kozyra
133f194f574SWojciech Kozyrafunction reactNativeCmakeTransforms(abiVersion: string): FileTransform[] {
134f194f574SWojciech Kozyra  const libNames = JniLibNames.map((lib: string): string =>
135f194f574SWojciech Kozyra    lib.startsWith('lib') ? lib.slice(3) : lib
136f194f574SWojciech Kozyra  ).filter((lib: string) => !['fbjni'].includes(lib));
137f194f574SWojciech Kozyra  libNames.push('${HERMES_TARGET_NAME}'); // variable used in hermes-executor CMakeLists.txt
138f194f574SWojciech Kozyra  libNames.push('hermes-engine::libhermes');
139f194f574SWojciech Kozyra
140f194f574SWojciech Kozyra  return [
141f194f574SWojciech Kozyra    ...baseCmakeTransforms(abiVersion, libNames).map((transform: StringTransform) => ({
142f194f574SWojciech Kozyra      paths: 'CMakeLists.txt',
143f194f574SWojciech Kozyra      ...transform,
144f194f574SWojciech Kozyra    })),
145f194f574SWojciech Kozyra    {
146f194f574SWojciech Kozyra      paths: 'CMakeLists.txt',
1476239b2d0SKudo Chien      find: 'add_react_build_subdir(generated/source/codegen/jni)',
148f194f574SWojciech Kozyra      replaceWith: 'add_react_android_subdir(../codegen/jni)',
149f194f574SWojciech Kozyra    },
150f194f574SWojciech Kozyra    {
151f194f574SWojciech Kozyra      paths: 'CMakeLists.txt',
152f194f574SWojciech Kozyra      find: /libhermes\.so/g,
153f194f574SWojciech Kozyra      replaceWith: `libhermes_${abiVersion}.so`,
154f194f574SWojciech Kozyra    },
155f194f574SWojciech Kozyra  ];
156f194f574SWojciech Kozyra}
157f194f574SWojciech Kozyra
158f194f574SWojciech Kozyraexport function hermesTransforms(abiVersion: string): StringTransform[] {
159f194f574SWojciech Kozyra  return [
160f194f574SWojciech Kozyra    {
161f194f574SWojciech Kozyra      find: /OUTPUT_NAME hermes/g,
162f194f574SWojciech Kozyra      replaceWith: `OUTPUT_NAME hermes_${abiVersion}`,
163f194f574SWojciech Kozyra    },
164f194f574SWojciech Kozyra    {
165f194f574SWojciech Kozyra      find: /libhermes/g,
166f194f574SWojciech Kozyra      replaceWith: `libhermes_${abiVersion}`,
167f194f574SWojciech Kozyra    },
168f194f574SWojciech Kozyra    {
169f194f574SWojciech Kozyra      find: /jsi/g,
170f194f574SWojciech Kozyra      replaceWith: `jsi_${abiVersion}`,
171f194f574SWojciech Kozyra    },
172f194f574SWojciech Kozyra  ];
173f194f574SWojciech Kozyra}
174