dep-up-surgeon 2.2.0 → 2.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/README.md +107 -22
  2. package/dist/cli/doctor.d.ts +52 -0
  3. package/dist/cli/doctor.d.ts.map +1 -0
  4. package/dist/cli/doctor.js +616 -0
  5. package/dist/cli/doctor.js.map +1 -0
  6. package/dist/cli/doctorCommand.d.ts +2 -0
  7. package/dist/cli/doctorCommand.d.ts.map +1 -0
  8. package/dist/cli/doctorCommand.js +71 -0
  9. package/dist/cli/doctorCommand.js.map +1 -0
  10. package/dist/cli/doctorRenderer.d.ts +21 -0
  11. package/dist/cli/doctorRenderer.d.ts.map +1 -0
  12. package/dist/cli/doctorRenderer.js +79 -0
  13. package/dist/cli/doctorRenderer.js.map +1 -0
  14. package/dist/cli/git.d.ts +11 -0
  15. package/dist/cli/git.d.ts.map +1 -1
  16. package/dist/cli/git.js +45 -9
  17. package/dist/cli/git.js.map +1 -1
  18. package/dist/cli/gitFlow.d.ts.map +1 -1
  19. package/dist/cli/gitFlow.js +7 -0
  20. package/dist/cli/gitFlow.js.map +1 -1
  21. package/dist/cli/lockfileFix.d.ts +91 -0
  22. package/dist/cli/lockfileFix.d.ts.map +1 -0
  23. package/dist/cli/lockfileFix.js +509 -0
  24. package/dist/cli/lockfileFix.js.map +1 -0
  25. package/dist/cli/report.d.ts +4 -0
  26. package/dist/cli/report.d.ts.map +1 -1
  27. package/dist/cli/report.js +5 -0
  28. package/dist/cli/report.js.map +1 -1
  29. package/dist/cli/summary.d.ts.map +1 -1
  30. package/dist/cli/summary.js +221 -2
  31. package/dist/cli/summary.js.map +1 -1
  32. package/dist/cli.js +80 -1
  33. package/dist/cli.js.map +1 -1
  34. package/dist/core/peerResolver.d.ts +82 -0
  35. package/dist/core/peerResolver.d.ts.map +1 -0
  36. package/dist/core/peerResolver.js +213 -0
  37. package/dist/core/peerResolver.js.map +1 -0
  38. package/dist/core/upgrader.d.ts +30 -6
  39. package/dist/core/upgrader.d.ts.map +1 -1
  40. package/dist/core/upgrader.js +195 -14
  41. package/dist/core/upgrader.js.map +1 -1
  42. package/dist/core/workspaces.d.ts +22 -0
  43. package/dist/core/workspaces.d.ts.map +1 -1
  44. package/dist/core/workspaces.js +52 -0
  45. package/dist/core/workspaces.js.map +1 -1
  46. package/dist/types.d.ts +92 -0
  47. package/dist/types.d.ts.map +1 -1
  48. package/dist/utils/concurrency.d.ts +55 -0
  49. package/dist/utils/concurrency.d.ts.map +1 -1
  50. package/dist/utils/concurrency.js +46 -1
  51. package/dist/utils/concurrency.js.map +1 -1
  52. package/dist/utils/npm.d.ts +14 -0
  53. package/dist/utils/npm.d.ts.map +1 -1
  54. package/dist/utils/npm.js +48 -0
  55. package/dist/utils/npm.js.map +1 -1
  56. package/package.json +3 -3
