|
@@ -75,10 +75,12 @@ struct CargoManifest {
|
|
|
dependencies: HashMap<String, CargoManifestDependency>,
|
|
|
}
|
|
|
|
|
|
+#[derive(Debug, PartialEq, Eq)]
|
|
|
enum PackageManager {
|
|
|
Npm,
|
|
|
Pnpm,
|
|
|
Yarn,
|
|
|
+ Berry,
|
|
|
}
|
|
|
|
|
|
#[derive(Debug, Parser)]
|
|
@@ -165,6 +167,23 @@ fn npm_latest_version(pm: &PackageManager, name: &str) -> crate::Result<Option<S
|
|
|
Ok(None)
|
|
|
}
|
|
|
}
|
|
|
+ PackageManager::Berry => {
|
|
|
+ let mut cmd = cross_command("yarn");
|
|
|
+
|
|
|
+ let output = cmd
|
|
|
+ .arg("npm")
|
|
|
+ .arg("info")
|
|
|
+ .arg(name)
|
|
|
+ .args(["--fields", "version", "--json"])
|
|
|
+ .output()?;
|
|
|
+ if output.status.success() {
|
|
|
+ let info: crate::PackageJson =
|
|
|
+ serde_json::from_reader(std::io::Cursor::new(output.stdout)).unwrap();
|
|
|
+ Ok(info.version)
|
|
|
+ } else {
|
|
|
+ Ok(None)
|
|
|
+ }
|
|
|
+ }
|
|
|
PackageManager::Npm => {
|
|
|
let mut cmd = cross_command("npm");
|
|
|
|
|
@@ -195,29 +214,46 @@ fn npm_package_version<P: AsRef<Path>>(
|
|
|
name: &str,
|
|
|
app_dir: P,
|
|
|
) -> crate::Result<Option<String>> {
|
|
|
- let output = match pm {
|
|
|
- PackageManager::Yarn => cross_command("yarn")
|
|
|
- .args(&["list", "--pattern"])
|
|
|
- .arg(name)
|
|
|
- .args(&["--depth", "0"])
|
|
|
- .current_dir(app_dir)
|
|
|
- .output()?,
|
|
|
- PackageManager::Npm => cross_command("npm")
|
|
|
- .arg("list")
|
|
|
- .arg(name)
|
|
|
- .args(&["version", "--depth", "0"])
|
|
|
- .current_dir(app_dir)
|
|
|
- .output()?,
|
|
|
- PackageManager::Pnpm => cross_command("pnpm")
|
|
|
- .arg("list")
|
|
|
- .arg(name)
|
|
|
- .args(&["--parseable", "--depth", "0"])
|
|
|
- .current_dir(app_dir)
|
|
|
- .output()?,
|
|
|
+ let (output, regex) = match pm {
|
|
|
+ PackageManager::Yarn => (
|
|
|
+ cross_command("yarn")
|
|
|
+ .args(&["list", "--pattern"])
|
|
|
+ .arg(name)
|
|
|
+ .args(&["--depth", "0"])
|
|
|
+ .current_dir(app_dir)
|
|
|
+ .output()?,
|
|
|
+ None,
|
|
|
+ ),
|
|
|
+ PackageManager::Berry => (
|
|
|
+ cross_command("yarn")
|
|
|
+ .arg("info")
|
|
|
+ .arg(name)
|
|
|
+ .current_dir(app_dir)
|
|
|
+ .output()?,
|
|
|
+ Some(regex::Regex::new("Version: ([\\da-zA-Z\\-\\.]+)").unwrap()),
|
|
|
+ ),
|
|
|
+ PackageManager::Npm => (
|
|
|
+ cross_command("npm")
|
|
|
+ .arg("list")
|
|
|
+ .arg(name)
|
|
|
+ .args(&["version", "--depth", "0"])
|
|
|
+ .current_dir(app_dir)
|
|
|
+ .output()?,
|
|
|
+ None,
|
|
|
+ ),
|
|
|
+ PackageManager::Pnpm => (
|
|
|
+ cross_command("pnpm")
|
|
|
+ .arg("list")
|
|
|
+ .arg(name)
|
|
|
+ .args(&["--parseable", "--depth", "0"])
|
|
|
+ .current_dir(app_dir)
|
|
|
+ .output()?,
|
|
|
+ None,
|
|
|
+ ),
|
|
|
};
|
|
|
if output.status.success() {
|
|
|
let stdout = String::from_utf8_lossy(&output.stdout);
|
|
|
- let regex = regex::Regex::new("@([\\da-zA-Z\\-\\.]+)").unwrap();
|
|
|
+ let regex = regex.unwrap_or_else(|| regex::Regex::new("@([\\da-zA-Z\\-\\.]+)").unwrap());
|
|
|
Ok(
|
|
|
regex
|
|
|
.captures_iter(&stdout)
|
|
@@ -530,7 +566,7 @@ impl VersionBlock {
|
|
|
let target_version = semver::Version::parse(self.target_version.as_str()).unwrap();
|
|
|
if version < target_version {
|
|
|
print!(
|
|
|
- "({}, latest: {})",
|
|
|
+ " ({}, latest: {})",
|
|
|
"outdated".red(),
|
|
|
self.target_version.green()
|
|
|
);
|
|
@@ -613,6 +649,10 @@ pub fn command(_options: Options) -> Result<()> {
|
|
|
.unwrap_or_default();
|
|
|
panic::set_hook(hook);
|
|
|
|
|
|
+ let yarn_version = get_version("yarn", &[])
|
|
|
+ .unwrap_or_default()
|
|
|
+ .unwrap_or_default();
|
|
|
+
|
|
|
let metadata = version_metadata()?;
|
|
|
VersionBlock::new(
|
|
|
"Node.js",
|
|
@@ -640,13 +680,7 @@ pub fn command(_options: Options) -> Result<()> {
|
|
|
.unwrap_or_default(),
|
|
|
)
|
|
|
.display();
|
|
|
- VersionBlock::new(
|
|
|
- "yarn",
|
|
|
- get_version("yarn", &[])
|
|
|
- .unwrap_or_default()
|
|
|
- .unwrap_or_default(),
|
|
|
- )
|
|
|
- .display();
|
|
|
+ VersionBlock::new("yarn", &yarn_version).display();
|
|
|
VersionBlock::new(
|
|
|
"rustup",
|
|
|
get_version("rustup", &[])
|
|
@@ -695,20 +729,23 @@ pub fn command(_options: Options) -> Result<()> {
|
|
|
|
|
|
let mut package_manager = PackageManager::Npm;
|
|
|
if let Some(app_dir) = &app_dir {
|
|
|
- let file_names = read_dir(app_dir)
|
|
|
+ let app_dir_entries = read_dir(app_dir)
|
|
|
.unwrap()
|
|
|
- .filter(|e| {
|
|
|
- e.as_ref()
|
|
|
- .unwrap()
|
|
|
- .metadata()
|
|
|
- .unwrap()
|
|
|
- .file_type()
|
|
|
- .is_file()
|
|
|
- })
|
|
|
.map(|e| e.unwrap().file_name().to_string_lossy().into_owned())
|
|
|
.collect::<Vec<String>>();
|
|
|
- package_manager = get_package_manager(&file_names)?;
|
|
|
+ package_manager = get_package_manager(&app_dir_entries)?;
|
|
|
+ }
|
|
|
+
|
|
|
+ if package_manager == PackageManager::Yarn
|
|
|
+ && yarn_version
|
|
|
+ .chars()
|
|
|
+ .next()
|
|
|
+ .map(|c| c > '1')
|
|
|
+ .unwrap_or_default()
|
|
|
+ {
|
|
|
+ package_manager = PackageManager::Berry;
|
|
|
}
|
|
|
+
|
|
|
VersionBlock::new(
|
|
|
format!("{} {}", "@tauri-apps/cli", "[NPM]".dimmed()),
|
|
|
metadata.js_cli.version,
|
|
@@ -852,12 +889,12 @@ pub fn command(_options: Options) -> Result<()> {
|
|
|
Ok(())
|
|
|
}
|
|
|
|
|
|
-fn get_package_manager<T: AsRef<str>>(file_names: &[T]) -> crate::Result<PackageManager> {
|
|
|
+fn get_package_manager<T: AsRef<str>>(app_dir_entries: &[T]) -> crate::Result<PackageManager> {
|
|
|
let mut use_npm = false;
|
|
|
let mut use_pnpm = false;
|
|
|
let mut use_yarn = false;
|
|
|
|
|
|
- for name in file_names {
|
|
|
+ for name in app_dir_entries {
|
|
|
if name.as_ref() == "package-lock.json" {
|
|
|
use_npm = true;
|
|
|
} else if name.as_ref() == "pnpm-lock.yaml" {
|