import * as chalk from 'chalk'; import * as fs from 'fs'; import * as os from 'os'; import * as path from 'path'; import * as semver from 'semver'; import { ManifestDefinition } from 'oo-cli/dist/types/manifest'; import { TerminalOutput } from './TerminalOutput'; import { TerminalConfirm } from './TerminalConfirm'; import { TerminalPassthru } from './TeminalPassthru'; interface LastCheck { date: Date; upToDate: boolean; } const LAST_VERSION_CHECK_FILE = '.lastcheck'; const _24hours = 24 * 60 * 60 * 1000; export async function checkForUpdate(manifest: ManifestDefinition, noPrompt: boolean): Promise { const installed = manifest.package?.version!; const prerelease = semver.prerelease(installed); const isBeta = prerelease && prerelease[0] === 'beta'; if (isBeta) { console.log( chalk.yellow( `You are running beta version (${installed})'. ` + `${chalk.italic.grey('yarn global upgrade @optimizely/ocp-cli --latest')} to upgrade to the latest release version` ) ); return; } const lastCheck = getLastCheck(); if (lastCheck) { const now = new Date(); if (now.getTime() - lastCheck.date.getTime() < _24hours && lastCheck.upToDate) { return; } } try { let upToDate = true; const latest = await fetchLatest(); if (latest) { if (semver.gt(latest, installed)) { upToDate = false; if (await TerminalConfirm.ask( chalk.yellow('A new version of OCP CLI is available. Update now?'), noPrompt, true)) { TerminalPassthru.exec('yarn global upgrade @optimizely/ocp-cli --latest'); } } } setLastCheck(upToDate); } catch (e) { return; } } async function fetchLatest() { return TerminalOutput.exec('yarn info -s @optimizely/ocp-cli dist-tags.latest').stdout.trim(); } function getLastCheck(): LastCheck | undefined { const file = path.join(os.homedir(), `.ocp/${LAST_VERSION_CHECK_FILE}`); if (fs.existsSync(file)) { const stat = fs.statSync(file); const upToDate = fs.readFileSync(file, {encoding: 'utf-8'}) === 'true'; return {date: stat.mtime, upToDate}; } return undefined; } function setLastCheck(upToDate: boolean) { const file = path.join(os.homedir(), `.ocp/${LAST_VERSION_CHECK_FILE}`); fs.writeFileSync(file, upToDate.toString()); }