modules

redirect.install
/**
 * Save the bulk delete action to config.
 */
function redirect_update_8104() {
  if (!Action::load('redirect_delete_action')) {
    $entity_type_manager = \Drupal::entityTypeManager();
    $module_handler = \Drupal::moduleHandler();

    // Save the bulk delete action to config.
    $config_install_path = $module_handler->getModule('redirect')->getPath() . '/' . InstallStorage::CONFIG_INSTALL_DIRECTORY;
    $storage = new FileStorage($config_install_path);
    $entity_type_manager
      ->getStorage('action')
      ->create($storage->read('system.action.redirect_delete_action'))
      ->trustData()
      ->save();
  }
}
lenient.sh
# Get lenient.
composer require mglaman/composer-drupal-lenient

# Add the module to the allow list. Use escapes for the quote signs. \" ... \"
composer config --merge --json extra.drupal-lenient.allowed-list '[\"drupal/module_with_incompatible_core_version\"]'

# You can check if the merge worked, either just take a look
# into the composer.json or use this command.
composer config --merge --json extra.drupal-lenient.allowed-list
lenient_allowed_list.json
"drupal-lenient": {
  "allowed-list": [
    "drupal/module_with_incompatible_core_version"
  ]
}
get_all_contrib_modules.php
<?php

/**
 * Get a list of all contrib modules.
 * 
 @param string $context
 *   The context of the module like contrib, custom or core.
 *   Only the parameter 'contrib', 'custom', or 'core' are 
 *   available parameters.
 * @return array
 *   Returns an array with all contrib modules' machine names.
 */
public function getAvailableModules(string $context): array {
  $context = 'contrib';
  $module_list = \Drupal::service('module_handler')->getModuleList();
  $modules = [];

  foreach ($module_list as $module) {
    if (str_contains($module->getPath(), 'contrib')) {
      $modules[$module->getName()] = $module;
    }
  }

  return $modules;
}