renovate
Version:
Automated dependency updates. Flexible so you don't need to be.
97 lines (96 loc) • 4.46 kB
JavaScript
import { regEx } from "../../util/regex.js";
import { logger } from "../../logger/index.js";
import { isNonEmptyArray, isNonEmptyString, isNumber, isString } from "@sindresorhus/is";
import jsonata from "jsonata";
//#region lib/config/validation-helpers/utils.ts
function getParentName(parentPath) {
return parentPath ? parentPath.replace(regEx(/\.?encrypted$/), "").replace(regEx(/\[\d+\]$/), "").split(".").pop() : ".";
}
function validatePlainObject(val) {
for (const [key, value] of Object.entries(val)) if (!isString(value)) return key;
return true;
}
function validateNumber(key, val, allowsNegative, currentPath, subKey) {
const errors = [];
const path = `${currentPath}${subKey ? `.${subKey}` : ""}`;
if (isNumber(val)) {
if (val < 0 && !allowsNegative) errors.push({
topic: "Configuration Error",
message: `Configuration option \`${path}\` should be a positive integer. Found negative value instead.`
});
} else errors.push({
topic: "Configuration Error",
message: `Configuration option \`${path}\` should be an integer. Found: ${JSON.stringify(val)} (${typeof val}).`
});
return errors;
}
/** An option is a false global if it has the same name as a global only option
* but is actually just the field of a non global option or field an children of the non global option
* eg. token: it's global option used as the bot's token as well and
* also it can be the token used for a platform inside the hostRules configuration
*/
function isFalseGlobal(optionName, parentPath) {
if (parentPath?.includes("hostRules")) {
// v8 ignore else -- TODO: add test #40625
if (optionName === "token" || optionName === "username" || optionName === "password") return true;
}
return false;
}
function hasField(customManager, field) {
const templateField = `${field}Template`;
const fieldStr = customManager.customType === "regex" ? `(?<${field}>` : field;
return !!(customManager[templateField] ?? customManager.matchStrings?.some((matchString) => matchString.includes(fieldStr)));
}
function validateRegexManagerFields(customManager, currentPath, errors) {
if (isNonEmptyArray(customManager.matchStrings)) for (const matchString of customManager.matchStrings) try {
regEx(matchString);
} catch (err) {
logger.debug({ err }, "customManager.matchStrings regEx validation error");
errors.push({
topic: "Configuration Error",
message: `Invalid regExp for ${currentPath}: \`${matchString}\``
});
}
else errors.push({
topic: "Configuration Error",
message: "Each Custom Manager `matchStrings` array must have at least one item."
});
for (const field of ["currentValue", "datasource"]) if (!hasField(customManager, field)) errors.push({
topic: "Configuration Error",
message: `Regex Managers must contain ${field}Template configuration or regex group named ${field}`
});
if (!["depName", "packageName"].some((field) => hasField(customManager, field))) errors.push({
topic: "Configuration Error",
message: `Regex Managers must contain depName or packageName regex groups or templates`
});
}
function validateJSONataManagerFields(customManager, currentPath, errors) {
if (!isNonEmptyString(customManager.fileFormat)) errors.push({
topic: "Configuration Error",
message: "Each JSONata manager must contain a fileFormat field."
});
if (isNonEmptyArray(customManager.matchStrings)) for (const matchString of customManager.matchStrings) try {
jsonata(matchString);
} catch (err) {
logger.debug({ err }, "customManager.matchStrings JSONata query validation error");
errors.push({
topic: "Configuration Error",
message: `Invalid JSONata query for ${currentPath}: \`${matchString}\``
});
}
else errors.push({
topic: "Configuration Error",
message: `Each Custom Manager must contain a non-empty matchStrings array`
});
for (const field of ["currentValue", "datasource"]) if (!hasField(customManager, field)) errors.push({
topic: "Configuration Error",
message: `JSONata Managers must contain ${field}Template configuration or ${field} in the query `
});
if (!["depName", "packageName"].some((field) => hasField(customManager, field))) errors.push({
topic: "Configuration Error",
message: `JSONata Managers must contain depName or packageName in the query or their templates`
});
}
//#endregion
export { getParentName, isFalseGlobal, validateJSONataManagerFields, validateNumber, validatePlainObject, validateRegexManagerFields };
//# sourceMappingURL=utils.js.map