Compare commits

..

31 Commits

Author SHA1 Message Date
Jordan Harband
df9ac58f8b [Fix] reinstall-packages: do not reinstall corepack
Fixes #3544
2025-03-11 13:16:58 -07:00
Jordan Harband
8dbc22f0e9 [readme] update link 2025-03-11 12:46:19 -07:00
Jordan Harband
5c12680a62 [Dev Deps] update markdown-link-check 2025-03-11 12:43:42 -07:00
Jordan Harband
f0f8ed12f8 [Dev Deps] update semver 2025-02-25 18:39:49 -08:00
Jordan Harband
759f70f196 [Refactor] prefer case over if/else chains 2025-02-04 22:45:35 -08:00
Jordan Harband
06a9179309 [Refactor] combine sed -e invocations/arguments 2025-02-04 15:55:10 -08:00
Jordan Harband
74eb396099 [Dev Deps] update markdown-link-check 2025-02-04 12:37:59 -08:00
Atsushi Yamamoto
9f520c97db [Tests] nvm exec/nvm run: add --silent tests
Co-authored-by: Atsushi Yamamoto <yamaatsushi927@gmail.com>
Co-authored-by: Jordan Harband <ljharb@gmail.com>
2016-10-11 23:43:10 -07:00
Jordan Harband
e5521cfd3c [actions] release test needs git tags 2025-02-04 08:44:48 -08:00
Jérémy GAU
247ed8a186 [readme] fix --no-use example 2024-11-28 20:33:25 +01:00
Jessica Wagantall
14507f807f [Tests] migrate installation_iojs test suite to GitHub Actions
Remove equivalent TravisCI entries

Signed-off-by: Jessica Wagantall <jwagantall@linuxfoundation.org>
2024-11-21 15:14:14 -08:00
Jessica Wagantall
6135555b40 [Tests] Migrate slow test suite from Travis CI
Signed-off-by: Jessica Wagantall <jwagantall@linuxfoundation.org>
2024-11-14 16:11:04 -08:00
Chris de Almeida
d90a7910db [readme] update copyright notice 2025-01-10 14:41:50 -06:00
Andy Gimblett
8c30ac633b [readme] note zsh-nvm's AUTO_USE option 2021-12-01 14:55:38 +00:00
Nicola Lanzoni
ecdc865a5a [readme] add note about reloading zshrc after editing 2023-03-09 09:39:55 -03:00
Asad Akbar
9bcbbef4eb [readme] Update shell profile file install notes
* Adds a note for how to fix the issue when the install script is not   updating the correct profile file.
2020-06-19 16:36:09 -07:00
Björn Holm
b77fcec399 [readme] add docker tips
- covers installation using BASH_ENV

