From c5ba345ac26d90fb5da8954f00f5c7285ee5ada8 Mon Sep 17 00:00:00 2001 From: Andrew Leedham Date: Sun, 24 May 2020 22:44:39 +0100 Subject: [PATCH] [`preset-env`] Add `browserslistEnv` option (#11434) --- .../src/index.js | 1 + .../custom-browserslist-env/.browserslistrc | 2 + .../custom-browserslist-env.spec.js | 10 +++++ packages/babel-preset-env/src/index.js | 3 +- .../babel-preset-env/src/normalize-options.js | 18 ++++++++ packages/babel-preset-env/src/options.js | 1 + packages/babel-preset-env/src/types.js | 1 + .../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 | 23 ++++++++++ 12 files changed, 119 insertions(+), 1 deletion(-) create mode 100644 packages/babel-helper-compilation-targets/test/custom-browserslist-env/.browserslistrc create mode 100644 packages/babel-helper-compilation-targets/test/custom-browserslist-env/custom-browserslist-env.spec.js 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/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-helper-compilation-targets/test/custom-browserslist-env/.browserslistrc b/packages/babel-helper-compilation-targets/test/custom-browserslist-env/.browserslistrc new file mode 100644 index 000000000000..c1b9aca4322e --- /dev/null +++ b/packages/babel-helper-compilation-targets/test/custom-browserslist-env/.browserslistrc @@ -0,0 +1,2 @@ +[custom] +ie 11 \ No newline at end of file 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-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..f86621f5715b 100644 --- a/packages/babel-preset-env/src/normalize-options.js +++ b/packages/babel-preset-env/src/normalize-options.js @@ -152,6 +152,20 @@ export const validateBoolOption = ( return value; }; +export const validateStringOption = ( + name: string, + value?: string, + defaultValue?: string, +) => { + if (typeof value === "undefined") { + value = defaultValue; + } else if (typeof value !== "string") { + throw new Error(`Preset env: '${name}' option must be a string.`); + } + + return value; +}; + export const validateIgnoreBrowserslistConfig = ( ignoreBrowserslistConfig: boolean, ) => @@ -295,5 +309,9 @@ 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, + ), }; } 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 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..959cb09fd611 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,28 @@ 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("no default returns undefined", () => { + expect(validateStringOption("test", undefined)).toBe(undefined); + }); + + it("array option is invalid", () => { + expect(() => { + validateStringOption("test", [], "default"); + }).toThrow(); + }); + }); + describe("checkDuplicateIncludeExcludes", function() { it("should throw if duplicate names in both", function() { expect(() => {