From 1c7b439bbeca62e3db845b393df8215c7dba0273 Mon Sep 17 00:00:00 2001 From: Ambar Mutha <83696566+ambar-arkin@users.noreply.github.com> Date: Sat, 20 Aug 2022 18:58:24 +0530 Subject: [PATCH] fix: node<16 download fail on arm chips on macos (#5239) * fix(node.fetcher): node < 16 download fail on apple silicon Add a check for macos apple silicon and required node version < 16. In such case, download x64 binary. Because arm build does not exist. Previous behaviour: Try to download non existing arm build and fail with 404. NO breaking change fixes #4489 * refactor(node.fetcher): move code to normalizeArch --- .changeset/five-ties-add.md | 5 +++++ packages/node.fetcher/src/getNodeTarball.ts | 2 +- packages/node.fetcher/src/normalizeArch.ts | 8 +++++++- .../node.fetcher/test/getNodeTarball.test.ts | 20 +++++++++++++++++++ .../node.fetcher/test/normalizeArch.test.ts | 8 ++++++++ 5 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 .changeset/five-ties-add.md diff --git a/.changeset/five-ties-add.md b/.changeset/five-ties-add.md new file mode 100644 index 0000000000..adfb579300 --- /dev/null +++ b/.changeset/five-ties-add.md @@ -0,0 +1,5 @@ +--- +"@pnpm/node.fetcher": patch +--- + +For node version < 16, install x64 build on darwin arm as arm build is not available. diff --git a/packages/node.fetcher/src/getNodeTarball.ts b/packages/node.fetcher/src/getNodeTarball.ts index 9ec31e6de3..dbc8285df2 100644 --- a/packages/node.fetcher/src/getNodeTarball.ts +++ b/packages/node.fetcher/src/getNodeTarball.ts @@ -7,7 +7,7 @@ export function getNodeTarball ( processArch: string ) { const platform = processPlatform === 'win32' ? 'win' : processPlatform - const arch = normalizeArch(processPlatform, processArch) + const arch = normalizeArch(processPlatform, processArch, nodeVersion) const extension = platform === 'win' ? 'zip' : 'tar.gz' const pkgName = `node-v${nodeVersion}-${platform}-${arch}` return { diff --git a/packages/node.fetcher/src/normalizeArch.ts b/packages/node.fetcher/src/normalizeArch.ts index d93be8a44b..6d681edd48 100644 --- a/packages/node.fetcher/src/normalizeArch.ts +++ b/packages/node.fetcher/src/normalizeArch.ts @@ -1,4 +1,10 @@ -export default function getNormalizedArch (platform: string, arch: string) { +export default function getNormalizedArch (platform: string, arch: string, nodeVersion?: string) { + if (nodeVersion) { + const nodeMajorVersion = +nodeVersion.split('.')[0] + if ((platform === 'darwin' && arch === 'arm64' && (nodeMajorVersion < 16))) { + return 'x64' + } + } if (platform === 'win32' && arch === 'ia32') { return 'x86' } diff --git a/packages/node.fetcher/test/getNodeTarball.test.ts b/packages/node.fetcher/test/getNodeTarball.test.ts index d8aeb67819..98f5deded1 100644 --- a/packages/node.fetcher/test/getNodeTarball.test.ts +++ b/packages/node.fetcher/test/getNodeTarball.test.ts @@ -31,6 +31,26 @@ test.each([ tarball: 'https://nodejs.org/download/release/v16.0.0/node-v16.0.0-linux-x64.tar.gz', }, ], + [ + '15.14.0', + 'https://nodejs.org/download/release/', + 'darwin', + 'arm64', + { + pkgName: 'node-v15.14.0-darwin-x64', + tarball: 'https://nodejs.org/download/release/v15.14.0/node-v15.14.0-darwin-x64.tar.gz', + }, + ], + [ + '16.0.0', + 'https://nodejs.org/download/release/', + 'darwin', + 'arm64', + { + pkgName: 'node-v16.0.0-darwin-arm64', + tarball: 'https://nodejs.org/download/release/v16.0.0/node-v16.0.0-darwin-arm64.tar.gz', + }, + ], ])('getNodeTarball', (version, nodeMirrorBaseUrl, platform, arch, tarball) => { expect(getNodeTarball(version, nodeMirrorBaseUrl, platform, arch)).toStrictEqual(tarball) }) diff --git a/packages/node.fetcher/test/normalizeArch.test.ts b/packages/node.fetcher/test/normalizeArch.test.ts index 71222c234b..267c3648c0 100644 --- a/packages/node.fetcher/test/normalizeArch.test.ts +++ b/packages/node.fetcher/test/normalizeArch.test.ts @@ -7,3 +7,11 @@ test.each([ ])('normalizedArch(%s, %s)', (platform, arch, normalizedArch) => { expect(normalizeArch(platform, arch)).toBe(normalizedArch) }) + +// macos apple silicon +test.each([ + ['darwin', 'arm64', '14.20.0', 'x64'], + ['darwin', 'arm64', '16.17.0', 'arm64'], +])('normalizedArch(%s, %s)', (platform, arch, nodeVersion, normalizedArch) => { + expect(normalizeArch(platform, arch, nodeVersion)).toBe(normalizedArch) +})