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