this repo has no description
at main 57 lines 1.6 kB view raw
1import { arch, platform } from 'node:os' 2 3export interface PlatformInfo { 4 platform: string 5 arch: string 6 combined: string 7} 8 9export function getPlatformInfo(): PlatformInfo { 10 const p = platform() 11 const a = arch() 12 13 return { 14 platform: p, 15 arch: a, 16 combined: `${p}-${a}`, 17 } 18} 19 20export function matchAssetName(assetName: string, platformInfo: PlatformInfo): boolean { 21 const name = assetName.toLowerCase() 22 const { platform: p, arch: a } = platformInfo 23 24 // Platform patterns 25 const platformPatterns = { 26 darwin: ['apple-darwin', 'macos', 'darwin', 'apple'], 27 linux: ['linux-gnu', 'linux', 'unknown-linux'], 28 win32: ['windows-msvc', 'windows', 'win64', 'win32', 'pc-windows'], 29 } 30 31 // Architecture patterns 32 const archPatterns = { 33 x64: ['x86_64', 'x64', 'amd64'], 34 arm64: ['aarch64', 'arm64'], 35 arm: ['armv7', 'arm'], 36 } 37 38 const platformMatch = platformPatterns[p as keyof typeof platformPatterns]?.some((pattern) => name.includes(pattern)) 39 const archMatch = archPatterns[a as keyof typeof archPatterns]?.some((pattern) => name.includes(pattern)) 40 41 return Boolean(platformMatch && archMatch) 42} 43 44export function findBestAsset(assets: string[], platformInfo: PlatformInfo): string | null { 45 const matches = assets.filter((asset) => matchAssetName(asset, platformInfo)) 46 47 if (matches.length === 0) return null 48 if (matches.length === 1) return matches[0] 49 50 // Prefer tar.gz over zip on non-Windows 51 if (platformInfo.platform !== 'win32') { 52 const tarGz = matches.find((m) => m.endsWith('.tar.gz')) 53 if (tarGz) return tarGz 54 } 55 56 return matches[0] 57}