// import { Octokit } from "@octokit/rest"; import commandLineArgs from "command-line-args"; import fs from "fs/promises"; import { readFileSync } from "fs"; import path from "path"; import { fileURLToPath } from "url"; import pandoc from "node-pandoc"; // https://github.com/75lb/command-line-args const optionDefinitions = [ { name: "version", alias: "v", type: String, required: true }, { name: "versionNumber", alias: "n", type: Number }, { name: "versionDescription", alias: "d", type: String }, { name: "changelog", alias: "l", type: String }, ]; const cliArgs = commandLineArgs(optionDefinitions); const appPaths = {}; appPaths.root = path.join(path.dirname(fileURLToPath(import.meta.url)), "../.."); appPaths.mainPackage = path.join(appPaths.root, "./package.json"); appPaths.electronPackage = path.join(appPaths.root, "./electron/package.json"); appPaths.constants = path.join(appPaths.root, "./src/Constants.ts"); appPaths.sphinxConf = path.join(appPaths.root, "./doc/source/conf.py"); appPaths.sphinxChangelog = path.join(appPaths.root, "./doc/source/changelog.rst"); async function main(version, versionNumber, changelog) { console.log(`Updating app files to match v${version}`); const [major, minor] = version.split("."); const shortVersion = `${major}.${minor}`; const modifiedMainPackage = (await fs.readFile(appPaths.mainPackage, "utf8")).replace( /(^\s*"version":\s)"(.*)",$/m, `$1"${version}",`, ); await fs.writeFile(appPaths.mainPackage, modifiedMainPackage); console.log(`Modified ${appPaths.mainPackage}`); const modifiedElectronPackage = (await fs.readFile(appPaths.electronPackage, "utf8")).replace( /(^\s*"version":\s)"(.*)",$/m, `$1"${version}",`, ); await fs.writeFile(appPaths.electronPackage, modifiedElectronPackage); console.log(`Modified ${appPaths.electronPackage}`); let modifiedConstants = (await fs.readFile(appPaths.constants, "utf8")).replace( /(^\s*?VersionString:\s)"(.*)",/m, `$1"${version}",`, ); modifiedConstants = modifiedConstants.replace(/(^\s*?VersionNumber:\s)(.*),/m, `$1${versionNumber},`); if (changelog.trim() !== "") { let htmlChangelog = ""; try { htmlChangelog = await transform(changelog, "html"); console.log("Converted markdown changelog to html"); } catch (error) { console.error(error); } const paddedChangelog = htmlChangelog .split("\n") .map((line) => (line.trim() !== "" ? " " + line : "")) .join("\n") .replaceAll("`", "\\`"); modifiedConstants = modifiedConstants.replace(/(^\s*?LatestUpdate:\s`\n)(.*)`,$/ms, `$1${paddedChangelog}\n\`,`); } await fs.writeFile(appPaths.constants, modifiedConstants); console.log(`Modified ${appPaths.constants}`); let modifiedSphinxConfig = (await fs.readFile(appPaths.sphinxConf, "utf8")).replace( /(^version = ')(.*)'$/m, `$1${shortVersion}'`, ); modifiedSphinxConfig = modifiedSphinxConfig.replace(/(^release = ')(.*)'$/m, `$1${version}'`); await fs.writeFile(appPaths.sphinxConf, modifiedSphinxConfig); console.log(`Modified ${appPaths.sphinxConf}`); if (changelog.trim() !== "") { let modifiedSphinxChangelog = await fs.readFile(appPaths.sphinxChangelog, "utf8"); const lines = modifiedSphinxChangelog.split("\n"); let rstChangelog = ""; try { rstChangelog = await transform(changelog, "rst"); console.log("Converted markdown changelog to rst"); } catch (error) { console.error(error); } lines.splice(5, 0, rstChangelog); modifiedSphinxChangelog = lines.join("\n"); await fs.writeFile(appPaths.sphinxChangelog, modifiedSphinxChangelog); console.log(`Modified ${appPaths.sphinxChangelog}`); } } async function transform(markdown, format) { return new Promise((resolve, reject) => { const args = `-f markdown -t ${format}`; pandoc(markdown, args, (error, rst) => { if (error) { reject(error); } else { resolve(rst); } }); }); } async function getChangelog() { // Read from stdin // https://stackoverflow.com/a/56012724 try { return readFileSync(0, "utf-8").replace("\r\n", "\n"); } catch (error) { return ""; } } getChangelog().then((changes) => { main(cliArgs.version, cliArgs.versionNumber, changes).then(() => console.log("Done")); });