Merge pull request #7449 from loganfsmyth/env-enhancement
Centralize the plugin/preset and config APIs into one place
This commit is contained in:
commit
a07f96ce3f
@ -1,6 +1,6 @@
|
||||
// @flow
|
||||
|
||||
type SimpleCacheConfigurator = SimpleCacheConfiguratorFn &
|
||||
export type SimpleCacheConfigurator = SimpleCacheConfiguratorFn &
|
||||
SimpleCacheConfiguratorObj;
|
||||
|
||||
type SimpleCacheConfiguratorFn = {
|
||||
|
||||
@ -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();
|
||||
}
|
||||
|
||||
40
packages/babel-core/src/config/helpers/config-api.js
Normal file
40
packages/babel-core/src/config/helpers/config-api.js
Normal file
@ -0,0 +1,40 @@
|
||||
// @flow
|
||||
import type { CacheConfigurator, SimpleCacheConfigurator } from "../caching";
|
||||
|
||||
type EnvFunction = {
|
||||
(): string,
|
||||
<T>((string) => T): T,
|
||||
(string): boolean,
|
||||
(Array<string>): 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,
|
||||
};
|
||||
}
|
||||
@ -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);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user