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