popular-package
Version:
> Get the popularity stats of packages in a mono repository either internally or on npm for [bolt](https://github.com/boltpkg/bolt) or [lerna](https://github.com/lerna/lerna).
62 lines (53 loc) • 1.78 kB
JavaScript
// @flow
;
const got = require('got');
const ora = require('ora');
const chalk = require('chalk');
const { table } = require('../utils/cli');
const { getAllPackages } = require('../utils/dir');
const { getAllPackagesName } = require('../utils/getInternalDependency');
/*::
type SpinnerType = {
text: string,
start: Function,
succeed: Function,
fail: Function,
}
*/
async function getNpmStats(pkg, spinner) {
try {
const res = await got(
`https://api.npmjs.org/downloads/point/last-day/${pkg}`
);
spinner.succeed(chalk`Download complete for {green ${pkg}}`);
return JSON.parse(res.body);
} catch(error) {
spinner.fail(chalk`Download failed for {red ${pkg}} with {red ${error}}`);
return {downloads: 0};
}
}
async function global({ cwd } /*: {cwd: string}*/) {
const spinner /*: SpinnerType*/ = ora({
text: chalk`Getting packages to download stats for`
}).start();
const packages = await getAllPackages(cwd);
const pkgNames = await getAllPackagesName(cwd, packages);
let pkgsStat/*: { [key: string]: { downloads: number } }*/ = { };
spinner.succeed(chalk`Found {green ${pkgNames.size}} packages`);
for (const pkg of pkgNames) {
spinner.start(chalk`Downloading npm data for {yellow ${pkg}}`);
const pkgStats /* {downloads: number} */ = await getNpmStats(pkg, spinner);
pkgsStat[pkg] = pkgStats;
}
let sortedKeys = Object.keys(pkgsStat).sort(
(maybeSmall, maybeBig) =>
pkgsStat[maybeBig].downloads - pkgsStat[maybeSmall].downloads
);
console.log(
table({
columns: ['', chalk`{yellow Package Name}`, chalk`{yellow Download}`],
rows: sortedKeys.map((key, index) => [index+1, key, pkgsStat[key].downloads])
})
);
}
module.exports = global;