function nvm --description "Node version manager" for silent in --silent -s if set --local index (contains --index -- $silent $argv) set --erase argv[$index] && break end set --erase silent end set --local cmd $argv[1] set --local ver $argv[2] if set --query silent && ! set --query cmd[1] echo "nvm: Version number not specified (see nvm -h for usage)" >&2 return 1 end if ! set --query ver[1] && contains -- "$cmd" install use for file in .nvmrc .node-version set file (_nvm_find_up $PWD $file) && read ver <$file && break end if ! set --query ver[1] echo "nvm: Invalid version or missing \".nvmrc\" file" >&2 return 1 end end set --local their_version $ver switch "$cmd" case -v --version echo "nvm, version 2.2.11" case "" -h --help echo "Usage: nvm install Download and activate the specified Node version" echo " nvm install Install version from nearest .nvmrc file" echo " nvm use Activate a version in the current shell" echo " nvm use Activate version from nearest .nvmrc file" echo " nvm list List installed versions" echo " nvm list-remote List versions available to install" echo " nvm list-remote List versions matching a given regular expression" echo " nvm current Print the currently-active version" echo " nvm uninstall Uninstall a version" echo "Options:" echo " -s or --silent Suppress standard output" echo " -v or --version Print version" echo " -h or --help Print this help message" echo "Variables:" echo " nvm_arch Override architecture, e.g. x64-musl" echo " nvm_mirror Use a mirror of the Node binaries" echo " nvm_default_version Set the default version for new shells" echo " nvm_default_packages Install a list of packages every time you install a Node version" case install _nvm_index_update string match --entire --regex -- (_nvm_version_match $ver) <$nvm_data/.index | read ver alias if ! set --query ver[1] echo "nvm: Invalid version number or alias: \"$their_version\"" >&2 return 1 end if test ! -e $nvm_data/$ver set --local os (command uname -s | string lower) set --local ext tar.gz set --local arch (command uname -m) switch $os case aix set arch ppc64 case sunos case linux case darwin case {MSYS_NT,MINGW\*_NT}\* set os win set ext zip case \* echo "nvm: Unsupported operating system: \"$os\"" >&2 return 1 end switch $arch case i\*86 set arch x86 case x86_64 set arch x64 case arm64 string match --regex --quiet "v(?\d+)" $ver if test "$os" = darwin -a $major -lt 16 set arch x64 end case armv6 armv6l set arch armv6l case armv7 armv7l set arch armv7l case armv8 armv8l aarch64 set arch arm64 end set --query nvm_arch && set arch $nvm_arch set --local dir "node-$ver-$os-$arch" set --local url $nvm_mirror/$ver/$dir.$ext command mkdir -p $nvm_data/$ver if ! set --query silent echo -e "Installing Node \x1b[1m$ver\x1b[22m $alias" echo -e "Fetching \x1b[4m$url\x1b[24m\x1b[7m" end if ! command curl $silent --progress-bar --location $url | command tar --extract --gzip --directory $nvm_data/$ver 2>/dev/null command rm -rf $nvm_data/$ver echo -e "\033[F\33[2K\x1b[0mnvm: Invalid mirror or host unavailable: \"$url\"" >&2 return 1 end set --query silent || echo -en "\033[F\33[2K\x1b[0m" if test "$os" = win command mv $nvm_data/$ver/$dir $nvm_data/$ver/bin else command mv $nvm_data/$ver/$dir/* $nvm_data/$ver command rm -rf $nvm_data/$ver/$dir end end if test $ver != "$nvm_current_version" set --query nvm_current_version && _nvm_version_deactivate $nvm_current_version _nvm_version_activate $ver set --query nvm_default_packages[1] && npm install --global $silent $nvm_default_packages end set --query silent || printf "Now using Node %s (npm %s) %s\n" (_nvm_node_info) case use test $ver = default && set ver $nvm_default_version _nvm_list | string match --entire --regex -- (_nvm_version_match $ver) | read ver __ if ! set --query ver[1] echo "nvm: Can't use Node \"$their_version\", version must be installed first" >&2 return 1 end if test $ver != "$nvm_current_version" set --query nvm_current_version && _nvm_version_deactivate $nvm_current_version test $ver != system && _nvm_version_activate $ver end set --query silent || printf "Now using Node %s (npm %s) %s\n" (_nvm_node_info) case uninstall if test -z "$ver" echo "nvm: Not enough arguments for command: \"$cmd\"" >&2 return 1 end test $ver = default && test ! -z "$nvm_default_version" && set ver $nvm_default_version _nvm_list | string match --entire --regex -- (_nvm_version_match $ver) | read ver __ if ! set -q ver[1] echo "nvm: Node version not installed or invalid: \"$their_version\"" >&2 return 1 end set --query silent || printf "Uninstalling Node %s %s\n" $ver (string replace ~ \~ "$nvm_data/$ver/bin/node") _nvm_version_deactivate $ver command rm -rf $nvm_data/$ver case current _nvm_current case ls list _nvm_list | _nvm_list_format (_nvm_current) $argv[2] case lsr {ls,list}-remote _nvm_index_update || return _nvm_list | command awk ' FILENAME == "-" && (is_local[$1] = FNR == NR) { next } { print $0 (is_local[$1] ? " ✓" : "") } ' - $nvm_data/.index | _nvm_list_format (_nvm_current) $argv[2] case \* echo "nvm: Unknown command or option: \"$cmd\" (see nvm -h for usage)" >&2 return 1 end end function _nvm_find_up --argument-names path file test -e "$path/$file" && echo $path/$file || begin test ! -z "$path" || return _nvm_find_up (string replace --regex -- '/[^/]*$' "" $path) $file end end function _nvm_version_match --argument-names ver string replace --regex -- '^v?(\d+|\d+\.\d+)$' 'v$1.' $ver | string replace --filter --regex -- '^v?(\d+)' 'v$1' | string escape --style=regex || string lower '\b'$ver'(?:/\w+)?$' end function _nvm_list_format --argument-names current regex command awk -v current="$current" -v regex="$regex" ' $0 ~ regex { aliases[versions[i++] = $1] = $2 " " $3 pad = (n = length($1)) > pad ? n : pad } END { if (!i) exit 1 while (i--) printf((current == versions[i] ? " ▶ " : " ") "%"pad"s %s\n", versions[i], aliases[versions[i]]) } ' end function _nvm_current command --search --quiet node || return set --query nvm_current_version && echo $nvm_current_version || echo system end function _nvm_node_info set --local npm_path (string replace bin/npm-cli.js "" (realpath (command --search npm))) test -f $npm_path/package.json || set --local npm_version_default (command npm --version) command node --eval " console.log(process.version) console.log('$npm_version_default' ? '$npm_version_default': require('$npm_path/package.json').version) console.log(process.execPath.replace(require('os').homedir(), '~')) " end