diff --git a/packages/babel-core/src/config/caching.js b/packages/babel-core/src/config/caching.js index b9703560b5..7c3a28bda2 100644 --- a/packages/babel-core/src/config/caching.js +++ b/packages/babel-core/src/config/caching.js @@ -1,6 +1,6 @@ // @flow -type SimpleCacheConfigurator = SimpleCacheConfiguratorFn & +export type SimpleCacheConfigurator = SimpleCacheConfiguratorFn & SimpleCacheConfiguratorObj; type SimpleCacheConfiguratorFn = { diff --git a/packages/babel-core/src/config/files/configuration.js b/packages/babel-core/src/config/files/configuration.js index 73786b89fb..c1a55cc598 100644 --- a/packages/babel-core/src/config/files/configuration.js +++ b/packages/babel-core/src/config/files/configuration.js @@ -6,6 +6,7 @@ import fs from "fs"; import json5 from "json5"; import resolve from "resolve"; import { makeStrongCache, type CacheConfigurator } from "../caching"; +import makeAPI from "../helpers/config-api"; const debug = buildDebug("babel:config:loading:files:configuration"); @@ -150,12 +151,7 @@ const readConfigJS = makeStrongCache( } if (typeof options === "function") { - options = options({ - cache: cache.simple(), - // Expose ".env()" so people can easily get the same env that we expose using the "env" key. - env: () => cache.using(data => data.envName), - async: () => false, - }); + options = options(makeAPI(cache)); if (!cache.configured()) throwConfigError(); } diff --git a/packages/babel-core/src/config/helpers/config-api.js b/packages/babel-core/src/config/helpers/config-api.js new file mode 100644 index 0000000000..933c605016 --- /dev/null +++ b/packages/babel-core/src/config/helpers/config-api.js @@ -0,0 +1,40 @@ +// @flow +import type { CacheConfigurator, SimpleCacheConfigurator } from "../caching"; + +type EnvFunction = { + (): string, + ((string) => T): T, + (string): boolean, + (Array): boolean, +}; + +export type PluginAPI = { + cache: SimpleCacheConfigurator, + env: EnvFunction, + async: () => boolean, +}; + +export default function makeAPI( + cache: CacheConfigurator<{ envName: string }>, +): PluginAPI { + const env: any = value => + cache.using(data => { + if (typeof value === "undefined") return data.envName; + if (typeof value === "function") return value(data.envName); + if (!Array.isArray(value)) value = [value]; + + return value.some(entry => { + if (typeof entry !== "string") { + throw new Error("Unexpected non-string value"); + } + return entry === data.envName; + }); + }); + + return { + cache: cache.simple(), + // Expose ".env()" so people can easily get the same env that we expose using the "env" key. + env, + async: () => false, + }; +} diff --git a/packages/babel-core/src/config/index.js b/packages/babel-core/src/config/index.js index 05ac8e7ce9..5ee1c04818 100644 --- a/packages/babel-core/src/config/index.js +++ b/packages/babel-core/src/config/index.js @@ -16,6 +16,7 @@ import { makeWeakCache, type CacheConfigurator } from "./caching"; import { getEnv } from "./helpers/environment"; import { validate, type ValidatedOptions } from "./validation/options"; import { validatePluginObject } from "./validation/plugins"; +import makeAPI from "./helpers/config-api"; type LoadedDescriptor = { value: {}, @@ -202,11 +203,7 @@ const loadDescriptor = makeWeakCache( let item = value; if (typeof value === "function") { - const api = Object.assign(Object.create(context), { - cache: cache.simple(), - env: () => cache.using(data => data.envName), - async: () => false, - }); + const api = Object.assign(Object.create(context), makeAPI(cache)); try { item = value(api, options, dirname);