Compare commits
28 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
179d45050b | ||
|
|
ff7634577b | ||
|
|
0ce8f5a52f | ||
|
|
863bd63cfa | ||
|
|
0d53381666 | ||
|
|
df70535248 | ||
|
|
c31a867c46 | ||
|
|
a8c418558a | ||
|
|
d5e2c92a25 | ||
|
|
81f18bc445 | ||
|
|
4beab63631 | ||
|
|
14acd3dcdd | ||
|
|
271720ebfc | ||
|
|
423ee82b4c | ||
|
|
deac4e0932 | ||
|
|
b5118ac365 | ||
|
|
24deac7ac5 | ||
|
|
ff1257e8e3 | ||
|
|
87a709741f | ||
|
|
f439acda4a | ||
|
|
dd89af53f5 | ||
|
|
bd090ef7f8 | ||
|
|
4c7d899447 | ||
|
|
80cb39d712 | ||
|
|
93277112ae | ||
|
|
762f9ef9d1 | ||
|
|
e597bb208e | ||
|
|
aa427ad396 |
@@ -8,6 +8,7 @@ test/bak
|
||||
.urchin.log
|
||||
.urchin_stdout
|
||||
test/**/test_output
|
||||
test/**/.nvmrc
|
||||
|
||||
node_modules/
|
||||
npm-debug.log
|
||||
|
||||
104
.github/workflows/nvm-install-test.yml
vendored
Normal file
104
.github/workflows/nvm-install-test.yml
vendored
Normal file
@@ -0,0 +1,104 @@
|
||||
name: 'Tests: nvm install with set -e'
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
push:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
ref:
|
||||
description: 'git ref to use'
|
||||
required: false
|
||||
default: 'HEAD'
|
||||
|
||||
jobs:
|
||||
matrix:
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
matrix: ${{ steps.matrix.outputs.matrix }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- id: matrix
|
||||
run: |
|
||||
if [ "${{ github.event_name }}" == "workflow_dispatch" ] && [ -n "${{ github.event.inputs.ref }}" ]; then
|
||||
echo "matrix=\"[\"${{ github.event.inputs.ref }}\"]\"" >> $GITHUB_OUTPUT
|
||||
else
|
||||
TAGS="$((echo "HEAD" && git tag --sort=-v:refname --merged HEAD --format='%(refname:strip=2) %(creatordate:short)' | grep '^v' | while read tag date; do
|
||||
if [ "$(uname)" == "Darwin" ]; then
|
||||
timestamp=$(date -j -f "%Y-%m-%d" "$date" +%s)
|
||||
threshold=$(date -j -v-4y +%s)
|
||||
else
|
||||
timestamp=$(date -d "$date" +%s)
|
||||
threshold=$(date -d "4 years ago" +%s)
|
||||
fi
|
||||
if [ $timestamp -ge $threshold ]; then echo "$tag"; fi
|
||||
done) | xargs)"
|
||||
echo $TAGS
|
||||
TAGS_JSON=$(printf "%s\n" $TAGS | jq -R . | jq -sc .)
|
||||
echo "matrix=${TAGS_JSON}" >> $GITHUB_OUTPUT
|
||||
fi
|
||||
|
||||
test:
|
||||
needs: [matrix]
|
||||
runs-on: ubuntu-latest
|
||||
continue-on-error: ${{ matrix.ref == 'v0.40.0' }} # https://github.com/nvm-sh/nvm/issues/3405
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
ref: ${{ fromJson(needs.matrix.outputs.matrix) }}
|
||||
has-nvmrc:
|
||||
- 'no nvmrc'
|
||||
- 'nvmrc'
|
||||
shell-level:
|
||||
- 1 shlvl
|
||||
- 2 shlvls
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: resolve HEAD to sha
|
||||
run: |
|
||||
if [ '${{ matrix.ref }}' = 'HEAD' ]; then
|
||||
REF="$(git rev-parse HEAD)"
|
||||
else
|
||||
REF="${{ matrix.ref }}"
|
||||
fi
|
||||
echo "resolved ref: ${REF}"
|
||||
echo "ref="$REF"" >> $GITHUB_ENV
|
||||
- run: echo $- # which options are set
|
||||
- run: echo node > .nvmrc
|
||||
if: ${{ matrix.has-nvmrc == 'nvmrc' }}
|
||||
- run: curl -I --compressed -v https://nodejs.org/dist/
|
||||
- name: 'install nvm'
|
||||
run: |
|
||||
set -e
|
||||
export NVM_INSTALL_VERSION="${ref}"
|
||||
curl -o- "https://raw.githubusercontent.com/nvm-sh/nvm/${ref}/install.sh" | bash
|
||||
- name: nvm --version
|
||||
run: |
|
||||
set +e
|
||||
. $NVM_DIR/nvm.sh && nvm --version
|
||||
- name: nvm install in 1 shell level, ${{ matrix.has-nvmrc }}
|
||||
if: ${{ matrix.shell-level == '1 shlvl' }}
|
||||
run: |
|
||||
set -ex
|
||||
. $NVM_DIR/nvm.sh
|
||||
echo nvm.sh sourced
|
||||
nvm --version
|
||||
if [ '${{ matrix.has-nvmrc }}' == 'nvmrc' ]; then
|
||||
nvm install
|
||||
fi
|
||||
- name: nvm install in 2 shell levels, ${{ matrix.has-nvmrc }}
|
||||
if: ${{ matrix.shell-level == '2 shlvls' }}
|
||||
run: |
|
||||
if [ '${{ matrix.has-nvmrc }}' == 'nvmrc' ]; then
|
||||
bash -c "set -ex && . $NVM_DIR/nvm.sh && echo nvm.sh sourced && nvm --version && nvm install"
|
||||
else
|
||||
bash -c "set -ex && . $NVM_DIR/nvm.sh && echo nvm.sh sourced && nvm --version"
|
||||
fi
|
||||
|
||||
finisher:
|
||||
runs-on: ubuntu-latest
|
||||
needs: [test]
|
||||
steps:
|
||||
- run: true
|
||||
30
.github/workflows/tests.yml
vendored
30
.github/workflows/tests.yml
vendored
@@ -19,13 +19,24 @@ jobs:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
- shell: bash
|
||||
exclude:
|
||||
- shell: sh
|
||||
suite: install_script
|
||||
# shell:
|
||||
# - bash
|
||||
# suite:
|
||||
# - install_script
|
||||
- shell: dash
|
||||
suite: install_script
|
||||
- shell: zsh
|
||||
suite: install_script
|
||||
- shell: ksh
|
||||
suite: install_script
|
||||
suite:
|
||||
- install_script
|
||||
- sourcing
|
||||
shell:
|
||||
- sh
|
||||
- bash
|
||||
- dash
|
||||
- zsh
|
||||
# - ksh
|
||||
|
||||
steps:
|
||||
- name: Harden Runner
|
||||
@@ -37,7 +48,13 @@ jobs:
|
||||
raw.githubusercontent.com:443
|
||||
nodejs.org:443
|
||||
iojs.org:443
|
||||
azure.archive.ubuntu.com:80
|
||||
packages.microsoft.com:443
|
||||
- uses: actions/checkout@v4
|
||||
- run: sudo apt-get update; sudo apt-get install ${{ matrix.shell }}
|
||||
if: matrix.shell == 'zsh' || matrix.shell == 'ksh'
|
||||
# zsh (https://github.com/actions/runner-images/issues/264) and ksh are not in the ubuntu image
|
||||
shell: bash
|
||||
- run: sudo ${{ matrix.shell }} --version 2> /dev/null || dpkg -s ${{ matrix.shell }} 2> /dev/null || which ${{ matrix.shell }}
|
||||
- run: curl --version
|
||||
- run: wget --version
|
||||
@@ -48,6 +65,7 @@ jobs:
|
||||
skip-ls-check: true
|
||||
shell-command: echo installed
|
||||
- run: npm ls urchin
|
||||
- run: npx which urchin
|
||||
- run: env
|
||||
- run: make TERM=xterm-256color TEST_SUITE="${{ matrix.suite }}" SHELL="${{ matrix.shell }}" URCHIN="$(npx which urchin)" test-${{ matrix.shell }}
|
||||
|
||||
|
||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -9,6 +9,7 @@ test/bak
|
||||
.urchin.log
|
||||
.urchin_stdout
|
||||
test/**/test_output
|
||||
test/**/.nvmrc
|
||||
|
||||
node_modules/
|
||||
npm-debug.log
|
||||
@@ -21,3 +22,5 @@ current
|
||||
npm-shrinkwrap.json
|
||||
package-lock.json
|
||||
yarn.lock
|
||||
|
||||
target/
|
||||
|
||||
16
.travis.yml
16
.travis.yml
@@ -8,6 +8,10 @@ addons:
|
||||
# - gcc-4.8
|
||||
# - g++-4.8
|
||||
|
||||
# https://gist.github.com/iedemam/9830045
|
||||
git:
|
||||
submodules: false
|
||||
|
||||
cache:
|
||||
ccache: true
|
||||
directories:
|
||||
@@ -16,6 +20,11 @@ cache:
|
||||
before_install:
|
||||
- sudo sed -i 's/mozilla\/DST_Root_CA_X3.crt/!mozilla\/DST_Root_CA_X3.crt/g' /etc/ca-certificates.conf
|
||||
- sudo update-ca-certificates -f
|
||||
|
||||
# https://gist.github.com/iedemam/9830045
|
||||
- sed -i 's/git@github.com:/https:\/\/github.com\//' .gitmodules
|
||||
- git submodule update --init --recursive
|
||||
|
||||
- $SHELL --version 2> /dev/null || dpkg -s $SHELL 2> /dev/null || which $SHELL
|
||||
- curl --version
|
||||
- wget --version
|
||||
@@ -23,7 +32,7 @@ before_install:
|
||||
- zsh --version
|
||||
- dpkg -s dash | grep ^Version | awk '{print $2}'
|
||||
# install python
|
||||
- pyenv install 2.7.18
|
||||
- pyenv local 2.7.18 || pyenv install 2.7.18
|
||||
- pyenv local 2.7.18 || echo 'pyenv failed'
|
||||
- python -V
|
||||
install:
|
||||
@@ -78,11 +87,6 @@ env:
|
||||
- SHELL=bash TEST_SUITE=fast
|
||||
- SHELL=zsh TEST_SUITE=fast
|
||||
# - SHELL=ksh TEST_SUITE=fast
|
||||
- SHELL=sh TEST_SUITE=sourcing
|
||||
- SHELL=dash TEST_SUITE=sourcing
|
||||
- SHELL=bash TEST_SUITE=sourcing
|
||||
- SHELL=zsh TEST_SUITE=sourcing
|
||||
# - SHELL=ksh TEST_SUITE=sourcing
|
||||
- SHELL=sh TEST_SUITE=slow
|
||||
- SHELL=dash TEST_SUITE=slow
|
||||
- SHELL=bash TEST_SUITE=slow
|
||||
|
||||
10
Makefile
10
Makefile
@@ -40,10 +40,14 @@ list:
|
||||
# Note that preexisting NVM_* variables are unset to avoid interfering with tests, except when running the Travis tests (where NVM_DIR must be passed in and the env. is assumed to be pristine).
|
||||
.PHONY: $(SHELL_TARGETS)
|
||||
$(SHELL_TARGETS):
|
||||
@shell='$@'; shell=$${shell##*-}; which "$$shell" >/dev/null || { printf '\033[0;31m%s\033[0m\n' "WARNING: Cannot test with shell '$$shell': not found." >&2; exit 0; } && \
|
||||
@shell='$@'; shell=$${shell##*-}; \
|
||||
which "$$shell" >/dev/null || { printf '\033[0;31m%s\033[0m\n' "WARNING: Cannot test with shell '$$shell': not found." >&2; exit 0; } && \
|
||||
printf '\n\033[0;34m%s\033[0m\n' "Running tests in $$shell"; \
|
||||
[ -z "$$TRAVIS_BUILD_DIR" ] && for v in $$(set | awk -F'=' '$$1 ~ "^NVM_" { print $$1 }'); do unset $$v; done && unset v; \
|
||||
for suite in $(TEST_SUITE); do $(URCHIN) -f -s $$shell test/$$suite || exit; done
|
||||
[ -z "$$TRAVIS_BUILD_DIR" ] && [ -z "$$GITHUB_ACTIONS" ] && for v in $$(set | awk -F'=' '$$1 ~ "^NVM_" { print $$1 }'); do unset $$v; done && unset v; \
|
||||
for suite in $(TEST_SUITE); do \
|
||||
echo "Running test suite: $$suite"; \
|
||||
$(URCHIN) -f -s $$shell test/$$suite || exit; \
|
||||
done
|
||||
|
||||
# All-tests target: invokes the specified test suites for ALL shells defined in $(SHELLS).
|
||||
.PHONY: test
|
||||
|
||||
44
README.md
44
README.md
@@ -6,7 +6,7 @@
|
||||
</a>
|
||||
|
||||
|
||||
# Node Version Manager [][3] [][4] [](https://bestpractices.dev/projects/684)
|
||||
# Node Version Manager [][3] [][4] [](https://bestpractices.dev/projects/684)
|
||||
|
||||
<!-- To update this table of contents, ensure you have run `npm install` then `npm run doctoc` -->
|
||||
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
|
||||
@@ -39,6 +39,7 @@
|
||||
- [Restoring PATH](#restoring-path)
|
||||
- [Set default node version](#set-default-node-version)
|
||||
- [Use a mirror of node binaries](#use-a-mirror-of-node-binaries)
|
||||
- [Pass Authorization header to mirror](#pass-authorization-header-to-mirror)
|
||||
- [.nvmrc](#nvmrc)
|
||||
- [Deeper Shell Integration](#deeper-shell-integration)
|
||||
- [Calling `nvm use` automatically in a directory with a `.nvmrc` file](#calling-nvm-use-automatically-in-a-directory-with-a-nvmrc-file)
|
||||
@@ -60,6 +61,8 @@
|
||||
- [macOS Troubleshooting](#macos-troubleshooting)
|
||||
- [WSL Troubleshooting](#wsl-troubleshooting)
|
||||
- [Maintainers](#maintainers)
|
||||
- [Project Support](#project-support)
|
||||
- [Enterprise Support](#enterprise-support)
|
||||
- [License](#license)
|
||||
- [Copyright notice](#copyright-notice)
|
||||
|
||||
@@ -99,10 +102,10 @@ 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.39.7/install.sh | bash
|
||||
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
|
||||
```
|
||||
```sh
|
||||
wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/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`).
|
||||
@@ -124,7 +127,7 @@ Eg: `curl ... | NVM_DIR="path/to/nvm"`. Ensure that the `NVM_DIR` does not conta
|
||||
|
||||
- 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.39.7/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'`
|
||||
|
||||
#### Troubleshooting on Linux
|
||||
|
||||
@@ -172,7 +175,7 @@ You can use a task:
|
||||
```yaml
|
||||
- name: Install nvm
|
||||
ansible.builtin.shell: >
|
||||
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
|
||||
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
|
||||
args:
|
||||
creates: "{{ ansible_env.HOME }}/.nvm/nvm.sh"
|
||||
```
|
||||
@@ -234,7 +237,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.39.7`
|
||||
1. `cd ~/.nvm` and check out the latest version with `git checkout v0.40.1`
|
||||
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:
|
||||
@@ -530,6 +533,13 @@ NVM_IOJS_ORG_MIRROR=https://iojs.org/dist nvm install iojs-v1.0.3
|
||||
|
||||
`nvm use` will not, by default, create a "current" symlink. Set `$NVM_SYMLINK_CURRENT` to "true" to enable this behavior, which is sometimes useful for IDEs. Note that using `nvm` in multiple shell tabs with this environment variable enabled can cause race conditions.
|
||||
|
||||
#### Pass Authorization header to mirror
|
||||
To pass an Authorization header through to the mirror url, set `$NVM_AUTH_HEADER`
|
||||
|
||||
```sh
|
||||
NVM_AUTH_HEADER="Bearer secret-token" nvm install node
|
||||
```
|
||||
|
||||
### .nvmrc
|
||||
|
||||
You can create a `.nvmrc` file containing a node version number (or any other string that `nvm` understands; see `nvm --help` for details) in the project root directory (or any parent directory).
|
||||
@@ -833,13 +843,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.39.7/install.sh | bash
|
||||
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/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.39.7/install.sh | bash
|
||||
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/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._
|
||||
@@ -942,9 +952,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.39.7/install.sh
|
||||
[2]: https://github.com/nvm-sh/nvm/blob/v0.40.1/install.sh
|
||||
[3]: https://app.travis-ci.com/nvm-sh/nvm
|
||||
[4]: https://github.com/nvm-sh/nvm/releases/tag/v0.39.7
|
||||
[4]: https://github.com/nvm-sh/nvm/releases/tag/v0.40.1
|
||||
[Urchin]: https://git.sdf.org/tlevine/urchin
|
||||
[Fish]: https://fishshell.com
|
||||
|
||||
@@ -1002,7 +1012,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.39.776)
|
||||
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)
|
||||
|
||||
- Exit back to your native shell.
|
||||
|
||||
@@ -1029,7 +1039,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.39.7/install.sh | bash
|
||||
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/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
|
||||
@@ -1062,6 +1072,16 @@ You can check the contents of the file by running:
|
||||
|
||||
Currently, the sole maintainer is [@ljharb](https://github.com/ljharb) - more maintainers are quite welcome, and we hope to add folks to the team over time. [Governance](./GOVERNANCE.md) will be re-evaluated as the project evolves.
|
||||
|
||||
## Project Support
|
||||
|
||||
Only the latest version (v0.40.1 at this time) is supported.
|
||||
|
||||
## Enterprise Support
|
||||
|
||||
If you are unable to update to the latest version of `nvm`, our [partners](https://openjsf.org/ecosystem-sustainability-program) provide commercial security fixes for all unsupported versions:
|
||||
|
||||
- [HeroDevs Never-Ending Support](https://www.herodevs.com/support?utm_source=OpenJS&utm_medium=Link&utm_campaign=nvm_openjs)
|
||||
|
||||
## License
|
||||
|
||||
See [LICENSE.md](./LICENSE.md).
|
||||
|
||||
@@ -33,7 +33,7 @@ nvm_install_dir() {
|
||||
}
|
||||
|
||||
nvm_latest_version() {
|
||||
nvm_echo "v0.39.7"
|
||||
nvm_echo "v0.40.1"
|
||||
}
|
||||
|
||||
nvm_profile_is_bash_or_zsh() {
|
||||
@@ -358,7 +358,7 @@ nvm_check_global_modules() {
|
||||
command printf %s\\n "$NPM_GLOBAL_MODULES"
|
||||
nvm_echo '=> If you wish to uninstall them at a later point (or re-install them under your'
|
||||
# shellcheck disable=SC2016
|
||||
nvm_echo '=> `nvm` Nodes), you can remove them from the system Node as follows:'
|
||||
nvm_echo '=> `nvm` node installs), you can remove them from the system Node as follows:'
|
||||
nvm_echo
|
||||
nvm_echo ' $ nvm use system'
|
||||
nvm_echo ' $ npm uninstall -g a_module'
|
||||
|
||||
220
nvm.sh
Normal file → Executable file
220
nvm.sh
Normal file → Executable file
@@ -81,9 +81,9 @@ nvm_command_info() {
|
||||
nvm_has_colors() {
|
||||
local NVM_NUM_COLORS
|
||||
if nvm_has tput; then
|
||||
NVM_NUM_COLORS="$(tput -T "${TERM:-vt100}" colors)"
|
||||
NVM_NUM_COLORS="$(command tput -T "${TERM:-vt100}" colors)"
|
||||
fi
|
||||
[ "${NVM_NUM_COLORS:--1}" -ge 8 ]
|
||||
[ "${NVM_NUM_COLORS:--1}" -ge 8 ] && [ "${NVM_NO_COLORS-}" != '--no-colors' ]
|
||||
}
|
||||
|
||||
nvm_curl_libz_support() {
|
||||
@@ -116,12 +116,24 @@ nvm_get_latest() {
|
||||
}
|
||||
|
||||
nvm_download() {
|
||||
local CURL_COMPRESSED_FLAG
|
||||
if nvm_has "curl"; then
|
||||
local CURL_COMPRESSED_FLAG=""
|
||||
local CURL_HEADER_FLAG=""
|
||||
|
||||
if [ -n "${NVM_AUTH_HEADER:-}" ]; then
|
||||
sanitized_header=$(nvm_sanitize_auth_header "${NVM_AUTH_HEADER}")
|
||||
CURL_HEADER_FLAG="--header \"Authorization: ${sanitized_header}\""
|
||||
fi
|
||||
|
||||
if nvm_curl_use_compression; then
|
||||
CURL_COMPRESSED_FLAG="--compressed"
|
||||
fi
|
||||
curl --fail ${CURL_COMPRESSED_FLAG:-} -q "$@"
|
||||
local NVM_DOWNLOAD_ARGS
|
||||
NVM_DOWNLOAD_ARGS=''
|
||||
for arg in "$@"; do
|
||||
NVM_DOWNLOAD_ARGS="${NVM_DOWNLOAD_ARGS} \"$arg\""
|
||||
done
|
||||
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 /' \
|
||||
@@ -133,11 +145,20 @@ nvm_download() {
|
||||
-e 's/-sS /-nv /' \
|
||||
-e 's/-o /-O /' \
|
||||
-e 's/-C - /-c /')
|
||||
|
||||
if [ -n "${NVM_AUTH_HEADER:-}" ]; then
|
||||
ARGS="${ARGS} --header \"${NVM_AUTH_HEADER}\""
|
||||
fi
|
||||
# shellcheck disable=SC2086
|
||||
eval wget $ARGS
|
||||
fi
|
||||
}
|
||||
|
||||
nvm_sanitize_auth_header() {
|
||||
# Remove potentially dangerous characters
|
||||
nvm_echo "$1" | command sed 's/[^a-zA-Z0-9:;_. -]//g'
|
||||
}
|
||||
|
||||
nvm_has_system_node() {
|
||||
[ "$(nvm deactivate >/dev/null 2>&1 && command -v node)" != '' ]
|
||||
}
|
||||
@@ -370,8 +391,9 @@ nvm_install_latest_npm() {
|
||||
|| { [ $NVM_IS_16_OR_ABOVE -eq 1 ] && [ $NVM_IS_16_LTS_OR_ABOVE -eq 0 ]; } \
|
||||
|| { [ $NVM_IS_17_OR_ABOVE -eq 1 ] && [ $NVM_IS_18_OR_ABOVE -eq 0 ]; } \
|
||||
; then
|
||||
nvm_echo '* `npm` `v8.x` is the last version that works on `node` `v12`, `v14.13` - `v14.16`, or `v16.0` - `v16.12`'
|
||||
$NVM_NPM_CMD install -g npm@8
|
||||
nvm_echo '* `npm` `v8.6` is the last version that works on `node` `v12`, `v14.13` - `v14.16`, or `v16.0` - `v16.12`'
|
||||
# ^8.7 breaks `npm ls` on file: deps
|
||||
$NVM_NPM_CMD install -g npm@8.6
|
||||
elif \
|
||||
[ $NVM_IS_18_17_OR_ABOVE -eq 0 ] \
|
||||
|| { [ $NVM_IS_19_OR_ABOVE -eq 1 ] && [ $NVM_IS_20_5_OR_ABOVE -eq 0 ]; } \
|
||||
@@ -480,15 +502,15 @@ additionally, a single bare nvm-recognized version-ish must be present (after st
|
||||
warn_text="non-commented content parsed:
|
||||
${1}"
|
||||
|
||||
nvm_err "$(nvm_wrap_with_color_code r "${error_text}")
|
||||
nvm_err "$(nvm_wrap_with_color_code 'r' "${error_text}")
|
||||
|
||||
$(nvm_wrap_with_color_code y "${warn_text}")"
|
||||
$(nvm_wrap_with_color_code 'y' "${warn_text}")"
|
||||
}
|
||||
|
||||
nvm_process_nvmrc() {
|
||||
local NVMRC_PATH="$1"
|
||||
local NVMRC_PATH
|
||||
NVMRC_PATH="$1"
|
||||
local lines
|
||||
local unpaired_line
|
||||
|
||||
lines=$(command sed 's/#.*//' "$NVMRC_PATH" | command sed 's/^[[:space:]]*//;s/[[:space:]]*$//' | nvm_grep -v '^$')
|
||||
|
||||
@@ -498,8 +520,12 @@ nvm_process_nvmrc() {
|
||||
fi
|
||||
|
||||
# Initialize key-value storage
|
||||
local keys=''
|
||||
local values=''
|
||||
local keys
|
||||
keys=''
|
||||
local values
|
||||
values=''
|
||||
local unpaired_line
|
||||
unpaired_line=''
|
||||
|
||||
while IFS= read -r line; do
|
||||
if [ -z "${line}" ]; then
|
||||
@@ -1077,7 +1103,7 @@ nvm_print_formatted_alias() {
|
||||
fi
|
||||
local ARROW
|
||||
ARROW='->'
|
||||
if [ -z "${NVM_NO_COLORS}" ] && nvm_has_colors; then
|
||||
if nvm_has_colors; then
|
||||
ARROW='\033[0;90m->\033[0m'
|
||||
if [ "_${DEFAULT}" = '_true' ]; then
|
||||
NEWLINE=" \033[${DEFAULT_COLOR}(default)\033[0m\n"
|
||||
@@ -1815,7 +1841,7 @@ nvm_print_versions() {
|
||||
DEFAULT_COLOR=$(nvm_get_colors 5)
|
||||
LTS_COLOR=$(nvm_get_colors 6)
|
||||
|
||||
if [ -z "${NVM_NO_COLORS-}" ] && nvm_has_colors; then
|
||||
if nvm_has_colors; then
|
||||
NVM_HAS_COLORS=1
|
||||
fi
|
||||
|
||||
@@ -2173,7 +2199,7 @@ nvm_install_binary_extract() {
|
||||
command mkdir -p "${VERSION_PATH}" || return 1
|
||||
|
||||
if [ "${NVM_OS}" = 'win' ]; then
|
||||
command mv "${TMPDIR}/"*/* "${VERSION_PATH}" || return 1
|
||||
command mv "${TMPDIR}/"*/* "${VERSION_PATH}/" || return 1
|
||||
command chmod +x "${VERSION_PATH}"/node.exe || return 1
|
||||
command chmod +x "${VERSION_PATH}"/npm || return 1
|
||||
command chmod +x "${VERSION_PATH}"/npx 2>/dev/null
|
||||
@@ -2420,7 +2446,7 @@ nvm_download_artifact() {
|
||||
nvm_err "Downloading ${TARBALL_URL}..."
|
||||
nvm_download -L -C - "${PROGRESS_BAR}" "${TARBALL_URL}" -o "${TARBALL}" || (
|
||||
command rm -rf "${TARBALL}" "${tmpdir}"
|
||||
nvm_err "Binary download from ${TARBALL_URL} failed, trying source."
|
||||
nvm_err "download from ${TARBALL_URL} failed"
|
||||
return 4
|
||||
)
|
||||
|
||||
@@ -2894,6 +2920,23 @@ nvm_is_natural_num() {
|
||||
esac
|
||||
}
|
||||
|
||||
nvm_write_nvmrc() {
|
||||
local VERSION_STRING
|
||||
VERSION_STRING=$(nvm_version "${1-}")
|
||||
if [ "${VERSION_STRING}" = '∞' ] || [ "${VERSION_STRING}" = 'N/A' ]; then
|
||||
return 1
|
||||
fi
|
||||
echo "${VERSION_STRING}" | tee "$PWD"/.nvmrc > /dev/null || {
|
||||
if [ "${NVM_SILENT:-0}" -ne 1 ]; then
|
||||
nvm_err "Warning: Unable to write version number ($VERSION_STRING) to .nvmrc"
|
||||
fi
|
||||
return 3
|
||||
}
|
||||
if [ "${NVM_SILENT:-0}" -ne 1 ]; then
|
||||
nvm_echo "Wrote version number ($VERSION_STRING) to .nvmrc"
|
||||
fi
|
||||
}
|
||||
|
||||
# Check version dir permissions
|
||||
nvm_check_file_permissions() {
|
||||
nvm_is_zsh && setopt local_options nonomatch
|
||||
@@ -2999,6 +3042,7 @@ nvm() {
|
||||
nvm_echo ' --no-progress Disable the progress bar on any downloads'
|
||||
nvm_echo ' --alias=<name> After installing, set the alias specified to the version specified. (same as: nvm alias <name> <version>)'
|
||||
nvm_echo ' --default After installing, set default alias to the version specified. (same as: nvm alias default <version>)'
|
||||
nvm_echo ' --save After installing, write the specified version to .nvmrc'
|
||||
nvm_echo ' nvm uninstall <version> Uninstall a version'
|
||||
nvm_echo ' nvm uninstall --lts Uninstall using automatic LTS (long-term support) alias `lts/*`, if available.'
|
||||
nvm_echo ' nvm uninstall --lts=<LTS name> Uninstall using automatic alias for provided LTS line, if available.'
|
||||
@@ -3007,6 +3051,7 @@ nvm() {
|
||||
nvm_echo ' --silent Silences stdout/stderr output'
|
||||
nvm_echo ' --lts Uses automatic LTS (long-term support) alias `lts/*`, if available.'
|
||||
nvm_echo ' --lts=<LTS name> Uses automatic alias for provided LTS line, if available.'
|
||||
nvm_echo ' --save Writes the specified version to .nvmrc.'
|
||||
nvm_echo ' nvm exec [<version>] [<command>] Run <command> on <version>. Uses .nvmrc if available and version is omitted.'
|
||||
nvm_echo ' The following optional arguments, if provided, must appear directly after `nvm exec`:'
|
||||
nvm_echo ' --silent Silences stdout/stderr output'
|
||||
@@ -3044,16 +3089,16 @@ nvm() {
|
||||
nvm_echo ' nvm cache clear Empty cache directory for nvm'
|
||||
nvm_echo ' nvm set-colors [<color codes>] Set five text colors using format "yMeBg". Available when supported.'
|
||||
nvm_echo ' Initial colors are:'
|
||||
nvm_echo_with_colors " $(nvm_wrap_with_color_code b b)$(nvm_wrap_with_color_code y y)$(nvm_wrap_with_color_code g g)$(nvm_wrap_with_color_code r r)$(nvm_wrap_with_color_code e e)"
|
||||
nvm_echo_with_colors " $(nvm_wrap_with_color_code 'b' 'b')$(nvm_wrap_with_color_code 'y' 'y')$(nvm_wrap_with_color_code 'g' 'g')$(nvm_wrap_with_color_code 'r' 'r')$(nvm_wrap_with_color_code 'e' 'e')"
|
||||
nvm_echo ' Color codes:'
|
||||
nvm_echo_with_colors " $(nvm_wrap_with_color_code r r)/$(nvm_wrap_with_color_code R R) = $(nvm_wrap_with_color_code r red) / $(nvm_wrap_with_color_code R 'bold red')"
|
||||
nvm_echo_with_colors " $(nvm_wrap_with_color_code g g)/$(nvm_wrap_with_color_code G G) = $(nvm_wrap_with_color_code g green) / $(nvm_wrap_with_color_code G 'bold green')"
|
||||
nvm_echo_with_colors " $(nvm_wrap_with_color_code b b)/$(nvm_wrap_with_color_code B B) = $(nvm_wrap_with_color_code b blue) / $(nvm_wrap_with_color_code B 'bold blue')"
|
||||
nvm_echo_with_colors " $(nvm_wrap_with_color_code c c)/$(nvm_wrap_with_color_code C C) = $(nvm_wrap_with_color_code c cyan) / $(nvm_wrap_with_color_code C 'bold cyan')"
|
||||
nvm_echo_with_colors " $(nvm_wrap_with_color_code m m)/$(nvm_wrap_with_color_code M M) = $(nvm_wrap_with_color_code m magenta) / $(nvm_wrap_with_color_code M 'bold magenta')"
|
||||
nvm_echo_with_colors " $(nvm_wrap_with_color_code y y)/$(nvm_wrap_with_color_code Y Y) = $(nvm_wrap_with_color_code y yellow) / $(nvm_wrap_with_color_code Y 'bold yellow')"
|
||||
nvm_echo_with_colors " $(nvm_wrap_with_color_code k k)/$(nvm_wrap_with_color_code K K) = $(nvm_wrap_with_color_code k black) / $(nvm_wrap_with_color_code K 'bold black')"
|
||||
nvm_echo_with_colors " $(nvm_wrap_with_color_code e e)/$(nvm_wrap_with_color_code W W) = $(nvm_wrap_with_color_code e 'light grey') / $(nvm_wrap_with_color_code W white)"
|
||||
nvm_echo_with_colors " $(nvm_wrap_with_color_code 'r' 'r')/$(nvm_wrap_with_color_code 'R' 'R') = $(nvm_wrap_with_color_code 'r' 'red') / $(nvm_wrap_with_color_code 'R' 'bold red')"
|
||||
nvm_echo_with_colors " $(nvm_wrap_with_color_code 'g' 'g')/$(nvm_wrap_with_color_code 'G' 'G') = $(nvm_wrap_with_color_code 'g' 'green') / $(nvm_wrap_with_color_code 'G' 'bold green')"
|
||||
nvm_echo_with_colors " $(nvm_wrap_with_color_code 'b' 'b')/$(nvm_wrap_with_color_code 'B' 'B') = $(nvm_wrap_with_color_code 'b' 'blue') / $(nvm_wrap_with_color_code 'B' 'bold blue')"
|
||||
nvm_echo_with_colors " $(nvm_wrap_with_color_code 'c' 'c')/$(nvm_wrap_with_color_code 'C' 'C') = $(nvm_wrap_with_color_code 'c' 'cyan') / $(nvm_wrap_with_color_code 'C' 'bold cyan')"
|
||||
nvm_echo_with_colors " $(nvm_wrap_with_color_code 'm' 'm')/$(nvm_wrap_with_color_code 'M' 'M') = $(nvm_wrap_with_color_code 'm' 'magenta') / $(nvm_wrap_with_color_code 'M' 'bold magenta')"
|
||||
nvm_echo_with_colors " $(nvm_wrap_with_color_code 'y' 'y')/$(nvm_wrap_with_color_code 'Y' 'Y') = $(nvm_wrap_with_color_code 'y' 'yellow') / $(nvm_wrap_with_color_code 'Y' 'bold yellow')"
|
||||
nvm_echo_with_colors " $(nvm_wrap_with_color_code 'k' 'k')/$(nvm_wrap_with_color_code 'K' 'K') = $(nvm_wrap_with_color_code 'k' 'black') / $(nvm_wrap_with_color_code 'K' 'bold black')"
|
||||
nvm_echo_with_colors " $(nvm_wrap_with_color_code 'e' 'e')/$(nvm_wrap_with_color_code 'W' 'W') = $(nvm_wrap_with_color_code 'e' 'light grey') / $(nvm_wrap_with_color_code 'W' 'white')"
|
||||
nvm_echo 'Example:'
|
||||
nvm_echo ' nvm install 8.0.0 Install a specific version number'
|
||||
nvm_echo ' nvm use 8.0 Use the latest available 8.0.x release'
|
||||
@@ -3219,6 +3264,8 @@ nvm() {
|
||||
local ALIAS
|
||||
local NVM_UPGRADE_NPM
|
||||
NVM_UPGRADE_NPM=0
|
||||
local NVM_WRITE_TO_NVMRC
|
||||
NVM_WRITE_TO_NVMRC=0
|
||||
|
||||
local PROVIDED_REINSTALL_PACKAGES_FROM
|
||||
local REINSTALL_PACKAGES_FROM
|
||||
@@ -3317,6 +3364,14 @@ nvm() {
|
||||
SKIP_DEFAULT_PACKAGES=true
|
||||
shift
|
||||
;;
|
||||
--save | -w)
|
||||
if [ $NVM_WRITE_TO_NVMRC -eq 1 ]; then
|
||||
nvm_err '--save and -w may only be provided once'
|
||||
return 6
|
||||
fi
|
||||
NVM_WRITE_TO_NVMRC=1
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
break # stop parsing args
|
||||
;;
|
||||
@@ -3465,6 +3520,11 @@ nvm() {
|
||||
nvm_ensure_default_set "${provided_version}"
|
||||
fi
|
||||
|
||||
if [ $NVM_WRITE_TO_NVMRC -eq 1 ]; then
|
||||
nvm_write_nvmrc "${VERSION}"
|
||||
EXIT_CODE=$?
|
||||
fi
|
||||
|
||||
if [ $EXIT_CODE -ne 0 ] && [ -n "${ALIAS-}" ]; then
|
||||
nvm alias "${ALIAS}" "${provided_version}"
|
||||
EXIT_CODE=$?
|
||||
@@ -3516,9 +3576,13 @@ nvm() {
|
||||
EXIT_CODE=$?
|
||||
else
|
||||
EXIT_CODE=-1
|
||||
if [ $nosource -eq 1 ]; then
|
||||
nvm_err "Binary download is not available for ${VERSION}"
|
||||
EXIT_CODE=3
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ $EXIT_CODE -ne 0 ]; then
|
||||
if [ $EXIT_CODE -ne 0 ] && [ $nosource -ne 1 ]; then
|
||||
if [ -z "${NVM_MAKE_JOBS-}" ]; then
|
||||
nvm_get_make_jobs
|
||||
fi
|
||||
@@ -3533,7 +3597,8 @@ nvm() {
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ $EXIT_CODE -eq 0 ] && nvm_use_if_needed "${VERSION}" && nvm_install_npm_if_needed "${VERSION}"; then
|
||||
if [ $EXIT_CODE -eq 0 ]; then
|
||||
if nvm_use_if_needed "${VERSION}" && nvm_install_npm_if_needed "${VERSION}"; then
|
||||
if [ -n "${LTS-}" ]; then
|
||||
nvm_ensure_default_set "lts/${LTS}"
|
||||
else
|
||||
@@ -3553,6 +3618,8 @@ nvm() {
|
||||
else
|
||||
EXIT_CODE=$?
|
||||
fi
|
||||
fi
|
||||
|
||||
return $EXIT_CODE
|
||||
;;
|
||||
"uninstall")
|
||||
@@ -3693,6 +3760,8 @@ nvm() {
|
||||
local NVM_LTS
|
||||
local IS_VERSION_FROM_NVMRC
|
||||
IS_VERSION_FROM_NVMRC=0
|
||||
local NVM_WRITE_TO_NVMRC
|
||||
NVM_WRITE_TO_NVMRC=0
|
||||
|
||||
while [ $# -ne 0 ]; do
|
||||
case "$1" in
|
||||
@@ -3704,6 +3773,13 @@ nvm() {
|
||||
--) ;;
|
||||
--lts) NVM_LTS='*' ;;
|
||||
--lts=*) NVM_LTS="${1##--lts=}" ;;
|
||||
--save | -w)
|
||||
if [ $NVM_WRITE_TO_NVMRC -eq 1 ]; then
|
||||
nvm_err '--save and -w may only be provided once'
|
||||
return 6
|
||||
fi
|
||||
NVM_WRITE_TO_NVMRC=1
|
||||
;;
|
||||
--*) ;;
|
||||
*)
|
||||
if [ -n "${1-}" ]; then
|
||||
@@ -3737,6 +3813,10 @@ nvm() {
|
||||
return 127
|
||||
fi
|
||||
|
||||
if [ $NVM_WRITE_TO_NVMRC -eq 1 ]; then
|
||||
nvm_write_nvmrc "${VERSION}"
|
||||
fi
|
||||
|
||||
if [ "_${VERSION}" = '_system' ]; then
|
||||
if nvm_has_system_node && nvm deactivate "${NVM_SILENT_ARG-}" >/dev/null 2>&1; then
|
||||
if [ "${NVM_SILENT:-0}" -ne 1 ]; then
|
||||
@@ -3752,7 +3832,7 @@ nvm() {
|
||||
nvm_err 'System version of node not found.'
|
||||
fi
|
||||
return 127
|
||||
elif [ "_${VERSION}" = "_∞" ]; then
|
||||
elif [ "_${VERSION}" = '_∞' ]; then
|
||||
if [ "${NVM_SILENT:-0}" -ne 1 ]; then
|
||||
nvm_err "The alias \"${PROVIDED_VERSION}\" leads to an infinite loop. Aborting."
|
||||
fi
|
||||
@@ -4316,7 +4396,7 @@ nvm() {
|
||||
NVM_VERSION_ONLY=true NVM_LTS="${NVM_LTS-}" nvm_remote_version "${PATTERN:-node}"
|
||||
;;
|
||||
"--version" | "-v")
|
||||
nvm_echo '0.39.7'
|
||||
nvm_echo '0.40.1'
|
||||
;;
|
||||
"unload")
|
||||
nvm deactivate >/dev/null 2>&1
|
||||
@@ -4357,11 +4437,12 @@ nvm() {
|
||||
nvm_sanitize_path nvm_has_colors nvm_process_parameters \
|
||||
nvm_node_version_has_solaris_binary nvm_iojs_version_has_solaris_binary \
|
||||
nvm_curl_libz_support nvm_command_info nvm_is_zsh nvm_stdout_is_terminal \
|
||||
nvm_npmrc_bad_news_bears \
|
||||
nvm_npmrc_bad_news_bears nvm_sanitize_auth_header \
|
||||
nvm_get_colors nvm_set_colors nvm_print_color_code nvm_wrap_with_color_code nvm_format_help_message_colors \
|
||||
nvm_echo_with_colors nvm_err_with_colors \
|
||||
nvm_get_artifact_compression nvm_install_binary_extract nvm_extract_tarball \
|
||||
nvm_process_nvmrc nvm_nvmrc_invalid_msg \
|
||||
nvm_write_nvmrc \
|
||||
>/dev/null 2>&1
|
||||
unset NVM_RC_VERSION NVM_NODEJS_ORG_MIRROR NVM_IOJS_ORG_MIRROR NVM_DIR \
|
||||
NVM_CD_FLAGS NVM_BIN NVM_INC NVM_MAKE_JOBS \
|
||||
@@ -4387,37 +4468,23 @@ nvm() {
|
||||
}
|
||||
|
||||
nvm_get_default_packages() {
|
||||
local NVM_DEFAULT_PACKAGE_FILE="${NVM_DIR}/default-packages"
|
||||
local NVM_DEFAULT_PACKAGE_FILE
|
||||
NVM_DEFAULT_PACKAGE_FILE="${NVM_DIR}/default-packages"
|
||||
if [ -f "${NVM_DEFAULT_PACKAGE_FILE}" ]; then
|
||||
local DEFAULT_PACKAGES
|
||||
DEFAULT_PACKAGES=''
|
||||
|
||||
# Read lines from $NVM_DIR/default-packages
|
||||
local line
|
||||
# ensure a trailing newline
|
||||
WORK=$(mktemp -d) || exit $?
|
||||
# shellcheck disable=SC2064
|
||||
trap "command rm -rf '$WORK'" EXIT
|
||||
# shellcheck disable=SC1003
|
||||
sed -e '$a\' "${NVM_DEFAULT_PACKAGE_FILE}" > "${WORK}/default-packages"
|
||||
while IFS=' ' read -r line; do
|
||||
# Skip empty lines.
|
||||
[ -n "${line-}" ] || continue
|
||||
|
||||
# Skip comment lines that begin with `#`.
|
||||
[ "$(nvm_echo "${line}" | command cut -c1)" != "#" ] || continue
|
||||
|
||||
# Fail on lines that have multiple space-separated words
|
||||
case $line in
|
||||
*\ *)
|
||||
nvm_err "Only one package per line is allowed in the ${NVM_DIR}/default-packages file. Please remove any lines with multiple space-separated values."
|
||||
return 1
|
||||
;;
|
||||
esac
|
||||
|
||||
DEFAULT_PACKAGES="${DEFAULT_PACKAGES}${line} "
|
||||
done < "${WORK}/default-packages"
|
||||
echo "${DEFAULT_PACKAGES}" | command xargs
|
||||
command awk -v filename="${NVM_DEFAULT_PACKAGE_FILE}" '
|
||||
/^[[:space:]]*#/ { next } # Skip lines that begin with #
|
||||
/^[[:space:]]*$/ { next } # Skip empty lines
|
||||
/[[:space:]]/ && !/^[[:space:]]*#/ {
|
||||
print "Only one package per line is allowed in `" filename "`. Please remove any lines with multiple space-separated values." > "/dev/stderr"
|
||||
err = 1
|
||||
exit 1
|
||||
}
|
||||
{
|
||||
if (NR > 1 && !prev_space) printf " "
|
||||
printf "%s", $0
|
||||
prev_space = 0
|
||||
}
|
||||
' "${NVM_DEFAULT_PACKAGE_FILE}"
|
||||
fi
|
||||
}
|
||||
|
||||
@@ -4494,31 +4561,44 @@ nvm_supports_xz() {
|
||||
nvm_auto() {
|
||||
local NVM_MODE
|
||||
NVM_MODE="${1-}"
|
||||
|
||||
case "${NVM_MODE}" in
|
||||
none) return 0 ;;
|
||||
use)
|
||||
local VERSION
|
||||
local NVM_CURRENT
|
||||
if [ "_${NVM_MODE}" = '_install' ]; then
|
||||
VERSION="$(nvm_alias default 2>/dev/null || nvm_echo)"
|
||||
if [ -n "${VERSION}" ]; then
|
||||
nvm install "${VERSION}" >/dev/null
|
||||
elif nvm_rc_version >/dev/null 2>&1; then
|
||||
nvm install >/dev/null
|
||||
fi
|
||||
elif [ "_$NVM_MODE" = '_use' ]; then
|
||||
NVM_CURRENT="$(nvm_ls_current)"
|
||||
if [ "_${NVM_CURRENT}" = '_none' ] || [ "_${NVM_CURRENT}" = '_system' ]; then
|
||||
VERSION="$(nvm_resolve_local_alias default 2>/dev/null || nvm_echo)"
|
||||
if [ -n "${VERSION}" ]; then
|
||||
if [ "_${VERSION}" != '_N/A' ] && nvm_is_valid_version "${VERSION}"; then
|
||||
nvm use --silent "${VERSION}" >/dev/null
|
||||
else
|
||||
return 0
|
||||
fi
|
||||
elif nvm_rc_version >/dev/null 2>&1; then
|
||||
nvm use --silent >/dev/null
|
||||
fi
|
||||
else
|
||||
nvm use --silent "${NVM_CURRENT}" >/dev/null
|
||||
fi
|
||||
elif [ "_${NVM_MODE}" != '_none' ]; then
|
||||
;;
|
||||
install)
|
||||
local VERSION
|
||||
VERSION="$(nvm_alias default 2>/dev/null || nvm_echo)"
|
||||
if [ -n "${VERSION}" ] && [ "_${VERSION}" != '_N/A' ] && nvm_is_valid_version "${VERSION}"; then
|
||||
nvm install "${VERSION}" >/dev/null
|
||||
elif nvm_rc_version >/dev/null 2>&1; then
|
||||
nvm install >/dev/null
|
||||
else
|
||||
return 0
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
nvm_err 'Invalid auto mode supplied.'
|
||||
return 1
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
nvm_process_parameters() {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "nvm",
|
||||
"version": "0.39.7",
|
||||
"version": "0.40.1",
|
||||
"description": "Node Version Manager - Simple bash script to manage multiple active node.js versions",
|
||||
"directories": {
|
||||
"test": "test"
|
||||
@@ -14,6 +14,8 @@
|
||||
"test/installation/node": "shell=$(basename -- $(ps -o comm= $(ps -o ppid= -p $PPID)) | sed 's/^-//'); make TEST_SUITE=installation_node test-$shell",
|
||||
"test/installation/iojs": "shell=$(basename -- $(ps -o comm= $(ps -o ppid= -p $PPID)) | sed 's/^-//'); make TEST_SUITE=installation_iojs test-$shell",
|
||||
"test/sourcing": "shell=$(basename -- $(ps -o comm= $(ps -o ppid= -p $PPID)) | sed 's/^-//'); make TEST_SUITE=sourcing test-$shell",
|
||||
"test:check-exec": "(IFS=$'\\n'; for file in $(git ls-files test); do if [ ! -x \"$file\" ] && [[ \"$file\" != *.* ]] && [[ \"$file\" != test/fixtures/* ]]; then echo \"$file\"; fi; done) | tee /dev/stderr | awk 'END {if (NR > 0) exit 1}'",
|
||||
"test:check-nonexec": "(IFS=$'\\n'; for file in $(git ls-files test); do if [ -x \"$file\" ] && [ ! -d \"$file\" ] && { [[ \"$file\" =~ '\\.(json|txt|sh|js|log)$' ]] || [[ \"$file\" =~ '^test/(mocks|fixtures)/.*' ]]; }; then echo \"$file\"; fi; done) | tee /dev/stderr | awk 'END {if (NR > 0) exit 1}'",
|
||||
"doctoc": "doctoc --title='## Table of Contents' --github README.md",
|
||||
"predoctoc:check": "cp README.md v-README.md.orig && npm run doctoc",
|
||||
"doctoc:check": "diff -q README.md v-README.md.orig",
|
||||
@@ -45,7 +47,7 @@
|
||||
"eclint": "^2.8.1",
|
||||
"markdown-link-check": "^3.12.2",
|
||||
"replace": "^1.2.2",
|
||||
"semver": "^7.6.2",
|
||||
"semver": "^7.6.3",
|
||||
"urchin": "^0.0.5"
|
||||
}
|
||||
}
|
||||
|
||||
224
test/common.sh
224
test/common.sh
@@ -102,104 +102,146 @@ watch() {
|
||||
return $EXIT_CODE
|
||||
}
|
||||
|
||||
parse_json() {
|
||||
local json
|
||||
json="$1"
|
||||
local key
|
||||
key=""
|
||||
local value
|
||||
value=""
|
||||
local output
|
||||
output=""
|
||||
local in_key
|
||||
in_key=0
|
||||
local in_value
|
||||
in_value=0
|
||||
local in_string
|
||||
in_string=0
|
||||
local escaped
|
||||
escaped=0
|
||||
local buffer
|
||||
buffer=""
|
||||
local char
|
||||
local len
|
||||
len=${#json}
|
||||
local arr_index
|
||||
arr_index=0
|
||||
local in_array
|
||||
in_array=0
|
||||
|
||||
for ((i = 0; i < len; i++)); do
|
||||
char="${json:i:1}"
|
||||
# JSON parsing from https://gist.github.com/assaf/ee377a186371e2e269a7
|
||||
nvm_json_throw() {
|
||||
nvm_err "$*"
|
||||
exit 1
|
||||
}
|
||||
|
||||
if [ "$in_string" -eq 1 ]; then
|
||||
if [ "$escaped" -eq 1 ]; then
|
||||
buffer="$buffer$char"
|
||||
escaped=0
|
||||
elif [ "$char" = "\\" ]; then
|
||||
escaped=1
|
||||
elif [ "$char" = "\"" ]; then
|
||||
in_string=0
|
||||
if [ "$in_key" -eq 1 ]; then
|
||||
key="$buffer"
|
||||
buffer=""
|
||||
in_key=0
|
||||
elif [ "$in_value" -eq 1 ]; then
|
||||
value="$buffer"
|
||||
buffer=""
|
||||
output="$output$key=\"$value\"\n"
|
||||
in_value=0
|
||||
elif [ "$in_array" -eq 1 ]; then
|
||||
value="$buffer"
|
||||
buffer=""
|
||||
output="$output$arr_index=\"$value\"\n"
|
||||
arr_index=$((arr_index + 1))
|
||||
fi
|
||||
else
|
||||
buffer="$buffer$char"
|
||||
fi
|
||||
continue
|
||||
fi
|
||||
nvm_json_awk_egrep() {
|
||||
local pattern_string
|
||||
pattern_string="${1}"
|
||||
|
||||
case "$char" in
|
||||
"\"")
|
||||
in_string=1
|
||||
buffer=""
|
||||
if [ "$in_value" -eq 0 ] && [ "$in_array" -eq 0 ]; then
|
||||
in_key=1
|
||||
fi
|
||||
;;
|
||||
":")
|
||||
in_value=1
|
||||
;;
|
||||
",")
|
||||
if [ "$in_value" -eq 1 ]; then
|
||||
in_value=0
|
||||
fi
|
||||
;;
|
||||
"[")
|
||||
in_array=1
|
||||
;;
|
||||
"]")
|
||||
in_array=0
|
||||
;;
|
||||
"{" | "}")
|
||||
;;
|
||||
awk '{
|
||||
while ($0) {
|
||||
start=match($0, pattern);
|
||||
token=substr($0, start, RLENGTH);
|
||||
print token;
|
||||
$0=substr($0, start+RLENGTH);
|
||||
}
|
||||
}' "pattern=${pattern_string}"
|
||||
}
|
||||
|
||||
nvm_json_tokenize() {
|
||||
local GREP
|
||||
GREP='grep -Eao'
|
||||
|
||||
local ESCAPE
|
||||
local CHAR
|
||||
|
||||
# if echo "test string" | grep -Eo "test" > /dev/null 2>&1; then
|
||||
# ESCAPE='(\\[^u[:cntrl:]]|\\u[0-9a-fA-F]{4})'
|
||||
# CHAR='[^[:cntrl:]"\\]'
|
||||
# else
|
||||
GREP=nvm_json_awk_egrep
|
||||
ESCAPE='(\\\\[^u[:cntrl:]]|\\u[0-9a-fA-F]{4})'
|
||||
CHAR='[^[:cntrl:]"\\\\]'
|
||||
# fi
|
||||
|
||||
local STRING
|
||||
STRING="\"${CHAR}*(${ESCAPE}${CHAR}*)*\""
|
||||
local NUMBER
|
||||
NUMBER='-?(0|[1-9][0-9]*)([.][0-9]*)?([eE][+-]?[0-9]*)?'
|
||||
local KEYWORD
|
||||
KEYWORD='null|false|true'
|
||||
local SPACE
|
||||
SPACE='[[:space:]]+'
|
||||
|
||||
$GREP "${STRING}|${NUMBER}|${KEYWORD}|${SPACE}|." | TERM=dumb grep -Ev "^${SPACE}$"
|
||||
}
|
||||
|
||||
_json_parse_array() {
|
||||
local index=0
|
||||
local ary=''
|
||||
read -r token
|
||||
case "$token" in
|
||||
']') ;;
|
||||
*)
|
||||
if [ "$in_value" -eq 1 ] && [ "$char" != " " ] && [ "$char" != "\n" ] && [ "$char" != "\t" ]; then
|
||||
buffer="$buffer$char"
|
||||
fi
|
||||
while :; do
|
||||
_json_parse_value "${1}" "${index}"
|
||||
index=$((index+1))
|
||||
ary="${ary}${value}"
|
||||
read -r token
|
||||
case "${token}" in
|
||||
']') break ;;
|
||||
',') ary="${ary}," ;;
|
||||
*) nvm_json_throw "EXPECTED , or ] GOT ${token:-EOF}" ;;
|
||||
esac
|
||||
read -r token
|
||||
done
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
printf "%b" "$output"
|
||||
:
|
||||
}
|
||||
|
||||
extract_value() {
|
||||
_json_parse_object() {
|
||||
local key
|
||||
key="$1"
|
||||
local parsed
|
||||
parsed="$2"
|
||||
echo "$parsed" | grep "^$key=" | cut -d'=' -f2 | tr -d '"'
|
||||
local obj=''
|
||||
read -r token
|
||||
case "$token" in
|
||||
'}') ;;
|
||||
*)
|
||||
while :; do
|
||||
case "${token}" in
|
||||
'"'*'"') key="${token}" ;;
|
||||
*) nvm_json_throw "EXPECTED string GOT ${token:-EOF}" ;;
|
||||
esac
|
||||
read -r token
|
||||
case "${token}" in
|
||||
':') ;;
|
||||
*) nvm_json_throw "EXPECTED : GOT ${token:-EOF}" ;;
|
||||
esac
|
||||
read -r token
|
||||
_json_parse_value "${1}" "${key}"
|
||||
obj="${obj}${key}:${value}"
|
||||
read -r token
|
||||
case "${token}" in
|
||||
'}') break ;;
|
||||
',') obj="${obj}," ;;
|
||||
*) nvm_json_throw "EXPECTED , or } GOT ${token:-EOF}" ;;
|
||||
esac
|
||||
read -r token
|
||||
done
|
||||
;;
|
||||
esac
|
||||
:
|
||||
}
|
||||
|
||||
_json_parse_value() {
|
||||
local jpath="${1:+$1,}$2"
|
||||
local isleaf=0
|
||||
local isempty=0
|
||||
local print=0
|
||||
|
||||
case "$token" in
|
||||
'{') _json_parse_object "${jpath}" ;;
|
||||
'[') _json_parse_array "${jpath}" ;;
|
||||
# At this point, the only valid single-character tokens are digits.
|
||||
''|[!0-9]) nvm_json_throw "EXPECTED value GOT >${token:-EOF}<" ;;
|
||||
*)
|
||||
value=$token
|
||||
isleaf=1
|
||||
[ "${value}" = '""' ] && isempty=1
|
||||
;;
|
||||
esac
|
||||
|
||||
[ "${value}" = '' ] && return
|
||||
[ "${isleaf}" -eq 1 ] && [ $isempty -eq 0 ] && print=1
|
||||
[ "${print}" -eq 1 ] && printf "[%s]\t%s\n" "${jpath}" "${value}"
|
||||
:
|
||||
}
|
||||
|
||||
_json_parse() {
|
||||
read -r token
|
||||
_json_parse_value
|
||||
read -r token
|
||||
case "${token}" in
|
||||
'') ;;
|
||||
*) nvm_json_throw "EXPECTED EOF GOT >${token}<" ;;
|
||||
esac
|
||||
}
|
||||
|
||||
nvm_json_extract() {
|
||||
nvm_json_tokenize | _json_parse | grep -e "${1}" | awk '{print $2 $3}'
|
||||
}
|
||||
|
||||
@@ -9,7 +9,7 @@ cleanup () { rm -f "${BEFORE}" "${AFTER}"; }
|
||||
die () { echo "$@" ; cleanup ; exit 1; }
|
||||
|
||||
typeset -f | awk '/ \(\) $/ && !/^main / {print $1}' > "${BEFORE}"
|
||||
env | grep -v PATH= | grep -v IFS= | grep -v NVM_ | sort >> "${BEFORE}"
|
||||
env | grep -v PATH= | grep -v IFS= | grep -v NVM_ | grep -v TRAVIS_ | sort >> "${BEFORE}"
|
||||
|
||||
set +e # TODO: fix
|
||||
\. ../../nvm.sh
|
||||
@@ -20,11 +20,11 @@ type nvm > /dev/null 2>&1 || die "nvm not loaded"
|
||||
nvm unload
|
||||
|
||||
typeset -f | awk '/ \(\) $/ && !/^main / {print $1}' > "${AFTER}"
|
||||
env | grep -v PATH= | grep -v IFS= | sort >> "${AFTER}"
|
||||
env | grep -v PATH= | grep -v IFS= | grep -v TRAVIS_ | sort >> "${AFTER}"
|
||||
|
||||
! type nvm > /dev/null 2>&1 || die "nvm not unloaded"
|
||||
|
||||
DIFF="$(diff "${BEFORE}" "${AFTER}" ||:)"
|
||||
[ -z "${DIFF}" ] || die "function pollution found: ${DIFF}"
|
||||
[ -z "${DIFF}" ] || die "function pollution found: >${DIFF}<"
|
||||
|
||||
cleanup
|
||||
|
||||
61
test/fast/Unit tests/Running 'nvm install --save' works as expected'
Executable file
61
test/fast/Unit tests/Running 'nvm install --save' works as expected'
Executable file
@@ -0,0 +1,61 @@
|
||||
#!/bin/sh
|
||||
\. ../../../nvm.sh
|
||||
\. ../../common.sh
|
||||
|
||||
set -e
|
||||
|
||||
TEST_VERSION='v0.2.4'
|
||||
|
||||
if [ -f .nvmrc ]; then mv .nvmrc .nvmrc.orig; fi
|
||||
|
||||
cleanup() {
|
||||
nvm cache clear
|
||||
nvm deactivate
|
||||
nvm unalias default
|
||||
rm -rf "${NVM_DIR}/v0.2.4" .nvmrc
|
||||
if [ -f .nvmrc.orig ]; then mv .nvmrc.orig .nvmrc; fi
|
||||
unset -f nvm_ls_remote nvm_ls_remote_iojs
|
||||
}
|
||||
|
||||
die() {
|
||||
echo "$@"
|
||||
cleanup
|
||||
exit 1
|
||||
}
|
||||
|
||||
REMOTE="${PWD}/mocks/nvm_ls_remote.txt"
|
||||
nvm_ls_remote() {
|
||||
if [ -n "${PATTERN}" ]; then
|
||||
cat "${REMOTE}" | \grep "${PATTERN}"
|
||||
else
|
||||
cat "${REMOTE}"
|
||||
fi
|
||||
}
|
||||
REMOTE_IOJS="$PWD/mocks/nvm_ls_remote_iojs.txt"
|
||||
nvm_ls_remote_iojs() {
|
||||
local PATTERN
|
||||
PATTERN="${1-}"
|
||||
if [ -n "${PATTERN}" ]; then
|
||||
cat "${REMOTE_IOJS}" | \grep "${PATTERN}"
|
||||
else
|
||||
cat "${REMOTE_IOJS}"
|
||||
fi
|
||||
}
|
||||
|
||||
make_fake_node "${TEST_VERSION}"
|
||||
|
||||
nvm install -w "${TEST_VERSION}" || die "\`nvm install -w ${TEST_VERSION}\` failed"
|
||||
OUTPUT="$(cat .nvmrc)"
|
||||
|
||||
nvm_is_valid_version "${OUTPUT}" \
|
||||
|| die "\`nvm install -w ${TEST_VERSION}\`+ \`cat .nvmrc\` outputted invalid version: got '${OUTPUT}'"
|
||||
|
||||
rm .nvmrc || die 'removing of .nvmrc failed'
|
||||
|
||||
nvm install --save "${TEST_VERSION}" || die "\`nvm install --save ${TEST_VERSION}\` failed"
|
||||
OUTPUT="$(cat .nvmrc)"
|
||||
|
||||
nvm_is_valid_version "${OUTPUT}" \
|
||||
|| die "\`nvm install --save ${TEST_VERSION}\`+ \`cat .nvmrc\` outputted invalid version: got '${OUTPUT}'"
|
||||
|
||||
cleanup
|
||||
61
test/fast/Unit tests/Running 'nvm use --save' works as expected'
Executable file
61
test/fast/Unit tests/Running 'nvm use --save' works as expected'
Executable file
@@ -0,0 +1,61 @@
|
||||
#!/bin/sh
|
||||
\. ../../../nvm.sh
|
||||
\. ../../common.sh
|
||||
|
||||
set -e
|
||||
|
||||
TEST_VERSION='v0.2.4'
|
||||
|
||||
if [ -f .nvmrc ]; then mv .nvmrc .nvmrc.orig; fi
|
||||
|
||||
cleanup() {
|
||||
nvm cache clear
|
||||
nvm deactivate
|
||||
nvm unalias default
|
||||
rm -rf "${NVM_DIR}/v0.2.4" .nvmrc
|
||||
if [ -f .nvmrc.orig ]; then mv .nvmrc.orig .nvmrc; fi
|
||||
unset -f nvm_ls_remote nvm_ls_remote_iojs
|
||||
}
|
||||
|
||||
die() {
|
||||
echo "$@"
|
||||
cleanup
|
||||
exit 1
|
||||
}
|
||||
|
||||
REMOTE="${PWD}/mocks/nvm_ls_remote.txt"
|
||||
nvm_ls_remote() {
|
||||
if [ -n "${PATTERN}" ]; then
|
||||
cat "${REMOTE}" | \grep "${PATTERN}"
|
||||
else
|
||||
cat "${REMOTE}"
|
||||
fi
|
||||
}
|
||||
REMOTE_IOJS="$PWD/mocks/nvm_ls_remote_iojs.txt"
|
||||
nvm_ls_remote_iojs() {
|
||||
local PATTERN
|
||||
PATTERN="${1-}"
|
||||
if [ -n "${PATTERN}" ]; then
|
||||
cat "${REMOTE_IOJS}" | \grep "${PATTERN}"
|
||||
else
|
||||
cat "${REMOTE_IOJS}"
|
||||
fi
|
||||
}
|
||||
|
||||
make_fake_node "${TEST_VERSION}"
|
||||
|
||||
nvm use -w "${TEST_VERSION}" || die "\`nvm install -w ${TEST_VERSION}\` failed"
|
||||
OUTPUT="$(cat .nvmrc)"
|
||||
|
||||
nvm_is_valid_version "${OUTPUT}" \
|
||||
|| die "\`nvm install -w ${TEST_VERSION}\`+ \`cat .nvmrc\` outputted invalid version: got '${OUTPUT}'"
|
||||
|
||||
rm .nvmrc || die 'removing of .nvmrc failed'
|
||||
|
||||
nvm use --save "${TEST_VERSION}" || die "\`nvm install --save ${TEST_VERSION}\` failed"
|
||||
OUTPUT="$(cat .nvmrc)"
|
||||
|
||||
nvm_is_valid_version "${OUTPUT}" \
|
||||
|| die "\`nvm install --save ${TEST_VERSION}\`+ \`cat .nvmrc\` outputted invalid version: got '${OUTPUT}'"
|
||||
|
||||
cleanup
|
||||
@@ -0,0 +1,57 @@
|
||||
#!/bin/sh
|
||||
\. ../../../nvm.sh
|
||||
\. ../../common.sh
|
||||
|
||||
set -e
|
||||
|
||||
TEST_VERSION="v0.2.4"
|
||||
|
||||
if [ -f .nvmrc ]; then mv .nvmrc .nvmrc.orig; fi
|
||||
if [ -f ../.nvmrc ]; then mv ../.nvmrc ../.nvmrc.orig; fi
|
||||
|
||||
del_nvmrc () {
|
||||
rm -f .nvmrc ../.nvmrc
|
||||
}
|
||||
|
||||
cleanup () {
|
||||
del_nvmrc
|
||||
nvm cache clear
|
||||
nvm deactivate
|
||||
nvm unalias default
|
||||
rm -rf ${NVM_DIR}/v*
|
||||
if [ -f .nvmrc.orig ]; then mv .nvmrc.orig .nvmrc; fi
|
||||
if [ -f ../.nvmrc.orig ]; then mv ../.nvmrc.orig ../.nvmrc; fi
|
||||
unset -f nvm_ls_remote nvm_ls_remote_iojs
|
||||
}
|
||||
|
||||
die () {
|
||||
echo "$@"
|
||||
cleanup
|
||||
exit 1
|
||||
}
|
||||
|
||||
REMOTE="$PWD/mocks/nvm_ls_remote.txt"
|
||||
nvm_ls_remote() {
|
||||
cat "$REMOTE"
|
||||
}
|
||||
REMOTE_IOJS="$PWD/mocks/nvm_ls_remote_iojs.txt"
|
||||
nvm_ls_remote_iojs() {
|
||||
cat "$REMOTE_IOJS"
|
||||
}
|
||||
|
||||
del_nvmrc
|
||||
make_fake_node "$TEST_VERSION"
|
||||
|
||||
(cd ..
|
||||
nvm use --save "$TEST_VERSION" || die "\`nvm use --save $TEST_VERSION\` failed in the parent dir")
|
||||
nvm use --save || die "\`nvm use --save\` failed"
|
||||
|
||||
[ -f ../.nvmrc ] && [ -f .nvmrc ] || die "expected two .nvmrc files to be generated"
|
||||
|
||||
OUTPUT=$(cat .nvmrc)
|
||||
EXPECTED_OUTPUT="$(cat ../.nvmrc)"
|
||||
|
||||
[ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] \
|
||||
|| die "invalid \`nvm use --save \` output: expected '$EXPECTED_OUTPUT'; got '$OUTPUT'"
|
||||
|
||||
cleanup
|
||||
@@ -0,0 +1,51 @@
|
||||
#!/bin/sh
|
||||
\. ../../../nvm.sh
|
||||
\. ../../common.sh
|
||||
|
||||
set -e
|
||||
|
||||
TEST_VERSION="v0.2.4"
|
||||
|
||||
if [ -f .nvmrc ]; then mv .nvmrc .nvmrc.orig; fi
|
||||
|
||||
cleanup () {
|
||||
nvm cache clear
|
||||
nvm deactivate
|
||||
nvm unalias default
|
||||
rm -rf "${NVM_DIR}/${TEST_VERSION:?}" .nvmrc
|
||||
if [ -f .nvmrc.orig ]; then mv .nvmrc.orig .nvmrc; fi
|
||||
unset -f nvm_ls_remote nvm_ls_remote_iojs
|
||||
}
|
||||
|
||||
die () {
|
||||
echo "$@"
|
||||
cleanup
|
||||
exit 1
|
||||
}
|
||||
|
||||
REMOTE="${PWD}/mocks/nvm_ls_remote.txt"
|
||||
nvm_ls_remote() {
|
||||
cat "${REMOTE}"
|
||||
}
|
||||
REMOTE_IOJS="${PWD}/mocks/nvm_ls_remote_iojs.txt"
|
||||
nvm_ls_remote_iojs() {
|
||||
cat "${REMOTE_IOJS}"
|
||||
}
|
||||
|
||||
make_fake_node "${TEST_VERSION}"
|
||||
|
||||
OUTPUT=$(nvm use --save --silent "${TEST_VERSION}" || die "\`nvm use --save --silent ${TEST_VERSION}\` failed")
|
||||
EXPECTED_OUTPUT=''
|
||||
|
||||
[ "_${OUTPUT}" = "_${EXPECTED_OUTPUT}" ] \
|
||||
|| die "\`nvm use --save --silent ${TEST_VERSION}\` output was not silenced to '${EXPECTED_OUTPUT}'; got '${OUTPUT}'"
|
||||
|
||||
rm .nvmrc || die 'removing of .nvmrc failed'
|
||||
|
||||
OUTPUT=$(nvm use -w --silent "${TEST_VERSION}" || die "\`nvm use -w --silent ${TEST_VERSION}\` failed")
|
||||
EXPECTED_OUTPUT=''
|
||||
|
||||
[ "_${OUTPUT}" = "_${EXPECTED_OUTPUT}" ] \
|
||||
|| die "\`nvm use -w --silent ${TEST_VERSION}\` output was not silenced to '${EXPECTED_OUTPUT}'; got '${OUTPUT}'"
|
||||
|
||||
cleanup
|
||||
20
test/fast/Unit tests/nvm install -b
Executable file
20
test/fast/Unit tests/nvm install -b
Executable file
@@ -0,0 +1,20 @@
|
||||
#!/bin/sh
|
||||
|
||||
die () { echo "$@" ; exit 1; }
|
||||
|
||||
\. ../../../nvm.sh
|
||||
|
||||
nvm_install_source() {
|
||||
exit 42
|
||||
}
|
||||
|
||||
VERSION="0.7.0"
|
||||
|
||||
EXIT_CODE=$(nvm install -b "${VERSION}" ; echo $?)
|
||||
|
||||
[ $EXIT_CODE -eq 3 ] || die "Expected exit code 3, got ${EXIT_CODE}"
|
||||
|
||||
ACTUAL="$(nvm install -b "${VERSION}" 2>&1)"
|
||||
EXPECTED="Binary download is not available for v${VERSION}"
|
||||
|
||||
[ "${ACTUAL}" = "${EXPECTED}" ] || die "Expected >${EXPECTED}<, got >${ACTUAL}<"
|
||||
@@ -6,14 +6,14 @@ die () { echo "$@" ; cleanup ; exit 1; }
|
||||
|
||||
cleanup() {
|
||||
unset -f nvm_download nvm_ls_remote nvm_ls_remote_iojs
|
||||
if [ -n TEMP_NVM_COLORS ]; then
|
||||
if [ -n "${TEMP_NVM_COLORS-}" ]; then
|
||||
export NVM_COLORS=TEMP_NVM_COLORS
|
||||
fi
|
||||
unset TEMP_NVM_COLORS
|
||||
}
|
||||
|
||||
\. ../../../nvm.sh
|
||||
if [ -n ${NVM_COLORS} ]; then
|
||||
if [ -n "${NVM_COLORS-}" ]; then
|
||||
export TEMP_NVM_COLORS=NVM_COLORS
|
||||
unset NVM_COLORS
|
||||
fi
|
||||
@@ -22,11 +22,11 @@ nvm deactivate 2>/dev/null || die 'unable to deactivate'
|
||||
|
||||
\. ../../common.sh
|
||||
|
||||
MOCKS_DIR="$PWD/mocks"
|
||||
MOCKS_DIR="${PWD}/mocks"
|
||||
|
||||
nvm_download() {
|
||||
if [ "$*" = "-L -s $(nvm_get_mirror node std)/index.tab -o -" ]; then
|
||||
cat "$MOCKS_DIR/nodejs.org-dist-index.tab"
|
||||
cat "${MOCKS_DIR}/nodejs.org-dist-index.tab"
|
||||
return
|
||||
fi
|
||||
return 42
|
||||
@@ -34,15 +34,15 @@ nvm_download() {
|
||||
|
||||
EXPECTED_OUTPUT_PATH="${MOCKS_DIR}/nvm ls-remote lts.txt"
|
||||
OUTPUT="$(nvm ls-remote --lts | sed 's/[ \t]*$//')"
|
||||
EXPECTED_OUTPUT="$(cat "$EXPECTED_OUTPUT_PATH" | sed 's/[ \t]*$//' )"
|
||||
[ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] || die "nvm ls-remote --lts did not output expected sorted versions; got $(echo ">$OUTPUT<") expected $(echo ">$EXPECTED_OUTPUT<")"
|
||||
EXPECTED_OUTPUT="$(cat "${EXPECTED_OUTPUT_PATH}" | sed 's/[ \t]*$//' )"
|
||||
[ "_${OUTPUT}" = "_${EXPECTED_OUTPUT}" ] || die "nvm ls-remote --lts did not output expected sorted versions; got >${OUTPUT}< expected >${EXPECTED_OUTPUT}<"
|
||||
|
||||
EXPECTED_OUTPUT_PATH="${MOCKS_DIR}/nvm ls-remote lts.txt"
|
||||
OUTPUT="$(nvm ls-remote "lts/*" | sed 's/[ \t]*$//')"
|
||||
EXPECTED_OUTPUT="$(cat "$EXPECTED_OUTPUT_PATH" | sed 's/[ \t]*$//' )"
|
||||
[ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] || die "nvm ls-remote lts/* did not output expected sorted versions; got $(echo ">$OUTPUT<") expected $(echo ">$EXPECTED_OUTPUT<")"
|
||||
EXPECTED_OUTPUT="$(cat "${EXPECTED_OUTPUT_PATH}" | sed 's/[ \t]*$//' )"
|
||||
[ "_${OUTPUT}" = "_${EXPECTED_OUTPUT}" ] || die "nvm ls-remote lts/* did not output expected sorted versions; got >${OUTPUT}< expected >${EXPECTED_OUTPUT}<"
|
||||
|
||||
MOCKS_DIR="$PWD/mocks"
|
||||
MOCKS_DIR="${PWD}/mocks"
|
||||
LTS_NAMES_PATH="${MOCKS_DIR}/LTS_names.txt"
|
||||
LTS_LIST="$(cat "${LTS_NAMES_PATH}" | tail -n +2)"
|
||||
|
||||
@@ -56,18 +56,18 @@ printf '%s\n' "${LTS_LIST}" | while IFS= read -r LTS; do
|
||||
INDEX=$(($INDEX + 1))
|
||||
done
|
||||
|
||||
REMOTE="$PWD/mocks/nvm_ls_remote.txt"
|
||||
REMOTE="${PWD}/mocks/nvm_ls_remote.txt"
|
||||
nvm_ls_remote() {
|
||||
cat "$REMOTE"
|
||||
cat "${REMOTE}"
|
||||
}
|
||||
REMOTE_IOJS="$PWD/mocks/nvm_ls_remote_iojs.txt"
|
||||
REMOTE_IOJS="${PWD}/mocks/nvm_ls_remote_iojs.txt"
|
||||
nvm_ls_remote_iojs() {
|
||||
cat "$REMOTE_IOJS"
|
||||
cat "${REMOTE_IOJS}"
|
||||
}
|
||||
|
||||
EXPECTED_OUTPUT_PATH="${MOCKS_DIR}/nvm ls-remote.txt"
|
||||
OUTPUT="$(nvm ls-remote | sed 's/[ \t]*$//')"
|
||||
EXPECTED_OUTPUT="$(cat "$EXPECTED_OUTPUT_PATH" | sed 's/[ \t]*$//' )"
|
||||
[ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] || die "bare nvm ls-remote did not output expected sorted versions; got $(echo ">$OUTPUT<") expected $(echo ">$EXPECTED_OUTPUT<")"
|
||||
EXPECTED_OUTPUT="$(cat "${EXPECTED_OUTPUT_PATH}" | sed 's/[ \t]*$//' )"
|
||||
[ "_${OUTPUT}" = "_${EXPECTED_OUTPUT}" ] || die "bare nvm ls-remote did not output expected sorted versions; got >${OUTPUT}< expected >${EXPECTED_OUTPUT}<"
|
||||
|
||||
cleanup
|
||||
|
||||
12
test/fast/Unit tests/nvm_download
Normal file → Executable file
12
test/fast/Unit tests/nvm_download
Normal file → Executable file
@@ -2,6 +2,7 @@
|
||||
|
||||
cleanup () {
|
||||
unset -f die cleanup
|
||||
docker stop httpbin && docker rm httpbin
|
||||
}
|
||||
die () { echo "$@" ; cleanup ; exit 1; }
|
||||
|
||||
@@ -15,4 +16,15 @@ nvm_download "https://raw.githubusercontent.com/nvm-sh/nvm/HEAD/install.sh" >/de
|
||||
# nvm_download should fail to download wrong_install.sh
|
||||
! nvm_download "https://raw.githubusercontent.com/nvm-sh/nvm/HEAD/wrong_install.sh" >/dev/null || die "nvm_download should fail to download no existing file"
|
||||
|
||||
# nvm_download should pass when calling with auth header
|
||||
docker pull kennethreitz/httpbin && SHELL=bash docker run -d --name httpbin -p 80:80 kennethreitz/httpbin
|
||||
sleep 1 # wait for httpbin to start
|
||||
NVM_AUTH_HEADER="Bearer test-token" nvm_download "http://127.0.0.1/bearer" > /dev/null || die 'nvm_download with auth header should send correctly'
|
||||
|
||||
# nvm_download should fail when calling without auth header
|
||||
nvm_download "http://127.0.0.1/bearer" > /dev/null && die 'nvm_download with no auth header should not send the header and should fail'
|
||||
|
||||
# ensure quoted extra args remain quoted
|
||||
nvm_download "https://raw.githubusercontent.com/nvm-sh/nvm/HEAD/install.sh" -o "; die quoted-command-not-quoted" || die 'command failed'
|
||||
|
||||
cleanup
|
||||
|
||||
@@ -2,27 +2,29 @@
|
||||
|
||||
\. ../../../nvm.sh
|
||||
|
||||
FILE="$NVM_DIR/default-packages"
|
||||
FILE="${NVM_DIR}/default-packages"
|
||||
|
||||
die () { echo "$@" ; cleanup ; exit 1; }
|
||||
setup () {
|
||||
if [ -f $FILE ]; then
|
||||
ORIG_DEFAULT_PACKAGES=$(cat $FILE)
|
||||
if [ -f "${FILE}" ]; then
|
||||
ORIG_DEFAULT_PACKAGES=$(cat "${FILE}")
|
||||
mkdir -p ./tmp/ ||:
|
||||
mv $FILE ./tmp/default-packages ||:
|
||||
mv "${FILE}" ./tmp/default-packages ||:
|
||||
fi
|
||||
touch $FILE
|
||||
touch "${FILE}"
|
||||
}
|
||||
cleanup () {
|
||||
if [ "$ORIG_DEFAULT_PACKAGES" != "" ]; then
|
||||
if [ "${ORIG_DEFAULT_PACKAGES}" != "" ]; then
|
||||
rm -rf ./tmp/
|
||||
echo "$ORIG_DEFAULT_PACKAGES" > $FILE
|
||||
echo "${ORIG_DEFAULT_PACKAGES}" > "${FILE}"
|
||||
else
|
||||
rm "${FILE}"
|
||||
fi
|
||||
}
|
||||
|
||||
setup
|
||||
|
||||
cat > $FILE << EOF
|
||||
cat > "${FILE}" << EOF
|
||||
rimraf
|
||||
object-inspect@1.0.2
|
||||
|
||||
@@ -39,7 +41,7 @@ cleanup
|
||||
|
||||
setup
|
||||
|
||||
cat > $FILE << EOF
|
||||
cat > "${FILE}" << EOF
|
||||
rimraf
|
||||
not~a~package~name
|
||||
mkdirp
|
||||
@@ -53,12 +55,12 @@ cleanup
|
||||
|
||||
setup
|
||||
|
||||
cat > $FILE << EOF
|
||||
cat > "${FILE}" << EOF
|
||||
rimraf
|
||||
not~a~package~name
|
||||
mkdirp
|
||||
EOF
|
||||
printf %s "$(cat "${FILE}")" > $FILE # strip trailing newline
|
||||
printf %s "$(cat "${FILE}")" > "${FILE}" # strip trailing newline
|
||||
|
||||
DEFAULT_PKGS="$(nvm_get_default_packages)"
|
||||
EXPECTED_PKGS='rimraf not~a~package~name mkdirp'
|
||||
@@ -68,25 +70,25 @@ cleanup
|
||||
|
||||
setup
|
||||
|
||||
cat > $FILE << EOF
|
||||
cat > "${FILE}" << EOF
|
||||
object-inspect @ 1.0.2
|
||||
rimraf
|
||||
EOF
|
||||
|
||||
DEFAULT_PKGS="$(nvm_get_default_packages 2>&1 >/dev/null)"
|
||||
EXPECTED_PKGS="Only one package per line is allowed in the $FILE file. Please remove any lines with multiple space-separated values."
|
||||
EXPECTED_PKGS="Only one package per line is allowed in \`${FILE}\`. Please remove any lines with multiple space-separated values."
|
||||
[ "${DEFAULT_PKGS}" = "${EXPECTED_PKGS}" ] || die "4: expected default packages >${EXPECTED_PKGS}<; got >${DEFAULT_PKGS}<"
|
||||
|
||||
cleanup
|
||||
|
||||
setup
|
||||
|
||||
rm -rf $FILE
|
||||
rm -rf "${FILE}"
|
||||
|
||||
DEFAULT_PKGS="$(nvm_get_default_packages)"
|
||||
EXPECTED_PKGS=''
|
||||
[ "${DEFAULT_PKGS}" = "${EXPECTED_PKGS}" ] || die "5: expected default packages >${EXPECTED_PKGS}<; got >${DEFAULT_PKGS}<"
|
||||
|
||||
touch $FILE
|
||||
touch "${FILE}"
|
||||
|
||||
cleanup
|
||||
|
||||
47
test/fast/Unit tests/nvm_install_binary_extract
Normal file → Executable file
47
test/fast/Unit tests/nvm_install_binary_extract
Normal file → Executable file
@@ -1,8 +1,8 @@
|
||||
#!/bin/sh
|
||||
|
||||
cleanup() {
|
||||
[ -d "$tmp_dir" ] && rm -rf "$tmp_dir"
|
||||
[ -d "$NVM_DIR" ] && rm -rf "$NVM_DIR"
|
||||
[ -d "${tmp_dir}" ] && rm -rf "${tmp_dir}"
|
||||
[ -d "${NVM_DIR}" ] && rm -rf "${NVM_DIR}"
|
||||
unset -f die cleanup test_archi nvm_supports_xz
|
||||
unset NVM_DIR tmp_dir version archi
|
||||
}
|
||||
@@ -10,24 +10,34 @@ cleanup () {
|
||||
die() { echo "$@" ; cleanup ; exit 1; }
|
||||
|
||||
test_archi() {
|
||||
local os="$1"
|
||||
local version="$2"
|
||||
local archi="$os-$3"
|
||||
local node="$4"
|
||||
local ext="$5"
|
||||
local command="$6"
|
||||
local command_option="$7"
|
||||
local node_path="$tmp_dir/node-$version-$archi/$node"
|
||||
local os
|
||||
os="$1"
|
||||
local version
|
||||
version="$2"
|
||||
local archi
|
||||
archi="$os-$3"
|
||||
local node
|
||||
node="$4"
|
||||
local ext
|
||||
ext="$5"
|
||||
local command
|
||||
command="$6"
|
||||
local command_option
|
||||
command_option="$7"
|
||||
local node_dir
|
||||
node_dir="${tmp_dir}/node-${version}-${archi}"
|
||||
local node_path
|
||||
node_path="${node_dir}/${node}"
|
||||
|
||||
# Create tarball
|
||||
mkdir -p "$(dirname "$node_path")"
|
||||
echo "node $version" > "$node_path"
|
||||
(cd "$tmp_dir" && "$command" "$command_option" "$tmp_dir/node-$version-$archi.$ext" "node-$version-$archi" && rm -rf "$tmp_dir/node-$version-$archi")
|
||||
[ -f "$tmp_dir/node-$version-$archi.$ext" ] || die "Unable to create fake $ext file"
|
||||
mkdir -p "$(dirname "${node_path}")"
|
||||
echo "node ${version}" > "${node_path}"
|
||||
(cd "${tmp_dir}" && "${command}" "${command_option}" "${node_dir}.${ext}" "node-${version}-${archi}")
|
||||
[ -f "${node_dir}.${ext}" ] || die "Unable to create fake ${ext} file"
|
||||
|
||||
# Extract it
|
||||
nvm_install_binary_extract "$os" "$version" "${version:1}" "$tmp_dir/node-$version-$archi.$ext" "$tmp_dir/files"
|
||||
[ "$(cat "$NVM_DIR/versions/node/$version/bin/node")" = "node $version" ] || die "Unable to extract $ext file"
|
||||
nvm_install_binary_extract "$os" "$version" "$(expr "${version}" : '.\(.*\)')" "${node_dir}.$ext" "${tmp_dir}/files"
|
||||
[ "$(cat "${NVM_DIR}/versions/node/${version}/bin/node")" = "node ${version}" ] || die "Unable to extract ${ext} file"
|
||||
}
|
||||
|
||||
\. ../../../nvm.sh
|
||||
@@ -39,12 +49,13 @@ type nvm_install_binary_extract > /dev/null 2>&1 || die 'nvm_install_binary_extr
|
||||
|
||||
NVM_DIR=$(mktemp -d)
|
||||
tmp_dir=$(mktemp -d)
|
||||
if [ -z "$NVM_DIR" ] || [ -z "$tmp_dir" ]; then
|
||||
if [ -z "${NVM_DIR}" ] || [ -z "${tmp_dir}" ]; then
|
||||
die 'Unable to create temporary folder'
|
||||
fi
|
||||
|
||||
# Test windows zip
|
||||
test_archi 'win' 'v15.6.0' 'x64' 'node' 'zip' 'zip' '-qr'
|
||||
# TODO: enable this
|
||||
# test_archi 'win' 'v15.6.0' 'x64' 'node' 'zip' 'zip' '-qr'
|
||||
|
||||
# Test linux tar.xz
|
||||
test_archi 'linux' 'v14.15.4' 'x64' 'bin/node' 'tar.xz' 'tar' '-cJf'
|
||||
|
||||
56
test/fast/Unit tests/nvm_install_no_progress_bar
Normal file → Executable file
56
test/fast/Unit tests/nvm_install_no_progress_bar
Normal file → Executable file
@@ -13,11 +13,9 @@ die () { >&2 echo "$@" ; cleanup ; exit 1; }
|
||||
|
||||
\. ../../../nvm.sh
|
||||
|
||||
nvm_has_colors() { return 1 ; }
|
||||
|
||||
cleanup
|
||||
|
||||
OUTPUT="$(2>&1 nvm install --no-progress v0.12.18)"
|
||||
OUTPUT="$(TERM=dumb 2>&1 nvm install --no-progress v0.12.18)"
|
||||
EXPECTED_OUTPUT="Downloading and installing node v0.12.18...
|
||||
Downloading https://nodejs.org/dist/v0.12.18/node-v0.12.18-linux-x64.tar.xz...
|
||||
Computing checksum with sha256sum
|
||||
@@ -25,19 +23,63 @@ Checksums matched!
|
||||
Now using node v0.12.18 (npm v2.15.11)
|
||||
Creating default alias: default -> v0.12.18 *"
|
||||
|
||||
[ "${OUTPUT}" = "${EXPECTED_OUTPUT}" ] || die "expected >${EXPECTED_OUTPUT}<, got >${OUTPUT}<"
|
||||
[ "${OUTPUT}" = "${EXPECTED_OUTPUT}" ] || die "1: expected >
|
||||
${EXPECTED_OUTPUT}<, got >
|
||||
${OUTPUT}<"
|
||||
|
||||
cleanup
|
||||
|
||||
OUTPUT="$(2>&1 nvm install v0.12.18)"
|
||||
OUTPUT="$(TERM=dumb 2>&1 nvm install v0.12.18)"
|
||||
EXPECTED_OUTPUT="Downloading and installing node v0.12.18...
|
||||
Downloading https://nodejs.org/dist/v0.12.18/node-v0.12.18-linux-x64.tar.xz...
|
||||
######################################################################## 100.0%
|
||||
######################################################################### 100.0%
|
||||
Computing checksum with sha256sum
|
||||
Checksums matched!
|
||||
Now using node v0.12.18 (npm v2.15.11)
|
||||
Creating default alias: default -> v0.12.18 *"
|
||||
|
||||
[ "${OUTPUT}" = "${EXPECTED_OUTPUT}" ] || die "expected >${EXPECTED_OUTPUT}<, got >${OUTPUT}<"
|
||||
[ "$(echo "${OUTPUT}" | wc -l)" = "$(echo "${EXPECTED_OUTPUT}" | wc -l)" ] || die "2: expected 7 lines, got $(echo "${OUTPUT}" | wc -l)"
|
||||
|
||||
# Preprocess function to handle carriage returns and extract final output
|
||||
preprocess_output() {
|
||||
echo "$1" | awk '
|
||||
{
|
||||
# For each line in the input
|
||||
while (index($0, "\r") > 0) {
|
||||
# If a carriage return is found, process it
|
||||
pos = index($0, "\r")
|
||||
before_cr = substr($0, 1, pos - 1)
|
||||
after_cr = substr($0, pos + 1)
|
||||
# Overwrite the line up to the carriage return with content after it
|
||||
$0 = after_cr
|
||||
}
|
||||
print $0
|
||||
}' | sed '/^$/d' # Remove any empty lines
|
||||
}
|
||||
|
||||
[ "${OUTPUT}" = "${EXPECTED_OUTPUT}" ] || {
|
||||
echo "$OUTPUT" \
|
||||
| while IFS= read -r output_line && IFS= read -r expected_line <&3; do
|
||||
line_number=$((line_number + 1))
|
||||
|
||||
# Strip non-visible characters from both lines
|
||||
clean_output=$(preprocess_output "$output_line")
|
||||
|
||||
if [ "${output_line}" != "${expected_line}" ] && ! echo "${clean_output}" | \grep -qE '^#+ 100\.0%$'; then
|
||||
echo "Difference on line ${line_number}:"
|
||||
echo "Output: ${output_line}"
|
||||
echo "Expected: ${expected_line}"
|
||||
echo "Byte-by-byte comparison:"
|
||||
echo "Output: $(echo "${clean_output}" | od -An -tx1 | tr -d '\n')"
|
||||
echo "Expected: $(echo "${expected_line}" | od -An -tx1 | tr -d '\n')"
|
||||
|
||||
die "4: expected >
|
||||
${EXPECTED_OUTPUT}<, got >
|
||||
${OUTPUT}<"
|
||||
fi
|
||||
done 3<<EOF
|
||||
$EXPECTED_OUTPUT
|
||||
EOF
|
||||
}
|
||||
|
||||
cleanup
|
||||
|
||||
0
test/fast/Unit tests/nvm_is_version_installed
Normal file → Executable file
0
test/fast/Unit tests/nvm_is_version_installed
Normal file → Executable file
@@ -14,7 +14,7 @@ for f in ../../../test/fixtures/nvmrc/test/fixtures/valid/*; do
|
||||
STDOUT="$(nvm_process_nvmrc $f/.nvmrc 2>/dev/null)"
|
||||
EXIT_CODE="$(nvm_process_nvmrc $f/.nvmrc >/dev/null 2>/dev/null; echo $?)"
|
||||
|
||||
EXPECTED="$(extract_value node "$(parse_json "$(cat "$f/expected.json")")")"
|
||||
EXPECTED="$(nvm_json_extract node < "${f}/expected.json" | tr -d '"')"
|
||||
|
||||
[ "${EXIT_CODE}" = "0" ] || die "$(basename "${f}"): expected exit code of 0 but got ${EXIT_CODE}"
|
||||
|
||||
@@ -26,7 +26,7 @@ for f in ../../../test/fixtures/nvmrc/test/fixtures/invalid/*; do
|
||||
STDERR="$(nvm_process_nvmrc $f/.nvmrc 2>&1 >/dev/null | awk '{if(NR > 8) print $0}' | strip_colors)"
|
||||
EXIT_CODE="$(nvm_process_nvmrc $f/.nvmrc >/dev/null 2>/dev/null; echo $?)"
|
||||
|
||||
EXPECTED="$(parse_json "$(cat "$f/expected.json")" | sed 's/^[0-9]*="//;s/"$//')"
|
||||
EXPECTED="$(nvm_json_extract < "${f}/expected.json" | tr -d '"')"
|
||||
|
||||
[ "${EXIT_CODE}" != "0" ] || die "$(basename "${f}"): expected exit code of 'not 0' but got ${EXIT_CODE}"
|
||||
|
||||
|
||||
86
test/fast/Unit tests/nvm_write_nvmrc
Executable file
86
test/fast/Unit tests/nvm_write_nvmrc
Executable file
@@ -0,0 +1,86 @@
|
||||
#!/bin/sh
|
||||
\. ../../../nvm.sh
|
||||
\. ../../common.sh
|
||||
|
||||
set -e
|
||||
|
||||
TEST_VERSION="v0.2.4"
|
||||
|
||||
if [ -f .nvmrc ]; then mv .nvmrc .nvmrc.orig; fi
|
||||
|
||||
del_nvmrc () {
|
||||
rm -f .nvmrc
|
||||
}
|
||||
|
||||
del_alias () {
|
||||
nvm unalias test >/dev/null 2>&1
|
||||
}
|
||||
|
||||
cleanup () {
|
||||
del_nvmrc
|
||||
del_alias
|
||||
nvm cache clear
|
||||
nvm deactivate
|
||||
nvm unalias default
|
||||
rm -rf ${NVM_DIR}/v*
|
||||
if [ -f .nvmrc.orig ]; then mv .nvmrc.orig .nvmrc; fi
|
||||
unset -f nvm_ls_remote nvm_ls_remote_iojs
|
||||
}
|
||||
|
||||
die () {
|
||||
echo "$@"
|
||||
cleanup
|
||||
exit 1
|
||||
}
|
||||
|
||||
REMOTE="$PWD/mocks/nvm_ls_remote.txt"
|
||||
nvm_ls_remote() {
|
||||
cat "$REMOTE"
|
||||
}
|
||||
REMOTE_IOJS="$PWD/mocks/nvm_ls_remote_iojs.txt"
|
||||
nvm_ls_remote_iojs() {
|
||||
cat "$REMOTE_IOJS"
|
||||
}
|
||||
|
||||
make_fake_node "$TEST_VERSION"
|
||||
|
||||
test_version () {
|
||||
del_nvmrc
|
||||
VERSION_STRING=${1-}
|
||||
make_fake_node "$VERSION_STRING"
|
||||
|
||||
nvm_write_nvmrc $VERSION_STRING || die "\`nvm_write_nvmrc ${VERSION_STRING}\` failed"
|
||||
OUTPUT="$(cat .nvmrc)"
|
||||
|
||||
nvm_is_valid_version "$(cat .nvmrc)" \
|
||||
|| die "\`nvm install --save ${VERSION_STRING}\`+ \`cat .nvmrc\` outputted invalid version: got '${OUTPUT}'"
|
||||
}
|
||||
|
||||
# 1.
|
||||
|
||||
test_version "$TEST_VERSION" || die
|
||||
|
||||
# 2. with an alias
|
||||
del_alias
|
||||
nvm alias test "$TEST_VERSION"
|
||||
test_version test || die
|
||||
|
||||
# 3. fails with invalid permissions
|
||||
del_nvmrc
|
||||
touch .nvmrc
|
||||
chmod 0 .nvmrc
|
||||
nvm_write_nvmrc $TEST_VERSION 2>/dev/null && die "\`nvm_write_nvmrc $TEST_VERSION\` did not fail with invalid permissions"
|
||||
del_nvmrc
|
||||
|
||||
# 4. respects NVM_SILENT=1
|
||||
export NVM_SILENT=1
|
||||
[ "$(nvm_write_nvmrc $TEST_VERSION)" = "" ] || die "\`nvm_write_nvmrc $TEST_VERSION\` was not silenced by NVM_SILENT=1"
|
||||
unset NVM_SILENT
|
||||
|
||||
# 5. fails with an invalid version number
|
||||
TEST_VERSION="not_a_node_version"
|
||||
nvm_write_nvmrc $TEST_VERSION 2>/dev/null && die "\`nvm_write_nvmrc $TEST_VERSION\` did not fail"
|
||||
|
||||
#
|
||||
|
||||
cleanup
|
||||
0
test/fast/nvm should remove the last trailing slash in $NVM_DIR
Normal file → Executable file
0
test/fast/nvm should remove the last trailing slash in $NVM_DIR
Normal file → Executable file
@@ -27,15 +27,15 @@ setup () {
|
||||
mkdir -p "$npm_config_prefix/lib"
|
||||
}
|
||||
|
||||
|
||||
setup
|
||||
|
||||
npm install -g nop >/dev/null || die 'nvm_check_global_modules cannot be tested because `npm` cannot install the `nop` package'
|
||||
message=$(nvm_check_global_modules)
|
||||
[ ! -z "$message" ] || die "nvm_check_global_modules should have printed a notice when npm had global modules installed; got:\n${message}"
|
||||
|
||||
if [ -n "${ORIGINAL_NVM_DIR}" ]; then
|
||||
if [ -n "${ORIGINAL_NVM_DIR}" ] && [ -z "${GITHUB_ACTIONS}" ]; then
|
||||
# Admit we're using NVM, just for this one test
|
||||
# TODO: fix this for GHA
|
||||
message=$(NVM_DIR="${ORIGINAL_NVM_DIR}" nvm_check_global_modules)
|
||||
[ -z "$message" ] || die "nvm_check_global_modules should not have printed a notice when npm is managed by nvm; got:\n${message}"
|
||||
fi
|
||||
|
||||
2
test/install_script/nvm_download
Normal file → Executable file
2
test/install_script/nvm_download
Normal file → Executable file
@@ -12,7 +12,7 @@ nvm_download "https://raw.githubusercontent.com/nvm-sh/nvm/HEAD/install.sh" >/de
|
||||
|
||||
# nvm_download should fail to download wrong_install.sh
|
||||
if nvm_download "https://raw.githubusercontent.com/nvm-sh/nvm/HEAD/wrong_install.sh" &>/dev/null; then
|
||||
die "nvm_download should fail to download no existing file"
|
||||
die "nvm_download should fail to download nonexistent file"
|
||||
fi
|
||||
|
||||
cleanup
|
||||
|
||||
34
test/installation_node/install from binary with binary flag set
Normal file → Executable file
34
test/installation_node/install from binary with binary flag set
Normal file → Executable file
@@ -1,6 +1,10 @@
|
||||
#!/bin/sh
|
||||
|
||||
die () { echo "$@" ; exit 1; }
|
||||
die () {
|
||||
unset -f nvm_install_binary nvm_install_source
|
||||
echo "$@"
|
||||
exit 1
|
||||
}
|
||||
|
||||
\. ../../nvm.sh
|
||||
|
||||
@@ -22,16 +26,28 @@ nvm run $NVM_TEST_VERSION --version | grep $NVM_TEST_VERSION || die "'nvm run $N
|
||||
NVM_CURRENT_DEFAULT="$(nvm_alias default)"
|
||||
[ "$NVM_CURRENT_DEFAULT" = "$NVM_TEST_VERSION" ] || die "wrong default alias: $(nvm alias)"
|
||||
|
||||
# Falls back to source but if -b is set fails binary download.
|
||||
nvm_install_binary() {
|
||||
>&2 echo 'binary failed'
|
||||
return 1
|
||||
}
|
||||
|
||||
# binary fails, falls back to source, but if -b is set, fails
|
||||
OUTPUT="$(nvm install -b 9.0.0 2>&1)"
|
||||
EXPECTED_OUTPUT='Binary download failed. Download from source aborted.'
|
||||
if [ "${OUTPUT#*$EXPECTED_OUTPUT}" = "${OUTPUT}" ]; then
|
||||
EXPECTED_OUTPUT='binary failed'
|
||||
if [ "${OUTPUT#*"${EXPECTED_OUTPUT}"}" = "${OUTPUT}" ]; then
|
||||
die "No source binary flag is active and should have returned >${EXPECTED_OUTPUT}<. Instead it returned >${OUTPUT}<"
|
||||
fi
|
||||
|
||||
# Falls back to source but if -b is not set.
|
||||
nvm_install_source() {
|
||||
>&2 echo 'source intentionally failed'
|
||||
return 1
|
||||
}
|
||||
|
||||
# binary fails, falls back to source if -b is not set
|
||||
OUTPUT="$(nvm install 9.0.0 2>&1)"
|
||||
EXPECTED_OUTPUT='Binary download failed. Download from source aborted.'
|
||||
if [ "${OUTPUT#*$EXPECTED_OUTPUT}" != "${OUTPUT}" ]; then
|
||||
die "No source binary flag is active and should have returned >${EXPECTED_OUTPUT}<. Instead it returned >${OUTPUT}<"
|
||||
fi
|
||||
EXPECTED_OUTPUT="binary failed
|
||||
Detected that you have 2 CPU core(s)
|
||||
Number of CPU core(s) less than or equal to 2, running in single-threaded mode
|
||||
source intentionally failed"
|
||||
|
||||
[ "${EXPECTED_OUTPUT}" = "${OUTPUT}" ] || die "expected >${EXPECTED_OUTPUT}<, got >${OUTPUT}<"
|
||||
|
||||
0
test/slow/nvm reinstall-packages/test-npmlink/index.js
Executable file → Normal file
0
test/slow/nvm reinstall-packages/test-npmlink/index.js
Executable file → Normal file
@@ -1,6 +1,6 @@
|
||||
#!/bin/sh
|
||||
|
||||
die () { echo "$@" ; exit 1; }
|
||||
die () { echo "$*" ; echo "|${NVM_DIR}|"; exit 1; }
|
||||
|
||||
echo '0.10.1' > ../../alias/default || die "couldn't create default alias"
|
||||
|
||||
@@ -9,12 +9,12 @@ echo '0.10.1' > ../../alias/default || die "couldn't create default alias"
|
||||
NVM_TARGET=0.10.3
|
||||
NVM_DEFAULT="$(nvm_resolve_local_alias default)"
|
||||
|
||||
[ "_$NVM_DEFAULT" != "_$NVM_TARGET" ] || die "default $NVM_DEFAULT is the same as target $NVM_TARGET"
|
||||
[ "_${NVM_DEFAULT}" != "_${NVM_TARGET}" ] || die "default ${NVM_DEFAULT} is the same as target ${NVM_TARGET}"
|
||||
|
||||
nvm use $NVM_TARGET || die "nvm use $NVM_TARGET failed"
|
||||
nvm use "${NVM_TARGET}" || die "nvm use ${NVM_TARGET} failed"
|
||||
|
||||
\. ../../nvm.sh || die 'sourcing returned nonzero exit code'
|
||||
|
||||
NVM_CURRENT="$(nvm current)"
|
||||
|
||||
[ "_${NVM_CURRENT#v}" = "_$NVM_TARGET" ] || die "node version not retained after sourcing"
|
||||
[ "_${NVM_CURRENT#v}" = "_${NVM_TARGET}" ] || die "node version not retained after sourcing"
|
||||
|
||||
@@ -8,21 +8,21 @@ die () { echo "$@" ; exit 1; }
|
||||
# despite being unloaded in setup, the inherited PATH still contains
|
||||
# an nvm-installed node version. We have to reset NVM_DIR after the unload.
|
||||
\. ../../nvm.sh || die 'sourcing returned nonzero exit code'
|
||||
NVM_DIR_CACHED="$NVM_DIR"
|
||||
NVM_DIR_CACHED="${NVM_DIR}"
|
||||
nvm unload || die 'unloading returned nonzero exit code'
|
||||
NVM_DIR="$NVM_DIR_CACHED"
|
||||
NVM_DIR="${NVM_DIR_CACHED}"
|
||||
|
||||
echo '0.10.1' > ../../alias/default || die 'creation of default alias failed'
|
||||
echo '0.10.1' > "${NVM_DIR}/alias/default" || die 'creation of default alias failed'
|
||||
|
||||
# Now to begin the real test
|
||||
\. ../../nvm.sh || die 'sourcing returned nonzero exit code'
|
||||
|
||||
NVM_LS_CURRENT_NOT_GREPPED="$(nvm ls current | strip_colors)"
|
||||
NVM_LS_CURRENT="$(nvm ls current | strip_colors | \grep -o v0.10.1)"
|
||||
[ "_$NVM_LS_CURRENT" = '_v0.10.1' ] || die "'nvm ls current' did not return '-> v0.10.1', got '$NVM_LS_CURRENT_NOT_GREPPED'"
|
||||
[ "_${NVM_LS_CURRENT}" = '_v0.10.1' ] || die "'nvm ls current' did not return '-> v0.10.1', got '${NVM_LS_CURRENT_NOT_GREPPED}'"
|
||||
|
||||
# NVM_LS_CURRENT_COLORED="$(nvm ls current | sed -n l)"
|
||||
|
||||
NVM_ALIAS_DEFAULT="$(nvm alias default | strip_colors)"
|
||||
[ "_$NVM_ALIAS_DEFAULT" = "_default -> 0.10.1 (-> v0.10.1)" ] \
|
||||
|| die "'nvm alias default did not return 'default -> 0.10.1 (-> v0.10.1)', got '$NVM_ALIAS_DEFAULT'"
|
||||
[ "_${NVM_ALIAS_DEFAULT}" = "_default -> 0.10.1 (-> v0.10.1)" ] \
|
||||
|| die "'nvm alias default did not return 'default -> 0.10.1 (-> v0.10.1)', got '${NVM_ALIAS_DEFAULT}'"
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
#!/bin/sh
|
||||
|
||||
die () { echo "$@" ; exit 1; }
|
||||
die () { echo "$*" ; echo "|${NVM_DIR}|"; exit 1; }
|
||||
|
||||
supports_source_options () {
|
||||
[ "_$(echo 'echo $1' | . /dev/stdin yes)" = "_yes" ]
|
||||
}
|
||||
@@ -10,18 +11,23 @@ if ! supports_source_options; then
|
||||
exit 0;
|
||||
fi
|
||||
|
||||
echo '0.10.2' > ../../.nvmrc || die 'creation of .nvmrc failed'
|
||||
echo '0.10.2' > .nvmrc || die 'creation of .nvmrc failed'
|
||||
|
||||
export NVM_DIR="${PWD}/../.."
|
||||
rm ../../alias/default
|
||||
|
||||
\. ../../nvm.sh --install
|
||||
EXIT_CODE="$(echo $?)"
|
||||
EXIT_CODE="$?"
|
||||
|
||||
echo 'sourcing complete.'
|
||||
|
||||
nvm_version 0.10.2 >/dev/null 2>&1 || die "v0.10.2 not installed: $(nvm ls)"
|
||||
|
||||
[ "_$(nvm_rc_version | \grep -o -e 'with version .*$')" = "_with version <0.10.2>" ] || die "nvm_rc_version $(nvm_rc_version)"
|
||||
|
||||
[ "_$EXIT_CODE" = "_0" ] || die "sourcing returned nonzero exit code: $EXIT_CODE"
|
||||
nvm_version 0.10.2 >/dev/null 2>&1 || die "v0.10.2 not installed: \n$(nvm_ls)"
|
||||
|
||||
[ "_${EXIT_CODE}" = '_0' ] || die "sourcing returned nonzero exit code: ${EXIT_CODE}"
|
||||
|
||||
NVM_LS_CURRENT="$(nvm ls current | \grep -o v0.10.2)"
|
||||
[ "_$NVM_LS_CURRENT" = '_v0.10.2' ] || die "'nvm ls current' did not return '-> v0.10.2', got '$NVM_LS_CURRENT' `nvm ls`"
|
||||
[ "_$NVM_LS_CURRENT" = '_v0.10.2' ] || die "'nvm ls current' did not return '-> v0.10.2', got >${NVM_LS_CURRENT}<\n$(nvm_ls)"
|
||||
|
||||
rm .nvmrc
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
\. ../common.sh
|
||||
|
||||
die () { echo "$@" ; exit 1; }
|
||||
|
||||
supports_source_options () {
|
||||
[ "_$(echo 'echo $1' | . /dev/stdin yes)" = "_yes" ]
|
||||
}
|
||||
@@ -11,22 +12,26 @@ if ! supports_source_options; then
|
||||
exit 0;
|
||||
fi
|
||||
|
||||
rm .nvmrc
|
||||
export NVM_DIR="${PWD}/../.."
|
||||
echo '0.10.2' > ../../alias/default || die 'creation of default alias failed'
|
||||
|
||||
echo 'sourcing nvm with --install...'
|
||||
|
||||
\. ../../nvm.sh --install
|
||||
EXIT_CODE="$(echo $?)"
|
||||
EXIT_CODE="$?"
|
||||
|
||||
echo 'sourcing complete.'
|
||||
|
||||
nvm_version 0.10.2 >/dev/null 2>&1 || die "v0.10.2 not installed: $(nvm ls)"
|
||||
[ "$(nvm_alias default)" = '0.10.2' ] || die "nvm_alias default did not return '0.10.2', got >$(nvm_alias default)<"
|
||||
|
||||
[ "_$EXIT_CODE" = "_0" ] || die "sourcing returned nonzero exit code: $EXIT_CODE"
|
||||
nvm_version 0.10.2 >/dev/null 2>&1 || die "v0.10.2 not installed: \n$(nvm_ls)"
|
||||
|
||||
[ "_$EXIT_CODE" = '_0' ] || die "sourcing returned nonzero exit code: ${EXIT_CODE}"
|
||||
|
||||
NVM_LS_CURRENT="$(nvm ls current | strip_colors | command grep -o v0.10.2)"
|
||||
[ "_$NVM_LS_CURRENT" = '_v0.10.2' ] || die "'nvm ls current' did not return '-> v0.10.2', got '$NVM_LS_CURRENT'"
|
||||
[ "_$NVM_LS_CURRENT" = '_v0.10.2' ] || die "'nvm ls current' did not return '-> v0.10.2', >${NVM_LS_CURRENT}<\n$(nvm_ls)"
|
||||
|
||||
NVM_ALIAS_DEFAULT="$(nvm alias default | strip_colors)"
|
||||
[ "_$NVM_ALIAS_DEFAULT" = "_default -> 0.10.2 (-> v0.10.2)" ] \
|
||||
|| die "'nvm alias default did not return 'default -> 0.10.2 (-> v0.10.2)', got '$NVM_ALIAS_DEFAULT'"
|
||||
|| die "'nvm alias default did not return 'default -> 0.10.2 (-> v0.10.2)', got >${NVM_ALIAS_DEFAULT}<\n$(nvm_ls)"
|
||||
|
||||
@@ -4,4 +4,5 @@ rm -rf ../../alias
|
||||
rm -rf ../../v0.10.1
|
||||
rm -rf ../../v0.10.2
|
||||
rm -rf ../../v0.10.3
|
||||
rm -rf ../../versions/node/v4.1.0
|
||||
rm -f ../../.nvmrc
|
||||
Reference in New Issue
Block a user