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
JavaScript
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