@thymian/plugin-reporter 0.1.10 → 0.1.11-canary.20260625-39589d8
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/formatter.d.ts +6 -5
- package/dist/formatter.d.ts.map +1 -1
- package/dist/formatter.js +17 -14
- package/dist/formatter.js.map +1 -1
- package/dist/formatters/csv.d.ts +3 -3
- package/dist/formatters/csv.d.ts.map +1 -1
- package/dist/formatters/csv.js +23 -14
- package/dist/formatters/csv.js.map +1 -1
- package/dist/formatters/markdown.d.ts +4 -4
- package/dist/formatters/markdown.d.ts.map +1 -1
- package/dist/formatters/markdown.js +31 -44
- package/dist/formatters/markdown.js.map +1 -1
- package/dist/formatters/text.d.ts +3 -11
- package/dist/formatters/text.d.ts.map +1 -1
- package/dist/formatters/text.js +61 -91
- package/dist/formatters/text.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -13
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/formatter.d.ts
CHANGED
|
@@ -1,17 +1,18 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { Report, Severity } from '@thymian/core';
|
|
2
2
|
export type ThymianReportStatistics = {
|
|
3
3
|
numberOfReports: number;
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
numberOfRuns: number;
|
|
5
|
+
numberOfFindings: number;
|
|
6
|
+
severityCounts: Record<Severity, number>;
|
|
6
7
|
};
|
|
7
8
|
export type ReportAnalysis = {
|
|
8
9
|
statistics: ThymianReportStatistics;
|
|
9
10
|
};
|
|
10
|
-
export declare function analyze(reports:
|
|
11
|
+
export declare function analyze(reports: Report[]): ReportAnalysis;
|
|
11
12
|
export interface Formatter<Options = Record<PropertyKey, unknown>> {
|
|
12
13
|
options: Options;
|
|
13
14
|
init(options: Options): void | Promise<void>;
|
|
14
|
-
report(report:
|
|
15
|
+
report(report: Report): void | Promise<void>;
|
|
15
16
|
flush(): string | undefined | Promise<string | undefined>;
|
|
16
17
|
}
|
|
17
18
|
//# sourceMappingURL=formatter.d.ts.map
|
package/dist/formatter.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatter.d.ts","sourceRoot":"","sources":["../src/formatter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"formatter.d.ts","sourceRoot":"","sources":["../src/formatter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,MAAM,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAErE,MAAM,MAAM,uBAAuB,GAAG;IACpC,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;CAC1C,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,UAAU,EAAE,uBAAuB,CAAC;CACrC,CAAC;AAcF,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,cAAc,CA4BzD;AAED,MAAM,WAAW,SAAS,CAAC,OAAO,GAAG,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC;IAC/D,OAAO,EAAE,OAAO,CAAC;IAEjB,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7C,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7C,KAAK,IAAI,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;CAC3D"}
|
package/dist/formatter.js
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
function collectFindings(report) {
|
|
2
|
+
const visit = (executions) => (executions ?? []).flatMap((execution) => [
|
|
3
|
+
...execution.findings,
|
|
4
|
+
...visit(execution.children),
|
|
5
|
+
]);
|
|
6
|
+
return report.runs.flatMap((run) => visit(run.executions));
|
|
7
|
+
}
|
|
1
8
|
export function analyze(reports) {
|
|
2
9
|
const severityCounts = {
|
|
3
10
|
error: 0,
|
|
@@ -5,24 +12,20 @@ export function analyze(reports) {
|
|
|
5
12
|
hint: 0,
|
|
6
13
|
info: 0,
|
|
7
14
|
};
|
|
8
|
-
let
|
|
9
|
-
let
|
|
10
|
-
for (const
|
|
11
|
-
|
|
12
|
-
for (const
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
for (const item of section.items ?? []) {
|
|
16
|
-
severityCounts[item.severity] =
|
|
17
|
-
(severityCounts[item.severity] ?? 0) + 1;
|
|
18
|
-
}
|
|
19
|
-
}
|
|
15
|
+
let runCounter = 0;
|
|
16
|
+
let findingsCounter = 0;
|
|
17
|
+
for (const report of reports) {
|
|
18
|
+
runCounter += report.runs.length;
|
|
19
|
+
for (const finding of collectFindings(report)) {
|
|
20
|
+
findingsCounter += 1;
|
|
21
|
+
severityCounts[finding.severity] += 1;
|
|
20
22
|
}
|
|
21
23
|
}
|
|
22
24
|
return {
|
|
23
25
|
statistics: {
|
|
24
|
-
numberOfReports:
|
|
25
|
-
|
|
26
|
+
numberOfReports: reports.length,
|
|
27
|
+
numberOfRuns: runCounter,
|
|
28
|
+
numberOfFindings: findingsCounter,
|
|
26
29
|
severityCounts,
|
|
27
30
|
},
|
|
28
31
|
};
|
package/dist/formatter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatter.js","sourceRoot":"","sources":["../src/formatter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"formatter.js","sourceRoot":"","sources":["../src/formatter.ts"],"names":[],"mappings":"AAaA,SAAS,eAAe,CAAC,MAAc;IACrC,MAAM,KAAK,GAAG,CACZ,UAAgD,EAC/B,EAAE,CACnB,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC;QACxC,GAAG,SAAS,CAAC,QAAQ;QACrB,GAAG,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC;KAC7B,CAAC,CAAC;IAEL,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,OAAiB;IACvC,MAAM,cAAc,GAA6B;QAC/C,KAAK,EAAE,CAAC;QACR,IAAI,EAAE,CAAC;QACP,IAAI,EAAE,CAAC;QACP,IAAI,EAAE,CAAC;KACR,CAAC;IAEF,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,eAAe,GAAG,CAAC,CAAC;IAExB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,UAAU,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;QAEjC,KAAK,MAAM,OAAO,IAAI,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9C,eAAe,IAAI,CAAC,CAAC;YACrB,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED,OAAO;QACL,UAAU,EAAE;YACV,eAAe,EAAE,OAAO,CAAC,MAAM;YAC/B,YAAY,EAAE,UAAU;YACxB,gBAAgB,EAAE,eAAe;YACjC,cAAc;SACf;KACF,CAAC;AACJ,CAAC"}
|
package/dist/formatters/csv.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Logger,
|
|
1
|
+
import type { Logger, Report } from '@thymian/core';
|
|
2
2
|
import type { Formatter } from '../formatter.js';
|
|
3
3
|
export type CsvFormatterOptions = {
|
|
4
4
|
path: string;
|
|
@@ -10,8 +10,8 @@ export declare class CsvFormatter implements Formatter<CsvFormatterOptions> {
|
|
|
10
10
|
constructor(logger: Logger);
|
|
11
11
|
flush(): Promise<string | undefined>;
|
|
12
12
|
init(options: CsvFormatterOptions): Promise<void>;
|
|
13
|
-
report(report:
|
|
13
|
+
report(report: Report): Promise<void>;
|
|
14
14
|
}
|
|
15
|
-
export declare function
|
|
15
|
+
export declare function reportToCsvLines(report: Report): string[];
|
|
16
16
|
export declare function csvSafe(str: string | undefined): string;
|
|
17
17
|
//# sourceMappingURL=csv.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"csv.d.ts","sourceRoot":"","sources":["../../src/formatters/csv.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"csv.d.ts","sourceRoot":"","sources":["../../src/formatters/csv.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAEpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAqBF,qBAAa,YAAa,YAAW,SAAS,CAAC,mBAAmB,CAAC;IAKrD,OAAO,CAAC,QAAQ,CAAC,MAAM;IAJnC,OAAO,CAAC,MAAM,CAAe;IAE7B,OAAO,EAAG,mBAAmB,CAAC;gBAED,MAAM,EAAE,MAAM;IAE3C,KAAK,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IASpC,IAAI,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBjD,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAkBtC;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAczD;AAED,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAYvD"}
|
package/dist/formatters/csv.js
CHANGED
|
@@ -1,4 +1,18 @@
|
|
|
1
1
|
import { createWriteStream } from 'node:fs';
|
|
2
|
+
function formatLocation(location) {
|
|
3
|
+
switch (location.type) {
|
|
4
|
+
case 'custom':
|
|
5
|
+
return location.value;
|
|
6
|
+
case 'file':
|
|
7
|
+
return [location.path, location.line, location.column]
|
|
8
|
+
.filter((part) => part !== undefined)
|
|
9
|
+
.join(':');
|
|
10
|
+
case 'url':
|
|
11
|
+
return location.url;
|
|
12
|
+
case 'thymianFormat':
|
|
13
|
+
return `format:${location.elementId}${location.pointer ? `#${location.pointer}` : ''}`;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
2
16
|
export class CsvFormatter {
|
|
3
17
|
logger;
|
|
4
18
|
stream;
|
|
@@ -22,20 +36,19 @@ export class CsvFormatter {
|
|
|
22
36
|
});
|
|
23
37
|
return new Promise((resolve) => {
|
|
24
38
|
this.stream.on('ready', () => {
|
|
25
|
-
this.stream.write('
|
|
39
|
+
this.stream.write('run_id,run_type,tool,execution_location,finding_kind,finding_id,severity,title,message,rule_id\n');
|
|
26
40
|
resolve();
|
|
27
41
|
});
|
|
28
42
|
});
|
|
29
43
|
}
|
|
30
44
|
report(report) {
|
|
31
45
|
return new Promise((resolve, reject) => {
|
|
32
|
-
const lines =
|
|
46
|
+
const lines = reportToCsvLines(report);
|
|
33
47
|
if (lines.length === 0) {
|
|
34
48
|
resolve();
|
|
35
49
|
return;
|
|
36
50
|
}
|
|
37
|
-
|
|
38
|
-
this.stream.write(data, (err) => {
|
|
51
|
+
this.stream.write(lines.join(''), (err) => {
|
|
39
52
|
if (err) {
|
|
40
53
|
reject(err);
|
|
41
54
|
}
|
|
@@ -46,16 +59,13 @@ export class CsvFormatter {
|
|
|
46
59
|
});
|
|
47
60
|
}
|
|
48
61
|
}
|
|
49
|
-
export function
|
|
62
|
+
export function reportToCsvLines(report) {
|
|
50
63
|
const lines = [];
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
for (const section of report.sections) {
|
|
57
|
-
for (const item of section.items) {
|
|
58
|
-
lines.push(`${csvSafe(report.source)},${csvSafe(section.heading)},${csvSafe(item.severity)},${csvSafe(item.ruleName)},${csvSafe(item.message)},${csvSafe(item.details)}\n`);
|
|
64
|
+
for (const run of report.runs) {
|
|
65
|
+
for (const execution of run.executions ?? []) {
|
|
66
|
+
for (const finding of execution.findings) {
|
|
67
|
+
lines.push(`${csvSafe(run.runId)},${csvSafe(run.runType)},${csvSafe(run.tool.name)},${csvSafe(formatLocation(execution.location))},${csvSafe(finding.kind)},${csvSafe(finding.id)},${csvSafe(finding.severity)},${csvSafe(finding.title)},${csvSafe(finding.message?.text)},${csvSafe('ruleId' in finding ? finding.ruleId : undefined)}\n`);
|
|
68
|
+
}
|
|
59
69
|
}
|
|
60
70
|
}
|
|
61
71
|
return lines;
|
|
@@ -64,7 +74,6 @@ export function csvSafe(str) {
|
|
|
64
74
|
if (!str) {
|
|
65
75
|
return '';
|
|
66
76
|
}
|
|
67
|
-
// Escape double quotes by doubling them, wrap in quotes if needed
|
|
68
77
|
const escaped = str.replaceAll('"', '""').replaceAll('\n', ' ');
|
|
69
78
|
if (escaped.includes(',') || escaped.includes('"') || escaped.includes(' ')) {
|
|
70
79
|
return `"${escaped}"`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"csv.js","sourceRoot":"","sources":["../../src/formatters/csv.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAoB,MAAM,SAAS,CAAC;AAU9D,MAAM,OAAO,YAAY;IAKM;IAJrB,MAAM,CAAe;IAE7B,OAAO,CAAuB;IAE9B,YAA6B,MAAc;QAAd,WAAM,GAAN,MAAM,CAAQ;IAAG,CAAC;IAE/C,KAAK;QACH,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE;gBACnB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"csv.js","sourceRoot":"","sources":["../../src/formatters/csv.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
import type { Logger,
|
|
1
|
+
import type { Logger, Report, Severity } from '@thymian/core';
|
|
2
2
|
import { type Formatter } from '../formatter.js';
|
|
3
3
|
export declare const details: (text: string) => string;
|
|
4
|
-
export declare function mapSeverityToBadge(severity:
|
|
4
|
+
export declare function mapSeverityToBadge(severity: Severity): string;
|
|
5
5
|
export type MarkdownFormatterOptions = {
|
|
6
6
|
path: string;
|
|
7
7
|
};
|
|
8
8
|
export declare class MarkdownFormatter implements Formatter<MarkdownFormatterOptions> {
|
|
9
9
|
private readonly logger;
|
|
10
10
|
options: MarkdownFormatterOptions;
|
|
11
|
-
private readonly
|
|
11
|
+
private readonly reports;
|
|
12
12
|
constructor(logger: Logger);
|
|
13
13
|
init(options: MarkdownFormatterOptions): void;
|
|
14
|
-
report(report:
|
|
14
|
+
report(report: Report): void;
|
|
15
15
|
flush(): Promise<string | undefined>;
|
|
16
16
|
}
|
|
17
17
|
//# sourceMappingURL=markdown.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/formatters/markdown.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/formatters/markdown.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAG9D,OAAO,EAAW,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG1D,eAAO,MAAM,OAAO,GAAI,MAAM,MAAM,KAAG,MAC8B,CAAC;AAEtE,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAW7D;AAqBD,MAAM,MAAM,wBAAwB,GAAG;IACrC,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,qBAAa,iBAAkB,YAAW,SAAS,CAAC,wBAAwB,CAAC;IAK/D,OAAO,CAAC,QAAQ,CAAC,MAAM;IAJnC,OAAO,EAAG,wBAAwB,CAAC;IAEnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;gBAEX,MAAM,EAAE,MAAM;IAE3C,IAAI,CAAC,OAAO,EAAE,wBAAwB,GAAG,IAAI;IAI7C,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAItB,KAAK,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;CA0C3C"}
|
|
@@ -2,11 +2,7 @@ import * as path from 'node:path';
|
|
|
2
2
|
import { mkdir, writeFile } from 'fs/promises';
|
|
3
3
|
import { analyze } from '../formatter.js';
|
|
4
4
|
import { errorSymbol, hintSymbol, warnSymbol } from '../style.js';
|
|
5
|
-
export const details = (text) =>
|
|
6
|
-
<details>
|
|
7
|
-
<summary>More details</summary>
|
|
8
|
-
${text}
|
|
9
|
-
</details>`;
|
|
5
|
+
export const details = (text) => `\n<details>\n<summary>More details</summary>\n${text}\n</details>`;
|
|
10
6
|
export function mapSeverityToBadge(severity) {
|
|
11
7
|
if (severity === 'error') {
|
|
12
8
|
return `${errorSymbol} error`;
|
|
@@ -19,10 +15,24 @@ export function mapSeverityToBadge(severity) {
|
|
|
19
15
|
}
|
|
20
16
|
return 'info';
|
|
21
17
|
}
|
|
18
|
+
function formatLocation(location) {
|
|
19
|
+
switch (location.type) {
|
|
20
|
+
case 'custom':
|
|
21
|
+
return location.value;
|
|
22
|
+
case 'file':
|
|
23
|
+
return [location.path, location.line, location.column]
|
|
24
|
+
.filter((part) => part !== undefined)
|
|
25
|
+
.join(':');
|
|
26
|
+
case 'url':
|
|
27
|
+
return location.url;
|
|
28
|
+
case 'thymianFormat':
|
|
29
|
+
return `format:${location.elementId}${location.pointer ? `#${location.pointer}` : ''}`;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
22
32
|
export class MarkdownFormatter {
|
|
23
33
|
logger;
|
|
24
34
|
options;
|
|
25
|
-
|
|
35
|
+
reports = [];
|
|
26
36
|
constructor(logger) {
|
|
27
37
|
this.logger = logger;
|
|
28
38
|
}
|
|
@@ -30,52 +40,29 @@ export class MarkdownFormatter {
|
|
|
30
40
|
this.options = options;
|
|
31
41
|
}
|
|
32
42
|
report(report) {
|
|
33
|
-
|
|
34
|
-
this.reportsMap.set(report.source, []);
|
|
35
|
-
}
|
|
36
|
-
this.reportsMap.get(report.source)?.push(report);
|
|
43
|
+
this.reports.push(report);
|
|
37
44
|
}
|
|
38
45
|
async flush() {
|
|
39
|
-
if (this.
|
|
46
|
+
if (this.reports.length === 0) {
|
|
40
47
|
return undefined;
|
|
41
48
|
}
|
|
42
|
-
const analysis = analyze(this.
|
|
49
|
+
const analysis = analyze(this.reports);
|
|
43
50
|
const lines = [];
|
|
44
51
|
lines.push('# Thymian Report');
|
|
45
|
-
const { numberOfReports, numberOfItems, severityCounts } = analysis.statistics;
|
|
46
|
-
lines.push(`A total of ${numberOfReports} reports with ${numberOfItems} items were found.`);
|
|
47
|
-
lines.push(`Of these there are ${severityCounts.error} errors, ${severityCounts.warn} warnings, ${severityCounts.hint} hints and ${severityCounts.info} infos.`);
|
|
48
52
|
lines.push('');
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
lines.push(
|
|
53
|
-
.map((report) => report.message)
|
|
54
|
-
.filter(Boolean)
|
|
55
|
-
.join(' '));
|
|
53
|
+
lines.push(`Generated from ${analysis.statistics.numberOfReports} report(s), ${analysis.statistics.numberOfRuns} run(s), and ${analysis.statistics.numberOfFindings} finding(s).`);
|
|
54
|
+
lines.push('');
|
|
55
|
+
for (const report of this.reports) {
|
|
56
|
+
lines.push(`## Report ${report.reportId}`);
|
|
56
57
|
lines.push('');
|
|
57
|
-
for (const
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
if (item.ruleName) {
|
|
66
|
-
lines.push(`<br/> *Rule: ${item.ruleName}*`);
|
|
67
|
-
}
|
|
68
|
-
if (item.details) {
|
|
69
|
-
lines.push(details(item.details));
|
|
70
|
-
}
|
|
71
|
-
if (item.links && item.links.length > 0) {
|
|
72
|
-
lines.push(' Related links:');
|
|
73
|
-
for (const link of item.links) {
|
|
74
|
-
lines.push(` - [${link.title ?? link.url}](${link.url})`);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
lines.push('');
|
|
58
|
+
for (const run of report.runs) {
|
|
59
|
+
lines.push(`### ${run.tool.name} (${run.runType})`);
|
|
60
|
+
lines.push('');
|
|
61
|
+
lines.push('| Location | Severity | Kind | Title | Rule | Message |');
|
|
62
|
+
lines.push('| --- | --- | --- | --- | --- | --- |');
|
|
63
|
+
for (const execution of run.executions ?? []) {
|
|
64
|
+
for (const finding of execution.findings) {
|
|
65
|
+
lines.push(`| ${formatLocation(execution.location)} | ${mapSeverityToBadge(finding.severity)} | ${finding.kind} | ${finding.title} | ${'ruleId' in finding ? finding.ruleId : ''} | ${(finding.message?.text ?? '').replaceAll('|', '\\|')} |`);
|
|
79
66
|
}
|
|
80
67
|
}
|
|
81
68
|
lines.push('');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/formatters/markdown.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/formatters/markdown.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,23 +1,15 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { Report } from '@thymian/core';
|
|
2
2
|
import { type Formatter } from '../formatter.js';
|
|
3
|
-
export declare function formatSeverityPrefix(severity: ThymianReportSeverity): string;
|
|
4
3
|
export type TextFormatterOptions = {
|
|
5
4
|
summaryOnly: boolean;
|
|
6
5
|
path?: string;
|
|
7
6
|
};
|
|
8
7
|
export declare class TextFormatter implements Formatter<Partial<TextFormatterOptions>> {
|
|
9
8
|
options: TextFormatterOptions;
|
|
10
|
-
private readonly
|
|
9
|
+
private readonly reports;
|
|
11
10
|
init(options: Partial<TextFormatterOptions>): void;
|
|
12
11
|
flush(): Promise<string | undefined>;
|
|
13
|
-
report(report:
|
|
14
|
-
/**
|
|
15
|
-
* Ensure output is plain text (no ANSI escape sequences) when stdout is not a TTY.
|
|
16
|
-
*
|
|
17
|
-
* Chalk auto-detects TTY and sets `chalk.level = 0` for non-TTY, which prevents
|
|
18
|
-
* new styling. However, if chalk level was forced or if any ANSI codes slip through
|
|
19
|
-
* from other sources, this safety net strips them for non-TTY output.
|
|
20
|
-
*/
|
|
12
|
+
report(report: Report): void;
|
|
21
13
|
private ensurePlainTextForNonTty;
|
|
22
14
|
}
|
|
23
15
|
//# sourceMappingURL=text.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../src/formatters/text.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../src/formatters/text.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAiB,MAAM,EAAY,MAAM,eAAe,CAAC;AAIrE,OAAO,EAAW,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAsE1D,MAAM,MAAM,oBAAoB,GAAG;IACjC,WAAW,EAAE,OAAO,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,qBAAa,aAAc,YAAW,SAAS,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAC5E,OAAO,EAAG,oBAAoB,CAAC;IAE/B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;IAExC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,oBAAoB,CAAC,GAAG,IAAI;IAO5C,KAAK,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IA6D1C,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI5B,OAAO,CAAC,wBAAwB;CAOjC"}
|
package/dist/formatters/text.js
CHANGED
|
@@ -4,49 +4,56 @@ import chalk from 'chalk';
|
|
|
4
4
|
import { mkdir, writeFile } from 'fs/promises';
|
|
5
5
|
import { analyze } from '../formatter.js';
|
|
6
6
|
import { errorSymbol, hintSymbol, successSymbol, warnSymbol, } from '../style.js';
|
|
7
|
-
|
|
8
|
-
* Visible column width of a severity prefix in a monospace terminal.
|
|
9
|
-
*
|
|
10
|
-
* Unicode symbols (✖ U+2716, ⚠ U+26A0, ℹ U+2139) each occupy one terminal
|
|
11
|
-
* column in standard monospace fonts. We use hardcoded values instead of
|
|
12
|
-
* `.length` on template strings because JavaScript's string length counts
|
|
13
|
-
* UTF-16 code units, which may differ from visual column width for characters
|
|
14
|
-
* outside the BMP. For these specific BMP symbols the values happen to match.
|
|
15
|
-
*
|
|
16
|
-
* Widths: "✖ error: " = 9, "⚠ warning: " = 11, "ℹ hint: " = 8
|
|
17
|
-
*/
|
|
18
|
-
function severityPrefixWidth(severity) {
|
|
7
|
+
function severityPrefix(severity) {
|
|
19
8
|
switch (severity) {
|
|
20
9
|
case 'error':
|
|
21
|
-
return
|
|
10
|
+
return chalk.red(`${errorSymbol} error`);
|
|
22
11
|
case 'warn':
|
|
23
|
-
return
|
|
12
|
+
return chalk.yellow(`${warnSymbol} warning`);
|
|
24
13
|
case 'hint':
|
|
25
|
-
return
|
|
26
|
-
|
|
27
|
-
return
|
|
14
|
+
return chalk.blue(`${hintSymbol} hint`);
|
|
15
|
+
case 'info':
|
|
16
|
+
return chalk.cyan(`${hintSymbol} info`);
|
|
28
17
|
}
|
|
29
18
|
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
if (severity === 'hint') {
|
|
37
|
-
return `${chalk.blue(`${hintSymbol} ${severity}`)}: `;
|
|
19
|
+
function renderFinding(finding, indent = ' ') {
|
|
20
|
+
const lines = [
|
|
21
|
+
`${indent}${severityPrefix(finding.severity)}: ${finding.title}`,
|
|
22
|
+
];
|
|
23
|
+
if (finding.kind.startsWith('rule-') && 'ruleId' in finding) {
|
|
24
|
+
lines.push(`${indent} rule: ${finding.ruleId}`);
|
|
38
25
|
}
|
|
39
|
-
if (
|
|
40
|
-
|
|
26
|
+
if (finding.message?.text && finding.message.text !== finding.title) {
|
|
27
|
+
lines.push(`${indent} ${finding.message.text}`);
|
|
41
28
|
}
|
|
42
|
-
if (
|
|
43
|
-
|
|
29
|
+
if (finding.kind === 'assertion-failure') {
|
|
30
|
+
const assertionFailure = finding;
|
|
31
|
+
lines.push(`${indent} expected: ${JSON.stringify(assertionFailure.expected)}`);
|
|
32
|
+
lines.push(`${indent} actual: ${JSON.stringify(assertionFailure.actual)}`);
|
|
33
|
+
}
|
|
34
|
+
if (finding.kind === 'test-case-skip') {
|
|
35
|
+
const skipped = finding;
|
|
36
|
+
lines.push(`${indent} reason: ${skipped.reason}`);
|
|
37
|
+
}
|
|
38
|
+
return lines;
|
|
39
|
+
}
|
|
40
|
+
function renderLocation(location) {
|
|
41
|
+
switch (location.type) {
|
|
42
|
+
case 'custom':
|
|
43
|
+
return location.value;
|
|
44
|
+
case 'file':
|
|
45
|
+
return [location.path, location.line, location.column]
|
|
46
|
+
.filter((part) => part !== undefined)
|
|
47
|
+
.join(':');
|
|
48
|
+
case 'url':
|
|
49
|
+
return location.url;
|
|
50
|
+
case 'thymianFormat':
|
|
51
|
+
return `format:${location.elementId}${location.pointer ? `#${location.pointer}` : ''}`;
|
|
44
52
|
}
|
|
45
|
-
return '';
|
|
46
53
|
}
|
|
47
54
|
export class TextFormatter {
|
|
48
55
|
options;
|
|
49
|
-
|
|
56
|
+
reports = [];
|
|
50
57
|
init(options) {
|
|
51
58
|
this.options = {
|
|
52
59
|
summaryOnly: false,
|
|
@@ -54,87 +61,50 @@ export class TextFormatter {
|
|
|
54
61
|
};
|
|
55
62
|
}
|
|
56
63
|
async flush() {
|
|
57
|
-
if (this.
|
|
64
|
+
if (this.reports.length === 0) {
|
|
58
65
|
const message = `${chalk.green(successSymbol)} No problems found`;
|
|
59
66
|
if (this.options.path) {
|
|
60
|
-
const plainText = stripVTControlCharacters(message);
|
|
61
67
|
await mkdir(path.dirname(this.options.path), { recursive: true });
|
|
62
|
-
await writeFile(this.options.path,
|
|
68
|
+
await writeFile(this.options.path, stripVTControlCharacters(message), 'utf-8');
|
|
63
69
|
}
|
|
64
70
|
return this.ensurePlainTextForNonTty(message);
|
|
65
71
|
}
|
|
66
|
-
const analysis = analyze(this.
|
|
72
|
+
const analysis = analyze(this.reports);
|
|
67
73
|
const lines = [];
|
|
68
74
|
if (!this.options.summaryOnly) {
|
|
69
|
-
for (const
|
|
70
|
-
lines.push(
|
|
71
|
-
length: Math.max(1, 80 - source.length),
|
|
72
|
-
})
|
|
73
|
-
.map(() => '─')
|
|
74
|
-
.join('')}`);
|
|
75
|
+
for (const report of this.reports) {
|
|
76
|
+
lines.push(`Report ${report.reportId}`);
|
|
75
77
|
lines.push('');
|
|
76
|
-
|
|
77
|
-
.
|
|
78
|
-
.
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
for (const
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
for (const item of section.items) {
|
|
88
|
-
// When grouped by severity the heading already conveys the
|
|
89
|
-
// severity level → skip the per-item severity prefix to
|
|
90
|
-
// avoid redundant "Errors (3) ✖ error: …" lines.
|
|
91
|
-
const prefix = isSeverityGrouped
|
|
92
|
-
? ''
|
|
93
|
-
: formatSeverityPrefix(item.severity);
|
|
94
|
-
// 4 spaces base indentation + prefix + message
|
|
95
|
-
lines.push(` ${prefix}${item.message}`);
|
|
96
|
-
// When grouped by rule the heading already shows the rule
|
|
97
|
-
// name → skip the per-item rule name to avoid duplication.
|
|
98
|
-
const ruleRedundant = item.ruleName === section.heading;
|
|
99
|
-
if (item.ruleName && !ruleRedundant) {
|
|
100
|
-
// Align rule name under message text:
|
|
101
|
-
// 4 spaces base indent + prefix visible width
|
|
102
|
-
const indent = isSeverityGrouped
|
|
103
|
-
? 4
|
|
104
|
-
: 4 + severityPrefixWidth(item.severity);
|
|
105
|
-
lines.push(`${' '.repeat(indent)}${chalk.dim(item.ruleName)}`);
|
|
106
|
-
}
|
|
78
|
+
for (const run of report.runs) {
|
|
79
|
+
lines.push(`${run.tool.name} (${run.runType})`);
|
|
80
|
+
for (const execution of run.executions ?? []) {
|
|
81
|
+
lines.push(` ${chalk.bold(renderLocation(execution.location))}`);
|
|
82
|
+
for (const finding of execution.findings) {
|
|
83
|
+
lines.push(...renderFinding(finding));
|
|
84
|
+
}
|
|
85
|
+
for (const child of execution.children ?? []) {
|
|
86
|
+
lines.push(` ${chalk.bold(renderLocation(child.location))}`);
|
|
87
|
+
for (const finding of child.findings) {
|
|
88
|
+
lines.push(...renderFinding(finding, ' '));
|
|
107
89
|
}
|
|
108
|
-
lines.push('');
|
|
109
90
|
}
|
|
110
91
|
}
|
|
92
|
+
lines.push('');
|
|
111
93
|
}
|
|
112
94
|
}
|
|
113
95
|
}
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
const coloredOutput = lines.join('\n');
|
|
96
|
+
const { error, warn, hint, info } = analysis.statistics.severityCounts;
|
|
97
|
+
lines.push(`Summary: ${error} error(s), ${warn} warning(s), ${hint} hint(s), ${info} info finding(s) across ${analysis.statistics.numberOfRuns} run(s).`);
|
|
98
|
+
const output = lines.join('\n');
|
|
118
99
|
if (this.options.path) {
|
|
119
|
-
const plainText = stripVTControlCharacters(coloredOutput);
|
|
120
100
|
await mkdir(path.dirname(this.options.path), { recursive: true });
|
|
121
|
-
await writeFile(this.options.path,
|
|
101
|
+
await writeFile(this.options.path, stripVTControlCharacters(output), 'utf-8');
|
|
122
102
|
}
|
|
123
|
-
return this.ensurePlainTextForNonTty(
|
|
103
|
+
return this.ensurePlainTextForNonTty(output);
|
|
124
104
|
}
|
|
125
105
|
report(report) {
|
|
126
|
-
|
|
127
|
-
this.reportsMap.set(report.source, []);
|
|
128
|
-
}
|
|
129
|
-
this.reportsMap.get(report.source)?.push(report);
|
|
106
|
+
this.reports.push(report);
|
|
130
107
|
}
|
|
131
|
-
/**
|
|
132
|
-
* Ensure output is plain text (no ANSI escape sequences) when stdout is not a TTY.
|
|
133
|
-
*
|
|
134
|
-
* Chalk auto-detects TTY and sets `chalk.level = 0` for non-TTY, which prevents
|
|
135
|
-
* new styling. However, if chalk level was forced or if any ANSI codes slip through
|
|
136
|
-
* from other sources, this safety net strips them for non-TTY output.
|
|
137
|
-
*/
|
|
138
108
|
ensurePlainTextForNonTty(output) {
|
|
139
109
|
if (!process.stdout.isTTY) {
|
|
140
110
|
return stripVTControlCharacters(output);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/formatters/text.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC;AAGrD,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,EAAE,OAAO,EAAkB,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EACL,WAAW,EACX,UAAU,EACV,aAAa,EACb,UAAU,GACX,MAAM,aAAa,CAAC;AAErB
|
|
1
|
+
{"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/formatters/text.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AAEhE,OAAO,EAAE,KAAK,UAAU,EAAiB,MAAM,qBAAqB,CAAC;AAErE,MAAM,MAAM,qBAAqB,GAAG;IAClC,UAAU,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;CAClC,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,aAAa,CAAC,qBAAqB,CAmG/D,CAAC;AAEF,eAAe,cAAc,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -13,7 +13,7 @@ export const reporterPlugin = {
|
|
|
13
13
|
properties: {
|
|
14
14
|
text: {
|
|
15
15
|
nullable: true,
|
|
16
|
-
description: 'Configuration for the text
|
|
16
|
+
description: 'Configuration for the text formatter',
|
|
17
17
|
type: 'object',
|
|
18
18
|
properties: {
|
|
19
19
|
summaryOnly: {
|
|
@@ -22,7 +22,7 @@ export const reporterPlugin = {
|
|
|
22
22
|
nullable: true,
|
|
23
23
|
},
|
|
24
24
|
path: {
|
|
25
|
-
description: 'File path where the plain text report will be saved
|
|
25
|
+
description: 'File path where the plain text report will be saved',
|
|
26
26
|
type: 'string',
|
|
27
27
|
nullable: true,
|
|
28
28
|
},
|
|
@@ -65,7 +65,7 @@ export const reporterPlugin = {
|
|
|
65
65
|
listensOn: ['core.report'],
|
|
66
66
|
},
|
|
67
67
|
actions: {
|
|
68
|
-
listensOn: ['core.
|
|
68
|
+
listensOn: ['core.close'],
|
|
69
69
|
},
|
|
70
70
|
async plugin(emitter, logger, { formatters: userFormatters, cwd }) {
|
|
71
71
|
const formatters = Object.fromEntries(Object.entries({
|
|
@@ -73,22 +73,16 @@ export const reporterPlugin = {
|
|
|
73
73
|
...(userFormatters ?? {}),
|
|
74
74
|
}).filter(([, options]) => options != null));
|
|
75
75
|
let hasFlushed = false;
|
|
76
|
+
const reporters = await getFormatters(formatters, cwd, logger);
|
|
76
77
|
const flushReporters = async () => {
|
|
77
78
|
if (hasFlushed) {
|
|
78
|
-
return
|
|
79
|
+
return;
|
|
79
80
|
}
|
|
80
81
|
hasFlushed = true;
|
|
81
|
-
|
|
82
|
-
// Collect text output from formatters that return strings (e.g. TextFormatter)
|
|
83
|
-
const textParts = results.filter((r) => typeof r === 'string');
|
|
84
|
-
return textParts.length > 0 ? { text: textParts.join('\n') } : {};
|
|
82
|
+
await Promise.all(reporters.map(async (r) => r.flush()));
|
|
85
83
|
};
|
|
86
|
-
const reporters = await getFormatters(formatters, cwd, logger);
|
|
87
84
|
emitter.on('core.report', async (report) => {
|
|
88
|
-
reporters.
|
|
89
|
-
});
|
|
90
|
-
emitter.onAction('core.report.flush', async (_event, ctx) => {
|
|
91
|
-
ctx.reply(await flushReporters());
|
|
85
|
+
await Promise.all(reporters.map(async (r) => r.report(report)));
|
|
92
86
|
});
|
|
93
87
|
emitter.onAction('core.close', async (_event, ctx) => {
|
|
94
88
|
await flushReporters();
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@thymian/plugin-reporter",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.11-canary.20260625-39589d8",
|
|
4
4
|
"description": "Thymian plugin for formatting and outputting conformance analysis reports",
|
|
5
5
|
"license": "AGPL-3.0-only",
|
|
6
6
|
"bugs": {
|
|
@@ -42,6 +42,6 @@
|
|
|
42
42
|
"dependencies": {
|
|
43
43
|
"chalk": "^4.1.2",
|
|
44
44
|
"tslib": "^2.3.0",
|
|
45
|
-
"@thymian/core": "0.1.
|
|
45
|
+
"@thymian/core": "0.1.11-canary.20260625-39589d8"
|
|
46
46
|
}
|
|
47
47
|
}
|