Files
2026-07-13 12:38:36 +08:00

48 lines
1.4 KiB
TypeScript

import * as path from 'path';
import { PathLike, statSync } from 'node:fs';
export function fileExists(path: PathLike): boolean {
try {
return statSync(path).isFile();
} catch {
return false;
}
}
/**
* The root of the workspace
*/
export let workspaceRoot = workspaceRootInner(process.cwd(), process.cwd());
// Required for integration tests in projects which depend on Nx at runtime, such as lerna and angular-eslint
export function setWorkspaceRoot(root: string): void {
workspaceRoot = root;
}
export function workspaceRootInner(
dir: string,
candidateRoot: string | null
): string {
if (process.env.NX_WORKSPACE_ROOT_PATH)
return process.env.NX_WORKSPACE_ROOT_PATH;
if (path.dirname(dir) === dir) return candidateRoot;
const matches = [
path.join(dir, 'nx.json'),
path.join(dir, 'nx'),
path.join(dir, 'nx.bat'),
];
if (matches.some((x) => fileExists(x))) {
return dir;
// This handles the case where we have a workspace which uses npm / yarn / pnpm
// workspaces, and has a project which contains Nx in its dependency tree.
// e.g. packages/my-lib/package.json contains @nx/devkit, which references Nx and is
// thus located in //packages/my-lib/node_modules/nx/package.json
} else if (fileExists(path.join(dir, 'node_modules', 'nx', 'package.json'))) {
return workspaceRootInner(path.dirname(dir), dir);
} else {
return workspaceRootInner(path.dirname(dir), candidateRoot);
}
}