diff --git a/.github/workflows/latest-npm.yml b/.github/workflows/latest-npm.yml index b368080..2f25052 100644 --- a/.github/workflows/latest-npm.yml +++ b/.github/workflows/latest-npm.yml @@ -37,6 +37,11 @@ jobs: matrix: node-version: ${{ fromJson(needs.matrix.outputs.latest) }} include: + - node-version: "21" + - node-version: "20.5" + - node-version: "20.4" + - node-version: "14.17" + - node-version: "14.16" - node-version: "9.2" - node-version: "9.1" - node-version: "9.0" diff --git a/.github/workflows/npm-publish.yml b/.github/workflows/npm-publish.yml new file mode 100644 index 0000000..2a4766d --- /dev/null +++ b/.github/workflows/npm-publish.yml @@ -0,0 +1,33 @@ +# This workflow will run tests using node and then publish a package to GitHub Packages when a release is created +# For more information see: https://docs.github.com/en/actions/publishing-packages/publishing-nodejs-packages + +name: Node.js Package + +on: + release: + types: [created] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: 20 + - run: npm ci + - run: npm test + + publish-npm: + needs: build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: 20 + registry-url: https://registry.npmjs.org/ + - run: npm ci + - run: npm publish + env: + NODE_AUTH_TOKEN: ${{secrets.npm_token}} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 84fe2d8..d7c3b7f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -19,6 +19,8 @@ jobs: raw.githubusercontent.com:443 registry.npmjs.org:443 - uses: actions/checkout@v4 + with: + fetch-tags: true - uses: actions/setup-node@v4 with: node-version: "14" diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 3e92ec7..4bc1121 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -31,6 +31,8 @@ jobs: suite: - install_script - sourcing + - slow + - installation_iojs shell: - sh - bash diff --git a/.github/workflows/toc.yml b/.github/workflows/toc.yml index 8772bcc..715f03b 100644 --- a/.github/workflows/toc.yml +++ b/.github/workflows/toc.yml @@ -20,6 +20,7 @@ jobs: allowed-endpoints: github.com:443 registry.npmjs.org:443 + api.github.com:443 - uses: actions/checkout@v4 with: # https://github.com/actions/checkout/issues/217#issue-599945005 @@ -30,7 +31,7 @@ jobs: - run: git fetch --depth=1 origin +refs/tags/*:refs/tags/* - uses: actions/setup-node@v4 with: - node-version: '16' + node-version: 'lts/*' - run: npm install - run: npm run doctoc - name: commit changes diff --git a/.travis.yml b/.travis.yml index 07cada9..ed22ae1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -87,18 +87,8 @@ env: - SHELL=bash TEST_SUITE=fast - SHELL=zsh TEST_SUITE=fast # - SHELL=ksh TEST_SUITE=fast - - SHELL=sh TEST_SUITE=slow - - SHELL=dash TEST_SUITE=slow - - SHELL=bash TEST_SUITE=slow - - SHELL=zsh TEST_SUITE=slow - # - SHELL=ksh TEST_SUITE=slow - - SHELL=sh TEST_SUITE=installation_iojs - SHELL=sh TEST_SUITE=installation_iojs WITHOUT_CURL=1 - - SHELL=dash TEST_SUITE=installation_iojs - SHELL=dash TEST_SUITE=installation_iojs WITHOUT_CURL=1 - - SHELL=bash TEST_SUITE=installation_iojs - SHELL=bash TEST_SUITE=installation_iojs WITHOUT_CURL=1 - - SHELL=zsh TEST_SUITE=installation_iojs - SHELL=zsh TEST_SUITE=installation_iojs WITHOUT_CURL=1 - # - SHELL=ksh TEST_SUITE=installation_iojs # - SHELL=ksh TEST_SUITE=installation_iojs WITHOUT_CURL=1 diff --git a/Dockerfile b/Dockerfile index d95bb13..97ff98c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -91,16 +91,20 @@ RUN echo 'nvm ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers # Switch to user "nvm" from now USER nvm +# Create a script file sourced by both interactive and non-interactive bash shells +ENV BASH_ENV /home/nvm/.bash_env +RUN touch "$BASH_ENV" +RUN echo '. "$BASH_ENV"' >> "$HOME/.bashrc" + # nvm -RUN echo 'export NVM_DIR="$HOME/.nvm"' >> "$HOME/.bashrc" -RUN echo '[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" # This loads nvm' >> "$HOME/.bashrc" -RUN echo '[ -s "$NVM_DIR/bash_completion" ] && . "$NVM_DIR/bash_completion" # This loads nvm bash_completion' >> "$HOME/.bashrc" +RUN echo 'export NVM_DIR="$HOME/.nvm"' >> "$BASH_ENV" +RUN echo '[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" # This loads nvm' >> "$BASH_ENV" +RUN echo '[ -s "$NVM_DIR/bash_completion" ] && . "$NVM_DIR/bash_completion" # This loads nvm bash_completion' >> "$BASH_ENV" # nodejs and tools -RUN bash -c 'source $HOME/.nvm/nvm.sh && \ - nvm install node && \ - npm install -g doctoc urchin eclint dockerfile_lint && \ - npm install --prefix "$HOME/.nvm/"' +RUN nvm install node +RUN npm install -g doctoc urchin eclint dockerfile_lint +RUN npm install --prefix "$HOME/.nvm/" # Set WORKDIR to nvm directory WORKDIR /home/nvm/.nvm diff --git a/README.md b/README.md index 89fc5a8..7049f6e 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ -# Node Version Manager [![Build Status](https://app.travis-ci.com/nvm-sh/nvm.svg?branch=master)][3] [![nvm version](https://img.shields.io/badge/version-v0.40.1-yellow.svg)][4] [![CII Best Practices](https://bestpractices.dev/projects/684/badge)](https://bestpractices.dev/projects/684) +# Node Version Manager [![Build Status](https://app.travis-ci.com/nvm-sh/nvm.svg?branch=master)][3] [![nvm version](https://img.shields.io/badge/version-v0.40.2-yellow.svg)][4] [![CII Best Practices](https://bestpractices.dev/projects/684/badge)](https://bestpractices.dev/projects/684) @@ -18,6 +18,8 @@ - [Installing and Updating](#installing-and-updating) - [Install & Update Script](#install--update-script) - [Additional Notes](#additional-notes) + - [Installing in Docker](#installing-in-docker) + - [Installing in Docker for CICD-Jobs](#installing-in-docker-for-cicd-jobs) - [Troubleshooting on Linux](#troubleshooting-on-linux) - [Troubleshooting on macOS](#troubleshooting-on-macos) - [Ansible](#ansible) @@ -102,13 +104,13 @@ nvm is a version manager for [node.js](https://nodejs.org/en/), designed to be i To **install** or **update** nvm, you should run the [install script][2]. To do that, you may either download and run the script manually, or use the following cURL or Wget command: ```sh -curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash +curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.2/install.sh | bash ``` ```sh -wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash +wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.2/install.sh | bash ``` -Running either of the above commands downloads a script and runs it. The script clones the nvm repository to `~/.nvm`, and attempts to add the source lines from the snippet below to the correct profile file (`~/.bash_profile`, `~/.zshrc`, `~/.profile`, or `~/.bashrc`). +Running either of the above commands downloads a script and runs it. The script clones the nvm repository to `~/.nvm`, and attempts to add the source lines from the snippet below to the correct profile file (`~/.bashrc`, `~/.bash_profile`, `~/.zshrc`, or `~/.profile`). If you find the install script is updating the wrong profile file, set the `$PROFILE` env var to the profile file’s path, and then rerun the installation script. ```sh @@ -120,14 +122,94 @@ export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || pr - If the environment variable `$XDG_CONFIG_HOME` is present, it will place the `nvm` files there. -- You can add `--no-use` to the end of the above script (...`nvm.sh --no-use`) to postpone using `nvm` until you manually [`use`](#usage) it. +- You can add `--no-use` to the end of the above script to postpone using `nvm` until you manually [`use`](#usage) it: + +```sh +export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")" +[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" --no-use # This loads nvm, without auto-using the default version +``` - You can customize the install source, directory, profile, and version using the `NVM_SOURCE`, `NVM_DIR`, `PROFILE`, and `NODE_VERSION` variables. Eg: `curl ... | NVM_DIR="path/to/nvm"`. Ensure that the `NVM_DIR` does not contain a trailing slash. - The installer can use `git`, `curl`, or `wget` to download `nvm`, whichever is available. -- You can instruct the installer to not edit your shell config (for example if you already get completions via a [zsh nvm plugin](https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/nvm)) by setting `PROFILE=/dev/null` before running the `install.sh` script. Here's an example one-line command to do that: `PROFILE=/dev/null bash -c 'curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash'` +- You can instruct the installer to not edit your shell config (for example if you already get completions via a [zsh nvm plugin](https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/nvm)) by setting `PROFILE=/dev/null` before running the `install.sh` script. Here's an example one-line command to do that: `PROFILE=/dev/null bash -c 'curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.2/install.sh | bash'` + +#### Installing in Docker + +When invoking bash as a non-interactive shell, like in a Docker container, none of the regular profile files are sourced. In order to use `nvm`, `node`, and `npm` like normal, you can instead specify the special `BASH_ENV` variable, which bash sources when invoked non-interactively. + +```Dockerfile +# Use bash for the shell +SHELL ["/bin/bash", "-o", "pipefail", "-c"] + +# Create a script file sourced by both interactive and non-interactive bash shells +ENV BASH_ENV /home/user/.bash_env +RUN touch "${BASH_ENV}" +RUN echo '. "${BASH_ENV}"' >> ~/.bashrc + +# Download and install nvm +RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.2/install.sh | PROFILE="${BASH_ENV}" bash +RUN echo node > .nvmrc +RUN nvm install +``` + +##### Installing in Docker for CICD-Jobs + +More robust, works in CI/CD-Jobs. Can be run in interactive and non-interactive containers. +See https://github.com/nvm-sh/nvm/issues/3531. + +```Dockerfile +FROM ubuntu:latest +ARG NODE_VERSION=20 + +# install curl +RUN apt update && apt install curl -y + +# install nvm +RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.2/install.sh | bash + +# set env +ENV NVM_DIR=/root/.nvm + +# install node +RUN bash -c "source $NVM_DIR/nvm.sh && nvm install $NODE_VERSION" + +# set ENTRYPOINT for reloading nvm-environment +ENTRYPOINT ["bash", "-c", "source $NVM_DIR/nvm.sh && exec \"$@\"", "--"] + +# set cmd to bash +CMD ["/bin/bash"] + +``` + +This example defaults to installation of nodejs version 20.x.y. Optionally you can easily override the version with docker build args like: +``` +docker build -t nvmimage --build-arg NODE_VERSION=19 . +``` + +After creation of the image you can start container interactively and run commands, for example: +``` +docker run --rm -it nvmimage + +root@0a6b5a237c14:/# nvm -v +0.40.2 + +root@0a6b5a237c14:/# node -v +v19.9.0 + +root@0a6b5a237c14:/# npm -v +9.6.3 +``` + +Noninteractive example: +``` +user@host:/tmp/test $ docker run --rm -it nvmimage node -v +v19.9.0 +user@host:/tmp/test $ docker run --rm -it nvmimage npm -v +9.6.3 +``` #### Troubleshooting on Linux @@ -175,7 +257,7 @@ You can use a task: ```yaml - name: Install nvm ansible.builtin.shell: > - curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash + curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.2/install.sh | bash args: creates: "{{ ansible_env.HOME }}/.nvm/nvm.sh" ``` @@ -207,7 +289,7 @@ If you're running a system without prepackaged binary available, which means you - [bass](https://github.com/edc/bass) allows you to use utilities written for Bash in fish shell - [fast-nvm-fish](https://github.com/brigand/fast-nvm-fish) only works with version numbers (not aliases) but doesn't significantly slow your shell startup - [plugin-nvm](https://github.com/derekstavis/plugin-nvm) plugin for [Oh My Fish](https://github.com/oh-my-fish/oh-my-fish), which makes nvm and its completions available in fish shell - - [fnm](https://github.com/fisherman/fnm) - [fisherman](https://github.com/fisherman/fisherman)-based version manager for fish + - [nvm.fish](https://github.com/jorgebucaran/nvm.fish) - The Node.js version manager you'll adore, crafted just for Fish - [fish-nvm](https://github.com/FabioAntunes/fish-nvm) - Wrapper around nvm for fish, delays sourcing nvm until it's actually used. **Note:** We still have some problems with FreeBSD, because there is no official pre-built binary for FreeBSD, and building from source may need [patches](https://www.freshports.org/www/node/files/patch-deps_v8_src_base_platform_platform-posix.cc); see the issue ticket: @@ -227,7 +309,7 @@ If you're running a system without prepackaged binary available, which means you Homebrew installation is not supported. If you have issues with homebrew-installed `nvm`, please `brew uninstall` it, and install it using the instructions below, before filing an issue. -**Note:** If you're using `zsh` you can easily install `nvm` as a zsh plugin. Install [`zsh-nvm`](https://github.com/lukechilds/zsh-nvm) and run `nvm upgrade` to upgrade. +**Note:** If you're using `zsh` you can easily install `nvm` as a zsh plugin. Install [`zsh-nvm`](https://github.com/lukechilds/zsh-nvm) and run `nvm upgrade` to upgrade ([you can set](https://github.com/lukechilds/zsh-nvm#auto-use) `NVM_AUTO_USE=true` to have it automatically detect and use `.nvmrc` files). **Note:** Git versions before v1.7 may face a problem of cloning `nvm` source from GitHub via https protocol, and there is also different behavior of git before v1.6, and git prior to [v1.17.10](https://github.com/git/git/commit/5a7d5b683f869d3e3884a89775241afa515da9e7) can not clone tags, so the minimum required git version is v1.7.10. If you are interested in the problem we mentioned here, please refer to GitHub's [HTTPS cloning errors](https://help.github.com/articles/https-cloning-errors/) article. @@ -237,7 +319,7 @@ If you have `git` installed (requires git v1.7.10+): 1. clone this repo in the root of your user profile - `cd ~/` from anywhere then `git clone https://github.com/nvm-sh/nvm.git .nvm` -1. `cd ~/.nvm` and check out the latest version with `git checkout v0.40.1` +1. `cd ~/.nvm` and check out the latest version with `git checkout v0.40.2` 1. activate `nvm` by sourcing it from your shell: `. ./nvm.sh` Now add these lines to your `~/.bashrc`, `~/.profile`, or `~/.zshrc` file to have it automatically sourced upon login: @@ -588,9 +670,7 @@ Run [`npx nvmrc`](https://npmjs.com/nvmrc) to validate an `.nvmrc` file. If that ### Deeper Shell Integration -You can use [`avn`](https://github.com/wbyoung/avn) to deeply integrate into your shell and automatically invoke `nvm` when changing directories. `avn` is **not** supported by the `nvm` maintainers. Please [report issues to the `avn` team](https://github.com/wbyoung/avn/issues/new). - -You can also use [`nvshim`](https://github.com/iamogbz/nvshim) to shim the `node`, `npm`, and `npx` bins to automatically use the `nvm` config in the current directory. `nvshim` is **not** supported by the `nvm` maintainers. Please [report issues to the `nvshim` team](https://github.com/iamogbz/nvshim/issues/new). +You can use [`nvshim`](https://github.com/iamogbz/nvshim) to shim the `node`, `npm`, and `npx` bins to automatically use the `nvm` config in the current directory. `nvshim` is **not** supported by the `nvm` maintainers. Please [report issues to the `nvshim` team](https://github.com/iamogbz/nvshim/issues/new). If you prefer a lighter-weight solution, the recipes below have been contributed by `nvm` users. They are **not** supported by the `nvm` maintainers. We are, however, accepting pull requests for more examples. @@ -685,6 +765,8 @@ add-zsh-hook chpwd load-nvmrc load-nvmrc ``` +After saving the file, run `source ~/.zshrc` to reload the configuration with the latest changes made. + ##### fish This requires that you have [bass](https://github.com/edc/bass) installed. @@ -808,7 +890,7 @@ my_alias default v10.22.0 v12.18.3 v14.8.0 ## Compatibility Issues -`nvm` will encounter some issues if you have some non-default settings set. (see [#606](https://github.com/creationix/nvm/issues/606)) +`nvm` will encounter some issues if you have some non-default settings set. (see [#606](https://github.com/nvm-sh/nvm/issues/606)) The following are known to cause issues: Inside `~/.npmrc`: @@ -843,13 +925,13 @@ If installing nvm on Alpine Linux *is* still what you want or need to do, you sh ### Alpine Linux 3.13+ ```sh apk add -U curl bash ca-certificates openssl ncurses coreutils python3 make gcc g++ libgcc linux-headers grep util-linux binutils findutils -curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash +curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.2/install.sh | bash ``` ### Alpine Linux 3.5 - 3.12 ```sh apk add -U curl bash ca-certificates openssl ncurses coreutils python2 make gcc g++ libgcc linux-headers grep util-linux binutils findutils -curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash +curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.2/install.sh | bash ``` _Note: Alpine 3.5 can only install NodeJS versions up to v6.9.5, Alpine 3.6 can only install versions up to v6.10.3, Alpine 3.7 installs versions up to v8.9.3, Alpine 3.8 installs versions up to v8.14.0, Alpine 3.9 installs versions up to v10.19.0, Alpine 3.10 installs versions up to v10.24.1, Alpine 3.11 installs versions up to v12.22.6, Alpine 3.12 installs versions up to v12.22.12, Alpine 3.13 & 3.14 install versions up to v14.20.0, Alpine 3.15 & 3.16 install versions up to v16.16.0 (**These are all versions on the main branch**). Alpine 3.5 - 3.12 required the package `python2` to build NodeJS, as they are older versions to build. Alpine 3.13+ requires `python3` to successfully build newer NodeJS versions, but you can use `python2` with Alpine 3.13+ if you need to build versions of node supported in Alpine 3.5 - 3.15, you just need to specify what version of NodeJS you need to install in the package install script._ @@ -952,9 +1034,9 @@ You have to make sure that the user directory name in `$HOME` and the user direc To change the user directory and/or account name follow the instructions [here](https://support.apple.com/en-us/HT201548) [1]: https://github.com/nvm-sh/nvm.git -[2]: https://github.com/nvm-sh/nvm/blob/v0.40.1/install.sh +[2]: https://github.com/nvm-sh/nvm/blob/v0.40.2/install.sh [3]: https://app.travis-ci.com/nvm-sh/nvm -[4]: https://github.com/nvm-sh/nvm/releases/tag/v0.40.1 +[4]: https://github.com/nvm-sh/nvm/releases/tag/v0.40.2 [Urchin]: https://git.sdf.org/tlevine/urchin [Fish]: https://fishshell.com @@ -1012,7 +1094,7 @@ Here's what you will need to do: If one of these broken versions is installed on your system, the above step will likely still succeed even if you didn't include the `--shared-zlib` flag. However, later, when you attempt to `npm install` something using your old version of node.js, you will see `incorrect data check` errors. If you want to avoid the possible hassle of dealing with this, include that flag. - For more details, see [this issue](https://github.com/nodejs/node/issues/39313) and [this comment](https://github.com/nodejs/node/issues/39313#issuecomment-90.40.176) + For more details, see [this issue](https://github.com/nodejs/node/issues/39313) and [this comment](https://github.com/nodejs/node/issues/39313#issuecomment-90.40.276) - Exit back to your native shell. @@ -1039,7 +1121,7 @@ Now you should be able to use node as usual. If you've encountered this error on WSL-2: ```sh - curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash + curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.2/install.sh | bash % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 0 0 0 0 0 0 0 --:--:-- 0:00:09 --:--:-- 0curl: (6) Could not resolve host: raw.githubusercontent.com @@ -1074,7 +1156,7 @@ Currently, the sole maintainer is [@ljharb](https://github.com/ljharb) - more ma ## Project Support -Only the latest version (v0.40.1 at this time) is supported. +Only the latest version (v0.40.2 at this time) is supported. ## Enterprise Support @@ -1088,6 +1170,5 @@ See [LICENSE.md](./LICENSE.md). ## Copyright notice -Copyright [OpenJS Foundation](https://openjsf.org) and `nvm` contributors. All rights reserved. The [OpenJS Foundation](https://openjsf.org) has registered trademarks and uses trademarks. For a list of trademarks of the [OpenJS Foundation](https://openjsf.org), please see our [Trademark Policy](https://trademark-policy.openjsf.org/) and [Trademark List](https://trademark-list.openjsf.org/). Node.js is a trademark of Joyent, Inc. and is used with its permission. Trademarks and logos not indicated on the [list of OpenJS Foundation trademarks](https://trademark-list.openjsf.org) are trademarks™ or registered® trademarks of their respective holders. Use of them does not imply any affiliation with or endorsement by them. - -[The OpenJS Foundation](https://openjsf.org/) | [Terms of Use](https://terms-of-use.openjsf.org/) | [Privacy Policy](https://privacy-policy.openjsf.org/) | [OpenJS Foundation Bylaws](https://bylaws.openjsf.org/) | [Trademark Policy](https://trademark-policy.openjsf.org/) | [Trademark List](https://trademark-list.openjsf.org/) | [Cookie Policy](https://www.linuxfoundation.org/cookies/) +Copyright [OpenJS Foundation](https://openjsf.org) and `nvm` contributors. All rights reserved. The [OpenJS Foundation](https://openjsf.org) has registered trademarks and uses trademarks. For a list of trademarks of the [OpenJS Foundation](https://openjsf.org), please see our [Trademark Policy](https://trademark-policy.openjsf.org/) and [Trademark List](https://trademark-list.openjsf.org/). Trademarks and logos not indicated on the [list of OpenJS Foundation trademarks](https://trademark-list.openjsf.org) are trademarks™ or registered® trademarks of their respective holders. Use of them does not imply any affiliation with or endorsement by them. +[The OpenJS Foundation](https://openjsf.org/) | [Terms of Use](https://terms-of-use.openjsf.org/) | [Privacy Policy](https://privacy-policy.openjsf.org/) | [Bylaws](https://bylaws.openjsf.org/) | [Code of Conduct](https://code-of-conduct.openjsf.org) | [Trademark Policy](https://trademark-policy.openjsf.org/) | [Trademark List](https://trademark-list.openjsf.org/) | [Cookie Policy](https://www.linuxfoundation.org/cookies/) diff --git a/install.sh b/install.sh index f8bafd4..79ae3b1 100755 --- a/install.sh +++ b/install.sh @@ -33,7 +33,7 @@ nvm_install_dir() { } nvm_latest_version() { - nvm_echo "v0.40.1" + nvm_echo "v0.40.2" } nvm_profile_is_bash_or_zsh() { diff --git a/nvm.sh b/nvm.sh index ed0e0b3..01820fc 100755 --- a/nvm.sh +++ b/nvm.sh @@ -136,15 +136,17 @@ nvm_download() { eval "curl -q --fail ${CURL_COMPRESSED_FLAG:-} ${CURL_HEADER_FLAG:-} ${NVM_DOWNLOAD_ARGS}" elif nvm_has "wget"; then # Emulate curl with wget - ARGS=$(nvm_echo "$@" | command sed -e 's/--progress-bar /--progress=bar /' \ - -e 's/--compressed //' \ - -e 's/--fail //' \ - -e 's/-L //' \ - -e 's/-I /--server-response /' \ - -e 's/-s /-q /' \ - -e 's/-sS /-nv /' \ - -e 's/-o /-O /' \ - -e 's/-C - /-c /') + ARGS=$(nvm_echo "$@" | command sed " + s/--progress-bar /--progress=bar / + s/--compressed // + s/--fail // + s/-L // + s/-I /--server-response / + s/-s /-q / + s/-sS /-nv / + s/-o /-O / + s/-C - /-c / + ") if [ -n "${NVM_AUTH_HEADER:-}" ]; then ARGS="${ARGS} --header \"${NVM_AUTH_HEADER}\"" @@ -354,6 +356,21 @@ nvm_install_latest_npm() { if [ $NVM_IS_19_OR_ABOVE -eq 1 ] && nvm_version_greater_than_or_equal_to "${NODE_VERSION}" 20.5.0; then NVM_IS_20_5_OR_ABOVE=1 fi + local NVM_IS_20_17_or_ABOVE + NVM_IS_20_17_or_ABOVE=0 + if [ $NVM_IS_20_5_OR_ABOVE -eq 1 ] && nvm_version_greater 20.17.0 "${NODE_VERSION}"; then + NVM_IS_20_17_or_ABOVE=1 + fi + local NVM_IS_21_OR_ABOVE + NVM_IS_21_OR_ABOVE=0 + if [ $NVM_IS_20_17_or_ABOVE -eq 1 ] && nvm_version_greater 21.0.0 "${NODE_VERSION}"; then + NVM_IS_21_OR_ABOVE=1 + fi + local NVM_IS_22_9_OR_ABOVE + NVM_IS_22_9_OR_ABOVE=0 + if [ $NVM_IS_21_OR_ABOVE -eq 1 ] && nvm_version_greater 22.9.0 "${NODE_VERSION}"; then + NVM_IS_22_9_OR_ABOVE=1 + fi if [ $NVM_IS_4_4_OR_BELOW -eq 1 ] || { [ $NVM_IS_5_OR_ABOVE -eq 1 ] && nvm_version_greater 5.10.0 "${NODE_VERSION}"; \ @@ -399,8 +416,15 @@ nvm_install_latest_npm() { [ $NVM_IS_18_17_OR_ABOVE -eq 0 ] \ || { [ $NVM_IS_19_OR_ABOVE -eq 1 ] && [ $NVM_IS_20_5_OR_ABOVE -eq 0 ]; } \ ; then + # TODO: 10.8.3 can run on 16.20.2?? https://github.com/nodejs/Release/issues/884#issuecomment-2558077691 nvm_echo '* `npm` `v9.x` is the last version that works on `node` `< v18.17`, `v19`, or `v20.0` - `v20.4`' $NVM_NPM_CMD install -g npm@9 + elif \ + [ $NVM_IS_20_17_or_ABOVE -eq 0 ] \ + || { [ $NVM_IS_21_OR_ABOVE -eq 1 ] && [ $NVM_IS_22_9_OR_ABOVE -eq 0 ]; } \ + ; then + nvm_echo '* `npm` `v10.x` is the last version that works on `node` `< v20.17`, `v21`, or `v22.0` - `v22.8`' + $NVM_NPM_CMD install -g npm@10 else nvm_echo '* Installing latest `npm`; if this does not work on your node version, please report a bug!' $NVM_NPM_CMD install -g npm @@ -422,8 +446,7 @@ fi if [ -z "${NVM_DIR-}" ]; then # shellcheck disable=SC2128 if [ -n "${BASH_SOURCE-}" ]; then - # shellcheck disable=SC2169,SC3054 - NVM_SCRIPT_SOURCE="${BASH_SOURCE[0]}" + NVM_SCRIPT_SOURCE="${BASH_SOURCE}" fi # shellcheck disable=SC2086 NVM_DIR="$(nvm_cd ${NVM_CD_FLAGS} "$(dirname "${NVM_SCRIPT_SOURCE:-$0}")" >/dev/null && \pwd)" @@ -1392,11 +1415,11 @@ nvm_add_iojs_prefix() { nvm_strip_iojs_prefix() { local NVM_IOJS_PREFIX NVM_IOJS_PREFIX="$(nvm_iojs_prefix)" - if [ "${1-}" = "${NVM_IOJS_PREFIX}" ]; then - nvm_echo - else - nvm_echo "${1#"${NVM_IOJS_PREFIX}"-}" - fi + + case "${1-}" in + "${NVM_IOJS_PREFIX}") nvm_echo ;; + *) nvm_echo "${1#"${NVM_IOJS_PREFIX}"-}" ;; + esac } nvm_ls() { @@ -1528,12 +1551,15 @@ nvm_ls() { fi if [ "${NVM_ADD_SYSTEM-}" = true ]; then - if [ -z "${PATTERN}" ] || [ "${PATTERN}" = 'v' ]; then - VERSIONS="${VERSIONS} + case "${PATTERN}" in + '' | v) + VERSIONS="${VERSIONS} system" - elif [ "${PATTERN}" = 'system' ]; then - VERSIONS="system" - fi + ;; + system) + VERSIONS="system" + ;; + esac fi if [ -z "${VERSIONS}" ]; then @@ -1667,7 +1693,7 @@ EOF LTS="${LTS#lts/}" fi - VERSIONS="$({ command awk -v lts="${LTS-}" '{ + VERSIONS="$( { command awk -v lts="${LTS-}" '{ if (!$1) { next } if (lts && $10 ~ /^\-?$/) { next } if (lts && lts != "*" && tolower($10) !~ tolower(lts)) { next } @@ -2711,10 +2737,10 @@ nvm_npm_global_modules() { local NPMLIST local VERSION VERSION="$1" - NPMLIST=$(nvm use "${VERSION}" >/dev/null && npm list -g --depth=0 2>/dev/null | command sed 1,1d | nvm_grep -v 'UNMET PEER DEPENDENCY') + NPMLIST=$(nvm use "${VERSION}" >/dev/null && npm list -g --depth=0 2>/dev/null | command sed -e '1d' -e '/UNMET PEER DEPENDENCY/d') local INSTALLS - INSTALLS=$(nvm_echo "${NPMLIST}" | command sed -e '/ -> / d' -e '/\(empty\)/ d' -e 's/^.* \(.*@[^ ]*\).*/\1/' -e '/^npm@[^ ]*.*$/ d' | command xargs) + INSTALLS=$(nvm_echo "${NPMLIST}" | command sed -e '/ -> / d' -e '/\(empty\)/ d' -e 's/^.* \(.*@[^ ]*\).*/\1/' -e '/^npm@[^ ]*.*$/ d' -e '/^corepack@[^ ]*.*$/ d' | command xargs) local LINKS LINKS="$(nvm_echo "${NPMLIST}" | command sed -n 's/.* -> \(.*\)/\1/ p')" @@ -4412,7 +4438,7 @@ nvm() { NVM_VERSION_ONLY=true NVM_LTS="${NVM_LTS-}" nvm_remote_version "${PATTERN:-node}" ;; "--version" | "-v") - nvm_echo '0.40.1' + nvm_echo '0.40.2' ;; "unload") nvm deactivate >/dev/null 2>&1 diff --git a/package.json b/package.json index 09f354e..2ae3850 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "nvm", - "version": "0.40.1", + "version": "0.40.2", "description": "Node Version Manager - Simple bash script to manage multiple active node.js versions", "directories": { "test": "test" @@ -45,9 +45,9 @@ "dockerfile_lint": "^0.3.4", "doctoc": "^2.2.1", "eclint": "^2.8.1", - "markdown-link-check": "^3.12.2", + "markdown-link-check": "^3.13.7", "replace": "^1.2.2", - "semver": "^7.6.3", + "semver": "^7.7.1", "urchin": "^0.0.5" } } diff --git a/test/slow/nvm exec/Preamble works and respects 'silent' flag b/test/slow/nvm exec/Running 'nvm exec --silent' should work similarity index 100% rename from test/slow/nvm exec/Preamble works and respects 'silent' flag rename to test/slow/nvm exec/Running 'nvm exec --silent' should work diff --git a/test/slow/nvm reinstall-packages/should work as expected b/test/slow/nvm reinstall-packages/should work as expected index 755c6f6..b705188 100755 --- a/test/slow/nvm reinstall-packages/should work as expected +++ b/test/slow/nvm reinstall-packages/should work as expected @@ -16,7 +16,7 @@ EXPECTED_PACKAGES_INSTALL="autoprefixer bower david@11 grunt-cli grunth-cli http echo "$EXPECTED_PACKAGES_INSTALL" | sed -e 's/test-npmlink //' | xargs npm install -g --quiet get_packages() { - npm list -g --depth=0 | \sed -e '1 d' -e 's/^.* \(.*\)@.*/\1/' -e '/^npm$/ d' | xargs + npm list -g --depth=0 | \sed -e '1 d' -e 's/^.* \(.*\)@.*/\1/' -e '/^npm$/ d' -e '/^corepack$/ d' | xargs } nvm use 0.10.29 diff --git a/test/slow/nvm reinstall-packages/works with no installs b/test/slow/nvm reinstall-packages/works with no installs index ade209a..ccd4632 100755 --- a/test/slow/nvm reinstall-packages/works with no installs +++ b/test/slow/nvm reinstall-packages/works with no installs @@ -5,7 +5,7 @@ die () { echo "$@" ; exit 1; } \. ../../../nvm.sh get_packages() { - npm list -g --depth=0 | \sed -e '1 d' -e 's/^.* \(.*\)@.*/\1/' -e '/^npm$/ d' | xargs + npm list -g --depth=0 | \sed -e '1 d' -e 's/^.* \(.*\)@.*/\1/' -e '/^npm$/ d' -e '/^corepack$/ d' | xargs } nvm use 4.7.2 @@ -14,5 +14,14 @@ ORIGINAL_PACKAGES=$(get_packages) nvm reinstall-packages 4.7.1 FINAL_PACKAGES=$(get_packages) -[ -z "${ORIGINAL_PACKAGES}" ] || die "original packages were not empty: ${ORIGINAL_PACKAGES}" -[ -z "${FINAL_PACKAGES}" ] || die "final packages were not empty: ${FINAL_PACKAGES}" +[ -z "${ORIGINAL_PACKAGES}" ] || die "v4: original packages were not empty: ${ORIGINAL_PACKAGES}" +[ -z "${FINAL_PACKAGES}" ] || die "v4: final packages were not empty: ${FINAL_PACKAGES}" + +nvm use 23.8.20 +ORIGINAL_PACKAGES=$(get_packages) + +nvm reinstall-packages 23.8.0 +FINAL_PACKAGES=$(get_packages) + +[ -z "${ORIGINAL_PACKAGES}" ] || die "v23: original packages were not empty: ${ORIGINAL_PACKAGES}" +[ -z "${FINAL_PACKAGES}" ] || die "v23: final packages were not empty: ${FINAL_PACKAGES}" diff --git a/test/slow/nvm run/Running 'nvm run --silent' should work b/test/slow/nvm run/Running 'nvm run --silent' should work new file mode 100755 index 0000000..38db032 --- /dev/null +++ b/test/slow/nvm run/Running 'nvm run --silent' should work @@ -0,0 +1,28 @@ +#!/bin/sh + +set -ex + +die () { echo "$@" ; exit 1; } + +. ../../../nvm.sh + +echo "0.10.7" > .nvmrc + +# Check nvm run without --silent +OUTPUT="$(nvm run --version)" +EXPECTED_OUTPUT="Found '${PWD}/.nvmrc' with version <0.10.7> +Running node v0.10.7 (npm v1.2.21) +v0.10.7" +[ ">${OUTPUT}<" = ">${EXPECTED_OUTPUT}<" ] \ + || die "\`nvm run\` failed to run; did not match with the .nvmrc version; got >${OUTPUT}<" + +OUTPUT="$(nvm run --silent --version)" +EXPECTED_OUTPUT="v0.10.7" +[ "${OUTPUT}" = "${EXPECTED_OUTPUT}" ] \ + || die "\`nvm run --silent\` failed to run silently; expected no output, got >${OUTPUT}<" + +# Output shouldn't be silent if --silent flag is not at the third argument position +OUTPUT="$(nvm run --version --silent)" +EXPECTED_OUTPUT="" +[ "${OUTPUT}" != "${EXPECTED_OUTPUT}" ] \ + || die "\`nvm run --version --silent\` should not be silent; expected >${OUTPUT}<, got no output" diff --git a/test/slow/nvm uninstall/Running 'nvm uninstall' with incorrect file permissions fails nicely b/test/slow/nvm uninstall/Running 'nvm uninstall' with incorrect file permissions fails nicely old mode 100755 new mode 100644