102 lines
2.8 KiB
TypeScript
102 lines
2.8 KiB
TypeScript
import * as yargs from 'yargs';
|
|
import { runCommand } from '../tasks-runner/run-command';
|
|
import { NxArgs, splitArgsIntoNxArgsAndOverrides } from './utils';
|
|
import {
|
|
createProjectGraph,
|
|
isWorkspaceProject,
|
|
onlyWorkspaceProjects,
|
|
ProjectGraph,
|
|
ProjectGraphNode,
|
|
withDeps,
|
|
} from '../core/project-graph';
|
|
import { readEnvironment } from '../core/file-utils';
|
|
import { DefaultReporter } from '../tasks-runner/default-reporter';
|
|
import { projectHasTarget } from '../utils/project-graph-utils';
|
|
import { output } from '../utils/output';
|
|
import { promptForNxCloud } from './prompt-for-nx-cloud';
|
|
|
|
export async function runMany(parsedArgs: yargs.Arguments) {
|
|
const { nxArgs, overrides } = splitArgsIntoNxArgsAndOverrides(
|
|
parsedArgs,
|
|
'run-many'
|
|
);
|
|
|
|
await promptForNxCloud(nxArgs.scan);
|
|
|
|
const projectGraph = createProjectGraph();
|
|
const projects = projectsToRun(nxArgs, projectGraph);
|
|
const projectMap: Record<string, ProjectGraphNode> = {};
|
|
projects.forEach((proj) => {
|
|
projectMap[proj.name] = proj;
|
|
});
|
|
const env = readEnvironment(nxArgs.target, projectMap);
|
|
const filteredProjects = Object.values(projects).filter(
|
|
(n) => !parsedArgs.onlyFailed || !env.workspaceResults.getResult(n.name)
|
|
);
|
|
runCommand(
|
|
filteredProjects,
|
|
projectGraph,
|
|
env,
|
|
nxArgs,
|
|
overrides,
|
|
new DefaultReporter(),
|
|
null
|
|
);
|
|
}
|
|
|
|
function projectsToRun(nxArgs: NxArgs, projectGraph: ProjectGraph) {
|
|
const allProjects = Object.values(projectGraph.nodes);
|
|
if (nxArgs.all) {
|
|
return runnableForTarget(allProjects, nxArgs.target);
|
|
} else {
|
|
checkForInvalidProjects(nxArgs, allProjects);
|
|
let selectedProjects = allProjects.filter(
|
|
(p) => nxArgs.projects.indexOf(p.name) > -1
|
|
);
|
|
if (nxArgs.withDeps) {
|
|
selectedProjects = Object.values(
|
|
withDeps(projectGraph, selectedProjects).nodes
|
|
);
|
|
}
|
|
return runnableForTarget(selectedProjects, nxArgs.target, true);
|
|
}
|
|
}
|
|
|
|
function checkForInvalidProjects(
|
|
nxArgs: NxArgs,
|
|
allProjects: ProjectGraphNode[]
|
|
) {
|
|
const invalid = nxArgs.projects.filter(
|
|
(name) => !allProjects.find((p) => p.name === name)
|
|
);
|
|
if (invalid.length !== 0) {
|
|
throw new Error(`Invalid projects: ${invalid.join(', ')}`);
|
|
}
|
|
}
|
|
|
|
function runnableForTarget(
|
|
projects: ProjectGraphNode[],
|
|
target: string,
|
|
strict = false
|
|
): ProjectGraphNode[] {
|
|
const notRunnable = [] as ProjectGraphNode[];
|
|
const runnable = [] as ProjectGraphNode[];
|
|
|
|
for (let project of projects) {
|
|
if (projectHasTarget(project, target)) {
|
|
runnable.push(project);
|
|
} else if (isWorkspaceProject(project)) {
|
|
notRunnable.push(project);
|
|
}
|
|
}
|
|
|
|
if (strict && notRunnable.length) {
|
|
output.warn({
|
|
title: `the following do not have configuration for "${target}"`,
|
|
bodyLines: notRunnable.map((p) => '- ' + p.name),
|
|
});
|
|
}
|
|
|
|
return runnable;
|
|
}
|