// SPDX-FileCopyrightText: 2021 Johannes Loher // // SPDX-License-Identifier: MIT import fs from 'fs-extra'; import path from 'node:path'; import semver from 'semver'; import yargs from 'yargs'; import { hideBin } from 'yargs/helpers'; import { sourceDirectory } from './const.mjs'; const getDownloadURL = (version) => `https://git.f3l.de/ghost/darkness-dependent-vision/-/releases/${version}/downloads/darkness-dependent-vision.zip`; const getChangelogURL = (version) => `https://git.f3l.de/ghost/darkness-dependent-vision/-/releases/${version}`; /** * Get the contents of the manifest file as object. * @returns {{file: unknown, name: string}} An object describing the manifest */ function getManifest() { const manifestPath = path.join(sourceDirectory, 'module.json'); if (fs.existsSync(manifestPath)) { return { file: fs.readJSONSync(manifestPath), name: 'module.json', }; } } /** * 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.file.version = targetVersion; manifest.file.download = getDownloadURL(targetVersion); manifest.file.changelog = getChangelogURL(targetVersion); fs.writeJSONSync(path.join(sourceDirectory, manifest.name), manifest.file, { 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);