next-affected
Version:
CLI tool to list Next.js pages affected by changes
94 lines (93 loc) • 4.48 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.runNextAffected = runNextAffected;
const path_1 = __importDefault(require("path"));
const config_1 = require("./config");
const git_1 = require("./git");
const graph_1 = require("./graph");
async function runNextAffected(componentPath, options) {
try {
if (options.verbose)
console.log("Starting next-affected analysis...");
const projectDir = path_1.default.resolve(process.cwd(), options.project);
const config = (0, config_1.loadConfig)(projectDir);
const maxDepth = options.depth ?? Infinity;
console.log("Building dependency graph. This may take a while...");
const dependencyGraph = await (0, graph_1.getDependencyGraph)(projectDir, config);
if (options.verbose)
console.log("Dependency graph built.");
const affectedPages = new Set();
const totalModules = Object.keys(dependencyGraph).length;
let totalProcessedModules = 0;
if (componentPath) {
// Analyze a specific component
if (options.verbose)
console.log(`Analyzing component: ${componentPath}`);
const componentFullPath = path_1.default.resolve(process.cwd(), componentPath);
const componentRelativePath = path_1.default.relative(projectDir, componentFullPath);
const affected = (0, graph_1.findAffectedPages)(dependencyGraph, componentRelativePath, projectDir, config, maxDepth, options.verbose, (processedModules) => {
totalProcessedModules += processedModules;
if (!options.verbose) {
process.stdout.write(`\rProcessed modules: ${totalProcessedModules}/${totalModules}`);
}
});
affected.forEach((page) => affectedPages.add(page));
if (!options.verbose) {
process.stdout.write(`\rProcessed modules: ${totalProcessedModules}/${totalModules}\n`);
}
}
else if (options.base) {
// Analyze changes between Git references
console.log(`Getting changed files between ${options.base} and ${options.head ?? "HEAD"}`);
const changedFiles = (0, git_1.getChangedFiles)({
base: options.base,
head: options.head ?? "HEAD",
projectDir: projectDir,
includeUncommitted: options.uncommitted ?? false,
onlyUncommitted: options.onlyUncommitted ?? false,
});
if (changedFiles.length === 0) {
console.log("No changes detected between the specified commits or branches.");
process.exit(0);
}
console.log(`Found ${changedFiles.length} changed files.`);
console.log("Analyzing affected pages...");
let processedFiles = 0;
const totalFiles = changedFiles.length;
for (const file of changedFiles) {
if (options.verbose)
console.log(`Processing file: ${file}`);
else {
// Output progress every file
process.stdout.write(`\rProcessing files: ${processedFiles + 1}/${totalFiles}`);
}
const affected = (0, graph_1.findAffectedPages)(dependencyGraph, file, projectDir, config, maxDepth, options.verbose, (processedModules) => {
totalProcessedModules += processedModules;
});
affected.forEach((page) => affectedPages.add(page));
processedFiles++;
}
if (!options.verbose) {
process.stdout.write(`\nTotal modules processed: ${totalProcessedModules}/${totalModules}\n`);
}
}
else {
console.error("Error: You must specify a component path or use --base to compare commits or branches.");
process.exit(1);
}
if (affectedPages.size > 0) {
console.log("\nAffected Pages:");
affectedPages.forEach((page) => console.log(page));
}
else {
console.log("\nNo affected pages found.");
}
}
catch (error) {
console.error("Error:", error.message);
console.error(error);
}
}