s3si.ts/gui/scripts/make-update.ts

98 lines
2.1 KiB
TypeScript

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<Platform, string> = {
'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<Platform, File>
}
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<Platform, File>;
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));