this repo has no description
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}