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