/
utils.ts
84 lines (73 loc) 路 2.13 KB
/
utils.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
import semver from "semver";
import { OptionValidator } from "@babel/helper-validator-option";
import { unreleasedLabels } from "./targets";
import type { Target, Targets } from "./types";
declare const PACKAGE_JSON: { name: string; version: string };
const versionRegExp = /^(\d+|\d+.\d+)$/;
const v = new OptionValidator(PACKAGE_JSON.name);
export function semverMin(
first: string | undefined | null,
second: string,
): string {
return first && semver.lt(first, second) ? first : second;
}
// Convert version to a semver value.
// 2.5 -> 2.5.0; 1 -> 1.0.0;
export function semverify(version: number | string): string {
if (typeof version === "string" && semver.valid(version)) {
return version;
}
v.invariant(
typeof version === "number" ||
(typeof version === "string" && versionRegExp.test(version)),
`'${version}' is not a valid version`,
);
const split = version.toString().split(".");
while (split.length < 3) {
split.push("0");
}
return split.join(".");
}
export function isUnreleasedVersion(
version: string | number,
env: Target,
): boolean {
const unreleasedLabel =
// @ts-expect-error unreleasedLabel will be guarded later
unreleasedLabels[env];
return (
!!unreleasedLabel && unreleasedLabel === version.toString().toLowerCase()
);
}
export function getLowestUnreleased(a: string, b: string, env: Target): string {
const unreleasedLabel:
| typeof unreleasedLabels[keyof typeof unreleasedLabels]
| undefined =
// @ts-ignore unreleasedLabel is undefined when env is not safari
unreleasedLabels[env];
if (a === unreleasedLabel) {
return b;
}
if (b === unreleasedLabel) {
return a;
}
return semverMin(a, b);
}
export function getHighestUnreleased(
a: string,
b: string,
env: Target,
): string {
return getLowestUnreleased(a, b, env) === a ? b : a;
}
export function getLowestImplementedVersion(
plugin: Targets,
environment: Target,
): string {
const result = plugin[environment];
// When Android support data is absent, use Chrome data as fallback
if (!result && environment === "android") {
return plugin.chrome;
}
return result;
}