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 .PHONY: test
test: test:
npx eslint --color --quiet *.js npx eslint --color --quiet *.js
node --trace-deprecation --throw-deprecation test.js
.PHONY: publish .PHONY: publish
publish: publish:

@ -40,6 +40,7 @@
"devDependencies": { "devDependencies": {
"eslint": "5.12.1", "eslint": "5.12.1",
"eslint-config-silverwind": "2.0.14", "eslint-config-silverwind": "2.0.14",
"execa": "^1.0.0",
"ver": "3.0.1" "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; return newPkgStr;
} }
// naive regex replace
function updateRange(range, version) { function updateRange(range, version) {
return range.replace(/[0-9]+\.[0-9]+\.[0-9]+(-.+)?/g, version); return range.replace(/[0-9]+\.[0-9]+\.[0-9]+(-.+)?/g, version);
} }
@ -338,9 +337,25 @@ function isValidSemverRange(range) {
return valid; return valid;
} }
function findNewVersion(data, opts) { function isVersionPrerelease(version) {
const versions = Object.keys(data.time).filter(version => semver.valid(version)); return semver.parse(version).prerelease.length;
let tempVersion = semver.coerce(opts.range) || "0.0.0"; }
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; let tempDate = 0;
for (const version of versions) { for (const version of versions) {
@ -353,7 +368,7 @@ function findNewVersion(data, opts) {
} }
if (!opts.semvers.includes(diff)) continue; if (!opts.semvers.includes(diff)) continue;
if (diff === "prerelease" && !opts.usePre) continue; if (isVersionPrerelease(parsed.version) && !opts.usePre) continue;
if (opts.useGreatest) { if (opts.useGreatest) {
if (semver.gte(parsed.version, tempVersion)) { 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; 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) { function parseMixedArg(arg) {
if (arg === "") { if (arg === "") {
return true; return true;