1import chalk from 'chalk';
2import fs from 'fs-extra';
3import path from 'path';
4
5import { EXPO_DIR } from '../../Constants';
6import logger from '../../Logger';
7import { Task } from '../../TasksRunner';
8import { transformFileAsync } from '../../Transforms';
9import { Parcel, TaskArgs } from '../types';
10import { selectPackagesToPublish } from './selectPackagesToPublish';
11
12const { yellow, magenta } = chalk;
13
14/**
15 * Updates version props in packages containing Android's native code.
16 */
17export const updateAndroidProjects = new Task<TaskArgs>(
18  {
19    name: 'updateAndroidProjects',
20    dependsOn: [selectPackagesToPublish],
21    filesToStage: ['packages/**/android/build.gradle'],
22  },
23  async (parcels: Parcel[]) => {
24    logger.info('\n�� Updating Android projects...');
25
26    for (const { pkg, state } of parcels) {
27      const gradlePath = path.join(pkg.path, 'android/build.gradle');
28
29      // Some packages don't have android code.
30      if (!(await fs.pathExists(gradlePath))) {
31        continue;
32      }
33
34      // skip updating versions in the template project
35      if (pkg.packageName === 'expo-module-template') {
36        continue;
37      }
38
39      const relativeGradlePath = path.relative(EXPO_DIR, gradlePath);
40
41      logger.log('  ', `Updating ${yellow('version')} in ${magenta(relativeGradlePath)}`);
42
43      await transformFileAsync(gradlePath, [
44        {
45          // update version and versionName in android/build.gradle
46          find: /\b(version\s*=\s*|versionName\s+)(['"])(.*?)\2/g,
47          replaceWith: `$1$2${state.releaseVersion}$2`,
48        },
49      ]);
50    }
51  }
52);
53