twilio-release-tool
Version:
Twilio Release Tool
129 lines (119 loc) • 3.44 kB
JavaScript
;
var semver = require('semver');
/**
* Assert that a version number is both a Semantic Version number and ends in
* "-dev" (or some other approved suffix).
* @param {string} version
* @returns {undefined}
* @throws {Error}
*/
function assertValidDevelopmentVersion(version) {
assertValidSemanticVersion(version);
var prerelease = getPrerelease(version);
if (prerelease !== 'dev' &&
prerelease !== 'snapshot' &&
prerelease !== 'SNAPSHOT')
{
throw new Error("Not a recognized Development Version '" + version + "'");
}
}
/**
* Assert that a version number is both a Semantic Version number and not a
* prerelease version.
* @private
* @param {string} version
* @returns {undefined}
* @throws {Error}
*/
function assertValidReleaseVersion(version) {
assertValidSemanticVersion(version);
var prerelease = getPrerelease(version);
if (prerelease) {
throw new Error("A Release cannot include a prerelease version '" + version + "'");
}
}
/**
* Assert that a version number is both a Semantic Version number and ends in
* "-rc" (or some other approvded suffix).
* @private
* @param {string} version
* @returns {undefined}
* @throws {Error}
*/
function assertValidReleaseCandidateVersion(version) {
assertValidSemanticVersion(version);
var prerelease = getPrerelease(version);
if (!prerelease.match(/^alpha\.?[0-9]*$/) &&
!prerelease.match(/^beta\.?[0-9]*$/) &&
!prerelease.match(/^preview\.?[0-9]*$/) &&
!prerelease.match(/^rc\.?[0-9]*$/))
{
throw new Error("Not a recognized Release Candidate version '" + version + "'");
}
}
/**
* Assert that a version number is either a Release or Releae Candidate version
* number.
* @param {string} version
* @returns {undefined}
* @throws {Error}
*/
function assertValidReleaseOrReleaseCandidateVersion(version) {
try {
assertValidReleaseVersion(version);
} catch (error) {
try {
return assertValidReleaseCandidateVersion(version);
} catch (error) {
throw new Error("Not a recognized Release or Release Candidate version '" +
version + "'");
}
}
}
/**
* Assert that a version number is a Semantic Version number.
* @param {string} version
* @returns {undefined}
* @throws {Error}
*/
function assertValidSemanticVersion(version) {
if (!semver.valid(version)) {
throw new Error("Not a Semantic Version '" + version + "'");
}
}
/**
* Get the prerelease portion of a Semantic Version number.
* @private
* @param {string} version
* @returns {?string}
* @throws {Error}
*/
function getPrerelease(version) {
assertValidSemanticVersion(version);
version = version.split('-')[1]
if (version) {
return version.split('+')[0];
}
return null;
}
/*
* Check if a Semantic Version number is a Release Candidate version.
* @private
* @param {string} version
* @returns {boolean}
* @throws {Error}
*/
function isReleaseCandidateVersion(version) {
assertValidSemanticVersion(version);
try {
assertValidReleaseCandidateVersion(version);
} catch (error) {
return false;
}
return true;
}
module.exports.assertValidDevelopmentVersion = assertValidDevelopmentVersion;
module.exports.assertValidReleaseOrReleaseCandidateVersion =
assertValidReleaseOrReleaseCandidateVersion;
module.exports.assertValidSemanticVersion = assertValidSemanticVersion;
module.exports.isReleaseCandidateVersion = isReleaseCandidateVersion;