1import chalk from 'chalk';
2
3import logger from '../Logger';
4import { getAndroidProjectReports, Revision } from './androidProjectReports';
5import { promptForNativeDependenciesUpdates, promptForAndroidProjectsSelection } from './prompts';
6import { AndroidProjectReport, GradleDependency } from './types';
7import { addChangelogEntries } from './updateChangelogFiles';
8import { updateGradleDependencies } from './updateGradleFiles';
9import { addColorBasedOnSemverDiff, calculateSemverDiff, getChangelogLink } from './utils';
10
11async function printAvailableUpdates(reports: AndroidProjectReport[]) {
12  const printDependency = (dependency: GradleDependency) => {
13    logger.log(
14      `    ▶︎ ${dependency.fullName}:${dependency.currentVersion} ➡️  ${addColorBasedOnSemverDiff(
15        dependency.availableVersion,
16        calculateSemverDiff(dependency.currentVersion, dependency.availableVersion)
17      )} ${getChangelogLink(dependency.fullName, dependency.projectUrl)}`
18    );
19  };
20
21  for (const {
22    projectName,
23    gradleReport: { exceeded, unresolved, outdated },
24  } of reports) {
25    const unresolvedExceededDependencies = [...unresolved, ...exceeded];
26    const noDependenciesIssues = unresolvedExceededDependencies.length + outdated.length === 0;
27
28    logger.log(
29      `\n● Project: ${chalk.blue(projectName)}${
30        noDependenciesIssues ? chalk.green(` - no dependencies issues ✅`) : ''
31      }`
32    );
33
34    if (outdated.length > 0) {
35      logger.log(chalk.cyan('  ◼︎ outdated dependencies:'));
36      outdated.forEach(printDependency);
37    }
38
39    if (unresolvedExceededDependencies.length > 0) {
40      logger.log(chalk.yellow('  ◼︎ unresolved/exceeded dependencies:'));
41      unresolvedExceededDependencies.forEach(printDependency);
42    }
43  }
44}
45
46export interface Options {
47  revision: Revision;
48  list: boolean;
49  clearCache: boolean;
50  platform: string;
51}
52
53export default async function androidUpdateNativeDependencies(options: Options) {
54  const reports = await getAndroidProjectReports(options);
55  if (options.list) {
56    return await printAvailableUpdates(reports);
57  }
58  const selectedReports = await promptForAndroidProjectsSelection(reports);
59  const selectedDependenciesUpdates = await promptForNativeDependenciesUpdates(selectedReports);
60  await updateGradleDependencies(selectedDependenciesUpdates);
61  await addChangelogEntries(selectedDependenciesUpdates);
62}
63