Skip to content

Commit b59fe4c

Browse files
Merge pull request #12 from barrymichaeldoyle/cli-dependency-progress-counter
Add package progress counters during CLI dependency checks
2 parents b0c08a4 + 63d8a2d commit b59fe4c

6 files changed

Lines changed: 92 additions & 11 deletions

File tree

packages/cli/CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# patch-pulse
22

3+
## 4.1.1
4+
5+
### Patch Changes
6+
7+
- Show package-level progress counts during CLI dependency checks.
8+
39
## 4.1.0
410

511
### Minor Changes

packages/cli/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "patch-pulse",
3-
"version": "4.1.0",
3+
"version": "4.1.1",
44
"description": "Check for outdated npm dependencies",
55
"type": "module",
66
"bin": {

packages/cli/src/cli.ts

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -217,15 +217,19 @@ export async function runCli({
217217

218218
const sectionLabel = dependencyTypeLabels[key];
219219

220-
projectSpinner?.start(`Checking ${sectionLabel.toLowerCase()}...`);
221-
222220
try {
223221
const dependencyMap = Object.fromEntries(
224222
value.map((dependency) => [
225223
dependency.packageName,
226224
dependency.source.resolvedVersion,
227225
]),
228226
);
227+
const totalDependencies = value.length;
228+
229+
projectSpinner?.start(
230+
`Checking ${sectionLabel.toLowerCase()}... (0/${totalDependencies})`,
231+
);
232+
229233
const sourceMap = new Map(
230234
value.map((dependency) => [
231235
dependency.packageName,
@@ -236,7 +240,14 @@ export async function runCli({
236240
dependencyMap,
237241
sectionLabel,
238242
config,
239-
{ silent: !streamInline },
243+
{
244+
onProgress: ({ completedCount, totalCount }) => {
245+
projectSpinner?.updateMessage(
246+
`Checking ${sectionLabel.toLowerCase()}... (${completedCount}/${totalCount})`,
247+
);
248+
},
249+
silent: !streamInline,
250+
},
240251
);
241252

242253
projectSpinner?.stop();

packages/cli/src/core/dependency-checker.ts

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,18 +15,20 @@ export async function checkDependencyVersions(
1515
category: string,
1616
config?: PatchPulseConfig,
1717
options: {
18+
onProgress?: (args: { completedCount: number; totalCount: number }) => void;
1819
silent?: boolean;
1920
} = {},
2021
): Promise<DependencyInfo[]> {
21-
const { silent = false } = options;
22+
const { onProgress, silent = false } = options;
2223

2324
if (!dependencies || Object.keys(dependencies).length === 0) {
2425
return [];
2526
}
2627

2728
const packageNames = Object.keys(dependencies);
2829
const progress = silent ? null : new ProgressSpinner();
29-
progress?.start(`Checking ${packageNames.length} packages...`);
30+
const totalCount = packageNames.length;
31+
progress?.start(`Checking ${totalCount} packages...`);
3032

3133
const skippedResults: DependencyInfo[] = [];
3234
const dependenciesToCheck = Object.fromEntries(
@@ -50,6 +52,19 @@ export async function checkDependencyVersions(
5052
);
5153

5254
let checkedResults: DependencyInfo[] = [];
55+
const reportProgress = (completedCount: number): void => {
56+
const overallCompletedCount = completedCount + skippedResults.length;
57+
58+
progress?.updateMessage(
59+
`Checking ${totalCount} packages... (${overallCompletedCount}/${totalCount})`,
60+
);
61+
onProgress?.({
62+
completedCount: overallCompletedCount,
63+
totalCount,
64+
});
65+
};
66+
67+
reportProgress(0);
5368

5469
try {
5570
checkedResults =
@@ -70,10 +85,8 @@ export async function checkDependencyVersions(
7085
);
7186
}
7287
},
73-
onResolved: ({ completedCount, totalCount }) => {
74-
progress?.updateMessage(
75-
`Checking ${packageNames.length} packages... (${completedCount + skippedResults.length}/${totalCount + skippedResults.length})`,
76-
);
88+
onResolved: ({ completedCount }) => {
89+
reportProgress(completedCount);
7790
},
7891
userAgent: 'patch-pulse-cli',
7992
})) as DependencyInfo[]);

packages/cli/src/core/tests/dependency-checker.test.ts

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,4 +62,55 @@ describe('checkDependencyVersions', () => {
6262

6363
expect(process.stdout.write).toHaveBeenCalledWith('\r\x1B[2K');
6464
});
65+
66+
it('reports progress counts including skipped packages', async () => {
67+
vi.mocked(checkNpmDependencyStatuses).mockImplementation(
68+
async (_dependencies, options) => {
69+
options?.onResolved?.({
70+
completedCount: 1,
71+
result: {
72+
packageName: 'react',
73+
currentVersion: '18.2.0',
74+
latestVersion: '19.2.0',
75+
isOutdated: true,
76+
status: 'update-available',
77+
updateType: 'major',
78+
},
79+
totalCount: 1,
80+
});
81+
82+
return [
83+
{
84+
packageName: 'react',
85+
currentVersion: '18.2.0',
86+
latestVersion: '19.2.0',
87+
isOutdated: true,
88+
status: 'update-available',
89+
updateType: 'major',
90+
},
91+
];
92+
},
93+
);
94+
95+
const onProgress = vi.fn();
96+
97+
await checkDependencyVersions(
98+
{
99+
react: '18.2.0',
100+
'@types/node': 'latest',
101+
},
102+
'Dependencies',
103+
{ skip: ['@types/node'] },
104+
{ onProgress, silent: true },
105+
);
106+
107+
expect(onProgress).toHaveBeenNthCalledWith(1, {
108+
completedCount: 1,
109+
totalCount: 2,
110+
});
111+
expect(onProgress).toHaveBeenNthCalledWith(2, {
112+
completedCount: 2,
113+
totalCount: 2,
114+
});
115+
});
65116
});
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
// Auto-generated file - do not edit manually
2-
export const VERSION = '4.1.0';
2+
export const VERSION = '4.1.1';

0 commit comments

Comments
 (0)