Expose an api.caller(...) handler for presets to access caller metadata.
This commit is contained in:
@@ -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(
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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`);
|
||||
}
|
||||
|
||||
@@ -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<PluginPassList>;
|
||||
// process 'ignore'/'only' and other filename-based logic.
|
||||
type SimpleContext = {
|
||||
envName: string,
|
||||
caller: CallerMetadata | void,
|
||||
};
|
||||
|
||||
export default function loadFullConfig(
|
||||
|
||||
@@ -8,6 +8,8 @@ import {
|
||||
type SimpleCacheConfigurator,
|
||||
} from "../caching";
|
||||
|
||||
import type { CallerMetadata } from "../validation/options";
|
||||
|
||||
type EnvFunction = {
|
||||
(): string,
|
||||
<T>((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,
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user