use std::process::Command;
use crate::error::ZtlError;
pub enum PackageManager {
Npm,
Yarn,
YarnClassic,
Pnpm,
}
impl PackageManager {
pub fn detect() -> Result<Self, ZtlError> {
if which::which("pnpm").is_ok() {
Ok(PackageManager::Pnpm)
} else if which::which("yarn").is_ok() {
if is_classic_yarn() {
Ok(PackageManager::YarnClassic)
} else {
Ok(PackageManager::Yarn)
}
} else if which::which("npm").is_ok() {
Ok(PackageManager::Npm)
} else {
Err(ZtlError::NoPackageManagerFound)
}
}
pub fn command_and_run_arg(&self) -> (&'static str, &'static str) {
match self {
PackageManager::Npm => ("npm", "run"),
PackageManager::Yarn => ("yarn", "run"),
PackageManager::YarnClassic => ("yarn", ""),
PackageManager::Pnpm => ("pnpm", ""),
}
}
}
fn is_classic_yarn() -> bool {
if let Ok(output) = Command::new("yarn").arg("--version").output() {
if let Ok(version) = String::from_utf8(output.stdout) {
return version.trim().starts_with('1');
}
}
false
}