synopkg 14.0.1

Consistent dependency versions in large JavaScript Monorepos
use {crate::context::Context, serde_json::json};

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

  ctx
    .version_groups
    .iter()
    .filter(|group| !group.has_ignored_variant() || ctx.config.cli.show_ignored)
    .for_each(|group| {
      group.get_sorted_dependencies(&ctx.config.cli.sort).for_each(|dependency| {
        dependency.get_sorted_instances().for_each(|instance| {
          let package = instance.descriptor.package.borrow();
          let instance_json = json!({
            "dependency": instance.descriptor.name,
            "dependencyGroup": instance.descriptor.internal_name,
            "dependencyType": instance.descriptor.dependency_type.name,
            "package": package.file_path.to_string_lossy(),
            "property": instance.descriptor.dependency_type.path.split('/').filter(|part| !part.is_empty()).collect::<Vec<&str>>(),
            "strategy": instance.descriptor.dependency_type.strategy,
            "versionGroup": format!("{:?}", dependency.variant),
            "preferredSemverRange": instance.preferred_semver_range.as_ref().map(|range|range.unwrap()),
            "statusCode": instance.state.borrow().get_name(),
            "actual": json!({
              "raw": instance.descriptor.specifier.get_raw(),
              "type": instance.descriptor.specifier.get_config_identifier(),
            }),
            "expected": instance.expected_specifier.borrow().as_ref().map(|expected|
              json!({
                "raw": expected.get_raw(),
                "type": expected.get_config_identifier(),
              }),
            ),
          });
          println!("{}", serde_json::to_string(&instance_json).unwrap());
          if instance.is_invalid() || (instance.is_suspect() && ctx.config.rcfile.strict) {
            is_invalid = true;
          }
        });
      });
    });

  if is_invalid {
    1
  } else {
    0
  }
}