Skip to content

Commit

Permalink
feat(filter-options): Add --exclude-dependents option
Browse files Browse the repository at this point in the history
Footguns abound.

Fixes lerna#2198
  • Loading branch information
evocateur committed Oct 7, 2019
1 parent 3657a8b commit 62df43f
Show file tree
Hide file tree
Showing 6 changed files with 22 additions and 4 deletions.
1 change: 1 addition & 0 deletions commands/add/__tests__/add-command.test.js
Expand Up @@ -290,6 +290,7 @@ describe("AddCommand", () => {
ignore: undefined,
private: undefined,
since: undefined,
excludeDependents: undefined,
includeFilteredDependents: undefined,
includeFilteredDependencies: undefined,
})
Expand Down
1 change: 1 addition & 0 deletions commands/add/index.js
Expand Up @@ -105,6 +105,7 @@ class AddCommand extends Command {
ignore: undefined,
private: undefined,
since: undefined,
excludeDependents: undefined,
includeFilteredDependents: undefined,
includeFilteredDependencies: undefined,
});
Expand Down
9 changes: 9 additions & 0 deletions core/filter-options/index.js
Expand Up @@ -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": {
Expand Down
4 changes: 4 additions & 0 deletions core/filter-options/lib/get-filtered-packages.js
Expand Up @@ -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));
Expand Down
4 changes: 3 additions & 1 deletion utils/collect-updates/collect-updates.js
Expand Up @@ -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;
Expand Down Expand Up @@ -69,6 +69,7 @@ function collectUpdates(filteredPackages, packageGraph, execOpts, commandOptions

return collectPackages(packages, {
onInclude: name => log.verbose("updated", name),
excludeDependents,
});
}

Expand All @@ -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,
});
}
7 changes: 4 additions & 3 deletions utils/collect-updates/lib/collect-packages.js
Expand Up @@ -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) => {
Expand All @@ -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 = [];
Expand Down

0 comments on commit 62df43f

Please sign in to comment.