// SPDX-FileCopyrightText: 2021 Johannes Loher // // SPDX-License-Identifier: MIT import fs from "fs-extra"; import semver from "semver"; import yargs from "yargs"; import { hideBin } from "yargs/helpers"; const packageType = "system"; const repositoryOwner = process.env.CI_REPO_OWNER; const repositoryName = process.env.CI_REPO_NAME; const repositoryURL = process.env.CI_REPO_URL; const forgeURL = process.env.CI_FORGE_URL; const getManifestUrl = (channel) => `${forgeURL}/api/packages/${repositoryOwner}/generic/${repositoryName}/${channel}/${packageType}.json`; const getDownloadURL = (version) => `${repositoryURL}/releases/download/${version}/${repositoryName}.zip`; const bugsURL = `${repositoryURL}/issues`; const getChangelogURL = (version) => `${repositoryURL}/releases/tag/${version}`; const getReadmeURL = (version) => `${repositoryURL}/raw/tag/${version}/README.md`; const getLicenseURL = (version) => `${repositoryURL}/raw/tag/${version}/LICENSE.md`; const manifestPath = `${packageType}.json`; /** * Get the contents of the manifest file as object. * @returns {unknown} An object describing the manifest */ function getManifest() { if (fs.existsSync(manifestPath)) { return fs.readJSONSync(manifestPath); } } /** * Get the target version based on on the current version and the argument passed as release. * @param {string} currentVersion The current version * @param {semver.ReleaseType | string} release Either a semver release type or a valid semver version * @returns {string | null} The target version */ function getTargetVersion(currentVersion, release) { if (["major", "premajor", "minor", "preminor", "patch", "prepatch", "prerelease"].includes(release)) { return semver.inc(currentVersion, release); } else { return semver.valid(release); } } /** * Get the channel for a given version. * @param {string} version The version for which to get the channel * @returns {"latest" | "beta"} The channel for the version */ function getChannel(version) { return version.includes("-") ? "beta" : "latest"; } /** * Update version and download URL. * @param {semver.ReleaseType | string} release Either a semver release type or a valid semver version */ function bumpVersion(release) { if (!release) { throw new Error("Missing release type"); } const packageJson = fs.readJSONSync("package.json"); const manifest = getManifest(); if (!manifest) throw new Error("Manifest JSON not found"); const currentVersion = packageJson.version; const targetVersion = getTargetVersion(currentVersion, release); if (!targetVersion) { throw new Error("Incorrect version arguments"); } if (targetVersion === currentVersion) { throw new Error("Target version is identical to current version"); } console.log(`Bumping version number to '${targetVersion}'`); packageJson.version = targetVersion; fs.writeJSONSync("package.json", packageJson, { spaces: 2 }); manifest.version = targetVersion; manifest.url = repositoryURL; manifest.manifest = getManifestUrl(getChannel(targetVersion)); manifest.download = getDownloadURL(targetVersion); manifest.bugs = bugsURL; manifest.changelog = getChangelogURL(targetVersion); manifest.readme = getReadmeURL(targetVersion); manifest.license = getLicenseURL(targetVersion); fs.writeJSONSync(manifestPath, manifest, { spaces: 2 }); } const argv = yargs(hideBin(process.argv)).usage("Usage: $0").option("release", { alias: "r", type: "string", demandOption: true, description: "Either a semver release type or a valid semver version", }).argv; const release = argv.r; bumpVersion(release);