UNPKG

next-affected

Version:

CLI tool to list Next.js pages affected by changes

94 lines (93 loc) 4.48 kB
"use strict"; 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); } }