renovate/lib/workers/repository/updates/flatten.js
2018-09-30 07:40:32 +02:00

108 lines
3.8 KiB
JavaScript

const is = require('@sindresorhus/is');
const {
getManagerConfig,
mergeChildConfig,
filterConfig,
} = require('../../../config');
const { applyPackageRules } = require('../../../util/package-rules');
const { get } = require('../../../manager');
module.exports = {
flattenUpdates,
};
// Return only rules that contain an updateType
function getUpdateTypeRules(packageRules) {
return packageRules.filter(rule => is.nonEmptyArray(rule.updateTypes));
}
function flattenUpdates(config, packageFiles) {
const updates = [];
const updateTypes = [
'major',
'minor',
'patch',
'pin',
'digest',
'lockFileMaintenance',
];
for (const [manager, files] of Object.entries(packageFiles)) {
const managerConfig = getManagerConfig(config, manager);
for (const packageFile of files) {
const packageFileConfig = mergeChildConfig(managerConfig, packageFile);
for (const dep of packageFile.deps) {
if (dep.updates.length) {
const depConfig = mergeChildConfig(packageFileConfig, dep);
delete depConfig.deps;
for (const update of dep.updates) {
let updateConfig = mergeChildConfig(depConfig, update);
delete updateConfig.updates;
updateConfig = applyPackageRules(updateConfig);
// Keep only rules that haven't been applied yet (with updateTypes)
updateConfig.packageRules = getUpdateTypeRules(
updateConfig.packageRules
);
// apply major/minor/patch/pin/digest
updateConfig = mergeChildConfig(
updateConfig,
updateConfig[updateConfig.updateType]
);
for (const updateType of updateTypes) {
delete updateConfig[updateType];
}
// Apply again in case any were added by the updateType config
updateConfig = applyPackageRules(updateConfig);
delete updateConfig.packageRules;
updateConfig.depNameSanitized = updateConfig.depName
? updateConfig.depName
.replace('@types/', '')
.replace('@', '')
.replace(/\//g, '-')
.replace(/\s+/g, '-')
.toLowerCase()
: undefined;
if (
updateConfig.language === 'docker' &&
updateConfig.depName.match(/(^|\/)node$/) &&
updateConfig.depName !== 'calico/node'
) {
updateConfig.managerBranchPrefix = '';
updateConfig.depNameSanitized = 'node';
}
delete updateConfig.repoIsOnboarded;
delete updateConfig.renovateJsonPresent;
updates.push(updateConfig);
}
}
}
if (
get(manager, 'supportsLockFileMaintenance') &&
packageFileConfig.lockFileMaintenance.enabled
) {
// Apply lockFileMaintenance config before packageRules
let lockFileConfig = mergeChildConfig(
packageFileConfig,
packageFileConfig.lockFileMaintenance
);
lockFileConfig.updateType = 'lockFileMaintenance';
lockFileConfig = applyPackageRules(lockFileConfig);
// Apply lockFileMaintenance and packageRules again
lockFileConfig = mergeChildConfig(
lockFileConfig,
lockFileConfig.lockFileMaintenance
);
lockFileConfig = applyPackageRules(lockFileConfig);
// Remove unnecessary objects
for (const updateType of updateTypes) {
delete lockFileConfig[updateType];
}
delete lockFileConfig.packageRules;
delete lockFileConfig.deps;
updates.push(lockFileConfig);
}
}
}
return updates
.filter(update => update.enabled)
.map(update => filterConfig(update, 'branch'));
}