diff --git a/packages/babel-preset-env/package.json b/packages/babel-preset-env/package.json index 17bfe8f75f..9d516a5ea4 100644 --- a/packages/babel-preset-env/package.json +++ b/packages/babel-preset-env/package.json @@ -60,7 +60,7 @@ "@babel/plugin-transform-typeof-symbol": "^7.7.4", "@babel/plugin-transform-unicode-regex": "^7.7.4", "@babel/types": "^7.7.4", - "browserslist": "^4.6.0", + "browserslist": "^4.8.2", "core-js-compat": "^3.6.0", "invariant": "^2.2.2", "levenary": "^1.1.0", diff --git a/packages/babel-preset-env/src/debug.js b/packages/babel-preset-env/src/debug.js index 747b895a10..58c98e5dae 100644 --- a/packages/babel-preset-env/src/debug.js +++ b/packages/babel-preset-env/src/debug.js @@ -1,7 +1,12 @@ // @flow /*eslint quotes: ["error", "double", { "avoidEscape": true }]*/ import semver from "semver"; -import { isUnreleasedVersion, prettifyVersion, semverify } from "./utils"; +import { + isUnreleasedVersion, + prettifyVersion, + semverify, + getLowestImplementedVersion, +} from "./utils"; import type { Targets } from "./types"; @@ -19,7 +24,7 @@ export const logPluginOrPolyfill = ( const minVersions = list[item] || {}; const filteredList = Object.keys(targetVersions).reduce((result, env) => { - const minVersion = minVersions[env]; + const minVersion = getLowestImplementedVersion(minVersions, env); const targetVersion = targetVersions[env]; if (!minVersion) { diff --git a/packages/babel-preset-env/src/filter-items.js b/packages/babel-preset-env/src/filter-items.js index 3c5a329708..cd1a377f99 100644 --- a/packages/babel-preset-env/src/filter-items.js +++ b/packages/babel-preset-env/src/filter-items.js @@ -1,6 +1,10 @@ // @flow import semver from "semver"; -import { semverify, isUnreleasedVersion } from "./utils"; +import { + semverify, + isUnreleasedVersion, + getLowestImplementedVersion, +} from "./utils"; import type { Targets } from "./types"; @@ -15,12 +19,14 @@ export function isPluginRequired( } const isRequiredForEnvironments = targetEnvironments.filter(environment => { + const lowestImplementedVersion = getLowestImplementedVersion( + plugin, + environment, + ); // Feature is not implemented in that environment - if (!plugin[environment]) { + if (!lowestImplementedVersion) { return true; } - - const lowestImplementedVersion = plugin[environment]; const lowestTargetedVersion = supportedEnvironments[environment]; // If targets has unreleased value as a lowest version, then don't require a plugin. diff --git a/packages/babel-preset-env/src/utils.js b/packages/babel-preset-env/src/utils.js index 5b5aaae9b6..e61e4e4d72 100644 --- a/packages/babel-preset-env/src/utils.js +++ b/packages/babel-preset-env/src/utils.js @@ -7,7 +7,7 @@ import semver from "semver"; import { addSideEffect } from "@babel/helper-module-imports"; import unreleasedLabels from "../data/unreleased-labels"; import { semverMin } from "./targets-parser"; -import type { Targets } from "./types"; +import type { Target, Targets } from "./types"; export const has = Object.hasOwnProperty.call.bind(Object.hasOwnProperty); @@ -105,6 +105,18 @@ export function getLowestUnreleased(a: string, b: string, env: string): string { return semverMin(a, b); } +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; +} + export function filterStageFromList( list: { [feature: string]: Targets }, stageList: { [feature: string]: boolean }, diff --git a/packages/babel-preset-env/test/fixtures/debug/browserslists-android-3/input.mjs b/packages/babel-preset-env/test/fixtures/debug/browserslists-android-3/input.mjs new file mode 100644 index 0000000000..c3fee8a175 --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/debug/browserslists-android-3/input.mjs @@ -0,0 +1 @@ +import "core-js"; diff --git a/packages/babel-preset-env/test/fixtures/debug/browserslists-android-3/options.json b/packages/babel-preset-env/test/fixtures/debug/browserslists-android-3/options.json new file mode 100644 index 0000000000..b8ccf9b247 --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/debug/browserslists-android-3/options.json @@ -0,0 +1,17 @@ +{ + "validateLogs": true, + "ignoreOutput": true, + "presets": [ + [ + "env", + { + "debug": true, + "targets": { + "browsers": [ + "android 3" + ] + } + } + ] + ] +} diff --git a/packages/babel-preset-env/test/fixtures/debug/browserslists-android-3/stdout.txt b/packages/babel-preset-env/test/fixtures/debug/browserslists-android-3/stdout.txt new file mode 100644 index 0000000000..b193c75bf4 --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/debug/browserslists-android-3/stdout.txt @@ -0,0 +1,46 @@ +@babel/preset-env: `DEBUG` option + +Using targets: +{ + "android": "3" +} + +Using modules transform: auto + +Using plugins: + transform-template-literals { "android":"3" } + transform-literals { "android":"3" } + transform-function-name { "android":"3" } + transform-arrow-functions { "android":"3" } + transform-block-scoped-functions { "android":"3" } + transform-classes { "android":"3" } + transform-object-super { "android":"3" } + transform-shorthand-properties { "android":"3" } + transform-duplicate-keys { "android":"3" } + transform-computed-properties { "android":"3" } + transform-for-of { "android":"3" } + transform-sticky-regex { "android":"3" } + transform-dotall-regex { "android":"3" } + transform-unicode-regex { "android":"3" } + transform-spread { "android":"3" } + transform-parameters { "android":"3" } + transform-destructuring { "android":"3" } + transform-block-scoping { "android":"3" } + transform-typeof-symbol { "android":"3" } + transform-new-target { "android":"3" } + transform-regenerator { "android":"3" } + transform-exponentiation-operator { "android":"3" } + transform-async-to-generator { "android":"3" } + proposal-async-generator-functions { "android":"3" } + proposal-object-rest-spread { "android":"3" } + proposal-unicode-property-regex { "android":"3" } + proposal-json-strings { "android":"3" } + proposal-optional-catch-binding { "android":"3" } + transform-named-capturing-groups-regex { "android":"3" } + transform-member-expression-literals { "android":"3" } + transform-property-literals { "android":"3" } + transform-reserved-words { "android":"3" } + transform-modules-commonjs { "android":"3" } + proposal-dynamic-import { "android":"3" } + +Using polyfills: No polyfills were added, since the `useBuiltIns` option was not set. diff --git a/packages/babel-preset-env/test/fixtures/debug/browserslists-defaults-not-ie/input.mjs b/packages/babel-preset-env/test/fixtures/debug/browserslists-defaults-not-ie/input.mjs new file mode 100644 index 0000000000..c3fee8a175 --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/debug/browserslists-defaults-not-ie/input.mjs @@ -0,0 +1 @@ +import "core-js"; diff --git a/packages/babel-preset-env/test/fixtures/debug/browserslists-defaults-not-ie/options.json b/packages/babel-preset-env/test/fixtures/debug/browserslists-defaults-not-ie/options.json new file mode 100644 index 0000000000..8bbb1c0f23 --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/debug/browserslists-defaults-not-ie/options.json @@ -0,0 +1,19 @@ +{ + "validateLogs": true, + "ignoreOutput": true, + "presets": [ + [ + "env", + { + "debug": true, + "targets": { + "browsers": [ + "defaults", + "not ie 11", + "not ie_mob 11" + ] + } + } + ] + ] +} diff --git a/packages/babel-preset-env/test/fixtures/debug/browserslists-defaults-not-ie/stdout.txt b/packages/babel-preset-env/test/fixtures/debug/browserslists-defaults-not-ie/stdout.txt new file mode 100644 index 0000000000..40ff4ed1eb --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/debug/browserslists-defaults-not-ie/stdout.txt @@ -0,0 +1,50 @@ +@babel/preset-env: `DEBUG` option + +Using targets: +{ + "android": "77", + "chrome": "77", + "edge": "17", + "firefox": "68", + "ios": "12.2", + "opera": "63", + "safari": "5.1", + "samsung": "9.2" +} + +Using modules transform: auto + +Using plugins: + transform-template-literals { "ios":"12.2", "safari":"5.1" } + transform-literals { "safari":"5.1" } + transform-function-name { "edge":"17", "safari":"5.1" } + transform-arrow-functions { "safari":"5.1" } + transform-block-scoped-functions { "safari":"5.1" } + transform-classes { "safari":"5.1" } + transform-object-super { "safari":"5.1" } + transform-shorthand-properties { "safari":"5.1" } + transform-duplicate-keys { "safari":"5.1" } + transform-computed-properties { "safari":"5.1" } + transform-for-of { "safari":"5.1" } + transform-sticky-regex { "safari":"5.1" } + transform-dotall-regex { "edge":"17", "firefox":"68", "safari":"5.1" } + transform-unicode-regex { "safari":"5.1" } + transform-spread { "safari":"5.1" } + transform-parameters { "edge":"17", "safari":"5.1" } + transform-destructuring { "safari":"5.1" } + transform-block-scoping { "safari":"5.1" } + transform-typeof-symbol { "safari":"5.1" } + transform-new-target { "safari":"5.1" } + transform-regenerator { "safari":"5.1" } + transform-exponentiation-operator { "safari":"5.1" } + transform-async-to-generator { "safari":"5.1" } + proposal-async-generator-functions { "edge":"17", "safari":"5.1" } + proposal-object-rest-spread { "edge":"17", "safari":"5.1" } + proposal-unicode-property-regex { "edge":"17", "firefox":"68", "safari":"5.1" } + proposal-json-strings { "edge":"17", "safari":"5.1" } + proposal-optional-catch-binding { "edge":"17", "safari":"5.1" } + transform-named-capturing-groups-regex { "edge":"17", "firefox":"68", "safari":"5.1" } + transform-modules-commonjs { "android":"77", "chrome":"77", "edge":"17", "firefox":"68", "ios":"12.2", "opera":"63", "safari":"5.1", "samsung":"9.2" } + proposal-dynamic-import { "android":"77", "chrome":"77", "edge":"17", "firefox":"68", "ios":"12.2", "opera":"63", "safari":"5.1", "samsung":"9.2" } + +Using polyfills: No polyfills were added, since the `useBuiltIns` option was not set. diff --git a/packages/babel-preset-env/test/fixtures/debug/browserslists-defaults/input.mjs b/packages/babel-preset-env/test/fixtures/debug/browserslists-defaults/input.mjs new file mode 100644 index 0000000000..c3fee8a175 --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/debug/browserslists-defaults/input.mjs @@ -0,0 +1 @@ +import "core-js"; diff --git a/packages/babel-preset-env/test/fixtures/debug/browserslists-defaults/options.json b/packages/babel-preset-env/test/fixtures/debug/browserslists-defaults/options.json new file mode 100644 index 0000000000..b4fbce958e --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/debug/browserslists-defaults/options.json @@ -0,0 +1,15 @@ +{ + "validateLogs": true, + "ignoreOutput": true, + "presets": [ + [ + "env", + { + "debug": true, + "targets": { + "browsers": "defaults" + } + } + ] + ] +} diff --git a/packages/babel-preset-env/test/fixtures/debug/browserslists-defaults/stdout.txt b/packages/babel-preset-env/test/fixtures/debug/browserslists-defaults/stdout.txt new file mode 100644 index 0000000000..641ccc714d --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/debug/browserslists-defaults/stdout.txt @@ -0,0 +1,51 @@ +@babel/preset-env: `DEBUG` option + +Using targets: +{ + "android": "77", + "chrome": "77", + "edge": "17", + "firefox": "68", + "ie": "11", + "ios": "12.2", + "opera": "63", + "safari": "5.1", + "samsung": "9.2" +} + +Using modules transform: auto + +Using plugins: + transform-template-literals { "ie":"11", "ios":"12.2", "safari":"5.1" } + transform-literals { "ie":"11", "safari":"5.1" } + transform-function-name { "edge":"17", "ie":"11", "safari":"5.1" } + transform-arrow-functions { "ie":"11", "safari":"5.1" } + transform-block-scoped-functions { "safari":"5.1" } + transform-classes { "ie":"11", "safari":"5.1" } + transform-object-super { "ie":"11", "safari":"5.1" } + transform-shorthand-properties { "ie":"11", "safari":"5.1" } + transform-duplicate-keys { "ie":"11", "safari":"5.1" } + transform-computed-properties { "ie":"11", "safari":"5.1" } + transform-for-of { "ie":"11", "safari":"5.1" } + transform-sticky-regex { "ie":"11", "safari":"5.1" } + transform-dotall-regex { "edge":"17", "firefox":"68", "ie":"11", "safari":"5.1" } + transform-unicode-regex { "ie":"11", "safari":"5.1" } + transform-spread { "ie":"11", "safari":"5.1" } + transform-parameters { "edge":"17", "ie":"11", "safari":"5.1" } + transform-destructuring { "ie":"11", "safari":"5.1" } + transform-block-scoping { "ie":"11", "safari":"5.1" } + transform-typeof-symbol { "ie":"11", "safari":"5.1" } + transform-new-target { "ie":"11", "safari":"5.1" } + transform-regenerator { "ie":"11", "safari":"5.1" } + transform-exponentiation-operator { "ie":"11", "safari":"5.1" } + transform-async-to-generator { "ie":"11", "safari":"5.1" } + proposal-async-generator-functions { "edge":"17", "ie":"11", "safari":"5.1" } + proposal-object-rest-spread { "edge":"17", "ie":"11", "safari":"5.1" } + proposal-unicode-property-regex { "edge":"17", "firefox":"68", "ie":"11", "safari":"5.1" } + proposal-json-strings { "edge":"17", "ie":"11", "safari":"5.1" } + proposal-optional-catch-binding { "edge":"17", "ie":"11", "safari":"5.1" } + transform-named-capturing-groups-regex { "edge":"17", "firefox":"68", "ie":"11", "safari":"5.1" } + transform-modules-commonjs { "android":"77", "chrome":"77", "edge":"17", "firefox":"68", "ie":"11", "ios":"12.2", "opera":"63", "safari":"5.1", "samsung":"9.2" } + proposal-dynamic-import { "android":"77", "chrome":"77", "edge":"17", "firefox":"68", "ie":"11", "ios":"12.2", "opera":"63", "safari":"5.1", "samsung":"9.2" } + +Using polyfills: No polyfills were added, since the `useBuiltIns` option was not set. diff --git a/packages/babel-preset-env/test/fixtures/debug/browserslists-last-2-versions-not-ie/input.mjs b/packages/babel-preset-env/test/fixtures/debug/browserslists-last-2-versions-not-ie/input.mjs new file mode 100644 index 0000000000..c3fee8a175 --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/debug/browserslists-last-2-versions-not-ie/input.mjs @@ -0,0 +1 @@ +import "core-js"; diff --git a/packages/babel-preset-env/test/fixtures/debug/browserslists-last-2-versions-not-ie/options.json b/packages/babel-preset-env/test/fixtures/debug/browserslists-last-2-versions-not-ie/options.json new file mode 100644 index 0000000000..58797fc7f4 --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/debug/browserslists-last-2-versions-not-ie/options.json @@ -0,0 +1,19 @@ +{ + "validateLogs": true, + "ignoreOutput": true, + "presets": [ + [ + "env", + { + "debug": true, + "targets": { + "browsers": [ + "last 2 versions", + "not ie <= 11", + "not ie_mob <= 11" + ] + } + } + ] + ] +} diff --git a/packages/babel-preset-env/test/fixtures/debug/browserslists-last-2-versions-not-ie/stdout.txt b/packages/babel-preset-env/test/fixtures/debug/browserslists-last-2-versions-not-ie/stdout.txt new file mode 100644 index 0000000000..589e0f6bc2 --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/debug/browserslists-last-2-versions-not-ie/stdout.txt @@ -0,0 +1,31 @@ +@babel/preset-env: `DEBUG` option + +Using targets: +{ + "android": "77", + "chrome": "77", + "edge": "17", + "firefox": "70", + "ios": "13", + "opera": "63", + "safari": "12.1", + "samsung": "9.2" +} + +Using modules transform: auto + +Using plugins: + transform-template-literals { "safari":"12.1" } + transform-function-name { "edge":"17" } + transform-dotall-regex { "edge":"17", "firefox":"70" } + transform-parameters { "edge":"17" } + proposal-async-generator-functions { "edge":"17" } + proposal-object-rest-spread { "edge":"17" } + proposal-unicode-property-regex { "edge":"17", "firefox":"70" } + proposal-json-strings { "edge":"17" } + proposal-optional-catch-binding { "edge":"17" } + transform-named-capturing-groups-regex { "edge":"17", "firefox":"70" } + transform-modules-commonjs { "android":"77", "chrome":"77", "edge":"17", "firefox":"70", "ios":"13", "opera":"63", "safari":"12.1", "samsung":"9.2" } + proposal-dynamic-import { "android":"77", "chrome":"77", "edge":"17", "firefox":"70", "ios":"13", "opera":"63", "safari":"12.1", "samsung":"9.2" } + +Using polyfills: No polyfills were added, since the `useBuiltIns` option was not set. diff --git a/packages/babel-preset-env/test/fixtures/preset-options/browserslist-defaults-2/input.mjs b/packages/babel-preset-env/test/fixtures/preset-options/browserslist-defaults-not-ie/input.mjs similarity index 100% rename from packages/babel-preset-env/test/fixtures/preset-options/browserslist-defaults-2/input.mjs rename to packages/babel-preset-env/test/fixtures/preset-options/browserslist-defaults-not-ie/input.mjs diff --git a/packages/babel-preset-env/test/fixtures/preset-options/browserslist-defaults-2/options.json b/packages/babel-preset-env/test/fixtures/preset-options/browserslist-defaults-not-ie/options.json similarity index 65% rename from packages/babel-preset-env/test/fixtures/preset-options/browserslist-defaults-2/options.json rename to packages/babel-preset-env/test/fixtures/preset-options/browserslist-defaults-not-ie/options.json index 7ee0ee1a8a..63828ae6c6 100644 --- a/packages/babel-preset-env/test/fixtures/preset-options/browserslist-defaults-2/options.json +++ b/packages/babel-preset-env/test/fixtures/preset-options/browserslist-defaults-not-ie/options.json @@ -5,7 +5,7 @@ { "targets": { "node": "current", - "browsers": ["defaults", "not ie <= 10"] + "browsers": ["defaults", "not ie <= 10", "not ie_mob <= 10"] } } ] diff --git a/packages/babel-preset-env/test/fixtures/preset-options/browserslist-defaults-2/output.js b/packages/babel-preset-env/test/fixtures/preset-options/browserslist-defaults-not-ie/output.js similarity index 100% rename from packages/babel-preset-env/test/fixtures/preset-options/browserslist-defaults-2/output.js rename to packages/babel-preset-env/test/fixtures/preset-options/browserslist-defaults-not-ie/output.js