package-detector
Version:
A fast and comprehensive Node.js CLI tool to analyze your project's package.json and detect various package-related issues
175 lines (174 loc) • 7.95 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
const reporter_1 = require("../src/reporter");
const analyzer_1 = require("../src/analyzer");
const outdatedChecker_1 = require("../src/outdatedChecker");
const duplicateChecker_1 = require("../src/duplicateChecker");
const heavyChecker_1 = require("../src/heavyChecker");
const githubCLI_1 = require("../src/githubCLI");
function runAllDetectors() {
return __awaiter(this, void 0, void 0, function* () {
reporter_1.reporter.printInfo('Running all package detectors...');
// Clear results before starting
reporter_1.reporter.clearResults();
yield (0, analyzer_1.detectUnusedPackages)();
yield (0, outdatedChecker_1.detectOutdatedPackages)();
yield (0, duplicateChecker_1.detectDuplicatePackages)();
yield (0, heavyChecker_1.detectHeavyPackages)();
});
}
function parseArguments() {
var _a, _b;
const args = process.argv.slice(2);
return {
unused: args.includes('--unused'),
outdated: args.includes('--outdated'),
duplicates: args.includes('--duplicates'),
heavy: args.includes('--heavy'),
all: args.includes('--all') || args.length === 0,
help: args.includes('--help') || args.includes('-h'),
github: args.includes('--github'),
githubRepo: getArgValue('--repo'),
githubToken: getArgValue('--token') || githubCLI_1.GitHubCLI.getGitHubToken() || undefined,
githubOwner: getArgValue('--owner'),
githubBaseBranch: getArgValue('--branch') || 'main',
githubAnalyze: args.includes('--analyze'),
githubUpdate: args.includes('--update'),
githubLabels: (_a = getArgValue('--labels')) === null || _a === void 0 ? void 0 : _a.split(',').map(s => s.trim()).filter(Boolean),
githubReviewers: (_b = getArgValue('--reviewers')) === null || _b === void 0 ? void 0 : _b.split(',').map(s => s.trim()).filter(Boolean),
githubCommitMessage: getArgValue('--commit-message')
};
}
function getArgValue(argName) {
const args = process.argv.slice(2);
const index = args.indexOf(argName);
if (index !== -1 && index + 1 < args.length) {
return args[index + 1];
}
return undefined;
}
function main() {
return __awaiter(this, void 0, void 0, function* () {
try {
const options = parseArguments();
// Handle GitHub integration first
if (options.github) {
// Show GitHub help if help is requested
if (options.help) {
reporter_1.reporter.printGitHubHelp();
return;
}
if (options.githubAnalyze) {
// Analyze GitHub repository
const repo = options.githubRepo;
if (!repo) {
reporter_1.reporter.printError('❌ Repository is required for GitHub analysis. Use --repo option.');
return;
}
const parsedRepo = githubCLI_1.GitHubCLI.parseRepository(repo);
if (!parsedRepo) {
reporter_1.reporter.printError('❌ Invalid repository format. Use owner/repo or GitHub URL.');
return;
}
yield githubCLI_1.GitHubCLI.analyzeDependencies({
token: options.githubToken,
owner: parsedRepo.owner,
repo: parsedRepo.repo,
baseBranch: options.githubBaseBranch
});
return;
}
if (options.githubUpdate) {
// Create PR for dependency updates
const repo = options.githubRepo;
if (!repo) {
reporter_1.reporter.printError('❌ Repository is required for GitHub updates. Use --repo option.');
return;
}
const parsedRepo = githubCLI_1.GitHubCLI.parseRepository(repo);
if (!parsedRepo) {
reporter_1.reporter.printError('❌ Invalid repository format. Use owner/repo or GitHub URL.');
return;
}
if (!options.githubToken) {
reporter_1.reporter.printError('❌ GitHub token is required. Set GITHUB_TOKEN environment variable or use --token option.');
return;
}
yield githubCLI_1.GitHubCLI.createUpdatePR({
token: options.githubToken,
owner: parsedRepo.owner,
repo: parsedRepo.repo,
baseBranch: options.githubBaseBranch,
prLabels: options.githubLabels,
prReviewers: options.githubReviewers,
commitMessage: options.githubCommitMessage
});
return;
}
// Default GitHub command - show help
reporter_1.reporter.printGitHubHelp();
return;
}
// Show help if requested (for non-GitHub commands)
if (options.help) {
reporter_1.reporter.printHelp();
return;
}
// Print header
reporter_1.reporter.printHeader();
// Run selected detectors
if (options.all) {
yield runAllDetectors();
}
else {
// Clear results before starting individual detectors
reporter_1.reporter.clearResults();
if (options.unused)
yield (0, analyzer_1.detectUnusedPackages)();
if (options.outdated)
yield (0, outdatedChecker_1.detectOutdatedPackages)();
if (options.duplicates)
yield (0, duplicateChecker_1.detectDuplicatePackages)();
if (options.heavy)
yield (0, heavyChecker_1.detectHeavyPackages)();
}
// Print results
reporter_1.reporter.printResults();
}
catch (error) {
reporter_1.reporter.printError(`Unexpected error: ${error instanceof Error ? error.message : String(error)}`);
process.exit(1);
}
});
}
// Handle process termination
process.on('SIGINT', () => {
console.log('\n');
reporter_1.reporter.printInfo('Process interrupted by user');
process.exit(0);
});
process.on('uncaughtException', (error) => {
reporter_1.reporter.printError(`Uncaught exception: ${error.message}`);
process.exit(1);
});
process.on('unhandledRejection', (reason) => {
reporter_1.reporter.printError(`Unhandled rejection: ${reason}`);
process.exit(1);
});
// Run the main function
if (require.main === module) {
main().catch((error) => {
reporter_1.reporter.printError(`Failed to run package detector: ${error instanceof Error ? error.message : String(error)}`);
process.exit(1);
});
}