From 9e8c7806abf2f99750e4219ec235804becaa20e5 Mon Sep 17 00:00:00 2001 From: Daniel Stockman Date: Sat, 5 Oct 2019 15:49:04 -0700 Subject: [PATCH] feat(filter-options): Add `--exclude-dependents` option Footguns abound. Fixes #2198 --- commands/add/__tests__/add-command.test.js | 1 + commands/add/index.js | 1 + core/filter-options/index.js | 9 +++++++++ core/filter-options/lib/get-filtered-packages.js | 4 ++++ utils/collect-updates/collect-updates.js | 4 +++- utils/collect-updates/lib/collect-packages.js | 7 ++++--- 6 files changed, 22 insertions(+), 4 deletions(-) diff --git a/commands/add/__tests__/add-command.test.js b/commands/add/__tests__/add-command.test.js index 71017399c1b..3f8fc39ae3d 100644 --- a/commands/add/__tests__/add-command.test.js +++ b/commands/add/__tests__/add-command.test.js @@ -290,6 +290,7 @@ describe("AddCommand", () => { ignore: undefined, private: undefined, since: undefined, + excludeDependents: undefined, includeFilteredDependents: undefined, includeFilteredDependencies: undefined, }) diff --git a/commands/add/index.js b/commands/add/index.js index 347f262d3e0..b75074189ea 100644 --- a/commands/add/index.js +++ b/commands/add/index.js @@ -105,6 +105,7 @@ class AddCommand extends Command { ignore: undefined, private: undefined, since: undefined, + excludeDependents: undefined, includeFilteredDependents: undefined, includeFilteredDependencies: undefined, }); diff --git a/core/filter-options/index.js b/core/filter-options/index.js index facba7856be..1009633b88c 100644 --- a/core/filter-options/index.js +++ b/core/filter-options/index.js @@ -35,11 +35,20 @@ function filterOptions(yargs) { `, type: "string", }, + "exclude-dependents": { + describe: dedent` + Exclude all transitive dependents when running a command + regardless of --scope, --ignore, or --since. + `, + conflicts: "include-dependents", + type: "boolean", + }, "include-filtered-dependents": { describe: dedent` Include all transitive dependents when running a command regardless of --scope, --ignore, or --since. `, + conflicts: "exclude-dependents", type: "boolean", }, "include-filtered-dependencies": { diff --git a/core/filter-options/lib/get-filtered-packages.js b/core/filter-options/lib/get-filtered-packages.js index 954f9d1100e..03acab3ded2 100644 --- a/core/filter-options/lib/get-filtered-packages.js +++ b/core/filter-options/lib/get-filtered-packages.js @@ -24,6 +24,10 @@ function getFilteredPackages(packageGraph, execOpts, options) { if (options.since !== undefined) { log.notice("filter", "changed since %j", options.since); + if (options.excludeDependents) { + log.notice("filter", "excluding dependents"); + } + chain = chain.then(filteredPackages => Promise.resolve(collectUpdates(filteredPackages, packageGraph, execOpts, options)).then(updates => { const updated = new Set(updates.map(({ pkg }) => pkg.name)); diff --git a/utils/collect-updates/collect-updates.js b/utils/collect-updates/collect-updates.js index 7cc327aea3f..b3745367e9f 100644 --- a/utils/collect-updates/collect-updates.js +++ b/utils/collect-updates/collect-updates.js @@ -13,7 +13,7 @@ module.exports.collectPackages = collectPackages; module.exports.getPackagesForOption = getPackagesForOption; function collectUpdates(filteredPackages, packageGraph, execOpts, commandOptions) { - const { forcePublish, conventionalCommits, conventionalGraduate } = commandOptions; + const { forcePublish, conventionalCommits, conventionalGraduate, excludeDependents } = commandOptions; // If --conventional-commits and --conventional-graduate are both set, ignore --force-publish const useConventionalGraduate = conventionalCommits && conventionalGraduate; @@ -69,6 +69,7 @@ function collectUpdates(filteredPackages, packageGraph, execOpts, commandOptions return collectPackages(packages, { onInclude: name => log.verbose("updated", name), + excludeDependents, }); } @@ -86,5 +87,6 @@ function collectUpdates(filteredPackages, packageGraph, execOpts, commandOptions return collectPackages(packages, { isCandidate: (node, name) => isForced(node, name) || needsBump(node) || hasDiff(node), onInclude: name => log.verbose("updated", name), + excludeDependents, }); } diff --git a/utils/collect-updates/lib/collect-packages.js b/utils/collect-updates/lib/collect-packages.js index 1317a74fa6c..061f20f8884 100644 --- a/utils/collect-updates/lib/collect-packages.js +++ b/utils/collect-updates/lib/collect-packages.js @@ -4,7 +4,7 @@ const collectDependents = require("./collect-dependents"); module.exports = collectPackages; -function collectPackages(packages, { isCandidate = () => true, onInclude } = {}) { +function collectPackages(packages, { isCandidate = () => true, onInclude, excludeDependents } = {}) { const candidates = new Set(); packages.forEach((node, name) => { @@ -13,8 +13,9 @@ function collectPackages(packages, { isCandidate = () => true, onInclude } = {}) } }); - const dependents = collectDependents(candidates); - dependents.forEach(node => candidates.add(node)); + if (!excludeDependents) { + collectDependents(candidates).forEach(node => candidates.add(node)); + } // The result should always be in the same order as the input const updates = [];