Add browserslist 4 support. (#8509)

This commit is contained in:
Artem Yavorsky
2018-08-24 04:09:18 +03:00
committed by Brian Ng
parent a7cc3325cd
commit 4249dbc8ea
30 changed files with 140 additions and 19 deletions

View File

@@ -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"

View File

@@ -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),
};
}

View File

@@ -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);

View File

@@ -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

View File

@@ -0,0 +1,8 @@
require("foo");
const x = new Promise(resolve => {
const p = [];
if (p.includes("a")) {
}
});

View File

@@ -0,0 +1,12 @@
{
"presets": [
["../../../../lib", {
"modules": false,
"targets": {
"node": "4.0.0"
},
"useBuiltIns": "usage",
"shippedProposals": true
}]
]
}

View File

@@ -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")) {}
});

View File

@@ -0,0 +1,9 @@
{
"presets": [
["../../../../lib", {
"configPath": "../fixtures/preset-options/browserslist-config-ignore-with-false",
"modules": false,
"ignoreBrowserslistConfig": true
}]
]
}

View File

@@ -0,0 +1,3 @@
{
"browserslist": "last 1 chrome version"
}

View File

@@ -3,8 +3,7 @@
["../../../../lib", {
"configPath": "../fixtures/preset-options/browserslist-package-ignore-with-array",
"targets": {
"chrome": 55,
"browsers": []
"chrome": 55
},
"modules": false
}]

View File

@@ -0,0 +1,3 @@
{
"browserslist": "last 1 ie version"
}

View File

@@ -2,9 +2,6 @@
"presets": [
["../../../../lib", {
"configPath": "packages/babel-preset-env/test/fixtures/preset-options/browserslist-package",
"targets": {
"chrome": 55
},
"modules": false
}]
]

View File

@@ -1 +1 @@
var a = 1;
const a = 1;

View File

@@ -1,3 +1,3 @@
{
"browserslist": "> 2%"
"browserslist": "last 1 chrome version"
}

View File

@@ -0,0 +1 @@
const a = 1;

View File

@@ -0,0 +1,10 @@
{
"presets": [
["../../../../lib", {
"targets": {
"chrome": "55"
},
"modules": false
}]
]
}

View File

@@ -0,0 +1 @@
const a = 1;

View File

@@ -0,0 +1 @@
const a = 1;

View File

@@ -0,0 +1,8 @@
{
"presets": [
["../../../../lib", {
"targets": "chrome 55",
"modules": false
}]
]
}

View File

@@ -0,0 +1 @@
const a = 1;

View File

@@ -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({