@daotl/traf-nx
Version:
A cli tool that wraps `@traf/core` to be used with Nx.
86 lines (84 loc) • 2.88 kB
JavaScript
import { dirname as __dirname__ } from 'path';import { fileURLToPath } from 'url';import { createRequire as topLevelCreateRequire } from 'module';const require = topLevelCreateRequire(import.meta.url);const __filename = fileURLToPath(import.meta.url);const __dirname = __dirname__(__filename);
// libs/nx/src/nx.ts
import { join, resolve } from "path";
import { readFile } from "fs/promises";
import { globby } from "globby";
import { existsSync } from "fs";
async function getNxProjects(cwd) {
const nxProjects = await getNxProjectJsonProjects(cwd);
const workspaceProjects = await getNxWorkspaceProjects(cwd);
const relevantWorkspaceProjects = workspaceProjects.filter(
(proj) => nxProjects.find((nested) => nested.name === proj.name) === void 0
);
return [...nxProjects, ...relevantWorkspaceProjects];
}
async function getNxWorkspaceProjects(cwd) {
try {
const path = resolve(cwd, "workspace.json");
const file = await readFile(path, "utf-8");
const workspace = JSON.parse(file);
return Object.entries(workspace.projects).filter(([, project]) => typeof project === "object").map(([name, project]) => ({
name,
project
}));
} catch (e) {
return [];
}
}
async function getNxProjectJsonProjects(cwd) {
try {
const staticIgnores = ["node_modules", "**/node_modules", "dist", ".git"];
const projectGlobPatterns = [`project.json`, `**/project.json`];
const combinedProjectGlobPattern = "{" + projectGlobPatterns.join(",") + "}";
const files = await globby(combinedProjectGlobPattern, {
ignore: staticIgnores,
ignoreFiles: [".nxignore"],
absolute: true,
cwd,
dot: true,
suppressErrors: true,
gitignore: true
});
const projectFiles = [];
for (const file of files) {
const project = JSON.parse(
await readFile(resolve(cwd, file), "utf-8")
);
projectFiles.push({
name: project.name,
project
});
}
return projectFiles;
} catch (e) {
return [];
}
}
async function getNxTrueAffectedProjects(cwd) {
const projects = await getNxProjects(cwd);
return projects.map(({ name, project }) => {
let tsConfig = project.targets?.build?.options?.tsConfig;
if (!tsConfig) {
const projectRoot = join(project.sourceRoot, "..");
if (project.projectType === "library") {
tsConfig = join(projectRoot, "tsconfig.lib.json");
} else {
tsConfig = join(projectRoot, "tsconfig.app.json");
}
if (!existsSync(resolve(cwd, tsConfig))) {
tsConfig = join(projectRoot, "tsconfig.json");
}
}
return {
name,
sourceRoot: project.sourceRoot,
implicitDependencies: project.implicitDependencies ?? [],
tsConfig,
targets: Object.keys(project.targets ?? {})
};
});
}
export {
getNxProjects,
getNxTrueAffectedProjects
};