UNPKG

@withstudiocms/internal_helpers

Version:

Internal helper utilities for StudioCMS

49 lines (48 loc) 1.68 kB
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 };