use crate::Resolver;
use aube_lockfile::LockfileGraph;
use std::collections::HashMap;
#[derive(Debug, Clone, Default)]
pub struct DirectDepInfo {
pub deprecated: bool,
pub latest: Option<String>,
}
impl Resolver {
pub fn direct_dep_info(&self, graph: &LockfileGraph) -> HashMap<String, DirectDepInfo> {
let mut out: HashMap<String, DirectDepInfo> = HashMap::new();
for deps in graph.importers.values() {
for dep in deps {
let Some(pkg) = graph.packages.get(&dep.dep_path) else {
continue;
};
if pkg.local_source.is_some() {
continue;
}
let Some(packument) = self.cache.get(pkg.registry_name()) else {
continue;
};
let deprecated = packument
.versions
.get(&pkg.version)
.is_some_and(|v| v.deprecated.is_some());
let latest = packument
.dist_tags
.get("latest")
.filter(|l| l.as_str() != pkg.version.as_str())
.filter(|l| !is_prerelease(l))
.cloned();
if deprecated || latest.is_some() {
out.insert(dep.dep_path.clone(), DirectDepInfo { deprecated, latest });
}
}
}
out
}
}
fn is_prerelease(version: &str) -> bool {
node_semver::Version::parse(version)
.map(|v| !v.pre_release.is_empty())
.unwrap_or(false)
}
#[cfg(test)]
mod tests {
use super::is_prerelease;
#[test]
fn detects_prerelease_versions() {
assert!(is_prerelease("1.0.0-beta.1"));
assert!(is_prerelease("2.0.0-rc.0"));
assert!(is_prerelease("0.1.0-alpha"));
}
#[test]
fn stable_versions_are_not_prerelease() {
assert!(!is_prerelease("1.0.0"));
assert!(!is_prerelease("0.0.1"));
assert!(!is_prerelease("not-a-version"));
}
}