@@ -0,0 +1,509 @@
1
+ /**
2
+ * `--fix-lockfile` implementation.
3
+ *
4
+ * This pass improves the lockfile's dependency graph WITHOUT touching `package.json`. The
5
+ * two complementary effects:
6
+ *
7
+ * 1. **Dedupe** — collapse multiple copies of the same package to a single installed
8
+ * version when semver ranges permit it. `npm dedupe` / `pnpm dedupe` / `yarn dedupe`
9
+ * (berry only) do this natively; we just orchestrate the run and surface the diff.
10
+ * 2. **Outdated-but-not-vulnerable transitive detection** — a best-effort scan of the
11
+ * pre-dedupe lockfile for transitives that have newer published versions available.
12
+ * These are the "nobody complains about them but they're 6 months behind" deps that
13
+ * no direct bump can reach. We report them; an override step (`--apply-overrides`)
14
+ * handles the vulnerable subset.
15
+ *
16
+ * Safety model — we never leave the tree in a worse state than we found it:
17
+ * - Backup lockfile (+ package.json, which dedupe should never touch but belt-and-braces)
18
+ * before running the manager's dedupe command.
19
+ * - If dedupe exits non-zero, restore the backup and report the failure.
20
+ * - If the validator (same `--validate`/default heuristic as everywhere else) fails on the
21
+ * deduped tree, restore the backup, reinstall, and report validation as the reason.
22
+ * - On success, emit `report.lockfileFix` with a list of packages whose installed version
23
+ * changed (dedup winners + losers) and a list of transitives flagged as stale.
24
+ *
25
+ * Non-goals:
26
+ * - We do NOT rewrite the lockfile ourselves — only the package manager does. Parsing
27
+ * lockfiles across npm v1/v2/v3, pnpm v5/v6/v9, yarn classic, and yarn berry is a
28
+ * quagmire; using the tool's own command is both safer and future-proof.
29
+ * - We don't attempt to dedupe yarn classic — it has no `dedupe` subcommand. We record
30
+ * a `skipped: 'unsupported'` entry and move on.
31
+ */
32
+ import path from 'node:path';
33
+ import fs from 'fs-extra';
34
+ import semver from 'semver';
35
+ import { execa } from 'execa';
36
+ import { log } from '../utils/logger.js';
37
+ import { fetchLatestVersion } from '../utils/npm.js';
38
+ import { tailLines } from '../utils/output.js';
39
+ import { runWithConcurrency } from '../utils/concurrency.js';
40
+ /**
41
+ * Returns the lockfile basename for a manager, or `undefined` when the tree has no lockfile
42
+ * yet (we'd create one as a side-effect of install; there's nothing to "fix" in that case).
43
+ */
44
+ function lockfileBasenameFor(manager) {
45
+ switch (manager) {
46
+ case 'pnpm':
47
+ return 'pnpm-lock.yaml';
48
+ case 'yarn':
49
+ return 'yarn.lock';
50
+ case 'npm':
51
+ default:
52
+ return 'package-lock.json';
53
+ }
54
+ }
55
+ /**
56
+ * Build the dedupe command for each manager. Returns `undefined` when the manager has no
57
+ * dedupe subcommand at all (yarn classic) — caller records a skip.
58
+ *
59
+ * Notes:
60
+ * - `npm dedupe` returns non-zero when audit issues are found (even without `--audit`).
61
+ * We pass `--no-audit` to keep the run about dedupe only; the security loop does audit.
62
+ * - `pnpm dedupe` is stable since pnpm 8.1 (Feb 2024). Older pnpm silently ignores the
63
+ * subcommand with exit 1 — we treat that the same as "no changes" and move on.
64
+ * - `yarn dedupe` is berry-only. Yarn classic: we detect `yarnMajorVersion < 2` externally
65
+ * and return `undefined` here so the caller can emit a `skipped: unsupported` result.
66
+ */
67
+ export function dedupeCommandFor(manager, opts = {}) {
68
+ switch (manager) {
69
+ case 'pnpm':
70
+ return { bin: 'pnpm', args: ['dedupe'] };
71
+ case 'yarn':
72
+ if ((opts.yarnMajorVersion ?? 1) >= 2) {
73
+ return { bin: 'yarn', args: ['dedupe'] };
74
+ }
75
+ return undefined;
76
+ case 'npm':
77
+ default:
78
+ return { bin: 'npm', args: ['dedupe', '--no-audit', '--loglevel', 'error'] };
79
+ }
80
+ }
81
+ /**
82
+ * Main entry point. Orchestrates dedupe + validation + stale-transitive scan and returns
83
+ * a structured report suitable for inclusion in `FinalReport.lockfileFix`.
84
+ */
85
+ export async function runLockfileFix(opts) {
86
+ const { cwd, manager, yarnMajorVersion, json, dryRun } = opts;
87
+ const lockfileBasename = lockfileBasenameFor(manager);
88
+ const lockfilePath = path.join(cwd, lockfileBasename);
89
+ // No lockfile → nothing to dedupe. Emit a `skipped` report so --json consumers see the
90
+ // reason explicitly rather than the field being absent.
91
+ if (!(await fs.pathExists(lockfilePath))) {
92
+ return {
93
+ report: {
94
+ status: 'skipped',
95
+ skipReason: 'no-lockfile',
96
+ manager,
97
+ lockfile: lockfileBasename,
98
+ dedupeChanges: [],
99
+ stale: [],
100
+ },
101
+ };
102
+ }
103
+ const dedupe = dedupeCommandFor(manager, { yarnMajorVersion });
104
+ if (!dedupe) {
105
+ return {
106
+ report: {
107
+ status: 'skipped',
108
+ skipReason: 'unsupported',
109
+ manager,
110
+ lockfile: lockfileBasename,
111
+ dedupeChanges: [],
112
+ stale: [],
113
+ },
114
+ };
115
+ }
116
+ // Snapshot the pre-dedupe lockfile so we can diff + roll back.
117
+ const before = await fs.readFile(lockfilePath, 'utf8');
118
+ const beforeTree = parseLockfileInstalledVersions(before, manager);
119
+ // Pre-flight stale-transitive scan. Runs BEFORE dedupe because (a) dedupe may remove
120
+ // some entries entirely, and (b) we want to report what WOULD benefit from a package.json
121
+ // bump even if dedupe doesn't touch it. Bounded + best-effort — any error drops the scan
122
+ // silently so we never block on it.
123
+ const stale = await scanStaleTransitives(beforeTree, opts.registryCache, opts.staleScanLimit ?? 250);
124
+ if (dryRun) {
125
+ return {
126
+ report: {
127
+ status: 'dry-run',
128
+ manager,
129
+ lockfile: lockfileBasename,
130
+ command: `${dedupe.bin} ${dedupe.args.join(' ')}`,
131
+ dedupeChanges: [],
132
+ stale,
133
+ },
134
+ };
135
+ }
136
+ if (!json) {
137
+ log.info(`Running \`${dedupe.bin} ${dedupe.args.join(' ')}\` to dedupe the lockfile …`);
138
+ }
139
+ const r = await execa(dedupe.bin, dedupe.args, { cwd, reject: false, all: true });
140
+ const output = [r.stdout, r.stderr].filter(Boolean).join('\n');
141
+ const lastLines = tailLines(output, 20);
142
+ if ((r.exitCode ?? 1) !== 0) {
143
+ // Restore lockfile from snapshot — if the manager partially rewrote it before bailing,
144
+ // this puts us back exactly where we started.
145
+ await fs.writeFile(lockfilePath, before, 'utf8');
146
+ if (opts.runInstallAfterRollback) {
147
+ try {
148
+ await opts.runInstallAfterRollback();
149
+ }
150
+ catch {
151
+ /* non-fatal; tree may be briefly out of sync */
152
+ }
153
+ }
154
+ return {
155
+ report: {
156
+ status: 'failed',
157
+ manager,
158
+ lockfile: lockfileBasename,
159
+ command: `${dedupe.bin} ${dedupe.args.join(' ')}`,
160
+ exitCode: r.exitCode ?? 1,
161
+ failureKind: 'dedupe',
162
+ lastLines,
163
+ dedupeChanges: [],
164
+ stale,
165
+ },
166
+ };
167
+ }
168
+ // Dedupe succeeded — now validate. If the user turned validation off, skip this step.
169
+ const after = await fs.readFile(lockfilePath, 'utf8');
170
+ const afterTree = parseLockfileInstalledVersions(after, manager);
171
+ const dedupeChanges = diffLockfileTrees(beforeTree, afterTree);
172
+ if (opts.runValidator) {
173
+ const vr = await opts.runValidator();
174
+ if (!vr.ok) {
175
+ await fs.writeFile(lockfilePath, before, 'utf8');
176
+ if (opts.runInstallAfterRollback) {
177
+ try {
178
+ await opts.runInstallAfterRollback();
179
+ }
180
+ catch {
181
+ /* non-fatal */
182
+ }
183
+ }
184
+ return {
185
+ report: {
186
+ status: 'failed',
187
+ manager,
188
+ lockfile: lockfileBasename,
189
+ command: `${dedupe.bin} ${dedupe.args.join(' ')}`,
190
+ exitCode: 0,
191
+ failureKind: 'validation',
192
+ validatorCommand: vr.command,
193
+ lastLines: vr.lastLines ?? lastLines,
194
+ dedupeChanges,
195
+ stale,
196
+ },
197
+ };
198
+ }
199
+ }
200
+ return {
201
+ report: {
202
+ status: 'ok',
203
+ manager,
204
+ lockfile: lockfileBasename,
205
+ command: `${dedupe.bin} ${dedupe.args.join(' ')}`,
206
+ exitCode: 0,
207
+ dedupeChanges,
208
+ stale,
209
+ },
210
+ };
211
+ }
212
+ /**
213
+ * Parse a lockfile and return a `Map<packageName, Set<installedVersion>>` of every concrete
214
+ * version that actually made it into `node_modules`. This is the minimum information we need
215
+ * for a useful before/after diff — we DON'T try to reconstruct the dep graph, only "which
216
+ * versions of X are installed".
217
+ *
218
+ * The parsers are format-tolerant by design: on any unexpected shape we return an empty map
219
+ * rather than throw. The caller treats that as "no diff was computable" — `dedupeChanges`
220
+ * stays empty and the `status: 'ok'` is honest (we really did run dedupe, we just can't
221
+ * quantify the delta).
222
+ */
223
+ export function parseLockfileInstalledVersions(raw, manager) {
224
+ const out = new Map();
225
+ try {
226
+ if (manager === 'npm') {
227
+ return parseNpmLockfile(raw);
228
+ }
229
+ if (manager === 'pnpm') {
230
+ return parsePnpmLockfile(raw);
231
+ }
232
+ if (manager === 'yarn') {
233
+ return parseYarnLockfile(raw);
234
+ }
235
+ }
236
+ catch {
237
+ /* fall through */
238
+ }
239
+ return out;
240
+ }
241
+ /**
242
+ * npm lockfile parsers handle both v1 (top-level `dependencies`) and v2/v3 (`packages` map
243
+ * keyed by on-disk path). v2 lockfiles carry BOTH fields for backward compatibility with
244
+ * npm@6; we prefer `packages` because it's flatter and reliable.
245
+ */
246
+ function parseNpmLockfile(raw) {
247
+ const out = new Map();
248
+ const j = JSON.parse(raw);
249
+ if (j.packages && typeof j.packages === 'object') {
250
+ for (const [key, entry] of Object.entries(j.packages)) {
251
+ // `""` is the root workspace entry; skip. For nested paths the package name is the
252
+ // segment after the LAST `/node_modules/` occurrence. For scoped packages (`@scope/x`)
253
+ // that segment actually contains a `/`, which our splitter handles.
254
+ if (!key || typeof entry?.version !== 'string')
255
+ continue;
256
+ const name = extractPackageNameFromNodeModulesPath(key);
257
+ if (!name)
258
+ continue;
259
+ addVersion(out, name, entry.version);
260
+ }
261
+ return out;
262
+ }
263
+ if (j.dependencies && typeof j.dependencies === 'object') {
264
+ // v1: walk recursively; names are keys, nested `dependencies` follow the same shape.
265
+ const walk = (deps) => {
266
+ for (const [name, d] of Object.entries(deps)) {
267
+ if (typeof d?.version === 'string')
268
+ addVersion(out, name, d.version);
269
+ if (d && typeof d.dependencies === 'object') {
270
+ walk(d.dependencies);
271
+ }
272
+ }
273
+ };
274
+ walk(j.dependencies);
275
+ return out;
276
+ }
277
+ return out;
278
+ }
279
+ /**
280
+ * pnpm lockfile is YAML. We avoid pulling in a full YAML parser by doing a targeted scrape
281
+ * of the `packages:` section keys, which look like:
282
+ * /axios@1.6.2:
283
+ * /@types/node@20.4.5:
284
+ * /@babel/core@7.22.5(something):
285
+ * pnpm v9 switched to `'axios@1.6.2':` (unslashed, quoted). Both shapes are supported; we
286
+ * strip the prefix, split on the LAST `@`, and that's the version.
287
+ */
288
+ function parsePnpmLockfile(raw) {
289
+ const out = new Map();
290
+ const lines = raw.split(/\r?\n/);
291
+ let inPackages = false;
292
+ for (const line of lines) {
293
+ if (/^packages:\s*$/.test(line)) {
294
+ inPackages = true;
295
+ continue;
296
+ }
297
+ // Top-level key at column 0 other than `packages:` ends the block.
298
+ if (inPackages && /^[^\s#]/.test(line) && !/^packages:/.test(line)) {
299
+ inPackages = false;
300
+ }
301
+ if (!inPackages)
302
+ continue;
303
+ const m = line.match(/^\s{2}['"]?\/?(@?[^@'"/\s]+(?:\/[^@'"/\s]+)?)@([^(:'"\s]+)/);
304
+ if (m)
305
+ addVersion(out, m[1], m[2]);
306
+ }
307
+ return out;
308
+ }
309
+ /**
310
+ * yarn.lock is a bespoke text format (classic) or YAML-ish (berry). We scrape `version
311
+ * "x.y.z"` lines following a `<spec>:` header — that shape is common across both versions
312
+ * and gives us everything we need without a real parser.
313
+ */
314
+ function parseYarnLockfile(raw) {
315
+ const out = new Map();
316
+ const lines = raw.split(/\r?\n/);
317
+ let currentNames = [];
318
+ for (const line of lines) {
319
+ // Entry header examples:
320
+ // axios@^1.6.0:
321
+ // "axios@^1.6.0", "axios@1.7.2":
322
+ // "@types/node@^20":
323
+ const headerMatch = line.match(/^(?:"[^"]+"|\S[^:]*):\s*$/);
324
+ if (headerMatch && !/^\s/.test(line)) {
325
+ currentNames = parseYarnEntryHeader(line);
326
+ continue;
327
+ }
328
+ const versionMatch = line.match(/^\s+version\s+"?([^"]+)"?\s*$/);
329
+ if (versionMatch && currentNames.length > 0) {
330
+ for (const n of currentNames)
331
+ addVersion(out, n, versionMatch[1]);
332
+ currentNames = [];
333
+ }
334
+ }
335
+ return out;
336
+ }
337
+ /** Parse a yarn.lock header line into the list of package names it declares. */
338
+ function parseYarnEntryHeader(header) {
339
+ const raw = header.replace(/:\s*$/, '').trim();
340
+ // Split on commas outside quotes.
341
+ const parts = [];
342
+ let cur = '';
343
+ let inQ = false;
344
+ for (const ch of raw) {
345
+ if (ch === '"') {
346
+ inQ = !inQ;
347
+ continue;
348
+ }
349
+ if (ch === ',' && !inQ) {
350
+ parts.push(cur.trim());
351
+ cur = '';
352
+ continue;
353
+ }
354
+ cur += ch;
355
+ }
356
+ if (cur.trim())
357
+ parts.push(cur.trim());
358
+ const names = new Set();
359
+ for (const spec of parts) {
360
+ // Scoped: @scope/name@range → we want `@scope/name`.
361
+ if (spec.startsWith('@')) {
362
+ const at2 = spec.indexOf('@', 1);
363
+ if (at2 > 0)
364
+ names.add(spec.slice(0, at2));
365
+ }
366
+ else {
367
+ const at = spec.indexOf('@');
368
+ if (at > 0)
369
+ names.add(spec.slice(0, at));
370
+ }
371
+ }
372
+ return [...names];
373
+ }
374
+ /** Extract the package name from `node_modules/<pkg>` or `<ws>/node_modules/<pkg>` paths. */
375
+ function extractPackageNameFromNodeModulesPath(key) {
376
+ const marker = '/node_modules/';
377
+ const idx = key.lastIndexOf(marker);
378
+ if (idx < 0) {
379
+ // Top-level workspace entry (`node_modules/<pkg>` with no leading slash) — rare but handled.
380
+ if (key.startsWith('node_modules/'))
381
+ return key.slice('node_modules/'.length);
382
+ return undefined;
383
+ }
384
+ return key.slice(idx + marker.length);
385
+ }
386
+ function addVersion(m, name, version) {
387
+ let s = m.get(name);
388
+ if (!s) {
389
+ s = new Set();
390
+ m.set(name, s);
391
+ }
392
+ s.add(version);
393
+ }
394
+ /**
395
+ * Given pre/post lockfile version maps, emit one `LockfileDedupeChange` per package whose
396
+ * installed-version set changed. Three change shapes:
397
+ * - `merged`: { before: [v1, v2], after: [v1] } — classic dedupe win
398
+ * - `updated`: { before: [v1], after: [v2] } — version shifted (resolver picked newer)
399
+ * - `added` / `removed`: { before: [], after: [v] } / vice-versa — install-side effects
400
+ *
401
+ * Only `merged` and `updated` are "interesting" from a dedupe-report perspective; the
402
+ * summary filters on those. We still include `added`/`removed` in the raw list so
403
+ * auditors see the full delta.
404
+ */
405
+ export function diffLockfileTrees(before, after) {
406
+ const out = [];
407
+ const names = new Set([...before.keys(), ...after.keys()]);
408
+ for (const name of names) {
409
+ const b = [...(before.get(name) ?? new Set())].sort(semverCompareSafe);
410
+ const a = [...(after.get(name) ?? new Set())].sort(semverCompareSafe);
411
+ if (b.length === 0 && a.length > 0) {
412
+ out.push({ name, change: 'added', before: [], after: a });
413
+ continue;
414
+ }
415
+ if (a.length === 0 && b.length > 0) {
416
+ out.push({ name, change: 'removed', before: b, after: [] });
417
+ continue;
418
+ }
419
+ if (setsEqual(b, a))
420
+ continue;
421
+ if (b.length > 1 && a.length < b.length) {
422
+ out.push({ name, change: 'merged', before: b, after: a });
423
+ continue;
424
+ }
425
+ out.push({ name, change: 'updated', before: b, after: a });
426
+ }
427
+ // Sort by interestingness: merges first, then updates, then adds, then removes; within each
428
+ // group sort by name so the summary output is deterministic.
429
+ const rank = { merged: 0, updated: 1, added: 2, removed: 3 };
430
+ out.sort((x, y) => {
431
+ const d = rank[x.change] - rank[y.change];
432
+ return d !== 0 ? d : x.name.localeCompare(y.name);
433
+ });
434
+ return out;
435
+ }
436
+ function setsEqual(a, b) {
437
+ if (a.length !== b.length)
438
+ return false;
439
+ for (let i = 0; i < a.length; i++)
440
+ if (a[i] !== b[i])
441
+ return false;
442
+ return true;
443
+ }
444
+ function semverCompareSafe(a, b) {
445
+ try {
446
+ return semver.compare(a, b);
447
+ }
448
+ catch {
449
+ return a.localeCompare(b);
450
+ }
451
+ }
452
+ /**
453
+ * Best-effort "which transitives are outdated but not vulnerable" scan. For every package
454
+ * installed at one or more versions in the lockfile, we look up `latest` from the registry
455
+ * (via the shared cache so the main flow's lookups are reused) and flag it when the HIGHEST
456
+ * installed version is more than one minor OR one full major behind latest.
457
+ *
458
+ * Why "more than one minor"? — the very common case of `some-dep@1.2.0` installed while
459
+ * latest is `1.2.4` isn't news. The case that matters is `some-dep@1.2.0` while latest is
460
+ * `1.9.0` (6 months of patches missed) or worse, `2.x`. Those are the ones a reviewer
461
+ * actually cares to see.
462
+ *
463
+ * Bounded at `limit` packages to keep the scan under a few seconds even on giant monorepos.
464
+ * We pick the `limit` packages with the MOST installed versions first (highest dedupe
465
+ * potential) and then fill out to `limit` by package name ordering.
466
+ */
467
+ async function scanStaleTransitives(tree, cache, limit) {
468
+ if (tree.size === 0)
469
+ return [];
470
+ const ranked = [...tree.entries()]
471
+ .map(([name, versions]) => ({ name, versions: [...versions] }))
472
+ .sort((a, b) => b.versions.length - a.versions.length || a.name.localeCompare(b.name))
473
+ .slice(0, limit);
474
+ const results = await runWithConcurrency(ranked, 8, async (entry) => {
475
+ try {
476
+ const latest = await fetchLatestVersion(entry.name, cache);
477
+ const highestInstalled = entry.versions.sort(semverCompareSafe).pop();
478
+ if (!semver.valid(latest) || !semver.valid(highestInstalled))
479
+ return undefined;
480
+ if (semver.gte(highestInstalled, latest))
481
+ return undefined;
482
+ const majorDelta = semver.major(latest) - semver.major(highestInstalled);
483
+ const minorDelta = semver.minor(latest) - semver.minor(highestInstalled);
484
+ // Filter out trivial drift — a patch release or a single minor isn't "stale".
485
+ if (majorDelta === 0 && minorDelta <= 1)
486
+ return undefined;
487
+ return {
488
+ name: entry.name,
489
+ installed: entry.versions.sort(semverCompareSafe),
490
+ latest,
491
+ majorBehind: Math.max(0, majorDelta),
492
+ minorBehind: Math.max(0, minorDelta),
493
+ };
494
+ }
495
+ catch {
496
+ return undefined;
497
+ }
498
+ });
499
+ const stale = results.filter((r) => Boolean(r));
500
+ stale.sort((a, b) => {
501
+ if (a.majorBehind !== b.majorBehind)
502
+ return b.majorBehind - a.majorBehind;
503
+ if (a.minorBehind !== b.minorBehind)
504
+ return b.minorBehind - a.minorBehind;
505
+ return a.name.localeCompare(b.name);
506
+ });
507
+ return stale;
508
+ }
509
+ //# sourceMappingURL=lockfileFix.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lockfileFix.js","sourceRoot":"","sources":["../../src/cli/lockfileFix.ts"],"names":[],"mappings":"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"}
@@ -34,6 +34,8 @@ export interface StructuredReport {
34
34
  installMode?: 'root' | 'filtered';
35
35
  /** Effective number of targets traversed in parallel (`1` = serial). */
36
36
  concurrency?: number;
37
+ /** True when installs + validation ran concurrently per-workspace (isolated-lockfile monorepo). */
38
+ parallelInstalls?: boolean;
37
39
  /**
38
40
  * Git commits created during the run (only present when `--git-commit` was set). Failed
39
41
  * commit attempts are also recorded here with `ok: false` so CI can surface the reason
@@ -48,6 +50,8 @@ export interface StructuredReport {
48
50
  overrides?: FinalReport['overrides'];
49
51
  /** Result of the `--open-pr` step (only present when the flag was passed). */
50
52
  pullRequest?: FinalReport['pullRequest'];
53
+ /** Result of the `--fix-lockfile` step (only present when the flag was passed). */
54
+ lockfileFix?: FinalReport['lockfileFix'];
51
55
  }
52
56
  export declare function buildStructuredReport(report: FinalReport, options?: {
53
57
  parsedConflicts?: Conflict[];
@@ -1 +1 @@
1
- {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../src/cli/report.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,QAAQ,EACR,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,oBAAoB,EACrB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG7E;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,MAAM,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IAClD,qEAAqE;IACrE,SAAS,CAAC,EAAE,oBAAoB,GAAG;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IACrE,8EAA8E;IAC9E,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,qDAAqD;IACrD,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,+EAA+E;IAC/E,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrE,wFAAwF;IACxF,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,+EAA+E;IAC/E,WAAW,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;IAClC,wEAAwE;IACxE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,OAAO,CAAC,EAAE,eAAe,EAAE,CAAC;IAC5B,oFAAoF;IACpF,aAAa,CAAC,EAAE,aAAa,GAAG,YAAY,GAAG,KAAK,CAAC;IACrD,kGAAkG;IAClG,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,sFAAsF;IACtF,SAAS,CAAC,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC;IACrC,8EAA8E;IAC9E,WAAW,CAAC,EAAE,WAAW,CAAC,aAAa,CAAC,CAAC;CAC1C;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,WAAW,EACnB,OAAO,GAAE;IACP,eAAe,CAAC,EAAE,QAAQ,EAAE,CAAC;IAC7B,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;CAC/C,GACL,gBAAgB,CA4BlB;AAED,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,gBAAgB,GAAG,IAAI,CA+D5E"}
1
+ {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../src/cli/report.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,QAAQ,EACR,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,oBAAoB,EACrB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG7E;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,MAAM,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IAClD,qEAAqE;IACrE,SAAS,CAAC,EAAE,oBAAoB,GAAG;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IACrE,8EAA8E;IAC9E,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,qDAAqD;IACrD,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,+EAA+E;IAC/E,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrE,wFAAwF;IACxF,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,+EAA+E;IAC/E,WAAW,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;IAClC,wEAAwE;IACxE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mGAAmG;IACnG,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;;OAIG;IACH,OAAO,CAAC,EAAE,eAAe,EAAE,CAAC;IAC5B,oFAAoF;IACpF,aAAa,CAAC,EAAE,aAAa,GAAG,YAAY,GAAG,KAAK,CAAC;IACrD,kGAAkG;IAClG,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,sFAAsF;IACtF,SAAS,CAAC,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC;IACrC,8EAA8E;IAC9E,WAAW,CAAC,EAAE,WAAW,CAAC,aAAa,CAAC,CAAC;IACzC,mFAAmF;IACnF,WAAW,CAAC,EAAE,WAAW,CAAC,aAAa,CAAC,CAAC;CAC1C;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,WAAW,EACnB,OAAO,GAAE;IACP,eAAe,CAAC,EAAE,QAAQ,EAAE,CAAC;IAC7B,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;CAC/C,GACL,gBAAgB,CA8BlB;AAED,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,gBAAgB,GAAG,IAAI,CAkE5E"}
@@ -21,11 +21,13 @@ export function buildStructuredReport(report, options = {}) {
21
21
  ...(report.ignored?.length ? { ignored: report.ignored } : {}),
22
22
  ...(report.installMode ? { installMode: report.installMode } : {}),
23
23
  ...(report.concurrency && report.concurrency > 1 ? { concurrency: report.concurrency } : {}),
24
+ ...(report.parallelInstalls ? { parallelInstalls: true } : {}),
24
25
  ...(report.commits && report.commits.length > 0 ? { commits: report.commits } : {}),
25
26
  ...(report.gitCommitMode ? { gitCommitMode: report.gitCommitMode } : {}),
26
27
  ...(report.policy ? { policy: report.policy } : {}),
27
28
  ...(report.overrides ? { overrides: report.overrides } : {}),
28
29
  ...(report.pullRequest ? { pullRequest: report.pullRequest } : {}),
30
+ ...(report.lockfileFix ? { lockfileFix: report.lockfileFix } : {}),
29
31
  };
30
32
  }
31
33
  export function printStructuredCliSummary(structured) {
@@ -40,6 +42,9 @@ export function printStructuredCliSummary(structured) {
40
42
  if (structured.targets && structured.targets.length > 1) {
41
43
  log.dim(` targets: ${structured.targets.map((t) => t.label).join(', ')}`);
42
44
  }
45
+ if (structured.parallelInstalls) {
46
+ log.dim(` parallel installs: per-workspace (isolated-lockfile monorepo)`);
47
+ }
43
48
  if (structured.groups.length) {
44
49
  log.info(chalk.bold('Groups'));
45
50
  for (const g of structured.groups) {
@@ -1 +1 @@
1
- {"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/cli/report.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/cli/report.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"summary.d.ts","sourceRoot":"","sources":["../../src/cli/summary.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,MAAM,MAAM,aAAa,GAAG,IAAI,GAAG,MAAM,CAAC;AAE1C,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,aAAa,CAAC;IACtB,uFAAuF;IACvF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iEAAiE;IACjE,GAAG,EAAE,MAAM,CAAC;IACZ,qEAAqE;IACrE,WAAW,EAAE,MAAM,CAAC;IACpB,kEAAkE;IAClE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACzB;AAID;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,mBAAmB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CActG;AAED,wBAAsB,YAAY,CAChC,UAAU,EAAE,gBAAgB,EAC5B,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAgB7B;AAoBD,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAmO/F;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CA6I3F"}
1
+ {"version":3,"file":"summary.d.ts","sourceRoot":"","sources":["../../src/cli/summary.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAgDpD,MAAM,MAAM,aAAa,GAAG,IAAI,GAAG,MAAM,CAAC;AAE1C,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,aAAa,CAAC;IACtB,uFAAuF;IACvF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iEAAiE;IACjE,GAAG,EAAE,MAAM,CAAC;IACZ,qEAAqE;IACrE,WAAW,EAAE,MAAM,CAAC;IACpB,kEAAkE;IAClE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACzB;AAID;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,mBAAmB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CActG;AAED,wBAAsB,YAAY,CAChC,UAAU,EAAE,gBAAgB,EAC5B,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAgB7B;AAoBD,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CA8S/F;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAwN3F"}