1import { Command } from '@expo/commander';
2
3import { DependencyKind } from '../Packages';
4import { PackagesGraph, printGraph, printNodeDependents } from '../packages-graph';
5
6type ActionOptions = {
7  dev: boolean;
8  peer: boolean;
9  listDependentsOf: string;
10};
11
12async function action(packageNames: string[], options: ActionOptions) {
13  const graph = await PackagesGraph.makeFromPublicPackages();
14  const dependencyKinds = [
15    DependencyKind.Normal,
16    options.dev && DependencyKind.Dev,
17    options.peer && DependencyKind.Peer,
18  ].filter(Boolean) as DependencyKind[];
19
20  if (options.listDependentsOf) {
21    const packageName = options.listDependentsOf;
22    const node = graph.getNode(packageName);
23
24    if (!node) {
25      throw new Error(`Package with name "${packageName}" not found`);
26    }
27    printNodeDependents(node, dependencyKinds);
28    return;
29  }
30
31  printGraph(graph, packageNames, dependencyKinds);
32}
33
34export default (program: Command) => {
35  program
36    .command('packages-dependency-graph [packageNames...]')
37    .alias('pdg')
38    .option('--dev', 'Whether to include dev dependencies', false)
39    .option('--peer', 'Whether to include peer dependencies', false)
40    .option('--list-dependents-of <packageName>', 'Lists all dependents of the given package', '')
41    .asyncAction(action);
42};
43