import 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): Promise { 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) { const installed = manifest.package?.version!; if (semver.gt(latest, installed)) { upToDate = false; if (await TerminalConfirm.ask(chalk.yellow('A new version of Opti CLI is available. Update now?'))) { TerminalPassthru.exec('yarn global upgrade @optimizely/opti-cli --latest'); } } } setLastCheck(upToDate); } catch (e) { return; } } async function fetchLatest() { return TerminalOutput.exec('yarn info -s @optimizely/opti-cli dist-tags.latest').stdout.trim(); } function getLastCheck(): LastCheck | undefined { const file = path.join(os.homedir(), `.opti/${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(), `.opti/${LAST_VERSION_CHECK_FILE}`); fs.writeFileSync(file, upToDate.toString()); }