preset-env: minimally supporting version (#9596)

* preset-env: minimally supporting version

This changes the "does browser support X" algorithm to "lowest version such that all higher versions support it".

Eg, given `{ chrome70: true, chrome60: false, chrome50: true }`, the lowest version is chrome70, not chrome50.

This is done to remove Tagged Template Literal support from Safari, which introduced a bug in Safari 12 but correctly implemented the feature in Safari 11-9.

* Add tests

* Fix tests

* Fix comment
This commit is contained in:
Justin Ridgewell 2019-02-26 15:18:52 -05:00 committed by GitHub
parent a029071b8f
commit 039a74a8b9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 51 additions and 16 deletions

View File

@ -214,10 +214,10 @@
"opera": "50",
"edge": "12",
"firefox": "5",
"safari": "10.1",
"safari": "12",
"node": "10",
"ie": "9",
"ios": "10.3",
"ios": "12",
"electron": "3.1"
},
"es6.array.species": {
@ -317,7 +317,7 @@
"es6.function.name": {
"chrome": "5",
"opera": "10.50",
"edge": "12",
"edge": "14",
"firefox": "2",
"safari": "4",
"node": "0.10",
@ -729,7 +729,7 @@
"es6.object.get-prototype-of": {
"chrome": "44",
"edge": "12",
"firefox": "3.5",
"firefox": "35",
"safari": "9",
"node": "4",
"ios": "9",

View File

@ -3,9 +3,7 @@
"chrome": "41",
"edge": "13",
"firefox": "34",
"safari": "9",
"node": "4",
"ios": "9",
"opera": "28",
"electron": "0.24"
},

View File

@ -67,7 +67,7 @@
"@babel/helper-fixtures": "^7.2.0",
"@babel/helper-plugin-test-runner": "^7.0.0",
"caniuse-db": "1.0.30000938",
"compat-table": "kangax/compat-table#1e7b377fbdda9243cf9602872fcb493cdbdd565f",
"compat-table": "kangax/compat-table#6d012ba020fa7415e8a2d29e87924bab79b128a3",
"electron-to-chromium": "1.3.113"
}
}

View File

@ -203,7 +203,7 @@ const getLowestImplementedVersion = ({ features }, env) => {
const reportedVersions = Object.keys(test)
.filter(t => t.startsWith(env))
.map(t => {
const version = t.replace("_", ".").replace(env, "");
const version = t.replace(/_/g, ".").replace(env, "");
return {
version,
semver: semver.coerce(version) || version,
@ -217,16 +217,26 @@ const getLowestImplementedVersion = ({ features }, env) => {
unreleasedLabelForEnv === version.version ||
!isNaN(parseFloat(version.version))
)
// Sort in asc order, with unreleasedLabelForEnv coming last.
// Sort in desc 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;
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);
// Find the lowest version such that all higher versions implement it.
// Eg, given { chrome70: true, chrome60: false, chrome50: true }, the
// lowest version is chrome70, not chrome50.
let lowest = null;
for (const version of reportedVersions) {
if (!version.implements) {
break;
}
lowest = version;
}
return lowest;
});
const envFiltered = envTests.filter(t => t);

View File

@ -13,7 +13,7 @@ Using targets:
Using modules transform: auto
Using plugins:
transform-template-literals { "ie":"10", "safari":"7" }
transform-template-literals { "ie":"10", "ios":"9", "safari":"7" }
transform-literals { "firefox":"49", "ie":"10", "safari":"7" }
transform-function-name { "edge":"13", "firefox":"49", "ie":"10", "ios":"9", "safari":"7" }
transform-arrow-functions { "ie":"10", "ios":"9", "safari":"7" }
@ -59,7 +59,7 @@ Using polyfills with `entry` option:
es6.date.to-json { "ios":"9", "safari":"7" }
es6.date.to-primitive { "edge":"13", "ie":"10", "ios":"9", "safari":"7" }
es6.function.has-instance { "edge":"13", "firefox":"49", "ie":"10", "ios":"9", "safari":"7" }
es6.function.name { "ie":"10" }
es6.function.name { "edge":"13", "ie":"10" }
es6.map { "edge":"13", "firefox":"49", "ie":"10", "ios":"9", "safari":"7" }
es6.math.acosh { "ie":"10", "safari":"7" }
es6.math.asinh { "ie":"10", "safari":"7" }

View File

@ -0,0 +1 @@
tag`Safari 12 borked`;

View File

@ -0,0 +1,13 @@
{
"presets": [
[
"../../../../lib",
{
"targets": {
"browsers": "safari 9"
},
"shippedProposals": true
}
]
]
}

View File

@ -0,0 +1,13 @@
function _templateObject() {
var data = _taggedTemplateLiteral(["Safari 12 borked"]);
_templateObject = function _templateObject() {
return data;
};
return data;
}
function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
tag(_templateObject());