rewrite version resolution, add tests and screenshot

This commit is contained in:
silverwind 2019-01-19 20:05:26 +01:00
parent 018d96b440
commit bd2f0b3f9c
Signed by: silverwind
GPG Key ID: 2E62B41C93869443
6 changed files with 111 additions and 13 deletions

@ -1,6 +1,7 @@
.PHONY: test
test:
npx eslint --color --quiet *.js
node --trace-deprecation --throw-deprecation test.js
.PHONY: publish
publish:

@ -40,6 +40,7 @@
"devDependencies": {
"eslint": "5.12.1",
"eslint-config-silverwind": "2.0.14",
"execa": "^1.0.0",
"ver": "3.0.1"
}
}

BIN
screenshot.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

50
test.js Normal file

@ -0,0 +1,50 @@
"use strict";
const assert = require("assert");
const process = require("process");
const execa = require("execa");
function exit(err) {
if (err) {
console.info(err);
}
process.exit(err ? 1 : 0);
}
async function run(args) {
return JSON.parse(await execa.stdout("./updates.js", args.split(/\s+/)));
}
async function main() {
assert.deepStrictEqual(await run("-j -f test.json"), {
results: {
"gulp-sourcemaps": {
old: "2.0.0",
new: "2.6.4",
info: "https://github.com/floridoo/gulp-sourcemaps"
},
"prismjs": {
old: "1.0.0",
new: "1.15.0",
info: "https://github.com/LeaVerou/prism"
}
}
});
assert.deepStrictEqual(await run("-j -g -f test.json"), {
results: {
"gulp-sourcemaps": {
old: "2.0.0",
new: "2.6.4",
info: "https://github.com/floridoo/gulp-sourcemaps"
},
"prismjs": {
old: "1.0.0",
new: "9000.0.2",
info: "https://github.com/LeaVerou/prism"
}
}
});
}
main().then(exit).catch(exit);

6
test.json Normal file

@ -0,0 +1,6 @@
{
"dependencies": {
"gulp-sourcemaps": "2.0.0",
"prismjs": "1.0.0"
}
}

@ -324,7 +324,6 @@ function updatePkg() {
return newPkgStr;
}
// naive regex replace
function updateRange(range, version) {
return range.replace(/[0-9]+\.[0-9]+\.[0-9]+(-.+)?/g, version);
}
@ -338,9 +337,25 @@ function isValidSemverRange(range) {
return valid;
}
function findNewVersion(data, opts) {
const versions = Object.keys(data.time).filter(version => semver.valid(version));
let tempVersion = semver.coerce(opts.range) || "0.0.0";
function isVersionPrerelease(version) {
return semver.parse(version).prerelease.length;
}
function isRangePrerelease(range) {
// can not use semver.coerce here because it ignores prerelease tags
return /[0-9]+\.[0-9]+\.[0-9]+-.+/.test(range);
}
function rangeToVersion(range) {
try {
return semver.coerce(range).version;
} catch (err) {
return "0.0.0";
}
}
function findVersion(data, versions, opts) {
let tempVersion = rangeToVersion(opts.range);
let tempDate = 0;
for (const version of versions) {
@ -353,7 +368,7 @@ function findNewVersion(data, opts) {
}
if (!opts.semvers.includes(diff)) continue;
if (diff === "prerelease" && !opts.usePre) continue;
if (isVersionPrerelease(parsed.version) && !opts.usePre) continue;
if (opts.useGreatest) {
if (semver.gte(parsed.version, tempVersion)) {
@ -368,17 +383,42 @@ function findNewVersion(data, opts) {
}
}
// Special case for when pre-releases are tagged as latest. This ignores the
// --prerelease option, but it's how npm and other tools work so we copy
// their behaviour.
const latestTag = data["dist-tags"].latest;
if (!opts.useGreatest && latestTag !== tempVersion && semver.diff(tempVersion, latestTag) === "prerelease") {
tempVersion = latestTag;
}
return tempVersion === "0.0.0" ? null : tempVersion;
}
function findNewVersion(data, opts) {
const versions = Object.keys(data.time).filter(version => semver.valid(version));
const version = findVersion(data, versions, opts);
if (opts.useGreatest) {
return version;
} else {
const latestTag = data["dist-tags"].latest;
const oldVersion = semver.coerce(opts.range);
const oldIsPre = isRangePrerelease(opts.range);
const newIsPre = isVersionPrerelease(version);
const isGreater = semver.gt(version, oldVersion);
// update to new prerelease
if (opts.usePre && newIsPre && isGreater) {
return version;
}
// update from prerelease to release
if (oldIsPre && !newIsPre && isGreater) {
return version;
}
// do not downgrade from prerelease to release
if (oldIsPre && !newIsPre && !isGreater) {
return oldVersion;
}
// in all other cases, return latest dist-tag
return latestTag;
}
}
function parseMixedArg(arg) {
if (arg === "") {
return true;