add release age, fixes #40
This commit is contained in:
parent
d3aa357303
commit
08dbbae790
14
README.md
14
README.md
@ -4,9 +4,17 @@
|
|||||||
|
|
||||||
`updates` is a CLI tool which checks for npm dependency updates of the current project and optionally updates `package.json`. It is highly configurable and is typically able to complete in less than a second.
|
`updates` is a CLI tool which checks for npm dependency updates of the current project and optionally updates `package.json`. It is highly configurable and is typically able to complete in less than a second.
|
||||||
|
|
||||||
<p align="center">
|
```
|
||||||
<img src="https://i.imgur.com/tI7rp0g.png"/>
|
$ updates
|
||||||
</p>
|
NAME OLD NEW AGE INFO
|
||||||
|
p-map 3.0.0 4.0.0 3 days https://github.com/sindresorhus/p-map
|
||||||
|
rrdir 4.0.0 5.0.0 11 days https://github.com/silverwind/rrdir
|
||||||
|
eslint 6.7.2 6.8.0 3 months https://github.com/eslint/eslint
|
||||||
|
eslint-config-silverwind 5.1.1 10.0.0 2 days https://github.com/silverwind/eslint-config-silverwind
|
||||||
|
rimraf 3.0.0 3.0.2 28 days https://github.com/isaacs/rimraf
|
||||||
|
versions 7.0.5 8.2.3 1 day https://github.com/silverwind/versions
|
||||||
|
iltorb 2.4.4 2.4.5 1 month https://github.com/nstepien/iltorb
|
||||||
|
```
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
|
BIN
screenshot.png
BIN
screenshot.png
Binary file not shown.
Before Width: | Height: | Size: 82 KiB |
16
test.js
16
test.js
@ -58,7 +58,21 @@ function makeTest(args, expected) {
|
|||||||
args.split(/\s+/),
|
args.split(/\s+/),
|
||||||
{cwd: testDir},
|
{cwd: testDir},
|
||||||
);
|
);
|
||||||
return expect(JSON.parse(stdout)).toEqual({results: expected});
|
|
||||||
|
const {results} = JSON.parse(stdout);
|
||||||
|
for (const dependencyType of dependencyTypes) {
|
||||||
|
for (const [dependencyName, data] of Object.entries(expected[dependencyType] || {})) {
|
||||||
|
for (const [key, value] of Object.entries(data || {})) {
|
||||||
|
const resultValue = results[dependencyType][dependencyName][key];
|
||||||
|
if (key === "age") {
|
||||||
|
expect(resultValue).toBeInstanceOf(String);
|
||||||
|
expect(resultValue.length > 0).toBeTruthy();
|
||||||
|
} else {
|
||||||
|
expect(resultValue).toEqual(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
55
updates.js
55
updates.js
@ -226,6 +226,40 @@ if (!Object.keys(deps).length) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const timeData = [
|
||||||
|
[1e3, 1, "ns", false],
|
||||||
|
[1e6, 1e3, "µs", false],
|
||||||
|
[1e9, 1e6, "ms", false],
|
||||||
|
[60e9, 1e9, "sec", true],
|
||||||
|
[3600e9, 60e9, "min", true],
|
||||||
|
[86400e9, 3600e9, "hour", true],
|
||||||
|
[2592e12, 86400e9, "day", true],
|
||||||
|
[31536e12, 2592e12, "month", true],
|
||||||
|
[Infinity, 31536e12, "year", true],
|
||||||
|
];
|
||||||
|
|
||||||
|
function reltime(str) {
|
||||||
|
if (!str) return "";
|
||||||
|
const unix = new Date(str).getTime() * 1e6;
|
||||||
|
if (Number.isNaN(unix)) return "";
|
||||||
|
const diff = (Date.now() * 1e6) - unix;
|
||||||
|
if (diff <= 10e9) return "now";
|
||||||
|
|
||||||
|
let value, suffix;
|
||||||
|
for (let i = 0; i <= timeData.length; i++) {
|
||||||
|
const entry = timeData[i];
|
||||||
|
const [end, start, unit, addS] = entry || [];
|
||||||
|
if (entry && end && diff < end) {
|
||||||
|
value = Math.round(diff / start);
|
||||||
|
const s = addS ? (value > 1 ? "s" : "") : "";
|
||||||
|
suffix = `${unit}${s}`;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return `${value} ${suffix}`;
|
||||||
|
}
|
||||||
|
|
||||||
function findSync(filename, dir, stopDir) {
|
function findSync(filename, dir, stopDir) {
|
||||||
const path = join(dir, filename);
|
const path = join(dir, filename);
|
||||||
|
|
||||||
@ -398,7 +432,7 @@ function highlightDiff(a, b, added) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function formatDeps() {
|
function formatDeps() {
|
||||||
const arr = [["NAME", "OLD", "NEW", "INFO"]];
|
const arr = [["NAME", "OLD", "NEW", "AGE", "INFO"]];
|
||||||
|
|
||||||
for (const [key, data] of Object.entries(deps)) {
|
for (const [key, data] of Object.entries(deps)) {
|
||||||
const [_type, name] = key.split(sep);
|
const [_type, name] = key.split(sep);
|
||||||
@ -406,6 +440,7 @@ function formatDeps() {
|
|||||||
name,
|
name,
|
||||||
highlightDiff(data.oldPrint || data.old, data.newPrint || data.new, false),
|
highlightDiff(data.oldPrint || data.old, data.newPrint || data.new, false),
|
||||||
highlightDiff(data.newPrint || data.new, data.oldPrint || data.old, true),
|
highlightDiff(data.newPrint || data.new, data.oldPrint || data.old, true),
|
||||||
|
data.age || "",
|
||||||
data.info,
|
data.info,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
@ -549,6 +584,7 @@ function findNewVersion(data, opts) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: refactor this mess
|
||||||
async function checkUrlDep([key, dep], {useGreatest} = {}) {
|
async function checkUrlDep([key, dep], {useGreatest} = {}) {
|
||||||
const stripped = dep.old.replace(stripRe, "");
|
const stripped = dep.old.replace(stripRe, "");
|
||||||
const [_, user, repo, oldRef] = partsRe.exec(stripped) || [];
|
const [_, user, repo, oldRef] = partsRe.exec(stripped) || [];
|
||||||
@ -558,12 +594,20 @@ async function checkUrlDep([key, dep], {useGreatest} = {}) {
|
|||||||
const res = await fetch(`https://api.github.com/repos/${user}/${repo}/commits`);
|
const res = await fetch(`https://api.github.com/repos/${user}/${repo}/commits`);
|
||||||
if (!res || !res.ok) return;
|
if (!res || !res.ok) return;
|
||||||
const data = await res.json();
|
const data = await res.json();
|
||||||
let newRef = data.map(entry => entry.sha)[0];
|
let {sha: newRef, commit} = data[0];
|
||||||
if (!newRef || !newRef.length) return;
|
if (!newRef || !newRef.length) return;
|
||||||
|
|
||||||
|
let newDate;
|
||||||
|
if (commit && commit.committer && commit.committer.date) {
|
||||||
|
newDate = commit.committer.date;
|
||||||
|
} else if (commit && commit.auhor && commit.author.date) {
|
||||||
|
newDate = commit.author.date;
|
||||||
|
}
|
||||||
|
|
||||||
newRef = newRef.substring(0, oldRef.length);
|
newRef = newRef.substring(0, oldRef.length);
|
||||||
if (oldRef !== newRef) {
|
if (oldRef !== newRef) {
|
||||||
const newRange = dep.old.replace(oldRef, newRef);
|
const newRange = dep.old.replace(oldRef, newRef);
|
||||||
return {key, newRange, user, repo, oldRef, newRef};
|
return {key, newRange, user, repo, oldRef, newRef, newDate};
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
const res = await fetch(`https://api.github.com/repos/${user}/${repo}/git/refs/tags`);
|
const res = await fetch(`https://api.github.com/repos/${user}/${repo}/git/refs/tags`);
|
||||||
@ -650,6 +694,7 @@ async function main() {
|
|||||||
} else {
|
} else {
|
||||||
deps[key].new = newRange;
|
deps[key].new = newRange;
|
||||||
deps[key].info = getInfoUrl(data.versions[newVersion] || data, registry, data.name);
|
deps[key].info = getInfoUrl(data.versions[newVersion] || data, registry, data.name);
|
||||||
|
if (data.time && data.time[newVersion]) deps[key].age = reltime(data.time[newVersion]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -661,7 +706,7 @@ async function main() {
|
|||||||
}));
|
}));
|
||||||
results = results.filter(r => !!r);
|
results = results.filter(r => !!r);
|
||||||
for (const res of results || []) {
|
for (const res of results || []) {
|
||||||
const {key, newRange, user, repo, oldRef, newRef} = res;
|
const {key, newRange, user, repo, oldRef, newRef, newDate} = res;
|
||||||
deps[key] = {
|
deps[key] = {
|
||||||
old: maybeUrlDeps[key].old,
|
old: maybeUrlDeps[key].old,
|
||||||
new: newRange,
|
new: newRange,
|
||||||
@ -669,6 +714,8 @@ async function main() {
|
|||||||
newPrint: hashRe.test(newRef) ? newRef.substring(0, 7) : newRef,
|
newPrint: hashRe.test(newRef) ? newRef.substring(0, 7) : newRef,
|
||||||
info: `https://github.com/${user}/${repo}`,
|
info: `https://github.com/${user}/${repo}`,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if (newDate) deps[key].age = reltime(newDate);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user