Johannes Loher
f4a39d3346
All checks were successful
ci/woodpecker/pr/checks Pipeline was successful
103 lines
3.6 KiB
JavaScript
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 = 'module';
|
|
const repositoryOwner = process.env.CI_REPO_OWNER;
|
|
const repositoryName = process.env.CI_REPO_NAME;
|
|
const repositoryURL = process.env.CI_REPO_LINK;
|
|
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: 4 });
|
|
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: 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);
|