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) +})