UNPKG

igir

Version:

🕹 A zero-setup ROM collection manager that sorts, filters, extracts or archives, patches, and reports on collections of any size on any OS.

89 lines (88 loc) • 2.92 kB
import child_process from "node:child_process"; import fs from "node:fs"; import https from "node:https"; import path from "node:path"; import util from "node:util"; import chalk from "chalk"; import semver from "semver"; import terminalLink from "terminal-link"; import which from "which"; import { logger } from "../console/logger.js"; import Package from "../globals/package.js"; import BufferUtil from "../utils/bufferUtil.js"; class UpdateChecker { /** * Check for a newer version and log if one is found. */ async check() { let npmVersion; try { npmVersion = await UpdateChecker.getVersion(Package.NAME); } catch { return; } if (npmVersion && semver.lt(Package.VERSION, npmVersion)) { let message = `An update is available, get v${npmVersion}`; const color = chalk.white; if (await UpdateChecker.isHomebrew()) { message += ` via Homebrew: ${color(`brew upgrade ${Package.NAME}`)}`; } else if (process.versions.bun) { const gitHubUrl = `https://github.com/emmercm/${Package.NAME}/releases/latest`; message += ` on GitHub: ${color(terminalLink(gitHubUrl, gitHubUrl, { fallback: false }))}`; } else if (process.env.npm_command === "exec") { message += ` via npx: ${color(`npx ${Package.NAME}@latest`)}`; } else { message += ` via npm: ${color(`npm update ${Package.NAME}`)}`; } logger.notice(message); } } static async getVersion(packageName) { return await new Promise((resolve, reject) => { const req = https.get( `https://registry.npmjs.org/${packageName}/latest`, { timeout: 5e3 }, async (res) => { const data = await BufferUtil.fromReadable(res); let json; try { json = JSON.parse(data.toString()); } catch (error) { if (error instanceof Error) { reject(error); } else if (typeof error === "string") { reject(new Error(error)); } else { reject(new Error("failed to get latest version from npmjs.org")); } return; } resolve(json.version); } ); req.on("error", reject).on("timeout", () => { req.destroy(new Error("request timed out")); }); }); } static async isHomebrew() { const brew = await which("brew", { nothrow: true }); if (brew === null) { return false; } try { const brewPrefixOutput = await util.promisify(child_process.execFile)(brew, ["--prefix"]); const brewPrefix = brewPrefixOutput.stdout.trim(); const execPath = await fs.promises.realpath(process.execPath); return execPath.startsWith(path.join(brewPrefix, "bin")); } catch { return false; } } } export { UpdateChecker as default }; //# sourceMappingURL=updateChecker.js.map