From 7e589de3ca28b3644ba977d177203a0d80504e43 Mon Sep 17 00:00:00 2001
From: Vincent Hardouin <vincenthardouin@icloud.com>
Date: Sat, 5 Nov 2022 22:22:38 +0100
Subject: [PATCH 1/4] fix: typo in arg

---
 npm-bump | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/npm-bump b/npm-bump
index 61c0b45..820dcd4 100755
--- a/npm-bump
+++ b/npm-bump
@@ -35,7 +35,7 @@ function handle_arguments() {
       show_help
       exit
       ;;
-    -m | --mardown)
+    -m | --markdown)
       markdown=1
       ;;
     -e | --exclude)

From 0c35ac018474c535e8666e2d9bc7b2f72ae49aaa Mon Sep 17 00:00:00 2001
From: Vincent Hardouin <vincenthardouin@icloud.com>
Date: Sat, 5 Nov 2022 22:23:07 +0100
Subject: [PATCH 2/4] feat: add step-by-step arg

---
 npm-bump | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/npm-bump b/npm-bump
index 820dcd4..d145be7 100755
--- a/npm-bump
+++ b/npm-bump
@@ -46,6 +46,9 @@ function handle_arguments() {
     -nt | --no-test)
       no_test=1
       ;;
+    -sbs | --step-by-step)
+      step_by_step=1
+      ;;
     *)
       break
       ;;
@@ -60,6 +63,7 @@ function show_help() {
   printf "  %-25s %s\n" "-m, --markdown" "display updated packages in markdown table"
   printf "  %-25s %s\n" "-e, --exclude" "exclude package name seprated by a comma (e.g -e lodash,mocha)"
   printf "  %-25s %s\n" "-nt, --no-test" "does not run test command when update package"
+  printf "  %-25s %s\n" "-sbs, --step-by-step" "test bump version step by step"
 }
 
 function commit_bump() {

From 19bf856054c0083021b3e14ca462385319d814d8 Mon Sep 17 00:00:00 2001
From: Vincent Hardouin <vincenthardouin@icloud.com>
Date: Sat, 5 Nov 2022 22:24:52 +0100
Subject: [PATCH 3/4] feat: add get newest version function

---
 npm-bump | 27 ++++++++++++++++++++++++++-
 1 file changed, 26 insertions(+), 1 deletion(-)

diff --git a/npm-bump b/npm-bump
index d145be7..36b1e2b 100755
--- a/npm-bump
+++ b/npm-bump
@@ -81,6 +81,31 @@ function add_updated_package_informations() {
   new_version_packages+=("$3")
 }
 
+function verlte() { printf '%s\n%s' "$1" "$2" | sort -C -V; }
+function verlt() { ! verlte "$2" "$1"; }
+
+function get_versions() {
+    read -r -d '\n' -a versions < <( npm view "$1" versions --json | awk -F "[,\n]" '!/\[|beta|alpha|rc|\]/ { gsub(/"/, "", $1); print $1}' | sort -V --reverse )
+}
+
+function filter_new_versions() {
+    for i in "${versions[@]}"
+    do
+        # shellcheck disable=SC2086
+        if verlt $1 $i; then
+            desc_newest_versions+=("$i")
+        else
+            break
+        fi
+    done
+}
+
+function get_newest_versions() {
+    get_versions "$1"
+    filter_new_versions "$2"
+    read -r -d '\n' -a newest_versions < <( printf '%s\n' "${desc_newest_versions[@]}" | sort -V )
+}
+
 function bump_version() {
   if [ -z ${exclude+x} ]; then
     outdated_packages=$(npm outdated | tail -n +2)
@@ -166,4 +191,4 @@ function show_result() {
 handle_arguments "$@"
 npm_files_exist
 bump_version
-show_result
+show_result
\ No newline at end of file

From b981137ada3fab07e3e737feee681af11d8f3500 Mon Sep 17 00:00:00 2001
From: Vincent Hardouin <vincenthardouin@icloud.com>
Date: Sat, 5 Nov 2022 22:25:51 +0100
Subject: [PATCH 4/4] feat: allow step-by-step in bump-version method

---
 npm-bump | 48 ++++++++++++++++++++++++++++++++----------------
 1 file changed, 32 insertions(+), 16 deletions(-)

diff --git a/npm-bump b/npm-bump
index 36b1e2b..793c189 100755
--- a/npm-bump
+++ b/npm-bump
@@ -5,6 +5,7 @@ declare -a old_version_packages
 declare -a new_version_packages
 declare -a no_updated_packages
 markdown=0
+step_by_step=0
 
 trap ctrl_c SIGINT
 
@@ -106,6 +107,27 @@ function get_newest_versions() {
     read -r -d '\n' -a newest_versions < <( printf '%s\n' "${desc_newest_versions[@]}" | sort -V )
 }
 
+function install_version() {
+    echo "Try to bump $1 from $2 to $3"
+
+    if [ -z ${no_test} ]; then
+        npm install "$1"@"$3" && npm test
+    else
+        npm install "$1"@"$3"
+    fi
+
+    # shellcheck disable=SC2181
+    if [ $? -eq 0 ]; then
+        commit_bump "$1" "$2" "$3"
+        add_updated_package_informations "$1" "$2" "$3"
+        status=0
+    else
+        no_updated_packages+=("$1")
+        undo_changes
+        status=1
+    fi
+}
+
 function bump_version() {
   if [ -z ${exclude+x} ]; then
     outdated_packages=$(npm outdated | tail -n +2)
@@ -115,24 +137,18 @@ function bump_version() {
 
   if [ -n "$outdated_packages" ]; then
     # shellcheck disable=SC2034
-    while read -r package actual_version coll3 latest_version col4; do
-      echo "Try to bump ${package} from ${actual_version} to ${latest_version}"
-
-      if [ -z ${no_test} ]; then
-        npm install "$package"@"$latest_version" && npm test
-      else
-        npm install "$package"@"$latest_version"
-      fi
-
-      # shellcheck disable=SC2181
-      if [ $? -eq 0 ]; then
-        commit_bump "$package" "$actual_version" "$latest_version"
-        add_updated_package_informations "$package" "$actual_version" "$latest_version"
+    while read -r package actual_version col3 latest_version col4; do
+      if [ ${step_by_step} -eq 0 ]; then
+        install_version "${package}" "${actual_version}" "${latest_version}"
       else
-        no_updated_packages+=("${package}")
-        undo_changes
+        get_newest_versions "${package}" "${actual_version}"
+        for version in "${newest_versions[@]}"; do
+          install_version "${package}" "${actual_version}" "${version}"
+          if [ ${status} -eq 1 ]; then
+            break
+          fi
+        done
       fi
-
     done <<<"$outdated_packages"
   fi
 }