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.
- package/README.md +107 -22
- package/dist/cli/doctor.d.ts +52 -0
- package/dist/cli/doctor.d.ts.map +1 -0
- package/dist/cli/doctor.js +616 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/doctorCommand.d.ts +2 -0
- package/dist/cli/doctorCommand.d.ts.map +1 -0
- package/dist/cli/doctorCommand.js +71 -0
- package/dist/cli/doctorCommand.js.map +1 -0
- package/dist/cli/doctorRenderer.d.ts +21 -0
- package/dist/cli/doctorRenderer.d.ts.map +1 -0
- package/dist/cli/doctorRenderer.js +79 -0
- package/dist/cli/doctorRenderer.js.map +1 -0
- package/dist/cli/git.d.ts +11 -0
- package/dist/cli/git.d.ts.map +1 -1
- package/dist/cli/git.js +45 -9
- package/dist/cli/git.js.map +1 -1
- package/dist/cli/gitFlow.d.ts.map +1 -1
- package/dist/cli/gitFlow.js +7 -0
- package/dist/cli/gitFlow.js.map +1 -1
- package/dist/cli/lockfileFix.d.ts +91 -0
- package/dist/cli/lockfileFix.d.ts.map +1 -0
- package/dist/cli/lockfileFix.js +509 -0
- package/dist/cli/lockfileFix.js.map +1 -0
- package/dist/cli/report.d.ts +4 -0
- package/dist/cli/report.d.ts.map +1 -1
- package/dist/cli/report.js +5 -0
- package/dist/cli/report.js.map +1 -1
- package/dist/cli/summary.d.ts.map +1 -1
- package/dist/cli/summary.js +221 -2
- package/dist/cli/summary.js.map +1 -1
- package/dist/cli.js +80 -1
- package/dist/cli.js.map +1 -1
- package/dist/core/peerResolver.d.ts +82 -0
- package/dist/core/peerResolver.d.ts.map +1 -0
- package/dist/core/peerResolver.js +213 -0
- package/dist/core/peerResolver.js.map +1 -0
- package/dist/core/upgrader.d.ts +30 -6
- package/dist/core/upgrader.d.ts.map +1 -1
- package/dist/core/upgrader.js +195 -14
- package/dist/core/upgrader.js.map +1 -1
- package/dist/core/workspaces.d.ts +22 -0
- package/dist/core/workspaces.d.ts.map +1 -1
- package/dist/core/workspaces.js +52 -0
- package/dist/core/workspaces.js.map +1 -1
- package/dist/types.d.ts +92 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/concurrency.d.ts +55 -0
- package/dist/utils/concurrency.d.ts.map +1 -1
- package/dist/utils/concurrency.js +46 -1
- package/dist/utils/concurrency.js.map +1 -1
- package/dist/utils/npm.d.ts +14 -0
- package/dist/utils/npm.d.ts.map +1 -1
- package/dist/utils/npm.js +48 -0
- package/dist/utils/npm.js.map +1 -1
- 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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"}
|
package/dist/cli/report.d.ts
CHANGED
|
@@ -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[];
|
package/dist/cli/report.d.ts.map
CHANGED
|
@@ -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,
|
|
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"}
|
package/dist/cli/report.js
CHANGED
|
@@ -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) {
|
package/dist/cli/report.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/cli/report.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAS1B,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/cli/report.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAS1B,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AA8CzC,MAAM,UAAU,qBAAqB,CACnC,MAAmB,EACnB,UAGI,EAAE;IAEN,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IACxE,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAC7B,MAAM,SAAS,GAAG,OAAO,CAAC,eAAe,IAAI,EAAE,CAAC;IAChD,MAAM,UAAU,GAAG,MAAM,CAAC;IAC1B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC;IAEpC,OAAO;QACL,QAAQ;QACR,OAAO;QACP,MAAM;QACN,SAAS;QACT,UAAU;QACV,MAAM;QACN,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5D,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtD,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtD,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClE,GAAG,CAAC,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5F,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnF,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnD,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5D,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClE,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACnE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,UAA4B;IACpE,GAAG,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;IAEhC,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;QACvB,MAAM,CAAC,GAAG,UAAU,CAAC,OAAO,CAAC;QAC7B,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAC5E,GAAG,CAAC,GAAG,CACL,cAAc,GAAG,QAAQ,CAAC,CAAC,aAAa,EAAE;YACxC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9C,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CACvE,CAAC;IACJ,CAAC;IACD,IAAI,UAAU,CAAC,OAAO,IAAI,UAAU,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxD,GAAG,CAAC,GAAG,CAAC,cAAc,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC7E,CAAC;IACD,IAAI,UAAU,CAAC,gBAAgB,EAAE,CAAC;QAChC,GAAG,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAC;IAC7E,CAAC;IAED,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QAC7B,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC/B,KAAK,MAAM,CAAC,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;YAClC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED,IAAI,UAAU,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;QAChC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC,CAAC;QAC3D,KAAK,MAAM,CAAC,IAAI,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;YAClD,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,UAAU,MAAM,CAAC,CAAC,QAAQ,UAAU,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC;QACzE,CAAC;QACD,IAAI,UAAU,CAAC,SAAS,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YACrC,GAAG,CAAC,GAAG,CAAC,OAAO,UAAU,CAAC,SAAS,CAAC,MAAM,GAAG,EAAE,OAAO,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAED,IAAI,UAAU,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;QACjC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;QACnC,KAAK,MAAM,CAAC,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;YACtC,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,KAAK,mBAAmB,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,EAAE,CAAC;YAChF,MAAM,EAAE,GAAG,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5E,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,EAAE,GAAG,GAAG,KAAK,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;YAC5D,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;gBACd,MAAM,MAAM,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE;oBACzB,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,kDAAkD;oBACxE,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,WAAW,CAAC,CAAC,OAAO,CAAC,QAAQ,IAAI,GAAG,EAAE,CAAC;gBAC/D,GAAG,CAAC,GAAG,CAAC,gBAAgB,MAAM,EAAE,CAAC,CAAC;gBAClC,IAAI,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;oBACxB,MAAM,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBAC3E,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;gBACzB,CAAC;YACH,CAAC;YACD,IAAI,CAAC,CAAC,UAAU,EAAE,SAAS,EAAE,CAAC;gBAC5B,MAAM,IAAI,GAAG,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC9E,GAAG,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC;gBAClD,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,UAAU,CAAC,SAAS,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC;QACrD,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;QACnC,GAAG,CAAC,KAAK,CACP,sDAAsD,UAAU,CAAC,SAAS,CAAC,OAAO,YAAY,UAAU,CAAC,SAAS,CAAC,QAAQ,IAAI,GAAG,GAAG,CACtI,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -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;
|
|
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"}
|