@traf/turbo
Version:
A cli tool that wraps `@traf/core` to be used with Turborepo.
58 lines (56 loc) • 1.93 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/turbo/src/turbo.ts
import { dirname, join, relative, resolve } from "path";
import { parse } from "yaml";
import { readFile } from "fs/promises";
import { globby } from "globby";
import { existsSync } from "fs";
async function getWorkspaces(cwd) {
const pnpmFile = resolve(cwd, "pnpm-workspace.yaml");
if (existsSync(pnpmFile)) {
const workspace = parse(await readFile(pnpmFile, "utf-8"));
return workspace.packages;
}
const pkgJson = JSON.parse(
await readFile(resolve(cwd, "package.json"), "utf-8")
);
return pkgJson.workspaces ?? [];
}
async function getTurboTrueAffectedProjects(cwd) {
const workspaces = await getWorkspaces(cwd);
const ignoredWorkspaces = workspaces.filter(
(workspace) => workspace.startsWith("!")
);
const staticIgnores = [
"node_modules",
"**/node_modules",
"dist",
".git",
...ignoredWorkspaces
];
const packageGlobPatterns = workspaces.filter((workspace) => !workspace.startsWith("!")).map((workspace) => {
return join(workspace, "package.json");
});
const combinedPackageGlobPattern = `{${packageGlobPatterns.join(",")},}`;
const files = await globby(combinedPackageGlobPattern, {
ignore: staticIgnores,
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,
sourceRoot: relative(cwd, dirname(file))
});
}
return projectFiles;
}
export {
getTurboTrueAffectedProjects,
getWorkspaces
};