From 35f8149d98c1ed2b50979c3034e1c8da19b4255f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Fri, 19 Mar 2021 13:11:39 +0100 Subject: [PATCH] Resolve `.browserslistrc` as a project-wide file --- packages/babel-core/src/config/partial.js | 2 +- .../src/config/resolve-targets-browser.js | 2 +- .../babel-core/src/config/resolve-targets.js | 6 +++--- .../targets/node_modules/dep/.babelrc.json | 3 +++ .../dep}/.browserslistrc | 0 packages/babel-core/test/targets.js | 17 +++++++++++++++-- packages/babel-preset-env/test/regressions.js | 12 +++++++----- 7 files changed, 30 insertions(+), 12 deletions(-) create mode 100644 packages/babel-core/test/fixtures/targets/node_modules/dep/.babelrc.json rename packages/babel-core/test/fixtures/targets/{nested => node_modules/dep}/.browserslistrc (100%) diff --git a/packages/babel-core/src/config/partial.js b/packages/babel-core/src/config/partial.js index 5d74daa00ec0..714689cd1e35 100644 --- a/packages/babel-core/src/config/partial.js +++ b/packages/babel-core/src/config/partial.js @@ -126,7 +126,7 @@ export default function* loadPrivatePartialConfig( const options: NormalizedOptions = { ...merged, - targets: resolveTargets(merged, absoluteRootDir, filename), + targets: resolveTargets(merged, absoluteRootDir, absoluteRootDir), // Tack the passes onto the object itself so that, if this object is // passed back to Babel a second time, it will be in the right structure diff --git a/packages/babel-core/src/config/resolve-targets-browser.js b/packages/babel-core/src/config/resolve-targets-browser.js index 751b4a2a160e..eee0f115b7b5 100644 --- a/packages/babel-core/src/config/resolve-targets-browser.js +++ b/packages/babel-core/src/config/resolve-targets-browser.js @@ -8,7 +8,7 @@ export function resolveTargets( // eslint-disable-next-line no-unused-vars root: string, // eslint-disable-next-line no-unused-vars - filename: string | void, + configFilePath: string | void, ): Targets { let { targets } = options; if (typeof targets === "string" || Array.isArray(targets)) { diff --git a/packages/babel-core/src/config/resolve-targets.js b/packages/babel-core/src/config/resolve-targets.js index b65bab7ff3e9..c612bbfd85b5 100644 --- a/packages/babel-core/src/config/resolve-targets.js +++ b/packages/babel-core/src/config/resolve-targets.js @@ -14,7 +14,7 @@ import getTargets, { type Targets } from "@babel/helper-compilation-targets"; export function resolveTargets( options: ValidatedOptions, root: string, - filename: string | void, + configFilePath: string = root, ): Targets { let { targets } = options; if (typeof targets === "string" || Array.isArray(targets)) { @@ -27,13 +27,13 @@ export function resolveTargets( let configFile; if (typeof options.browserslistConfigFile === "string") { - configFile = path.resolve(root, options.browserslistConfigFile); + configFile = path.resolve(configFilePath, options.browserslistConfigFile); } return getTargets((targets: any), { ignoreBrowserslistConfig: options.browserslistConfigFile === false, configFile, - configPath: filename ?? root, + configPath: root, browserslistEnv: options.browserslistEnv, }); } diff --git a/packages/babel-core/test/fixtures/targets/node_modules/dep/.babelrc.json b/packages/babel-core/test/fixtures/targets/node_modules/dep/.babelrc.json new file mode 100644 index 000000000000..d049335f7446 --- /dev/null +++ b/packages/babel-core/test/fixtures/targets/node_modules/dep/.babelrc.json @@ -0,0 +1,3 @@ +{ + "browserslistConfigFile": "./.browserslistrc" +} diff --git a/packages/babel-core/test/fixtures/targets/nested/.browserslistrc b/packages/babel-core/test/fixtures/targets/node_modules/dep/.browserslistrc similarity index 100% rename from packages/babel-core/test/fixtures/targets/nested/.browserslistrc rename to packages/babel-core/test/fixtures/targets/node_modules/dep/.browserslistrc diff --git a/packages/babel-core/test/targets.js b/packages/babel-core/test/targets.js index c90e921df3e5..08592127abcd 100644 --- a/packages/babel-core/test/targets.js +++ b/packages/babel-core/test/targets.js @@ -91,11 +91,24 @@ describe("browserslist", () => { ).toEqual({ chrome: "80.0.0" }); }); - it("loads .browserslistrc relative to the input file", () => { + it("loads .browserslistrc relative to the root", () => { expect( loadOptions({ cwd: join(cwd, "fixtures", "targets"), - filename: "./nested/test.js", + filename: "./node_modules/dep/test.js", + }).targets, + ).toEqual({ chrome: "80.0.0" }); + }); + + // TODO: browserslistConfig is currently resolved starting from the root + // rather than from the config file. + // eslint-disable-next-line jest/no-disabled-tests + it.skip("loads nested .browserslistrc files if explicitly specified", () => { + expect( + loadOptions({ + cwd: join(cwd, "fixtures", "targets"), + filename: "./node_modules/dep/test.js", + babelrcRoots: ["./node_modules/dep/"], }).targets, ).toEqual({ edge: "14.0.0" }); }); diff --git a/packages/babel-preset-env/test/regressions.js b/packages/babel-preset-env/test/regressions.js index 9f201b0adb3e..50fb6ef2db47 100644 --- a/packages/babel-preset-env/test/regressions.js +++ b/packages/babel-preset-env/test/regressions.js @@ -5,17 +5,19 @@ import { fileURLToPath } from "url"; describe("#12880", () => { it("read the .browserslistrc file when using @babel/core < 7.13.0", () => { + const root = path.join( + path.dirname(fileURLToPath(import.meta.url)), + "regressions", + ); + // The browserslistrc file contains "firefox 50". // a ** b is supported starting from firefox 52; // a => b is supported starting from firefox 45. const out = babel7_12.transformSync("a ** b; a => b;", { configFile: false, presets: [[env, { modules: false }]], - filename: path.join( - path.dirname(fileURLToPath(import.meta.url)), - "regressions", - "input.js", - ), + filename: path.join(root, "input.js"), + root, }); expect(out.code).toMatchInlineSnapshot(`