renovate
Version:
Automated dependency updates. Flexible so you don't need to be.
130 lines (129 loc) • 6.58 kB
JavaScript
import { regEx } from "../../../util/regex.js";
import { logger } from "../../../logger/index.js";
import { parseUrl } from "../../../util/url.js";
import { mergeChildConfig } from "../../../config/utils.js";
import { compile } from "../../../util/template/index.js";
import { getDefaultConfig } from "../../../modules/datasource/index.js";
import { get } from "../../../modules/manager/index.js";
import { filterConfig, getManagerConfig } from "../../../config/index.js";
import { detectSemanticCommits } from "../../../util/git/semantic.js";
import { applyPackageRules } from "../../../util/package-rules/index.js";
import { generateBranchName } from "./branch-name.js";
import { isUndefined } from "@sindresorhus/is";
//#region lib/workers/repository/updates/flatten.ts
const upper = (str) => str.charAt(0).toUpperCase() + str.substring(1);
function sanitizeDepName(depName) {
return depName.replace("@types/", "").replace("@", "").replace(regEx(/\//g), "-").replace(regEx(/\s+/g), "-").replace(regEx(/:/g), "-").replace(regEx(/-+/), "-").toLowerCase();
}
function applyUpdateConfig(input) {
const updateConfig = { ...input };
delete updateConfig.packageRules;
updateConfig.depNameSanitized = updateConfig.depName ? sanitizeDepName(updateConfig.depName) : void 0;
updateConfig.newNameSanitized = updateConfig.newName ? sanitizeDepName(updateConfig.newName) : void 0;
if (updateConfig.sourceUrl) {
const parsedSourceUrl = parseUrl(updateConfig.sourceUrl);
if (parsedSourceUrl?.pathname) {
updateConfig.sourceRepoSlug = parsedSourceUrl.pathname.replace(regEx(/^\//), "").replace(regEx(/\//g), "-").replace(regEx(/-+/g), "-");
updateConfig.sourceRepo = parsedSourceUrl.pathname.replace(regEx(/^\//), "");
updateConfig.sourceRepoOrg = updateConfig.sourceRepo.replace(regEx(/\/.*/g), "");
updateConfig.sourceRepoName = updateConfig.sourceRepo.replace(regEx(/.*\//g), "");
}
}
if (updateConfig.sourceDirectory) updateConfig.sourceDirectory = compile(updateConfig.sourceDirectory, updateConfig);
generateBranchName(updateConfig);
return updateConfig;
}
async function flattenUpdates(config, packageFiles) {
const updates = [];
const updateTypes = [
"major",
"minor",
"patch",
"pin",
"digest",
"lockFileMaintenance",
"replacement"
];
for (const [manager, files] of Object.entries(packageFiles)) {
const managerConfig = getManagerConfig(config, manager);
for (const packageFile of files) {
const packageFileConfig = mergeChildConfig(managerConfig, packageFile);
const packagePath = packageFile.packageFile?.split("/");
if (packagePath.length > 0) packagePath.splice(-1, 1);
if (packagePath.length > 0) {
packageFileConfig.parentDir = packagePath[packagePath.length - 1];
packageFileConfig.packageFileDir = packagePath.join("/");
} else {
packageFileConfig.parentDir = "";
packageFileConfig.packageFileDir = "";
}
let depIndex = 0;
for (const dep of packageFile.deps) {
if (dep.updates.length) {
const depConfig = mergeChildConfig(packageFileConfig, dep);
delete depConfig.deps;
depConfig.depIndex = depIndex;
for (const update of dep.updates) {
let updateConfig = mergeChildConfig(depConfig, update);
delete updateConfig.updates;
if (updateConfig.updateType) updateConfig[`is${upper(updateConfig.updateType)}`] = true;
if (updateConfig.updateTypes) updateConfig.updateTypes.forEach((updateType) => {
updateConfig[`is${upper(updateType)}`] = true;
});
const datasourceConfig = await getDefaultConfig(depConfig.datasource);
updateConfig = mergeChildConfig(updateConfig, datasourceConfig);
updateConfig = await applyPackageRules(updateConfig, "datasource-merge");
updateConfig = mergeChildConfig(updateConfig, updateConfig[updateConfig.updateType]);
for (const updateType of updateTypes) delete updateConfig[updateType];
updateConfig = await applyPackageRules(updateConfig, "update-type-merge");
updateConfig = applyUpdateConfig(updateConfig);
updateConfig.baseDeps = packageFile.deps;
update.branchName = updateConfig.branchName;
updateConfig.hasAttestation = depConfig.hasAttestation;
updates.push(updateConfig);
}
}
depIndex += 1;
}
if (get(manager, "supportsLockFileMaintenance") && packageFileConfig.lockFileMaintenance.enabled) {
let lockFileConfig = mergeChildConfig(packageFileConfig, packageFileConfig.lockFileMaintenance);
lockFileConfig.updateType = "lockFileMaintenance";
lockFileConfig.isLockFileMaintenance = true;
lockFileConfig = await applyPackageRules(lockFileConfig, "lock-file-maintenance-merge");
lockFileConfig = mergeChildConfig(lockFileConfig, lockFileConfig.lockFileMaintenance);
lockFileConfig = await applyPackageRules(lockFileConfig, "lock-file-maintenance-merge-2");
for (const updateType of updateTypes) delete lockFileConfig[updateType];
delete lockFileConfig.packageRules;
delete lockFileConfig.deps;
generateBranchName(lockFileConfig);
updates.push(lockFileConfig);
}
if (get(manager, "updateLockedDependency")) for (const lockFile of packageFileConfig.lockFiles ?? []) {
const remediations = config.remediations?.[lockFile];
if (remediations) for (const remediation of remediations) {
let updateConfig = mergeChildConfig(packageFileConfig, remediation);
updateConfig = mergeChildConfig(updateConfig, config.vulnerabilityAlerts);
delete updateConfig.vulnerabilityAlerts;
updateConfig.isVulnerabilityAlert = true;
updateConfig.isRemediation = true;
updateConfig.lockFile = lockFile;
updateConfig.currentValue = updateConfig.currentVersion;
updateConfig.newValue = updateConfig.newVersion;
updateConfig = applyUpdateConfig(updateConfig);
updateConfig.enabled = true;
updates.push(updateConfig);
}
}
}
}
if (config.semanticCommits === "auto") {
const semanticCommits = await detectSemanticCommits();
for (const update of updates) update.semanticCommits = semanticCommits;
}
const filteredUpdates = updates.filter((update) => update.enabled !== false).filter((update) => isUndefined(update.skipReason)).map(({ vulnerabilityAlerts: _, ...update }) => update).map((update) => filterConfig(update, "branch"));
if (filteredUpdates.length < updates.length) logger.debug(`Filtered out ${updates.length - filteredUpdates.length} disabled update(s). ${filteredUpdates.length} update(s) remaining.`);
return filteredUpdates;
}
//#endregion
export { flattenUpdates };
//# sourceMappingURL=flatten.js.map