From b0fb92471c32194fb16d0b598727d678868656cd Mon Sep 17 00:00:00 2001 From: Shaun Hamilton Date: Wed, 6 May 2026 16:21:49 +0200 Subject: [PATCH] feat(client): add linux arm64 exam download link (#67253) --- .../Challenges/exam-download/show.test.tsx | 20 ++++++++++++++++--- .../Challenges/exam-download/show.tsx | 11 ++++++---- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/client/src/templates/Challenges/exam-download/show.test.tsx b/client/src/templates/Challenges/exam-download/show.test.tsx index bb1462bffb0..d11cb96dea8 100644 --- a/client/src/templates/Challenges/exam-download/show.test.tsx +++ b/client/src/templates/Challenges/exam-download/show.test.tsx @@ -122,11 +122,25 @@ describe('handleDownloadLink', () => { expect(result).toBe('url_x64.exe'); }); - test('normalizes arm64 to arm', () => { - const links = ['url_fake.dmg', 'url_arm.dmg']; + test('normalizes aarch64 to arm64', () => { + const links = ['url_fake.dmg', 'url_aarch64.dmg']; const osState: UserOSState = { os: 'MAC', architecture: 'arm64' }; const result = handleDownloadLink(osState, links); - expect(result).toBe('url_arm.dmg'); + expect(result).toBe('url_aarch64.dmg'); + }); + + test('normalizes arm64 to arm64', () => { + const links = ['url_fake.dmg', 'url_arm64.dmg']; + const osState: UserOSState = { os: 'MAC', architecture: 'arm64' }; + const result = handleDownloadLink(osState, links); + expect(result).toBe('url_arm64.dmg'); + }); + + test('does not normalize arm64 to arm', () => { + const links = ['url_arm.dmg', 'url_arm64.dmg']; + const osState: UserOSState = { os: 'MAC', architecture: 'arm64' }; + const result = handleDownloadLink(osState, links); + expect(result).toBe('url_arm64.dmg'); }); test('normalizes i386 to x86', () => { diff --git a/client/src/templates/Challenges/exam-download/show.tsx b/client/src/templates/Challenges/exam-download/show.tsx index 738bce6eb19..110479a85d9 100644 --- a/client/src/templates/Challenges/exam-download/show.tsx +++ b/client/src/templates/Challenges/exam-download/show.tsx @@ -186,14 +186,15 @@ interface ShowExamDownloadProps { function normalizeArch(name: string): string { const archMatch = name.match( - /(aarch64|arm|arm64|amd64|x86_64|x64|x86|i386|i686)/i + /(aarch64|arm64|arm|amd64|x86_64|x64|x86|i386|i686)/i ); const token = archMatch?.[0]; if (!token) return ''; const t = token.toLowerCase(); - if (/aarch64|arm64|arm/i.test(t)) return 'arm'; + if (/aarch64|arm64/i.test(t)) return 'arm64'; + if (/arm/i.test(t)) return 'arm'; if (/x86_64|x64|amd64/i.test(t)) return 'x64'; if (/x86|i386|i686/i.test(t)) return 'x86'; return t; @@ -441,10 +442,12 @@ function getRecommendedOs({ } as const; const archToHuman: Record = { x64: '64-bit', - aarch64: 'ARM', + aarch64: 'ARM64', + arm64: 'ARM64', amd64: '64-bit', i386: '32-bit', - x86: '32-bit' + x86: '32-bit', + arm: 'ARM' }; const os = Object.entries(osToExt).find(([_, exts]) => exts.includes(ext));