Skip to content

Instantly share code, notes, and snippets.

@brock
Last active April 17, 2024 08:26
Show Gist options
  • Save brock/5b1b70590e1171c4ab54 to your computer and use it in GitHub Desktop.
Save brock/5b1b70590e1171c4ab54 to your computer and use it in GitHub Desktop.
Complete Node Reinstall. I've moved this to a repo at http://git.io/node-reinstall
#!/bin/bash
# node-reinstall
# credit: http://stackoverflow.com/a/11178106/2083544
## program version
VERSION="0.0.13"
## path prefix
PREFIX="${PREFIX:-/usr/local}"
## version control systems
USE_NAVE=0
USE_NVM=1
# use --force to bypass user confirmation
FORCE=0
## default node version
NODE_VERSION="0.10"
usage () {
printf "%s\n" "node-reinstall"
printf "\t%s\n" "completely re-installs Node & NPM and any global node modules."
printf "\t%s\n" "It re-installs Node using NVM or Nave"
printf "\n"
printf "%s\t%s\n" "Usage:" "node-reinstall [--nave|--nvm|--nvm-latest] [-h|--help] [-v|--version] [NODE_VERSION]"
printf "\n"
printf "%s\n" "Commands:"
printf "\n"
printf "\t%s\t\t\t%s\n" "node-reinstall" "re-install node and npm using nvm"
printf "\t%s %s\t%s\n" "node-reinstall" "[-h|--help]" "show help"
printf "\t%s %s\t%s\n" "node-reinstall" "[-v|--version]" "show the node-reinstall version number"
printf "\t%s %s\t%s\n" "node-reinstall" "[-f|--force]" "installs defaults without user confirmation"
printf "\t%s %s\t\t%s\n" "node-reinstall" "--nave" "re-install using nave"
printf "\t%s %s\t\t%s\n" "node-reinstall" "--nvm" "re-install using stable nvm - the default"
printf "\t%s %s\t%s\n" "node-reinstall" "--nvm-latest" "re-install using latest nvm - creationix/nvm:master"
printf "\t%s %s\t\t%s\n" "node-reinstall" "0.12" "specify a default node version - currently ${NODE_VERSION}"
printf "\n"
}
## parse opts
{
for opt in ${@}; do
case $opt in
--help|-h)
usage
exit
;;
--version|-v)
echo ${VERSION}
exit
;;
--force|-f)
FORCE=1
;;
--nave)
USE_NAVE=1
USE_NVM=0
;;
--nvm)
USE_NVM=1
USE_NAVE=0
;;
--nvm-latest)
USE_NVM=1
USE_NAVE=0
STABLE=master
;;
*)
if [ "-" == "${opt:0:1}" ]; then
echo >&2 "error: Unknown option \`$opt'"
usage >&2
exit 1
fi
NODE_VERSION="${opt}"
esac
done
}
# get sudo
sudo -v
# check to see if npm is installed
IS_NPM_MISSING=$(which npm)
if [[ -z $IS_NPM_MISSING ]]; then
echo "Installing Node, npm."
else
echo "Completely reinstalling Node, npm."
# get list of global npm modules to reinstall
# omit the lib directory listing
GLOBAL_MODULES=`npm -g list --depth 0 --parseable | xargs basename | sed -E 's/^(lib|npm)$//g'`
if [[ -n $GLOBAL_MODULES ]]; then
echo "Will reinstall these global npm modules:"
echo $GLOBAL_MODULES
else
echo "===== ALERT! ====="
echo "The script did not find any global node modules (npm -g list)"
echo "If you are sure you installed global node modules"
echo "(by running npm install -g some-module), you might want to stop "
echo "here and locate those, because they won't be re-installed,"
echo "and since we'll be deleting all the possible install paths "
echo "that most people could use, you probably won't find them."
echo ""
echo "This can sometimes happen if you've installed global node modules"
echo "under a different node environment (for example, using nvm or nave)."
echo "It might help to run: "
echo "history | grep 'npm install' and look for either -g or --global"
echo ""
echo "If you aren't really sure, or you are sure and don't care, "
echo "you can continue; we'll re-install things the proper way, and"
echo "the next time you run this script you'll see a list of "
echo "any global node modules you've installed since now."
fi
if [[ $FORCE == 0 ]]; then
echo ""
echo "Would you like to continue running node-reinstall?"
echo ""
select yn in "Yes" "No"; do
case $yn in
Yes ) break;;
No ) exit;;
esac
done
fi
fi
if (( $USE_NVM )); then
# NVM will think it is still installed if NVM_DIR is still set
unset NVM_DIR
sudo rm -rf $HOME/.nvm
elif (( $USE_NAVE )); then
sudo rm -rf $HOME/.nave
else
echo >&2 "error: Unsupported version control system"
exit 1
fi
# erase all possible install paths
sudo rm -rf $HOME/{local,lib,include,node*,npm,.npm*}
sudo rm -rf $PREFIX/lib/node*
sudo rm -rf $PREFIX/include/node*
sudo rm -rf $PREFIX/bin/{node,npm}
sudo rm -rf $PREFIX/share/man/man1/node.1
sudo rm -rf $PREFIX/lib/dtrace/node.d
if (( $USE_NVM )); then
# go home and install NVM just because I feel safe there
cd $HOME
# get the latest stable version number of nvm from the repo's homepage
[ "$STABLE" == "" ] && STABLE=$(curl -s -k https://github.com/creationix/nvm/ | grep "curl https://raw.githubusercontent.com/creationix/nvm/" | grep -oE "v\d+\.\d+\.\d+")
[[ $STABLE =~ ^v[0-9]+.[0-9]+.[0-9]+$ ]] || STABLE="v0.25.1"
curl -sL https://raw.githubusercontent.com/creationix/nvm/$STABLE/install.sh | bash
source $HOME/.nvm/nvm.sh
elif (( $USE_NAVE )); then
curl -sL https://raw.githubusercontent.com/isaacs/nave/master/nave.sh -o $PREFIX/bin/nave
fi
if (( $USE_NVM )); then
# install the latest 0.10 version of node then set it as the default
nvm install $NODE_VERSION
nvm alias default $NODE_VERSION
elif (( $USE_NAVE )); then
nave usemain $NODE_VERSION
fi
if [[ ! -z ${GLOBAL_MODULES// } ]]; then
echo "Reinstalling your global npm modules:"
echo $GLOBAL_MODULES
if [[ $FORCE == 0 ]]; then
echo "Continue?"
select yn in "Yes" "No"; do
case $yn in
Yes ) npm install --global $GLOBAL_MODULES; break;;
No ) exit;;
esac
done
else
npm install --global $GLOBAL_MODULES
fi
fi
if [[ $OSTYPE =~ "darwin" ]]; then
echo "node-reinstall is done. 👍"
else
echo "node-reinstall is done."
fi
echo "You must restart your terminal for changes to take effect."
@spedley
Copy link

spedley commented Jul 15, 2018

🍺

@Deacs
Copy link

Deacs commented Jul 19, 2018

Amazing! Thanks so much!

@emirbalic
Copy link

Sir, you deserve a diamond medal of honour. Thanks forever!

@NortonGun
Copy link

I wish I could buy you a Beer. Thanks a lot.

@lorepieri8
Copy link

It didn't work for me. Not sure what went wrong honestly, but following this manual instructions worked: https://stackoverflow.com/questions/11177954/how-do-i-completely-uninstall-node-js-and-reinstall-from-beginning-mac-os-x

@usanin
Copy link

usanin commented Aug 8, 2019

You save my mind! Thanks

@barelabs
Copy link

Thank you, amazing!

@Moondancer83
Copy link

This script is awesome!
Could you please update it to most up-to-date node version? or maybe with a line asking for desired version?
Thanks!

@brock
Copy link
Author

brock commented Jan 7, 2020

@Moondancer83 See the repo for some of those updates: https://github.com/brock/node-reinstall

@roshnet
Copy link

roshnet commented Jan 18, 2020

This script definitely is battle-tested!

Thanks! It saved my day.

PS: I use Linux Mint Tessa.

@michaeljakob
Copy link

This didn't install it for macOS zsh (which is default now)

@ankitbhadana
Copy link

This is awesome. I had almost given up. Thanks!

@eli9000
Copy link

eli9000 commented Nov 19, 2021

gif had meh lolz

@nonlocalize
Copy link

Incredible work. Thank you!

@david-rodriguez
Copy link

You're a legend. I ran into an issue with AWS SAM, and this was the solution that fixed it.

@brock
Copy link
Author

brock commented Nov 21, 2022

@david-rodriguez I've not updated this in a long time, so it is still using a default Node.js version from 2014. Be sure to install a newer version of node before you get started! Something like nvm install 16

@david-rodriguez
Copy link

@brock I tweaked the script before running it to install the latest version of node. Nonetheless, you did most of the heavy lifting.

@alok-mani-ds
Copy link

Working perfectly on 1 Aug'23. Thanks a ton.

@seguri
Copy link

seguri commented Oct 9, 2023

Two small suggestions:

  • /usr/local/share/doc/node and /usrl/local/share/systemtap/tapset/node.stp are not cleaned up.
  • update installation steps as shown on nvm-sh/nvm

@brock
Copy link
Author

brock commented Oct 15, 2023

@seguri Thanks for posting the feedback on this script.

Can you share more info on what installer uses each of these install paths? I don't like adding directory deletions without vetting them to some degree in case someone blindly runs my scripts.

  • /usr/local/share/doc/node
  • /usr/local/share/systemtap/tapset/node.stp

And what needs to be updated to the installation steps from nvm-sh/nvm? I'm not up to date on their changes since they move a lot more than I do.

I don't typically update this Gist, but I do make updates to the node-reinstall repo when major changes need to happen, and would be happy to bring it up to date if it makes sense.

Replying here is fine, but if you're familiar with git and Github and want to create a Pull Request with the proposed changes, I'd happily review it and add you to the contributors.

@seguri
Copy link

seguri commented Oct 24, 2023

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment