diff --git a/package-lock.json b/package-lock.json index f39a453..79e0e81 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,7 +24,7 @@ "eslint-config-prettier": "10.1.5", "eslint-plugin-prettier": "5.5.0", "jiti": "2.4.2", - "prettier": "3.6.0", + "prettier": "3.6.1", "tsx": "4.20.3", "typescript": "5.8.3", "vitest": "3.2.4" @@ -3087,9 +3087,9 @@ } }, "node_modules/prettier": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.0.tgz", - "integrity": "sha512-ujSB9uXHJKzM/2GBuE0hBOUgC77CN3Bnpqa+g80bkv3T3A93wL/xlzDATHhnhkzifz/UE2SNOvmbTz5hSkDlHw==", + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.1.tgz", + "integrity": "sha512-5xGWRa90Sp2+x1dQtNpIpeOQpTDBs9cZDmA/qs2vDNN2i18PdapqY7CmBeyLlMuGqXJRIOPaCaVZTLNQRWUH/A==", "dev": true, "license": "MIT", "bin": { diff --git a/package.json b/package.json index cfb35fe..195344b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "patch-pulse", - "version": "2.8.0", + "version": "2.8.1", "description": "Check for outdated npm dependencies", "type": "module", "bin": { @@ -66,7 +66,7 @@ "eslint-config-prettier": "10.1.5", "eslint-plugin-prettier": "5.5.0", "jiti": "2.4.2", - "prettier": "3.6.0", + "prettier": "3.6.1", "tsx": "4.20.3", "typescript": "5.8.3", "vitest": "3.2.4" diff --git a/src/core/dependency-checker.ts b/src/core/dependency-checker.ts index 5a12eeb..addaad5 100644 --- a/src/core/dependency-checker.ts +++ b/src/core/dependency-checker.ts @@ -67,6 +67,7 @@ export async function checkDependencyVersions( isOutdated, updateType, isSkipped, + category, }; }); diff --git a/src/gen/version.gen.ts b/src/gen/version.gen.ts index f4a8914..e8a3c37 100644 --- a/src/gen/version.gen.ts +++ b/src/gen/version.gen.ts @@ -1,2 +1,2 @@ // Auto-generated file - do not edit manually -export const VERSION = '2.8.0'; +export const VERSION = '2.8.1'; diff --git a/src/index.ts b/src/index.ts index efb1b01..8b9a787 100644 --- a/src/index.ts +++ b/src/index.ts @@ -83,7 +83,10 @@ async function main(): Promise { let depsToUpdate: Array<{ packageName: string; + currentVersion: string; latestVersion: string; + updateType: 'patch' | 'minor' | 'major'; + category: string; }> = []; if (updateType === 'patch') { @@ -91,7 +94,10 @@ async function main(): Promise { .filter(d => d.updateType === 'patch' && d.latestVersion) .map(d => ({ packageName: d.packageName, + currentVersion: d.currentVersion, latestVersion: d.latestVersion!, + updateType: d.updateType!, + category: d.category || 'Dependencies', })); } else if (updateType === 'minor') { depsToUpdate = outdatedDeps @@ -102,14 +108,20 @@ async function main(): Promise { ) .map(d => ({ packageName: d.packageName, + currentVersion: d.currentVersion, latestVersion: d.latestVersion!, + updateType: d.updateType!, + category: d.category || 'Dependencies', })); } else if (updateType === 'all') { depsToUpdate = outdatedDeps .filter(d => d.latestVersion) .map(d => ({ packageName: d.packageName, + currentVersion: d.currentVersion, latestVersion: d.latestVersion!, + updateType: d.updateType!, + category: d.category || 'Dependencies', })); } diff --git a/src/services/package-manager.ts b/src/services/package-manager.ts index cf5a645..51acea1 100644 --- a/src/services/package-manager.ts +++ b/src/services/package-manager.ts @@ -2,6 +2,7 @@ import chalk from 'chalk'; import { spawn } from 'child_process'; import { existsSync } from 'fs'; import { join } from 'path'; +import { pluralize } from '../utils/pluralize'; export type PackageManager = 'npm' | 'pnpm' | 'yarn' | 'bun'; @@ -107,7 +108,13 @@ export function runPackageManagerCommand( * @returns Promise that resolves when all updates are complete */ export async function updateDependencies( - dependencies: Array<{ packageName: string; latestVersion: string }>, + dependencies: Array<{ + packageName: string; + currentVersion: string; + latestVersion: string; + updateType: 'patch' | 'minor' | 'major'; + category: string; + }>, packageManager: PackageManagerInfo ): Promise { if (dependencies.length === 0) { @@ -115,12 +122,52 @@ export async function updateDependencies( return; } + const dependencyWord = pluralize( + dependencies.length, + 'dependency', + 'dependencies' + ); + console.log( chalk.cyan( - `\nšŸ”„ Updating ${dependencies.length} dependencies using ${packageManager.name}...` + `\nšŸ”„ Updating ${dependencies.length} ${dependencyWord} using ${packageManager.name}...` ) ); + // Group dependencies by category + const groupedDeps = dependencies.reduce( + (groups, dep) => { + const category = dep.category || 'Dependencies'; + if (!groups[category]) { + groups[category] = []; + } + groups[category].push(dep); + return groups; + }, + {} as Record + ); + + // Show version changes for each dependency grouped by category + for (const [category, deps] of Object.entries(groupedDeps)) { + if (deps.length > 0) { + console.log(chalk.gray(`${category}:`)); + + for (const dep of deps) { + const updateTypeColor = { + major: chalk.yellow, + minor: chalk.magenta, + patch: chalk.blue, + }[dep.updateType]; + const updateTypeLabel = updateTypeColor(`[${dep.updateType}]`); + console.log( + chalk.gray( + ` ${dep.packageName}: ${dep.currentVersion} → ${dep.latestVersion} ${updateTypeLabel}` + ) + ); + } + } + } + try { // Build the arguments array for the package manager const args: string[] = []; @@ -147,7 +194,7 @@ export async function updateDependencies( console.log( chalk.green( - `\nāœ… Successfully updated ${dependencies.length} dependencies!` + `\nāœ… Successfully updated ${dependencies.length} ${dependencyWord}!` ) ); } catch (error) { diff --git a/src/types.ts b/src/types.ts index f95a9a2..cc89693 100644 --- a/src/types.ts +++ b/src/types.ts @@ -13,6 +13,7 @@ export interface DependencyInfo { isOutdated: boolean; updateType?: 'patch' | 'minor' | 'major'; isSkipped?: boolean; + category?: string; } export interface NpmPackageInfo {