UNPKG

@daotl/traf-nx

Version:

A cli tool that wraps `@traf/core` to be used with Nx.

86 lines (84 loc) 2.88 kB
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 };