synopkg 14.0.1

Consistent dependency versions in large JavaScript Monorepos
use {
  crate::{
    commands::{ui, ui::LINE_ENDING},
    context::Context,
    version_group::VersionGroupVariant,
  },
  log::{error, warn},
};

pub fn run(ctx: Context) -> i32 {
  let mut was_outdated = false;

  ctx
    .version_groups
    .iter()
    .filter(|group| matches!(group.variant, VersionGroupVariant::HighestSemver))
    .for_each(|group| {
      let mut has_printed_group = false;
      group.get_sorted_dependencies(&ctx.config.cli.sort).for_each(|dependency| {
        let mut has_printed_dependency = false;
        dependency
          .get_sorted_instances()
          .filter(|instance| instance.is_outdated())
          .for_each(|instance| {
            was_outdated = true;
            if !has_printed_group {
              ui::group::print_header(&ctx, group);
              has_printed_group = true;
            }
            if ctx.config.cli.check {
              if !has_printed_dependency {
                ui::dependency::print_outdated(&ctx, dependency, &group.variant);
                has_printed_dependency = true;
              }
              ui::instance::print_outdated(&ctx, instance, &group.variant);
            } else {
              if !has_printed_dependency {
                ui::dependency::print_fixed(&ctx, dependency, &group.variant);
                has_printed_dependency = true;
              }
              ui::instance::print_fixed(&ctx, instance, &group.variant);
              instance.descriptor.package.borrow().copy_expected_specifier(instance);
            }
          });
      })
    });

  if !ctx.failed_updates.is_empty() {
    println!(" ");
    ctx.failed_updates.iter().for_each(|name| {
      error!("Failed to fetch {name}");
    });
    warn!(
      "Synopkg does not yet support custom npm registries{LINE_ENDING}  Subscribe to https://github.com/envrs/synopkg/issues/220"
    );
  } else if !was_outdated {
    ui::util::print_no_issues_found();
  }

  if ctx.config.cli.check {
    return if was_outdated { 1 } else { 0 };
  }

  if !ctx.config.cli.dry_run {
    ctx.packages.all.iter().for_each(|package| {
      package.borrow().write_to_disk(&ctx.config);
    });
  }

  0
}