function parseSemanticVersion(versionString): [number, number, number] { return versionString .replace('v', '') .split('.') .map(n => parseInt(n)); } export function cmpSemanticVersion( versionStringA: string, versionStringB: string, ): number { let x = parseSemanticVersion(versionStringA); let y = parseSemanticVersion(versionStringB); return x[0] - y[0] || x[1] - y[1] || x[2] - y[2]; } export async function getLatestVersion(): Promise<string> { let response = await fetch( 'https://api.github.com/repos/actualbudget/actual/tags', ); let json = await response.json(); let tags = json.map(t => t.name).concat([`v${window.Actual.ACTUAL_VERSION}`]); tags.sort(cmpSemanticVersion); return tags[tags.length - 1]; } export async function getIsOutdated(latestVersion: string): Promise<boolean> { let clientVersion = window.Actual.ACTUAL_VERSION; return cmpSemanticVersion(clientVersion, latestVersion) < 0; }