@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.
@@ -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.error} color is used, then if at least 1 warning
36
- * finding exists then {@link ColorGroupByLevel.warning} color is used, etc.
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.critical} color is used, then if at least 1 high
48
- * finding exists then {@link ColorGroupBySeverity.high} color is used, etc.
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.byLevel}
59
- * and {@link ColorOptions.bySeverity} are defined, then {@link ColorOptions.bySeverity}
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
- export {};
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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29sb3JPcHRpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21vZGVsL2NvbG9yL0NvbG9yT3B0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0=
@@ -81,21 +81,23 @@
81
81
  * @public
82
82
  */
83
83
  export declare class Color {
84
- private readonly _color?;
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
- constructor(color?: string);
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.error} color is used, then if at least 1 warning
107
- * finding exists then {@link ColorGroupByLevel.warning} color is used, etc.
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.critical} color is used, then if at least 1 high
120
- * finding exists then {@link ColorGroupBySeverity.high} color is used, etc.
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.byLevel}
141
- * and {@link ColorOptions.bySeverity} are defined, then {@link ColorOptions.bySeverity}
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
@@ -1,4 +1,4 @@
1
- import { ColorOptions } from './model/Color';
1
+ import { ColorOptions } from './model/color/ColorOptions';
2
2
  import { SendIf } from './model/SendIf';
3
3
  /**
4
4
  * Enum representing log levels for the service.
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAE5C,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"}
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"}
@@ -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 listFilesRecursively(dir, extension, fileList = []) {
13
- const entries = fs.readdirSync(dir);
14
- entries.forEach((entry) => {
15
- const fullPath = path.join(dir, entry);
16
- if (fs.statSync(fullPath).isDirectory()) {
17
- listFilesRecursively(fullPath, extension, fileList);
18
- }
19
- else if (path.extname(fullPath).toLowerCase() === `.${extension}`) {
20
- fileList.push(fullPath);
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmlsZVV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL0ZpbGVVdGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUE7QUFDbkIsT0FBTyxNQUFNLE1BQU0sV0FBVyxDQUFBO0FBRTlCLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFBO0FBRTVCOzs7Ozs7O0dBT0c7QUFDSCxTQUFTLG9CQUFvQixDQUMzQixHQUFXLEVBQ1gsU0FBNkIsRUFDN0IsV0FBcUIsRUFBRTtJQUV2QixNQUFNLE9BQU8sR0FBYSxFQUFFLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQzdDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFhLEVBQVEsRUFBRTtRQUN0QyxNQUFNLFFBQVEsR0FBVyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUM5QyxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztZQUN4QyxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFBO1FBQ3JELENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsV0FBVyxFQUFFLEtBQUssSUFBSSxTQUFTLEVBQUUsRUFBRSxDQUFDO1lBQ3BFLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDekIsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFBO0lBQ0YsT0FBTyxRQUFRLENBQUE7QUFDakIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUFDLElBQWtCO0lBQ25ELElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQzlCLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFBO0lBQy9ELENBQUM7SUFFRCxNQUFNLEtBQUssR0FBYSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUU5QyxJQUFJLEtBQUssQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO1FBQ3hCLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUNBQWlDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFBO1FBQ3pELE1BQU0sS0FBSyxHQUFhLElBQUksQ0FBQyxTQUFTO2VBQ2pDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsSUFBSSxPQUFPLENBQUM7ZUFDMUQsRUFBRSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDOUIsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLEtBQUssQ0FBQyxNQUFNLGFBQWEsSUFBSSxDQUFDLElBQUksbUJBQW1CLElBQUksQ0FBQyxTQUFTLFlBQVksQ0FBQyxDQUFBO1FBQ3JHLE1BQU0sQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQ2hELE9BQU8sS0FBSyxDQUFBO0lBQ2QsQ0FBQztJQUVELElBQUksS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7UUFDbkIsTUFBTSxDQUFDLElBQUksQ0FBQyw0QkFBNEIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUE7UUFDcEQsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUNwQixDQUFDO0lBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQyxvREFBb0QsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUE7QUFDbEYsQ0FBQyJ9
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmlsZVV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL0ZpbGVVdGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUE7QUFDbkIsT0FBTyxNQUFNLE1BQU0sV0FBVyxDQUFBO0FBRTlCLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFBO0FBRTVCOzs7Ozs7OztHQVFHO0FBQ0gsU0FBUyxTQUFTLENBQ2hCLEdBQVcsRUFDWCxTQUFrQixFQUNsQixTQUE2QixFQUM3QixXQUFxQixFQUFFO0lBRXZCLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO1FBQ25DLE1BQU0sT0FBTyxHQUFhLEVBQUUsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDN0MsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQWEsRUFBUSxFQUFFO1lBQ3RDLE1BQU0sUUFBUSxHQUFXLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFBO1lBQzlDLElBQUksU0FBUyxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztnQkFDckQsU0FBUyxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFBO1lBQ3JELENBQUM7aUJBQU0sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFdBQVcsRUFBRSxLQUFLLElBQUksU0FBUyxFQUFFLEVBQUUsQ0FBQztnQkFDcEUsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUN6QixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBQ0QsT0FBTyxRQUFRLENBQUE7QUFDakIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUFDLElBQWtCO0lBQ25ELElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQzlCLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFBO0lBQy9ELENBQUM7SUFFRCxNQUFNLEtBQUssR0FBYSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUU5QyxJQUFJLEtBQUssQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO1FBQ3hCLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUNBQWlDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFBO1FBQ3pELE1BQU0sS0FBSyxHQUFhLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLElBQUksT0FBTyxDQUFDLENBQUE7UUFDekYsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLEtBQUssQ0FBQyxNQUFNLGFBQWEsSUFBSSxDQUFDLElBQUksbUJBQW1CLElBQUksQ0FBQyxTQUFTLFlBQVksQ0FBQyxDQUFBO1FBQ3JHLE1BQU0sQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQ2hELE9BQU8sS0FBSyxDQUFBO0lBQ2QsQ0FBQztJQUVELElBQUksS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7UUFDbkIsTUFBTSxDQUFDLElBQUksQ0FBQyw0QkFBNEIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUE7UUFDcEQsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUNwQixDQUFDO0lBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQyxvREFBb0QsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUE7QUFDbEYsQ0FBQyJ9
@@ -6,12 +6,10 @@
6
6
 
7
7
  // @public
8
8
  export class Color {
9
- constructor(color?: string);
10
- get value(): string | undefined;
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.2.3",
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.5",
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.0",
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/Color'
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/Color'
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
+ }