-
-
Notifications
You must be signed in to change notification settings - Fork 1.7k
/
Copy pathdownloads-by-versions.mjs
48 lines (42 loc) · 1.62 KB
/
downloads-by-versions.mjs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import semver from 'semver';
const { coerce, cmp } = semver;
const { cyan, green } = chalk;
const ALL = !argv._.includes('main-only');
const downloadsByPatch = {};
const downloadsByMinor = {};
const downloadsByMajor = {};
let total = 0;
async function getStat(pkg) {
const res = await fetch(`https://api.npmjs.org/versions/${ encodeURIComponent(pkg) }/last-week`);
const { downloads } = await res.json();
return downloads;
}
const [core, pure, bundle] = await Promise.all([
getStat('core-js'),
// eslint-disable-next-line unicorn/prefer-top-level-await -- false positive
ALL && getStat('core-js-pure'),
// eslint-disable-next-line unicorn/prefer-top-level-await -- false positive
ALL && getStat('core-js-bundle'),
]);
for (let [patch, downloads] of Object.entries(core)) {
const version = coerce(patch);
const { major } = version;
const minor = `${ major }.${ version.minor }`;
if (ALL) downloads += (pure[patch] ?? 0) + (bundle[patch] ?? 0);
downloadsByPatch[patch] = downloads;
downloadsByMinor[minor] = (downloadsByMinor[minor] ?? 0) + downloads;
downloadsByMajor[major] = (downloadsByMajor[major] ?? 0) + downloads;
total += downloads;
}
function log(kind, map) {
echo(green(`downloads for 7 days by ${ cyan(kind) } releases:`));
console.table(Object.entries(map).sort(([a], [b]) => {
return cmp(coerce(a), '>', coerce(b)) ? 1 : -1;
}).reduce((memo, [version, downloads]) => {
memo[version] = { downloads, '%': `${ (downloads / total * 100).toFixed(2).padStart(5) } %` };
return memo;
}, {}));
}
log('patch', downloadsByPatch);
log('minor', downloadsByMinor);
log('major', downloadsByMajor);