From ef775475df33d0e10c3a884dcc79ea11419743a5 Mon Sep 17 00:00:00 2001 From: chee Date: Thu, 21 Feb 2019 01:39:43 +0000 Subject: [PATCH] Add a pattern to match on to depcount and gadeve --- commands/depcount.js | 31 ++++++++++++++----- .../recursors/gather-dependency-versions.js | 12 +++++-- 2 files changed, 33 insertions(+), 10 deletions(-) diff --git a/commands/depcount.js b/commands/depcount.js index 0a0b969..6fe9330 100644 --- a/commands/depcount.js +++ b/commands/depcount.js @@ -2,6 +2,7 @@ import {EOL} from "os" import getLockfile from "../functions/get-lockfile" import gatherDependencyVersions from "../functions/recursors/gather-dependency-versions" import getLongestName from "../functions/recursors/get-longest-name" +import * as symbols from "../symbols" export let command = "depcount" export let describe = "the number of versions of each dependency" @@ -18,7 +19,7 @@ export let builder = yargs => { .options("sort", { default: "dont", choices: ["dont", "count", "name"], - describe: "how to sort the dependencies" + describe: "sort the dependencies as so" }) .options("production", { alias: ["prod", "p"], @@ -26,7 +27,12 @@ export let builder = yargs => { default: "false", describe: "only count the production (non-dev) tree" }) - .options("show") + .options("pattern", { + alias: ["r"], + type: "array", + describe: "only count packages whose name match one of these patterns", + coerce: pattern => new RegExp(pattern) + }) .check(argv => { if (!(Number.isInteger(argv.min) && argv.min >= 0)) { throw new Error("Error: `min` must be a non-negative integer") @@ -56,13 +62,22 @@ export async function handler (argv) { let versions = await gatherDependencyVersions(argv)(lockfile.dependencies) let longestName = await getLongestName()(lockfile.dependencies) - Object.entries(versions) - .map(countVersions) - .sort(sorts[argv.sort]) - .filter(minFilter(argv.min)) - .forEach(([name, count]) => { + let entries = Object.entries(versions) + let counted = entries.map(countVersions) + let sorted = argv.sort && argv.sort != "dont" + ? counted.sort(sorts[argv.sort]) + : counted + let filtered = argv.min + ? sorted.filter(minFilter(argv.min)) + : sorted + + if (!argv[symbols.internal]) { + filtered.forEach(([name, count]) => { process.stdout.write( name.padEnd(longestName.length, " ") + "\t" + count + EOL ) - }) + }) + } + + return filtered } diff --git a/functions/recursors/gather-dependency-versions.js b/functions/recursors/gather-dependency-versions.js index d807c89..b547eb9 100644 --- a/functions/recursors/gather-dependency-versions.js +++ b/functions/recursors/gather-dependency-versions.js @@ -3,15 +3,23 @@ import fastclone from "fast-clone" export let initial = {} -export let createReducer = ({production = false} = {}) => +export let createReducer = (options = {}) => function reducer (current, name, info) { + let { + production = false, + pattern + } = options if (production && info.dev) { return current } + if (pattern && !pattern.exec(name)) { + return current + } let counts = fastclone(current) counts[name] = [...new Set((counts[name] || []).concat(info.version))] return counts } -let recursor = ({production}) => createRecursor(createReducer({production}), initial) +let recursor = options => createRecursor(createReducer(options), initial) + export default recursor