nx/packages/workspace/src/command-line/workspace-integrity-checks.ts
Jason Jean e06822da7e
chore(repo): update prettier to v2 (#2934)
this is just for the repo, and not the workspace

Co-authored-by: Rares Matei <matei.rar@gmail.com>
2020-04-29 01:09:37 -04:00

72 lines
2.2 KiB
TypeScript

import { output, CLIErrorMessageConfig } from '../utils/output';
import { ProjectGraph } from '../core/project-graph';
import { workspaceFileName } from '../core/file-utils';
export class WorkspaceIntegrityChecks {
constructor(private projectGraph: ProjectGraph, private files: string[]) {}
run(): CLIErrorMessageConfig[] {
return [...this.projectWithoutFilesCheck(), ...this.filesWithoutProjects()];
}
private projectWithoutFilesCheck(): CLIErrorMessageConfig[] {
const errors = Object.values(this.projectGraph.nodes)
.filter((n) => n.data.files.length === 0)
.map((p) => `Cannot find project '${p.name}' in '${p.data.root}'`);
const errorGroupBodyLines = errors.map(
(f) => `${output.colors.gray('-')} ${f}`
);
return errors.length === 0
? []
: [
{
title: `The ${workspaceFileName()} file is out of sync`,
bodyLines: errorGroupBodyLines,
/**
* TODO(JamesHenry): Add support for error documentation
*/
// slug: 'project-has-no-files'
},
];
}
private filesWithoutProjects(): CLIErrorMessageConfig[] {
const allFilesFromProjects = this.allProjectFiles();
const allFilesWithoutProjects = minus(this.files, allFilesFromProjects);
const first5FilesWithoutProjects =
allFilesWithoutProjects.length > 5
? allFilesWithoutProjects.slice(0, 5)
: allFilesWithoutProjects;
const errorGroupBodyLines = first5FilesWithoutProjects.map(
(f) => `${output.colors.gray('-')} ${f}`
);
return first5FilesWithoutProjects.length === 0
? []
: [
{
title: `The following file(s) do not belong to any projects:`,
bodyLines: errorGroupBodyLines,
/**
* TODO(JamesHenry): Add support for error documentation
*/
// slug: 'file-does-not-belong-to-project'
},
];
}
private allProjectFiles() {
return Object.values(this.projectGraph.nodes).reduce(
(m, c) => [...m, ...c.data.files.map((f) => f.file)],
[]
);
}
}
function minus(a: string[], b: string[]): string[] {
return a.filter((aa) => b.indexOf(aa) === -1);
}