@fabasoad/sarif-to-slack 1.2.3 → 1.3.1
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/SarifToSlackClient.js +2 -2
- package/dist/index.cjs +240 -144
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/model/color/Color.d.ts +26 -0
- package/dist/model/color/Color.d.ts.map +1 -0
- package/dist/model/color/Color.js +46 -0
- package/dist/model/color/ColorIdentification.d.ts +2 -0
- package/dist/model/color/ColorIdentification.d.ts.map +1 -0
- package/dist/model/color/ColorIdentification.js +186 -0
- package/dist/model/{Color.d.ts → color/ColorOptions.d.ts} +10 -32
- package/dist/model/color/ColorOptions.d.ts.map +1 -0
- package/dist/model/color/ColorOptions.js +2 -0
- package/dist/sarif-to-slack.d.ts +17 -14
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/FileUtils.js +16 -15
- package/etc/sarif-to-slack.api.md +8 -4
- package/package.json +3 -3
- package/src/SarifToSlackClient.ts +1 -1
- package/src/index.ts +3 -2
- package/src/model/color/Color.ts +50 -0
- package/src/model/color/ColorIdentification.ts +198 -0
- package/src/model/color/ColorOptions.ts +63 -0
- package/src/types.ts +1 -1
- package/src/utils/FileUtils.ts +15 -13
- package/tests/integration/SendSarifToSlack.spec.ts +14 -14
- package/dist/model/Color.d.ts.map +0 -1
- package/dist/model/Color.js +0 -115
- package/src/model/Color.ts +0 -206
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { SecurityLevel, SecuritySeverity } from '../../types';
|
|
2
|
+
import Logger from '../../Logger';
|
|
3
|
+
function logColorTaken(color, prop) {
|
|
4
|
+
Logger.debug(`Message has ${color?.color} color taken from '${prop}' property.`);
|
|
5
|
+
}
|
|
6
|
+
function logPropDefinedButNoFindings(key, val) {
|
|
7
|
+
const prop = key === 'level' ? 'byLevel' : 'bySeverity';
|
|
8
|
+
Logger.trace(`'${prop}.${val}' property is defined but no findings with "${val}" ${key} is found. Continue color identification...`);
|
|
9
|
+
}
|
|
10
|
+
function logPropIsNotDefined(key, val) {
|
|
11
|
+
const prop = key === 'level' ? 'byLevel' : 'bySeverity';
|
|
12
|
+
Logger.trace(`'${prop}.${val}' property is not defined. Continue color identification...`);
|
|
13
|
+
}
|
|
14
|
+
function identifyColorCommon(findings, prop, none, unknown, color) {
|
|
15
|
+
if (color.none) {
|
|
16
|
+
if (findings.findByProperty(prop, none) != null) {
|
|
17
|
+
logColorTaken(color.none, `${prop === 'severity' ? 'bySeverity' : 'byLevel'}.none`);
|
|
18
|
+
return color.none.color;
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
logPropDefinedButNoFindings(prop, 'none');
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
logPropIsNotDefined(prop, 'none');
|
|
26
|
+
}
|
|
27
|
+
if (color.unknown) {
|
|
28
|
+
if (findings.findByProperty(prop, unknown) != null) {
|
|
29
|
+
logColorTaken(color.unknown, `${prop === 'severity' ? 'bySeverity' : 'byLevel'}.unknown`);
|
|
30
|
+
return color.unknown.color;
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
logPropDefinedButNoFindings(prop, 'unknown');
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
logPropIsNotDefined(prop, 'unknown');
|
|
38
|
+
}
|
|
39
|
+
return undefined;
|
|
40
|
+
}
|
|
41
|
+
function identifyColorBySeverity(findings, color) {
|
|
42
|
+
if (color.critical) {
|
|
43
|
+
if (findings.findByProperty('severity', SecuritySeverity.Critical) != null) {
|
|
44
|
+
logColorTaken(color.critical, 'bySeverity.critical');
|
|
45
|
+
return color.critical.color;
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
logPropDefinedButNoFindings('severity', 'critical');
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
logPropIsNotDefined('severity', 'critical');
|
|
53
|
+
}
|
|
54
|
+
if (color.high) {
|
|
55
|
+
if (findings.findByProperty('severity', SecuritySeverity.High) != null) {
|
|
56
|
+
logColorTaken(color.high, 'bySeverity.high');
|
|
57
|
+
return color.high.color;
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
logPropDefinedButNoFindings('severity', 'high');
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
logPropIsNotDefined('severity', 'high');
|
|
65
|
+
}
|
|
66
|
+
if (color.medium) {
|
|
67
|
+
if (findings.findByProperty('severity', SecuritySeverity.Medium) != null) {
|
|
68
|
+
logColorTaken(color.medium, 'bySeverity.medium');
|
|
69
|
+
return color.medium.color;
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
logPropDefinedButNoFindings('severity', 'medium');
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
logPropIsNotDefined('severity', 'medium');
|
|
77
|
+
}
|
|
78
|
+
if (color.low) {
|
|
79
|
+
if (findings.findByProperty('severity', SecuritySeverity.Low) != null) {
|
|
80
|
+
logColorTaken(color.low, 'bySeverity.low');
|
|
81
|
+
return color.low.color;
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
logPropDefinedButNoFindings('severity', 'low');
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
logPropIsNotDefined('severity', 'low');
|
|
89
|
+
}
|
|
90
|
+
return identifyColorCommon(findings, 'severity', SecuritySeverity.None, SecuritySeverity.Unknown, color);
|
|
91
|
+
}
|
|
92
|
+
function identifyColorByLevel(findings, color) {
|
|
93
|
+
if (color.error) {
|
|
94
|
+
if (findings.findByProperty('level', SecurityLevel.Error) != null) {
|
|
95
|
+
logColorTaken(color.error, 'byLevel.error');
|
|
96
|
+
return color.error.color;
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
logPropDefinedButNoFindings('level', 'error');
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
logPropIsNotDefined('level', 'error');
|
|
104
|
+
}
|
|
105
|
+
if (color.warning) {
|
|
106
|
+
if (findings.findByProperty('level', SecurityLevel.Warning) != null) {
|
|
107
|
+
logColorTaken(color.warning, 'byLevel.warning');
|
|
108
|
+
return color.warning.color;
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
logPropDefinedButNoFindings('level', 'warning');
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
logPropIsNotDefined('level', 'warning');
|
|
116
|
+
}
|
|
117
|
+
if (color.note != null) {
|
|
118
|
+
if (findings.findByProperty('level', SecurityLevel.Note) != null) {
|
|
119
|
+
logColorTaken(color.note, 'byLevel.note');
|
|
120
|
+
return color.note.color;
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
logPropDefinedButNoFindings('level', 'note');
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
logPropIsNotDefined('level', 'note');
|
|
128
|
+
}
|
|
129
|
+
return identifyColorCommon(findings, 'level', SecurityLevel.None, SecurityLevel.Unknown, color);
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Makes an ultimate decision on what color should be Slack message. The decision
|
|
133
|
+
* is based on the provided {@param colorOpts} parameter and {@param findings}
|
|
134
|
+
* list.
|
|
135
|
+
* @param findings An instance of {@link FindingArray} object.
|
|
136
|
+
* @param colorOpts An instance of {@link ColorOptions} type.
|
|
137
|
+
* @internal
|
|
138
|
+
*/
|
|
139
|
+
export function identifyColor(findings, colorOpts) {
|
|
140
|
+
if (!colorOpts) {
|
|
141
|
+
Logger.debug('Message has no color as color options are not defined.');
|
|
142
|
+
return undefined;
|
|
143
|
+
}
|
|
144
|
+
Logger.trace(`Identifying color for ${findings.length} findings and the following color options:`, JSON.stringify(colorOpts, null, 2));
|
|
145
|
+
if (colorOpts.bySeverity) {
|
|
146
|
+
const color = identifyColorBySeverity(findings, colorOpts.bySeverity);
|
|
147
|
+
if (color) {
|
|
148
|
+
return color;
|
|
149
|
+
}
|
|
150
|
+
Logger.trace('None of the properties in \'bySeverity\' group is applicable. Continue color identification...');
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
Logger.trace('\'bySeverity\' group is not defined. Continue color identification...');
|
|
154
|
+
}
|
|
155
|
+
if (colorOpts.byLevel) {
|
|
156
|
+
const color = identifyColorByLevel(findings, colorOpts.byLevel);
|
|
157
|
+
if (color) {
|
|
158
|
+
return color;
|
|
159
|
+
}
|
|
160
|
+
Logger.trace('None of the properties in \'byLevel\' group is applicable. Continue color identification...');
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
Logger.trace('\'byLevel\' group is not defined. Continue color identification...');
|
|
164
|
+
}
|
|
165
|
+
if (findings.length === 0) {
|
|
166
|
+
Logger.trace('There are no findings in the provided SARIF file(s). Checking if color is defined in "empty" property...');
|
|
167
|
+
if (colorOpts.empty?.color) {
|
|
168
|
+
logColorTaken(colorOpts.empty, 'empty');
|
|
169
|
+
return colorOpts.empty.color;
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
Logger.trace('"empty" color is not defined. Continue color identification...');
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
Logger.trace(`"empty" color is not taken into account because there are ${findings.length} findings in the provided SARIF file(s). Continue color identification...`);
|
|
177
|
+
}
|
|
178
|
+
if (colorOpts.default?.color) {
|
|
179
|
+
logColorTaken(colorOpts.default, 'default');
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
Logger.debug('Message has no color as none of the defined color options is applicable.');
|
|
183
|
+
}
|
|
184
|
+
return colorOpts?.default?.color;
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29sb3JJZGVudGlmaWNhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tb2RlbC9jb2xvci9Db2xvcklkZW50aWZpY2F0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDN0QsT0FBTyxNQUFNLE1BQU0sY0FBYyxDQUFBO0FBU2pDLFNBQVMsYUFBYSxDQUFDLEtBQXdCLEVBQUUsSUFBWTtJQUMzRCxNQUFNLENBQUMsS0FBSyxDQUFDLGVBQWUsS0FBSyxFQUFFLEtBQUssc0JBQXNCLElBQUksYUFBYSxDQUFDLENBQUE7QUFDbEYsQ0FBQztBQUVELFNBQVMsMkJBQTJCLENBQXNELEdBQU0sRUFBRSxHQUFXO0lBQzNHLE1BQU0sSUFBSSxHQUFXLEdBQUcsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFBO0lBQy9ELE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLElBQUksR0FBRywrQ0FBK0MsR0FBRyxLQUFLLEdBQUcsNkNBQTZDLENBQUMsQ0FBQTtBQUN0SSxDQUFDO0FBRUQsU0FBUyxtQkFBbUIsQ0FBc0QsR0FBTSxFQUFFLEdBQVc7SUFDbkcsTUFBTSxJQUFJLEdBQVcsR0FBRyxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUE7SUFDL0QsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksSUFBSSxHQUFHLDZEQUE2RCxDQUFDLENBQUE7QUFDNUYsQ0FBQztBQUVELFNBQVMsbUJBQW1CLENBQzFCLFFBQXNCLEVBQ3RCLElBQU8sRUFDUCxJQUFnQixFQUNoQixPQUFtQixFQUNuQixLQUF1QjtJQUV2QixJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNmLElBQUksUUFBUSxDQUFDLGNBQWMsQ0FBQyxJ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
|
|
@@ -1,39 +1,18 @@
|
|
|
1
|
-
|
|
2
|
-
* This class represents a color in hex format.
|
|
3
|
-
* @public
|
|
4
|
-
*/
|
|
5
|
-
export declare class Color {
|
|
6
|
-
private readonly _color?;
|
|
7
|
-
/**
|
|
8
|
-
* Creates an instance of {@link Color} class. Before creating an instance of
|
|
9
|
-
* {@link Color} class, it (if applicable) maps CI status into the hex color,
|
|
10
|
-
* and also validates color parameter to be a valid string that represents a
|
|
11
|
-
* color in hex format.
|
|
12
|
-
* @param color - Can be either undefined, valid color in hex format or GitHub
|
|
13
|
-
* CI status (one of: success, failure, cancelled, skipped)
|
|
14
|
-
* @public
|
|
15
|
-
*/
|
|
16
|
-
constructor(color?: string);
|
|
17
|
-
/**
|
|
18
|
-
* Returns a valid string that represents a color in hex format, or undefined.
|
|
19
|
-
*/
|
|
20
|
-
get value(): string | undefined;
|
|
21
|
-
private assertHexColor;
|
|
22
|
-
private mapColor;
|
|
23
|
-
}
|
|
1
|
+
import { Color } from './Color';
|
|
24
2
|
/**
|
|
25
3
|
* Base type that has common fields for both {@link ColorGroupByLevel} and
|
|
26
4
|
* {@link ColorGroupBySeverity}.
|
|
5
|
+
* @public
|
|
27
6
|
*/
|
|
28
|
-
type ColorGroupCommon = {
|
|
7
|
+
export type ColorGroupCommon = {
|
|
29
8
|
none?: Color;
|
|
30
9
|
unknown?: Color;
|
|
31
10
|
};
|
|
32
11
|
/**
|
|
33
12
|
* Color schema for the findings with the certain level. Color is used by the
|
|
34
13
|
* level importance, i.e. if at least 1 error finding exists then
|
|
35
|
-
* {@link ColorGroupByLevel
|
|
36
|
-
* finding exists then {@link ColorGroupByLevel
|
|
14
|
+
* {@link ColorGroupByLevel#error} color is used, then if at least 1 warning
|
|
15
|
+
* finding exists then {@link ColorGroupByLevel#warning} color is used, etc.
|
|
37
16
|
* @public
|
|
38
17
|
*/
|
|
39
18
|
export type ColorGroupByLevel = ColorGroupCommon & {
|
|
@@ -44,8 +23,8 @@ export type ColorGroupByLevel = ColorGroupCommon & {
|
|
|
44
23
|
/**
|
|
45
24
|
* Color schema for the findings with the certain severity. Color is used by the
|
|
46
25
|
* severity importance, i.e. if at least 1 critical finding exists then
|
|
47
|
-
* {@link ColorGroupBySeverity
|
|
48
|
-
* finding exists then {@link ColorGroupBySeverity
|
|
26
|
+
* {@link ColorGroupBySeverity#critical} color is used, then if at least 1 high
|
|
27
|
+
* finding exists then {@link ColorGroupBySeverity#high} color is used, etc.
|
|
49
28
|
* @public
|
|
50
29
|
*/
|
|
51
30
|
export type ColorGroupBySeverity = ColorGroupCommon & {
|
|
@@ -55,8 +34,8 @@ export type ColorGroupBySeverity = ColorGroupCommon & {
|
|
|
55
34
|
low?: Color;
|
|
56
35
|
};
|
|
57
36
|
/**
|
|
58
|
-
* Represents configuration of the color scheme. If both {@link ColorOptions
|
|
59
|
-
* and {@link ColorOptions
|
|
37
|
+
* Represents configuration of the color scheme. If both {@link ColorOptions#byLevel}
|
|
38
|
+
* and {@link ColorOptions#bySeverity} are defined, then {@link ColorOptions#bySeverity}
|
|
60
39
|
* takes precedence.
|
|
61
40
|
* @public
|
|
62
41
|
*/
|
|
@@ -78,5 +57,4 @@ export type ColorOptions = {
|
|
|
78
57
|
*/
|
|
79
58
|
empty?: Color;
|
|
80
59
|
};
|
|
81
|
-
|
|
82
|
-
//# sourceMappingURL=Color.d.ts.map
|
|
60
|
+
//# sourceMappingURL=ColorOptions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ColorOptions.d.ts","sourceRoot":"","sources":["../../../src/model/color/ColorOptions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAE/B;;;;GAIG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,CAAC,EAAE,KAAK,CAAC;IACb,OAAO,CAAC,EAAE,KAAK,CAAC;CACjB,CAAA;AAED;;;;;;GAMG;AACH,MAAM,MAAM,iBAAiB,GAAG,gBAAgB,GAAG;IACjD,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,OAAO,CAAC,EAAE,KAAK,CAAC;IAChB,IAAI,CAAC,EAAE,KAAK,CAAC;CACd,CAAA;AAED;;;;;;GAMG;AACH,MAAM,MAAM,oBAAoB,GAAG,gBAAgB,GAAG;IACpD,QAAQ,CAAC,EAAE,KAAK,CAAC;IACjB,IAAI,CAAC,EAAE,KAAK,CAAC;IACb,MAAM,CAAC,EAAE,KAAK,CAAC;IACf,GAAG,CAAC,EAAE,KAAK,CAAC;CACb,CAAA;AAED;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB;;OAEG;IACH,OAAO,CAAC,EAAE,KAAK,CAAC;IAChB;;OAEG;IACH,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B;;OAEG;IACH,UAAU,CAAC,EAAE,oBAAoB,CAAC;IAClC;;OAEG;IACH,KAAK,CAAC,EAAE,KAAK,CAAC;CACf,CAAA"}
|
package/dist/sarif-to-slack.d.ts
CHANGED
|
@@ -81,21 +81,23 @@
|
|
|
81
81
|
* @public
|
|
82
82
|
*/
|
|
83
83
|
export declare class Color {
|
|
84
|
-
|
|
84
|
+
/**
|
|
85
|
+
* A valid string that represents a color in hex format.
|
|
86
|
+
* @public
|
|
87
|
+
*/
|
|
88
|
+
readonly color: string;
|
|
89
|
+
private constructor();
|
|
85
90
|
/**
|
|
86
91
|
* Creates an instance of {@link Color} class. Before creating an instance of
|
|
87
92
|
* {@link Color} class, it (if applicable) maps CI status into the hex color,
|
|
88
93
|
* and also validates color parameter to be a valid string that represents a
|
|
89
94
|
* color in hex format.
|
|
90
95
|
* @param color - Can be either undefined, valid color in hex format or GitHub
|
|
91
|
-
* CI status (one of: success, failure, cancelled, skipped)
|
|
96
|
+
* CI status (one of: success, failure, cancelled, skipped).
|
|
97
|
+
* @returns An instance of {@link Color} or undefined if color parameter is falsy.
|
|
92
98
|
* @public
|
|
93
99
|
*/
|
|
94
|
-
|
|
95
|
-
/**
|
|
96
|
-
* Returns a valid string that represents a color in hex format, or undefined.
|
|
97
|
-
*/
|
|
98
|
-
get value(): string | undefined;
|
|
100
|
+
static from(color: string | undefined): Color | undefined;
|
|
99
101
|
private assertHexColor;
|
|
100
102
|
private mapColor;
|
|
101
103
|
}
|
|
@@ -103,8 +105,8 @@ export declare class Color {
|
|
|
103
105
|
/**
|
|
104
106
|
* Color schema for the findings with the certain level. Color is used by the
|
|
105
107
|
* level importance, i.e. if at least 1 error finding exists then
|
|
106
|
-
* {@link ColorGroupByLevel
|
|
107
|
-
* finding exists then {@link ColorGroupByLevel
|
|
108
|
+
* {@link ColorGroupByLevel#error} color is used, then if at least 1 warning
|
|
109
|
+
* finding exists then {@link ColorGroupByLevel#warning} color is used, etc.
|
|
108
110
|
* @public
|
|
109
111
|
*/
|
|
110
112
|
export declare type ColorGroupByLevel = ColorGroupCommon & {
|
|
@@ -116,8 +118,8 @@ export declare type ColorGroupByLevel = ColorGroupCommon & {
|
|
|
116
118
|
/**
|
|
117
119
|
* Color schema for the findings with the certain severity. Color is used by the
|
|
118
120
|
* severity importance, i.e. if at least 1 critical finding exists then
|
|
119
|
-
* {@link ColorGroupBySeverity
|
|
120
|
-
* finding exists then {@link ColorGroupBySeverity
|
|
121
|
+
* {@link ColorGroupBySeverity#critical} color is used, then if at least 1 high
|
|
122
|
+
* finding exists then {@link ColorGroupBySeverity#high} color is used, etc.
|
|
121
123
|
* @public
|
|
122
124
|
*/
|
|
123
125
|
export declare type ColorGroupBySeverity = ColorGroupCommon & {
|
|
@@ -130,15 +132,16 @@ export declare type ColorGroupBySeverity = ColorGroupCommon & {
|
|
|
130
132
|
/**
|
|
131
133
|
* Base type that has common fields for both {@link ColorGroupByLevel} and
|
|
132
134
|
* {@link ColorGroupBySeverity}.
|
|
135
|
+
* @public
|
|
133
136
|
*/
|
|
134
|
-
declare type ColorGroupCommon = {
|
|
137
|
+
export declare type ColorGroupCommon = {
|
|
135
138
|
none?: Color;
|
|
136
139
|
unknown?: Color;
|
|
137
140
|
};
|
|
138
141
|
|
|
139
142
|
/**
|
|
140
|
-
* Represents configuration of the color scheme. If both {@link ColorOptions
|
|
141
|
-
* and {@link ColorOptions
|
|
143
|
+
* Represents configuration of the color scheme. If both {@link ColorOptions#byLevel}
|
|
144
|
+
* and {@link ColorOptions#bySeverity} are defined, then {@link ColorOptions#bySeverity}
|
|
142
145
|
* takes precedence.
|
|
143
146
|
* @public
|
|
144
147
|
*/
|
package/dist/types.d.ts
CHANGED
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAEzD,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAEvC;;;GAGG;AACH,oBAAY,QAAQ;IAClB;;;OAGG;IACH,KAAK,IAAI;IACT;;OAEG;IACH,KAAK,IAAI;IACT;;;OAGG;IACH,KAAK,IAAI;IACT;;;OAGG;IACH,IAAI,IAAI;IACR;;;OAGG;IACH,OAAO,IAAI;IACX;;;OAGG;IACH,KAAK,IAAI;IACT;;;OAGG;IACH,KAAK,IAAI;CACV;AAED;;;;GAIG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,EAAE,OAAO,CAAA;CACjB,CAAA;AAED;;;;GAIG;AACH,MAAM,MAAM,4BAA4B,GAAG,mBAAmB,GAAG;IAC/D,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAED;;;GAGG;AACH,oBAAY,UAAU;IACpB;;OAEG;IACH,SAAS,eAAe;IACxB;;;OAGG;IACH,QAAQ,WAAW;CACpB;AAED;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG,4BAA4B,GAAG;IACzD,IAAI,CAAC,EAAE,UAAU,CAAA;CAClB,CAAA;AAED;;;;GAIG;AACH,oBAAY,kBAAkB;IAC5B;;;;;;;;;OASG;IACH,yBAAyB,IAAI;IAC7B;;;;;;;;;OASG;IACH,4BAA4B,IAAI;IAChC;;;;;;;OAOG;IACH,8BAA8B,IAAI;IAClC;;;;;;;OAOG;IACH,iCAAiC,IAAI;IACrC;;;;;;;;;OASG;IACH,2BAA2B,IAAI;IAC/B;;;;;;;;;;OAUG;IACH,8BAA8B,IAAI;IAClC;;;;;;;OAOG;IACH,oBAAoB,IAAI;IACxB;;;;;;;OAOG;IACH,uBAAuB,IAAI;CAC5B;AAED;;;GAGG;AACH,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAA;AAED;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,MAAM,CAAA;AAEjD;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,kBAAkB,CAAC;CAChC,CAAA;AAED;;;GAGG;AACH,MAAM,MAAM,yBAAyB,GAAG;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,YAAY,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,GAAG,CAAC,EAAE,UAAU,CAAC;IACjB,MAAM,CAAC,EAAE,4BAA4B,CAAC;IACtC,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,KAAK,CAAC,EAAE,4BAA4B,CAAC;IACrC,GAAG,CAAC,EAAE,mBAAmB,CAAC;IAC1B,cAAc,CAAC,EAAE,kBAAkB,CAAC;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAA"}
|
package/dist/utils/FileUtils.js
CHANGED
|
@@ -5,21 +5,24 @@ import * as path from 'path';
|
|
|
5
5
|
* Traverse directory recursively and returns list of files with the requested
|
|
6
6
|
* extension.
|
|
7
7
|
* @param dir A root directory. Starting point.
|
|
8
|
+
* @param recursive Whether to list files recursively or not.
|
|
8
9
|
* @param extension An instance of {@link SarifFileExtension} type.
|
|
9
10
|
* @param fileList Collected list of files.
|
|
10
11
|
* @private
|
|
11
12
|
*/
|
|
12
|
-
function
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
13
|
+
function listFiles(dir, recursive, extension, fileList = []) {
|
|
14
|
+
if (fs.statSync(dir).isDirectory()) {
|
|
15
|
+
const entries = fs.readdirSync(dir);
|
|
16
|
+
entries.forEach((entry) => {
|
|
17
|
+
const fullPath = path.join(dir, entry);
|
|
18
|
+
if (recursive && fs.statSync(fullPath).isDirectory()) {
|
|
19
|
+
listFiles(fullPath, recursive, extension, fileList);
|
|
20
|
+
}
|
|
21
|
+
else if (path.extname(fullPath).toLowerCase() === `.${extension}`) {
|
|
22
|
+
fileList.push(fullPath);
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
}
|
|
23
26
|
return fileList;
|
|
24
27
|
}
|
|
25
28
|
/**
|
|
@@ -35,9 +38,7 @@ export function extractListOfFiles(opts) {
|
|
|
35
38
|
const stats = fs.statSync(opts.path);
|
|
36
39
|
if (stats.isDirectory()) {
|
|
37
40
|
Logger.info(`Provided path is a directory: ${opts.path}`);
|
|
38
|
-
const files = opts.recursive
|
|
39
|
-
&& listFilesRecursively(opts.path, opts.extension ?? 'sarif')
|
|
40
|
-
|| fs.readdirSync(opts.path);
|
|
41
|
+
const files = listFiles(opts.path, !!opts.recursive, opts.extension ?? 'sarif');
|
|
41
42
|
Logger.info(`Found ${files.length} files in ${opts.path} directory with ${opts.extension} extension`);
|
|
42
43
|
Logger.debug(`Found files: ${files.join(', ')}`);
|
|
43
44
|
return files;
|
|
@@ -48,4 +49,4 @@ export function extractListOfFiles(opts) {
|
|
|
48
49
|
}
|
|
49
50
|
throw new Error(`Provided path is neither a file nor a directory: ${opts.path}`);
|
|
50
51
|
}
|
|
51
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
52
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmlsZVV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL0ZpbGVVdGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUE7QUFDbkIsT0FBTyxNQUFNLE1BQU0sV0FBVyxDQUFBO0FBRTlCLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFBO0FBRTVCOzs7Ozs7OztHQVFHO0FBQ0gsU0FBUyxTQUFTLENBQ2hCLEdBQVcsRUFDWCxTQUFrQixFQUNsQixTQUE2QixFQUM3QixXQUFxQixFQUFFO0lBRXZCLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO1FBQ25DLE1BQU0sT0FBTyxHQUFhLEVBQUUsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDN0MsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQWEsRUFBUSxFQUFFO1lBQ3RDLE1BQU0sUUFBUSxHQUFXLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFBO1lBQzlDLElBQUksU0FBUyxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztnQkFDckQsU0FBUyxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFBO1lBQ3JELENBQUM7aUJBQU0sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFdBQVcsRUFBRSxLQUFLLElBQUksU0FBUyxFQUFFLEVBQUUsQ0FBQztnQkFDcEUsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUN6QixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBQ0QsT0FBTyxRQUFRLENBQUE7QUFDakIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUFDLElBQWtCO0lBQ25ELElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQzlCLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFBO0lBQy9ELENBQUM7SUFFRCxNQUFNLEtBQUssR0FBYSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUU5QyxJQUFJLEtBQUssQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO1FBQ3hCLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUNBQWlDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFBO1FBQ3pELE1BQU0sS0FBSyxHQUFhLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLElBQUksT0FBTyxDQUFDLENBQUE7UUFDekYsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLEtBQUssQ0FBQyxNQUFNLGFBQWEsSUFBSSxDQUFDLElBQUksbUJBQW1CLElBQUksQ0FBQyxTQUFTLFlBQVksQ0FBQyxDQUFBO1FBQ3JHLE1BQU0sQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQ2hELE9BQU8sS0FBSyxDQUFBO0lBQ2QsQ0FBQztJQUVELElBQUksS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7UUFDbkIsTUFBTSxDQUFDLElBQUksQ0FBQyw0QkFBNEIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUE7UUFDcEQsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUNwQixDQUFDO0lBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQyxvREFBb0QsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUE7QUFDbEYsQ0FBQyJ9
|
|
@@ -6,12 +6,10 @@
|
|
|
6
6
|
|
|
7
7
|
// @public
|
|
8
8
|
export class Color {
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
readonly color: string;
|
|
10
|
+
static from(color: string | undefined): Color | undefined;
|
|
11
11
|
}
|
|
12
12
|
|
|
13
|
-
// Warning: (ae-forgotten-export) The symbol "ColorGroupCommon" needs to be exported by the entry point index.d.ts
|
|
14
|
-
//
|
|
15
13
|
// @public
|
|
16
14
|
export type ColorGroupByLevel = ColorGroupCommon & {
|
|
17
15
|
error?: Color;
|
|
@@ -27,6 +25,12 @@ export type ColorGroupBySeverity = ColorGroupCommon & {
|
|
|
27
25
|
low?: Color;
|
|
28
26
|
};
|
|
29
27
|
|
|
28
|
+
// @public
|
|
29
|
+
export type ColorGroupCommon = {
|
|
30
|
+
none?: Color;
|
|
31
|
+
unknown?: Color;
|
|
32
|
+
};
|
|
33
|
+
|
|
30
34
|
// @public
|
|
31
35
|
export type ColorOptions = {
|
|
32
36
|
default?: Color;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fabasoad/sarif-to-slack",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.1",
|
|
4
4
|
"description": "TypeScript library to send results of SARIF file to Slack webhook URL.",
|
|
5
5
|
"main": "dist/index.cjs",
|
|
6
6
|
"module": "dist/index.js",
|
|
@@ -42,12 +42,12 @@
|
|
|
42
42
|
},
|
|
43
43
|
"homepage": "https://github.com/fabasoad/sarif-to-slack#readme",
|
|
44
44
|
"dependencies": {
|
|
45
|
-
"@slack/webhook": "7.0.
|
|
45
|
+
"@slack/webhook": "7.0.6",
|
|
46
46
|
"@types/sarif": "2.1.7",
|
|
47
47
|
"tslog": "4.9.3"
|
|
48
48
|
},
|
|
49
49
|
"devDependencies": {
|
|
50
|
-
"@biomejs/biome": "2.2.
|
|
50
|
+
"@biomejs/biome": "2.2.2",
|
|
51
51
|
"@microsoft/api-documenter": "7.26.32",
|
|
52
52
|
"@microsoft/api-extractor": "7.52.11",
|
|
53
53
|
"@types/jest": "30.0.0",
|
|
@@ -15,7 +15,7 @@ import { extractListOfFiles } from './utils/FileUtils'
|
|
|
15
15
|
import { createRepresentation } from './representations/RepresentationFactory'
|
|
16
16
|
import { createFinding } from './model/Finding'
|
|
17
17
|
import { findToolComponent, findToolComponentDriver } from './utils/SarifUtils'
|
|
18
|
-
import { identifyColor } from './model/
|
|
18
|
+
import { identifyColor } from './model/color/ColorIdentification'
|
|
19
19
|
import FindingArray from './model/FindingArray'
|
|
20
20
|
import { createSlackMessage, SlackMessage } from './model/SlackMessage'
|
|
21
21
|
import { SendIf, sendIfLogMessage } from './model/SendIf'
|
package/src/index.ts
CHANGED
|
@@ -77,12 +77,13 @@
|
|
|
77
77
|
*
|
|
78
78
|
* @packageDocumentation
|
|
79
79
|
*/
|
|
80
|
+
export { Color } from './model/color/Color'
|
|
80
81
|
export {
|
|
81
|
-
Color,
|
|
82
82
|
ColorOptions,
|
|
83
|
+
ColorGroupCommon,
|
|
83
84
|
ColorGroupByLevel,
|
|
84
85
|
ColorGroupBySeverity
|
|
85
|
-
} from './model/
|
|
86
|
+
} from './model/color/ColorOptions'
|
|
86
87
|
export { SendIf } from './model/SendIf'
|
|
87
88
|
export { SlackMessage } from './model/SlackMessage'
|
|
88
89
|
export { SarifToSlackClient } from './SarifToSlackClient'
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This class represents a color in hex format.
|
|
3
|
+
* @public
|
|
4
|
+
*/
|
|
5
|
+
export class Color {
|
|
6
|
+
/**
|
|
7
|
+
* A valid string that represents a color in hex format.
|
|
8
|
+
* @public
|
|
9
|
+
*/
|
|
10
|
+
public readonly color: string
|
|
11
|
+
|
|
12
|
+
private constructor(color: string) {
|
|
13
|
+
this.color = this.mapColor(color)
|
|
14
|
+
this.assertHexColor()
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Creates an instance of {@link Color} class. Before creating an instance of
|
|
19
|
+
* {@link Color} class, it (if applicable) maps CI status into the hex color,
|
|
20
|
+
* and also validates color parameter to be a valid string that represents a
|
|
21
|
+
* color in hex format.
|
|
22
|
+
* @param color - Can be either undefined, valid color in hex format or GitHub
|
|
23
|
+
* CI status (one of: success, failure, cancelled, skipped).
|
|
24
|
+
* @returns An instance of {@link Color} or undefined if color parameter is falsy.
|
|
25
|
+
* @public
|
|
26
|
+
*/
|
|
27
|
+
public static from(color: string | undefined): Color | undefined {
|
|
28
|
+
return color ? new Color(color) : undefined
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
private assertHexColor(): void {
|
|
32
|
+
if (this.color) {
|
|
33
|
+
const hexColorRegex = /^#(?:[0-9A-Fa-f]{3}|[0-9A-Fa-f]{4}|[0-9A-Fa-f]{6}|[0-9A-Fa-f]{8})$/
|
|
34
|
+
|
|
35
|
+
if (!hexColorRegex.test(this.color)) {
|
|
36
|
+
throw new Error(`Invalid hex color: "${this.color}"`)
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
private mapColor(from: string): string {
|
|
42
|
+
const map = new Map<string, string>([
|
|
43
|
+
['success', '#008000'],
|
|
44
|
+
['failure', '#ff0000'],
|
|
45
|
+
['cancelled', '#0047ab'],
|
|
46
|
+
['skipped', '#808080'],
|
|
47
|
+
])
|
|
48
|
+
return map.get(from) ?? from
|
|
49
|
+
}
|
|
50
|
+
}
|