Co-authored-by: Christopher Dieringer <cdaringe@users.noreply.github.com>
Co-authored-by: Björn Holm <blollle@gmail.com>
2022-11-14 00:16:13 +01:00
Andrew Chang-DeWitt
287d535f2c [readme] remove avn from readme
`avn` is archived ([see repo](https://github.com/direnv/direnv)) and should probably no longer be recommended by nvm.

This also adds a solution using `direnv` and proposes a possible `.envrc` to use.
See [wbyoung/avn#109](https://github.com/wbyoung/avn/issues/109#issuecomment-1281865585) for more suggested `.envrc` files.
2024-11-13 14:41:39 -06:00
Kid
572c757f6d [readme] fnm -> nvm.fish 2021-07-18 18:32:40 +08:00
Jordan Harband
1d39e35bd3 [Tests] temporarily skip this failing travis test to unblock progress 2025-02-03 10:50:19 -08:00
Jordan Harband
19f452ba0f [Fix] avoid bash-specific syntax
Fixes #3499
2024-12-19 22:21:09 -08:00
Jordan Harband
b9b0ea8020 [Fix] install-latest-npm: npm v11 is out 2024-12-16 10:03:18 -08:00
Jordan Harband
dae1427f7e [actions] TOC: use latest LTS node 2024-11-22 21:44:36 -10:00
Jordan Harband
0641363102 [Tests] install.sh: clean up nvm_detect_profile tests 2024-11-08 10:52:41 +00:00
Jordan Harband
9659af6c16 [Tests] nvm_detect_profile: refactor 2024-11-12 13:31:36 -08:00
menaechmi
abd02e5aae [Fix] install.sh: fix failing install tests (#3458) 2024-11-12 11:57:02 -06:00
menaechmi
3de0b15810 [Tests] run urchin tests on pull requests 2024-11-12 12:58:53 -06:00
menaechmi
cd22c84026 [New] install.sh: add $ZDOTDIR to zsh search
Fixes #3128
2024-11-06 16:53:58 -06:00
Jordan Harband
d648a3b1ba [meta] add DCO
imo this shouldn‘t be necessary, as it should be implied by the act of making a PR.

Following the example in https://github.com/expressjs/express/pull/6048

See https://github.com/openjs-foundation/project-status/issues/2
2024-11-05 17:51:39 +00:00
Jordan Harband
ccf6d16017 [meta] disable blank issues 2024-11-04 15:07:16 +00:00
Jordan Harband
ba98270442 [meta] update issue template 2024-11-04 15:01:26 +00:00
19 changed files with 378 additions and 223 deletions

1
.github/ISSUE_TEMPLATE/config.yml vendored Normal file
View File

@@ -0,0 +1 @@
blank_issues_enabled: false

View File

@@ -1,3 +1,11 @@
---
name: File an issue…
about: Create a report to help us improve
title: ''
labels: ''
assignees: ''
---
<!-- Thank you for being interested in nvm! Please help us by filling out the following form if youre having trouble. If you have a feature request, or some other question, please feel free to clear out the form. Thanks! --> <!-- Thank you for being interested in nvm! Please help us by filling out the following form if youre having trouble. If you have a feature request, or some other question, please feel free to clear out the form. Thanks! -->

View File

@@ -37,6 +37,11 @@ jobs:
matrix: matrix:
node-version: ${{ fromJson(needs.matrix.outputs.latest) }} node-version: ${{ fromJson(needs.matrix.outputs.latest) }}
include: 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.2"
- node-version: "9.1" - node-version: "9.1"
- node-version: "9.0" - node-version: "9.0"

View File

@@ -19,6 +19,8 @@ jobs:
raw.githubusercontent.com:443 raw.githubusercontent.com:443
registry.npmjs.org:443 registry.npmjs.org:443
- uses: actions/checkout@v4 - uses: actions/checkout@v4
with:
fetch-tags: true
- uses: actions/setup-node@v4 - uses: actions/setup-node@v4
with: with:
node-version: "14" node-version: "14"

View File

@@ -1,6 +1,6 @@
name: urchin tests name: urchin tests
on: [push] on: [push, pull_request]
permissions: permissions:
contents: read contents: read
@@ -31,6 +31,8 @@ jobs:
suite: suite:
- install_script - install_script
- sourcing - sourcing
- slow
- installation_iojs
shell: shell:
- sh - sh
- bash - bash

View File

@@ -20,6 +20,7 @@ jobs:
allowed-endpoints: allowed-endpoints:
github.com:443 github.com:443
registry.npmjs.org:443 registry.npmjs.org:443
api.github.com:443
- uses: actions/checkout@v4 - uses: actions/checkout@v4
with: with:
# https://github.com/actions/checkout/issues/217#issue-599945005 # https://github.com/actions/checkout/issues/217#issue-599945005
@@ -30,7 +31,7 @@ jobs:
- run: git fetch --depth=1 origin +refs/tags/*:refs/tags/* - run: git fetch --depth=1 origin +refs/tags/*:refs/tags/*
- uses: actions/setup-node@v4 - uses: actions/setup-node@v4
with: with:
node-version: '16' node-version: 'lts/*'
- run: npm install - run: npm install
- run: npm run doctoc - run: npm run doctoc
- name: commit changes - name: commit changes

View File

@@ -87,18 +87,8 @@ env:
- SHELL=bash TEST_SUITE=fast - SHELL=bash TEST_SUITE=fast
- SHELL=zsh TEST_SUITE=fast - SHELL=zsh TEST_SUITE=fast
# - SHELL=ksh 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=sh TEST_SUITE=installation_iojs WITHOUT_CURL=1
- SHELL=dash TEST_SUITE=installation_iojs
- SHELL=dash TEST_SUITE=installation_iojs WITHOUT_CURL=1 - 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=bash TEST_SUITE=installation_iojs WITHOUT_CURL=1
- SHELL=zsh TEST_SUITE=installation_iojs
- SHELL=zsh TEST_SUITE=installation_iojs WITHOUT_CURL=1 - SHELL=zsh TEST_SUITE=installation_iojs WITHOUT_CURL=1
# - SHELL=ksh TEST_SUITE=installation_iojs
# - SHELL=ksh TEST_SUITE=installation_iojs WITHOUT_CURL=1 # - SHELL=ksh TEST_SUITE=installation_iojs WITHOUT_CURL=1

View File

@@ -113,3 +113,11 @@ Co-authored-by: Name Here <email@here>
# Where can I ask for help? # Where can I ask for help?
If you have any questions, please contact [@LJHarb](mailto:ljharb@gmail.com). If you have any questions, please contact [@LJHarb](mailto:ljharb@gmail.com).
# Developer's Certificate of Origin 1.1
By making a contribution to this project, I certify that:
- The contribution was created in whole or in part by me and I have the right to submit it under the open source license indicated in the file; or
- The contribution is based upon previous work that, to the best of my knowledge, is covered under an appropriate open source license and I have the right under that license to submit that work with modifications, whether created in whole or in part by me, under the same open source license (unless I am permitted to submit under a different license), as indicated in the file; or
- The contribution was provided directly to me by some other person who certified (a), (b) or (c) and I have not modified it.
- I understand and agree that this project and the contribution are public and that a record of the contribution (including all personal information I submit with it, including my sign-off) is maintained indefinitely and may be redistributed consistent with this project or the open source license(s) involved.

View File

@@ -91,16 +91,20 @@ RUN echo 'nvm ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers
# Switch to user "nvm" from now # Switch to user "nvm" from now
USER nvm 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 # nvm
RUN echo 'export NVM_DIR="$HOME/.nvm"' >> "$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' >> "$HOME/.bashrc" 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' >> "$HOME/.bashrc" RUN echo '[ -s "$NVM_DIR/bash_completion" ] && . "$NVM_DIR/bash_completion" # This loads nvm bash_completion' >> "$BASH_ENV"
# nodejs and tools # nodejs and tools
RUN bash -c 'source $HOME/.nvm/nvm.sh && \ RUN nvm install node
nvm install node && \ RUN npm install -g doctoc urchin eclint dockerfile_lint
npm install -g doctoc urchin eclint dockerfile_lint && \ RUN npm install --prefix "$HOME/.nvm/"
npm install --prefix "$HOME/.nvm/"'
# Set WORKDIR to nvm directory # Set WORKDIR to nvm directory
WORKDIR /home/nvm/.nvm WORKDIR /home/nvm/.nvm

103
README.md
View File

@@ -18,6 +18,8 @@
- [Installing and Updating](#installing-and-updating) - [Installing and Updating](#installing-and-updating)
- [Install & Update Script](#install--update-script) - [Install & Update Script](#install--update-script)
- [Additional Notes](#additional-notes) - [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 Linux](#troubleshooting-on-linux)
- [Troubleshooting on macOS](#troubleshooting-on-macos) - [Troubleshooting on macOS](#troubleshooting-on-macos)
- [Ansible](#ansible) - [Ansible](#ansible)
@@ -108,7 +110,7 @@ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
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.1/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 files path, and then rerun the installation script.
<a id="profile_snippet"></a> <a id="profile_snippet"></a>
```sh ```sh
@@ -120,7 +122,12 @@ 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.</sub> - If the environment variable `$XDG_CONFIG_HOME` is present, it will place the `nvm` files there.</sub>
- 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. - 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. Eg: `curl ... | NVM_DIR="path/to/nvm"`. Ensure that the `NVM_DIR` does not contain a trailing slash.
@@ -129,6 +136,81 @@ Eg: `curl ... | NVM_DIR="path/to/nvm"`. Ensure that the `NVM_DIR` does not conta
- 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.1/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.1/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.1
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 #### Troubleshooting on Linux
On Linux, after running the install script, if you get `nvm: command not found` or see no feedback from your terminal after you type `command -v nvm`, simply close your current terminal, open a new terminal, and try verifying again. On Linux, after running the install script, if you get `nvm: command not found` or see no feedback from your terminal after you type `command -v nvm`, simply close your current terminal, open a new terminal, and try verifying again.
@@ -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 - [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 - [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 - [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. - [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: **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. 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. **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.
@@ -588,9 +670,7 @@ Run [`npx nvmrc`](https://npmjs.com/nvmrc) to validate an `.nvmrc` file. If that
### Deeper Shell Integration ### 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 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 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).
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. 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 load-nvmrc
``` ```
After saving the file, run `source ~/.zshrc` to reload the configuration with the latest changes made.
##### fish ##### fish
This requires that you have [bass](https://github.com/edc/bass) installed. 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 ## 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: The following are known to cause issues:
Inside `~/.npmrc`: Inside `~/.npmrc`:
@@ -1088,6 +1170,5 @@ See [LICENSE.md](./LICENSE.md).
## Copyright notice ## 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. 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/)
[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/)

View File

@@ -296,17 +296,17 @@ nvm_detect_profile() {
DETECTED_PROFILE="$HOME/.bash_profile" DETECTED_PROFILE="$HOME/.bash_profile"
fi fi
elif [ "${SHELL#*zsh}" != "$SHELL" ]; then elif [ "${SHELL#*zsh}" != "$SHELL" ]; then
if [ -f "$HOME/.zshrc" ]; then if [ -f "${ZDOTDIR:-${HOME}}/.zshrc" ]; then
DETECTED_PROFILE="$HOME/.zshrc" DETECTED_PROFILE="${ZDOTDIR:-${HOME}}/.zshrc"
elif [ -f "$HOME/.zprofile" ]; then elif [ -f "${ZDOTDIR:-${HOME}}/.zprofile" ]; then
DETECTED_PROFILE="$HOME/.zprofile" DETECTED_PROFILE="${ZDOTDIR:-${HOME}}/.zprofile"
fi fi
fi fi
if [ -z "$DETECTED_PROFILE" ]; then if [ -z "$DETECTED_PROFILE" ]; then
for EACH_PROFILE in ".profile" ".bashrc" ".bash_profile" ".zprofile" ".zshrc" for EACH_PROFILE in ".profile" ".bashrc" ".bash_profile" ".zprofile" ".zshrc"
do do
if DETECTED_PROFILE="$(nvm_try_profile "${HOME}/${EACH_PROFILE}")"; then if DETECTED_PROFILE="$(nvm_try_profile "${ZDOTDIR:-${HOME}}/${EACH_PROFILE}")"; then
break break
fi fi
done done

311
nvm.sh
View File

@@ -13,42 +13,6 @@
# shellcheck disable=SC3028 # shellcheck disable=SC3028
NVM_SCRIPT_SOURCE="$_" NVM_SCRIPT_SOURCE="$_"
NVM_LOG_LEVEL=${NVM_LOG_LEVEL:-INFO}
NVM_VERSION="0.39.0" # Update this with the actual nvm version
nvm_log() {
local level=$1
shift
if [[ $NVM_LOG_LEVEL == DEBUG || ($NVM_LOG_LEVEL == INFO && $level != DEBUG) ]]; then
printf "[%s] [%s] %s\n" "$(date '+%Y-%m-%d %H:%M:%S')" "$level" "$*" >&2
fi
}
nvm_debug() { nvm_log DEBUG "$@"; }
nvm_info() { nvm_log INFO "$@"; }
nvm_warn() { nvm_log WARN "$@"; }
nvm_error() { nvm_log ERROR "$@"; }
nvm_run_command() {
nvm_debug "Executing: $*"
"$@"
}
nvm_time_operation() {
local start_time=$(date +%s)
"$@"
local end_time=$(date +%s)
local duration=$((end_time - start_time))
nvm_info "Operation took ${duration} seconds"
}
nvm_log_env() {
nvm_debug "Environment:"
nvm_debug " NVM_DIR: $NVM_DIR"
nvm_debug " PATH: $PATH"
nvm_debug " Shell: $SHELL"
}
nvm_is_zsh() { nvm_is_zsh() {
[ -n "${ZSH_VERSION-}" ] [ -n "${ZSH_VERSION-}" ]
} }
@@ -172,15 +136,17 @@ nvm_download() {
eval "curl -q --fail ${CURL_COMPRESSED_FLAG:-} ${CURL_HEADER_FLAG:-} ${NVM_DOWNLOAD_ARGS}" eval "curl -q --fail ${CURL_COMPRESSED_FLAG:-} ${CURL_HEADER_FLAG:-} ${NVM_DOWNLOAD_ARGS}"
elif nvm_has "wget"; then elif nvm_has "wget"; then
# Emulate curl with wget # Emulate curl with wget
ARGS=$(nvm_echo "$@" | command sed -e 's/--progress-bar /--progress=bar /' \ ARGS=$(nvm_echo "$@" | command sed "
-e 's/--compressed //' \ s/--progress-bar /--progress=bar /
-e 's/--fail //' \ s/--compressed //
-e 's/-L //' \ s/--fail //
-e 's/-I /--server-response /' \ s/-L //
-e 's/-s /-q /' \ s/-I /--server-response /
-e 's/-sS /-nv /' \ s/-s /-q /
-e 's/-o /-O /' \ s/-sS /-nv /
-e 's/-C - /-c /') s/-o /-O /
s/-C - /-c /
")
if [ -n "${NVM_AUTH_HEADER:-}" ]; then if [ -n "${NVM_AUTH_HEADER:-}" ]; then
ARGS="${ARGS} --header \"${NVM_AUTH_HEADER}\"" ARGS="${ARGS} --header \"${NVM_AUTH_HEADER}\""
@@ -390,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 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 NVM_IS_20_5_OR_ABOVE=1
fi 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 ] || { if [ $NVM_IS_4_4_OR_BELOW -eq 1 ] || {
[ $NVM_IS_5_OR_ABOVE -eq 1 ] && nvm_version_greater 5.10.0 "${NODE_VERSION}"; \ [ $NVM_IS_5_OR_ABOVE -eq 1 ] && nvm_version_greater 5.10.0 "${NODE_VERSION}"; \
@@ -435,8 +416,15 @@ nvm_install_latest_npm() {
[ $NVM_IS_18_17_OR_ABOVE -eq 0 ] \ [ $NVM_IS_18_17_OR_ABOVE -eq 0 ] \
|| { [ $NVM_IS_19_OR_ABOVE -eq 1 ] && [ $NVM_IS_20_5_OR_ABOVE -eq 0 ]; } \ || { [ $NVM_IS_19_OR_ABOVE -eq 1 ] && [ $NVM_IS_20_5_OR_ABOVE -eq 0 ]; } \
; then ; 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_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 $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 else
nvm_echo '* Installing latest `npm`; if this does not work on your node version, please report a bug!' nvm_echo '* Installing latest `npm`; if this does not work on your node version, please report a bug!'
$NVM_NPM_CMD install -g npm $NVM_NPM_CMD install -g npm
@@ -458,8 +446,7 @@ fi
if [ -z "${NVM_DIR-}" ]; then if [ -z "${NVM_DIR-}" ]; then
# shellcheck disable=SC2128 # shellcheck disable=SC2128
if [ -n "${BASH_SOURCE-}" ]; then if [ -n "${BASH_SOURCE-}" ]; then
# shellcheck disable=SC2169,SC3054 NVM_SCRIPT_SOURCE="${BASH_SOURCE}"
NVM_SCRIPT_SOURCE="${BASH_SOURCE[0]}"
fi fi
# shellcheck disable=SC2086 # shellcheck disable=SC2086
NVM_DIR="$(nvm_cd ${NVM_CD_FLAGS} "$(dirname "${NVM_SCRIPT_SOURCE:-$0}")" >/dev/null && \pwd)" NVM_DIR="$(nvm_cd ${NVM_CD_FLAGS} "$(dirname "${NVM_SCRIPT_SOURCE:-$0}")" >/dev/null && \pwd)"
@@ -833,7 +820,7 @@ nvm_remote_versions() {
esac esac
if nvm_validate_implicit_alias "${PATTERN-}" 2>/dev/null; then if nvm_validate_implicit_alias "${PATTERN-}" 2>/dev/null; then
nvm_error 'Implicit aliases are not supported in nvm_remote_versions.' nvm_err 'Implicit aliases are not supported in nvm_remote_versions.'
return 1 return 1
fi fi
@@ -925,13 +912,13 @@ nvm_normalize_lts() {
if [ "${RESULT}" != '*' ]; then if [ "${RESULT}" != '*' ]; then
nvm_echo "lts/${RESULT}" nvm_echo "lts/${RESULT}"
else else
nvm_error 'That many LTS releases do not exist yet.' nvm_err 'That many LTS releases do not exist yet.'
return 2 return 2
fi fi
;; ;;
*) *)
if [ "${LTS}" != "$(echo "${LTS}" | command tr '[:upper:]' '[:lower:]')" ]; then if [ "${LTS}" != "$(echo "${LTS}" | command tr '[:upper:]' '[:lower:]')" ]; then
nvm_error 'LTS names must be lowercase' nvm_err 'LTS names must be lowercase'
return 3 return 3
fi fi
nvm_echo "${LTS}" nvm_echo "${LTS}"
@@ -979,7 +966,7 @@ nvm_num_version_groups() {
nvm_strip_path() { nvm_strip_path() {
if [ -z "${NVM_DIR-}" ]; then if [ -z "${NVM_DIR-}" ]; then
nvm_error '${NVM_DIR} not set!' nvm_err '${NVM_DIR} not set!'
return 1 return 1
fi fi
command printf %s "${1-}" | command awk -v NVM_DIR="${NVM_DIR}" -v RS=: ' command printf %s "${1-}" | command awk -v NVM_DIR="${NVM_DIR}" -v RS=: '
@@ -992,10 +979,10 @@ nvm_strip_path() {
} }
nvm_change_path() { nvm_change_path() {
# if there's no initial path, just return the supplementary path # if theres no initial path, just return the supplementary path
if [ -z "${1-}" ]; then if [ -z "${1-}" ]; then
nvm_echo "${3-}${2-}" nvm_echo "${3-}${2-}"
# if the initial path doesn't contain an nvm path, prepend the supplementary # if the initial path doesnt contain an nvm path, prepend the supplementary
# path # path
elif ! nvm_echo "${1-}" | nvm_grep -q "${NVM_DIR}/[^/]*${2-}" \ elif ! nvm_echo "${1-}" | nvm_grep -q "${NVM_DIR}/[^/]*${2-}" \
&& ! nvm_echo "${1-}" | nvm_grep -q "${NVM_DIR}/versions/[^/]*/[^/]*${2-}"; then && ! nvm_echo "${1-}" | nvm_grep -q "${NVM_DIR}/versions/[^/]*/[^/]*${2-}"; then
@@ -1062,7 +1049,7 @@ nvm_get_colors() {
COLOR=$(nvm_echo "$SYS_COLOR" | command tr '0;' '1;') COLOR=$(nvm_echo "$SYS_COLOR" | command tr '0;' '1;')
;; ;;
*) *)
nvm_error "Invalid color index, ${1-}" nvm_err "Invalid color index, ${1-}"
return 1 return 1
;; ;;
esac esac
@@ -1102,7 +1089,7 @@ nvm_print_color_code() {
'e') nvm_echo '0;37m' ;; 'e') nvm_echo '0;37m' ;;
'W') nvm_echo '1;37m' ;; 'W') nvm_echo '1;37m' ;;
*) *)
nvm_error "Invalid color code: ${1-}"; nvm_err "Invalid color code: ${1-}";
return 1 return 1
;; ;;
esac esac
@@ -1184,13 +1171,13 @@ nvm_print_alias_path() {
local NVM_ALIAS_DIR local NVM_ALIAS_DIR
NVM_ALIAS_DIR="${1-}" NVM_ALIAS_DIR="${1-}"
if [ -z "${NVM_ALIAS_DIR}" ]; then if [ -z "${NVM_ALIAS_DIR}" ]; then
nvm_error 'An alias dir is required.' nvm_err 'An alias dir is required.'
return 1 return 1
fi fi
local ALIAS_PATH local ALIAS_PATH
ALIAS_PATH="${2-}" ALIAS_PATH="${2-}"
if [ -z "${ALIAS_PATH}" ]; then if [ -z "${ALIAS_PATH}" ]; then
nvm_error 'An alias path is required.' nvm_err 'An alias path is required.'
return 2 return 2
fi fi
local ALIAS local ALIAS
@@ -1206,7 +1193,7 @@ nvm_print_default_alias() {
local ALIAS local ALIAS
ALIAS="${1-}" ALIAS="${1-}"
if [ -z "${ALIAS}" ]; then if [ -z "${ALIAS}" ]; then
nvm_error 'A default alias is required.' nvm_err 'A default alias is required.'
return 1 return 1
fi fi
local DEST local DEST
@@ -1220,13 +1207,13 @@ nvm_make_alias() {
local ALIAS local ALIAS
ALIAS="${1-}" ALIAS="${1-}"
if [ -z "${ALIAS}" ]; then if [ -z "${ALIAS}" ]; then
nvm_error "an alias name is required" nvm_err "an alias name is required"
return 1 return 1
fi fi
local VERSION local VERSION
VERSION="${2-}" VERSION="${2-}"
if [ -z "${VERSION}" ]; then if [ -z "${VERSION}" ]; then
nvm_error "an alias target version is required" nvm_err "an alias target version is required"
return 2 return 2
fi fi
nvm_echo "${VERSION}" | tee "$(nvm_alias_path)/${ALIAS}" >/dev/null nvm_echo "${VERSION}" | tee "$(nvm_alias_path)/${ALIAS}" >/dev/null
@@ -1289,7 +1276,7 @@ nvm_alias() {
local ALIAS local ALIAS
ALIAS="${1-}" ALIAS="${1-}"
if [ -z "${ALIAS}" ]; then if [ -z "${ALIAS}" ]; then
nvm_error 'An alias is required.' nvm_err 'An alias is required.'
return 1 return 1
fi fi
if ! ALIAS="$(nvm_normalize_lts "${ALIAS}")"; then if ! ALIAS="$(nvm_normalize_lts "${ALIAS}")"; then
@@ -1303,7 +1290,7 @@ nvm_alias() {
local NVM_ALIAS_PATH local NVM_ALIAS_PATH
NVM_ALIAS_PATH="$(nvm_alias_path)/${ALIAS}" NVM_ALIAS_PATH="$(nvm_alias_path)/${ALIAS}"
if [ ! -f "${NVM_ALIAS_PATH}" ]; then if [ ! -f "${NVM_ALIAS_PATH}" ]; then
nvm_error 'Alias does not exist.' nvm_err 'Alias does not exist.'
return 2 return 2
fi fi
@@ -1428,11 +1415,11 @@ nvm_add_iojs_prefix() {
nvm_strip_iojs_prefix() { nvm_strip_iojs_prefix() {
local NVM_IOJS_PREFIX local NVM_IOJS_PREFIX
NVM_IOJS_PREFIX="$(nvm_iojs_prefix)" NVM_IOJS_PREFIX="$(nvm_iojs_prefix)"
if [ "${1-}" = "${NVM_IOJS_PREFIX}" ]; then
nvm_echo case "${1-}" in
else "${NVM_IOJS_PREFIX}") nvm_echo ;;
nvm_echo "${1#"${NVM_IOJS_PREFIX}"-}" *) nvm_echo "${1#"${NVM_IOJS_PREFIX}"-}" ;;
fi esac
} }
nvm_ls() { nvm_ls() {
@@ -1564,12 +1551,15 @@ nvm_ls() {
fi fi
if [ "${NVM_ADD_SYSTEM-}" = true ]; then if [ "${NVM_ADD_SYSTEM-}" = true ]; then
if [ -z "${PATTERN}" ] || [ "${PATTERN}" = 'v' ]; then case "${PATTERN}" in
VERSIONS="${VERSIONS} '' | v)
VERSIONS="${VERSIONS}
system" system"
elif [ "${PATTERN}" = 'system' ]; then ;;
VERSIONS="system" system)
fi VERSIONS="system"
;;
esac
fi fi
if [ -z "${VERSIONS}" ]; then if [ -z "${VERSIONS}" ]; then
@@ -1608,7 +1598,7 @@ nvm_ls_remote_index_tab() {
local LTS local LTS
LTS="${NVM_LTS-}" LTS="${NVM_LTS-}"
if [ "$#" -lt 3 ]; then if [ "$#" -lt 3 ]; then
nvm_error 'not enough arguments' nvm_err 'not enough arguments'
return 5 return 5
fi fi
@@ -1630,11 +1620,11 @@ nvm_ls_remote_index_tab() {
iojs-std) PREFIX="$(nvm_iojs_prefix)-" ;; iojs-std) PREFIX="$(nvm_iojs_prefix)-" ;;
node-std) PREFIX='' ;; node-std) PREFIX='' ;;
iojs-*) iojs-*)
nvm_error 'unknown type of io.js release' nvm_err 'unknown type of io.js release'
return 4 return 4
;; ;;
*) *)
nvm_error 'unknown type of node.js release' nvm_err 'unknown type of node.js release'
return 4 return 4
;; ;;
esac esac
@@ -1703,7 +1693,7 @@ EOF
LTS="${LTS#lts/}" LTS="${LTS#lts/}"
fi fi
VERSIONS="$({ command awk -v lts="${LTS-}" '{ VERSIONS="$( { command awk -v lts="${LTS-}" '{
if (!$1) { next } if (!$1) { next }
if (lts && $10 ~ /^\-?$/) { next } if (lts && $10 ~ /^\-?$/) { next }
if (lts && lts != "*" && tolower($10) !~ tolower(lts)) { next } if (lts && lts != "*" && tolower($10) !~ tolower(lts)) { next }
@@ -1748,8 +1738,8 @@ nvm_get_checksum_binary() {
elif nvm_has_non_aliased 'sha1'; then elif nvm_has_non_aliased 'sha1'; then
nvm_echo 'sha1' nvm_echo 'sha1'
else else
nvm_error 'Unaliased sha256sum, shasum, sha256, gsha256sum, openssl, or bssl not found.' nvm_err 'Unaliased sha256sum, shasum, sha256, gsha256sum, openssl, or bssl not found.'
nvm_error 'Unaliased sha1sum or sha1 not found.' nvm_err 'Unaliased sha1sum or sha1 not found.'
return 1 return 1
fi fi
} }
@@ -1775,36 +1765,36 @@ nvm_compute_checksum() {
local FILE local FILE
FILE="${1-}" FILE="${1-}"
if [ -z "${FILE}" ]; then if [ -z "${FILE}" ]; then
nvm_error 'Provided file to checksum is empty.' nvm_err 'Provided file to checksum is empty.'
return 2 return 2
elif ! [ -f "${FILE}" ]; then elif ! [ -f "${FILE}" ]; then
nvm_error 'Provided file to checksum does not exist.' nvm_err 'Provided file to checksum does not exist.'
return 1 return 1
fi fi
if nvm_has_non_aliased "sha256sum"; then if nvm_has_non_aliased "sha256sum"; then
nvm_debug 'Computing checksum with sha256sum' nvm_err 'Computing checksum with sha256sum'
command sha256sum "${FILE}" | command awk '{print $1}' command sha256sum "${FILE}" | command awk '{print $1}'
elif nvm_has_non_aliased "shasum"; then elif nvm_has_non_aliased "shasum"; then
nvm_debug 'Computing checksum with shasum -a 256' nvm_err 'Computing checksum with shasum -a 256'
command shasum -a 256 "${FILE}" | command awk '{print $1}' command shasum -a 256 "${FILE}" | command awk '{print $1}'
elif nvm_has_non_aliased "sha256"; then elif nvm_has_non_aliased "sha256"; then
nvm_debug 'Computing checksum with sha256 -q' nvm_err 'Computing checksum with sha256 -q'
command sha256 -q "${FILE}" | command awk '{print $1}' command sha256 -q "${FILE}" | command awk '{print $1}'
elif nvm_has_non_aliased "gsha256sum"; then elif nvm_has_non_aliased "gsha256sum"; then
nvm_debug 'Computing checksum with gsha256sum' nvm_err 'Computing checksum with gsha256sum'
command gsha256sum "${FILE}" | command awk '{print $1}' command gsha256sum "${FILE}" | command awk '{print $1}'
elif nvm_has_non_aliased "openssl"; then elif nvm_has_non_aliased "openssl"; then
nvm_debug 'Computing checksum with openssl dgst -sha256' nvm_err 'Computing checksum with openssl dgst -sha256'
command openssl dgst -sha256 "${FILE}" | command awk '{print $NF}' command openssl dgst -sha256 "${FILE}" | command awk '{print $NF}'
elif nvm_has_non_aliased "bssl"; then elif nvm_has_non_aliased "bssl"; then
nvm_debug 'Computing checksum with bssl sha256sum' nvm_err 'Computing checksum with bssl sha256sum'
command bssl sha256sum "${FILE}" | command awk '{print $1}' command bssl sha256sum "${FILE}" | command awk '{print $1}'
elif nvm_has_non_aliased "sha1sum"; then elif nvm_has_non_aliased "sha1sum"; then
nvm_debug 'Computing checksum with sha1sum' nvm_err 'Computing checksum with sha1sum'
command sha1sum "${FILE}" | command awk '{print $1}' command sha1sum "${FILE}" | command awk '{print $1}'
elif nvm_has_non_aliased "sha1"; then elif nvm_has_non_aliased "sha1"; then
nvm_debug 'Computing checksum with sha1 -q' nvm_err 'Computing checksum with sha1 -q'
command sha1 -q "${FILE}" command sha1 -q "${FILE}"
fi fi
} }
@@ -1813,10 +1803,10 @@ nvm_compare_checksum() {
local FILE local FILE
FILE="${1-}" FILE="${1-}"
if [ -z "${FILE}" ]; then if [ -z "${FILE}" ]; then
nvm_error 'Provided file to checksum is empty.' nvm_err 'Provided file to checksum is empty.'
return 4 return 4
elif ! [ -f "${FILE}" ]; then elif ! [ -f "${FILE}" ]; then
nvm_error 'Provided file to checksum does not exist.' nvm_err 'Provided file to checksum does not exist.'
return 3 return 3
fi fi
@@ -1826,19 +1816,19 @@ nvm_compare_checksum() {
local CHECKSUM local CHECKSUM
CHECKSUM="${2-}" CHECKSUM="${2-}"
if [ -z "${CHECKSUM}" ]; then if [ -z "${CHECKSUM}" ]; then
nvm_error 'Provided checksum to compare to is empty.' nvm_err 'Provided checksum to compare to is empty.'
return 2 return 2
fi fi
if [ -z "${COMPUTED_SUM}" ]; then if [ -z "${COMPUTED_SUM}" ]; then
nvm_error "Computed checksum of '${FILE}' is empty." # missing in raspberry pi binary nvm_err "Computed checksum of '${FILE}' is empty." # missing in raspberry pi binary
nvm_warn 'WARNING: Continuing *without checksum verification*' nvm_err 'WARNING: Continuing *without checksum verification*'
return return
elif [ "${COMPUTED_SUM}" != "${CHECKSUM}" ] && [ "${COMPUTED_SUM}" != "\\${CHECKSUM}" ]; then elif [ "${COMPUTED_SUM}" != "${CHECKSUM}" ] && [ "${COMPUTED_SUM}" != "\\${CHECKSUM}" ]; then
nvm_error "Checksums do not match: '${COMPUTED_SUM}' found, '${CHECKSUM}' expected." nvm_err "Checksums do not match: '${COMPUTED_SUM}' found, '${CHECKSUM}' expected."
return 1 return 1
fi fi
nvm_debug 'Checksums matched!' nvm_err 'Checksums matched!'
} }
# args: flavor, type, version, slug, compression # args: flavor, type, version, slug, compression
@@ -1847,7 +1837,7 @@ nvm_get_checksum() {
case "${1-}" in case "${1-}" in
node | iojs) FLAVOR="${1}" ;; node | iojs) FLAVOR="${1}" ;;
*) *)
nvm_error 'supported flavors: node, iojs' nvm_err 'supported flavors: node, iojs'
return 2 return 2
;; ;;
esac esac
@@ -1968,7 +1958,7 @@ nvm_validate_implicit_alias() {
return return
;; ;;
*) *)
nvm_error "Only implicit aliases 'stable', 'unstable', '${NVM_IOJS_PREFIX}', and '${NVM_NODE_PREFIX}' are supported." nvm_err "Only implicit aliases 'stable', 'unstable', '${NVM_IOJS_PREFIX}', and '${NVM_NODE_PREFIX}' are supported."
return 1 return 1
;; ;;
esac esac
@@ -1976,7 +1966,7 @@ nvm_validate_implicit_alias() {
nvm_print_implicit_alias() { nvm_print_implicit_alias() {
if [ "_$1" != "_local" ] && [ "_$1" != "_remote" ]; then if [ "_$1" != "_local" ] && [ "_$1" != "_remote" ]; then
nvm_error "nvm_print_implicit_alias must be specified with local or remote as the first argument." nvm_err "nvm_print_implicit_alias must be specified with local or remote as the first argument."
return 1 return 1
fi fi
@@ -2137,13 +2127,13 @@ nvm_get_minor_version() {
VERSION="$1" VERSION="$1"
if [ -z "${VERSION}" ]; then if [ -z "${VERSION}" ]; then
nvm_error 'a version is required' nvm_err 'a version is required'
return 1 return 1
fi fi
case "${VERSION}" in case "${VERSION}" in
v | .* | *..* | v*[!.0123456789]* | [!v]*[!.0123456789]* | [!v0123456789]* | v[!0123456789]*) v | .* | *..* | v*[!.0123456789]* | [!v]*[!.0123456789]* | [!v0123456789]* | v[!0123456789]*)
nvm_error 'invalid version number' nvm_err 'invalid version number'
return 2 return 2
;; ;;
esac esac
@@ -2154,7 +2144,7 @@ nvm_get_minor_version() {
local MINOR local MINOR
MINOR="$(nvm_echo "${PREFIXED_VERSION}" | nvm_grep -e '^v' | command cut -c2- | command cut -d . -f 1,2)" MINOR="$(nvm_echo "${PREFIXED_VERSION}" | nvm_grep -e '^v' | command cut -c2- | command cut -d . -f 1,2)"
if [ -z "${MINOR}" ]; then if [ -z "${MINOR}" ]; then
nvm_error 'invalid version number! (please report this)' nvm_err 'invalid version number! (please report this)'
return 3 return 3
fi fi
nvm_echo "${MINOR}" nvm_echo "${MINOR}"
@@ -2164,7 +2154,7 @@ nvm_ensure_default_set() {
local VERSION local VERSION
VERSION="$1" VERSION="$1"
if [ -z "${VERSION}" ]; then if [ -z "${VERSION}" ]; then
nvm_error 'nvm_ensure_default_set: a version is required' nvm_err 'nvm_ensure_default_set: a version is required'
return 1 return 1
elif nvm_alias default >/dev/null 2>&1; then elif nvm_alias default >/dev/null 2>&1; then
# default already set # default already set
@@ -2174,7 +2164,7 @@ nvm_ensure_default_set() {
OUTPUT="$(nvm alias default "${VERSION}")" OUTPUT="$(nvm alias default "${VERSION}")"
local EXIT_CODE local EXIT_CODE
EXIT_CODE="$?" EXIT_CODE="$?"
nvm_info "Creating default alias: ${OUTPUT}" nvm_echo "Creating default alias: ${OUTPUT}"
return $EXIT_CODE return $EXIT_CODE
} }
@@ -2189,21 +2179,21 @@ nvm_get_mirror() {
node-std) NVM_MIRROR="${NVM_NODEJS_ORG_MIRROR:-https://nodejs.org/dist}" ;; node-std) NVM_MIRROR="${NVM_NODEJS_ORG_MIRROR:-https://nodejs.org/dist}" ;;
iojs-std) NVM_MIRROR="${NVM_IOJS_ORG_MIRROR:-https://iojs.org/dist}" ;; iojs-std) NVM_MIRROR="${NVM_IOJS_ORG_MIRROR:-https://iojs.org/dist}" ;;
*) *)
nvm_error 'unknown type of node.js or io.js release' nvm_err 'unknown type of node.js or io.js release'
return 1 return 1
;; ;;
esac esac
case "${NVM_MIRROR}" in case "${NVM_MIRROR}" in
*\`* | *\\* | *\'* | *\(* | *' '* ) *\`* | *\\* | *\'* | *\(* | *' '* )
nvm_error '$NVM_NODEJS_ORG_MIRROR and $NVM_IOJS_ORG_MIRROR may only contain a URL' nvm_err '$NVM_NODEJS_ORG_MIRROR and $NVM_IOJS_ORG_MIRROR may only contain a URL'
return 2 return 2
;; ;;
esac esac
if ! nvm_echo "${NVM_MIRROR}" | command awk '{ $0 ~ "^https?://[a-zA-Z0-9./_-]+$" }'; then if ! nvm_echo "${NVM_MIRROR}" | command awk '{ $0 ~ "^https?://[a-zA-Z0-9./_-]+$" }'; then
nvm_error '$NVM_NODEJS_ORG_MIRROR and $NVM_IOJS_ORG_MIRROR may only contain a URL' nvm_err '$NVM_NODEJS_ORG_MIRROR and $NVM_IOJS_ORG_MIRROR may only contain a URL'
return 2 return 2
fi fi
@@ -2213,7 +2203,7 @@ nvm_get_mirror() {
# args: os, prefixed version, version, tarball, extract directory # args: os, prefixed version, version, tarball, extract directory
nvm_install_binary_extract() { nvm_install_binary_extract() {
if [ "$#" -ne 5 ]; then if [ "$#" -ne 5 ]; then
nvm_error 'nvm_install_binary_extract needs 5 parameters' nvm_err 'nvm_install_binary_extract needs 5 parameters'
return 1 return 1
fi fi
@@ -2231,7 +2221,7 @@ nvm_install_binary_extract() {
local VERSION_PATH local VERSION_PATH
[ -n "${TMPDIR-}" ] && \ [ -n "${TMPDIR-}" ] && \
nvm_run_command mkdir -p "${TMPDIR}" && \ command mkdir -p "${TMPDIR}" && \
VERSION_PATH="$(nvm_version_path "${PREFIXED_VERSION}")" || return 1 VERSION_PATH="$(nvm_version_path "${PREFIXED_VERSION}")" || return 1
# For Windows system (GitBash with MSYS, Cygwin) # For Windows system (GitBash with MSYS, Cygwin)
@@ -2265,7 +2255,7 @@ nvm_install_binary() {
case "${1-}" in case "${1-}" in
node | iojs) FLAVOR="${1}" ;; node | iojs) FLAVOR="${1}" ;;
*) *)
nvm_error 'supported flavors: node, iojs' nvm_err 'supported flavors: node, iojs'
return 4 return 4
;; ;;
esac esac
@@ -2276,7 +2266,7 @@ nvm_install_binary() {
local PREFIXED_VERSION local PREFIXED_VERSION
PREFIXED_VERSION="${3-}" PREFIXED_VERSION="${3-}"
if [ -z "${PREFIXED_VERSION}" ]; then if [ -z "${PREFIXED_VERSION}" ]; then
nvm_error 'A version number is required.' nvm_err 'A version number is required.'
return 3 return 3
fi fi
@@ -2304,17 +2294,18 @@ nvm_install_binary() {
NODE_OR_IOJS="io.js" NODE_OR_IOJS="io.js"
fi fi
if [ "${NVM_NO_PROGRESS-}" = "1" ]; then if [ "${NVM_NO_PROGRESS-}" = "1" ]; then
# --silent, --show-error, use short option as @samrocketman mentions the compatibility issue.
PROGRESS_BAR="-sS" PROGRESS_BAR="-sS"
else else
PROGRESS_BAR="--progress-bar" PROGRESS_BAR="--progress-bar"
fi fi
nvm_info "Downloading and installing ${NODE_OR_IOJS-} ${VERSION}..." nvm_echo "Downloading and installing ${NODE_OR_IOJS-} ${VERSION}..."
TARBALL="$(PROGRESS_BAR="${PROGRESS_BAR}" nvm_download_artifact "${FLAVOR}" binary "${TYPE-}" "${VERSION}" | command tail -1)" TARBALL="$(PROGRESS_BAR="${PROGRESS_BAR}" nvm_download_artifact "${FLAVOR}" binary "${TYPE-}" "${VERSION}" | command tail -1)"
if [ -f "${TARBALL}" ]; then if [ -f "${TARBALL}" ]; then
TMPDIR="$(dirname "${TARBALL}")/files" TMPDIR="$(dirname "${TARBALL}")/files"
fi fi
if nvm_time_operation nvm_install_binary_extract "${NVM_OS}" "${PREFIXED_VERSION}" "${VERSION}" "${TARBALL}" "${TMPDIR}"; then if nvm_install_binary_extract "${NVM_OS}" "${PREFIXED_VERSION}" "${VERSION}" "${TARBALL}" "${TMPDIR}"; then
if [ -n "${ALIAS-}" ]; then if [ -n "${ALIAS-}" ]; then
nvm alias "${ALIAS}" "${provided_version}" nvm alias "${ALIAS}" "${provided_version}"
fi fi
@@ -2324,11 +2315,11 @@ nvm_install_binary() {
# Read nosource from arguments # Read nosource from arguments
if [ "${nosource-}" = '1' ]; then if [ "${nosource-}" = '1' ]; then
nvm_error 'Binary download failed. Download from source aborted.' nvm_err 'Binary download failed. Download from source aborted.'
return 0 return 0
fi fi
nvm_warn 'Binary download failed, trying source.' nvm_err 'Binary download failed, trying source.'
if [ -n "${TMPDIR-}" ]; then if [ -n "${TMPDIR-}" ]; then
command rm -rf "${TMPDIR}" command rm -rf "${TMPDIR}"
fi fi
@@ -2341,7 +2332,7 @@ nvm_get_download_slug() {
case "${1-}" in case "${1-}" in
node | iojs) FLAVOR="${1}" ;; node | iojs) FLAVOR="${1}" ;;
*) *)
nvm_error 'supported flavors: node, iojs' nvm_err 'supported flavors: node, iojs'
return 1 return 1
;; ;;
esac esac
@@ -2350,7 +2341,7 @@ nvm_get_download_slug() {
case "${2-}" in case "${2-}" in
binary | source) KIND="${2}" ;; binary | source) KIND="${2}" ;;
*) *)
nvm_error 'supported kinds: binary, source' nvm_err 'supported kinds: binary, source'
return 2 return 2
;; ;;
esac esac
@@ -2411,7 +2402,7 @@ nvm_download_artifact() {
case "${1-}" in case "${1-}" in
node | iojs) FLAVOR="${1}" ;; node | iojs) FLAVOR="${1}" ;;
*) *)
nvm_error 'supported flavors: node, iojs' nvm_err 'supported flavors: node, iojs'
return 1 return 1
;; ;;
esac esac
@@ -2420,7 +2411,7 @@ nvm_download_artifact() {
case "${2-}" in case "${2-}" in
binary | source) KIND="${2}" ;; binary | source) KIND="${2}" ;;
*) *)
nvm_error 'supported kinds: binary, source' nvm_err 'supported kinds: binary, source'
return 1 return 1
;; ;;
esac esac
@@ -2438,12 +2429,12 @@ nvm_download_artifact() {
VERSION="${4}" VERSION="${4}"
if [ -z "${VERSION}" ]; then if [ -z "${VERSION}" ]; then
nvm_error 'A version number is required.' nvm_err 'A version number is required.'
return 3 return 3
fi fi
if [ "${KIND}" = 'binary' ] && ! nvm_binary_available "${VERSION}"; then if [ "${KIND}" = 'binary' ] && ! nvm_binary_available "${VERSION}"; then
nvm_error "No precompiled binary available for ${VERSION}." nvm_err "No precompiled binary available for ${VERSION}."
return return
fi fi
@@ -2463,7 +2454,7 @@ nvm_download_artifact() {
tmpdir="$(nvm_cache_dir)/src/${SLUG}" tmpdir="$(nvm_cache_dir)/src/${SLUG}"
fi fi
command mkdir -p "${tmpdir}/files" || ( command mkdir -p "${tmpdir}/files" || (
nvm_error "creating directory ${tmpdir}/files failed" nvm_err "creating directory ${tmpdir}/files failed"
return 3 return 3
) )
@@ -2478,27 +2469,27 @@ nvm_download_artifact() {
fi fi
if [ -r "${TARBALL}" ]; then if [ -r "${TARBALL}" ]; then
nvm_error "Local cache found: $(nvm_sanitize_path "${TARBALL}")" nvm_err "Local cache found: $(nvm_sanitize_path "${TARBALL}")"
if nvm_compare_checksum "${TARBALL}" "${CHECKSUM}" >/dev/null 2>&1; then if nvm_compare_checksum "${TARBALL}" "${CHECKSUM}" >/dev/null 2>&1; then
nvm_info "Checksums match! Using existing downloaded archive $(nvm_sanitize_path "${TARBALL}")" nvm_err "Checksums match! Using existing downloaded archive $(nvm_sanitize_path "${TARBALL}")"
nvm_echo "${TARBALL}" nvm_echo "${TARBALL}"
return 0 return 0
fi fi
nvm_compare_checksum "${TARBALL}" "${CHECKSUM}" nvm_compare_checksum "${TARBALL}" "${CHECKSUM}"
nvm_error "Checksum check failed!" nvm_err "Checksum check failed!"
nvm_error "Removing the broken local cache..." nvm_err "Removing the broken local cache..."
command rm -rf "${TARBALL}" command rm -rf "${TARBALL}"
fi fi
nvm_info "Downloading ${TARBALL_URL}..." nvm_err "Downloading ${TARBALL_URL}..."
nvm_download -L -C - "${PROGRESS_BAR}" "${TARBALL_URL}" -o "${TARBALL}" || ( nvm_download -L -C - "${PROGRESS_BAR}" "${TARBALL_URL}" -o "${TARBALL}" || (
command rm -rf "${TARBALL}" "${tmpdir}" command rm -rf "${TARBALL}" "${tmpdir}"
nvm_error "download from ${TARBALL_URL} failed" nvm_err "download from ${TARBALL_URL} failed"
return 4 return 4
) )
if nvm_grep '404 Not Found' "${TARBALL}" >/dev/null; then if nvm_grep '404 Not Found' "${TARBALL}" >/dev/null; then
command rm -rf "${TARBALL}" "${tmpdir}" command rm -rf "${TARBALL}" "${tmpdir}"
nvm_error "HTTP 404 at URL ${TARBALL_URL}" nvm_err "HTTP 404 at URL ${TARBALL_URL}"
return 5 return 5
fi fi
@@ -2513,7 +2504,7 @@ nvm_download_artifact() {
# args: nvm_os, version, tarball, tmpdir # args: nvm_os, version, tarball, tmpdir
nvm_extract_tarball() { nvm_extract_tarball() {
if [ "$#" -ne 4 ]; then if [ "$#" -ne 4 ]; then
nvm_error 'nvm_extract_tarball requires exactly 4 arguments' nvm_err 'nvm_extract_tarball requires exactly 4 arguments'
return 5 return 5
fi fi
@@ -2559,7 +2550,7 @@ nvm_get_make_jobs() {
return return
elif [ -n "${1-}" ]; then elif [ -n "${1-}" ]; then
unset NVM_MAKE_JOBS unset NVM_MAKE_JOBS
nvm_error "$1 is invalid for number of \`make\` jobs, must be a natural number" nvm_err "$1 is invalid for number of \`make\` jobs, must be a natural number"
fi fi
local NVM_OS local NVM_OS
NVM_OS="$(nvm_get_os)" NVM_OS="$(nvm_get_os)"
@@ -2579,8 +2570,8 @@ nvm_get_make_jobs() {
;; ;;
esac esac
if ! nvm_is_natural_num "${NVM_CPU_CORES}"; then if ! nvm_is_natural_num "${NVM_CPU_CORES}"; then
nvm_error 'Can not determine how many core(s) are available, running in single-threaded mode.' nvm_err 'Can not determine how many core(s) are available, running in single-threaded mode.'
nvm_error 'Please report an issue on GitHub to help us make nvm run faster on your computer!' nvm_err 'Please report an issue on GitHub to help us make nvm run faster on your computer!'
NVM_MAKE_JOBS=1 NVM_MAKE_JOBS=1
else else
nvm_echo "Detected that you have ${NVM_CPU_CORES} CPU core(s)" nvm_echo "Detected that you have ${NVM_CPU_CORES} CPU core(s)"
@@ -2600,7 +2591,7 @@ nvm_install_source() {
case "${1-}" in case "${1-}" in
node | iojs) FLAVOR="${1}" ;; node | iojs) FLAVOR="${1}" ;;
*) *)
nvm_error 'supported flavors: node, iojs' nvm_err 'supported flavors: node, iojs'
return 4 return 4
;; ;;
esac esac
@@ -2611,7 +2602,7 @@ nvm_install_source() {
local PREFIXED_VERSION local PREFIXED_VERSION
PREFIXED_VERSION="${3-}" PREFIXED_VERSION="${3-}"
if [ -z "${PREFIXED_VERSION}" ]; then if [ -z "${PREFIXED_VERSION}" ]; then
nvm_error 'A version number is required.' nvm_err 'A version number is required.'
return 3 return 3
fi fi
@@ -2691,7 +2682,7 @@ nvm_install_source() {
command rm -f "${VERSION_PATH}" 2>/dev/null && \ command rm -f "${VERSION_PATH}" 2>/dev/null && \
$make -j "${NVM_MAKE_JOBS}" ${MAKE_CXX-} install $make -j "${NVM_MAKE_JOBS}" ${MAKE_CXX-} install
); then ); then
nvm_error "nvm: install ${VERSION} failed!" nvm_err "nvm: install ${VERSION} failed!"
command rm -rf "${TMPDIR-}" command rm -rf "${TMPDIR-}"
return 1 return 1
fi fi
@@ -2710,10 +2701,10 @@ nvm_install_npm_if_needed() {
if ! nvm_has "npm"; then if ! nvm_has "npm"; then
nvm_echo 'Installing npm...' nvm_echo 'Installing npm...'
if nvm_version_greater 0.2.0 "${VERSION}"; then if nvm_version_greater 0.2.0 "${VERSION}"; then
nvm_error 'npm requires node v0.2.3 or higher' nvm_err 'npm requires node v0.2.3 or higher'
elif nvm_version_greater_than_or_equal_to "${VERSION}" 0.2.0; then elif nvm_version_greater_than_or_equal_to "${VERSION}" 0.2.0; then
if nvm_version_greater 0.2.3 "${VERSION}"; then if nvm_version_greater 0.2.3 "${VERSION}"; then
nvm_error 'npm requires node v0.2.3 or higher' nvm_err 'npm requires node v0.2.3 or higher'
else else
nvm_download -L https://npmjs.org/install.sh -o - | clean=yes npm_install=0.2.19 sh nvm_download -L https://npmjs.org/install.sh -o - | clean=yes npm_install=0.2.19 sh
fi fi
@@ -2746,10 +2737,10 @@ nvm_npm_global_modules() {
local NPMLIST local NPMLIST
local VERSION local VERSION
VERSION="$1" 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 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 local LINKS
LINKS="$(nvm_echo "${NPMLIST}" | command sed -n 's/.* -> \(.*\)/\1/ p')" LINKS="$(nvm_echo "${NPMLIST}" | command sed -n 's/.* -> \(.*\)/\1/ p')"
@@ -2772,7 +2763,7 @@ nvm_die_on_prefix() {
case "${NVM_DELETE_PREFIX}" in case "${NVM_DELETE_PREFIX}" in
0 | 1) ;; 0 | 1) ;;
*) *)
nvm_error 'First argument "delete the prefix" must be zero or one' nvm_err 'First argument "delete the prefix" must be zero or one'
return 1 return 1
;; ;;
esac esac
@@ -2781,7 +2772,7 @@ nvm_die_on_prefix() {
local NVM_VERSION_DIR local NVM_VERSION_DIR
NVM_VERSION_DIR="${3-}" NVM_VERSION_DIR="${3-}"
if [ -z "${NVM_COMMAND}" ] || [ -z "${NVM_VERSION_DIR}" ]; then if [ -z "${NVM_COMMAND}" ] || [ -z "${NVM_VERSION_DIR}" ]; then
nvm_error 'Second argument "nvm command", and third argument "nvm version dir", must both be nonempty' nvm_err 'Second argument "nvm command", and third argument "nvm version dir", must both be nonempty'
return 2 return 2
fi fi
@@ -2790,8 +2781,8 @@ nvm_die_on_prefix() {
# however, `npm exec` in npm v7.2+ sets $PREFIX; if set, inherit it # however, `npm exec` in npm v7.2+ sets $PREFIX; if set, inherit it
if [ -n "${PREFIX-}" ] && [ "$(nvm_version_path "$(node -v)")" != "${PREFIX}" ]; then if [ -n "${PREFIX-}" ] && [ "$(nvm_version_path "$(node -v)")" != "${PREFIX}" ]; then
nvm deactivate >/dev/null 2>&1 nvm deactivate >/dev/null 2>&1
nvm_error "nvm is not compatible with the \"PREFIX\" environment variable: currently set to \"${PREFIX}\"" nvm_err "nvm is not compatible with the \"PREFIX\" environment variable: currently set to \"${PREFIX}\""
nvm_error 'Run `unset PREFIX` to unset it.' nvm_err 'Run `unset PREFIX` to unset it.'
return 3 return 3
fi fi
@@ -2814,8 +2805,8 @@ nvm_die_on_prefix() {
fi fi
if [ -n "${NVM_CONFIG_VALUE-}" ] && ! nvm_tree_contains_path "${NVM_DIR}" "${NVM_CONFIG_VALUE}"; then if [ -n "${NVM_CONFIG_VALUE-}" ] && ! nvm_tree_contains_path "${NVM_DIR}" "${NVM_CONFIG_VALUE}"; then
nvm deactivate >/dev/null 2>&1 nvm deactivate >/dev/null 2>&1
nvm_error "nvm is not compatible with the \"${NVM_NPM_CONFIG_x_PREFIX_ENV}\" environment variable: currently set to \"${NVM_CONFIG_VALUE}\"" nvm_err "nvm is not compatible with the \"${NVM_NPM_CONFIG_x_PREFIX_ENV}\" environment variable: currently set to \"${NVM_CONFIG_VALUE}\""
nvm_error "Run \`unset ${NVM_NPM_CONFIG_x_PREFIX_ENV}\` to unset it." nvm_err "Run \`unset ${NVM_NPM_CONFIG_x_PREFIX_ENV}\` to unset it."
return 4 return 4
fi fi
fi fi
@@ -2839,9 +2830,9 @@ nvm_die_on_prefix() {
npm config --loglevel=warn delete prefix --userconfig="${NVM_NPM_BUILTIN_NPMRC}" npm config --loglevel=warn delete prefix --userconfig="${NVM_NPM_BUILTIN_NPMRC}"
npm config --loglevel=warn delete globalconfig --userconfig="${NVM_NPM_BUILTIN_NPMRC}" npm config --loglevel=warn delete globalconfig --userconfig="${NVM_NPM_BUILTIN_NPMRC}"
else else
nvm_error "Your builtin npmrc file ($(nvm_sanitize_path "${NVM_NPM_BUILTIN_NPMRC}"))" nvm_err "Your builtin npmrc file ($(nvm_sanitize_path "${NVM_NPM_BUILTIN_NPMRC}"))"
nvm_error 'has a `globalconfig` and/or a `prefix` setting, which are incompatible with nvm.' nvm_err 'has a `globalconfig` and/or a `prefix` setting, which are incompatible with nvm.'
nvm_error "Run \`${NVM_COMMAND}\` to unset it." nvm_err "Run \`${NVM_COMMAND}\` to unset it."
return 10 return 10
fi fi
fi fi
@@ -2853,9 +2844,9 @@ nvm_die_on_prefix() {
npm config --global --loglevel=warn delete prefix npm config --global --loglevel=warn delete prefix
npm config --global --loglevel=warn delete globalconfig npm config --global --loglevel=warn delete globalconfig
else else
nvm_error "Your global npmrc file ($(nvm_sanitize_path "${NVM_NPM_GLOBAL_NPMRC}"))" nvm_err "Your global npmrc file ($(nvm_sanitize_path "${NVM_NPM_GLOBAL_NPMRC}"))"
nvm_error 'has a `globalconfig` and/or a `prefix` setting, which are incompatible with nvm.' nvm_err 'has a `globalconfig` and/or a `prefix` setting, which are incompatible with nvm.'
nvm_error "Run \`${NVM_COMMAND}\` to unset it." nvm_err "Run \`${NVM_COMMAND}\` to unset it."
return 10 return 10
fi fi
fi fi
@@ -2867,9 +2858,9 @@ nvm_die_on_prefix() {
npm config --loglevel=warn delete prefix --userconfig="${NVM_NPM_USER_NPMRC}" npm config --loglevel=warn delete prefix --userconfig="${NVM_NPM_USER_NPMRC}"
npm config --loglevel=warn delete globalconfig --userconfig="${NVM_NPM_USER_NPMRC}" npm config --loglevel=warn delete globalconfig --userconfig="${NVM_NPM_USER_NPMRC}"
else else
nvm_error "Your user's .npmrc file ($(nvm_sanitize_path "${NVM_NPM_USER_NPMRC}"))" nvm_err "Your users .npmrc file ($(nvm_sanitize_path "${NVM_NPM_USER_NPMRC}"))"
nvm_error 'has a `globalconfig` and/or a `prefix` setting, which are incompatible with nvm.' nvm_err 'has a `globalconfig` and/or a `prefix` setting, which are incompatible with nvm.'
nvm_error "Run \`${NVM_COMMAND}\` to unset it." nvm_err "Run \`${NVM_COMMAND}\` to unset it."
return 10 return 10
fi fi
fi fi
@@ -2881,9 +2872,9 @@ nvm_die_on_prefix() {
npm config --loglevel=warn delete prefix npm config --loglevel=warn delete prefix
npm config --loglevel=warn delete globalconfig npm config --loglevel=warn delete globalconfig
else else
nvm_error "Your project npmrc file ($(nvm_sanitize_path "${NVM_NPM_PROJECT_NPMRC}"))" nvm_err "Your project npmrc file ($(nvm_sanitize_path "${NVM_NPM_PROJECT_NPMRC}"))"
nvm_error 'has a `globalconfig` and/or a `prefix` setting, which are incompatible with nvm.' nvm_err 'has a `globalconfig` and/or a `prefix` setting, which are incompatible with nvm.'
nvm_error "Run \`${NVM_COMMAND}\` to unset it." nvm_err "Run \`${NVM_COMMAND}\` to unset it."
return 10 return 10
fi fi
fi fi
@@ -2974,7 +2965,7 @@ nvm_write_nvmrc() {
fi fi
echo "${VERSION_STRING}" | tee "$PWD"/.nvmrc > /dev/null || { echo "${VERSION_STRING}" | tee "$PWD"/.nvmrc > /dev/null || {
if [ "${NVM_SILENT:-0}" -ne 1 ]; then if [ "${NVM_SILENT:-0}" -ne 1 ]; then
nvm_error "Warning: Unable to write version number ($VERSION_STRING) to .nvmrc" nvm_err "Warning: Unable to write version number ($VERSION_STRING) to .nvmrc"
fi fi
return 3 return 3
} }
@@ -2989,13 +2980,13 @@ nvm_check_file_permissions() {
for FILE in "$1"/* "$1"/.[!.]* "$1"/..?* ; do for FILE in "$1"/* "$1"/.[!.]* "$1"/..?* ; do
if [ -d "$FILE" ]; then if [ -d "$FILE" ]; then
if [ -n "${NVM_DEBUG-}" ]; then if [ -n "${NVM_DEBUG-}" ]; then
nvm_error "${FILE}" nvm_err "${FILE}"
fi fi
if [ ! -L "${FILE}" ] && ! nvm_check_file_permissions "${FILE}"; then if [ ! -L "${FILE}" ] && ! nvm_check_file_permissions "${FILE}"; then
return 2 return 2
fi fi
elif [ -e "$FILE" ] && [ ! -w "$FILE" ] && [ ! -O "$FILE" ]; then elif [ -e "$FILE" ] && [ ! -w "$FILE" ] && [ ! -O "$FILE" ]; then
nvm_error "file is not writable or self-owned: $(nvm_sanitize_path "$FILE")" nvm_err "file is not writable or self-owned: $(nvm_sanitize_path "$FILE")"
return 1 return 1
fi fi
done done

View File

@@ -45,9 +45,9 @@
"dockerfile_lint": "^0.3.4", "dockerfile_lint": "^0.3.4",
"doctoc": "^2.2.1", "doctoc": "^2.2.1",
"eclint": "^2.8.1", "eclint": "^2.8.1",
"markdown-link-check": "^3.12.2", "markdown-link-check": "^3.13.7",
"replace": "^1.2.2", "replace": "^1.2.2",
"semver": "^7.6.3", "semver": "^7.7.1",
"urchin": "^0.0.5" "urchin": "^0.0.5"
} }
} }

View File

@@ -3,12 +3,16 @@
setup () { setup () {
HOME="." HOME="."
NVM_ENV=testing \. ../../install.sh NVM_ENV=testing \. ../../install.sh
ZDOTDIR="$HOME/zdotdir"
mkdir -p zdotdir
touch ".bashrc" touch ".bashrc"
touch ".bash_profile" touch ".bash_profile"
touch ".zprofile" touch ".zprofile"
touch ".zshrc" touch ".zshrc"
touch ".profile" touch ".profile"
touch "test_profile" touch "test_profile"
touch "zdotdir/.zshrc"
touch "zdotdir/.zprofile"
} }
cleanup () { cleanup () {
@@ -17,7 +21,9 @@ cleanup () {
unset NVM_DETECT_PROFILE unset NVM_DETECT_PROFILE
unset SHELL unset SHELL
unset -f setup cleanup die unset -f setup cleanup die
unset ZDOTDIR
rm -f ".bashrc" ".bash_profile" ".zprofile" ".zshrc" ".profile" "test_profile" > "/dev/null" 2>&1 rm -f ".bashrc" ".bash_profile" ".zprofile" ".zshrc" ".profile" "test_profile" > "/dev/null" 2>&1
rm -rf zdotdir 2>&1
} }
die () { echo "$@" '$NVM_DETECT_PROFILE:' "$NVM_DETECT_PROFILE"; cleanup; exit 1; } die () { echo "$@" '$NVM_DETECT_PROFILE:' "$NVM_DETECT_PROFILE"; cleanup; exit 1; }
@@ -29,49 +35,54 @@ setup
# #
# setting $PROFILE to /dev/null should return no detected profile # setting $PROFILE to /dev/null should return no detected profile
NVM_DETECT_PROFILE="$(PROFILE='/dev/null'; nvm_detect_profile)" NVM_DETECT_PROFILE="$(PROFILE='/dev/null' nvm_detect_profile)"
if [ -n "$NVM_DETECT_PROFILE" ]; then if [ -n "$NVM_DETECT_PROFILE" ]; then
die "nvm_detect_profile still detected a profile even though PROFILE=/dev/null" die "nvm_detect_profile still detected a profile even though PROFILE=/dev/null"
fi fi
# .bashrc should be detected for bash # .bashrc should be detected for bash
NVM_DETECT_PROFILE="$(SHELL="/bin/bash"; unset PROFILE; nvm_detect_profile)" NVM_DETECT_PROFILE="$(SHELL="/bin/bash" PROFILE= nvm_detect_profile)"
if [ "$NVM_DETECT_PROFILE" != "$HOME/.bashrc" ]; then if [ "$NVM_DETECT_PROFILE" != "$HOME/.bashrc" ]; then
die "nvm_detect_profile didn't pick \$HOME/.bashrc for bash" die "nvm_detect_profile didn't pick \$HOME/.bashrc for bash"
fi fi
# $PROFILE should override .bashrc profile detection # $PROFILE should override .bashrc profile detection
NVM_DETECT_PROFILE="$(SHELL="/bin/bash"; PROFILE="test_profile"; nvm_detect_profile)" NVM_DETECT_PROFILE="$(SHELL="/bin/bash" PROFILE="test_profile" nvm_detect_profile)"
if [ "$NVM_DETECT_PROFILE" != "test_profile" ]; then if [ "$NVM_DETECT_PROFILE" != "test_profile" ]; then
die "nvm_detect_profile ignored \$PROFILE" die "nvm_detect_profile ignored \$PROFILE"
fi fi
# zdotdir/.zshrc should be detected for zsh
NVM_DETECT_PROFILE="$(SHELL="/bin/zsh" PROFILE= nvm_detect_profile)"
if [ "$NVM_DETECT_PROFILE" != "$ZDOTDIR/.zshrc" ]; then
die "nvm_detect_profile didn't pick \$ZDOTDIR/.zshrc for zsh"
fi
# .zshrc should be detected for zsh # .zshrc should be detected for zsh
NVM_DETECT_PROFILE="$(SHELL="/bin/zsh"; unset PROFILE; nvm_detect_profile)" NVM_DETECT_PROFILE="$(SHELL="/bin/zsh" PROFILE= ZDOTDIR= nvm_detect_profile)"
if [ "$NVM_DETECT_PROFILE" != "$HOME/.zshrc" ]; then if [ "$NVM_DETECT_PROFILE" != "$HOME/.zshrc" ]; then
die "nvm_detect_profile didn't pick \$HOME/.zshrc for zsh" die "nvm_detect_profile didn't pick \$HOME/.zshrc for zsh"
fi fi
# $PROFILE should override .zshrc profile detection # $PROFILE should override .zshrc profile detection
NVM_DETECT_PROFILE="$(SHELL="/usr/bin/zsh"; PROFILE="test_profile"; nvm_detect_profile)" NVM_DETECT_PROFILE="$(SHELL="/usr/bin/zsh" PROFILE="test_profile" nvm_detect_profile)"
if [ "$NVM_DETECT_PROFILE" != "test_profile" ]; then if [ "$NVM_DETECT_PROFILE" != "test_profile" ]; then
die "nvm_detect_profile ignored \$PROFILE" die "nvm_detect_profile ignored \$PROFILE"
fi fi
# #
# Confirm $PROFILE is only returned when it points to a valid file # Confirm $PROFILE is only returned when it points to a valid file
# #
# $PROFILE is a valid file # $PROFILE is a valid file
NVM_DETECT_PROFILE="$(PROFILE="test_profile"; unset SHELL; nvm_detect_profile)" NVM_DETECT_PROFILE="$(PROFILE="test_profile" SHELL= nvm_detect_profile)"
if [ "$NVM_DETECT_PROFILE" != "test_profile" ]; then if [ "$NVM_DETECT_PROFILE" != "test_profile" ]; then
die "nvm_detect_profile didn't pick \$PROFILE when it was a valid file" die "nvm_detect_profile didn't pick \$PROFILE when it was a valid file"
fi fi
# $PROFILE is not a valid file # $PROFILE is not a valid file
rm "test_profile" rm "test_profile"
NVM_DETECT_PROFILE="$(PROFILE="test_profile"; nvm_detect_profile)" NVM_DETECT_PROFILE="$(PROFILE="test_profile" nvm_detect_profile)"
if [ "$NVM_DETECT_PROFILE" = "test_profile" ]; then if [ "$NVM_DETECT_PROFILE" = "test_profile" ]; then
die "nvm_detect_profile picked \$PROFILE when it was an invalid file" die "nvm_detect_profile picked \$PROFILE when it was an invalid file"
fi fi
@@ -83,44 +94,58 @@ fi
# #
# It should favor .profile if file exists # It should favor .profile if file exists
NVM_DETECT_PROFILE="$(unset SHELL; nvm_detect_profile)" NVM_DETECT_PROFILE="$(SHELL= ZDOTDIR= nvm_detect_profile)"
if [ "$NVM_DETECT_PROFILE" != "$HOME/.profile" ]; then if [ "$NVM_DETECT_PROFILE" != "$HOME/.profile" ]; then
die "nvm_detect_profile should have selected .profile" die "nvm_detect_profile should have selected .profile; got $NVM_DETECT_PROFILE"
fi fi
# Otherwise, it should favor .bashrc if file exists # Otherwise, it should favor .bashrc if file exists
rm ".profile" rm ".profile"
NVM_DETECT_PROFILE="$(unset SHELL; nvm_detect_profile)" NVM_DETECT_PROFILE="$(SHELL= ZDOTDIR= nvm_detect_profile)"
if [ "$NVM_DETECT_PROFILE" != "$HOME/.bashrc" ]; then if [ "$NVM_DETECT_PROFILE" != "$HOME/.bashrc" ]; then
die "nvm_detect_profile should have selected .bashrc" die "nvm_detect_profile should have selected .bashrc; got $NVM_DETECT_PROFILE"
fi fi
# Otherwise, it should favor .bash_profile if file exists # Otherwise, it should favor .bash_profile if file exists
rm ".bashrc" rm ".bashrc"
NVM_DETECT_PROFILE="$(unset SHELL; nvm_detect_profile)" NVM_DETECT_PROFILE="$(SHELL= ZDOTDIR= nvm_detect_profile)"
if [ "$NVM_DETECT_PROFILE" != "$HOME/.bash_profile" ]; then if [ "$NVM_DETECT_PROFILE" != "$HOME/.bash_profile" ]; then
die "nvm_detect_profile should have selected .bash_profile" die "nvm_detect_profile should have selected .bash_profile; got $NVM_DETECT_PROFILE"
fi
# Otherwise, it should favor zdotdir/.zprofile if file exists
rm ".bash_profile"
NVM_DETECT_PROFILE="$(SHELL= nvm_detect_profile)"
if [ "$NVM_DETECT_PROFILE" != "$ZDOTDIR/.zprofile" ]; then
die "nvm_detect_profile should have selected zdotdir/.zprofile; got $NVM_DETECT_PROFILE"
fi fi
# Otherwise, it should favor .zprofile if file exists # Otherwise, it should favor .zprofile if file exists
rm ".bash_profile" rm "zdotdir/.zprofile"
NVM_DETECT_PROFILE="$(unset SHELL; nvm_detect_profile)" NVM_DETECT_PROFILE="$(SHELL= ZDOTDIR= nvm_detect_profile)"
if [ "$NVM_DETECT_PROFILE" != "$HOME/.zprofile" ]; then if [ "$NVM_DETECT_PROFILE" != "$HOME/.zprofile" ]; then
die "nvm_detect_profile should have selected .zprofile" die "nvm_detect_profile should have selected .zprofile; got $NVM_DETECT_PROFILE"
fi
# Otherwise, it should favor zdotdir/.zshrc if file exists
rm ".zprofile"
NVM_DETECT_PROFILE="$(SHELL= nvm_detect_profile)"
if [ "$NVM_DETECT_PROFILE" != "$ZDOTDIR/.zshrc" ]; then
die "nvm_detect_profile should have selected zdotdir/.zshrc; got $NVM_DETECT_PROFILE"
fi fi
# Otherwise, it should favor .zshrc if file exists # Otherwise, it should favor .zshrc if file exists
rm ".zprofile" rm "zdotdir/.zshrc"
NVM_DETECT_PROFILE="$(unset SHELL; nvm_detect_profile)" NVM_DETECT_PROFILE="$(SHELL= ZDOTDIR= nvm_detect_profile)"
if [ "$NVM_DETECT_PROFILE" != "$HOME/.zshrc" ]; then if [ "$NVM_DETECT_PROFILE" != "$HOME/.zshrc" ]; then
die "nvm_detect_profile should have selected .zshrc" die "nvm_detect_profile should have selected .zshrc; got $NVM_DETECT_PROFILE"
fi fi
# It should be empty if none is found # It should be empty if none is found
rm ".zshrc" rm ".zshrc"
NVM_DETECT_PROFILE="$(unset SHELL; nvm_detect_profile)" NVM_DETECT_PROFILE="$(SHELL= nvm_detect_profile)"
if [ ! -z "$NVM_DETECT_PROFILE" ]; then if [ ! -z "$NVM_DETECT_PROFILE" ]; then
die "nvm_detect_profile should have returned an empty value" die "nvm_detect_profile should have returned an empty value; got $NVM_DETECT_PROFILE"
fi fi
cleanup cleanup

View File

@@ -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 echo "$EXPECTED_PACKAGES_INSTALL" | sed -e 's/test-npmlink //' | xargs npm install -g --quiet
get_packages() { 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 nvm use 0.10.29

View File

@@ -5,7 +5,7 @@ die () { echo "$@" ; exit 1; }
\. ../../../nvm.sh \. ../../../nvm.sh
get_packages() { 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 nvm use 4.7.2
@@ -14,5 +14,14 @@ ORIGINAL_PACKAGES=$(get_packages)
nvm reinstall-packages 4.7.1 nvm reinstall-packages 4.7.1
FINAL_PACKAGES=$(get_packages) FINAL_PACKAGES=$(get_packages)
[ -z "${ORIGINAL_PACKAGES}" ] || die "original packages were not empty: ${ORIGINAL_PACKAGES}" [ -z "${ORIGINAL_PACKAGES}" ] || die "v4: original packages were not empty: ${ORIGINAL_PACKAGES}"
[ -z "${FINAL_PACKAGES}" ] || die "final packages were not empty: ${FINAL_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}"

View File

@@ -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"