mirror of
https://github.com/nvm-sh/nvm.git
synced 2025-07-03 22:23:43 +00:00
Compare commits
6 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
9602f4f959 | ||
![]() |
c3d674f8f9 | ||
![]() |
0215ef8203 | ||
![]() |
1aab8b2d5a | ||
![]() |
977563e97d | ||
![]() |
99352a64d2 |
117
.github/INCIDENT_RESPONSE_PLAN.md
vendored
Normal file
117
.github/INCIDENT_RESPONSE_PLAN.md
vendored
Normal file
@ -0,0 +1,117 @@
|
|||||||
|
# Incident Response Process for **nvm**
|
||||||
|
|
||||||
|
## Reporting a Vulnerability
|
||||||
|
|
||||||
|
We take the security of **nvm** very seriously. If you believe you’ve found a security vulnerability, please inform us responsibly through coordinated disclosure.
|
||||||
|
|
||||||
|
### How to Report
|
||||||
|
|
||||||
|
> **Do not** report security vulnerabilities through public GitHub issues, discussions, or social media.
|
||||||
|
|
||||||
|
Instead, please use one of these secure channels:
|
||||||
|
|
||||||
|
1. **GitHub Security Advisories**
|
||||||
|
Use the **Report a vulnerability** button in the Security tab of the [nvm-sh/nvm repository](https://github.com/nvm-sh/nvm).
|
||||||
|
|
||||||
|
2. **Email**
|
||||||
|
Follow the posted [Security Policy](https://github.com/nvm-sh/nvm/security/policy).
|
||||||
|
|
||||||
|
### What to Include
|
||||||
|
|
||||||
|
**Required Information:**
|
||||||
|
- Brief description of the vulnerability type
|
||||||
|
- Affected version(s) and components
|
||||||
|
- Steps to reproduce the issue
|
||||||
|
- Impact assessment (what an attacker could achieve)
|
||||||
|
|
||||||
|
**Helpful Additional Details:**
|
||||||
|
- Full paths of affected scripts or files
|
||||||
|
- Specific commit or branch where the issue exists
|
||||||
|
- Required configuration to reproduce
|
||||||
|
- Proof-of-concept code (if available)
|
||||||
|
- Suggested mitigation or fix
|
||||||
|
|
||||||
|
## Our Response Process
|
||||||
|
|
||||||
|
**Timeline Commitments:**
|
||||||
|
- **Initial acknowledgment**: Within 24 hours
|
||||||
|
- **Detailed response**: Within 3 business days
|
||||||
|
- **Status updates**: Every 7 days until resolved
|
||||||
|
- **Resolution target**: 90 days for most issues
|
||||||
|
|
||||||
|
**What We’ll Do:**
|
||||||
|
1. Acknowledge your report and assign a tracking ID
|
||||||
|
2. Assess the vulnerability and determine severity
|
||||||
|
3. Develop and test a fix
|
||||||
|
4. Coordinate disclosure timeline with you
|
||||||
|
5. Release a security update and publish an advisory and CVE
|
||||||
|
6. Credit you in our security advisory (if desired)
|
||||||
|
|
||||||
|
## Disclosure Policy
|
||||||
|
|
||||||
|
- **Coordinated disclosure**: We’ll work with you on timing
|
||||||
|
- **Typical timeline**: 90 days from report to public disclosure
|
||||||
|
- **Early disclosure**: If actively exploited
|
||||||
|
- **Delayed disclosure**: For complex issues
|
||||||
|
|
||||||
|
## Scope
|
||||||
|
|
||||||
|
**In Scope:**
|
||||||
|
- **nvm** project (all supported versions)
|
||||||
|
- Installation and update scripts (`install.sh`, `nvm.sh`)
|
||||||
|
- Official documentation and CI/CD integrations
|
||||||
|
- Dependencies with direct security implications
|
||||||
|
|
||||||
|
**Out of Scope:**
|
||||||
|
- Third-party forks or mirrors
|
||||||
|
- Platform-specific installs outside core scripts
|
||||||
|
- Social engineering or physical attacks
|
||||||
|
- Theoretical vulnerabilities without practical exploitation
|
||||||
|
|
||||||
|
## Security Measures
|
||||||
|
|
||||||
|
**Our Commitments:**
|
||||||
|
- Regular vulnerability scanning via GitHub Actions
|
||||||
|
- Automated security checks in CI/CD pipelines
|
||||||
|
- Secure scripting practices and mandatory code review
|
||||||
|
- Prompt patch releases for critical issues
|
||||||
|
|
||||||
|
**User Responsibilities:**
|
||||||
|
- Keep **nvm** updated
|
||||||
|
- Verify script downloads via PGP signatures
|
||||||
|
- Follow secure configuration guidelines for shell environments
|
||||||
|
|
||||||
|
## Legal Safe Harbor
|
||||||
|
|
||||||
|
**We will NOT:**
|
||||||
|
- Initiate legal action
|
||||||
|
- Contact law enforcement
|
||||||
|
- Suspend or terminate your access
|
||||||
|
|
||||||
|
**You must:**
|
||||||
|
- Only test against your own installations
|
||||||
|
- Not access, modify, or delete user data
|
||||||
|
- Not degrade service availability
|
||||||
|
- Not publicly disclose before coordinated disclosure
|
||||||
|
- Act in good faith
|
||||||
|
|
||||||
|
## Recognition
|
||||||
|
|
||||||
|
- **Advisory Credits**: Credit in GitHub Security Advisories (unless anonymous)
|
||||||
|
|
||||||
|
## Security Updates
|
||||||
|
|
||||||
|
**Stay Informed:**
|
||||||
|
- Subscribe to GitHub releases for **nvm**
|
||||||
|
- Enable GitHub Security Advisory notifications
|
||||||
|
|
||||||
|
**Update Process:**
|
||||||
|
- Patch releases (e.g., v0.40.3 → v0.40.4)
|
||||||
|
- Out-of-band releases for critical issues
|
||||||
|
- Advisories via GitHub Security Advisories
|
||||||
|
|
||||||
|
## Contact Information
|
||||||
|
|
||||||
|
- **Security reports**: Security tab of [nvm-sh/nvm](https://github.com/nvm-sh/nvm/security)
|
||||||
|
- **General inquiries**: GitHub Discussions or Issues
|
||||||
|
|
17
.github/SECURITY.md
vendored
17
.github/SECURITY.md
vendored
@ -1,6 +1,6 @@
|
|||||||
# Security
|
# Security
|
||||||
|
|
||||||
Please email [@ljharb](https://github.com/ljharb) or see https://tidelift.com/security if you have a potential security vulnerability to report.
|
Please file a private vulnerability report via GitHub, email [@ljharb](https://github.com/ljharb), or see https://tidelift.com/security if you have a potential security vulnerability to report.
|
||||||
|
|
||||||
## OpenSSF CII Best Practices
|
## OpenSSF CII Best Practices
|
||||||
|
|
||||||
@ -12,16 +12,17 @@ There are three “tiers”: passing, silver, and gold.
|
|||||||
We meet 100% of the “passing” criteria.
|
We meet 100% of the “passing” criteria.
|
||||||
|
|
||||||
### Silver
|
### Silver
|
||||||
We meet 95% of the “silver” criteria. The gaps are as follows:
|
We meet 100% of the “silver” criteria.
|
||||||
- we do not have a DCO or a CLA process for contributions.
|
|
||||||
- because we only have one maintainer, the project has no way to continue if that maintainer stops being active.
|
|
||||||
- we do not currently document “what the user can and cannot expect in terms of security” for our project. This is planned to be completed in 2023.
|
|
||||||
|
|
||||||
### Gold
|
### Gold
|
||||||
We meet 65% of the “gold” criteria. The gaps are as follows:
|
We meet 78% of the “gold” criteria. The gaps are as follows:
|
||||||
- we do not yet have the “silver” badge; see all the gaps above.
|
- because we only have one maintainer, the project has no way to continue if that maintainer stops being active.
|
||||||
- We do not include a copyright or license statement in each source file. Efforts are underway to change this archaic practice into a suggestion instead of a hard requirement.
|
- We do not include a copyright or license statement in each source file. Efforts are underway to change this archaic practice into a suggestion instead of a hard requirement.
|
||||||
|
|
||||||
## Threat Model
|
## Threat Model
|
||||||
|
|
||||||
See [THREAT_MODEL.md](./THREAT_MODEL.md).
|
See [THREAT_MODEL.md](.github/THREAT_MODEL.md).
|
||||||
|
|
||||||
|
## Incident Response Plan
|
||||||
|
|
||||||
|
Please see our [Incident Response Plan](.github/INCIDENT_RESPONSE_PLAN.md).
|
||||||
|
427
.github/copilot-instructions.md
vendored
Normal file
427
.github/copilot-instructions.md
vendored
Normal file
@ -0,0 +1,427 @@
|
|||||||
|
# nvm Copilot Instructions
|
||||||
|
|
||||||
|
This document provides guidance for GitHub Copilot when working with the Node Version Manager (nvm) codebase.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
nvm is a version manager for Node.js, implemented as a POSIX-compliant function that works across multiple shells (sh, dash, bash, ksh, zsh). The codebase is primarily written in shell script and emphasizes portability and compatibility.
|
||||||
|
|
||||||
|
### Core Architecture
|
||||||
|
|
||||||
|
- **Main script**: `nvm.sh` - Contains all core functionality and the main `nvm()` function
|
||||||
|
- **Installation script**: `install.sh` - Handles downloading and installing nvm itself
|
||||||
|
- **Execution wrapper**: `nvm-exec` - Allows running commands with specific Node.js versions
|
||||||
|
- **Bash completion**: `bash_completion` - Provides tab completion for bash users
|
||||||
|
- **Tests**: Comprehensive test suite in `test/` directory using the [urchin](https://www.npmjs.com/package/urchin) test framework
|
||||||
|
|
||||||
|
## Key Files and Their Purposes
|
||||||
|
|
||||||
|
### `nvm.sh`
|
||||||
|
The core functionality file containing:
|
||||||
|
- Main `nvm()` function (starts around line 3000)
|
||||||
|
- All internal helper functions (prefixed with `nvm_`)
|
||||||
|
- Command implementations for install, use, ls, etc.
|
||||||
|
- Shell compatibility logic
|
||||||
|
- POSIX compliance utilities
|
||||||
|
|
||||||
|
### `install.sh`
|
||||||
|
Handles nvm installation via curl/wget/git:
|
||||||
|
- Downloads nvm from GitHub
|
||||||
|
- Sets up directory structure
|
||||||
|
- Configures shell integration
|
||||||
|
- Supports both git clone and script download methods
|
||||||
|
|
||||||
|
### `nvm-exec`
|
||||||
|
Simple wrapper script that:
|
||||||
|
- Sources nvm.sh with `--no-use` flag
|
||||||
|
- Switches to specified Node version via `NODE_VERSION` env var or `.nvmrc`
|
||||||
|
- Executes the provided command with that Node version
|
||||||
|
|
||||||
|
## Top-Level nvm Commands and Internal Functions
|
||||||
|
|
||||||
|
### Core Commands
|
||||||
|
|
||||||
|
#### `nvm install [version]`
|
||||||
|
- **Internal functions**: `nvm_install_binary()`, `nvm_install_source()`, `nvm_download_artifact()`
|
||||||
|
- Downloads and installs specified Node.js version
|
||||||
|
- Automatically `nvm use`s that version after installation
|
||||||
|
- Supports LTS versions, version ranges, and built-in aliases (like `node`, `stable`) and user-defined aliases
|
||||||
|
- Can install from binary or compile from source
|
||||||
|
- When compiling from source, accepts additional arguments that are passed to the compilation task
|
||||||
|
|
||||||
|
#### `nvm use [version]`
|
||||||
|
- **Internal functions**: `nvm_resolve_alias()`, `nvm_version_path()`, `nvm_change_path()`
|
||||||
|
- Switches current shell to use specified Node.js version
|
||||||
|
- Updates PATH environment variable
|
||||||
|
- Supports `.nvmrc` file integration
|
||||||
|
|
||||||
|
#### `nvm ls [pattern]`
|
||||||
|
- **Internal functions**: `nvm_ls()`, `nvm_tree_contains_path()`
|
||||||
|
- Lists installed Node.js versions
|
||||||
|
- Supports pattern matching and filtering
|
||||||
|
- Shows current version and aliases
|
||||||
|
|
||||||
|
#### `nvm ls-remote [pattern]`
|
||||||
|
- **Internal functions**: `nvm_ls_remote()`, `nvm_download()`, `nvm_ls_remote_index_tab()`
|
||||||
|
- Lists available Node.js versions from nodejs.org and iojs.org, or the env-var-configured mirrors
|
||||||
|
- Supports LTS filtering and pattern matching
|
||||||
|
- Downloads version index on-demand
|
||||||
|
|
||||||
|
#### `nvm alias [name] [version]`
|
||||||
|
- **Internal functions**: `nvm_alias()`, `nvm_alias_path()`
|
||||||
|
- Creates text files containing the mapped version, named as the alias name
|
||||||
|
- Special aliases: `default`, `node`, `iojs`, `stable`, `unstable` (note: `stable` and `unstable` are deprecated, from node's pre-v1 release plan)
|
||||||
|
- Stored in `$NVM_DIR/alias/` directory
|
||||||
|
|
||||||
|
#### `nvm current`
|
||||||
|
- **Internal functions**: `nvm_ls_current()`
|
||||||
|
- Shows currently active Node.js version
|
||||||
|
- Returns "system" if using system Node.js
|
||||||
|
|
||||||
|
#### `nvm which [version]`
|
||||||
|
- **Internal functions**: `nvm_version_path()`, `nvm_resolve_alias()`
|
||||||
|
- Shows path to specified Node.js version
|
||||||
|
- Resolves aliases and version strings
|
||||||
|
|
||||||
|
### Utility Commands
|
||||||
|
|
||||||
|
#### `nvm cache clear|dir`
|
||||||
|
- Cache management for downloaded binaries and source code
|
||||||
|
- Clears or shows cache directory path
|
||||||
|
|
||||||
|
#### `nvm debug`
|
||||||
|
- Diagnostic information for troubleshooting
|
||||||
|
- Shows environment, tool versions, and paths
|
||||||
|
|
||||||
|
#### `nvm deactivate`
|
||||||
|
- Removes nvm modifications from current shell
|
||||||
|
- Restores original PATH
|
||||||
|
|
||||||
|
#### `nvm unload`
|
||||||
|
- Completely removes nvm from shell environment
|
||||||
|
- Unsets all nvm functions and variables
|
||||||
|
|
||||||
|
### Internal Function Categories
|
||||||
|
|
||||||
|
#### Version Resolution
|
||||||
|
- `nvm_resolve_alias()` - Resolves aliases to version numbers
|
||||||
|
- `nvm_version()` - Finds best matching local version
|
||||||
|
- `nvm_remote_version()` - Finds best matching remote version
|
||||||
|
- `nvm_normalize_version()` - Standardizes version strings
|
||||||
|
- `nvm_version_greater()` - Compares version numbers
|
||||||
|
- `nvm_version_greater_than_or_equal_to()` - Version comparison with equality
|
||||||
|
- `nvm_get_latest()` - Gets latest version from a list
|
||||||
|
|
||||||
|
#### Installation Helpers
|
||||||
|
- `nvm_install_binary()` - Downloads and installs precompiled binaries
|
||||||
|
- `nvm_install_source()` - Compiles Node.js from source
|
||||||
|
- `nvm_download_artifact()` - Downloads tarballs or binaries
|
||||||
|
- `nvm_compute_checksum()` - Verifies download integrity
|
||||||
|
- `nvm_checksum()` - Checksum verification wrapper
|
||||||
|
- `nvm_get_mirror()` - Gets appropriate download mirror
|
||||||
|
- `nvm_get_arch()` - Determines system architecture
|
||||||
|
|
||||||
|
#### Path Management
|
||||||
|
- `nvm_change_path()` - Updates PATH for version switching
|
||||||
|
- `nvm_strip_path()` - Removes nvm paths from PATH
|
||||||
|
- `nvm_version_path()` - Gets installation path for version
|
||||||
|
- `nvm_version_dir()` - Gets version directory name
|
||||||
|
- `nvm_prepend_path()` - Safely prepends to PATH
|
||||||
|
|
||||||
|
#### Shell Detection and Compatibility
|
||||||
|
- `nvm_is_zsh()` - Shell detection for zsh
|
||||||
|
- `nvm_is_iojs_version()` - Checks if version is io.js
|
||||||
|
- `nvm_get_os()` - Operating system detection
|
||||||
|
- `nvm_supports_source_options()` - Checks if shell supports source options
|
||||||
|
|
||||||
|
#### Network and Remote Operations
|
||||||
|
- `nvm_download()` - Generic download function
|
||||||
|
- `nvm_ls_remote()` - Lists remote versions
|
||||||
|
- `nvm_ls_remote_iojs()` - Lists remote io.js versions
|
||||||
|
- `nvm_ls_remote_index_tab()` - Parses remote version index
|
||||||
|
|
||||||
|
#### Utility Functions
|
||||||
|
- `nvm_echo()`, `nvm_err()` - Output functions
|
||||||
|
- `nvm_has()` - Checks if command exists
|
||||||
|
- `nvm_sanitize_path()` - Cleans sensitive data from paths
|
||||||
|
- `nvm_die_on_prefix()` - Validates npm prefix settings
|
||||||
|
- `nvm_ensure_default_set()` - Ensures default alias is set
|
||||||
|
- `nvm_auto()` - Automatic version switching from .nvmrc
|
||||||
|
|
||||||
|
#### Alias Management
|
||||||
|
- `nvm_alias()` - Creates or lists aliases
|
||||||
|
- `nvm_alias_path()` - Gets path to alias file
|
||||||
|
- `nvm_unalias()` - Removes aliases
|
||||||
|
- `nvm_resolve_local_alias()` - Resolves local aliases
|
||||||
|
|
||||||
|
#### Listing and Display
|
||||||
|
- `nvm_ls()` - Lists local versions
|
||||||
|
- `nvm_ls_current()` - Shows current version
|
||||||
|
- `nvm_tree_contains_path()` - Checks if path is in nvm tree
|
||||||
|
- `nvm_format_version()` - Formats version display
|
||||||
|
|
||||||
|
## Running Tests
|
||||||
|
|
||||||
|
### Test Framework
|
||||||
|
nvm uses the [urchin](https://www.npmjs.com/package/urchin) test framework for shell script testing.
|
||||||
|
|
||||||
|
### Test Structure
|
||||||
|
```
|
||||||
|
test/
|
||||||
|
├── fast/ # Quick unit tests
|
||||||
|
├── slow/ # Integration tests
|
||||||
|
├── sourcing/ # Shell sourcing tests
|
||||||
|
├── install_script/ # Installation script tests
|
||||||
|
├── installation_node/ # Node installation tests
|
||||||
|
├── installation_iojs/ # io.js installation tests
|
||||||
|
└── common.sh # Shared test utilities
|
||||||
|
```
|
||||||
|
|
||||||
|
### Running Tests
|
||||||
|
|
||||||
|
#### Install Dependencies
|
||||||
|
```bash
|
||||||
|
npm install # Installs urchin, semver, and replace tools
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Run All Tests
|
||||||
|
```bash
|
||||||
|
npm test # Runs tests in current shell (sh, bash, dash, zsh, ksh)
|
||||||
|
make test # Runs tests in all supported shells (sh, bash, dash, zsh, ksh)
|
||||||
|
make test-sh # Runs tests only in sh
|
||||||
|
make test-bash # Runs tests only in bash
|
||||||
|
make test-dash # Runs tests only in dash
|
||||||
|
make test-zsh # Runs tests only in zsh
|
||||||
|
make test-ksh # Runs tests only in ksh
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Run Specific Test Suites
|
||||||
|
```bash
|
||||||
|
make TEST_SUITE=fast test # Only fast tests
|
||||||
|
make TEST_SUITE=slow test # Only slow tests
|
||||||
|
make SHELLS=bash test # Only bash shell
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Individual Test Execution
|
||||||
|
```bash
|
||||||
|
./test/fast/Unit\ tests/nvm_get_arch # Run single test (WARNING: This will exit/terminate your current shell session)
|
||||||
|
./node_modules/.bin/urchin test/fast/ # Run fast test suite
|
||||||
|
./node_modules/.bin/urchin 'test/fast/Unit tests/nvm_get_arch' # Run single test safely without shell termination
|
||||||
|
./node_modules/.bin/urchin test/slow/ # Run slow test suite
|
||||||
|
./node_modules/.bin/urchin test/sourcing/ # Run sourcing test suite
|
||||||
|
```
|
||||||
|
|
||||||
|
### Test Writing Guidelines
|
||||||
|
- Tests should work across all supported shells (sh, bash, dash, zsh, ksh)
|
||||||
|
- Define and use a `die()` function for test failures
|
||||||
|
- Clean up after tests in cleanup functions
|
||||||
|
- Mock external dependencies when needed
|
||||||
|
- Place mocks in `test/mocks/` directory
|
||||||
|
- Mock files should only be updated by the existing `update_test_mocks.sh` script, and any new mocks must be added to this script
|
||||||
|
|
||||||
|
## Shell Environment Setup
|
||||||
|
|
||||||
|
### Supported Shells
|
||||||
|
- **bash** - Full feature support
|
||||||
|
- **zsh** - Full feature support
|
||||||
|
- **dash** - Basic POSIX support
|
||||||
|
- **sh** - Basic POSIX support
|
||||||
|
- **ksh** - Limited support (experimental)
|
||||||
|
|
||||||
|
### Installing Shell Environments
|
||||||
|
|
||||||
|
#### Ubuntu/Debian
|
||||||
|
```bash
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install bash zsh dash ksh
|
||||||
|
# sh is typically provided by dash or bash and is available by default
|
||||||
|
```
|
||||||
|
|
||||||
|
#### macOS
|
||||||
|
```bash
|
||||||
|
# bash and zsh are available by default, bash is not the default shell for new user accounts
|
||||||
|
# Install other shells via Homebrew
|
||||||
|
brew install dash ksh
|
||||||
|
# For actual POSIX sh (not bash), install mksh which provides a true POSIX sh
|
||||||
|
brew install mksh
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Manual Shell Testing
|
||||||
|
```bash
|
||||||
|
# Test in specific shell
|
||||||
|
bash -c "source nvm.sh && nvm --version"
|
||||||
|
zsh -c "source nvm.sh && nvm --version"
|
||||||
|
dash -c ". nvm.sh && nvm --version"
|
||||||
|
sh -c ". nvm.sh && nvm --version" # On macOS: mksh -c ". nvm.sh && nvm --version"
|
||||||
|
ksh -c ". nvm.sh && nvm --version"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Shell-Specific Considerations
|
||||||
|
- **zsh**: Requires basically any non-default zsh option to be temporarily unset to restore POSIX compliance
|
||||||
|
- **dash**: Limited feature set, avoid bash-specific syntax
|
||||||
|
- **ksh**: Some features may not work, primarily for compatibility testing
|
||||||
|
|
||||||
|
## CI Environment Details
|
||||||
|
|
||||||
|
### GitHub Actions Workflows
|
||||||
|
|
||||||
|
#### `.github/workflows/tests.yml`
|
||||||
|
- Runs test suite across multiple shells and test suites
|
||||||
|
- Uses `script` command for proper TTY simulation
|
||||||
|
- Matrix strategy covers shell × test suite combinations
|
||||||
|
- Excludes install_script tests from non-bash shells
|
||||||
|
|
||||||
|
#### `.github/workflows/shellcheck.yml`
|
||||||
|
- Lints all shell scripts using shellcheck
|
||||||
|
- Tests against multiple shell targets (bash, sh, dash, ksh)
|
||||||
|
- Note: zsh is not included due to [shellcheck limitations](https://github.com/koalaman/shellcheck/issues/809)
|
||||||
|
- Uses Homebrew to install latest shellcheck version
|
||||||
|
|
||||||
|
#### `.github/workflows/lint.yml`
|
||||||
|
- Runs additional linting and formatting checks
|
||||||
|
- Validates documentation and code style
|
||||||
|
|
||||||
|
### Travis CI (Legacy)
|
||||||
|
- Configured in `.travis.yml`
|
||||||
|
- Tests on multiple Ubuntu versions
|
||||||
|
- Installs shell environments via apt packages
|
||||||
|
|
||||||
|
### CI Test Execution
|
||||||
|
```bash
|
||||||
|
# Simulate CI environment locally
|
||||||
|
unset TRAVIS_BUILD_DIR # Disable Travis-specific logic
|
||||||
|
unset GITHUB_ACTIONS # Disable GitHub Actions logic
|
||||||
|
make test
|
||||||
|
```
|
||||||
|
|
||||||
|
## Setting Up shellcheck Locally
|
||||||
|
|
||||||
|
### Installation
|
||||||
|
|
||||||
|
#### macOS (Homebrew)
|
||||||
|
```bash
|
||||||
|
brew install shellcheck
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Ubuntu/Debian
|
||||||
|
```bash
|
||||||
|
sudo apt-get install shellcheck
|
||||||
|
```
|
||||||
|
|
||||||
|
#### From Source
|
||||||
|
```bash
|
||||||
|
# Download from https://github.com/koalaman/shellcheck/releases
|
||||||
|
wget https://github.com/koalaman/shellcheck/releases/download/latest/shellcheck-latest.linux.x86_64.tar.xz
|
||||||
|
tar -xf shellcheck-latest.linux.x86_64.tar.xz
|
||||||
|
sudo cp shellcheck-latest/shellcheck /usr/local/bin/
|
||||||
|
```
|
||||||
|
|
||||||
|
### Usage
|
||||||
|
|
||||||
|
#### Lint Main Files
|
||||||
|
```bash
|
||||||
|
shellcheck -s bash nvm.sh
|
||||||
|
shellcheck -s bash install.sh
|
||||||
|
shellcheck -s bash nvm-exec
|
||||||
|
shellcheck -s bash bash_completion
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Lint Across Shell Types
|
||||||
|
```bash
|
||||||
|
shellcheck -s sh nvm.sh # POSIX sh
|
||||||
|
shellcheck -s bash nvm.sh # Bash extensions
|
||||||
|
shellcheck -s dash nvm.sh # Dash compatibility
|
||||||
|
shellcheck -s ksh nvm.sh # Ksh compatibility
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Common shellcheck Directives in nvm
|
||||||
|
- `# shellcheck disable=SC2039` - Allow bash extensions in POSIX mode
|
||||||
|
- `# shellcheck disable=SC2016` - Allow literal `$` in single quotes
|
||||||
|
- `# shellcheck disable=SC2001` - Allow sed usage instead of parameter expansion
|
||||||
|
- `# shellcheck disable=SC3043` - Allow `local` keyword (bash extension)
|
||||||
|
|
||||||
|
### Fixing shellcheck Issues
|
||||||
|
1. **Quoting**: Always quote variables: `"${VAR}"` instead of `$VAR`
|
||||||
|
2. **POSIX compliance**: Avoid bash-specific features in portable sections
|
||||||
|
3. **Array usage**: Use `set --` for positional parameters instead of arrays, which are not supported in POSIX
|
||||||
|
4. **Local variables**: Declared with `local FOO` and then initialized on the next line (the latter is for ksh support)
|
||||||
|
|
||||||
|
## Development Best Practices
|
||||||
|
|
||||||
|
### Code Style
|
||||||
|
- Use 2-space indentation
|
||||||
|
- Follow POSIX shell guidelines for portability
|
||||||
|
- Prefix internal functions with `nvm_`
|
||||||
|
- Use `nvm_echo` instead of `echo` for output
|
||||||
|
- Use `nvm_err` for error messages
|
||||||
|
|
||||||
|
### Compatibility
|
||||||
|
- Test changes across all supported shells
|
||||||
|
- Avoid bash-specific features in core functionality
|
||||||
|
- Use `nvm_is_zsh` to check when zsh-specific behavior is needed
|
||||||
|
- Mock external dependencies in tests
|
||||||
|
|
||||||
|
### Performance
|
||||||
|
- Cache expensive operations (like remote version lists)
|
||||||
|
- Use local variables to avoid scope pollution
|
||||||
|
- Minimize subprocess calls where possible
|
||||||
|
- Implement lazy loading for optional features
|
||||||
|
|
||||||
|
### Debugging
|
||||||
|
- Use `nvm debug` command for environment information
|
||||||
|
- Enable verbose output with `set -x` during development
|
||||||
|
- Test with `NVM_DEBUG=1` environment variable
|
||||||
|
- Check `$NVM_DIR/.cache` for cached data issues
|
||||||
|
|
||||||
|
## Common Gotchas
|
||||||
|
|
||||||
|
1. **PATH modification**: nvm modifies PATH extensively; be careful with restoration
|
||||||
|
2. **Shell sourcing**: nvm must be sourced, not executed as a script
|
||||||
|
3. **Version resolution**: Aliases, partial versions, and special keywords interact complexly
|
||||||
|
4. **Platform differences**: Handle differences between Linux, macOS, and other Unix systems
|
||||||
|
5. **Network dependencies**: Many operations require internet access for version lists
|
||||||
|
6. **Concurrent access**: Multiple shells can conflict when installing versions simultaneously
|
||||||
|
|
||||||
|
## Windows Support
|
||||||
|
|
||||||
|
nvm works on Windows via several compatibility layers:
|
||||||
|
|
||||||
|
### WSL2 (Windows Subsystem for Linux)
|
||||||
|
- Full nvm functionality available
|
||||||
|
- **Important**: Ensure you're using WSL2, not WSL1 - see [Microsoft's WSL2 installation guide](https://docs.microsoft.com/en-us/windows/wsl/install) for up-to-date instructions
|
||||||
|
- Install Ubuntu or other Linux distribution from Microsoft Store
|
||||||
|
- Follow Linux installation instructions within WSL2
|
||||||
|
|
||||||
|
### Cygwin
|
||||||
|
- POSIX-compatible environment for Windows
|
||||||
|
- Download Cygwin from [cygwin.com](https://www.cygwin.com/install.html) and run the installer
|
||||||
|
- During installation, include these packages: bash, curl, git, tar, and wget
|
||||||
|
- May require additional PATH configuration
|
||||||
|
|
||||||
|
### Git Bash (MSYS2)
|
||||||
|
- Comes with Git for Windows
|
||||||
|
- Limited functionality compared to full Linux environment
|
||||||
|
- Some features may not work due to path translation issues, including:
|
||||||
|
- Binary extraction paths may be incorrectly translated
|
||||||
|
- Symlink creation may fail
|
||||||
|
- Some shell-specific features may behave differently
|
||||||
|
- File permissions handling differs from Unix systems
|
||||||
|
|
||||||
|
### Setup Instructions for Windows
|
||||||
|
|
||||||
|
#### WSL2 (recommended)
|
||||||
|
1. Install WSL2 using the official Microsoft guide: https://docs.microsoft.com/en-us/windows/wsl/install
|
||||||
|
2. Install Ubuntu or preferred Linux distribution from Microsoft Store
|
||||||
|
3. Follow standard Linux installation within WSL2
|
||||||
|
|
||||||
|
#### Git Bash
|
||||||
|
1. Install Git for Windows (includes Git Bash) from https://git-scm.com/download/win
|
||||||
|
2. Open Git Bash terminal
|
||||||
|
3. Run nvm installation script
|
||||||
|
|
||||||
|
#### Cygwin
|
||||||
|
1. Download and install Cygwin from https://www.cygwin.com/install.html
|
||||||
|
2. Include bash, curl, git, tar, and wget packages during installation
|
||||||
|
3. Run nvm installation in Cygwin terminal
|
||||||
|
|
||||||
|
This guide should help GitHub Copilot understand the nvm codebase structure, testing procedures, and development environment setup requirements.
|
3
.github/workflows/windows-npm.yml
vendored
3
.github/workflows/windows-npm.yml
vendored
@ -72,8 +72,11 @@ jobs:
|
|||||||
unset npm_config_prefix
|
unset npm_config_prefix
|
||||||
export NVM_INSTALL_GITHUB_REPO="$NVM_INSTALL_GITHUB_REPO"
|
export NVM_INSTALL_GITHUB_REPO="$NVM_INSTALL_GITHUB_REPO"
|
||||||
export NVM_INSTALL_VERSION="$NVM_INSTALL_VERSION"
|
export NVM_INSTALL_VERSION="$NVM_INSTALL_VERSION"
|
||||||
|
export HOME="$(cygpath -u "$USERPROFILE")"
|
||||||
|
|
||||||
|
echo "HOME is $HOME"
|
||||||
curl -fsSLo- "https://raw.githubusercontent.com/${NVM_INSTALL_GITHUB_REPO}/${NVM_INSTALL_VERSION}/install.sh" | bash
|
curl -fsSLo- "https://raw.githubusercontent.com/${NVM_INSTALL_GITHUB_REPO}/${NVM_INSTALL_VERSION}/install.sh" | bash
|
||||||
|
ls -l $HOME/.nvm
|
||||||
. "$HOME/.nvm/nvm.sh"
|
. "$HOME/.nvm/nvm.sh"
|
||||||
nvm install --lts
|
nvm install --lts
|
||||||
|
|
||||||
|
32
README.md
32
README.md
@ -6,7 +6,7 @@
|
|||||||
</a>
|
</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` -->
|
<!-- 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 -->
|
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
|
||||||
@ -104,10 +104,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:
|
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
|
```sh
|
||||||
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.2/install.sh | bash
|
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash
|
||||||
```
|
```
|
||||||
```sh
|
```sh
|
||||||
wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.2/install.sh | bash
|
wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/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 (`~/.bashrc`, `~/.bash_profile`, `~/.zshrc`, or `~/.profile`). If you find the install script is updating the wrong profile file, set the `$PROFILE` env var to the profile file’s path, and then rerun the installation script.
|
Running either of the above commands downloads a script and runs it. The script clones the nvm repository to `~/.nvm`, and attempts to add the source lines from the snippet below to the correct profile file (`~/.bashrc`, `~/.bash_profile`, `~/.zshrc`, or `~/.profile`). If you find the install script is updating the wrong profile file, set the `$PROFILE` env var to the profile file’s path, and then rerun the installation script.
|
||||||
@ -134,7 +134,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.
|
- The installer can use `git`, `curl`, or `wget` to download `nvm`, whichever is available.
|
||||||
|
|
||||||
- You can instruct the installer to not edit your shell config (for example if you already get completions via a [zsh nvm plugin](https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/nvm)) by setting `PROFILE=/dev/null` before running the `install.sh` script. Here's an example one-line command to do that: `PROFILE=/dev/null bash -c 'curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.2/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.3/install.sh | bash'`
|
||||||
|
|
||||||
#### Installing in Docker
|
#### Installing in Docker
|
||||||
|
|
||||||
@ -150,7 +150,7 @@ RUN touch "${BASH_ENV}"
|
|||||||
RUN echo '. "${BASH_ENV}"' >> ~/.bashrc
|
RUN echo '. "${BASH_ENV}"' >> ~/.bashrc
|
||||||
|
|
||||||
# Download and install nvm
|
# Download and install nvm
|
||||||
RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.2/install.sh | PROFILE="${BASH_ENV}" bash
|
RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | PROFILE="${BASH_ENV}" bash
|
||||||
RUN echo node > .nvmrc
|
RUN echo node > .nvmrc
|
||||||
RUN nvm install
|
RUN nvm install
|
||||||
```
|
```
|
||||||
@ -168,7 +168,7 @@ ARG NODE_VERSION=20
|
|||||||
RUN apt update && apt install curl -y
|
RUN apt update && apt install curl -y
|
||||||
|
|
||||||
# install nvm
|
# install nvm
|
||||||
RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.2/install.sh | bash
|
RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash
|
||||||
|
|
||||||
# set env
|
# set env
|
||||||
ENV NVM_DIR=/root/.nvm
|
ENV NVM_DIR=/root/.nvm
|
||||||
@ -194,7 +194,7 @@ After creation of the image you can start container interactively and run comman
|
|||||||
docker run --rm -it nvmimage
|
docker run --rm -it nvmimage
|
||||||
|
|
||||||
root@0a6b5a237c14:/# nvm -v
|
root@0a6b5a237c14:/# nvm -v
|
||||||
0.40.2
|
0.40.3
|
||||||
|
|
||||||
root@0a6b5a237c14:/# node -v
|
root@0a6b5a237c14:/# node -v
|
||||||
v19.9.0
|
v19.9.0
|
||||||
@ -257,7 +257,7 @@ You can use a task:
|
|||||||
```yaml
|
```yaml
|
||||||
- name: Install nvm
|
- name: Install nvm
|
||||||
ansible.builtin.shell: >
|
ansible.builtin.shell: >
|
||||||
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.2/install.sh | bash
|
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash
|
||||||
args:
|
args:
|
||||||
creates: "{{ ansible_env.HOME }}/.nvm/nvm.sh"
|
creates: "{{ ansible_env.HOME }}/.nvm/nvm.sh"
|
||||||
```
|
```
|
||||||
@ -319,7 +319,7 @@ If you have `git` installed (requires git v1.7.10+):
|
|||||||
|
|
||||||
1. clone this repo in the root of your user profile
|
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`
|
- `cd ~/` from anywhere then `git clone https://github.com/nvm-sh/nvm.git .nvm`
|
||||||
1. `cd ~/.nvm` and check out the latest version with `git checkout v0.40.2`
|
1. `cd ~/.nvm` and check out the latest version with `git checkout v0.40.3`
|
||||||
1. activate `nvm` by sourcing it from your shell: `. ./nvm.sh`
|
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:
|
Now add these lines to your `~/.bashrc`, `~/.profile`, or `~/.zshrc` file to have it automatically sourced upon login:
|
||||||
@ -925,13 +925,13 @@ If installing nvm on Alpine Linux *is* still what you want or need to do, you sh
|
|||||||
### Alpine Linux 3.13+
|
### Alpine Linux 3.13+
|
||||||
```sh
|
```sh
|
||||||
apk add -U curl bash ca-certificates openssl ncurses coreutils python3 make gcc g++ libgcc linux-headers grep util-linux binutils findutils
|
apk add -U curl bash ca-certificates openssl ncurses coreutils python3 make gcc g++ libgcc linux-headers grep util-linux binutils findutils
|
||||||
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.2/install.sh | bash
|
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash
|
||||||
```
|
```
|
||||||
|
|
||||||
### Alpine Linux 3.5 - 3.12
|
### Alpine Linux 3.5 - 3.12
|
||||||
```sh
|
```sh
|
||||||
apk add -U curl bash ca-certificates openssl ncurses coreutils python2 make gcc g++ libgcc linux-headers grep util-linux binutils findutils
|
apk add -U curl bash ca-certificates openssl ncurses coreutils python2 make gcc g++ libgcc linux-headers grep util-linux binutils findutils
|
||||||
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.2/install.sh | bash
|
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/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._
|
_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._
|
||||||
@ -1034,9 +1034,9 @@ You have to make sure that the user directory name in `$HOME` and the user direc
|
|||||||
To change the user directory and/or account name follow the instructions [here](https://support.apple.com/en-us/HT201548)
|
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
|
[1]: https://github.com/nvm-sh/nvm.git
|
||||||
[2]: https://github.com/nvm-sh/nvm/blob/v0.40.2/install.sh
|
[2]: https://github.com/nvm-sh/nvm/blob/v0.40.3/install.sh
|
||||||
[3]: https://app.travis-ci.com/nvm-sh/nvm
|
[3]: https://app.travis-ci.com/nvm-sh/nvm
|
||||||
[4]: https://github.com/nvm-sh/nvm/releases/tag/v0.40.2
|
[4]: https://github.com/nvm-sh/nvm/releases/tag/v0.40.3
|
||||||
[Urchin]: https://git.sdf.org/tlevine/urchin
|
[Urchin]: https://git.sdf.org/tlevine/urchin
|
||||||
[Fish]: https://fishshell.com
|
[Fish]: https://fishshell.com
|
||||||
|
|
||||||
@ -1094,7 +1094,7 @@ Here's what you will need to do:
|
|||||||
If one of these broken versions is installed on your system, the above step will likely still succeed even if you didn't include the `--shared-zlib` flag.
|
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.
|
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.
|
If you want to avoid the possible hassle of dealing with this, include that flag.
|
||||||
For more details, see [this issue](https://github.com/nodejs/node/issues/39313) and [this comment](https://github.com/nodejs/node/issues/39313#issuecomment-90.40.276)
|
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.376)
|
||||||
|
|
||||||
- Exit back to your native shell.
|
- Exit back to your native shell.
|
||||||
|
|
||||||
@ -1121,7 +1121,7 @@ Now you should be able to use node as usual.
|
|||||||
If you've encountered this error on WSL-2:
|
If you've encountered this error on WSL-2:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.2/install.sh | bash
|
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash
|
||||||
% Total % Received % Xferd Average Speed Time Time Time Current
|
% Total % Received % Xferd Average Speed Time Time Time Current
|
||||||
Dload Upload Total Spent Left Speed
|
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
|
0 0 0 0 0 0 0 0 --:--:-- 0:00:09 --:--:-- 0curl: (6) Could not resolve host: raw.githubusercontent.com
|
||||||
@ -1156,7 +1156,7 @@ Currently, the sole maintainer is [@ljharb](https://github.com/ljharb) - more ma
|
|||||||
|
|
||||||
## Project Support
|
## Project Support
|
||||||
|
|
||||||
Only the latest version (v0.40.2 at this time) is supported.
|
Only the latest version (v0.40.3 at this time) is supported.
|
||||||
|
|
||||||
## Enterprise Support
|
## Enterprise Support
|
||||||
|
|
||||||
|
@ -33,7 +33,7 @@ nvm_install_dir() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
nvm_latest_version() {
|
nvm_latest_version() {
|
||||||
nvm_echo "v0.40.2"
|
nvm_echo "v0.40.3"
|
||||||
}
|
}
|
||||||
|
|
||||||
nvm_profile_is_bash_or_zsh() {
|
nvm_profile_is_bash_or_zsh() {
|
||||||
|
16
nvm.sh
16
nvm.sh
@ -356,19 +356,19 @@ 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
|
local NVM_IS_20_17_OR_ABOVE
|
||||||
NVM_IS_20_17_or_ABOVE=0
|
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
|
if [ $NVM_IS_20_5_OR_ABOVE -eq 1 ] && nvm_version_greater_than_or_equal_to "${NODE_VERSION}" 20.17.0; then
|
||||||
NVM_IS_20_17_or_ABOVE=1
|
NVM_IS_20_17_OR_ABOVE=1
|
||||||
fi
|
fi
|
||||||
local NVM_IS_21_OR_ABOVE
|
local NVM_IS_21_OR_ABOVE
|
||||||
NVM_IS_21_OR_ABOVE=0
|
NVM_IS_21_OR_ABOVE=0
|
||||||
if [ $NVM_IS_20_17_or_ABOVE -eq 1 ] && nvm_version_greater 21.0.0 "${NODE_VERSION}"; then
|
if [ $NVM_IS_20_17_OR_ABOVE -eq 1 ] && nvm_version_greater_than_or_equal_to "${NODE_VERSION}" 21.0.0; then
|
||||||
NVM_IS_21_OR_ABOVE=1
|
NVM_IS_21_OR_ABOVE=1
|
||||||
fi
|
fi
|
||||||
local NVM_IS_22_9_OR_ABOVE
|
local NVM_IS_22_9_OR_ABOVE
|
||||||
NVM_IS_22_9_OR_ABOVE=0
|
NVM_IS_22_9_OR_ABOVE=0
|
||||||
if [ $NVM_IS_21_OR_ABOVE -eq 1 ] && nvm_version_greater 22.9.0 "${NODE_VERSION}"; then
|
if [ $NVM_IS_21_OR_ABOVE -eq 1 ] && nvm_version_greater_than_or_equal_to "${NODE_VERSION}" 22.9.0; then
|
||||||
NVM_IS_22_9_OR_ABOVE=1
|
NVM_IS_22_9_OR_ABOVE=1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@ -420,7 +420,7 @@ nvm_install_latest_npm() {
|
|||||||
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 \
|
elif \
|
||||||
[ $NVM_IS_20_17_or_ABOVE -eq 0 ] \
|
[ $NVM_IS_20_17_OR_ABOVE -eq 0 ] \
|
||||||
|| { [ $NVM_IS_21_OR_ABOVE -eq 1 ] && [ $NVM_IS_22_9_OR_ABOVE -eq 0 ]; } \
|
|| { [ $NVM_IS_21_OR_ABOVE -eq 1 ] && [ $NVM_IS_22_9_OR_ABOVE -eq 0 ]; } \
|
||||||
; then
|
; then
|
||||||
nvm_echo '* `npm` `v10.x` is the last version that works on `node` `< v20.17`, `v21`, or `v22.0` - `v22.8`'
|
nvm_echo '* `npm` `v10.x` is the last version that works on `node` `< v20.17`, `v21`, or `v22.0` - `v22.8`'
|
||||||
@ -4438,7 +4438,7 @@ nvm() {
|
|||||||
NVM_VERSION_ONLY=true NVM_LTS="${NVM_LTS-}" nvm_remote_version "${PATTERN:-node}"
|
NVM_VERSION_ONLY=true NVM_LTS="${NVM_LTS-}" nvm_remote_version "${PATTERN:-node}"
|
||||||
;;
|
;;
|
||||||
"--version" | "-v")
|
"--version" | "-v")
|
||||||
nvm_echo '0.40.2'
|
nvm_echo '0.40.3'
|
||||||
;;
|
;;
|
||||||
"unload")
|
"unload")
|
||||||
nvm deactivate >/dev/null 2>&1
|
nvm deactivate >/dev/null 2>&1
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "nvm",
|
"name": "nvm",
|
||||||
"version": "0.40.2",
|
"version": "0.40.3",
|
||||||
"description": "Node Version Manager - Simple bash script to manage multiple active node.js versions",
|
"description": "Node Version Manager - Simple bash script to manage multiple active node.js versions",
|
||||||
"directories": {
|
"directories": {
|
||||||
"test": "test"
|
"test": "test"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user