Add support for babel.config.json (#10501)
* Add support for babel.config.json root config * Throw if multiple configuration files are found * Add tests
This commit is contained in:
parent
38a3063111
commit
3a5e8a8dd4
@ -19,6 +19,11 @@ import type { CallerMetadata } from "../validation/options";
|
|||||||
const debug = buildDebug("babel:config:loading:files:configuration");
|
const debug = buildDebug("babel:config:loading:files:configuration");
|
||||||
|
|
||||||
const BABEL_CONFIG_JS_FILENAME = "babel.config.js";
|
const BABEL_CONFIG_JS_FILENAME = "babel.config.js";
|
||||||
|
const BABEL_CONFIG_JSON_FILENAME = "babel.config.json";
|
||||||
|
const ROOT_CONFIG_FILENAMES = [
|
||||||
|
BABEL_CONFIG_JS_FILENAME,
|
||||||
|
BABEL_CONFIG_JSON_FILENAME,
|
||||||
|
];
|
||||||
|
|
||||||
const BABELRC_FILENAME = ".babelrc";
|
const BABELRC_FILENAME = ".babelrc";
|
||||||
const BABELRC_JS_FILENAME = ".babelrc.js";
|
const BABELRC_JS_FILENAME = ".babelrc.js";
|
||||||
@ -27,7 +32,10 @@ const BABELIGNORE_FILENAME = ".babelignore";
|
|||||||
export function findConfigUpwards(rootDir: string): string | null {
|
export function findConfigUpwards(rootDir: string): string | null {
|
||||||
let dirname = rootDir;
|
let dirname = rootDir;
|
||||||
while (true) {
|
while (true) {
|
||||||
if (fs.existsSync(path.join(dirname, BABEL_CONFIG_JS_FILENAME))) {
|
if (
|
||||||
|
fs.existsSync(path.join(dirname, BABEL_CONFIG_JS_FILENAME)) ||
|
||||||
|
fs.existsSync(path.join(dirname, BABEL_CONFIG_JSON_FILENAME))
|
||||||
|
) {
|
||||||
return dirname;
|
return dirname;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -110,13 +118,29 @@ export function findRootConfig(
|
|||||||
envName: string,
|
envName: string,
|
||||||
caller: CallerMetadata | void,
|
caller: CallerMetadata | void,
|
||||||
): ConfigFile | null {
|
): ConfigFile | null {
|
||||||
const filepath = path.resolve(dirname, BABEL_CONFIG_JS_FILENAME);
|
const config = ROOT_CONFIG_FILENAMES.reduce(
|
||||||
|
(previousConfig: ConfigFile | null, name) => {
|
||||||
|
const filepath = path.resolve(dirname, name);
|
||||||
|
const config = readConfig(filepath, envName, caller);
|
||||||
|
|
||||||
const conf = readConfig(filepath, envName, caller);
|
if (config && previousConfig) {
|
||||||
if (conf) {
|
throw new Error(
|
||||||
debug("Found root config %o in %o.", BABEL_CONFIG_JS_FILENAME, dirname);
|
`Multiple configuration files found. Please remove one:\n` +
|
||||||
|
` - ${path.basename(previousConfig.filepath)}\n` +
|
||||||
|
` - ${name}\n` +
|
||||||
|
`from ${dirname}`,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
return conf;
|
|
||||||
|
return config || previousConfig;
|
||||||
|
},
|
||||||
|
null,
|
||||||
|
);
|
||||||
|
|
||||||
|
if (config) {
|
||||||
|
debug("Found configuration %o from %o.", config.filepath, dirname);
|
||||||
|
}
|
||||||
|
return config;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function loadConfig(
|
export function loadConfig(
|
||||||
|
|||||||
@ -944,6 +944,52 @@ describe("buildConfigChain", function() {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("should load babel.config.json", () => {
|
||||||
|
const filename = fixture("config-files", "babel-config-json", "src.js");
|
||||||
|
|
||||||
|
expect(
|
||||||
|
loadOptions({
|
||||||
|
filename,
|
||||||
|
cwd: path.dirname(filename),
|
||||||
|
}),
|
||||||
|
).toEqual({
|
||||||
|
...getDefaults(),
|
||||||
|
filename: filename,
|
||||||
|
cwd: path.dirname(filename),
|
||||||
|
root: path.dirname(filename),
|
||||||
|
comments: true,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should load babel.config.js", () => {
|
||||||
|
const filename = fixture("config-files", "babel-config-js", "src.js");
|
||||||
|
|
||||||
|
expect(
|
||||||
|
loadOptions({
|
||||||
|
filename,
|
||||||
|
cwd: path.dirname(filename),
|
||||||
|
}),
|
||||||
|
).toEqual({
|
||||||
|
...getDefaults(),
|
||||||
|
filename: filename,
|
||||||
|
cwd: path.dirname(filename),
|
||||||
|
root: path.dirname(filename),
|
||||||
|
comments: true,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should whtow if both babel.config.json and babel.config.js are used", () => {
|
||||||
|
const filename = fixture(
|
||||||
|
"config-files",
|
||||||
|
"babel-config-js-and-json",
|
||||||
|
"src.js",
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(() =>
|
||||||
|
loadOptions({ filename, cwd: path.dirname(filename) }),
|
||||||
|
).toThrow(/Multiple configuration files found/);
|
||||||
|
});
|
||||||
|
|
||||||
it("should load .babelrc", () => {
|
it("should load .babelrc", () => {
|
||||||
const filename = fixture("config-files", "babelrc", "src.js");
|
const filename = fixture("config-files", "babelrc", "src.js");
|
||||||
|
|
||||||
|
|||||||
@ -0,0 +1,3 @@
|
|||||||
|
module.exports = {
|
||||||
|
comments: true
|
||||||
|
};
|
||||||
@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"comments": true
|
||||||
|
}
|
||||||
3
packages/babel-core/test/fixtures/config/config-files/babel-config-js/babel.config.js
vendored
Normal file
3
packages/babel-core/test/fixtures/config/config-files/babel-config-js/babel.config.js
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
module.exports = {
|
||||||
|
comments: true
|
||||||
|
};
|
||||||
3
packages/babel-core/test/fixtures/config/config-files/babel-config-json/babel.config.json
vendored
Normal file
3
packages/babel-core/test/fixtures/config/config-files/babel-config-json/babel.config.json
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"comments": true
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user