release-installer
Version:
Simple GitHub release installer.
44 lines (43 loc) • 1.5 kB
JavaScript
import { arch, platform } from 'node:os';
export function getPlatformInfo() {
const p = platform();
const a = arch();
return {
platform: p,
arch: a,
combined: `${p}-${a}`,
};
}
export function matchAssetName(assetName, platformInfo) {
const name = assetName.toLowerCase();
const { platform: p, arch: a } = platformInfo;
// Platform patterns
const platformPatterns = {
darwin: ['apple-darwin', 'macos', 'darwin', 'apple'],
linux: ['linux-gnu', 'linux', 'unknown-linux'],
win32: ['windows-msvc', 'windows', 'win64', 'win32', 'pc-windows'],
};
// Architecture patterns
const archPatterns = {
x64: ['x86_64', 'x64', 'amd64'],
arm64: ['aarch64', 'arm64'],
arm: ['armv7', 'arm'],
};
const platformMatch = platformPatterns[p]?.some((pattern) => name.includes(pattern));
const archMatch = archPatterns[a]?.some((pattern) => name.includes(pattern));
return Boolean(platformMatch && archMatch);
}
export function findBestAsset(assets, platformInfo) {
const matches = assets.filter((asset) => matchAssetName(asset, platformInfo));
if (matches.length === 0)
return null;
if (matches.length === 1)
return matches[0];
// Prefer tar.gz over zip on non-Windows
if (platformInfo.platform !== 'win32') {
const tarGz = matches.find((m) => m.endsWith('.tar.gz'));
if (tarGz)
return tarGz;
}
return matches[0];
}