Validate the file before loading chain.

This commit is contained in:
Logan Smyth
2018-05-11 15:29:28 -07:00
parent b87c43d894
commit 1a7765712e

View File

@@ -148,7 +148,7 @@ export function buildRootChain(
const configFileChain = emptyChain(); const configFileChain = emptyChain();
if (configFile) { if (configFile) {
const result = loadFileChain(configFile, context); const result = loadFileChain(validateFile(configFile), context);
if (!result) return null; if (!result) return null;
mergeChain(configFileChain, result); mergeChain(configFileChain, result);
@@ -180,7 +180,7 @@ export function buildRootChain(
} }
if (babelrcFile) { if (babelrcFile) {
const result = loadFileChain(babelrcFile, context); const result = loadFileChain(validateFile(babelrcFile), context);
if (!result) return null; if (!result) return null;
mergeChain(fileChain, result); mergeChain(fileChain, result);
@@ -231,11 +231,16 @@ function babelrcLoadEnabled(
return micromatch(pkgData.directories, babelrcPatterns).length > 0; return micromatch(pkgData.directories, babelrcPatterns).length > 0;
} }
const validateFile = makeWeakCache((file: ConfigFile): ValidatedFile => ({
filepath: file.filepath,
dirname: file.dirname,
options: validate("file", file.options),
}));
/** /**
* Build a config chain for just the programmatic options passed into Babel. * Build a config chain for just the programmatic options passed into Babel.
*/ */
const loadProgrammaticChain = makeChainWalker({ const loadProgrammaticChain = makeChainWalker({
init: arg => arg,
root: input => buildRootDescriptors(input, "base", createCachedDescriptors), root: input => buildRootDescriptors(input, "base", createCachedDescriptors),
env: (input, envName) => env: (input, envName) =>
buildEnvDescriptors(input, "base", createCachedDescriptors, envName), buildEnvDescriptors(input, "base", createCachedDescriptors, envName),
@@ -255,18 +260,12 @@ const loadProgrammaticChain = makeChainWalker({
* Build a config chain for a given file. * Build a config chain for a given file.
*/ */
const loadFileChain = makeChainWalker({ const loadFileChain = makeChainWalker({
init: input => validateFile(input),
root: file => loadFileDescriptors(file), root: file => loadFileDescriptors(file),
env: (file, envName) => loadFileEnvDescriptors(file)(envName), env: (file, envName) => loadFileEnvDescriptors(file)(envName),
overrides: (file, index) => loadFileOverridesDescriptors(file)(index), overrides: (file, index) => loadFileOverridesDescriptors(file)(index),
overridesEnv: (file, index, envName) => overridesEnv: (file, index, envName) =>
loadFileOverridesEnvDescriptors(file)(index)(envName), loadFileOverridesEnvDescriptors(file)(index)(envName),
}); });
const validateFile = makeWeakCache((file: ConfigFile): ValidatedFile => ({
filepath: file.filepath,
dirname: file.dirname,
options: validate("file", file.options),
}));
const loadFileDescriptors = makeWeakCache((file: ValidatedFile) => const loadFileDescriptors = makeWeakCache((file: ValidatedFile) =>
buildRootDescriptors(file, file.filepath, createUncachedDescriptors), buildRootDescriptors(file, file.filepath, createUncachedDescriptors),
); );
@@ -350,25 +349,18 @@ function buildOverrideEnvDescriptors(
: null; : null;
} }
function makeChainWalker< function makeChainWalker<ArgT: { options: ValidatedOptions, dirname: string }>({
ArgT,
InnerT: { options: ValidatedOptions, dirname: string },
>({
init,
root, root,
env, env,
overrides, overrides,
overridesEnv, overridesEnv,
}: { }: {
init: ArgT => InnerT, root: ArgT => OptionsAndDescriptors,
root: InnerT => OptionsAndDescriptors, env: (ArgT, string) => OptionsAndDescriptors | null,
env: (InnerT, string) => OptionsAndDescriptors | null, overrides: (ArgT, number) => OptionsAndDescriptors,
overrides: (InnerT, number) => OptionsAndDescriptors, overridesEnv: (ArgT, number, string) => OptionsAndDescriptors | null,
overridesEnv: (InnerT, number, string) => OptionsAndDescriptors | null,
}): (ArgT, ConfigContext, Set<ConfigFile> | void) => ConfigChain | null { }): (ArgT, ConfigContext, Set<ConfigFile> | void) => ConfigChain | null {
return (arg, context, files = new Set()) => { return (input, context, files = new Set()) => {
const input = init(arg);
const { dirname } = input; const { dirname } = input;
const flattenedConfigs = []; const flattenedConfigs = [];
@@ -442,7 +434,7 @@ function mergeExtendsChain(
} }
files.add(file); files.add(file);
const fileChain = loadFileChain(file, context, files); const fileChain = loadFileChain(validateFile(file), context, files);
files.delete(file); files.delete(file);
if (!fileChain) return false; if (!fileChain) return false;