UNPKG

grab-github-release

Version:

Downloads and optionally unpacks an archive from GitHub release assets for the current platform.

1 lines 27.3 kB
{"version":3,"file":"index.cjs","sources":["../src/index.js"],"sourcesContent":["import debug from 'debug'\nimport { constants, createWriteStream, promises } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { join, parse } from 'node:path'\nimport { clean, satisfies, valid } from 'semver'\nimport { Readable } from 'node:stream'\nimport { open as openArchive } from 'yauzl'\n\nlet log = debug('grabghr')\nconst { access, chmod, copyFile, mkdir, rm, readdir, rename, unlink } = promises\nconst { arch, env, platform } = process\n\nasync function exists(file) {\n try {\n await access(file, constants.R_OK)\n return true\n } catch (err) {\n /* c8 ignore next */\n if (err.code !== 'ENOENT') throw err\n return false\n }\n}\n\n/* c8 ignore next 6 */\nfunction delay(seconds) {\n if (!seconds) seconds = Math.floor(5 + 5 * Math.random())\n const delay = seconds * 1000\n log('wait %d ms before trying again', delay)\n return new Promise(resolve => setTimeout(resolve, delay))\n}\n\nasync function retry(action) {\n for (let attempt = 0;;) {\n try {\n return await action()\n /* c8 ignore next 7 */\n } catch (err) {\n if (++attempt === 3) throw err\n log('attempt failed: %s', err.message)\n }\n await delay()\n }\n}\n\nfunction fetchSafely(url, token, options = {}) {\n return retry(async () => {\n /* c8 ignore next 8 */\n if (!token) token = process.env.GITHUB_TOKEN || process.env.GH_TOKEN\n if (token) {\n options.headers = {\n Authorization: `Bearer ${token}`,\n ...options.headers\n }\n }\n log('fetch \"%s\"%s', url, token ? ' (authorized)' : '')\n options = {\n 'User-Agent': 'prantlf/grab-github-release',\n 'X-GitHub-Api-Version': '2022-11-28',\n ...options\n }\n const res = await fetch(url, options)\n /* c8 ignore next 38 */\n if (!res.ok) {\n if (res.status === 403 || res.status === 429) {\n const {\n 'retry-after': after,\n 'x-ratelimit-limit': limit,\n 'x-ratelimit-remaining': remaining,\n 'x-ratelimit-used': used,\n 'x-ratelimit-reset': reset,\n 'x-ratelimit-resource': resource\n } = res.headers\n log('Retry first after: %s', after)\n log('The maximum number of requests that you can make per hour: %s', limit)\n log('The number of requests remaining in the current rate limit window: %s', remaining)\n log('The number of requests you have made in the current rate limit window: %s', used)\n log('The time at which the current rate limit window resets, in UTC epoch seconds: %s', reset)\n log('The rate limit resource that the request counted against: %s', resource)\n try {\n const response = await res.text()\n log('%s', response)\n } catch {\n // ignore invalid respose\n }\n const wait = after || reset\n if (wait) {\n await delay(wait)\n }\n } else {\n try {\n const response = await res.text()\n log('%s', response)\n } catch {\n // ignore invalid respose\n }\n }\n const err = new Error(`GET \"${url}\" failed: ${res.status} ${res.statusText}`)\n err.response = res\n throw err\n }\n return res\n })\n}\n\nconst defaultPlatformSuffixes = {\n darwin: ['macos'],\n linux: [],\n win32: ['windows']\n}\n\nconst defaultArchSuffixes = {\n arm64: ['aarch64'],\n riscv64: [],\n x64: ['amd64', 'x86_64', 'x86']\n}\n\nfunction getArchiveSuffixes(platformSuffixes, archSuffixes) {\n /* c8 ignore next 3 */\n const plats = platformSuffixes?.[platform] || defaultPlatformSuffixes[platform] || []\n if (!plats.includes(platform)) plats.push(platform)\n const archs = archSuffixes?.[arch] || defaultArchSuffixes[arch] || []\n if (!archs.includes(arch)) archs.push(arch)\n return plats.flatMap(plat => archs.map(arch => `-${plat}-${arch}.zip`))\n}\n\nfunction getArchiveInfixes(platformSuffixes, archSuffixes) {\n const suffixes = getArchiveSuffixes(platformSuffixes, archSuffixes)\n return suffixes.map(suffix => suffix.slice(0, -4))\n}\n\nasync function getGitHubRelease(name, repo, verspec, platformSuffixes, archSuffixes, token) {\n const suffixes = getArchiveSuffixes(platformSuffixes, archSuffixes)\n const archives = name && suffixes.map(suffix => `${name}${suffix}`)\n const url = `https://api.github.com/repos/${repo}/releases`\n const res = await fetchSafely(url, token)\n const releases = await res.json()\n log('%d releases', releases.length)\n for (const { tag_name, assets } of releases) {\n /* c8 ignore next */\n const version = clean(tag_name) || tag_name\n if (valid(version) && (verspec === 'latest' || satisfies(version, verspec))) {\n log('match \"%s\" (%s)', version, tag_name)\n for (const { name: file, browser_download_url: url } of assets) {\n if (archives) {\n if (archives.includes(file)) {\n log('match \"%s\"', file)\n return { name, version, archive: file, url }\n }\n } else {\n const suffix = suffixes.find(suffix => file.endsWith(suffix))\n if (suffix) {\n log('match by suffix \"%s\"', file)\n const name = file.substring(0, file.length - suffix.length)\n return { name, version, archive: file, url }\n }\n }\n log('skip \"%s\"', file)\n }\n /* c8 ignore next 7 */\n throw new Error(`no suitable archive found for ${version}`)\n }\n log('skip \"%s\" (%s)', version, tag_name)\n }\n throw new Error(`version matching \"${verspec}\" not found`)\n}\n\nfunction parseFileName(archive) {\n const match = /^(.+)-([^-]+)-([^-]+)_((?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[.0-9A-Za-z-]+)?)\\.zip$/.exec(archive)\n if (match) {\n const [, name, plat, arch, version] = match\n return { name, version, archive: `${name}-${plat}-${arch}.zip` }\n }\n}\n\nasync function getCachedRelease(name, repo, verspec, platformSuffixes, archSuffixes) {\n const cacheDir = getCacheDir(repo)\n if (!await exists(cacheDir)) return {}\n const infixes = getArchiveInfixes(platformSuffixes, archSuffixes)\n /* c8 ignore next */\n const archives = name && infixes.map(infix => `${name}${infix}`)\n const pkgs = []\n for (const file of await readdir(cacheDir)) {\n /* c8 ignore next 15 */\n if (archives) {\n if (archives.includes(file)) {\n const pkg = parseFileName(file)\n if (pkg) {\n if (valid(pkg.version) && (verspec === 'latest' || satisfies(pkg.version, verspec))) {\n log('match \"%s\", satisfactory', file)\n pkgs.push(pkg)\n } else {\n log('match \"%s\", unsatisfactory', file)\n }\n } else {\n log('match \"%s\", invalid', file)\n }\n continue\n }\n } else {\n const infix = infixes.find(infix => file.includes(infix))\n if (infix) {\n const pkg = parseFileName(file)\n /* c8 ignore next 2 */\n if (pkg) {\n if (valid(pkg.version) && (verspec === 'latest' || satisfies(pkg.version, verspec))) {\n log('match by infix \"%s\", satisfactory', file)\n pkgs.push(pkg)\n /* c8 ignore next 6 */\n } else {\n log('match by infix \"%s\", unsatisfactory', file)\n }\n } else {\n log('match by infix \"%s\", invalid', file)\n }\n continue\n }\n /* c8 ignore next 3 */\n }\n log('skip \"%s\"', file)\n }\n if (pkgs.length) {\n pkgs.sort((left, right) => compare(left.version, right.version))\n const [pkg] = pkgs\n log('pick \"%s\"', pkg.archive)\n return pkg\n }\n /* c8 ignore next 3 */\n log('nothing picked')\n return {}\n}\n\nfunction getCacheRoot() {\n return join(homedir(), '.cache/grabghr')\n}\n\nfunction getCacheDir(repo) {\n return join(getCacheRoot(), repo.replaceAll('/', '_'))\n}\n\nfunction getCachePath(cacheDir, version, archive) {\n const { ext, name } = parse(archive);\n return join(cacheDir, `${name}_${version}${ext}`)\n}\n\nasync function checkCache(repo, version, archive) {\n const cacheDir = getCacheDir(repo)\n const cachePath = getCachePath(cacheDir, version, archive)\n log('check \"%s\"', cachePath)\n const hasCache = await exists(cachePath)\n return { hasCache, cacheDir, cachePath }\n}\n\nasync function storeCache(cacheDir, cachePath, archivePath, copy) {\n log('ensure \"%s\"', cacheDir)\n await mkdir(cacheDir, { recursive: true })\n if (copy) {\n log('copy \"%s\" to \"%s\"', archivePath, cachePath)\n await copyFile(archivePath, cachePath)\n } else {\n try {\n log('rename \"%s\" to \"%s\"', archivePath, cachePath)\n await rename(archivePath, cachePath)\n /* c8 ignore next 6 */\n } catch {\n log('copy \"%s\" to \"%s\"', archivePath, cachePath)\n await copyFile(archivePath, cachePath)\n log('remove \"%s\"', archivePath)\n await unlink(archivePath)\n }\n }\n}\n\nasync function removeCache(repo) {\n const cacheDir = repo ? getCacheDir(repo) : getCacheRoot()\n log('remove \"%s\"', cacheDir)\n await rm(cacheDir, { recursive: true, force: true })\n}\n\nasync function download(url, archive, token) {\n const res = await fetchSafely(url, token)\n await new Promise((resolve, reject) => {\n const stream = Readable.fromWeb(res.body)\n stream\n .on('error', reject)\n .pipe(createWriteStream(archive))\n .on('finish', () => resolve())\n .on('error', reject)\n })\n}\n\nasync function useCacheOrDownload(repo, version, url, archive, targetDirectory, temporary, cache, token) {\n const archivePath = targetDirectory ? join(targetDirectory, archive) : archive\n if (cache === false) {\n await download(url, archivePath, token)\n return { archivePath, fromCache: false }\n }\n const { hasCache, cacheDir, cachePath } = await checkCache(repo, version, archive)\n if (hasCache && targetDirectory) {\n log('copy \"%s\" to \"%s\"', cachePath, archivePath)\n await copyFile(cachePath, archivePath)\n return { archivePath, fromCache: false }\n }\n if (!hasCache) {\n await download(url, archivePath, token)\n const copy = !temporary || !!targetDirectory\n await storeCache(cacheDir, cachePath, archivePath, copy)\n if (copy) {\n return { archivePath, fromCache: false }\n }\n } else if (!temporary) {\n log('copy \"%s\" to \"%s\"', cachePath, archivePath)\n await copyFile(cachePath, archivePath)\n return { archivePath, fromCache: false }\n }\n return { archivePath: cachePath, fromCache: true }\n}\n\nfunction unpack(archive, targetDirectory) {\n log('unpack \"%s\"', archive)\n return new Promise((resolve, reject) =>\n openArchive(archive, { lazyEntries: true }, (err, zip) => {\n /* c8 ignore next */\n if (err) return reject(err)\n zip\n .on('entry', entry => {\n const { fileName } = entry\n /* c8 ignore next */\n if (fileName.endsWith('/')) return new Error('directory in archive')\n const filePath = targetDirectory ? join(targetDirectory, fileName) : fileName\n log('write \"%s\"', filePath)\n zip.openReadStream(entry, (err, stream) => {\n /* c8 ignore next */\n if (err) return reject(err)\n stream\n .on('error', reject)\n .pipe(createWriteStream(filePath))\n .on('finish', () => resolve(filePath))\n .on('error', reject)\n })\n })\n .on('end', () => reject(new Error('empty archive')))\n .on('error', reject)\n zip.readEntry()\n })\n )\n}\n\nasync function makeExecutable(executable) {\n if (platform !== 'win32') {\n log('make \"%s\" executable', executable)\n await chmod(executable, 0o755)\n }\n}\n\nexport async function grab({ name, repository, version, platformSuffixes, archSuffixes, targetDirectory, unpackExecutable, cache, forceCache, token, verbose }) {\n if (verbose) log = console.log.bind(console)\n if (!version) version = 'latest'\n const verspec = clean(version) || version\n let archive\n let url\n if (forceCache || env.GRABGHR_FORCE_CACHE) {\n ({ name, version, archive } = await getCachedRelease(name, repository, verspec, platformSuffixes, archSuffixes))\n }\n if (!archive) {\n ({ name, version, archive, url } = await getGitHubRelease(name, repository, verspec, platformSuffixes, archSuffixes, token))\n }\n const { archivePath, fromCache } = await useCacheOrDownload(repository, version, url, archive, targetDirectory, unpackExecutable, cache, token)\n if (unpackExecutable) {\n const executable = await unpack(archivePath, targetDirectory)\n await makeExecutable(executable)\n if (!fromCache) {\n log('remove \"%s\"', archivePath)\n await unlink(archivePath)\n }\n return { executable, version }\n }\n return { archive: archivePath, version }\n}\n\nexport async function clearCache({ repository, verbose } = {}) {\n if (verbose) log = console.log.bind(console)\n await removeCache(repository)\n}\n"],"names":["promises","constants","clean","valid","satisfies","join","homedir","parse","Readable","createWriteStream","openArchive"],"mappings":"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"}