1import escapeRegExp from 'lodash/escapeRegExp';
2
3import { FileTransforms } from '../../Transforms.types';
4import { packagesToKeep, packagesToRename } from './packagesConfig';
5import { deleteLinesBetweenTags } from './utils';
6
7function expoModulesBaseTransforms(abiVersion: string): FileTransforms {
8  return {
9    path: [
10      {
11        find: 'src/main/java',
12        replaceWith: `src/main/java/${abiVersion}`,
13      },
14      {
15        find: 'src/main/kotlin',
16        replaceWith: `src/main/java/${abiVersion}`,
17      },
18      {
19        find: 'src/main/AndroidManifest.xml',
20        replaceWith: 'src/main/TemporaryExpoModuleAndroidManifest.xml',
21      },
22    ],
23    content: [
24      ...packagesToKeep.map((pkg: string) => ({
25        paths: ['./src/main/{java,kotlin}/**/*.{java,kt}', './src/main/AndroidManifest.xml'],
26        find: new RegExp(`([, ^(<])${escapeRegExp(pkg)}`, 'g'),
27        replaceWith: `$1temporarydonotversion.${pkg}`,
28      })),
29      ...packagesToRename.map((pkg: string) => ({
30        paths: ['./src/main/{java,kotlin}/**/*.{java,kt}', './src/main/AndroidManifest.xml'],
31        find: new RegExp(`([, ^(<])${escapeRegExp(pkg)}`, 'g'),
32        replaceWith: `$1${abiVersion}.${pkg}`,
33      })),
34      {
35        paths: ['./src/main/{java,kotlin}/**/*.{java,kt}', './src/main/AndroidManifest.xml'],
36        find: /temporarydonotversion\./g,
37        replaceWith: '',
38      },
39      {
40        paths: './src/main/{java,kotlin}/**/*.java',
41        find: /\/\/ *EXPO_VERSIONING_NEEDS_EXPOVIEW_R/g,
42        replaceWith: `import ${abiVersion}.host.exp.expoview.R;`,
43      },
44      {
45        paths: './src/main/{java,kotlin}/**/*.kt',
46        find: /\/\/ *EXPO_VERSIONING_NEEDS_EXPOVIEW_R/g,
47        replaceWith: `import ${abiVersion}.host.exp.expoview.R`,
48      },
49    ],
50  };
51}
52
53export function expoModulesTransforms(module: string, abiVersion: string): FileTransforms {
54  const base = expoModulesBaseTransforms(abiVersion);
55  const moduleTransforms: Record<string, FileTransforms> = {
56    'expo-modules-core': {
57      content: [
58        {
59          // We don't have dedicated gradle files for versioned expo-modules.
60          // For the BuildConfig, replace with unversioned expoview BuildConfig.
61          paths: './**/*.{java,kt}',
62          find: new RegExp(`\\bimport ${abiVersion}\\.expo\\.modules\\.BuildConfig`, 'g'),
63          replaceWith: 'import host.exp.expoview.BuildConfig',
64        },
65      ],
66    },
67    'expo-updates': {
68      content: [
69        {
70          paths: './src/main/{java,kotlin}/expo/modules/updates/UpdatesPackage.kt',
71          transform: (text: string) =>
72            deleteLinesBetweenTags(
73              /WHEN_VERSIONING_REMOVE_FROM_HERE/,
74              /WHEN_VERSIONING_REMOVE_TO_HERE/,
75              text
76            ),
77        },
78        {
79          paths: './src/main/{java,kotlin}/expo/modules/updates/UpdatesPackage.kt',
80          find: 'BuildConfig.EX_UPDATES_NATIVE_DEBUG',
81          replaceWith: 'false',
82        },
83      ],
84    },
85  };
86  const transforms: FileTransforms = moduleTransforms[module] ?? {};
87
88  return {
89    path: [...(base.path ?? []), ...(transforms.path ?? [])],
90    content: [...(base.content ?? []), ...(transforms.content ?? [])],
91  };
92}
93