@security-alert/sarif-to-markdown 1.5.0 → 1.9.0
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/lib/sarif-to-markdown.d.ts +12 -0
- package/lib/sarif-to-markdown.js +127 -32
- package/lib/sarif-to-markdown.js.map +1 -1
- package/module/sarif-to-markdown.d.ts +12 -0
- package/module/sarif-to-markdown.js +125 -31
- package/module/sarif-to-markdown.js.map +1 -1
- package/package.json +6 -14
- package/lib/sarif-formatter.d.ts +0 -24
- package/lib/sarif-formatter.js +0 -56
- package/lib/sarif-formatter.js.map +0 -1
|
@@ -25,6 +25,18 @@ export declare type sarifFormatterOptions = {
|
|
|
25
25
|
* Base path
|
|
26
26
|
*/
|
|
27
27
|
sourceRoot: string;
|
|
28
|
+
/**
|
|
29
|
+
* Details of the rules in the comment or not, this might make the comment too big for Github
|
|
30
|
+
*/
|
|
31
|
+
details?: boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Should the markdown include suppressed findings, defaults to true
|
|
34
|
+
*/
|
|
35
|
+
suppressedResults?: boolean;
|
|
36
|
+
/**
|
|
37
|
+
* Should the markdown include rule details or tool details at all
|
|
38
|
+
*/
|
|
39
|
+
simple?: boolean;
|
|
28
40
|
};
|
|
29
41
|
declare type sarifToMarkdownResult = {
|
|
30
42
|
title?: string;
|
package/lib/sarif-to-markdown.js
CHANGED
|
@@ -19,13 +19,26 @@ function escapeMarkdown(strings) {
|
|
|
19
19
|
return strings.reduce(function (result, str, i) {
|
|
20
20
|
var value = values[i - 1];
|
|
21
21
|
if (typeof value === "string") {
|
|
22
|
-
return result + markdown_escape_1.default(value) + str;
|
|
22
|
+
return result + (0, markdown_escape_1.default)(value) + str;
|
|
23
23
|
}
|
|
24
24
|
else {
|
|
25
25
|
return result + String(value) + str;
|
|
26
26
|
}
|
|
27
27
|
});
|
|
28
28
|
}
|
|
29
|
+
function createRuleInfo(run) {
|
|
30
|
+
var _a, _b;
|
|
31
|
+
return escapeMarkdown(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n## Rules information\n<!-- Rule Info -->\n<details><summary>Rules details</summary>\n", ""], ["\n## Rules information\n<!-- Rule Info -->\n<details><summary>Rules details</summary>\n", ""])), (_b = (_a = run.tool.driver) === null || _a === void 0 ? void 0 : _a.rules) === null || _b === void 0 ? void 0 : _b.map(function (rule) {
|
|
32
|
+
var _a, _b;
|
|
33
|
+
var severity = rule.properties ? (_a = rule.properties) === null || _a === void 0 ? void 0 : _a["problem.severity"] : "";
|
|
34
|
+
// rule description
|
|
35
|
+
return "\n\n - ".concat(rule.id, " [").concat(severity, "] \n\n > ").concat((_b = rule.shortDescription) === null || _b === void 0 ? void 0 : _b.text, "\n");
|
|
36
|
+
}));
|
|
37
|
+
}
|
|
38
|
+
function createToolInfo(run) {
|
|
39
|
+
var _a, _b, _c;
|
|
40
|
+
return "\n## Tool information\n- Name: ".concat((_a = run.tool.driver) === null || _a === void 0 ? void 0 : _a.name, "\n- Organization: ").concat((_b = run.tool.driver) === null || _b === void 0 ? void 0 : _b.organization, "\n- Version: ").concat((_c = run.tool.driver) === null || _c === void 0 ? void 0 : _c.semanticVersion, "\n");
|
|
41
|
+
}
|
|
29
42
|
var createCodeURL = function (result, options) {
|
|
30
43
|
var _a, _b;
|
|
31
44
|
var githubHost = (_a = options.githubHost) !== null && _a !== void 0 ? _a : "https://github.com";
|
|
@@ -43,32 +56,95 @@ var createCodeURL = function (result, options) {
|
|
|
43
56
|
if (!physicalLocation.region) {
|
|
44
57
|
return [];
|
|
45
58
|
}
|
|
46
|
-
var lineNumber = physicalLocation.region.endLine !== undefined
|
|
47
|
-
|
|
59
|
+
var lineNumber = physicalLocation.region.endLine !== undefined
|
|
60
|
+
? "L".concat(physicalLocation.region.startLine, "-").concat(physicalLocation.region.endLine)
|
|
61
|
+
: "L".concat(physicalLocation.region.startLine);
|
|
62
|
+
return (0, url_join_1.default)(githubHost, options.owner, options.repo, "blob/".concat(options.branch), options.sourceRoot, "".concat(physicalLocation.artifactLocation.uri, "#").concat(lineNumber));
|
|
48
63
|
});
|
|
49
64
|
};
|
|
50
|
-
|
|
65
|
+
function groupBy(arr, criteria) {
|
|
66
|
+
var newObj = arr.reduce(function (acc, currentValue) {
|
|
67
|
+
if (!acc[currentValue[criteria]]) {
|
|
68
|
+
acc[currentValue[criteria]] = [];
|
|
69
|
+
}
|
|
70
|
+
acc[currentValue[criteria]].push(currentValue);
|
|
71
|
+
return acc;
|
|
72
|
+
}, {});
|
|
73
|
+
return [newObj];
|
|
74
|
+
}
|
|
75
|
+
function createGroupedResultsMarkdown(groupedResults, run, options) {
|
|
76
|
+
var _a, _b, _c, _d;
|
|
77
|
+
var groupedResultsMarkdown = "";
|
|
78
|
+
for (var _i = 0, groupedResults_1 = groupedResults; _i < groupedResults_1.length; _i++) {
|
|
79
|
+
var group = groupedResults_1[_i];
|
|
80
|
+
var _loop_1 = function (r) {
|
|
81
|
+
var ruleId = group[r][0].ruleId;
|
|
82
|
+
var ruleMatch = run.tool.driver.rules.filter(function (r) {
|
|
83
|
+
return r.id == ruleId;
|
|
84
|
+
});
|
|
85
|
+
var severityLevel = (_c = (_b = (_a = ruleMatch[0].defaultConfiguration) === null || _a === void 0 ? void 0 : _a.level) === null || _b === void 0 ? void 0 : _b.toUpperCase()) !== null && _c !== void 0 ? _c : "";
|
|
86
|
+
var helpUri = (_d = "[[HELP LINK](" + ruleMatch[0].helpUri + ")]") !== null && _d !== void 0 ? _d : "";
|
|
87
|
+
groupedResultsMarkdown +=
|
|
88
|
+
"- **".concat("[" + severityLevel + "]** **[" + r + "]** " + helpUri, " `").concat(group[r][0] ? (0, markdown_escape_1.default)(group[r][0].message.text) : "", "`") + "\n";
|
|
89
|
+
for (var _e = 0, _f = group[r]; _e < _f.length; _e++) {
|
|
90
|
+
var result = _f[_e];
|
|
91
|
+
var properResult = result;
|
|
92
|
+
if (properResult.suppressions === undefined) {
|
|
93
|
+
groupedResultsMarkdown += " - " + createCodeURL(result, options) + "\n";
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
for (var r in group) {
|
|
98
|
+
_loop_1(r);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return groupedResultsMarkdown;
|
|
102
|
+
}
|
|
103
|
+
function createGroupedSuppressedResultsMarkdown(groupedResults, run, options) {
|
|
104
|
+
var _a, _b, _c, _d;
|
|
105
|
+
var groupedSuppressedResultsMD = "";
|
|
106
|
+
var suppressedCounter = 0;
|
|
107
|
+
for (var _i = 0, groupedResults_2 = groupedResults; _i < groupedResults_2.length; _i++) {
|
|
108
|
+
var group = groupedResults_2[_i];
|
|
109
|
+
var _loop_2 = function (r) {
|
|
110
|
+
var groupContainsSuppressed = group[r].filter(function (r) { return r.suppressions !== undefined; }).length > 0;
|
|
111
|
+
if (groupContainsSuppressed) {
|
|
112
|
+
var ruleId_1 = group[r][0].ruleId;
|
|
113
|
+
var ruleMatch = run.tool.driver.rules.filter(function (r) {
|
|
114
|
+
return r.id == ruleId_1;
|
|
115
|
+
});
|
|
116
|
+
var helpUri = (_a = "[[HELP LINK](" + ruleMatch[0].helpUri + ")]") !== null && _a !== void 0 ? _a : "";
|
|
117
|
+
var severityLevel = (_d = (_c = (_b = ruleMatch[0].defaultConfiguration) === null || _b === void 0 ? void 0 : _b.level) === null || _c === void 0 ? void 0 : _c.toUpperCase()) !== null && _d !== void 0 ? _d : "";
|
|
118
|
+
groupedSuppressedResultsMD +=
|
|
119
|
+
"- **".concat("[" + severityLevel + "]** **[" + r + "]** " + helpUri, " `").concat(group[r][0] ? (0, markdown_escape_1.default)(group[r][0].message.text) : "", "`") + "\n";
|
|
120
|
+
for (var _e = 0, _f = group[r]; _e < _f.length; _e++) {
|
|
121
|
+
var result = _f[_e];
|
|
122
|
+
var properResult = result;
|
|
123
|
+
if (properResult.suppressions !== undefined) {
|
|
124
|
+
suppressedCounter += 1;
|
|
125
|
+
groupedSuppressedResultsMD += " - " + createCodeURL(result, options) + "\n";
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
for (var r in group) {
|
|
131
|
+
_loop_2(r);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return { groupedSuppressedResultsMD: groupedSuppressedResultsMD, suppressedCounter: suppressedCounter };
|
|
135
|
+
}
|
|
136
|
+
var sarifToMarkdown = function (options) {
|
|
137
|
+
var suppressedResultsFlag = options.suppressedResults !== undefined ? options.suppressedResults : true;
|
|
138
|
+
var simpleMode = options.simple !== undefined ? options.simple : false;
|
|
51
139
|
return function (sarifLog) {
|
|
52
140
|
return sarifLog.runs.map(function (run) {
|
|
53
|
-
var _a, _b
|
|
54
|
-
var title = options.title ? "# "
|
|
55
|
-
var toolInfo =
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
// Result(s)
|
|
61
|
-
/**
|
|
62
|
-
* # Rule Info
|
|
63
|
-
*/
|
|
64
|
-
var ruleInfo = escapeMarkdown(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n## Rules information\n<!-- Rule Info -->\n<details><summary>Rules details</summary>\n\n", "\n "], ["\n## Rules information\n<!-- Rule Info -->\n<details><summary>Rules details</summary>\n\n",
|
|
65
|
-
"\n "])), (_e = (_d = run.tool.driver) === null || _d === void 0 ? void 0 : _d.rules) === null || _e === void 0 ? void 0 : _e.map(function (rule) {
|
|
66
|
-
var _a, _b;
|
|
67
|
-
var severity = rule.properties ? (_a = rule.properties) === null || _a === void 0 ? void 0 : _a["problem.severity"] : "";
|
|
68
|
-
// rule description
|
|
69
|
-
return "- " + rule.id + " [" + severity + "]\n\n> " + ((_b = rule.shortDescription) === null || _b === void 0 ? void 0 : _b.text);
|
|
70
|
-
}));
|
|
71
|
-
var ruleDetails = "<details><summary>Details</summary>\n<pre>" + JSON.stringify(run.tool, null, 4) + "</pre></details>\n";
|
|
141
|
+
var _a, _b;
|
|
142
|
+
var title = options.title ? "# ".concat(options.title, "\n") : "# Report";
|
|
143
|
+
var toolInfo = simpleMode ? "" : createToolInfo(run);
|
|
144
|
+
var ruleInfo = simpleMode ? "" : createRuleInfo(run);
|
|
145
|
+
var ruleDetails = "<details><summary>Details</summary>\n<pre>".concat(JSON.stringify(run.tool, null, 4), "</pre></details>\n");
|
|
146
|
+
var groupedResults = groupBy(run.results, "ruleId");
|
|
147
|
+
var groupedResultsMarkdown = createGroupedResultsMarkdown(groupedResults, run, options);
|
|
72
148
|
/* Results
|
|
73
149
|
- rule id
|
|
74
150
|
- message
|
|
@@ -76,19 +152,38 @@ exports.sarifToMarkdown = function (options) {
|
|
|
76
152
|
|
|
77
153
|
If pass the scan, results is empty array
|
|
78
154
|
*/
|
|
79
|
-
var results = run.results && run.results.length > 0
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
155
|
+
var results = run.results && run.results.length > 0
|
|
156
|
+
? "\n## Results\n\n".concat(groupedResultsMarkdown, "\n")
|
|
157
|
+
: "\n## Results\n\nNothing here.\n\n";
|
|
158
|
+
var _c = createGroupedSuppressedResultsMarkdown(groupedResults, run, options), groupedSuppressedResultsMD = _c.groupedSuppressedResultsMD, suppressedCounter = _c.suppressedCounter;
|
|
159
|
+
// careful, double ternary... first check if we should include suppressedresults (return empty string)
|
|
160
|
+
// then check if there are results, if none, return default string
|
|
161
|
+
var suppressedResultsText = suppressedResultsFlag
|
|
162
|
+
? run.results && suppressedCounter > 0
|
|
163
|
+
? "\n## Suppressed results\n\n".concat(groupedSuppressedResultsMD, "\n")
|
|
164
|
+
: "\n## Suppressed Results\n\nNothing here.\n\n"
|
|
165
|
+
: "";
|
|
166
|
+
if (options.details) {
|
|
167
|
+
return {
|
|
168
|
+
body: title +
|
|
169
|
+
results +
|
|
170
|
+
"\n" +
|
|
171
|
+
suppressedResultsText +
|
|
172
|
+
"\n" +
|
|
173
|
+
ruleInfo +
|
|
174
|
+
"\n" +
|
|
175
|
+
ruleDetails +
|
|
176
|
+
toolInfo,
|
|
177
|
+
hasMessages: ((_a = run.results) === null || _a === void 0 ? void 0 : _a.length) !== 0
|
|
178
|
+
};
|
|
179
|
+
}
|
|
86
180
|
return {
|
|
87
|
-
body: title + results + "\n" +
|
|
88
|
-
hasMessages: ((
|
|
181
|
+
body: title + results + "\n" + suppressedResultsText + "\n" + ruleInfo + "\n" + toolInfo,
|
|
182
|
+
hasMessages: ((_b = run.results) === null || _b === void 0 ? void 0 : _b.length) !== 0
|
|
89
183
|
};
|
|
90
184
|
});
|
|
91
185
|
};
|
|
92
186
|
};
|
|
187
|
+
exports.sarifToMarkdown = sarifToMarkdown;
|
|
93
188
|
var templateObject_1;
|
|
94
189
|
//# sourceMappingURL=sarif-to-markdown.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sarif-to-markdown.js","sourceRoot":"","sources":["../src/sarif-to-markdown.ts"],"names":[],"mappings":";;;;;;;;;;AACA,aAAa;AACb,
|
|
1
|
+
{"version":3,"file":"sarif-to-markdown.js","sourceRoot":"","sources":["../src/sarif-to-markdown.ts"],"names":[],"mappings":"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"}
|
|
@@ -25,6 +25,18 @@ export declare type sarifFormatterOptions = {
|
|
|
25
25
|
* Base path
|
|
26
26
|
*/
|
|
27
27
|
sourceRoot: string;
|
|
28
|
+
/**
|
|
29
|
+
* Details of the rules in the comment or not, this might make the comment too big for Github
|
|
30
|
+
*/
|
|
31
|
+
details?: boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Should the markdown include suppressed findings, defaults to true
|
|
34
|
+
*/
|
|
35
|
+
suppressedResults?: boolean;
|
|
36
|
+
/**
|
|
37
|
+
* Should the markdown include rule details or tool details at all
|
|
38
|
+
*/
|
|
39
|
+
simple?: boolean;
|
|
28
40
|
};
|
|
29
41
|
declare type sarifToMarkdownResult = {
|
|
30
42
|
title?: string;
|
|
@@ -3,7 +3,7 @@ var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cook
|
|
|
3
3
|
return cooked;
|
|
4
4
|
};
|
|
5
5
|
// @ts-ignore
|
|
6
|
-
import escape from
|
|
6
|
+
import escape from "markdown-escape";
|
|
7
7
|
import urlJoin from "url-join";
|
|
8
8
|
function escapeMarkdown(strings) {
|
|
9
9
|
var values = [];
|
|
@@ -20,6 +20,19 @@ function escapeMarkdown(strings) {
|
|
|
20
20
|
}
|
|
21
21
|
});
|
|
22
22
|
}
|
|
23
|
+
function createRuleInfo(run) {
|
|
24
|
+
var _a, _b;
|
|
25
|
+
return escapeMarkdown(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n## Rules information\n<!-- Rule Info -->\n<details><summary>Rules details</summary>\n", ""], ["\n## Rules information\n<!-- Rule Info -->\n<details><summary>Rules details</summary>\n", ""])), (_b = (_a = run.tool.driver) === null || _a === void 0 ? void 0 : _a.rules) === null || _b === void 0 ? void 0 : _b.map(function (rule) {
|
|
26
|
+
var _a, _b;
|
|
27
|
+
var severity = rule.properties ? (_a = rule.properties) === null || _a === void 0 ? void 0 : _a["problem.severity"] : "";
|
|
28
|
+
// rule description
|
|
29
|
+
return "\n\n - ".concat(rule.id, " [").concat(severity, "] \n\n > ").concat((_b = rule.shortDescription) === null || _b === void 0 ? void 0 : _b.text, "\n");
|
|
30
|
+
}));
|
|
31
|
+
}
|
|
32
|
+
function createToolInfo(run) {
|
|
33
|
+
var _a, _b, _c;
|
|
34
|
+
return "\n## Tool information\n- Name: ".concat((_a = run.tool.driver) === null || _a === void 0 ? void 0 : _a.name, "\n- Organization: ").concat((_b = run.tool.driver) === null || _b === void 0 ? void 0 : _b.organization, "\n- Version: ").concat((_c = run.tool.driver) === null || _c === void 0 ? void 0 : _c.semanticVersion, "\n");
|
|
35
|
+
}
|
|
23
36
|
var createCodeURL = function (result, options) {
|
|
24
37
|
var _a, _b;
|
|
25
38
|
var githubHost = (_a = options.githubHost) !== null && _a !== void 0 ? _a : "https://github.com";
|
|
@@ -37,32 +50,95 @@ var createCodeURL = function (result, options) {
|
|
|
37
50
|
if (!physicalLocation.region) {
|
|
38
51
|
return [];
|
|
39
52
|
}
|
|
40
|
-
var lineNumber = physicalLocation.region.endLine !== undefined
|
|
41
|
-
|
|
53
|
+
var lineNumber = physicalLocation.region.endLine !== undefined
|
|
54
|
+
? "L".concat(physicalLocation.region.startLine, "-").concat(physicalLocation.region.endLine)
|
|
55
|
+
: "L".concat(physicalLocation.region.startLine);
|
|
56
|
+
return urlJoin(githubHost, options.owner, options.repo, "blob/".concat(options.branch), options.sourceRoot, "".concat(physicalLocation.artifactLocation.uri, "#").concat(lineNumber));
|
|
42
57
|
});
|
|
43
58
|
};
|
|
59
|
+
function groupBy(arr, criteria) {
|
|
60
|
+
var newObj = arr.reduce(function (acc, currentValue) {
|
|
61
|
+
if (!acc[currentValue[criteria]]) {
|
|
62
|
+
acc[currentValue[criteria]] = [];
|
|
63
|
+
}
|
|
64
|
+
acc[currentValue[criteria]].push(currentValue);
|
|
65
|
+
return acc;
|
|
66
|
+
}, {});
|
|
67
|
+
return [newObj];
|
|
68
|
+
}
|
|
69
|
+
function createGroupedResultsMarkdown(groupedResults, run, options) {
|
|
70
|
+
var _a, _b, _c, _d;
|
|
71
|
+
var groupedResultsMarkdown = "";
|
|
72
|
+
for (var _i = 0, groupedResults_1 = groupedResults; _i < groupedResults_1.length; _i++) {
|
|
73
|
+
var group = groupedResults_1[_i];
|
|
74
|
+
var _loop_1 = function (r) {
|
|
75
|
+
var ruleId = group[r][0].ruleId;
|
|
76
|
+
var ruleMatch = run.tool.driver.rules.filter(function (r) {
|
|
77
|
+
return r.id == ruleId;
|
|
78
|
+
});
|
|
79
|
+
var severityLevel = (_c = (_b = (_a = ruleMatch[0].defaultConfiguration) === null || _a === void 0 ? void 0 : _a.level) === null || _b === void 0 ? void 0 : _b.toUpperCase()) !== null && _c !== void 0 ? _c : "";
|
|
80
|
+
var helpUri = (_d = "[[HELP LINK](" + ruleMatch[0].helpUri + ")]") !== null && _d !== void 0 ? _d : "";
|
|
81
|
+
groupedResultsMarkdown +=
|
|
82
|
+
"- **".concat("[" + severityLevel + "]** **[" + r + "]** " + helpUri, " `").concat(group[r][0] ? escape(group[r][0].message.text) : "", "`") + "\n";
|
|
83
|
+
for (var _e = 0, _f = group[r]; _e < _f.length; _e++) {
|
|
84
|
+
var result = _f[_e];
|
|
85
|
+
var properResult = result;
|
|
86
|
+
if (properResult.suppressions === undefined) {
|
|
87
|
+
groupedResultsMarkdown += " - " + createCodeURL(result, options) + "\n";
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
for (var r in group) {
|
|
92
|
+
_loop_1(r);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return groupedResultsMarkdown;
|
|
96
|
+
}
|
|
97
|
+
function createGroupedSuppressedResultsMarkdown(groupedResults, run, options) {
|
|
98
|
+
var _a, _b, _c, _d;
|
|
99
|
+
var groupedSuppressedResultsMD = "";
|
|
100
|
+
var suppressedCounter = 0;
|
|
101
|
+
for (var _i = 0, groupedResults_2 = groupedResults; _i < groupedResults_2.length; _i++) {
|
|
102
|
+
var group = groupedResults_2[_i];
|
|
103
|
+
var _loop_2 = function (r) {
|
|
104
|
+
var groupContainsSuppressed = group[r].filter(function (r) { return r.suppressions !== undefined; }).length > 0;
|
|
105
|
+
if (groupContainsSuppressed) {
|
|
106
|
+
var ruleId_1 = group[r][0].ruleId;
|
|
107
|
+
var ruleMatch = run.tool.driver.rules.filter(function (r) {
|
|
108
|
+
return r.id == ruleId_1;
|
|
109
|
+
});
|
|
110
|
+
var helpUri = (_a = "[[HELP LINK](" + ruleMatch[0].helpUri + ")]") !== null && _a !== void 0 ? _a : "";
|
|
111
|
+
var severityLevel = (_d = (_c = (_b = ruleMatch[0].defaultConfiguration) === null || _b === void 0 ? void 0 : _b.level) === null || _c === void 0 ? void 0 : _c.toUpperCase()) !== null && _d !== void 0 ? _d : "";
|
|
112
|
+
groupedSuppressedResultsMD +=
|
|
113
|
+
"- **".concat("[" + severityLevel + "]** **[" + r + "]** " + helpUri, " `").concat(group[r][0] ? escape(group[r][0].message.text) : "", "`") + "\n";
|
|
114
|
+
for (var _e = 0, _f = group[r]; _e < _f.length; _e++) {
|
|
115
|
+
var result = _f[_e];
|
|
116
|
+
var properResult = result;
|
|
117
|
+
if (properResult.suppressions !== undefined) {
|
|
118
|
+
suppressedCounter += 1;
|
|
119
|
+
groupedSuppressedResultsMD += " - " + createCodeURL(result, options) + "\n";
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
for (var r in group) {
|
|
125
|
+
_loop_2(r);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return { groupedSuppressedResultsMD: groupedSuppressedResultsMD, suppressedCounter: suppressedCounter };
|
|
129
|
+
}
|
|
44
130
|
export var sarifToMarkdown = function (options) {
|
|
131
|
+
var suppressedResultsFlag = options.suppressedResults !== undefined ? options.suppressedResults : true;
|
|
132
|
+
var simpleMode = options.simple !== undefined ? options.simple : false;
|
|
45
133
|
return function (sarifLog) {
|
|
46
134
|
return sarifLog.runs.map(function (run) {
|
|
47
|
-
var _a, _b
|
|
48
|
-
var title = options.title ? "# "
|
|
49
|
-
var toolInfo =
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
// Result(s)
|
|
55
|
-
/**
|
|
56
|
-
* # Rule Info
|
|
57
|
-
*/
|
|
58
|
-
var ruleInfo = escapeMarkdown(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n## Rules information\n<!-- Rule Info -->\n<details><summary>Rules details</summary>\n\n", "\n "], ["\n## Rules information\n<!-- Rule Info -->\n<details><summary>Rules details</summary>\n\n",
|
|
59
|
-
"\n "])), (_e = (_d = run.tool.driver) === null || _d === void 0 ? void 0 : _d.rules) === null || _e === void 0 ? void 0 : _e.map(function (rule) {
|
|
60
|
-
var _a, _b;
|
|
61
|
-
var severity = rule.properties ? (_a = rule.properties) === null || _a === void 0 ? void 0 : _a["problem.severity"] : "";
|
|
62
|
-
// rule description
|
|
63
|
-
return "- " + rule.id + " [" + severity + "]\n\n> " + ((_b = rule.shortDescription) === null || _b === void 0 ? void 0 : _b.text);
|
|
64
|
-
}));
|
|
65
|
-
var ruleDetails = "<details><summary>Details</summary>\n<pre>" + JSON.stringify(run.tool, null, 4) + "</pre></details>\n";
|
|
135
|
+
var _a, _b;
|
|
136
|
+
var title = options.title ? "# ".concat(options.title, "\n") : "# Report";
|
|
137
|
+
var toolInfo = simpleMode ? "" : createToolInfo(run);
|
|
138
|
+
var ruleInfo = simpleMode ? "" : createRuleInfo(run);
|
|
139
|
+
var ruleDetails = "<details><summary>Details</summary>\n<pre>".concat(JSON.stringify(run.tool, null, 4), "</pre></details>\n");
|
|
140
|
+
var groupedResults = groupBy(run.results, "ruleId");
|
|
141
|
+
var groupedResultsMarkdown = createGroupedResultsMarkdown(groupedResults, run, options);
|
|
66
142
|
/* Results
|
|
67
143
|
- rule id
|
|
68
144
|
- message
|
|
@@ -70,16 +146,34 @@ export var sarifToMarkdown = function (options) {
|
|
|
70
146
|
|
|
71
147
|
If pass the scan, results is empty array
|
|
72
148
|
*/
|
|
73
|
-
var results = run.results && run.results.length > 0
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
149
|
+
var results = run.results && run.results.length > 0
|
|
150
|
+
? "\n## Results\n\n".concat(groupedResultsMarkdown, "\n")
|
|
151
|
+
: "\n## Results\n\nNothing here.\n\n";
|
|
152
|
+
var _c = createGroupedSuppressedResultsMarkdown(groupedResults, run, options), groupedSuppressedResultsMD = _c.groupedSuppressedResultsMD, suppressedCounter = _c.suppressedCounter;
|
|
153
|
+
// careful, double ternary... first check if we should include suppressedresults (return empty string)
|
|
154
|
+
// then check if there are results, if none, return default string
|
|
155
|
+
var suppressedResultsText = suppressedResultsFlag
|
|
156
|
+
? run.results && suppressedCounter > 0
|
|
157
|
+
? "\n## Suppressed results\n\n".concat(groupedSuppressedResultsMD, "\n")
|
|
158
|
+
: "\n## Suppressed Results\n\nNothing here.\n\n"
|
|
159
|
+
: "";
|
|
160
|
+
if (options.details) {
|
|
161
|
+
return {
|
|
162
|
+
body: title +
|
|
163
|
+
results +
|
|
164
|
+
"\n" +
|
|
165
|
+
suppressedResultsText +
|
|
166
|
+
"\n" +
|
|
167
|
+
ruleInfo +
|
|
168
|
+
"\n" +
|
|
169
|
+
ruleDetails +
|
|
170
|
+
toolInfo,
|
|
171
|
+
hasMessages: ((_a = run.results) === null || _a === void 0 ? void 0 : _a.length) !== 0
|
|
172
|
+
};
|
|
173
|
+
}
|
|
80
174
|
return {
|
|
81
|
-
body: title + results + "\n" +
|
|
82
|
-
hasMessages: ((
|
|
175
|
+
body: title + results + "\n" + suppressedResultsText + "\n" + ruleInfo + "\n" + toolInfo,
|
|
176
|
+
hasMessages: ((_b = run.results) === null || _b === void 0 ? void 0 : _b.length) !== 0
|
|
83
177
|
};
|
|
84
178
|
});
|
|
85
179
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sarif-to-markdown.js","sourceRoot":"","sources":["../src/sarif-to-markdown.ts"],"names":[],"mappings":";;;;AACA,aAAa;AACb,OAAO,MAAM,MAAM,iBAAiB,
|
|
1
|
+
{"version":3,"file":"sarif-to-markdown.js","sourceRoot":"","sources":["../src/sarif-to-markdown.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@security-alert/sarif-to-markdown",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.9.0",
|
|
4
4
|
"description": "Convert Sarif format to body text",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"sarif",
|
|
@@ -33,18 +33,11 @@
|
|
|
33
33
|
"scripts": {
|
|
34
34
|
"build": "tsc -p . && tsc --project ./tsconfig.module.json",
|
|
35
35
|
"clean": "rimraf lib/ module/",
|
|
36
|
-
"prettier": "prettier --write \"**/*.{js,jsx,ts,tsx,css}\"",
|
|
37
36
|
"prepublish": "npm run --if-present build",
|
|
38
37
|
"test": "mocha \"test/**/*.ts\"",
|
|
39
38
|
"updateSnapshot": "UPDATE_SNAPSHOT=1 npm test",
|
|
40
39
|
"watch": "tsc -p . --watch"
|
|
41
40
|
},
|
|
42
|
-
"prettier": {
|
|
43
|
-
"printWidth": 120,
|
|
44
|
-
"singleQuote": false,
|
|
45
|
-
"tabWidth": 4,
|
|
46
|
-
"trailingComma": "none"
|
|
47
|
-
},
|
|
48
41
|
"dependencies": {
|
|
49
42
|
"@types/sarif": "^2.1.2",
|
|
50
43
|
"markdown-escape": "^1.1.0",
|
|
@@ -54,15 +47,14 @@
|
|
|
54
47
|
"@types/mocha": "^8.0.1",
|
|
55
48
|
"@types/node": "^14.0.27",
|
|
56
49
|
"@types/url-join": "^4.0.0",
|
|
57
|
-
"mocha": "^
|
|
58
|
-
"prettier": "^2.0.5",
|
|
50
|
+
"mocha": "^9.2.2",
|
|
59
51
|
"rimraf": "^3.0.2",
|
|
60
|
-
"ts-node": "^
|
|
61
|
-
"ts-node-test-register": "^
|
|
62
|
-
"typescript": "^
|
|
52
|
+
"ts-node": "^10.7.0",
|
|
53
|
+
"ts-node-test-register": "^10.0.0",
|
|
54
|
+
"typescript": "^4.6.3"
|
|
63
55
|
},
|
|
64
56
|
"publishConfig": {
|
|
65
57
|
"access": "public"
|
|
66
58
|
},
|
|
67
|
-
"gitHead": "
|
|
59
|
+
"gitHead": "75c8d82f52cfca7f39c75e2805b83c83ddaa61c5"
|
|
68
60
|
}
|
package/lib/sarif-formatter.d.ts
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import type { Log } from "sarif";
|
|
2
|
-
export declare type sarifFormatterResult = {
|
|
3
|
-
title: string;
|
|
4
|
-
body: string;
|
|
5
|
-
};
|
|
6
|
-
export declare type sarifFormatterOptions = {
|
|
7
|
-
githubHost?: string;
|
|
8
|
-
/**
|
|
9
|
-
* GitHub Owner
|
|
10
|
-
*/
|
|
11
|
-
owner: string;
|
|
12
|
-
/**
|
|
13
|
-
* GitHub Repo
|
|
14
|
-
*/
|
|
15
|
-
repo: string;
|
|
16
|
-
/**
|
|
17
|
-
* Base path
|
|
18
|
-
*/
|
|
19
|
-
sourceRoot: string;
|
|
20
|
-
};
|
|
21
|
-
export declare const sarifFormatter: (options: sarifFormatterOptions) => (sarifLog: Log) => {
|
|
22
|
-
title: string;
|
|
23
|
-
body: string;
|
|
24
|
-
}[];
|
package/lib/sarif-formatter.js
DELETED
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cooked, raw) {
|
|
3
|
-
if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
|
|
4
|
-
return cooked;
|
|
5
|
-
};
|
|
6
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
8
|
-
};
|
|
9
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
-
exports.sarifFormatter = void 0;
|
|
11
|
-
// @ts-ignore
|
|
12
|
-
var markdown_escape_1 = __importDefault(require("markdown-escape"));
|
|
13
|
-
function escapeMarkdown(strings) {
|
|
14
|
-
var values = [];
|
|
15
|
-
for (var _i = 1; _i < arguments.length; _i++) {
|
|
16
|
-
values[_i - 1] = arguments[_i];
|
|
17
|
-
}
|
|
18
|
-
return strings.reduce(function (result, str, i) {
|
|
19
|
-
var value = values[i - 1];
|
|
20
|
-
if (typeof value === "string") {
|
|
21
|
-
return result + markdown_escape_1.default(value) + str;
|
|
22
|
-
}
|
|
23
|
-
else {
|
|
24
|
-
return result + String(value) + str;
|
|
25
|
-
}
|
|
26
|
-
});
|
|
27
|
-
}
|
|
28
|
-
var createCodeURL = function (result, options) {
|
|
29
|
-
return options.githubHost + "/" + ;
|
|
30
|
-
};
|
|
31
|
-
exports.sarifFormatter = function (options) {
|
|
32
|
-
return function (sarifLog) {
|
|
33
|
-
return sarifLog.runs.map(function (run) {
|
|
34
|
-
var _a, _b, _c;
|
|
35
|
-
// # tool section
|
|
36
|
-
// Rule info
|
|
37
|
-
// Vulnerability info
|
|
38
|
-
// ## Results
|
|
39
|
-
// Result(s)
|
|
40
|
-
var rule = escapeMarkdown(templateObject_2 || (templateObject_2 = __makeTemplateObject(["# ", "\n<!-- Rule Info -->\n", "\n \n<details><summary>Details</summary>\n<pre>", "</pre></details>\n\n<!-- Results \n\n- rule id\n- message\n- vulnerability location\n\n-->\n\n", "\n"], ["\\\n# ", "\n<!-- Rule Info -->\n",
|
|
41
|
-
"\n \n<details><summary>Details</summary>\n<pre>", "</pre></details>\n\n<!-- Results \n\n- rule id\n- message\n- vulnerability location\n\n-->\n\n",
|
|
42
|
-
"\n"])), run.tool.driver.name, (_b = (_a = run.tool.driver) === null || _a === void 0 ? void 0 : _a.rules) === null || _b === void 0 ? void 0 : _b.map(function (rule) {
|
|
43
|
-
// rule description
|
|
44
|
-
return "**" + rule.id + "**\n\n> " + rule.shortDescription;
|
|
45
|
-
}), JSON.stringify(run.tool, null, 4), (_c = run.results) === null || _c === void 0 ? void 0 : _c.map(function (result) {
|
|
46
|
-
return escapeMarkdown(templateObject_1 || (templateObject_1 = __makeTemplateObject(["**", "**: ", "\n\n\n"], ["**", "**: ", "\n\n\n"])), result.ruleId, result.message);
|
|
47
|
-
}));
|
|
48
|
-
return {
|
|
49
|
-
title: "",
|
|
50
|
-
body: ""
|
|
51
|
-
};
|
|
52
|
-
});
|
|
53
|
-
};
|
|
54
|
-
};
|
|
55
|
-
var templateObject_1, templateObject_2;
|
|
56
|
-
//# sourceMappingURL=sarif-to-markdown.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sarif-to-markdown.js","sourceRoot":"","sources":["../src/sarif-to-markdown.ts"],"names":[],"mappings":";;;;;;;;;;AACA,aAAa;AACb,oEAAoC;AAGpC,SAAS,cAAc,CAAC,OAA6B;IAAE,gBAAgB;SAAhB,UAAgB,EAAhB,qBAAgB,EAAhB,IAAgB;QAAhB,+BAAgB;;IACnE,OAAO,OAAO,CAAC,MAAM,CAAC,UAAC,MAAM,EAAE,GAAG,EAAE,CAAC;QACjC,IAAM,KAAK,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;YAC3B,OAAO,MAAM,GAAG,yBAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC;SACvC;aAAM;YACH,OAAO,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC;SACvC;IACL,CAAC,CAAC,CAAC;AACP,CAAC;AAED,IAAM,aAAa,GAAG,UAAC,MAAc,EAAE,OAA8B;IACjE,OAAU,OAAO,CAAC,UAAU,SAAM,CAAA;AAEtC,CAAC,CAAA;AAsBY,QAAA,cAAc,GAAG,UAAC,OAA8B;IACzD,OAAO,UAAC,QAAa;QACjB,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,UAAA,GAAG;;YACxB,iBAAiB;YACjB,YAAY;YACZ,qBAAqB;YACrB,aAAa;YACb,YAAY;YACZ,IAAM,IAAI,GAAG,cAAc,4PAAA,QACnC,EAAoB,wBAEtB;gBAMW,iDAGN,EAAiC,gGAUtC;gBAKY,IACb,KA3BG,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,cAEtB,GAAG,CAAC,IAAI,CAAC,MAAM,0CAAE,KAAK,0CAAE,GAAG,CAAC,UAAA,IAAI;gBACd,mBAAmB;gBACnB,OAAO,OAAK,IAAI,CAAC,EAAE,gBAEnC,IAAI,CAAC,gBAAkB,CAAA;YACX,CAAC,GAIV,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,QAUtC,GAAG,CAAC,OAAO,0CAAE,GAAG,CAAC,UAAA,MAAM;gBACT,OAAO,cAAc,yFAAA,IAAK,EAAa,MAAO,EAAc,QAG3E,KAHyC,MAAM,CAAC,MAAM,EAAO,MAAM,CAAC,OAAO,EAG3E;YACW,CAAC,EACZ,CAAA;YAGW,OAAO;gBACH,KAAK,EAAE,EAAE;gBACT,IAAI,EAAE,EAAE;aACX,CAAC;QACN,CAAC,CAAC,CAAC;IACP,CAAC,CAAA;AAEL,CAAC,CAAA"}
|