Add browserslist 4 support. (#8509)
This commit is contained in:
@@ -48,7 +48,7 @@
|
||||
"@babel/plugin-transform-template-literals": "7.0.0-rc.2",
|
||||
"@babel/plugin-transform-typeof-symbol": "7.0.0-rc.2",
|
||||
"@babel/plugin-transform-unicode-regex": "7.0.0-rc.2",
|
||||
"browserslist": "^3.0.0",
|
||||
"browserslist": "^4.1.0",
|
||||
"invariant": "^2.2.2",
|
||||
"js-levenshtein": "^1.1.3",
|
||||
"semver": "^5.3.0"
|
||||
|
||||
@@ -5,6 +5,7 @@ import browserslist from "browserslist";
|
||||
import builtInsList from "../data/built-ins.json";
|
||||
import { defaultWebIncludes } from "./default-includes";
|
||||
import moduleTransformations from "./module-transformations";
|
||||
import { isBrowsersQueryValid } from "./targets-parser";
|
||||
import { getValues, findSuggestion } from "./utils";
|
||||
import pluginsList from "../data/plugins.json";
|
||||
import { TopLevelOptions, ModulesOption, UseBuiltInsOption } from "./options";
|
||||
@@ -92,6 +93,16 @@ export const checkDuplicateIncludeExcludes = (
|
||||
);
|
||||
};
|
||||
|
||||
const normalizeTargets = (targets: any): Targets => {
|
||||
// TODO: Allow to use only query or strings as a targets from next breaking change.
|
||||
if (isBrowsersQueryValid(targets)) {
|
||||
return { browsers: targets };
|
||||
}
|
||||
return {
|
||||
...targets,
|
||||
};
|
||||
};
|
||||
|
||||
export const validateConfigPathOption = (
|
||||
configPath: string = process.cwd(),
|
||||
) => {
|
||||
@@ -203,9 +214,7 @@ export default function normalizeOptions(opts: Options) {
|
||||
false,
|
||||
),
|
||||
spec: validateBoolOption(TopLevelOptions.spec, opts.spec, false),
|
||||
targets: {
|
||||
...opts.targets,
|
||||
},
|
||||
targets: normalizeTargets(opts.targets),
|
||||
useBuiltIns: validateUseBuiltInsOption(opts.useBuiltIns),
|
||||
};
|
||||
}
|
||||
|
||||
@@ -38,10 +38,12 @@ const browserNameMap = {
|
||||
ie: "ie",
|
||||
ios_saf: "ios",
|
||||
safari: "safari",
|
||||
node: "node",
|
||||
};
|
||||
|
||||
const isBrowsersQueryValid = (browsers: string | Array<string>): boolean =>
|
||||
typeof browsers === "string" || Array.isArray(browsers);
|
||||
export const isBrowsersQueryValid = (
|
||||
browsers: string | Array<string> | Targets,
|
||||
): boolean => typeof browsers === "string" || Array.isArray(browsers);
|
||||
|
||||
const validateBrowsers = browsers => {
|
||||
invariant(
|
||||
@@ -174,10 +176,17 @@ const getTargets = (targets: Object = {}, options: Object = {}): Targets => {
|
||||
|
||||
// Parse browsers target via browserslist
|
||||
const browsersquery = validateBrowsers(targets.browsers);
|
||||
if (targets.esmodules || !options.ignoreBrowserslistConfig) {
|
||||
const shouldParseBrowsers = !!targets.browsers;
|
||||
const shouldSearchForConfig =
|
||||
!options.ignoreBrowserslistConfig && !Object.keys(targets).length;
|
||||
|
||||
if (shouldParseBrowsers || shouldSearchForConfig) {
|
||||
browserslist.defaults = objectToBrowserslist(targets);
|
||||
|
||||
const browsers = browserslist(browsersquery, { path: options.configPath });
|
||||
const browsers = browserslist(browsersquery, {
|
||||
path: options.configPath,
|
||||
});
|
||||
|
||||
const queryBrowsers = getLowestVersions(browsers);
|
||||
targets = mergeBrowsers(queryBrowsers, targets);
|
||||
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
["../../../../lib", {
|
||||
"configPath": "../fixtures/preset-options-add-used-built-ins/browserslist-config-ignore",
|
||||
"modules": false,
|
||||
"ignoreBrowserslistConfig": true,
|
||||
"targets": { "esmodules": true },
|
||||
"useBuiltIns": "usage",
|
||||
"debug": true
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
require("foo");
|
||||
|
||||
const x = new Promise(resolve => {
|
||||
const p = [];
|
||||
|
||||
if (p.includes("a")) {
|
||||
}
|
||||
});
|
||||
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"presets": [
|
||||
["../../../../lib", {
|
||||
"modules": false,
|
||||
"targets": {
|
||||
"node": "4.0.0"
|
||||
},
|
||||
"useBuiltIns": "usage",
|
||||
"shippedProposals": true
|
||||
}]
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
require("core-js/modules/es7.array.includes");
|
||||
|
||||
require("core-js/modules/es6.promise");
|
||||
|
||||
require("foo");
|
||||
|
||||
var x = new Promise(function (resolve) {
|
||||
var p = [];
|
||||
|
||||
if (p.includes("a")) {}
|
||||
});
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"presets": [
|
||||
["../../../../lib", {
|
||||
"configPath": "../fixtures/preset-options/browserslist-config-ignore-with-false",
|
||||
"modules": false,
|
||||
"ignoreBrowserslistConfig": true
|
||||
}]
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
var a = 1;
|
||||
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"browserslist": "last 1 chrome version"
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
{
|
||||
"browserslist": "> 2%"
|
||||
}
|
||||
@@ -3,8 +3,7 @@
|
||||
["../../../../lib", {
|
||||
"configPath": "../fixtures/preset-options/browserslist-package-ignore-with-array",
|
||||
"targets": {
|
||||
"chrome": 55,
|
||||
"browsers": []
|
||||
"chrome": 55
|
||||
},
|
||||
"modules": false
|
||||
}]
|
||||
@@ -0,0 +1 @@
|
||||
const a = 1;
|
||||
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"browserslist": "last 1 ie version"
|
||||
}
|
||||
@@ -2,9 +2,6 @@
|
||||
"presets": [
|
||||
["../../../../lib", {
|
||||
"configPath": "packages/babel-preset-env/test/fixtures/preset-options/browserslist-package",
|
||||
"targets": {
|
||||
"chrome": 55
|
||||
},
|
||||
"modules": false
|
||||
}]
|
||||
]
|
||||
|
||||
@@ -1 +1 @@
|
||||
var a = 1;
|
||||
const a = 1;
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
{
|
||||
"browserslist": "> 2%"
|
||||
"browserslist": "last 1 chrome version"
|
||||
}
|
||||
|
||||
1
packages/babel-preset-env/test/fixtures/preset-options/targets-as-object/input.mjs
vendored
Normal file
1
packages/babel-preset-env/test/fixtures/preset-options/targets-as-object/input.mjs
vendored
Normal file
@@ -0,0 +1 @@
|
||||
const a = 1;
|
||||
10
packages/babel-preset-env/test/fixtures/preset-options/targets-as-object/options.json
vendored
Normal file
10
packages/babel-preset-env/test/fixtures/preset-options/targets-as-object/options.json
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"presets": [
|
||||
["../../../../lib", {
|
||||
"targets": {
|
||||
"chrome": "55"
|
||||
},
|
||||
"modules": false
|
||||
}]
|
||||
]
|
||||
}
|
||||
1
packages/babel-preset-env/test/fixtures/preset-options/targets-as-object/output.mjs
vendored
Normal file
1
packages/babel-preset-env/test/fixtures/preset-options/targets-as-object/output.mjs
vendored
Normal file
@@ -0,0 +1 @@
|
||||
const a = 1;
|
||||
1
packages/babel-preset-env/test/fixtures/preset-options/targets-as-string/input.mjs
vendored
Normal file
1
packages/babel-preset-env/test/fixtures/preset-options/targets-as-string/input.mjs
vendored
Normal file
@@ -0,0 +1 @@
|
||||
const a = 1;
|
||||
8
packages/babel-preset-env/test/fixtures/preset-options/targets-as-string/options.json
vendored
Normal file
8
packages/babel-preset-env/test/fixtures/preset-options/targets-as-string/options.json
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"presets": [
|
||||
["../../../../lib", {
|
||||
"targets": "chrome 55",
|
||||
"modules": false
|
||||
}]
|
||||
]
|
||||
}
|
||||
1
packages/babel-preset-env/test/fixtures/preset-options/targets-as-string/output.mjs
vendored
Normal file
1
packages/babel-preset-env/test/fixtures/preset-options/targets-as-string/output.mjs
vendored
Normal file
@@ -0,0 +1 @@
|
||||
const a = 1;
|
||||
@@ -86,6 +86,47 @@ describe("getTargets", () => {
|
||||
});
|
||||
});
|
||||
|
||||
it("works with node versions", () => {
|
||||
expect(
|
||||
getTargets({
|
||||
browsers: "node 8.5",
|
||||
}),
|
||||
).toEqual({
|
||||
node: "8.5.0",
|
||||
});
|
||||
});
|
||||
|
||||
it("works with current node version and string type browsers", () => {
|
||||
expect(
|
||||
getTargets({
|
||||
browsers: "current node, chrome 55",
|
||||
}),
|
||||
).toEqual({
|
||||
node: process.versions.node,
|
||||
chrome: "55.0.0",
|
||||
});
|
||||
});
|
||||
|
||||
it("does throws on unsupported versions", () => {
|
||||
expect(() => {
|
||||
getTargets({
|
||||
browsers: "node 15.0.0, chrome 1000",
|
||||
});
|
||||
}).toThrow();
|
||||
});
|
||||
|
||||
it("works with current node version and array type browsers", () => {
|
||||
expect(
|
||||
getTargets({
|
||||
browsers: ["ie 11", "current node", "chrome 55"],
|
||||
}),
|
||||
).toEqual({
|
||||
node: process.versions.node,
|
||||
chrome: "55.0.0",
|
||||
ie: "11.0.0",
|
||||
});
|
||||
});
|
||||
|
||||
it("prefers released version over TP", () => {
|
||||
expect(
|
||||
getTargets({
|
||||
|
||||
Reference in New Issue
Block a user