From 1add69749949eded88eb7015cbec5d0b5a004fff Mon Sep 17 00:00:00 2001 From: Andrew Leedham Date: Thu, 16 Apr 2020 19:38:46 +0100 Subject: [PATCH 1/6] feat: add browserslistEnv option --- .../src/index.js | 1 + packages/babel-preset-env/src/index.js | 3 ++- .../babel-preset-env/src/normalize-options.js | 21 +++++++++++++++++++ packages/babel-preset-env/src/options.js | 1 + packages/babel-preset-env/src/types.js | 1 + 5 files changed, 26 insertions(+), 1 deletion(-) diff --git a/packages/babel-helper-compilation-targets/src/index.js b/packages/babel-helper-compilation-targets/src/index.js index 2dc02aba0348..97223e61b2c6 100644 --- a/packages/babel-helper-compilation-targets/src/index.js +++ b/packages/babel-helper-compilation-targets/src/index.js @@ -205,6 +205,7 @@ export default function getTargets( const browsers = browserslist(browsersquery, { path: options.configPath, mobileToDesktop: true, + env: options.browserslistEnv, }); const queryBrowsers = getLowestVersions(browsers); diff --git a/packages/babel-preset-env/src/index.js b/packages/babel-preset-env/src/index.js index 0f42e86bd62b..6c605b49011a 100644 --- a/packages/babel-preset-env/src/index.js +++ b/packages/babel-preset-env/src/index.js @@ -228,6 +228,7 @@ export default declare((api, opts) => { targets: optionsTargets, useBuiltIns, corejs: { version: corejs, proposals }, + browserslistEnv, } = normalizeOptions(opts); // TODO: remove this in next major let hasUglifyTarget = false; @@ -257,7 +258,7 @@ export default declare((api, opts) => { const targets = getTargets( // $FlowIgnore optionsTargets doesn't have an "uglify" property anymore (optionsTargets: InputTargets), - { ignoreBrowserslistConfig, configPath }, + { ignoreBrowserslistConfig, configPath, browserslistEnv }, ); const include = transformIncludesAndExcludes(optionsInclude); const exclude = transformIncludesAndExcludes(optionsExclude); diff --git a/packages/babel-preset-env/src/normalize-options.js b/packages/babel-preset-env/src/normalize-options.js index 04e4d823ba85..d4a7f873740b 100644 --- a/packages/babel-preset-env/src/normalize-options.js +++ b/packages/babel-preset-env/src/normalize-options.js @@ -152,6 +152,22 @@ export const validateBoolOption = ( return value; }; +export const validateStringOption = ( + name: string, + value?: string, + defaultValue: string, +) => { + if (typeof value === "undefined") { + value = defaultValue; + } + + if (typeof value !== "string") { + throw new Error(`Preset env: '${name}' option must be a string.`); + } + + return value; +}; + export const validateIgnoreBrowserslistConfig = ( ignoreBrowserslistConfig: boolean, ) => @@ -295,5 +311,10 @@ export default function normalizeOptions(opts: Options) { spec: validateBoolOption(TopLevelOptions.spec, opts.spec, false), targets: normalizeTargets(opts.targets), useBuiltIns: useBuiltIns, + browserslistEnv: validateStringOption( + TopLevelOptions.browserslistEnv, + opts.browserslistEnv, + "production", + ), }; } diff --git a/packages/babel-preset-env/src/options.js b/packages/babel-preset-env/src/options.js index 6ebfff2e0838..23460e14d534 100644 --- a/packages/babel-preset-env/src/options.js +++ b/packages/babel-preset-env/src/options.js @@ -15,6 +15,7 @@ export const TopLevelOptions = { spec: "spec", targets: "targets", useBuiltIns: "useBuiltIns", + browserslistEnv: "browserslistEnv", }; export const ModulesOption = { diff --git a/packages/babel-preset-env/src/types.js b/packages/babel-preset-env/src/types.js index bcf25119e725..780344b55550 100644 --- a/packages/babel-preset-env/src/types.js +++ b/packages/babel-preset-env/src/types.js @@ -34,6 +34,7 @@ export type Options = { spec: boolean, targets: { ...InputTargets, uglify?: boolean }, useBuiltIns: BuiltInsOption, + browserslistEnv: string, }; // Babel From 095e95db01ff6927f5cc0a09661b8b0d1260cdc4 Mon Sep 17 00:00:00 2001 From: Andrew Leedham Date: Thu, 16 Apr 2020 19:38:59 +0100 Subject: [PATCH 2/6] test: browserslistEnv option --- .../test/.browserslistrc | 2 + .../test/targets-parser.spec.js | 9 ++++ .../debug/browserslist-env/.browserslistrc | 2 + .../fixtures/debug/browserslist-env/input.mjs | 1 + .../debug/browserslist-env/options.js | 14 ++++++ .../debug/browserslist-env/stdout.txt | 44 +++++++++++++++++++ .../test/normalize-options.spec.js | 19 ++++++++ 7 files changed, 91 insertions(+) create mode 100644 packages/babel-helper-compilation-targets/test/.browserslistrc create mode 100644 packages/babel-preset-env/test/fixtures/debug/browserslist-env/.browserslistrc create mode 100644 packages/babel-preset-env/test/fixtures/debug/browserslist-env/input.mjs create mode 100644 packages/babel-preset-env/test/fixtures/debug/browserslist-env/options.js create mode 100644 packages/babel-preset-env/test/fixtures/debug/browserslist-env/stdout.txt diff --git a/packages/babel-helper-compilation-targets/test/.browserslistrc b/packages/babel-helper-compilation-targets/test/.browserslistrc new file mode 100644 index 000000000000..c1b9aca4322e --- /dev/null +++ b/packages/babel-helper-compilation-targets/test/.browserslistrc @@ -0,0 +1,2 @@ +[custom] +ie 11 \ No newline at end of file diff --git a/packages/babel-helper-compilation-targets/test/targets-parser.spec.js b/packages/babel-helper-compilation-targets/test/targets-parser.spec.js index 2c4f1335ef22..0c0f1c40993a 100644 --- a/packages/babel-helper-compilation-targets/test/targets-parser.spec.js +++ b/packages/babel-helper-compilation-targets/test/targets-parser.spec.js @@ -29,6 +29,15 @@ describe("getTargets", () => { expect(actual).toEqual(expected); }); + it("allows custom browserslist env", () => { + const actual = getTargets( + {}, + { configPath: __dirname, browserslistEnv: "custom" }, + ); + + expect(actual).toEqual({ ie: "11.0.0" }); + }); + it("does not clobber browserslists defaults", () => { const browserslistDefaults = browserslist.defaults; diff --git a/packages/babel-preset-env/test/fixtures/debug/browserslist-env/.browserslistrc b/packages/babel-preset-env/test/fixtures/debug/browserslist-env/.browserslistrc new file mode 100644 index 000000000000..c1b9aca4322e --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/debug/browserslist-env/.browserslistrc @@ -0,0 +1,2 @@ +[custom] +ie 11 \ No newline at end of file diff --git a/packages/babel-preset-env/test/fixtures/debug/browserslist-env/input.mjs b/packages/babel-preset-env/test/fixtures/debug/browserslist-env/input.mjs new file mode 100644 index 000000000000..c3fee8a17564 --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/debug/browserslist-env/input.mjs @@ -0,0 +1 @@ +import "core-js"; diff --git a/packages/babel-preset-env/test/fixtures/debug/browserslist-env/options.js b/packages/babel-preset-env/test/fixtures/debug/browserslist-env/options.js new file mode 100644 index 000000000000..37fa9d228b33 --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/debug/browserslist-env/options.js @@ -0,0 +1,14 @@ +module.exports = { + validateLogs: true, + ignoreOutput: true, + presets: [ + [ + "env", + { + debug: true, + browserslistEnv: "custom", + configPath: __dirname, + }, + ], + ], +}; diff --git a/packages/babel-preset-env/test/fixtures/debug/browserslist-env/stdout.txt b/packages/babel-preset-env/test/fixtures/debug/browserslist-env/stdout.txt new file mode 100644 index 000000000000..a3aa55eb9cd6 --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/debug/browserslist-env/stdout.txt @@ -0,0 +1,44 @@ +@babel/preset-env: `DEBUG` option + +Using targets: +{ + "ie": "11" +} + +Using modules transform: auto + +Using plugins: + proposal-nullish-coalescing-operator { "ie":"11" } + proposal-optional-chaining { "ie":"11" } + proposal-json-strings { "ie":"11" } + proposal-optional-catch-binding { "ie":"11" } + transform-parameters { "ie":"11" } + proposal-async-generator-functions { "ie":"11" } + proposal-object-rest-spread { "ie":"11" } + transform-dotall-regex { "ie":"11" } + proposal-unicode-property-regex { "ie":"11" } + transform-named-capturing-groups-regex { "ie":"11" } + transform-async-to-generator { "ie":"11" } + transform-exponentiation-operator { "ie":"11" } + transform-template-literals { "ie":"11" } + transform-literals { "ie":"11" } + transform-function-name { "ie":"11" } + transform-arrow-functions { "ie":"11" } + transform-classes { "ie":"11" } + transform-object-super { "ie":"11" } + transform-shorthand-properties { "ie":"11" } + transform-duplicate-keys { "ie":"11" } + transform-computed-properties { "ie":"11" } + transform-for-of { "ie":"11" } + transform-sticky-regex { "ie":"11" } + transform-unicode-regex { "ie":"11" } + transform-spread { "ie":"11" } + transform-destructuring { "ie":"11" } + transform-block-scoping { "ie":"11" } + transform-typeof-symbol { "ie":"11" } + transform-new-target { "ie":"11" } + transform-regenerator { "ie":"11" } + transform-modules-commonjs { "ie":"11" } + proposal-dynamic-import { "ie":"11" } + +Using polyfills: No polyfills were added, since the `useBuiltIns` option was not set. diff --git a/packages/babel-preset-env/test/normalize-options.spec.js b/packages/babel-preset-env/test/normalize-options.spec.js index 62636e4882cf..869e864051d4 100644 --- a/packages/babel-preset-env/test/normalize-options.spec.js +++ b/packages/babel-preset-env/test/normalize-options.spec.js @@ -5,6 +5,7 @@ const normalizeOptions = require("../lib/normalize-options.js"); const { checkDuplicateIncludeExcludes, validateBoolOption, + validateStringOption, validateModulesOption, validateUseBuiltInsOption, normalizePluginName, @@ -191,6 +192,24 @@ describe("normalize-options", () => { }); }); + describe("validateStringOption", () => { + it("`undefined` option default", () => { + expect(validateStringOption("test", undefined, "default")).toBe( + "default", + ); + }); + + it("`value` option returns value", () => { + expect(validateStringOption("test", "value", "default")).toBe("value"); + }); + + it("array option is invalid", () => { + expect(() => { + validateStringOption("test", [], "default"); + }).toThrow(); + }); + }); + describe("checkDuplicateIncludeExcludes", function() { it("should throw if duplicate names in both", function() { expect(() => { From 4afeef543d8bab7b782a7b7a26f59c4bf0bbe2db Mon Sep 17 00:00:00 2001 From: Andrew Leedham Date: Thu, 16 Apr 2020 21:24:38 +0100 Subject: [PATCH 3/6] refactor: default browserslistEnv to undefined --- packages/babel-preset-env/src/normalize-options.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/babel-preset-env/src/normalize-options.js b/packages/babel-preset-env/src/normalize-options.js index d4a7f873740b..c6a451b72242 100644 --- a/packages/babel-preset-env/src/normalize-options.js +++ b/packages/babel-preset-env/src/normalize-options.js @@ -155,13 +155,13 @@ export const validateBoolOption = ( export const validateStringOption = ( name: string, value?: string, - defaultValue: string, + defaultValue?: string, ) => { if (typeof value === "undefined") { value = defaultValue; } - if (typeof value !== "string") { + if (typeof value !== "string" && typeof value !== "undefined") { throw new Error(`Preset env: '${name}' option must be a string.`); } @@ -314,7 +314,6 @@ export default function normalizeOptions(opts: Options) { browserslistEnv: validateStringOption( TopLevelOptions.browserslistEnv, opts.browserslistEnv, - "production", ), }; } From 8c56e76d40ee9c22a23bd4f669c21d12b81ee697 Mon Sep 17 00:00:00 2001 From: Andrew Leedham Date: Thu, 16 Apr 2020 22:35:03 +0100 Subject: [PATCH 4/6] refactor: validateStringOption else if --- packages/babel-preset-env/src/normalize-options.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/babel-preset-env/src/normalize-options.js b/packages/babel-preset-env/src/normalize-options.js index c6a451b72242..f86621f5715b 100644 --- a/packages/babel-preset-env/src/normalize-options.js +++ b/packages/babel-preset-env/src/normalize-options.js @@ -159,9 +159,7 @@ export const validateStringOption = ( ) => { if (typeof value === "undefined") { value = defaultValue; - } - - if (typeof value !== "string" && typeof value !== "undefined") { + } else if (typeof value !== "string") { throw new Error(`Preset env: '${name}' option must be a string.`); } From 3604baeddb14744477c44d83548b457d869892d8 Mon Sep 17 00:00:00 2001 From: Andrew Leedham Date: Thu, 16 Apr 2020 22:59:08 +0100 Subject: [PATCH 5/6] test: no default --- packages/babel-preset-env/test/normalize-options.spec.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/babel-preset-env/test/normalize-options.spec.js b/packages/babel-preset-env/test/normalize-options.spec.js index 869e864051d4..959cb09fd611 100644 --- a/packages/babel-preset-env/test/normalize-options.spec.js +++ b/packages/babel-preset-env/test/normalize-options.spec.js @@ -203,6 +203,10 @@ describe("normalize-options", () => { expect(validateStringOption("test", "value", "default")).toBe("value"); }); + it("no default returns undefined", () => { + expect(validateStringOption("test", undefined)).toBe(undefined); + }); + it("array option is invalid", () => { expect(() => { validateStringOption("test", [], "default"); From a71b140e65fd8733a7cbd1aea97e74ebeb135659 Mon Sep 17 00:00:00 2001 From: Andrew Leedham Date: Fri, 17 Apr 2020 19:29:11 +0100 Subject: [PATCH 6/6] test: scope babel-helper-complication-targets test --- .../test/{ => custom-browserslist-env}/.browserslistrc | 0 .../custom-browserslist-env.spec.js | 10 ++++++++++ .../test/targets-parser.spec.js | 9 --------- 3 files changed, 10 insertions(+), 9 deletions(-) rename packages/babel-helper-compilation-targets/test/{ => custom-browserslist-env}/.browserslistrc (100%) create mode 100644 packages/babel-helper-compilation-targets/test/custom-browserslist-env/custom-browserslist-env.spec.js diff --git a/packages/babel-helper-compilation-targets/test/.browserslistrc b/packages/babel-helper-compilation-targets/test/custom-browserslist-env/.browserslistrc similarity index 100% rename from packages/babel-helper-compilation-targets/test/.browserslistrc rename to packages/babel-helper-compilation-targets/test/custom-browserslist-env/.browserslistrc diff --git a/packages/babel-helper-compilation-targets/test/custom-browserslist-env/custom-browserslist-env.spec.js b/packages/babel-helper-compilation-targets/test/custom-browserslist-env/custom-browserslist-env.spec.js new file mode 100644 index 000000000000..953d510a07c8 --- /dev/null +++ b/packages/babel-helper-compilation-targets/test/custom-browserslist-env/custom-browserslist-env.spec.js @@ -0,0 +1,10 @@ +import getTargets from "../.."; + +it("allows custom browserslist env", () => { + const actual = getTargets( + {}, + { configPath: __dirname, browserslistEnv: "custom" }, + ); + + expect(actual).toEqual({ ie: "11.0.0" }); +}); diff --git a/packages/babel-helper-compilation-targets/test/targets-parser.spec.js b/packages/babel-helper-compilation-targets/test/targets-parser.spec.js index 0c0f1c40993a..2c4f1335ef22 100644 --- a/packages/babel-helper-compilation-targets/test/targets-parser.spec.js +++ b/packages/babel-helper-compilation-targets/test/targets-parser.spec.js @@ -29,15 +29,6 @@ describe("getTargets", () => { expect(actual).toEqual(expected); }); - it("allows custom browserslist env", () => { - const actual = getTargets( - {}, - { configPath: __dirname, browserslistEnv: "custom" }, - ); - - expect(actual).toEqual({ ie: "11.0.0" }); - }); - it("does not clobber browserslists defaults", () => { const browserslistDefaults = browserslist.defaults;