From 1327bb8d6b99ac5caa9850f973700b56a6ecb781 Mon Sep 17 00:00:00 2001
From: Amit Dahan <amitdahan11@gmail.com>
Date: Sat, 19 Nov 2022 21:20:15 +0200
Subject: [PATCH] Replace semver with node-semver (#816)

Co-authored-by: Gal Schlezinger <gal@spitfire.co.il>
---
 .changeset/serious-parents-tease.md |  5 +++
 Cargo.lock                          | 60 ++++++++++++++++++++++++++++-
 Cargo.toml                          |  2 +-
 src/current_version.rs              |  2 +-
 src/installed_versions.rs           |  2 +-
 src/user_version.rs                 |  2 +-
 src/user_version_reader.rs          |  2 +-
 src/version.rs                      | 12 +++---
 8 files changed, 75 insertions(+), 12 deletions(-)
 create mode 100644 .changeset/serious-parents-tease.md

diff --git a/.changeset/serious-parents-tease.md b/.changeset/serious-parents-tease.md
new file mode 100644
index 0000000..36f3c74
--- /dev/null
+++ b/.changeset/serious-parents-tease.md
@@ -0,0 +1,5 @@
+---
+"fnm": minor
+---
+
+Replace `semver` with `node_semver`
diff --git a/Cargo.lock b/Cargo.lock
index 3097cea..8cea767 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -155,6 +155,12 @@ version = "3.11.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "572f695136211188308f16ad2ca5c851a712c464060ae6974944458eb83880ba"
 
+[[package]]
+name = "bytecount"
+version = "0.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2c676a478f63e9fa2dd5368a42f28bba0d6c560b775f38583c8bbaa7fcd67c9c"
+
 [[package]]
 name = "byteorder"
 version = "1.4.3"
@@ -615,9 +621,9 @@ dependencies = [
  "indoc",
  "junction",
  "log",
+ "node-semver",
  "pretty_assertions",
  "reqwest",
- "semver",
  "serde",
  "serde_json",
  "sysinfo",
@@ -1001,12 +1007,41 @@ dependencies = [
  "autocfg",
 ]
 
+[[package]]
+name = "miette"
+version = "5.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a28d6092d7e94a90bb9ea8e6c26c99d5d112d49dda2afdb4f7ea8cf09e1a5a6d"
+dependencies = [
+ "miette-derive",
+ "once_cell",
+ "thiserror",
+ "unicode-width",
+]
+
+[[package]]
+name = "miette-derive"
+version = "5.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4f2485ed7d1fe80704928e3eb86387439609bd0c6bb96db8208daa364cfd1e09"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
 [[package]]
 name = "mime"
 version = "0.3.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d"
 
+[[package]]
+name = "minimal-lexical"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
+
 [[package]]
 name = "miniz_oxide"
 version = "0.5.4"
@@ -1028,6 +1063,29 @@ dependencies = [
  "windows-sys 0.42.0",
 ]
 
+[[package]]
+name = "node-semver"
+version = "2.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "84f390c1756333538f2aed01cf280a56bc683e199b9804a504df6e7320d40116"
+dependencies = [
+ "bytecount",
+ "miette",
+ "nom",
+ "serde",
+ "thiserror",
+]
+
+[[package]]
+name = "nom"
+version = "7.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a8903e5a29a317527874d0402f867152a3d21c908bb0b933e416c65e301d4c36"
+dependencies = [
+ "memchr",
+ "minimal-lexical",
+]
+
 [[package]]
 name = "ntapi"
 version = "0.4.0"
diff --git a/Cargo.toml b/Cargo.toml
index 8a69bee..b5f6db2 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -15,7 +15,7 @@ serde_json = "1.0.88"
 chrono = { version = "0.4.23", features = ["serde"] }
 tar = "0.4.38"
 xz2 = "0.1.7"
-semver = "1.0.14"
+node-semver = "2.1.0"
 dirs = "4.0.0"
 colored = "2.0.0"
 zip = "0.6.3"
diff --git a/src/current_version.rs b/src/current_version.rs
index 8dbf846..7e73960 100644
--- a/src/current_version.rs
+++ b/src/current_version.rs
@@ -36,7 +36,7 @@ pub enum Error {
     EnvNotApplied,
     #[error("Can't read the version as a valid semver")]
     VersionError {
-        source: semver::Error,
+        source: node_semver::SemverError,
         version: String,
     },
 }
diff --git a/src/installed_versions.rs b/src/installed_versions.rs
index bf2a147..5e06e3b 100644
--- a/src/installed_versions.rs
+++ b/src/installed_versions.rs
@@ -36,6 +36,6 @@ pub enum Error {
     #[error(transparent)]
     SemverError {
         #[from]
-        source: semver::Error,
+        source: node_semver::SemverError,
     },
 }
diff --git a/src/user_version.rs b/src/user_version.rs
index bf1897e..b7524c5 100644
--- a/src/user_version.rs
+++ b/src/user_version.rs
@@ -70,7 +70,7 @@ fn skip_first_v(str: &str) -> &str {
 }
 
 impl FromStr for UserVersion {
-    type Err = semver::Error;
+    type Err = node_semver::SemverError;
     fn from_str(s: &str) -> Result<UserVersion, Self::Err> {
         match Version::parse(s) {
             Ok(v) => Ok(Self::Full(v)),
diff --git a/src/user_version_reader.rs b/src/user_version_reader.rs
index 14190a6..8c79c7a 100644
--- a/src/user_version_reader.rs
+++ b/src/user_version_reader.rs
@@ -21,7 +21,7 @@ impl UserVersionReader {
 }
 
 impl FromStr for UserVersionReader {
-    type Err = semver::Error;
+    type Err = node_semver::SemverError;
 
     fn from_str(s: &str) -> Result<Self, Self::Err> {
         let pathbuf = PathBuf::from_str(s);
diff --git a/src/version.rs b/src/version.rs
index 89d792f..5c02ab7 100644
--- a/src/version.rs
+++ b/src/version.rs
@@ -6,7 +6,7 @@ use std::str::FromStr;
 
 #[derive(Debug, PartialEq, PartialOrd, Eq, Ord, Clone)]
 pub enum Version {
-    Semver(semver::Version),
+    Semver(node_semver::Version),
     Lts(LtsType),
     Alias(String),
     Latest,
@@ -18,7 +18,7 @@ fn first_letter_is_number(s: &str) -> bool {
 }
 
 impl Version {
-    pub fn parse<S: AsRef<str>>(version_str: S) -> Result<Self, semver::Error> {
+    pub fn parse<S: AsRef<str>>(version_str: S) -> Result<Self, node_semver::SemverError> {
         let lowercased = version_str.as_ref().to_lowercase();
         if lowercased == system_version::display_name() {
             Ok(Self::Bypassed)
@@ -27,7 +27,7 @@ impl Version {
             Ok(Self::Lts(lts_type))
         } else if first_letter_is_number(lowercased.trim_start_matches('v')) {
             let version_plain = lowercased.trim_start_matches('v');
-            let sver = semver::Version::parse(version_plain)?;
+            let sver = node_semver::Version::parse(version_plain)?;
             Ok(Self::Semver(sver))
         } else {
             Ok(Self::Alias(lowercased))
@@ -100,14 +100,14 @@ impl std::fmt::Display for Version {
 }
 
 impl FromStr for Version {
-    type Err = semver::Error;
+    type Err = node_semver::SemverError;
     fn from_str(s: &str) -> Result<Version, Self::Err> {
         Self::parse(s)
     }
 }
 
-impl PartialEq<semver::Version> for Version {
-    fn eq(&self, other: &semver::Version) -> bool {
+impl PartialEq<node_semver::Version> for Version {
+    fn eq(&self, other: &node_semver::Version) -> bool {
         match self {
             Self::Bypassed | Self::Lts(_) | Self::Alias(_) | Self::Latest => false,
             Self::Semver(v) => v == other,