From 89dc61747166c29fb625bfb1186f8e2e51292422 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 7 Jan 2022 11:35:57 +0100 Subject: [PATCH] cli: switch lib/config to use get-packages and PackageGraph Signed-off-by: Patrik Oldsberg --- packages/cli/src/lib/config.ts | 50 ++++++++++------------------------ 1 file changed, 14 insertions(+), 36 deletions(-) diff --git a/packages/cli/src/lib/config.ts b/packages/cli/src/lib/config.ts index 986e409e58..b43e4798b4 100644 --- a/packages/cli/src/lib/config.ts +++ b/packages/cli/src/lib/config.ts @@ -22,6 +22,8 @@ import { import { ConfigReader } from '@backstage/config'; import { paths } from './paths'; import { isValidUrl } from './urls'; +import { getPackages } from '@manypkg/get-packages'; +import { PackageGraph } from './monorepo'; type Options = { args: string[]; @@ -40,20 +42,27 @@ export async function loadCliConfig(options: Options) { }); // Consider all packages in the monorepo when loading in config - const { Project } = require('@lerna/project'); - const project = new Project(paths.targetDir); - const packages = await project.getPackages(); + const { packages } = await getPackages(paths.targetDir); let localPackageNames; if (options.fromPackage) { if (packages.length) { - localPackageNames = findPackages(packages, options.fromPackage); + const graph = PackageGraph.fromPackages(packages); + localPackageNames = Array.from( + graph.collectPackageNames([options.fromPackage], node => { + // Workaround for Backstage main repo only, since the CLI has some artificial devDependencies + if (node.name === '@backstage/cli') { + return undefined; + } + return node.localDependencies.keys(); + }), + ); } else { // No packages: it means that it's not a monorepo (e.g. standalone plugin) localPackageNames = [options.fromPackage]; } } else { - localPackageNames = packages.map((p: any) => p.name); + localPackageNames = packages.map(p => p.packageJson.name); } const schema = await loadConfigSchema({ @@ -100,34 +109,3 @@ export async function loadCliConfig(options: Options) { throw error; } } - -function findPackages(packages: any[], fromPackage: string): string[] { - const { PackageGraph } = require('@lerna/package-graph'); - - const graph = new PackageGraph(packages); - - const targets = new Set(); - const searchNames = [fromPackage]; - - while (searchNames.length) { - const name = searchNames.pop()!; - - if (targets.has(name)) { - continue; - } - - const node = graph.get(name); - if (!node) { - throw new Error(`Package '${name}' not found`); - } - - targets.add(name); - - // Workaround for Backstage main repo only, since the CLI has some artificial devDependencies - if (name !== '@backstage/cli') { - searchNames.push(...node.localDependencies.keys()); - } - } - - return Array.from(targets); -}