pkg-stats
Version:
Beautiful NPM package download stats
113 lines (108 loc) • 3.54 kB
JavaScript
import chalk from 'chalk';
import meow from 'meow';
import redent from 'redent';
import { COLOR_SCHEMES, getColorOfDay } from './colors.js';
const colorCommand = chalk.hex('#22c1c3');
const colorOption = chalk.hex('#fdbb2d');
const HELP = `
${colorCommand('pkg-stats')} <package> - Show version stats
${colorCommand('pkg-stats')} <package-1> <package-2>... - Compare between packages
Options:
${colorOption('--major')} Group by major version
${colorOption('--minor')} Group by minor version
${colorOption('--patch')} Group by patch version
${colorOption('-t, --top')} <number> Show top <number> most downloaded versions
${colorOption('-a, --all')} Include all versions in output, even those with minimal downloads
${colorOption('-c, --color')} <scheme> ${wrapOption(`Choose color scheme from: ${COLOR_SCHEMES.sort().join(', ')}`, 50, 24)}
Examples:
${chalk.dim('# Show stats for react')}
${colorCommand('pkg-stats')} react
${chalk.dim('# Compare react, vue, angular and svelte')}
${colorCommand('pkg-stats')} react vue @angular/core svelte
${chalk.dim('# Show top 10 major versions of lodash')}
${colorCommand('pkg-stats')} lodash ${colorOption('--major -t 10')}
`;
function wrapOption(text, maxLength, indent) {
const words = text.split(' ');
let result = '';
let currentLine = words[0];
for (let i = 1; i < words.length; i++) {
const nextCurrentLine = currentLine + ' ' + words[i];
if (nextCurrentLine.length <= maxLength) {
currentLine = nextCurrentLine;
}
else {
result += `\n${currentLine}`;
currentLine = words[i];
}
}
if (currentLine) {
result += `\n${currentLine}`;
}
return redent(result.trim(), indent).trim();
}
export function showHelp() {
console.log(redent(HELP, 2));
}
export function parseCliOptions(argv) {
const cli = meow(HELP, {
argv: argv.slice(2),
autoHelp: true,
description: 'Show NPM weekly downloads stats:',
importMeta: import.meta,
flags: {
help: {
type: 'boolean',
shortFlag: 'h',
},
major: {
type: 'boolean',
shortFlag: 'm',
},
minor: {
type: 'boolean',
},
patch: {
type: 'boolean',
},
top: {
shortFlag: 't',
type: 'number',
},
all: {
type: 'boolean',
shortFlag: 'a',
},
color: {
shortFlag: 'c',
type: 'string',
choices: COLOR_SCHEMES,
},
},
});
if (cli.flags.help) {
cli.showHelp();
}
if (!cli.input.length) {
throw new Error('At least one <package-name> is required');
}
return {
packageNames: cli.input,
group: cli.flags.major
? 'major'
: cli.flags.minor
? 'minor'
: cli.flags.patch
? 'patch'
: undefined,
top: cli.flags.top,
all: cli.flags.all ?? false,
color: coalesceColor(cli.flags.color ?? process.env.PKG_STATS_COLOR_SCHEME) ?? getColorOfDay(),
};
}
function coalesceColor(color) {
if (color && COLOR_SCHEMES.includes(color)) {
return color;
}
return undefined;
}