Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 4 additions & 9 deletions nvm.sh
Original file line number Diff line number Diff line change
Expand Up @@ -2360,15 +2360,10 @@ nvm_get_download_slug() {
fi
fi

# If running MAC M1 :: Node v14.17.0 was the first version to offer official experimental support:
# https://github.com/nodejs/node/issues/40126 (although binary distributions aren't available until v16)
if \
nvm_version_greater '14.17.0' "${VERSION}" \
|| (nvm_version_greater_than_or_equal_to "${VERSION}" '15.0.0' && nvm_version_greater '16.0.0' "${VERSION}") \
; then
Comment on lines -2363 to -2368
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i'm confused; this means that ^14.17 won't install directly on M* macs anymore.

Copy link
Author

@Rahulbeniwal26119 Rahulbeniwal26119 Nov 17, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @ljharb, the above check is used to set the x64 binary for all Macs running versions < 14.17.0, and for versions between 15 and 16. That’s why versions like 14.21.3 weren’t following this logic.

So either we can download the x64 binary for any version < 16, which would include 14.21.3 or, as you suggested here:

#3588 (comment)

I can add logic first to attempt downloading the ARM binary and use the x64 binary as a fallback. However, if we do this, I would also suggest removing the entire condition:

  if \
    nvm_version_greater '14.17.0' "${VERSION}" \
    || (nvm_version_greater_than_or_equal_to "${VERSION}" '15.0.0' && nvm_version_greater '16.0.0' "${VERSION}") \
  ; then

As we discussed for <16, there are no arm64 binaries. Please let me know which way is right.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

https://nodejs.org/dist/v14.18.0/ seems to have an arm binary listed?

Copy link
Author

@Rahulbeniwal26119 Rahulbeniwal26119 Nov 18, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry, but this condition is for only arm64 + darwin. There is also an inner if condition after this

    if [ "_${NVM_OS}" = '_darwin' ] && [ "${NVM_ARCH}" = 'arm64' ]; then
      NVM_ARCH=x64
    fi

Let me combine these two so that it will be much more readable.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Installation Logs.

➜ nvm git:(fallback-to-x64-for-darwin-node-versions-less-than-16) source ./nvm.sh && nvm install 16.11.0
Downloading and installing node v16.11.0...
Downloading https://nodejs.org/dist/v16.11.0/node-v16.11.0-darwin-arm64.tar.xz...
######################################################################### 100.0%
Computing checksum with sha256sum
Checksums matched!
Now using node v16.11.0 (npm v8.0.0)

➜ nvm git:(fallback-to-x64-for-darwin-node-versions-less-than-16) source ./nvm.sh && nvm install 10.0.0
Downloading and installing node v10.0.0...
Downloading https://nodejs.org/dist/v10.0.0/node-v10.0.0-darwin-x64.tar.xz...
######################################################################### 100.0%
Computing checksum with sha256sum
Checksums matched!
Now using node v10.0.0 (npm v5.6.0)

➜ nvm git:(fallback-to-x64-for-darwin-node-versions-less-than-16) source ./nvm.sh && nvm install 14
Downloading and installing node v14.21.3...
Local cache found: ${NVM_DIR}/.cache/bin/node-v14.21.3-darwin-x64/node-v14.21.3-darwin-x64.tar.xz
Checksums match! Using existing downloaded archive ${NVM_DIR}/.cache/bin/node-v14.21.3-darwin-x64/node-v14.21.3-darwin-x64.tar.xz
Now using node v14.21.3 (npm v6.14.18)

if [ "_${NVM_OS}" = '_darwin' ] && [ "${NVM_ARCH}" = 'arm64' ]; then
NVM_ARCH=x64
fi
# If running MAC M1 :: ARM64 binaries are not available for Node < 16.0.0
# https://github.com/nodejs/node/issues/40126 (binary distributions aren't available until v16)
if nvm_version_greater '16.0.0' "${VERSION}" && [ "_${NVM_OS}" = '_darwin' ] && [ "${NVM_ARCH}" = 'arm64' ]; then
NVM_ARCH=x64
fi

if [ "${KIND}" = 'binary' ]; then
Expand Down
23 changes: 23 additions & 0 deletions test/fast/Unit tests/nvm_get_download_slug
Original file line number Diff line number Diff line change
Expand Up @@ -109,3 +109,26 @@ ACTUAL="$(nvm_get_download_slug iojs source 15.99.99)"
EXPECTED="iojs-15.99.99"
[ "${ACTUAL}" = "${EXPECTED}" ] || die "expected >${EXPECTED}<, got >${ACTUAL}<"


REAL_OS="$(command uname -s 2>/dev/null || echo '')"
REAL_ARCH="$(command uname -m 2>/dev/null || echo '')"
if [ "${REAL_OS}" = "Darwin" ] && [ "${REAL_ARCH}" = "arm64" ]; then
# Node < 16 uses x64 on darwin-arm64
ACTUAL="$(nvm_get_download_slug node binary 14.21.3)"
EXPECTED='node-14.21.3-darwin-x64'
[ "${ACTUAL}" = "${EXPECTED}" ] || die "expected >${EXPECTED}<, got >${ACTUAL}<"
ACTUAL="$(nvm_get_download_slug node binary 15.99.99)"
EXPECTED='node-15.99.99-darwin-x64'
[ "${ACTUAL}" = "${EXPECTED}" ] || die "expected >${EXPECTED}<, got >${ACTUAL}<"
ACTUAL="$(nvm_get_download_slug iojs binary 15.99.99)"
EXPECTED='iojs-15.99.99-darwin-x64'
[ "${ACTUAL}" = "${EXPECTED}" ] || die "expected >${EXPECTED}<, got >${ACTUAL}<"

# Test Node >= 16 uses arm64 on darwin-arm64
ACTUAL="$(nvm_get_download_slug node binary 16.0.0)"
EXPECTED='node-16.0.0-darwin-arm64'
[ "${ACTUAL}" = "${EXPECTED}" ] || die "expected >${EXPECTED}<, got >${ACTUAL}<"
ACTUAL="$(nvm_get_download_slug node binary 18.0.0)"
EXPECTED='node-18.0.0-darwin-arm64'
[ "${ACTUAL}" = "${EXPECTED}" ] || die "expected >${EXPECTED}<, got >${ACTUAL}<"
fi
Loading