diff --git a/packages/babel-preset-env/package.json b/packages/babel-preset-env/package.json index a1f3a7b8af..326b690789 100644 --- a/packages/babel-preset-env/package.json +++ b/packages/babel-preset-env/package.json @@ -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" diff --git a/packages/babel-preset-env/src/normalize-options.js b/packages/babel-preset-env/src/normalize-options.js index 6d1e58ffce..75144356e1 100644 --- a/packages/babel-preset-env/src/normalize-options.js +++ b/packages/babel-preset-env/src/normalize-options.js @@ -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), }; } diff --git a/packages/babel-preset-env/src/targets-parser.js b/packages/babel-preset-env/src/targets-parser.js index f054d9d746..c2a446d7ea 100644 --- a/packages/babel-preset-env/src/targets-parser.js +++ b/packages/babel-preset-env/src/targets-parser.js @@ -38,10 +38,12 @@ const browserNameMap = { ie: "ie", ios_saf: "ios", safari: "safari", + node: "node", }; -const isBrowsersQueryValid = (browsers: string | Array): boolean => - typeof browsers === "string" || Array.isArray(browsers); +export const isBrowsersQueryValid = ( + browsers: string | Array | 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); diff --git a/packages/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/browserslist-config-ignore/options.json b/packages/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/browserslist-config-ignore/options.json index 7792da9ef4..b90edbbf84 100644 --- a/packages/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/browserslist-config-ignore/options.json +++ b/packages/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/browserslist-config-ignore/options.json @@ -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 diff --git a/packages/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/source-type-script-query/input.js b/packages/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/source-type-script-query/input.js new file mode 100644 index 0000000000..39f9e5858b --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/source-type-script-query/input.js @@ -0,0 +1,8 @@ +require("foo"); + +const x = new Promise(resolve => { + const p = []; + + if (p.includes("a")) { + } +}); diff --git a/packages/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/source-type-script-query/options.json b/packages/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/source-type-script-query/options.json new file mode 100644 index 0000000000..a92e3abd7a --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/source-type-script-query/options.json @@ -0,0 +1,12 @@ +{ + "presets": [ + ["../../../../lib", { + "modules": false, + "targets": { + "node": "4.0.0" + }, + "useBuiltIns": "usage", + "shippedProposals": true + }] + ] +} diff --git a/packages/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/source-type-script-query/output.js b/packages/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/source-type-script-query/output.js new file mode 100644 index 0000000000..d98c7e41c6 --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/source-type-script-query/output.js @@ -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")) {} +}); diff --git a/packages/babel-preset-env/test/fixtures/preset-options/browserslist-config-ignore-with-false/browserslist b/packages/babel-preset-env/test/fixtures/preset-options/browserslist-config-ignore-config-with-false/browserslist similarity index 100% rename from packages/babel-preset-env/test/fixtures/preset-options/browserslist-config-ignore-with-false/browserslist rename to packages/babel-preset-env/test/fixtures/preset-options/browserslist-config-ignore-config-with-false/browserslist diff --git a/packages/babel-preset-env/test/fixtures/preset-options/browserslist-config-ignore-with-false/input.mjs b/packages/babel-preset-env/test/fixtures/preset-options/browserslist-config-ignore-config-with-false/input.mjs similarity index 100% rename from packages/babel-preset-env/test/fixtures/preset-options/browserslist-config-ignore-with-false/input.mjs rename to packages/babel-preset-env/test/fixtures/preset-options/browserslist-config-ignore-config-with-false/input.mjs diff --git a/packages/babel-preset-env/test/fixtures/preset-options/browserslist-config-ignore-with-false/options.json b/packages/babel-preset-env/test/fixtures/preset-options/browserslist-config-ignore-config-with-false/options.json similarity index 100% rename from packages/babel-preset-env/test/fixtures/preset-options/browserslist-config-ignore-with-false/options.json rename to packages/babel-preset-env/test/fixtures/preset-options/browserslist-config-ignore-config-with-false/options.json diff --git a/packages/babel-preset-env/test/fixtures/preset-options/browserslist-config-ignore-with-false/output.mjs b/packages/babel-preset-env/test/fixtures/preset-options/browserslist-config-ignore-config-with-false/output.mjs similarity index 100% rename from packages/babel-preset-env/test/fixtures/preset-options/browserslist-config-ignore-with-false/output.mjs rename to packages/babel-preset-env/test/fixtures/preset-options/browserslist-config-ignore-config-with-false/output.mjs diff --git a/packages/babel-preset-env/test/fixtures/preset-options/browserslist-package-ignore-with-array/input.mjs b/packages/babel-preset-env/test/fixtures/preset-options/browserslist-config-ignore-package-with-false/input.mjs similarity index 100% rename from packages/babel-preset-env/test/fixtures/preset-options/browserslist-package-ignore-with-array/input.mjs rename to packages/babel-preset-env/test/fixtures/preset-options/browserslist-config-ignore-package-with-false/input.mjs diff --git a/packages/babel-preset-env/test/fixtures/preset-options/browserslist-config-ignore-package-with-false/options.json b/packages/babel-preset-env/test/fixtures/preset-options/browserslist-config-ignore-package-with-false/options.json new file mode 100644 index 0000000000..d575e094d6 --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/preset-options/browserslist-config-ignore-package-with-false/options.json @@ -0,0 +1,9 @@ +{ + "presets": [ + ["../../../../lib", { + "configPath": "../fixtures/preset-options/browserslist-config-ignore-with-false", + "modules": false, + "ignoreBrowserslistConfig": true + }] + ] +} diff --git a/packages/babel-preset-env/test/fixtures/preset-options/browserslist-config-ignore-package-with-false/output.mjs b/packages/babel-preset-env/test/fixtures/preset-options/browserslist-config-ignore-package-with-false/output.mjs new file mode 100644 index 0000000000..f688910ec0 --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/preset-options/browserslist-config-ignore-package-with-false/output.mjs @@ -0,0 +1 @@ +var a = 1; diff --git a/packages/babel-preset-env/test/fixtures/preset-options/browserslist-config-ignore-package-with-false/package.json b/packages/babel-preset-env/test/fixtures/preset-options/browserslist-config-ignore-package-with-false/package.json new file mode 100644 index 0000000000..5862d68270 --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/preset-options/browserslist-config-ignore-package-with-false/package.json @@ -0,0 +1,3 @@ +{ + "browserslist": "last 1 chrome version" +} diff --git a/packages/babel-preset-env/test/fixtures/preset-options/browserslist-package-ignore-with-array/package.json b/packages/babel-preset-env/test/fixtures/preset-options/browserslist-package-ignore-with-array/package.json deleted file mode 100644 index 409d45c7fc..0000000000 --- a/packages/babel-preset-env/test/fixtures/preset-options/browserslist-package-ignore-with-array/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "browserslist": "> 2%" -} diff --git a/packages/babel-preset-env/test/fixtures/preset-options/browserslist-package-ignore-with-array/output.mjs b/packages/babel-preset-env/test/fixtures/preset-options/browserslist-package-ignore-with-targets/input.mjs similarity index 100% rename from packages/babel-preset-env/test/fixtures/preset-options/browserslist-package-ignore-with-array/output.mjs rename to packages/babel-preset-env/test/fixtures/preset-options/browserslist-package-ignore-with-targets/input.mjs diff --git a/packages/babel-preset-env/test/fixtures/preset-options/browserslist-package-ignore-with-array/options.json b/packages/babel-preset-env/test/fixtures/preset-options/browserslist-package-ignore-with-targets/options.json similarity index 81% rename from packages/babel-preset-env/test/fixtures/preset-options/browserslist-package-ignore-with-array/options.json rename to packages/babel-preset-env/test/fixtures/preset-options/browserslist-package-ignore-with-targets/options.json index 4d3b8a30f1..4cbd932c33 100644 --- a/packages/babel-preset-env/test/fixtures/preset-options/browserslist-package-ignore-with-array/options.json +++ b/packages/babel-preset-env/test/fixtures/preset-options/browserslist-package-ignore-with-targets/options.json @@ -3,8 +3,7 @@ ["../../../../lib", { "configPath": "../fixtures/preset-options/browserslist-package-ignore-with-array", "targets": { - "chrome": 55, - "browsers": [] + "chrome": 55 }, "modules": false }] diff --git a/packages/babel-preset-env/test/fixtures/preset-options/browserslist-package-ignore-with-targets/output.mjs b/packages/babel-preset-env/test/fixtures/preset-options/browserslist-package-ignore-with-targets/output.mjs new file mode 100644 index 0000000000..54b82a09ad --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/preset-options/browserslist-package-ignore-with-targets/output.mjs @@ -0,0 +1 @@ +const a = 1; diff --git a/packages/babel-preset-env/test/fixtures/preset-options/browserslist-package-ignore-with-targets/package.json b/packages/babel-preset-env/test/fixtures/preset-options/browserslist-package-ignore-with-targets/package.json new file mode 100644 index 0000000000..321ba17e87 --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/preset-options/browserslist-package-ignore-with-targets/package.json @@ -0,0 +1,3 @@ +{ + "browserslist": "last 1 ie version" +} diff --git a/packages/babel-preset-env/test/fixtures/preset-options/browserslist-package/options.json b/packages/babel-preset-env/test/fixtures/preset-options/browserslist-package/options.json index c10fd049d7..4df4752e3d 100644 --- a/packages/babel-preset-env/test/fixtures/preset-options/browserslist-package/options.json +++ b/packages/babel-preset-env/test/fixtures/preset-options/browserslist-package/options.json @@ -2,9 +2,6 @@ "presets": [ ["../../../../lib", { "configPath": "packages/babel-preset-env/test/fixtures/preset-options/browserslist-package", - "targets": { - "chrome": 55 - }, "modules": false }] ] diff --git a/packages/babel-preset-env/test/fixtures/preset-options/browserslist-package/output.mjs b/packages/babel-preset-env/test/fixtures/preset-options/browserslist-package/output.mjs index f688910ec0..54b82a09ad 100644 --- a/packages/babel-preset-env/test/fixtures/preset-options/browserslist-package/output.mjs +++ b/packages/babel-preset-env/test/fixtures/preset-options/browserslist-package/output.mjs @@ -1 +1 @@ -var a = 1; +const a = 1; diff --git a/packages/babel-preset-env/test/fixtures/preset-options/browserslist-package/package.json b/packages/babel-preset-env/test/fixtures/preset-options/browserslist-package/package.json index 409d45c7fc..5862d68270 100644 --- a/packages/babel-preset-env/test/fixtures/preset-options/browserslist-package/package.json +++ b/packages/babel-preset-env/test/fixtures/preset-options/browserslist-package/package.json @@ -1,3 +1,3 @@ { - "browserslist": "> 2%" + "browserslist": "last 1 chrome version" } diff --git a/packages/babel-preset-env/test/fixtures/preset-options/targets-as-object/input.mjs b/packages/babel-preset-env/test/fixtures/preset-options/targets-as-object/input.mjs new file mode 100644 index 0000000000..54b82a09ad --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/preset-options/targets-as-object/input.mjs @@ -0,0 +1 @@ +const a = 1; diff --git a/packages/babel-preset-env/test/fixtures/preset-options/targets-as-object/options.json b/packages/babel-preset-env/test/fixtures/preset-options/targets-as-object/options.json new file mode 100644 index 0000000000..ad464f5e61 --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/preset-options/targets-as-object/options.json @@ -0,0 +1,10 @@ +{ + "presets": [ + ["../../../../lib", { + "targets": { + "chrome": "55" + }, + "modules": false + }] + ] +} diff --git a/packages/babel-preset-env/test/fixtures/preset-options/targets-as-object/output.mjs b/packages/babel-preset-env/test/fixtures/preset-options/targets-as-object/output.mjs new file mode 100644 index 0000000000..54b82a09ad --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/preset-options/targets-as-object/output.mjs @@ -0,0 +1 @@ +const a = 1; diff --git a/packages/babel-preset-env/test/fixtures/preset-options/targets-as-string/input.mjs b/packages/babel-preset-env/test/fixtures/preset-options/targets-as-string/input.mjs new file mode 100644 index 0000000000..54b82a09ad --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/preset-options/targets-as-string/input.mjs @@ -0,0 +1 @@ +const a = 1; diff --git a/packages/babel-preset-env/test/fixtures/preset-options/targets-as-string/options.json b/packages/babel-preset-env/test/fixtures/preset-options/targets-as-string/options.json new file mode 100644 index 0000000000..3f0564700a --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/preset-options/targets-as-string/options.json @@ -0,0 +1,8 @@ +{ + "presets": [ + ["../../../../lib", { + "targets": "chrome 55", + "modules": false + }] + ] +} diff --git a/packages/babel-preset-env/test/fixtures/preset-options/targets-as-string/output.mjs b/packages/babel-preset-env/test/fixtures/preset-options/targets-as-string/output.mjs new file mode 100644 index 0000000000..54b82a09ad --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/preset-options/targets-as-string/output.mjs @@ -0,0 +1 @@ +const a = 1; diff --git a/packages/babel-preset-env/test/targets-parser.spec.js b/packages/babel-preset-env/test/targets-parser.spec.js index 59bba47af6..fe6e2fac31 100644 --- a/packages/babel-preset-env/test/targets-parser.spec.js +++ b/packages/babel-preset-env/test/targets-parser.spec.js @@ -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({