#!/usr/bin/env -S npx ts-node /* * Checks for the presence of a webapp, inspects its version and sets the * version metadata of the package to match. */ import { promises as fs } from "fs"; import * as asar from "@electron/asar"; import * as childProcess from "child_process"; export async function versionFromAsar(): Promise { try { await fs.stat("webapp.asar"); } catch (e) { throw new Error("No 'webapp.asar' found. Run 'yarn run fetch'"); } return asar.extractFile("webapp.asar", "version").toString().trim(); } export async function setPackageVersion(ver: string): Promise { // set version in package.json: electron-builder will use this to populate // all the various version fields await new Promise((resolve, reject) => { childProcess.execFile( process.platform === "win32" ? "yarn.cmd" : "yarn", [ "version", "-s", "--no-git-tag-version", // This also means "don't commit to git" as it turns out "--new-version", ver, ], { // We need shell mode on Windows to be able to launch `.cmd` executables // See https://nodejs.org/en/blog/vulnerability/april-2024-security-releases-2 shell: process.platform === "win32", }, (err) => { if (err) { reject(err); } else { resolve(); } }, ); }); } async function main(args: string[]): Promise { let version = args[0]; if (version === undefined) version = await versionFromAsar(); await setPackageVersion(version); return 0; } if (require.main === module) { main(process.argv.slice(2)) .then((ret) => { process.exit(ret); }) .catch((e) => { console.error(e); process.exit(1); }); }