diff --git a/packages/babel-helper-compilation-targets/src/index.js b/packages/babel-helper-compilation-targets/src/index.js index 97223e61b2c6..33a534beb14c 100644 --- a/packages/babel-helper-compilation-targets/src/index.js +++ b/packages/babel-helper-compilation-targets/src/index.js @@ -166,24 +166,26 @@ export default function getTargets( options: Object = {}, ): Targets { const targetOpts: Targets = {}; + let { browsers } = inputTargets; // `esmodules` as a target indicates the specific set of browsers supporting ES Modules. // These values OVERRIDE the `browsers` field. if (inputTargets.esmodules) { const supportsESModules = browserModulesData["es6.module"]; - inputTargets.browsers = Object.keys(supportsESModules) + browsers = Object.keys(supportsESModules) .map(browser => `${browser} ${supportsESModules[browser]}`) .join(", "); } - // Remove esmodules after being consumed to fix `hasTargets` below - delete inputTargets.esmodules; - // Parse browsers target via browserslist - const browsersquery = validateBrowsers(inputTargets.browsers); - delete inputTargets.browsers; + const browsersquery = validateBrowsers(browsers); + + // Remove esmodules after being consumed to fix `hasTargets` below + const input = { ...inputTargets }; + delete input.esmodules; + delete input.browsers; - let targets: Targets = validateTargetNames(inputTargets); + let targets: Targets = validateTargetNames(input); const shouldParseBrowsers = !!browsersquery; const hasTargets = shouldParseBrowsers || Object.keys(targets).length > 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 2c4f1335ef22..f44ae0060197 100644 --- a/packages/babel-helper-compilation-targets/test/targets-parser.spec.js +++ b/packages/babel-helper-compilation-targets/test/targets-parser.spec.js @@ -20,6 +20,18 @@ describe("getTargets", () => { }); }); + it("does not mutate the input", () => { + const input = Object.freeze({ browsers: "defaults", esmodules: true }); + const expected = getTargets({ + browsers: browserslist.defaults, + esmodules: true, + }); + const actual = getTargets(input); + expect(actual).toEqual(expected); + expect(input.browsers).toEqual("defaults"); + expect(input.esmodules).toEqual(true); + }); + it("allows 'defaults' query", () => { const browserslistDefaults = browserslist.defaults;