ds4/tools/bump-version.js
Johannes Loher 5c3ba9da05
All checks were successful
ci/woodpecker/pr/checks Pipeline was successful
ci/woodpecker/push/checks Pipeline was successful
ci/woodpecker/manual/checks Pipeline was successful
ci/woodpecker/manual/release Pipeline was successful
build: fix bump-version
2023-09-16 11:55:39 +02:00

103 lines
3.6 KiB
JavaScript

// 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);