tickwerk/tools/bump-version.js

86 lines
2.9 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 repository = 'dungeonslayers/tickwerk';
const gitlabURL = 'https://git.f3l.de';
const getLicenseURL = (version) => `${gitlabURL}/${repository}/-/raw/${version}/LICENSE.md`;
const getReadmeURL = (version) => `${gitlabURL}/${repository}/-/raw/${version}/README.md`;
const getChangelogURL = (version) => `${gitlabURL}/${repository}/-/releases/${version}`;
const getDownloadURL = (version) => `${gitlabURL}/${repository}/-/releases/${version}/downloads/module.zip`;
const manifestPath = './module.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);
}
}
/**
* 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: 4 });
manifest.license = getLicenseURL(targetVersion);
manifest.readme = getReadmeURL(targetVersion);
manifest.changelog = getChangelogURL(targetVersion);
manifest.version = targetVersion;
manifest.download = getDownloadURL(targetVersion);
fs.writeJSONSync(manifestPath, manifest, { spaces: 4 });
}
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);