scripts/resolve-version-lib.js (49 lines of code) (raw):
#!/usr/bin/env node
const path = require('path');
const fs = require('fs');
//=============================================================
// UNIT TESTS: tools/script-tests/test/resolve-version.test.js
//=============================================================
function resolveVersion(rootdir) {
const ALLOWED_RELEASE_TYPES = [ 'alpha', 'rc', 'stable' ];
const MIN_MAJOR = 1, MAX_MAJOR = 2; // extra safety: update to allow new major versions
//
// parse release.json
//
const releaseFile = path.join(rootdir, 'release.json');
const releaseConfig = require(releaseFile);
const majorVersion = releaseConfig.majorVersion;
const releaseType = releaseConfig.releaseType;
if (!majorVersion) { throw new Error(`"majorVersion"" must be defined in ${releaseFile}`); }
if (!releaseType) { throw new Error(`"releaseType" must be defined in ${releaseFile}`); }
if (typeof(majorVersion) !== 'number') { throw new Error(`majorVersion=${majorVersion} must be a number`); }
if (majorVersion < MIN_MAJOR || majorVersion > MAX_MAJOR) { throw new Error(`majorVersion=${majorVersion} is an unsupported major version (should be between ${MIN_MAJOR} and ${MAX_MAJOR})`); }
if (!ALLOWED_RELEASE_TYPES.includes(releaseType)) { throw new Error(`releaseType=${releaseType} is not allowed. Allowed values: ${ALLOWED_RELEASE_TYPES.join(',')}`); }
//
// resolve and check that we have a version file
//
const versionFile = `version.v${majorVersion}.json`;
const versionFilePath = path.join(rootdir, versionFile);
if (!fs.existsSync(versionFilePath)) {
throw new Error(`unable to find version file ${versionFile} for major version ${majorVersion}`);
}
//
// validate that current version matches the requirements
//
const versions = require(versionFilePath);
const currentVersion = versions.version;
if (!currentVersion.startsWith(`${majorVersion}.`)) {
throw new Error(`current version "${currentVersion}" does not use the expected major version ${majorVersion}`);
}
// if this is a pre-release, make sure current version includes the
// pre-release tag (e.g. "1.0.0-alpha.0"). we allow stable branches to bump to
// a pre-release for testing purposes when BUMP_CANDIDATE=true (see bump.js)
if (releaseType !== 'stable') {
if (!currentVersion.includes(`-${releaseType}.`)) {
throw new Error(`could not find pre-release tag "${releaseType}" in current version "${currentVersion}" defined in ${versionFile}`);
}
}
//
// determine changelog file names
//
const changelogFile = majorVersion === 1
? 'CHANGELOG.md'
: `CHANGELOG.v${majorVersion}.md`;
const alphaChangelogFile = majorVersion === 1
? undefined
: `CHANGELOG.v${majorVersion}.alpha.md`;
//
// export all of it
//
return {
version: currentVersion,
alphaVersion: versions.alphaVersion,
versionFile,
changelogFile,
alphaChangelogFile,
prerelease: releaseType !== 'stable' ? releaseType : undefined,
marker: '0.0.0',
};
}
module.exports = resolveVersion;