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