Skip to content
Snippets Groups Projects
Select Git revision
  • 9385fb557b0a5dfd8539907c2d121da5af96591b
  • main default protected
  • fix/36615b-branch-reuse-no-cache
  • renovate/main-redis-5.x
  • next
  • revert-31645-feat/rename-gradle-wrapper-validation-action
  • chore/punycode
  • refactor/pin-new-value
  • feat/36219--git-x509-signing
  • feat/structured-logger
  • hotfix/39.264.1
  • feat/skip-dangling
  • gh-readonly-queue/next/pr-36034-7a061c4ca1024a19e2c295d773d9642625d1c2be
  • hotfix/39.238.3
  • refactor/gitlab-auto-approve
  • feat/template-strings
  • gh-readonly-queue/next/pr-35654-137d934242c784e0c45d4b957362214f0eade1d7
  • fix/32307-global-extends-merging
  • fix/32307-global-extends-repositories
  • gh-readonly-queue/next/pr-35009-046ebf7cb84ab859f7fefceb5fa53a54ce9736f8
  • gh-readonly-queue/next/pr-35009-9d5e583b7d7251148ab0d11ee8dd38149618d162
  • 41.38.1
  • 41.38.0
  • 41.37.12
  • 41.37.11
  • 41.37.10
  • 41.37.9
  • 41.37.8
  • 41.37.7
  • 41.37.6
  • 41.37.5
  • 41.37.4
  • 41.37.3
  • 41.37.2
  • 41.37.1
  • 41.37.0
  • 41.36.2
  • 41.36.1
  • 41.36.0
  • 41.35.2
  • 41.35.1
41 results

flatten.ts

Blame
  • user avatar
    Rhys Arkins authored
    Renamed from managerBranchPrefix
    9385fb55
    History
    flatten.ts 5.52 KiB
    import is from '@sindresorhus/is';
    import {
      PackageRule,
      RenovateConfig,
      filterConfig,
      getManagerConfig,
      mergeChildConfig,
    } from '../../../config';
    import { LANGUAGE_DOCKER } from '../../../constants/languages';
    import { getDefaultConfig } from '../../../datasource';
    import { get } from '../../../manager';
    import { applyPackageRules } from '../../../util/package-rules';
    import { generateBranchName } from './branch-name';
    
    // Return only rules that contain an updateType
    function getUpdateTypeRules(packageRules: PackageRule[]): PackageRule[] {
      return packageRules.filter((rule) => is.nonEmptyArray(rule.updateTypes));
    }
    
    const upper = (str: string): string =>
      str.charAt(0).toUpperCase() + str.substr(1);
    
    export async function flattenUpdates(
      config: RenovateConfig,
      packageFiles: Record<string, any[]>
    ): Promise<RenovateConfig[]> {
      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);
          const packagePath = packageFile.packageFile?.split('/');
          if (packagePath.length > 0) {
            packagePath.splice(-1, 1);
          }
          if (packagePath.length > 0) {
            packageFileConfig.parentDir = packagePath[packagePath.length - 1];
            packageFileConfig.baseDir = packagePath.join('/');
          } else {
            packageFileConfig.parentDir = '';
            packageFileConfig.baseDir = '';
          }
          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;
                // Massage legacy vars just in case
                updateConfig.currentVersion = updateConfig.currentValue;
                updateConfig.newVersion =
                  updateConfig.newVersion || updateConfig.newValue;
                if (updateConfig.updateType) {
                  updateConfig[`is${upper(updateConfig.updateType)}`] = true;
                }
                if (updateConfig.updateTypes) {
                  updateConfig.updateTypes.forEach((updateType) => {
                    updateConfig[`is${upper(updateType)}`] = true;
                  });
                }
                // apply config from datasource
                const datasourceConfig = await getDefaultConfig(
                  depConfig.datasource
                );
                updateConfig = mergeChildConfig(updateConfig, datasourceConfig);
                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 === LANGUAGE_DOCKER &&
                  updateConfig.depName.match(/(^|\/)node$/) &&
                  updateConfig.depName !== 'calico/node'
                ) {
                  updateConfig.additionalBranchPrefix = '';
                  updateConfig.depNameSanitized = 'node';
                }
                generateBranchName(updateConfig);
                update.branchName = updateConfig.branchName; // for writing to cache
                delete updateConfig.repoIsOnboarded;
                delete updateConfig.renovateJsonPresent;
                updateConfig.baseDeps = packageFile.deps;
                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;
            generateBranchName(lockFileConfig);
            updates.push(lockFileConfig);
          }
        }
      }
      return updates
        .filter((update) => update.enabled)
        .map((update) => filterConfig(update, 'branch'));
    }