nx/packages/eslint-plugin/src/utils/project-graph-utils.ts

53 lines
1.9 KiB
TypeScript

import { ProjectGraph, readCachedProjectGraph } from '@nx/devkit';
import { isTerminalRun } from './runtime-lint-utils';
import * as chalk from 'chalk';
import {
createProjectRootMappings,
ProjectRootMappings,
} from 'nx/src/project-graph/utils/find-project-for-path';
import { readNxJson } from 'nx/src/project-graph/file-utils';
export function ensureGlobalProjectGraph(ruleName: string) {
/**
* Only reuse graph when running from terminal
* Enforce every IDE change to get a fresh nxdeps.json
*/
if (
!(global as any).projectGraph ||
!(global as any).projectRootMappings ||
!isTerminalRun()
) {
const nxJson = readNxJson();
(global as any).workspaceLayout = nxJson.workspaceLayout;
/**
* Because there are a number of ways in which the rule can be invoked (executor vs ESLint CLI vs IDE Plugin),
* the ProjectGraph may or may not exist by the time the lint rule is invoked for the first time.
*/
try {
(global as any).projectGraph = readCachedProjectGraph();
(global as any).projectRootMappings = createProjectRootMappings(
(global as any).projectGraph.nodes
);
} catch {
const WARNING_PREFIX = `${chalk.reset.keyword('orange')('warning')}`;
const RULE_NAME_SUFFIX = `${chalk.reset.dim(`@nx/${ruleName}`)}`;
process.stdout
.write(`${WARNING_PREFIX} No cached ProjectGraph is available. The rule will be skipped.
If you encounter this error as part of running standard \`nx\` commands then please open an issue on https://github.com/nrwl/nx
${RULE_NAME_SUFFIX}\n`);
}
}
}
export function readProjectGraph(ruleName: string): {
projectGraph: ProjectGraph;
projectRootMappings: ProjectRootMappings;
} {
ensureGlobalProjectGraph(ruleName);
return {
projectGraph: (global as any).projectGraph,
projectRootMappings: (global as any).projectRootMappings,
};
}