diff --git a/packages/babel-core/src/config/config-chain.js b/packages/babel-core/src/config/config-chain.js index 8bc89da8a6..258b2c725c 100644 --- a/packages/babel-core/src/config/config-chain.js +++ b/packages/babel-core/src/config/config-chain.js @@ -144,9 +144,14 @@ export function buildRootChain( let configFile; if (typeof opts.configFile === "string") { - configFile = loadConfig(opts.configFile, context.cwd, context.envName); + configFile = loadConfig( + opts.configFile, + context.cwd, + context.envName, + context.caller, + ); } else if (opts.configFile !== false) { - configFile = findRootConfig(context.root, context.envName); + configFile = findRootConfig(context.root, context.envName, context.caller); } let { babelrc, babelrcRoots } = opts; @@ -465,7 +470,12 @@ function mergeExtendsChain( ): boolean { if (opts.extends === undefined) return true; - const file = loadConfig(opts.extends, dirname, context.envName); + const file = loadConfig( + opts.extends, + dirname, + context.envName, + context.caller, + ); if (files.has(file)) { throw new Error( diff --git a/packages/babel-core/src/config/files/configuration.js b/packages/babel-core/src/config/files/configuration.js index 66b39cb2c0..b31519b43f 100644 --- a/packages/babel-core/src/config/files/configuration.js +++ b/packages/babel-core/src/config/files/configuration.js @@ -14,6 +14,7 @@ import makeAPI from "../helpers/config-api"; import { makeStaticFileCache } from "./utils"; import pathPatternToRegex from "../pattern-to-regex"; import type { FilePackageData, RelativeConfig, ConfigFile } from "./types"; +import type { CallerMetadata } from "../validation/options"; const debug = buildDebug("babel:config:loading:files:configuration"); @@ -26,6 +27,7 @@ const BABELIGNORE_FILENAME = ".babelignore"; export function findRelativeConfig( packageData: FilePackageData, envName: string, + caller: CallerMetadata | void, ): RelativeConfig { let config = null; let ignore = null; @@ -37,7 +39,7 @@ export function findRelativeConfig( config = [BABELRC_FILENAME, BABELRC_JS_FILENAME].reduce( (previousConfig: ConfigFile | null, name) => { const filepath = path.join(loc, name); - const config = readConfig(filepath, envName); + const config = readConfig(filepath, envName, caller); if (config && previousConfig) { throw new Error( @@ -91,10 +93,11 @@ export function findRelativeConfig( export function findRootConfig( dirname: string, envName: string, + caller: CallerMetadata | void, ): ConfigFile | null { const filepath = path.resolve(dirname, BABEL_CONFIG_JS_FILENAME); - const conf = readConfig(filepath, envName); + const conf = readConfig(filepath, envName, caller); if (conf) { debug("Found root config %o in $o.", BABEL_CONFIG_JS_FILENAME, dirname); } @@ -105,10 +108,11 @@ export function loadConfig( name: string, dirname: string, envName: string, + caller: CallerMetadata | void, ): ConfigFile { const filepath = resolve.sync(name, { basedir: dirname }); - const conf = readConfig(filepath, envName); + const conf = readConfig(filepath, envName, caller); if (!conf) { throw new Error(`Config file ${filepath} contains no configuration data`); } @@ -121,16 +125,22 @@ export function loadConfig( * Read the given config file, returning the result. Returns null if no config was found, but will * throw if there are parsing errors while loading a config. */ -function readConfig(filepath, envName): ConfigFile | null { +function readConfig(filepath, envName, caller): ConfigFile | null { return path.extname(filepath) === ".js" - ? readConfigJS(filepath, { envName }) + ? readConfigJS(filepath, { envName, caller }) : readConfigJSON5(filepath); } const LOADING_CONFIGS = new Set(); const readConfigJS = makeStrongCache( - (filepath, cache: CacheConfigurator<{ envName: string }>) => { + ( + filepath, + cache: CacheConfigurator<{ + envName: string, + caller: CallerMetadata | void, + }>, + ) => { if (!fs.existsSync(filepath)) { cache.forever(); return null; diff --git a/packages/babel-core/src/config/files/index-browser.js b/packages/babel-core/src/config/files/index-browser.js index cbc8b69a98..3305c346e4 100644 --- a/packages/babel-core/src/config/files/index-browser.js +++ b/packages/babel-core/src/config/files/index-browser.js @@ -7,6 +7,8 @@ import type { FilePackageData, } from "./types"; +import type { CallerMetadata } from "../validation/options"; + export type { ConfigFile, IgnoreFile, RelativeConfig, FilePackageData }; export function findPackageData(filepath: string): FilePackageData { @@ -21,6 +23,7 @@ export function findPackageData(filepath: string): FilePackageData { export function findRelativeConfig( pkgData: FilePackageData, // eslint-disable-line no-unused-vars envName: string, // eslint-disable-line no-unused-vars + caller: CallerMetadata | void, // eslint-disable-line no-unused-vars ): RelativeConfig { return { pkg: null, config: null, ignore: null }; } @@ -28,6 +31,7 @@ export function findRelativeConfig( export function findRootConfig( dirname: string, // eslint-disable-line no-unused-vars envName: string, // eslint-disable-line no-unused-vars + caller: CallerMetadata | void, // eslint-disable-line no-unused-vars ): ConfigFile | null { return null; } @@ -36,6 +40,7 @@ export function loadConfig( name: string, dirname: string, envName: string, // eslint-disable-line no-unused-vars + caller: CallerMetadata | void, // eslint-disable-line no-unused-vars ): ConfigFile { throw new Error(`Cannot load ${name} relative to ${dirname} in a browser`); } diff --git a/packages/babel-core/src/config/full.js b/packages/babel-core/src/config/full.js index ffdb71b02d..af4212953f 100644 --- a/packages/babel-core/src/config/full.js +++ b/packages/babel-core/src/config/full.js @@ -13,7 +13,7 @@ import { import type { UnloadedDescriptor } from "./config-descriptors"; import traverse from "@babel/traverse"; import { makeWeakCache, type CacheConfigurator } from "./caching"; -import { validate } from "./validation/options"; +import { validate, type CallerMetadata } from "./validation/options"; import { validatePluginObject } from "./validation/plugins"; import makeAPI from "./helpers/config-api"; @@ -41,6 +41,7 @@ export type PluginPasses = Array; // process 'ignore'/'only' and other filename-based logic. type SimpleContext = { envName: string, + caller: CallerMetadata | void, }; export default function loadFullConfig( diff --git a/packages/babel-core/src/config/helpers/config-api.js b/packages/babel-core/src/config/helpers/config-api.js index a50320680f..fa106f0ce2 100644 --- a/packages/babel-core/src/config/helpers/config-api.js +++ b/packages/babel-core/src/config/helpers/config-api.js @@ -8,6 +8,8 @@ import { type SimpleCacheConfigurator, } from "../caching"; +import type { CallerMetadata } from "../validation/options"; + type EnvFunction = { (): string, ((string) => T): T, @@ -24,7 +26,7 @@ export type PluginAPI = { }; export default function makeAPI( - cache: CacheConfigurator<{ envName: string }>, + cache: CacheConfigurator<{ envName: string, caller: CallerMetadata | void }>, ): PluginAPI { const env: any = value => cache.using(data => { @@ -42,12 +44,16 @@ export default function makeAPI( }); }); + const caller: any = cb => + cache.using(data => assertSimpleType(cb(data.caller))); + return { version: coreVersion, cache: cache.simple(), // Expose ".env()" so people can easily get the same env that we expose using the "env" key. env, async: () => false, + caller, assertVersion, }; }