@netlify/build
Version:
Netlify build module
86 lines (84 loc) • 3.75 kB
JavaScript
import { addErrorInfo } from '../../error/info.js';
import { serializeObject } from '../../log/serialize.js';
import { THEME } from '../../log/theme.js';
// Check that plugin inputs match the validation specified in "manifest.yml"
// Also assign default values
export const checkInputs = function ({ inputs, manifest: { inputs: rules = [] }, packageName, pluginPackageJson, loadedFrom, origin, }) {
try {
const inputsA = addDefaults(inputs, rules);
checkRequiredInputs({ inputs: inputsA, rules, packageName, pluginPackageJson, loadedFrom, origin });
checkUnknownInputs({ inputs: inputsA, rules, packageName, pluginPackageJson, loadedFrom, origin });
return inputsA;
}
catch (error) {
error.message = `${error.message}
${THEME.errorSubHeader('Plugin inputs')}
${serializeObject(inputs)}`;
throw error;
}
};
// Add "inputs[*].default"
const addDefaults = function (inputs, rules) {
const defaults = rules.filter(hasDefault).map(getDefault);
return Object.assign({}, ...defaults, inputs);
};
const hasDefault = function (rule) {
return rule.default !== undefined;
};
const getDefault = function ({ name, default: defaultValue }) {
return { [name]: defaultValue };
};
// Check "inputs[*].required"
const checkRequiredInputs = function ({ inputs, rules, packageName, pluginPackageJson, loadedFrom, origin }) {
const missingInputs = rules.filter((rule) => isMissingRequired(inputs, rule));
if (missingInputs.length === 0) {
return;
}
const names = missingInputs.map(getName);
const error = new Error(`Required inputs for plugin "${packageName}": ${names.join(', ')}`);
addInputError({ error, name: names[0], packageName, pluginPackageJson, loadedFrom, origin });
throw error;
};
const isMissingRequired = function (inputs, { name, required }) {
return required && inputs[name] === undefined;
};
const getName = function ({ name }) {
return name;
};
// Check each "inputs[*].*" property for a specific input
const checkUnknownInputs = function ({ inputs, rules, packageName, pluginPackageJson, loadedFrom, origin }) {
const knownInputs = rules.map(getName);
const unknownInputs = Object.keys(inputs).filter((name) => !knownInputs.includes(name));
if (unknownInputs.length === 0) {
return;
}
const unknownInputsMessage = getUnknownInputsMessage({ packageName, knownInputs, unknownInputs });
const error = new Error(`${unknownInputsMessage}
Check your plugin configuration to be sure that:
- the input name is spelled correctly
- the input is included in the plugin's available configuration options
- the plugin's input requirements have not changed`);
const [name] = unknownInputs;
addInputError({ error, name, packageName, pluginPackageJson, loadedFrom, origin });
throw error;
};
const getUnknownInputsMessage = function ({ packageName, knownInputs, unknownInputs }) {
const unknownInputsStr = unknownInputs.map(quoteWord).join(', ');
if (knownInputs.length === 0) {
return `Plugin "${packageName}" does not accept any inputs but you specified: ${unknownInputsStr}`;
}
const knownInputsStr = knownInputs.map(quoteWord).join(', ');
return `Unknown inputs for plugin "${packageName}": ${unknownInputsStr}
Plugin inputs should be one of: ${knownInputsStr}`;
};
const quoteWord = function (word) {
return `"${word}"`;
};
// Add error information
const addInputError = function ({ error, name, packageName, pluginPackageJson, loadedFrom, origin }) {
addErrorInfo(error, {
type: 'pluginInput',
plugin: { packageName, pluginPackageJson },
location: { event: 'load', packageName, input: name, loadedFrom, origin },
});
};