import { Octokit } from 'npm:@octokit/rest@19.0.7'; const TAG_PREFIX = 'gui-' type Platform = 'darwin-x86_64' | 'darwin-aarch64' | 'linux-x86_64' | 'windows-x86_64' const PLATFORMS: Platform[] = ['darwin-x86_64', 'darwin-aarch64', 'linux-x86_64', 'windows-x86_64'] const PlatformSuffix: Record = { 'darwin-x86_64': '.app.tar.gz', 'darwin-aarch64': '.app.tar.gz', 'linux-x86_64': '.AppImage.tar.gz', 'windows-x86_64': '.msi.zip', } type File = { signature: string url: string } type UpdateJson = { version: string notes: string pub_date: string platforms: Record } const REPO = { owner: 'spacemeowx2', repo: 's3si.ts', } const octokit = new Octokit({ auth: Deno.env.get('GITHUB_TOKEN'), }); async function findFirstGuiRelease() { let page = 1; while (true) { const { data: list } = await octokit.repos.listReleases({ ...REPO, page, }) if (list.length === 0) { return undefined } for (const release of list) { if (release.tag_name.startsWith(TAG_PREFIX)) { return release } } page += 1; } } const release = await findFirstGuiRelease(); const version = release?.tag_name.slice(TAG_PREFIX.length) ?? 'unknown'; const notes = release?.body ?? 'unknown'; const pub_date = release?.published_at ?? 'unknown'; async function makePlatforms(r: typeof release) { const assets = r?.assets ?? []; const platforms = Object.fromEntries(PLATFORMS.map(p => { const asset = assets.find(i => i.name.endsWith(PlatformSuffix[p])); if (!asset) { throw new Error(`Asset not found for ${p}`) } return [p, { signature: asset.browser_download_url + '.sig', url: asset.browser_download_url, }] })) as Record; return platforms } const updateJson: UpdateJson = { version, notes, pub_date, platforms: await makePlatforms(release), } // fetch signatures for (const platform of PLATFORMS) { const file = updateJson.platforms[platform]; const res = await fetch(file.signature); file.signature = await res.text(); } console.log(JSON.stringify(updateJson, null, 2));