From 77fd7cd4c4eb0c1c38059f0a85b5afb7a33fc3d1 Mon Sep 17 00:00:00 2001 From: Brian Ng Date: Sun, 30 Jun 2019 04:00:43 -0500 Subject: [PATCH] Allow `defaults` query in preset-env (#8897) --- packages/babel-preset-env/src/targets-parser.js | 16 ++++++++++++++-- .../browserslist-default-via-config/browserslist | 1 + .../browserslist-default-via-config/input.mjs | 1 + .../browserslist-default-via-config/options.json | 11 +++++++++++ .../browserslist-default-via-config/output.mjs | 3 +++ .../browserslist-defaults-2/input.mjs | 1 + .../browserslist-defaults-2/options.json | 13 +++++++++++++ .../browserslist-defaults-2/output.js | 16 ++++++++++++++++ .../browserslist-defaults/input.mjs | 1 + .../browserslist-defaults/options.json | 12 ++++++++++++ .../browserslist-defaults/output.js | 5 +++++ .../babel-preset-env/test/targets-parser.spec.js | 9 +++++++++ 12 files changed, 87 insertions(+), 2 deletions(-) create mode 100644 packages/babel-preset-env/test/fixtures/preset-options/browserslist-default-via-config/browserslist create mode 100644 packages/babel-preset-env/test/fixtures/preset-options/browserslist-default-via-config/input.mjs create mode 100644 packages/babel-preset-env/test/fixtures/preset-options/browserslist-default-via-config/options.json create mode 100644 packages/babel-preset-env/test/fixtures/preset-options/browserslist-default-via-config/output.mjs create mode 100644 packages/babel-preset-env/test/fixtures/preset-options/browserslist-defaults-2/input.mjs create mode 100644 packages/babel-preset-env/test/fixtures/preset-options/browserslist-defaults-2/options.json create mode 100644 packages/babel-preset-env/test/fixtures/preset-options/browserslist-defaults-2/output.js create mode 100644 packages/babel-preset-env/test/fixtures/preset-options/browserslist-defaults/input.mjs create mode 100644 packages/babel-preset-env/test/fixtures/preset-options/browserslist-defaults/options.json create mode 100644 packages/babel-preset-env/test/fixtures/preset-options/browserslist-defaults/output.js diff --git a/packages/babel-preset-env/src/targets-parser.js b/packages/babel-preset-env/src/targets-parser.js index 30cff53431f0..4c006bf2f073 100644 --- a/packages/babel-preset-env/src/targets-parser.js +++ b/packages/babel-preset-env/src/targets-parser.js @@ -68,6 +68,7 @@ const validateBrowsers = browsers => { typeof browsers === "undefined" || isBrowsersQueryValid(browsers), `Invalid Option: '${browsers}' is not a valid browserslist query`, ); + return browsers; }; @@ -194,12 +195,23 @@ const getTargets = (targets: Object = {}, options: Object = {}): Targets => { // Parse browsers target via browserslist const browsersquery = validateBrowsers(targets.browsers); + + const hasTargets = Object.keys(targets).length > 0; const shouldParseBrowsers = !!targets.browsers; const shouldSearchForConfig = - !options.ignoreBrowserslistConfig && !Object.keys(targets).length; + !options.ignoreBrowserslistConfig && !hasTargets; if (shouldParseBrowsers || shouldSearchForConfig) { - browserslist.defaults = objectToBrowserslist(targets); + // If no targets are passed, we need to overwrite browserslist's defaults + // so that we enable all transforms (acting like the now deprecated + // preset-latest). + // + // Note, if browserslist resolves the config (ex. package.json), then usage + // of `defaults` in queries will be different since we don't want to break + // the behavior of "no targets is the same as preset-latest". + if (!hasTargets) { + browserslist.defaults = objectToBrowserslist(targets); + } const browsers = browserslist(browsersquery, { path: options.configPath, diff --git a/packages/babel-preset-env/test/fixtures/preset-options/browserslist-default-via-config/browserslist b/packages/babel-preset-env/test/fixtures/preset-options/browserslist-default-via-config/browserslist new file mode 100644 index 000000000000..e94f8140cc00 --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/preset-options/browserslist-default-via-config/browserslist @@ -0,0 +1 @@ +defaults diff --git a/packages/babel-preset-env/test/fixtures/preset-options/browserslist-default-via-config/input.mjs b/packages/babel-preset-env/test/fixtures/preset-options/browserslist-default-via-config/input.mjs new file mode 100644 index 000000000000..bf68e2dbd8c9 --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/preset-options/browserslist-default-via-config/input.mjs @@ -0,0 +1 @@ +const test = () => ""; diff --git a/packages/babel-preset-env/test/fixtures/preset-options/browserslist-default-via-config/options.json b/packages/babel-preset-env/test/fixtures/preset-options/browserslist-default-via-config/options.json new file mode 100644 index 000000000000..678d07617515 --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/preset-options/browserslist-default-via-config/options.json @@ -0,0 +1,11 @@ +{ + "presets": [ + [ + "../../../../lib", + { + "configPath": "packages/babel-preset-env/test/fixtures/preset-options/browserslist-default-via-config", + "modules": false + } + ] + ] +} diff --git a/packages/babel-preset-env/test/fixtures/preset-options/browserslist-default-via-config/output.mjs b/packages/babel-preset-env/test/fixtures/preset-options/browserslist-default-via-config/output.mjs new file mode 100644 index 000000000000..0b90fe8593a7 --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/preset-options/browserslist-default-via-config/output.mjs @@ -0,0 +1,3 @@ +var test = function test() { + return ""; +}; 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-2/input.mjs new file mode 100644 index 000000000000..e984854c838b --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/preset-options/browserslist-defaults-2/input.mjs @@ -0,0 +1 @@ +const test = (a, [b], c) => ""; 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-2/options.json new file mode 100644 index 000000000000..7ee0ee1a8a81 --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/preset-options/browserslist-defaults-2/options.json @@ -0,0 +1,13 @@ +{ + "presets": [ + [ + "../../../../lib", + { + "targets": { + "node": "current", + "browsers": ["defaults", "not ie <= 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-2/output.js new file mode 100644 index 000000000000..f894dda6a490 --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/preset-options/browserslist-defaults-2/output.js @@ -0,0 +1,16 @@ +"use strict"; + +function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } + +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } + +function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } + +function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } + +var test = function test(a, _ref, c) { + var _ref2 = _slicedToArray(_ref, 1), + b = _ref2[0]; + + return ""; +}; diff --git a/packages/babel-preset-env/test/fixtures/preset-options/browserslist-defaults/input.mjs b/packages/babel-preset-env/test/fixtures/preset-options/browserslist-defaults/input.mjs new file mode 100644 index 000000000000..bf68e2dbd8c9 --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/preset-options/browserslist-defaults/input.mjs @@ -0,0 +1 @@ +const test = () => ""; diff --git a/packages/babel-preset-env/test/fixtures/preset-options/browserslist-defaults/options.json b/packages/babel-preset-env/test/fixtures/preset-options/browserslist-defaults/options.json new file mode 100644 index 000000000000..fb7e8d2043b6 --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/preset-options/browserslist-defaults/options.json @@ -0,0 +1,12 @@ +{ + "presets": [ + [ + "../../../../lib", + { + "targets": { + "browsers": "defaults" + } + } + ] + ] +} diff --git a/packages/babel-preset-env/test/fixtures/preset-options/browserslist-defaults/output.js b/packages/babel-preset-env/test/fixtures/preset-options/browserslist-defaults/output.js new file mode 100644 index 000000000000..a5703ba6f53d --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/preset-options/browserslist-defaults/output.js @@ -0,0 +1,5 @@ +"use strict"; + +var test = function test() { + return ""; +}; diff --git a/packages/babel-preset-env/test/targets-parser.spec.js b/packages/babel-preset-env/test/targets-parser.spec.js index 95e9a3ef41fe..7b9f669d2d01 100644 --- a/packages/babel-preset-env/test/targets-parser.spec.js +++ b/packages/babel-preset-env/test/targets-parser.spec.js @@ -20,6 +20,15 @@ describe("getTargets", () => { }); }); + it("allows 'defaults' query", () => { + const browserslistDefaults = browserslist.defaults; + + const expected = getTargets({ browsers: browserslistDefaults }); + const actual = getTargets({ browsers: "defaults" }); + + expect(actual).toEqual(expected); + }); + it("does not clobber browserslists defaults", () => { const browserslistDefaults = browserslist.defaults;