Use semver library instead of semverUtils

This commit is contained in:
Fabio Berger 2018-06-18 19:00:39 +02:00
parent 9a748c8bf1
commit 3e64b3da39
6 changed files with 17 additions and 73 deletions

View File

@ -38,6 +38,7 @@
"make-promises-safe": "^1.1.0", "make-promises-safe": "^1.1.0",
"npm-run-all": "^4.1.2", "npm-run-all": "^4.1.2",
"shx": "^0.2.2", "shx": "^0.2.2",
"@types/semver": "5.5.0",
"tslint": "5.8.0", "tslint": "5.8.0",
"typescript": "2.7.1" "typescript": "2.7.1"
}, },
@ -56,6 +57,7 @@
"publish-release": "0xproject/publish-release", "publish-release": "0xproject/publish-release",
"rimraf": "^2.6.2", "rimraf": "^2.6.2",
"semver-diff": "^2.1.0", "semver-diff": "^2.1.0",
"semver": "5.5.0",
"semver-sort": "0.0.4" "semver-sort": "0.0.4"
}, },
"publishConfig": { "publishConfig": {

View File

@ -2,12 +2,13 @@ import * as fs from 'fs';
import * as _ from 'lodash'; import * as _ from 'lodash';
import * as path from 'path'; import * as path from 'path';
import { exec as execAsync } from 'promisify-child-process'; import { exec as execAsync } from 'promisify-child-process';
import semver = require('semver');
import semverSort = require('semver-sort');
import { constants } from './constants'; import { constants } from './constants';
import { Changelog, PackageRegistryJson } from './types'; import { Changelog, PackageRegistryJson } from './types';
import { changelogUtils } from './utils/changelog_utils'; import { changelogUtils } from './utils/changelog_utils';
import { npmUtils } from './utils/npm_utils'; import { npmUtils } from './utils/npm_utils';
import { semverUtils } from './utils/semver_utils';
import { utils } from './utils/utils'; import { utils } from './utils/utils';
async function prepublishChecksAsync(): Promise<void> { async function prepublishChecksAsync(): Promise<void> {
@ -63,7 +64,8 @@ async function checkCurrentVersionMatchesLatestPublishedNPMPackageAsync(
continue; // noop for packages not yet published to NPM continue; // noop for packages not yet published to NPM
} }
const allVersionsIncludingUnpublished = npmUtils.getPreviouslyPublishedVersions(packageRegistryJsonIfExists); const allVersionsIncludingUnpublished = npmUtils.getPreviouslyPublishedVersions(packageRegistryJsonIfExists);
const latestNPMVersion = semverUtils.getLatestVersion(allVersionsIncludingUnpublished); const sortedVersions = semverSort.desc(allVersionsIncludingUnpublished);
const latestNPMVersion = sortedVersions[0];
if (packageVersion !== latestNPMVersion) { if (packageVersion !== latestNPMVersion) {
versionMismatches.push({ versionMismatches.push({
packageJsonVersion: packageVersion, packageJsonVersion: packageVersion,
@ -96,13 +98,13 @@ async function checkChangelogFormatAsync(updatedPublicLernaPackages: LernaPackag
if (!_.isEmpty(changelog)) { if (!_.isEmpty(changelog)) {
const lastEntry = changelog[0]; const lastEntry = changelog[0];
const doesLastEntryHaveTimestamp = !_.isUndefined(lastEntry.timestamp); const doesLastEntryHaveTimestamp = !_.isUndefined(lastEntry.timestamp);
if (semverUtils.lessThan(lastEntry.version, currentVersion)) { if (semver.lt(lastEntry.version, currentVersion)) {
changeLogInconsistencies.push({ changeLogInconsistencies.push({
packageJsonVersion: currentVersion, packageJsonVersion: currentVersion,
changelogVersion: lastEntry.version, changelogVersion: lastEntry.version,
packageName, packageName,
}); });
} else if (semverUtils.greaterThan(lastEntry.version, currentVersion) && doesLastEntryHaveTimestamp) { } else if (semver.gt(lastEntry.version, currentVersion) && doesLastEntryHaveTimestamp) {
// Remove incorrectly added timestamp // Remove incorrectly added timestamp
delete changelog[0].timestamp; delete changelog[0].timestamp;
// Save updated CHANGELOG.json // Save updated CHANGELOG.json

View File

@ -8,6 +8,7 @@ import opn = require('opn');
import * as path from 'path'; import * as path from 'path';
import { exec as execAsync, spawn } from 'promisify-child-process'; import { exec as execAsync, spawn } from 'promisify-child-process';
import * as prompt from 'prompt'; import * as prompt from 'prompt';
import semver = require('semver');
import semverDiff = require('semver-diff'); import semverDiff = require('semver-diff');
import semverSort = require('semver-sort'); import semverSort = require('semver-sort');
@ -129,10 +130,13 @@ async function updateChangeLogsAsync(updatedPublicLernaPackages: LernaPackage[])
); );
if (shouldAddNewEntry) { if (shouldAddNewEntry) {
// Create a new entry for a patch version with generic changelog entry. // Create a new entry for a patch version with generic changelog entry.
const nextPatchVersion = utils.getNextPatchVersion(currentVersion); const nextPatchVersionIfValid = semver.inc(currentVersion, 'patch');
if (_.isNull(nextPatchVersionIfValid)) {
throw new Error(`Encountered invalid semver version: ${currentVersion} for package: ${packageName}`);
}
const newChangelogEntry: VersionChangelog = { const newChangelogEntry: VersionChangelog = {
timestamp: TODAYS_TIMESTAMP, timestamp: TODAYS_TIMESTAMP,
version: nextPatchVersion, version: nextPatchVersionIfValid,
changes: [ changes: [
{ {
note: 'Dependencies updated', note: 'Dependencies updated',
@ -140,7 +144,7 @@ async function updateChangeLogsAsync(updatedPublicLernaPackages: LernaPackage[])
], ],
}; };
changelog = [newChangelogEntry, ...changelog]; changelog = [newChangelogEntry, ...changelog];
packageToVersionChange[packageName] = semverDiff(currentVersion, nextPatchVersion); packageToVersionChange[packageName] = semverDiff(currentVersion, nextPatchVersionIfValid);
} else { } else {
// Update existing entry with timestamp // Update existing entry with timestamp
const lastEntry = changelog[0]; const lastEntry = changelog[0];

View File

@ -3,13 +3,12 @@ import * as _ from 'lodash';
import * as moment from 'moment'; import * as moment from 'moment';
import * as path from 'path'; import * as path from 'path';
import { exec as execAsync } from 'promisify-child-process'; import { exec as execAsync } from 'promisify-child-process';
import semver = require('semver');
import semverSort = require('semver-sort'); import semverSort = require('semver-sort');
import { constants } from '../constants'; import { constants } from '../constants';
import { Change, Changelog, VersionChangelog } from '../types'; import { Change, Changelog, VersionChangelog } from '../types';
import { semverUtils } from './semver_utils';
const CHANGELOG_MD_HEADER = ` const CHANGELOG_MD_HEADER = `
<!-- <!--
This file is auto-generated using the monorepo-scripts package. Don't edit directly. This file is auto-generated using the monorepo-scripts package. Don't edit directly.
@ -56,7 +55,7 @@ export const changelogUtils = {
return true; return true;
} }
const lastEntry = changelog[0]; const lastEntry = changelog[0];
if (semverUtils.lessThan(lastEntry.version, currentVersion)) { if (semver.lt(lastEntry.version, currentVersion)) {
throw new Error( throw new Error(
`Found CHANGELOG version lower then current package version. ${packageName} current: ${currentVersion}, Changelog: ${ `Found CHANGELOG version lower then current package version. ${packageName} current: ${currentVersion}, Changelog: ${
lastEntry.version lastEntry.version

View File

@ -1,56 +0,0 @@
import * as _ from 'lodash';
import semverSort = require('semver-sort');
// Regex that matches semantic versions only including digits and dots.
const SEM_VER_REGEX = /^(\d+\.){1}(\d+\.){1}(\d+){1}$/gm;
export const semverUtils = {
/**
* Checks whether version a is lessThan version b. Supplied versions must be
* Semantic Versions containing only numbers and dots (e.g 1.4.0).
* @param a version of interest
* @param b version to compare a against
* @return Whether version a is lessThan version b
*/
lessThan(a: string, b: string): boolean {
this.assertValidSemVer('a', a);
this.assertValidSemVer('b', b);
if (a === b) {
return false;
}
const sortedVersions = semverSort.desc([a, b]);
const isALessThanB = sortedVersions[0] === b;
return isALessThanB;
},
/**
* Checks whether version a is greaterThan version b. Supplied versions must be
* Semantic Versions containing only numbers and dots (e.g 1.4.0).
* @param a version of interest
* @param b version to compare a against
* @return Whether version a is greaterThan version b
*/
greaterThan(a: string, b: string): boolean {
this.assertValidSemVer('a', a);
this.assertValidSemVer('b', b);
if (a === b) {
return false;
}
const sortedVersions = semverSort.desc([a, b]);
const isAGreaterThanB = sortedVersions[0] === a;
return isAGreaterThanB;
},
assertValidSemVer(variableName: string, version: string): void {
if (!version.match(SEM_VER_REGEX)) {
throw new Error(
`SemVer versions should only contain numbers and dots. Encountered: ${variableName} = ${version}`,
);
}
},
getLatestVersion(versions: string[]): string {
_.each(versions, version => {
this.assertValidSemVer('version', version);
});
const sortedVersions = semverSort.desc(versions);
return sortedVersions[0];
},
};

View File

@ -11,13 +11,6 @@ export const utils = {
log(...args: any[]): void { log(...args: any[]): void {
console.log(...args); // tslint:disable-line:no-console console.log(...args); // tslint:disable-line:no-console
}, },
getNextPatchVersion(currentVersion: string): string {
const versionSegments = currentVersion.split('.');
const patch = _.parseInt(_.last(versionSegments) as string);
const newPatch = patch + 1;
const newPatchVersion = `${versionSegments[0]}.${versionSegments[1]}.${newPatch}`;
return newPatchVersion;
},
async getUpdatedLernaPackagesAsync(shouldIncludePrivate: boolean): Promise<LernaPackage[]> { async getUpdatedLernaPackagesAsync(shouldIncludePrivate: boolean): Promise<LernaPackage[]> {
const updatedPublicPackages = await this.getLernaUpdatedPackagesAsync(shouldIncludePrivate); const updatedPublicPackages = await this.getLernaUpdatedPackagesAsync(shouldIncludePrivate);
const updatedPackageNames = _.map(updatedPublicPackages, pkg => pkg.name); const updatedPackageNames = _.map(updatedPublicPackages, pkg => pkg.name);