rewrite version resolution, add tests and screenshot
This commit is contained in:
parent
018d96b440
commit
bd2f0b3f9c
1
Makefile
1
Makefile
@ -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
BIN
screenshot.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 82 KiB |
50
test.js
Normal file
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
6
test.json
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"dependencies": {
|
||||||
|
"gulp-sourcemaps": "2.0.0",
|
||||||
|
"prismjs": "1.0.0"
|
||||||
|
}
|
||||||
|
}
|
66
updates.js
66
updates.js
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user