UNPKG

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
// @flow 'use strict'; 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;