@withstudiocms/internal_helpers
Version:
Internal helper utilities for StudioCMS
49 lines (48 loc) • 1.68 kB
JavaScript
import fs from "node:fs";
import { jsonParse } from "../utils/jsonUtils.js";
async function getLatestVersion(packageName, logger, cacheJsonFile, isDevMode, io = fs) {
let cacheData = {};
if (isDevMode && cacheJsonFile) {
try {
const file = io.readFileSync(cacheJsonFile, { encoding: "utf-8" });
cacheData = jsonParse(file) ?? {};
} catch (err) {
if (!err?.code?.includes("ENOENT")) {
logger?.warn?.(`Ignoring cache read error for ${cacheJsonFile}: ${err.message}`);
}
}
if (cacheData.latestVersionCheck?.lastChecked && new Date(cacheData.latestVersionCheck.lastChecked).getTime() > new Date(Date.now() - 60 * 60 * 1e3).getTime()) {
return cacheData.latestVersionCheck.version;
}
}
try {
const ac = new AbortController();
const t = setTimeout(() => ac.abort(), 5e3);
const response = await fetch(`https://registry.npmjs.org/${packageName}/latest`, {
signal: ac.signal
});
clearTimeout(t);
if (!response.ok) {
logger.warn(`Failed to fetch package info from registry.npmjs.org: ${response.statusText}`);
return null;
}
const data = await response.json();
if (isDevMode && cacheJsonFile) {
const updatedCacheData = {
...cacheData,
latestVersionCheck: {
lastChecked: (/* @__PURE__ */ new Date()).toISOString(),
version: data.version
}
};
io.writeFileSync(cacheJsonFile, JSON.stringify(updatedCacheData, null, 2), "utf-8");
}
return data.version;
} catch (error) {
logger.error(`Error fetching latest version of ${packageName}: ${error}`);
return null;
}
}
export {
getLatestVersion
};