preset-env: Sort versions before determining lowest (#9595)

Likely because of implicit `equals` (ie, Safari 12 support implies iOS Safari 12), the versions in the `res` hash are not always sorted in version order.

Doing a semver sort reveals some builtins have actually been supported a little longer than we thought!
This commit is contained in:
Justin Ridgewell 2019-02-26 14:11:49 -05:00 committed by Daniel Tschinder
parent 0345c1bc1d
commit e1ff4c47b9
2 changed files with 59 additions and 45 deletions

View File

@ -284,7 +284,7 @@
"edge": "12",
"firefox": "2",
"safari": "3.1",
"node": "0.12",
"node": "0.10",
"ie": "10",
"android": "4",
"ios": "6",
@ -300,7 +300,7 @@
"node": "0.10",
"ie": "9",
"android": "4",
"ios": "7",
"ios": "6",
"phantom": "2",
"electron": "5"
},
@ -320,7 +320,7 @@
"edge": "12",
"firefox": "2",
"safari": "4",
"node": "0.12",
"node": "0.10",
"android": "4",
"ios": "6",
"phantom": "2",
@ -1091,7 +1091,7 @@
"edge": "12",
"firefox": "17",
"safari": "6",
"node": "0.12",
"node": "0.10",
"android": "4",
"ios": "7",
"phantom": "2",
@ -1102,7 +1102,7 @@
"edge": "12",
"firefox": "17",
"safari": "6",
"node": "0.12",
"node": "0.10",
"android": "4",
"ios": "7",
"phantom": "2",
@ -1113,7 +1113,7 @@
"edge": "12",
"firefox": "17",
"safari": "6",
"node": "0.12",
"node": "0.10",
"android": "4",
"ios": "7",
"phantom": "2",
@ -1124,7 +1124,7 @@
"edge": "12",
"firefox": "17",
"safari": "6",
"node": "0.12",
"node": "0.10",
"android": "4",
"ios": "7",
"phantom": "2",
@ -1155,7 +1155,7 @@
"edge": "12",
"firefox": "17",
"safari": "6",
"node": "0.12",
"node": "0.10",
"android": "4",
"ios": "7",
"phantom": "2",
@ -1166,7 +1166,7 @@
"edge": "12",
"firefox": "17",
"safari": "6",
"node": "0.12",
"node": "0.10",
"android": "4",
"ios": "7",
"phantom": "2",
@ -1177,7 +1177,7 @@
"edge": "12",
"firefox": "17",
"safari": "6",
"node": "0.12",
"node": "0.10",
"android": "4",
"ios": "7",
"phantom": "2",
@ -1208,7 +1208,7 @@
"edge": "12",
"firefox": "17",
"safari": "6",
"node": "0.12",
"node": "0.10",
"android": "4",
"ios": "7",
"phantom": "2",
@ -1229,7 +1229,7 @@
"edge": "12",
"firefox": "17",
"safari": "6",
"node": "0.12",
"node": "0.10",
"android": "4",
"ios": "7",
"phantom": "2",
@ -1280,7 +1280,7 @@
"edge": "12",
"firefox": "17",
"safari": "6",
"node": "0.12",
"node": "0.10",
"android": "4",
"ios": "7",
"phantom": "2",
@ -1301,7 +1301,7 @@
"edge": "12",
"firefox": "17",
"safari": "6",
"node": "0.12",
"node": "0.10",
"android": "4",
"ios": "7",
"phantom": "2",
@ -1312,7 +1312,7 @@
"edge": "12",
"firefox": "17",
"safari": "6",
"node": "0.12",
"node": "0.10",
"android": "4",
"ios": "7",
"phantom": "2",
@ -1323,7 +1323,7 @@
"edge": "12",
"firefox": "17",
"safari": "6",
"node": "0.12",
"node": "0.10",
"android": "4",
"ios": "7",
"phantom": "2",
@ -1358,7 +1358,7 @@
"edge": "12",
"firefox": "15",
"safari": "5.1",
"node": "0.12",
"node": "0.10",
"ie": "10",
"android": "4",
"ios": "6",

View File

@ -193,27 +193,40 @@ const getLowestImplementedVersion = ({ features }, env) => {
//
// NOTE: when/if compat-table adds a babel7 key, we'll want to update this
if (!test.babel6corejs2 && isBuiltIn) {
return "-1";
return {
version: "0.0.0",
semver: "0.0.0",
implements: true,
};
}
return (
Object.keys(test)
const reportedVersions = Object.keys(test)
.filter(t => t.startsWith(env))
.map(t => {
const version = t.replace("_", ".").replace(env, "");
return {
version,
semver: semver.coerce(version) || version,
// Babel assumes strict mode
.filter(
test => tests[i].res[test] === true || tests[i].res[test] === "strict"
)
// normalize some keys and get version from full string.
.map(test => {
return test.replace("_", ".").replace(env, "");
implements: tests[i].res[t] === true || tests[i].res[t] === "strict",
};
})
// version must be label from the unreleasedLabels (like tp) or number.
.filter(
version =>
unreleasedLabelForEnv === version || !isNaN(parseFloat(version))
unreleasedLabelForEnv === version.version ||
!isNaN(parseFloat(version.version))
)
.shift()
);
// Sort in asc order, with unreleasedLabelForEnv coming last.
.sort(({ semver: av }, { semver: bv }) => {
if (av === unreleasedLabelForEnv) return 1;
if (bv === unreleasedLabelForEnv) return -1;
if (semver.gt(av, bv)) return 1;
if (semver.gt(bv, av)) return -1;
return 0;
});
return reportedVersions.find(version => version.implements);
});
const envFiltered = envTests.filter(t => t);
@ -229,14 +242,15 @@ const getLowestImplementedVersion = ({ features }, env) => {
return null;
}
return envTests
.map(str => str.replace(env, ""))
.reduce((a, b) => {
if (a === unreleasedLabelForEnv || b === unreleasedLabelForEnv) {
return envFiltered.reduce((a, b) => {
if (
a.semver === unreleasedLabelForEnv ||
b.semver === unreleasedLabelForEnv
) {
return unreleasedLabelForEnv;
}
return semver.lt(semver.coerce(a), semver.coerce(b)) ? b : a;
return semver.lt(a.semver, b.semver) ? b : a;
});
};
@ -254,7 +268,7 @@ const generateData = (environments, features) => {
const version = getLowestImplementedVersion(options, env);
if (version !== null) {
const versionString = version.toString();
const versionString = version.version;
// NOTE(bng): A number of environments in compat-table changed to
// include a trailing zero (node10 -> node10_0), so for now stripping