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