1import chalk from 'chalk';
2import semver from 'semver';
3import terminalLink from 'terminal-link';
4
5import { EXPOTOOLS_DIR } from '../Constants';
6import dependenciesChangelogs from '../data/androidDependenciesChangelogs.json';
7
8export function getChangelogLink(dependency: string, fallbackLink: string | null) {
9  const link = dependenciesChangelogs[dependency] ?? fallbackLink;
10  return chalk.italic.dim(
11    (link && terminalLink('CHANGELOG', link)) ??
12      chalk.whiteBright(
13        `Hey developer! Add CHANGELOG URL address for this dependency in ${terminalLink(
14          'dependenciesChangelogs.json',
15          `file://${EXPOTOOLS_DIR}/src/android-update-native-dependencies/dependenciesChangelogs.json`
16        )}!`
17      )
18  );
19}
20
21export function calculateSemverDiff(from: string, to: string | null): SemverDiff {
22  if (!to) {
23    return null;
24  }
25  try {
26    const semverDiff = semver.diff(from, to);
27    return semverDiff;
28  } catch {
29    return null;
30  }
31}
32
33export type SemverDiff =
34  | 'major'
35  | 'premajor'
36  | 'minor'
37  | 'preminor'
38  | 'patch'
39  | 'prepatch'
40  | 'prerelease'
41  | null;
42
43export function addColorBasedOnSemverDiff(version: string | null, semverDiff: SemverDiff) {
44  let colorEffect: 'green' | 'yellow' | 'red' | 'reset' | 'bgRedBright' = 'bgRedBright';
45  if (semverDiff) {
46    if (['patch', 'prepatch'].includes(semverDiff)) {
47      colorEffect = 'green';
48    } else if (['minor', 'preminor'].includes(semverDiff)) {
49      colorEffect = 'yellow';
50    } else if (['major', 'premajor'].includes(semverDiff)) {
51      colorEffect = 'red';
52    }
53  }
54
55  return chalk.reset.bold[colorEffect](version ?? '<unknown>');
56}
57