updater.ts
1 import type { UpdateInfo } from './types'; 2 3 interface GitHubRelease { 4 tag_name: string; 5 html_url: string; 6 } 7 8 /** Compare two semver strings. Returns true if remote > local. */ 9 function isNewer(remote: string, local: string): boolean { 10 const r = remote.split('.').map(Number); 11 const l = local.split('.').map(Number); 12 for (let i = 0; i < 3; i++) { 13 const rv = r[i] ?? 0; 14 const lv = l[i] ?? 0; 15 if (rv > lv) return true; 16 if (rv < lv) return false; 17 } 18 return false; 19 } 20 21 export async function checkForUpdate(currentVersion: string, token?: string): Promise<UpdateInfo | null> { 22 try { 23 const headers: Record<string, string> = { 'User-Agent': 'Gnosis-App' }; 24 if (token) headers['Authorization'] = `token ${token}`; 25 const res = await fetch('https://api.github.com/repos/oddur/gnosis/releases/latest', { headers }); 26 if (!res.ok) return null; 27 28 const data = (await res.json()) as GitHubRelease; 29 const remoteVersion = data.tag_name.replace(/^v/, ''); 30 31 if (!isNewer(remoteVersion, currentVersion)) return null; 32 33 return { 34 version: remoteVersion, 35 releaseUrl: data.html_url, 36 }; 37 } catch { 38 return null; 39 } 40 }