import {Octokit} from 'octokit' import * as fs from 'fs' import * as path from 'path' const owner = 'bunsenstraat' const repo = 'remix-desktop' const headers = { 'X-GitHub-Api-Version': '2022-11-28', } const octokit = new Octokit({ auth: process.env.GH_TOKEN, }) async function getAllReleases() { const releases = await octokit.request('GET /repos/{owner}/{repo}/releases', { owner: owner, repo: repo, headers: headers, }) return releases.data } async function uploadReleaseAsset(release, name, file) { const upload_url = release.upload_url console.log(`Uploading ${name} to ${upload_url}`) octokit.request({ method: "POST", url: upload_url, headers: { "content-type": "text/plain", }, data: fs.readFileSync(file), name, label: name }); } async function getVersionFromPackageJson() { // ignore ts error // eslint-disable-next-line @typescript-eslint/no-var-requires const packageJson = require(__dirname + '/../../../apps/remixdesktop/package.json') return packageJson.version } async function readReleaseFilesFromLocalDirectory() { const directoryPath = path.join(__dirname, '../../../release') const files = fs.readdirSync(directoryPath) return files } async function removeAsset(asset) { await octokit.request('DELETE /repos/{owner}/{repo}/releases/assets/{asset_id}', { owner: owner, repo: repo, asset_id: asset.id, headers: headers, }) } async function main() { const allReleases = await getAllReleases() const version = await getVersionFromPackageJson() console.log(`preparing release version: ${version}`) let release allReleases.find((r) => { if (r.tag_name === `v${version}`) { release = r } }) if (!release) { console.log('No release found.') // create release console.log(`Creating release ${version}`) release = await octokit.request('POST /repos/{owner}/{repo}/releases', { owner: owner, repo: repo, tag_name: `v${version}`, name: `${version}`, draft: true, headers: headers, }) } let files = await readReleaseFilesFromLocalDirectory() files = files.filter((file) => file.endsWith('.dmg') || file.endsWith('.exe') || file.endsWith('.AppImage') || file.endsWith('.snap') || file.endsWith('.deb') || file.startsWith('latest')) console.log(`Found ${files.length} files to upload`) console.log(files) if (!release.draft) { console.log(`Release ${version} is not a draft. Aborting...`) return } // upload files for (const file of files) { // check if it is already uploaded const asset = release.assets.find((a) => a.label === file) if (asset) { console.log(`Asset ${file} already uploaded... replacing it`) // remove it first await removeAsset(asset) } await uploadReleaseAsset(release, file, path.join(__dirname, '../../../release', file)) } } main()