@extenshi/cli 0.0.5 → 0.0.7
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/dist/render.d.ts +66 -0
- package/dist/render.d.ts.map +1 -1
- package/dist/render.js +172 -56
- package/dist/render.js.map +1 -1
- package/dist/scan.d.ts +40 -0
- package/dist/scan.d.ts.map +1 -1
- package/dist/scan.js +58 -32
- package/dist/scan.js.map +1 -1
- package/package.json +1 -1
package/dist/render.d.ts
CHANGED
|
@@ -5,6 +5,72 @@
|
|
|
5
5
|
* then by scanner, using chalk for colour.
|
|
6
6
|
*
|
|
7
7
|
* Invoked only when --json flag is NOT set.
|
|
8
|
+
*
|
|
9
|
+
* Schema tolerance
|
|
10
|
+
* ----------------
|
|
11
|
+
* The scan-worker returns the dags `ScannerResult.to_dict()` shape, NOT a
|
|
12
|
+
* normalised one (see services/extenshi-scan-worker/orchestrator + dags
|
|
13
|
+
* scanners/base_scanner.py). Concretely:
|
|
14
|
+
* - scanner objects use `scanner_name` (not `scanner`) and a lowercase
|
|
15
|
+
* `status` from the `ScanStatus` enum: `completed` / `failed` / `timeout`
|
|
16
|
+
* / `malformed_output` / `skipped` (plus the orchestrator's `error`) —
|
|
17
|
+
* never `SUCCESS`.
|
|
18
|
+
* - each scanner emits its OWN finding shape: the identifier is `rule_id`
|
|
19
|
+
* (semgrep/static_scan/yara/library_hash), `type` (jsluice/wallet_chain),
|
|
20
|
+
* `pattern` (jstap), or `id` (obfuscation); the message is `message` /
|
|
21
|
+
* `description` / `summary` / `url`; the category is `category` /
|
|
22
|
+
* `analyzer` / `kind` / `tags`; severity is mixed-case.
|
|
23
|
+
* So we read every field through a fallback chain instead of a single key —
|
|
24
|
+
* otherwise every finding renders as "(no rule)" / "[unknown]" and the
|
|
25
|
+
* success count reads 0/N (the bug this module had before).
|
|
26
|
+
*/
|
|
27
|
+
interface Finding {
|
|
28
|
+
severity?: string;
|
|
29
|
+
[key: string]: unknown;
|
|
30
|
+
}
|
|
31
|
+
interface ScannerResult {
|
|
32
|
+
/** dags shape */
|
|
33
|
+
scanner_name?: string;
|
|
34
|
+
/** legacy/normalised shape */
|
|
35
|
+
scanner?: string;
|
|
36
|
+
status?: string;
|
|
37
|
+
findings?: Finding[];
|
|
38
|
+
error?: string;
|
|
39
|
+
[key: string]: unknown;
|
|
40
|
+
}
|
|
41
|
+
export declare function isScannerOk(status: unknown): boolean;
|
|
42
|
+
/** Scanner display name: dags `scanner_name`, else legacy `scanner`, else unknown. */
|
|
43
|
+
export declare function scannerLabel(s: ScannerResult): string;
|
|
44
|
+
/** Headline = identifier, falling back to category, never empty (no more "(no rule)"). */
|
|
45
|
+
export declare function findingHeadline(f: Finding): string;
|
|
46
|
+
export interface FindingView {
|
|
47
|
+
scanner: string;
|
|
48
|
+
severity: string;
|
|
49
|
+
headline: string;
|
|
50
|
+
message: string;
|
|
51
|
+
location: string;
|
|
52
|
+
extras: string;
|
|
53
|
+
}
|
|
54
|
+
export interface ScannerIssue {
|
|
55
|
+
scanner: string;
|
|
56
|
+
status: string;
|
|
57
|
+
error?: string;
|
|
58
|
+
}
|
|
59
|
+
export interface ReportSummary {
|
|
60
|
+
total: number;
|
|
61
|
+
critHigh: number;
|
|
62
|
+
scannersRun: number;
|
|
63
|
+
scannersOk: number;
|
|
64
|
+
jobId?: string;
|
|
65
|
+
findings: FindingView[];
|
|
66
|
+
issues: ScannerIssue[];
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Reduce a raw scan report to a render-ready summary. Pure — no I/O — so the
|
|
70
|
+
* schema-tolerance logic (the part that regressed) is unit-testable against a
|
|
71
|
+
* fixture without spying on console.log.
|
|
8
72
|
*/
|
|
73
|
+
export declare function summarizeReport(body: Record<string, unknown>): ReportSummary;
|
|
9
74
|
export declare function renderReport(body: Record<string, unknown>): void;
|
|
75
|
+
export {};
|
|
10
76
|
//# sourceMappingURL=render.d.ts.map
|
package/dist/render.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAMH,UAAU,OAAO;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACtB;AAED,UAAU,aAAa;IACtB,iBAAiB;IACjB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,8BAA8B;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAA;IACpB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACtB;AAaD,wBAAgB,WAAW,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAEpD;AAED,sFAAsF;AACtF,wBAAgB,YAAY,CAAC,CAAC,EAAE,aAAa,GAAG,MAAM,CAIrD;AAiBD,0FAA0F;AAC1F,wBAAgB,eAAe,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAElD;AAyED,MAAM,WAAW,WAAW;IAC3B,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,YAAY;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,aAAa;IAC7B,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,WAAW,EAAE,CAAA;IACvB,MAAM,EAAE,YAAY,EAAE,CAAA;CACtB;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,aAAa,CA6C5E;AAID,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAwDhE"}
|
package/dist/render.js
CHANGED
|
@@ -5,8 +5,97 @@
|
|
|
5
5
|
* then by scanner, using chalk for colour.
|
|
6
6
|
*
|
|
7
7
|
* Invoked only when --json flag is NOT set.
|
|
8
|
+
*
|
|
9
|
+
* Schema tolerance
|
|
10
|
+
* ----------------
|
|
11
|
+
* The scan-worker returns the dags `ScannerResult.to_dict()` shape, NOT a
|
|
12
|
+
* normalised one (see services/extenshi-scan-worker/orchestrator + dags
|
|
13
|
+
* scanners/base_scanner.py). Concretely:
|
|
14
|
+
* - scanner objects use `scanner_name` (not `scanner`) and a lowercase
|
|
15
|
+
* `status` from the `ScanStatus` enum: `completed` / `failed` / `timeout`
|
|
16
|
+
* / `malformed_output` / `skipped` (plus the orchestrator's `error`) —
|
|
17
|
+
* never `SUCCESS`.
|
|
18
|
+
* - each scanner emits its OWN finding shape: the identifier is `rule_id`
|
|
19
|
+
* (semgrep/static_scan/yara/library_hash), `type` (jsluice/wallet_chain),
|
|
20
|
+
* `pattern` (jstap), or `id` (obfuscation); the message is `message` /
|
|
21
|
+
* `description` / `summary` / `url`; the category is `category` /
|
|
22
|
+
* `analyzer` / `kind` / `tags`; severity is mixed-case.
|
|
23
|
+
* So we read every field through a fallback chain instead of a single key —
|
|
24
|
+
* otherwise every finding renders as "(no rule)" / "[unknown]" and the
|
|
25
|
+
* success count reads 0/N (the bug this module had before).
|
|
8
26
|
*/
|
|
9
27
|
import chalk from 'chalk';
|
|
28
|
+
// ── Schema-tolerant field readers ───────────────────────────────────────────────
|
|
29
|
+
/** Statuses that count as a successful scanner run (case-insensitive). */
|
|
30
|
+
const OK_STATUSES = new Set(['completed', 'success', 'ok', 'passed']);
|
|
31
|
+
export function isScannerOk(status) {
|
|
32
|
+
return typeof status === 'string' && OK_STATUSES.has(status.toLowerCase());
|
|
33
|
+
}
|
|
34
|
+
/** Scanner display name: dags `scanner_name`, else legacy `scanner`, else unknown. */
|
|
35
|
+
export function scannerLabel(s) {
|
|
36
|
+
if (typeof s.scanner_name === 'string' && s.scanner_name.trim())
|
|
37
|
+
return s.scanner_name;
|
|
38
|
+
if (typeof s.scanner === 'string' && s.scanner.trim())
|
|
39
|
+
return s.scanner;
|
|
40
|
+
return 'unknown';
|
|
41
|
+
}
|
|
42
|
+
/** First key whose value is a non-empty string (or first element of a string array). */
|
|
43
|
+
function firstString(f, keys) {
|
|
44
|
+
for (const k of keys) {
|
|
45
|
+
const v = f[k];
|
|
46
|
+
if (typeof v === 'string' && v.trim())
|
|
47
|
+
return v;
|
|
48
|
+
if (Array.isArray(v) && typeof v[0] === 'string' && v[0].trim())
|
|
49
|
+
return v[0];
|
|
50
|
+
}
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
const HEADLINE_KEYS = ['rule', 'rule_id', 'ruleId', 'check_id', 'type', 'pattern', 'id'];
|
|
54
|
+
const MESSAGE_KEYS = ['message', 'description', 'desc', 'title', 'summary', 'url'];
|
|
55
|
+
const CATEGORY_KEYS = ['category', 'analyzer', 'kind', 'tags'];
|
|
56
|
+
const FILE_KEYS = ['file_path', 'file', 'files', 'path'];
|
|
57
|
+
/** Headline = identifier, falling back to category, never empty (no more "(no rule)"). */
|
|
58
|
+
export function findingHeadline(f) {
|
|
59
|
+
return firstString(f, HEADLINE_KEYS) ?? firstString(f, CATEGORY_KEYS) ?? 'finding';
|
|
60
|
+
}
|
|
61
|
+
function findingMessage(f) {
|
|
62
|
+
return firstString(f, MESSAGE_KEYS) ?? '';
|
|
63
|
+
}
|
|
64
|
+
function findingLocation(f) {
|
|
65
|
+
const file = firstString(f, FILE_KEYS);
|
|
66
|
+
if (!file)
|
|
67
|
+
return '';
|
|
68
|
+
const lineRaw = f.line_number ?? f.line;
|
|
69
|
+
const line = typeof lineRaw === 'number' || (typeof lineRaw === 'string' && lineRaw.trim()) ? String(lineRaw) : '';
|
|
70
|
+
return line ? `${file}:${line}` : file;
|
|
71
|
+
}
|
|
72
|
+
// Keys already surfaced via a dedicated channel — excluded from the "extras" dump.
|
|
73
|
+
const CONSUMED_KEYS = new Set([
|
|
74
|
+
...HEADLINE_KEYS,
|
|
75
|
+
...MESSAGE_KEYS,
|
|
76
|
+
...FILE_KEYS,
|
|
77
|
+
'severity',
|
|
78
|
+
'line',
|
|
79
|
+
'line_number',
|
|
80
|
+
'column',
|
|
81
|
+
'location',
|
|
82
|
+
]);
|
|
83
|
+
/** Remaining scalar fields worth showing (confidence, count, category, is_external, …). */
|
|
84
|
+
function findingExtras(f, max = 3) {
|
|
85
|
+
const parts = [];
|
|
86
|
+
for (const [k, v] of Object.entries(f)) {
|
|
87
|
+
if (CONSUMED_KEYS.has(k))
|
|
88
|
+
continue;
|
|
89
|
+
if (v === null || v === undefined)
|
|
90
|
+
continue;
|
|
91
|
+
if (typeof v === 'object')
|
|
92
|
+
continue; // skip nested dicts/arrays — too noisy for a one-liner
|
|
93
|
+
parts.push(`${k}: ${typeof v === 'string' ? v : JSON.stringify(v)}`);
|
|
94
|
+
if (parts.length >= max)
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
return parts.join(' ');
|
|
98
|
+
}
|
|
10
99
|
// ── Severity ordering ──────────────────────────────────────────────────────────
|
|
11
100
|
const SEVERITY_ORDER = {
|
|
12
101
|
CRITICAL: 0,
|
|
@@ -34,94 +123,121 @@ function severityColour(s) {
|
|
|
34
123
|
return chalk.dim(s ?? 'UNKNOWN');
|
|
35
124
|
}
|
|
36
125
|
}
|
|
37
|
-
|
|
38
|
-
|
|
126
|
+
/**
|
|
127
|
+
* Reduce a raw scan report to a render-ready summary. Pure — no I/O — so the
|
|
128
|
+
* schema-tolerance logic (the part that regressed) is unit-testable against a
|
|
129
|
+
* fixture without spying on console.log.
|
|
130
|
+
*/
|
|
131
|
+
export function summarizeReport(body) {
|
|
39
132
|
const report = body;
|
|
40
|
-
const scanners = report.scanners
|
|
41
|
-
const
|
|
133
|
+
const scanners = Array.isArray(report.scanners) ? report.scanners : [];
|
|
134
|
+
const findings = [];
|
|
135
|
+
const issues = [];
|
|
42
136
|
let scannersRun = 0;
|
|
43
137
|
let scannersOk = 0;
|
|
44
138
|
for (const s of scanners) {
|
|
45
139
|
scannersRun++;
|
|
46
|
-
if (s.status
|
|
140
|
+
if (isScannerOk(s.status)) {
|
|
47
141
|
scannersOk++;
|
|
48
142
|
}
|
|
143
|
+
else {
|
|
144
|
+
issues.push({
|
|
145
|
+
scanner: scannerLabel(s),
|
|
146
|
+
status: typeof s.status === 'string' ? s.status : 'unknown',
|
|
147
|
+
error: typeof s.error === 'string' && s.error.trim() ? s.error : undefined,
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
const name = scannerLabel(s);
|
|
49
151
|
for (const f of s.findings ?? []) {
|
|
50
|
-
|
|
152
|
+
findings.push({
|
|
153
|
+
scanner: name,
|
|
154
|
+
severity: f.severity?.toUpperCase() ?? 'UNKNOWN',
|
|
155
|
+
headline: findingHeadline(f),
|
|
156
|
+
message: findingMessage(f),
|
|
157
|
+
location: findingLocation(f),
|
|
158
|
+
extras: findingExtras(f),
|
|
159
|
+
});
|
|
51
160
|
}
|
|
52
161
|
}
|
|
53
|
-
|
|
54
|
-
|
|
162
|
+
findings.sort((a, b) => severityRank(a.severity) - severityRank(b.severity));
|
|
163
|
+
const critHigh = findings.filter((f) => severityRank(f.severity) <= 1).length;
|
|
164
|
+
return {
|
|
165
|
+
total: findings.length,
|
|
166
|
+
critHigh,
|
|
167
|
+
scannersRun,
|
|
168
|
+
scannersOk,
|
|
169
|
+
jobId: typeof report.jobId === 'string' ? report.jobId : undefined,
|
|
170
|
+
findings,
|
|
171
|
+
issues,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
// ── Main render function ───────────────────────────────────────────────────────
|
|
175
|
+
export function renderReport(body) {
|
|
176
|
+
const { total, critHigh, scannersRun, scannersOk, jobId, findings, issues } = summarizeReport(body);
|
|
55
177
|
// Header
|
|
56
178
|
console.log();
|
|
57
|
-
if (
|
|
179
|
+
if (total === 0) {
|
|
58
180
|
console.log(chalk.green.bold('✓ No findings — extension looks clean.'));
|
|
59
181
|
}
|
|
60
182
|
else {
|
|
61
|
-
const
|
|
62
|
-
const label = critHigh > 0
|
|
63
|
-
? chalk.red.bold(`${allFindings.length} finding${allFindings.length !== 1 ? 's' : ''} (${critHigh} critical/high)`)
|
|
64
|
-
: chalk.yellow.bold(`${allFindings.length} finding${allFindings.length !== 1 ? 's' : ''}`);
|
|
183
|
+
const noun = `${total} finding${total !== 1 ? 's' : ''}`;
|
|
184
|
+
const label = critHigh > 0 ? chalk.red.bold(`${noun} (${critHigh} critical/high)`) : chalk.yellow.bold(noun);
|
|
65
185
|
console.log(`${chalk.bold('Scan report')} · ${label}`);
|
|
66
186
|
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
187
|
+
const scannersColour = scannersOk === scannersRun ? chalk.dim : chalk.yellow;
|
|
188
|
+
console.log(scannersColour(`Scanners: ${scannersOk}/${scannersRun} succeeded`));
|
|
189
|
+
if (jobId) {
|
|
190
|
+
console.log(chalk.dim(`Job: ${jobId}`));
|
|
70
191
|
}
|
|
71
192
|
console.log();
|
|
72
|
-
|
|
73
|
-
return;
|
|
74
|
-
}
|
|
75
|
-
// Print findings grouped by severity (already sorted)
|
|
193
|
+
// Findings grouped by severity (already sorted)
|
|
76
194
|
let lastSeverity = '';
|
|
77
|
-
for (const
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
console.log(chalk.bold(`── ${severityColour(sev)} ──────────────────────────`));
|
|
195
|
+
for (const f of findings) {
|
|
196
|
+
if (f.severity !== lastSeverity) {
|
|
197
|
+
lastSeverity = f.severity;
|
|
198
|
+
console.log(chalk.bold(`── ${severityColour(f.severity)} ──────────────────────────`));
|
|
82
199
|
}
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
// Wrap description at 80 chars
|
|
88
|
-
const words = desc.split(' ');
|
|
89
|
-
let line = ' ';
|
|
90
|
-
for (const word of words) {
|
|
91
|
-
if (line.length + word.length + 1 > 80) {
|
|
92
|
-
console.log(chalk.dim(line));
|
|
93
|
-
line = ` ${word}`;
|
|
94
|
-
}
|
|
95
|
-
else {
|
|
96
|
-
line += (line === ' ' ? '' : ' ') + word;
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
if (line.trim()) {
|
|
100
|
-
console.log(chalk.dim(line));
|
|
200
|
+
console.log(` ${chalk.bold(f.headline)} ${chalk.dim(`[${f.scanner}]`)}`);
|
|
201
|
+
if (f.message) {
|
|
202
|
+
for (const line of wrap(f.message, 80)) {
|
|
203
|
+
console.log(chalk.dim(` ${line}`));
|
|
101
204
|
}
|
|
102
205
|
}
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
.filter(([k]) => !skip.has(k))
|
|
107
|
-
.map(([k, v]) => `${k}: ${JSON.stringify(v)}`);
|
|
108
|
-
if (extras.length > 0) {
|
|
109
|
-
console.log(chalk.dim(` ${extras.slice(0, 3).join(' ')}`));
|
|
206
|
+
const meta = [f.location, f.extras].filter(Boolean).join(' ');
|
|
207
|
+
if (meta) {
|
|
208
|
+
console.log(chalk.dim(` ${meta}`));
|
|
110
209
|
}
|
|
111
210
|
console.log();
|
|
112
211
|
}
|
|
113
|
-
//
|
|
114
|
-
|
|
115
|
-
if (failedScanners.length > 0) {
|
|
212
|
+
// Scanners that did not complete OK (surface the error so a failure is visible)
|
|
213
|
+
if (issues.length > 0) {
|
|
116
214
|
console.log(chalk.dim('── Scanner issues ──────────────────────────'));
|
|
117
|
-
for (const
|
|
118
|
-
|
|
215
|
+
for (const i of issues) {
|
|
216
|
+
const why = i.error ? `: ${i.error}` : '';
|
|
217
|
+
console.log(chalk.dim(` ${i.scanner}: ${i.status}${why}`));
|
|
119
218
|
}
|
|
120
219
|
console.log();
|
|
121
220
|
}
|
|
122
221
|
// Exit hint
|
|
123
|
-
if (
|
|
222
|
+
if (critHigh > 0) {
|
|
124
223
|
console.log(chalk.red('⚠ Critical/high findings detected. Review before publishing.'));
|
|
125
224
|
}
|
|
126
225
|
}
|
|
226
|
+
/** Greedy word-wrap to `width` columns. */
|
|
227
|
+
function wrap(text, width) {
|
|
228
|
+
const out = [];
|
|
229
|
+
let line = '';
|
|
230
|
+
for (const word of text.split(/\s+/)) {
|
|
231
|
+
if (line && line.length + word.length + 1 > width) {
|
|
232
|
+
out.push(line);
|
|
233
|
+
line = word;
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
line = line ? `${line} ${word}` : word;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
if (line)
|
|
240
|
+
out.push(line);
|
|
241
|
+
return out;
|
|
242
|
+
}
|
|
127
243
|
//# sourceMappingURL=render.js.map
|
package/dist/render.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.js","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"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"}
|
package/dist/scan.d.ts
CHANGED
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
* "при network error не делайте автоматический retry —
|
|
23
23
|
* списанный credit вернётся автоматически в течение 1 минуты (auto-refund cron)"
|
|
24
24
|
*/
|
|
25
|
+
import { type Response } from 'undici';
|
|
25
26
|
/**
|
|
26
27
|
* Build the user-facing message for a 403 from the scan API.
|
|
27
28
|
*
|
|
@@ -43,6 +44,28 @@ export declare function buildAccessDeniedMessage(body: {
|
|
|
43
44
|
error?: unknown;
|
|
44
45
|
errorCode?: unknown;
|
|
45
46
|
}): string;
|
|
47
|
+
/**
|
|
48
|
+
* A spinner whose label shows live elapsed seconds, rendered to stderr so it
|
|
49
|
+
* never corrupts --json output on stdout. ora auto-disables animation when
|
|
50
|
+
* stderr is not a TTY (CI), degrading to a couple of static log lines.
|
|
51
|
+
*
|
|
52
|
+
* The label paints immediately on `.start()` (at t=0, before the first tick),
|
|
53
|
+
* then a 1s ticker appends `(Ns)` so the line keeps visibly advancing even
|
|
54
|
+
* while the process is blocked on a long upload, a slow time-to-first-byte, or
|
|
55
|
+
* a gap between scan-progress events. `setText` swaps the base label without
|
|
56
|
+
* resetting the clock — this is what lets one spinner span the whole
|
|
57
|
+
* upload → connect → scanning → done lifecycle with a single continuous timer.
|
|
58
|
+
*
|
|
59
|
+
* Returns handles to settle it: `succeed` (green ✔), `fail` (red ✖), `stop`
|
|
60
|
+
* (clear line). Call exactly one of them — the ticker keeps running otherwise.
|
|
61
|
+
*/
|
|
62
|
+
export interface ElapsedSpinner {
|
|
63
|
+
setText: (text: string) => void;
|
|
64
|
+
succeed: (text: string) => void;
|
|
65
|
+
fail: (text: string) => void;
|
|
66
|
+
stop: () => void;
|
|
67
|
+
seconds: () => number;
|
|
68
|
+
}
|
|
46
69
|
export interface ScanOptions {
|
|
47
70
|
artifactPath: string;
|
|
48
71
|
apiKey: string;
|
|
@@ -54,4 +77,21 @@ export interface ScanOptions {
|
|
|
54
77
|
stream: boolean;
|
|
55
78
|
}
|
|
56
79
|
export declare function runScan(opts: ScanOptions): Promise<void>;
|
|
80
|
+
/**
|
|
81
|
+
* Consume the SSE progress stream, updating the shared elapsed spinner on
|
|
82
|
+
* stderr, and render the final report (pretty or JSON) once the terminal
|
|
83
|
+
* `result` event arrives. Throws on a terminal `error` event or a truncated
|
|
84
|
+
* stream.
|
|
85
|
+
*
|
|
86
|
+
* `progress` is the live spinner started in runScan *before* the request. This
|
|
87
|
+
* function owns its single terminal settle (succeed/fail) from here on — the
|
|
88
|
+
* caller must not settle it once it has been handed over. Reusing one handle
|
|
89
|
+
* (rather than starting a fresh spinner here) keeps a single continuous timer
|
|
90
|
+
* across upload → connect → scanning → done, so the line never stalls and the
|
|
91
|
+
* console is never silent.
|
|
92
|
+
*
|
|
93
|
+
* Exported for unit testing the "feedback before the first progress event"
|
|
94
|
+
* path — the regression that made the console look frozen during upload/queue.
|
|
95
|
+
*/
|
|
96
|
+
export declare function renderSseStream(response: Response, outputJson: boolean, progress: ElapsedSpinner): Promise<void>;
|
|
57
97
|
//# sourceMappingURL=scan.d.ts.map
|
package/dist/scan.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../src/scan.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;
|
|
1
|
+
{"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../src/scan.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAKH,OAAO,EAAmB,KAAK,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAUvD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,CA0B/F;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,cAAc;IAC9B,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAC/B,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAC/B,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAC5B,IAAI,EAAE,MAAM,IAAI,CAAA;IAChB,OAAO,EAAE,MAAM,MAAM,CAAA;CACrB;AAmCD,MAAM,WAAW,WAAW;IAC3B,YAAY,EAAE,MAAM,CAAA;IACpB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,OAAO,CAAA;IACnB,aAAa,EAAE,OAAO,CAAA;IACtB,4FAA4F;IAC5F,MAAM,EAAE,OAAO,CAAA;CACf;AAED,wBAAsB,OAAO,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA2G9D;AAsFD;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,eAAe,CACpC,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,OAAO,EACnB,QAAQ,EAAE,cAAc,GACtB,OAAO,CAAC,IAAI,CAAC,CA2Df"}
|
package/dist/scan.js
CHANGED
|
@@ -70,29 +70,31 @@ export function buildAccessDeniedMessage(body) {
|
|
|
70
70
|
` • Buy credits to scan arbitrary / unclaimed artifacts:\n` +
|
|
71
71
|
` ${CLI_BILLING_URL}`);
|
|
72
72
|
}
|
|
73
|
-
/**
|
|
74
|
-
* A spinner whose label shows live elapsed seconds, rendered to stderr so it
|
|
75
|
-
* never corrupts --json output on stdout. ora auto-disables animation when
|
|
76
|
-
* stderr is not a TTY (CI), degrading to a couple of static log lines.
|
|
77
|
-
*
|
|
78
|
-
* Returns handles to settle it: `succeed` (green ✔), `stop` (clear line).
|
|
79
|
-
* Always call exactly one of them — the elapsed ticker keeps running otherwise.
|
|
80
|
-
*/
|
|
81
73
|
function startElapsedSpinner(label) {
|
|
82
74
|
const startedAt = Date.now();
|
|
83
75
|
const seconds = () => Math.round((Date.now() - startedAt) / 1000);
|
|
76
|
+
let base = label;
|
|
84
77
|
const spinner = ora({ text: label, stream: process.stderr }).start();
|
|
85
|
-
const
|
|
86
|
-
spinner.text = `${
|
|
87
|
-
}
|
|
78
|
+
const render = () => {
|
|
79
|
+
spinner.text = `${base} (${seconds()}s)`;
|
|
80
|
+
};
|
|
81
|
+
const ticker = setInterval(render, 1000);
|
|
88
82
|
// Don't let the 1s ticker keep the event loop alive on its own.
|
|
89
83
|
if (typeof ticker.unref === 'function')
|
|
90
84
|
ticker.unref();
|
|
91
85
|
return {
|
|
86
|
+
setText: (text) => {
|
|
87
|
+
base = text;
|
|
88
|
+
render();
|
|
89
|
+
},
|
|
92
90
|
succeed: (text) => {
|
|
93
91
|
clearInterval(ticker);
|
|
94
92
|
spinner.succeed(text);
|
|
95
93
|
},
|
|
94
|
+
fail: (text) => {
|
|
95
|
+
clearInterval(ticker);
|
|
96
|
+
spinner.fail(text);
|
|
97
|
+
},
|
|
96
98
|
stop: () => {
|
|
97
99
|
clearInterval(ticker);
|
|
98
100
|
spinner.stop();
|
|
@@ -130,10 +132,13 @@ export async function runScan(opts) {
|
|
|
130
132
|
if (extensionId) {
|
|
131
133
|
form.append('extensionId', extensionId);
|
|
132
134
|
}
|
|
133
|
-
//
|
|
134
|
-
//
|
|
135
|
-
//
|
|
136
|
-
|
|
135
|
+
// Always start an elapsed spinner *before* the request so the console is
|
|
136
|
+
// never silent. In streaming mode this covers the otherwise-dead window —
|
|
137
|
+
// the multipart upload plus the server's time-to-first-byte — before any
|
|
138
|
+
// SSE frame arrives; renderSseStream then reuses the same handle so one
|
|
139
|
+
// continuous timer spans upload → connect → scanning → done. Legacy mode
|
|
140
|
+
// keeps the same spinner for its single long-blocking request.
|
|
141
|
+
const progress = startElapsedSpinner(stream ? `Uploading ${artifactName}` : `Scanning ${artifactName}`);
|
|
137
142
|
let response;
|
|
138
143
|
try {
|
|
139
144
|
response = await fetch(`${apiUrl}/api/v1/scan`, {
|
|
@@ -147,7 +152,7 @@ export async function runScan(opts) {
|
|
|
147
152
|
});
|
|
148
153
|
}
|
|
149
154
|
catch (err) {
|
|
150
|
-
progress
|
|
155
|
+
progress.stop();
|
|
151
156
|
if (err instanceof Error && err.name === 'TimeoutError') {
|
|
152
157
|
throw new Error(`Scan request timed out after ${SCAN_TIMEOUT_MS / 1000}s.\n` +
|
|
153
158
|
'This may indicate a network issue or a slow scan.\n' +
|
|
@@ -159,7 +164,7 @@ export async function runScan(opts) {
|
|
|
159
164
|
// Auth/billing/gateway errors are always JSON (they happen before any
|
|
160
165
|
// stream starts), regardless of the Accept header → handle and throw.
|
|
161
166
|
if (!response.ok) {
|
|
162
|
-
progress
|
|
167
|
+
progress.stop();
|
|
163
168
|
const body = await parseJsonBody(response, apiUrl);
|
|
164
169
|
throwForStatus(response.status, body);
|
|
165
170
|
}
|
|
@@ -169,20 +174,25 @@ export async function runScan(opts) {
|
|
|
169
174
|
// Content-Type rather than assuming the negotiated mode.
|
|
170
175
|
const contentType = response.headers.get('content-type') ?? '';
|
|
171
176
|
if (contentType.includes('text/event-stream')) {
|
|
172
|
-
//
|
|
173
|
-
|
|
177
|
+
// Hand the live spinner to renderSseStream — it owns the single
|
|
178
|
+
// succeed/fail settle from here, so this branch must not settle it.
|
|
179
|
+
await renderSseStream(response, outputJson, progress);
|
|
174
180
|
return;
|
|
175
181
|
}
|
|
182
|
+
// Single JSON body (legacy mode, or a server that ignored the streaming
|
|
183
|
+
// Accept header). There's no server-side progress to show, so relabel the
|
|
184
|
+
// elapsed spinner — otherwise a streaming-requested-but-JSON-answered scan
|
|
185
|
+
// would read "Uploading…" for its whole duration.
|
|
186
|
+
progress.setText(`Scanning ${artifactName}`);
|
|
176
187
|
let body;
|
|
177
188
|
try {
|
|
178
189
|
body = await parseJsonBody(response, apiUrl);
|
|
179
190
|
}
|
|
180
191
|
catch (err) {
|
|
181
|
-
progress
|
|
192
|
+
progress.stop();
|
|
182
193
|
throw err;
|
|
183
194
|
}
|
|
184
|
-
|
|
185
|
-
progress.succeed(`Scan complete in ${progress.seconds()}s`);
|
|
195
|
+
progress.succeed(`Scan complete in ${progress.seconds()}s`);
|
|
186
196
|
if (outputJson) {
|
|
187
197
|
process.stdout.write(`${JSON.stringify(body, null, 2)}\n`);
|
|
188
198
|
}
|
|
@@ -259,15 +269,31 @@ function formatProgress(p) {
|
|
|
259
269
|
return `${stage || 'Working'}…`;
|
|
260
270
|
}
|
|
261
271
|
/**
|
|
262
|
-
* Consume the SSE progress stream,
|
|
263
|
-
* render the final report (pretty or JSON) once the terminal
|
|
264
|
-
* arrives. Throws on a terminal `error` event or a truncated
|
|
272
|
+
* Consume the SSE progress stream, updating the shared elapsed spinner on
|
|
273
|
+
* stderr, and render the final report (pretty or JSON) once the terminal
|
|
274
|
+
* `result` event arrives. Throws on a terminal `error` event or a truncated
|
|
275
|
+
* stream.
|
|
276
|
+
*
|
|
277
|
+
* `progress` is the live spinner started in runScan *before* the request. This
|
|
278
|
+
* function owns its single terminal settle (succeed/fail) from here on — the
|
|
279
|
+
* caller must not settle it once it has been handed over. Reusing one handle
|
|
280
|
+
* (rather than starting a fresh spinner here) keeps a single continuous timer
|
|
281
|
+
* across upload → connect → scanning → done, so the line never stalls and the
|
|
282
|
+
* console is never silent.
|
|
283
|
+
*
|
|
284
|
+
* Exported for unit testing the "feedback before the first progress event"
|
|
285
|
+
* path — the regression that made the console look frozen during upload/queue.
|
|
265
286
|
*/
|
|
266
|
-
async function renderSseStream(response, outputJson) {
|
|
287
|
+
export async function renderSseStream(response, outputJson, progress) {
|
|
288
|
+
// Headers are in and the upload is done, but the worker may still be
|
|
289
|
+
// queueing before it emits the first `accepted`/`progress` frame. Swap the
|
|
290
|
+
// label now so the (still-ticking) spinner reads "Connecting to scanner
|
|
291
|
+
// (Ns)" rather than a stale "Uploading…" during that gap.
|
|
292
|
+
progress.setText('Connecting to scanner');
|
|
267
293
|
if (!response.body) {
|
|
294
|
+
progress.fail('Scan stream had no response body');
|
|
268
295
|
throw new Error('Scan stream had no response body');
|
|
269
296
|
}
|
|
270
|
-
const spinner = ora({ stream: process.stderr, text: 'Connecting…' }).start();
|
|
271
297
|
const decoder = new TextDecoder();
|
|
272
298
|
let buffer = '';
|
|
273
299
|
let report = null;
|
|
@@ -276,7 +302,7 @@ async function renderSseStream(response, outputJson) {
|
|
|
276
302
|
if (ev.event === 'progress') {
|
|
277
303
|
const p = safeJsonParse(ev.data);
|
|
278
304
|
if (p)
|
|
279
|
-
|
|
305
|
+
progress.setText(formatProgress(p));
|
|
280
306
|
}
|
|
281
307
|
else if (ev.event === 'result') {
|
|
282
308
|
report = safeJsonParse(ev.data);
|
|
@@ -300,18 +326,18 @@ async function renderSseStream(response, outputJson) {
|
|
|
300
326
|
handle(ev);
|
|
301
327
|
}
|
|
302
328
|
catch (err) {
|
|
303
|
-
|
|
329
|
+
progress.fail('Scan stream interrupted');
|
|
304
330
|
throw err;
|
|
305
331
|
}
|
|
306
332
|
if (errorMessage) {
|
|
307
|
-
|
|
333
|
+
progress.fail(errorMessage);
|
|
308
334
|
throw new Error(`Scan failed: ${errorMessage}`);
|
|
309
335
|
}
|
|
310
336
|
if (!report) {
|
|
311
|
-
|
|
337
|
+
progress.fail('Scan ended without a result');
|
|
312
338
|
throw new Error('Scan stream ended before returning a result');
|
|
313
339
|
}
|
|
314
|
-
|
|
340
|
+
progress.succeed(`Scan complete in ${progress.seconds()}s`);
|
|
315
341
|
if (outputJson) {
|
|
316
342
|
process.stdout.write(`${JSON.stringify(report, null, 2)}\n`);
|
|
317
343
|
}
|
package/dist/scan.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../src/scan.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../src/scan.ts"],"names":[],"mappings":"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"}
|