pub fn from_configs<'a>(
        package_names: HashSet<&str>,
        configs: impl Iterator<Item = (&'a str, Result<Option<MFEConfig>, Error>)>,
    ) -> Result<Option<Self>, Error> {
        let PackageGraphResult {
            configs,
            missing_default_apps,
            missing_applications,
            unsupported_version,
            mfe_package,
        } = PackageGraphResult::new(package_names, configs)?;

        for (package, err) in unsupported_version {
            warn!("Ignoring {package}: {err}");
        }

        if !missing_default_apps.is_empty() {
            warn!(
                "Missing default applications: {}",
                missing_default_apps.join(", ")
            );
        }

        if !missing_applications.is_empty() {
            warn!(
                "Unable to find packages referenced in 'microfrontends.json' in workspace. Local \
                 proxy will not route to the following applications if they are running locally: \
                 {}",
                missing_applications.join(", ")
            );
        }

        Ok((!configs.is_empty()).then_some(Self {
            configs,
            mfe_package,
        }))
    }
Constructs a collection of configurations from a list of configurations
crates/turborepo-lib/src/microfrontends.rs