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:
Devon Govett 2019-10-29 11:37:50 -07:00 committed by Nicolò Ribaudo
parent 38a3063111
commit 3a5e8a8dd4
6 changed files with 88 additions and 6 deletions

View File

@ -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(

View File

@ -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");

View File

@ -0,0 +1,3 @@
module.exports = {
comments: true
};

View File

@ -0,0 +1,3 @@
{
"comments": true
}

View File

@ -0,0 +1,3 @@
module.exports = {
comments: true
};

View File

@ -0,0 +1,3 @@
{
"comments": true
}