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:
parent
0345c1bc1d
commit
e1ff4c47b9
@ -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",
|
||||
|
||||
@ -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)
|
||||
.filter(t => t.startsWith(env))
|
||||
// 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, "");
|
||||
})
|
||||
// version must be label from the unreleasedLabels (like tp) or number.
|
||||
.filter(
|
||||
version =>
|
||||
unreleasedLabelForEnv === version || !isNaN(parseFloat(version))
|
||||
)
|
||||
.shift()
|
||||
);
|
||||
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
|
||||
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.version ||
|
||||
!isNaN(parseFloat(version.version))
|
||||
)
|
||||
// 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,15 +242,16 @@ const getLowestImplementedVersion = ({ features }, env) => {
|
||||
return null;
|
||||
}
|
||||
|
||||
return envTests
|
||||
.map(str => str.replace(env, ""))
|
||||
.reduce((a, b) => {
|
||||
if (a === unreleasedLabelForEnv || b === unreleasedLabelForEnv) {
|
||||
return 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;
|
||||
});
|
||||
};
|
||||
|
||||
const generateData = (environments, features) => {
|
||||
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user